From ece79bd0fec3a46fb33a65065fbc928381f7496f Mon Sep 17 00:00:00 2001 From: Hunter Lovell Date: Wed, 8 Apr 2026 16:09:55 -0700 Subject: [PATCH 01/39] feat(core, anthropic): add content-block-centric streaming event protocol --- libs/langchain-core/package.json | 33 + .../src/language_models/chat_models.ts | 77 ++ .../src/language_models/compat.ts | 291 +++++++ .../src/language_models/event.ts | 255 ++++++ .../src/language_models/stream.ts | 551 +++++++++++++ .../src/language_models/tests/event.test.ts | 282 +++++++ .../src/language_models/tests/stream.test.ts | 528 +++++++++++++ .../tests/stream_bridge.test.ts | 396 ++++++++++ libs/langchain-core/src/load/import_map.ts | 3 + .../src/messages/content/index.ts | 5 + libs/langchain-core/src/types/type-utils.ts | 5 + libs/langchain-core/tsdown.config.ts | 3 + .../langchain-anthropic/src/chat_models.ts | 63 ++ .../tests/chat_models_stream_events.test.ts | 723 ++++++++++++++++++ .../src/utils/stream_events.ts | 437 +++++++++++ 15 files changed, 3652 insertions(+) create mode 100644 libs/langchain-core/src/language_models/compat.ts create mode 100644 libs/langchain-core/src/language_models/event.ts create mode 100644 libs/langchain-core/src/language_models/stream.ts create mode 100644 libs/langchain-core/src/language_models/tests/event.test.ts create mode 100644 libs/langchain-core/src/language_models/tests/stream.test.ts create mode 100644 libs/langchain-core/src/language_models/tests/stream_bridge.test.ts create mode 100644 libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts create mode 100644 libs/providers/langchain-anthropic/src/utils/stream_events.ts diff --git a/libs/langchain-core/package.json b/libs/langchain-core/package.json index 26a65e696e5b..a1e1fd67a45c 100644 --- a/libs/langchain-core/package.json +++ b/libs/langchain-core/package.json @@ -276,6 +276,28 @@ "default": "./dist/language_models/chat_models.js" } }, + "./language_models/compat": { + "input": "./src/language_models/compat.ts", + "require": { + "types": "./dist/language_models/compat.d.cts", + "default": "./dist/language_models/compat.cjs" + }, + "import": { + "types": "./dist/language_models/compat.d.ts", + "default": "./dist/language_models/compat.js" + } + }, + "./language_models/event": { + "input": "./src/language_models/event.ts", + "require": { + "types": "./dist/language_models/event.d.cts", + "default": "./dist/language_models/event.cjs" + }, + "import": { + "types": "./dist/language_models/event.d.ts", + "default": "./dist/language_models/event.js" + } + }, "./language_models/llms": { "input": "./src/language_models/llms.ts", "require": { @@ -298,6 +320,17 @@ "default": "./dist/language_models/profile.js" } }, + "./language_models/stream": { + "input": "./src/language_models/stream.ts", + "require": { + "types": "./dist/language_models/stream.d.cts", + "default": "./dist/language_models/stream.cjs" + }, + "import": { + "types": "./dist/language_models/stream.d.ts", + "default": "./dist/language_models/stream.js" + } + }, "./language_models/structured_output": { "input": "./src/language_models/structured_output.ts", "require": { diff --git a/libs/langchain-core/src/language_models/chat_models.ts b/libs/langchain-core/src/language_models/chat_models.ts index e4a3926eca9a..9fc38302d159 100644 --- a/libs/langchain-core/src/language_models/chat_models.ts +++ b/libs/langchain-core/src/language_models/chat_models.ts @@ -65,6 +65,9 @@ import { type SerializableSchema, } from "../utils/standard_schema.js"; import { assembleStructuredOutputPipeline } from "./structured_output.js"; +import type { ChatModelStreamEvent } from "./event.js"; +import { ChatModelStream } from "./stream.js"; +import { convertChunksToEvents } from "./compat.js"; // oxlint-disable-next-line @typescript-eslint/no-explicit-any export type ToolChoice = string | Record | "auto" | "any"; @@ -298,6 +301,80 @@ export abstract class BaseChatModel< throw new Error("Not implemented."); } + /** + * Stream chat model events using the new content-block-centric protocol. + * + * Override this method to provide native event streaming from the provider SDK. + * The default implementation bridges from `_streamResponseChunks` by + * synthesizing lifecycle events from `ChatGenerationChunk` objects. + * + * ## Event lifecycle + * + * ``` + * MessageStart + * -> ContentBlockStart(index, contentBlock) + * -> ContentBlockDelta(index, contentBlock, delta) ... + * -> ContentBlockFinish(index, contentBlock) + * -> MessageFinish(reason, usage?) + * ``` + * + * Content blocks may interleave (e.g., parallel tool calls). The only + * invariant: a block's start precedes its deltas, and its deltas precede + * its finish. + * + * @param messages - The input messages. + * @param options - Parsed call options. + * @param runManager - Optional callback manager for the run. + * @returns An async generator of {@link ChatModelStreamEvent}. + */ + async *_streamChatModelEvents( + messages: BaseMessage[], + options: this["ParsedCallOptions"], + runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + // Default: bridge from legacy _streamResponseChunks + const chunks = this._streamResponseChunks(messages, options, runManager); + yield* convertChunksToEvents(chunks, { signal: options.signal }); + } + + /** + * Create a {@link ChatModelStream} for the given input. + * + * Returns a stream object that is both `AsyncIterable` + * and `PromiseLike`, with typed sub-stream accessors for + * `.text`, `.toolCalls`, `.reasoning`, and `.usage`. + * + * @param input - The input messages. + * @param options - Optional call options. + * @returns A {@link ChatModelStream}. + * + * @example + * ```ts + * const stream = model.streamV2([{ role: "user", content: "Hello" }]); + * + * // Stream text + * for await (const token of stream.text) { + * process.stdout.write(token); + * } + * + * // Or await the full message + * const message = await stream; + * ``` + */ + streamV2( + input: BaseLanguageModelInput, + options?: Partial + ): ChatModelStream { + const prompt = BaseChatModel._convertInputToPromptValue(input); + const messages = prompt.toChatMessages(); + const [, callOptions] = + this._separateRunnableConfigFromCallOptionsCompat(options); + + const generator = this._streamChatModelEvents(messages, callOptions); + + return new ChatModelStream(generator); + } + async *_streamIterator( input: BaseLanguageModelInput, options?: Partial diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts new file mode 100644 index 000000000000..367e38a5ccc8 --- /dev/null +++ b/libs/langchain-core/src/language_models/compat.ts @@ -0,0 +1,291 @@ +/** + * Compatibility bridge: converts legacy `_streamResponseChunks` + * (`ChatGenerationChunk` / `AIMessageChunk`) output to the new + * `ChatModelStreamEvent` protocol. + * + * This module is used by `BaseChatModel._streamChatModelEvents` as + * the default implementation when a provider has not yet implemented + * native event streaming. + * + * @module + */ + +import { AIMessageChunk } from "../messages/ai.js"; +import type { ContentBlock } from "../messages/content/index.js"; +import type { ChatGenerationChunk } from "../outputs.js"; +import type { ChatModelStreamEvent } from "./event.js"; + +/** + * Convert an async iterable of legacy `ChatGenerationChunk`s into + * `ChatModelStreamEvent`s. + * + * Tracks content blocks by index, synthesizes start/delta/finish events, + * and emits usage updates. Handles both string content and array content + * blocks, as well as tool call chunks. + * + * @param chunks - The legacy chunk stream from `_streamResponseChunks`. + * @param options - Optional signal for abort handling. + * @returns An async generator of {@link ChatModelStreamEvent}. + */ +export async function* convertChunksToEvents( + chunks: AsyncIterable, + options?: { signal?: AbortSignal } +): AsyncGenerator { + // Track active content blocks for the bridge + const activeBlocks = new Map< + number, + { started: boolean; accumulated: ContentBlock } + >(); + let messageStarted = false; + let lastUsage: + | { input_tokens: number; output_tokens: number; total_tokens: number } + | undefined; + + for await (const chunk of chunks) { + options?.signal?.throwIfAborted(); + + const msg = chunk.message; + + // Emit message-start on the first chunk + let usageHandledInStart = false; + if (!messageStarted) { + messageStarted = true; + const startEvent: ChatModelStreamEvent = { + type: "message-start" as const, + id: msg.id ?? undefined, + }; + // If first chunk has usage (e.g., Anthropic input tokens) + if (AIMessageChunk.isInstance(msg) && msg.usage_metadata) { + (startEvent as { usage?: unknown }).usage = msg.usage_metadata; + lastUsage = { ...msg.usage_metadata }; + usageHandledInStart = true; + } + yield startEvent; + } + + // Process content from the chunk + const content = msg.content; + if (typeof content === "string") { + if (content !== "") { + // Simple string content → single text block at index 0 + const blockIndex = 0; + + if (!activeBlocks.has(blockIndex)) { + const initial: ContentBlock.Text = { type: "text", text: "" }; + activeBlocks.set(blockIndex, { + started: true, + accumulated: initial, + }); + yield { + type: "content-block-start" as const, + index: blockIndex, + content: initial, + }; + } + + const block = activeBlocks.get(blockIndex)!; + const prevText = (block.accumulated as ContentBlock.Text).text; + const accumulated: ContentBlock.Text = { + type: "text", + text: prevText + content, + }; + block.accumulated = accumulated; + + yield { + type: "content-block-delta" as const, + index: blockIndex, + content: accumulated, + }; + } + } else if (Array.isArray(content)) { + for (const part of content) { + const blockIndex = + typeof part.index === "number" ? part.index : activeBlocks.size; + + if (!activeBlocks.has(blockIndex)) { + activeBlocks.set(blockIndex, { + started: true, + accumulated: { ...part }, + }); + yield { + type: "content-block-start" as const, + index: blockIndex, + content: { ...part }, + }; + } else { + // Accumulate into existing block + const block = activeBlocks.get(blockIndex)!; + const accumulated = accumulateContentBlock(block.accumulated, part); + block.accumulated = accumulated; + + yield { + type: "content-block-delta" as const, + index: blockIndex, + content: accumulated, + }; + } + } + } + + // Handle tool call chunks from the legacy path + if ( + AIMessageChunk.isInstance(msg) && + msg.tool_call_chunks && + msg.tool_call_chunks.length > 0 + ) { + for (const toolChunk of msg.tool_call_chunks) { + const blockIndex = + typeof toolChunk.index === "number" + ? toolChunk.index + : activeBlocks.size; + + const delta: ContentBlock = { + type: "tool_call_chunk" as const, + id: toolChunk.id, + name: toolChunk.name, + args: toolChunk.args, + index: blockIndex, + }; + + if (!activeBlocks.has(blockIndex)) { + activeBlocks.set(blockIndex, { + started: true, + accumulated: { ...delta }, + }); + yield { + type: "content-block-start" as const, + index: blockIndex, + content: { ...delta }, + }; + } else { + const block = activeBlocks.get(blockIndex)!; + const accumulated = accumulateContentBlock(block.accumulated, delta); + block.accumulated = accumulated; + + yield { + type: "content-block-delta" as const, + index: blockIndex, + content: accumulated, + }; + } + } + } + + // Accumulate usage (legacy chunks use additive usage, not snapshots) + if ( + !usageHandledInStart && + AIMessageChunk.isInstance(msg) && + msg.usage_metadata + ) { + const chunkUsage = msg.usage_metadata; + if (!lastUsage) { + lastUsage = { ...chunkUsage }; + } else { + lastUsage = { + input_tokens: lastUsage.input_tokens + chunkUsage.input_tokens, + output_tokens: lastUsage.output_tokens + chunkUsage.output_tokens, + total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens, + }; + } + yield { type: "usage" as const, usage: { ...lastUsage } }; + } + } + + // Emit content-block-finish for all active blocks + for (const [index, block] of activeBlocks) { + const finalized = finalizeContentBlock(block.accumulated); + yield { + type: "content-block-finish" as const, + index, + content: finalized, + }; + } + + // Emit message-finish + yield { + type: "message-finish" as const, + reason: "stop" as const, + ...(lastUsage ? { usage: lastUsage } : {}), + }; +} + +/** + * Accumulate a content block delta into the running snapshot. + */ +export function accumulateContentBlock( + accumulated: ContentBlock, + delta: ContentBlock +): ContentBlock { + if (accumulated.type === "text" && delta.type === "text") { + return { + ...accumulated, + type: "text" as const, + text: + (accumulated as ContentBlock.Text).text + + ((delta as ContentBlock.Text).text ?? ""), + } as ContentBlock.Text; + } + + if (accumulated.type === "reasoning" && delta.type === "reasoning") { + return { + ...accumulated, + type: "reasoning" as const, + reasoning: + (accumulated as ContentBlock.Reasoning).reasoning + + ((delta as ContentBlock.Reasoning).reasoning ?? ""), + } as ContentBlock.Reasoning; + } + + if ( + (accumulated.type === "tool_call_chunk" || + accumulated.type === "tool_call") && + (delta.type === "tool_call_chunk" || delta.type === "tool_call") + ) { + const accTC = accumulated as ContentBlock.Tools.ToolCallChunk; + const deltaTC = delta as ContentBlock.Tools.ToolCallChunk; + return { + ...accumulated, + type: "tool_call_chunk" as const, + id: accTC.id ?? deltaTC.id, + name: accTC.name ?? deltaTC.name, + args: (accTC.args ?? "") + (deltaTC.args ?? ""), + index: accTC.index ?? deltaTC.index, + } as ContentBlock.Tools.ToolCallChunk; + } + + // For block types we don't know how to merge, just spread the delta over + return { ...accumulated, ...delta }; +} + +/** + * Finalize a content block for the finish event. + * + * For tool calls, attempts to parse the accumulated args JSON string + * into an object, upgrading from `tool_call_chunk` to `tool_call`. + */ +export function finalizeContentBlock(block: ContentBlock): ContentBlock { + if (block.type === "tool_call_chunk") { + const chunk = block as ContentBlock.Tools.ToolCallChunk; + let parsedArgs: unknown; + try { + parsedArgs = JSON.parse(chunk.args ?? "{}"); + } catch { + // If JSON parsing fails, return as invalid tool call + return { + type: "invalid_tool_call" as const, + id: chunk.id, + name: chunk.name, + args: chunk.args, + error: "Failed to parse tool call arguments as JSON", + } as ContentBlock.Tools.InvalidToolCall; + } + return { + type: "tool_call" as const, + id: chunk.id, + name: chunk.name!, + args: parsedArgs, + } as ContentBlock.Tools.ToolCall; + } + + return block; +} diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts new file mode 100644 index 000000000000..5f7e61fee432 --- /dev/null +++ b/libs/langchain-core/src/language_models/event.ts @@ -0,0 +1,255 @@ +/** + * Chat model streaming event protocol. + * + * Defines a content-block-centric event model for streaming chat model responses. + * Events carry LangChain {@link ContentBlock} types directly as accumulated + * snapshots. + * + * ## Design Principles + * + * 1. **Content blocks are the universal carrier.** Events carry {@link ContentBlock} + * instances directly — the block's `type` field is the discriminant. New content + * block types automatically work without protocol changes. + * + * 2. **Lifecycle completeness.** Every streamable entity has explicit start and finish + * events. Consumers never need to infer boundaries from absence of events. + * + * 3. **Accumulated snapshots.** Each {@link ContentBlockDeltaEvent} carries the + * accumulated state of the content block so far. Aggregation logic lives in the + * provider adapter, not the consumer. Consumers who need incremental deltas + * track previous state and diff. + * + * 4. **Interleaving allowed.** Content blocks may interleave (e.g., parallel tool calls). + * The only invariant: a block's start precedes its deltas, and its deltas precede + * its finish. No ordering constraint between different blocks. + * + * 5. **Provider passthrough.** Native provider events that don't map to standard types + * are forwarded as {@link ProviderEvent} rather than silently dropped. + * + * ## Lifecycle Contract + * + * ``` + * MessageStart + * -> ContentBlockStart(index=0, ...) + * -> ContentBlockStart(index=1, ...) // can start before 0 finishes + * -> ContentBlockDelta(index=0, ...) + * -> ContentBlockDelta(index=1, ...) // interleaved + * -> ContentBlockFinish(index=0, ...) // blocks finish independently + * -> ContentBlockDelta(index=1, ...) + * -> ContentBlockFinish(index=1, ...) + * -> UsageUpdate(...) // may appear at any point + * -> MessageFinish(reason, usage?) + * ``` + * + * @module + */ + +import type { + ContentBlock, + PartialContentBlock, +} from "../messages/content/index.js"; +import type { UsageMetadata } from "../messages/metadata.js"; + +/** + * Emitted once at the start of a model response. + */ +export interface MessageStartEvent { + type: "message-start"; + /** Optional message ID assigned by the provider. */ + id?: string; + /** + * Initial usage snapshot, if the provider reports input token counts + * before content begins streaming (e.g., Anthropic's `message_start`). + */ + usage?: UsageMetadata; +} + +/** + * Finish reason for a model response. + * + * - `"stop"`: Natural end of generation. + * - `"length"`: Hit max token limit. + * - `"tool_use"`: Model is requesting tool execution. + * - `"content_filter"`: Content was filtered by safety systems. + */ +export type FinishReason = "stop" | "length" | "tool_use" | "content_filter"; + +/** + * Emitted once when the model response is complete. + */ +export interface MessageFinishEvent { + type: "message-finish"; + /** Why the model stopped generating. */ + reason: FinishReason; + /** Final usage snapshot. */ + usage?: UsageMetadata; + /** Provider-specific response metadata (model name, response ID, headers, etc.). */ + responseMetadata?: Record; +} + +/** + * Emitted when a new content block begins streaming. + * + * @example + * ```ts + * // Text block starting + * { type: "content-block-start", index: 0, + * content: { type: "text", text: "" } } + * + * // Tool call starting + * { type: "content-block-start", index: 1, + * content: { type: "tool_call", id: "call_1", name: "search", args: "" } } + * + * // Reasoning starting + * { type: "content-block-start", index: 2, + * content: { type: "reasoning", reasoning: "" } } + * ``` + */ +export interface ContentBlockStartEvent { + type: "content-block-start"; + /** Positional index of this block within the message. */ + index: number; + /** Initial state of the content block. */ + content: ContentBlock; +} + +/** + * Emitted for each incremental update within a content block. + * + * Carries the **accumulated state** of the content block so far. + * The content is deeply partial — not all fields may be populated during + * streaming (e.g., a tool call may have `name` but `args` is still being + * streamed as a partial JSON string). + * + * Consumers who need incremental deltas (e.g., new tokens only) should + * track the previous state and diff against the new accumulated state. + * + * Aggregation into `AIMessage` is trivial: + * `message.content[event.index] = event.content` + * + * @example + * ```ts + * // First text delta — accumulated so far + * { type: "content-block-delta", index: 0, + * content: { type: "text", text: "Hello" } } + * + * // Second text delta — accumulated so far + * { type: "content-block-delta", index: 0, + * content: { type: "text", text: "Hello world" } } + * + * // Tool call args — accumulated so far + * { type: "content-block-delta", index: 1, + * content: { type: "tool_call", id: "call_1", name: "search", args: '{"q":"wea' } } + * ``` + */ +export interface ContentBlockDeltaEvent { + type: "content-block-delta"; + /** Positional index of the block being updated. */ + index: number; + /** Accumulated state of the content block after this update. Deeply partial. */ + content: PartialContentBlock; +} + +/** + * Emitted when a content block is complete. + * + * The `content` carries the **finalized** block. For tool calls, this means + * args have been parsed from a JSON string into an object. + * + * @example + * ```ts + * // Finalized text block + * { type: "content-block-finish", index: 0, + * content: { type: "text", text: "The weather is sunny." } } + * + * // Finalized tool call (args parsed) + * { type: "content-block-finish", index: 1, + * content: { type: "tool_call", id: "call_1", name: "search", + * args: { q: "weather" } } } + * ``` + */ +export interface ContentBlockFinishEvent { + type: "content-block-finish"; + /** Positional index of the completed block. */ + index: number; + /** Finalized content block. */ + content: ContentBlock; +} + +/** + * Emitted whenever the provider reports updated usage information. + * + * May appear at any point during streaming. Each event carries a + * **running snapshot** of usage (not an additive delta), so consumers + * can simply take the latest value. + * + * @example + * ```ts + * // After message_start (Anthropic: input tokens known) + * { type: "usage", usage: { input_tokens: 1234, output_tokens: 0, total_tokens: 1234 } } + * + * // After streaming completes + * { type: "usage", usage: { input_tokens: 1234, output_tokens: 567, total_tokens: 1801 } } + * ``` + */ +export interface UsageUpdateEvent { + type: "usage"; + /** Current usage snapshot. */ + usage: UsageMetadata; +} + +/** + * Passthrough for native provider events that don't map to standard types. + * + * Provider adapters map recognized events to standard {@link ChatModelStreamEvent} + * types and forward everything else as `ProviderEvent`. This ensures no information + * is silently dropped. + * + * @example + * ```ts + * // OpenAI server-side web search in progress + * { type: "provider", provider: "openai", + * name: "response.web_search_call.searching", + * payload: { item_id: "ws_123", output_index: 0 } } + * + * // Anthropic context management signal + * { type: "provider", provider: "anthropic", + * name: "context_management", + * payload: { ... } } + * ``` + */ +export interface ProviderEvent { + type: "provider"; + /** Provider identifier (e.g., `"openai"`, `"anthropic"`, `"google"`). */ + provider: string; + /** Raw event type name from the provider SDK. */ + name: string; + /** Raw event payload from the provider SDK. */ + payload: unknown; +} + +/** + * Emitted on unrecoverable stream errors. + */ +export interface StreamErrorEvent { + type: "error"; + /** Human-readable error message. */ + message: string; + /** Optional error code for programmatic handling. */ + code?: string; +} + +/** + * Union of all chat model stream event types. + * + * This is the type yielded by `ChatModelStream[Symbol.asyncIterator]()`. + */ +export type ChatModelStreamEvent = + | MessageStartEvent + | MessageFinishEvent + | ContentBlockStartEvent + | ContentBlockDeltaEvent + | ContentBlockFinishEvent + | UsageUpdateEvent + | ProviderEvent + | StreamErrorEvent; diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts new file mode 100644 index 000000000000..4cda6063e09a --- /dev/null +++ b/libs/langchain-core/src/language_models/stream.ts @@ -0,0 +1,551 @@ +/** + * Typed stream classes for chat model streaming. + * + * Provides {@link ChatModelStream} and typed sub-stream accessors that + * implement both `AsyncIterable` (for incremental consumption) and + * `PromiseLike` (for simple `await`). + * + * @module + */ + +import { AIMessage } from "../messages/ai.js"; +import type { ContentBlock } from "../messages/content/index.js"; +import type { UsageMetadata } from "../messages/metadata.js"; +import type { + ChatModelStreamEvent, + ContentBlockDeltaEvent, + ContentBlockFinishEvent, +} from "./event.js"; + +// ─── Replay Buffer ────────────────────────────────────────────── + +/** + * A buffer that caches emitted events for replay. + * + * Multiple consumers can independently iterate the same buffer — + * each gets its own cursor. Events are never consumed or removed. + * + * @internal + */ +class ReplayBuffer { + private events: ChatModelStreamEvent[] = []; + private finished = false; + private waiters: Array<() => void> = []; + private error: Error | null = null; + + push(event: ChatModelStreamEvent): void { + this.events.push(event); + // Wake ALL waiting consumers — each reads from their own cursor + const toWake = this.waiters.splice(0); + for (const waiter of toWake) { + waiter(); + } + } + + finish(): void { + this.finished = true; + const toWake = this.waiters.splice(0); + for (const waiter of toWake) { + waiter(); + } + } + + setError(err: Error): void { + this.error = err; + this.finished = true; + const toWake = this.waiters.splice(0); + for (const waiter of toWake) { + waiter(); + } + } + + /** + * Create an async iterator that replays cached events from the + * beginning, then follows live events as they arrive. + */ + async *iterate(): AsyncGenerator { + // Fast path: stream already done, replay everything + if (this.finished) { + if (this.error) throw this.error; + yield* this.events; + return; + } + + // Live path: follow events as they arrive + let cursor = 0; + while (true) { + while (cursor < this.events.length) { + yield this.events[cursor]!; + cursor++; + } + if (this.finished) { + if (this.error) throw this.error; + return; + } + // Wait for new data + await new Promise((resolve) => { + if (cursor < this.events.length || this.finished) { + resolve(); + return; + } + this.waiters.push(resolve); + }); + } + } +} + +// ─── Helpers ──────────────────────────────────────────────────── + +/** Extract a string field from a loosely-typed content block. */ +function getStringField( + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + obj: Record, + field: string +): string { + const val = obj[field]; + return typeof val === "string" ? val : ""; +} + +/** Check if a delta event carries a text content block. */ +function isTextDelta( + event: ChatModelStreamEvent +): event is ContentBlockDeltaEvent & { + content: { type: "text"; text?: string }; +} { + return event.type === "content-block-delta" && event.content.type === "text"; +} + +/** Check if a delta event carries a reasoning content block. */ +function isReasoningDelta( + event: ChatModelStreamEvent +): event is ContentBlockDeltaEvent & { + content: { type: "reasoning"; reasoning?: string }; +} { + return ( + event.type === "content-block-delta" && event.content.type === "reasoning" + ); +} + +/** Check if a finish event carries a tool_call content block. */ +function isToolCallFinish( + event: ChatModelStreamEvent +): event is ContentBlockFinishEvent & { + content: ContentBlock.Tools.ToolCall; +} { + return ( + event.type === "content-block-finish" && event.content.type === "tool_call" + ); +} + +// ─── Sub-Stream: Text ─────────────────────────────────────────── + +/** + * Typed stream for text content. + * + * - **Iterate**: yields incremental text deltas (new tokens only). + * - **Await**: resolves to the complete concatenated text. + * - **`.full`**: yields the running accumulated text after each delta. + */ +export class TextContentStream + implements AsyncIterable, PromiseLike +{ + /** @internal */ + private _buffer: ReplayBuffer; + + /** @internal */ + constructor(buffer: ReplayBuffer) { + this._buffer = buffer; + } + + /** + * Yields the accumulated text so far after each delta. + */ + get full(): AsyncIterable { + const buffer = this._buffer; + return { + async *[Symbol.asyncIterator]() { + for await (const event of buffer.iterate()) { + if (isTextDelta(event)) { + yield getStringField( + event.content as Record, + "text" + ); + } + } + }, + }; + } + + /** + * Yields incremental text deltas (new tokens only). + * Computed by diffing successive accumulated states. + */ + [Symbol.asyncIterator](): AsyncIterator { + const buffer = this._buffer; + async function* gen() { + const prevLen = new Map(); + for await (const event of buffer.iterate()) { + if (isTextDelta(event)) { + const full = getStringField( + event.content as Record, + "text" + ); + const prev = prevLen.get(event.index) ?? 0; + if (full.length > prev) { + yield full.slice(prev); + prevLen.set(event.index, full.length); + } + } + } + } + return gen(); + } + + then( + onfulfilled?: ((value: string) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + ): PromiseLike { + const promise = (async () => { + let text = ""; + for await (const delta of this) { + text += delta; + } + return text; + })(); + return promise.then(onfulfilled, onrejected); + } +} + +// ─── Sub-Stream: Tool Calls ───────────────────────────────────── + +/** + * Typed stream for tool calls. + * + * - **Iterate**: yields individual `ToolCall` objects as each completes. + * - **Await**: resolves to the full array. + * - **`.full`**: yields the accumulated array after each new tool call. + */ +export class ToolCallsStream + implements + AsyncIterable, + PromiseLike> +{ + /** @internal */ + private _buffer: ReplayBuffer; + + /** @internal */ + constructor(buffer: ReplayBuffer) { + this._buffer = buffer; + } + + get full(): AsyncIterable> { + const buffer = this._buffer; + return { + async *[Symbol.asyncIterator]() { + const calls: Array = []; + for await (const event of buffer.iterate()) { + if (isToolCallFinish(event)) { + calls.push(event.content); + yield [...calls]; + } + } + }, + }; + } + + [Symbol.asyncIterator](): AsyncIterator { + const buffer = this._buffer; + async function* gen() { + for await (const event of buffer.iterate()) { + if (isToolCallFinish(event)) { + yield event.content; + } + } + } + return gen(); + } + + then, TResult2 = never>( + onfulfilled?: + | (( + value: Array + ) => TResult1 | PromiseLike) + | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + ): PromiseLike { + const promise = (async () => { + const calls: Array = []; + for await (const call of this) { + calls.push(call); + } + return calls; + })(); + return promise.then(onfulfilled, onrejected); + } +} + +// ─── Sub-Stream: Reasoning ────────────────────────────────────── + +/** + * Typed stream for reasoning content (chain-of-thought). + * Same interface as {@link TextContentStream} but for reasoning blocks. + */ +export class ReasoningContentStream + implements AsyncIterable, PromiseLike +{ + /** @internal */ + private _buffer: ReplayBuffer; + + /** @internal */ + constructor(buffer: ReplayBuffer) { + this._buffer = buffer; + } + + get full(): AsyncIterable { + const buffer = this._buffer; + return { + async *[Symbol.asyncIterator]() { + for await (const event of buffer.iterate()) { + if (isReasoningDelta(event)) { + yield getStringField( + event.content as Record, + "reasoning" + ); + } + } + }, + }; + } + + [Symbol.asyncIterator](): AsyncIterator { + const buffer = this._buffer; + async function* gen() { + const prevLen = new Map(); + for await (const event of buffer.iterate()) { + if (isReasoningDelta(event)) { + const full = getStringField( + event.content as Record, + "reasoning" + ); + const prev = prevLen.get(event.index) ?? 0; + if (full.length > prev) { + yield full.slice(prev); + prevLen.set(event.index, full.length); + } + } + } + } + return gen(); + } + + then( + onfulfilled?: ((value: string) => TResult1 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + ): PromiseLike { + const promise = (async () => { + let text = ""; + for await (const delta of this) { + text += delta; + } + return text; + })(); + return promise.then(onfulfilled, onrejected); + } +} + +// ─── Sub-Stream: Usage ────────────────────────────────────────── + +/** + * Typed stream for usage metadata. + * + * - **Iterate**: yields usage snapshots as they arrive. + * - **Await**: resolves to the final usage snapshot. + */ +export class UsageMetadataStream + implements AsyncIterable, PromiseLike +{ + /** @internal */ + private _buffer: ReplayBuffer; + + /** @internal */ + constructor(buffer: ReplayBuffer) { + this._buffer = buffer; + } + + [Symbol.asyncIterator](): AsyncIterator { + const buffer = this._buffer; + async function* gen() { + for await (const event of buffer.iterate()) { + if (event.type === "usage") { + yield event.usage; + } else if (event.type === "message-start" && event.usage) { + yield event.usage; + } else if (event.type === "message-finish" && event.usage) { + yield event.usage; + } + } + } + return gen(); + } + + then( + onfulfilled?: + | ((value: UsageMetadata) => TResult1 | PromiseLike) + | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + ): PromiseLike { + const promise = (async () => { + let latest: UsageMetadata | undefined; + for await (const usage of this) { + latest = usage; + } + return latest ?? { input_tokens: 0, output_tokens: 0, total_tokens: 0 }; + })(); + return promise.then(onfulfilled, onrejected); + } +} + +// ─── ChatModelStream ──────────────────────────────────────────── + +/** + * The main stream object returned by chat model streaming. + * + * Implements `AsyncIterable` for raw event access + * and `PromiseLike` for simple `await` usage. + * + * All sub-streams are replay-safe: multiple consumers reading from the + * same stream work correctly because each gets its own cursor over the + * shared buffer. + */ +export class ChatModelStream + implements AsyncIterable, PromiseLike +{ + /** @internal */ + private _buffer: ReplayBuffer; + + /** @internal */ + constructor(source: AsyncIterable) { + this._buffer = new ReplayBuffer(); + this._consume(source); + } + + /** @internal */ + private async _consume( + source: AsyncIterable + ): Promise { + try { + for await (const event of source) { + this._buffer.push(event); + } + this._buffer.finish(); + } catch (err) { + this._buffer.setError( + err instanceof Error ? err : new Error(String(err)) + ); + } + } + + /** Iterate over raw {@link ChatModelStreamEvent}s. */ + [Symbol.asyncIterator](): AsyncIterator { + return this._buffer.iterate(); + } + + /** Text content deltas / full text. */ + get text(): TextContentStream { + return new TextContentStream(this._buffer); + } + + /** Completed tool calls. */ + get toolCalls(): ToolCallsStream { + return new ToolCallsStream(this._buffer); + } + + /** Reasoning content (chain-of-thought). */ + get reasoning(): ReasoningContentStream { + return new ReasoningContentStream(this._buffer); + } + + /** Usage metadata snapshots. */ + get usage(): UsageMetadataStream { + return new UsageMetadataStream(this._buffer); + } + + /** The fully assembled `AIMessage`, available once the stream finishes. */ + get output(): PromiseLike { + return { then: (onf, onr) => this._assembleMessage().then(onf, onr) }; + } + + /** Allows `await stream` to resolve to the fully assembled `AIMessage`. */ + then( + onfulfilled?: + | ((value: AIMessage) => TResult1 | PromiseLike) + | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + ): PromiseLike { + return this._assembleMessage().then(onfulfilled, onrejected); + } + + /** + * Assemble all stream events into a finalized `AIMessage`. + * @internal + */ + private async _assembleMessage(): Promise { + const contentBlocks: Array = []; + let id: string | undefined; + let usage: UsageMetadata | undefined; + let responseMetadata: Record = {}; + let finishReason: string | undefined; + + for await (const event of this._buffer.iterate()) { + switch (event.type) { + case "message-start": + id = event.id ?? id; + if (event.usage) usage = event.usage; + break; + + case "content-block-start": + case "content-block-delta": + // Overwrite with the latest accumulated snapshot + contentBlocks[event.index] = event.content as ContentBlock; + break; + + case "content-block-finish": + contentBlocks[event.index] = event.content; + break; + + case "usage": + usage = event.usage; + break; + + case "message-finish": + finishReason = event.reason; + if (event.usage) usage = event.usage; + if (event.responseMetadata) { + responseMetadata = { + ...responseMetadata, + ...event.responseMetadata, + }; + } + break; + + default: + break; + } + } + + const filteredBlocks = contentBlocks.filter( + (b): b is ContentBlock => b != null + ); + + return new AIMessage({ + id, + content: filteredBlocks, + usage_metadata: usage, + response_metadata: { + ...responseMetadata, + ...(finishReason ? { finish_reason: finishReason } : {}), + output_version: "v1" as const, + }, + }); + } +} diff --git a/libs/langchain-core/src/language_models/tests/event.test.ts b/libs/langchain-core/src/language_models/tests/event.test.ts new file mode 100644 index 000000000000..3eef74159103 --- /dev/null +++ b/libs/langchain-core/src/language_models/tests/event.test.ts @@ -0,0 +1,282 @@ +import { describe, test, expect } from "vitest"; +import type { + ChatModelStreamEvent, + MessageStartEvent, + MessageFinishEvent, + ContentBlockStartEvent, + ContentBlockDeltaEvent, + ContentBlockFinishEvent, + UsageUpdateEvent, + ProviderEvent, + StreamErrorEvent, +} from "../event.js"; + +describe("ChatModelStreamEvent types", () => { + test("MessageStartEvent", () => { + const event: MessageStartEvent = { + type: "message-start", + id: "msg_123", + usage: { input_tokens: 100, output_tokens: 0, total_tokens: 100 }, + }; + expect(event.type).toBe("message-start"); + expect(event.id).toBe("msg_123"); + expect(event.usage?.input_tokens).toBe(100); + }); + + test("MessageStartEvent without optional fields", () => { + const event: MessageStartEvent = { type: "message-start" }; + expect(event.type).toBe("message-start"); + expect(event.id).toBeUndefined(); + expect(event.usage).toBeUndefined(); + }); + + test("MessageFinishEvent", () => { + const event: MessageFinishEvent = { + type: "message-finish", + reason: "stop", + usage: { input_tokens: 100, output_tokens: 50, total_tokens: 150 }, + responseMetadata: { model_name: "gpt-4" }, + }; + expect(event.type).toBe("message-finish"); + expect(event.reason).toBe("stop"); + expect(event.usage?.output_tokens).toBe(50); + expect(event.responseMetadata?.model_name).toBe("gpt-4"); + }); + + test("ContentBlockStartEvent", () => { + const event: ContentBlockStartEvent = { + type: "content-block-start", + index: 0, + content: { type: "text", text: "" }, + }; + expect(event.type).toBe("content-block-start"); + expect(event.index).toBe(0); + expect(event.content.type).toBe("text"); + }); + + test("ContentBlockDeltaEvent with text", () => { + const event: ContentBlockDeltaEvent = { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "Hello world" }, + }; + expect(event.type).toBe("content-block-delta"); + expect(event.index).toBe(0); + expect((event.content as { text: string }).text).toBe("Hello world"); + }); + + test("ContentBlockDeltaEvent with tool call", () => { + const event: ContentBlockDeltaEvent = { + type: "content-block-delta", + index: 1, + content: { + type: "tool_call", + id: "call_1", + name: "search", + args: '{"q":"wea', + }, + }; + expect(event.type).toBe("content-block-delta"); + expect(event.index).toBe(1); + }); + + test("ContentBlockFinishEvent with text", () => { + const event: ContentBlockFinishEvent = { + type: "content-block-finish", + index: 0, + content: { type: "text", text: "Hello world, how are you?" }, + }; + expect(event.type).toBe("content-block-finish"); + expect(event.content.type).toBe("text"); + expect((event.content as { text: string }).text).toBe( + "Hello world, how are you?" + ); + }); + + test("ContentBlockFinishEvent with finalized tool call", () => { + const event: ContentBlockFinishEvent = { + type: "content-block-finish", + index: 1, + content: { + type: "tool_call", + id: "call_1", + name: "search", + args: { q: "weather" }, + }, + }; + expect(event.type).toBe("content-block-finish"); + expect(event.content.type).toBe("tool_call"); + expect((event.content as { args: Record }).args).toEqual({ + q: "weather", + }); + }); + + test("UsageUpdateEvent", () => { + const event: UsageUpdateEvent = { + type: "usage", + usage: { input_tokens: 100, output_tokens: 25, total_tokens: 125 }, + }; + expect(event.type).toBe("usage"); + expect(event.usage.total_tokens).toBe(125); + }); + + test("ProviderEvent", () => { + const event: ProviderEvent = { + type: "provider", + provider: "openai", + name: "response.web_search_call.searching", + payload: { item_id: "ws_123", output_index: 0 }, + }; + expect(event.type).toBe("provider"); + expect(event.provider).toBe("openai"); + expect(event.name).toBe("response.web_search_call.searching"); + }); + + test("StreamErrorEvent", () => { + const event: StreamErrorEvent = { + type: "error", + message: "Connection lost", + code: "CONNECTION_ERROR", + }; + expect(event.type).toBe("error"); + expect(event.message).toBe("Connection lost"); + expect(event.code).toBe("CONNECTION_ERROR"); + }); + + test("event types are mutually exclusive via type field", () => { + const events: ChatModelStreamEvent[] = [ + { type: "message-start" }, + { type: "message-finish", reason: "stop" }, + { + type: "content-block-start", + index: 0, + content: { type: "text", text: "" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "hi" }, + }, + { + type: "content-block-finish", + index: 0, + content: { type: "text", text: "hi" }, + }, + { + type: "usage", + usage: { input_tokens: 0, output_tokens: 0, total_tokens: 0 }, + }, + { type: "provider", provider: "test", name: "test.event", payload: {} }, + { type: "error", message: "oops" }, + ]; + + const expectedTypes = [ + "message-start", + "message-finish", + "content-block-start", + "content-block-delta", + "content-block-finish", + "usage", + "provider", + "error", + ]; + + for (let i = 0; i < events.length; i++) { + expect(events[i]!.type).toBe(expectedTypes[i]); + // Each event type is unique + for (let j = 0; j < events.length; j++) { + if (i === j) continue; + expect(events[i]!.type).not.toBe(events[j]!.type); + } + } + }); +}); + +describe("interleaving semantics", () => { + test("interleaved content blocks have distinct indexes", () => { + const events: ChatModelStreamEvent[] = [ + { type: "message-start" }, + { + type: "content-block-start", + index: 0, + content: { type: "text", text: "" }, + }, + { + type: "content-block-start", + index: 1, + content: { + type: "tool_call_chunk", + id: "c1", + name: "search", + args: "", + }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "Hello" }, + }, + { + type: "content-block-delta", + index: 1, + content: { + type: "tool_call_chunk", + id: "c1", + name: "search", + args: '{"q"', + }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "Hello world" }, + }, + { + type: "content-block-finish", + index: 0, + content: { type: "text", text: "Hello world" }, + }, + { + type: "content-block-delta", + index: 1, + content: { + type: "tool_call_chunk", + id: "c1", + name: "search", + args: '{"q":"test"}', + }, + }, + { + type: "content-block-finish", + index: 1, + content: { + type: "tool_call", + id: "c1", + name: "search", + args: { q: "test" }, + }, + }, + { type: "message-finish", reason: "tool_use" }, + ]; + + // Verify lifecycle invariant: start before deltas before finish, per-block + const blockStates = new Map(); + for (const event of events) { + if (event.type === "content-block-start") { + expect(blockStates.has(event.index)).toBe(false); + blockStates.set(event.index, "started"); + } else if (event.type === "content-block-delta") { + const state = blockStates.get(event.index); + expect(state === "started" || state === "streaming").toBe(true); + blockStates.set(event.index, "streaming"); + } else if (event.type === "content-block-finish") { + const state = blockStates.get(event.index); + expect(state === "started" || state === "streaming").toBe(true); + blockStates.set(event.index, "finished"); + } + } + + expect(blockStates.get(0)).toBe("finished"); + expect(blockStates.get(1)).toBe("finished"); + }); +}); diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts new file mode 100644 index 000000000000..55a2547df91b --- /dev/null +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -0,0 +1,528 @@ +import { describe, test, expect } from "vitest"; +import type { ChatModelStreamEvent } from "../event.js"; +import { ChatModelStream, ChatModelStream } from "../stream.js"; + +// Helper: create an async iterable from an array of events +async function* iterEvents( + events: ChatModelStreamEvent[] +): AsyncGenerator { + for (const event of events) { + yield event; + } +} + +// Helper: a realistic text-only stream +function textStreamEvents(): ChatModelStreamEvent[] { + return [ + { type: "message-start", id: "msg_1" }, + { + type: "content-block-start", + index: 0, + content: { type: "text", text: "" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "Hello" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "Hello world" }, + }, + { + type: "content-block-finish", + index: 0, + content: { type: "text", text: "Hello world" }, + }, + { + type: "usage", + usage: { input_tokens: 10, output_tokens: 2, total_tokens: 12 }, + }, + { + type: "message-finish", + reason: "stop", + usage: { input_tokens: 10, output_tokens: 2, total_tokens: 12 }, + responseMetadata: { model_name: "test-model" }, + }, + ]; +} + +// Helper: a stream with reasoning + text + tool call +function complexStreamEvents(): ChatModelStreamEvent[] { + return [ + { + type: "message-start", + id: "msg_2", + usage: { input_tokens: 50, output_tokens: 0, total_tokens: 50 }, + }, + // Reasoning block + { + type: "content-block-start", + index: 0, + content: { type: "reasoning", reasoning: "" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "reasoning", reasoning: "Let me" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "reasoning", reasoning: "Let me think..." }, + }, + { + type: "content-block-finish", + index: 0, + content: { type: "reasoning", reasoning: "Let me think..." }, + }, + // Text block + { + type: "content-block-start", + index: 1, + content: { type: "text", text: "" }, + }, + { + type: "content-block-delta", + index: 1, + content: { type: "text", text: "The answer" }, + }, + { + type: "content-block-delta", + index: 1, + content: { type: "text", text: "The answer is 42." }, + }, + { + type: "content-block-finish", + index: 1, + content: { type: "text", text: "The answer is 42." }, + }, + // Tool call block + { + type: "content-block-start", + index: 2, + content: { + type: "tool_call_chunk", + id: "call_1", + name: "calculator", + args: "", + }, + }, + { + type: "content-block-delta", + index: 2, + content: { + type: "tool_call_chunk", + id: "call_1", + name: "calculator", + args: '{"expr', + }, + }, + { + type: "content-block-delta", + index: 2, + content: { + type: "tool_call_chunk", + id: "call_1", + name: "calculator", + args: '{"expr":"6*7"}', + }, + }, + { + type: "content-block-finish", + index: 2, + content: { + type: "tool_call", + id: "call_1", + name: "calculator", + args: { expr: "6*7" }, + }, + }, + { + type: "usage", + usage: { input_tokens: 50, output_tokens: 30, total_tokens: 80 }, + }, + { + type: "message-finish", + reason: "tool_use", + usage: { input_tokens: 50, output_tokens: 30, total_tokens: 80 }, + }, + ]; +} + +describe("ChatModelStream", () => { + describe("raw event iteration", () => { + test("iterates all events", async () => { + const events = textStreamEvents(); + const stream = new ChatModelStream(iterEvents(events)); + + const collected: ChatModelStreamEvent[] = []; + for await (const event of stream) { + collected.push(event); + } + + expect(collected.length).toBe(events.length); + expect(collected[0]!.type).toBe("message-start"); + expect(collected[collected.length - 1]!.type).toBe("message-finish"); + }); + }); + + describe(".text sub-stream", () => { + test("yields incremental text deltas", async () => { + const stream = new ChatModelStream(iterEvents(textStreamEvents())); + + const deltas: string[] = []; + for await (const delta of stream.text) { + deltas.push(delta); + } + + expect(deltas).toEqual(["Hello", " world"]); + }); + + test("await resolves to full text", async () => { + const stream = new ChatModelStream(iterEvents(textStreamEvents())); + const fullText: string = await stream.text; + expect(fullText).toBe("Hello world"); + }); + + test(".full yields running concatenation", async () => { + const stream = new ChatModelStream(iterEvents(textStreamEvents())); + + const snapshots: string[] = []; + for await (const snapshot of stream.text.full) { + snapshots.push(snapshot); + } + + expect(snapshots).toEqual(["Hello", "Hello world"]); + }); + }); + + describe(".toolCalls sub-stream", () => { + test("yields completed tool calls", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + + const calls = []; + for await (const call of stream.toolCalls) { + calls.push(call); + } + + expect(calls.length).toBe(1); + expect(calls[0]!.name).toBe("calculator"); + expect(calls[0]!.args).toEqual({ expr: "6*7" }); + }); + + test("await resolves to full array", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + const calls = await stream.toolCalls; + + expect(calls.length).toBe(1); + expect(calls[0]!.type).toBe("tool_call"); + expect(calls[0]!.id).toBe("call_1"); + }); + + test(".full yields accumulated array", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + + const snapshots = []; + for await (const snapshot of stream.toolCalls.full) { + snapshots.push(snapshot); + } + + expect(snapshots.length).toBe(1); + expect(snapshots[0]!.length).toBe(1); + }); + }); + + describe(".reasoning sub-stream", () => { + test("yields reasoning deltas", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + + const deltas: string[] = []; + for await (const delta of stream.reasoning) { + deltas.push(delta); + } + + expect(deltas).toEqual(["Let me", " think..."]); + }); + + test("await resolves to full reasoning", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + const fullReasoning: string = await stream.reasoning; + expect(fullReasoning).toBe("Let me think..."); + }); + }); + + describe(".usage sub-stream", () => { + test("yields usage snapshots", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + + const usages = []; + for await (const usage of stream.usage) { + usages.push(usage); + } + + // message-start usage, then usage event, then message-finish usage + expect(usages.length).toBe(3); + // First: input tokens from message-start + expect(usages[0]!.input_tokens).toBe(50); + expect(usages[0]!.output_tokens).toBe(0); + // Last: final usage + expect(usages[usages.length - 1]!.output_tokens).toBe(30); + }); + + test("await resolves to final usage", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + const usage = await stream.usage; + expect(usage.input_tokens).toBe(50); + expect(usage.output_tokens).toBe(30); + expect(usage.total_tokens).toBe(80); + }); + + test("resolves to zero usage when none provided", async () => { + const events: ChatModelStreamEvent[] = [ + { type: "message-start" }, + { type: "message-finish", reason: "stop" }, + ]; + const stream = new ChatModelStream(iterEvents(events)); + const usage = await stream.usage; + expect(usage.input_tokens).toBe(0); + expect(usage.output_tokens).toBe(0); + }); + }); + + describe(".output (AIMessage assembly)", () => { + test("assembles text-only message", async () => { + const stream = new ChatModelStream(iterEvents(textStreamEvents())); + const message = await stream.output; + + expect(message.id).toBe("msg_1"); + expect(message._getType()).toBe("ai"); + + // Content should be the finalized content blocks + expect(Array.isArray(message.content)).toBe(true); + const content = message.content as Array<{ type: string; text?: string }>; + expect(content.length).toBe(1); + expect(content[0]!.type).toBe("text"); + expect(content[0]!.text).toBe("Hello world"); + + // Usage + expect(message.usage_metadata?.input_tokens).toBe(10); + expect(message.usage_metadata?.output_tokens).toBe(2); + + // Response metadata + expect(message.response_metadata?.finish_reason).toBe("stop"); + expect(message.response_metadata?.model_name).toBe("test-model"); + }); + + test("assembles complex message with reasoning + text + tool call", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + const message = await stream.output; + + expect(message.id).toBe("msg_2"); + + const content = message.content as Array<{ + type: string; + text?: string; + reasoning?: string; + name?: string; + args?: unknown; + }>; + expect(content.length).toBe(3); + + // Reasoning + expect(content[0]!.type).toBe("reasoning"); + expect(content[0]!.reasoning).toBe("Let me think..."); + + // Text + expect(content[1]!.type).toBe("text"); + expect(content[1]!.text).toBe("The answer is 42."); + + // Tool call (finalized) + expect(content[2]!.type).toBe("tool_call"); + expect(content[2]!.name).toBe("calculator"); + expect(content[2]!.args).toEqual({ expr: "6*7" }); + + // Tool calls array + expect(message.tool_calls?.length).toBe(1); + expect(message.tool_calls?.[0]?.name).toBe("calculator"); + + // Finish reason + expect(message.response_metadata?.finish_reason).toBe("tool_use"); + }); + }); + + describe("PromiseLike (await stream)", () => { + test("await stream resolves to AIMessage", async () => { + const stream = new ChatModelStream(iterEvents(textStreamEvents())); + const message = await stream; + + expect(message._getType()).toBe("ai"); + expect(message.id).toBe("msg_1"); + }); + }); + + describe("replay safety", () => { + test("multiple sub-streams can be consumed in parallel", async () => { + const stream = new ChatModelStream(iterEvents(complexStreamEvents())); + + const [text, tools, usage] = await Promise.all([ + stream.text, + stream.toolCalls, + stream.usage, + ]); + + expect(text).toBe("The answer is 42."); + expect(tools.length).toBe(1); + expect(tools[0]!.name).toBe("calculator"); + expect(usage.total_tokens).toBe(80); + }); + + test("iterating raw events then awaiting sub-stream via replay", async () => { + const stream = new ChatModelStream(iterEvents(textStreamEvents())); + + // First: consume raw events + const events: ChatModelStreamEvent[] = []; + for await (const event of stream) { + events.push(event); + } + expect(events.length).toBe(7); + + // Then: sub-stream replays from buffer (full replay, not compacted) + const text = await stream.text; + expect(text).toBe("Hello world"); + }); + }); + + describe("provider events passthrough", () => { + test("provider events are visible in raw iteration", async () => { + const events: ChatModelStreamEvent[] = [ + { type: "message-start" }, + { + type: "provider", + provider: "openai", + name: "response.web_search_call.searching", + payload: { item_id: "ws_1" }, + }, + { + type: "content-block-start", + index: 0, + content: { type: "text", text: "" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "Result" }, + }, + { + type: "content-block-finish", + index: 0, + content: { type: "text", text: "Result" }, + }, + { type: "message-finish", reason: "stop" }, + ]; + + const stream = new ChatModelStream(iterEvents(events)); + + const providerEvents = []; + for await (const event of stream) { + if (event.type === "provider") { + providerEvents.push(event); + } + } + + expect(providerEvents.length).toBe(1); + expect(providerEvents[0]!.provider).toBe("openai"); + expect(providerEvents[0]!.name).toBe( + "response.web_search_call.searching" + ); + }); + + test("provider events are ignored by sub-streams", async () => { + const events: ChatModelStreamEvent[] = [ + { type: "message-start" }, + { + type: "provider", + provider: "openai", + name: "response.web_search_call.searching", + payload: {}, + }, + { + type: "content-block-start", + index: 0, + content: { type: "text", text: "" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "Hello" }, + }, + { + type: "content-block-finish", + index: 0, + content: { type: "text", text: "Hello" }, + }, + { type: "message-finish", reason: "stop" }, + ]; + + const stream = new ChatModelStream(iterEvents(events)); + const text = await stream.text; + expect(text).toBe("Hello"); + }); + }); + + describe("error handling", () => { + test("error event in stream", async () => { + const events: ChatModelStreamEvent[] = [ + { type: "message-start" }, + { + type: "content-block-start", + index: 0, + content: { type: "text", text: "" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "text", text: "Partial" }, + }, + { type: "error", message: "Connection lost", code: "CONN_ERR" }, + { type: "message-finish", reason: "stop" }, + ]; + + const stream = new ChatModelStream(iterEvents(events)); + // Error events flow through as regular events + const collected: ChatModelStreamEvent[] = []; + for await (const event of stream) { + collected.push(event); + } + const errorEvents = collected.filter((e) => e.type === "error"); + expect(errorEvents.length).toBe(1); + }); + + test("source async iterable throwing propagates", async () => { + async function* throwingSource(): AsyncGenerator { + yield { type: "message-start" }; + throw new Error("Provider connection failed"); + } + + const stream = new ChatModelStream(throwingSource()); + + await expect(async () => { + for await (const _event of stream) { + // consume + } + }).rejects.toThrow("Provider connection failed"); + }); + }); + + describe("empty stream", () => { + test("empty source produces empty text", async () => { + async function* empty(): AsyncGenerator { + // nothing + } + const stream = new ChatModelStream(empty()); + const text = await stream.text; + expect(text).toBe(""); + }); + }); +}); diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts new file mode 100644 index 000000000000..0cbc4720e6d4 --- /dev/null +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -0,0 +1,396 @@ +import { describe, test, expect } from "vitest"; +import { AIMessageChunk } from "../../messages/ai.js"; +import { ChatGenerationChunk } from "../../outputs.js"; +import { + BaseChatModel, + type BaseChatModelCallOptions, +} from "../chat_models.js"; +import type { ChatModelStreamEvent } from "../event.js"; +import type { BaseMessage } from "../../messages/base.js"; +import type { CallbackManagerForLLMRun } from "../../callbacks/manager.js"; +import type { ChatResult } from "../../outputs.js"; +import type { ContentBlock } from "../../messages/content/index.js"; + +/** + * A minimal chat model that yields text chunks via _streamResponseChunks. + * Used to test the bridge from legacy streaming to the new event protocol. + */ +class FakeTextStreamModel extends BaseChatModel { + _llmType() { + return "fake-text-stream"; + } + + async _generate( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): Promise { + return { generations: [] }; + } + + async *_streamResponseChunks( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ content: "Hello", id: "msg_test" }), + text: "Hello", + }); + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ content: " world" }), + text: " world", + }); + } +} + +/** + * A model that yields content blocks (array format) via _streamResponseChunks. + */ +class FakeBlockStreamModel extends BaseChatModel { + _llmType() { + return "fake-block-stream"; + } + + async _generate( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): Promise { + return { generations: [] }; + } + + async *_streamResponseChunks( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + // Reasoning block at index 0 + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: [{ type: "reasoning", reasoning: "Thinking", index: 0 }], + id: "msg_blocks", + }), + text: "", + }); + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: [{ type: "reasoning", reasoning: " hard...", index: 0 }], + }), + text: "", + }); + // Text block at index 1 + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: [{ type: "text", text: "Result!", index: 1 }], + }), + text: "Result!", + }); + } +} + +/** + * A model that yields tool call chunks via _streamResponseChunks. + */ +class FakeToolCallStreamModel extends BaseChatModel { + _llmType() { + return "fake-tool-stream"; + } + + async _generate( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): Promise { + return { generations: [] }; + } + + async *_streamResponseChunks( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: "", + id: "msg_tools", + tool_call_chunks: [ + { id: "call_1", name: "search", args: "", index: 0 }, + ], + }), + text: "", + }); + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: "", + tool_call_chunks: [{ args: '{"q":"hello"}', index: 0 }], + }), + text: "", + }); + } +} + +/** + * A model that yields chunks with usage_metadata. + */ +class FakeUsageStreamModel extends BaseChatModel { + _llmType() { + return "fake-usage-stream"; + } + + async _generate( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): Promise { + return { generations: [] }; + } + + async *_streamResponseChunks( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + // First chunk: input tokens known + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: "", + id: "msg_usage", + usage_metadata: { + input_tokens: 100, + output_tokens: 0, + total_tokens: 100, + }, + }), + text: "", + }); + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ content: "Hi" }), + text: "Hi", + }); + // Last chunk: output tokens known + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: "", + usage_metadata: { + input_tokens: 0, + output_tokens: 5, + total_tokens: 5, + }, + }), + text: "", + }); + } +} + +describe("_streamChatModelEvents bridge", () => { + describe("text streaming", () => { + test("bridges string content to text content block events", async () => { + const model = new FakeTextStreamModel({}); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + // message-start + expect(events[0]!.type).toBe("message-start"); + expect((events[0] as { id?: string }).id).toBe("msg_test"); + + // content-block-start for text + expect(events[1]!.type).toBe("content-block-start"); + const startBlock = events[1] as { + index: number; + content: ContentBlock; + }; + expect(startBlock.index).toBe(0); + expect(startBlock.content.type).toBe("text"); + + // content-block-delta for "Hello" + expect(events[2]!.type).toBe("content-block-delta"); + const delta1 = events[2] as { + index: number; + content: ContentBlock; + }; + expect((delta1.content as ContentBlock.Text).text).toBe("Hello"); + + // content-block-delta for " world" (accumulated) + expect(events[3]!.type).toBe("content-block-delta"); + const delta2 = events[3] as { + index: number; + content: ContentBlock; + }; + expect((delta2.content as ContentBlock.Text).text).toBe("Hello world"); + + // content-block-finish + const finishIdx = events.findIndex( + (e) => e.type === "content-block-finish" + ); + expect(finishIdx).toBeGreaterThan(-1); + const finish = events[finishIdx] as { + content: ContentBlock.Standard; + }; + expect((finish.content as ContentBlock.Text).text).toBe("Hello world"); + + // message-finish + const msgFinish = events[events.length - 1]!; + expect(msgFinish.type).toBe("message-finish"); + expect((msgFinish as { reason: string }).reason).toBe("stop"); + }); + }); + + describe("block content streaming", () => { + test("bridges array content blocks with proper indexing", async () => { + const model = new FakeBlockStreamModel({}); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + // Should have start events for both blocks + const starts = events.filter((e) => e.type === "content-block-start"); + expect(starts.length).toBe(2); + + // Block 0: reasoning + const reasoningStart = starts.find( + (e) => (e as { index: number }).index === 0 + ) as { content: ContentBlock }; + expect(reasoningStart!.content.type).toBe("reasoning"); + + // Block 1: text + const textStart = starts.find( + (e) => (e as { index: number }).index === 1 + ) as { content: ContentBlock }; + expect(textStart!.content.type).toBe("text"); + + // Reasoning deltas should accumulate + const reasoningDeltas = events.filter( + (e) => + e.type === "content-block-delta" && + (e as { index: number }).index === 0 + ); + expect(reasoningDeltas.length).toBe(1); // second reasoning chunk is a delta + + // Check accumulated reasoning + const lastReasoningDelta = reasoningDeltas[ + reasoningDeltas.length - 1 + ] as { + content: ContentBlock.Reasoning; + }; + expect(lastReasoningDelta.content.reasoning).toBe("Thinking hard..."); + + // Finish events for both blocks + const finishes = events.filter((e) => e.type === "content-block-finish"); + expect(finishes.length).toBe(2); + }); + }); + + describe("tool call streaming", () => { + test("bridges tool_call_chunks to content block events", async () => { + const model = new FakeToolCallStreamModel({}); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + // Should have a start event for the tool call + const starts = events.filter((e) => e.type === "content-block-start"); + expect(starts.length).toBeGreaterThanOrEqual(1); + + const toolStart = starts.find( + (e) => + (e as { content: ContentBlock }).content.type === "tool_call_chunk" + ) as { content: ContentBlock.Tools.ToolCallChunk } | undefined; + expect(toolStart).toBeDefined(); + expect(toolStart!.content.name).toBe("search"); + + // Should have a finish event with finalized tool call + const finishes = events.filter((e) => e.type === "content-block-finish"); + const toolFinish = finishes.find( + (e) => + (e as { content: ContentBlock.Standard }).content.type === "tool_call" + ) as { content: ContentBlock.Tools.ToolCall } | undefined; + expect(toolFinish).toBeDefined(); + expect(toolFinish!.content.name).toBe("search"); + expect(toolFinish!.content.args).toEqual({ q: "hello" }); + }); + }); + + describe("usage streaming", () => { + test("emits usage events when usage_metadata changes", async () => { + const model = new FakeUsageStreamModel({}); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const usageEvents = events.filter((e) => e.type === "usage"); + expect(usageEvents.length).toBeGreaterThanOrEqual(1); + + // First usage: input tokens + const firstUsage = usageEvents[0] as { usage: { input_tokens: number } }; + expect(firstUsage.usage.input_tokens).toBe(100); + + // message-start should also have usage + const msgStart = events[0] as { + type: string; + usage?: { input_tokens: number }; + }; + expect(msgStart.type).toBe("message-start"); + expect(msgStart.usage?.input_tokens).toBe(100); + }); + }); + + describe("streamV2 method", () => { + test("returns ChatModelStream from streamV2()", async () => { + const model = new FakeTextStreamModel({}); + const stream = model.streamV2("Hello"); + + // Should be iterable + const events: ChatModelStreamEvent[] = []; + for await (const event of stream) { + events.push(event); + } + expect(events.length).toBeGreaterThan(0); + }); + + test("text sub-stream works via streamV2()", async () => { + const model = new FakeTextStreamModel({}); + const stream = model.streamV2("Hello"); + + const text = await stream.text; + expect(text).toBe("Hello world"); + }); + + test("output works via streamV2()", async () => { + const model = new FakeTextStreamModel({}); + const stream = model.streamV2("Hello"); + + const message = await stream.output; + expect(message._getType()).toBe("ai"); + + const content = message.content as Array<{ type: string; text?: string }>; + expect(content.length).toBe(1); + expect(content[0]!.text).toBe("Hello world"); + }); + + test("await stream returns AIMessage", async () => { + const model = new FakeTextStreamModel({}); + const message = await model.streamV2("Hello"); + + expect(message._getType()).toBe("ai"); + expect(message.id).toBe("msg_test"); + }); + }); +}); diff --git a/libs/langchain-core/src/load/import_map.ts b/libs/langchain-core/src/load/import_map.ts index 483eb66d4cd4..25849f05c42f 100644 --- a/libs/langchain-core/src/load/import_map.ts +++ b/libs/langchain-core/src/load/import_map.ts @@ -16,8 +16,11 @@ export * as index from "../index.js"; export * as indexing from "../indexing/index.js"; export * as language_models__base from "../language_models/base.js"; export * as language_models__chat_models from "../language_models/chat_models.js"; +export * as language_models__compat from "../language_models/compat.js"; +export * as language_models__event from "../language_models/event.js"; export * as language_models__llms from "../language_models/llms.js"; export * as language_models__profile from "../language_models/profile.js"; +export * as language_models__stream from "../language_models/stream.js"; export * as language_models__structured_output from "../language_models/structured_output.js"; export * as load__serializable from "../load/serializable.js"; export * as memory from "../memory.js"; diff --git a/libs/langchain-core/src/messages/content/index.ts b/libs/langchain-core/src/messages/content/index.ts index 52b67be71aa5..0e116b932022 100644 --- a/libs/langchain-core/src/messages/content/index.ts +++ b/libs/langchain-core/src/messages/content/index.ts @@ -8,9 +8,14 @@ import { type Multimodal, } from "./multimodal.js"; import { type Data } from "./data.js"; +import { type DeepPartial } from "../../types/type-utils.js"; export interface ContentBlock extends BaseContentBlock {} +export type PartialContentBlock = { + readonly type: T["type"]; +} & DeepPartial>; + export const KNOWN_BLOCK_TYPES = [ "text", "reasoning", diff --git a/libs/langchain-core/src/types/type-utils.ts b/libs/langchain-core/src/types/type-utils.ts index e2c1e6970a52..adeecf1938b5 100644 --- a/libs/langchain-core/src/types/type-utils.ts +++ b/libs/langchain-core/src/types/type-utils.ts @@ -1,3 +1,8 @@ // Utility for marking only some keys of an interface as optional // Compare to Partial which marks all keys as optional export type Optional = Omit & Partial>; + +// Utility for making all properties within a type optional +export type DeepPartial = { + [P in keyof T]?: T[P] extends object ? DeepPartial : T[P]; +}; diff --git a/libs/langchain-core/tsdown.config.ts b/libs/langchain-core/tsdown.config.ts index 76f7578718f1..e6713bb6abd4 100644 --- a/libs/langchain-core/tsdown.config.ts +++ b/libs/langchain-core/tsdown.config.ts @@ -28,6 +28,9 @@ export default getBuildConfig({ "./src/indexing/index.ts", "./src/language_models/base.ts", "./src/language_models/chat_models.ts", + "./src/language_models/compat.ts", + "./src/language_models/event.ts", + "./src/language_models/stream.ts", "./src/language_models/llms.ts", "./src/language_models/profile.ts", "./src/language_models/structured_output.ts", diff --git a/libs/providers/langchain-anthropic/src/chat_models.ts b/libs/providers/langchain-anthropic/src/chat_models.ts index 2c3523280dbd..8fe86241ce09 100644 --- a/libs/providers/langchain-anthropic/src/chat_models.ts +++ b/libs/providers/langchain-anthropic/src/chat_models.ts @@ -12,6 +12,7 @@ import { LangSmithParams, type BaseChatModelParams, } from "@langchain/core/language_models/chat_models"; +import type { ChatModelStreamEvent } from "@langchain/core/language_models/event"; import { type StructuredOutputMethodOptions, type BaseLanguageModelInput, @@ -429,6 +430,8 @@ function extractToken(chunk: AIMessageChunk): string | undefined { return undefined; } +import { convertAnthropicStream } from "./utils/stream_events.js"; + /** * Anthropic chat model integration. * @@ -1339,6 +1342,66 @@ export class ChatAnthropicMessages< } } + /** + * Native implementation of the content-block-centric streaming protocol + * for Anthropic. + * + * Maps Anthropic's native SSE events directly to {@link ChatModelStreamEvent} + * without going through the legacy `_streamResponseChunks` bridge. This + * provides: + * - Explicit lifecycle events (start/delta/finish) for every content block + * - Fully-qualified accumulated content blocks on each delta + * - Usage snapshots as they become available + * - Provider passthrough for unrecognized Anthropic events + */ + async *_streamChatModelEvents( + messages: BaseMessage[], + options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + const params = this.invocationParams(options); + let formattedMessages = _convertMessagesToAnthropicPayload(messages); + + if (options.cache_control) { + formattedMessages = applyCacheControlToPayload( + formattedMessages, + options.cache_control + ); + } + + const payload = { + ...params, + ...formattedMessages, + stream: true, + } as const; + + const stream = await this.createStreamWithRetry(payload, { + headers: options.headers, + signal: options.signal, + }); + + const shouldStreamUsage = this.streamUsage ?? options.streamUsage; + + // Wrap the raw Anthropic stream with abort handling, then + // delegate all event conversion to the pure converter. + const abortableStream = async function* ( + source: AsyncIterable, + signal?: AbortSignal + ) { + for await (const data of source) { + if (signal?.aborted) { + (source as { controller?: { abort(): void } }).controller?.abort(); + return; + } + yield data; + } + }; + + yield* convertAnthropicStream(abortableStream(stream, options.signal), { + streamUsage: shouldStreamUsage ?? true, + }); + } + /** @ignore */ async _generateNonStreaming( messages: BaseMessage[], diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts new file mode 100644 index 000000000000..90f25ff3eb1a --- /dev/null +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -0,0 +1,723 @@ +import { describe, test, expect } from "vitest"; +import type { ChatModelStreamEvent } from "@langchain/core/language_models/event"; +import { ChatModelStream } from "@langchain/core/language_models/stream"; +import { ChatAnthropic } from "../chat_models.js"; +import type { BaseChatModelCallOptions } from "@langchain/core/language_models/chat_models"; + +/** + * Builds a mock Anthropic that returns a canned SSE stream. + * We subclass ChatAnthropic and override createStreamWithRetry + * to return a fake async iterable of Anthropic events. + */ +class MockStreamChatAnthropic extends ChatAnthropic { + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + private mockEvents: any[]; + + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + constructor(mockEvents: any[]) { + super({ apiKey: "fake-key", model: "claude-sonnet-4-20250514" }); + this.mockEvents = mockEvents; + } + + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + protected async createStreamWithRetry(): Promise { + const events = this.mockEvents; + return { + controller: { abort: () => {} }, + async *[Symbol.asyncIterator]() { + for (const event of events) { + yield event; + } + }, + }; + } +} + +// ─── Fixtures (native Anthropic SSE events) ───────────────────── + +function textOnlyEvents() { + return [ + { + type: "message_start" as const, + message: { + id: "msg_01ABC", + type: "message" as const, + role: "assistant" as const, + content: [], + model: "claude-sonnet-4-20250514", + stop_reason: null, + stop_sequence: null, + usage: { input_tokens: 25, output_tokens: 0 }, + }, + }, + { + type: "content_block_start" as const, + index: 0, + content_block: { type: "text" as const, text: "" }, + }, + { + type: "content_block_delta" as const, + index: 0, + delta: { type: "text_delta" as const, text: "Hello" }, + }, + { + type: "content_block_delta" as const, + index: 0, + delta: { type: "text_delta" as const, text: " world" }, + }, + { type: "content_block_stop" as const, index: 0 }, + { + type: "message_delta" as const, + delta: { stop_reason: "end_turn" as const, stop_sequence: null }, + usage: { output_tokens: 2 }, + }, + { type: "message_stop" as const }, + ]; +} + +function thinkingPlusTextEvents() { + return [ + { + type: "message_start" as const, + message: { + id: "msg_02DEF", + type: "message" as const, + role: "assistant" as const, + content: [], + model: "claude-sonnet-4-20250514", + stop_reason: null, + stop_sequence: null, + usage: { input_tokens: 50, output_tokens: 0 }, + }, + }, + { + type: "content_block_start" as const, + index: 0, + content_block: { type: "thinking" as const, thinking: "" }, + }, + { + type: "content_block_delta" as const, + index: 0, + delta: { type: "thinking_delta" as const, thinking: "Let me" }, + }, + { + type: "content_block_delta" as const, + index: 0, + delta: { type: "thinking_delta" as const, thinking: " reason..." }, + }, + { + type: "content_block_delta" as const, + index: 0, + delta: { type: "signature_delta" as const, signature: "sig_abc" }, + }, + { type: "content_block_stop" as const, index: 0 }, + { + type: "content_block_start" as const, + index: 1, + content_block: { type: "text" as const, text: "" }, + }, + { + type: "content_block_delta" as const, + index: 1, + delta: { type: "text_delta" as const, text: "The answer is 42." }, + }, + { type: "content_block_stop" as const, index: 1 }, + { + type: "message_delta" as const, + delta: { stop_reason: "end_turn" as const, stop_sequence: null }, + usage: { output_tokens: 20 }, + }, + { type: "message_stop" as const }, + ]; +} + +function toolCallEvents() { + return [ + { + type: "message_start" as const, + message: { + id: "msg_03GHI", + type: "message" as const, + role: "assistant" as const, + content: [], + model: "claude-sonnet-4-20250514", + stop_reason: null, + stop_sequence: null, + usage: { input_tokens: 100, output_tokens: 0 }, + }, + }, + { + type: "content_block_start" as const, + index: 0, + content_block: { type: "text" as const, text: "" }, + }, + { + type: "content_block_delta" as const, + index: 0, + delta: { type: "text_delta" as const, text: "Let me search." }, + }, + { type: "content_block_stop" as const, index: 0 }, + { + type: "content_block_start" as const, + index: 1, + content_block: { + type: "tool_use" as const, + id: "toolu_01ABC", + name: "web_search", + }, + }, + { + type: "content_block_delta" as const, + index: 1, + delta: { type: "input_json_delta" as const, partial_json: '{"query"' }, + }, + { + type: "content_block_delta" as const, + index: 1, + delta: { type: "input_json_delta" as const, partial_json: ':"weather"}' }, + }, + { type: "content_block_stop" as const, index: 1 }, + { + type: "message_delta" as const, + delta: { stop_reason: "tool_use" as const, stop_sequence: null }, + usage: { output_tokens: 15 }, + }, + { type: "message_stop" as const }, + ]; +} + +function cacheUsageEvents() { + return [ + { + type: "message_start" as const, + message: { + id: "msg_04JKL", + type: "message" as const, + role: "assistant" as const, + content: [], + model: "claude-sonnet-4-20250514", + stop_reason: null, + stop_sequence: null, + usage: { + input_tokens: 100, + output_tokens: 0, + cache_creation_input_tokens: 500, + cache_read_input_tokens: 200, + }, + }, + }, + { + type: "content_block_start" as const, + index: 0, + content_block: { type: "text" as const, text: "" }, + }, + { + type: "content_block_delta" as const, + index: 0, + delta: { type: "text_delta" as const, text: "Cached response" }, + }, + { type: "content_block_stop" as const, index: 0 }, + { + type: "message_delta" as const, + delta: { stop_reason: "end_turn" as const, stop_sequence: null }, + usage: { output_tokens: 3 }, + }, + { type: "message_stop" as const }, + ]; +} + +// ─── Tests ─────────────────────────────────────────────────────── + +describe("ChatAnthropic._streamChatModelEvents (native)", () => { + describe("text-only streaming", () => { + test("emits correct lifecycle events", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + const events: ChatModelStreamEvent[] = []; + + for await (const event of model._streamChatModelEvents([], { + streamUsage: true, + } as BaseChatModelCallOptions)) { + events.push(event); + } + + const types = events.map((e) => e.type); + expect(types).toContain("message-start"); + expect(types).toContain("content-block-start"); + expect(types).toContain("content-block-delta"); + expect(types).toContain("content-block-finish"); + expect(types).toContain("message-finish"); + }); + + test("message-start carries id and usage", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents([], { + streamUsage: true, + } as BaseChatModelCallOptions)) { + events.push(event); + } + + const start = events.find((e) => e.type === "message-start"); + expect(start).toBeDefined(); + expect((start as { id?: string }).id).toBe("msg_01ABC"); + expect( + (start as { usage?: { input_tokens: number } }).usage?.input_tokens + ).toBe(25); + }); + + test("text deltas accumulate correctly", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents([], { + streamUsage: true, + } as BaseChatModelCallOptions)) { + events.push(event); + } + + const deltas = events.filter( + (e) => e.type === "content-block-delta" && "index" in e && e.index === 0 + ); + expect(deltas.length).toBe(2); + + // First delta: accumulated = "Hello" + const d1 = deltas[0] as { + content: { text: string }; + }; + expect(d1.content.text).toBe("Hello"); + + // Second delta: accumulated = "Hello world" + const d2 = deltas[1] as { + content: { text: string }; + }; + expect(d2.content.text).toBe("Hello world"); + }); + + test("content-block-finish carries finalized text", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const finish = events.find( + (e) => + e.type === "content-block-finish" && "index" in e && e.index === 0 + ) as { content: { type: string; text: string } }; + expect(finish).toBeDefined(); + expect(finish.content.type).toBe("text"); + expect(finish.content.text).toBe("Hello world"); + }); + + test("message-finish carries stop reason", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const finish = events.find((e) => e.type === "message-finish") as { + reason: string; + }; + expect(finish.reason).toBe("stop"); + }); + }); + + describe("thinking + text streaming", () => { + test("reasoning block accumulates correctly", async () => { + const model = new MockStreamChatAnthropic(thinkingPlusTextEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents([], { + streamUsage: true, + } as BaseChatModelCallOptions)) { + events.push(event); + } + + // Reasoning deltas + const reasoningDeltas = events.filter( + (e) => + e.type === "content-block-delta" && + "index" in e && + e.index === 0 && + "content" in e && + (e.content as { type: string }).type === "reasoning" + ); + // 3 deltas: 2 thinking_delta + 1 signature_delta + // (all have accumulated block type "reasoning") + expect(reasoningDeltas.length).toBe(3); + + // After the 2nd delta, reasoning should be fully accumulated + const afterThinking = reasoningDeltas[1] as { + content: { reasoning: string }; + }; + expect(afterThinking.content.reasoning).toBe("Let me reason..."); + + // After the signature delta, reasoning is unchanged + const afterSig = reasoningDeltas[2] as { + content: { reasoning: string }; + }; + expect(afterSig.content.reasoning).toBe("Let me reason..."); + + // Reasoning finish + const reasoningFinish = events.find( + (e) => + e.type === "content-block-finish" && "index" in e && e.index === 0 + ) as { content: { type: string; reasoning: string } }; + expect(reasoningFinish.content.type).toBe("reasoning"); + expect(reasoningFinish.content.reasoning).toBe("Let me reason..."); + }); + + test("text block follows reasoning with correct index", async () => { + const model = new MockStreamChatAnthropic(thinkingPlusTextEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const textFinish = events.find( + (e) => + e.type === "content-block-finish" && "index" in e && e.index === 1 + ) as { content: { type: string; text: string } }; + expect(textFinish.content.type).toBe("text"); + expect(textFinish.content.text).toBe("The answer is 42."); + }); + + test("signature delta is handled as non_standard", async () => { + const model = new MockStreamChatAnthropic(thinkingPlusTextEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + // Signature delta adds a signature field to the accumulated reasoning block + const allIndex0Deltas = events.filter( + (e) => e.type === "content-block-delta" && "index" in e && e.index === 0 + ); + // The last delta at index 0 should have the signature field + const lastDelta = allIndex0Deltas[allIndex0Deltas.length - 1] as { + content: { type: string; signature?: string }; + }; + expect(lastDelta.content.type).toBe("reasoning"); + expect(lastDelta.content.signature).toBe("sig_abc"); + }); + }); + + describe("tool call streaming", () => { + test("tool call args accumulate correctly", async () => { + const model = new MockStreamChatAnthropic(toolCallEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + // Start event for tool call + const toolStart = events.find( + (e) => e.type === "content-block-start" && "index" in e && e.index === 1 + ) as { content: { type: string; name: string; id: string } }; + expect(toolStart.content.type).toBe("tool_call_chunk"); + expect(toolStart.content.name).toBe("web_search"); + expect(toolStart.content.id).toBe("toolu_01ABC"); + + // Deltas accumulate args + const toolDeltas = events.filter( + (e) => e.type === "content-block-delta" && "index" in e && e.index === 1 + ); + expect(toolDeltas.length).toBe(2); + + const lastDelta = toolDeltas[1] as { + content: { args: string }; + }; + expect(lastDelta.content.args).toBe('{"query":"weather"}'); + }); + + test("tool call finish has parsed args", async () => { + const model = new MockStreamChatAnthropic(toolCallEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const toolFinish = events.find( + (e) => + e.type === "content-block-finish" && "index" in e && e.index === 1 + ) as { + content: { + type: string; + name: string; + id: string; + args: unknown; + }; + }; + expect(toolFinish.content.type).toBe("tool_call"); + expect(toolFinish.content.name).toBe("web_search"); + expect(toolFinish.content.id).toBe("toolu_01ABC"); + expect(toolFinish.content.args).toEqual({ query: "weather" }); + }); + + test("message-finish has tool_use reason", async () => { + const model = new MockStreamChatAnthropic(toolCallEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const finish = events.find((e) => e.type === "message-finish") as { + reason: string; + }; + expect(finish.reason).toBe("tool_use"); + }); + }); + + describe("usage streaming", () => { + test("usage snapshot with cache details", async () => { + const model = new MockStreamChatAnthropic(cacheUsageEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents([], { + streamUsage: true, + } as BaseChatModelCallOptions)) { + events.push(event); + } + + // message-start should have input usage with cache details + const start = events.find((e) => e.type === "message-start") as { + usage: { + input_tokens: number; + input_token_details: { + cache_creation: number; + cache_read: number; + }; + }; + }; + // 100 + 500 + 200 = 800 + expect(start.usage.input_tokens).toBe(800); + expect(start.usage.input_token_details.cache_creation).toBe(500); + expect(start.usage.input_token_details.cache_read).toBe(200); + }); + + test("usage event emitted on message_delta", async () => { + const model = new MockStreamChatAnthropic(cacheUsageEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents([], { + streamUsage: true, + } as BaseChatModelCallOptions)) { + events.push(event); + } + + const usageEvents = events.filter((e) => e.type === "usage"); + expect(usageEvents.length).toBeGreaterThanOrEqual(1); + + // Last usage should include output tokens + const lastUsage = usageEvents[usageEvents.length - 1] as { + usage: { output_tokens: number }; + }; + expect(lastUsage.usage.output_tokens).toBe(3); + }); + + test("message-finish carries final usage", async () => { + const model = new MockStreamChatAnthropic(cacheUsageEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents([], { + streamUsage: true, + } as BaseChatModelCallOptions)) { + events.push(event); + } + + const finish = events.find((e) => e.type === "message-finish") as { + usage: { input_tokens: number; output_tokens: number }; + }; + expect(finish.usage.input_tokens).toBe(800); + expect(finish.usage.output_tokens).toBe(3); + }); + + test("no usage events when streamUsage is false", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + // Override streamUsage on the model + model.streamUsage = false; + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents([], { + streamUsage: false, + } as BaseChatModelCallOptions)) { + events.push(event); + } + + const usageEvents = events.filter((e) => e.type === "usage"); + expect(usageEvents.length).toBe(0); + + // message-start and message-finish should not have usage + const start = events.find((e) => e.type === "message-start") as { + usage?: unknown; + }; + expect(start.usage).toBeUndefined(); + }); + }); + + describe("provider passthrough", () => { + test("message_start metadata is forwarded as provider event", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const providerEvents = events.filter((e) => e.type === "provider"); + const metaEvent = providerEvents.find( + (e) => (e as { name: string }).name === "message_start" + ) as { provider: string; payload: { model: string; id: string } }; + expect(metaEvent).toBeDefined(); + expect(metaEvent.provider).toBe("anthropic"); + expect(metaEvent.payload.model).toBe("claude-sonnet-4-20250514"); + expect(metaEvent.payload.id).toBe("msg_01ABC"); + }); + + test("unknown events are forwarded as provider events", async () => { + const eventsWithPing = [ + ...textOnlyEvents().slice(0, -1), // everything except message_stop + { type: "ping" as const }, + textOnlyEvents().slice(-1)[0], // message_stop + ]; + const model = new MockStreamChatAnthropic(eventsWithPing); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const pingEvent = events.find( + (e) => e.type === "provider" && (e as { name: string }).name === "ping" + ); + expect(pingEvent).toBeDefined(); + }); + }); + + describe("integration with ChatModelStream", () => { + test("text sub-stream works end-to-end", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + const stream = model.streamV2([]); + const text = await stream.text; + expect(text).toBe("Hello world"); + }); + + test("toolCalls sub-stream works end-to-end", async () => { + const model = new MockStreamChatAnthropic(toolCallEvents()); + const stream = model.streamV2([]); + const calls = await stream.toolCalls; + expect(calls.length).toBe(1); + expect(calls[0]!.name).toBe("web_search"); + expect(calls[0]!.args).toEqual({ query: "weather" }); + }); + + test("reasoning sub-stream works end-to-end", async () => { + const model = new MockStreamChatAnthropic(thinkingPlusTextEvents()); + const stream = model.streamV2([]); + const reasoning = await stream.reasoning; + expect(reasoning).toBe("Let me reason..."); + }); + + test("output assembles correct AIMessage", async () => { + const model = new MockStreamChatAnthropic(toolCallEvents()); + const stream = model.streamV2([]); + const message = await stream.output; + + expect(message.id).toBe("msg_03GHI"); + expect(message._getType()).toBe("ai"); + + const content = message.content as Array<{ + type: string; + text?: string; + name?: string; + args?: unknown; + }>; + + // Text block + tool call block + expect(content.length).toBe(2); + expect(content[0]!.type).toBe("text"); + expect(content[0]!.text).toBe("Let me search."); + expect(content[1]!.type).toBe("tool_call"); + expect(content[1]!.name).toBe("web_search"); + expect(content[1]!.args).toEqual({ query: "weather" }); + + // Tool calls array + expect(message.tool_calls?.length).toBe(1); + expect(message.tool_calls?.[0]?.name).toBe("web_search"); + }); + + test("usage sub-stream works end-to-end", async () => { + const model = new MockStreamChatAnthropic(cacheUsageEvents()); + const stream = model.streamV2([]); + const usage = await stream.usage; + expect(usage.input_tokens).toBe(800); + expect(usage.output_tokens).toBe(3); + }); + + test("await stream returns AIMessage directly", async () => { + const model = new MockStreamChatAnthropic(textOnlyEvents()); + const message = await model.streamV2([]); + expect(message._getType()).toBe("ai"); + expect(message.id).toBe("msg_01ABC"); + }); + + test("sequential sub-stream consumption", async () => { + const model = new MockStreamChatAnthropic(toolCallEvents()); + const stream = model.streamV2([]); + + // Sequential consumption works reliably. + // Parallel consumption with Promise.all has a known microtask + // scheduling edge case with synchronous async generators that + // will be addressed separately. + const text = await stream.text; + expect(text).toBe("Let me search."); + + const tools = await stream.toolCalls; + expect(tools.length).toBe(1); + expect(tools[0]!.name).toBe("web_search"); + }); + + test("parallel sub-stream consumption from events", async () => { + const model = new MockStreamChatAnthropic(toolCallEvents()); + + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + async function* replay() { + for (const e of events) yield e; + } + const stream = new ChatModelStream(replay()); + + const [text, tools] = await Promise.all([stream.text, stream.toolCalls]); + + expect(text).toBe("Let me search."); + expect(tools.length).toBe(1); + expect(tools[0]!.name).toBe("web_search"); + }); + }); +}); diff --git a/libs/providers/langchain-anthropic/src/utils/stream_events.ts b/libs/providers/langchain-anthropic/src/utils/stream_events.ts new file mode 100644 index 000000000000..58fbb5abfd81 --- /dev/null +++ b/libs/providers/langchain-anthropic/src/utils/stream_events.ts @@ -0,0 +1,437 @@ +/** + * Converts a raw Anthropic SSE event stream into LangChain ChatModelStreamEvents. + * + * This is a pure converter: it takes an async iterable of native Anthropic + * `RawMessageStreamEvent`s and yields `ChatModelStreamEvent`s. It handles: + * + * - Message lifecycle (`message_start` → `message-start`, `message_stop` → `message-finish`) + * - Content block lifecycle with fully-qualified accumulated snapshots + * - Tool call arg accumulation and JSON parsing on finalization + * - Usage snapshots (input tokens on start, output tokens on delta) + * - Provider passthrough for unrecognized events + * + * @module + */ + +import type Anthropic from "@anthropic-ai/sdk"; +import type { + ChatModelStreamEvent, + FinishReason, +} from "@langchain/core/language_models/event"; +import type { ContentBlock } from "@langchain/core/messages/content"; +import type { UsageMetadata } from "@langchain/core/messages/metadata"; +import type { AnthropicMessageStreamEvent } from "../types.js"; + +export interface ConvertAnthropicStreamOptions { + /** + * Whether to emit usage events. + * @default true + */ + streamUsage?: boolean; +} + +/** + * Convert an async iterable of raw Anthropic stream events into + * LangChain `ChatModelStreamEvent`s. + * + * @example + * ```ts + * const anthropicStream = await client.messages.create({ ..., stream: true }); + * for await (const event of convertAnthropicStream(anthropicStream)) { + * // event is a ChatModelStreamEvent + * } + * ``` + */ +export async function* convertAnthropicStream( + source: AsyncIterable, + options: ConvertAnthropicStreamOptions = {} +): AsyncGenerator { + const shouldStreamUsage = options.streamUsage ?? true; + + // Track accumulated state per content block + const blockAccumulators = new Map< + number, + { + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + accumulated: Record; + type: string; + } + >(); + let usageSnapshot: UsageMetadata | undefined; + let stopReason: string | null = null; + + for await (const data of source) { + switch (data.type) { + case "message_start": { + const { usage, id, model } = data.message; + if (usage && shouldStreamUsage) { + usageSnapshot = buildUsageSnapshot(usage); + } + yield { + type: "message-start" as const, + id, + ...(usageSnapshot ? { usage: usageSnapshot } : {}), + }; + // Emit response metadata as provider event + yield { + type: "provider" as const, + provider: "anthropic", + name: "message_start", + payload: { model, id }, + }; + break; + } + + case "message_delta": { + stopReason = data.delta.stop_reason; + if (shouldStreamUsage && data.usage) { + if (!usageSnapshot) { + usageSnapshot = { + input_tokens: 0, + output_tokens: data.usage.output_tokens, + total_tokens: data.usage.output_tokens, + }; + } else { + usageSnapshot = { + ...usageSnapshot, + output_tokens: + usageSnapshot.output_tokens + data.usage.output_tokens, + total_tokens: + usageSnapshot.input_tokens + + usageSnapshot.output_tokens + + data.usage.output_tokens, + }; + } + yield { type: "usage" as const, usage: usageSnapshot }; + } + // Forward context_management as provider event + if ( + "context_management" in data.delta && + data.delta.context_management + ) { + yield { + type: "provider" as const, + provider: "anthropic", + name: "context_management", + payload: data.delta.context_management, + }; + } + break; + } + + case "message_stop": { + yield { + type: "message-finish" as const, + reason: mapStopReason(stopReason), + ...(usageSnapshot ? { usage: usageSnapshot } : {}), + responseMetadata: { model_provider: "anthropic" }, + }; + break; + } + + // ── Content block lifecycle ─────────────────────────── + case "content_block_start": { + const { index, content_block } = data; + const mapped = mapBlockToContentBlock(content_block, index); + blockAccumulators.set(index, { + accumulated: { ...mapped }, + type: mapped.type, + }); + yield { + type: "content-block-start" as const, + index, + content: mapped, + }; + break; + } + + case "content_block_delta": { + const { index, delta } = data; + const acc = blockAccumulators.get(index); + if (!acc) break; + + const { accumulated } = applyDelta(acc.accumulated, delta, index); + acc.accumulated = accumulated; + + yield { + type: "content-block-delta" as const, + index, + content: accumulated, + }; + break; + } + + case "content_block_stop": { + const { index } = data; + const acc = blockAccumulators.get(index); + if (!acc) break; + + const finalized = finalizeBlock(acc.accumulated); + yield { + type: "content-block-finish" as const, + index, + content: finalized, + }; + blockAccumulators.delete(index); + break; + } + + // ── Unhandled events → provider passthrough ─────────── + default: { + yield { + type: "provider" as const, + provider: "anthropic", + name: data.type, + payload: data, + }; + break; + } + } + } +} + +// ─── Internal helpers ─────────────────────────────────────────── + +/** + * Map Anthropic's stop_reason to the standard FinishReason. + */ +function mapStopReason(stopReason: string | null | undefined): FinishReason { + switch (stopReason) { + case "end_turn": + case "stop_sequence": + return "stop"; + case "tool_use": + return "tool_use"; + case "max_tokens": + return "length"; + default: + return "stop"; + } +} + +/** + * Build a usage snapshot from Anthropic's usage object. + * Handles cache token details. + */ +function buildUsageSnapshot( + usage: Anthropic.Messages.Usage | Record +): UsageMetadata { + const cacheCreation = + (usage as Record).cache_creation_input_tokens ?? 0; + const cacheRead = + (usage as Record).cache_read_input_tokens ?? 0; + const totalInput = usage.input_tokens + cacheCreation + cacheRead; + return { + input_tokens: totalInput, + output_tokens: usage.output_tokens, + total_tokens: totalInput + usage.output_tokens, + input_token_details: { + cache_creation: cacheCreation, + cache_read: cacheRead, + }, + }; +} + +/** + * Map an Anthropic content block (from content_block_start) to a + * LangChain ContentBlock. + */ +function mapBlockToContentBlock( + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + block: any, + index: number + // oxlint-disable-next-line @typescript-eslint/no-explicit-any +): Record { + switch (block.type) { + case "text": + return { + type: "text" as const, + text: block.text ?? "", + index, + }; + case "thinking": + return { + type: "reasoning" as const, + reasoning: block.thinking ?? "", + index, + }; + case "redacted_thinking": + return { + type: "non_standard" as const, + value: { ...block }, + index, + }; + case "tool_use": + return { + type: "tool_call_chunk" as const, + id: block.id, + name: block.name, + args: "", + index, + }; + case "server_tool_use": + return { + type: "server_tool_call_chunk" as const, + id: block.id, + name: block.name, + args: "", + index, + }; + default: + // document, web_search_tool_result, compaction, etc. + return { + type: "non_standard" as const, + value: { ...block }, + index, + }; + } +} + +/** + * Apply an Anthropic content_block_delta to the accumulated content block. + * Returns both the incremental delta (as a ContentBlock) and the new + * accumulated state. + */ +function applyDelta( + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + accumulated: Record, + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + delta: any, + index: number + // oxlint-disable-next-line @typescript-eslint/no-explicit-any +): { deltaBlock: Record; accumulated: Record } { + switch (delta.type) { + case "text_delta": + return { + deltaBlock: { type: "text" as const, text: delta.text, index }, + accumulated: { + ...accumulated, + text: (accumulated.text ?? "") + delta.text, + }, + }; + + case "thinking_delta": + return { + deltaBlock: { + type: "reasoning" as const, + reasoning: delta.thinking, + index, + }, + accumulated: { + ...accumulated, + reasoning: (accumulated.reasoning ?? "") + delta.thinking, + }, + }; + + case "input_json_delta": + return { + deltaBlock: { + type: accumulated.type, + args: delta.partial_json, + index, + }, + accumulated: { + ...accumulated, + args: (accumulated.args ?? "") + delta.partial_json, + }, + }; + + case "citations_delta": { + const newCitation = delta.citation; + const existingAnnotations = accumulated.annotations ?? []; + return { + deltaBlock: { + type: "text" as const, + text: "", + annotations: [newCitation], + index, + }, + accumulated: { + ...accumulated, + annotations: [...existingAnnotations, newCitation], + }, + }; + } + + case "signature_delta": + return { + deltaBlock: { + type: "non_standard" as const, + value: { signature: delta.signature }, + index, + }, + accumulated: { + ...accumulated, + signature: delta.signature, + }, + }; + + case "compaction_delta": + return { + deltaBlock: { + type: "non_standard" as const, + value: { compaction: delta }, + index, + }, + accumulated: { + ...accumulated, + value: { + ...(accumulated.value ?? {}), + compaction: delta, + }, + }, + }; + + default: + return { + deltaBlock: { + type: "non_standard" as const, + value: delta, + index, + }, + accumulated, + }; + } +} + +/** + * Finalize an accumulated content block for the content-block-finish event. + * For tool calls, parse the accumulated JSON args string. + */ +function finalizeBlock( + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + accumulated: Record +): ContentBlock.Standard { + if ( + accumulated.type === "tool_call_chunk" || + accumulated.type === "server_tool_call_chunk" + ) { + const finalType = + accumulated.type === "tool_call_chunk" + ? ("tool_call" as const) + : ("server_tool_call" as const); + let parsedArgs: unknown; + try { + parsedArgs = JSON.parse(accumulated.args || "{}"); + } catch { + return { + type: "invalid_tool_call" as const, + id: accumulated.id, + name: accumulated.name, + args: accumulated.args, + error: "Failed to parse tool call arguments as JSON", + } as ContentBlock.Tools.InvalidToolCall; + } + return { + type: finalType, + id: accumulated.id, + name: accumulated.name, + args: parsedArgs, + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + } as any; + } + + // Text and reasoning blocks: strip the index for the finalized form + const { index: _index, ...rest } = accumulated; + return rest as ContentBlock.Standard; +} From 32ef493d25719551d56c1e3305603878e6435d83 Mon Sep 17 00:00:00 2001 From: Hunter Lovell Date: Sun, 12 Apr 2026 23:43:15 -0700 Subject: [PATCH 02/39] refactor: typed content block deltas (text-delta, reasoning-delta, tool-call-delta, block-delta) - Replace generic DeepPartialContentBlock on delta events with a discriminated union of typed deltas - text-delta/reasoning-delta: append semantics - tool-call-delta: append args, set id/name - block-delta: overwrite semantics for catch-all - Remove accumulated content from delta events (sub-streams now read directly from typed deltas) - Rename chatModelStream() -> streamV2() - Extract bridge logic into compat.ts - Remove createChatModelStream factory (use new ChatModelStream) - Remove type guard functions from event.ts --- .../src/language_models/compat.ts | 219 +++++++++--------- .../src/language_models/event.ts | 197 ++++++++-------- .../src/language_models/stream.ts | 209 +++++++---------- .../src/language_models/tests/event.test.ts | 85 ++++--- .../src/language_models/tests/stream.test.ts | 29 +-- .../tests/stream_bridge.test.ts | 19 +- .../tests/chat_models_stream_events.test.ts | 67 +++--- .../src/utils/stream_events.ts | 168 ++++---------- 8 files changed, 449 insertions(+), 544 deletions(-) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 367e38a5ccc8..97545eda2d91 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -3,38 +3,25 @@ * (`ChatGenerationChunk` / `AIMessageChunk`) output to the new * `ChatModelStreamEvent` protocol. * - * This module is used by `BaseChatModel._streamChatModelEvents` as - * the default implementation when a provider has not yet implemented - * native event streaming. - * * @module */ -import { AIMessageChunk } from "../messages/ai.js"; +import { isAIMessageChunk } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { ChatGenerationChunk } from "../outputs.js"; -import type { ChatModelStreamEvent } from "./event.js"; +import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; /** * Convert an async iterable of legacy `ChatGenerationChunk`s into - * `ChatModelStreamEvent`s. - * - * Tracks content blocks by index, synthesizes start/delta/finish events, - * and emits usage updates. Handles both string content and array content - * blocks, as well as tool call chunks. - * - * @param chunks - The legacy chunk stream from `_streamResponseChunks`. - * @param options - Optional signal for abort handling. - * @returns An async generator of {@link ChatModelStreamEvent}. + * `ChatModelStreamEvent`s with typed deltas. */ export async function* convertChunksToEvents( chunks: AsyncIterable, options?: { signal?: AbortSignal } ): AsyncGenerator { - // Track active content blocks for the bridge const activeBlocks = new Map< number, - { started: boolean; accumulated: ContentBlock } + { type: string; accumulated: ContentBlock } >(); let messageStarted = false; let lastUsage: @@ -46,7 +33,7 @@ export async function* convertChunksToEvents( const msg = chunk.message; - // Emit message-start on the first chunk + // Message start let usageHandledInStart = false; if (!messageStarted) { messageStarted = true; @@ -54,8 +41,7 @@ export async function* convertChunksToEvents( type: "message-start" as const, id: msg.id ?? undefined, }; - // If first chunk has usage (e.g., Anthropic input tokens) - if (AIMessageChunk.isInstance(msg) && msg.usage_metadata) { + if (isAIMessageChunk(msg) && msg.usage_metadata) { (startEvent as { usage?: unknown }).usage = msg.usage_metadata; lastUsage = { ...msg.usage_metadata }; usageHandledInStart = true; @@ -63,17 +49,15 @@ export async function* convertChunksToEvents( yield startEvent; } - // Process content from the chunk + // Process content const content = msg.content; if (typeof content === "string") { if (content !== "") { - // Simple string content → single text block at index 0 const blockIndex = 0; - if (!activeBlocks.has(blockIndex)) { const initial: ContentBlock.Text = { type: "text", text: "" }; activeBlocks.set(blockIndex, { - started: true, + type: "text", accumulated: initial, }); yield { @@ -82,19 +66,15 @@ export async function* convertChunksToEvents( content: initial, }; } - const block = activeBlocks.get(blockIndex)!; - const prevText = (block.accumulated as ContentBlock.Text).text; - const accumulated: ContentBlock.Text = { - type: "text", - text: prevText + content, + block.accumulated = { + ...block.accumulated, + text: ((block.accumulated as { text?: string }).text ?? "") + content, }; - block.accumulated = accumulated; - yield { type: "content-block-delta" as const, index: blockIndex, - content: accumulated, + delta: { type: "text-delta" as const, text: content }, }; } } else if (Array.isArray(content)) { @@ -104,7 +84,7 @@ export async function* convertChunksToEvents( if (!activeBlocks.has(blockIndex)) { activeBlocks.set(blockIndex, { - started: true, + type: part.type, accumulated: { ...part }, }); yield { @@ -113,23 +93,21 @@ export async function* convertChunksToEvents( content: { ...part }, }; } else { - // Accumulate into existing block const block = activeBlocks.get(blockIndex)!; - const accumulated = accumulateContentBlock(block.accumulated, part); - block.accumulated = accumulated; - + const delta = contentBlockToDelta(part); + block.accumulated = applyDeltaToBlock(block.accumulated, delta); yield { type: "content-block-delta" as const, index: blockIndex, - content: accumulated, + delta, }; } } } - // Handle tool call chunks from the legacy path + // Tool call chunks if ( - AIMessageChunk.isInstance(msg) && + isAIMessageChunk(msg) && msg.tool_call_chunks && msg.tool_call_chunks.length > 0 ) { @@ -139,44 +117,43 @@ export async function* convertChunksToEvents( ? toolChunk.index : activeBlocks.size; - const delta: ContentBlock = { - type: "tool_call_chunk" as const, - id: toolChunk.id, - name: toolChunk.name, - args: toolChunk.args, - index: blockIndex, - }; - if (!activeBlocks.has(blockIndex)) { + const initial: ContentBlock = { + type: "tool_call_chunk" as const, + id: toolChunk.id, + name: toolChunk.name, + args: "", + index: blockIndex, + }; activeBlocks.set(blockIndex, { - started: true, - accumulated: { ...delta }, + type: "tool_call_chunk", + accumulated: initial, }); yield { type: "content-block-start" as const, index: blockIndex, - content: { ...delta }, - }; - } else { - const block = activeBlocks.get(blockIndex)!; - const accumulated = accumulateContentBlock(block.accumulated, delta); - block.accumulated = accumulated; - - yield { - type: "content-block-delta" as const, - index: blockIndex, - content: accumulated, + content: initial, }; } + + const toolDelta = { + type: "tool-call-delta" as const, + id: toolChunk.id, + name: toolChunk.name, + args: toolChunk.args, + }; + const block = activeBlocks.get(blockIndex)!; + block.accumulated = applyDeltaToBlock(block.accumulated, toolDelta); + yield { + type: "content-block-delta" as const, + index: blockIndex, + delta: toolDelta, + }; } } - // Accumulate usage (legacy chunks use additive usage, not snapshots) - if ( - !usageHandledInStart && - AIMessageChunk.isInstance(msg) && - msg.usage_metadata - ) { + // Usage + if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) { const chunkUsage = msg.usage_metadata; if (!lastUsage) { lastUsage = { ...chunkUsage }; @@ -191,7 +168,7 @@ export async function* convertChunksToEvents( } } - // Emit content-block-finish for all active blocks + // Finish all blocks for (const [index, block] of activeBlocks) { const finalized = finalizeContentBlock(block.accumulated); yield { @@ -201,7 +178,6 @@ export async function* convertChunksToEvents( }; } - // Emit message-finish yield { type: "message-finish" as const, reason: "stop" as const, @@ -210,58 +186,76 @@ export async function* convertChunksToEvents( } /** - * Accumulate a content block delta into the running snapshot. + * Apply a typed delta to an accumulated content block. + * @internal */ -export function accumulateContentBlock( - accumulated: ContentBlock, - delta: ContentBlock +function applyDeltaToBlock( + block: ContentBlock, + delta: ContentBlockDelta ): ContentBlock { - if (accumulated.type === "text" && delta.type === "text") { - return { - ...accumulated, - type: "text" as const, - text: - (accumulated as ContentBlock.Text).text + - ((delta as ContentBlock.Text).text ?? ""), - } as ContentBlock.Text; - } - - if (accumulated.type === "reasoning" && delta.type === "reasoning") { - return { - ...accumulated, - type: "reasoning" as const, - reasoning: - (accumulated as ContentBlock.Reasoning).reasoning + - ((delta as ContentBlock.Reasoning).reasoning ?? ""), - } as ContentBlock.Reasoning; + switch (delta.type) { + case "text-delta": + return { + ...block, + text: ((block as { text?: string }).text ?? "") + delta.text, + }; + case "reasoning-delta": + return { + ...block, + reasoning: + ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, + }; + case "tool-call-delta": + return { + ...block, + ...(delta.id != null ? { id: delta.id } : {}), + ...(delta.name != null ? { name: delta.name } : {}), + args: ((block as { args?: string }).args ?? "") + (delta.args ?? ""), + }; + case "block-delta": + return { ...block, ...delta.content }; + default: + return block; } +} - if ( - (accumulated.type === "tool_call_chunk" || - accumulated.type === "tool_call") && - (delta.type === "tool_call_chunk" || delta.type === "tool_call") - ) { - const accTC = accumulated as ContentBlock.Tools.ToolCallChunk; - const deltaTC = delta as ContentBlock.Tools.ToolCallChunk; - return { - ...accumulated, - type: "tool_call_chunk" as const, - id: accTC.id ?? deltaTC.id, - name: accTC.name ?? deltaTC.name, - args: (accTC.args ?? "") + (deltaTC.args ?? ""), - index: accTC.index ?? deltaTC.index, - } as ContentBlock.Tools.ToolCallChunk; +/** + * Convert a legacy content block part to a typed delta. + * @internal + */ +function contentBlockToDelta(part: ContentBlock): ContentBlockDelta { + switch (part.type) { + case "text": + return { + type: "text-delta" as const, + text: (part as ContentBlock.Text).text ?? "", + }; + case "reasoning": + return { + type: "reasoning-delta" as const, + reasoning: (part as ContentBlock.Reasoning).reasoning ?? "", + }; + case "tool_call_chunk": + case "tool_call": { + const tc = part as ContentBlock.Tools.ToolCallChunk; + return { + type: "tool-call-delta" as const, + id: tc.id, + name: tc.name, + args: tc.args, + }; + } + default: + return { + type: "block-delta" as const, + content: part, + }; } - - // For block types we don't know how to merge, just spread the delta over - return { ...accumulated, ...delta }; } /** * Finalize a content block for the finish event. - * - * For tool calls, attempts to parse the accumulated args JSON string - * into an object, upgrading from `tool_call_chunk` to `tool_call`. + * For tool calls, parse the accumulated JSON args string. */ export function finalizeContentBlock(block: ContentBlock): ContentBlock { if (block.type === "tool_call_chunk") { @@ -270,7 +264,6 @@ export function finalizeContentBlock(block: ContentBlock): ContentBlock { try { parsedArgs = JSON.parse(chunk.args ?? "{}"); } catch { - // If JSON parsing fails, return as invalid tool call return { type: "invalid_tool_call" as const, id: chunk.id, diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts index 5f7e61fee432..3b673ed49be0 100644 --- a/libs/langchain-core/src/language_models/event.ts +++ b/libs/langchain-core/src/language_models/event.ts @@ -2,54 +2,108 @@ * Chat model streaming event protocol. * * Defines a content-block-centric event model for streaming chat model responses. - * Events carry LangChain {@link ContentBlock} types directly as accumulated - * snapshots. + * Events carry LangChain {@link ContentBlock} types on lifecycle boundaries + * (start/finish) and typed incremental deltas during streaming. * * ## Design Principles * - * 1. **Content blocks are the universal carrier.** Events carry {@link ContentBlock} - * instances directly — the block's `type` field is the discriminant. New content - * block types automatically work without protocol changes. + * 1. **Typed deltas for common cases.** Text, reasoning, and tool call argument + * streaming get purpose-built delta types with explicit append semantics. + * Everything else uses `block-delta` with overwrite semantics. * * 2. **Lifecycle completeness.** Every streamable entity has explicit start and finish * events. Consumers never need to infer boundaries from absence of events. * - * 3. **Accumulated snapshots.** Each {@link ContentBlockDeltaEvent} carries the - * accumulated state of the content block so far. Aggregation logic lives in the - * provider adapter, not the consumer. Consumers who need incremental deltas - * track previous state and diff. - * - * 4. **Interleaving allowed.** Content blocks may interleave (e.g., parallel tool calls). + * 3. **Interleaving allowed.** Content blocks may interleave (e.g., parallel tool calls). * The only invariant: a block's start precedes its deltas, and its deltas precede * its finish. No ordering constraint between different blocks. * - * 5. **Provider passthrough.** Native provider events that don't map to standard types + * 4. **Provider passthrough.** Native provider events that don't map to standard types * are forwarded as {@link ProviderEvent} rather than silently dropped. * * ## Lifecycle Contract * * ``` * MessageStart - * -> ContentBlockStart(index=0, ...) - * -> ContentBlockStart(index=1, ...) // can start before 0 finishes - * -> ContentBlockDelta(index=0, ...) - * -> ContentBlockDelta(index=1, ...) // interleaved - * -> ContentBlockFinish(index=0, ...) // blocks finish independently - * -> ContentBlockDelta(index=1, ...) - * -> ContentBlockFinish(index=1, ...) - * -> UsageUpdate(...) // may appear at any point + * -> ContentBlockStart(index=0, content=...) + * -> ContentBlockDelta(index=0, delta={ type: "text-delta", text: "Hello" }) + * -> ContentBlockDelta(index=0, delta={ type: "text-delta", text: " world" }) + * -> ContentBlockFinish(index=0, content=...) + * -> UsageUpdate(...) * -> MessageFinish(reason, usage?) * ``` * * @module */ -import type { - ContentBlock, - PartialContentBlock, -} from "../messages/content/index.js"; +import type { ContentBlock } from "../messages/content/index.js"; +import type { PartialContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; +// ─── Content Block Deltas ─────────────────────────────────────── + +/** + * Incremental text content. **Append** `text` to the block's `text` field. + */ +export interface TextDelta { + type: "text-delta"; + /** The new text to append. */ + text: string; +} + +/** + * Incremental reasoning content. **Append** `reasoning` to the block's `reasoning` field. + */ +export interface ReasoningDelta { + type: "reasoning-delta"; + /** The new reasoning text to append. */ + reasoning: string; +} + +/** + * Incremental tool call data. **Append** `args` to the block's `args` field. + * `id` and `name` are set (not appended) if present. + */ +export interface ToolCallDelta { + type: "tool-call-delta"; + /** Tool call identifier. Set on first delta, not appended. */ + id?: string; + /** Tool name. Set on first delta, not appended. */ + name?: string; + /** Partial JSON arguments string to append. */ + args?: string; +} + +/** + * Catch-all delta for content block types without a dedicated delta type. + * **Overwrite** fields from `content` onto the accumulated block. + * + * Used for provider-specific block types like code interpreter output, + * signatures, citations, compaction, etc. + */ +export interface BlockDelta { + type: "block-delta"; + /** Partial content block whose fields overwrite the accumulated block. */ + content: PartialContentBlock; +} + +/** + * Union of all content block delta types. + * + * Accumulation rules: + * - `text-delta` → **append** `text` to block's text field + * - `reasoning-delta` → **append** `reasoning` to block's reasoning field + * - `tool-call-delta` → **append** `args`, **set** id/name if present + * - `block-delta` → **overwrite** fields from content onto block + */ +export type ContentBlockDelta = + | TextDelta + | ReasoningDelta + | ToolCallDelta + | BlockDelta; + +// ─── Message Lifecycle ────────────────────────────────────────── + /** * Emitted once at the start of a model response. */ @@ -87,22 +141,15 @@ export interface MessageFinishEvent { responseMetadata?: Record; } +// ─── Content Block Lifecycle ──────────────────────────────────── + /** * Emitted when a new content block begins streaming. * * @example * ```ts - * // Text block starting * { type: "content-block-start", index: 0, * content: { type: "text", text: "" } } - * - * // Tool call starting - * { type: "content-block-start", index: 1, - * content: { type: "tool_call", id: "call_1", name: "search", args: "" } } - * - * // Reasoning starting - * { type: "content-block-start", index: 2, - * content: { type: "reasoning", reasoning: "" } } * ``` */ export interface ContentBlockStartEvent { @@ -116,56 +163,39 @@ export interface ContentBlockStartEvent { /** * Emitted for each incremental update within a content block. * - * Carries the **accumulated state** of the content block so far. - * The content is deeply partial — not all fields may be populated during - * streaming (e.g., a tool call may have `name` but `args` is still being - * streamed as a partial JSON string). - * - * Consumers who need incremental deltas (e.g., new tokens only) should - * track the previous state and diff against the new accumulated state. - * - * Aggregation into `AIMessage` is trivial: - * `message.content[event.index] = event.content` + * The `delta` field carries a typed incremental update. Consumers + * switch on `delta.type` to determine how to apply it. * * @example * ```ts - * // First text delta — accumulated so far + * // Text token * { type: "content-block-delta", index: 0, - * content: { type: "text", text: "Hello" } } + * delta: { type: "text-delta", text: " world" } } * - * // Second text delta — accumulated so far - * { type: "content-block-delta", index: 0, - * content: { type: "text", text: "Hello world" } } - * - * // Tool call args — accumulated so far + * // Tool call args chunk * { type: "content-block-delta", index: 1, - * content: { type: "tool_call", id: "call_1", name: "search", args: '{"q":"wea' } } + * delta: { type: "tool-call-delta", args: '{"q":"wea' } } + * + * // Provider-specific field (e.g., signature) + * { type: "content-block-delta", index: 0, + * delta: { type: "block-delta", content: { type: "reasoning", signature: "sig_abc" } } } * ``` */ export interface ContentBlockDeltaEvent { type: "content-block-delta"; /** Positional index of the block being updated. */ index: number; - /** Accumulated state of the content block after this update. Deeply partial. */ - content: PartialContentBlock; + /** Typed incremental delta. */ + delta: ContentBlockDelta; } /** * Emitted when a content block is complete. * - * The `content` carries the **finalized** block. For tool calls, this means - * args have been parsed from a JSON string into an object. - * * @example * ```ts - * // Finalized text block * { type: "content-block-finish", index: 0, - * content: { type: "text", text: "The weather is sunny." } } - * - * // Finalized tool call (args parsed) - * { type: "content-block-finish", index: 1, - * content: { type: "tool_call", id: "call_1", name: "search", - * args: { q: "weather" } } } + * content: { type: "text", text: "Hello world" } } * ``` */ export interface ContentBlockFinishEvent { @@ -176,21 +206,11 @@ export interface ContentBlockFinishEvent { content: ContentBlock; } +// ─── Usage ────────────────────────────────────────────────────── + /** * Emitted whenever the provider reports updated usage information. - * - * May appear at any point during streaming. Each event carries a - * **running snapshot** of usage (not an additive delta), so consumers - * can simply take the latest value. - * - * @example - * ```ts - * // After message_start (Anthropic: input tokens known) - * { type: "usage", usage: { input_tokens: 1234, output_tokens: 0, total_tokens: 1234 } } - * - * // After streaming completes - * { type: "usage", usage: { input_tokens: 1234, output_tokens: 567, total_tokens: 1801 } } - * ``` + * Each event carries a **running snapshot** (not an additive delta). */ export interface UsageUpdateEvent { type: "usage"; @@ -198,25 +218,10 @@ export interface UsageUpdateEvent { usage: UsageMetadata; } +// ─── Provider Passthrough ─────────────────────────────────────── + /** * Passthrough for native provider events that don't map to standard types. - * - * Provider adapters map recognized events to standard {@link ChatModelStreamEvent} - * types and forward everything else as `ProviderEvent`. This ensures no information - * is silently dropped. - * - * @example - * ```ts - * // OpenAI server-side web search in progress - * { type: "provider", provider: "openai", - * name: "response.web_search_call.searching", - * payload: { item_id: "ws_123", output_index: 0 } } - * - * // Anthropic context management signal - * { type: "provider", provider: "anthropic", - * name: "context_management", - * payload: { ... } } - * ``` */ export interface ProviderEvent { type: "provider"; @@ -228,6 +233,8 @@ export interface ProviderEvent { payload: unknown; } +// ─── Error ────────────────────────────────────────────────────── + /** * Emitted on unrecoverable stream errors. */ @@ -239,10 +246,10 @@ export interface StreamErrorEvent { code?: string; } +// ─── Union ────────────────────────────────────────────────────── + /** * Union of all chat model stream event types. - * - * This is the type yielded by `ChatModelStream[Symbol.asyncIterator]()`. */ export type ChatModelStreamEvent = | MessageStartEvent diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 4cda6063e09a..c03b6564ae28 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -1,21 +1,13 @@ /** * Typed stream classes for chat model streaming. * - * Provides {@link ChatModelStream} and typed sub-stream accessors that - * implement both `AsyncIterable` (for incremental consumption) and - * `PromiseLike` (for simple `await`). - * * @module */ import { AIMessage } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; -import type { - ChatModelStreamEvent, - ContentBlockDeltaEvent, - ContentBlockFinishEvent, -} from "./event.js"; +import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; // ─── Replay Buffer ────────────────────────────────────────────── @@ -35,7 +27,6 @@ class ReplayBuffer { push(event: ChatModelStreamEvent): void { this.events.push(event); - // Wake ALL waiting consumers — each reads from their own cursor const toWake = this.waiters.splice(0); for (const waiter of toWake) { waiter(); @@ -59,19 +50,13 @@ class ReplayBuffer { } } - /** - * Create an async iterator that replays cached events from the - * beginning, then follows live events as they arrive. - */ async *iterate(): AsyncGenerator { - // Fast path: stream already done, replay everything if (this.finished) { if (this.error) throw this.error; yield* this.events; return; } - // Live path: follow events as they arrive let cursor = 0; while (true) { while (cursor < this.events.length) { @@ -82,7 +67,6 @@ class ReplayBuffer { if (this.error) throw this.error; return; } - // Wait for new data await new Promise((resolve) => { if (cursor < this.events.length || this.finished) { resolve(); @@ -94,47 +78,46 @@ class ReplayBuffer { } } -// ─── Helpers ──────────────────────────────────────────────────── - -/** Extract a string field from a loosely-typed content block. */ -function getStringField( - // oxlint-disable-next-line @typescript-eslint/no-explicit-any - obj: Record, - field: string -): string { - const val = obj[field]; - return typeof val === "string" ? val : ""; -} - -/** Check if a delta event carries a text content block. */ -function isTextDelta( - event: ChatModelStreamEvent -): event is ContentBlockDeltaEvent & { - content: { type: "text"; text?: string }; -} { - return event.type === "content-block-delta" && event.content.type === "text"; -} - -/** Check if a delta event carries a reasoning content block. */ -function isReasoningDelta( - event: ChatModelStreamEvent -): event is ContentBlockDeltaEvent & { - content: { type: "reasoning"; reasoning?: string }; -} { - return ( - event.type === "content-block-delta" && event.content.type === "reasoning" - ); -} +// ─── Accumulator ──────────────────────────────────────────────── -/** Check if a finish event carries a tool_call content block. */ -function isToolCallFinish( - event: ChatModelStreamEvent -): event is ContentBlockFinishEvent & { - content: ContentBlock.Tools.ToolCall; -} { - return ( - event.type === "content-block-finish" && event.content.type === "tool_call" - ); +/** + * Apply a typed delta to an accumulated content block. + * + * - `text-delta` → append text + * - `reasoning-delta` → append reasoning + * - `tool-call-delta` → append args, set id/name + * - `block-delta` → overwrite fields + * + * @internal + */ +function applyDelta( + block: ContentBlock, + delta: ContentBlockDelta +): ContentBlock { + switch (delta.type) { + case "text-delta": + return { + ...block, + text: ((block as { text?: string }).text ?? "") + delta.text, + }; + case "reasoning-delta": + return { + ...block, + reasoning: + ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, + }; + case "tool-call-delta": + return { + ...block, + ...(delta.id != null ? { id: delta.id } : {}), + ...(delta.name != null ? { name: delta.name } : {}), + args: ((block as { args?: string }).args ?? "") + (delta.args ?? ""), + }; + case "block-delta": + return { ...block, ...delta.content }; + default: + return block; + } } // ─── Sub-Stream: Text ─────────────────────────────────────────── @@ -142,7 +125,7 @@ function isToolCallFinish( /** * Typed stream for text content. * - * - **Iterate**: yields incremental text deltas (new tokens only). + * - **Iterate**: yields incremental text deltas. * - **Await**: resolves to the complete concatenated text. * - **`.full`**: yields the running accumulated text after each delta. */ @@ -157,44 +140,35 @@ export class TextContentStream this._buffer = buffer; } - /** - * Yields the accumulated text so far after each delta. - */ + /** Yields the accumulated text so far after each delta. */ get full(): AsyncIterable { const buffer = this._buffer; return { async *[Symbol.asyncIterator]() { + let accumulated = ""; for await (const event of buffer.iterate()) { - if (isTextDelta(event)) { - yield getStringField( - event.content as Record, - "text" - ); + if ( + event.type === "content-block-delta" && + event.delta.type === "text-delta" + ) { + accumulated += event.delta.text; + yield accumulated; } } }, }; } - /** - * Yields incremental text deltas (new tokens only). - * Computed by diffing successive accumulated states. - */ + /** Yields incremental text deltas. */ [Symbol.asyncIterator](): AsyncIterator { const buffer = this._buffer; async function* gen() { - const prevLen = new Map(); for await (const event of buffer.iterate()) { - if (isTextDelta(event)) { - const full = getStringField( - event.content as Record, - "text" - ); - const prev = prevLen.get(event.index) ?? 0; - if (full.length > prev) { - yield full.slice(prev); - prevLen.set(event.index, full.length); - } + if ( + event.type === "content-block-delta" && + event.delta.type === "text-delta" + ) { + yield event.delta.text; } } } @@ -244,8 +218,11 @@ export class ToolCallsStream async *[Symbol.asyncIterator]() { const calls: Array = []; for await (const event of buffer.iterate()) { - if (isToolCallFinish(event)) { - calls.push(event.content); + if ( + event.type === "content-block-finish" && + event.content.type === "tool_call" + ) { + calls.push(event.content as ContentBlock.Tools.ToolCall); yield [...calls]; } } @@ -257,8 +234,11 @@ export class ToolCallsStream const buffer = this._buffer; async function* gen() { for await (const event of buffer.iterate()) { - if (isToolCallFinish(event)) { - yield event.content; + if ( + event.type === "content-block-finish" && + event.content.type === "tool_call" + ) { + yield event.content as ContentBlock.Tools.ToolCall; } } } @@ -305,12 +285,14 @@ export class ReasoningContentStream const buffer = this._buffer; return { async *[Symbol.asyncIterator]() { + let accumulated = ""; for await (const event of buffer.iterate()) { - if (isReasoningDelta(event)) { - yield getStringField( - event.content as Record, - "reasoning" - ); + if ( + event.type === "content-block-delta" && + event.delta.type === "reasoning-delta" + ) { + accumulated += event.delta.reasoning; + yield accumulated; } } }, @@ -320,18 +302,12 @@ export class ReasoningContentStream [Symbol.asyncIterator](): AsyncIterator { const buffer = this._buffer; async function* gen() { - const prevLen = new Map(); for await (const event of buffer.iterate()) { - if (isReasoningDelta(event)) { - const full = getStringField( - event.content as Record, - "reasoning" - ); - const prev = prevLen.get(event.index) ?? 0; - if (full.length > prev) { - yield full.slice(prev); - prevLen.set(event.index, full.length); - } + if ( + event.type === "content-block-delta" && + event.delta.type === "reasoning-delta" + ) { + yield event.delta.reasoning; } } } @@ -357,9 +333,6 @@ export class ReasoningContentStream /** * Typed stream for usage metadata. - * - * - **Iterate**: yields usage snapshots as they arrive. - * - **Await**: resolves to the final usage snapshot. */ export class UsageMetadataStream implements AsyncIterable, PromiseLike @@ -412,10 +385,6 @@ export class UsageMetadataStream * * Implements `AsyncIterable` for raw event access * and `PromiseLike` for simple `await` usage. - * - * All sub-streams are replay-safe: multiple consumers reading from the - * same stream work correctly because each gets its own cursor over the - * shared buffer. */ export class ChatModelStream implements AsyncIterable, PromiseLike @@ -445,37 +414,30 @@ export class ChatModelStream } } - /** Iterate over raw {@link ChatModelStreamEvent}s. */ [Symbol.asyncIterator](): AsyncIterator { return this._buffer.iterate(); } - /** Text content deltas / full text. */ get text(): TextContentStream { return new TextContentStream(this._buffer); } - /** Completed tool calls. */ get toolCalls(): ToolCallsStream { return new ToolCallsStream(this._buffer); } - /** Reasoning content (chain-of-thought). */ get reasoning(): ReasoningContentStream { return new ReasoningContentStream(this._buffer); } - /** Usage metadata snapshots. */ get usage(): UsageMetadataStream { return new UsageMetadataStream(this._buffer); } - /** The fully assembled `AIMessage`, available once the stream finishes. */ get output(): PromiseLike { return { then: (onf, onr) => this._assembleMessage().then(onf, onr) }; } - /** Allows `await stream` to resolve to the fully assembled `AIMessage`. */ then( onfulfilled?: | ((value: AIMessage) => TResult1 | PromiseLike) @@ -485,10 +447,7 @@ export class ChatModelStream return this._assembleMessage().then(onfulfilled, onrejected); } - /** - * Assemble all stream events into a finalized `AIMessage`. - * @internal - */ + /** @internal */ private async _assembleMessage(): Promise { const contentBlocks: Array = []; let id: string | undefined; @@ -504,11 +463,17 @@ export class ChatModelStream break; case "content-block-start": - case "content-block-delta": - // Overwrite with the latest accumulated snapshot - contentBlocks[event.index] = event.content as ContentBlock; + contentBlocks[event.index] = event.content; break; + case "content-block-delta": { + const current = contentBlocks[event.index]; + if (current) { + contentBlocks[event.index] = applyDelta(current, event.delta); + } + break; + } + case "content-block-finish": contentBlocks[event.index] = event.content; break; diff --git a/libs/langchain-core/src/language_models/tests/event.test.ts b/libs/langchain-core/src/language_models/tests/event.test.ts index 3eef74159103..816e0acdc972 100644 --- a/libs/langchain-core/src/language_models/tests/event.test.ts +++ b/libs/langchain-core/src/language_models/tests/event.test.ts @@ -54,43 +54,74 @@ describe("ChatModelStreamEvent types", () => { expect(event.content.type).toBe("text"); }); - test("ContentBlockDeltaEvent with text", () => { + test("ContentBlockDeltaEvent with text-delta", () => { const event: ContentBlockDeltaEvent = { type: "content-block-delta", index: 0, - content: { type: "text", text: "Hello world" }, + delta: { type: "text-delta", text: " world" }, }; expect(event.type).toBe("content-block-delta"); expect(event.index).toBe(0); - expect((event.content as { text: string }).text).toBe("Hello world"); + expect(event.delta.type).toBe("text-delta"); + if (event.delta.type === "text-delta") { + expect(event.delta.text).toBe(" world"); + } }); - test("ContentBlockDeltaEvent with tool call", () => { + test("ContentBlockDeltaEvent with tool-call-delta", () => { const event: ContentBlockDeltaEvent = { type: "content-block-delta", index: 1, - content: { - type: "tool_call", + delta: { + type: "tool-call-delta", id: "call_1", name: "search", args: '{"q":"wea', }, }; expect(event.type).toBe("content-block-delta"); - expect(event.index).toBe(1); + expect(event.delta.type).toBe("tool-call-delta"); + if (event.delta.type === "tool-call-delta") { + expect(event.delta.name).toBe("search"); + expect(event.delta.args).toBe('{"q":"wea'); + } + }); + + test("ContentBlockDeltaEvent with reasoning-delta", () => { + const event: ContentBlockDeltaEvent = { + type: "content-block-delta", + index: 0, + delta: { type: "reasoning-delta", reasoning: "Let me think" }, + }; + expect(event.delta.type).toBe("reasoning-delta"); + if (event.delta.type === "reasoning-delta") { + expect(event.delta.reasoning).toBe("Let me think"); + } + }); + + test("ContentBlockDeltaEvent with block-delta", () => { + const event: ContentBlockDeltaEvent = { + type: "content-block-delta", + index: 0, + delta: { + type: "block-delta", + content: { type: "reasoning", signature: "sig_abc" }, + }, + }; + expect(event.delta.type).toBe("block-delta"); + if (event.delta.type === "block-delta") { + expect(event.delta.content.type).toBe("reasoning"); + } }); test("ContentBlockFinishEvent with text", () => { const event: ContentBlockFinishEvent = { type: "content-block-finish", index: 0, - content: { type: "text", text: "Hello world, how are you?" }, + content: { type: "text", text: "Hello world" }, }; expect(event.type).toBe("content-block-finish"); expect(event.content.type).toBe("text"); - expect((event.content as { text: string }).text).toBe( - "Hello world, how are you?" - ); }); test("ContentBlockFinishEvent with finalized tool call", () => { @@ -104,11 +135,7 @@ describe("ChatModelStreamEvent types", () => { args: { q: "weather" }, }, }; - expect(event.type).toBe("content-block-finish"); expect(event.content.type).toBe("tool_call"); - expect((event.content as { args: Record }).args).toEqual({ - q: "weather", - }); }); test("UsageUpdateEvent", () => { @@ -129,7 +156,6 @@ describe("ChatModelStreamEvent types", () => { }; expect(event.type).toBe("provider"); expect(event.provider).toBe("openai"); - expect(event.name).toBe("response.web_search_call.searching"); }); test("StreamErrorEvent", () => { @@ -140,7 +166,6 @@ describe("ChatModelStreamEvent types", () => { }; expect(event.type).toBe("error"); expect(event.message).toBe("Connection lost"); - expect(event.code).toBe("CONNECTION_ERROR"); }); test("event types are mutually exclusive via type field", () => { @@ -155,7 +180,7 @@ describe("ChatModelStreamEvent types", () => { { type: "content-block-delta", index: 0, - content: { type: "text", text: "hi" }, + delta: { type: "text-delta", text: "hi" }, }, { type: "content-block-finish", @@ -183,11 +208,6 @@ describe("ChatModelStreamEvent types", () => { for (let i = 0; i < events.length; i++) { expect(events[i]!.type).toBe(expectedTypes[i]); - // Each event type is unique - for (let j = 0; j < events.length; j++) { - if (i === j) continue; - expect(events[i]!.type).not.toBe(events[j]!.type); - } } }); }); @@ -214,22 +234,17 @@ describe("interleaving semantics", () => { { type: "content-block-delta", index: 0, - content: { type: "text", text: "Hello" }, + delta: { type: "text-delta", text: "Hello" }, }, { type: "content-block-delta", index: 1, - content: { - type: "tool_call_chunk", - id: "c1", - name: "search", - args: '{"q"', - }, + delta: { type: "tool-call-delta", args: '{"q"' }, }, { type: "content-block-delta", index: 0, - content: { type: "text", text: "Hello world" }, + delta: { type: "text-delta", text: " world" }, }, { type: "content-block-finish", @@ -239,12 +254,7 @@ describe("interleaving semantics", () => { { type: "content-block-delta", index: 1, - content: { - type: "tool_call_chunk", - id: "c1", - name: "search", - args: '{"q":"test"}', - }, + delta: { type: "tool-call-delta", args: ':"test"}' }, }, { type: "content-block-finish", @@ -259,7 +269,6 @@ describe("interleaving semantics", () => { { type: "message-finish", reason: "tool_use" }, ]; - // Verify lifecycle invariant: start before deltas before finish, per-block const blockStates = new Map(); for (const event of events) { if (event.type === "content-block-start") { diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 55a2547df91b..f269215a1ef3 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -23,12 +23,12 @@ function textStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 0, - content: { type: "text", text: "Hello" }, + delta: { type: "text-delta", text: "Hello" }, }, { type: "content-block-delta", index: 0, - content: { type: "text", text: "Hello world" }, + delta: { type: "text-delta", text: " world" }, }, { type: "content-block-finish", @@ -65,12 +65,12 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 0, - content: { type: "reasoning", reasoning: "Let me" }, + delta: { type: "reasoning-delta", reasoning: "Let me" }, }, { type: "content-block-delta", index: 0, - content: { type: "reasoning", reasoning: "Let me think..." }, + delta: { type: "reasoning-delta", reasoning: " think..." }, }, { type: "content-block-finish", @@ -86,12 +86,12 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 1, - content: { type: "text", text: "The answer" }, + delta: { type: "text-delta", text: "The answer" }, }, { type: "content-block-delta", index: 1, - content: { type: "text", text: "The answer is 42." }, + delta: { type: "text-delta", text: " is 42." }, }, { type: "content-block-finish", @@ -112,8 +112,8 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 2, - content: { - type: "tool_call_chunk", + delta: { + type: "tool-call-delta", id: "call_1", name: "calculator", args: '{"expr', @@ -122,12 +122,7 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 2, - content: { - type: "tool_call_chunk", - id: "call_1", - name: "calculator", - args: '{"expr":"6*7"}', - }, + delta: { type: "tool-call-delta", args: ':"6*7"}' }, }, { type: "content-block-finish", @@ -412,7 +407,7 @@ describe("ChatModelStream", () => { { type: "content-block-delta", index: 0, - content: { type: "text", text: "Result" }, + delta: { type: "text-delta", text: "Result" }, }, { type: "content-block-finish", @@ -455,7 +450,7 @@ describe("ChatModelStream", () => { { type: "content-block-delta", index: 0, - content: { type: "text", text: "Hello" }, + delta: { type: "text-delta", text: "Hello" }, }, { type: "content-block-finish", @@ -483,7 +478,7 @@ describe("ChatModelStream", () => { { type: "content-block-delta", index: 0, - content: { type: "text", text: "Partial" }, + delta: { type: "text-delta", text: "Partial" }, }, { type: "error", message: "Connection lost", code: "CONN_ERR" }, { type: "message-finish", reason: "stop" }, diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts index 0cbc4720e6d4..1a91a317563b 100644 --- a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -212,17 +212,19 @@ describe("_streamChatModelEvents bridge", () => { expect(events[2]!.type).toBe("content-block-delta"); const delta1 = events[2] as { index: number; - content: ContentBlock; + delta: { type: string; text?: string }; }; - expect((delta1.content as ContentBlock.Text).text).toBe("Hello"); + expect(delta1.delta.type).toBe("text-delta"); + expect(delta1.delta.text).toBe("Hello"); - // content-block-delta for " world" (accumulated) + // content-block-delta for " world" expect(events[3]!.type).toBe("content-block-delta"); const delta2 = events[3] as { index: number; - content: ContentBlock; + delta: { type: string; text?: string }; }; - expect((delta2.content as ContentBlock.Text).text).toBe("Hello world"); + expect(delta2.delta.type).toBe("text-delta"); + expect(delta2.delta.text).toBe(" world"); // content-block-finish const finishIdx = events.findIndex( @@ -276,13 +278,14 @@ describe("_streamChatModelEvents bridge", () => { ); expect(reasoningDeltas.length).toBe(1); // second reasoning chunk is a delta - // Check accumulated reasoning + // Check reasoning delta const lastReasoningDelta = reasoningDeltas[ reasoningDeltas.length - 1 ] as { - content: ContentBlock.Reasoning; + delta: { type: string; reasoning?: string }; }; - expect(lastReasoningDelta.content.reasoning).toBe("Thinking hard..."); + expect(lastReasoningDelta.delta.type).toBe("reasoning-delta"); + expect(lastReasoningDelta.delta.reasoning).toBe(" hard..."); // Finish events for both blocks const finishes = events.filter((e) => e.type === "content-block-finish"); diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts index 90f25ff3eb1a..e2b1d20c912c 100644 --- a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -279,17 +279,19 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { ); expect(deltas.length).toBe(2); - // First delta: accumulated = "Hello" + // First delta: incremental "Hello" const d1 = deltas[0] as { - content: { text: string }; + delta: { type: string; text?: string }; }; - expect(d1.content.text).toBe("Hello"); + expect(d1.delta.type).toBe("text-delta"); + expect(d1.delta.text).toBe("Hello"); - // Second delta: accumulated = "Hello world" + // Second delta: incremental " world" const d2 = deltas[1] as { - content: { text: string }; + delta: { type: string; text?: string }; }; - expect(d2.content.text).toBe("Hello world"); + expect(d2.delta.type).toBe("text-delta"); + expect(d2.delta.text).toBe(" world"); }); test("content-block-finish carries finalized text", async () => { @@ -344,24 +346,20 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { e.type === "content-block-delta" && "index" in e && e.index === 0 && - "content" in e && - (e.content as { type: string }).type === "reasoning" + "delta" in e && + (e.delta as { type: string }).type === "reasoning-delta" ); - // 3 deltas: 2 thinking_delta + 1 signature_delta - // (all have accumulated block type "reasoning") - expect(reasoningDeltas.length).toBe(3); + expect(reasoningDeltas.length).toBe(2); - // After the 2nd delta, reasoning should be fully accumulated - const afterThinking = reasoningDeltas[1] as { - content: { reasoning: string }; + const rd1 = reasoningDeltas[0] as { + delta: { type: string; reasoning: string }; }; - expect(afterThinking.content.reasoning).toBe("Let me reason..."); + expect(rd1.delta.reasoning).toBe("Let me"); - // After the signature delta, reasoning is unchanged - const afterSig = reasoningDeltas[2] as { - content: { reasoning: string }; + const rd2 = reasoningDeltas[1] as { + delta: { type: string; reasoning: string }; }; - expect(afterSig.content.reasoning).toBe("Let me reason..."); + expect(rd2.delta.reasoning).toBe(" reason..."); // Reasoning finish const reasoningFinish = events.find( @@ -400,16 +398,15 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - // Signature delta adds a signature field to the accumulated reasoning block - const allIndex0Deltas = events.filter( - (e) => e.type === "content-block-delta" && "index" in e && e.index === 0 - ); - // The last delta at index 0 should have the signature field - const lastDelta = allIndex0Deltas[allIndex0Deltas.length - 1] as { - content: { type: string; signature?: string }; - }; - expect(lastDelta.content.type).toBe("reasoning"); - expect(lastDelta.content.signature).toBe("sig_abc"); + // Signature delta should be emitted as a block-delta + const sigDelta = events.find( + (e) => + e.type === "content-block-delta" && + "delta" in e && + (e.delta as { type: string }).type === "block-delta" + ) as { delta: { type: string; content: { signature?: string } } }; + expect(sigDelta).toBeDefined(); + expect(sigDelta.delta.content.signature).toBe("sig_abc"); }); }); @@ -432,16 +429,18 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { expect(toolStart.content.name).toBe("web_search"); expect(toolStart.content.id).toBe("toolu_01ABC"); - // Deltas accumulate args + // Deltas carry incremental tool-call-delta const toolDeltas = events.filter( (e) => e.type === "content-block-delta" && "index" in e && e.index === 1 ); expect(toolDeltas.length).toBe(2); - const lastDelta = toolDeltas[1] as { - content: { args: string }; - }; - expect(lastDelta.content.args).toBe('{"query":"weather"}'); + const td1 = toolDeltas[0] as { delta: { type: string; args?: string } }; + expect(td1.delta.type).toBe("tool-call-delta"); + expect(td1.delta.args).toBe('{"query"'); + + const td2 = toolDeltas[1] as { delta: { type: string; args?: string } }; + expect(td2.delta.args).toBe(':"weather"}'); }); test("tool call finish has parsed args", async () => { diff --git a/libs/providers/langchain-anthropic/src/utils/stream_events.ts b/libs/providers/langchain-anthropic/src/utils/stream_events.ts index 58fbb5abfd81..57f530a6d1d0 100644 --- a/libs/providers/langchain-anthropic/src/utils/stream_events.ts +++ b/libs/providers/langchain-anthropic/src/utils/stream_events.ts @@ -1,46 +1,28 @@ /** * Converts a raw Anthropic SSE event stream into LangChain ChatModelStreamEvents. * - * This is a pure converter: it takes an async iterable of native Anthropic - * `RawMessageStreamEvent`s and yields `ChatModelStreamEvent`s. It handles: - * - * - Message lifecycle (`message_start` → `message-start`, `message_stop` → `message-finish`) - * - Content block lifecycle with fully-qualified accumulated snapshots - * - Tool call arg accumulation and JSON parsing on finalization - * - Usage snapshots (input tokens on start, output tokens on delta) - * - Provider passthrough for unrecognized events - * * @module */ import type Anthropic from "@anthropic-ai/sdk"; import type { ChatModelStreamEvent, + ContentBlockDelta, FinishReason, } from "@langchain/core/language_models/event"; import type { ContentBlock } from "@langchain/core/messages/content"; import type { UsageMetadata } from "@langchain/core/messages/metadata"; import type { AnthropicMessageStreamEvent } from "../types.js"; +// ─── Public API ───────────────────────────────────────────────── + export interface ConvertAnthropicStreamOptions { - /** - * Whether to emit usage events. - * @default true - */ streamUsage?: boolean; } /** * Convert an async iterable of raw Anthropic stream events into - * LangChain `ChatModelStreamEvent`s. - * - * @example - * ```ts - * const anthropicStream = await client.messages.create({ ..., stream: true }); - * for await (const event of convertAnthropicStream(anthropicStream)) { - * // event is a ChatModelStreamEvent - * } - * ``` + * LangChain `ChatModelStreamEvent`s with typed deltas. */ export async function* convertAnthropicStream( source: AsyncIterable, @@ -48,20 +30,18 @@ export async function* convertAnthropicStream( ): AsyncGenerator { const shouldStreamUsage = options.streamUsage ?? true; - // Track accumulated state per content block + // Track accumulated state per content block (for finalization) const blockAccumulators = new Map< number, - { - // oxlint-disable-next-line @typescript-eslint/no-explicit-any - accumulated: Record; - type: string; - } + // oxlint-disable-next-line @typescript-eslint/no-explicit-any + Record >(); let usageSnapshot: UsageMetadata | undefined; let stopReason: string | null = null; for await (const data of source) { switch (data.type) { + // ── Message lifecycle ────────────────────────────────── case "message_start": { const { usage, id, model } = data.message; if (usage && shouldStreamUsage) { @@ -72,7 +52,6 @@ export async function* convertAnthropicStream( id, ...(usageSnapshot ? { usage: usageSnapshot } : {}), }; - // Emit response metadata as provider event yield { type: "provider" as const, provider: "anthropic", @@ -104,7 +83,6 @@ export async function* convertAnthropicStream( } yield { type: "usage" as const, usage: usageSnapshot }; } - // Forward context_management as provider event if ( "context_management" in data.delta && data.delta.context_management @@ -133,10 +111,7 @@ export async function* convertAnthropicStream( case "content_block_start": { const { index, content_block } = data; const mapped = mapBlockToContentBlock(content_block, index); - blockAccumulators.set(index, { - accumulated: { ...mapped }, - type: mapped.type, - }); + blockAccumulators.set(index, { ...mapped }); yield { type: "content-block-start" as const, index, @@ -150,13 +125,13 @@ export async function* convertAnthropicStream( const acc = blockAccumulators.get(index); if (!acc) break; - const { accumulated } = applyDelta(acc.accumulated, delta, index); - acc.accumulated = accumulated; + const { typedDelta, accumulated } = applyAnthropicDelta(acc, delta); + blockAccumulators.set(index, accumulated); yield { type: "content-block-delta" as const, index, - content: accumulated, + delta: typedDelta, }; break; } @@ -166,7 +141,7 @@ export async function* convertAnthropicStream( const acc = blockAccumulators.get(index); if (!acc) break; - const finalized = finalizeBlock(acc.accumulated); + const finalized = finalizeBlock(acc); yield { type: "content-block-finish" as const, index, @@ -176,7 +151,7 @@ export async function* convertAnthropicStream( break; } - // ── Unhandled events → provider passthrough ─────────── + // ── Unhandled → provider passthrough ─────────────────── default: { yield { type: "provider" as const, @@ -192,9 +167,6 @@ export async function* convertAnthropicStream( // ─── Internal helpers ─────────────────────────────────────────── -/** - * Map Anthropic's stop_reason to the standard FinishReason. - */ function mapStopReason(stopReason: string | null | undefined): FinishReason { switch (stopReason) { case "end_turn": @@ -209,10 +181,6 @@ function mapStopReason(stopReason: string | null | undefined): FinishReason { } } -/** - * Build a usage snapshot from Anthropic's usage object. - * Handles cache token details. - */ function buildUsageSnapshot( usage: Anthropic.Messages.Usage | Record ): UsageMetadata { @@ -232,10 +200,6 @@ function buildUsageSnapshot( }; } -/** - * Map an Anthropic content block (from content_block_start) to a - * LangChain ContentBlock. - */ function mapBlockToContentBlock( // oxlint-disable-next-line @typescript-eslint/no-explicit-any block: any, @@ -244,11 +208,7 @@ function mapBlockToContentBlock( ): Record { switch (block.type) { case "text": - return { - type: "text" as const, - text: block.text ?? "", - index, - }; + return { type: "text" as const, text: block.text ?? "", index }; case "thinking": return { type: "reasoning" as const, @@ -256,11 +216,7 @@ function mapBlockToContentBlock( index, }; case "redacted_thinking": - return { - type: "non_standard" as const, - value: { ...block }, - index, - }; + return { type: "non_standard" as const, value: { ...block }, index }; case "tool_use": return { type: "tool_call_chunk" as const, @@ -278,32 +234,28 @@ function mapBlockToContentBlock( index, }; default: - // document, web_search_tool_result, compaction, etc. - return { - type: "non_standard" as const, - value: { ...block }, - index, - }; + return { type: "non_standard" as const, value: { ...block }, index }; } } /** - * Apply an Anthropic content_block_delta to the accumulated content block. - * Returns both the incremental delta (as a ContentBlock) and the new - * accumulated state. + * Map an Anthropic content_block_delta to a typed ContentBlockDelta + * and update the accumulated state. */ -function applyDelta( +function applyAnthropicDelta( // oxlint-disable-next-line @typescript-eslint/no-explicit-any accumulated: Record, // oxlint-disable-next-line @typescript-eslint/no-explicit-any - delta: any, - index: number + delta: any +): { + typedDelta: ContentBlockDelta; // oxlint-disable-next-line @typescript-eslint/no-explicit-any -): { deltaBlock: Record; accumulated: Record } { + accumulated: Record; +} { switch (delta.type) { case "text_delta": return { - deltaBlock: { type: "text" as const, text: delta.text, index }, + typedDelta: { type: "text-delta" as const, text: delta.text }, accumulated: { ...accumulated, text: (accumulated.text ?? "") + delta.text, @@ -312,10 +264,9 @@ function applyDelta( case "thinking_delta": return { - deltaBlock: { - type: "reasoning" as const, + typedDelta: { + type: "reasoning-delta" as const, reasoning: delta.thinking, - index, }, accumulated: { ...accumulated, @@ -325,10 +276,9 @@ function applyDelta( case "input_json_delta": return { - deltaBlock: { - type: accumulated.type, + typedDelta: { + type: "tool-call-delta" as const, args: delta.partial_json, - index, }, accumulated: { ...accumulated, @@ -336,72 +286,57 @@ function applyDelta( }, }; - case "citations_delta": { - const newCitation = delta.citation; - const existingAnnotations = accumulated.annotations ?? []; + case "citations_delta": return { - deltaBlock: { - type: "text" as const, - text: "", - annotations: [newCitation], - index, + typedDelta: { + type: "block-delta" as const, + content: { + type: accumulated.type, + annotations: [delta.citation], + }, }, accumulated: { ...accumulated, - annotations: [...existingAnnotations, newCitation], + annotations: [...(accumulated.annotations ?? []), delta.citation], }, }; - } case "signature_delta": return { - deltaBlock: { - type: "non_standard" as const, - value: { signature: delta.signature }, - index, - }, - accumulated: { - ...accumulated, - signature: delta.signature, + typedDelta: { + type: "block-delta" as const, + content: { type: accumulated.type, signature: delta.signature }, }, + accumulated: { ...accumulated, signature: delta.signature }, }; case "compaction_delta": return { - deltaBlock: { - type: "non_standard" as const, - value: { compaction: delta }, - index, + typedDelta: { + type: "block-delta" as const, + content: { type: "non_standard", value: { compaction: delta } }, }, accumulated: { ...accumulated, - value: { - ...(accumulated.value ?? {}), - compaction: delta, - }, + value: { ...(accumulated.value ?? {}), compaction: delta }, }, }; default: return { - deltaBlock: { - type: "non_standard" as const, - value: delta, - index, + typedDelta: { + type: "block-delta" as const, + content: { type: accumulated.type, ...delta }, }, accumulated, }; } } -/** - * Finalize an accumulated content block for the content-block-finish event. - * For tool calls, parse the accumulated JSON args string. - */ function finalizeBlock( // oxlint-disable-next-line @typescript-eslint/no-explicit-any accumulated: Record -): ContentBlock.Standard { +): ContentBlock { if ( accumulated.type === "tool_call_chunk" || accumulated.type === "server_tool_call_chunk" @@ -431,7 +366,6 @@ function finalizeBlock( } as any; } - // Text and reasoning blocks: strip the index for the finalized form const { index: _index, ...rest } = accumulated; - return rest as ContentBlock.Standard; + return rest as ContentBlock; } From 9c2d360e524ae7469137b34f6b4eda4a0ec2f85b Mon Sep 17 00:00:00 2001 From: Hunter Lovell Date: Mon, 13 Apr 2026 00:41:19 -0700 Subject: [PATCH 03/39] refactor: drop tool-call-delta, use block-delta with overwrite semantics - Remove ToolCallDelta type; tool call args now use block-delta with accumulated snapshot (adapter accumulates internally) - Rename block-delta.content -> block-delta.fields to avoid confusion with content on start/finish events - Three delta types remain: text-delta (append), reasoning-delta (append), block-delta (overwrite) --- .../src/language_models/compat.ts | 42 ++++++++----------- .../src/language_models/event.ts | 37 +++++----------- .../src/language_models/stream.ts | 10 +---- .../src/language_models/tests/event.test.ts | 33 ++++++++------- .../src/language_models/tests/stream.test.ts | 10 ++++- .../tests/chat_models_stream_events.test.ts | 19 +++++---- .../src/utils/stream_events.ts | 23 +++++----- 7 files changed, 81 insertions(+), 93 deletions(-) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 97545eda2d91..6799e663eb37 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -136,18 +136,23 @@ export async function* convertChunksToEvents( }; } - const toolDelta = { - type: "tool-call-delta" as const, - id: toolChunk.id, - name: toolChunk.name, - args: toolChunk.args, - }; + // Accumulate tool call args internally, emit as block-delta with snapshot const block = activeBlocks.get(blockIndex)!; - block.accumulated = applyDeltaToBlock(block.accumulated, toolDelta); + const acc = block.accumulated as { + args?: string; + id?: string; + name?: string; + }; + if (toolChunk.id != null) acc.id = toolChunk.id; + if (toolChunk.name != null) acc.name = toolChunk.name; + acc.args = (acc.args ?? "") + (toolChunk.args ?? ""); yield { type: "content-block-delta" as const, index: blockIndex, - delta: toolDelta, + delta: { + type: "block-delta" as const, + fields: { ...block.accumulated }, + }, }; } } @@ -205,15 +210,8 @@ function applyDeltaToBlock( reasoning: ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, }; - case "tool-call-delta": - return { - ...block, - ...(delta.id != null ? { id: delta.id } : {}), - ...(delta.name != null ? { name: delta.name } : {}), - args: ((block as { args?: string }).args ?? "") + (delta.args ?? ""), - }; case "block-delta": - return { ...block, ...delta.content }; + return { ...block, ...delta.fields }; default: return block; } @@ -236,19 +234,15 @@ function contentBlockToDelta(part: ContentBlock): ContentBlockDelta { reasoning: (part as ContentBlock.Reasoning).reasoning ?? "", }; case "tool_call_chunk": - case "tool_call": { - const tc = part as ContentBlock.Tools.ToolCallChunk; + case "tool_call": return { - type: "tool-call-delta" as const, - id: tc.id, - name: tc.name, - args: tc.args, + type: "block-delta" as const, + fields: part, }; - } default: return { type: "block-delta" as const, - content: part, + fields: part, }; } } diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts index 3b673ed49be0..eff0f60af0d6 100644 --- a/libs/langchain-core/src/language_models/event.ts +++ b/libs/langchain-core/src/language_models/event.ts @@ -60,31 +60,21 @@ export interface ReasoningDelta { reasoning: string; } -/** - * Incremental tool call data. **Append** `args` to the block's `args` field. - * `id` and `name` are set (not appended) if present. - */ -export interface ToolCallDelta { - type: "tool-call-delta"; - /** Tool call identifier. Set on first delta, not appended. */ - id?: string; - /** Tool name. Set on first delta, not appended. */ - name?: string; - /** Partial JSON arguments string to append. */ - args?: string; -} - /** * Catch-all delta for content block types without a dedicated delta type. - * **Overwrite** fields from `content` onto the accumulated block. + * **Overwrite** fields from `fields` onto the accumulated block. + * + * The adapter is responsible for accumulating state internally. + * Each `block-delta` carries the accumulated snapshot of the fields + * it manages, so consumers simply overwrite. * - * Used for provider-specific block types like code interpreter output, + * Used for tool call argument streaming, code interpreter output, * signatures, citations, compaction, etc. */ export interface BlockDelta { type: "block-delta"; - /** Partial content block whose fields overwrite the accumulated block. */ - content: PartialContentBlock; + /** Fields to overwrite on the accumulated content block. */ + fields: PartialContentBlock; } /** @@ -93,14 +83,9 @@ export interface BlockDelta { * Accumulation rules: * - `text-delta` → **append** `text` to block's text field * - `reasoning-delta` → **append** `reasoning` to block's reasoning field - * - `tool-call-delta` → **append** `args`, **set** id/name if present - * - `block-delta` → **overwrite** fields from content onto block + * - `block-delta` → **overwrite** fields onto block (adapter accumulates internally) */ -export type ContentBlockDelta = - | TextDelta - | ReasoningDelta - | ToolCallDelta - | BlockDelta; +export type ContentBlockDelta = TextDelta | ReasoningDelta | BlockDelta; // ─── Message Lifecycle ────────────────────────────────────────── @@ -174,7 +159,7 @@ export interface ContentBlockStartEvent { * * // Tool call args chunk * { type: "content-block-delta", index: 1, - * delta: { type: "tool-call-delta", args: '{"q":"wea' } } + * delta: { type: "block-delta", fields: { type: "tool_call_chunk", args: '{"q":"wea' } } } * * // Provider-specific field (e.g., signature) * { type: "content-block-delta", index: 0, diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index c03b6564ae28..8080519c489d 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -85,7 +85,6 @@ class ReplayBuffer { * * - `text-delta` → append text * - `reasoning-delta` → append reasoning - * - `tool-call-delta` → append args, set id/name * - `block-delta` → overwrite fields * * @internal @@ -106,15 +105,8 @@ function applyDelta( reasoning: ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, }; - case "tool-call-delta": - return { - ...block, - ...(delta.id != null ? { id: delta.id } : {}), - ...(delta.name != null ? { name: delta.name } : {}), - args: ((block as { args?: string }).args ?? "") + (delta.args ?? ""), - }; case "block-delta": - return { ...block, ...delta.content }; + return { ...block, ...delta.fields }; default: return block; } diff --git a/libs/langchain-core/src/language_models/tests/event.test.ts b/libs/langchain-core/src/language_models/tests/event.test.ts index 816e0acdc972..6c842565a171 100644 --- a/libs/langchain-core/src/language_models/tests/event.test.ts +++ b/libs/langchain-core/src/language_models/tests/event.test.ts @@ -68,23 +68,22 @@ describe("ChatModelStreamEvent types", () => { } }); - test("ContentBlockDeltaEvent with tool-call-delta", () => { + test("ContentBlockDeltaEvent with tool call block-delta", () => { const event: ContentBlockDeltaEvent = { type: "content-block-delta", index: 1, delta: { - type: "tool-call-delta", - id: "call_1", - name: "search", - args: '{"q":"wea', + type: "block-delta", + fields: { + type: "tool_call_chunk", + id: "call_1", + name: "search", + args: '{"q":"wea', + }, }, }; expect(event.type).toBe("content-block-delta"); - expect(event.delta.type).toBe("tool-call-delta"); - if (event.delta.type === "tool-call-delta") { - expect(event.delta.name).toBe("search"); - expect(event.delta.args).toBe('{"q":"wea'); - } + expect(event.delta.type).toBe("block-delta"); }); test("ContentBlockDeltaEvent with reasoning-delta", () => { @@ -105,12 +104,12 @@ describe("ChatModelStreamEvent types", () => { index: 0, delta: { type: "block-delta", - content: { type: "reasoning", signature: "sig_abc" }, + fields: { type: "reasoning", signature: "sig_abc" }, }, }; expect(event.delta.type).toBe("block-delta"); if (event.delta.type === "block-delta") { - expect(event.delta.content.type).toBe("reasoning"); + expect(event.delta.fields.type).toBe("reasoning"); } }); @@ -239,7 +238,10 @@ describe("interleaving semantics", () => { { type: "content-block-delta", index: 1, - delta: { type: "tool-call-delta", args: '{"q"' }, + delta: { + type: "block-delta", + fields: { type: "tool_call_chunk", args: '{"q"' }, + }, }, { type: "content-block-delta", @@ -254,7 +256,10 @@ describe("interleaving semantics", () => { { type: "content-block-delta", index: 1, - delta: { type: "tool-call-delta", args: ':"test"}' }, + delta: { + type: "block-delta", + fields: { type: "tool_call_chunk", args: '{"q":"test"}' }, + }, }, { type: "content-block-finish", diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index f269215a1ef3..548357685204 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -122,7 +122,15 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 2, - delta: { type: "tool-call-delta", args: ':"6*7"}' }, + delta: { + type: "block-delta", + fields: { + type: "tool_call_chunk", + id: "call_1", + name: "calculator", + args: '{"expr":"6*7"}', + }, + }, }, { type: "content-block-finish", diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts index e2b1d20c912c..e1aeb2621e77 100644 --- a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -404,9 +404,9 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { e.type === "content-block-delta" && "delta" in e && (e.delta as { type: string }).type === "block-delta" - ) as { delta: { type: string; content: { signature?: string } } }; + ) as { delta: { type: string; fields?: { signature?: string } } }; expect(sigDelta).toBeDefined(); - expect(sigDelta.delta.content.signature).toBe("sig_abc"); + expect(sigDelta.delta.fields?.signature).toBe("sig_abc"); }); }); @@ -435,12 +435,17 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { ); expect(toolDeltas.length).toBe(2); - const td1 = toolDeltas[0] as { delta: { type: string; args?: string } }; - expect(td1.delta.type).toBe("tool-call-delta"); - expect(td1.delta.args).toBe('{"query"'); + const td1 = toolDeltas[0] as { + delta: { type: string; fields?: { args?: string } }; + }; + expect(td1.delta.type).toBe("block-delta"); + expect(td1.delta.fields?.args).toBe('{"query"'); - const td2 = toolDeltas[1] as { delta: { type: string; args?: string } }; - expect(td2.delta.args).toBe(':"weather"}'); + const td2 = toolDeltas[1] as { + delta: { type: string; fields?: { args?: string } }; + }; + expect(td2.delta.type).toBe("block-delta"); + expect(td2.delta.fields?.args).toBe('{"query":"weather"}'); }); test("tool call finish has parsed args", async () => { diff --git a/libs/providers/langchain-anthropic/src/utils/stream_events.ts b/libs/providers/langchain-anthropic/src/utils/stream_events.ts index 57f530a6d1d0..5283a3c3c2c3 100644 --- a/libs/providers/langchain-anthropic/src/utils/stream_events.ts +++ b/libs/providers/langchain-anthropic/src/utils/stream_events.ts @@ -274,25 +274,24 @@ function applyAnthropicDelta( }, }; - case "input_json_delta": + case "input_json_delta": { + const newArgs = (accumulated.args ?? "") + delta.partial_json; return { typedDelta: { - type: "tool-call-delta" as const, - args: delta.partial_json, - }, - accumulated: { - ...accumulated, - args: (accumulated.args ?? "") + delta.partial_json, + type: "block-delta" as const, + fields: { type: accumulated.type, args: newArgs }, }, + accumulated: { ...accumulated, args: newArgs }, }; + } case "citations_delta": return { typedDelta: { type: "block-delta" as const, - content: { + fields: { type: accumulated.type, - annotations: [delta.citation], + annotations: [...(accumulated.annotations ?? []), delta.citation], }, }, accumulated: { @@ -305,7 +304,7 @@ function applyAnthropicDelta( return { typedDelta: { type: "block-delta" as const, - content: { type: accumulated.type, signature: delta.signature }, + fields: { type: accumulated.type, signature: delta.signature }, }, accumulated: { ...accumulated, signature: delta.signature }, }; @@ -314,7 +313,7 @@ function applyAnthropicDelta( return { typedDelta: { type: "block-delta" as const, - content: { type: "non_standard", value: { compaction: delta } }, + fields: { type: "non_standard", value: { compaction: delta } }, }, accumulated: { ...accumulated, @@ -326,7 +325,7 @@ function applyAnthropicDelta( return { typedDelta: { type: "block-delta" as const, - content: { type: accumulated.type, ...delta }, + fields: { type: accumulated.type, ...delta }, }, accumulated, }; From f5f8f067172db2488594eeb0f55aa5b506746b3d Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Mon, 13 Apr 2026 17:27:04 -0700 Subject: [PATCH 04/39] feat(langchain): adopt new streaming primitives Create new-guests-yell.md actually use __native flag more tests and details formatting better fix fix: parse tool call input better middleware typing format add integration tests use eventlog for native stream transformer format keep stream transformer in type bag cr update langgraph update langgraph --- .changeset/new-guests-yell.md | 5 + .vscode/settings.json | 13 +- libs/langchain/package.json | 19 +- libs/langchain/src/agents/ReactAgent.ts | 116 +- libs/langchain/src/agents/index.ts | 117 +- libs/langchain/src/agents/stream.ts | 406 + .../src/agents/tests/stream.int.test.ts | 298 + .../src/agents/tests/stream.test-d.ts | 133 + .../langchain/src/agents/tests/stream.test.ts | 417 + libs/langchain/src/agents/types.ts | 72 +- libs/langchain/src/load/import_map.ts | 1 + pnpm-lock.yaml | 9387 +++++++---------- 12 files changed, 5193 insertions(+), 5791 deletions(-) create mode 100644 .changeset/new-guests-yell.md create mode 100644 libs/langchain/src/agents/stream.ts create mode 100644 libs/langchain/src/agents/tests/stream.int.test.ts create mode 100644 libs/langchain/src/agents/tests/stream.test-d.ts create mode 100644 libs/langchain/src/agents/tests/stream.test.ts diff --git a/.changeset/new-guests-yell.md b/.changeset/new-guests-yell.md new file mode 100644 index 000000000000..448865727350 --- /dev/null +++ b/.changeset/new-guests-yell.md @@ -0,0 +1,5 @@ +--- +"langchain": minor +--- + +feat(langchain): adopt new streaming primitives diff --git a/.vscode/settings.json b/.vscode/settings.json index 56f95d95466a..07f45ab0bc97 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,4 @@ { - "eslint.workingDirectories": [ - "./langchain", - "./langchain-core", - "./examples", - "./docs", - "./test-exports-vercel" - ], "yaml.schemas": { "https://json.schemastore.org/github-workflow.json": "./.github/workflows/deploy.yml" }, @@ -30,12 +23,12 @@ "**/pnpm-lock.yaml": true }, "typescript.preferences.importModuleSpecifier": "relative", - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "oxc.oxc-vscode", "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "oxc.oxc-vscode" }, "deno.enable": false } diff --git a/libs/langchain/package.json b/libs/langchain/package.json index 2d89e5d3ab45..628673b08598 100644 --- a/libs/langchain/package.json +++ b/libs/langchain/package.json @@ -42,9 +42,12 @@ "test:integration": "vitest --mode int" }, "devDependencies": { + "@hono/node-server": "^1.19.14", "@langchain/anthropic": "workspace:*", "@langchain/core": "workspace:^", "@langchain/fireworks": "workspace:*", + "@langchain/langgraph-api": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b", + "@langchain/langgraph-sdk": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b", "@langchain/openai": "workspace:*", "@langchain/tsconfig": "workspace:*", "@tsconfig/recommended": "^1.0.2", @@ -57,6 +60,7 @@ "dotenv": "^17.4.0", "dpdm": "^3.14.0", "openai": "^6.22.0", + "hono": "^4.12.12", "peggy": "^5.1.0", "reflect-metadata": "^0.2.2", "rimraf": "^6.1.3", @@ -70,7 +74,7 @@ "@langchain/core": "workspace:^" }, "dependencies": { - "@langchain/langgraph": "^1.2.9", + "@langchain/langgraph": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b", "@langchain/langgraph-checkpoint": "^1.0.1", "langsmith": ">=0.5.0 <1.0.0", "zod": "^3.25.76 || ^4" @@ -206,7 +210,18 @@ "default": "./dist/storage/in_memory.js" } }, + "./tools": { + "input": "./src/tools/index.ts", + "require": { + "types": "./dist/tools/index.d.cts", + "default": "./dist/tools/index.cjs" + }, + "import": { + "types": "./dist/tools/index.d.ts", + "default": "./dist/tools/index.js" + } + }, "./package.json": "./package.json" }, "module": "./dist/index.js" -} +} \ No newline at end of file diff --git a/libs/langchain/src/agents/ReactAgent.ts b/libs/langchain/src/agents/ReactAgent.ts index a2e7b35cb555..cfa58acb25e1 100644 --- a/libs/langchain/src/agents/ReactAgent.ts +++ b/libs/langchain/src/agents/ReactAgent.ts @@ -14,6 +14,7 @@ import { type StreamMode, type StreamOutputMap, type PregelOptions, + type StreamTransformer, } from "@langchain/langgraph"; import type { BaseCheckpointSaver, @@ -51,6 +52,12 @@ import { initializeMiddlewareStates, parseJumpToTarget, } from "./nodes/utils.js"; +import { + createToolCallTransformer, + createMiddlewareTransformer, + type AgentRunStream, + type InferStreamExtensions, +} from "./stream.js"; import type { WithStateGraphNodes, @@ -158,7 +165,8 @@ export class ReactAgent< undefined, AnyAnnotationRoot, readonly AgentMiddleware[], - readonly (ClientTool | ServerTool)[] + readonly (ClientTool | ServerTool)[], + ReadonlyArray<() => StreamTransformer> >, > { /** @@ -168,7 +176,7 @@ export class ReactAgent< */ declare readonly "~agentTypes": Types; - #graph: AgentGraph; + #graph: CompiledStateGraph; #toolBehaviorVersion: "v1" | "v2" = "v2"; @@ -662,13 +670,21 @@ export class ReactAgent< } /** - * compile the graph + * compile the graph with native + user-defined stream transformers */ + const compileTransformers = [ + createToolCallTransformer([]), + createMiddlewareTransformer([]), + /* user-defined stream transformers */ + ...(this.options.streamTransformers ?? []), + ]; + this.#graph = allNodeWorkflows.compile({ checkpointer: this.options.checkpointer, store: this.options.store, name: this.options.name, description: this.options.description, + transformers: compileTransformers, }) as unknown as AgentGraph; } @@ -1278,6 +1294,100 @@ export class ReactAgent< >; } + /** + * Executes the agent with the new v2 streaming interface, returning an + * {@link AgentRunStream} that provides ergonomic, typed projections for + * messages, tool calls, and middleware events — without requiring knowledge + * of Pregel channels, stream modes, or namespace routing. + * + * This method is experimental and its API may change in future releases. + * + * @param state - The initial state for the agent execution. Can be: + * - An object containing `messages` array and any middleware-specific state properties + * - A Command object for more advanced control flow + * + * @param config - Optional runtime configuration including: + * @param config.context - The context for the agent execution. + * @param config.configurable - LangGraph configuration options like `thread_id`, `run_id`, etc. + * @param config.store - The store for the agent execution for persisting state. + * @param config.signal - An optional AbortSignal for the agent execution. + * @param config.recursionLimit - The recursion limit for the agent execution. + * @param config.transformers - Additional call-site stream transformers. These + * run after the built-in agent transformers and any transformers registered + * at creation time via `createAgent({ streamTransformers })`. + * + * @returns A Promise that resolves to an {@link AgentRunStream} providing: + * - `run.messages` — all AI message lifecycles with streaming `.text` and `.reasoning` + * - `run.toolCalls` — individual tool call streams with `.input`, `.output`, `.status` + * - `run.middleware` — middleware lifecycle events (before/after agent/model) + * - `run.values` — state snapshots (async iterable + promise-like) + * - `run.output` — final agent state when the run completes + * - `run.subgraphs` — child subgraph run streams + * - `run.extensions` — merged projections from user-supplied transformers + * + * @example + * ```typescript + * const run = await agent.stream_v2({ + * messages: [{ role: "user", content: "What's the weather in Paris?" }], + * }); + * + * // Stream all messages + * for await (const msg of run.messages) { + * for await (const token of msg.text) { + * process.stdout.write(token); + * } + * } + * + * // Observe tool calls + * for await (const call of run.toolCalls) { + * console.log(`Tool: ${call.name}`, call.input); + * console.log(`Result:`, await call.output); + * } + * + * // Get final state + * const state = await run.output; + * ``` + */ + async stream_v2( + state: InvokeStateParameter, + config?: InvokeConfiguration< + InferContextInput< + Types["Context"] extends AnyAnnotationRoot | InteropZodObject + ? Types["Context"] + : AnyAnnotationRoot + > & + InferMiddlewareContextInputs + > & { + transformers?: ReadonlyArray<() => StreamTransformer>; + } + ): Promise< + AgentRunStream< + MergedAgentState, + Types["Tools"], + Types["Middleware"], + InferStreamExtensions + > + > { + type FullState = MergedAgentState; + + const { transformers: callSiteTransformers, ...restConfig } = config ?? {}; + const mergedConfig = mergeConfigs(this.#defaultConfig, restConfig); + const initializedState = await this.#initializeMiddlewareStates( + state, + mergedConfig as RunnableConfig + ); + + return (await this.#graph.stream_v2(initializedState, { + ...(mergedConfig as Record), + transformers: callSiteTransformers, + })) as unknown as AgentRunStream< + FullState, + Types["Tools"], + Types["Middleware"], + InferStreamExtensions + >; + } + /** * Visualize the graph as a PNG image. * @param params - Parameters for the drawMermaidPng method. diff --git a/libs/langchain/src/agents/index.ts b/libs/langchain/src/agents/index.ts index 63ae854a8dcd..49177fd8e056 100644 --- a/libs/langchain/src/agents/index.ts +++ b/libs/langchain/src/agents/index.ts @@ -4,7 +4,10 @@ import type { InteropZodType, } from "@langchain/core/utils/types"; import type { ClientTool, ServerTool } from "@langchain/core/tools"; -import type { StateDefinitionInit } from "@langchain/langgraph"; +import type { + StateDefinitionInit, + StreamTransformer, +} from "@langchain/langgraph"; import type { ResponseFormatUndefined } from "./responses.js"; import type { @@ -177,6 +180,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -187,6 +193,7 @@ export function createAgent< responseFormat: InteropZodType; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -194,7 +201,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -210,6 +218,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< ExtractZodArrayTypes extends Record @@ -222,6 +233,7 @@ export function createAgent< responseFormat: StructuredResponseFormat; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -231,7 +243,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -246,6 +259,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< Record, @@ -256,6 +272,7 @@ export function createAgent< responseFormat: JsonSchemaFormat; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -263,7 +280,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -278,6 +296,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< Record, @@ -288,6 +309,7 @@ export function createAgent< responseFormat: JsonSchemaFormat[]; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -295,7 +317,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -310,6 +333,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< Record, @@ -320,6 +346,7 @@ export function createAgent< responseFormat: JsonSchemaFormat | JsonSchemaFormat[]; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -327,7 +354,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -342,6 +370,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< Record, @@ -352,6 +383,7 @@ export function createAgent< responseFormat: SerializableSchema; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -359,7 +391,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -374,6 +407,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< Record, @@ -384,6 +420,7 @@ export function createAgent< responseFormat: SerializableSchema[]; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -391,7 +428,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -407,6 +445,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -417,6 +458,7 @@ export function createAgent< responseFormat: TypedToolStrategy; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -424,7 +466,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -440,6 +483,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -450,6 +496,7 @@ export function createAgent< responseFormat: ToolStrategy; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -457,7 +504,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -473,6 +521,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -483,6 +534,7 @@ export function createAgent< responseFormat: ProviderStrategy; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -490,7 +542,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -505,6 +558,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: Omit< CreateAgentParams< @@ -514,14 +570,19 @@ export function createAgent< never >, "responseFormat" - > & { middleware?: TMiddleware; tools?: TTools } + > & { + middleware?: TMiddleware; + tools?: TTools; + streamTransformers?: TStreamTransformers; + } ): ReactAgent< AgentTypeConfig< ResponseFormatUndefined, TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -536,6 +597,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: Omit< CreateAgentParams< @@ -549,6 +613,7 @@ export function createAgent< responseFormat?: undefined; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -556,7 +621,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -572,6 +638,9 @@ export function createAgent< | ClientTool | ServerTool )[], + const TStreamTransformers extends ReadonlyArray< + () => StreamTransformer + > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -582,6 +651,7 @@ export function createAgent< responseFormat: ResponseFormat; middleware?: TMiddleware; tools?: TTools; + streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -589,7 +659,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > >; @@ -603,6 +674,8 @@ export function createAgent< | ClientTool | ServerTool )[], + TStreamTransformers extends ReadonlyArray<() => StreamTransformer> = + readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -616,7 +689,8 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools + CombineTools, + TStreamTransformers > > { return new ReactAgent(params); @@ -642,3 +716,14 @@ export { MIDDLEWARE_BRAND } from "./middleware/types.js"; export type * from "./middleware/types.js"; export { FakeToolCallingModel } from "./tests/utils.js"; export type { ReactAgent } from "./ReactAgent.js"; +export { + createToolCallTransformer, + createMiddlewareTransformer, +} from "./stream.js"; +export type { + AgentRunStream, + MiddlewarePhase, + MiddlewareEvent, + MiddlewareEventUnion, + ToolCallStreamUnion, +} from "./stream.js"; diff --git a/libs/langchain/src/agents/stream.ts b/libs/langchain/src/agents/stream.ts new file mode 100644 index 000000000000..03ce213085c3 --- /dev/null +++ b/libs/langchain/src/agents/stream.ts @@ -0,0 +1,406 @@ +/* oxlint-disable @typescript-eslint/no-explicit-any */ + +/** + * Agent-level streaming support (experimental). + * + * Provides native stream transformer factories for tool calls and + * middleware events. When marked `__native: true`, their projections + * are assigned directly onto the `GraphRunStream` instance by + * `createGraphRunStream` in langgraph-core — no subclass or wrapper + * needed. + * + * See protocol proposal §15 (In-Process Streaming Interface) and §16 + * (Native Stream Transformers). + */ + +import { + GraphRunStream, + EventLog, + type NativeStreamTransformer, + type ProtocolEvent, + type StreamTransformer, + type ToolCallStream, + type ToolCallStatus, + type ToolsEventData, + type UpdatesEventData, + type Namespace, +} from "@langchain/langgraph"; +import type { + ClientTool, + ServerTool, + DynamicStructuredTool, + StructuredToolInterface, +} from "@langchain/core/tools"; +import type { + AgentMiddleware, + InferMiddlewareState, +} from "./middleware/types.js"; + +/** + * Infers the merged extensions shape from a tuple of stream transformer + * factories. Mirrors `InferExtensions` from `@langchain/langgraph`, which + * is not exported from the package's public surface. + * + * Given `[() => StreamTransformer<{ a: number }>, () => StreamTransformer<{ b: string }>]`, + * produces `{ a: number } & { b: string }`. + */ +export type InferStreamExtensions< + T extends ReadonlyArray<() => StreamTransformer>, +> = T extends readonly [] + ? Record + : T extends readonly [ + () => StreamTransformer, + ...infer Rest extends ReadonlyArray<() => StreamTransformer>, + ] + ? P & InferStreamExtensions + : Record; + +/** Extract the literal `name` string from a tool type. */ +type ToolNameOf = T extends { name: infer N extends string } ? N : string; + +/** Extract the parsed input type from a tool type. */ +type ToolInputOf = + T extends DynamicStructuredTool + ? SchemaInputT + : T extends StructuredToolInterface + ? SchemaInputT + : unknown; + +/** Extract the return/output type from a tool type. */ +type ToolOutputOf = + T extends DynamicStructuredTool + ? ToolOutputT + : T extends StructuredToolInterface + ? ToolOutputT + : unknown; + +/** + * Discriminated union of {@link ToolCallStream} variants, one per tool + * in `TTools`. Enables TypeScript to narrow `.input` and `.output` + * when the consumer checks `call.name === "someToolName"`. + * + * Falls back to `ToolCallStream` (untyped) when the tools tuple is a + * plain `(ClientTool | ServerTool)[]` without literal name types. + */ +export type ToolCallStreamUnion< + TTools extends readonly (ClientTool | ServerTool)[], +> = { + [K in keyof TTools]: ToolCallStream< + ToolNameOf, + ToolInputOf, + ToolOutputOf + >; +}[number]; + +/** + * Lifecycle phase that a middleware hook occupies within an agent turn. + */ +export type MiddlewarePhase = + | "before_agent" + | "before_model" + | "after_model" + | "after_agent"; + +/** + * Represents a single middleware lifecycle event observed during an + * agent run. Emitted by the middleware transformer. + * + * @typeParam TStateDelta - Shape of the state delta produced by this + * middleware. Defaults to `Record` when the + * middleware tuple is not typed. + */ +export interface MiddlewareEvent> { + phase: MiddlewarePhase; + name: string; + stateDelta: TStateDelta; + timestamp: number; +} + +/** + * Discriminated union of {@link MiddlewareEvent} variants, one per + * middleware in `TMiddleware`. When the middleware array is typed, + * `event.stateDelta` narrows to the middleware's inferred state type. + * + * Falls back to `MiddlewareEvent` (untyped) when the middleware array + * is a plain `AgentMiddleware[]`. + */ +export type MiddlewareEventUnion< + TMiddleware extends readonly AgentMiddleware[], +> = { + [K in keyof TMiddleware]: TMiddleware[K] extends AgentMiddleware + ? MiddlewareEvent> + : MiddlewareEvent; +}[number]; + +/** + * A {@link GraphRunStream} with native agent-level projections assigned + * directly on the instance by `createGraphRunStream` (via `__native` + * transformers). + * + * This is a pure type overlay — no runtime subclass exists. Use the + * `AgentRunStream` type when you need to describe the return type of + * `stream_v2()`. + * + * @typeParam TValues - Shape of the graph's state values. + * @typeParam TTools - Tuple of tools registered on the agent, used to type + * the per-tool `toolCalls` discriminated union. + * @typeParam TMiddleware - Tuple of middleware registered on the agent, used + * to type the per-middleware `middleware` event union. + * @typeParam TExtensions - Shape of `run.extensions` produced by user-supplied + * stream transformer factories. Derived via + * `InferExtensions`. + */ +export type AgentRunStream< + TValues = Record, + TTools extends readonly (ClientTool | ServerTool)[] = readonly ( + | ClientTool + | ServerTool + )[], + TMiddleware extends readonly AgentMiddleware[] = readonly AgentMiddleware[], + TExtensions extends Record = Record, +> = GraphRunStream & { + /** Tool call streams from the native ToolCallTransformer. */ + toolCalls: AsyncIterable>; + /** Middleware lifecycle events from the native MiddlewareTransformer. */ + middleware: AsyncIterable>; +}; + +interface ToolCallProjection { + toolCalls: AsyncIterable; +} + +/** + * Returns true when `ns` belongs to the agent's own graph — i.e. it + * starts with `path` and is at most one level deeper (the agent's + * internal nodes like `tools`, `model_request`, etc.). + * + * Events from subagent subgraphs (two or more levels deeper) are + * excluded, so `run.toolCalls` / `run.middleware` only show events + * from the agent itself, not from its subagents. + */ +function isOwnEvent(ns: Namespace, path: Namespace): boolean { + if (ns.length < path.length || ns.length > path.length + 1) return false; + for (let i = 0; i < path.length; i += 1) { + if (ns[i] !== path[i]) return false; + } + return true; +} + +/** + * Creates a native transformer that correlates `tools` channel events + * into per-call {@link ToolCallStream} objects. + * + * Marked `__native: true` — projection keys land directly on the + * `GraphRunStream` instance as `run.toolCalls`. + */ +export function createToolCallTransformer( + path: Namespace +): () => NativeStreamTransformer { + return () => { + const toolCallsLog = new EventLog(); + + const pendingCalls = new Map< + string, + { + resolveOutput: (v: unknown) => void; + rejectOutput: (e: unknown) => void; + resolveStatus: (v: ToolCallStatus) => void; + resolveError: (v: string | undefined) => void; + } + >(); + + function createToolCallEntry( + callId: string, + name: string, + rawInput: unknown + ): void { + if (pendingCalls.has(callId)) return; + const input = + typeof rawInput === "string" ? JSON.parse(rawInput) : rawInput; + + let resolveOutput!: (v: unknown) => void; + let rejectOutput!: (e: unknown) => void; + let resolveStatus!: (v: ToolCallStatus) => void; + let resolveError!: (v: string | undefined) => void; + + const output = new Promise((res, rej) => { + resolveOutput = res; + rejectOutput = rej; + }); + const status = new Promise((res) => { + resolveStatus = res; + }); + const error = new Promise((res) => { + resolveError = res; + }); + + pendingCalls.set(callId, { + resolveOutput, + rejectOutput, + resolveStatus, + resolveError, + }); + + toolCallsLog.push({ + name, + callId, + input, + output, + status, + error, + } as ToolCallStream); + } + + return { + __native: true as const, + + init: () => ({ + toolCalls: toolCallsLog.toAsyncIterable(), + }), + + process(event: ProtocolEvent): boolean { + /** + * Only process events that are at the same depth as the agent's graph. + */ + if (!isOwnEvent(event.params.namespace, path)) return true; + + if (event.method === "messages") { + const data = event.params.data as Record; + if (data.event === "content-block-finish") { + const cb = (data.contentBlock ?? data.content_block) as + | Record + | undefined; + if (cb?.type === "tool_call") { + createToolCallEntry( + String(cb.id ?? ""), + String(cb.name ?? ""), + cb.args ?? cb.input + ); + } + } + } + + if (event.method === "tools") { + const data = event.params.data as ToolsEventData; + const toolCallId = (data as Record) + .tool_call_id as string; + + if (data.event === "tool-started") { + createToolCallEntry( + toolCallId, + ((data as Record).tool_name as string) ?? + "unknown", + (data as Record).input + ); + } + + const pending = toolCallId ? pendingCalls.get(toolCallId) : undefined; + + if (pending) { + if (data.event === "tool-finished") { + pending.resolveOutput((data as Record).output); + pending.resolveStatus("finished"); + pending.resolveError(undefined); + pendingCalls.delete(toolCallId); + } else if (data.event === "tool-error") { + const message = + ((data as Record).message as string) ?? + "unknown error"; + pending.rejectOutput(new Error(message)); + pending.resolveStatus("error"); + pending.resolveError(message); + pendingCalls.delete(toolCallId); + } + } + } + + return true; + }, + + finalize(): void { + for (const pending of pendingCalls.values()) { + pending.resolveStatus("finished"); + pending.resolveError(undefined); + pending.resolveOutput(undefined); + } + pendingCalls.clear(); + toolCallsLog.close(); + }, + + fail(err: unknown): void { + for (const pending of pendingCalls.values()) { + pending.resolveStatus("error"); + pending.resolveError( + err instanceof Error ? err.message : String(err) + ); + pending.rejectOutput(err); + } + pendingCalls.clear(); + toolCallsLog.fail(err); + }, + }; + }; +} + +interface MiddlewareProjection { + middleware: AsyncIterable; +} + +const MIDDLEWARE_NODE_PATTERN = + /^(.+)\.(before_agent|before_model|after_model|after_agent)$/; + +/** + * Creates a native transformer that watches `updates` events from + * middleware nodes and surfaces them as typed {@link MiddlewareEvent} + * objects. + * + * Marked `__native: true` — projection key lands directly on the + * `GraphRunStream` instance as `run.middleware`. + */ +export function createMiddlewareTransformer( + path: Namespace +): () => NativeStreamTransformer { + return () => { + const middlewareLog = new EventLog(); + + return { + __native: true as const, + + init: () => ({ + middleware: middlewareLog.toAsyncIterable(), + }), + + process(event: ProtocolEvent): boolean { + if (event.method !== "updates") return true; + if (!isOwnEvent(event.params.namespace, path)) return true; + + const data = event.params.data as UpdatesEventData; + const nodeName = data.node ?? event.params.node; + if (!nodeName) return true; + + const match = MIDDLEWARE_NODE_PATTERN.exec(nodeName); + if (!match) return true; + + const name = match[1]; + const phase = match[2] as MiddlewarePhase; + + middlewareLog.push({ + phase, + name, + stateDelta: data.values ?? {}, + timestamp: event.params.timestamp, + }); + + return true; + }, + + finalize(): void { + middlewareLog.close(); + }, + + fail(err: unknown): void { + middlewareLog.fail(err); + }, + }; + }; +} diff --git a/libs/langchain/src/agents/tests/stream.int.test.ts b/libs/langchain/src/agents/tests/stream.int.test.ts new file mode 100644 index 000000000000..77a073636d51 --- /dev/null +++ b/libs/langchain/src/agents/tests/stream.int.test.ts @@ -0,0 +1,298 @@ +import { z } from "zod/v3"; +import { describe, it, expect, beforeAll, afterAll } from "vitest"; +import { + createEmbedServer, + type ThreadSaver, +} from "@langchain/langgraph-api/experimental/embed"; +import { Hono } from "hono"; +import { cors } from "hono/cors"; +import { serve } from "@hono/node-server"; +import type { Pregel } from "@langchain/langgraph"; +import { MemorySaver } from "@langchain/langgraph-checkpoint"; +import { fakeModel } from "@langchain/core/testing"; +import { tool } from "@langchain/core/tools"; +import { AIMessage } from "@langchain/core/messages"; +import { Client } from "@langchain/langgraph-sdk"; + +import { createMiddleware, createAgent } from "../index.js"; + +const threads: ThreadSaver = (() => { + const THREADS: Record< + string, + { thread_id: string; metadata: Record } + > = {}; + + return { + get: async (id) => THREADS[id], + set: async (threadId, { metadata }) => { + THREADS[threadId] = { + thread_id: threadId, + metadata: { ...THREADS[threadId]?.metadata, ...metadata }, + }; + return THREADS[threadId]; + }, + delete: async (threadId) => { + delete THREADS[threadId]; + }, + }; +})(); + +const checkpointer = new MemorySaver(); +const addTool = tool( + (input: { a: number; b: number }) => `The sum is ${input.a + input.b}`, + { + name: "add", + description: "Adds two numbers", + schema: z.object({ a: z.number(), b: z.number() }), + } +); + +const minusTool = tool( + (input: { a: number; b: number }) => `The difference is ${input.a - input.b}`, + { + name: "minus", + description: "Subtracts two numbers", + schema: z.object({ a: z.number(), b: z.number() }), + } +); +const middlewareA = createMiddleware({ + name: "trackerA", + stateSchema: z.object({ + trackerState: z.string().default("init"), + }), + beforeModel: () => ({ trackerState: "before", before: true }), + afterModel: () => ({ trackerState: "after", after: true }), +}); + +const middlewareB = createMiddleware({ + name: "trackerB", + stateSchema: z.object({ + trackerState: z.string().default("init"), + }), + wrapModelCall: async (request, handler) => { + return await handler(request); + }, +}); + +const model = fakeModel() + .respondWithTools([ + { name: "add", args: { a: 3, b: 4 }, id: "call_1" }, + { name: "minus", args: { a: 3, b: 4 }, id: "call_2" }, + ]) + .respond(new AIMessage("The answer is 7 and the difference is 1.")); + +const agent = createAgent({ + model, + tools: [addTool, minusTool], + middleware: [middlewareA, middlewareB], + // oxlint-disable-next-line typescript/no-explicit-any +}) as unknown as Pregel; + +let httpServer: { close: () => void } | null = null; +let url: string | null = null; + +async function setup() { + const embedApp = createEmbedServer({ + graph: { agent }, + checkpointer, + threads, + }); + const app = new Hono(); + app.use("*", cors({ origin: "*", exposeHeaders: ["Content-Location"] })); + app.route("/", embedApp); + + await new Promise((resolve) => { + httpServer = serve({ fetch: app.fetch, port: 0 }, (info) => { + url = `http://localhost:${info.port}`; + console.log(`Mock server started at ${url}`); + resolve(); + }); + }); +} + +const ALL_CHANNELS = [ + "lifecycle", + "messages", + "tools", + "values", + "updates", + "custom", + "tasks", +] as const; + +async function collectAllEvents( + // oxlint-disable-next-line typescript/no-explicit-any + iterable: AsyncIterable +): Promise> { + const byChannel = new Map(); + for await (const event of iterable) { + const channel: string = event.method ?? "unknown"; + let list = byChannel.get(channel); + if (!list) { + list = []; + byChannel.set(channel, list); + } + list.push(event); + + if (channel === "lifecycle" && event.params?.namespace?.length === 0) { + const status = event.params?.data?.event; + if ( + status === "completed" || + status === "failed" || + status === "interrupted" + ) { + break; + } + } + } + return byChannel; +} + +beforeAll(setup); + +describe("stream_v2", () => { + it("should emit stream evebts for each tool and middleware invocation", async () => { + console.log("url", url); + const client = new Client({ apiUrl: url! }); + + const thread = await client.threads.create(); + const run = await client.threads.stream(thread.thread_id, { + assistantId: "agent", + }); + const subscription = await run.subscribe({ channels: [...ALL_CHANNELS] }); + + await run.run.input({ + input: { + messages: [{ role: "human", content: "What is 3+4 and 3-4?" }], + }, + config: { + configurable: { thread_id: thread.thread_id }, + }, + }); + + const eventsByChannel = await collectAllEvents(subscription); + await run.close(); + + // --- helpers to extract event data from protocol envelopes --- + // oxlint-disable-next-line typescript/no-explicit-any + const dataOf = (evt: any) => evt.params?.data; + // oxlint-disable-next-line typescript/no-explicit-any + const nodeOf = (evt: any) => evt.params?.node; + + // --- lifecycle: running → 2 tool spawns → completed --- + const lifecycle = eventsByChannel.get("lifecycle") ?? []; + expect(lifecycle.length).toBe(4); + expect(dataOf(lifecycle[0])).toMatchObject({ + event: "running", + graph_name: "agent", + }); + expect(dataOf(lifecycle[1])).toMatchObject({ + event: "spawned", + graph_name: "tools", + }); + expect(dataOf(lifecycle[2])).toMatchObject({ + event: "spawned", + graph_name: "tools", + }); + expect(dataOf(lifecycle[3])).toMatchObject({ + event: "completed", + graph_name: "agent", + }); + + // --- tools: started/finished for both add and minus --- + const tools = eventsByChannel.get("tools") ?? []; + expect(tools.length).toBe(4); + expect(dataOf(tools[0])).toMatchObject({ + event: "tool-started", + tool_call_id: "call_1", + tool_name: "add", + }); + expect(dataOf(tools[1])).toMatchObject({ + event: "tool-started", + tool_call_id: "call_2", + tool_name: "minus", + }); + expect(dataOf(tools[2])).toMatchObject({ + event: "tool-finished", + tool_call_id: "call_1", + output: expect.objectContaining({ + content: "The sum is 7", + name: "add", + }), + }); + expect(dataOf(tools[3])).toMatchObject({ + event: "tool-finished", + tool_call_id: "call_2", + output: expect.objectContaining({ + content: "The difference is -1", + name: "minus", + }), + }); + + // --- updates: verify node execution order and key state transitions --- + const updates = eventsByChannel.get("updates") ?? []; + expect(updates.length).toBe(8); + const updateNodes = updates.map(nodeOf); + expect(updateNodes).toEqual([ + "trackerA.before_model", + "model_request", + "trackerA.after_model", + "tools", + "tools", + "trackerA.before_model", + "model_request", + "trackerA.after_model", + ]); + + // first model_request produced tool calls + const firstModelUpdate = dataOf(updates[1]); + expect(firstModelUpdate.messages).toHaveLength(1); + expect(firstModelUpdate.messages[0].type).toBe("ai"); + expect(firstModelUpdate.messages[0].tool_calls).toEqual( + expect.arrayContaining([ + expect.objectContaining({ name: "add", id: "call_1" }), + expect.objectContaining({ name: "minus", id: "call_2" }), + ]) + ); + + // tool updates carry the correct results + expect(dataOf(updates[3]).messages[0]).toMatchObject({ + type: "tool", + content: "The sum is 7", + name: "add", + tool_call_id: "call_1", + }); + expect(dataOf(updates[4]).messages[0]).toMatchObject({ + type: "tool", + content: "The difference is -1", + name: "minus", + tool_call_id: "call_2", + }); + + // middleware state transitions are reflected + expect(dataOf(updates[0]).trackerState).toBe("before"); + expect(dataOf(updates[2]).trackerState).toBe("after"); + + // --- values: 8 state snapshots --- + const values = eventsByChannel.get("values") ?? []; + expect(values.length).toBe(8); + + // --- checkpoints: 9 checkpoint events --- + const checkpoints = eventsByChannel.get("checkpoints") ?? []; + expect(checkpoints.length).toBe(9); + + // --- tasks: 16 task events --- + const tasks = eventsByChannel.get("tasks") ?? []; + expect(tasks.length).toBe(16); + + // --- debug: 25 debug events --- + const debug = eventsByChannel.get("debug") ?? []; + expect(debug.length).toBe(25); + }); +}); + +afterAll(() => { + if (httpServer) { + httpServer.close(); + } +}); diff --git a/libs/langchain/src/agents/tests/stream.test-d.ts b/libs/langchain/src/agents/tests/stream.test-d.ts new file mode 100644 index 000000000000..cb481e67b044 --- /dev/null +++ b/libs/langchain/src/agents/tests/stream.test-d.ts @@ -0,0 +1,133 @@ +import { describe, it, expectTypeOf } from "vitest"; +import { z } from "zod/v3"; +import { AIMessage, HumanMessage } from "@langchain/core/messages"; +import { tool } from "@langchain/core/tools"; +import { fakeModel } from "@langchain/core/testing"; +import { StreamChannel, type StreamTransformer } from "@langchain/langgraph"; + +import { createAgent, createMiddleware } from "../index.js"; + +describe("stream_v2 types", () => { + it("should type tool calls as a discriminated union", async () => { + const addTool = tool( + (input: { a: number; b: number }) => `The sum is ${input.a + input.b}`, + { + name: "add", + description: "Adds two numbers", + schema: z.object({ a: z.number(), b: z.number() }), + } + ); + + const minusTool = tool( + (input: { a: number; b: number }) => + `The difference is ${input.a - input.b}`, + { + name: "minus", + description: "Subtracts two numbers", + schema: z.object({ a: z.number(), b: z.number() }), + } + ); + + const model = fakeModel() + .respondWithTools([ + { name: "add", args: { a: 3, b: 4 }, id: "call_1" }, + { name: "minus", args: { a: 3, b: 4 }, id: "call_2" }, + ]) + .respond(new AIMessage("The answer is 7.")); + + const agent = createAgent({ model, tools: [addTool, minusTool] }); + const run = await agent.stream_v2({ + messages: [new HumanMessage("What is 3 + 4?")], + }); + + for await (const call of run.toolCalls) { + expectTypeOf(call.name).toEqualTypeOf<"add" | "minus">(); + expectTypeOf(call.status).toEqualTypeOf< + Promise<"running" | "finished" | "error"> + >(); + if (call.name === "add") { + expectTypeOf(call.input).toEqualTypeOf<{ a: number; b: number }>(); + expectTypeOf(call.output).toEqualTypeOf>(); + } else if (call.name === "minus") { + expectTypeOf(call.input).toEqualTypeOf<{ a: number; b: number }>(); + expectTypeOf(call.output).toEqualTypeOf>(); + } + } + }); + + it("should type middleware events with inferred state delta", async () => { + const model = fakeModel().respond(new AIMessage("ok")); + + const tracker = createMiddleware({ + name: "tracker", + stateSchema: z.object({ + trackerState: z.string().default("init"), + }), + beforeModel: () => ({ trackerState: "before" }), + }); + + const agent = createAgent({ + model, + tools: [], + middleware: [tracker], + }); + + const run = await agent.stream_v2({ + messages: [new HumanMessage("hi")], + }); + + for await (const event of run.middleware) { + expectTypeOf(event.phase).toEqualTypeOf< + "before_model" | "after_model" | "before_agent" | "after_agent" + >(); + expectTypeOf(event.name).toEqualTypeOf(); + expectTypeOf(event.stateDelta).toEqualTypeOf<{ + trackerState: string; + }>(); + expectTypeOf(event.timestamp).toEqualTypeOf(); + } + }); + + it("should type run.extensions from streamTransformers registered at creation time", async () => { + const model = fakeModel().respond(new AIMessage("ok")); + + const eventCounter = (): StreamTransformer<{ + eventCount: StreamChannel; + }> => { + const eventCount = new StreamChannel("eventCount"); + return { + init: () => ({ eventCount }), + process() { + return true; + }, + }; + }; + + const methodTracker = (): StreamTransformer<{ + methods: StreamChannel; + }> => { + const methods = new StreamChannel("methods"); + return { + init: () => ({ methods }), + process() { + return true; + }, + }; + }; + + const agent = createAgent({ + model, + tools: [], + streamTransformers: [eventCounter, methodTracker], + }); + + const run = await agent.stream_v2({ + messages: [new HumanMessage("hi")], + }); + + expectTypeOf(run.extensions.eventCount).toEqualTypeOf< + StreamChannel + >(); + expectTypeOf(run.extensions.methods).toEqualTypeOf>(); + }); +}); diff --git a/libs/langchain/src/agents/tests/stream.test.ts b/libs/langchain/src/agents/tests/stream.test.ts new file mode 100644 index 000000000000..d205cdf9534c --- /dev/null +++ b/libs/langchain/src/agents/tests/stream.test.ts @@ -0,0 +1,417 @@ +import { describe, it, expect } from "vitest"; +import { z } from "zod/v3"; +import { AIMessage, HumanMessage } from "@langchain/core/messages"; +import { tool } from "@langchain/core/tools"; +import { fakeModel } from "@langchain/core/testing"; +import { StreamChannel, type StreamTransformer } from "@langchain/langgraph"; +import { MemorySaver } from "@langchain/langgraph-checkpoint"; + +import { createAgent, createMiddleware } from "../index.js"; +import { humanInTheLoopMiddleware } from "../middleware/hitl.js"; + +describe("stream_v2", () => { + it("should emit tool call streams for each tool invocation", async () => { + const addTool = tool( + (input: { a: number; b: number }) => `The sum is ${input.a + input.b}`, + { + name: "add", + description: "Adds two numbers", + schema: z.object({ a: z.number(), b: z.number() }), + } + ); + + const minusTool = tool( + (input: { a: number; b: number }) => + `The difference is ${input.a - input.b}`, + { + name: "minus", + description: "Subtracts two numbers", + schema: z.object({ a: z.number(), b: z.number() }), + } + ); + + const model = fakeModel() + .respondWithTools([ + { name: "add", args: { a: 3, b: 4 }, id: "call_1" }, + { name: "minus", args: { a: 3, b: 4 }, id: "call_2" }, + ]) + .respond(new AIMessage("The answer is 7.")); + + const agent = createAgent({ model, tools: [addTool, minusTool] }); + const run = await agent.stream_v2({ + messages: [new HumanMessage("What is 3 + 4?")], + }); + + const toolCalls: Array<{ + name: string; + callId: string; + input: unknown; + output: unknown; + status: string; + }> = []; + + for await (const call of run.toolCalls) { + toolCalls.push({ + name: call.name, + callId: call.callId, + input: call.input, + output: await call.output, + status: await call.status, + }); + } + + expect(toolCalls).toHaveLength(2); + expect(toolCalls[0].name).toBe("add"); + expect(toolCalls[0].callId).toBe("call_1"); + expect(toolCalls[0].status).toBe("finished"); + expect(toolCalls[0].input).toEqual({ a: 3, b: 4 }); + expect(toolCalls[0].output).toHaveProperty("content", "The sum is 7"); + }); + + it("should emit middleware events for before/after model hooks", async () => { + const model = fakeModel().respond(new AIMessage("hello back")); + + const testMiddleware = createMiddleware({ + name: "tracker", + stateSchema: z.object({ + trackerState: z.string().default("init"), + }), + beforeModel: () => ({ + trackerState: "before_model_ran", + }), + afterModel: () => ({ + trackerState: "after_model_ran", + }), + }); + + const agent = createAgent({ + model, + tools: [], + middleware: [testMiddleware], + }); + + const run = await agent.stream_v2({ + messages: [new HumanMessage("hello")], + }); + + const middlewareEvents: Array<{ + phase: string; + middlewareName: string; + }> = []; + + for await (const event of run.middleware) { + middlewareEvents.push({ + phase: event.phase, + middlewareName: event.name, + }); + } + + expect(middlewareEvents.length).toBeGreaterThanOrEqual(2); + + const phases = middlewareEvents.map((e) => e.phase); + expect(phases).toContain("before_model"); + expect(phases).toContain("after_model"); + + for (const event of middlewareEvents) { + expect(event.middlewareName).toBe("tracker"); + } + }); + + it("should stream messages alongside tool calls", async () => { + const searchTool = tool( + (input: { query: string }) => `Results for: ${input.query}`, + { + name: "search", + description: "Search the web", + schema: z.object({ query: z.string() }), + } + ); + + const model = fakeModel() + .respondWithTools([ + { name: "search", args: { query: "weather" }, id: "call_s1" }, + ]) + .respond(new AIMessage("The weather is sunny.")); + + const agent = createAgent({ model, tools: [searchTool] }); + const run = await agent.stream_v2({ + messages: [new HumanMessage("Search for weather")], + }); + + const [toolCallResults, finalState] = await Promise.all([ + (async () => { + const calls: string[] = []; + for await (const call of run.toolCalls) { + calls.push(call.name); + await call.output; + } + return calls; + })(), + run.output, + ]); + + expect(toolCallResults).toContain("search"); + expect(finalState).toBeDefined(); + expect(finalState.messages.length).toBeGreaterThanOrEqual(3); + }); + + it("should support parallel consumption of projections", async () => { + const multiplyTool = tool( + (input: { a: number; b: number }) => `${input.a * input.b}`, + { + name: "multiply", + description: "Multiplies two numbers", + schema: z.object({ a: z.number(), b: z.number() }), + } + ); + + const model = fakeModel() + .respondWithTools([ + { name: "multiply", args: { a: 6, b: 7 }, id: "call_m1" }, + ]) + .respond(new AIMessage("42")); + + const middleware = createMiddleware({ + name: "logger", + stateSchema: z.object({ + logState: z.string().default(""), + }), + beforeModel: () => ({ + logState: "before", + }), + }); + + const agent = createAgent({ + model, + tools: [multiplyTool], + middleware: [middleware], + }); + + const run = await agent.stream_v2({ + messages: [new HumanMessage("What is 6 * 7?")], + }); + + const [toolNames, middlewarePhases, output] = await Promise.all([ + (async () => { + const names: string[] = []; + for await (const call of run.toolCalls) { + names.push(call.name); + await call.output; + } + return names; + })(), + (async () => { + const phases: string[] = []; + for await (const event of run.middleware) { + phases.push(event.phase); + } + return phases; + })(), + run.output, + ]); + + expect(toolNames).toMatchInlineSnapshot(` + [ + "multiply", + ] + `); + expect(middlewarePhases).toMatchInlineSnapshot(` + [ + "before_model", + "before_model", + ] + `); + expect(output.messages).toHaveLength(3); + }); + + it("should resolve output with the final agent state", async () => { + const model = fakeModel().respond(new AIMessage("hi there")); + const agent = createAgent({ model, tools: [] }); + const run = await agent.stream_v2({ + messages: [new HumanMessage("hi")], + }); + + const state = await run.output; + + expect(state).toBeDefined(); + expect(state.messages).toBeDefined(); + expect(state.messages.length).toBeGreaterThanOrEqual(2); + }); + + it("should pass user-defined streamTransformers registered at creation time", async () => { + const model = fakeModel().respond(new AIMessage("ok")); + + const eventCounter = (): StreamTransformer<{ + eventCount: StreamChannel; + }> => { + const eventCount = new StreamChannel("eventCount"); + let count = 0; + + return { + init: () => ({ eventCount }), + process() { + count += 1; + eventCount.push(count); + return true; + }, + }; + }; + + const agent = createAgent({ + model, + tools: [], + streamTransformers: [eventCounter], + }); + + const run = await agent.stream_v2({ + messages: [new HumanMessage("hi")], + }); + + const counts: number[] = []; + for await (const c of run.extensions.eventCount as AsyncIterable) { + counts.push(c); + } + + expect(counts.length).toBeGreaterThan(0); + expect(counts[counts.length - 1]).toBe(counts.length); + }); + + it("should pass call-site transformers via stream_v2 config", async () => { + const model = fakeModel().respond(new AIMessage("ok")); + const agent = createAgent({ model, tools: [] }); + + const methodTracker = (): StreamTransformer<{ + methods: StreamChannel; + }> => { + const methods = new StreamChannel("methods"); + return { + init: () => ({ methods }), + process(event) { + methods.push(event.method); + return true; + }, + }; + }; + + const run = await agent.stream_v2( + { messages: [new HumanMessage("hi")] }, + { transformers: [methodTracker] } + ); + + const seenMethods: string[] = []; + for await (const m of run.extensions.methods as AsyncIterable) { + seenMethods.push(m); + } + + expect(seenMethods.length).toBeGreaterThan(0); + expect(seenMethods).toContain("values"); + }); + + it("should handle multiple tool calls in a single turn", async () => { + const addTool = tool( + (input: { a: number; b: number }) => `${input.a + input.b}`, + { + name: "add", + description: "Adds two numbers", + schema: z.object({ a: z.number(), b: z.number() }), + } + ); + + const model = fakeModel() + .respondWithTools([ + { name: "add", args: { a: 1, b: 2 }, id: "call_a" }, + { name: "add", args: { a: 3, b: 4 }, id: "call_b" }, + ]) + .respond(new AIMessage("Done: 3 and 7")); + + const agent = createAgent({ model, tools: [addTool] }); + const run = await agent.stream_v2({ + messages: [new HumanMessage("Add 1+2 and 3+4")], + }); + + const toolCalls: Array<{ name: string; callId: string; output: unknown }> = + []; + + for await (const call of run.toolCalls) { + toolCalls.push({ + name: call.name, + callId: call.callId, + output: await call.output, + }); + } + + expect(toolCalls).toHaveLength(2); + const ids = toolCalls.map((c) => c.callId).sort(); + expect(ids).toEqual(["call_a", "call_b"]); + }); + + it("should expose interrupted flag when HITL middleware triggers an interrupt", async () => { + const writeFileTool = tool( + (input: { filename: string; content: string }) => + `Wrote ${input.content.length} chars to ${input.filename}`, + { + name: "write_file", + description: "Write content to a file", + schema: z.object({ + filename: z.string(), + content: z.string(), + }), + } + ); + + const hitl = humanInTheLoopMiddleware({ + interruptOn: { + write_file: { allowedDecisions: ["approve"] }, + }, + }); + + const model = fakeModel() + .respondWithTools([ + { + name: "write_file", + args: { filename: "test.txt", content: "hello" }, + id: "call_w1", + }, + ]) + .respond(new AIMessage("Done writing.")); + + const checkpointer = new MemorySaver(); + const agent = createAgent({ + model, + tools: [writeFileTool], + middleware: [hitl], + checkpointer, + }); + + const config = { configurable: { thread_id: "hitl-stream-test" } }; + + const run = await agent.stream_v2( + { messages: [new HumanMessage("Write hello to test.txt")] }, + config + ); + + const state = await run.output; + expect(state).toBeDefined(); + expect(run.interrupted).toBe(true); + expect(run.interrupts.length).toBeGreaterThanOrEqual(1); + expect(run.interrupts).toEqual([ + expect.objectContaining({ + payload: { + actionRequests: [ + { + args: { content: "hello", filename: "test.txt" }, + description: expect.stringContaining("write_file"), + name: "write_file", + }, + ], + reviewConfigs: [ + { + actionName: "write_file", + allowedDecisions: ["approve"], + }, + ], + }, + }), + ]); + }); +}); diff --git a/libs/langchain/src/agents/types.ts b/libs/langchain/src/agents/types.ts index 5f23acbac371..2edb4d72281f 100644 --- a/libs/langchain/src/agents/types.ts +++ b/libs/langchain/src/agents/types.ts @@ -8,6 +8,7 @@ import type { END, StateGraph, StateDefinitionInit, + StreamTransformer, } from "@langchain/langgraph"; import type { @@ -66,6 +67,10 @@ import type { JumpToTarget } from "./constants.js"; * @typeParam TTools - The combined tools type from both `createAgent` tools parameter * and middleware tools. This is a readonly array of `ClientTool | ServerTool`. * + * @typeParam TStreamTransformers - The tuple of user-supplied stream transformer + * factories registered at `createAgent({ streamTransformers })`. Used to type + * `run.extensions` on the stream returned from `stream_v2()`. + * * @example * ```typescript * // Define a type configuration @@ -74,7 +79,8 @@ import type { JumpToTarget } from "./constants.js"; * typeof MyStateSchema, // State schema * typeof MyContextSchema, // Context schema * typeof myMiddleware, // Middleware array - * typeof myTools // Tools array + * typeof myTools, // Tools array + * typeof myStreamTransformers // Stream transformer factories * >; * * // Use with ReactAgent @@ -96,6 +102,8 @@ export interface AgentTypeConfig< | ClientTool | ServerTool )[], + TStreamTransformers extends ReadonlyArray<() => StreamTransformer> = + ReadonlyArray<() => StreamTransformer>, > { /** The structured response type when using `responseFormat` */ Response: TResponse; @@ -107,6 +115,12 @@ export interface AgentTypeConfig< Middleware: TMiddleware; /** The combined tools type from agent and middleware */ Tools: TTools; + /** + * The tuple of stream transformer factories registered at + * `createAgent({ streamTransformers })`. Used to infer the shape of + * `run.extensions` on the stream returned by `stream_v2()`. + */ + StreamTransformers: TStreamTransformers; } /** @@ -119,6 +133,7 @@ export interface DefaultAgentTypeConfig extends AgentTypeConfig { Context: AnyAnnotationRoot; Middleware: readonly AgentMiddleware[]; Tools: readonly (ClientTool | ServerTool)[]; + StreamTransformers: readonly []; } /** @@ -371,6 +386,25 @@ export type InferAgentMiddleware = InferAgentType; */ export type InferAgentTools = InferAgentType; +/** + * Shorthand helper to extract the StreamTransformers type (the tuple of + * transformer factories) from an AgentTypeConfig or ReactAgent. + * + * @example + * ```typescript + * const agent = createAgent({ + * streamTransformers: [costTracker, methodTracker], + * // ... + * }); + * type STF = InferAgentStreamTransformers; + * // readonly [typeof costTracker, typeof methodTracker] + * ``` + */ +export type InferAgentStreamTransformers = InferAgentType< + T, + "StreamTransformers" +>; + export type N = typeof START | "model_request" | "tools"; /** @@ -805,6 +839,42 @@ export type CreateAgentParams< * @default `"v2"` */ version?: "v1" | "v2"; + + /** + * Stream transformer factories baked into the compiled graph. These run + * automatically for every `stream_v2()` call, after the built-in + * agent transformers (tool calls, middleware) and before any call-site + * transformers passed via `stream_v2(input, { transformers })`. + * + * Use this to add domain-specific streaming projections that should always + * be available on the agent's run stream. The projection values are + * accessible via `run.extensions`. + * + * @example + * ```typescript + * import { StreamChannel } from "@langchain/langgraph"; + * + * const costTracker = () => ({ + * init: () => ({ cost: new StreamChannel("cost") }), + * process(event) { + * // track token costs... + * return true; + * }, + * }); + * + * const agent = createAgent({ + * model: "openai:gpt-4o", + * tools: [myTool], + * streamTransformers: [costTracker], + * }); + * + * const run = await agent.stream_v2({ messages }); + * for await (const c of run.extensions.cost) { + * console.log("cost delta:", c); + * } + * ``` + */ + streamTransformers?: ReadonlyArray<() => StreamTransformer>; }; /** diff --git a/libs/langchain/src/load/import_map.ts b/libs/langchain/src/load/import_map.ts index 8d1bdad8b1f0..2e02a169f4c0 100644 --- a/libs/langchain/src/load/import_map.ts +++ b/libs/langchain/src/load/import_map.ts @@ -7,6 +7,7 @@ export * as load__serializable from "../load/serializable.js"; export * as storage__encoder_backed from "../storage/encoder_backed.js"; export * as storage__file_system from "../storage/file_system.js"; export * as storage__in_memory from "../storage/in_memory.js"; +export * as tools from "../tools/index.js"; import { PromptTemplate, AIMessagePromptTemplate, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9c81e2e6bd15..f151423c620c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,7 +51,7 @@ importers: version: 0.6.0(encoding@0.1.13) '@changesets/cli': specifier: ^2.30.0 - version: 2.30.0(@types/node@25.5.0) + version: 2.31.0(@types/node@25.6.0) '@langchain/build': specifier: workspace:* version: link:internal/build @@ -72,7 +72,7 @@ importers: version: 14.0.3 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 lint-staged: specifier: ^16.4.0 version: 16.4.0 @@ -81,19 +81,19 @@ importers: version: 0.43.0 oxlint: specifier: ^1.58.0 - version: 1.58.0 + version: 1.61.0 semver: specifier: ^7.7.4 version: 7.7.4 tsdown: specifier: ^0.21.7 - version: 0.21.7(@arethetypeswrong/core@0.18.2)(@typescript/native-preview@7.0.0-dev.20260405.1)(publint@0.3.17)(synckit@0.11.12)(typescript@5.9.3)(unplugin-unused@0.5.7) + version: 0.21.9(@arethetypeswrong/core@0.18.2)(@typescript/native-preview@7.0.0-dev.20260421.2)(publint@0.3.18)(synckit@0.11.12)(typescript@5.9.3)(unplugin-unused@0.5.7) tsx: specifier: ^4.21.0 version: 4.21.0 turbo: specifier: ^2.9.3 - version: 2.9.4 + version: 2.9.6 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -102,19 +102,19 @@ importers: dependencies: '@aws-sdk/dsql-signer': specifier: ^3.1022.0 - version: 3.1024.0 + version: 3.1034.0 '@azure/identity': specifier: ^4.13.1 version: 4.13.1 '@browserbasehq/stagehand': specifier: ^3.2.0 - version: 3.2.0(@cfworker/json-schema@4.1.1)(deepmerge@4.3.1)(encoding@0.1.13)(zod@4.3.6) + version: 3.2.1(@cfworker/json-schema@4.1.1)(deepmerge@4.3.1)(encoding@0.1.13)(zod@4.3.6) '@clickhouse/client': specifier: ^1.18.2 - version: 1.18.2 + version: 1.18.3 '@cloudflare/workers-types': specifier: ^4.20260402.1 - version: 4.20260405.1 + version: 4.20260422.1 '@elastic/elasticsearch': specifier: ^9.3.4 version: 9.3.4 @@ -183,7 +183,7 @@ importers: version: link:../libs/providers/langchain-groq '@langchain/langgraph': specifier: ^1.2.9 - version: 1.2.9(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + version: 1.2.9(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/mistralai': specifier: workspace:* version: link:../libs/providers/langchain-mistralai @@ -216,22 +216,22 @@ importers: version: 3.5.1 '@pinecone-database/pinecone': specifier: ^7.1.0 - version: 7.1.0 + version: 7.2.0 '@planetscale/database': specifier: ^1.20.1 version: 1.20.1 '@prisma/client': specifier: ^7.6.0 - version: 7.6.0(prisma@7.6.0(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(typescript@6.0.2))(typescript@6.0.2) + version: 7.7.0(prisma@7.7.0(@types/react@19.2.14)(better-sqlite3@12.9.0)(magicast@0.3.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@6.0.3))(typescript@6.0.3) '@qdrant/js-client-rest': specifier: ^1.17.0 - version: 1.17.0(typescript@6.0.2) + version: 1.17.0(typescript@6.0.3) '@rockset/client': specifier: ^0.9.2 version: 0.9.2(encoding@0.1.13) '@supabase/supabase-js': specifier: ^2.101.1 - version: 2.101.1(bufferutil@4.1.0) + version: 2.104.0(bufferutil@4.1.0) '@tensorflow/tfjs-backend-cpu': specifier: ^4.22.0 version: 4.22.0(@tensorflow/tfjs-core@4.22.0(encoding@0.1.13)) @@ -264,34 +264,34 @@ importers: version: 3.0.0 '@vitest/coverage-v8': specifier: ^4.1.2 - version: 4.1.2(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 4.1.5(vitest@4.1.5) '@xata.io/client': specifier: ^0.30.1 - version: 0.30.1(typescript@6.0.2) + version: 0.30.1(typescript@6.0.3) '@zilliz/milvus2-sdk-node': specifier: ^2.6.12 version: 2.6.13(bufferutil@4.1.0) axios: specifier: '>=0.30.3' - version: 1.15.0(debug@4.4.3) + version: 1.15.2(debug@4.4.3) cheerio: specifier: 1.2.0 version: 1.2.0 chromadb: specifier: ^3.4.0 - version: 3.4.0 + version: 3.4.3 cohere-ai: specifier: ^8.0.0 - version: 8.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-providers@3.985.0)(@smithy/protocol-http@5.3.12)(@smithy/signature-v4@5.3.12) + version: 8.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-providers@3.1034.0)(@smithy/protocol-http@5.3.14)(@smithy/signature-v4@5.3.14) convex: specifier: ^1.34.1 - version: 1.34.1(bufferutil@4.1.0)(react@19.0.0) + version: 1.36.0(bufferutil@4.1.0)(react@19.2.5) date-fns: specifier: ^4.1.0 version: 4.1.0 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^4.0.1 version: 4.0.1 @@ -303,7 +303,7 @@ importers: version: 2.11.0(encoding@0.1.13)(ws@5.2.4(bufferutil@4.1.0)) firebase-admin: specifier: ^13.7.0 - version: 13.7.0(encoding@0.1.13) + version: 13.8.0(encoding@0.1.13) graphql: specifier: ^16.13.2 version: 16.13.2 @@ -321,25 +321,25 @@ importers: version: link:../libs/langchain langsmith: specifier: ^0.5.19 - version: 0.5.19(@opentelemetry/api@1.9.0)(openai@6.33.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6))(ws@5.2.4(bufferutil@4.1.0)) + version: 0.5.21(@opentelemetry/api@1.9.1)(openai@6.34.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6))(ws@5.2.4(bufferutil@4.1.0)) lorem-ipsum: specifier: ^2.0.8 version: 2.0.8 lunary: specifier: ^0.8.8 - version: 0.8.8(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(openai@6.33.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6))(react@19.0.0) + version: 0.8.8(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(openai@6.34.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6))(react@19.2.5) mariadb: specifier: ^3.5.2 version: 3.5.2 mem0ai: specifier: ^2.4.5 - version: 2.4.5(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(@azure/identity@4.13.1)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260405.1)(@google/genai@1.40.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0))(@langchain/core@libs+langchain-core)(@mistralai/mistralai@1.15.1(bufferutil@4.1.0))(@qdrant/js-client-rest@1.17.0(typescript@6.0.2))(@supabase/supabase-js@2.101.1(bufferutil@4.1.0))(@types/jest@30.0.0)(@types/pg@8.20.0)(better-sqlite3@12.6.2)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@1.1.2)(neo4j-driver@6.0.1)(ollama@0.6.3)(pg@8.20.0)(redis@5.11.0)(ws@5.2.4(bufferutil@4.1.0)) + version: 2.4.6(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(@azure/identity@4.13.1)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260422.1)(@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0))(@langchain/core@libs+langchain-core)(@mistralai/mistralai@1.15.1(bufferutil@4.1.0))(@qdrant/js-client-rest@1.17.0(typescript@6.0.3))(@supabase/supabase-js@2.104.0(bufferutil@4.1.0))(@types/jest@30.0.0)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@1.1.2)(neo4j-driver@6.0.1)(ollama@0.6.3)(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ws@5.2.4(bufferutil@4.1.0)) mongodb: specifier: ^7.1.1 - version: 7.1.1(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7) + version: 7.2.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7) openai: specifier: ^6.33.0 - version: 6.33.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6) + version: 6.34.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6) peggy: specifier: ^5.1.0 version: 5.1.0 @@ -351,22 +351,22 @@ importers: version: 0.2.1 prisma: specifier: ^7.6.0 - version: 7.6.0(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(typescript@6.0.2) + version: 7.7.0(@types/react@19.2.14)(better-sqlite3@12.9.0)(magicast@0.3.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@6.0.3) readline: specifier: ^1.3.0 version: 1.3.0 redis: specifier: ^5.11.0 - version: 5.11.0 + version: 5.12.1(@opentelemetry/api@1.9.1) reflect-metadata: specifier: ^0.2.2 version: 0.2.2 release-it: specifier: ^19.2.4 - version: 19.2.4(@types/node@25.5.0)(magicast@0.3.5) + version: 19.2.4(@types/node@25.6.0)(magicast@0.3.5) release-it-pnpm: specifier: ^4.6.6 - version: 4.6.6(magicast@0.3.5)(release-it@19.2.4(@types/node@25.5.0)(magicast@0.3.5)) + version: 4.6.6(magicast@0.3.5)(release-it@19.2.4(@types/node@25.6.0)(magicast@0.3.5)) rimraf: specifier: ^6.1.3 version: 6.1.3 @@ -375,16 +375,16 @@ importers: version: 6.0.1 typescript: specifier: ~6.0.2 - version: 6.0.2 + version: 6.0.3 typesense: specifier: ^3.0.5 - version: 3.0.5(@babel/runtime@7.29.2) + version: 3.0.6(@babel/runtime@7.29.2) uuid: specifier: ^14.0.0 version: 14.0.0 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) voy-search: specifier: 0.6.3 version: 0.6.3 @@ -400,7 +400,7 @@ importers: version: 4.21.0 typeorm: specifier: ^0.3.28 - version: 0.3.28(better-sqlite3@12.6.2)(ioredis@5.10.1)(mongodb@7.1.1(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7))(mysql2@3.19.1(@types/node@25.5.0))(pg@8.20.0)(redis@5.11.0)(sqlite3@6.0.1)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@6.0.2)) + version: 0.3.28(better-sqlite3@12.9.0)(ioredis@5.10.1)(mongodb@7.2.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7))(mysql2@3.15.3)(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(sqlite3@6.0.1)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@6.0.3)) zod: specifier: ^4.3.6 version: 4.3.6 @@ -412,19 +412,19 @@ importers: version: 0.18.2 '@typescript/native-preview': specifier: ^7.0.0-dev.20260401.1 - version: 7.0.0-dev.20260405.1 + version: 7.0.0-dev.20260421.2 publint: specifier: ^0.3.15 - version: 0.3.17 + version: 0.3.18 rolldown: specifier: ^1.0.0-rc.4 - version: 1.0.0-rc.4 + version: 1.0.0-rc.16 tsdown: specifier: ^0.21.7 - version: 0.21.7(@arethetypeswrong/core@0.18.2)(@typescript/native-preview@7.0.0-dev.20260405.1)(publint@0.3.17)(synckit@0.11.12)(typescript@6.0.3)(unplugin-unused@0.5.7) + version: 0.21.9(@arethetypeswrong/core@0.18.2)(@typescript/native-preview@7.0.0-dev.20260421.2)(publint@0.3.18)(synckit@0.11.12)(typescript@6.0.3)(unplugin-unused@0.5.7) type-fest: specifier: ^5.3.0 - version: 5.4.4 + version: 5.6.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -441,7 +441,7 @@ importers: optionalDependencies: '@esbuild/win32-x64': specifier: '*' - version: 0.27.3 + version: 0.28.0 '@rolldown/binding-darwin-arm64': specifier: '*' version: 1.0.0-rc.18 @@ -471,7 +471,7 @@ importers: version: 1.0.0-rc.18 '@swc/core-win32-x64-msvc': specifier: '*' - version: 1.15.11 + version: 1.15.30 internal/model-profiles: dependencies: @@ -496,13 +496,13 @@ importers: version: 2.0.5 '@types/node': specifier: ^25.5.0 - version: 25.5.0 + version: 25.6.0 tsx: specifier: ^4.21.0 version: 4.21.0 vitest: specifier: ^4.1.5 - version: 4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) internal/standard-tests: dependencies: @@ -514,7 +514,7 @@ importers: version: link:../../libs/langchain-core vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) zod: specifier: ^4.3.6 version: 4.3.6 @@ -566,7 +566,7 @@ importers: version: 15.1.0 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 fast-glob: specifier: ^3.3.2 version: 3.3.3 @@ -589,18 +589,21 @@ importers: libs/langchain: dependencies: '@langchain/langgraph': - specifier: ^1.2.9 - version: 1.2.9(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/langgraph-checkpoint': specifier: ^1.0.1 version: 1.0.1(@langchain/core@libs+langchain-core) langsmith: specifier: '>=0.5.0 <1.0.0' - version: 0.5.19(@opentelemetry/api@1.9.0)(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)) + version: 0.5.21(@opentelemetry/api@1.9.1)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)) zod: specifier: ^3.25.76 || ^4 version: 4.3.6 devDependencies: + '@hono/node-server': + specifier: '>=1.19.10' + version: 2.0.0(hono@4.12.14) '@langchain/anthropic': specifier: workspace:* version: link:../providers/langchain-anthropic @@ -610,6 +613,12 @@ importers: '@langchain/fireworks': specifier: workspace:* version: link:../providers/langchain-fireworks + '@langchain/langgraph-api': + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0)) + '@langchain/langgraph-sdk': + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@langchain/openai': specifier: workspace:* version: link:../providers/langchain-openai @@ -633,19 +642,22 @@ importers: version: 8.18.1 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) cheerio: specifier: 1.2.0 version: 1.2.0 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 + hono: + specifier: '>=4.12.7' + version: 4.12.14 openai: specifier: ^6.22.0 - version: 6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) + version: 6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) peggy: specifier: ^5.1.0 version: 5.1.0 @@ -660,13 +672,13 @@ importers: version: 6.0.0 typeorm: specifier: ^0.3.28 - version: 0.3.28(better-sqlite3@12.6.2)(ioredis@5.10.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7))(mysql2@3.19.1(@types/node@25.5.0))(pg@8.20.0)(redis@5.11.0)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + version: 0.3.28(better-sqlite3@12.9.0)(ioredis@5.10.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7))(mysql2@3.15.3)(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) yaml: specifier: ^2.8.3 version: 2.8.3 @@ -700,19 +712,19 @@ importers: devDependencies: '@aws-sdk/dsql-signer': specifier: ^3.858.0 - version: 3.985.0 + version: 3.1034.0 '@azure/identity': specifier: ^4.12.0 - version: 4.13.0 + version: 4.13.1 '@browserbasehq/stagehand': specifier: ^1.3.0 - version: 1.14.0(@playwright/test@1.58.2)(bufferutil@4.1.0)(deepmerge@4.3.1)(dotenv@17.4.1)(encoding@0.1.13)(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(zod@4.3.6) + version: 1.14.0(@playwright/test@1.59.1)(bufferutil@4.1.0)(deepmerge@4.3.1)(dotenv@17.4.2)(encoding@0.1.13)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(zod@4.3.6) '@clickhouse/client': specifier: ^0.2.5 version: 0.2.10 '@cloudflare/workers-types': specifier: ^4.20260402.1 - version: 4.20260405.1 + version: 4.20260422.1 '@elastic/elasticsearch': specifier: ^8.4.0 version: 8.19.1 @@ -775,7 +787,7 @@ importers: version: link:../providers/langchain-groq '@langchain/langgraph': specifier: 1.0.0-alpha.5 - version: 1.0.0-alpha.5(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + version: 1.0.0-alpha.5(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/mistralai': specifier: workspace:* version: link:../providers/langchain-mistralai @@ -820,7 +832,7 @@ importers: version: 0.9.2(encoding@0.1.13) '@supabase/supabase-js': specifier: ^2.53.0 - version: 2.95.3(bufferutil@4.1.0) + version: 2.104.0(bufferutil@4.1.0) '@tensorflow/tfjs-backend-cpu': specifier: ^4.22.0 version: 4.22.0(@tensorflow/tfjs-core@4.22.0(encoding@0.1.13)) @@ -835,7 +847,7 @@ importers: version: 28.0.1 '@types/pg': specifier: ^8.15.5 - version: 8.16.0 + version: 8.20.0 '@types/uuid': specifier: ^9 version: 9.0.8 @@ -847,40 +859,40 @@ importers: version: 1.37.0 '@upstash/vector': specifier: ^1.2.2 - version: 1.2.2 + version: 1.2.3 '@vercel/kv': specifier: ^3.0.0 version: 3.0.0 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) '@xata.io/client': specifier: ^0.30.1 version: 0.30.1(typescript@5.8.3) '@zilliz/milvus2-sdk-node': specifier: ^2.3.5 - version: 2.6.9 + version: 2.6.13(bufferutil@4.1.0) axios: specifier: '>=0.30.3' - version: 1.15.0(debug@4.4.3) + version: 1.15.2(debug@4.4.3) cheerio: specifier: 1.2.0 version: 1.2.0 chromadb: specifier: ^1.5.3 - version: 1.10.5(@google/generative-ai@0.7.1)(cohere-ai@7.20.0)(encoding@0.1.13)(ollama@0.6.3)(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6)) + version: 1.10.5(@google/generative-ai@0.7.1)(cohere-ai@7.21.0)(encoding@0.1.13)(ollama@0.6.3)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6)) cohere-ai: specifier: ^7.14.0 - version: 7.20.0 + version: 7.21.0 convex: specifier: ^1.32.0 - version: 1.32.0(bufferutil@4.1.0)(react@19.0.0) + version: 1.36.0(bufferutil@4.1.0)(react@19.2.5) date-fns: specifier: ^4.1.0 version: 4.1.0 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -892,13 +904,13 @@ importers: version: 1.10.2(encoding@0.1.13)(ws@8.20.0(bufferutil@4.1.0)) firebase-admin: specifier: ^13.7.0 - version: 13.7.0(encoding@0.1.13) + version: 13.8.0(encoding@0.1.13) graphql: specifier: ^16.6.0 - version: 16.12.0 + version: 16.13.2 hdb: specifier: ^0.19.8 - version: 0.19.8 + version: 0.19.12 ioredis: specifier: ^5.10.1 version: 5.10.1 @@ -910,25 +922,25 @@ importers: version: 2.0.8 lunary: specifier: ^0.8.8 - version: 0.8.8(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(react@19.0.0) + version: 0.8.8(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(react@19.2.5) mariadb: specifier: ^3.5.1 version: 3.5.2 mem0ai: specifier: ^2.4.5 - version: 2.4.5(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(@azure/identity@4.13.0)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260405.1)(@google/genai@1.40.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0))(@langchain/core@libs+langchain-core)(@mistralai/mistralai@1.15.1(bufferutil@4.1.0))(@qdrant/js-client-rest@1.17.0(typescript@5.8.3))(@supabase/supabase-js@2.95.3(bufferutil@4.1.0))(@types/jest@30.0.0)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@1.1.2)(neo4j-driver@6.0.1)(ollama@0.6.3)(pg@8.18.0)(redis@4.7.1)(ws@8.20.0(bufferutil@4.1.0)) + version: 2.4.6(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(@azure/identity@4.13.1)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260422.1)(@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0))(@langchain/core@libs+langchain-core)(@mistralai/mistralai@1.15.1(bufferutil@4.1.0))(@qdrant/js-client-rest@1.17.0(typescript@5.8.3))(@supabase/supabase-js@2.104.0(bufferutil@4.1.0))(@types/jest@30.0.0)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@1.1.2)(neo4j-driver@6.0.1)(ollama@0.6.3)(pg@8.20.0)(redis@4.7.1)(ws@8.20.0(bufferutil@4.1.0)) mongodb: specifier: ^6.17.0 - version: 6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7) + version: 6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7) openai: specifier: ^6.22.0 - version: 6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) + version: 6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) peggy: specifier: ^5.1.0 version: 5.1.0 pg: specifier: ^8.16.3 - version: 8.18.0 + version: 8.20.0 pickleparser: specifier: ^0.2.1 version: 0.2.1 @@ -952,16 +964,16 @@ importers: version: 5.1.7 typeorm: specifier: ^0.3.28 - version: 0.3.28(better-sqlite3@12.6.2)(ioredis@5.10.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7))(mysql2@3.19.1(@types/node@25.5.0))(pg@8.18.0)(redis@4.7.1)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + version: 0.3.28(better-sqlite3@12.9.0)(ioredis@5.10.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7))(mysql2@3.15.3)(pg@8.20.0)(redis@4.7.1)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) typescript: specifier: ~5.8.3 version: 5.8.3 typesense: specifier: ^3.0.5 - version: 3.0.5(@babel/runtime@7.29.2) + version: 3.0.6(@babel/runtime@7.29.2) vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) voy-search: specifier: 0.6.3 version: 0.6.3 @@ -974,7 +986,7 @@ importers: optionalDependencies: langsmith: specifier: '>=0.4.0 <1.0.0' - version: 0.5.19(@opentelemetry/api@1.9.0)(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)) + version: 0.5.21(@opentelemetry/api@1.9.1)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)) libs/langchain-core: dependencies: @@ -998,7 +1010,7 @@ importers: version: 1.0.21 langsmith: specifier: '>=0.5.0 <1.0.0' - version: 0.5.19(@opentelemetry/api@1.9.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)) + version: 0.5.21(@opentelemetry/api@1.9.1)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)) mustache: specifier: ^4.2.0 version: 4.2.0 @@ -1020,19 +1032,19 @@ importers: version: 4.2.6 '@types/node': specifier: ^25.5.0 - version: 25.5.0 + version: 25.6.0 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 ml-matrix: specifier: ^6.10.4 - version: 6.12.1 + version: 6.12.2 rimraf: specifier: ^6.1.3 version: 6.1.3 @@ -1041,7 +1053,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) web-streams-polyfill: specifier: ^4.2.0 version: 4.2.0 @@ -1063,7 +1075,7 @@ importers: version: link:../langchain-core '@langchain/langgraph': specifier: ^1.0.0 - version: 1.1.4(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + version: 1.2.9(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/openai': specifier: workspace:* version: link:../providers/langchain-openai @@ -1081,13 +1093,13 @@ importers: version: 5.0.6 '@types/node': specifier: ^25.5.0 - version: 25.5.0 + version: 25.6.0 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1105,13 +1117,13 @@ importers: version: 8.0.4 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3) + version: 10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3) typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) optionalDependencies: extended-eventsource: specifier: ^1.7.0 @@ -1134,10 +1146,10 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1146,7 +1158,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-anthropic: dependencies: @@ -1177,10 +1189,10 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1192,26 +1204,26 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-aws: dependencies: '@aws-sdk/client-bedrock-agent-runtime': specifier: ^3.1022.0 - version: 3.1024.0 + version: 3.1034.0 '@aws-sdk/client-bedrock-runtime': specifier: ^3.1006.0 - version: 3.1006.0 + version: 3.1034.0 '@aws-sdk/client-kendra': specifier: ^3.1006.0 - version: 3.1006.0 + version: 3.1034.0 '@aws-sdk/credential-provider-node': specifier: ^3.972.29 - version: 3.972.29 + version: 3.972.34 devDependencies: '@aws-sdk/types': specifier: ^3.973.6 - version: 3.973.6 + version: 3.973.8 '@langchain/core': specifier: workspace:^ version: link:../../langchain-core @@ -1223,16 +1235,16 @@ importers: version: link:../../../internal/tsconfig '@smithy/types': specifier: ^4.13.1 - version: 4.13.1 + version: 4.14.1 '@tsconfig/recommended': specifier: ^1.0.3 version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1241,7 +1253,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1250,7 +1262,7 @@ importers: devDependencies: '@cloudflare/workers-types': specifier: ^4.20260402.1 - version: 4.20260405.1 + version: 4.20260422.1 '@langchain/core': specifier: workspace:^ version: link:../../langchain-core @@ -1268,10 +1280,10 @@ importers: version: 9.0.8 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1280,13 +1292,13 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-cohere: dependencies: cohere-ai: specifier: ^7.14.0 - version: 7.20.0 + version: 7.21.0 devDependencies: '@cfworker/json-schema': specifier: ^4.1.1 @@ -1305,7 +1317,7 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) dotenv: specifier: ^16.6.1 version: 16.6.1 @@ -1314,16 +1326,16 @@ importers: version: 3.15.1 eslint: specifier: ^9.34.0 - version: 9.39.2(jiti@2.6.1) + version: 9.39.4(jiti@2.6.1) prettier: specifier: ^3.5.0 - version: 3.8.1 + version: 3.8.3 typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1348,10 +1360,10 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1360,7 +1372,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-exa: dependencies: @@ -1382,7 +1394,7 @@ importers: version: 9.0.8 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) dotenv: specifier: ^16.3.1 version: 16.6.1 @@ -1391,16 +1403,16 @@ importers: version: 3.15.1 eslint: specifier: ^9.34.0 - version: 9.39.2(jiti@2.6.1) + version: 9.39.4(jiti@2.6.1) prettier: specifier: ^3.5.0 - version: 3.8.1 + version: 3.8.3 typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) libs/providers/langchain-fireworks: dependencies: @@ -1422,10 +1434,10 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1434,19 +1446,19 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-google: dependencies: eventsource-parser: specifier: ^3.0.6 - version: 3.0.6 + version: 3.0.8 google-auth-library: specifier: ^10.6.2 version: 10.6.2 jose: specifier: ^6.1.3 - version: 6.1.3 + version: 6.2.2 devDependencies: '@langchain/core': specifier: workspace:^ @@ -1468,7 +1480,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 || ^4 version: 4.3.6 @@ -1480,7 +1492,7 @@ importers: dependencies: '@google-cloud/cloud-sql-connector': specifier: ^1.6.0 - version: 1.9.0 + version: 1.10.0 '@langchain/core': specifier: workspace:^ version: link:../../langchain-core @@ -1489,7 +1501,7 @@ importers: version: 10.6.2 knex: specifier: ^3.2.8 - version: 3.2.9(pg@8.18.0) + version: 3.2.9(pg@8.20.0) devDependencies: '@jest/globals': specifier: ^30.3.0 @@ -1499,40 +1511,40 @@ importers: version: link:../../../internal/tsconfig '@swc/core': specifier: ^1.15.21 - version: 1.15.24(@swc/helpers@0.5.18) + version: 1.15.30(@swc/helpers@0.5.21) '@swc/jest': specifier: ^0.2.29 - version: 0.2.39(@swc/core@1.15.24(@swc/helpers@0.5.18)) + version: 0.2.39(@swc/core@1.15.30(@swc/helpers@0.5.21)) '@testcontainers/postgresql': specifier: ^11.13.0 - version: 11.13.0 + version: 11.14.0 '@tsconfig/recommended': specifier: ^1.0.3 version: 1.0.13 '@types/pg': specifier: ^8 - version: 8.16.0 + version: 8.20.0 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 jest: specifier: ^30.3.0 - version: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + version: 30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) jest-environment-node: specifier: ^30.3.0 version: 30.3.0 pg: specifier: ^8.14.1 - version: 8.18.0 + version: 8.20.0 testcontainers: specifier: ^11.13.0 - version: 11.13.0 + version: 11.14.0 ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: ~5.8.3 version: 5.8.3 @@ -1553,7 +1565,7 @@ importers: version: 10.0.0 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1562,7 +1574,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1584,7 +1596,7 @@ importers: version: 1.0.13 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1593,7 +1605,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1618,7 +1630,7 @@ importers: version: 1.0.13 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1630,7 +1642,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1655,7 +1667,7 @@ importers: version: 1.0.13 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1664,7 +1676,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1689,7 +1701,7 @@ importers: version: 1.0.13 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1698,7 +1710,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1723,28 +1735,28 @@ importers: version: link:../../../internal/tsconfig '@swc/core': specifier: ^1.15.21 - version: 1.15.24(@swc/helpers@0.5.18) + version: 1.15.30(@swc/helpers@0.5.21) '@swc/jest': specifier: ^0.2.29 - version: 0.2.39(@swc/core@1.15.24(@swc/helpers@0.5.18)) + version: 0.2.39(@swc/core@1.15.30(@swc/helpers@0.5.21)) '@tsconfig/recommended': specifier: ^1.0.3 version: 1.0.13 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 jest: specifier: ^30.3.0 - version: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + version: 30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) jest-environment-node: specifier: ^30.3.0 version: 30.3.0 ts-jest: specifier: ^29.4.9 - version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: ~5.8.3 version: 5.8.3 @@ -1778,10 +1790,10 @@ importers: version: 9.0.8 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1790,7 +1802,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^4.0.14 version: 4.3.6 @@ -1799,10 +1811,10 @@ importers: dependencies: '@ibm-cloud/watsonx-ai': specifier: ^1.7.11 - version: 1.7.11(@swc/core@1.15.24(@swc/helpers@0.5.18))(typescript@5.8.3) + version: 1.7.11(@swc/core@1.15.30(@swc/helpers@0.5.21))(typescript@5.8.3) ibm-cloud-sdk-core: specifier: ^5.4.10 - version: 5.4.10 + version: 5.4.11 zod: specifier: ^3.25.76 || ^4 version: 4.3.6 @@ -1821,13 +1833,13 @@ importers: version: 1.0.13 '@types/node': specifier: ^25.5.0 - version: 25.5.0 + version: 25.6.0 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1839,13 +1851,13 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-mistralai: dependencies: '@mistralai/mistralai': specifier: ^1.3.1 - version: 1.14.0(bufferutil@4.1.0) + version: 1.15.1(bufferutil@4.1.0) devDependencies: '@langchain/core': specifier: workspace:^ @@ -1861,10 +1873,10 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1873,7 +1885,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -1882,7 +1894,7 @@ importers: dependencies: mongodb: specifier: ^6.20.0 - version: 6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7) + version: 6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7) devDependencies: '@langchain/core': specifier: workspace:^ @@ -1901,25 +1913,25 @@ importers: version: 9.0.8 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) bson: specifier: ^7.2.0 version: 7.2.0 dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 testcontainers: specifier: ^11.13.0 - version: 11.13.0 + version: 11.14.0 typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-neo4j: dependencies: @@ -1944,16 +1956,16 @@ importers: version: 1.0.13 '@types/node': specifier: ^25.5.0 - version: 25.5.0 + version: 25.6.0 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -1965,7 +1977,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-ollama: dependencies: @@ -1990,10 +2002,10 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -2002,7 +2014,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 @@ -2021,7 +2033,7 @@ importers: devDependencies: '@azure/identity': specifier: ^4.2.1 - version: 4.13.0 + version: 4.13.1 '@cfworker/json-schema': specifier: ^4.1.1 version: 4.1.1 @@ -2039,13 +2051,13 @@ importers: version: 1.0.13 '@types/node': specifier: ^25.5.0 - version: 25.5.0 + version: 25.6.0 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -2057,7 +2069,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod-to-json-schema: specifier: ^3.25.2 version: 3.25.2(zod@4.3.6) @@ -2069,10 +2081,10 @@ importers: version: link:../langchain-openai eventsource-parser: specifier: ^3.0.6 - version: 3.0.6 + version: 3.0.8 openai: specifier: ^6.22.0 - version: 6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) + version: 6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) devDependencies: '@langchain/core': specifier: workspace:^ @@ -2094,7 +2106,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 || ^4 version: 4.3.6 @@ -2122,10 +2134,10 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -2134,7 +2146,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^4.0.14 version: 4.3.6 @@ -2143,7 +2155,7 @@ importers: dependencies: pg: specifier: ^8.11.0 - version: 8.18.0 + version: 8.20.0 devDependencies: '@langchain/core': specifier: workspace:^ @@ -2156,10 +2168,10 @@ importers: version: 1.0.13 '@types/pg': specifier: ^8 - version: 8.16.0 + version: 8.20.0 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) dotenv: specifier: ^16.3.1 version: 16.6.1 @@ -2168,16 +2180,16 @@ importers: version: 3.15.1 eslint: specifier: ^9.34.0 - version: 9.39.2(jiti@2.6.1) + version: 9.39.4(jiti@2.6.1) prettier: specifier: ^3.5.0 - version: 3.8.1 + version: 3.8.3 typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) libs/providers/langchain-pinecone: dependencies: @@ -2211,7 +2223,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) dotenv: specifier: ^16.3.1 version: 16.6.1 @@ -2220,25 +2232,25 @@ importers: version: 3.15.1 eslint: specifier: ^9.34.0 - version: 9.39.2(jiti@2.6.1) + version: 9.39.4(jiti@2.6.1) langchain: specifier: workspace:^ version: link:../../langchain prettier: specifier: ^3.5.0 - version: 3.8.1 + version: 3.8.3 typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) libs/providers/langchain-qdrant: dependencies: '@qdrant/js-client-rest': specifier: ^1.15.0 - version: 1.16.2(typescript@5.8.3) + version: 1.17.0(typescript@5.8.3) devDependencies: '@faker-js/faker': specifier: ^8.4.1 @@ -2257,7 +2269,7 @@ importers: version: 9.0.8 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) dotenv: specifier: ^16.3.1 version: 16.6.1 @@ -2266,16 +2278,16 @@ importers: version: 3.15.1 eslint: specifier: ^9.34.0 - version: 9.39.2(jiti@2.6.1) + version: 9.39.4(jiti@2.6.1) prettier: specifier: ^3.5.0 - version: 3.8.1 + version: 3.8.3 typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) libs/providers/langchain-redis: dependencies: @@ -2300,10 +2312,10 @@ importers: version: 9.0.8 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -2312,7 +2324,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-tavily: dependencies: @@ -2331,7 +2343,7 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) dotenv: specifier: ^16.3.1 version: 16.6.1 @@ -2340,16 +2352,16 @@ importers: version: 3.15.1 eslint: specifier: ^9.34.0 - version: 9.39.2(jiti@2.6.1) + version: 9.39.4(jiti@2.6.1) prettier: specifier: ^3.5.0 - version: 3.8.1 + version: 3.8.3 typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) libs/providers/langchain-together-ai: dependencies: @@ -2371,10 +2383,10 @@ importers: version: 1.0.13 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -2383,7 +2395,7 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 || ^4 version: 4.3.6 @@ -2404,16 +2416,16 @@ importers: version: 1.0.13 '@turbopuffer/turbopuffer': specifier: ^1.21.0 - version: 1.21.0 + version: 1.22.0 '@types/uuid': specifier: ^10.0.0 version: 10.0.0 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -2422,13 +2434,13 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) libs/providers/langchain-weaviate: dependencies: weaviate-client: specifier: ^3.5.2 - version: 3.11.0(encoding@0.1.13) + version: 3.12.1(encoding@0.1.13) devDependencies: '@langchain/core': specifier: workspace:^ @@ -2447,7 +2459,7 @@ importers: version: 9.0.8 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) dotenv: specifier: ^16.3.1 version: 16.6.1 @@ -2456,19 +2468,19 @@ importers: version: 3.15.1 eslint: specifier: ^9.34.0 - version: 9.39.2(jiti@2.6.1) + version: 9.39.4(jiti@2.6.1) langchain: specifier: workspace:^ version: link:../../langchain prettier: specifier: ^3.5.0 - version: 3.8.1 + version: 3.8.3 typescript: specifier: ~5.8.3 version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + version: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) libs/providers/langchain-xai: dependencies: @@ -2493,10 +2505,10 @@ importers: version: 9.0.8 '@vitest/coverage-v8': specifier: ^3.2.4 - version: 3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 3.2.4(vitest@4.1.5) dotenv: specifier: ^17.4.0 - version: 17.4.1 + version: 17.4.2 dpdm: specifier: ^3.14.0 version: 3.15.1 @@ -2505,90 +2517,87 @@ importers: version: 5.8.3 vitest: specifier: ^4.1.2 - version: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + version: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) zod: specifier: ^3.25.76 version: 3.25.76 packages: - '@acemir/cssom@0.9.31': - resolution: {integrity: sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==} - - '@ai-sdk/amazon-bedrock@3.0.93': - resolution: {integrity: sha512-57cP3Ume6DdQP05xPYl2g554EqPrQgKRW/eE3BGm1ktK1k71e35HGzNl1GZHIYKct82QrY/iQuheanSonI88Dg==} + '@ai-sdk/amazon-bedrock@3.0.97': + resolution: {integrity: sha512-EUkR9ovQQY9dHVo67bchi9Qa+05FlSee6hTNZ6X1Rz1SJQKIIR2jt9rN7glRTvrYd+70zU7Xl993RKE3JtqT9w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.74': - resolution: {integrity: sha512-1Z7142GVIF4XkcSvQpL6ij2c7J51dtm4/Z84P+O0bGBDZI1Nbvz897hXkJf2cfNhq5XdpvUYbI+oExXM7Ko8Zw==} + '@ai-sdk/anthropic@2.0.77': + resolution: {integrity: sha512-8n7ApEzFOxqVvT3HyqLrEQlgUx/2nUmPFLTGY3fNKwUA8KVNU3Ovd2C66Qh1Y93Iq5NkHsOWuLiTyAZpRKQhgw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/azure@2.0.104': - resolution: {integrity: sha512-g0ZDc/IgNCnIQuMj+bCBPionZwH4YBkfj5/CYeEPNqWrGBJm3aYfuWCjdT6Yayg+zlimunHZIjpjdDwan3i8Qg==} + '@ai-sdk/azure@2.0.105': + resolution: {integrity: sha512-pdYOtsFNJvNARbNxHORBIS6gwvU6yHdmgB3ZAzGdt89TiVtWiO1/quJeJ7Y3KUVLbjdpbVsTAWlL/J70XQxV5A==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/cerebras@1.0.40': - resolution: {integrity: sha512-KPtzWXMvRUI7nc/tpwQiP4LfEDwwSTSAkQLY++FKHHPr3Fnnt6Kjhq7sorF1qW5EROxmXNScQngnoU0z9lvcBg==} + '@ai-sdk/cerebras@1.0.41': + resolution: {integrity: sha512-UeBaOMXOcfkzHZE8TfbWRe9OMDkwB1NpHe837A+mRGWFabgdpJFTDnNrqCQVc3kGdDVhYBiDFh0lOEd8QRwJHQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/deepseek@1.0.36': - resolution: {integrity: sha512-4PZ76VHbU2j8CsvbldrDzbao5VB5v2UhAbMgR6N6Fo1s7g4YE86+uBtP2god41qRIXtZXKurYuCEFjJGJEMR/w==} + '@ai-sdk/deepseek@1.0.37': + resolution: {integrity: sha512-GXSsA1wz0r9LdtEa7uxSB3ynaLHzKP7WmExrl5v5QgNVCmjmv/P4RhEMa1T6JFVdqG2sK1Nud/VWJ38LlnxkGg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.71': - resolution: {integrity: sha512-mLbO7WClcoT/fvp8Vsv59e8IExG/wHFZ0OnP2Yh1Otkw/23AVD/GGlWsBIagvrWVwOk0aPVrLItOmzHk9iUGuQ==} + '@ai-sdk/gateway@2.0.82': + resolution: {integrity: sha512-vtoCSEBGPcxzChI3eqe9C9AJSlc/WUZp92tzpOqVd4B6Tnu4583S+qR7TknB0tPta15TEoOIkK0ENW6D/DgRJQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google-vertex@3.0.127': - resolution: {integrity: sha512-kD2xC1HFbhNe5/yCJqkIP2rV40mlyK3IJiCoI6bwkjC5aPvWdBVoMIYvYcmM/eYlDYkPwC3pkUWd1HqRdLyzZw==} + '@ai-sdk/google-vertex@3.0.132': + resolution: {integrity: sha512-IZfAutGNrHPk7VsziwtBVsNBnXTS2y5qZpI1tT9MdN+O6z0UFv6LVBDIpAFAZcQOec9M22j+5uc4ukB6BfC/0A==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/google@2.0.67': - resolution: {integrity: sha512-A7iZeJf3RbNIrFBKsskd2s4c52tK0S0nX4rGlehjVHSYBvIZzrX+RW3Oxe7WnpeI0aON+5dVsqfGLFNYNGWEXw==} + '@ai-sdk/google@2.0.70': + resolution: {integrity: sha512-NDMTvMo6vnPHDTA94FBOh3YMv0lxWDohYmFSGYhg0IimHMcOcC1ZV7E2KMLjzHOz5S7uasTITW7V3X5T+ozInQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/groq@2.0.37': - resolution: {integrity: sha512-I3nceoFuNwJx8gEWx/mPl1rjbe2pes5UDor+7OtNYOBUcPzmkb1E3yyTMDKYW4JAlmBWLk0xwT9WwX9R/mpqzA==} + '@ai-sdk/groq@2.0.38': + resolution: {integrity: sha512-qw6OB9RTYy1JO1//FK/bE4o12sl6s6uff7+C2L0AlskRbqOw0oWNh1FjeQU9bqHdObL5P6/UU1Cnq0FcQ7OT3g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/mistral@2.0.30': - resolution: {integrity: sha512-PhdfT0yFPRUsGxWQ8Gc0w/yog9UeYGo8US/4dQp608yhqV12ljxbot2VrqMUAeS6aZc0GDBVb+jGbLLb9SpDbw==} + '@ai-sdk/mistral@2.0.31': + resolution: {integrity: sha512-ii+06f4Vzt3OH7/FNCj/QVms65VaZxqfat9GvMZ03ZdxlhO8yWzw83j3OqgdQ8pRL5qkABNepf06YUwfeNz6XQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai-compatible@1.0.35': - resolution: {integrity: sha512-wDN0NfYNfe/i+12YR3n6g7zETHNQrw8WJhL9IjgNG1shXdoFDCqzitSz2rYqfqbuKirUIcChrMvjIpcr5nX14w==} + '@ai-sdk/openai-compatible@1.0.36': + resolution: {integrity: sha512-ePJ1nj1Wv2QcG9m8zA3zT20WBInFqEfwV17KT0JBeRyQucmiJBwIhzLkOq95O0sBwUutJJJrQNG8pEYxGf6w3w==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/openai@2.0.102': - resolution: {integrity: sha512-tYarHJhyMioGegsnhpqz1/tKoCAJJ6zBHoIQaredNkt8V3o/JXj2647NnEOJVe7WHQXGvCfzbfnP1TADFhPmcA==} + '@ai-sdk/openai@2.0.103': + resolution: {integrity: sha512-FDwY060LV/D5th+LeaxpSKcot5eXjzNzHguDf0NU1K+v7rxYZFWbldQPZarNo/IpD/WJE9RojgrFAcZ1e8KyvQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/perplexity@2.0.27': - resolution: {integrity: sha512-uyq8BEucqIm2Byp/JQ7iWKgV+s6B+mLFDBn4p4Dty8iyD/roQQMc5QXgQxJCLCR0duElEYYVh5hRCKIIzFy8LA==} + '@ai-sdk/perplexity@2.0.28': + resolution: {integrity: sha512-6KUdU+ccJEX+Y9xx8wKjEXIrELZINZg6NiZf2w9ZCcd96hC+8hkcq9TC4g3PDbtoA51ITfYXqwOer7UOx1nrZg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -2603,18 +2612,22 @@ packages: resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} engines: {node: '>=18'} - '@ai-sdk/togetherai@1.0.38': - resolution: {integrity: sha512-3sdh58EZ2rz9fBL8flVIY70Qosmc2QBPO/pzFjXdtumfBL73KAWjweBs9HkQxrfM3jy5CuRaC8q5qBkktWGHeQ==} + '@ai-sdk/togetherai@1.0.39': + resolution: {integrity: sha512-RUKl8FD8WVnEHV//HnsNcV9r6lQGdfjYF2ypMON3eZZja2cGKdk/qrJnX9KBApkPjVmm2AiB1YBgkuVDWv8WTg==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/xai@2.0.65': - resolution: {integrity: sha512-uNiGMxT1liL/rJBFpnhChFlYofwPkReYvEge3zpKgmqFp6liWnKZijvOJGDn3vPyNnP1feVwTwaQTS8+CRAcfQ==} + '@ai-sdk/xai@2.0.68': + resolution: {integrity: sha512-LqjizlypsbFcjVS/0BqGCPgvz4V5MaWCk+H7Tj7bZFQ1Ca8hby2Q0wGJ6u1ypR4Z8rRLHmfyrZ0mAEm/vd/d/A==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -2644,20 +2657,6 @@ packages: resolution: {integrity: sha512-GiwTmBFOU1/+UVNqqCGzFJYfBXEytUkiI+iRZ6Qx7KmUVtLm00sYySkfe203C9QtPG11yOz1ZaMek8dT/xnlgg==} engines: {node: '>=20'} - '@asamuzakjp/css-color@5.1.11': - resolution: {integrity: sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/dom-selector@6.8.1': - resolution: {integrity: sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==} - - '@asamuzakjp/generational-cache@1.0.1': - resolution: {integrity: sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - - '@asamuzakjp/nwsapi@2.3.9': - resolution: {integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==} - '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -2681,315 +2680,175 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-bedrock-agent-runtime@3.1024.0': - resolution: {integrity: sha512-+s1TmlHDNgpmHz13Q2E5XAm6LDoZHGxNQTajV6HrHcLowE07E1iYmS+z7vtFuJET9HDSN7ILhHPwMVCuBmqkGw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-bedrock-runtime@3.1006.0': - resolution: {integrity: sha512-xoReIImKWGEgI5+44ZqADIfjSQTx367d3wkH1kX8ZZNe70mUQxXDzLp1iWBk4FLjQyTnv0J0vMIvhSHVfvFxXA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-cognito-identity@3.980.0': - resolution: {integrity: sha512-nLgMW2drTzv+dTo3ORCcotQPcrUaTQ+xoaDTdSaUXdZO7zbbVyk7ysE5GDTnJdZWcUjHOSB8xfNQhOTTNVPhFw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-cognito-identity@3.985.0': - resolution: {integrity: sha512-PpHgiNGLsnQ2QHh0wx/uhGV3kxlASp2LOl5Z+LQCnu59i8rjAH1decT03QNWcho3Jz4zg9Kcto6VoAxu6OFb2A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-kendra@3.1006.0': - resolution: {integrity: sha512-/wlg6U3I5gpxrrzkwRJFfq6ica8q9bZwFWJ3v1+Ve+TaIVWMWkO0zSidGsIlhMUJWbWkoTnRnDdLeUzyBVi/4w==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-s3@3.1024.0': - resolution: {integrity: sha512-8qdO5aLCzaf9l0RdrSBW1iIroRKP2QBqtZ6lkrtHKiaaH0B18xEn+lrEgiN/eCf3uRAYk4cqbnI2XcWzm+7dDQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-sagemaker@3.985.0': - resolution: {integrity: sha512-78ASI/2NvmhP5/5R+1Sfmrv5N6XsgyfHLrHKkr3YB+J6JSjwJd/rz3ubbIGH1A9rdSg99Uf8UJCxKr2nTkTc/A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/client-sso@3.985.0': - resolution: {integrity: sha512-81J8iE8MuXhdbMfIz4sWFj64Pe41bFi/uqqmqOC5SlGv+kwoyLsyKS/rH2tW2t5buih4vTUxskRjxlqikTD4oQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/core@3.973.19': - resolution: {integrity: sha512-56KePyOcZnKTWCd89oJS1G6j3HZ9Kc+bh/8+EbvtaCCXdP6T7O7NzCiPuHRhFLWnzXIaXX3CxAz0nI5My9spHQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/core@3.973.26': - resolution: {integrity: sha512-A/E6n2W42ruU+sfWk+mMUOyVXbsSgGrY3MJ9/0Az5qUdG67y8I6HYzzoAa+e/lzxxl1uCYmEL6BTMi9ZiZnplQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/core@3.973.7': - resolution: {integrity: sha512-wNZZQQNlJ+hzD49cKdo+PY6rsTDElO8yDImnrI69p2PLBa7QomeUKAJWYp9xnaR38nlHqWhMHZuYLCQ3oSX+xg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/crc64-nvme@3.972.5': - resolution: {integrity: sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-cognito-identity@3.972.3': - resolution: {integrity: sha512-dW/DqTk90XW7hIngqntAVtJJyrkS51wcLhGz39lOMe0TlSmZl+5R/UGnAZqNbXmWuJHLzxe+MLgagxH41aTsAQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-env@3.972.17': - resolution: {integrity: sha512-MBAMW6YELzE1SdkOniqr51mrjapQUv8JXSGxtwRjQV0mwVDutVsn22OPAUt4RcLRvdiHQmNBDEFP9iTeSVCOlA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-env@3.972.24': - resolution: {integrity: sha512-FWg8uFmT6vQM7VuzELzwVo5bzExGaKHdubn0StjgrcU5FvuLExUe+k06kn/40uKv59rYzhez8eFNM4yYE/Yb/w==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-env@3.972.5': - resolution: {integrity: sha512-LxJ9PEO4gKPXzkufvIESUysykPIdrV7+Ocb9yAhbhJLE4TiAYqbCVUE+VuKP1leGR1bBfjWjYgSV5MxprlX3mQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-http@3.972.19': - resolution: {integrity: sha512-9EJROO8LXll5a7eUFqu48k6BChrtokbmgeMWmsH7lBb6lVbtjslUYz/ShLi+SHkYzTomiGBhmzTW7y+H4BxsnA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-http@3.972.26': - resolution: {integrity: sha512-CY4ppZ+qHYqcXqBVi//sdHST1QK3KzOEiLtpLsc9W2k2vfZPKExGaQIsOwcyvjpjUEolotitmd3mUNY56IwDEA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/credential-provider-http@3.972.7': - resolution: {integrity: sha512-L2uOGtvp2x3bTcxFTpSM+GkwFIPd8pHfGWO1764icMbo7e5xJh0nfhx1UwkXLnwvocTNEf8A7jISZLYjUSNaTg==} + '@aws-sdk/client-bedrock-agent-runtime@3.1034.0': + resolution: {integrity: sha512-/dqSzNvNSNNUPVCUpiSTUF39r84Yddr9b3Ji+LJVLUrxcapinJcu9F7+jBTCZ5EG4YT4G8/SYEomiT2x71xOSA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.28': - resolution: {integrity: sha512-wXYvq3+uQcZV7k+bE4yDXCTBdzWTU9x/nMiKBfzInmv6yYK1veMK0AKvRfRBd72nGWYKcL6AxwiPg9z/pYlgpw==} + '@aws-sdk/client-bedrock-runtime@3.1034.0': + resolution: {integrity: sha512-49igCAONPtL0ZkWWIs/6gWAq3CjWRISbqtFi5ysDljAGaZXMnPigKMly1CuOGlw/zIPaWbIjk2bGhyLtz2AuXg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.5': - resolution: {integrity: sha512-SdDTYE6jkARzOeL7+kudMIM4DaFnP5dZVeatzw849k4bSXDdErDS188bgeNzc/RA2WGrlEpsqHUKP6G7sVXhZg==} + '@aws-sdk/client-cognito-identity@3.1034.0': + resolution: {integrity: sha512-GA2Xo1fNp4qnqTUI/IRGj/QmkQDXZyer3m/nu8WO7PgT3I+8/yWw2Vzw81HjAhOiF//YjNmpn10uHVg3ViSCRA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.28': - resolution: {integrity: sha512-ZSTfO6jqUTCysbdBPtEX5OUR//3rbD0lN7jO3sQeS2Gjr/Y+DT6SbIJ0oT2cemNw3UzKu97sNONd1CwNMthuZQ==} + '@aws-sdk/client-kendra@3.1034.0': + resolution: {integrity: sha512-Cpi21jGmDCELXaLlsgTczAVfmLLz35pus7teaO+7nEYuW0FWa5TBVaBiWCazaplijsz3TVFJwiJFKjJULO2+8A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.5': - resolution: {integrity: sha512-uYq1ILyTSI6ZDCMY5+vUsRM0SOCVI7kaW4wBrehVVkhAxC6y+e9rvGtnoZqCOWL1gKjTMouvsf4Ilhc5NCg1Aw==} + '@aws-sdk/client-s3@3.1034.0': + resolution: {integrity: sha512-r91IZKPKuRlpCBsEmz9qnWrYxuHD0jsQv1p9UGNasFpcuPo1OnfwIB2ClXtqdXKYUvubXCwn7KBObTVnnvYvAA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.29': - resolution: {integrity: sha512-clSzDcvndpFJAggLDnDb36sPdlZYyEs5Zm6zgZjjUhwsJgSWiWKwFIXUVBcbruidNyBdbpOv2tNDL9sX8y3/0g==} + '@aws-sdk/client-sagemaker@3.1034.0': + resolution: {integrity: sha512-+Y5Ii9usmaj5WXE9URXN1Te6kmFlUgsJIlfmiV2R4dY/hHSPkTnLtCW+chGaatuGzMsguvDg4RIk9pR0idLbmg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.17': - resolution: {integrity: sha512-c8G8wT1axpJDgaP3xzcy+q8Y1fTi9A2eIQJvyhQ9xuXrUZhlCfXbC0vM9bM1CUXiZppFQ1p7g0tuUMvil/gCPg==} + '@aws-sdk/core@3.974.3': + resolution: {integrity: sha512-W3aJJm2clu8OmsrwMOMnfof13O6LGnbknnZIQeSRbxjqKah2nVvkjbUBBZVhWrt08KC69H7WsINTdrxC/2SXQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.24': - resolution: {integrity: sha512-Q2k/XLrFXhEztPHqj4SLCNID3hEPdlhh1CDLBpNnM+1L8fq7P+yON9/9M1IGN/dA5W45v44ylERfXtDAlmMNmw==} + '@aws-sdk/crc64-nvme@3.972.7': + resolution: {integrity: sha512-QUagVVBbC8gODCF6e1aV0mE2TXWB9Opz4k8EJFdNrujUVQm5R4AjJa1mpOqzwOuROBzqJU9zawzig7M96L8Ejg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.5': - resolution: {integrity: sha512-HDKF3mVbLnuqGg6dMnzBf1VUOywE12/N286msI9YaK9mEIzdsGCtLTvrDhe3Up0R9/hGFbB+9l21/TwF5L1C6g==} + '@aws-sdk/credential-provider-cognito-identity@3.972.26': + resolution: {integrity: sha512-eJyE408dpRkr8XSD1TjTQfOCK1r2o+W6vhsGHiL0PmJKr6LgCEP73epBbWbw6ZrJLKxlUYP44nVzY7cmwVlUgw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.18': - resolution: {integrity: sha512-YHYEfj5S2aqInRt5ub8nDOX8vAxgMvd84wm2Y3WVNfFa/53vOv9T7WOAqXI25qjj3uEcV46xxfqdDQk04h5XQA==} + '@aws-sdk/credential-provider-env@3.972.29': + resolution: {integrity: sha512-rf+AlUxgTeSzQ/4zoS0D+Bt7XvgpY48PnWG8Yg/N9fdMgyK2Jaqa+6tLZp4MYMIMHkGrfAxnbSeb2YLMGFMg6g==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.28': - resolution: {integrity: sha512-IoUlmKMLEITFn1SiCTjPfR6KrE799FBo5baWyk/5Ppar2yXZoUdaRqZzJzK6TcJxx450M8m8DbpddRVYlp5R/A==} + '@aws-sdk/credential-provider-http@3.972.31': + resolution: {integrity: sha512-TR2/lQ3qKFj2EOrsiASzemsNEz2uzZ/SUBf48+U4Cr9a/FZlHfH/hwAeBJNBp1gMyJNxROJZhT3dn1cO+jnYfQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.5': - resolution: {integrity: sha512-8urj3AoeNeQisjMmMBhFeiY2gxt6/7wQQbEGun0YV/OaOOiXrIudTIEYF8ZfD+NQI6X1FY5AkRsx6O/CaGiybA==} + '@aws-sdk/credential-provider-ini@3.972.33': + resolution: {integrity: sha512-UwdbJbOrgnOxZbshaNZ4DzX35h5wQd33MNYTGzWhN3ORG9lG9KQbDX6l6tDJSAdaGTktJoZPSritmUoW1rYkRA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.18': - resolution: {integrity: sha512-OqlEQpJ+J3T5B96qtC1zLLwkBloechP+fezKbCH0sbd2cCc0Ra55XpxWpk/hRj69xAOYtHvoC4orx6eTa4zU7g==} + '@aws-sdk/credential-provider-login@3.972.33': + resolution: {integrity: sha512-WyZuPVoDM1HGNl41eVg8HSSXIB+FGkuuK63GhDbh4TMdfWU03AciWvF/QqOVWvJtWVYaLddANJ+aUklVr2ieuw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.28': - resolution: {integrity: sha512-d+6h0SD8GGERzKe27v5rOzNGKOl0D+l0bWJdqrxH8WSQzHzjsQFIAPgIeOTUwBHVsKKwtSxc91K/SWax6XgswQ==} + '@aws-sdk/credential-provider-node@3.972.34': + resolution: {integrity: sha512-sPcisURibKU4x0PCWJkWF1KJYm49Cph9dCn/PAnG5FU0wq5Id3g2v7RuEWAtNlKv1Af4gUJYBVGOeNpSEEx41A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.5': - resolution: {integrity: sha512-OK3cULuJl6c+RcDZfPpaK5o3deTOnKZbxm7pzhFNGA3fI2hF9yDih17fGRazJzGGWaDVlR9ejZrpDef4DJCEsw==} + '@aws-sdk/credential-provider-process@3.972.29': + resolution: {integrity: sha512-DURisqWS3bUgiwMXTmzymVNGlcRW0FnbPZ3SZknhmxnCXm3n9idkTJ6T+Uir359KRKtJNFLRViskk8HsSVLi1w==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-providers@3.985.0': - resolution: {integrity: sha512-mYjWyt0HiU3dYZif7yAJ+DYerSD/0bh7Umw9tUTFhhXrPePGTbJPyJx+vLmEh2dG2hCr7Qpn6DZdY8sB5yOxhQ==} + '@aws-sdk/credential-provider-sso@3.972.33': + resolution: {integrity: sha512-9y9obU4IQWru9f+NiiscUeyCe5ZmQav4FKEb1qfUNrik/C3BzBGUnHQWyPEyXjOX9cb+vx1TYx0qZBtinKdzTA==} engines: {node: '>=20.0.0'} - '@aws-sdk/dsql-signer@3.1024.0': - resolution: {integrity: sha512-yaPEEU83D8ZKXR09T4XrZQ7W2gID/EHOKwPx+bv0A/pfscqw7qkps1l5FIbI15oUNPSI28L8GNkNof/4w0rnXw==} + '@aws-sdk/credential-provider-web-identity@3.972.33': + resolution: {integrity: sha512-RazhlN0YAkna2T2p2v4YuuRlVBVRNo8V0SL+9JePTWDndEUAeOBAjYeQfAMbtDyCh120+zA0Op6V0jS4dw2+iw==} engines: {node: '>=20.0.0'} - '@aws-sdk/dsql-signer@3.985.0': - resolution: {integrity: sha512-kCtMZHX6qgUOQvxGpNpJUjoKs7w20v9HHD3jpYt29/G2Qr6/YU6vBrt0HaZsTUyO0bBeNNMgtC6dqowIa+T2Og==} + '@aws-sdk/credential-providers@3.1034.0': + resolution: {integrity: sha512-xTmpZN3i4cZEgjJNQhA8CYmxKtW95ZAhh9wINe2b6ffQzbaXBLkuvfz/fhWEezl4P8uv2qWO8J+DEDms6wqL9g==} engines: {node: '>=20.0.0'} - '@aws-sdk/eventstream-handler-node@3.972.10': - resolution: {integrity: sha512-g2Z9s6Y4iNh0wICaEqutgYgt/Pmhv5Ev9G3eKGFe2w9VuZDhc76vYdop6I5OocmpHV79d4TuLG+JWg5rQIVDVA==} + '@aws-sdk/dsql-signer@3.1034.0': + resolution: {integrity: sha512-sPziGw3ZimviHYTpUspWm50Mfi39B8d1beL7N8izr1TYPsN9DiTN1vsHfUaehcnkj5aaF+G2Uci9o0l1w+e4SA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.972.8': - resolution: {integrity: sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==} + '@aws-sdk/eventstream-handler-node@3.972.14': + resolution: {integrity: sha512-m4X56gxG76/CKfxNVbOFuYwnAZcHgS6HOH8lgp15HoGHIAVTcZfZrXvcYzJFOMLEJgVn+JHBu6EiNV+xSNXXFg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-eventstream@3.972.7': - resolution: {integrity: sha512-VWndapHYCfwLgPpCb/xwlMKG4imhFzKJzZcKOEioGn7OHY+6gdr0K7oqy1HZgbLa3ACznZ9fku+DzmAi8fUC0g==} + '@aws-sdk/middleware-bucket-endpoint@3.972.10': + resolution: {integrity: sha512-Vbc2frZH7wXlMNd+ZZSXUEs/l1Sv8Jj4zUnIfwrYF5lwaLdXHZ9xx4U3rjUcaye3HRhFVc+E5DbBxpRAbB16BA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.972.8': - resolution: {integrity: sha512-5DTBTiotEES1e2jOHAq//zyzCjeMB78lEHd35u15qnrid4Nxm7diqIf9fQQ3Ov0ChH1V3Vvt13thOnrACmfGVQ==} + '@aws-sdk/middleware-eventstream@3.972.10': + resolution: {integrity: sha512-QUqLs7Af1II9X4fCRAu+EGHG3KHyOp4RkuLhRKoA3NuFlh6TL8i+zXBl8w2LUxqm44B/Kom45hgSlwA1SpTsXQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.974.6': - resolution: {integrity: sha512-YckB8k1ejbyCg/g36gUMFLNzE4W5cERIa4MtsdO+wpTmJEP0+TB7okWIt7d8TDOvnb7SwvxJ21E4TGOBxFpSWQ==} + '@aws-sdk/middleware-expect-continue@3.972.10': + resolution: {integrity: sha512-2Yn0f1Qiq/DjxYR3wfI3LokXnjOhFM7Ssn4LTdFDIxRMCE6I32MAsVnhPX1cUZsuVA9tiZtwwhlSLAtFGxAZlQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.7': - resolution: {integrity: sha512-aHQZgztBFEpDU1BB00VWCIIm85JjGjQW1OG9+98BdmaOpguJvzmXBGbnAiYcciCd+IS4e9BEq664lhzGnWJHgQ==} + '@aws-sdk/middleware-flexible-checksums@3.974.11': + resolution: {integrity: sha512-jTrJFs4SMs9xjih45+QHtU79piovA6CAlofMt4jeknN5ef9zsVEHDtuwCnEe/3eANWewa9fd6Tvc54xEPpQ3RA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.8': - resolution: {integrity: sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==} + '@aws-sdk/middleware-host-header@3.972.10': + resolution: {integrity: sha512-IJSsIMeVQ8MMCPbuh1AbltkFhLBLXn7aejzfX5YKT/VLDHn++Dcz8886tXckE+wQssyPUhaXrJhdakO2VilRhg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.972.8': - resolution: {integrity: sha512-KaUoFuoFPziIa98DSQsTPeke1gvGXlc5ZGMhy+b+nLxZ4A7jmJgLzjEF95l8aOQN2T/qlPP3MrAyELm8ExXucw==} + '@aws-sdk/middleware-location-constraint@3.972.10': + resolution: {integrity: sha512-rI3NZvJcEvjoD0+0PI0iUAwlPw2IlSlhyvgBK/3WkKJQE/YiKFedd9dMN2lVacdNxPNhxL/jzQaKQdrGtQagjQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.7': - resolution: {integrity: sha512-LXhiWlWb26txCU1vcI9PneESSeRp/RYY/McuM4SpdrimQR5NgwaPb4VJCadVeuGWgh6QmqZ6rAKSoL1ob16W6w==} + '@aws-sdk/middleware-logger@3.972.10': + resolution: {integrity: sha512-OOuGvvz1Dm20SjZo5oEBePFqxt5nf8AwkNDSyUHvD9/bfNASmstcYxFAHUowy4n6Io7mWUZ04JURZwSBvyQanQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.8': - resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} + '@aws-sdk/middleware-recursion-detection@3.972.11': + resolution: {integrity: sha512-+zz6f79Kj9V5qFK2P+D8Ehjnw4AhphAlCAsPjUqEcInA9umtSSKMrHbSagEeOIsDNuvVrH98bjRHcyQukTrhaQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.7': - resolution: {integrity: sha512-l2VQdcBcYLzIzykCHtXlbpiVCZ94/xniLIkAj0jpnpjY4xlgZx7f56Ypn+uV1y3gG0tNVytJqo3K9bfMFee7SQ==} + '@aws-sdk/middleware-sdk-s3@3.972.32': + resolution: {integrity: sha512-dc2O2x0V5pGJhmdQYQveUIFtMZsur7GrGuSgoKM4oQJuEcfvwnJ3sj+ip6WnxR5l6TrX5zkl4KgcgswOy3wAzQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.9': - resolution: {integrity: sha512-/Wt5+CT8dpTFQxEJ9iGy/UGrXr7p2wlIOEHvIr/YcHYByzoLjrqkYqXdJjd9UIgWjv7eqV2HnFJen93UTuwfTQ==} + '@aws-sdk/middleware-ssec@3.972.10': + resolution: {integrity: sha512-Gli9A0u8EVVb+5bFDGS/QbSVg28w/wpEidg1ggVcSj65BDTdGR6punsOcVjqdiu1i42WHWo51MCvARPIIz9juw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.972.27': - resolution: {integrity: sha512-gomO6DZwx+1D/9mbCpcqO5tPBqYBK7DtdgjTIjZ4yvfh/S7ETwAPS0XbJgP2JD8Ycr5CwVrEkV1sFtu3ShXeOw==} + '@aws-sdk/middleware-user-agent@3.972.33': + resolution: {integrity: sha512-mqtT3Fo7xanWMk2SbAcKLGGI/q1GHWNrExBj7cnWP2W2mkTMheXB4ntJvwPZ1UxPrQobrsv2dWFXmaOJeSOiDg==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.972.8': - resolution: {integrity: sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-user-agent@3.972.20': - resolution: {integrity: sha512-3kNTLtpUdeahxtnJRnj/oIdLAUdzTfr9N40KtxNhtdrq+Q1RPMdCJINRXq37m4t5+r3H70wgC3opW46OzFcZYA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-user-agent@3.972.28': - resolution: {integrity: sha512-cfWZFlVh7Va9lRay4PN2A9ARFzaBYcA097InT5M2CdRS05ECF5yaz86jET8Wsl2WcyKYEvVr/QNmKtYtafUHtQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/middleware-websocket@3.972.12': - resolution: {integrity: sha512-iyPP6FVDKe/5wy5ojC0akpDFG1vX3FeCUU47JuwN8xfvT66xlEI8qUJZPtN55TJVFzzWZJpWL78eqUE31md08Q==} + '@aws-sdk/middleware-websocket@3.972.16': + resolution: {integrity: sha512-86+S9oCyRVGzoMRpQhxkArp7kD2K75GPmaNevd9B6EyNhWoNvnCZZ3WbgN4j7ZT+jvtvBCGZvI2XHsWZJ+BRIg==} engines: {node: '>= 14.0.0'} - '@aws-sdk/nested-clients@3.985.0': - resolution: {integrity: sha512-TsWwKzb/2WHafAY0CE7uXgLj0FmnkBTgfioG9HO+7z/zCPcl1+YU+i7dW4o0y+aFxFgxTMG+ExBQpqT/k2ao8g==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/nested-clients@3.996.18': - resolution: {integrity: sha512-c7ZSIXrESxHKx2Mcopgd8AlzZgoXMr20fkx5ViPWPOLBvmyhw9VwJx/Govg8Ef/IhEon5R9l53Z8fdYSEmp6VA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/nested-clients@3.996.8': - resolution: {integrity: sha512-6HlLm8ciMW8VzfB80kfIx16PBA9lOa9Dl+dmCBi78JDhvGlx3I7Rorwi5PpVRkL31RprXnYna3yBf6UKkD/PqA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/region-config-resolver@3.972.10': - resolution: {integrity: sha512-1dq9ToC6e070QvnVhhbAs3bb5r6cQ10gTVc6cyRV5uvQe7P138TV2uG2i6+Yok4bAkVAcx5AqkTEBUvWEtBlsQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/region-config-resolver@3.972.7': - resolution: {integrity: sha512-/Ev/6AI8bvt4HAAptzSjThGUMjcWaX3GX8oERkB0F0F9x2dLSBdgFDiyrRz3i0u0ZFZFQ1b28is4QhyqXTUsVA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/signature-v4-multi-region@3.996.15': - resolution: {integrity: sha512-Ukw2RpqvaL96CjfH/FgfBmy/ZosHBqoHBCFsN61qGg99F33vpntIVii8aNeh65XuOja73arSduskoa4OJea9RQ==} + '@aws-sdk/nested-clients@3.997.1': + resolution: {integrity: sha512-Afc9hc2WZs3X4Jb8dnxyuYiZsLoWRO51roTCRf497gPnAKN2WRdXANu1vaVCTzwnDMOYFXb/cYv4ZSjxqAqcKA==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1005.0': - resolution: {integrity: sha512-vMxd+ivKqSxU9bHx5vmAlFKDAkjGotFU56IOkDa5DaTu1WWwbcse0yFHEm9I537oVvodaiwMl3VBwgHfzQ2rvw==} + '@aws-sdk/region-config-resolver@3.972.13': + resolution: {integrity: sha512-CvJ2ZIjK/jVD/lbOpowBVElJyC1YxLTIJ13yM0AEo0t2v7swOzGjSA6lJGH+DwZXQhcjUjoYwc8bVYCX5MDr1A==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1006.0': - resolution: {integrity: sha512-eCBaQI1w5PcliOdh8Y0YONOim2zNSTEK4E7gXYC4vIqiT/lzVODIFxmpc8oOBLPSANzcr9daIPPtjQ2C75dLFg==} + '@aws-sdk/signature-v4-multi-region@3.996.20': + resolution: {integrity: sha512-MEj6DhEcaO8RgVtFCJ+xpCQnZC3Iesr09avdY75qkMQfckQULu447IegK7Rs1MCGerVBfKnJQ4q+pQq9hI5lng==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.1021.0': - resolution: {integrity: sha512-TKY6h9spUk3OLs5v1oAgW9mAeBE3LAGNBwJokLy96wwmd4W2v/tYlXseProyed9ValDj2u1jK/4Rg1T+1NXyJA==} + '@aws-sdk/token-providers@3.1034.0': + resolution: {integrity: sha512-8E+KGcD4ET0H9FXJ2/ZWbfFnQNYEkTZZYJxAs1lkdJlve1AYuqaydInIFfvNgoz5GbYtzbK8/ugsSMu5wPm6kA==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.985.0': - resolution: {integrity: sha512-+hwpHZyEq8k+9JL2PkE60V93v2kNhUIv7STFt+EAez1UJsJOQDhc5LpzEX66pNjclI5OTwBROs/DhJjC/BtMjQ==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/types@3.973.6': - resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==} + '@aws-sdk/types@3.973.8': + resolution: {integrity: sha512-gjlAdtHMbtR9X5iIhVUvbVcy55KnznpC6bkDUWW9z915bi0ckdUr5cjf16Kp6xq0bP5HBD2xzgbL9F9Quv5vUw==} engines: {node: '>=20.0.0'} '@aws-sdk/util-arn-parser@3.972.3': resolution: {integrity: sha512-HzSD8PMFrvgi2Kserxuff5VitNq2sgf3w9qxmskKDiDTThWfVteJxuCS9JXiPIPtmCrp+7N9asfIaVhBFORllA==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.980.0': - resolution: {integrity: sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.985.0': - resolution: {integrity: sha512-vth7UfGSUR3ljvaq8V4Rc62FsM7GUTH/myxPWkaEgOrprz1/Pc72EgTXxj+cPPPDAfHFIpjhkB7T7Td0RJx+BA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.996.4': - resolution: {integrity: sha512-Hek90FBmd4joCFj+Vc98KLJh73Zqj3s2W56gjAcTkrNLMDI5nIFkG9YpfcJiVI1YlE2Ne1uOQNe+IgQ/Vz2XRA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-endpoints@3.996.5': - resolution: {integrity: sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==} + '@aws-sdk/util-endpoints@3.996.8': + resolution: {integrity: sha512-oOZHcRDihk5iEe5V25NVWg45b3qEA8OpHWVdU/XQh8Zj4heVPAJqWvMphQnU7LkufmUo10EpvFPZuQMiFLJK3g==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-format-url@3.972.3': - resolution: {integrity: sha512-n7F2ycckcKFXa01vAsT/SJdjFHfKH9s96QHcs5gn8AaaigASICeME8WdUL9uBp8XV/OVwEt8+6gzn6KFUgQa8g==} + '@aws-sdk/util-format-url@3.972.10': + resolution: {integrity: sha512-DEKiHNJVtNxdyTeQspzY+15Po/kHm6sF0Cs4HV9Q2+lplB63+DrvdeiSoOSdWEWAoO2RcY1veoXVDz2tWxWCgQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-format-url@3.972.7': - resolution: {integrity: sha512-V+PbnWfUl93GuFwsOHsAq7hY/fnm9kElRqR8IexIJr5Rvif9e614X5sGSyz3mVSf1YAZ+VTy63W1/pGdA55zyA==} + '@aws-sdk/util-locate-window@3.965.5': + resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-format-url@3.972.8': - resolution: {integrity: sha512-J6DS9oocrgxM8xlUTTmQOuwRF6rnAGEujAN9SAzllcrQmwn5iJ58ogxy3SEhD0Q7JZvlA5jvIXBkpQRqEqlE9A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-locate-window@3.965.4': - resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/util-user-agent-browser@3.972.7': - resolution: {integrity: sha512-7SJVuvhKhMF/BkNS1n0QAJYgvEwYbK2QLKBrzDiwQGiTRU6Yf1f3nehTzm/l21xdAOtWSfp2uWSddPnP2ZtsVw==} - - '@aws-sdk/util-user-agent-browser@3.972.8': - resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} - - '@aws-sdk/util-user-agent-node@3.973.14': - resolution: {integrity: sha512-vNSB/DYaPOyujVZBg/zUznH9QC142MaTHVmaFlF7uzzfg3CgT9f/l4C0Yi+vU/tbBhxVcXVB90Oohk5+o+ZbWw==} - engines: {node: '>=20.0.0'} - peerDependencies: - aws-crt: '>=1.0.0' - peerDependenciesMeta: - aws-crt: - optional: true + '@aws-sdk/util-user-agent-browser@3.972.10': + resolution: {integrity: sha512-FAzqXvfEssGdSIz8ejatan0bOdx1qefBWKF/gWmVBXIP1HkS7v/wjjaqrAGGKvyihrXTXW00/2/1nTJtxpXz7g==} - '@aws-sdk/util-user-agent-node@3.973.5': - resolution: {integrity: sha512-Dyy38O4GeMk7UQ48RupfHif//gqnOPbq/zlvRssc11E2mClT+aUfc3VS2yD8oLtzqO3RsqQ9I3gOBB4/+HjPOw==} + '@aws-sdk/util-user-agent-node@3.973.19': + resolution: {integrity: sha512-ZAfHjpzdbrzkAftC139JoYGfXzDh5HY+AxRzw8pGJ8cULsf+l721sKAMK8mV5NvRETaW/BwghSwQhGgoNgrxMw==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -2997,20 +2856,12 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.972.10': - resolution: {integrity: sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/xml-builder@3.972.16': - resolution: {integrity: sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==} - engines: {node: '>=20.0.0'} - - '@aws-sdk/xml-builder@3.972.4': - resolution: {integrity: sha512-0zJ05ANfYqI6+rGqj8samZBFod0dPPousBjLEqg8WdxSgbMAkRgLyn81lP215Do0rFJ/17LIXwr7q0yK24mP6Q==} + '@aws-sdk/xml-builder@3.972.18': + resolution: {integrity: sha512-BMDNVG1ETXRhl1tnisQiYBef3RShJ1kfZA7x7afivTFMLirfHNTb6U71K569HNXhSXbQZsweHvSDZ6euBw8hPA==} engines: {node: '>=20.0.0'} - '@aws/lambda-invoke-store@0.2.3': - resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + '@aws/lambda-invoke-store@0.2.4': + resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} engines: {node: '>=18.0.0'} '@azure/abort-controller@2.1.2': @@ -3036,10 +2887,6 @@ packages: resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} engines: {node: '>=18.0.0'} - '@azure/core-rest-pipeline@1.22.2': - resolution: {integrity: sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==} - engines: {node: '>=20.0.0'} - '@azure/core-rest-pipeline@1.23.0': resolution: {integrity: sha512-Evs1INHo+jUjwHi1T6SG6Ua/LHOQBCLuKEEE6efIpt4ZOoNonaT1kP32GoOcdNDbfqsD2445CPri3MubBy5DEQ==} engines: {node: '>=20.0.0'} @@ -3052,10 +2899,6 @@ packages: resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} engines: {node: '>=20.0.0'} - '@azure/identity@4.13.0': - resolution: {integrity: sha512-uWC0fssc+hs1TGGVkkghiaFkkS7NkTxfnCH+Hdg+yTehTpMcehpok4PgUKKdyCH+9ldu6FhiHRv84Ntqj1vVcw==} - engines: {node: '>=20.0.0'} - '@azure/identity@4.13.1': resolution: {integrity: sha512-5C/2WD5Vb1lHnZS16dNQRPMjN6oV/Upba+C9nBIs15PmOi6A3ZGs4Lr2u60zw4S04gi+u3cEXiqTVP7M4Pz3kw==} engines: {node: '>=20.0.0'} @@ -3064,28 +2907,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@4.28.1': - resolution: {integrity: sha512-al2u2fTchbClq3L4C1NlqLm+vwKfhYCPtZN2LR/9xJVaQ4Mnrwf5vANvuyPSJHcGvw50UBmhuVmYUAhTEetTpA==} - engines: {node: '>=0.8.0'} - - '@azure/msal-browser@5.6.3': - resolution: {integrity: sha512-sTjMtUm+bJpENU/1WlRzHEsgEHppZDZ1EtNyaOODg/sQBtMxxJzGB+MOCM+T2Q5Qe1fKBrdxUmjyRxm0r7Ez9w==} - engines: {node: '>=0.8.0'} - - '@azure/msal-common@15.14.1': - resolution: {integrity: sha512-IkzF7Pywt6QKTS0kwdCv/XV8x8JXknZDvSjj/IccooxnP373T5jaadO3FnOrbWo3S0UqkfIDyZNTaQ/oAgRdXw==} + '@azure/msal-browser@5.8.0': + resolution: {integrity: sha512-X7IZV77bN56l7sbLjkcbQJX1t3U4tgxqztDr/XFbUcUfKk+z2FavcLgKP+OYUNj0wl/pEEtV9lldW9siY8BuHQ==} engines: {node: '>=0.8.0'} - '@azure/msal-common@16.4.1': - resolution: {integrity: sha512-Bl8f+w37xkXsYh7QRkAKCFGYtWMYuOVO7Lv+BxILrvGz3HbIEF22Pt0ugyj0QPOl6NLrHcnNUQ9yeew98P/5iw==} + '@azure/msal-common@16.5.1': + resolution: {integrity: sha512-WS9w9SfI8SEYO7mTnxGeZ3UwQfhAVYCWglYF2/7GNx3ioHiAs2gPkl9eSwVs8cPrmiGh+zi9ai/OOKoq4cyzDw==} engines: {node: '>=0.8.0'} - '@azure/msal-node@3.8.6': - resolution: {integrity: sha512-XTmhdItcBckcVVTy65Xp+42xG4LX5GK+9AqAsXPXk4IqUNv+LyQo5TMwNjuFYBfAB2GTG9iSQGk+QLc03vhf3w==} - engines: {node: '>=16'} - - '@azure/msal-node@5.1.2': - resolution: {integrity: sha512-DoeSJ9U5KPAIZoHsPywvfEj2MhBniQe0+FSpjLUTdWoIkI999GB5USkW6nNEHnIaLVxROHXvprWA1KzdS1VQ4A==} + '@azure/msal-node@5.1.4': + resolution: {integrity: sha512-G4LXGGggok1QC48uKu64/SV2DPRDlddmV8EieK8pflsNYMj9/Zz+Y9OHoEBhT15h+zpdwXXLYA/7PJCR/yZ8aw==} engines: {node: '>=20'} '@azure/search-documents@12.2.0': @@ -3138,10 +2969,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@8.0.0-rc.2': - resolution: {integrity: sha512-noLx87RwlBEMrTzncWd/FvTxoJ9+ycHNg0n8yyYydIoDsLZuxknKgWRJUqcrVkNrJ74uGyhWQzQaS3q8xfGAhQ==} - engines: {node: ^20.19.0 || >=22.12.0} - '@babel/helper-string-parser@8.0.0-rc.3': resolution: {integrity: sha512-AmwWFx1m8G/a5cXkxLxTiWl+YEoWuoFLUCwqMlNuWO1tqAYITQAbCRPUkyBHv1VOFgfjVOqEj6L3u15J5ZCzTA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3150,10 +2977,6 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@8.0.0-rc.2': - resolution: {integrity: sha512-xExUBkuXWJjVuIbO7z6q7/BA9bgfJDEhVL0ggrggLMbg0IzCUWGT1hZGE8qUH7Il7/RD/a6cZ3AAFrrlp1LF/A==} - engines: {node: ^20.19.0 || >=22.12.0} - '@babel/helper-validator-identifier@8.0.0-rc.3': resolution: {integrity: sha512-8AWCJ2VJJyDFlGBep5GpaaQ9AAaE/FjAcrqI7jyssYhtL7WGV0DOKpJsQqM037xDbpRLHXsY8TwU7zDma7coOw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3162,20 +2985,15 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} + '@babel/helpers@7.29.2': + resolution: {integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.29.0': - resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + '@babel/parser@7.29.2': + resolution: {integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@8.0.0-rc.2': - resolution: {integrity: sha512-29AhEtcq4x8Dp3T72qvUMZHx0OMXCj4Jy/TEReQa+KWLln524Cj1fWb3QFi0l/xSpptQBR6y9RNEXuxpFvwiUQ==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - '@babel/parser@8.0.0-rc.3': resolution: {integrity: sha512-B20dvP3MfNc/XS5KKCHy/oyWl5IA6Cn9YjXRdDlCjNmUFrjvLXMNUfQq/QUy9fnG2gYkKKcrto2YaF9B32ToOQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3272,10 +3090,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.6': - resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.29.2': resolution: {integrity: sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==} engines: {node: '>=6.9.0'} @@ -3292,10 +3106,6 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@babel/types@8.0.0-rc.2': - resolution: {integrity: sha512-91gAaWRznDwSX4E2tZ1YjBuIfnQVOFDCQ2r0Toby0gu4XEbyF623kXLMA8d4ZbCu+fINcrudkmEcwSUHgDDkNw==} - engines: {node: ^20.19.0 || >=22.12.0} - '@babel/types@8.0.0-rc.3': resolution: {integrity: sha512-mOm5ZrYmphGfqVWoH5YYMTITb3cDXsFgmvFlvkvWDMsR9X8RFnt7a0Wb6yNIdoFsiMO9WjYLq+U/FMtqIYAF8Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3316,15 +3126,8 @@ packages: '@braidai/lang@1.1.2': resolution: {integrity: sha512-qBcknbBufNHlui137Hft8xauQMTZDKdophmLFv05r2eNmdIv/MlPuP4TdUknHG68UdWLgVZwgxVe735HzJNIwA==} - '@bramus/specificity@2.4.2': - resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} - hasBin: true - - '@browserbasehq/sdk@2.6.0': - resolution: {integrity: sha512-83iXP5D7xMm8Wyn66TUaUrgoByCmAJuoMoZQI3sGg3JAiMlTfnCIMqyVBoNSaItaPIkaCnrsj6LiusmXV2X9YA==} - - '@browserbasehq/sdk@2.9.0': - resolution: {integrity: sha512-Xzm1+6suzQypXjley4Phqer++pjnYyST6S7CArUn3kWyGA8aruXjAV5wkmqE21lgXo9K3/OQJvCu48bKEZFNDQ==} + '@browserbasehq/sdk@2.10.0': + resolution: {integrity: sha512-pOL4yW8P8AI2+N5y6zEP6XXKqIXtYyKunr1JXppqQDOyKLxxvZEDqQCHJXWUzqgx3R1tGWpn7m9AjXN7MeYInA==} '@browserbasehq/stagehand@1.14.0': resolution: {integrity: sha512-Hi/EzgMFWz+FKyepxHTrqfTPjpsuBS4zRy3e9sbMpBgLPv+9c0R+YZEvS7Bw4mTS66QtvvURRT6zgDGFotthVQ==} @@ -3335,8 +3138,8 @@ packages: openai: ^4.62.1 zod: ^3.23.8 - '@browserbasehq/stagehand@3.2.0': - resolution: {integrity: sha512-X9s3sZuTL3zf8gt1o9yr4mvT2JmDRigkmBinlKF6LD+rlAIOh+nH6Cmz6xfRjZ4RgTfR0wRoE1iUTKa39YtWfA==} + '@browserbasehq/stagehand@3.2.1': + resolution: {integrity: sha512-h7KAAaNK7JUMw97w7sj0CBsBVtjLXyEorbUoYmCwLYYWrL2IUd9WFS7gRFspCp0ww2hpVPJEKMxHumwFCPEC8g==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: deepmerge: ^4.3.1 @@ -3345,11 +3148,11 @@ packages: '@cfworker/json-schema@4.1.1': resolution: {integrity: sha512-gAmrUZSGtKc3AiBL71iNWxDsyUC5uMaKKGdvzYsBoTW/xi42JQHl7eKV2OYzCUqvc+D2RCcf7EXY2iCyFIk6og==} - '@changesets/apply-release-plan@7.1.0': - resolution: {integrity: sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==} + '@changesets/apply-release-plan@7.1.1': + resolution: {integrity: sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA==} - '@changesets/assemble-release-plan@6.0.9': - resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} + '@changesets/assemble-release-plan@6.0.10': + resolution: {integrity: sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A==} '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} @@ -3357,24 +3160,24 @@ packages: '@changesets/changelog-github@0.6.0': resolution: {integrity: sha512-wA2/y4hR/A1K411cCT75rz0d46Iezxp1WYRFoFJDIUpkQ6oDBAIUiU7BZkDCmYgz0NBl94X1lgcZO+mHoiHnFg==} - '@changesets/cli@2.30.0': - resolution: {integrity: sha512-5D3Nk2JPqMI1wK25pEymeWRSlSMdo5QOGlyfrKg0AOufrUcjEE3RQgaCpHoBiM31CSNrtSgdJ0U6zL1rLDDfBA==} + '@changesets/cli@2.31.0': + resolution: {integrity: sha512-AhI4enNTgHu2IZr6K4WZyf0EPch4XVMn1yOMFmCD9gsfBGqMYaHXls5HyDv6/CL5axVQABz68eG30eCtbr2wFg==} hasBin: true - '@changesets/config@3.1.3': - resolution: {integrity: sha512-vnXjcey8YgBn2L1OPWd3ORs0bGC4LoYcK/ubpgvzNVr53JXV5GiTVj7fWdMRsoKUH7hhhMAQnsJUqLr21EncNw==} + '@changesets/config@3.1.4': + resolution: {integrity: sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.3': - resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} + '@changesets/get-dependents-graph@2.1.4': + resolution: {integrity: sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg==} '@changesets/get-github-info@0.8.0': resolution: {integrity: sha512-cRnC+xdF0JIik7coko3iUP9qbnfi1iJQ3sAa6dE+Tx3+ET8bjFEm63PA4WEohgjYcmsOikPHWzPsMWWiZmntOQ==} - '@changesets/get-release-plan@4.0.15': - resolution: {integrity: sha512-Q04ZaRPuEVZtA+auOYgFaVQQSA98dXiVe/yFaZfY7hoSmQICHGvP0TF4u3EDNHWmmCS4ekA/XSpKlSM2PyTS2g==} + '@changesets/get-release-plan@4.0.16': + resolution: {integrity: sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -3409,30 +3212,35 @@ packages: '@clickhouse/client-common@0.2.10': resolution: {integrity: sha512-BvTY0IXS96y9RUeNCpKL4HUzHmY80L0lDcGN0lmUD6zjOqYMn78+xyHYJ/AIAX7JQsc+/KwFt2soZutQTKxoGQ==} - '@clickhouse/client-common@1.18.2': - resolution: {integrity: sha512-J0SG6q9V31ydxonglpj9xhNRsUxCsF71iEZ784yldqMYwsHixj/9xHFDgBDX3DuMiDx/kPDfXnf+pimp08wIBA==} + '@clickhouse/client-common@1.18.3': + resolution: {integrity: sha512-3axzO3zvrsGT5PzDenxgWscltYCNRDbhaHWUgdsmcM9OnW/VnZn9EarOcZogr9P82Z0mQh+Jd2x+p2K4TFD2fA==} '@clickhouse/client@0.2.10': resolution: {integrity: sha512-ZwBgzjEAFN/ogS0ym5KHVbR7Hx/oYCX01qGp2baEyfN2HM73kf/7Vp3GvMHWRy+zUXISONEtFv7UTViOXnmFrg==} engines: {node: '>=16'} - '@clickhouse/client@1.18.2': - resolution: {integrity: sha512-fuquQswRSHWM6D079ZeuGqkMOsqtcUPL06UdTnowmoeeYjVrqisfVmvnw8pc3OeKS4kVb91oygb/MfLDiMs0TQ==} + '@clickhouse/client@1.18.3': + resolution: {integrity: sha512-340ngdYktL8PLUBK2QKSwe0o02tYfZSz1mSn1uXCEU8TxHvwh9pnQxElf9YHumDGj5gX/IdgxPsJTGMs82Hgug==} engines: {node: '>=16'} - '@cloudflare/workers-types@4.20260405.1': - resolution: {integrity: sha512-PokTmySa+D6MY01R1UfYH48korsN462NK/fl3aw47Hg7XuLuSo/RTpjT0vtWaJhJoFY5tHGOBBIbDcIc8wltLg==} + '@cloudflare/workers-types@4.20260422.1': + resolution: {integrity: sha512-kI4baXLJloST4J/PxAfhz3azy4TPC7L2wcX6nusOzSNJJD/L5CSsivSJobgkYaMG5yspzRFQUQlCdPza0nTHbQ==} '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} - '@conventional-changelog/git-client@2.5.1': - resolution: {integrity: sha512-lAw7iA5oTPWOLjiweb7DlGEMDEvzqzLLa6aWOly2FSZ64IwLE8T458rC+o+WvI31Doz6joM7X2DoNog7mX8r4A==} + '@commander-js/extra-typings@13.1.0': + resolution: {integrity: sha512-q5P52BYb1hwVWE6dtID7VvuJWrlfbCv4klj7BjUUOqMz4jbSZD4C9fJ9lRjL2jnBGTg+gDDlaXN51rkWcLk4fg==} + peerDependencies: + commander: ~13.1.0 + + '@conventional-changelog/git-client@2.7.0': + resolution: {integrity: sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==} engines: {node: '>=18'} peerDependencies: conventional-commits-filter: ^5.0.0 - conventional-commits-parser: ^6.1.0 + conventional-commits-parser: ^6.4.0 peerDependenciesMeta: conventional-commits-filter: optional: true @@ -3443,42 +3251,6 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@csstools/color-helpers@6.0.2': - resolution: {integrity: sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==} - engines: {node: '>=20.19.0'} - - '@csstools/css-calc@3.2.0': - resolution: {integrity: sha512-bR9e6o2BDB12jzN/gIbjHa5wLJ4UjD1CB9pM7ehlc0ddk6EBz+yYS1EV2MF55/HUxrHcB/hehAyt5vhsA3hx7w==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-color-parser@4.1.0': - resolution: {integrity: sha512-U0KhLYmy2GVj6q4T3WaAe6NPuFYCPQoE3b0dRGxejWDgcPp8TP7S5rVdM5ZrFaqu4N67X8YaPBw14dQSYx3IyQ==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-parser-algorithms': ^4.0.0 - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-parser-algorithms@4.0.0': - resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} - engines: {node: '>=20.19.0'} - peerDependencies: - '@csstools/css-tokenizer': ^4.0.0 - - '@csstools/css-syntax-patches-for-csstree@1.1.3': - resolution: {integrity: sha512-SH60bMfrRCJF3morcdk57WklujF4Jr/EsQUzqkarfHXEFcAR1gg7fS/chAE922Sehgzc1/+Tz5H3Ypa1HiEKrg==} - peerDependencies: - css-tree: ^3.2.1 - peerDependenciesMeta: - css-tree: - optional: true - - '@csstools/css-tokenizer@4.0.0': - resolution: {integrity: sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==} - engines: {node: '>=20.19.0'} - '@dabh/diagnostics@2.0.8': resolution: {integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==} @@ -3519,323 +3291,173 @@ packages: '@electric-sql/pglite@0.4.1': resolution: {integrity: sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==} - '@emnapi/core@1.8.1': - resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@emnapi/core@1.9.2': + resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} - '@esbuild/aix-ppc64@0.27.0': - resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + '@emnapi/runtime@1.9.2': + resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.0': - resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.0': - resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.0': - resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.0': - resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.0': - resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.0': - resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.0': - resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.0': - resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.0': - resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.0': - resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.0': - resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.0': - resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.0': - resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.0': - resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.0': - resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.0': - resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.0': - resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.0': - resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.0': - resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.0': - resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.0': - resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.0': - resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.0': - resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.0': - resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.0': - resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -3850,8 +3472,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': @@ -3862,12 +3484,12 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.2': - resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -3878,15 +3500,6 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@exodus/bytes@1.15.0': - resolution: {integrity: sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - '@noble/hashes': ^1.8.0 || ^2.0.0 - peerDependenciesMeta: - '@noble/hashes': - optional: true - '@faker-js/faker@10.4.0': resolution: {integrity: sha512-sDBWI3yLy8EcDzgobvJTWq1MJYzAkQdpjXuPukga9wXonhpMRvd1Izuo2Qgwey2OiEoRIBr35RMU9HJRoOHzpw==} engines: {node: ^20.19.0 || ^22.13.0 || ^23.5.0 || >=24.0.0, npm: '>=10'} @@ -3901,39 +3514,35 @@ packages: '@firebase/app-check-interop-types@0.3.3': resolution: {integrity: sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==} - '@firebase/app-types@0.9.3': - resolution: {integrity: sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==} + '@firebase/app-types@0.9.4': + resolution: {integrity: sha512-crX9TA5SVYZwLPG7/R16IsH8FLlgkPXjJUVhsVpHVDSqJiq3D/NuFTM5ctxGTExXAOeIn//69tQw47CPerM8MQ==} '@firebase/auth-interop-types@0.2.4': resolution: {integrity: sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==} - '@firebase/component@0.7.0': - resolution: {integrity: sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==} + '@firebase/component@0.7.2': + resolution: {integrity: sha512-iyVDGc6Vjx7Rm0cAdccLH/NG6fADsgJak/XW9IA2lPf8AjIlsemOpFGKczYyPHxm4rnKdR8z6sK4+KEC7NwmEg==} engines: {node: '>=20.0.0'} - '@firebase/database-compat@2.1.0': - resolution: {integrity: sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==} + '@firebase/database-compat@2.1.3': + resolution: {integrity: sha512-GMyfWjD8mehjg/QpNkY/tl9G/MoeugPeg91n9D0atggxbWuKF/2KhVPHZDH+XmoP0EKYqMWYTtKxBsaBaNKLYQ==} engines: {node: '>=20.0.0'} - '@firebase/database-types@1.0.16': - resolution: {integrity: sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==} + '@firebase/database-types@1.0.19': + resolution: {integrity: sha512-FqewjUZmV9LqFfuEnmgdcUpiOUz7qwLXxnm/H8BcMFEzQXtd1yyUDm8ex5VRad2nuTE+ahOuCjUAM/cyDncO+g==} - '@firebase/database@1.1.0': - resolution: {integrity: sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==} + '@firebase/database@1.1.2': + resolution: {integrity: sha512-lP96CMjMPy/+d1d9qaaHjHHdzdwvEOuyyLq9ehX89e2XMKwS1jHNzYBO+42bdSumuj5ukPbmnFtViZu8YOMT+w==} engines: {node: '>=20.0.0'} '@firebase/logger@0.5.0': resolution: {integrity: sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==} engines: {node: '>=20.0.0'} - '@firebase/util@1.13.0': - resolution: {integrity: sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==} + '@firebase/util@1.15.0': + resolution: {integrity: sha512-AmWf3cHAOMbrCPG4xdPKQaj5iHnyYfyLKZxwz+Xf55bqKbpAmcYifB4jQinT2W9XhDRHISOoPyBOariJpCG6FA==} engines: {node: '>=20.0.0'} - '@gar/promise-retry@1.0.3': - resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} - engines: {node: ^20.17.0 || >=22.9.0} - '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} @@ -3973,8 +3582,8 @@ packages: resolution: {integrity: sha512-zmXgrE5+xDHT25WcFCVhGscM3BpEKCCtD2j6kSkZXgovtLG8c6lpCYdEFaQpgvI6z/9gsaYrzPB5F7XIIl/g3w==} engines: {node: '>= 16'} - '@google-cloud/cloud-sql-connector@1.9.0': - resolution: {integrity: sha512-kCsWuWBCHBdRSyrNHoJ4lIsd6P3JeXQk3OopsS/TCfJzTs2dfEzQvwl5G7Gn7u/rX60m+X7wv4wHDMP2sG5AFA==} + '@google-cloud/cloud-sql-connector@1.10.0': + resolution: {integrity: sha512-PLix9OUaeAfVOKFAqw32/ETvFPef26mcTmDu/iVShGRs+MB1JkL98SwVLHsEjzjfnZrF+BtKqnseoFw0+3LmPw==} engines: {node: '>=18'} '@google-cloud/firestore@7.11.6': @@ -3997,8 +3606,8 @@ packages: resolution: {integrity: sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ==} engines: {node: '>=14'} - '@google/genai@1.40.0': - resolution: {integrity: sha512-fhIww8smT0QYRX78qWOiz/nIQhHMF5wXOrlXvj33HBrz3vKDBb+wibLcEmTA+L9dmPD4KmfNr7UF3LDQVTXNjA==} + '@google/genai@1.50.1': + resolution: {integrity: sha512-YbkX7H9+1Pt8wOt7DDREy8XSoiL6fRDzZQRyaVBarFf8MR3zHGqVdvM4cLbDXqPhxqvegZShgfxb8kw9C7YhAQ==} engines: {node: '>=20.0.0'} peerDependencies: '@modelcontextprotocol/sdk': ^1.25.2 @@ -4023,10 +3632,6 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@grpc/grpc-js@1.13.1': - resolution: {integrity: sha512-z5nNuIs75S73ZULjPDe5QCNTiCv7FyBZXEVWOyAHtcebnuJf0g1SuueI3U1/z/KK39XyAQRUC+C9ZQJOtgHynA==} - engines: {node: '>=12.10.0'} - '@grpc/grpc-js@1.14.3': resolution: {integrity: sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==} engines: {node: '>=12.10.0'} @@ -4041,18 +3646,36 @@ packages: engines: {node: '>=6'} hasBin: true - '@hono/node-server@1.19.11': - resolution: {integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==} + '@hono/node-server@2.0.0': + resolution: {integrity: sha512-n3GfHwwCvHCkGmOwKfxUPOlbfzuO64Sbc5XC4NGPIXxkuOnJrdgExdRKmHfF924r914WRJPT397GdqLvdYTeyQ==} + engines: {node: '>=20'} + peerDependencies: + hono: '>=4.12.7' + + '@hono/node-ws@1.3.0': + resolution: {integrity: sha512-ju25YbbvLuXdqBCmLZLqnNYu1nbHIQjoyUqA8ApZOeL1k4skuiTcw5SW77/5SUYo2Xi2NVBJoVlfQurnKEp03Q==} engines: {node: '>=18.14.1'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. peerDependencies: + '@hono/node-server': '>=1.19.10' hono: '>=4.12.7' - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@hono/zod-validator@0.7.6': + resolution: {integrity: sha512-Io1B6d011Gj1KknV4rXYz4le5+5EubcWEU/speUjuw9XMMIaP3n78yXLhjd2A3PXaXaUwEAluOiAyLqhBEJgsw==} + peerDependencies: + hono: '>=4.12.7' + zod: ^3.25.0 || ^4.0.0 + + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -4219,8 +3842,8 @@ packages: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + '@istanbuljs/schema@0.1.6': + resolution: {integrity: sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==} engines: {node: '>=8'} '@jest/console@30.3.0': @@ -4236,12 +3859,8 @@ packages: node-notifier: optional: true - '@jest/create-cache-key-function@30.2.0': - resolution: {integrity: sha512-44F4l4Enf+MirJN8X/NhdGkl71k5rBYiwdVlo4HxOwbu0sHV8QKrGEedb1VUU4K3W7fBKE0HGfbn7eZm0Ti3zg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - - '@jest/diff-sequences@30.0.1': - resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + '@jest/create-cache-key-function@30.3.0': + resolution: {integrity: sha512-hTupmOWylzeyqbMNeSNi7ZDprpjrcroAOOG+qCEW66st3+Z5RnYHVYkUt+zjIcLmrTUi2lPY79hJz8mB3L2oXQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jest/diff-sequences@30.3.0': @@ -4252,10 +3871,6 @@ packages: resolution: {integrity: sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.2.0': - resolution: {integrity: sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/expect-utils@30.3.0': resolution: {integrity: sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4313,10 +3928,6 @@ packages: resolution: {integrity: sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@30.2.0': - resolution: {integrity: sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@30.3.0': resolution: {integrity: sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -4331,9 +3942,6 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} @@ -4458,20 +4066,35 @@ packages: peerDependencies: apache-arrow: '>=15.0.0 <=18.1.0' + '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b} + version: 1.1.17 + engines: {node: ^18.19.0 || >=20.16.0} + peerDependencies: + '@langchain/core': workspace:^ + '@langchain/langgraph': ^0.2.57 || ^0.3.0 || ^0.4.0 || ^1.0.0-alpha || ^1.0.0 + '@langchain/langgraph-checkpoint': ~0.0.16 || ^0.1.0 || ~1.0.0 + '@langchain/langgraph-sdk': ^1.6.5 + typescript: ^5.5.4 + peerDependenciesMeta: + '@langchain/langgraph-sdk': + optional: true + '@langchain/langgraph-checkpoint@0.1.1': resolution: {integrity: sha512-h2bP0RUikQZu0Um1ZUPErQLXyhzroJqKRbRcxYRTAh49oNlsfeq4A3K4YEDRbGGuyPZI/Jiqwhks1wZwY73AZw==} engines: {node: '>=18'} peerDependencies: '@langchain/core': workspace:^ - '@langchain/langgraph-checkpoint@1.0.0': - resolution: {integrity: sha512-xrclBGvNCXDmi0Nz28t3vjpxSH6UYx6w5XAXSiiB1WEdc2xD2iY/a913I3x3a31XpInUW/GGfXXfePfaghV54A==} + '@langchain/langgraph-checkpoint@1.0.1': + resolution: {integrity: sha512-HM0cJLRpIsSlWBQ/xuDC67l52SqZ62Bh2Y61DX+Xorqwoh5e1KxYvfCD7GnSTbWWhjBOutvnR0vPhu4orFkZfw==} engines: {node: '>=18'} peerDependencies: '@langchain/core': workspace:^ - '@langchain/langgraph-checkpoint@1.0.1': - resolution: {integrity: sha512-HM0cJLRpIsSlWBQ/xuDC67l52SqZ62Bh2Y61DX+Xorqwoh5e1KxYvfCD7GnSTbWWhjBOutvnR0vPhu4orFkZfw==} + '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8} + version: 1.0.1 engines: {node: '>=18'} peerDependencies: '@langchain/core': workspace:^ @@ -4490,12 +4113,14 @@ packages: react-dom: optional: true - '@langchain/langgraph-sdk@1.6.0': - resolution: {integrity: sha512-J/B1SkCG0U+eXEXH/X89dDHxP8I0eULjLtXYvZ39uk2TxEKjLsrW4LY5J7Qwrf0GCDA+IM/agjKSLXALnctWTw==} + '@langchain/langgraph-sdk@1.8.10': + resolution: {integrity: sha512-wrB3rkRw5KAmsqezwvKP3midT4qJrV6Hj9XJMYo+cbvXC4HYpSAmyY/VriSyeTFRbLG/OP/pY2Yz+9Z54nSaXQ==} peerDependencies: '@langchain/core': workspace:^ react: ^18 || ^19 react-dom: ^18 || ^19 + svelte: ^4.0.0 || ^5.0.0 + vue: ^3.0.0 peerDependenciesMeta: '@langchain/core': optional: true @@ -4503,18 +4128,38 @@ packages: optional: true react-dom: optional: true + svelte: + optional: true + vue: + optional: true - '@langchain/langgraph-sdk@1.8.9': - resolution: {integrity: sha512-vpz90auS4iFTNy2X/CFexOEoeFSvaK+MyI7iSmzYs9gGcfzwRjWUJ4MWsuc5ZNRecLStwho0PExVXRgGOXtcRw==} + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b} + version: 1.8.8 peerDependencies: - '@langchain/core': workspace:^ react: ^18 || ^19 react-dom: ^18 || ^19 svelte: ^4.0.0 || ^5.0.0 vue: ^3.0.0 peerDependenciesMeta: - '@langchain/core': + react: + optional: true + react-dom: + optional: true + svelte: + optional: true + vue: optional: true + + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8} + version: 1.8.8 + peerDependencies: + react: ^18 || ^19 + react-dom: ^18 || ^19 + svelte: ^4.0.0 || ^5.0.0 + vue: ^3.0.0 + peerDependenciesMeta: react: optional: true react-dom: @@ -4524,6 +4169,12 @@ packages: vue: optional: true + '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8} + version: 1.1.17 + engines: {node: ^18.19.0 || >=20.16.0} + hasBin: true + '@langchain/langgraph@1.0.0-alpha.5': resolution: {integrity: sha512-Sg0LZ/zb0osMT+2/poTRH6GbmzSYxPVzZPXikjryCFMCw52HGbq0sLEXFsaqfs+1HCcDs1Ob6IPw8IucE5pM9Q==} engines: {node: '>=18'} @@ -4535,8 +4186,8 @@ packages: zod-to-json-schema: optional: true - '@langchain/langgraph@1.1.4': - resolution: {integrity: sha512-9OhRF+7Zvcpure8TLtBrxfJDo0PAoHZhfzcPL6M3CsGXiYqLWm5tQe+FYqn9zRIV7IwphqVEl1QDNbOkVgo+kw==} + '@langchain/langgraph@1.2.9': + resolution: {integrity: sha512-3c7BtGycHC2v9p6w/Hv8L7kEl1YnZYOQTDJtmAp3knk6JOedO7d2bYP3y0SRyhv5orUEGf/KGvx8ZsB/ideP7g==} engines: {node: '>=18'} peerDependencies: '@langchain/core': workspace:^ @@ -4546,8 +4197,9 @@ packages: zod-to-json-schema: optional: true - '@langchain/langgraph@1.2.9': - resolution: {integrity: sha512-3c7BtGycHC2v9p6w/Hv8L7kEl1YnZYOQTDJtmAp3knk6JOedO7d2bYP3y0SRyhv5orUEGf/KGvx8ZsB/ideP7g==} + '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b} + version: 1.2.8 engines: {node: '>=18'} peerDependencies: '@langchain/core': workspace:^ @@ -4563,6 +4215,9 @@ packages: peerDependencies: '@langchain/core': workspace:^ + '@langchain/protocol@0.0.12': + resolution: {integrity: sha512-BvWqm74n6cyY8cqRxeaV4WGe4aizA5Nmr3K5ACEvTd1MjkX5PyhCuMZouyR328xnT0mH0cnXlIUEc1cLioGjKA==} + '@layerup/layerup-security@1.6.0': resolution: {integrity: sha512-HSBZobDxgi0aHrEoN49RwLSbv60614upoE+noAR/nlysp8K1H1mu9EBw2cY5YTk6XbmEqEjddu9dMPb71NABMA==} @@ -4575,9 +4230,6 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mistralai/mistralai@1.14.0': - resolution: {integrity: sha512-6zaj2f2LCd37cRpBvCgctkDbXtYBlAC85p+u4uU/726zjtsI+sdVH34qRzkm9iE3tRb8BoaiI0/P7TD+uMvLLQ==} - '@mistralai/mistralai@1.15.1': resolution: {integrity: sha512-fb995eiz3r0KsBGtRjFV+/iLbX+UpfalxpF+YitT3R6ukrPD4PN+FGwwmYcRFhNAzVzDUtTVxQYnjQWEnwV5nw==} @@ -4591,14 +4243,20 @@ packages: '@cfworker/json-schema': optional: true - '@mongodb-js/saslprep@1.4.5': - resolution: {integrity: sha512-k64Lbyb7ycCSXHSLzxVdb2xsKGPMvYZfCICXvDsI8Z65CeWQzTEKS4YmGbnqw+U9RBvLPTsB6UCmwkgsDTGWIw==} + '@mongodb-js/saslprep@1.4.8': + resolution: {integrity: sha512-kpjr2jy2w71w0oqAMI8oibBmiF9lXxWkEQs5gMkW4hVE48bsqINGLxnCSYW62ck/NHXJQpQEfA9WlJ1sY0eqBg==} '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@nodable/entities@2.1.0': + resolution: {integrity: sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -4615,26 +4273,14 @@ packages: '@nodeutils/defaults-deep@1.1.0': resolution: {integrity: sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg==} - '@npmcli/agent@4.0.0': - resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} - engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/fs@1.1.1': resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} - '@npmcli/fs@5.0.0': - resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} - engines: {node: ^20.17.0 || >=22.9.0} - '@npmcli/move-file@1.1.2': resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} engines: {node: '>=10'} deprecated: This functionality has been moved to @npmcli/fs - '@npmcli/redact@4.0.0': - resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} - engines: {node: ^20.17.0 || >=22.9.0} - '@octokit/auth-token@6.0.0': resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} engines: {node: '>= 20'} @@ -4643,8 +4289,8 @@ packages: resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==} engines: {node: '>= 20'} - '@octokit/endpoint@11.0.2': - resolution: {integrity: sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==} + '@octokit/endpoint@11.0.3': + resolution: {integrity: sha512-FWFlNxghg4HrXkD3ifYbS/IdL/mDHjh9QcsNyhQjN8dplUoZbejsdpmuqdA76nxj2xoWPs7p8uX2SNr9rYu0Ag==} engines: {node: '>= 20'} '@octokit/graphql@9.0.3': @@ -4676,8 +4322,8 @@ packages: resolution: {integrity: sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==} engines: {node: '>= 20'} - '@octokit/request@10.0.7': - resolution: {integrity: sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==} + '@octokit/request@10.0.8': + resolution: {integrity: sha512-SJZNwY9pur9Agf7l87ywFi14W+Hd9Jg6Ifivsd33+/bGUQIjNujdFiXII2/qSlN2ybqUHfp5xpekMEjIBTjlSw==} engines: {node: '>= 20'} '@octokit/rest@22.0.1': @@ -4699,21 +4345,22 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/core@2.5.0': - resolution: {integrity: sha512-ka4H8OM6+DlUhSAZpONu0cPBtPPTQKxbxVzC4CzVx5+K4JnroJVBtDzLAMx4/3CDTJXRvVFhpFjtl4SaiTNoyQ==} + '@opentelemetry/api@1.9.1': + resolution: {integrity: sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/core@2.7.0': + resolution: {integrity: sha512-DT12SXVwV2eoJrGf4nnsvZojxxeQo+LlNAsoYGRRObPWTeN6APiqZ2+nqDCQDvQX40eLi1AePONS0onoASp3yQ==} engines: {node: ^18.19.0 || >=20.6.0} peerDependencies: '@opentelemetry/api': '>=1.0.0 <1.10.0' - '@opentelemetry/semantic-conventions@1.39.0': - resolution: {integrity: sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==} + '@opentelemetry/semantic-conventions@1.40.0': + resolution: {integrity: sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==} engines: {node: '>=14'} - '@oxc-project/types@0.113.0': - resolution: {integrity: sha512-Tp3XmgxwNQ9pEN9vxgJBAqdRamHibi76iowQ38O2I4PMpcvNRQNVsU2n1x1nv9yh0XoTrGFzf7cZSGxmixxrhA==} - - '@oxc-project/types@0.122.0': - resolution: {integrity: sha512-oLAl5kBpV4w69UtFZ9xqcmTi+GENWOcPF7FCrczTiBbmC0ibXxCwyvZGbO39rCVEuLGAZM84DH0pUIyyv/YJzA==} + '@oxc-project/types@0.126.0': + resolution: {integrity: sha512-oGfVtjAgwQVVpfBrbtk4e1XDyWHRFta6BS3GWVzrF8xYBT2VGQAk39yJS/wFSMrZqoiCU4oghT3Ch0HaHGIHcQ==} '@oxfmt/binding-android-arm-eabi@0.43.0': resolution: {integrity: sha512-CgU2s+/9hHZgo0IxVxrbMPrMj+tJ6VM3mD7Mr/4oiz4FNTISLoCvRmB5nk4wAAle045RtRjd86m673jwPyb1OQ==} @@ -4829,116 +4476,116 @@ packages: cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.58.0': - resolution: {integrity: sha512-1T7UN3SsWWxpWyWGn1cT3ASNJOo+pI3eUkmEl7HgtowapcV8kslYpFQcYn431VuxghXakPNlbjRwhqmR37PFOg==} + '@oxlint/binding-android-arm-eabi@1.61.0': + resolution: {integrity: sha512-6eZBPgiigK5txqoVgRqxbaxiom4lM8AP8CyKPPvpzKnQ3iFRFOIDc+0AapF+qsUSwjOzr5SGk4SxQDpQhkSJMQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.58.0': - resolution: {integrity: sha512-GryzujxuiRv2YFF7bRy8mKcxlbuAN+euVUtGJt9KKbLT8JBUIosamVhcthLh+VEr6KE6cjeVMAQxKAzJcoN7dg==} + '@oxlint/binding-android-arm64@1.61.0': + resolution: {integrity: sha512-CkwLR69MUnyv5wjzebvbbtTSUwqLxM35CXE79bHqDIK+NtKmPEUpStTcLQRZMCo4MP0qRT6TXIQVpK0ZVScnMA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.58.0': - resolution: {integrity: sha512-7/bRSJIwl4GxeZL9rPZ11anNTyUO9epZrfEJH/ZMla3+/gbQ6xZixh9nOhsZ0QwsTW7/5J2A/fHbD1udC5DQQA==} + '@oxlint/binding-darwin-arm64@1.61.0': + resolution: {integrity: sha512-8JbefTkbmvqkqWjmQrHke+MdpgT2UghhD/ktM4FOQSpGeCgbMToJEKdl9zwhr/YWTl92i4QI1KiTwVExpcUN8A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.58.0': - resolution: {integrity: sha512-EqdtJSiHweS2vfILNrpyJ6HUwpEq2g7+4Zx1FPi4hu3Hu7tC3znF6ufbXO8Ub2LD4mGgznjI7kSdku9NDD1Mkg==} + '@oxlint/binding-darwin-x64@1.61.0': + resolution: {integrity: sha512-uWpoxDT47hTnDLcdEh5jVbso8rlTTu5o0zuqa9J8E0JAKmIWn7kGFEIB03Pycn2hd2vKxybPGLhjURy/9We5FQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.58.0': - resolution: {integrity: sha512-VQt5TH4M42mY20F545G637RKxV/yjwVtKk2vfXuazfReSIiuvWBnv+FVSvIV5fKVTJNjt3GSJibh6JecbhGdBw==} + '@oxlint/binding-freebsd-x64@1.61.0': + resolution: {integrity: sha512-K/o4hEyW7flfMel0iBVznmMBt7VIMHGdjADocHKpK1DUF9erpWnJ+BSSWd2W0c8K3mPtpph+CuHzRU6CI3l9jQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.58.0': - resolution: {integrity: sha512-fBYcj4ucwpAtjJT3oeBdFBYKvNyjRSK+cyuvBOTQjh0jvKp4yeA4S/D0IsCHus/VPaNG5L48qQkh+Vjy3HL2/Q==} + '@oxlint/binding-linux-arm-gnueabihf@1.61.0': + resolution: {integrity: sha512-P6040ZkcyweJ0Po9yEFqJCdvZnf3VNCGs1SIHgXDf8AAQNC6ID/heXQs9iSgo2FH7gKaKq32VWc59XZwL34C5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.58.0': - resolution: {integrity: sha512-0BeuFfwlUHlJ1xpEdSD1YO3vByEFGPg36uLjK1JgFaxFb4W6w17F8ET8sz5cheZ4+x5f2xzdnRrrWv83E3Yd8g==} + '@oxlint/binding-linux-arm-musleabihf@1.61.0': + resolution: {integrity: sha512-bwxrGCzTZkuB+THv2TQ1aTkVEfv5oz8sl+0XZZCpoYzErJD8OhPQOTA0ENPd1zJz8QsVdSzSrS2umKtPq4/JXg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.58.0': - resolution: {integrity: sha512-TXlZgnPTlxrQzxG9ZXU7BNwx1Ilrr17P3GwZY0If2EzrinqRH3zXPc3HrRcBJgcsoZNMuNL5YivtkJYgp467UQ==} + '@oxlint/binding-linux-arm64-gnu@1.61.0': + resolution: {integrity: sha512-vkhb9/wKguMkLlrm3FoJW/Xmdv31GgYAE+x8lxxQ+7HeOxXUySI0q36a3NTVIuQUdLzxCI1zzMGsk1o37FOe3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxlint/binding-linux-arm64-musl@1.58.0': - resolution: {integrity: sha512-zSoYRo5dxHLcUx93Stl2hW3hSNjPt99O70eRVWt5A1zwJ+FPjeCCANCD2a9R4JbHsdcl11TIQOjyigcRVOH2mw==} + '@oxlint/binding-linux-arm64-musl@1.61.0': + resolution: {integrity: sha512-bl1dQh8LnVqsj6oOQAcxwbuOmNJkwc4p6o//HTBZhNTzJy21TLDwAviMqUFNUxDHkPGpmdKTSN4tWTjLryP8xg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@oxlint/binding-linux-ppc64-gnu@1.58.0': - resolution: {integrity: sha512-NQ0U/lqxH2/VxBYeAIvMNUK1y0a1bJ3ZicqkF2c6wfakbEciP9jvIE4yNzCFpZaqeIeRYaV7AVGqEO1yrfVPjA==} + '@oxlint/binding-linux-ppc64-gnu@1.61.0': + resolution: {integrity: sha512-QoOX6KB2IiEpyOj/HKqaxi+NQHPnOgNgnr22n9N4ANJCzXkUlj1UmeAbFb4PpqdlHIzvGDM5xZ0OKtcLq9RhiQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@oxlint/binding-linux-riscv64-gnu@1.58.0': - resolution: {integrity: sha512-X9J+kr3gIC9FT8GuZt0ekzpNUtkBVzMVU4KiKDSlocyQuEgi3gBbXYN8UkQiV77FTusLDPsovjo95YedHr+3yg==} + '@oxlint/binding-linux-riscv64-gnu@1.61.0': + resolution: {integrity: sha512-1TGcTerjY6p152wCof3oKElccq3xHljS/Mucp04gV/4ATpP6nO7YNnp7opEg6SHkv2a57/b4b8Ndm9znJ1/qAw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxlint/binding-linux-riscv64-musl@1.58.0': - resolution: {integrity: sha512-CDze3pi1OO3Wvb/QsXjmLEY4XPKGM6kIo82ssNOgmcl1IdndF9VSGAE38YLhADWmOac7fjqhBw82LozuUVxD0Q==} + '@oxlint/binding-linux-riscv64-musl@1.61.0': + resolution: {integrity: sha512-65wXEmZIrX2ADwC8i/qFL4EWLSbeuBpAm3suuX1vu4IQkKd+wLT/HU/BOl84kp91u2SxPkPDyQgu4yrqp8vwVA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - '@oxlint/binding-linux-s390x-gnu@1.58.0': - resolution: {integrity: sha512-b/89glbxFaEAcA6Uf1FvCNecBJEgcUTsV1quzrqXM/o4R1M4u+2KCVuyGCayN2UpsRWtGGLb+Ver0tBBpxaPog==} + '@oxlint/binding-linux-s390x-gnu@1.61.0': + resolution: {integrity: sha512-TVvhgMvor7Qa6COeXxCJ7ENOM+lcAOGsQ0iUdPSCv2hxb9qSHLQ4XF1h50S6RE1gBOJ0WV3rNukg4JJJP1LWRA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@oxlint/binding-linux-x64-gnu@1.58.0': - resolution: {integrity: sha512-0/yYpkq9VJFCEcuRlrViGj8pJUFFvNS4EkEREaN7CB1EcLXJIaVSSa5eCihwBGXtOZxhnblWgxks9juRdNQI7w==} + '@oxlint/binding-linux-x64-gnu@1.61.0': + resolution: {integrity: sha512-SjpS5uYuFoDnDdZPwZE59ndF95AsY47R5MliuneTWR1pDm2CxGJaYXbKULI71t5TVfLQUWmrHEGRL9xvuq6dnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxlint/binding-linux-x64-musl@1.58.0': - resolution: {integrity: sha512-hr6FNvmcAXiH+JxSvaJ4SJ1HofkdqEElXICW9sm3/Rd5eC3t7kzvmLyRAB3NngKO2wzXRCAm4Z/mGWfrsS4X8w==} + '@oxlint/binding-linux-x64-musl@1.61.0': + resolution: {integrity: sha512-gGfAeGD4sNJGILZbc/yKcIimO9wQnPMoYp9swAaKeEtwsSQAbU+rsdQze5SBtIP6j0QDzeYd4XSSUCRCF+LIeQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@oxlint/binding-openharmony-arm64@1.58.0': - resolution: {integrity: sha512-R+O368VXgRql1K6Xar+FEo7NEwfo13EibPMoTv3sesYQedRXd6m30Dh/7lZMxnrQVFfeo4EOfYIP4FpcgWQNHg==} + '@oxlint/binding-openharmony-arm64@1.61.0': + resolution: {integrity: sha512-OlVT0LrG/ct33EVtWRyR+B/othwmDWeRxfi13wUdPeb3lAT5TgTcFDcfLfarZtzB4W1nWF/zICMgYdkggX2WmQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.58.0': - resolution: {integrity: sha512-Q0FZiAY/3c4YRj4z3h9K1PgaByrifrfbBoODSeX7gy97UtB7pySPUQfC2B/GbxWU6k7CzQrRy5gME10PltLAFQ==} + '@oxlint/binding-win32-arm64-msvc@1.61.0': + resolution: {integrity: sha512-vI//NZPJk6DToiovPtaiwD4iQ7kO1r5ReWQD0sOOyKRtP3E2f6jxin4uvwi3OvDzHA2EFfd7DcZl5dtkQh7g1w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.58.0': - resolution: {integrity: sha512-Y8FKBABrSPp9H0QkRLHDHOSUgM/309a3IvOVgPcVxYcX70wxJrk608CuTg7w+C6vEd724X5wJoNkBcGYfH7nNQ==} + '@oxlint/binding-win32-ia32-msvc@1.61.0': + resolution: {integrity: sha512-0ySj4/4zd2XjePs3XAQq7IigIstN4LPQZgCyigX5/ERMLjdWAJfnxcTsrtxZxuij8guJW8foXuHmhGxW0H4dDA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.58.0': - resolution: {integrity: sha512-bCn5rbiz5My+Bj7M09sDcnqW0QJyINRVxdZ65x1/Y2tGrMwherwK/lpk+HRQCKvXa8pcaQdF5KY5j54VGZLwNg==} + '@oxlint/binding-win32-x64-msvc@1.61.0': + resolution: {integrity: sha512-0xgSiyeqDLDZxXoe9CVJrOx3TUVsfyoOY7cNi03JbItNcC9WCZqrSNdrAbHONxhSPaVh/lzfnDcON1RqSUMhHw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -4958,8 +4605,8 @@ packages: resolution: {integrity: sha512-z7737KUA1hXwd508q1+o4bnRxj0NpMmzA2beyaFm7Y+EC2TYLT5ABuYsn/qhiwiEsYp8v1qS596eBhhvgNagig==} engines: {node: '>=18.0.0'} - '@pinecone-database/pinecone@7.1.0': - resolution: {integrity: sha512-w6HoBCriv4NKOVFjdj4/KuJ6df7RZpQEsZ61VctRzoauTXQpe8wpccsS94AawxAxMOu7hOTXVlcQ5QLHYKjrDA==} + '@pinecone-database/pinecone@7.2.0': + resolution: {integrity: sha512-urGsnNDWSSqSaWdyEF2P6V5bTNtRA6yMQTheFYAKKwk7mkloRBBETtT2ADF5Y8gJTr88pW5D8NTcCCLe+f0e2Q==} engines: {node: '>=20.0.0'} '@pinojs/redact@0.4.0': @@ -4977,13 +4624,13 @@ packages: resolution: {integrity: sha512-DeMEVtQXwyYQDEztj3iuwJ7IdIqYgd68m26gsXpkRJ7rJd0V9Q0cSzQQ32ziwK04nFXuOfu1/RKAXwq6arIZZA==} engines: {node: '>=16'} - '@playwright/test@1.58.2': - resolution: {integrity: sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==} + '@playwright/test@1.59.1': + resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} engines: {node: '>=18'} hasBin: true - '@prisma/client-runtime-utils@7.6.0': - resolution: {integrity: sha512-fD7jlqubsZvVODKvsp9lOpXVecx2aWGxC2l35Ioz2t+teUJ5CfR0SAMsi7UkU1VvaZmmm+DS6BdujF622nY7tQ==} + '@prisma/client-runtime-utils@7.7.0': + resolution: {integrity: sha512-BLyd0UpFYOtyJFTHm7jS9vesHW7P83abibodQMiIofqjBKzDHQ1VAsQkdfvXyYDkPlONPfOTz7/rv3x/+CQqvQ==} '@prisma/client@4.16.2': resolution: {integrity: sha512-qCoEyxv1ZrQ4bKy39GnylE8Zq31IRmm8bNhNbZx7bF2cU5aiCCnSa93J2imF88MBjn7J9eUQneNxUQVJdl/rPQ==} @@ -4994,8 +4641,8 @@ packages: prisma: optional: true - '@prisma/client@7.6.0': - resolution: {integrity: sha512-7Pe/1ayh3GgWPEg4mmT4ax77LJ1wC+XlnIFvQ94bLP2DsUnOpnruQQR3Jw7r+Frthk94QqDNxo3FjSg8h9PXeQ==} + '@prisma/client@7.7.0': + resolution: {integrity: sha512-5Ar4OsZpJ54s21sy5oDNNW9gQtd4NuxCaiM7+JDTOU07D6VvlpLjYzAVCMB1+JzokN+08dAVomlx+b7bhJd3ww==} engines: {node: ^20.19 || ^22.12 || >=24.0} peerDependencies: prisma: '*' @@ -5006,14 +4653,14 @@ packages: typescript: optional: true - '@prisma/config@7.6.0': - resolution: {integrity: sha512-MuAz1MK4PeG5/03YzfzX3CnFVHQ6qePGwUpQRzPzX5tT0ffJ3Tzi9zJZbBc+VzEGFCM8ghW/gTVDR85Syjt+Yw==} + '@prisma/config@7.7.0': + resolution: {integrity: sha512-hmPI3tKLO2aP0Y5vugbjcnA9qqlfJndiT6ds4tw28U5hNHLWg+mHJEWAhjsSPgxjtmxhJ/EDIeIlyh+3Us0OPg==} '@prisma/debug@7.2.0': resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==} - '@prisma/debug@7.6.0': - resolution: {integrity: sha512-LpHr3qos4lQZ6sxwjStf59YBht7m9/QF7NSQsMH6qGENWZu2w3UkQUGn1h5iRkDjnWRj3VHykOu9qFhps4ADvA==} + '@prisma/debug@7.7.0': + resolution: {integrity: sha512-12J62XdqCmpiwJHhHdQxZeY3ckVCWIFmcJP8hg5dPTceeiQ0wiojXGFYTluKqFQfu46fRLgb/rLALZMAx3+dTA==} '@prisma/dev@0.24.3': resolution: {integrity: sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==} @@ -5027,17 +4674,17 @@ packages: '@prisma/engines@4.16.2': resolution: {integrity: sha512-vx1nxVvN4QeT/cepQce68deh/Turxy5Mr+4L4zClFuK1GlxN3+ivxfuv+ej/gvidWn1cE1uAhW7ALLNlYbRUAw==} - '@prisma/engines@7.6.0': - resolution: {integrity: sha512-Sn5edRzhHqgRV2M+A0eIbY442B4mReWWf3pKs/LKreYgW7oa/up8JtK/s4iv/EQA097cyboZ08mmkpbLp+tZ3w==} + '@prisma/engines@7.7.0': + resolution: {integrity: sha512-7fmcbT7HHXBq/b+3h/dO1JI3fd8l8q7erf7xP7pRprh58hmSSnG8mg9K3yjW3h9WaHWUwngVFpSxxxivaitQ2w==} - '@prisma/fetch-engine@7.6.0': - resolution: {integrity: sha512-N575Ni95c3FkduWY/eKTHqNYgNbceZ1tQaSknVtJjpKmiiBXmniESn/GTxsDvICC4ZeiNrXxioGInzQrCdx16w==} + '@prisma/fetch-engine@7.7.0': + resolution: {integrity: sha512-TfyzveBQoK4xALzsTpVhB/0KG1N8zOK0ap+RnBMkzGUu3f98fnQ4QtXa2wlKPhsO2X8a3N5ugFQgcKNoHGmDfw==} '@prisma/get-platform@7.2.0': resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==} - '@prisma/get-platform@7.6.0': - resolution: {integrity: sha512-ohZDwXvtmnbzOcutR2D13lDWpZP1wQjmPyztmt0AwXLzQI7q95EE7NYCvS+M6N6SivT+BM0NOqLmTH3wms4L3A==} + '@prisma/get-platform@7.7.0': + resolution: {integrity: sha512-MEUNzvKxvYnJ7kgvd6oNRnMmmiGNS9TYLB2weMeIXplnHdL/UWEGnvavYGnN7KLJ2n0iI4dDAyzSkHI3c7AscQ==} '@prisma/query-plan-executor@7.2.0': resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==} @@ -5093,12 +4740,6 @@ packages: engines: {node: '>=18'} hasBin: true - '@qdrant/js-client-rest@1.16.2': - resolution: {integrity: sha512-Zm4wEZURrZ24a+Hmm4l1QQYjiz975Ep3vF0yzWR7ICGcxittNz47YK2iBOk8kb8qseCu8pg7WmO1HOIsO8alvw==} - engines: {node: '>=18.17.0', pnpm: '>=8'} - peerDependencies: - typescript: '>=4.7' - '@qdrant/js-client-rest@1.17.0': resolution: {integrity: sha512-aZFQeirWVqWAa1a8vJ957LMzcXkFHGbsoRhzc8AkGfg6V0jtK8PlG8/eyyc2xhYsR961FDDx1Tx6nyE0K7lS+A==} engines: {node: '>=18.17.0', pnpm: '>=8'} @@ -5191,24 +4832,27 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@redis/bloom@5.11.0': - resolution: {integrity: sha512-KYiVilAhAFN3057afUb/tfYJpsEyTkQB+tQcn5gVVA7DgcNOAj8lLxe4j8ov8BF6I9C1Fe/kwlbuAICcTMX8Lw==} - engines: {node: '>= 18'} + '@redis/bloom@5.12.1': + resolution: {integrity: sha512-PUUfv+ms7jgPSBVoo/DN4AkPHj4D5TZSd6SbJX7egzBplkYUcKmHRE8RKia7UtZ8bSQbLguLvxVO+asKtQfZWA==} + engines: {node: '>= 18.19.0'} peerDependencies: - '@redis/client': ^5.11.0 + '@redis/client': ^5.12.1 '@redis/client@1.6.1': resolution: {integrity: sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==} engines: {node: '>=14'} - '@redis/client@5.11.0': - resolution: {integrity: sha512-GHoprlNQD51Xq2Ztd94HHV94MdFZQ3CVrpA04Fz8MVoHM0B7SlbmPEVIjwTbcv58z8QyjnrOuikS0rWF03k5dQ==} - engines: {node: '>= 18'} + '@redis/client@5.12.1': + resolution: {integrity: sha512-7aPGWeqA3uFm43o19umzdl16CEjK/JQGtSXVPevplTaOU3VJA/rseBC1QvYUz9lLDIMBimc4SW/zrW4S89BaCA==} + engines: {node: '>= 18.19.0'} peerDependencies: '@node-rs/xxhash': ^1.1.0 + '@opentelemetry/api': '>=1 <2' peerDependenciesMeta: '@node-rs/xxhash': optional: true + '@opentelemetry/api': + optional: true '@redis/graph@1.1.1': resolution: {integrity: sha512-FEMTcTHZozZciLRl6GiiIB4zGm5z5F3F6a6FZCyrfxdKOhFlGkiAqlexWMBzCi4DcRoyiOsuLfW+cjlGWyExOw==} @@ -5220,51 +4864,45 @@ packages: peerDependencies: '@redis/client': ^1.0.0 - '@redis/json@5.11.0': - resolution: {integrity: sha512-1iAy9kAtcD0quB21RbPTbUqqy+T2Uu2JxucwE+B4A+VaDbIRvpZR6DMqV8Iqaws2YxJYB3GC5JVNzPYio2ErUg==} - engines: {node: '>= 18'} + '@redis/json@5.12.1': + resolution: {integrity: sha512-eOze75esLve4vfqDel7aMX08CNaiLLQS2fV8mpRN9NxPe1rVR4vQyYiW/OgtGUysF6QOr9ANhfxABKNOJfXdKg==} + engines: {node: '>= 18.19.0'} peerDependencies: - '@redis/client': ^5.11.0 + '@redis/client': ^5.12.1 '@redis/search@1.2.0': resolution: {integrity: sha512-tYoDBbtqOVigEDMAcTGsRlMycIIjwMCgD8eR2t0NANeQmgK/lvxNAvYyb6bZDD4frHRhIHkJu2TBRvB0ERkOmw==} peerDependencies: '@redis/client': ^1.0.0 - '@redis/search@5.11.0': - resolution: {integrity: sha512-g1l7f3Rnyk/xI99oGHIgWHSKFl45Re5YTIcO8j/JE8olz389yUFyz2+A6nqVy/Zi031VgPDWscbbgOk8hlhZ3g==} - engines: {node: '>= 18'} + '@redis/search@5.12.1': + resolution: {integrity: sha512-ItlxbxC9cKI6IU1TLWoczwJCRb6TdmkEpWv05UrPawqaAnWGRu3rcIqsc5vN483T2fSociuyV1UkWIL5I4//2w==} + engines: {node: '>= 18.19.0'} peerDependencies: - '@redis/client': ^5.11.0 + '@redis/client': ^5.12.1 '@redis/time-series@1.1.0': resolution: {integrity: sha512-c1Q99M5ljsIuc4YdaCwfUEXsofakb9c8+Zse2qxTadu8TalLXuAESzLvFAvNVbkmSlvlzIQOLpBCmWI9wTOt+g==} peerDependencies: '@redis/client': ^1.0.0 - '@redis/time-series@5.11.0': - resolution: {integrity: sha512-TWFeOcU4xkj0DkndnOyhtxvX1KWD+78UHT3XX3x3XRBUGWeQrKo3jqzDsZwxbggUgf9yLJr/akFHXru66X5UQA==} - engines: {node: '>= 18'} + '@redis/time-series@5.12.1': + resolution: {integrity: sha512-c6JL6E3EcZJuNqKFz+KM+l9l5mpcQiKvTwgA3blt5glWJ8hjDk0yeHN3beE/MpqYIQ8UEX44ItQzgkE/gCBELQ==} + engines: {node: '>= 18.19.0'} peerDependencies: - '@redis/client': ^5.11.0 + '@redis/client': ^5.12.1 '@rockset/client@0.9.2': resolution: {integrity: sha512-NplpMY/DZl+cQPJqgteIhgf+vRVjWAPMqSafPgf7Jho+TRMLuMn3p82OMYbPuKhQ90S43rpINzQfQKZj7n/K4Q==} - '@rolldown/binding-android-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-pv1y2Fv0JybcykuiiD3qBOBdz6RteYojRFY1d+b95WVuzx211CRh+ytI/+9iVyWQ6koTh5dawe4S/yRfOFjgaA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - - '@rolldown/binding-android-arm64@1.0.0-rc.4': - resolution: {integrity: sha512-vRq9f4NzvbdZavhQbjkJBx7rRebDKYR9zHfO/Wg486+I7bSecdUapzCm5cyXoK+LHokTxgSq7A5baAXUZkIz0w==} + '@rolldown/binding-android-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-rhY3k7Bsae9qQfOtph2Pm2jZEA+s8Gmjoz4hhmx70K9iMQ/ddeae+xhRQcM5IuVx5ry1+bGfkvMn7D6MJggVSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-cFYr6zTG/3PXXF3pUO+umXxt1wkRK/0AYT8lDwuqvRC+LuKYWSAQAQZjCWDQpAH172ZV6ieYrNnFzVVcnSflAg==} + '@rolldown/binding-darwin-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-rNz0yK078yrNn3DrdgN+PKiMOW8HfQ92jQiXxwX8yW899ayV00MLVdaCNeVBhG/TbH3ouYVObo8/yrkiectkcQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -5275,14 +4913,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-rc.4': - resolution: {integrity: sha512-kFgEvkWLqt3YCgKB5re9RlIrx9bRsvyVUnaTakEpOPuLGzLpLapYxE9BufJNvPg8GjT6mB1alN4yN1NjzoeM8Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - - '@rolldown/binding-darwin-x64@1.0.0-rc.12': - resolution: {integrity: sha512-ZCsYknnHzeXYps0lGBz8JrF37GpE9bFVefrlmDrAQhOEi4IOIlcoU1+FwHEtyXGx2VkYAvhu7dyBf75EJQffBw==} + '@rolldown/binding-darwin-x64@1.0.0-rc.16': + resolution: {integrity: sha512-r/OmdR00HmD4i79Z//xO06uEPOq5hRXdhw7nzkxQxwSavs3PSHa1ijntdpOiZ2mzOQ3fVVu8C1M19FoNM+dMUQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -5293,38 +4925,20 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-rc.4': - resolution: {integrity: sha512-JXmaOJGsL/+rsmMfutcDjxWM2fTaVgCHGoXS7nE8Z3c9NAYjGqHvXrAhMUZvMpHS/k7Mg+X7n/MVKb7NYWKKww==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': - resolution: {integrity: sha512-dMLeprcVsyJsKolRXyoTH3NL6qtsT0Y2xeuEA8WQJquWFXkEC4bcu1rLZZSnZRMtAqwtrF/Ib9Ddtpa/Gkge9Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - - '@rolldown/binding-freebsd-x64@1.0.0-rc.4': - resolution: {integrity: sha512-ep3Catd6sPnHTM0P4hNEvIv5arnDvk01PfyJIJ+J3wVCG1eEaPo09tvFqdtcaTrkwQy0VWR24uz+cb4IsK53Qw==} + '@rolldown/binding-freebsd-x64@1.0.0-rc.16': + resolution: {integrity: sha512-KcRE5w8h0OnjUatG8pldyD14/CQ5Phs1oxfR+3pKDjboHRo9+MkqQaiIZlZRpsxC15paeXme/I127tUa9TXJ6g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': - resolution: {integrity: sha512-YqWjAgGC/9M1lz3GR1r1rP79nMgo3mQiiA+Hfo+pvKFK1fAJ1bCi0ZQVh8noOqNacuY1qIcfyVfP6HoyBRZ85Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4': - resolution: {integrity: sha512-LwA5ayKIpnsgXJEwWc3h8wPiS33NMIHd9BhsV92T8VetVAbGe2qXlJwNVDGHN5cOQ22R9uYvbrQir2AB+ntT2w==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': + resolution: {integrity: sha512-bT0guA1bpxEJ/ZhTRniQf7rNF8ybvXOuWbNIeLABaV5NGjx4EtOWBTSRGWFU9ZWVkPOZ+HNFP8RMcBokBiZ0Kg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-/I5AS4cIroLpslsmzXfwbe5OmWvSsrFuEw3mwvbQ1kDxJ822hFHIx+vsN/TAzNVyepI/j/GSzrtCIwQPeKCLIg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-+tHktCHWV8BDQSjemUqm/Jl/TPk3QObCTIjmdDy/nlupcujZghmKK2962LYrqFpWu+ai01AN/REOH3NEpqvYQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -5335,14 +4949,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4': - resolution: {integrity: sha512-AC1WsGdlV1MtGay/OQ4J9T7GRadVnpYRzTcygV1hKnypbYN20Yh4t6O1Sa2qRBMqv1etulUknqXjc3CTIsBu6A==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-V6/wZztnBqlx5hJQqNWwFdxIKN0m38p8Jas+VoSfgH54HSj9tKTt1dZvG6JRHcjh6D7TvrJPWFGaY9UBVOaWPw==} + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': + resolution: {integrity: sha512-3fPzdREH806oRLxpTWW1Gt4tQHs0TitZFOECB2xzCFLPKnSOy90gwA7P29cksYilFO6XVRY1kzga0cL2nRjKPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -5353,26 +4961,20 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': - resolution: {integrity: sha512-lU+6rgXXViO61B4EudxtVMXSOfiZONR29Sys5VGSetUY7X8mg9FCKIIjcPPj8xNDeYzKl+H8F/qSKOBVFJChCQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-AP3E9BpcUYliZCxa3w5Kwj9OtEVDYK6sVoUzy4vTOJsjPOgdaJZKFmN4oOlX0Wp0RPV2ETfmIra9x1xuayFB7g==} + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-EKwI1tSrLs7YVw+JPJT/G2dJQ1jl9qlTTTEG0V2Ok/RdOenRfBw2PQdLPyjhIu58ocdBfP7vIRN/pvMsPxs/AQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-nWwpvUSPkoFmZo0kQazZYOrT7J5DGOJ/+QHHzjvNlooDZED8oH82Yg67HvehPPLAg5fUff7TfWFHQS8IV1n3og==} + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-Uknladnb3Sxqu6SEcqBldQyJUpk8NleooZEc0MbRBJ4inEhRYWZX0NJu12vNf2mqAq7gsofAxHrGghiUYjhaLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': - resolution: {integrity: sha512-RNrafz5bcwRy+O9e6P8Z/OCAJW/A+qtBczIqVYwTs14pf4iV1/+eKEjdOUta93q2TsT/FI0XYDP3TCky38LMAg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': + resolution: {integrity: sha512-FIb8+uG49sZBtLTn+zt1AJ20TqVcqWeSIyoVt0or7uAWesgKaHbiBh6OpA/k9v0LTt+PTrb1Lao133kP4uVxkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -5383,14 +4985,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': - resolution: {integrity: sha512-DZaN1f0PGp/bSvKhtw50pPsnln4T13ycDq1FrDWRiHmWt1JeW+UtYg9touPFf8yt993p8tS2QjybpzKNTxYEwg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': - resolution: {integrity: sha512-Jpw/0iwoKWx3LJ2rc1yjFrj+T7iHZn2JDg1Yny1ma0luviFS4mhAIcd1LFNxK3EYu3DHWCps0ydXQ5i/rrJ2ig==} + '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': + resolution: {integrity: sha512-RuERhF9/EgWxZEXYWCOaViUWHIboceK4/ivdtQ3R0T44NjLkIIlGIAVAuCddFxsZ7vnRHtNQUrt2vR2n2slB2w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -5401,36 +4997,19 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': - resolution: {integrity: sha512-RnGxwZLN7fhMMAItnD6dZ7lvy+TI7ba+2V54UF4dhaWa/p8I/ys1E73KO6HmPmgz92ZkfD8TXS1IMV8+uhbR9g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': - resolution: {integrity: sha512-vRugONE4yMfVn0+7lUKdKvN4D5YusEiPilaoO2sgUWpCvrncvWgPMzK00ZFFJuiPgLwgFNP5eSiUlv2tfc+lpA==} + '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': + resolution: {integrity: sha512-mXcXnvd9GpazCxeUCCnZ2+YF7nut+ZOEbE4GtaiPtyY6AkhZWbK70y1KK3j+RDhjVq5+U8FySkKRb/+w0EeUwA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': - resolution: {integrity: sha512-6lcI79+X8klGiGd8yHuTgQRjuuJYNggmEml+RsyN596P23l/zf9FVmJ7K0KVKkFAeYEdg0iMUKyIxiV5vebDNQ==} + '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': + resolution: {integrity: sha512-3Q2KQxnC8IJOLqXmUMoYwyIPZU9hzRbnHaoV3Euz+VVnjZKcY8ktnNP8T9R4/GGQtb27C/UYKABxesKWb8lsvQ==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [openharmony] - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': - resolution: {integrity: sha512-ykGiLr/6kkiHc0XnBfmFJuCjr5ZYKKofkx+chJWDjitX+KsJuAmrzWhwyOMSHzPhzOHOy7u9HlFoa5MoAOJ/Zg==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': - resolution: {integrity: sha512-wz7ohsKCAIWy91blZ/1FlpPdqrsm1xpcEOQVveWoL6+aSPKL4VUcoYmmzuLTssyZxRpEwzuIxL/GDsvpjaBtOw==} - engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-5eOND4duWkwx1AzCxadcOrNeighiLwMInEADT0YM7xeEOOFcovWZCq8dadXgcRHSf3Ulh1kFo/qvzoFiCLOL1Q==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': + resolution: {integrity: sha512-tj7XRemQcOcFwv7qhpUxMTBbI5mWMlE4c1Omhg5+h8GuLXzyj8HviYgR+bB2DMDgRqUE+jiDleqSCRjx4aYk/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -5441,20 +5020,14 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4': - resolution: {integrity: sha512-cfiMrfuWCIgsFmcVG0IPuO6qTRHvF7NuG3wngX1RZzc6dU8FuBFb+J3MIR5WrdTNozlumfgL4cvz+R4ozBCvsQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': resolution: {integrity: sha512-5ZXcYyd4GxPA6QfbGrNcQjmjbuLGvfz6728pZMsQvGHI+06LT06M6TPtXvFvLgXtexc+OqvFe1yAIXJU1gob/w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': - resolution: {integrity: sha512-PyqoipaswDLAZtot351MLhrlrh6lcZPo2LSYE+VDxbVk24LVKAGOuE4hb8xZQmrPAuEtTZW8E6D2zc5EUZX4Lw==} + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': + resolution: {integrity: sha512-PH5DRZT+F4f2PTXRXR8uJxnBq2po/xFtddyabTJVJs/ZYVHqXPEgNIr35IHTEa6bpa0Q8Awg+ymkTaGnKITw4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -5465,156 +5038,147 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.4': - resolution: {integrity: sha512-p6UeR9y7ht82AH57qwGuFYn69S6CZ7LLKdCKy/8T3zS9VTrJei2/CGsTUV45Da4Z9Rbhc7G4gyWQ/Ioamqn09g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@rolldown/pluginutils@1.0.0-rc.12': - resolution: {integrity: sha512-HHMwmarRKvoFsJorqYlFeFRzXZqCt2ETQlEDOb9aqssrnVBB1/+xgTGtuTrIk5vzLNX1MjMtTf7W9z3tsSbrxw==} - - '@rolldown/pluginutils@1.0.0-rc.4': - resolution: {integrity: sha512-1BrrmTu0TWfOP1riA8uakjFc9bpIUGzVKETsOtzY39pPga8zELGDl8eu1Dx7/gjM5CAz14UknsUMpBO8L+YntQ==} + '@rolldown/pluginutils@1.0.0-rc.16': + resolution: {integrity: sha512-45+YtqxLYKDWQouLKCrpIZhke+nXxhsw+qAHVzHDVwttyBlHNBVs2K25rDXrZzhpTp9w1FlAlvweV1H++fdZoA==} - '@rollup/rollup-android-arm-eabi@4.59.0': - resolution: {integrity: sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==} + '@rollup/rollup-android-arm-eabi@4.60.2': + resolution: {integrity: sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.59.0': - resolution: {integrity: sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==} + '@rollup/rollup-android-arm64@4.60.2': + resolution: {integrity: sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.59.0': - resolution: {integrity: sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==} + '@rollup/rollup-darwin-arm64@4.60.2': + resolution: {integrity: sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.59.0': - resolution: {integrity: sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==} + '@rollup/rollup-darwin-x64@4.60.2': + resolution: {integrity: sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.59.0': - resolution: {integrity: sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==} + '@rollup/rollup-freebsd-arm64@4.60.2': + resolution: {integrity: sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.59.0': - resolution: {integrity: sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==} + '@rollup/rollup-freebsd-x64@4.60.2': + resolution: {integrity: sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': - resolution: {integrity: sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==} + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': + resolution: {integrity: sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.59.0': - resolution: {integrity: sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==} + '@rollup/rollup-linux-arm-musleabihf@4.60.2': + resolution: {integrity: sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.59.0': - resolution: {integrity: sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==} + '@rollup/rollup-linux-arm64-gnu@4.60.2': + resolution: {integrity: sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.59.0': - resolution: {integrity: sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==} + '@rollup/rollup-linux-arm64-musl@4.60.2': + resolution: {integrity: sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.59.0': - resolution: {integrity: sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==} + '@rollup/rollup-linux-loong64-gnu@4.60.2': + resolution: {integrity: sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.59.0': - resolution: {integrity: sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==} + '@rollup/rollup-linux-loong64-musl@4.60.2': + resolution: {integrity: sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.59.0': - resolution: {integrity: sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==} + '@rollup/rollup-linux-ppc64-gnu@4.60.2': + resolution: {integrity: sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-musl@4.59.0': - resolution: {integrity: sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==} + '@rollup/rollup-linux-ppc64-musl@4.60.2': + resolution: {integrity: sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.59.0': - resolution: {integrity: sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==} + '@rollup/rollup-linux-riscv64-gnu@4.60.2': + resolution: {integrity: sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.59.0': - resolution: {integrity: sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==} + '@rollup/rollup-linux-riscv64-musl@4.60.2': + resolution: {integrity: sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.59.0': - resolution: {integrity: sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==} + '@rollup/rollup-linux-s390x-gnu@4.60.2': + resolution: {integrity: sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.59.0': - resolution: {integrity: sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==} + '@rollup/rollup-linux-x64-gnu@4.60.2': + resolution: {integrity: sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.59.0': - resolution: {integrity: sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==} + '@rollup/rollup-linux-x64-musl@4.60.2': + resolution: {integrity: sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.59.0': - resolution: {integrity: sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==} + '@rollup/rollup-openbsd-x64@4.60.2': + resolution: {integrity: sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.59.0': - resolution: {integrity: sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==} + '@rollup/rollup-openharmony-arm64@4.60.2': + resolution: {integrity: sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.59.0': - resolution: {integrity: sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==} + '@rollup/rollup-win32-arm64-msvc@4.60.2': + resolution: {integrity: sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.59.0': - resolution: {integrity: sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==} + '@rollup/rollup-win32-ia32-msvc@4.60.2': + resolution: {integrity: sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.59.0': - resolution: {integrity: sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==} + '@rollup/rollup-win32-x64-gnu@4.60.2': + resolution: {integrity: sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.59.0': - resolution: {integrity: sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==} + '@rollup/rollup-win32-x64-msvc@4.60.2': + resolution: {integrity: sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==} cpu: [x64] os: [win32] '@sec-ant/readable-stream@0.4.1': resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@simple-libs/child-process-utils@1.0.1': - resolution: {integrity: sha512-3nWd8irxvDI6v856wpPCHZ+08iQR0oHTZfzAZmnbsLzf+Sf1odraP6uKOHDZToXq3RPRV/LbqGVlSCogm9cJjg==} + '@simple-libs/child-process-utils@1.0.2': + resolution: {integrity: sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==} engines: {node: '>=18'} - '@simple-libs/stream-utils@1.1.0': - resolution: {integrity: sha512-6rsHTjodIn/t90lv5snQjRPVtOosM7Vp0AKdrObymq45ojlgVwnpAqdc+0OBBrpEiy31zZ6/TKeIVqV1HwvnuQ==} + '@simple-libs/stream-utils@1.2.0': + resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} engines: {node: '>=18'} - '@sinclair/typebox@0.34.48': - resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} + '@sinclair/typebox@0.34.49': + resolution: {integrity: sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==} '@sindresorhus/merge-streams@4.0.0': resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} @@ -5623,12 +5187,8 @@ packages: '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sinonjs/fake-timers@15.3.0': - resolution: {integrity: sha512-m2xozxSfCIxjDdvbhIWazlP2i2aha/iUmbl94alpsIbd3iLTfeXgfBVbwyWogB6l++istyGZqamgA/EcqYf+Bg==} - - '@smithy/abort-controller@4.2.11': - resolution: {integrity: sha512-Hj4WoYWMJnSpM6/kchsm4bUNTL9XiSyhvoMb2KIq4VJzyDt7JpGHUZHkVNPZVC7YE1tf8tPeVauxpFBKGW4/KQ==} - engines: {node: '>=18.0.0'} + '@sinonjs/fake-timers@15.3.2': + resolution: {integrity: sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==} '@smithy/chunked-blob-reader-native@4.2.3': resolution: {integrity: sha512-jA5k5Udn7Y5717L86h4EIv06wIr3xn8GM1qHRi/Nf31annXcXHJjBKvgztnbn2TxH3xWrPBfgwHsOwZf0UmQWw==} @@ -5638,296 +5198,136 @@ packages: resolution: {integrity: sha512-St+kVicSyayWQca+I1rGitaOEH6uKgE8IUWoYnnEX26SWdWQcL6LvMSD19Lg+vYHKdT9B2Zuu7rd3i6Wnyb/iw==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.10': - resolution: {integrity: sha512-IRTkd6ps0ru+lTWnfnsbXzW80A8Od8p3pYiZnW98K2Hb20rqfsX7VTlfUwhrcOeSSy68Gn9WBofwPuw3e5CCsg==} - engines: {node: '>=18.0.0'} - - '@smithy/config-resolver@4.4.13': - resolution: {integrity: sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==} - engines: {node: '>=18.0.0'} - - '@smithy/config-resolver@4.4.6': - resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.22.1': - resolution: {integrity: sha512-x3ie6Crr58MWrm4viHqqy2Du2rHYZjwu8BekasrQx4ca+Y24dzVAwq3yErdqIbc2G3I0kLQA13PQ+/rde+u65g==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.23.13': - resolution: {integrity: sha512-J+2TT9D6oGsUVXVEMvz8h2EmdVnkBiy2auCie4aSJMvKlzUtO5hqjEzXhoCUkIMo7gAYjbQcN0g/MMSXEhDs1Q==} - engines: {node: '>=18.0.0'} - - '@smithy/core@3.23.9': - resolution: {integrity: sha512-1Vcut4LEL9HZsdpI0vFiRYIsaoPwZLjAxnVQDUMQK8beMS+EYPLDQCXtbzfxmM5GzSgjfe2Q9M7WaXwIMQllyQ==} - engines: {node: '>=18.0.0'} - - '@smithy/credential-provider-imds@4.2.11': - resolution: {integrity: sha512-lBXrS6ku0kTj3xLmsJW0WwqWbGQ6ueooYyp/1L9lkyT0M02C+DWwYwc5aTyXFbRaK38ojALxNixg+LxKSHZc0g==} - engines: {node: '>=18.0.0'} - - '@smithy/credential-provider-imds@4.2.12': - resolution: {integrity: sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==} - engines: {node: '>=18.0.0'} - - '@smithy/credential-provider-imds@4.2.8': - resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-codec@4.2.11': - resolution: {integrity: sha512-Sf39Ml0iVX+ba/bgMPxaXWAAFmHqYLTmbjAPfLPLY8CrYkRDEqZdUsKC1OwVMCdJXfAt0v4j49GIJ8DoSYAe6w==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-codec@4.2.12': - resolution: {integrity: sha512-FE3bZdEl62ojmy8x4FHqxq2+BuOHlcxiH5vaZ6aqHJr3AIZzwF5jfx8dEiU/X0a8RboyNDjmXjlbr8AdEyLgiA==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-browser@4.2.11': - resolution: {integrity: sha512-3rEpo3G6f/nRS7fQDsZmxw/ius6rnlIpz4UX6FlALEzz8JoSxFmdBt0SZnthis+km7sQo6q5/3e+UJcuQivoXA==} - engines: {node: '>=18.0.0'} - - '@smithy/eventstream-serde-browser@4.2.12': - resolution: {integrity: sha512-XUSuMxlTxV5pp4VpqZf6Sa3vT/Q75FVkLSpSSE3KkWBvAQWeuWt1msTv8fJfgA4/jcJhrbrbMzN1AC/hvPmm5A==} + '@smithy/config-resolver@4.4.17': + resolution: {integrity: sha512-TzDZcAnhTyAHbXVxWZo7/tEcrIeFq20IBk8So3OLOetWpR8EwY/yEqBMBFaJMeyEiREDq4NfEl+qO3OAUD+vbQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.11': - resolution: {integrity: sha512-XeNIA8tcP/GDWnnKkO7qEm/bg0B/bP9lvIXZBXcGZwZ+VYM8h8k9wuDvUODtdQ2Wcp2RcBkPTCSMmaniVHrMlA==} + '@smithy/core@3.23.16': + resolution: {integrity: sha512-JStomOrINQA1VqNEopLsgcdgwd42au7mykKqVr30XFw89wLt9sDxJDi4djVPRwQmmzyTGy/uOvTc2ultMpFi1w==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.12': - resolution: {integrity: sha512-7epsAZ3QvfHkngz6RXQYseyZYHlmWXSTPOfPmXkiS+zA6TBNo1awUaMFL9vxyXlGdoELmCZyZe1nQE+imbmV+Q==} + '@smithy/credential-provider-imds@4.2.14': + resolution: {integrity: sha512-Au28zBN48ZAoXdooGUHemuVBrkE+Ie6RPmGNIAJsFqj33Vhb6xAgRifUydZ2aY+M+KaMAETAlKk5NC5h1G7wpg==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.11': - resolution: {integrity: sha512-fzbCh18rscBDTQSCrsp1fGcclLNF//nJyhjldsEl/5wCYmgpHblv5JSppQAyQI24lClsFT0wV06N1Porn0IsEw==} + '@smithy/eventstream-codec@4.2.14': + resolution: {integrity: sha512-erZq0nOIpzfeZdCyzZjdJb4nVSKLUmSkaQUVkRGQTXs30gyUGeKnrYEg+Xe1W5gE3aReS7IgsvANwVPxSzY6Pw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.12': - resolution: {integrity: sha512-D1pFuExo31854eAvg89KMn9Oab/wEeJR6Buy32B49A9Ogdtx5fwZPqBHUlDzaCDpycTFk2+fSQgX689Qsk7UGA==} + '@smithy/eventstream-serde-browser@4.2.14': + resolution: {integrity: sha512-8IelTCtTctWRbb+0Dcy+C0aICh1qa0qWXqgjcXDmMuCvPJRnv26hiDZoAau2ILOniki65mCPKqOQs/BaWvO4CQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.11': - resolution: {integrity: sha512-MJ7HcI+jEkqoWT5vp+uoVaAjBrmxBtKhZTeynDRG/seEjJfqyg3SiqMMqyPnAMzmIfLaeJ/uiuSDP/l9AnMy/Q==} + '@smithy/eventstream-serde-config-resolver@4.3.14': + resolution: {integrity: sha512-sqHiHpYRYo3FJlaIxD1J8PhbcmJAm7IuM16mVnwSkCToD7g00IBZzKuiLNMGmftULmEUX6/UAz8/NN5uMP8bVA==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.12': - resolution: {integrity: sha512-+yNuTiyBACxOJUTvbsNsSOfH9G9oKbaJE1lNL3YHpGcuucl6rPZMi3nrpehpVOVR2E07YqFFmtwpImtpzlouHQ==} + '@smithy/eventstream-serde-node@4.2.14': + resolution: {integrity: sha512-Ht/8BuGlKfFTy0H3+8eEu0vdpwGztCnaLLXtpXNdQqiR7Hj4vFScU3T436vRAjATglOIPjJXronY+1WxxNLSiw==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.13': - resolution: {integrity: sha512-U2Hcfl2s3XaYjikN9cT4mPu8ybDbImV3baXR0PkVlC0TTx808bRP3FaPGAzPtB8OByI+JqJ1kyS+7GEgae7+qQ==} + '@smithy/eventstream-serde-universal@4.2.14': + resolution: {integrity: sha512-lWyt4T2XQZUZgK3tQ3Wn0w3XBvZsK/vjTuJl6bXbnGZBHH0ZUSONTYiK9TgjTTzU54xQr3DRFwpjmhp0oLm3gg==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.15': - resolution: {integrity: sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==} + '@smithy/fetch-http-handler@5.3.17': + resolution: {integrity: sha512-bXOvQzaSm6MnmLaWA1elgfQcAtN4UP3vXqV97bHuoOrHQOJiLT3ds6o9eo5bqd0TJfRFpzdGnDQdW3FACiAVdw==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.2.13': - resolution: {integrity: sha512-YrF4zWKh+ghLuquldj6e/RzE3xZYL8wIPfkt0MqCRphVICjyyjH8OwKD7LLlKpVEbk4FLizFfC1+gwK6XQdR3g==} + '@smithy/hash-blob-browser@4.2.15': + resolution: {integrity: sha512-0PJ4Al3fg2nM4qKrAIxyNcApgqHAXcBkN8FeizOz69z0rb26uZ6lMESYtxegaTlXB5Hj84JfwMPavMrwDMjucA==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.11': - resolution: {integrity: sha512-T+p1pNynRkydpdL015ruIoyPSRw9e/SQOWmSAMmmprfswMrd5Ow5igOWNVlvyVFZlxXqGmyH3NQwfwy8r5Jx0A==} + '@smithy/hash-node@4.2.14': + resolution: {integrity: sha512-8ZBDY2DD4wr+GGjTpPtiglEsqr0lUP+KHqgZcWczFf6qeZ/YRjMIOoQWVQlmwu7EtxKTd8YXD8lblmYcpBIA1g==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.12': - resolution: {integrity: sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==} + '@smithy/hash-stream-node@4.2.14': + resolution: {integrity: sha512-tw4GANWkZPb6+BdD4Fgucqzey2+r73Z/GRo9zklsCdwrnxxumUV83ZIaBDdudV4Ylazw3EPTiJZhpX42105ruQ==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.8': - resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} - engines: {node: '>=18.0.0'} - - '@smithy/hash-stream-node@4.2.12': - resolution: {integrity: sha512-O3YbmGExeafuM/kP7Y8r6+1y0hIh3/zn6GROx0uNlB54K9oihAL75Qtc+jFfLNliTi6pxOAYZrRKD9A7iA6UFw==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.2.11': - resolution: {integrity: sha512-cGNMrgykRmddrNhYy1yBdrp5GwIgEkniS7k9O1VLB38yxQtlvrxpZtUVvo6T4cKpeZsriukBuuxfJcdZQc/f/g==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.2.12': - resolution: {integrity: sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==} - engines: {node: '>=18.0.0'} - - '@smithy/invalid-dependency@4.2.8': - resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} + '@smithy/invalid-dependency@4.2.14': + resolution: {integrity: sha512-c21qJiTSb25xvvOp+H2TNZzPCngrvl5vIPqPB8zQ/DmJF4QWXO19x1dWfMJZ6wZuuWUPPm0gV8C0cU3+ifcWuw==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.2.0': - resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} - engines: {node: '>=18.0.0'} - '@smithy/is-array-buffer@4.2.2': resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.2.12': - resolution: {integrity: sha512-W/oIpHCpWU2+iAkfZYyGWE+qkpuf3vEXHLxQQDx9FPNZTTdnul0dZ2d/gUFrtQ5je1G2kp4cjG0/24YueG2LbQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.2.11': - resolution: {integrity: sha512-UvIfKYAKhCzr4p6jFevPlKhQwyQwlJ6IeKLDhmV1PlYfcW3RL4ROjNEDtSik4NYMi9kDkH7eSwyTP3vNJ/u/Dw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-content-length@4.2.12': - resolution: {integrity: sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.4.23': - resolution: {integrity: sha512-UEFIejZy54T1EJn2aWJ45voB7RP2T+IRzUqocIdM6GFFa5ClZncakYJfcYnoXt3UsQrZZ9ZRauGm77l9UCbBLw==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-endpoint@4.4.28': - resolution: {integrity: sha512-p1gfYpi91CHcs5cBq982UlGlDrxoYUX6XdHSo91cQ2KFuz6QloHosO7Jc60pJiVmkWrKOV8kFYlGFFbQ2WUKKQ==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.4.40': - resolution: {integrity: sha512-YhEMakG1Ae57FajERdHNZ4ShOPIY7DsgV+ZoAxo/5BT0KIe+f6DDU2rtIymNNFIj22NJfeeI6LWIifrwM0f+rA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-retry@4.4.46': - resolution: {integrity: sha512-SpvWNNOPOrKQGUqZbEPO+es+FRXMWvIyzUKUOYdDgdlA6BdZj/R58p4umoQ76c2oJC44PiM7mKizyyex1IJzow==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.2.12': - resolution: {integrity: sha512-W9g1bOLui7Xn5FABRVS0o3rXL0gfN37d/8I/W7i0N7oxjx9QecUmXEMSUMADTODwdtka9cN43t5BI2CodLJpng==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-serde@4.2.16': - resolution: {integrity: sha512-beqfV+RZ9RSv+sQqor3xroUUYgRFCGRw6niGstPG8zO9LgTl0B0MCucxjmrH/2WwksQN7UUgI7KNANoZv+KALA==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.2.11': - resolution: {integrity: sha512-s+eenEPW6RgliDk2IhjD2hWOxIx1NKrOHxEwNUaUXxYBxIyCcDfNULZ2Mu15E3kwcJWBedTET/kEASPV1A1Akg==} - engines: {node: '>=18.0.0'} - - '@smithy/middleware-stack@4.2.12': - resolution: {integrity: sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==} - engines: {node: '>=18.0.0'} - - '@smithy/node-config-provider@4.3.11': - resolution: {integrity: sha512-xD17eE7kaLgBBGf5CZQ58hh2YmwK1Z0O8YhffwB/De2jsL0U3JklmhVYJ9Uf37OtUDLF2gsW40Xwwag9U869Gg==} + '@smithy/md5-js@4.2.14': + resolution: {integrity: sha512-V2v0vx+h0iUSNG1Alt+GNBMSLGCrl9iVsdd+Ap67HPM9PN479x12V8LkuMoKImNZxn3MXeuyUjls+/7ZACZghA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.12': - resolution: {integrity: sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==} + '@smithy/middleware-content-length@4.2.14': + resolution: {integrity: sha512-xhHq7fX4/3lv5NHxLUk3OeEvl0xZ+Ek3qIbWaCL4f9JwgDZEclPBElljaZCAItdGPQl/kSM4LPMOpy1MYgprpw==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.8': - resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} + '@smithy/middleware-endpoint@4.4.31': + resolution: {integrity: sha512-KJPdCIN2kOE2aGmqZd7eUTr4WQwOGgtLWgUkswGJggs7rBcQYQjcZMEDa3C0DwbOiXS9L8/wDoQHkfxBYLfiLw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.14': - resolution: {integrity: sha512-DamSqaU8nuk0xTJDrYnRzZndHwwRnyj/n/+RqGGCcBKB4qrQem0mSDiWdupaNWdwxzyMU91qxDmHOCazfhtO3A==} + '@smithy/middleware-retry@4.5.4': + resolution: {integrity: sha512-/z7nIFK+ZRW3Ie/l3NEVGdy34LvmEOzBrtBAvgWZ/4PrKX0xP3kWm8pkfcwUk523SqxZhdbQP9JSXgjF77Uhpw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.5.1': - resolution: {integrity: sha512-ejjxdAXjkPIs9lyYyVutOGNOraqUE9v/NjGMKwwFrfOM354wfSD8lmlj8hVwUzQmlLLF4+udhfCX9Exnbmvfzw==} + '@smithy/middleware-serde@4.2.19': + resolution: {integrity: sha512-Q6y+W9h3iYVMCKWDoVge+OC1LKFqbEKaq8SIWG2X2bWJRpd/6dDLyICcNLT6PbjH3Rr6bmg/SeDB25XFOFfeEw==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.11': - resolution: {integrity: sha512-14T1V64o6/ndyrnl1ze1ZhyLzIeYNN47oF/QU6P5m82AEtyOkMJTb0gO1dPubYjyyKuPD6OSVMPDKe+zioOnCg==} + '@smithy/middleware-stack@4.2.14': + resolution: {integrity: sha512-2dvkUKLuFdKsCRmOE4Mn63co0Djtsm+JMh0bYZQupN1pJwMeE8FmQmRLLzzEMN0dnNi7CDCYYH8F0EVwWiPBeA==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.12': - resolution: {integrity: sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==} + '@smithy/node-config-provider@4.3.14': + resolution: {integrity: sha512-S+gFjyo/weSVL0P1b9Ts8C/CwIfNCgUPikk3sl6QVsfE/uUuO+QsF+NsE/JkpvWqqyz1wg7HFdiaZuj5CoBMRg==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.8': - resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} + '@smithy/node-http-handler@4.6.0': + resolution: {integrity: sha512-P734cAoTFtuGfWa/R3jgBnGlURt2w9bYEBwQNMKf58sRM9RShirB2mKwLsVP+jlG/wxpCu8abv8NxdUts8tdLA==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.11': - resolution: {integrity: sha512-hI+barOVDJBkNt4y0L2mu3Ugc0w7+BpJ2CZuLwXtSltGAAwCb3IvnalGlbDV/UCS6a9ZuT3+exd1WxNdLb5IlQ==} + '@smithy/property-provider@4.2.14': + resolution: {integrity: sha512-WuM31CgfsnQ/10i7NYr0PyxqknD72Y5uMfUMVSniPjbEPceiTErb4eIqJQ+pdxNEAUEWrewrGjIRjVbVHsxZiQ==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.12': - resolution: {integrity: sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==} + '@smithy/protocol-http@5.3.14': + resolution: {integrity: sha512-dN5F8kHx8RNU0r+pCwNmFZyz6ChjMkzShy/zup6MtkRmmix4vZzJdW+di7x//b1LiynIev88FM18ie+wwPcQtQ==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.8': - resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} + '@smithy/querystring-builder@4.2.14': + resolution: {integrity: sha512-XYA5Z0IqTeF+5XDdh4BBmSA0HvbgVZIyv4cmOoUheDNR57K1HgBp9ukUMx3Cr3XpDHHpLBnexPE3LAtDsZkj2A==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.11': - resolution: {integrity: sha512-7spdikrYiljpket6u0up2Ck2mxhy7dZ0+TDd+S53Dg2DHd6wg+YNJrTCHiLdgZmEXZKI7LJZcwL3721ZRDFiqA==} + '@smithy/querystring-parser@4.2.14': + resolution: {integrity: sha512-hr+YyqBD23GVvRxGGrcc/oOeNlK3PzT5Fu4dzrDXxzS1LpFiuL2PQQqKPs87M79aW7ziMs+nvB3qdw77SqE7Lw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.12': - resolution: {integrity: sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==} + '@smithy/service-error-classification@4.3.0': + resolution: {integrity: sha512-9jKsBYQRPR0xBLgc2415RsA5PIcP2sis4oBdN9s0D13cg1B1284mNTjx9Yc+BEERXzuPm5ObktI96OxsKh8E9A==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.8': - resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} + '@smithy/shared-ini-file-loader@4.4.9': + resolution: {integrity: sha512-495/V2I15SHgedSJoDPD23JuSfKAp726ZI1V0wtjB07Wh7q/0tri/0e0DLefZCHgxZonrGKt/OCTpAtP1wE1kQ==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.11': - resolution: {integrity: sha512-nE3IRNjDltvGcoThD2abTozI1dkSy8aX+a2N1Rs55en5UsdyyIXgGEmevUL3okZFoJC77JgRGe99xYohhsjivQ==} + '@smithy/signature-v4@5.3.14': + resolution: {integrity: sha512-1D9Y/nmlVjCeSivCbhZ7hgEpmHyY1h0GvpSZt3l0xcD9JjmjVC1CHOozS6+Gh+/ldMH8JuJ6cujObQqfayAVFA==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.12': - resolution: {integrity: sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==} + '@smithy/smithy-client@4.12.12': + resolution: {integrity: sha512-daO7SJn4eM6ArbmrEs+/BTbH7af8AEbSL3OMQdcRvvn8tuUcR5rU2n6DgxIV53aXMS42uwK8NgKKCh5XgqYOPQ==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.11': - resolution: {integrity: sha512-HkMFJZJUhzU3HvND1+Yw/kYWXp4RPDLBWLcK1n+Vqw8xn4y2YiBhdww8IxhkQjP/QlZun5bwm3vcHc8AqIU3zw==} + '@smithy/types@4.14.1': + resolution: {integrity: sha512-59b5HtSVrVR/eYNei3BUj3DCPKD/G7EtDDe7OEJE7i7FtQFugYo6MxbotS8mVJkLNVf8gYaAlEBwwtJ9HzhWSg==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.12': - resolution: {integrity: sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==} - engines: {node: '>=18.0.0'} - - '@smithy/shared-ini-file-loader@4.4.3': - resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} - engines: {node: '>=18.0.0'} - - '@smithy/shared-ini-file-loader@4.4.6': - resolution: {integrity: sha512-IB/M5I8G0EeXZTHsAxpx51tMQ5R719F3aq+fjEB6VtNcCHDc0ajFDIGDZw+FW9GxtEkgTduiPpjveJdA/CX7sw==} - engines: {node: '>=18.0.0'} - - '@smithy/shared-ini-file-loader@4.4.7': - resolution: {integrity: sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.3.11': - resolution: {integrity: sha512-V1L6N9aKOBAN4wEHLyqjLBnAz13mtILU0SeDrjOaIZEeN6IFa6DxwRt1NNpOdmSpQUfkBj0qeD3m6P77uzMhgQ==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.3.12': - resolution: {integrity: sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==} - engines: {node: '>=18.0.0'} - - '@smithy/signature-v4@5.3.8': - resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} - engines: {node: '>=18.0.0'} - - '@smithy/smithy-client@4.12.3': - resolution: {integrity: sha512-7k4UxjSpHmPN2AxVhvIazRSzFQjWnud3sOsXcFStzagww17j1cFQYqTSiQ8xuYK3vKLR1Ni8FzuT3VlKr3xCNw==} - engines: {node: '>=18.0.0'} - - '@smithy/smithy-client@4.12.8': - resolution: {integrity: sha512-aJaAX7vHe5i66smoSSID7t4rKY08PbD8EBU7DOloixvhOozfYWdcSYE4l6/tjkZ0vBZhGjheWzB2mh31sLgCMA==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.12.0': - resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} - engines: {node: '>=18.0.0'} - - '@smithy/types@4.13.1': - resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} - engines: {node: '>=18.0.0'} - - '@smithy/url-parser@4.2.11': - resolution: {integrity: sha512-oTAGGHo8ZYc5VZsBREzuf5lf2pAurJQsccMusVZ85wDkX66ojEc/XauiGjzCj50A61ObFTPe6d7Pyt6UBYaing==} - engines: {node: '>=18.0.0'} - - '@smithy/url-parser@4.2.12': - resolution: {integrity: sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==} + '@smithy/url-parser@4.2.14': + resolution: {integrity: sha512-p06BiBigJ8bTA3MgnOfCtDUWnAMY0YfedO/GRpmc7p+wg3KW8vbXy1xwSu5ASy0wV7rRYtlfZOIKH4XqfhjSQQ==} engines: {node: '>=18.0.0'} '@smithy/util-base64@4.3.2': @@ -5946,88 +5346,40 @@ packages: resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.2.0': - resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} - engines: {node: '>=18.0.0'} - '@smithy/util-buffer-from@4.2.2': resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.2.0': - resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} - engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.2.2': resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.39': - resolution: {integrity: sha512-ui7/Ho/+VHqS7Km2wBw4/Ab4RktoiSshgcgpJzC4keFPs6tLJS4IQwbeahxQS3E/w98uq6E1mirCH/id9xIXeQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-browser@4.3.44': - resolution: {integrity: sha512-eZg6XzaCbVr2S5cAErU5eGBDaOVTuTo1I65i4tQcHENRcZ8rMWhQy1DaIYUSLyZjsfXvmCqZrstSMYyGFocvHA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-defaults-mode-node@4.2.42': - resolution: {integrity: sha512-QDA84CWNe8Akpj15ofLO+1N3Rfg8qa2K5uX0y6HnOp4AnRYRgWrKx/xzbYNbVF9ZsyJUYOfcoaN3y93wA/QJ2A==} + '@smithy/util-defaults-mode-browser@4.3.48': + resolution: {integrity: sha512-hxVRVPYaRDWa6YQdse1aWX1qrksmLsvNyGBKdc32q4jFzSjxYVNWfstknAfR228TnzS4tzgswXRuYIbhXBuXFQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.48': - resolution: {integrity: sha512-FqOKTlqSaoV3nzO55pMs5NBnZX8EhoI0DGmn9kbYeXWppgHD6dchyuj2HLqp4INJDJbSrj6OFYJkAh/WhSzZPg==} + '@smithy/util-defaults-mode-node@4.2.53': + resolution: {integrity: sha512-ybgCk+9JdBq8pYC8Y6U5fjyS8e4sboyAShetxPNL0rRBtaVl56GSFAxsolVBIea1tXR4LPIzL8i6xqmcf0+DCQ==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.2.8': - resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.3.2': - resolution: {integrity: sha512-+4HFLpE5u29AbFlTdlKIT7jfOzZ8PDYZKTb3e+AgLz986OYwqTourQ5H+jg79/66DB69Un1+qKecLnkZdAsYcA==} - engines: {node: '>=18.0.0'} - - '@smithy/util-endpoints@3.3.3': - resolution: {integrity: sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==} - engines: {node: '>=18.0.0'} - - '@smithy/util-hex-encoding@4.2.0': - resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + '@smithy/util-endpoints@3.4.2': + resolution: {integrity: sha512-a55Tr+3OKld4TTtnT+RhKOQHyPxm3j/xL4OR83WBUhLJaKDS9dnJ7arRMOp3t31dcLhApwG9bgvrRXBHlLdIkg==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.2.2': resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.11': - resolution: {integrity: sha512-r3dtF9F+TpSZUxpOVVtPfk09Rlo4lT6ORBqEvX3IBT6SkQAdDSVKR5GcfmZbtl7WKhKnmb3wbDTQ6ibR2XHClw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-middleware@4.2.12': - resolution: {integrity: sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-middleware@4.2.8': - resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} - engines: {node: '>=18.0.0'} - - '@smithy/util-retry@4.2.11': - resolution: {integrity: sha512-XSZULmL5x6aCTTii59wJqKsY1l3eMIAomRAccW7Tzh9r8s7T/7rdo03oektuH5jeYRlJMPcNP92EuRDvk9aXbw==} - engines: {node: '>=18.0.0'} - - '@smithy/util-retry@4.2.13': - resolution: {integrity: sha512-qQQsIvL0MGIbUjeSrg0/VlQ3jGNKyM3/2iU3FPNgy01z+Sp4OvcaxbgIoFOTvB61ZoohtutuOvOcgmhbD0katQ==} - engines: {node: '>=18.0.0'} - - '@smithy/util-stream@4.5.17': - resolution: {integrity: sha512-793BYZ4h2JAQkNHcEnyFxDTcZbm9bVybD0UV/LEWmZ5bkTms7JqjfrLMi2Qy0E5WFcCzLwCAPgcvcvxoeALbAQ==} + '@smithy/util-middleware@4.2.14': + resolution: {integrity: sha512-1Su2vj9RYNDEv/V+2E+jXkkwGsgR7dc4sfHn9Z7ruzQHJIEni9zzw5CauvRXlFJfmgcqYP8fWa0dkh2Q2YaQyw==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.21': - resolution: {integrity: sha512-KzSg+7KKywLnkoKejRtIBXDmwBfjGvg1U1i/etkC7XSWUyFCoLno1IohV2c74IzQqdhX5y3uE44r/8/wuK+A7Q==} + '@smithy/util-retry@4.3.3': + resolution: {integrity: sha512-idjUvd4M9Jj6rXkhqw4H4reHoweuK4ZxYWyOrEp4N2rOF5VtaOlQGLDQJva/8WanNXk9ScQtsAb7o5UHGvFm4A==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.2.0': - resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + '@smithy/util-stream@4.5.24': + resolution: {integrity: sha512-na5vv2mBSDzXewLEEoWGI7LQQkfpmFEomBsmOpzLFjqGctm0iMwXY5lAwesY9pIaErkccW0qzEOUcYP+WKneXg==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.2': @@ -6042,16 +5394,8 @@ packages: resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.11': - resolution: {integrity: sha512-x7Rh2azQPs3XxbvCzcttRErKKvLnbZfqRf/gOjw2pb+ZscX88e5UkRPCB67bVnsFHxayvMvmePfKTqsRb+is1A==} - engines: {node: '>=18.0.0'} - - '@smithy/util-waiter@4.2.14': - resolution: {integrity: sha512-2zqq5o/oizvMaFUlNiTyZ7dbgYv1a893aGut2uaxtbzTx/VYYnRxWzDHuD/ftgcw94ffenua+ZNLrbqwUYE+Bg==} - engines: {node: '>=18.0.0'} - - '@smithy/uuid@1.1.0': - resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + '@smithy/util-waiter@4.2.16': + resolution: {integrity: sha512-GtclrKoZ3Lt7jPQ7aTIYKfjY92OgceScftVnkTsG8e1KV8rkvZgN+ny6YSRhd9hxB8rZtwVbmln7NTvE5O3GmQ==} engines: {node: '>=18.0.0'} '@smithy/uuid@1.1.2': @@ -6092,137 +5436,107 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@supabase/auth-js@2.101.1': - resolution: {integrity: sha512-Kd0Wey+RkFHgyVep7adS6UOE2pN6MJ3mZ32PAXSvfw6IjUkFRC7IQpdZZjUOcUe5pXr1ejufCRgF6lsGINe4Tw==} - engines: {node: '>=20.0.0'} - - '@supabase/auth-js@2.95.3': - resolution: {integrity: sha512-vD2YoS8E2iKIX0F7EwXTmqhUpaNsmbU6X2R0/NdFcs02oEfnHyNP/3M716f3wVJ2E5XHGiTFXki6lRckhJ0Thg==} - engines: {node: '>=20.0.0'} - - '@supabase/functions-js@2.101.1': - resolution: {integrity: sha512-OZWU7YtaG+NNNFZK8p/FuJ6gpq7pFyrG2fLOopP73HAIDHDGpOttPJapvO8ADu3RkqfQfkwrB354vPkSBbZ20A==} + '@supabase/auth-js@2.104.0': + resolution: {integrity: sha512-Vs0ndL+s5an7rOmXtS/nbYnGXL8m+KXlCSrPIcw9bR96ma6qyLYILnE6syuM+rpDnf+Tg4PVNxNB2+oDwoy6mA==} engines: {node: '>=20.0.0'} - '@supabase/functions-js@2.95.3': - resolution: {integrity: sha512-uTuOAKzs9R/IovW1krO0ZbUHSJnsnyJElTXIRhjJTqymIVGcHzkAYnBCJqd7468Fs/Foz1BQ7Dv6DCl05lr7ig==} + '@supabase/functions-js@2.104.0': + resolution: {integrity: sha512-O8EyEz/RT1kfWhyJNpVc/VbLeBsohHGBVif/CI83zoMB+Iul/t/NIekH1/7RsH6kuO+b2D4wJhfiaW8Qr47sRg==} engines: {node: '>=20.0.0'} '@supabase/phoenix@0.4.0': resolution: {integrity: sha512-RHSx8bHS02xwfHdAbX5Lpbo6PXbgyf7lTaXTlwtFDPwOIw64NnVRwFAXGojHhjtVYI+PEPNSWwkL90f4agN3bw==} - '@supabase/postgrest-js@2.101.1': - resolution: {integrity: sha512-UW1RajH5jbZoK+ldAJ1I6VZ+HWwZ2oaKjEQ6Gn+AQ67CHQVxGl8wNQoLYyumbyaExm41I+wn7arulcY1eHeZJw==} - engines: {node: '>=20.0.0'} - - '@supabase/postgrest-js@2.95.3': - resolution: {integrity: sha512-LTrRBqU1gOovxRm1vRXPItSMPBmEFqrfTqdPTRtzOILV4jPSueFz6pES5hpb4LRlkFwCPRmv3nQJ5N625V2Xrg==} - engines: {node: '>=20.0.0'} - - '@supabase/realtime-js@2.101.1': - resolution: {integrity: sha512-Oa6dno0OB9I+hv5do5zsZHbFu41ViZnE9IWjmkeeF/8fPmB5fWoHGqeTYEC3/0DAgtpUoFJa4FpvzFH0SBHo1Q==} - engines: {node: '>=20.0.0'} - - '@supabase/realtime-js@2.95.3': - resolution: {integrity: sha512-D7EAtfU3w6BEUxDACjowWNJo/ZRo7sDIuhuOGKHIm9FHieGeoJV5R6GKTLtga/5l/6fDr2u+WcW/m8I9SYmaIw==} - engines: {node: '>=20.0.0'} - - '@supabase/storage-js@2.101.1': - resolution: {integrity: sha512-WhTaUOBgeEvnKLy95Cdlp6+D5igSF/65yC727w1olxbet5nzUvMlajKUWyzNtQu2efrz2cQ7FcdVBdQqgT9YKQ==} + '@supabase/postgrest-js@2.104.0': + resolution: {integrity: sha512-ynylEq6wduQEycj6pL3P+/yIfDQ+CTnBC5I6p+PzcAO2ybj9coAITVtMfboi+g/dacgMslN5MH73rXsRMB29+Q==} engines: {node: '>=20.0.0'} - '@supabase/storage-js@2.95.3': - resolution: {integrity: sha512-4GxkJiXI3HHWjxpC3sDx1BVrV87O0hfX+wvJdqGv67KeCu+g44SPnII8y0LL/Wr677jB7tpjAxKdtVWf+xhc9A==} + '@supabase/realtime-js@2.104.0': + resolution: {integrity: sha512-9fUVDoTVAhn7a79+AmEx+asUlRtf2yBrji7TQckcKn/WK4hvAA9Lia9er+lnhuz3WNiF1x6kkA4x7bRCJrU+KA==} engines: {node: '>=20.0.0'} - '@supabase/supabase-js@2.101.1': - resolution: {integrity: sha512-Jnhm3LfuACwjIzvk2pfUbGQn7pa7hi6MFzfSyPrRYWVCCu69RPLCFyHSBl7HSBwadbQ3UZOznnD3gPca3ePrRA==} + '@supabase/storage-js@2.104.0': + resolution: {integrity: sha512-s2NHtuAWb9nldJ/fS62WnJE6edvCWn31rrO+FJKlAohs99qdVgtLegUReTU2H9WnZiQlVqaBtu386wt6/6lrRw==} engines: {node: '>=20.0.0'} - '@supabase/supabase-js@2.95.3': - resolution: {integrity: sha512-Fukw1cUTQ6xdLiHDJhKKPu6svEPaCEDvThqCne3OaQyZvuq2qjhJAd91kJu3PXLG18aooCgYBaB6qQz35hhABg==} + '@supabase/supabase-js@2.104.0': + resolution: {integrity: sha512-hILwhIjCB53G31jlHUe73NDEmrXudcjcYlVRuvNfEhzf0gyFQaFf7j6rd1UGmYZkFMOg//DFE8Iy9ZbNEgosVw==} engines: {node: '>=20.0.0'} - '@swc/core-darwin-arm64@1.15.24': - resolution: {integrity: sha512-uM5ZGfFXjtvtJ+fe448PVBEbn/CSxS3UAyLj3O9xOqKIWy3S6hPTXSPbszxkSsGDYKi+YFhzAsR4r/eXLxEQ0g==} + '@swc/core-darwin-arm64@1.15.30': + resolution: {integrity: sha512-VvpP+vq08HmGYewMWvrdsxh9s2lthz/808zXm8Yu5kaqeR8Yia2b0eYXleHQ3VAjoStUDk6LzTheBW9KXYQdMA==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.24': - resolution: {integrity: sha512-fMIb/Zfn929pw25VMBhV7Ji2Dl+lCWtUPNdYJQYOke+00E5fcQ9ynxtP8+qhUo/HZc+mYQb1gJxwHM9vty+lXg==} + '@swc/core-darwin-x64@1.15.30': + resolution: {integrity: sha512-WiJA0hiZI3nwQAO6mu5RqigtWGDtth4Hiq6rbZxAaQyhIcqKIg5IoMRc1Y071lrNJn29eEDMC86Rq58xgUxlDg==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.24': - resolution: {integrity: sha512-vOkjsyjjxnoYx3hMEWcGxQrMgnNrRm6WAegBXrN8foHtDAR+zpdhpGF5a4lj1bNPgXAvmysjui8cM1ov/Clkaw==} + '@swc/core-linux-arm-gnueabihf@1.15.30': + resolution: {integrity: sha512-YANuFUo48kIT6plJgCD0keae9HFXfjxsbvsgevqc0hr/07X/p7sAWTFOGYEc2SXcASaK7UvuQqzlbW8pr7R79g==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.24': - resolution: {integrity: sha512-h/oNu+upkXJ6Cicnq7YGVj9PkdfarLCdQa8l/FlHYvfv8CEiMaeeTnpLU7gSBH/rGxosM6Qkfa/J9mThGF9CLA==} + '@swc/core-linux-arm64-gnu@1.15.30': + resolution: {integrity: sha512-VndG8jaR4ugY6u+iVOT0Q+d2fZd7sLgjPgN8W/Le+3EbZKl+cRfFxV7Eoz4gfLqhmneZPdcIzf9T3LkgkmqNLg==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.24': - resolution: {integrity: sha512-ZpF/pRe1guk6sKzQI9D1jAORtjTdNlyeXn9GDz8ophof/w2WhojRblvSDJaGe7rJjcPN8AaOkhwdRUh7q8oYIg==} + '@swc/core-linux-arm64-musl@1.15.30': + resolution: {integrity: sha512-1SYGs2l0Yyyi0pR/P/NKz/x0kqxkoiw+BXeJjLUdecSk/KasncWlJrc6hOvFSgKHOBrzgM5jwuluKtlT8dnrcA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-ppc64-gnu@1.15.24': - resolution: {integrity: sha512-QZEsZfisHTSJlmyChgDFNmKPb3W6Lhbfo/O76HhIngfEdnQNmukS38/VSe1feho+xkV5A5hETyCbx3sALBZKAQ==} + '@swc/core-linux-ppc64-gnu@1.15.30': + resolution: {integrity: sha512-TXREtiXeRhbfDFbmhnkIsXpKfzbfT73YkV2ZF6w0sfxgjC5zI2ZAbaCOq25qxvegofj2K93DtOpm9RLaBgqR2g==} engines: {node: '>=10'} cpu: [ppc64] os: [linux] - '@swc/core-linux-s390x-gnu@1.15.24': - resolution: {integrity: sha512-DLdJKVsJgglqQrJBuoUYNmzm3leI7kUZhLbZGHv42onfKsGf6JDS3+bzCUQfte/XOqDjh/tmmn1DR/CF/tCJFw==} + '@swc/core-linux-s390x-gnu@1.15.30': + resolution: {integrity: sha512-DCR2YYeyd6DQE4OuDhImouuNcjXEiEdnn1Y0DyGteugPEDvVuvYk8Xddi+4o2SgWH6jiW8/I+3emZvbep1NC+g==} engines: {node: '>=10'} cpu: [s390x] os: [linux] - '@swc/core-linux-x64-gnu@1.15.24': - resolution: {integrity: sha512-IpLYfposPA/XLxYOKpRfeccl1p5dDa3+okZDHHTchBkXEaVCnq5MADPmIWwIYj1tudt7hORsEHccG5no6IUQRw==} + '@swc/core-linux-x64-gnu@1.15.30': + resolution: {integrity: sha512-5Pizw3NgfOJ5BJOBK8TIRa59xFW2avESTOBDPTAYwZYa1JNDs+KMF9lUfjJiJLM5HiMs/wPheA9eiT0q9m2AoA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.24': - resolution: {integrity: sha512-JHy3fMSc0t/EPWgo74+OK5TGr51aElnzqfUPaiRf2qJ/BfX5CUCfMiWVBuhI7qmVMBnk1jTRnL/xZnOSHDPLYg==} + '@swc/core-linux-x64-musl@1.15.30': + resolution: {integrity: sha512-qyqydP/wyH8alcIP4a2hnGSjHLJjm9H7yDFup+CPy9oTahFgLLwnNcv5UHXqO2Qs3AIND+cls5f/Bb6hqpxdgA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.24': - resolution: {integrity: sha512-Txj+qUH1z2bUd1P3JvwByfjKFti3cptlAxhWgmunBUUxy/IW3CXLZ6l6Gk4liANadKkU71nIU1X30Z5vpMT3BA==} + '@swc/core-win32-arm64-msvc@1.15.30': + resolution: {integrity: sha512-CaQENgDHVGOg1mSF5sQVgvfFHG9kjMor2rkLMLeLOkfZYNj13ppnJ9+lfaBZLZUMMbnlGQnavCJb8PVBUOso7Q==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.24': - resolution: {integrity: sha512-15D/nl3XwrhFpMv+MADFOiVwv3FvH9j8c6Rf8EXBT3Q5LoMh8YnDnSgPYqw1JzPnksvsBX6QPXLiPqmcR/Z4qQ==} + '@swc/core-win32-ia32-msvc@1.15.30': + resolution: {integrity: sha512-30VdLeGk6fugiUs/kUdJ/pAg7z/zpvVbR11RH60jZ0Z42WIeIniYx0rLEWN7h/pKJ3CopqsQ3RsogCAkRKiA2g==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.11': - resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} + '@swc/core-win32-x64-msvc@1.15.30': + resolution: {integrity: sha512-4iObHPR+Q4oDY110EF5SF5eIaaVJNpMdG9C0q3Q92BsJ5y467uHz7sYQhP60WYlLFsLQ1el2YrIPUItUAQGOKg==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core-win32-x64-msvc@1.15.24': - resolution: {integrity: sha512-PR0PlTlPra2JbaDphrOAzm6s0v9rA0F17YzB+XbWD95B4g2cWcZY9LAeTa4xll70VLw9Jr7xBrlohqlQmelMFQ==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@swc/core@1.15.24': - resolution: {integrity: sha512-5Hj8aNasue7yusUt8LGCUe/AjM7RMAce8ZoyDyiFwx7Al+GbYKL+yE7g4sJk8vEr1dKIkTRARkNIJENc4CjkBQ==} + '@swc/core@1.15.30': + resolution: {integrity: sha512-R8VQbQY1BZcbIF2p3gjlTCwAQzx1A194ugWfwld5y+WgVVWqVKm7eURGGOVbQVubgKWzidP2agomBbg96rZilQ==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -6233,8 +5547,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.18': - resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} '@swc/jest@0.2.39': resolution: {integrity: sha512-eyokjOwYd0Q8RnMHri+8/FS1HIrIUKK/sRrFp8c1dThUOfNeCWbLmBP1P5VsKdvmkd25JaH+OKYwEYiAYg9YAA==} @@ -6245,6 +5559,94 @@ packages: '@swc/types@0.1.26': resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} + '@tailwindcss/node@4.2.4': + resolution: {integrity: sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==} + + '@tailwindcss/oxide-android-arm64@4.2.4': + resolution: {integrity: sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.4': + resolution: {integrity: sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.4': + resolution: {integrity: sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.4': + resolution: {integrity: sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': + resolution: {integrity: sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': + resolution: {integrity: sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.4': + resolution: {integrity: sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.4': + resolution: {integrity: sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.2.4': + resolution: {integrity: sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.2.4': + resolution: {integrity: sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': + resolution: {integrity: sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.4': + resolution: {integrity: sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.4': + resolution: {integrity: sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.2.4': + resolution: {integrity: sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==} + '@tensorflow/tfjs-backend-cpu@4.22.0': resolution: {integrity: sha512-1u0FmuLGuRAi8D2c3cocHTASGXOmHc/4OvoVDENJayjYkS119fcTcQf4iHrtLthWyDIPy3JiPhRrZQC9EwnhLw==} engines: {yarn: '>= 1.3.2'} @@ -6255,8 +5657,8 @@ packages: resolution: {integrity: sha512-LEkOyzbknKFoWUwfkr59vSB68DMJ4cjwwHgicXN0DUi3a0Vh1Er3JQqCI1Hl86GGZQvY8ezVrtDIvqR1ZFW55A==} engines: {yarn: '>= 1.3.2'} - '@testcontainers/postgresql@11.13.0': - resolution: {integrity: sha512-Y+HLf+IEu9+h3MgxRhnFunw9ldk3jxN2PO6zyejN5AiDd1aSeBQ7hfpc/4MlMm65St2DdLGf39oE/vdW1+hc/Q==} + '@testcontainers/postgresql@11.14.0': + resolution: {integrity: sha512-wYbJn8GRTj8qfqzfVubxioYWlHJU/ImIjuzPwyy9C5Qfo6g3GLduPZAj+BifvqTZjgT3gd4gFVLCPhBji7dc1w==} '@tokenizer/inflate@0.4.1': resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} @@ -6287,38 +5689,38 @@ packages: '@tsconfig/recommended@1.0.13': resolution: {integrity: sha512-sySRuBfMKyKO/j2ZAhR8kSembhjuPEV4Ra3AHtmWLq51+iGaudr45crPSzNC5b7/Ctrh9dfUpBuTlYrH6rM58Q==} - '@turbo/darwin-64@2.9.4': - resolution: {integrity: sha512-ZSlPqJ5Vqg/wgVw8P3AOVCIosnbBilOxLq7TMz3MN/9U46DUYfdG2jtfevNDufyxyrg98pcPs/GBgDRaaids6g==} + '@turbo/darwin-64@2.9.6': + resolution: {integrity: sha512-X/56SnVXIQZBLKwniGTwEQTGmtE5brSACnKMBWpY3YafuxVYefrC2acamfjgxP7BG5w3I+6jf0UrLoSzgPcSJg==} cpu: [x64] os: [darwin] - '@turbo/darwin-arm64@2.9.4': - resolution: {integrity: sha512-9cjTWe4OiNlFMSRggPNh+TJlRs7MS5FWrHc96MOzft5vESWjjpvaadYPv5ykDW7b45mVHOF2U/W+48LoX9USWw==} + '@turbo/darwin-arm64@2.9.6': + resolution: {integrity: sha512-aalBeSl4agT/QtYGDyf/XLajedWzUC9Vg/pm/YO6QQ93vkQ91Vz5uK1ta5RbVRDozQSz4njxUNqRNmOXDzW+qw==} cpu: [arm64] os: [darwin] - '@turbo/linux-64@2.9.4': - resolution: {integrity: sha512-Cl1GjxqBXQ+r9KKowmXG+lhD1gclLp48/SE7NxL//66iaMytRw0uiphWGOkccD92iPiRjHLRUaA9lOTtgr5OCA==} + '@turbo/linux-64@2.9.6': + resolution: {integrity: sha512-YKi05jnNHaD7vevgYwahpzGwbsNNTwzU2c7VZdmdFm7+cGDP4oREUWSsainiMfRqjRuolQxBwRn8wf1jmu+YZA==} cpu: [x64] os: [linux] - '@turbo/linux-arm64@2.9.4': - resolution: {integrity: sha512-j2hPAKVmGNN2EsKigEWD+43y9m7zaPhNAs6ptsyfq0u7evHHBAXAwOfv86OEMg/gvC+pwGip0i1CIm1bR1vYug==} + '@turbo/linux-arm64@2.9.6': + resolution: {integrity: sha512-02o/ZS69cOYEDczXvOB2xmyrtzjQ2hVFtWZK1iqxXUfzMmTjZK4UumrfNnjckSg+gqeBfnPRHa0NstA173Ik3g==} cpu: [arm64] os: [linux] - '@turbo/windows-64@2.9.4': - resolution: {integrity: sha512-1jWPjCe9ZRmsDTXE7uzqfySNQspnUx0g6caqvwps+k/sc+fm9hC/4zRQKlXZLbVmP3Xxp601Ju71boegHdnYGw==} + '@turbo/windows-64@2.9.6': + resolution: {integrity: sha512-wVdQjvnBI15wB6JrA+43CtUtagjIMmX6XYO758oZHAsCNSxqRlJtdyujih0D8OCnwCRWiGWGI63zAxR0hO6s9g==} cpu: [x64] os: [win32] - '@turbo/windows-arm64@2.9.4': - resolution: {integrity: sha512-dlko15TQVu/BFYmIY018Y3covWMRQlUgAkD+OOk+Rokcfj6VY02Vv4mCfT/Zns6B4q8jGbOd6IZhnCFYsE8Viw==} + '@turbo/windows-arm64@2.9.6': + resolution: {integrity: sha512-1XUUyWW0W6FTSqGEhU8RHVqb2wP1SPkr7hIvBlMEwH9jr+sJQK5kqeosLJ/QaUv4ecSAd1ZhIrLoW7qslAzT4A==} cpu: [arm64] os: [win32] - '@turbopuffer/turbopuffer@1.21.0': - resolution: {integrity: sha512-lzMOQkbe/uP2lkW/tlJx6Vh+/nZnCq5NA5QVyES5EoWgMu005o/RS2pB3r97GClNU123nMA6Wl4zTzrYMD7ysQ==} + '@turbopuffer/turbopuffer@1.22.0': + resolution: {integrity: sha512-NcFg4QBMjxKMo301QoTwz+la+mOjd1tB/qQvMaWM3dCJqkpWA+DCwdORK+y5une+Iatj5G5U0H+7MCI/hZLkvQ==} '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -6440,17 +5842,14 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@22.19.15': - resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} + '@types/node@22.19.17': + resolution: {integrity: sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==} - '@types/node@24.10.13': - resolution: {integrity: sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==} + '@types/node@24.12.2': + resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} - '@types/node@25.3.0': - resolution: {integrity: sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==} - - '@types/node@25.5.0': - resolution: {integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} '@types/offscreencanvas@2019.7.3': resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} @@ -6459,23 +5858,17 @@ packages: resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. - '@types/pg@8.16.0': - resolution: {integrity: sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ==} - '@types/pg@8.20.0': resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==} - '@types/phoenix@1.6.7': - resolution: {integrity: sha512-oN9ive//QSBkf19rfDv45M7eZPi0eEXylht2OLEXicu5b4KoQ1OzXIw+xDSGWxSxe1JmepRR/ZH283vsu518/Q==} - '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} '@types/q@1.5.8': resolution: {integrity: sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==} - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} + '@types/qs@6.15.0': + resolution: {integrity: sha512-JawvT8iBVWpzTrz3EGw9BTQFg3BQNmwERdKE22vlTxawwtbyUSlMppvZYKLZzB5zgACXdXxbD3m1bXaMqP/9ow==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} @@ -6556,48 +5949,49 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260405.1': - resolution: {integrity: sha512-EQl2Qwq8WT9yl4RGG/yNmMutMPnASQwXcuN4bdmm1ycq2oFwogf+WBXUVCohjjNWtj1Xzn+J3qAO98LNATBrGw==} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260421.2': + resolution: {integrity: sha512-fHv1r3ZmVo6zxuAIFmuX3w9QxbcauoG0SsWhmDwm6VmRubLlOJIcmTtlmV3JAb9oOnq8LuzZljzT7Q39fSMQDw==} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260405.1': - resolution: {integrity: sha512-qphWh72S/ozZlCfTSl1yD0AbfYyXoNvPjE2kqIdyUxdkFysHTg/FFH8NH1g9F3cPEwI/zhnOFNm5Yul5EaRoHQ==} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260421.2': + resolution: {integrity: sha512-KWTR6xbW9t+JS7D5DQIzo75pqVXVWUxF9PMv/+S6xsnOjCVd6g0ixHcFpFMJMKSUQpGPr8Z5f7b8ks6LHW01jg==} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260405.1': - resolution: {integrity: sha512-mnKMNzYvdbBZ1t3SoNHChat63ckZbEPfxUS/n11UfIDf2g08fjm0wCmNLGGVYcIo3/jnaYG7KoiJv+92l/7vXg==} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260421.2': + resolution: {integrity: sha512-VLMEuml3BhUb+jaL0TXQ4xvVODxJF+RhkI+tBWvlynsJI4khTXEiwWh+wPOJrsfBRYFRMXEu28Odl/HXkYze8w==} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20260405.1': - resolution: {integrity: sha512-u3bplo4lL4sOLZSRND8lllFbnDSWlY61InGeJUXv9UTfJXxYxMdTGEQKETFV/WeRO4RsiBMvkad/tfhbBPQ8mw==} + '@typescript/native-preview-linux-arm@7.0.0-dev.20260421.2': + resolution: {integrity: sha512-BWLQO3nemLDSV5PoE5GPHe1dU9Dth77Kv8/cle9Ujcp4LhPo0KincdPqFH/qKeU/xvW25mgFueflZ1nc4rKuww==} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20260405.1': - resolution: {integrity: sha512-wPehp7o7aCUYTUQlJ8oVLsoycmFDRcU6roIBZZhv7CN7TSkNRP7r9v6+42U6ztaFCjkkh8QVVS7ysQ5bYoCiRg==} + '@typescript/native-preview-linux-x64@7.0.0-dev.20260421.2': + resolution: {integrity: sha512-qUrJWTB5/wv4wnRG0TRXElAxc2kykNiRNyEIEqBbLmzDlrcvAW7RRy8MXoY1ZyTiKGMu14itZ3x9oW6+blFpRw==} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260405.1': - resolution: {integrity: sha512-7QZm+1x5p1GO4yNYcp8jqt32ysfd+UwtQ9Zg1nl9Wl9iN/DSNV0HcGR4KHRSUAmHCg4dSq/snLpbEKUvfK0AdQ==} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260421.2': + resolution: {integrity: sha512-Rc6NsWlZmCs5YUKVzKgwoBOoRUGsPzct4BDMRX0csD1devLBBc4AbUXWKsJRbpwIAnqMO1ld4sNHEb+wXgfNHQ==} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20260405.1': - resolution: {integrity: sha512-M9Ypkq8cj2hut16fNljg+UaIKw0+bjLoIf7qoaUJYDUFx7tMcRx79Iy54ETAZl63mT8I8rlJKXZjnOvLUwOFcg==} + '@typescript/native-preview-win32-x64@7.0.0-dev.20260421.2': + resolution: {integrity: sha512-GQv1+dya1t6EqF2Cpsb+xoozovdX10JUSf6Kl/8xNkTapzmlHd+uMr+8ku3jIASTxoRGn0Mklgjj3MDKrOTuLg==} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20260405.1': - resolution: {integrity: sha512-xm/9KOHSVXeTBY/zpqAt2TK8oMwobXVadlKmqsMg4Gr46FrSGMPXJEZ5209DlYfLBAa6+8nIJjKQfrtbl+X2OQ==} + '@typescript/native-preview@7.0.0-dev.20260421.2': + resolution: {integrity: sha512-CmajHI25HpVWE9R1XFoxr+cphJPxoYD3eFioQtAvXYkMFKnLdICMS9pXre9Pybizb75ejRxjKD5/CVG055rEIg==} hasBin: true - '@typespec/ts-http-runtime@0.3.3': - resolution: {integrity: sha512-91fp6CAAJSRtH5ja95T1FHSKa8aPW9/Zw6cta81jlZTUw/+Vq8jM/AfF/14h2b71wwR84JUTW/3Y8QPhDAawFA==} - engines: {node: '>=20.0.0'} + '@typescript/vfs@1.6.4': + resolution: {integrity: sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==} + peerDependencies: + typescript: '*' '@typespec/ts-http-runtime@0.3.5': resolution: {integrity: sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==} @@ -6704,9 +6098,6 @@ packages: '@upstash/redis@1.37.0': resolution: {integrity: sha512-LqOJ3+XWPLSZ2rGSed5DYG3ixybxb8EhZu3yQqF7MdZX1wLBG/FRcI6xcUZXHy/SS7mmXWyadrud0HJHkOc+uw==} - '@upstash/vector@1.2.2': - resolution: {integrity: sha512-ptQ9xnxtKqmpNK52PCcHCszlPOLxIBfjsv7ty8RoF95pkjctS9rSjTQ3Pl9bx5VFbpDj+0dMXw88WLt6swDkgQ==} - '@upstash/vector@1.2.3': resolution: {integrity: sha512-yXsWKeuHNYyH72BcSZd3bV5ZD5MybAoTvKxkMaeV2UzuGfNzbHBVh5eO+ysTWTFAf8I9XcOueF4tZfAGjCa4Iw==} @@ -6732,11 +6123,11 @@ packages: '@vitest/browser': optional: true - '@vitest/coverage-v8@4.1.2': - resolution: {integrity: sha512-sPK//PHO+kAkScb8XITeB1bf7fsk85Km7+rt4eeuRR3VS1/crD47cmV5wicisJmjNdfeokTZwjMk4Mj2d58Mgg==} + '@vitest/coverage-v8@4.1.5': + resolution: {integrity: sha512-38C0/Ddb7HcRG0Z4/DUem8x57d2p9jYgp18mkaYswEOQBGsI1CG4f/hjm0ZCeaJfWhSZ4k7jgs29V1Zom7Ki9A==} peerDependencies: - '@vitest/browser': 4.1.2 - vitest: 4.1.2 + '@vitest/browser': 4.1.5 + vitest: 4.1.5 peerDependenciesMeta: '@vitest/browser': optional: true @@ -6744,9 +6135,6 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/expect@4.1.2': - resolution: {integrity: sha512-gbu+7B0YgUJ2nkdsRJrFFW6X7NTP44WlhiclHniUhxADQJH5Szt9mZ9hWnJPJ8YwOK5zUOSSlSvyzRf0u1DSBQ==} - '@vitest/expect@4.1.5': resolution: {integrity: sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==} @@ -6761,17 +6149,6 @@ packages: vite: optional: true - '@vitest/mocker@4.1.2': - resolution: {integrity: sha512-Ize4iQtEALHDttPRCmN+FKqOl2vxTiNUhzobQFFt/BM1lRUTG7zRCLOykG/6Vo4E4hnUdfVLo5/eqKPukcWW7Q==} - peerDependencies: - msw: ^2.4.9 - vite: ^7.3.2 - peerDependenciesMeta: - msw: - optional: true - vite: - optional: true - '@vitest/mocker@4.1.5': resolution: {integrity: sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==} peerDependencies: @@ -6786,45 +6163,30 @@ packages: '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/pretty-format@4.1.2': - resolution: {integrity: sha512-dwQga8aejqeuB+TvXCMzSQemvV9hNEtDDpgUKDzOmNQayl2OG241PSWeJwKRH3CiC+sESrmoFd49rfnq7T4RnA==} - '@vitest/pretty-format@4.1.5': resolution: {integrity: sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==} '@vitest/runner@3.2.4': resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/runner@4.1.2': - resolution: {integrity: sha512-Gr+FQan34CdiYAwpGJmQG8PgkyFVmARK8/xSijia3eTFgVfpcpztWLuP6FttGNfPLJhaZVP/euvujeNYar36OQ==} - '@vitest/runner@4.1.5': resolution: {integrity: sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==} '@vitest/snapshot@3.2.4': resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/snapshot@4.1.2': - resolution: {integrity: sha512-g7yfUmxYS4mNxk31qbOYsSt2F4m1E02LFqO53Xpzg3zKMhLAPZAjjfyl9e6z7HrW6LvUdTwAQR3HHfLjpko16A==} - '@vitest/snapshot@4.1.5': resolution: {integrity: sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==} '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/spy@4.1.2': - resolution: {integrity: sha512-DU4fBnbVCJGNBwVA6xSToNXrkZNSiw59H8tcuUspVMsBDBST4nfvsPsEHDHGtWRRnqBERBQu7TrTKskmjqTXKA==} - '@vitest/spy@4.1.5': resolution: {integrity: sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==} '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@vitest/utils@4.1.2': - resolution: {integrity: sha512-xw2/TiX82lQHA06cgbqRKFb5lCAy3axQ4H4SoUFhUsg+wztiet+co86IAMDtF6Vm1hc7J6j09oh/rgDn+JdKIQ==} - '@vitest/utils@4.1.5': resolution: {integrity: sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==} @@ -6848,9 +6210,6 @@ packages: '@zilliz/milvus2-sdk-node@2.6.13': resolution: {integrity: sha512-6yn/8Av9GDe1uP7LzNkS/BhVMuc2N1kB0wMweHz+PVB4vjMK8BH2QogYQ70yvgxEkP480Gj2+abPNTbAE9PK5w==} - '@zilliz/milvus2-sdk-node@2.6.9': - resolution: {integrity: sha512-qOaVIpQ3E4w6Dp4lp9QIIuGedpE5dWRhK9SRX+y9WXcq4EXYvcdfR2aG/Vb5tWBPQwcMrGb5z8gRfFy7/gRbIw==} - abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -6858,9 +6217,6 @@ packages: resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} engines: {node: ^20.17.0 || >=22.9.0} - abort-controller-x@0.4.3: - resolution: {integrity: sha512-VtUwTNU8fpMwvWGn4xE93ywbogTYsuT+AUxAXOeelbXuQVIwNmC5YLeho9sH4vZ4ITW8414TTAOG1nW6uIVHCA==} - abort-controller-x@0.5.0: resolution: {integrity: sha512-yTt9CI0x+nRfX6BFMenEGP8ooPvErGH6AbFz20C2IeOLIlDsrw/VHpgne3GsCEuTA410IiFiaLVFKmgM4bKEPQ==} @@ -6877,14 +6233,9 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: - resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} - engines: {node: '>=0.4.0'} - - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn-walk@8.3.5: + resolution: {integrity: sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==} engines: {node: '>=0.4.0'} - hasBin: true acorn@8.16.0: resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} @@ -6907,8 +6258,8 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ai@5.0.167: - resolution: {integrity: sha512-u/nwVPlKuGH1AQyENjduaU+I1n9LA4pWhMh9O4D8rBE+GeuxpHB3PfJ3PCo22wRuIwFayLMOO7CUQ+yehREx3A==} + ai@5.0.179: + resolution: {integrity: sha512-tuq/r2FH/pBuY3jo0yHF3UglDV73WONGLhW80DuwgO6w0ftPIqRsAm5p9cE3Bu4LfEuCkMXpiUG/pQRzqKRRaA==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -6921,8 +6272,8 @@ packages: ajv: optional: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} @@ -7003,8 +6354,8 @@ packages: args-tokenizer@0.3.0: resolution: {integrity: sha512-xXAd7G2Mll5W8uo37GETpQ2VrE84M181Z7ugHFGQnJZ50M2mbOv0osSZ9VsSgPfJQ+LVG0prSi0th+ELMsno7Q==} - array-back@6.2.2: - resolution: {integrity: sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==} + array-back@6.2.3: + resolution: {integrity: sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==} engines: {node: '>=12.17'} array-ify@1.0.0: @@ -7033,8 +6384,8 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} - ast-v8-to-istanbul@0.3.11: - resolution: {integrity: sha512-Qya9fkoofMjCBNVdWINMjB5KZvkYfaO9/anwkWnjxibpWUxo5iHl2sOdP7/uAqaRuUYuoo8rDwnbaaKVFxoUvw==} + ast-v8-to-istanbul@0.3.12: + resolution: {integrity: sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==} ast-v8-to-istanbul@1.0.0: resolution: {integrity: sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==} @@ -7061,6 +6412,13 @@ packages: atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} + autoprefixer@10.5.0: + resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -7075,11 +6433,11 @@ packages: aws4fetch@1.0.20: resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} - axios@1.15.0: - resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} + axios@1.15.2: + resolution: {integrity: sha512-wLrXxPtcrPTsNlJmKjkPnNPK2Ihe0hn0wGSaTEiHRPxwjvJwT3hKmXF4dpqxmPO9SoNb2FsYXj/xEo0gHN+D5A==} - b4a@1.7.3: - resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + b4a@1.8.0: + resolution: {integrity: sha512-qRuSmNSkGQaHwNbM7J78Wwy+ghLEYF1zNrSeMxj4Kgw6y33O3mXcQ6Ie9fRvfU/YnxWkOchPXbaLb73TkIsfdg==} peerDependencies: react-native-b4a: '*' peerDependenciesMeta: @@ -7123,8 +6481,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.4: - resolution: {integrity: sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==} + bare-fs@4.7.1: + resolution: {integrity: sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -7132,32 +6490,35 @@ packages: bare-buffer: optional: true - bare-os@3.6.2: - resolution: {integrity: sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==} + bare-os@3.9.0: + resolution: {integrity: sha512-JTjuZyNIDpw+GytMO4a6TK1VXdVKKJr6DRxEHasyuYyShV2deuiHJK/ahGZlebc+SG0/wJCB9XK8gprBGDFi/Q==} engines: {bare: '>=1.14.0'} bare-path@3.0.0: resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - bare-stream@2.8.0: - resolution: {integrity: sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==} + bare-stream@2.13.0: + resolution: {integrity: sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==} peerDependencies: + bare-abort-controller: '*' bare-buffer: '*' bare-events: '*' peerDependenciesMeta: + bare-abort-controller: + optional: true bare-buffer: optional: true bare-events: optional: true - bare-url@2.3.2: - resolution: {integrity: sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==} + bare-url@2.4.2: + resolution: {integrity: sha512-/9a2j4ac6ckpmAHvod/ob7x439OAHst/drc2Clnq+reRYd/ovddwcF4LfoxHyNk5AuGBnPg+HqFjmE/Zpq6v0A==} base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.0: - resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + baseline-browser-mapping@2.10.20: + resolution: {integrity: sha512-1AaXxEPfXT+GvTBJFuy4yXVHWJBXa4OdbIebGN/wX5DlsIkU0+wzGnd2lOzokSk51d5LUmqjgBLRLlypLUqInQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -7175,16 +6536,13 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - better-result@2.8.0: - resolution: {integrity: sha512-Zww6wBeN+KL+kmE4cHyY9uj5+9omtTzSyHwaoncLoti9XLKETpcAPehiSa5CGp4sRWDZbgbtS7x/Ci5U77Tqyg==} + better-result@2.8.2: + resolution: {integrity: sha512-YOf0VSj5nUPI27doTtXF+BBnsiRq3qY7avHqfIWnppxTLGyvkLq1QV2RTxkwoZwJ60ywLfZ0raFF4J/G886i7A==} - better-sqlite3@12.6.2: - resolution: {integrity: sha512-8VYKM3MjCa9WcaSAI3hzwhmyHVlH8tiGFwf0RlTsZPWJ1I5MkzjiudCo4KC4DxOaL/53A5B1sI/IbldNFDbsKA==} + better-sqlite3@12.9.0: + resolution: {integrity: sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ==} engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x} - bidi-js@1.0.3: - resolution: {integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==} - bignumber.js@9.3.1: resolution: {integrity: sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==} @@ -7226,8 +6584,8 @@ packages: browser-or-node@1.3.0: resolution: {integrity: sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==} - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.28.2: + resolution: {integrity: sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -7318,6 +6676,14 @@ packages: magicast: optional: true + c12@3.3.4: + resolution: {integrity: sha512-cM0ApFQSBXuourJejzwv/AuPRvAxordTyParRVcHjjtXirtkzM0uK2L9TTn9s0cXZbG7E55jCivRQzoxYmRAlA==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -7330,16 +6696,12 @@ packages: resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} engines: {node: '>= 10'} - cacache@20.0.4: - resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} - engines: {node: ^20.17.0 || >=22.9.0} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} engines: {node: '>= 0.4'} call-bound@1.0.4: @@ -7358,8 +6720,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001777: - resolution: {integrity: sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==} + caniuse-lite@1.0.30001788: + resolution: {integrity: sha512-6q8HFp+lOQtcf7wBK+uEenxymVWkGKkjFpCvw5W25cmMwEDU45p1xQFBQv8JDlMMry7eNxyBaR+qxgmTUZkIRQ==} chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} @@ -7435,32 +6797,32 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - chromadb-js-bindings-darwin-arm64@1.3.1: - resolution: {integrity: sha512-MMo+TX8tRrhy/0KGrA30kVTZ+EwrRoXRSQA7EGLuKW6FTEVX7hbF5l0EFWgDTw6YPX/KY2ySYNQH3VFwRyxYFA==} + chromadb-js-bindings-darwin-arm64@1.3.3: + resolution: {integrity: sha512-fygMqw+Qsnc7zlh59tYAUfW5g859ZVLnA5cG0tyO7NZG2lQz1QKZCTqG49TVU7vfmeC7LzjIZvEQ0jrTqFKaMQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - chromadb-js-bindings-darwin-x64@1.3.1: - resolution: {integrity: sha512-zboZ29wtP7vrevfYhNXFToSM9sTaXP+KALYF4B6wJNp4jymBRSAzhAsHBrVmAJQxgPEJatoODAWqsVxaGLYkog==} + chromadb-js-bindings-darwin-x64@1.3.3: + resolution: {integrity: sha512-OwaNmkEo8gYp5inp88pa0vLUSNYs9nBouvumbt+YI1JYShpDs6cnBKAOfNCFbljjBunqCsv70PPxQqZmkyEzlQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - chromadb-js-bindings-linux-arm64-gnu@1.3.1: - resolution: {integrity: sha512-JPzoIy5vb4Gzu7kZnCkcMtsv+HPx/LWBFu72IDbnkUp8UleNyXup7fVX/tUvwHq+OPtj7ZB4YWwiP3SzKIWEgA==} + chromadb-js-bindings-linux-arm64-gnu@1.3.3: + resolution: {integrity: sha512-98O7kBw2z9kLCbQqElebrV9SAcKf5QKDI9yD144ooLz+jOgj39ccF6q0R13FB3AwYxVvHhKiIKMjO3hOFCx5iw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - chromadb-js-bindings-linux-x64-gnu@1.3.1: - resolution: {integrity: sha512-nQvVhmHs2XXbzA+Xka8A4UMiyMlk86AFmiy1Pt+kzQkuJT5vOMKOcgJW/Nh2m0CtEjkzvj4Mxr2/31BiLil7Hg==} + chromadb-js-bindings-linux-x64-gnu@1.3.3: + resolution: {integrity: sha512-yqJRHDiLNQFfNcCDm/iILdf5gCBR0BxG1d+esX4ViHAP41h4WqbWq9MIAla+OKHKlyMpSq9BiqSfHBaL8rr5nQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - chromadb-js-bindings-win32-x64-msvc@1.3.1: - resolution: {integrity: sha512-3B3WwT1aM9vxFZBqlDgnA+R025b8pOudGM4hEZTmxV2rHND3Hn7C87mQO5WsUMarOUmX4Sd1NlhC2ANKCIWfLw==} + chromadb-js-bindings-win32-x64-msvc@1.3.3: + resolution: {integrity: sha512-X5zuolLBqh3+2GFh9BbjkBPFhPsmezc/HkYAk/rQvYayBqD39e/BT0JwYVbGr+gcqsZI3QO87xZ2FyHL8g8f9Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -7486,8 +6848,8 @@ packages: voyageai: optional: true - chromadb@3.4.0: - resolution: {integrity: sha512-PegxNXByBxMCHq6eFsLQQUNemxufGP+6VbfGQVs/cfNTYGur4gq+vVPFPKNtri12ariBvgbORkH66Ma/YKc7PQ==} + chromadb@3.4.3: + resolution: {integrity: sha512-AouHyTh70Ux1w5TKDmk54wGAszY7NtU/DXyC7o3qGuE8b+b1nT/W3+s8UVd9XwqGZIR4A76+g4u7yJuV/WU3OA==} engines: {node: '>=20'} hasBin: true @@ -7508,8 +6870,8 @@ packages: citty@0.1.6: resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - citty@0.2.0: - resolution: {integrity: sha512-8csy5IBFI2ex2hTVpaHN2j+LNE199AgiI7y4dMintrr8i0lQiFn+0AWMZrWdHKIgMOer65f8IThysYhoReqjWA==} + citty@0.2.2: + resolution: {integrity: sha512-+6vJA3L98yv+IdfKGZHBNiGW5KHn22e/JwID0Strsz8h4S/csAu/OuICwxrg44k5MRiZHWIo8XXuJgQTriRP4w==} cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} @@ -7537,8 +6899,8 @@ packages: resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} engines: {node: '>=18.20'} - cli-truncate@5.1.1: - resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} + cli-truncate@5.2.0: + resolution: {integrity: sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==} engines: {node: '>=20'} cli-width@4.1.0: @@ -7568,8 +6930,8 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - cohere-ai@7.20.0: - resolution: {integrity: sha512-h/3h3pcLXRUmkzp/W+/FWViEMcAFtSZ8YayCTFQXpib112uNSj3feApOtJg7v9lreWR1t7gznhE6N9KNCX5FOA==} + cohere-ai@7.21.0: + resolution: {integrity: sha512-AouvBkDho9gnEAnk5oY99p/VHfjP6AkDhZLv/tyB2TIFm7IEd6QQl00jaqBtAbOZnMT297Scq3pkqOUCTr886A==} engines: {node: '>=18.0.0'} cohere-ai@8.0.0: @@ -7626,12 +6988,16 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - command-line-args@6.0.1: - resolution: {integrity: sha512-Jr3eByUjqyK0qd8W0SGFW1nZwqCaNCtbXjRo2cRJC1OYxWl3MZ5t1US3jq+cO4sPavqgw4l9BMGX0CBe+trepg==} + command-line-args@6.0.2: + resolution: {integrity: sha512-AIjYVxrV9X752LmPDLbVYv8aMCuHPSLZJXEo2qo/xJfv+NYhaZ4sMSF01rM+gHPaMgvPM0l5D/F+Qx+i2WfSmQ==} engines: {node: '>=12.20'} peerDependencies: '@75lb/nature': latest @@ -7639,21 +7005,22 @@ packages: '@75lb/nature': optional: true - command-line-usage@7.0.3: - resolution: {integrity: sha512-PqMLy5+YGwhMh1wS04mVG44oqDsgyLRSKJBdOo1bnYhMKBW65gZF1dRp2OZRhiTjgUHljy99qkO7bsctLaw35Q==} + command-line-usage@7.0.4: + resolution: {integrity: sha512-85UdvzTNx/+s5CkSgBm/0hzP80RFHAa7PsfeADE5ezZF3uHz3/Tqj9gIKGT9PTtpycc3Ua64T0oVulGfKxzfqg==} engines: {node: '>=12.20.0'} commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -7682,16 +7049,16 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} - conventional-changelog-conventionalcommits@9.1.0: - resolution: {integrity: sha512-MnbEysR8wWa8dAEvbj5xcBgJKQlX/m0lhS8DsyAAWDHdfs2faDJxTgzRYlRYpXSe7UiKrIIlB4TrBKU9q9DgkA==} + conventional-changelog-conventionalcommits@9.3.1: + resolution: {integrity: sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==} engines: {node: '>=18'} conventional-changelog-preset-loader@5.0.0: @@ -7702,8 +7069,8 @@ packages: resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} engines: {node: '>=18'} - conventional-commits-parser@6.2.1: - resolution: {integrity: sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==} + conventional-commits-parser@6.4.0: + resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} engines: {node: '>=18'} hasBin: true @@ -7718,34 +7085,21 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - convex@1.32.0: - resolution: {integrity: sha512-5FlajdLpW75pdLS+/CgGH5H6yeRuA+ru50AKJEYbJpmyILUS+7fdTvsdTaQ7ZFXMv0gE8mX4S+S3AtJ94k0mfw==} + convex@1.36.0: + resolution: {integrity: sha512-17cfDr2z+Apd59291rKWij6jq79eVwzY9u2MQOnuVkOsfEPXcuerWHQLf1ngXAbQjeTXD1nwQYsxQBhZnjZMIQ==} engines: {node: '>=18.0.0', npm: '>=7.0.0'} hasBin: true peerDependencies: '@auth0/auth0-react': ^2.0.1 '@clerk/clerk-react': ^4.12.8 || ^5.0.0 + '@clerk/react': ^6.0.0 react: ^18.0.0 || ^19.0.0-0 || ^19.0.0 peerDependenciesMeta: '@auth0/auth0-react': optional: true '@clerk/clerk-react': optional: true - react: - optional: true - - convex@1.34.1: - resolution: {integrity: sha512-ooyFnZVVq0u6b5zt0Ptq8QB2ixhf/2vXe+PIcUtdtrs0lq/TwpkmmruHdqkFmWgMd6N+Tmfy8AGkz6QnZUYZBA==} - engines: {node: '>=18.0.0', npm: '>=7.0.0'} - hasBin: true - peerDependencies: - '@auth0/auth0-react': ^2.0.1 - '@clerk/clerk-react': ^4.12.8 || ^5.0.0 - react: ^18.0.0 || ^19.0.0-0 || ^19.0.0 - peerDependenciesMeta: - '@auth0/auth0-react': - optional: true - '@clerk/clerk-react': + '@clerk/react': optional: true react: optional: true @@ -7762,6 +7116,10 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -7798,17 +7156,14 @@ packages: css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} - css-tree@3.2.1: - resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css-what@6.2.2: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} - cssstyle@6.2.0: - resolution: {integrity: sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==} - engines: {node: '>=20'} + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -7821,10 +7176,6 @@ packages: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - data-urls@7.0.0: - resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} @@ -7834,8 +7185,8 @@ packages: dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dayjs@1.11.19: - resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} debounce-fn@6.0.0: resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} @@ -7863,15 +7214,12 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - decimal.js@10.6.0: - resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - dedent@1.7.1: - resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} + dedent@1.7.2: + resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -7971,12 +7319,12 @@ packages: resolution: {integrity: sha512-rPHigTKGaEHpkUmfd69QgaOp+Os5vGJwG/Ry8lcr8W/382AmI+z/D7qoa9BybKIkqNppaIbs8RYeHSevdQjWww==} engines: {node: '>= 6.0.0'} - docker-modem@5.0.6: - resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==} + docker-modem@5.0.7: + resolution: {integrity: sha512-XJgGhoR/CLpqshm4d3L7rzH6t8NgDFUIIpztYlLHIApeJjMZKYJMz2zxPsYxnejq5h3ELYSw/RBsi3t5h7gNTA==} engines: {node: '>= 8.0'} - dockerode@4.0.9: - resolution: {integrity: sha512-iND4mcOWhPaCNh54WmK/KoSb35AFqPAUWFMffTQcp52uQt36b5uNwEJTSXntJZBbeGad72Crbi/hvDIv6us/6Q==} + dockerode@4.0.10: + resolution: {integrity: sha512-8L/P9JynLBiG7/coiA4FlQXegHltRqS0a+KqI44P1zgQh8QLHTg7FKOwhkBgSJwZTeHsq30WRoVFLuwkfK0YFg==} engines: {node: '>= 8.0'} dom-serializer@2.0.0: @@ -8008,8 +7356,8 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.4.1: - resolution: {integrity: sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} dotenv@8.6.0: @@ -8055,8 +7403,8 @@ packages: effect@3.20.0: resolution: {integrity: sha512-qMLfDJscrNG8p/aw+IkT9W7fgj50Z4wG5bLBy0Txsxz8iUHjDIkOgO3SV0WZfnQbNG2VJYb0b+rDLMrhM4+Krw==} - electron-to-chromium@1.5.307: - resolution: {integrity: sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==} + electron-to-chromium@1.5.343: + resolution: {integrity: sha512-YHnQ3MXI08icvL9ZKnEBy05F2EQ8ob01UaMOuMbM8l+4UcAq6MPPbBTJBbsBUg3H8JeZNt+O4fjsoWth3p6IFg==} emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -8091,6 +7439,10 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -8107,10 +7459,6 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} - entities@8.0.0: - resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} - engines: {node: '>=20.19.0'} - env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -8151,13 +7499,11 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild@0.27.0: - resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==} - engines: {node: '>=18'} - hasBin: true + esbuild-plugin-tailwindcss@2.2.0: + resolution: {integrity: sha512-xzLRHuDZfbDAld+PlQkY028juyfMrYaMRsB4yLfvF3hKBna/cq3bWAHNKz2WQ2YbwbYwYh3B33N1oqBUoX7aww==} - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} hasBin: true @@ -8197,8 +7543,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.39.2: - resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -8264,8 +7610,8 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} + eventsource-parser@3.0.8: + resolution: {integrity: sha512-70QWGkr4snxr0OXLRWsFLeRBIRPuQOvt4s8QYjmUlmlkyTZkRqS7EDVRZtzU3TiyDbXSzaOeF0XUKy8PchzukQ==} engines: {node: '>=18.0.0'} eventsource@3.0.7: @@ -8294,6 +7640,10 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} + exit-hook@4.0.0: + resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} + engines: {node: '>=18'} + exit-x@0.2.2: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} @@ -8306,10 +7656,6 @@ packages: resolution: {integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==} engines: {node: '>=12.0.0'} - expect@30.2.0: - resolution: {integrity: sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - expect@30.3.0: resolution: {integrity: sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -8317,8 +7663,8 @@ packages: exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - express-rate-limit@8.3.1: - resolution: {integrity: sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==} + express-rate-limit@8.3.2: + resolution: {integrity: sha512-77VmFeJkO0/rvimEDuUC5H30oqUC4EyOhyGccfqoLebB0oiEYfM7nwPrsDsBL1gsTpwfzX8SFy2MT3TDyRq+bg==} engines: {node: '>= 16'} peerDependencies: express: '>= 4.11' @@ -8355,8 +7701,8 @@ packages: fast-content-type-parse@3.0.0: resolution: {integrity: sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==} - fast-copy@4.0.2: - resolution: {integrity: sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw==} + fast-copy@4.0.3: + resolution: {integrity: sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -8380,11 +7726,11 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-builder@1.1.4: - resolution: {integrity: sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==} + fast-xml-builder@1.1.5: + resolution: {integrity: sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==} - fast-xml-parser@5.5.8: - resolution: {integrity: sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==} + fast-xml-parser@5.7.1: + resolution: {integrity: sha512-8Cc3f8GUGUULg34pBch/KGyPLglS+OFs05deyOlY7fL2MTagYPKrVQNmR1fLF/yJ9PH5ZSTd3YDF6pnmeZU+zA==} hasBin: true fastq@1.20.1: @@ -8462,8 +7808,8 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - firebase-admin@13.7.0: - resolution: {integrity: sha512-o3qS8zCJbApe7aKzkO2Pa380t9cHISqeSd3blqYTtOuUUUua3qZTLwNWgGUOss3td6wbzrZhiHIj3c8+fC046Q==} + firebase-admin@13.8.0: + resolution: {integrity: sha512-iawoQkmZbsA+2DY5UEuB8f6jSlskzzySoye0D2F6e3zlDZX9DUcXf0HhZqLUn/P6WhLGvTf6ZtCmshZvhAgTYg==} engines: {node: '>=18'} flat-cache@4.0.1: @@ -8483,8 +7829,8 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -8527,6 +7873,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -8550,10 +7899,6 @@ packages: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} - fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -8582,10 +7927,6 @@ packages: resolution: {integrity: sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==} engines: {node: '>=14'} - gaxios@7.1.3: - resolution: {integrity: sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==} - engines: {node: '>=18'} - gaxios@7.1.4: resolution: {integrity: sha512-bTIgTsM2bWn3XklZISBTQX7ZSddGW+IO3bMdGaemHZ3tbqExMENHLx6kKZ/KlejgrMtj8q7wBItt51yegqalrA==} engines: {node: '>=18'} @@ -8601,6 +7942,9 @@ packages: generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + generic-pool@3.9.0: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} @@ -8628,8 +7972,8 @@ packages: get-port-please@3.2.0: resolution: {integrity: sha512-I9QVvBw5U/hw3RmWpYKRumUeaDgxTPd401x364rLmWBJcOQ753eov1eTgzDqRG9bqFIfDc7gfzcQEWrUri3o1A==} - get-port@7.1.0: - resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + get-port@7.2.0: + resolution: {integrity: sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==} engines: {node: '>=16'} get-proto@1.0.1: @@ -8652,11 +7996,8 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-tsconfig@4.13.6: - resolution: {integrity: sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==} - - get-tsconfig@4.13.7: - resolution: {integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==} + get-tsconfig@4.14.0: + resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} get-uri@6.0.5: resolution: {integrity: sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==} @@ -8673,6 +8014,10 @@ packages: resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} hasBin: true + giget@3.2.0: + resolution: {integrity: sha512-GvHTWcykIR/fP8cj8dMpuMMkvaeJfPvYnhq0oW+chSeIr+ldX21ifU2Ms6KBoyKZQZmVaUAAhQ2EZ68KJF8a7A==} + hasBin: true + git-up@8.1.1: resolution: {integrity: sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==} @@ -8756,10 +8101,6 @@ packages: peerDependencies: graphql: 14 - 16 - graphql@16.12.0: - resolution: {integrity: sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==} - engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} - graphql@16.13.2: resolution: {integrity: sha512-5bJ+nf/UCpAjHM8i06fl7eLyVC9iuNAjm9qzkiu2ZGhM0VscSvS6WDPfAwkdkBuoXGM9FJSbKl6wylMwP9Ktig==} engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} @@ -8795,12 +8136,12 @@ packages: has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} - hdb@0.19.8: - resolution: {integrity: sha512-8Xjr6sLdG9g3H7iHY/d/FrNnHumkNIwvWDo8A2LVAAaKPu7OS4plRJTMRFd5kqJKcmbeyEtFtlTorDZdcSuyJw==} + hdb@0.19.12: + resolution: {integrity: sha512-vv+cjmvr6fNH/s0Q2zOZc4sEjMpSC0KuacFn8dp3L38qM3RA2LLeX70wWhZLESpwvwUf1pQkRfUhZeooFSmv3A==} engines: {node: '>= 0.12'} hdb@2.27.1: @@ -8813,21 +8154,17 @@ packages: hnswlib-node@3.0.0: resolution: {integrity: sha512-fypn21qvVORassppC8/qNfZ5KAOspZpm/IbUkAtlqvbtDNnF5VVk5RWF7O5V6qwr7z+T3s1ePej6wQt5wRQ4Cg==} - hono@4.12.8: - resolution: {integrity: sha512-VJCEvtrezO1IAR+kqEYnxUOoStaQPGrCmX3j4wDTNOcD1uRPFpGlwQUIW8niPuvHXaTUxeOUl5MMDGrl+tmO9A==} + hono@4.12.14: + resolution: {integrity: sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==} engines: {node: '>=16.9.0'} - hookable@6.1.0: - resolution: {integrity: sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==} + hookable@6.1.1: + resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} hpagent@1.2.0: resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} engines: {node: '>=14'} - html-encoding-sniffer@6.0.0: - resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} @@ -8889,8 +8226,8 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - ibm-cloud-sdk-core@5.4.10: - resolution: {integrity: sha512-A9CL/XQTNoyS2fkp1uKKcYC03CJwp7hIl4DQeyG9s9QLsuMwffOM2fIkORsYHhn5wmWeFUkjAmt2iTlb7Hv1Iw==} + ibm-cloud-sdk-core@5.4.11: + resolution: {integrity: sha512-UYm6i3OCcQ1sBOVIJh0gcwCNltiGCf7QBCPaDtqCXuHIPbn8m9sKqVBqfrgFuQpenAak/Yv/450Vw+tC59XVIQ==} engines: {node: '>=20'} iceberg-js@0.8.1: @@ -8913,6 +8250,12 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -8929,8 +8272,8 @@ packages: engines: {node: '>=8'} hasBin: true - import-without-cache@0.2.5: - resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} + import-without-cache@0.3.3: + resolution: {integrity: sha512-bDxwDdF04gm550DfZHgffvlX+9kUlcz32UD0AeBTmVPFiWkrexF2XVmiuFFbDhiFuP8fQkrkvI2KdSNPYWAXkQ==} engines: {node: '>=20.19.0'} imurmurhash@0.1.4: @@ -8982,8 +8325,8 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-any-array@2.0.1: - resolution: {integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==} + is-any-array@3.0.0: + resolution: {integrity: sha512-o4h+tylWykC4BD1vaejp6gDxoM13bwW8FGuNs4yIKpj8xbBJcRxJx8vZpq0dCr7ZDEfeKjmsi/euolKhX6f/ww==} is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} @@ -9046,8 +8389,8 @@ packages: is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - is-network-error@1.3.0: - resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + is-network-error@1.3.1: + resolution: {integrity: sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==} engines: {node: '>=16'} is-number@7.0.0: @@ -9062,9 +8405,6 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -9102,6 +8442,10 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -9110,8 +8454,8 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} isarray@1.0.0: @@ -9202,10 +8546,6 @@ packages: ts-node: optional: true - jest-diff@30.2.0: - resolution: {integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-diff@30.3.0: resolution: {integrity: sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -9230,26 +8570,14 @@ packages: resolution: {integrity: sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.2.0: - resolution: {integrity: sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@30.3.0: resolution: {integrity: sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@30.2.0: - resolution: {integrity: sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@30.3.0: resolution: {integrity: sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@30.2.0: - resolution: {integrity: sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-mock@30.3.0: resolution: {integrity: sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -9287,10 +8615,6 @@ packages: resolution: {integrity: sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@30.2.0: - resolution: {integrity: sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@30.3.0: resolution: {integrity: sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -9328,8 +8652,8 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + jose@6.2.2: + resolution: {integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -9355,15 +8679,6 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - jsdom@28.1.0: - resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - canvas: ^3.0.0 - peerDependenciesMeta: - canvas: - optional: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -9405,6 +8720,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-with-bigint@3.5.8: + resolution: {integrity: sha512-eq/4KP6K34kwa7TcFdtvnftvHCD9KvHOGGICWwMFc4dOOKF5t4iYqnfLK8otCRCRv06FXOzGGyqE8h8ElMvvdw==} + json11@2.0.2: resolution: {integrity: sha512-HIrd50UPYmP6sqLuLbFVm75g16o0oZrVfxrsY0EEys22klz8mRoWlX9KAEDOSOR9Q34rcxsyC8oDveGrCz5uLQ==} hasBin: true @@ -9420,8 +8738,8 @@ packages: jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} @@ -9488,8 +8806,8 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} - langsmith@0.5.19: - resolution: {integrity: sha512-5tFoETuFMvGkbPGsINNlIE4Ab86CsPhdPOQZCGwNt/NX0h5NDKQLKOWS/G2XcRUBOQl4mCNbrayUvUTWaIRsCg==} + langsmith@0.5.21: + resolution: {integrity: sha512-l140hzgqo91T/QKDXLEfRnnxahuwVEVohr9zqpy3BaGDeBdrPiJuNJ2TBhPZxNXNCl68IkVcn555FD3jp5peyw==} peerDependencies: '@opentelemetry/api': '*' '@opentelemetry/exporter-trace-otlp-proto': '*' @@ -9523,6 +8841,76 @@ packages: lighthouse-logger@2.0.2: resolution: {integrity: sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + limiter@1.1.5: resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} @@ -9542,6 +8930,10 @@ packages: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} + loader-utils@3.3.1: + resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} + engines: {node: '>= 12.13.0'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -9641,10 +9033,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.5: - resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} - engines: {node: 20 || >=22} - lru-cache@11.3.5: resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} engines: {node: 20 || >=22} @@ -9708,10 +9096,6 @@ packages: make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-fetch-happen@15.0.5: - resolution: {integrity: sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==} - engines: {node: ^20.17.0 || >=22.9.0} - make-fetch-happen@9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} @@ -9730,15 +9114,12 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mdn-data@2.27.1: - resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} - media-typer@1.1.0: resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} engines: {node: '>= 0.8'} - mem0ai@2.4.5: - resolution: {integrity: sha512-0XMRe5/KKZXkSJDb2YDqgWdIfJpL2cn8Lelx9pvDPJOvBfXx8uHjtSc80jyGyb9C/1wW2uPcaE+WS+Rs/2phCg==} + mem0ai@2.4.6: + resolution: {integrity: sha512-8DbLhwD2rd85CNOZgINY3q7q4DqRi/puo1WPszCovX1xSYTO8+Y1ONuSAFA9/Zkfqs0N17obRDaheQSMJlRwhA==} engines: {node: '>=18'} peerDependencies: '@anthropic-ai/sdk': ^0.40.1 @@ -9823,8 +9204,8 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@10.2.4: - resolution: {integrity: sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} engines: {node: 18 || 20 || >=22} minimist@1.2.8: @@ -9834,20 +9215,12 @@ packages: resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} engines: {node: '>= 8'} - minipass-collect@2.0.1: - resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} - engines: {node: '>=16 || 14 >=14.17'} - minipass-fetch@1.4.1: resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} engines: {node: '>=8'} - minipass-fetch@5.0.2: - resolution: {integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + minipass-flush@1.0.7: + resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==} engines: {node: '>= 8'} minipass-pipeline@1.2.4: @@ -9858,18 +9231,10 @@ packages: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} - minipass-sized@2.0.0: - resolution: {integrity: sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==} - engines: {node: '>=8'} - minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} @@ -9898,20 +9263,20 @@ packages: engines: {node: '>=10'} hasBin: true - ml-array-max@1.2.4: - resolution: {integrity: sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==} + ml-array-max@2.0.0: + resolution: {integrity: sha512-QQZ4kENwpWmyNb98UXRDFXrmtIXuXtt1+bSbda/2KA85+F+rrJP8hZk6QOkCQXM2Th9mUDYdq/PNByPdT9ID4A==} - ml-array-min@1.2.3: - resolution: {integrity: sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==} + ml-array-min@2.0.0: + resolution: {integrity: sha512-GRj6Ky6sW9vGL6yIjgsHmXZ9YgrdmcQ8nCxPqEGeKc6dkfYg1XDYxGFxADUjNuZyoCd5PUscWAS4N+cFaX6hFg==} - ml-array-rescale@1.3.7: - resolution: {integrity: sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==} + ml-array-rescale@2.0.0: + resolution: {integrity: sha512-2GGtKfSno94/kIloWGvpp/U5Q5vLvLrza+SAaGsLeo6Xj4mEbA6Gqx+oTfZFkxnd1grT2X007HfJNs3T5BsiVg==} - ml-matrix@6.12.1: - resolution: {integrity: sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==} + ml-matrix@6.12.2: + resolution: {integrity: sha512-GC+BnW+pBh8Auap8goAxY0senAmF0IEoc3HNVSfnfbvGw0buuDIYb9kAKMS1l+GiwJ1rfK2bzJ8IHhwjzATSFA==} - mlly@1.8.0: - resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} mongodb-connection-string-url@3.0.2: resolution: {integrity: sha512-rMO7CGo/9BFwyZABcKAWL8UJwH/Kc2x0g72uhDWzG48URRax5TCIcJ7Rc3RZqffZzO/Gwff/jyKwCU9TN8gehA==} @@ -9947,8 +9312,8 @@ packages: socks: optional: true - mongodb@7.1.1: - resolution: {integrity: sha512-067DXiMjcpYQl6bGjWQoTUEE9UoRViTtKFcoqX7z08I+iDZv/emH1g8XEFiO3qiDfXAheT5ozl1VffDTKhIW/w==} + mongodb@7.2.0: + resolution: {integrity: sha512-F/2+BMZtLVhY30ioZp0dAmZ+IRZMBqI+nrv6t5+9/1AIwCa8sMRC3jBf81lpxMhnZgqq8CoUD503Z1oZWq1/sw==} engines: {node: '>=20.19.0'} peerDependencies: '@aws-sdk/credential-providers': ^3.806.0 @@ -9996,18 +9361,12 @@ packages: resolution: {integrity: sha512-FBrGau0IXmuqg4haEZRBfHNWB5mUARw6hNwPDXXGg0XzVJ50mr/9hb267lvpVMnhZ1FON3qNd4Xfcez1rbFwSg==} engines: {node: '>= 8.0'} - mysql2@3.19.1: - resolution: {integrity: sha512-yn4zh+Uxu5J3Zvi6Ao96lJ7BSBRkspHflWQAmOPND+htbpIKDQw99TTvPzgihKO/QyMickZopO4OsnixnpcUwA==} - engines: {node: '>= 8.0'} - peerDependencies: - '@types/node': '>= 8' - named-placeholders@1.1.6: resolution: {integrity: sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==} engines: {node: '>=8.0.0'} - nan@2.25.0: - resolution: {integrity: sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==} + nan@2.26.2: + resolution: {integrity: sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} @@ -10025,8 +9384,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + needle@3.5.0: + resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} engines: {node: '>= 4.4.x'} hasBin: true @@ -10051,32 +9410,32 @@ packages: resolution: {integrity: sha512-8DDF2MwEJNz7y7cp97x4u8fmVIP4CWS8qNBxdwxTG0fWtsS+2NdeC+7uXwmmuFOpHvkfXqv63uWY73bfDtOH8Q==} engines: {node: '>=18.0.0'} - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + netmask@2.1.1: + resolution: {integrity: sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==} engines: {node: '>= 0.4.0'} new-github-release-url@2.0.0: resolution: {integrity: sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - nice-grpc-client-middleware-retry@3.1.13: - resolution: {integrity: sha512-Q9I/wm5lYkDTveKFirrTHBkBY137yavXZ4xQDXTPIycUp7aLXD8xPTHFhqtAFWUw05aS91uffZZRgdv3HS0y/g==} + nice-grpc-client-middleware-retry@3.1.14: + resolution: {integrity: sha512-n/E3n73R6N59Ef7YJ34NvCOQs45ZK4JhlKQn1uV5HuM2PktUoG2KKhoAaxn+7zdtV9dwstPLSv5IT/XxMle0og==} - nice-grpc-common@2.0.2: - resolution: {integrity: sha512-7RNWbls5kAL1QVUOXvBsv1uO0wPQK3lHv+cY1gwkTzirnG1Nop4cBJZubpgziNbaVc/bl9QJcyvsf/NQxa3rjQ==} + nice-grpc-common@2.0.3: + resolution: {integrity: sha512-MEhnD3JMah0mgyivpb9hpRDbOBuXBxI/TVO+OK1h6rC97WM42HsPMR+zzRNQ0C5BqYJTw1nyWiQRD0DucO+pjQ==} - nice-grpc@2.1.14: - resolution: {integrity: sha512-GK9pKNxlvnU5FAdaw7i2FFuR9CqBspcE+if2tqnKXBcE0R8525wj4BZvfcwj7FjvqbssqKxRHt2nwedalbJlww==} + nice-grpc@2.1.15: + resolution: {integrity: sha512-agPIt7dtQASnN5p1X3c2S5amDhWRWRT0Jp62trmpMBKSbkm87l8bG2slqxSthlrGa4AnRPG8+lFf4y8nn+Pogw==} - node-abi@3.87.0: - resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} + node-abi@3.89.0: + resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} engines: {node: '>=10'} node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-addon-api@8.5.0: - resolution: {integrity: sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==} + node-addon-api@8.7.0: + resolution: {integrity: sha512-9MdFxmkKaOYVTV+XVRG8ArDwwQ77XIgIPyKASB1k3JPq3M8fGQQQE3YpMOrKm6g//Ktx8ivZr8xo1Qmtqub+GA==} engines: {node: ^18 || ^20 || >= 21} node-domexception@1.0.0: @@ -10117,8 +9476,8 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - node-gyp@12.2.0: - resolution: {integrity: sha512-q23WdzrQv48KozXlr0U1v9dwO/k59NHeSzn6loGcasyf0UnSrtzs8kRxM+mfwJSf0DkX0s43hcqgnSO4/VNthQ==} + node-gyp@12.3.0: + resolution: {integrity: sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==} engines: {node: ^20.17.0 || >=22.9.0} hasBin: true @@ -10130,8 +9489,8 @@ packages: node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.36: - resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} + node-releases@2.0.38: + resolution: {integrity: sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==} nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} @@ -10273,30 +9632,6 @@ packages: zod: optional: true - openai@6.22.0: - resolution: {integrity: sha512-7Yvy17F33Bi9RutWbsaYt5hJEEJ/krRPOrwan+f9aCPuMat1WVsb2VNSII5W1EksKT6fF69TG/xj4XzodK3JZw==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - - openai@6.33.0: - resolution: {integrity: sha512-xAYN1W3YsDXJWA5F277135YfkEk6H7D3D6vWwRhJ3OEkzRgcyK8z/P5P9Gyi/wB4N8kK9kM5ZjprfvyHagKmpw==} - hasBin: true - peerDependencies: - ws: ^8.18.0 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - ws: - optional: true - zod: - optional: true - openai@6.34.0: resolution: {integrity: sha512-yEr2jdGf4tVFYG6ohmr3pF6VJuveP0EA/sS8TBx+4Eq5NT10alu5zg2dmxMXMgqpihRDQlFGpRt2XwsGj+Fyxw==} hasBin: true @@ -10340,8 +9675,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - oxlint@1.58.0: - resolution: {integrity: sha512-t4s9leczDMqlvOSjnbCQe7gtoLkWgBGZ7sBdCJ9EOj5IXFSG/X7OAzK4yuH4iW+4cAYe8kLFbC8tuYMwWZm+Cg==} + oxlint@1.61.0: + resolution: {integrity: sha512-ZC0ALuhDZ6ivOFG+sy0D0pEDN49EvsId98zVlmYdkcXHsEM14m/qTNUEsUpiFiCVbpIxYtVBmmLE87nsbUHohQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -10382,10 +9717,6 @@ packages: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} - engines: {node: '>=18'} - p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} @@ -10466,15 +9797,12 @@ packages: parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} - parse5@8.0.1: - resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - patchright-core@1.59.1: - resolution: {integrity: sha512-VthHtavFwFgs5VRalZtbacmjw8E7SPXPhGjfOakvjPsrJcIHl/i7K9lgKYpevy4F90+/GQSJiO0Mt58JB4+9HQ==} + patchright-core@1.59.4: + resolution: {integrity: sha512-7/vyX0XK0cpGKlcnUD+Rhjv5o9rrmZQl4v/NI+EUBed+VaU5EORpkOF0Gdi+fP698fLhY0tXwacKBUqKE38jQA==} engines: {node: '>=18'} hasBin: true @@ -10482,8 +9810,8 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-expression-matcher@1.2.0: - resolution: {integrity: sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==} + path-expression-matcher@1.5.0: + resolution: {integrity: sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==} engines: {node: '>=14.0.0'} path-is-absolute@1.0.1: @@ -10543,9 +9871,6 @@ packages: pg-cloudflare@1.3.0: resolution: {integrity: sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ==} - pg-connection-string@2.11.0: - resolution: {integrity: sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ==} - pg-connection-string@2.12.0: resolution: {integrity: sha512-U7qg+bpswf3Cs5xLzRqbXbQl85ng0mfSV/J0nnA31MCLgvEaAo7CIhmeyrmJpOr7o+zm0rXK+hNnT5l9RHkCkQ==} @@ -10556,19 +9881,11 @@ packages: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-pool@3.11.0: - resolution: {integrity: sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==} - peerDependencies: - pg: '>=8.0' - pg-pool@3.13.0: resolution: {integrity: sha512-gB+R+Xud1gLFuRD/QgOIgGOBE2KCQPaPwkzBBGC9oG69pHTkhQeIuejVIk3/cnDyX39av2AxomQiyPT13WKHQA==} peerDependencies: pg: '>=8.0' - pg-protocol@1.11.0: - resolution: {integrity: sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==} - pg-protocol@1.13.0: resolution: {integrity: sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==} @@ -10576,15 +9893,6 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg@8.18.0: - resolution: {integrity: sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==} - engines: {node: '>= 16.0.0'} - peerDependencies: - pg-native: '>=3.0.1' - peerDependenciesMeta: - pg-native: - optional: true - pg@8.20.0: resolution: {integrity: sha512-ldhMxz2r8fl/6QkXnBD3CR9/xg694oT6DZQ2s6c/RI28OjtSOpxnPrUCGOBJ46RCUxcWdx3p6kw/xnDHjKvaRA==} engines: {node: '>= 16.0.0'} @@ -10656,13 +9964,13 @@ packages: pkg-types@2.3.0: resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} - playwright-core@1.58.2: - resolution: {integrity: sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==} + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} engines: {node: '>=18'} hasBin: true - playwright@1.58.2: - resolution: {integrity: sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==} + playwright@1.59.1: + resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} engines: {node: '>=18'} hasBin: true @@ -10670,8 +9978,44 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.1: + resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@6.0.1: + resolution: {integrity: sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ==} + peerDependencies: + postcss: ^8.0.0 + + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.10: + resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} postgres-array@2.0.0: @@ -10709,15 +10053,11 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} engines: {node: '>=14'} hasBin: true - pretty-format@30.2.0: - resolution: {integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==} - engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - pretty-format@30.3.0: resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -10731,8 +10071,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - prisma@7.6.0: - resolution: {integrity: sha512-OKJIPT81K3+F+AayIkY/Y3mkF2NWoFh7lZApaaqPYy7EHILKdO0VsmGkP+hDKYTySHsFSyLWXm/JgcR1B8fY1Q==} + prisma@7.7.0: + resolution: {integrity: sha512-HlgwRBt1uEFB9LStHL4HLYDvoi4BNu1rYA0hPG0zCAEyK9SaZBqp7E5Rjpc3Qh8Lex/ye/svoHZ0OWoFNhWxuQ==} engines: {node: ^20.19 || ^22.12 || >=24.0} hasBin: true peerDependencies: @@ -10814,13 +10154,13 @@ packages: psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} - publint@0.3.17: - resolution: {integrity: sha512-Q3NLegA9XM6usW+dYQRG1g9uEHiYUzcCVBJDJ7yMcWRqVU9LYZUWdqbwMZfmTCFC5PZLQpLAmhvRcQRl3exqkw==} + publint@0.3.18: + resolution: {integrity: sha512-JRJFeBTrfx4qLwEuGFPk+haJOJN97KnPuK01yj+4k/Wj5BgoOK5uNsivporiqBjk2JDaslg7qJOhGRnpltGeog==} engines: {node: '>=18'} hasBin: true - pump@3.0.3: - resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -10847,8 +10187,8 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qs@6.15.0: - resolution: {integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==} + qs@6.15.1: + resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} quansync@0.2.11: @@ -10877,20 +10217,23 @@ packages: rc9@2.1.2: resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + rc9@3.0.1: + resolution: {integrity: sha512-gMDyleLWVE+i6Sgtc0QbbY6pEKqYs97NGi6isHQPqYlLemPoO8dxQ3uGi0f4NiP98c+jMW6cG1Kx9dDwfvqARQ==} + rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true - react-dom@19.2.4: - resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} + react-dom@19.2.5: + resolution: {integrity: sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==} peerDependencies: - react: ^19.2.4 + react: ^19.2.5 react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} + react@19.2.5: + resolution: {integrity: sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==} engines: {node: '>=0.10.0'} read-package-json-fast@4.0.0: @@ -10949,9 +10292,9 @@ packages: redis@4.7.1: resolution: {integrity: sha512-S1bJDnqLftzHXHP8JsT5II/CtHWQrASX5K96REjWjlmWKrviSOLWmM7QnRLstAWsu1VBBV1ffV6DzCvxNP0UJQ==} - redis@5.11.0: - resolution: {integrity: sha512-YwXjATVDT+AuxcyfOwZn046aml9jMlQPvU1VXIlLDVAExe0u93aTfPYSeRgG4p9Q/Jlkj+LXJ1XEoFV+j2JKcQ==} - engines: {node: '>= 18'} + redis@5.12.1: + resolution: {integrity: sha512-LDsoVvb/CpoV9EN3FXvgvSHNJWuCIzl9MiO3ppOevuGLpSGJhwfQjpEwfFJcQvNSddHADDdZaWx0HnmMxRXG7g==} + engines: {node: '>= 18.19.0'} reflect-metadata@0.2.2: resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} @@ -11002,8 +10345,8 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} engines: {node: '>= 0.4'} hasBin: true @@ -11048,10 +10391,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - rimraf@6.1.3: resolution: {integrity: sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==} engines: {node: 20 || >=22} @@ -11076,18 +10415,13 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-rc.12: - resolution: {integrity: sha512-yP4USLIMYrwpPHEFB5JGH1uxhcslv6/hL0OyvTuY+3qlOSJvZ7ntYnoWpehBxufkgN0cvXxppuTu5hHa/zPh+A==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - - rolldown@1.0.0-rc.4: - resolution: {integrity: sha512-V2tPDUrY3WSevrvU2E41ijZlpF+5PbZu4giH+VpNraaadsJGHa4fR6IFwsocVwEXDoAdIv5qgPPxgrvKAOIPtA==} + rolldown@1.0.0-rc.16: + resolution: {integrity: sha512-rzi5WqKzEZw3SooTt7cgm4eqIoujPIyGcJNGFL7iPEuajQw7vxMHUkXylu4/vhCkJGXsgRmxqMKXUpT6FEgl0g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rollup@4.59.0: - resolution: {integrity: sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==} + rollup@4.60.2: + resolution: {integrity: sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -11126,14 +10460,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sax@1.4.4: - resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} engines: {node: '>=11.0.0'} - saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - scheduler@0.27.0: resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} @@ -11207,8 +10537,8 @@ packages: resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} side-channel-map@1.0.1: @@ -11250,6 +10580,10 @@ packages: resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} engines: {node: '>=18'} + slice-ansi@8.0.0: + resolution: {integrity: sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==} + engines: {node: '>=20'} + smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -11283,9 +10617,6 @@ packages: source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -11311,10 +10642,6 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sql-escaper@1.3.3: - resolution: {integrity: sha512-BsTCV265VpTp8tm1wyIm1xqQCS+Q9NHx2Sr+WcnUrgLrQ6yiDIvHYJV5gHxsj1lMBy2zm5twLaZao8Jd+S8JJw==} - engines: {bun: '>=1.0.0', deno: '>=2.0.0', node: '>=12.0.0'} - sql-highlight@6.1.0: resolution: {integrity: sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==} engines: {node: '>=14'} @@ -11337,10 +10664,6 @@ packages: resolution: {integrity: sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==} engines: {node: '>=10.16.0'} - ssri@13.0.1: - resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} - engines: {node: ^20.17.0 || >=22.9.0} - ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} @@ -11355,6 +10678,10 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + stacktrace-parser@0.1.11: + resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} + engines: {node: '>=6'} + standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} @@ -11365,15 +10692,15 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} - std-env@4.0.0: - resolution: {integrity: sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} stdin-discarder@0.2.2: resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} engines: {node: '>=18'} - stdin-discarder@0.3.1: - resolution: {integrity: sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA==} + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} engines: {node: '>=18'} stream-events@1.0.5: @@ -11382,13 +10709,16 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamx@2.23.0: - resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + streamx@2.25.0: + resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -11458,8 +10788,8 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strnum@2.2.1: - resolution: {integrity: sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==} + strnum@2.2.3: + resolution: {integrity: sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==} strtok3@10.3.5: resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} @@ -11474,6 +10804,10 @@ packages: stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -11486,9 +10820,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - synckit@0.11.12: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} @@ -11501,12 +10832,16 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} + tailwindcss@4.2.4: + resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} + + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + tar-fs@2.1.4: resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} - tar-fs@3.1.1: - resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} - tar-fs@3.1.2: resolution: {integrity: sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==} @@ -11514,11 +10849,11 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} - tar-stream@3.1.7: - resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + tar-stream@3.1.8: + resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} - tar@7.5.11: - resolution: {integrity: sha512-ChjMH33/KetonMTAtpYdgUFr0tbz69Fp2v7zWxQfYZX4g5ZN2nOBXm1R2xyA+lMIKrLKIoKAwFj93jE/avX9cQ==} + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} tarn@3.0.2: @@ -11536,24 +10871,19 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser@5.46.1: - resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} - engines: {node: '>=10'} - hasBin: true - test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + test-exclude@7.0.2: + resolution: {integrity: sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==} engines: {node: '>=18'} - testcontainers@11.13.0: - resolution: {integrity: sha512-fzTvgOtd6U/esOzgmDatJh79OSK0tU6vjDOJ3B6ICrrJf0dqCWtFdpOr6f/g/KixMxKDTDbszmZYjSORJXsVCQ==} + testcontainers@11.14.0: + resolution: {integrity: sha512-r9pniwv/iwzyHaI7gwAvAm4Y+IvjJg3vBWdjrUCaDMc2AXIr4jKbq7jJO18Mw2ybs73pZy1Aj7p/4RVBGMRWjg==} - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-decoder@1.2.7: + resolution: {integrity: sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==} text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -11582,18 +10912,18 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyexec@1.0.2: - resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} - engines: {node: '>=18'} - - tinyexec@1.0.4: - resolution: {integrity: sha512-u9r3uZC0bdpGOXtlxUIdwf9pkmvhqJdrVCH9fapQtgy/OeTTMZ1nqH7agtvEfmGui6e1XxjcdrlxvxJvc3sMqw==} + tinyexec@1.1.1: + resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tinypool@1.1.1: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -11614,18 +10944,11 @@ packages: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} - tldts-core@7.0.23: - resolution: {integrity: sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==} - - tldts-core@7.0.29: - resolution: {integrity: sha512-W99NuU7b1DcG3uJ3v9k9VztCH3WialNbBkBft5wCs8V8mexu0XQqaZEYb9l9RNNzK8+3EJ9PKWB0/RUtTQ/o+Q==} - - tldts@7.0.23: - resolution: {integrity: sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==} - hasBin: true + tldts-core@7.0.28: + resolution: {integrity: sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==} - tldts@7.0.29: - resolution: {integrity: sha512-JIXCerhudr/N6OWLwLF1HVsTTUo7ry6qHa5eWZEkiMuxsIiAACL55tGLfqfHfoH7QaMQUW8fngD7u7TxWexYQg==} + tldts@7.0.28: + resolution: {integrity: sha512-+Zg3vWhRUv8B1maGSTFdev9mjoo8Etn2Ayfs4cnjlD3CsGkxXX4QyW3j2WJ0wdjYcYmy7Lx2RDsZMhgCWafKIw==} hasBin: true tmp@0.2.5: @@ -11655,10 +10978,6 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} - tough-cookie@6.0.0: - resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} - engines: {node: '>=16'} - tough-cookie@6.0.1: resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==} engines: {node: '>=16'} @@ -11670,10 +10989,6 @@ packages: resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} engines: {node: '>=18'} - tr46@6.0.0: - resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} - engines: {node: '>=20'} - tree-kill@1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} hasBin: true @@ -11729,14 +11044,14 @@ packages: '@swc/wasm': optional: true - tsdown@0.21.7: - resolution: {integrity: sha512-ukKIxKQzngkWvOYJAyptudclkm4VQqbjq+9HF5K5qDO8GJsYtMh8gIRwicbnZEnvFPr6mquFwYAVZ8JKt3rY2g==} + tsdown@0.21.9: + resolution: {integrity: sha512-tZPv2zMaMnjj9H9h0SDqpSXa9YWVZWHlG46DnSgNTFX6aq001MSI8kuBzJumr/u099nWj+1v5S7rhbnHk5jCHA==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: '@arethetypeswrong/core': ^0.18.1 - '@tsdown/css': 0.21.7 - '@tsdown/exe': 0.21.7 + '@tsdown/css': 0.21.9 + '@tsdown/exe': 0.21.9 '@vitejs/devtools': '*' publint: ^0.3.0 typescript: ^5.0.0 || ^6.0.0 @@ -11768,8 +11083,8 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo@2.9.4: - resolution: {integrity: sha512-wZ/kMcZCuK5oEp7sXSSo/5fzKjP9I2EhoiarZjyCm2Ixk0WxFrC/h0gF3686eHHINoFQOOSWgB/pGfvkR8rkgQ==} + turbo@2.9.6: + resolution: {integrity: sha512-+v2QJey7ZUeUiuigkU+uFfklvNUyPI2VO2vBpMYJA+a1hKFLFiKtUYlRHdb3P9CrAvMzi0upbjI4WT+zKtqkBg==} hasBin: true tweetnacl@0.14.5: @@ -11787,6 +11102,10 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -11795,8 +11114,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - type-fest@5.4.4: - resolution: {integrity: sha512-JnTrzGu+zPV3aXIUhnyWJj4z/wigMsdYajGLIYakqyOW1nPllzXEJee0QQbHj+CTIQtXGlAjuK0UY+2xTyjVAw==} + type-fest@5.6.0: + resolution: {integrity: sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==} engines: {node: '>=20'} type-is@2.0.1: @@ -11877,18 +11196,13 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - typesense@3.0.5: - resolution: {integrity: sha512-Pw/yWosbqEOFMM/wQDsnS8FA6r3Qp5ilxuqZTMBoUc95SGCEBflMd39kvDEZZFoTORzNDxCLiiQ+LfYJTl1ulQ==} + typesense@3.0.6: + resolution: {integrity: sha512-d3LL1qOLS8FCRxgAOqH+uDuK+VVA+/HYI1frU9fjYVwOg68mg/dX6XTtZ4yKKAkDCasB/se5uh/ZpMdOz/uJNg==} engines: {node: '>=18'} peerDependencies: '@babel/runtime': ^7.23.2 @@ -11930,15 +11244,11 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} - - undici-types@7.24.7: - resolution: {integrity: sha512-XA+gOBkzYD3C74sZowtCLTpgtaCdqZhqCvR6y9LXvrKTt/IVU6bz49T4D+BPi475scshCCkb0IklJRw6T1ZlgQ==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} - undici@7.24.5: - resolution: {integrity: sha512-3IWdCpjgxp15CbJnsi/Y9TCDE7HWVN19j1hmzVhoAkY/+CJx449tVxT5wZc1Gwg8J+P0LWvzlBzxYRnHJ+1i7Q==} - engines: {node: '>=20.18.1'} + undici-types@7.25.0: + resolution: {integrity: sha512-AXNgS1Byr27fTI+2bsPEkV9CxkT8H6xNyRI68b3TatlZo3RkzlqQBLL+w7SmGPVpokjHbcuNVQUWE7FRTg+LRA==} undici@8.1.0: resolution: {integrity: sha512-E9MkTS4xXLnRPYqxH2e6Hr2/49e7WFDKczKcCaFH4VaZs2iNvHMqeIkyUAD9vM8kujy9TjVrRlQ5KkdEJxB2pw==} @@ -11988,8 +11298,8 @@ packages: unrs-resolver@1.11.1: resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} - unrun@0.2.34: - resolution: {integrity: sha512-LyaghRBR++r7svhDK6tnDz2XaYHWdneBOA0jbS8wnRsHerI9MFljX4fIiTgbbNbEVzZ0C9P1OjWLLe1OqoaaEw==} + unrun@0.2.36: + resolution: {integrity: sha512-ICAGv44LHSKjCdI4B4rk99lJLHXBweutO4MUwu3cavMlYtXID0Tn5e1Kwe/Uj6BSAuHHXfi1JheFVCYhcXHfAg==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -12166,41 +11476,6 @@ packages: jsdom: optional: true - vitest@4.1.2: - resolution: {integrity: sha512-xjR1dMTVHlFLh98JE3i/f/WePqJsah4A0FK9cc8Ehp9Udk0AZk6ccpIZhh1qJ/yxVWRZ+Q54ocnD8TXmkhspGg==} - engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} - hasBin: true - peerDependencies: - '@edge-runtime/vm': '*' - '@opentelemetry/api': ^1.9.0 - '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 - '@vitest/browser-playwright': 4.1.2 - '@vitest/browser-preview': 4.1.2 - '@vitest/browser-webdriverio': 4.1.2 - '@vitest/ui': 4.1.2 - happy-dom: '*' - jsdom: '*' - vite: ^7.3.2 - peerDependenciesMeta: - '@edge-runtime/vm': - optional: true - '@opentelemetry/api': - optional: true - '@types/node': - optional: true - '@vitest/browser-playwright': - optional: true - '@vitest/browser-preview': - optional: true - '@vitest/browser-webdriverio': - optional: true - '@vitest/ui': - optional: true - happy-dom: - optional: true - jsdom: - optional: true - vitest@4.1.5: resolution: {integrity: sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==} engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -12245,20 +11520,12 @@ packages: voy-search@0.6.3: resolution: {integrity: sha512-GRwrXcT3Qmzr/CuwpwX55XWpgqM2hUqLipSwI8bGcfsDTJGa+mFxsOXzWHNMRpcYd+U2RP73f2USLDWQu5yFdQ==} - w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} - walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - weaviate-client@3.11.0: - resolution: {integrity: sha512-pEO+V8OZ84KUKz9ftQnSuooCT4Fdh3SjkDj6FPfxI3Iy6qc+PTTAMFFO0wL2prnf71DIs0tdNw/1RFX4kJkE/w==} - engines: {node: '>=20.0.0'} - weaviate-client@3.12.1: resolution: {integrity: sha512-rpkWkJlrhmMqJrfva7uKmGgr3oIbw717yQ440Sxo/5CXdSDMFFJ5KAo02ij1a1RgtqrT9D4sbGK966yxhro96g==} engines: {node: '>=20.0.0'} @@ -12285,10 +11552,6 @@ packages: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} - webidl-conversions@8.0.1: - resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} - engines: {node: '>=20'} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -12312,18 +11575,10 @@ packages: resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} engines: {node: '>=18'} - whatwg-mimetype@5.0.0: - resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} - engines: {node: '>=20'} - whatwg-url@14.2.0: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} - whatwg-url@16.0.1: - resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -12364,6 +11619,9 @@ packages: resolution: {integrity: sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==} engines: {node: '>=18'} + winston-console-format@1.0.8: + resolution: {integrity: sha512-dq7t/E0D0QRi4XIOwu6HM1+5e//WPqylH88GVjKEhQVrzGFg34MCz+G7pMJcXFBen9C0kBsu5GYgbYsE2LDwKw==} + winston-transport@4.9.0: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} @@ -12429,18 +11687,6 @@ packages: utf-8-validate: optional: true - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.20.0: resolution: {integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==} engines: {node: '>=10.0.0'} @@ -12457,13 +11703,6 @@ packages: resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} engines: {node: '>=18'} - xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} - - xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -12553,62 +11792,59 @@ packages: snapshots: - '@acemir/cssom@0.9.31': - optional: true - - '@ai-sdk/amazon-bedrock@3.0.93(zod@4.3.6)': + '@ai-sdk/amazon-bedrock@3.0.97(zod@4.3.6)': dependencies: - '@ai-sdk/anthropic': 2.0.74(zod@4.3.6) + '@ai-sdk/anthropic': 2.0.77(zod@4.3.6) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) - '@smithy/eventstream-codec': 4.2.11 + '@smithy/eventstream-codec': 4.2.14 '@smithy/util-utf8': 4.2.2 aws4fetch: 1.0.20 zod: 4.3.6 optional: true - '@ai-sdk/anthropic@2.0.74(zod@4.3.6)': + '@ai-sdk/anthropic@2.0.77(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/azure@2.0.104(zod@4.3.6)': + '@ai-sdk/azure@2.0.105(zod@4.3.6)': dependencies: - '@ai-sdk/openai': 2.0.102(zod@4.3.6) + '@ai-sdk/openai': 2.0.103(zod@4.3.6) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/cerebras@1.0.40(zod@4.3.6)': + '@ai-sdk/cerebras@1.0.41(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 1.0.35(zod@4.3.6) + '@ai-sdk/openai-compatible': 1.0.36(zod@4.3.6) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/deepseek@1.0.36(zod@4.3.6)': + '@ai-sdk/deepseek@1.0.37(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/gateway@2.0.71(zod@4.3.6)': + '@ai-sdk/gateway@2.0.82(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) '@vercel/oidc': 3.1.0 zod: 4.3.6 - '@ai-sdk/google-vertex@3.0.127(zod@4.3.6)': + '@ai-sdk/google-vertex@3.0.132(zod@4.3.6)': dependencies: - '@ai-sdk/anthropic': 2.0.74(zod@4.3.6) - '@ai-sdk/google': 2.0.67(zod@4.3.6) - '@ai-sdk/openai-compatible': 1.0.35(zod@4.3.6) + '@ai-sdk/anthropic': 2.0.77(zod@4.3.6) + '@ai-sdk/google': 2.0.70(zod@4.3.6) + '@ai-sdk/openai-compatible': 1.0.36(zod@4.3.6) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) google-auth-library: 10.6.2 @@ -12617,42 +11853,42 @@ snapshots: - supports-color optional: true - '@ai-sdk/google@2.0.67(zod@4.3.6)': + '@ai-sdk/google@2.0.70(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/groq@2.0.37(zod@4.3.6)': + '@ai-sdk/groq@2.0.38(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/mistral@2.0.30(zod@4.3.6)': + '@ai-sdk/mistral@2.0.31(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/openai-compatible@1.0.35(zod@4.3.6)': + '@ai-sdk/openai-compatible@1.0.36(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/openai@2.0.102(zod@4.3.6)': + '@ai-sdk/openai@2.0.103(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/perplexity@2.0.27(zod@4.3.6)': + '@ai-sdk/perplexity@2.0.28(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) @@ -12663,29 +11899,31 @@ snapshots: dependencies: '@ai-sdk/provider': 2.0.1 '@standard-schema/spec': 1.1.0 - eventsource-parser: 3.0.6 + eventsource-parser: 3.0.8 zod: 4.3.6 '@ai-sdk/provider@2.0.1': dependencies: json-schema: 0.4.0 - '@ai-sdk/togetherai@1.0.38(zod@4.3.6)': + '@ai-sdk/togetherai@1.0.39(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 1.0.35(zod@4.3.6) + '@ai-sdk/openai-compatible': 1.0.36(zod@4.3.6) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true - '@ai-sdk/xai@2.0.65(zod@4.3.6)': + '@ai-sdk/xai@2.0.68(zod@4.3.6)': dependencies: - '@ai-sdk/openai-compatible': 1.0.35(zod@4.3.6) + '@ai-sdk/openai-compatible': 1.0.36(zod@4.3.6) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) zod: 4.3.6 optional: true + '@alloc/quick-lru@5.2.0': {} + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -12738,53 +11976,29 @@ snapshots: '@loaderkit/resolve': 1.0.4 cjs-module-lexer: 1.4.3 fflate: 0.8.2 - lru-cache: 11.2.5 + lru-cache: 11.3.5 semver: 7.7.4 typescript: 5.6.1-rc validate-npm-package-name: 5.0.1 - '@asamuzakjp/css-color@5.1.11': - dependencies: - '@asamuzakjp/generational-cache': 1.0.1 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-color-parser': 4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - optional: true - - '@asamuzakjp/dom-selector@6.8.1': - dependencies: - '@asamuzakjp/nwsapi': 2.3.9 - bidi-js: 1.0.3 - css-tree: 3.2.1 - is-potential-custom-element-name: 1.0.1 - lru-cache: 11.3.5 - optional: true - - '@asamuzakjp/generational-cache@1.0.1': - optional: true - - '@asamuzakjp/nwsapi@2.3.9': - optional: true - '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.6 + '@aws-sdk/types': 3.973.8 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.6 + '@aws-sdk/types': 3.973.8 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-locate-window': 3.965.4 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-locate-window': 3.965.5 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -12793,15 +12007,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-locate-window': 3.965.4 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-locate-window': 3.965.5 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.6 + '@aws-sdk/types': 3.973.8 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -12810,1231 +12024,728 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.6 + '@aws-sdk/types': 3.973.8 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-bedrock-agent-runtime@3.1024.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.26 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/middleware-host-header': 3.972.8 - '@aws-sdk/middleware-logger': 3.972.8 - '@aws-sdk/middleware-recursion-detection': 3.972.9 - '@aws-sdk/middleware-user-agent': 3.972.28 - '@aws-sdk/region-config-resolver': 3.972.10 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.5 - '@aws-sdk/util-user-agent-browser': 3.972.8 - '@aws-sdk/util-user-agent-node': 3.973.14 - '@smithy/config-resolver': 4.4.13 - '@smithy/core': 3.23.13 - '@smithy/eventstream-serde-browser': 4.2.12 - '@smithy/eventstream-serde-config-resolver': 4.3.12 - '@smithy/eventstream-serde-node': 4.2.12 - '@smithy/fetch-http-handler': 5.3.15 - '@smithy/hash-node': 4.2.12 - '@smithy/invalid-dependency': 4.2.12 - '@smithy/middleware-content-length': 4.2.12 - '@smithy/middleware-endpoint': 4.4.28 - '@smithy/middleware-retry': 4.4.46 - '@smithy/middleware-serde': 4.2.16 - '@smithy/middleware-stack': 4.2.12 - '@smithy/node-config-provider': 4.3.12 - '@smithy/node-http-handler': 4.5.1 - '@smithy/protocol-http': 5.3.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.12 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.44 - '@smithy/util-defaults-mode-node': 4.2.48 - '@smithy/util-endpoints': 3.3.3 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.13 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-bedrock-runtime@3.1006.0': + '@aws-sdk/client-bedrock-agent-runtime@3.1034.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/eventstream-handler-node': 3.972.10 - '@aws-sdk/middleware-eventstream': 3.972.7 - '@aws-sdk/middleware-host-header': 3.972.7 - '@aws-sdk/middleware-logger': 3.972.7 - '@aws-sdk/middleware-recursion-detection': 3.972.7 - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/middleware-websocket': 3.972.12 - '@aws-sdk/region-config-resolver': 3.972.7 - '@aws-sdk/token-providers': 3.1006.0 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.4 - '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 - '@smithy/config-resolver': 4.4.10 - '@smithy/core': 3.23.9 - '@smithy/eventstream-serde-browser': 4.2.11 - '@smithy/eventstream-serde-config-resolver': 4.3.11 - '@smithy/eventstream-serde-node': 4.2.11 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/hash-node': 4.2.11 - '@smithy/invalid-dependency': 4.2.11 - '@smithy/middleware-content-length': 4.2.11 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-retry': 4.4.40 - '@smithy/middleware-serde': 4.2.12 - '@smithy/middleware-stack': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/node-http-handler': 4.4.14 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/eventstream-serde-browser': 4.2.14 + '@smithy/eventstream-serde-config-resolver': 4.3.14 + '@smithy/eventstream-serde-node': 4.2.14 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.39 - '@smithy/util-defaults-mode-node': 4.2.42 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 - '@smithy/util-stream': 4.5.17 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-cognito-identity@3.980.0': + '@aws-sdk/client-bedrock-runtime@3.1034.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/middleware-host-header': 3.972.7 - '@aws-sdk/middleware-logger': 3.972.7 - '@aws-sdk/middleware-recursion-detection': 3.972.7 - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/region-config-resolver': 3.972.7 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.980.0 - '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 - '@smithy/config-resolver': 4.4.10 - '@smithy/core': 3.23.9 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/hash-node': 4.2.11 - '@smithy/invalid-dependency': 4.2.11 - '@smithy/middleware-content-length': 4.2.11 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-retry': 4.4.40 - '@smithy/middleware-serde': 4.2.12 - '@smithy/middleware-stack': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/node-http-handler': 4.4.14 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/eventstream-handler-node': 3.972.14 + '@aws-sdk/middleware-eventstream': 3.972.10 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/middleware-websocket': 3.972.16 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/token-providers': 3.1034.0 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/eventstream-serde-browser': 4.2.14 + '@smithy/eventstream-serde-config-resolver': 4.3.14 + '@smithy/eventstream-serde-node': 4.2.14 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.39 - '@smithy/util-defaults-mode-node': 4.2.42 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 + '@smithy/util-stream': 4.5.24 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-cognito-identity@3.985.0': + '@aws-sdk/client-cognito-identity@3.1034.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/middleware-host-header': 3.972.7 - '@aws-sdk/middleware-logger': 3.972.7 - '@aws-sdk/middleware-recursion-detection': 3.972.7 - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/region-config-resolver': 3.972.7 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.985.0 - '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 - '@smithy/config-resolver': 4.4.10 - '@smithy/core': 3.23.9 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/hash-node': 4.2.11 - '@smithy/invalid-dependency': 4.2.11 - '@smithy/middleware-content-length': 4.2.11 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-retry': 4.4.40 - '@smithy/middleware-serde': 4.2.12 - '@smithy/middleware-stack': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/node-http-handler': 4.4.14 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.39 - '@smithy/util-defaults-mode-node': 4.2.42 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-kendra@3.1006.0': + '@aws-sdk/client-kendra@3.1034.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/middleware-host-header': 3.972.7 - '@aws-sdk/middleware-logger': 3.972.7 - '@aws-sdk/middleware-recursion-detection': 3.972.7 - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/region-config-resolver': 3.972.7 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.4 - '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 - '@smithy/config-resolver': 4.4.10 - '@smithy/core': 3.23.9 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/hash-node': 4.2.11 - '@smithy/invalid-dependency': 4.2.11 - '@smithy/middleware-content-length': 4.2.11 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-retry': 4.4.40 - '@smithy/middleware-serde': 4.2.12 - '@smithy/middleware-stack': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/node-http-handler': 4.4.14 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.39 - '@smithy/util-defaults-mode-node': 4.2.42 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-s3@3.1024.0': + '@aws-sdk/client-s3@3.1034.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.26 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/middleware-bucket-endpoint': 3.972.8 - '@aws-sdk/middleware-expect-continue': 3.972.8 - '@aws-sdk/middleware-flexible-checksums': 3.974.6 - '@aws-sdk/middleware-host-header': 3.972.8 - '@aws-sdk/middleware-location-constraint': 3.972.8 - '@aws-sdk/middleware-logger': 3.972.8 - '@aws-sdk/middleware-recursion-detection': 3.972.9 - '@aws-sdk/middleware-sdk-s3': 3.972.27 - '@aws-sdk/middleware-ssec': 3.972.8 - '@aws-sdk/middleware-user-agent': 3.972.28 - '@aws-sdk/region-config-resolver': 3.972.10 - '@aws-sdk/signature-v4-multi-region': 3.996.15 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.5 - '@aws-sdk/util-user-agent-browser': 3.972.8 - '@aws-sdk/util-user-agent-node': 3.973.14 - '@smithy/config-resolver': 4.4.13 - '@smithy/core': 3.23.13 - '@smithy/eventstream-serde-browser': 4.2.12 - '@smithy/eventstream-serde-config-resolver': 4.3.12 - '@smithy/eventstream-serde-node': 4.2.12 - '@smithy/fetch-http-handler': 5.3.15 - '@smithy/hash-blob-browser': 4.2.13 - '@smithy/hash-node': 4.2.12 - '@smithy/hash-stream-node': 4.2.12 - '@smithy/invalid-dependency': 4.2.12 - '@smithy/md5-js': 4.2.12 - '@smithy/middleware-content-length': 4.2.12 - '@smithy/middleware-endpoint': 4.4.28 - '@smithy/middleware-retry': 4.4.46 - '@smithy/middleware-serde': 4.2.16 - '@smithy/middleware-stack': 4.2.12 - '@smithy/node-config-provider': 4.3.12 - '@smithy/node-http-handler': 4.5.1 - '@smithy/protocol-http': 5.3.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.12 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.44 - '@smithy/util-defaults-mode-node': 4.2.48 - '@smithy/util-endpoints': 3.3.3 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.13 - '@smithy/util-stream': 4.5.21 - '@smithy/util-utf8': 4.2.2 - '@smithy/util-waiter': 4.2.14 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/client-sagemaker@3.985.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/middleware-host-header': 3.972.7 - '@aws-sdk/middleware-logger': 3.972.7 - '@aws-sdk/middleware-recursion-detection': 3.972.7 - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/region-config-resolver': 3.972.7 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.985.0 - '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 - '@smithy/config-resolver': 4.4.10 - '@smithy/core': 3.23.9 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/hash-node': 4.2.11 - '@smithy/invalid-dependency': 4.2.11 - '@smithy/middleware-content-length': 4.2.11 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-retry': 4.4.40 - '@smithy/middleware-serde': 4.2.12 - '@smithy/middleware-stack': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/node-http-handler': 4.4.14 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/middleware-bucket-endpoint': 3.972.10 + '@aws-sdk/middleware-expect-continue': 3.972.10 + '@aws-sdk/middleware-flexible-checksums': 3.974.11 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-location-constraint': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-sdk-s3': 3.972.32 + '@aws-sdk/middleware-ssec': 3.972.10 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/signature-v4-multi-region': 3.996.20 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/eventstream-serde-browser': 4.2.14 + '@smithy/eventstream-serde-config-resolver': 4.3.14 + '@smithy/eventstream-serde-node': 4.2.14 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-blob-browser': 4.2.15 + '@smithy/hash-node': 4.2.14 + '@smithy/hash-stream-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/md5-js': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.39 - '@smithy/util-defaults-mode-node': 4.2.42 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 + '@smithy/util-stream': 4.5.24 '@smithy/util-utf8': 4.2.2 - '@smithy/util-waiter': 4.2.11 + '@smithy/util-waiter': 4.2.16 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.985.0': + '@aws-sdk/client-sagemaker@3.1034.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/middleware-host-header': 3.972.7 - '@aws-sdk/middleware-logger': 3.972.7 - '@aws-sdk/middleware-recursion-detection': 3.972.7 - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/region-config-resolver': 3.972.7 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.985.0 - '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 - '@smithy/config-resolver': 4.4.10 - '@smithy/core': 3.23.9 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/hash-node': 4.2.11 - '@smithy/invalid-dependency': 4.2.11 - '@smithy/middleware-content-length': 4.2.11 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-retry': 4.4.40 - '@smithy/middleware-serde': 4.2.12 - '@smithy/middleware-stack': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/node-http-handler': 4.4.14 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.39 - '@smithy/util-defaults-mode-node': 4.2.42 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 + '@smithy/util-waiter': 4.2.16 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.19': - dependencies: - '@aws-sdk/types': 3.973.6 - '@aws-sdk/xml-builder': 3.972.10 - '@smithy/core': 3.23.9 - '@smithy/node-config-provider': 4.3.11 - '@smithy/property-provider': 4.2.11 - '@smithy/protocol-http': 5.3.11 - '@smithy/signature-v4': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/util-base64': 4.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@aws-sdk/core@3.973.26': - dependencies: - '@aws-sdk/types': 3.973.6 - '@aws-sdk/xml-builder': 3.972.16 - '@smithy/core': 3.23.13 - '@smithy/node-config-provider': 4.3.12 - '@smithy/property-provider': 4.2.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/signature-v4': 5.3.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 + '@aws-sdk/core@3.974.3': + dependencies: + '@aws-sdk/types': 3.973.8 + '@aws-sdk/xml-builder': 3.972.18 + '@smithy/core': 3.23.16 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 '@smithy/util-base64': 4.3.2 - '@smithy/util-middleware': 4.2.12 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/core@3.973.7': - dependencies: - '@aws-sdk/types': 3.973.6 - '@aws-sdk/xml-builder': 3.972.4 - '@smithy/core': 3.23.9 - '@smithy/node-config-provider': 4.3.11 - '@smithy/property-provider': 4.2.11 - '@smithy/protocol-http': 5.3.11 - '@smithy/signature-v4': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/util-base64': 4.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@aws-sdk/crc64-nvme@3.972.5': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-cognito-identity@3.972.3': - dependencies: - '@aws-sdk/client-cognito-identity': 3.980.0 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-env@3.972.17': - dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.972.24': - dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-env@3.972.5': - dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.972.19': - dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/types': 3.973.6 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/node-http-handler': 4.4.14 - '@smithy/property-provider': 4.2.11 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/util-stream': 4.5.17 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.972.26': - dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/types': 3.973.6 - '@smithy/fetch-http-handler': 5.3.15 - '@smithy/node-http-handler': 4.5.1 - '@smithy/property-provider': 4.2.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 - '@smithy/util-stream': 4.5.21 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-http@3.972.7': - dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/types': 3.973.6 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/node-http-handler': 4.4.14 - '@smithy/property-provider': 4.2.11 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/util-stream': 4.5.17 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-ini@3.972.28': - dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/credential-provider-env': 3.972.24 - '@aws-sdk/credential-provider-http': 3.972.26 - '@aws-sdk/credential-provider-login': 3.972.28 - '@aws-sdk/credential-provider-process': 3.972.24 - '@aws-sdk/credential-provider-sso': 3.972.28 - '@aws-sdk/credential-provider-web-identity': 3.972.28 - '@aws-sdk/nested-clients': 3.996.18 - '@aws-sdk/types': 3.973.6 - '@smithy/credential-provider-imds': 4.2.12 - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-ini@3.972.5': - dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/credential-provider-env': 3.972.17 - '@aws-sdk/credential-provider-http': 3.972.19 - '@aws-sdk/credential-provider-login': 3.972.5 - '@aws-sdk/credential-provider-process': 3.972.17 - '@aws-sdk/credential-provider-sso': 3.972.18 - '@aws-sdk/credential-provider-web-identity': 3.972.18 - '@aws-sdk/nested-clients': 3.985.0 - '@aws-sdk/types': 3.973.6 - '@smithy/credential-provider-imds': 4.2.11 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-login@3.972.28': + '@aws-sdk/crc64-nvme@3.972.7': dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/nested-clients': 3.996.18 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-login@3.972.5': + '@aws-sdk/credential-provider-cognito-identity@3.972.26': dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.985.0 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/protocol-http': 5.3.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-provider-node@3.972.29': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.24 - '@aws-sdk/credential-provider-http': 3.972.26 - '@aws-sdk/credential-provider-ini': 3.972.28 - '@aws-sdk/credential-provider-process': 3.972.24 - '@aws-sdk/credential-provider-sso': 3.972.28 - '@aws-sdk/credential-provider-web-identity': 3.972.28 - '@aws-sdk/types': 3.973.6 - '@smithy/credential-provider-imds': 4.2.12 - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.17': - dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/credential-provider-process@3.972.24': + '@aws-sdk/credential-provider-env@3.972.29': dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-process@3.972.5': - dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 + '@aws-sdk/credential-provider-http@3.972.31': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/node-http-handler': 4.6.0 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/util-stream': 4.5.24 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.18': - dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.996.8 - '@aws-sdk/token-providers': 3.1005.0 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 + '@aws-sdk/credential-provider-ini@3.972.33': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-env': 3.972.29 + '@aws-sdk/credential-provider-http': 3.972.31 + '@aws-sdk/credential-provider-login': 3.972.33 + '@aws-sdk/credential-provider-process': 3.972.29 + '@aws-sdk/credential-provider-sso': 3.972.33 + '@aws-sdk/credential-provider-web-identity': 3.972.33 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-sso@3.972.28': + '@aws-sdk/credential-provider-login@3.972.33': dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/nested-clients': 3.996.18 - '@aws-sdk/token-providers': 3.1021.0 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-sso@3.972.5': - dependencies: - '@aws-sdk/client-sso': 3.985.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/token-providers': 3.985.0 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 + '@aws-sdk/credential-provider-node@3.972.34': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.29 + '@aws-sdk/credential-provider-http': 3.972.31 + '@aws-sdk/credential-provider-ini': 3.972.33 + '@aws-sdk/credential-provider-process': 3.972.29 + '@aws-sdk/credential-provider-sso': 3.972.33 + '@aws-sdk/credential-provider-web-identity': 3.972.33 + '@aws-sdk/types': 3.973.8 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.18': + '@aws-sdk/credential-provider-process@3.972.29': dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.996.8 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.28': + '@aws-sdk/credential-provider-sso@3.972.33': dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/nested-clients': 3.996.18 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/token-providers': 3.1034.0 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.5': + '@aws-sdk/credential-provider-web-identity@3.972.33': dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.985.0 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - - '@aws-sdk/credential-providers@3.985.0': - dependencies: - '@aws-sdk/client-cognito-identity': 3.985.0 - '@aws-sdk/core': 3.973.7 - '@aws-sdk/credential-provider-cognito-identity': 3.972.3 - '@aws-sdk/credential-provider-env': 3.972.5 - '@aws-sdk/credential-provider-http': 3.972.7 - '@aws-sdk/credential-provider-ini': 3.972.5 - '@aws-sdk/credential-provider-login': 3.972.5 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/credential-provider-process': 3.972.5 - '@aws-sdk/credential-provider-sso': 3.972.5 - '@aws-sdk/credential-provider-web-identity': 3.972.5 - '@aws-sdk/nested-clients': 3.985.0 - '@aws-sdk/types': 3.973.6 - '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.22.1 - '@smithy/credential-provider-imds': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/property-provider': 4.2.8 - '@smithy/types': 4.13.1 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/dsql-signer@3.1024.0': - dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/credential-provider-node': 3.972.29 - '@aws-sdk/util-format-url': 3.972.8 - '@smithy/config-resolver': 4.4.13 - '@smithy/hash-node': 4.2.12 - '@smithy/invalid-dependency': 4.2.12 - '@smithy/node-config-provider': 4.3.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/signature-v4': 5.3.12 - '@smithy/types': 4.13.1 + '@aws-sdk/credential-providers@3.1034.0': + dependencies: + '@aws-sdk/client-cognito-identity': 3.1034.0 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/credential-provider-cognito-identity': 3.972.26 + '@aws-sdk/credential-provider-env': 3.972.29 + '@aws-sdk/credential-provider-http': 3.972.31 + '@aws-sdk/credential-provider-ini': 3.972.33 + '@aws-sdk/credential-provider-login': 3.972.33 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/credential-provider-process': 3.972.29 + '@aws-sdk/credential-provider-sso': 3.972.33 + '@aws-sdk/credential-provider-web-identity': 3.972.33 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/dsql-signer@3.985.0': + '@aws-sdk/dsql-signer@3.1034.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/credential-providers': 3.985.0 - '@aws-sdk/util-format-url': 3.972.3 - '@smithy/config-resolver': 4.4.6 - '@smithy/hash-node': 4.2.8 - '@smithy/invalid-dependency': 4.2.8 - '@smithy/node-config-provider': 4.3.8 - '@smithy/protocol-http': 5.3.8 - '@smithy/signature-v4': 5.3.8 - '@smithy/types': 4.12.0 + '@aws-sdk/credential-provider-node': 3.972.34 + '@aws-sdk/util-format-url': 3.972.10 + '@smithy/config-resolver': 4.4.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/eventstream-handler-node@3.972.10': + '@aws-sdk/eventstream-handler-node@3.972.14': dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/eventstream-codec': 4.2.11 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/eventstream-codec': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-bucket-endpoint@3.972.8': + '@aws-sdk/middleware-bucket-endpoint@3.972.10': dependencies: - '@aws-sdk/types': 3.973.6 + '@aws-sdk/types': 3.973.8 '@aws-sdk/util-arn-parser': 3.972.3 - '@smithy/node-config-provider': 4.3.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-eventstream@3.972.7': + '@aws-sdk/middleware-eventstream@3.972.10': dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.972.8': + '@aws-sdk/middleware-expect-continue@3.972.10': dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.974.6': + '@aws-sdk/middleware-flexible-checksums@3.974.11': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.973.26 - '@aws-sdk/crc64-nvme': 3.972.5 - '@aws-sdk/types': 3.973.6 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/crc64-nvme': 3.972.7 + '@aws-sdk/types': 3.973.8 '@smithy/is-array-buffer': 4.2.2 - '@smithy/node-config-provider': 4.3.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-stream': 4.5.21 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-stream': 4.5.24 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.972.7': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-host-header@3.972.8': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-location-constraint@3.972.8': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-logger@3.972.7': + '@aws-sdk/middleware-host-header@3.972.10': dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.972.8': + '@aws-sdk/middleware-location-constraint@3.972.10': dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.7': + '@aws-sdk/middleware-logger@3.972.10': dependencies: - '@aws-sdk/types': 3.973.6 - '@aws/lambda-invoke-store': 0.2.3 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.9': + '@aws-sdk/middleware-recursion-detection@3.972.11': dependencies: - '@aws-sdk/types': 3.973.6 - '@aws/lambda-invoke-store': 0.2.3 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@aws/lambda-invoke-store': 0.2.4 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.972.27': + '@aws-sdk/middleware-sdk-s3@3.972.32': dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/types': 3.973.6 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 '@aws-sdk/util-arn-parser': 3.972.3 - '@smithy/core': 3.23.13 - '@smithy/node-config-provider': 4.3.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/signature-v4': 5.3.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 + '@smithy/core': 3.23.16 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 '@smithy/util-config-provider': 4.2.2 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-stream': 4.5.21 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-stream': 4.5.24 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.972.8': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/middleware-user-agent@3.972.20': + '@aws-sdk/middleware-ssec@3.972.10': dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.4 - '@smithy/core': 3.23.9 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - '@smithy/util-retry': 4.2.11 + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.28': + '@aws-sdk/middleware-user-agent@3.972.33': dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.5 - '@smithy/core': 3.23.13 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 - '@smithy/util-retry': 4.2.13 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@smithy/core': 3.23.16 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-retry': 4.3.3 tslib: 2.8.1 - '@aws-sdk/middleware-websocket@3.972.12': + '@aws-sdk/middleware-websocket@3.972.16': dependencies: - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-format-url': 3.972.7 - '@smithy/eventstream-codec': 4.2.11 - '@smithy/eventstream-serde-browser': 4.2.11 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/protocol-http': 5.3.11 - '@smithy/signature-v4': 5.3.11 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-format-url': 3.972.10 + '@smithy/eventstream-codec': 4.2.14 + '@smithy/eventstream-serde-browser': 4.2.14 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/types': 4.14.1 '@smithy/util-base64': 4.3.2 '@smithy/util-hex-encoding': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.985.0': + '@aws-sdk/nested-clients@3.997.1': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/middleware-host-header': 3.972.7 - '@aws-sdk/middleware-logger': 3.972.7 - '@aws-sdk/middleware-recursion-detection': 3.972.7 - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/region-config-resolver': 3.972.7 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.985.0 - '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 - '@smithy/config-resolver': 4.4.10 - '@smithy/core': 3.23.9 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/hash-node': 4.2.11 - '@smithy/invalid-dependency': 4.2.11 - '@smithy/middleware-content-length': 4.2.11 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-retry': 4.4.40 - '@smithy/middleware-serde': 4.2.12 - '@smithy/middleware-stack': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/node-http-handler': 4.4.14 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 + '@aws-sdk/core': 3.974.3 + '@aws-sdk/middleware-host-header': 3.972.10 + '@aws-sdk/middleware-logger': 3.972.10 + '@aws-sdk/middleware-recursion-detection': 3.972.11 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/region-config-resolver': 3.972.13 + '@aws-sdk/signature-v4-multi-region': 3.996.20 + '@aws-sdk/types': 3.973.8 + '@aws-sdk/util-endpoints': 3.996.8 + '@aws-sdk/util-user-agent-browser': 3.972.10 + '@aws-sdk/util-user-agent-node': 3.973.19 + '@smithy/config-resolver': 4.4.17 + '@smithy/core': 3.23.16 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/hash-node': 4.2.14 + '@smithy/invalid-dependency': 4.2.14 + '@smithy/middleware-content-length': 4.2.14 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-retry': 4.5.4 + '@smithy/middleware-serde': 4.2.19 + '@smithy/middleware-stack': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/node-http-handler': 4.6.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.39 - '@smithy/util-defaults-mode-node': 4.2.42 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 + '@smithy/util-defaults-mode-browser': 4.3.48 + '@smithy/util-defaults-mode-node': 4.2.53 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/nested-clients@3.996.18': + '@aws-sdk/region-config-resolver@3.972.13': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.26 - '@aws-sdk/middleware-host-header': 3.972.8 - '@aws-sdk/middleware-logger': 3.972.8 - '@aws-sdk/middleware-recursion-detection': 3.972.9 - '@aws-sdk/middleware-user-agent': 3.972.28 - '@aws-sdk/region-config-resolver': 3.972.10 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.5 - '@aws-sdk/util-user-agent-browser': 3.972.8 - '@aws-sdk/util-user-agent-node': 3.973.14 - '@smithy/config-resolver': 4.4.13 - '@smithy/core': 3.23.13 - '@smithy/fetch-http-handler': 5.3.15 - '@smithy/hash-node': 4.2.12 - '@smithy/invalid-dependency': 4.2.12 - '@smithy/middleware-content-length': 4.2.12 - '@smithy/middleware-endpoint': 4.4.28 - '@smithy/middleware-retry': 4.4.46 - '@smithy/middleware-serde': 4.2.16 - '@smithy/middleware-stack': 4.2.12 - '@smithy/node-config-provider': 4.3.12 - '@smithy/node-http-handler': 4.5.1 - '@smithy/protocol-http': 5.3.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.12 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.44 - '@smithy/util-defaults-mode-node': 4.2.48 - '@smithy/util-endpoints': 3.3.3 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.13 - '@smithy/util-utf8': 4.2.2 + '@aws-sdk/types': 3.973.8 + '@smithy/config-resolver': 4.4.17 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/nested-clients@3.996.8': + '@aws-sdk/signature-v4-multi-region@3.996.20': dependencies: - '@aws-crypto/sha256-browser': 5.2.0 - '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.19 - '@aws-sdk/middleware-host-header': 3.972.7 - '@aws-sdk/middleware-logger': 3.972.7 - '@aws-sdk/middleware-recursion-detection': 3.972.7 - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/region-config-resolver': 3.972.7 - '@aws-sdk/types': 3.973.6 - '@aws-sdk/util-endpoints': 3.996.4 - '@aws-sdk/util-user-agent-browser': 3.972.7 - '@aws-sdk/util-user-agent-node': 3.973.5 - '@smithy/config-resolver': 4.4.10 - '@smithy/core': 3.23.9 - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/hash-node': 4.2.11 - '@smithy/invalid-dependency': 4.2.11 - '@smithy/middleware-content-length': 4.2.11 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-retry': 4.4.40 - '@smithy/middleware-serde': 4.2.12 - '@smithy/middleware-stack': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/node-http-handler': 4.4.14 - '@smithy/protocol-http': 5.3.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-body-length-node': 4.2.3 - '@smithy/util-defaults-mode-browser': 4.3.39 - '@smithy/util-defaults-mode-node': 4.2.42 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 - '@smithy/util-utf8': 4.2.2 + '@aws-sdk/middleware-sdk-s3': 3.972.32 + '@aws-sdk/types': 3.973.8 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 + '@smithy/types': 4.14.1 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.1034.0': + dependencies: + '@aws-sdk/core': 3.974.3 + '@aws-sdk/nested-clients': 3.997.1 + '@aws-sdk/types': 3.973.8 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.972.10': + '@aws-sdk/types@3.973.8': dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/config-resolver': 4.4.13 - '@smithy/node-config-provider': 4.3.12 - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@aws-sdk/region-config-resolver@3.972.7': + '@aws-sdk/util-arn-parser@3.972.3': dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/config-resolver': 4.4.10 - '@smithy/node-config-provider': 4.3.11 - '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.996.15': + '@aws-sdk/util-endpoints@3.996.8': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.972.27 - '@aws-sdk/types': 3.973.6 - '@smithy/protocol-http': 5.3.12 - '@smithy/signature-v4': 5.3.12 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-endpoints': 3.4.2 tslib: 2.8.1 - '@aws-sdk/token-providers@3.1005.0': + '@aws-sdk/util-format-url@3.972.10': dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.996.8 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/querystring-builder': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/token-providers@3.1006.0': + '@aws-sdk/util-locate-window@3.965.5': dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.996.8 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/token-providers@3.1021.0': + '@aws-sdk/util-user-agent-browser@3.972.10': dependencies: - '@aws-sdk/core': 3.973.26 - '@aws-sdk/nested-clients': 3.996.18 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 + '@aws-sdk/types': 3.973.8 + '@smithy/types': 4.14.1 + bowser: 2.14.1 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/token-providers@3.985.0': + '@aws-sdk/util-user-agent-node@3.973.19': dependencies: - '@aws-sdk/core': 3.973.19 - '@aws-sdk/nested-clients': 3.985.0 - '@aws-sdk/types': 3.973.6 - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 + '@aws-sdk/middleware-user-agent': 3.972.33 + '@aws-sdk/types': 3.973.8 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 - transitivePeerDependencies: - - aws-crt - '@aws-sdk/types@3.973.6': + '@aws-sdk/xml-builder@3.972.18': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 + fast-xml-parser: 5.7.1 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.972.3': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.980.0': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 - '@smithy/util-endpoints': 3.3.2 - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.985.0': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 - '@smithy/util-endpoints': 3.3.2 - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.996.4': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 - '@smithy/util-endpoints': 3.3.2 - tslib: 2.8.1 - - '@aws-sdk/util-endpoints@3.996.5': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.12 - '@smithy/util-endpoints': 3.3.3 - tslib: 2.8.1 - - '@aws-sdk/util-format-url@3.972.3': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/querystring-builder': 4.2.8 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/util-format-url@3.972.7': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/querystring-builder': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/util-format-url@3.972.8': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/querystring-builder': 4.2.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/util-locate-window@3.965.4': - dependencies: - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-browser@3.972.7': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 - bowser: 2.14.1 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-browser@3.972.8': - dependencies: - '@aws-sdk/types': 3.973.6 - '@smithy/types': 4.13.1 - bowser: 2.14.1 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.973.14': - dependencies: - '@aws-sdk/middleware-user-agent': 3.972.28 - '@aws-sdk/types': 3.973.6 - '@smithy/node-config-provider': 4.3.12 - '@smithy/types': 4.13.1 - '@smithy/util-config-provider': 4.2.2 - tslib: 2.8.1 - - '@aws-sdk/util-user-agent-node@3.973.5': - dependencies: - '@aws-sdk/middleware-user-agent': 3.972.20 - '@aws-sdk/types': 3.973.6 - '@smithy/node-config-provider': 4.3.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.972.10': - dependencies: - '@smithy/types': 4.13.1 - fast-xml-parser: 5.5.8 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.972.16': - dependencies: - '@smithy/types': 4.13.1 - fast-xml-parser: 5.5.8 - tslib: 2.8.1 - - '@aws-sdk/xml-builder@3.972.4': - dependencies: - '@smithy/types': 4.13.1 - fast-xml-parser: 5.5.8 - tslib: 2.8.1 - - '@aws/lambda-invoke-store@0.2.3': {} + '@aws/lambda-invoke-store@0.2.4': {} '@azure/abort-controller@2.1.2': dependencies: @@ -14052,7 +12763,7 @@ snapshots: dependencies: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.23.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 @@ -14070,18 +12781,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@azure/core-rest-pipeline@1.22.2': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 - '@typespec/ts-http-runtime': 0.3.3 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - '@azure/core-rest-pipeline@1.23.0': dependencies: '@azure/abort-controller': 2.1.2 @@ -14101,23 +12800,7 @@ snapshots: '@azure/core-util@1.13.1': dependencies: '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.3 - tslib: 2.8.1 - transitivePeerDependencies: - - supports-color - - '@azure/identity@4.13.0': - dependencies: - '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.1 - '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 - '@azure/core-tracing': 1.3.1 - '@azure/core-util': 1.13.1 - '@azure/logger': 1.3.0 - '@azure/msal-browser': 4.28.1 - '@azure/msal-node': 3.8.6 - open: 10.2.0 + '@typespec/ts-http-runtime': 0.3.5 tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -14127,12 +12810,12 @@ snapshots: '@azure/abort-controller': 2.1.2 '@azure/core-auth': 1.10.1 '@azure/core-client': 1.10.1 - '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-rest-pipeline': 1.23.0 '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 5.6.3 - '@azure/msal-node': 5.1.2 + '@azure/msal-browser': 5.8.0 + '@azure/msal-node': 5.1.4 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -14140,32 +12823,20 @@ snapshots: '@azure/logger@1.3.0': dependencies: - '@typespec/ts-http-runtime': 0.3.3 + '@typespec/ts-http-runtime': 0.3.5 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/msal-browser@4.28.1': - dependencies: - '@azure/msal-common': 15.14.1 - - '@azure/msal-browser@5.6.3': + '@azure/msal-browser@5.8.0': dependencies: - '@azure/msal-common': 16.4.1 + '@azure/msal-common': 16.5.1 - '@azure/msal-common@15.14.1': {} + '@azure/msal-common@16.5.1': {} - '@azure/msal-common@16.4.1': {} - - '@azure/msal-node@3.8.6': - dependencies: - '@azure/msal-common': 15.14.1 - jsonwebtoken: 9.0.3 - uuid: 8.3.2 - - '@azure/msal-node@5.1.2': + '@azure/msal-node@5.1.4': dependencies: - '@azure/msal-common': 16.4.1 + '@azure/msal-common': 16.5.1 jsonwebtoken: 9.0.3 uuid: 8.3.2 @@ -14198,8 +12869,8 @@ snapshots: '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.29.0 + '@babel/helpers': 7.29.2 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 @@ -14214,7 +12885,7 @@ snapshots: '@babel/generator@7.29.1': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 @@ -14233,7 +12904,7 @@ snapshots: dependencies: '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 + browserslist: 4.28.2 lru-cache: 5.1.1 semver: 6.3.1 @@ -14259,31 +12930,23 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-string-parser@8.0.0-rc.2': {} - '@babel/helper-string-parser@8.0.0-rc.3': {} '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@8.0.0-rc.2': {} - '@babel/helper-validator-identifier@8.0.0-rc.3': {} '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.28.6': + '@babel/helpers@7.29.2': dependencies: '@babel/template': 7.28.6 '@babel/types': 7.29.0 - '@babel/parser@7.29.0': + '@babel/parser@7.29.2': dependencies: '@babel/types': 7.29.0 - '@babel/parser@8.0.0-rc.2': - dependencies: - '@babel/types': 8.0.0-rc.2 - '@babel/parser@8.0.0-rc.3': dependencies: '@babel/types': 8.0.0-rc.3 @@ -14373,14 +13036,12 @@ snapshots: '@babel/core': 7.29.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/runtime@7.28.6': {} - '@babel/runtime@7.29.2': {} '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.29.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@babel/traverse@7.29.0': @@ -14388,7 +13049,7 @@ snapshots: '@babel/code-frame': 7.29.0 '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/template': 7.28.6 '@babel/types': 7.29.0 debug: 4.4.3 @@ -14400,11 +13061,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@8.0.0-rc.2': - dependencies: - '@babel/helper-string-parser': 8.0.0-rc.2 - '@babel/helper-validator-identifier': 8.0.0-rc.2 - '@babel/types@8.0.0-rc.3': dependencies: '@babel/helper-string-parser': 8.0.0-rc.3 @@ -14420,24 +13076,7 @@ snapshots: '@braidai/lang@1.1.2': {} - '@bramus/specificity@2.4.2': - dependencies: - css-tree: 3.2.1 - optional: true - - '@browserbasehq/sdk@2.6.0(encoding@0.1.13)': - dependencies: - '@types/node': 18.19.130 - '@types/node-fetch': 2.6.13 - abort-controller: 3.0.0 - agentkeepalive: 4.6.0 - form-data-encoder: 1.7.2 - formdata-node: 4.4.1 - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - - '@browserbasehq/sdk@2.9.0(encoding@0.1.13)': + '@browserbasehq/sdk@2.10.0(encoding@0.1.13)': dependencies: '@types/node': 18.19.130 '@types/node-fetch': 2.6.13 @@ -14449,15 +13088,15 @@ snapshots: transitivePeerDependencies: - encoding - '@browserbasehq/stagehand@1.14.0(@playwright/test@1.58.2)(bufferutil@4.1.0)(deepmerge@4.3.1)(dotenv@17.4.1)(encoding@0.1.13)(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(zod@4.3.6)': + '@browserbasehq/stagehand@1.14.0(@playwright/test@1.59.1)(bufferutil@4.1.0)(deepmerge@4.3.1)(dotenv@17.4.2)(encoding@0.1.13)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(zod@4.3.6)': dependencies: '@anthropic-ai/sdk': 0.27.3(encoding@0.1.13) - '@browserbasehq/sdk': 2.6.0(encoding@0.1.13) - '@playwright/test': 1.58.2 + '@browserbasehq/sdk': 2.10.0(encoding@0.1.13) + '@playwright/test': 1.59.1 deepmerge: 4.3.1 - dotenv: 17.4.1 - openai: 6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) - ws: 8.19.0(bufferutil@4.1.0) + dotenv: 17.4.2 + openai: 6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) + ws: 8.20.0(bufferutil@4.1.0) zod: 4.3.6 zod-to-json-schema: 3.25.2(zod@4.3.6) transitivePeerDependencies: @@ -14465,15 +13104,15 @@ snapshots: - encoding - utf-8-validate - '@browserbasehq/stagehand@3.2.0(@cfworker/json-schema@4.1.1)(deepmerge@4.3.1)(encoding@0.1.13)(zod@4.3.6)': + '@browserbasehq/stagehand@3.2.1(@cfworker/json-schema@4.1.1)(deepmerge@4.3.1)(encoding@0.1.13)(zod@4.3.6)': dependencies: '@ai-sdk/provider': 2.0.1 '@anthropic-ai/sdk': 0.39.0(encoding@0.1.13) - '@browserbasehq/sdk': 2.9.0(encoding@0.1.13) - '@google/genai': 1.40.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0) + '@browserbasehq/sdk': 2.10.0(encoding@0.1.13) + '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0) '@langchain/openai': 0.4.9(@langchain/core@libs+langchain-core)(encoding@0.1.13)(ws@8.20.0(bufferutil@4.1.0)) '@modelcontextprotocol/sdk': 1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6) - ai: 5.0.167(zod@4.3.6) + ai: 5.0.179(zod@4.3.6) deepmerge: 4.3.1 devtools-protocol: 0.0.1464554 fetch-cookie: 3.2.0 @@ -14485,26 +13124,26 @@ snapshots: zod: 4.3.6 zod-to-json-schema: 3.25.2(zod@4.3.6) optionalDependencies: - '@ai-sdk/amazon-bedrock': 3.0.93(zod@4.3.6) - '@ai-sdk/anthropic': 2.0.74(zod@4.3.6) - '@ai-sdk/azure': 2.0.104(zod@4.3.6) - '@ai-sdk/cerebras': 1.0.40(zod@4.3.6) - '@ai-sdk/deepseek': 1.0.36(zod@4.3.6) - '@ai-sdk/google': 2.0.67(zod@4.3.6) - '@ai-sdk/google-vertex': 3.0.127(zod@4.3.6) - '@ai-sdk/groq': 2.0.37(zod@4.3.6) - '@ai-sdk/mistral': 2.0.30(zod@4.3.6) - '@ai-sdk/openai': 2.0.102(zod@4.3.6) - '@ai-sdk/perplexity': 2.0.27(zod@4.3.6) - '@ai-sdk/togetherai': 1.0.38(zod@4.3.6) - '@ai-sdk/xai': 2.0.65(zod@4.3.6) + '@ai-sdk/amazon-bedrock': 3.0.97(zod@4.3.6) + '@ai-sdk/anthropic': 2.0.77(zod@4.3.6) + '@ai-sdk/azure': 2.0.105(zod@4.3.6) + '@ai-sdk/cerebras': 1.0.41(zod@4.3.6) + '@ai-sdk/deepseek': 1.0.37(zod@4.3.6) + '@ai-sdk/google': 2.0.70(zod@4.3.6) + '@ai-sdk/google-vertex': 3.0.132(zod@4.3.6) + '@ai-sdk/groq': 2.0.38(zod@4.3.6) + '@ai-sdk/mistral': 2.0.31(zod@4.3.6) + '@ai-sdk/openai': 2.0.103(zod@4.3.6) + '@ai-sdk/perplexity': 2.0.28(zod@4.3.6) + '@ai-sdk/togetherai': 1.0.39(zod@4.3.6) + '@ai-sdk/xai': 2.0.68(zod@4.3.6) '@langchain/core': link:libs/langchain-core bufferutil: 4.1.0 chrome-launcher: 1.2.1 ollama-ai-provider-v2: 1.5.5(zod@4.3.6) - patchright-core: 1.59.1 - playwright: 1.58.2 - playwright-core: 1.58.2 + patchright-core: 1.59.4 + playwright: 1.59.1 + playwright-core: 1.59.1 puppeteer-core: 22.15.0(bufferutil@4.1.0) transitivePeerDependencies: - '@cfworker/json-schema' @@ -14517,9 +13156,9 @@ snapshots: '@cfworker/json-schema@4.1.1': {} - '@changesets/apply-release-plan@7.1.0': + '@changesets/apply-release-plan@7.1.1': dependencies: - '@changesets/config': 3.1.3 + '@changesets/config': 3.1.4 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.4 '@changesets/should-skip-package': 0.1.2 @@ -14533,10 +13172,10 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.4 - '@changesets/assemble-release-plan@6.0.9': + '@changesets/assemble-release-plan@6.0.10': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-dependents-graph': 2.1.4 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -14554,15 +13193,15 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/cli@2.30.0(@types/node@25.5.0)': + '@changesets/cli@2.31.0(@types/node@25.6.0)': dependencies: - '@changesets/apply-release-plan': 7.1.0 - '@changesets/assemble-release-plan': 6.0.9 + '@changesets/apply-release-plan': 7.1.1 + '@changesets/assemble-release-plan': 6.0.10 '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.3 + '@changesets/config': 3.1.4 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.15 + '@changesets/get-dependents-graph': 2.1.4 + '@changesets/get-release-plan': 4.0.16 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 @@ -14570,7 +13209,7 @@ snapshots: '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@25.5.0) + '@inquirer/external-editor': 1.0.3(@types/node@25.6.0) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 enquirer: 2.4.1 @@ -14585,10 +13224,10 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@changesets/config@3.1.3': + '@changesets/config@3.1.4': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-dependents-graph': 2.1.4 '@changesets/logger': 0.1.1 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 @@ -14600,7 +13239,7 @@ snapshots: dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.3': + '@changesets/get-dependents-graph@2.1.4': dependencies: '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -14614,10 +13253,10 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.15': + '@changesets/get-release-plan@4.0.16': dependencies: - '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.3 + '@changesets/assemble-release-plan': 6.0.10 + '@changesets/config': 3.1.4 '@changesets/pre': 2.0.2 '@changesets/read': 0.6.7 '@changesets/types': 6.1.0 @@ -14677,63 +13316,37 @@ snapshots: '@clickhouse/client-common@0.2.10': {} - '@clickhouse/client-common@1.18.2': {} + '@clickhouse/client-common@1.18.3': {} '@clickhouse/client@0.2.10': dependencies: '@clickhouse/client-common': 0.2.10 - '@clickhouse/client@1.18.2': + '@clickhouse/client@1.18.3': dependencies: - '@clickhouse/client-common': 1.18.2 + '@clickhouse/client-common': 1.18.3 - '@cloudflare/workers-types@4.20260405.1': {} + '@cloudflare/workers-types@4.20260422.1': {} '@colors/colors@1.6.0': {} - '@conventional-changelog/git-client@2.5.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1)': + '@commander-js/extra-typings@13.1.0(commander@13.1.0)': dependencies: - '@simple-libs/child-process-utils': 1.0.1 - '@simple-libs/stream-utils': 1.1.0 + commander: 13.1.0 + + '@conventional-changelog/git-client@2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': + dependencies: + '@simple-libs/child-process-utils': 1.0.2 + '@simple-libs/stream-utils': 1.2.0 semver: 7.7.4 optionalDependencies: conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.2.1 + conventional-commits-parser: 6.4.0 '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@csstools/color-helpers@6.0.2': - optional: true - - '@csstools/css-calc@3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - optional: true - - '@csstools/css-color-parser@4.1.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/color-helpers': 6.0.2 - '@csstools/css-calc': 3.2.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0) - '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0) - '@csstools/css-tokenizer': 4.0.0 - optional: true - - '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0)': - dependencies: - '@csstools/css-tokenizer': 4.0.0 - optional: true - - '@csstools/css-syntax-patches-for-csstree@1.1.3(css-tree@3.2.1)': - optionalDependencies: - css-tree: 3.2.1 - optional: true - - '@csstools/css-tokenizer@4.0.0': - optional: true - '@dabh/diagnostics@2.0.8': dependencies: '@so-ric/colorspace': 1.1.6 @@ -14744,7 +13357,7 @@ snapshots: '@dsnp/parquetjs@1.8.7(bufferutil@4.1.0)': dependencies: - '@aws-sdk/client-s3': 3.1024.0 + '@aws-sdk/client-s3': 3.1034.0 '@types/node-int64': 0.4.32 '@types/thrift': 0.10.17 '@zenfs/core': 1.11.4 @@ -14782,27 +13395,27 @@ snapshots: '@elastic/transport@8.10.1': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) debug: 4.4.3 hpagent: 1.2.0 ms: 2.1.3 secure-json-parse: 3.0.2 tslib: 2.8.1 - undici: 7.24.5 + undici: 8.1.0 transitivePeerDependencies: - supports-color '@elastic/transport@9.3.5': dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.5.0(@opentelemetry/api@1.9.0) + '@opentelemetry/api': 1.9.1 + '@opentelemetry/core': 2.7.0(@opentelemetry/api@1.9.1) debug: 4.4.3 hpagent: 1.2.0 ms: 2.1.3 secure-json-parse: 4.1.0 tslib: 2.8.1 - undici: 7.24.5 + undici: 8.1.0 transitivePeerDependencies: - supports-color @@ -14816,190 +13429,123 @@ snapshots: '@electric-sql/pglite@0.4.1': {} - '@emnapi/core@1.8.1': + '@emnapi/core@1.10.0': dependencies: - '@emnapi/wasi-threads': 1.1.0 + '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.8.1': + '@emnapi/core@1.9.2': dependencies: + '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.1.0': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.0': - optional: true - - '@esbuild/aix-ppc64@0.27.3': - optional: true - - '@esbuild/android-arm64@0.27.0': - optional: true - - '@esbuild/android-arm64@0.27.3': - optional: true - - '@esbuild/android-arm@0.27.0': - optional: true - - '@esbuild/android-arm@0.27.3': - optional: true - - '@esbuild/android-x64@0.27.0': - optional: true - - '@esbuild/android-x64@0.27.3': - optional: true - - '@esbuild/darwin-arm64@0.27.0': - optional: true - - '@esbuild/darwin-arm64@0.27.3': - optional: true - - '@esbuild/darwin-x64@0.27.0': - optional: true - - '@esbuild/darwin-x64@0.27.3': - optional: true - - '@esbuild/freebsd-arm64@0.27.0': - optional: true - - '@esbuild/freebsd-arm64@0.27.3': - optional: true - - '@esbuild/freebsd-x64@0.27.0': - optional: true - - '@esbuild/freebsd-x64@0.27.3': - optional: true - - '@esbuild/linux-arm64@0.27.0': - optional: true - - '@esbuild/linux-arm64@0.27.3': - optional: true - - '@esbuild/linux-arm@0.27.0': - optional: true - - '@esbuild/linux-arm@0.27.3': - optional: true - - '@esbuild/linux-ia32@0.27.0': - optional: true - - '@esbuild/linux-ia32@0.27.3': - optional: true - - '@esbuild/linux-loong64@0.27.0': - optional: true - - '@esbuild/linux-loong64@0.27.3': - optional: true - - '@esbuild/linux-mips64el@0.27.0': + '@emnapi/runtime@1.9.2': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/linux-mips64el@0.27.3': + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/linux-ppc64@0.27.0': + '@esbuild/aix-ppc64@0.28.0': optional: true - '@esbuild/linux-ppc64@0.27.3': + '@esbuild/android-arm64@0.28.0': optional: true - '@esbuild/linux-riscv64@0.27.0': + '@esbuild/android-arm@0.28.0': optional: true - '@esbuild/linux-riscv64@0.27.3': + '@esbuild/android-x64@0.28.0': optional: true - '@esbuild/linux-s390x@0.27.0': + '@esbuild/darwin-arm64@0.28.0': optional: true - '@esbuild/linux-s390x@0.27.3': + '@esbuild/darwin-x64@0.28.0': optional: true - '@esbuild/linux-x64@0.27.0': + '@esbuild/freebsd-arm64@0.28.0': optional: true - '@esbuild/linux-x64@0.27.3': + '@esbuild/freebsd-x64@0.28.0': optional: true - '@esbuild/netbsd-arm64@0.27.0': + '@esbuild/linux-arm64@0.28.0': optional: true - '@esbuild/netbsd-arm64@0.27.3': + '@esbuild/linux-arm@0.28.0': optional: true - '@esbuild/netbsd-x64@0.27.0': + '@esbuild/linux-ia32@0.28.0': optional: true - '@esbuild/netbsd-x64@0.27.3': + '@esbuild/linux-loong64@0.28.0': optional: true - '@esbuild/openbsd-arm64@0.27.0': + '@esbuild/linux-mips64el@0.28.0': optional: true - '@esbuild/openbsd-arm64@0.27.3': + '@esbuild/linux-ppc64@0.28.0': optional: true - '@esbuild/openbsd-x64@0.27.0': + '@esbuild/linux-riscv64@0.28.0': optional: true - '@esbuild/openbsd-x64@0.27.3': + '@esbuild/linux-s390x@0.28.0': optional: true - '@esbuild/openharmony-arm64@0.27.0': + '@esbuild/linux-x64@0.28.0': optional: true - '@esbuild/openharmony-arm64@0.27.3': + '@esbuild/netbsd-arm64@0.28.0': optional: true - '@esbuild/sunos-x64@0.27.0': + '@esbuild/netbsd-x64@0.28.0': optional: true - '@esbuild/sunos-x64@0.27.3': + '@esbuild/openbsd-arm64@0.28.0': optional: true - '@esbuild/win32-arm64@0.27.0': + '@esbuild/openbsd-x64@0.28.0': optional: true - '@esbuild/win32-arm64@0.27.3': + '@esbuild/openharmony-arm64@0.28.0': optional: true - '@esbuild/win32-ia32@0.27.0': + '@esbuild/sunos-x64@0.28.0': optional: true - '@esbuild/win32-ia32@0.27.3': + '@esbuild/win32-arm64@0.28.0': optional: true - '@esbuild/win32-x64@0.27.0': + '@esbuild/win32-ia32@0.28.0': optional: true - '@esbuild/win32-x64@0.27.3': + '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': dependencies: - eslint: 9.39.2(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 - minimatch: 10.2.4 + minimatch: 10.2.5 transitivePeerDependencies: - supports-color @@ -15011,21 +13557,21 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.5': dependencies: - ajv: 6.14.0 + ajv: 6.15.0 debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.1 js-yaml: 4.1.1 - minimatch: 10.2.4 + minimatch: 10.2.5 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.2': {} + '@eslint/js@9.39.4': {} '@eslint/object-schema@2.1.7': {} @@ -15034,9 +13580,6 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@exodus/bytes@1.15.0': - optional: true - '@faker-js/faker@10.4.0': {} '@faker-js/faker@8.4.1': {} @@ -15045,36 +13588,38 @@ snapshots: '@firebase/app-check-interop-types@0.3.3': {} - '@firebase/app-types@0.9.3': {} + '@firebase/app-types@0.9.4': + dependencies: + '@firebase/logger': 0.5.0 '@firebase/auth-interop-types@0.2.4': {} - '@firebase/component@0.7.0': + '@firebase/component@0.7.2': dependencies: - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/database-compat@2.1.0': + '@firebase/database-compat@2.1.3': dependencies: - '@firebase/component': 0.7.0 - '@firebase/database': 1.1.0 - '@firebase/database-types': 1.0.16 + '@firebase/component': 0.7.2 + '@firebase/database': 1.1.2 + '@firebase/database-types': 1.0.19 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 tslib: 2.8.1 - '@firebase/database-types@1.0.16': + '@firebase/database-types@1.0.19': dependencies: - '@firebase/app-types': 0.9.3 - '@firebase/util': 1.13.0 + '@firebase/app-types': 0.9.4 + '@firebase/util': 1.15.0 - '@firebase/database@1.1.0': + '@firebase/database@1.1.2': dependencies: '@firebase/app-check-interop-types': 0.3.3 '@firebase/auth-interop-types': 0.2.4 - '@firebase/component': 0.7.0 + '@firebase/component': 0.7.2 '@firebase/logger': 0.5.0 - '@firebase/util': 1.13.0 + '@firebase/util': 1.15.0 faye-websocket: 0.11.4 tslib: 2.8.1 @@ -15082,13 +13627,10 @@ snapshots: dependencies: tslib: 2.8.1 - '@firebase/util@1.13.0': + '@firebase/util@1.15.0': dependencies: tslib: 2.8.1 - '@gar/promise-retry@1.0.3': - optional: true - '@gar/promisify@1.1.3': optional: true @@ -15100,7 +13642,7 @@ snapshots: dependencies: form-data: 4.0.5 node-fetch: 2.7.0(encoding@0.1.13) - qs: 6.15.0 + qs: 6.15.1 url-join: 4.0.1 zod: 3.25.76 optionalDependencies: @@ -15118,14 +13660,14 @@ snapshots: form-data: 4.0.5 formdata-node: 6.0.3 node-fetch: 2.7.0(encoding@0.1.13) - qs: 6.15.0 + qs: 6.15.1 url-join: 4.0.1 transitivePeerDependencies: - encoding - '@gomomento/generated-types@0.126.0(@grpc/grpc-js@1.13.1)(google-protobuf@3.21.2)': + '@gomomento/generated-types@0.126.0(@grpc/grpc-js@1.14.3)(google-protobuf@3.21.2)': dependencies: - '@grpc/grpc-js': 1.13.1 + '@grpc/grpc-js': 1.14.3 google-protobuf: 3.21.2 '@gomomento/sdk-core@1.117.2': @@ -15135,17 +13677,17 @@ snapshots: '@gomomento/sdk@1.117.2': dependencies: - '@gomomento/generated-types': 0.126.0(@grpc/grpc-js@1.13.1)(google-protobuf@3.21.2) + '@gomomento/generated-types': 0.126.0(@grpc/grpc-js@1.14.3)(google-protobuf@3.21.2) '@gomomento/sdk-core': 1.117.2 - '@grpc/grpc-js': 1.13.1 + '@grpc/grpc-js': 1.14.3 '@types/google-protobuf': 3.15.10 google-protobuf: 3.21.2 jwt-decode: 3.1.2 - '@google-cloud/cloud-sql-connector@1.9.0': + '@google-cloud/cloud-sql-connector@1.10.0': dependencies: '@googleapis/sqladmin': 35.2.0 - gaxios: 7.1.3 + gaxios: 7.1.4 google-auth-library: 10.6.2 p-throttle: 7.0.0 transitivePeerDependencies: @@ -15153,7 +13695,7 @@ snapshots: '@google-cloud/firestore@7.11.6(encoding@0.1.13)': dependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 fast-deep-equal: 3.1.3 functional-red-black-tree: 1.0.1 google-gax: 4.6.1(encoding@0.1.13) @@ -15183,7 +13725,7 @@ snapshots: abort-controller: 3.0.0 async-retry: 1.3.3 duplexify: 4.1.3 - fast-xml-parser: 5.5.8 + fast-xml-parser: 5.7.1 gaxios: 6.7.1(encoding@0.1.13) google-auth-library: 9.15.1(encoding@0.1.13) html-entities: 2.6.0 @@ -15197,9 +13739,10 @@ snapshots: - supports-color optional: true - '@google/genai@1.40.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0)': + '@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0)': dependencies: google-auth-library: 10.6.2 + p-retry: 4.6.2 protobufjs: 7.5.5 ws: 8.20.0(bufferutil@4.1.0) optionalDependencies: @@ -15223,11 +13766,6 @@ snapshots: dependencies: graphql: 16.13.2 - '@grpc/grpc-js@1.13.1': - dependencies: - '@grpc/proto-loader': 0.7.15 - '@js-sdsl/ordered-map': 4.4.2 - '@grpc/grpc-js@1.14.3': dependencies: '@grpc/proto-loader': 0.8.0 @@ -15247,30 +13785,49 @@ snapshots: protobufjs: 7.5.5 yargs: 17.7.2 - '@hono/node-server@1.19.11(hono@4.12.8)': + '@hono/node-server@2.0.0(hono@4.12.14)': + dependencies: + hono: 4.12.14 + + '@hono/node-ws@1.3.0(@hono/node-server@2.0.0(hono@4.12.14))(bufferutil@4.1.0)(hono@4.12.14)': + dependencies: + '@hono/node-server': 2.0.0(hono@4.12.14) + hono: 4.12.14 + ws: 8.20.0(bufferutil@4.1.0) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@hono/zod-validator@0.7.6(hono@4.12.14)(zod@4.3.6)': dependencies: - hono: 4.12.8 + hono: 4.12.14 + zod: 4.3.6 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} '@iarna/toml@2.2.5': {} - '@ibm-cloud/watsonx-ai@1.7.11(@swc/core@1.15.24(@swc/helpers@0.5.18))(typescript@5.8.3)': + '@ibm-cloud/watsonx-ai@1.7.11(@swc/core@1.15.30(@swc/helpers@0.5.21))(typescript@5.8.3)': dependencies: '@types/node': 18.19.130 extend: 3.0.2 form-data: 4.0.5 - ibm-cloud-sdk-core: 5.4.10 - ts-node: 10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@18.19.130)(typescript@5.8.3) + ibm-cloud-sdk-core: 5.4.11 + ts-node: 10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@18.19.130)(typescript@5.8.3) transitivePeerDependencies: - '@swc/core' - '@swc/wasm' @@ -15279,128 +13836,128 @@ snapshots: '@inquirer/ansi@1.0.2': {} - '@inquirer/checkbox@4.3.2(@types/node@25.5.0)': + '@inquirer/checkbox@4.3.2(@types/node@25.6.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/confirm@5.1.21(@types/node@25.5.0)': + '@inquirer/confirm@5.1.21(@types/node@25.6.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/core@10.3.2(@types/node@25.5.0)': + '@inquirer/core@10.3.2(@types/node@25.6.0)': dependencies: '@inquirer/ansi': 1.0.2 '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) cli-width: 4.1.0 mute-stream: 2.0.0 signal-exit: 4.1.0 wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/editor@4.2.23(@types/node@25.5.0)': + '@inquirer/editor@4.2.23(@types/node@25.6.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/external-editor': 1.0.3(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) + '@inquirer/external-editor': 1.0.3(@types/node@25.6.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/expand@4.0.23(@types/node@25.5.0)': + '@inquirer/expand@4.0.23(@types/node@25.6.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/external-editor@1.0.3(@types/node@25.5.0)': + '@inquirer/external-editor@1.0.3(@types/node@25.6.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@inquirer/figures@1.0.15': {} - '@inquirer/input@4.3.1(@types/node@25.5.0)': + '@inquirer/input@4.3.1(@types/node@25.6.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/number@3.0.23(@types/node@25.5.0)': + '@inquirer/number@3.0.23(@types/node@25.6.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/password@4.0.23(@types/node@25.5.0)': + '@inquirer/password@4.0.23(@types/node@25.6.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) optionalDependencies: - '@types/node': 25.5.0 - - '@inquirer/prompts@7.10.1(@types/node@25.5.0)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@25.5.0) - '@inquirer/confirm': 5.1.21(@types/node@25.5.0) - '@inquirer/editor': 4.2.23(@types/node@25.5.0) - '@inquirer/expand': 4.0.23(@types/node@25.5.0) - '@inquirer/input': 4.3.1(@types/node@25.5.0) - '@inquirer/number': 3.0.23(@types/node@25.5.0) - '@inquirer/password': 4.0.23(@types/node@25.5.0) - '@inquirer/rawlist': 4.1.11(@types/node@25.5.0) - '@inquirer/search': 3.2.2(@types/node@25.5.0) - '@inquirer/select': 4.4.2(@types/node@25.5.0) + '@types/node': 25.6.0 + + '@inquirer/prompts@7.10.1(@types/node@25.6.0)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@25.6.0) + '@inquirer/confirm': 5.1.21(@types/node@25.6.0) + '@inquirer/editor': 4.2.23(@types/node@25.6.0) + '@inquirer/expand': 4.0.23(@types/node@25.6.0) + '@inquirer/input': 4.3.1(@types/node@25.6.0) + '@inquirer/number': 3.0.23(@types/node@25.6.0) + '@inquirer/password': 4.0.23(@types/node@25.6.0) + '@inquirer/rawlist': 4.1.11(@types/node@25.6.0) + '@inquirer/search': 3.2.2(@types/node@25.6.0) + '@inquirer/select': 4.4.2(@types/node@25.6.0) optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/rawlist@4.1.11(@types/node@25.5.0)': + '@inquirer/rawlist@4.1.11(@types/node@25.6.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/search@3.2.2(@types/node@25.5.0)': + '@inquirer/search@3.2.2(@types/node@25.6.0)': dependencies: - '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/select@4.4.2(@types/node@25.5.0)': + '@inquirer/select@4.4.2(@types/node@25.6.0)': dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) yoctocolors-cjs: 2.1.3 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 - '@inquirer/type@3.0.10(@types/node@25.5.0)': + '@inquirer/type@3.0.10(@types/node@25.6.0)': optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@ioredis/commands@1.5.1': {} @@ -15425,18 +13982,18 @@ snapshots: js-yaml: 3.14.2 resolve-from: 5.0.0 - '@istanbuljs/schema@0.1.3': {} + '@istanbuljs/schema@0.1.6': {} '@jest/console@30.3.0': dependencies: '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 chalk: 4.1.2 jest-message-util: 30.3.0 jest-util: 30.3.0 slash: 3.0.0 - '@jest/core@30.3.0(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3))': + '@jest/core@30.3.0(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3))': dependencies: '@jest/console': 30.3.0 '@jest/pattern': 30.0.1 @@ -15444,14 +14001,14 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 4.4.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.3.0 - jest-config: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + jest-config: 30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) jest-haste-map: 30.3.0 jest-message-util: 30.3.0 jest-regex-util: 30.0.1 @@ -15471,11 +14028,9 @@ snapshots: - supports-color - ts-node - '@jest/create-cache-key-function@30.2.0': + '@jest/create-cache-key-function@30.3.0': dependencies: - '@jest/types': 30.2.0 - - '@jest/diff-sequences@30.0.1': {} + '@jest/types': 30.3.0 '@jest/diff-sequences@30.3.0': {} @@ -15483,13 +14038,9 @@ snapshots: dependencies: '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 jest-mock: 30.3.0 - '@jest/expect-utils@30.2.0': - dependencies: - '@jest/get-type': 30.1.0 - '@jest/expect-utils@30.3.0': dependencies: '@jest/get-type': 30.1.0 @@ -15504,8 +14055,8 @@ snapshots: '@jest/fake-timers@30.3.0': dependencies: '@jest/types': 30.3.0 - '@sinonjs/fake-timers': 15.3.0 - '@types/node': 25.5.0 + '@sinonjs/fake-timers': 15.3.2 + '@types/node': 25.6.0 jest-message-util: 30.3.0 jest-mock: 30.3.0 jest-util: 30.3.0 @@ -15523,7 +14074,7 @@ snapshots: '@jest/pattern@30.0.1': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 jest-regex-util: 30.0.1 '@jest/reporters@30.3.0': @@ -15534,7 +14085,7 @@ snapshots: '@jest/transform': 30.3.0 '@jest/types': 30.3.0 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 25.5.0 + '@types/node': 25.6.0 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit-x: 0.2.2 @@ -15556,7 +14107,7 @@ snapshots: '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.48 + '@sinclair/typebox': 0.34.49 '@jest/snapshot-utils@30.3.0': dependencies: @@ -15604,23 +14155,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/types@30.2.0': - dependencies: - '@jest/pattern': 30.0.1 - '@jest/schemas': 30.0.5 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 25.5.0 - '@types/yargs': 17.0.35 - chalk: 4.1.2 - '@jest/types@30.3.0': dependencies: '@jest/pattern': 30.0.1 '@jest/schemas': 30.0.5 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -15636,12 +14177,6 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - optional: true - '@jridgewell/sourcemap-codec@1.5.5': {} '@jridgewell/trace-mapping@0.3.31': @@ -15736,12 +14271,48 @@ snapshots: '@lancedb/lancedb-win32-arm64-msvc': 0.27.2 '@lancedb/lancedb-win32-x64-msvc': 0.27.2 - '@langchain/langgraph-checkpoint@0.1.1(@langchain/core@libs+langchain-core)': + '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0))': dependencies: + '@babel/code-frame': 7.29.0 + '@hono/node-server': 2.0.0(hono@4.12.14) + '@hono/node-ws': 1.3.0(@hono/node-server@2.0.0(hono@4.12.14))(bufferutil@4.1.0)(hono@4.12.14) + '@hono/zod-validator': 0.7.6(hono@4.12.14)(zod@4.3.6) '@langchain/core': link:libs/langchain-core + '@langchain/langgraph': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@libs+langchain-core) + '@langchain/langgraph-ui': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8 + '@langchain/protocol': 0.0.12 + '@types/json-schema': 7.0.15 + '@typescript/vfs': 1.6.4(typescript@5.8.3) + dedent: 1.7.2 + dotenv: 16.6.1 + exit-hook: 4.0.0 + hono: 4.12.14 + langsmith: 0.5.21(@opentelemetry/api@1.9.1)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)) + open: 10.2.0 + semver: 7.7.4 + stacktrace-parser: 0.1.11 + superjson: 2.2.6 + tsx: 4.21.0 + typescript: 5.8.3 uuid: 10.0.0 + winston: 3.19.0 + winston-console-format: 1.0.8 + zod: 4.3.6 + optionalDependencies: + '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + transitivePeerDependencies: + - '@opentelemetry/api' + - '@opentelemetry/exporter-trace-otlp-proto' + - '@opentelemetry/sdk-trace-base' + - babel-plugin-macros + - bufferutil + - openai + - supports-color + - utf-8-validate + - ws - '@langchain/langgraph-checkpoint@1.0.0(@langchain/core@libs+langchain-core)': + '@langchain/langgraph-checkpoint@0.1.1(@langchain/core@libs+langchain-core)': dependencies: '@langchain/core': link:libs/langchain-core uuid: 10.0.0 @@ -15751,7 +14322,12 @@ snapshots: '@langchain/core': link:libs/langchain-core uuid: 10.0.0 - '@langchain/langgraph-sdk@0.1.10(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)': + '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8(@langchain/core@libs+langchain-core)': + dependencies: + '@langchain/core': link:libs/langchain-core + uuid: 10.0.0 + + '@langchain/langgraph-sdk@0.1.10(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@types/json-schema': 7.0.15 p-queue: 6.6.2 @@ -15759,10 +14335,10 @@ snapshots: uuid: 9.0.1 optionalDependencies: '@langchain/core': link:libs/langchain-core - react: 19.0.0 - react-dom: 19.2.4(react@19.0.0) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-sdk@1.6.0(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)': + '@langchain/langgraph-sdk@1.8.10(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@types/json-schema': 7.0.15 p-queue: 9.1.2 @@ -15770,38 +14346,59 @@ snapshots: uuid: 13.0.0 optionalDependencies: '@langchain/core': link:libs/langchain-core - react: 19.0.0 - react-dom: 19.2.4(react@19.0.0) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-sdk@1.8.9(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)': + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: + '@langchain/core': link:libs/langchain-core + '@langchain/protocol': 0.0.12 '@types/json-schema': 7.0.15 p-queue: 9.1.2 p-retry: 7.1.1 uuid: 13.0.0 optionalDependencies: - '@langchain/core': link:libs/langchain-core - react: 19.0.0 - react-dom: 19.2.4(react@19.0.0) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph@1.0.0-alpha.5(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/langgraph-checkpoint': 0.1.1(@langchain/core@libs+langchain-core) - '@langchain/langgraph-sdk': 0.1.10(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0) - uuid: 10.0.0 - zod: 4.3.6 - optionalDependencies: - zod-to-json-schema: 3.25.2(zod@4.3.6) + '@langchain/protocol': 0.0.12 + '@types/json-schema': 7.0.15 + p-queue: 9.1.2 + p-retry: 7.1.1 + uuid: 13.0.0 + optionalDependencies: + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + + '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8': + dependencies: + '@commander-js/extra-typings': 13.1.0(commander@13.1.0) + commander: 13.1.0 + esbuild: 0.28.0 + esbuild-plugin-tailwindcss: 2.2.0 + zod: 4.3.6 + + '@langchain/langgraph@1.0.0-alpha.5(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': + dependencies: + '@langchain/core': link:libs/langchain-core + '@langchain/langgraph-checkpoint': 0.1.1(@langchain/core@libs+langchain-core) + '@langchain/langgraph-sdk': 0.1.10(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + uuid: 10.0.0 + zod: 4.3.6 + optionalDependencies: + zod-to-json-schema: 3.25.2(zod@4.3.6) transitivePeerDependencies: - react - react-dom - '@langchain/langgraph@1.1.4(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': + '@langchain/langgraph@1.2.9(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/langgraph-checkpoint': 1.0.0(@langchain/core@libs+langchain-core) - '@langchain/langgraph-sdk': 1.6.0(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0) + '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@libs+langchain-core) + '@langchain/langgraph-sdk': 1.8.10(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@standard-schema/spec': 1.1.0 uuid: 10.0.0 zod: 4.3.6 @@ -15810,12 +14407,15 @@ snapshots: transitivePeerDependencies: - react - react-dom + - svelte + - vue - '@langchain/langgraph@1.2.9(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': + '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@libs+langchain-core) - '@langchain/langgraph-sdk': 1.8.9(@langchain/core@libs+langchain-core)(react-dom@19.2.4(react@19.0.0))(react@19.0.0) + '@langchain/langgraph-checkpoint': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8(@langchain/core@libs+langchain-core) + '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@langchain/protocol': 0.0.12 '@standard-schema/spec': 1.1.0 uuid: 10.0.0 zod: 4.3.6 @@ -15838,9 +14438,11 @@ snapshots: - encoding - ws + '@langchain/protocol@0.0.12': {} + '@layerup/layerup-security@1.6.0(encoding@0.1.13)(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6)': dependencies: - axios: 1.15.0(debug@4.4.3) + axios: 1.15.2(debug@4.4.3) openai: 4.104.0(encoding@0.1.13)(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6) transitivePeerDependencies: - debug @@ -15850,7 +14452,7 @@ snapshots: '@layerup/layerup-security@1.6.0(encoding@0.1.13)(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6)': dependencies: - axios: 1.15.0(debug@4.4.3) + axios: 1.15.2(debug@4.4.3) openai: 4.104.0(encoding@0.1.13)(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) transitivePeerDependencies: - debug @@ -15871,22 +14473,13 @@ snapshots: '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.28.6 + '@babel/runtime': 7.29.2 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - '@mistralai/mistralai@1.14.0(bufferutil@4.1.0)': - dependencies: - ws: 8.19.0(bufferutil@4.1.0) - zod: 4.3.6 - zod-to-json-schema: 3.25.2(zod@4.3.6) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - '@mistralai/mistralai@1.15.1(bufferutil@4.1.0)': dependencies: ws: 8.20.0(bufferutil@4.1.0) @@ -15898,18 +14491,18 @@ snapshots: '@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6)': dependencies: - '@hono/node-server': 1.19.11(hono@4.12.8) + '@hono/node-server': 2.0.0(hono@4.12.14) ajv: 8.18.0 ajv-formats: 3.0.1(ajv@8.18.0) content-type: 1.0.5 cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 - eventsource-parser: 3.0.6 + eventsource-parser: 3.0.8 express: 5.2.1 - express-rate-limit: 8.3.1(express@5.2.1) - hono: 4.12.8 - jose: 6.1.3 + express-rate-limit: 8.3.2(express@5.2.1) + hono: 4.12.14 + jose: 6.2.2 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 @@ -15920,24 +14513,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@mongodb-js/saslprep@1.4.5': + '@mongodb-js/saslprep@1.4.8': dependencies: sparse-bitfield: 3.0.3 '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 '@tybys/wasm-util': 0.10.1 optional: true - '@napi-rs/wasm-runtime@1.1.1': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 '@tybys/wasm-util': 0.10.1 optional: true + '@nodable/entities@2.1.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -15954,57 +14549,38 @@ snapshots: dependencies: lodash: 4.18.1 - '@npmcli/agent@4.0.0': - dependencies: - agent-base: 7.1.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 11.3.5 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - optional: true - '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 semver: 7.7.4 optional: true - '@npmcli/fs@5.0.0': - dependencies: - semver: 7.7.4 - optional: true - '@npmcli/move-file@1.1.2': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 optional: true - '@npmcli/redact@4.0.0': - optional: true - '@octokit/auth-token@6.0.0': {} '@octokit/core@7.0.6': dependencies: '@octokit/auth-token': 6.0.0 '@octokit/graphql': 9.0.3 - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 before-after-hook: 4.0.0 universal-user-agent: 7.0.3 - '@octokit/endpoint@11.0.2': + '@octokit/endpoint@11.0.3': dependencies: '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 '@octokit/graphql@9.0.3': dependencies: - '@octokit/request': 10.0.7 + '@octokit/request': 10.0.8 '@octokit/types': 16.0.0 universal-user-agent: 7.0.3 @@ -16028,12 +14604,13 @@ snapshots: dependencies: '@octokit/types': 16.0.0 - '@octokit/request@10.0.7': + '@octokit/request@10.0.8': dependencies: - '@octokit/endpoint': 11.0.2 + '@octokit/endpoint': 11.0.3 '@octokit/request-error': 7.1.0 '@octokit/types': 16.0.0 fast-content-type-parse: 3.0.0 + json-with-bigint: 3.5.8 universal-user-agent: 7.0.3 '@octokit/rest@22.0.1': @@ -16071,16 +14648,16 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@opentelemetry/core@2.5.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.39.0 + '@opentelemetry/api@1.9.1': {} - '@opentelemetry/semantic-conventions@1.39.0': {} + '@opentelemetry/core@2.7.0(@opentelemetry/api@1.9.1)': + dependencies: + '@opentelemetry/api': 1.9.1 + '@opentelemetry/semantic-conventions': 1.40.0 - '@oxc-project/types@0.113.0': {} + '@opentelemetry/semantic-conventions@1.40.0': {} - '@oxc-project/types@0.122.0': {} + '@oxc-project/types@0.126.0': {} '@oxfmt/binding-android-arm-eabi@0.43.0': optional: true @@ -16139,61 +14716,61 @@ snapshots: '@oxfmt/binding-win32-x64-msvc@0.43.0': optional: true - '@oxlint/binding-android-arm-eabi@1.58.0': + '@oxlint/binding-android-arm-eabi@1.61.0': optional: true - '@oxlint/binding-android-arm64@1.58.0': + '@oxlint/binding-android-arm64@1.61.0': optional: true - '@oxlint/binding-darwin-arm64@1.58.0': + '@oxlint/binding-darwin-arm64@1.61.0': optional: true - '@oxlint/binding-darwin-x64@1.58.0': + '@oxlint/binding-darwin-x64@1.61.0': optional: true - '@oxlint/binding-freebsd-x64@1.58.0': + '@oxlint/binding-freebsd-x64@1.61.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.58.0': + '@oxlint/binding-linux-arm-gnueabihf@1.61.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.58.0': + '@oxlint/binding-linux-arm-musleabihf@1.61.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.58.0': + '@oxlint/binding-linux-arm64-gnu@1.61.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.58.0': + '@oxlint/binding-linux-arm64-musl@1.61.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.58.0': + '@oxlint/binding-linux-ppc64-gnu@1.61.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.58.0': + '@oxlint/binding-linux-riscv64-gnu@1.61.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.58.0': + '@oxlint/binding-linux-riscv64-musl@1.61.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.58.0': + '@oxlint/binding-linux-s390x-gnu@1.61.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.58.0': + '@oxlint/binding-linux-x64-gnu@1.61.0': optional: true - '@oxlint/binding-linux-x64-musl@1.58.0': + '@oxlint/binding-linux-x64-musl@1.61.0': optional: true - '@oxlint/binding-openharmony-arm64@1.58.0': + '@oxlint/binding-openharmony-arm64@1.61.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.58.0': + '@oxlint/binding-win32-arm64-msvc@1.61.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.58.0': + '@oxlint/binding-win32-ia32-msvc@1.61.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.58.0': + '@oxlint/binding-win32-x64-msvc@1.61.0': optional: true '@peggyjs/from-mem@3.1.3': @@ -16206,7 +14783,7 @@ snapshots: '@pinecone-database/pinecone@5.1.2': {} - '@pinecone-database/pinecone@7.1.0': {} + '@pinecone-database/pinecone@7.2.0': {} '@pinojs/redact@0.4.0': {} @@ -16217,11 +14794,11 @@ snapshots: '@planetscale/database@1.20.1': {} - '@playwright/test@1.58.2': + '@playwright/test@1.59.1': dependencies: - playwright: 1.58.2 + playwright: 1.59.1 - '@prisma/client-runtime-utils@7.6.0': {} + '@prisma/client-runtime-utils@7.7.0': {} '@prisma/client@4.16.2(prisma@4.16.2)': dependencies: @@ -16229,14 +14806,14 @@ snapshots: optionalDependencies: prisma: 4.16.2 - '@prisma/client@7.6.0(prisma@7.6.0(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(typescript@6.0.2))(typescript@6.0.2)': + '@prisma/client@7.7.0(prisma@7.7.0(@types/react@19.2.14)(better-sqlite3@12.9.0)(magicast@0.3.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@6.0.3))(typescript@6.0.3)': dependencies: - '@prisma/client-runtime-utils': 7.6.0 + '@prisma/client-runtime-utils': 7.7.0 optionalDependencies: - prisma: 7.6.0(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(typescript@6.0.2) - typescript: 6.0.2 + prisma: 7.7.0(@types/react@19.2.14)(better-sqlite3@12.9.0)(magicast@0.3.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@6.0.3) + typescript: 6.0.3 - '@prisma/config@7.6.0(magicast@0.3.5)': + '@prisma/config@7.7.0(magicast@0.3.5)': dependencies: c12: 3.1.0(magicast@0.3.5) deepmerge-ts: 7.1.5 @@ -16247,26 +14824,26 @@ snapshots: '@prisma/debug@7.2.0': {} - '@prisma/debug@7.6.0': {} + '@prisma/debug@7.7.0': {} - '@prisma/dev@0.24.3(typescript@6.0.2)': + '@prisma/dev@0.24.3(typescript@6.0.3)': dependencies: '@electric-sql/pglite': 0.4.1 '@electric-sql/pglite-socket': 0.1.1(@electric-sql/pglite@0.4.1) '@electric-sql/pglite-tools': 0.3.1(@electric-sql/pglite@0.4.1) - '@hono/node-server': 1.19.11(hono@4.12.8) + '@hono/node-server': 2.0.0(hono@4.12.14) '@prisma/get-platform': 7.2.0 '@prisma/query-plan-executor': 7.2.0 '@prisma/streams-local': 0.1.2 foreground-child: 3.3.1 get-port-please: 3.2.0 - hono: 4.12.8 + hono: 4.12.14 http-status-codes: 2.3.0 pathe: 2.0.3 proper-lockfile: 4.1.2 remeda: 2.33.4 std-env: 3.10.0 - valibot: 1.2.0(typescript@6.0.2) + valibot: 1.2.0(typescript@6.0.3) zeptomatch: 2.1.0 transitivePeerDependencies: - typescript @@ -16277,43 +14854,43 @@ snapshots: '@prisma/engines@4.16.2': {} - '@prisma/engines@7.6.0': + '@prisma/engines@7.7.0': dependencies: - '@prisma/debug': 7.6.0 + '@prisma/debug': 7.7.0 '@prisma/engines-version': 7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711 - '@prisma/fetch-engine': 7.6.0 - '@prisma/get-platform': 7.6.0 + '@prisma/fetch-engine': 7.7.0 + '@prisma/get-platform': 7.7.0 - '@prisma/fetch-engine@7.6.0': + '@prisma/fetch-engine@7.7.0': dependencies: - '@prisma/debug': 7.6.0 + '@prisma/debug': 7.7.0 '@prisma/engines-version': 7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711 - '@prisma/get-platform': 7.6.0 + '@prisma/get-platform': 7.7.0 '@prisma/get-platform@7.2.0': dependencies: '@prisma/debug': 7.2.0 - '@prisma/get-platform@7.6.0': + '@prisma/get-platform@7.7.0': dependencies: - '@prisma/debug': 7.6.0 + '@prisma/debug': 7.7.0 '@prisma/query-plan-executor@7.2.0': {} '@prisma/streams-local@0.1.2': dependencies: ajv: 8.18.0 - better-result: 2.8.0 + better-result: 2.8.2 env-paths: 3.0.0 proper-lockfile: 4.1.2 - '@prisma/studio-core@0.27.3(@types/react@19.2.14)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)': + '@prisma/studio-core@0.27.3(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-toggle': 1.1.10(@types/react@19.2.14)(react-dom@19.2.4(react@19.0.0))(react@19.0.0) + '@radix-ui/react-toggle': 1.1.10(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@types/react': 19.2.14 chart.js: 4.5.1 - react: 19.0.0 - react-dom: 19.2.4(react@19.0.0) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) transitivePeerDependencies: - '@types/react-dom' @@ -16349,7 +14926,7 @@ snapshots: progress: 2.0.3 proxy-agent: 6.5.0 semver: 7.7.4 - tar-fs: 3.1.1 + tar-fs: 3.1.2 unbzip2-stream: 1.4.3 yargs: 17.7.2 transitivePeerDependencies: @@ -16359,23 +14936,17 @@ snapshots: - supports-color optional: true - '@qdrant/js-client-rest@1.16.2(typescript@5.8.3)': - dependencies: - '@qdrant/openapi-typescript-fetch': 1.2.6 - typescript: 5.8.3 - undici: 7.24.5 - '@qdrant/js-client-rest@1.17.0(typescript@5.8.3)': dependencies: '@qdrant/openapi-typescript-fetch': 1.2.6 typescript: 5.8.3 - undici: 7.24.5 + undici: 8.1.0 - '@qdrant/js-client-rest@1.17.0(typescript@6.0.2)': + '@qdrant/js-client-rest@1.17.0(typescript@6.0.3)': dependencies: '@qdrant/openapi-typescript-fetch': 1.2.6 - typescript: 6.0.2 - undici: 7.24.5 + typescript: 6.0.3 + undici: 8.1.0 '@qdrant/openapi-typescript-fetch@1.2.6': {} @@ -16385,55 +14956,55 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.0.0)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.0.0 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-primitive@2.1.3(@types/react@19.2.14)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-primitive@2.1.3(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.0.0) - react: 19.0.0 - react-dom: 19.2.4(react@19.0.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.0.0)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-toggle@1.1.10(@types/react@19.2.14)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)': + '@radix-ui/react-toggle@1.1.10(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react@19.2.14)(react-dom@19.2.4(react@19.0.0))(react@19.0.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.0.0) - react: 19.0.0 - react-dom: 19.2.4(react@19.0.0) + '@radix-ui/react-primitive': 2.1.3(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.0.0)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.0.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.5) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.0.0)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.5)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.0.0) - react: 19.0.0 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.0.0)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.5)': dependencies: - react: 19.0.0 + react: 19.2.5 optionalDependencies: '@types/react': 19.2.14 @@ -16441,9 +15012,9 @@ snapshots: dependencies: '@redis/client': 1.6.1 - '@redis/bloom@5.11.0(@redis/client@5.11.0)': + '@redis/bloom@5.12.1(@redis/client@5.12.1(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 5.11.0 + '@redis/client': 5.12.1(@opentelemetry/api@1.9.1) '@redis/client@1.6.1': dependencies: @@ -16451,9 +15022,11 @@ snapshots: generic-pool: 3.9.0 yallist: 4.0.0 - '@redis/client@5.11.0': + '@redis/client@5.12.1(@opentelemetry/api@1.9.1)': dependencies: cluster-key-slot: 1.1.2 + optionalDependencies: + '@opentelemetry/api': 1.9.1 '@redis/graph@1.1.1(@redis/client@1.6.1)': dependencies: @@ -16463,25 +15036,25 @@ snapshots: dependencies: '@redis/client': 1.6.1 - '@redis/json@5.11.0(@redis/client@5.11.0)': + '@redis/json@5.12.1(@redis/client@5.12.1(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 5.11.0 + '@redis/client': 5.12.1(@opentelemetry/api@1.9.1) '@redis/search@1.2.0(@redis/client@1.6.1)': dependencies: '@redis/client': 1.6.1 - '@redis/search@5.11.0(@redis/client@5.11.0)': + '@redis/search@5.12.1(@redis/client@5.12.1(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 5.11.0 + '@redis/client': 5.12.1(@opentelemetry/api@1.9.1) '@redis/time-series@1.1.0(@redis/client@1.6.1)': dependencies: '@redis/client': 1.6.1 - '@redis/time-series@5.11.0(@redis/client@5.11.0)': + '@redis/time-series@5.12.1(@redis/client@5.12.1(@opentelemetry/api@1.9.1))': dependencies: - '@redis/client': 5.11.0 + '@redis/client': 5.12.1(@opentelemetry/api@1.9.1) '@rockset/client@0.9.2(encoding@0.1.13)': dependencies: @@ -16492,212 +15065,168 @@ snapshots: transitivePeerDependencies: - encoding - '@rolldown/binding-android-arm64@1.0.0-rc.12': - optional: true - - '@rolldown/binding-android-arm64@1.0.0-rc.4': + '@rolldown/binding-android-arm64@1.0.0-rc.16': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.12': + '@rolldown/binding-darwin-arm64@1.0.0-rc.16': optional: true '@rolldown/binding-darwin-arm64@1.0.0-rc.18': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-rc.4': - optional: true - - '@rolldown/binding-darwin-x64@1.0.0-rc.12': + '@rolldown/binding-darwin-x64@1.0.0-rc.16': optional: true '@rolldown/binding-darwin-x64@1.0.0-rc.18': optional: true - '@rolldown/binding-darwin-x64@1.0.0-rc.4': + '@rolldown/binding-freebsd-x64@1.0.0-rc.16': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.12': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.16': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-rc.4': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.12': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.4': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.16': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.4': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-arm64-musl@1.0.0-rc.16': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-rc.4': - optional: true - - '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.16': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.12': + '@rolldown/binding-linux-x64-gnu@1.0.0-rc.16': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-rc.4': - optional: true - - '@rolldown/binding-linux-x64-musl@1.0.0-rc.12': + '@rolldown/binding-linux-x64-musl@1.0.0-rc.16': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-rc.18': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-rc.4': - optional: true - - '@rolldown/binding-openharmony-arm64@1.0.0-rc.12': + '@rolldown/binding-openharmony-arm64@1.0.0-rc.16': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-rc.4': - optional: true - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.12': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - - '@rolldown/binding-wasm32-wasi@1.0.0-rc.4': + '@rolldown/binding-wasm32-wasi@1.0.0-rc.16': dependencies: - '@napi-rs/wasm-runtime': 1.1.1 + '@emnapi/core': 1.9.2 + '@emnapi/runtime': 1.9.2 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.16': optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.18': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.4': - optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.52': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.12': + '@rolldown/binding-win32-x64-msvc@1.0.0-rc.16': optional: true '@rolldown/binding-win32-x64-msvc@1.0.0-rc.18': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-rc.4': - optional: true - - '@rolldown/pluginutils@1.0.0-rc.12': {} - - '@rolldown/pluginutils@1.0.0-rc.4': {} + '@rolldown/pluginutils@1.0.0-rc.16': {} - '@rollup/rollup-android-arm-eabi@4.59.0': + '@rollup/rollup-android-arm-eabi@4.60.2': optional: true - '@rollup/rollup-android-arm64@4.59.0': + '@rollup/rollup-android-arm64@4.60.2': optional: true - '@rollup/rollup-darwin-arm64@4.59.0': + '@rollup/rollup-darwin-arm64@4.60.2': optional: true - '@rollup/rollup-darwin-x64@4.59.0': + '@rollup/rollup-darwin-x64@4.60.2': optional: true - '@rollup/rollup-freebsd-arm64@4.59.0': + '@rollup/rollup-freebsd-arm64@4.60.2': optional: true - '@rollup/rollup-freebsd-x64@4.59.0': + '@rollup/rollup-freebsd-x64@4.60.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.59.0': + '@rollup/rollup-linux-arm-gnueabihf@4.60.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.59.0': + '@rollup/rollup-linux-arm-musleabihf@4.60.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.59.0': + '@rollup/rollup-linux-arm64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.59.0': + '@rollup/rollup-linux-arm64-musl@4.60.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.59.0': + '@rollup/rollup-linux-loong64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-loong64-musl@4.59.0': + '@rollup/rollup-linux-loong64-musl@4.60.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.59.0': + '@rollup/rollup-linux-ppc64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-ppc64-musl@4.59.0': + '@rollup/rollup-linux-ppc64-musl@4.60.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.59.0': + '@rollup/rollup-linux-riscv64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.59.0': + '@rollup/rollup-linux-riscv64-musl@4.60.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.59.0': + '@rollup/rollup-linux-s390x-gnu@4.60.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.59.0': + '@rollup/rollup-linux-x64-gnu@4.60.2': optional: true - '@rollup/rollup-linux-x64-musl@4.59.0': + '@rollup/rollup-linux-x64-musl@4.60.2': optional: true - '@rollup/rollup-openbsd-x64@4.59.0': + '@rollup/rollup-openbsd-x64@4.60.2': optional: true - '@rollup/rollup-openharmony-arm64@4.59.0': + '@rollup/rollup-openharmony-arm64@4.60.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.59.0': + '@rollup/rollup-win32-arm64-msvc@4.60.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.59.0': + '@rollup/rollup-win32-ia32-msvc@4.60.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.59.0': + '@rollup/rollup-win32-x64-gnu@4.60.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.59.0': + '@rollup/rollup-win32-x64-msvc@4.60.2': optional: true '@sec-ant/readable-stream@0.4.1': {} - '@simple-libs/child-process-utils@1.0.1': + '@simple-libs/child-process-utils@1.0.2': dependencies: - '@simple-libs/stream-utils': 1.1.0 - '@types/node': 22.19.15 + '@simple-libs/stream-utils': 1.2.0 - '@simple-libs/stream-utils@1.1.0': - dependencies: - '@types/node': 22.19.15 + '@simple-libs/stream-utils@1.2.0': {} - '@sinclair/typebox@0.34.48': {} + '@sinclair/typebox@0.34.49': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -16705,15 +15234,10 @@ snapshots: dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@15.3.0': + '@sinonjs/fake-timers@15.3.2': dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.2.11': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - '@smithy/chunked-blob-reader-native@4.2.3': dependencies: '@smithy/util-base64': 4.3.2 @@ -16723,508 +15247,228 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.4.10': - dependencies: - '@smithy/node-config-provider': 4.3.11 - '@smithy/types': 4.13.1 - '@smithy/util-config-provider': 4.2.2 - '@smithy/util-endpoints': 3.3.2 - '@smithy/util-middleware': 4.2.11 - tslib: 2.8.1 - - '@smithy/config-resolver@4.4.13': + '@smithy/config-resolver@4.4.17': dependencies: - '@smithy/node-config-provider': 4.3.12 - '@smithy/types': 4.13.1 + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 '@smithy/util-config-provider': 4.2.2 - '@smithy/util-endpoints': 3.3.3 - '@smithy/util-middleware': 4.2.12 + '@smithy/util-endpoints': 3.4.2 + '@smithy/util-middleware': 4.2.14 tslib: 2.8.1 - '@smithy/config-resolver@4.4.6': + '@smithy/core@3.23.16': dependencies: - '@smithy/node-config-provider': 4.3.8 - '@smithy/types': 4.13.1 - '@smithy/util-config-provider': 4.2.0 - '@smithy/util-endpoints': 3.2.8 - '@smithy/util-middleware': 4.2.8 - tslib: 2.8.1 - - '@smithy/core@3.22.1': - dependencies: - '@smithy/middleware-serde': 4.2.12 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-stream': 4.5.17 - '@smithy/util-utf8': 4.2.2 - '@smithy/uuid': 1.1.0 - tslib: 2.8.1 - - '@smithy/core@3.23.13': - dependencies: - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.12 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 '@smithy/util-base64': 4.3.2 '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-stream': 4.5.21 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-stream': 4.5.24 '@smithy/util-utf8': 4.2.2 '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/core@3.23.9': + '@smithy/credential-provider-imds@4.2.14': dependencies: - '@smithy/middleware-serde': 4.2.12 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - '@smithy/util-base64': 4.3.2 - '@smithy/util-body-length-browser': 4.2.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-stream': 4.5.17 - '@smithy/util-utf8': 4.2.2 - '@smithy/uuid': 1.1.2 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.11': - dependencies: - '@smithy/node-config-provider': 4.3.11 - '@smithy/property-provider': 4.2.11 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 - tslib: 2.8.1 - - '@smithy/credential-provider-imds@4.2.12': - dependencies: - '@smithy/node-config-provider': 4.3.12 - '@smithy/property-provider': 4.2.12 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.12 - tslib: 2.8.1 - - '@smithy/credential-provider-imds@4.2.8': - dependencies: - '@smithy/node-config-provider': 4.3.11 - '@smithy/property-provider': 4.2.11 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 - tslib: 2.8.1 - - '@smithy/eventstream-codec@4.2.11': - dependencies: - '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.13.1 - '@smithy/util-hex-encoding': 4.2.2 - tslib: 2.8.1 - - '@smithy/eventstream-codec@4.2.12': + '@smithy/eventstream-codec@4.2.14': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 '@smithy/util-hex-encoding': 4.2.2 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.11': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/eventstream-serde-browser@4.2.12': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/eventstream-serde-config-resolver@4.3.11': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/eventstream-serde-config-resolver@4.3.12': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.2.11': - dependencies: - '@smithy/eventstream-serde-universal': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/eventstream-serde-node@4.2.12': + '@smithy/eventstream-serde-browser@4.2.14': dependencies: - '@smithy/eventstream-serde-universal': 4.2.12 - '@smithy/types': 4.13.1 + '@smithy/eventstream-serde-universal': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.11': + '@smithy/eventstream-serde-config-resolver@4.3.14': dependencies: - '@smithy/eventstream-codec': 4.2.11 - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.12': + '@smithy/eventstream-serde-node@4.2.14': dependencies: - '@smithy/eventstream-codec': 4.2.12 - '@smithy/types': 4.13.1 + '@smithy/eventstream-serde-universal': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.13': + '@smithy/eventstream-serde-universal@4.2.14': dependencies: - '@smithy/protocol-http': 5.3.11 - '@smithy/querystring-builder': 4.2.11 - '@smithy/types': 4.13.1 - '@smithy/util-base64': 4.3.2 + '@smithy/eventstream-codec': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.15': + '@smithy/fetch-http-handler@5.3.17': dependencies: - '@smithy/protocol-http': 5.3.12 - '@smithy/querystring-builder': 4.2.12 - '@smithy/types': 4.13.1 + '@smithy/protocol-http': 5.3.14 + '@smithy/querystring-builder': 4.2.14 + '@smithy/types': 4.14.1 '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.2.13': + '@smithy/hash-blob-browser@4.2.15': dependencies: '@smithy/chunked-blob-reader': 5.2.2 '@smithy/chunked-blob-reader-native': 4.2.3 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/hash-node@4.2.11': - dependencies: - '@smithy/types': 4.13.1 - '@smithy/util-buffer-from': 4.2.2 - '@smithy/util-utf8': 4.2.2 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/hash-node@4.2.12': + '@smithy/hash-node@4.2.14': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 '@smithy/util-buffer-from': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/hash-node@4.2.8': + '@smithy/hash-stream-node@4.2.14': dependencies: - '@smithy/types': 4.13.1 - '@smithy/util-buffer-from': 4.2.0 + '@smithy/types': 4.14.1 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/hash-stream-node@4.2.12': + '@smithy/invalid-dependency@4.2.14': dependencies: - '@smithy/types': 4.13.1 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.2.11': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.2.12': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/invalid-dependency@4.2.8': - dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.0': - dependencies: - tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.2.12': + '@smithy/md5-js@4.2.14': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.11': - dependencies: - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/middleware-content-length@4.2.12': - dependencies: - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.4.23': - dependencies: - '@smithy/core': 3.23.9 - '@smithy/middleware-serde': 4.2.12 - '@smithy/node-config-provider': 4.3.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.11 - '@smithy/util-middleware': 4.2.11 - tslib: 2.8.1 - - '@smithy/middleware-endpoint@4.4.28': + '@smithy/middleware-content-length@4.2.14': dependencies: - '@smithy/core': 3.23.13 - '@smithy/middleware-serde': 4.2.16 - '@smithy/node-config-provider': 4.3.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 - '@smithy/url-parser': 4.2.12 - '@smithy/util-middleware': 4.2.12 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.40': + '@smithy/middleware-endpoint@4.4.31': dependencies: - '@smithy/node-config-provider': 4.3.11 - '@smithy/protocol-http': 5.3.11 - '@smithy/service-error-classification': 4.2.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-retry': 4.2.11 - '@smithy/uuid': 1.1.2 + '@smithy/core': 3.23.16 + '@smithy/middleware-serde': 4.2.19 + '@smithy/node-config-provider': 4.3.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 + '@smithy/url-parser': 4.2.14 + '@smithy/util-middleware': 4.2.14 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.46': + '@smithy/middleware-retry@4.5.4': dependencies: - '@smithy/node-config-provider': 4.3.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/service-error-classification': 4.2.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 - '@smithy/util-middleware': 4.2.12 - '@smithy/util-retry': 4.2.13 + '@smithy/core': 3.23.16 + '@smithy/node-config-provider': 4.3.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/service-error-classification': 4.3.0 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 + '@smithy/util-middleware': 4.2.14 + '@smithy/util-retry': 4.3.3 '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.12': - dependencies: - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/middleware-serde@4.2.16': - dependencies: - '@smithy/core': 3.23.13 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.2.11': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/middleware-stack@4.2.12': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.3.11': - dependencies: - '@smithy/property-provider': 4.2.11 - '@smithy/shared-ini-file-loader': 4.4.6 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.3.12': - dependencies: - '@smithy/property-provider': 4.2.12 - '@smithy/shared-ini-file-loader': 4.4.7 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/node-config-provider@4.3.8': - dependencies: - '@smithy/property-provider': 4.2.8 - '@smithy/shared-ini-file-loader': 4.4.3 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.4.14': - dependencies: - '@smithy/abort-controller': 4.2.11 - '@smithy/protocol-http': 5.3.11 - '@smithy/querystring-builder': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/node-http-handler@4.5.1': - dependencies: - '@smithy/protocol-http': 5.3.12 - '@smithy/querystring-builder': 4.2.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/property-provider@4.2.11': + '@smithy/middleware-serde@4.2.19': dependencies: - '@smithy/types': 4.13.1 + '@smithy/core': 3.23.16 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/property-provider@4.2.12': + '@smithy/middleware-stack@4.2.14': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/property-provider@4.2.8': + '@smithy/node-config-provider@4.3.14': dependencies: - '@smithy/types': 4.13.1 + '@smithy/property-provider': 4.2.14 + '@smithy/shared-ini-file-loader': 4.4.9 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/protocol-http@5.3.11': + '@smithy/node-http-handler@4.6.0': dependencies: - '@smithy/types': 4.13.1 + '@smithy/protocol-http': 5.3.14 + '@smithy/querystring-builder': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/protocol-http@5.3.12': + '@smithy/property-provider@4.2.14': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/protocol-http@5.3.8': + '@smithy/protocol-http@5.3.14': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.11': + '@smithy/querystring-builder@4.2.14': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 '@smithy/util-uri-escape': 4.2.2 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.12': + '@smithy/querystring-parser@4.2.14': dependencies: - '@smithy/types': 4.13.1 - '@smithy/util-uri-escape': 4.2.2 - tslib: 2.8.1 - - '@smithy/querystring-builder@4.2.8': - dependencies: - '@smithy/types': 4.13.1 - '@smithy/util-uri-escape': 4.2.2 - tslib: 2.8.1 - - '@smithy/querystring-parser@4.2.11': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/querystring-parser@4.2.12': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/service-error-classification@4.2.11': - dependencies: - '@smithy/types': 4.13.1 - - '@smithy/service-error-classification@4.2.12': - dependencies: - '@smithy/types': 4.13.1 - - '@smithy/shared-ini-file-loader@4.4.3': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/shared-ini-file-loader@4.4.6': - dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/shared-ini-file-loader@4.4.7': + '@smithy/service-error-classification@4.3.0': dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 + '@smithy/types': 4.14.1 - '@smithy/signature-v4@5.3.11': + '@smithy/shared-ini-file-loader@4.4.9': dependencies: - '@smithy/is-array-buffer': 4.2.2 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-middleware': 4.2.11 - '@smithy/util-uri-escape': 4.2.2 - '@smithy/util-utf8': 4.2.2 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/signature-v4@5.3.12': + '@smithy/signature-v4@5.3.14': dependencies: '@smithy/is-array-buffer': 4.2.2 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-middleware': 4.2.12 + '@smithy/util-middleware': 4.2.14 '@smithy/util-uri-escape': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/signature-v4@5.3.8': - dependencies: - '@smithy/is-array-buffer': 4.2.0 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-middleware': 4.2.8 - '@smithy/util-uri-escape': 4.2.0 - '@smithy/util-utf8': 4.2.2 - tslib: 2.8.1 - - '@smithy/smithy-client@4.12.3': - dependencies: - '@smithy/core': 3.23.9 - '@smithy/middleware-endpoint': 4.4.23 - '@smithy/middleware-stack': 4.2.11 - '@smithy/protocol-http': 5.3.11 - '@smithy/types': 4.13.1 - '@smithy/util-stream': 4.5.17 - tslib: 2.8.1 - - '@smithy/smithy-client@4.12.8': - dependencies: - '@smithy/core': 3.23.13 - '@smithy/middleware-endpoint': 4.4.28 - '@smithy/middleware-stack': 4.2.12 - '@smithy/protocol-http': 5.3.12 - '@smithy/types': 4.13.1 - '@smithy/util-stream': 4.5.21 - tslib: 2.8.1 - - '@smithy/types@4.12.0': - dependencies: - tslib: 2.8.1 - - '@smithy/types@4.13.1': + '@smithy/smithy-client@4.12.12': dependencies: + '@smithy/core': 3.23.16 + '@smithy/middleware-endpoint': 4.4.31 + '@smithy/middleware-stack': 4.2.14 + '@smithy/protocol-http': 5.3.14 + '@smithy/types': 4.14.1 + '@smithy/util-stream': 4.5.24 tslib: 2.8.1 - '@smithy/url-parser@4.2.11': + '@smithy/types@4.14.1': dependencies: - '@smithy/querystring-parser': 4.2.11 - '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/url-parser@4.2.12': + '@smithy/url-parser@4.2.14': dependencies: - '@smithy/querystring-parser': 4.2.12 - '@smithy/types': 4.13.1 + '@smithy/querystring-parser': 4.2.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 '@smithy/util-base64@4.3.2': @@ -17246,137 +15490,64 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.0': - dependencies: - '@smithy/is-array-buffer': 4.2.2 - tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.2': dependencies: '@smithy/is-array-buffer': 4.2.2 tslib: 2.8.1 - '@smithy/util-config-provider@4.2.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-config-provider@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.39': - dependencies: - '@smithy/property-provider': 4.2.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-browser@4.3.44': - dependencies: - '@smithy/property-provider': 4.2.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.2.42': - dependencies: - '@smithy/config-resolver': 4.4.10 - '@smithy/credential-provider-imds': 4.2.11 - '@smithy/node-config-provider': 4.3.11 - '@smithy/property-provider': 4.2.11 - '@smithy/smithy-client': 4.12.3 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-defaults-mode-node@4.2.48': - dependencies: - '@smithy/config-resolver': 4.4.13 - '@smithy/credential-provider-imds': 4.2.12 - '@smithy/node-config-provider': 4.3.12 - '@smithy/property-provider': 4.2.12 - '@smithy/smithy-client': 4.12.8 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-endpoints@3.2.8': + '@smithy/util-defaults-mode-browser@4.3.48': dependencies: - '@smithy/node-config-provider': 4.3.11 - '@smithy/types': 4.13.1 + '@smithy/property-provider': 4.2.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.3.2': + '@smithy/util-defaults-mode-node@4.2.53': dependencies: - '@smithy/node-config-provider': 4.3.11 - '@smithy/types': 4.13.1 + '@smithy/config-resolver': 4.4.17 + '@smithy/credential-provider-imds': 4.2.14 + '@smithy/node-config-provider': 4.3.14 + '@smithy/property-provider': 4.2.14 + '@smithy/smithy-client': 4.12.12 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.3.3': - dependencies: - '@smithy/node-config-provider': 4.3.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-hex-encoding@4.2.0': + '@smithy/util-endpoints@3.4.2': dependencies: + '@smithy/node-config-provider': 4.3.14 + '@smithy/types': 4.14.1 tslib: 2.8.1 '@smithy/util-hex-encoding@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.2.11': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-middleware@4.2.12': + '@smithy/util-middleware@4.2.14': dependencies: - '@smithy/types': 4.13.1 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-middleware@4.2.8': + '@smithy/util-retry@4.3.3': dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-retry@4.2.11': - dependencies: - '@smithy/service-error-classification': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-retry@4.2.13': - dependencies: - '@smithy/service-error-classification': 4.2.12 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-stream@4.5.17': - dependencies: - '@smithy/fetch-http-handler': 5.3.13 - '@smithy/node-http-handler': 4.4.14 - '@smithy/types': 4.13.1 - '@smithy/util-base64': 4.3.2 - '@smithy/util-buffer-from': 4.2.2 - '@smithy/util-hex-encoding': 4.2.2 - '@smithy/util-utf8': 4.2.2 + '@smithy/service-error-classification': 4.3.0 + '@smithy/types': 4.14.1 tslib: 2.8.1 - '@smithy/util-stream@4.5.21': + '@smithy/util-stream@4.5.24': dependencies: - '@smithy/fetch-http-handler': 5.3.15 - '@smithy/node-http-handler': 4.5.1 - '@smithy/types': 4.13.1 + '@smithy/fetch-http-handler': 5.3.17 + '@smithy/node-http-handler': 4.6.0 + '@smithy/types': 4.14.1 '@smithy/util-base64': 4.3.2 '@smithy/util-buffer-from': 4.2.2 '@smithy/util-hex-encoding': 4.2.2 '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/util-uri-escape@4.2.0': - dependencies: - tslib: 2.8.1 - '@smithy/util-uri-escape@4.2.2': dependencies: tslib: 2.8.1 @@ -17391,19 +15562,9 @@ snapshots: '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 - '@smithy/util-waiter@4.2.11': - dependencies: - '@smithy/abort-controller': 4.2.11 - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/util-waiter@4.2.14': - dependencies: - '@smithy/types': 4.13.1 - tslib: 2.8.1 - - '@smithy/uuid@1.1.0': + '@smithy/util-waiter@4.2.16': dependencies: + '@smithy/types': 4.14.1 tslib: 2.8.1 '@smithy/uuid@1.1.2': @@ -17434,33 +15595,21 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@supabase/auth-js@2.101.1': + '@supabase/auth-js@2.104.0': dependencies: tslib: 2.8.1 - '@supabase/auth-js@2.95.3': - dependencies: - tslib: 2.8.1 - - '@supabase/functions-js@2.101.1': - dependencies: - tslib: 2.8.1 - - '@supabase/functions-js@2.95.3': + '@supabase/functions-js@2.104.0': dependencies: tslib: 2.8.1 '@supabase/phoenix@0.4.0': {} - '@supabase/postgrest-js@2.101.1': + '@supabase/postgrest-js@2.104.0': dependencies: tslib: 2.8.1 - '@supabase/postgrest-js@2.95.3': - dependencies: - tslib: 2.8.1 - - '@supabase/realtime-js@2.101.1(bufferutil@4.1.0)': + '@supabase/realtime-js@2.104.0(bufferutil@4.1.0)': dependencies: '@supabase/phoenix': 0.4.0 '@types/ws': 8.18.1 @@ -17470,116 +15619,87 @@ snapshots: - bufferutil - utf-8-validate - '@supabase/realtime-js@2.95.3(bufferutil@4.1.0)': - dependencies: - '@types/phoenix': 1.6.7 - '@types/ws': 8.18.1 - tslib: 2.8.1 - ws: 8.19.0(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@supabase/storage-js@2.101.1': - dependencies: - iceberg-js: 0.8.1 - tslib: 2.8.1 - - '@supabase/storage-js@2.95.3': - dependencies: - iceberg-js: 0.8.1 - tslib: 2.8.1 - - '@supabase/supabase-js@2.101.1(bufferutil@4.1.0)': - dependencies: - '@supabase/auth-js': 2.101.1 - '@supabase/functions-js': 2.101.1 - '@supabase/postgrest-js': 2.101.1 - '@supabase/realtime-js': 2.101.1(bufferutil@4.1.0) - '@supabase/storage-js': 2.101.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@supabase/supabase-js@2.95.3(bufferutil@4.1.0)': + '@supabase/storage-js@2.104.0': dependencies: - '@supabase/auth-js': 2.95.3 - '@supabase/functions-js': 2.95.3 - '@supabase/postgrest-js': 2.95.3 - '@supabase/realtime-js': 2.95.3(bufferutil@4.1.0) - '@supabase/storage-js': 2.95.3 + iceberg-js: 0.8.1 + tslib: 2.8.1 + + '@supabase/supabase-js@2.104.0(bufferutil@4.1.0)': + dependencies: + '@supabase/auth-js': 2.104.0 + '@supabase/functions-js': 2.104.0 + '@supabase/postgrest-js': 2.104.0 + '@supabase/realtime-js': 2.104.0(bufferutil@4.1.0) + '@supabase/storage-js': 2.104.0 transitivePeerDependencies: - bufferutil - utf-8-validate - '@swc/core-darwin-arm64@1.15.24': + '@swc/core-darwin-arm64@1.15.30': optional: true - '@swc/core-darwin-x64@1.15.24': + '@swc/core-darwin-x64@1.15.30': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.24': + '@swc/core-linux-arm-gnueabihf@1.15.30': optional: true - '@swc/core-linux-arm64-gnu@1.15.24': + '@swc/core-linux-arm64-gnu@1.15.30': optional: true - '@swc/core-linux-arm64-musl@1.15.24': + '@swc/core-linux-arm64-musl@1.15.30': optional: true - '@swc/core-linux-ppc64-gnu@1.15.24': + '@swc/core-linux-ppc64-gnu@1.15.30': optional: true - '@swc/core-linux-s390x-gnu@1.15.24': + '@swc/core-linux-s390x-gnu@1.15.30': optional: true - '@swc/core-linux-x64-gnu@1.15.24': + '@swc/core-linux-x64-gnu@1.15.30': optional: true - '@swc/core-linux-x64-musl@1.15.24': + '@swc/core-linux-x64-musl@1.15.30': optional: true - '@swc/core-win32-arm64-msvc@1.15.24': + '@swc/core-win32-arm64-msvc@1.15.30': optional: true - '@swc/core-win32-ia32-msvc@1.15.24': + '@swc/core-win32-ia32-msvc@1.15.30': optional: true - '@swc/core-win32-x64-msvc@1.15.11': + '@swc/core-win32-x64-msvc@1.15.30': optional: true - '@swc/core-win32-x64-msvc@1.15.24': - optional: true - - '@swc/core@1.15.24(@swc/helpers@0.5.18)': + '@swc/core@1.15.30(@swc/helpers@0.5.21)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.26 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.24 - '@swc/core-darwin-x64': 1.15.24 - '@swc/core-linux-arm-gnueabihf': 1.15.24 - '@swc/core-linux-arm64-gnu': 1.15.24 - '@swc/core-linux-arm64-musl': 1.15.24 - '@swc/core-linux-ppc64-gnu': 1.15.24 - '@swc/core-linux-s390x-gnu': 1.15.24 - '@swc/core-linux-x64-gnu': 1.15.24 - '@swc/core-linux-x64-musl': 1.15.24 - '@swc/core-win32-arm64-msvc': 1.15.24 - '@swc/core-win32-ia32-msvc': 1.15.24 - '@swc/core-win32-x64-msvc': 1.15.24 - '@swc/helpers': 0.5.18 + '@swc/core-darwin-arm64': 1.15.30 + '@swc/core-darwin-x64': 1.15.30 + '@swc/core-linux-arm-gnueabihf': 1.15.30 + '@swc/core-linux-arm64-gnu': 1.15.30 + '@swc/core-linux-arm64-musl': 1.15.30 + '@swc/core-linux-ppc64-gnu': 1.15.30 + '@swc/core-linux-s390x-gnu': 1.15.30 + '@swc/core-linux-x64-gnu': 1.15.30 + '@swc/core-linux-x64-musl': 1.15.30 + '@swc/core-win32-arm64-msvc': 1.15.30 + '@swc/core-win32-ia32-msvc': 1.15.30 + '@swc/core-win32-x64-msvc': 1.15.30 + '@swc/helpers': 0.5.21 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.18': + '@swc/helpers@0.5.21': dependencies: tslib: 2.8.1 - '@swc/jest@0.2.39(@swc/core@1.15.24(@swc/helpers@0.5.18))': + '@swc/jest@0.2.39(@swc/core@1.15.30(@swc/helpers@0.5.21))': dependencies: - '@jest/create-cache-key-function': 30.2.0 - '@swc/core': 1.15.24(@swc/helpers@0.5.18) + '@jest/create-cache-key-function': 30.3.0 + '@swc/core': 1.15.30(@swc/helpers@0.5.21) '@swc/counter': 0.1.3 jsonc-parser: 3.3.1 @@ -17587,6 +15707,75 @@ snapshots: dependencies: '@swc/counter': 0.1.3 + '@tailwindcss/node@4.2.4': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.4 + + '@tailwindcss/oxide-android-arm64@4.2.4': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.4': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.4': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.4': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.4': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.4': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.4': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.4': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.4': + optional: true + + '@tailwindcss/oxide@4.2.4': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.4 + '@tailwindcss/oxide-darwin-arm64': 4.2.4 + '@tailwindcss/oxide-darwin-x64': 4.2.4 + '@tailwindcss/oxide-freebsd-x64': 4.2.4 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.4 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.4 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.4 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.4 + '@tailwindcss/oxide-linux-x64-musl': 4.2.4 + '@tailwindcss/oxide-wasm32-wasi': 4.2.4 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 + + '@tailwindcss/postcss@4.2.4': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.4 + '@tailwindcss/oxide': 4.2.4 + postcss: 8.5.10 + tailwindcss: 4.2.4 + '@tensorflow/tfjs-backend-cpu@4.22.0(@tensorflow/tfjs-core@4.22.0(encoding@0.1.13))': dependencies: '@tensorflow/tfjs-core': 4.22.0(encoding@0.1.13) @@ -17605,9 +15794,9 @@ snapshots: transitivePeerDependencies: - encoding - '@testcontainers/postgresql@11.13.0': + '@testcontainers/postgresql@11.14.0': dependencies: - testcontainers: 11.13.0 + testcontainers: 11.14.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -17638,28 +15827,28 @@ snapshots: '@tsconfig/recommended@1.0.13': {} - '@turbo/darwin-64@2.9.4': + '@turbo/darwin-64@2.9.6': optional: true - '@turbo/darwin-arm64@2.9.4': + '@turbo/darwin-arm64@2.9.6': optional: true - '@turbo/linux-64@2.9.4': + '@turbo/linux-64@2.9.6': optional: true - '@turbo/linux-arm64@2.9.4': + '@turbo/linux-arm64@2.9.6': optional: true - '@turbo/windows-64@2.9.4': + '@turbo/windows-64@2.9.6': optional: true - '@turbo/windows-arm64@2.9.4': + '@turbo/windows-arm64@2.9.6': optional: true - '@turbopuffer/turbopuffer@1.21.0': + '@turbopuffer/turbopuffer@1.22.0': dependencies: pako: 2.1.0 - undici: 7.24.5 + undici: 8.1.0 '@tybys/wasm-util@0.10.1': dependencies: @@ -17668,7 +15857,7 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 @@ -17680,7 +15869,7 @@ snapshots: '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': @@ -17690,7 +15879,7 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/caseless@0.12.5': optional: true @@ -17706,7 +15895,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/debug@4.1.13': dependencies: @@ -17718,21 +15907,21 @@ snapshots: '@types/docker-modem@3.0.6': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/ssh2': 1.15.5 '@types/dockerode@4.0.1': dependencies: '@types/docker-modem': 3.0.6 - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/ssh2': 1.15.5 '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 25.5.0 - '@types/qs': 6.14.0 + '@types/node': 25.6.0 + '@types/qs': 6.15.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -17752,7 +15941,7 @@ snapshots: '@types/iarna__toml@2.0.5': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/istanbul-lib-coverage@2.0.6': {} @@ -17766,17 +15955,17 @@ snapshots: '@types/jest@30.0.0': dependencies: - expect: 30.2.0 - pretty-format: 30.2.0 + expect: 30.3.0 + pretty-format: 30.3.0 '@types/js-yaml@4.0.9': {} '@types/jsdom@28.0.1': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/tough-cookie': 4.0.5 parse5: 7.3.0 - undici-types: 7.24.7 + undici-types: 7.25.0 '@types/jsesc@2.5.1': {} @@ -17785,7 +15974,7 @@ snapshots: '@types/jsonwebtoken@9.0.10': dependencies: '@types/ms': 2.1.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/long@4.0.2': {} @@ -17795,12 +15984,12 @@ snapshots: '@types/node-fetch@2.6.13': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 form-data: 4.0.5 '@types/node-int64@0.4.32': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/node@12.20.55': {} @@ -17808,21 +15997,17 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.19.15': + '@types/node@22.19.17': dependencies: undici-types: 6.21.0 - '@types/node@24.10.13': + '@types/node@24.12.2': dependencies: undici-types: 7.16.0 - '@types/node@25.3.0': - dependencies: - undici-types: 7.18.2 - - '@types/node@25.5.0': + '@types/node@25.6.0': dependencies: - undici-types: 7.18.2 + undici-types: 7.19.2 '@types/offscreencanvas@2019.7.3': {} @@ -17830,28 +16015,20 @@ snapshots: dependencies: parse-path: 7.1.0 - '@types/pg@8.16.0': - dependencies: - '@types/node': 25.5.0 - pg-protocol: 1.11.0 - pg-types: 2.2.0 - '@types/pg@8.20.0': dependencies: - '@types/node': 25.5.0 - pg-protocol: 1.11.0 + '@types/node': 25.6.0 + pg-protocol: 1.13.0 pg-types: 2.2.0 - '@types/phoenix@1.6.7': {} - '@types/prompts@2.4.9': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 kleur: 3.0.3 '@types/q@1.5.8': {} - '@types/qs@6.14.0': {} + '@types/qs@6.15.0': {} '@types/range-parser@1.2.7': {} @@ -17862,7 +16039,7 @@ snapshots: '@types/request@2.48.13': dependencies: '@types/caseless': 0.12.5 - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/tough-cookie': 4.0.5 form-data: 4.0.5 optional: true @@ -17875,20 +16052,20 @@ snapshots: '@types/send@1.2.1': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/ssh2-streams@0.1.13': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/ssh2@0.5.52': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/ssh2-streams': 0.1.13 '@types/ssh2@1.15.5': @@ -17899,7 +16076,7 @@ snapshots: '@types/thrift@0.10.17': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@types/node-int64': 0.4.32 '@types/q': 1.5.8 @@ -17929,7 +16106,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 25.3.0 + '@types/node': 25.6.0 '@types/yargs-parser@21.0.3': {} @@ -17939,45 +16116,44 @@ snapshots: '@types/yauzl@2.10.3': dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 optional: true - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260405.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20260421.2': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20260405.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20260421.2': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20260405.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20260421.2': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20260405.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20260421.2': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20260405.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20260421.2': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20260405.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20260421.2': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20260405.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20260421.2': optional: true - '@typescript/native-preview@7.0.0-dev.20260405.1': + '@typescript/native-preview@7.0.0-dev.20260421.2': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260405.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260405.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20260405.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260405.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20260405.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260405.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20260405.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20260421.2 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20260421.2 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20260421.2 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20260421.2 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20260421.2 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260421.2 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20260421.2 - '@typespec/ts-http-runtime@0.3.3': + '@typescript/vfs@1.6.4(typescript@5.8.3)': dependencies: - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - tslib: 2.8.1 + debug: 4.4.3 + typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -18054,8 +16230,6 @@ snapshots: dependencies: uncrypto: 0.1.3 - '@upstash/vector@1.2.2': {} - '@upstash/vector@1.2.3': {} '@vercel/kv@3.0.0': @@ -18066,11 +16240,11 @@ snapshots: '@vercel/oidc@3.1.0': {} - '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.11 + ast-v8-to-istanbul: 0.3.12 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -18079,17 +16253,17 @@ snapshots: magic-string: 0.30.21 magicast: 0.3.5 std-env: 3.10.0 - test-exclude: 7.0.1 + test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vitest: 3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@3.2.4(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))': + '@vitest/coverage-v8@3.2.4(vitest@4.1.5)': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.11 + ast-v8-to-istanbul: 0.3.12 debug: 4.4.3 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 @@ -18098,25 +16272,25 @@ snapshots: magic-string: 0.30.21 magicast: 0.3.5 std-env: 3.10.0 - test-exclude: 7.0.1 + test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.1.2(vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))': + '@vitest/coverage-v8@4.1.5(vitest@4.1.5)': dependencies: '@bcoe/v8-coverage': 1.0.2 - '@vitest/utils': 4.1.2 + '@vitest/utils': 4.1.5 ast-v8-to-istanbul: 1.0.0 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-reports: 3.2.0 magicast: 0.5.2 obug: 2.1.1 - std-env: 4.0.0 + std-env: 4.1.0 tinyrainbow: 3.1.0 - vitest: 4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/expect@3.2.4': dependencies: @@ -18126,15 +16300,6 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/expect@4.1.2': - dependencies: - '@standard-schema/spec': 1.1.0 - '@types/chai': 5.2.3 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 - chai: 6.2.2 - tinyrainbow: 3.1.0 - '@vitest/expect@4.1.5': dependencies: '@standard-schema/spec': 1.1.0 @@ -18144,38 +16309,26 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@3.2.4(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - - '@vitest/mocker@4.1.2(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': - dependencies: - '@vitest/spy': 4.1.2 - estree-walker: 3.0.3 - magic-string: 0.30.21 - optionalDependencies: - vite: 7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) - '@vitest/mocker@4.1.5(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))': + '@vitest/mocker@4.1.5(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3))': dependencies: '@vitest/spy': 4.1.5 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/pretty-format@4.1.2': - dependencies: - tinyrainbow: 3.1.0 - '@vitest/pretty-format@4.1.5': dependencies: tinyrainbow: 3.1.0 @@ -18186,11 +16339,6 @@ snapshots: pathe: 2.0.3 strip-literal: 3.1.0 - '@vitest/runner@4.1.2': - dependencies: - '@vitest/utils': 4.1.2 - pathe: 2.0.3 - '@vitest/runner@4.1.5': dependencies: '@vitest/utils': 4.1.5 @@ -18202,13 +16350,6 @@ snapshots: magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/snapshot@4.1.2': - dependencies: - '@vitest/pretty-format': 4.1.2 - '@vitest/utils': 4.1.2 - magic-string: 0.30.21 - pathe: 2.0.3 - '@vitest/snapshot@4.1.5': dependencies: '@vitest/pretty-format': 4.1.5 @@ -18220,8 +16361,6 @@ snapshots: dependencies: tinyspy: 4.0.4 - '@vitest/spy@4.1.2': {} - '@vitest/spy@4.1.5': {} '@vitest/utils@3.2.4': @@ -18230,12 +16369,6 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@vitest/utils@4.1.2': - dependencies: - '@vitest/pretty-format': 4.1.2 - convert-source-map: 2.0.0 - tinyrainbow: 3.1.0 - '@vitest/utils@4.1.5': dependencies: '@vitest/pretty-format': 4.1.5 @@ -18248,16 +16381,16 @@ snapshots: dependencies: typescript: 5.8.3 - '@xata.io/client@0.30.1(typescript@6.0.2)': + '@xata.io/client@0.30.1(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 '@xterm/xterm@5.5.0': optional: true '@zenfs/core@1.11.4': dependencies: - '@types/node': 22.19.15 + '@types/node': 22.19.17 buffer: 6.0.3 eventemitter3: 5.0.4 readable-stream: 4.7.0 @@ -18268,9 +16401,9 @@ snapshots: '@dsnp/parquetjs': 1.8.7(bufferutil@4.1.0) '@grpc/grpc-js': 1.14.3 '@grpc/proto-loader': 0.8.0 - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 '@petamoriken/float16': 3.9.3 - dayjs: 1.11.19 + dayjs: 1.11.20 generic-pool: 3.9.0 lru-cache: 9.1.2 protobufjs: 7.5.5 @@ -18280,26 +16413,12 @@ snapshots: - bufferutil - utf-8-validate - '@zilliz/milvus2-sdk-node@2.6.9': - dependencies: - '@grpc/grpc-js': 1.14.3 - '@grpc/proto-loader': 0.7.15 - '@opentelemetry/api': 1.9.0 - '@petamoriken/float16': 3.9.3 - dayjs: 1.11.19 - generic-pool: 3.9.0 - lru-cache: 9.1.2 - protobufjs: 7.5.5 - winston: 3.19.0 - abbrev@1.1.1: optional: true abbrev@4.0.0: optional: true - abort-controller-x@0.4.3: {} - abort-controller-x@0.5.0: {} abort-controller@3.0.0: @@ -18311,18 +16430,15 @@ snapshots: mime-types: 3.0.2 negotiator: 1.0.0 - acorn-jsx@5.3.2(acorn@8.15.0): + acorn-jsx@5.3.2(acorn@8.16.0): dependencies: - acorn: 8.15.0 + acorn: 8.16.0 - acorn-walk@8.3.4: + acorn-walk@8.3.5: dependencies: - acorn: 8.15.0 - - acorn@8.15.0: {} + acorn: 8.16.0 - acorn@8.16.0: - optional: true + acorn@8.16.0: {} agent-base@6.0.2: dependencies: @@ -18343,9 +16459,9 @@ snapshots: indent-string: 4.0.0 optional: true - ai@5.0.167(zod@4.3.6): + ai@5.0.179(zod@4.3.6): dependencies: - '@ai-sdk/gateway': 2.0.71(zod@4.3.6) + '@ai-sdk/gateway': 2.0.82(zod@4.3.6) '@ai-sdk/provider': 2.0.1 '@ai-sdk/provider-utils': 3.0.23(zod@4.3.6) '@opentelemetry/api': 1.9.0 @@ -18355,7 +16471,7 @@ snapshots: optionalDependencies: ajv: 8.18.0 - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -18400,12 +16516,12 @@ snapshots: apache-arrow@21.1.0: dependencies: - '@swc/helpers': 0.5.18 + '@swc/helpers': 0.5.21 '@types/command-line-args': 5.2.3 '@types/command-line-usage': 5.0.4 - '@types/node': 24.10.13 - command-line-args: 6.0.1 - command-line-usage: 7.0.3 + '@types/node': 24.12.2 + command-line-args: 6.0.2 + command-line-usage: 7.0.4 flatbuffers: 25.9.23 json-bignum: 0.0.3 tslib: 2.8.1 @@ -18434,10 +16550,11 @@ snapshots: buffer-crc32: 1.0.0 readable-stream: 4.7.0 readdir-glob: 1.1.3 - tar-stream: 3.1.7 + tar-stream: 3.1.8 zip-stream: 6.0.1 transitivePeerDependencies: - bare-abort-controller + - bare-buffer - react-native-b4a are-we-there-yet@3.0.1: @@ -18456,7 +16573,7 @@ snapshots: args-tokenizer@0.3.0: {} - array-back@6.2.2: {} + array-back@6.2.3: {} array-ify@1.0.0: {} @@ -18473,7 +16590,7 @@ snapshots: ast-kit@3.0.0-beta.1: dependencies: - '@babel/parser': 8.0.0-rc.2 + '@babel/parser': 8.0.0-rc.3 estree-walker: 3.0.3 pathe: 2.0.3 @@ -18481,7 +16598,7 @@ snapshots: dependencies: tslib: 2.8.1 - ast-v8-to-istanbul@0.3.11: + ast-v8-to-istanbul@0.3.12: dependencies: '@jridgewell/trace-mapping': 0.3.31 estree-walker: 3.0.3 @@ -18512,6 +16629,15 @@ snapshots: stubborn-fs: 2.0.0 when-exit: 2.1.5 + autoprefixer@10.5.0(postcss@8.5.10): + dependencies: + browserslist: 4.28.2 + caniuse-lite: 1.0.30001788 + fraction.js: 5.3.4 + picocolors: 1.1.1 + postcss: 8.5.10 + postcss-value-parser: 4.2.0 + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -18523,15 +16649,15 @@ snapshots: aws4fetch@1.0.20: optional: true - axios@1.15.0(debug@4.4.3): + axios@1.15.2(debug@4.4.3): dependencies: - follow-redirects: 1.15.11(debug@4.4.3) + follow-redirects: 1.16.0(debug@4.4.3) form-data: 4.0.5 proxy-from-env: 2.1.0 transitivePeerDependencies: - debug - b4a@1.7.3: {} + b4a@1.8.0: {} babel-jest@30.3.0(@babel/core@7.29.0): dependencies: @@ -18550,7 +16676,7 @@ snapshots: dependencies: '@babel/helper-plugin-utils': 7.28.6 '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 + '@istanbuljs/schema': 0.1.6 istanbul-lib-instrument: 6.0.3 test-exclude: 6.0.0 transitivePeerDependencies: @@ -18589,45 +16715,39 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.4: + bare-fs@4.7.1: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 - bare-stream: 2.8.0(bare-events@2.8.2) - bare-url: 2.3.2 + bare-stream: 2.13.0(bare-events@2.8.2) + bare-url: 2.4.2 fast-fifo: 1.3.2 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - optional: true - bare-os@3.6.2: - optional: true + bare-os@3.9.0: {} bare-path@3.0.0: dependencies: - bare-os: 3.6.2 - optional: true + bare-os: 3.9.0 - bare-stream@2.8.0(bare-events@2.8.2): + bare-stream@2.13.0(bare-events@2.8.2): dependencies: - streamx: 2.23.0 + streamx: 2.25.0 teex: 1.0.1 optionalDependencies: bare-events: 2.8.2 transitivePeerDependencies: - - bare-abort-controller - react-native-b4a - optional: true - bare-url@2.3.2: + bare-url@2.4.2: dependencies: bare-path: 3.0.0 - optional: true base64-js@1.5.1: {} - baseline-browser-mapping@2.10.0: {} + baseline-browser-mapping@2.10.20: {} basic-ftp@5.3.0: {} @@ -18641,18 +16761,13 @@ snapshots: dependencies: is-windows: 1.0.2 - better-result@2.8.0: {} + better-result@2.8.2: {} - better-sqlite3@12.6.2: + better-sqlite3@12.9.0: dependencies: bindings: 1.5.0 prebuild-install: 7.1.3 - bidi-js@1.0.3: - dependencies: - require-from-string: 2.0.2 - optional: true - bignumber.js@9.3.1: {} binary-extensions@2.3.0: {} @@ -18677,7 +16792,7 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.15.0 + qs: 6.15.1 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -18699,13 +16814,13 @@ snapshots: browser-or-node@1.3.0: {} - browserslist@4.28.1: + browserslist@4.28.2: dependencies: - baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001777 - electron-to-chromium: 1.5.307 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.20 + caniuse-lite: 1.0.30001788 + electron-to-chromium: 1.5.343 + node-releases: 2.0.38 + update-browserslist-db: 1.2.3(browserslist@4.28.2) bs-logger@0.2.6: dependencies: @@ -18752,14 +16867,14 @@ snapshots: dependencies: ansis: 4.2.0 args-tokenizer: 0.3.0 - c12: 3.3.3(magicast@0.3.5) + c12: 3.3.4(magicast@0.3.5) cac: 6.7.14 escalade: 3.2.0 jsonc-parser: 3.3.1 package-manager-detector: 1.6.0 semver: 7.7.4 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 yaml: 2.8.3 transitivePeerDependencies: - magicast @@ -18780,7 +16895,7 @@ snapshots: dotenv: 16.6.1 giget: 1.2.5 jiti: 1.21.7 - mlly: 1.8.0 + mlly: 1.8.2 ohash: 1.1.6 pathe: 1.1.2 perfect-debounce: 1.0.0 @@ -18811,7 +16926,7 @@ snapshots: chokidar: 5.0.0 confbox: 0.2.4 defu: 6.1.7 - dotenv: 17.4.1 + dotenv: 17.4.2 exsolve: 1.0.8 giget: 2.0.0 jiti: 2.6.1 @@ -18823,6 +16938,23 @@ snapshots: optionalDependencies: magicast: 0.3.5 + c12@3.3.4(magicast@0.3.5): + dependencies: + chokidar: 5.0.0 + confbox: 0.2.4 + defu: 6.1.7 + dotenv: 17.4.2 + exsolve: 1.0.8 + giget: 3.2.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.0 + rc9: 3.0.1 + optionalDependencies: + magicast: 0.3.5 + cac@6.7.14: {} cac@7.0.0: {} @@ -18838,39 +16970,25 @@ snapshots: lru-cache: 6.0.0 minipass: 3.3.6 minipass-collect: 1.0.2 - minipass-flush: 1.0.5 + minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 mkdirp: 1.0.4 p-map: 4.0.0 promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 - tar: 7.5.11 + tar: 7.5.13 unique-filename: 1.1.1 transitivePeerDependencies: - bluebird optional: true - cacache@20.0.4: - dependencies: - '@npmcli/fs': 5.0.0 - fs-minipass: 3.0.3 - glob: 13.0.6 - lru-cache: 11.3.5 - minipass: 7.1.3 - minipass-collect: 2.0.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 7.0.4 - ssri: 13.0.1 - optional: true - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: + call-bind@1.0.9: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 @@ -18888,7 +17006,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001777: {} + caniuse-lite@1.0.30001788: {} chai@5.3.3: dependencies: @@ -18933,14 +17051,14 @@ snapshots: changelogithub@13.16.1(magicast@0.3.5): dependencies: ansis: 4.2.0 - c12: 3.3.3(magicast@0.3.5) + c12: 3.3.4(magicast@0.3.5) cac: 6.7.14 changelogen: 0.5.7(magicast@0.3.5) convert-gitmoji: 0.1.5 execa: 9.6.1 ofetch: 1.5.1 semver: 7.7.4 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 transitivePeerDependencies: - magicast @@ -18974,7 +17092,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.24.5 + undici: 8.1.0 whatwg-mimetype: 4.0.0 chokidar@3.6.0: @@ -19004,46 +17122,46 @@ snapshots: chownr@3.0.0: {} - chromadb-js-bindings-darwin-arm64@1.3.1: + chromadb-js-bindings-darwin-arm64@1.3.3: optional: true - chromadb-js-bindings-darwin-x64@1.3.1: + chromadb-js-bindings-darwin-x64@1.3.3: optional: true - chromadb-js-bindings-linux-arm64-gnu@1.3.1: + chromadb-js-bindings-linux-arm64-gnu@1.3.3: optional: true - chromadb-js-bindings-linux-x64-gnu@1.3.1: + chromadb-js-bindings-linux-x64-gnu@1.3.3: optional: true - chromadb-js-bindings-win32-x64-msvc@1.3.1: + chromadb-js-bindings-win32-x64-msvc@1.3.3: optional: true - chromadb@1.10.5(@google/generative-ai@0.7.1)(cohere-ai@7.20.0)(encoding@0.1.13)(ollama@0.6.3)(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6)): + chromadb@1.10.5(@google/generative-ai@0.7.1)(cohere-ai@7.21.0)(encoding@0.1.13)(ollama@0.6.3)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6)): dependencies: cliui: 8.0.1 isomorphic-fetch: 3.0.0(encoding@0.1.13) optionalDependencies: '@google/generative-ai': 0.7.1 - cohere-ai: 7.20.0 + cohere-ai: 7.21.0 ollama: 0.6.3 - openai: 6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) + openai: 6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) transitivePeerDependencies: - encoding - chromadb@3.4.0: + chromadb@3.4.3: dependencies: semver: 7.7.4 optionalDependencies: - chromadb-js-bindings-darwin-arm64: 1.3.1 - chromadb-js-bindings-darwin-x64: 1.3.1 - chromadb-js-bindings-linux-arm64-gnu: 1.3.1 - chromadb-js-bindings-linux-x64-gnu: 1.3.1 - chromadb-js-bindings-win32-x64-msvc: 1.3.1 + chromadb-js-bindings-darwin-arm64: 1.3.3 + chromadb-js-bindings-darwin-x64: 1.3.3 + chromadb-js-bindings-linux-arm64-gnu: 1.3.3 + chromadb-js-bindings-linux-x64-gnu: 1.3.3 + chromadb-js-bindings-win32-x64-msvc: 1.3.3 chrome-launcher@1.2.1: dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 2.0.2 @@ -19065,7 +17183,7 @@ snapshots: dependencies: consola: 3.4.2 - citty@0.2.0: {} + citty@0.2.2: {} cjs-module-lexer@1.4.3: {} @@ -19086,9 +17204,9 @@ snapshots: cli-spinners@3.4.0: {} - cli-truncate@5.1.1: + cli-truncate@5.2.0: dependencies: - slice-ansi: 7.1.2 + slice-ansi: 8.0.0 string-width: 8.2.0 cli-width@4.1.0: {} @@ -19123,13 +17241,13 @@ snapshots: co@4.6.0: {} - cohere-ai@7.20.0: + cohere-ai@7.21.0: dependencies: '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/client-sagemaker': 3.985.0 - '@aws-sdk/credential-providers': 3.985.0 - '@smithy/protocol-http': 5.3.11 - '@smithy/signature-v4': 5.3.11 + '@aws-sdk/client-sagemaker': 3.1034.0 + '@aws-sdk/credential-providers': 3.1034.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 convict: 6.2.5 form-data: 4.0.5 form-data-encoder: 4.1.0 @@ -19138,7 +17256,7 @@ snapshots: transitivePeerDependencies: - aws-crt - cohere-ai@8.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-providers@3.985.0)(@smithy/protocol-http@5.3.12)(@smithy/signature-v4@5.3.12): + cohere-ai@8.0.0(@aws-crypto/sha256-js@5.2.0)(@aws-sdk/credential-providers@3.1034.0)(@smithy/protocol-http@5.3.14)(@smithy/signature-v4@5.3.14): dependencies: convict: 6.2.5 form-data: 4.0.5 @@ -19147,9 +17265,9 @@ snapshots: readable-stream: 4.7.0 optionalDependencies: '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/credential-providers': 3.985.0 - '@smithy/protocol-http': 5.3.12 - '@smithy/signature-v4': 5.3.12 + '@aws-sdk/credential-providers': 3.1034.0 + '@smithy/protocol-http': 5.3.14 + '@smithy/signature-v4': 5.3.14 collect-v8-coverage@1.0.3: {} @@ -19181,30 +17299,31 @@ snapshots: colorette@2.0.20: {} + colors@1.4.0: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - command-line-args@6.0.1: + command-line-args@6.0.2: dependencies: - array-back: 6.2.2 + array-back: 6.2.3 find-replace: 5.0.2 lodash.camelcase: 4.3.0 typical: 7.3.0 - command-line-usage@7.0.3: + command-line-usage@7.0.4: dependencies: - array-back: 6.2.2 + array-back: 6.2.3 chalk-template: 0.4.0 table-layout: 4.1.1 typical: 7.3.0 commander@10.0.1: {} - commander@14.0.3: {} + commander@13.1.0: {} - commander@2.20.3: - optional: true + commander@14.0.3: {} commander@9.5.0: {} @@ -19242,11 +17361,11 @@ snapshots: console-control-strings@1.1.0: optional: true - content-disposition@1.0.1: {} + content-disposition@1.1.0: {} content-type@1.0.5: {} - conventional-changelog-conventionalcommits@9.1.0: + conventional-changelog-conventionalcommits@9.3.1: dependencies: compare-func: 2.0.0 @@ -19254,40 +17373,30 @@ snapshots: conventional-commits-filter@5.0.0: {} - conventional-commits-parser@6.2.1: + conventional-commits-parser@6.4.0: dependencies: + '@simple-libs/stream-utils': 1.2.0 meow: 13.2.0 conventional-recommended-bump@11.2.0: dependencies: - '@conventional-changelog/git-client': 2.5.1(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.2.1) + '@conventional-changelog/git-client': 2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0) conventional-changelog-preset-loader: 5.0.0 conventional-commits-filter: 5.0.0 - conventional-commits-parser: 6.2.1 + conventional-commits-parser: 6.4.0 meow: 13.2.0 convert-gitmoji@0.1.5: {} convert-source-map@2.0.0: {} - convex@1.32.0(bufferutil@4.1.0)(react@19.0.0): - dependencies: - esbuild: 0.27.0 - prettier: 3.8.1 - ws: 8.18.0(bufferutil@4.1.0) - optionalDependencies: - react: 19.0.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - convex@1.34.1(bufferutil@4.1.0)(react@19.0.0): + convex@1.36.0(bufferutil@4.1.0)(react@19.2.5): dependencies: - esbuild: 0.27.3 - prettier: 3.8.1 + esbuild: 0.28.0 + prettier: 3.8.3 ws: 8.18.0(bufferutil@4.1.0) optionalDependencies: - react: 19.0.0 + react: 19.2.5 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -19301,6 +17410,10 @@ snapshots: cookie@0.7.2: {} + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + core-util-is@1.0.3: {} cors@2.8.6: @@ -19311,7 +17424,7 @@ snapshots: cpu-features@0.0.10: dependencies: buildcheck: 0.0.7 - nan: 2.25.0 + nan: 2.26.2 optional: true crc-32@1.2.2: {} @@ -19349,21 +17462,9 @@ snapshots: domutils: 3.2.2 nth-check: 2.1.1 - css-tree@3.2.1: - dependencies: - mdn-data: 2.27.1 - source-map-js: 1.2.1 - optional: true - css-what@6.2.2: {} - cssstyle@6.2.0: - dependencies: - '@asamuzakjp/css-color': 5.1.11 - '@csstools/css-syntax-patches-for-csstree': 1.1.3(css-tree@3.2.1) - css-tree: 3.2.1 - lru-cache: 11.3.5 - optional: true + cssesc@3.0.0: {} csstype@3.2.3: {} @@ -19371,21 +17472,13 @@ snapshots: data-uri-to-buffer@6.0.2: {} - data-urls@7.0.0: - dependencies: - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1 - transitivePeerDependencies: - - '@noble/hashes' - optional: true - dataloader@1.4.0: {} date-fns@4.1.0: {} dateformat@4.6.3: {} - dayjs@1.11.19: {} + dayjs@1.11.20: {} debounce-fn@6.0.0: dependencies: @@ -19401,14 +17494,11 @@ snapshots: decamelize@1.2.0: {} - decimal.js@10.6.0: - optional: true - decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dedent@1.7.1: {} + dedent@1.7.2: {} deep-eql@5.0.2: {} @@ -19479,7 +17569,7 @@ snapshots: dependencies: yaml: 2.8.3 - docker-modem@5.0.6: + docker-modem@5.0.7: dependencies: debug: 4.4.3 readable-stream: 3.6.2 @@ -19488,12 +17578,12 @@ snapshots: transitivePeerDependencies: - supports-color - dockerode@4.0.9: + dockerode@4.0.10: dependencies: '@balena/dockerignore': 1.0.2 '@grpc/grpc-js': 1.14.3 '@grpc/proto-loader': 0.7.15 - docker-modem: 5.0.6 + docker-modem: 5.0.7 protobufjs: 7.5.5 tar-fs: 2.1.4 uuid: 10.0.0 @@ -19520,7 +17610,7 @@ snapshots: dot-prop@10.1.0: dependencies: - type-fest: 5.4.4 + type-fest: 5.6.0 dot-prop@5.3.0: dependencies: @@ -19530,7 +17620,7 @@ snapshots: dotenv@16.6.1: {} - dotenv@17.4.1: {} + dotenv@17.4.2: {} dotenv@8.6.0: {} @@ -19559,7 +17649,7 @@ snapshots: duck-duck-scrape@2.2.7: dependencies: html-entities: 2.6.0 - needle: 3.3.1 + needle: 3.5.0 dunder-proto@1.0.1: dependencies: @@ -19588,7 +17678,7 @@ snapshots: '@standard-schema/spec': 1.1.0 fast-check: 3.23.2 - electron-to-chromium@1.5.307: {} + electron-to-chromium@1.5.343: {} emittery@0.13.1: {} @@ -19618,6 +17708,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -19629,9 +17724,6 @@ snapshots: entities@7.0.1: {} - entities@8.0.0: - optional: true - env-paths@2.2.1: optional: true @@ -19663,65 +17755,43 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 - esbuild@0.27.0: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.0 - '@esbuild/android-arm': 0.27.0 - '@esbuild/android-arm64': 0.27.0 - '@esbuild/android-x64': 0.27.0 - '@esbuild/darwin-arm64': 0.27.0 - '@esbuild/darwin-x64': 0.27.0 - '@esbuild/freebsd-arm64': 0.27.0 - '@esbuild/freebsd-x64': 0.27.0 - '@esbuild/linux-arm': 0.27.0 - '@esbuild/linux-arm64': 0.27.0 - '@esbuild/linux-ia32': 0.27.0 - '@esbuild/linux-loong64': 0.27.0 - '@esbuild/linux-mips64el': 0.27.0 - '@esbuild/linux-ppc64': 0.27.0 - '@esbuild/linux-riscv64': 0.27.0 - '@esbuild/linux-s390x': 0.27.0 - '@esbuild/linux-x64': 0.27.0 - '@esbuild/netbsd-arm64': 0.27.0 - '@esbuild/netbsd-x64': 0.27.0 - '@esbuild/openbsd-arm64': 0.27.0 - '@esbuild/openbsd-x64': 0.27.0 - '@esbuild/openharmony-arm64': 0.27.0 - '@esbuild/sunos-x64': 0.27.0 - '@esbuild/win32-arm64': 0.27.0 - '@esbuild/win32-ia32': 0.27.0 - '@esbuild/win32-x64': 0.27.0 - - esbuild@0.27.3: + esbuild-plugin-tailwindcss@2.2.0: + dependencies: + '@tailwindcss/postcss': 4.2.4 + autoprefixer: 10.5.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-modules: 6.0.1(postcss@8.5.10) + + esbuild@0.28.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.3 - '@esbuild/android-arm': 0.27.3 - '@esbuild/android-arm64': 0.27.3 - '@esbuild/android-x64': 0.27.3 - '@esbuild/darwin-arm64': 0.27.3 - '@esbuild/darwin-x64': 0.27.3 - '@esbuild/freebsd-arm64': 0.27.3 - '@esbuild/freebsd-x64': 0.27.3 - '@esbuild/linux-arm': 0.27.3 - '@esbuild/linux-arm64': 0.27.3 - '@esbuild/linux-ia32': 0.27.3 - '@esbuild/linux-loong64': 0.27.3 - '@esbuild/linux-mips64el': 0.27.3 - '@esbuild/linux-ppc64': 0.27.3 - '@esbuild/linux-riscv64': 0.27.3 - '@esbuild/linux-s390x': 0.27.3 - '@esbuild/linux-x64': 0.27.3 - '@esbuild/netbsd-arm64': 0.27.3 - '@esbuild/netbsd-x64': 0.27.3 - '@esbuild/openbsd-arm64': 0.27.3 - '@esbuild/openbsd-x64': 0.27.3 - '@esbuild/openharmony-arm64': 0.27.3 - '@esbuild/sunos-x64': 0.27.3 - '@esbuild/win32-arm64': 0.27.3 - '@esbuild/win32-ia32': 0.27.3 - '@esbuild/win32-x64': 0.27.3 + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 escalade@3.2.0: {} @@ -19750,21 +17820,21 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.2(jiti@2.6.1): + eslint@9.39.4(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.2 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.14.0 + ajv: 6.15.0 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.3 @@ -19783,7 +17853,7 @@ snapshots: is-glob: 4.0.3 json-stable-stringify-without-jsonify: 1.0.1 lodash.merge: 4.6.2 - minimatch: 10.2.4 + minimatch: 10.2.5 natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: @@ -19795,8 +17865,8 @@ snapshots: espree@10.4.0: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.16.0 + acorn-jsx: 5.3.2(acorn@8.16.0) eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -19835,15 +17905,15 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.6: {} + eventsource-parser@3.0.8: {} eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.6 + eventsource-parser: 3.0.8 eventsource@4.1.0: dependencies: - eventsource-parser: 3.0.6 + eventsource-parser: 3.0.8 exa-js@1.10.2(encoding@0.1.13)(ws@8.20.0(bufferutil@4.1.0)): dependencies: @@ -19906,21 +17976,14 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.2 + exit-hook@4.0.0: {} + exit-x@0.2.2: {} expand-template@2.0.3: {} expect-type@1.3.0: {} - expect@30.2.0: - dependencies: - '@jest/expect-utils': 30.2.0 - '@jest/get-type': 30.1.0 - jest-matcher-utils: 30.2.0 - jest-message-util: 30.2.0 - jest-mock: 30.2.0 - jest-util: 30.2.0 - expect@30.3.0: dependencies: '@jest/expect-utils': 30.3.0 @@ -19933,7 +17996,7 @@ snapshots: exponential-backoff@3.1.3: optional: true - express-rate-limit@8.3.1(express@5.2.1): + express-rate-limit@8.3.2(express@5.2.1): dependencies: express: 5.2.1 ip-address: 10.1.0 @@ -19942,7 +18005,7 @@ snapshots: dependencies: accepts: 2.0.0 body-parser: 2.2.2 - content-disposition: 1.0.1 + content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 @@ -19960,7 +18023,7 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.15.0 + qs: 6.15.1 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 @@ -19999,7 +18062,7 @@ snapshots: fast-content-type-parse@3.0.0: {} - fast-copy@4.0.2: {} + fast-copy@4.0.3: {} fast-deep-equal@3.1.3: {} @@ -20021,15 +18084,16 @@ snapshots: fast-uri@3.1.0: {} - fast-xml-builder@1.1.4: + fast-xml-builder@1.1.5: dependencies: - path-expression-matcher: 1.2.0 + path-expression-matcher: 1.5.0 - fast-xml-parser@5.5.8: + fast-xml-parser@5.7.1: dependencies: - fast-xml-builder: 1.1.4 - path-expression-matcher: 1.2.0 - strnum: 2.2.1 + '@nodable/entities': 2.1.0 + fast-xml-builder: 1.1.5 + path-expression-matcher: 1.5.0 + strnum: 2.2.3 fastq@1.20.1: dependencies: @@ -20057,7 +18121,7 @@ snapshots: fetch-cookie@3.2.0: dependencies: set-cookie-parser: 2.7.2 - tough-cookie: 6.0.0 + tough-cookie: 6.0.1 fetch-ponyfill@7.1.0(encoding@0.1.13): dependencies: @@ -20113,11 +18177,11 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - firebase-admin@13.7.0(encoding@0.1.13): + firebase-admin@13.8.0(encoding@0.1.13): dependencies: '@fastify/busboy': 3.2.0 - '@firebase/database-compat': 2.1.0 - '@firebase/database-types': 1.0.16 + '@firebase/database-compat': 2.1.3 + '@firebase/database-types': 1.0.19 farmhash-modern: 1.1.0 fast-deep-equal: 3.1.3 google-auth-library: 10.6.2 @@ -20145,7 +18209,7 @@ snapshots: fn.name@1.1.0: {} - follow-redirects@1.15.11(debug@4.4.3): + follow-redirects@1.16.0(debug@4.4.3): optionalDependencies: debug: 4.4.3 @@ -20167,7 +18231,7 @@ snapshots: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.2 + hasown: 2.0.3 mime-types: 2.1.35 formdata-node@4.4.1: @@ -20183,6 +18247,8 @@ snapshots: forwarded@0.2.0: {} + fraction.js@5.3.4: {} + fresh@2.0.0: {} fs-constants@1.0.0: {} @@ -20190,7 +18256,7 @@ snapshots: fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.2.0 + jsonfile: 6.2.1 universalify: 2.0.1 fs-extra@7.0.1: @@ -20210,11 +18276,6 @@ snapshots: minipass: 3.3.6 optional: true - fs-minipass@3.0.3: - dependencies: - minipass: 7.1.3 - optional: true - fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -20251,15 +18312,6 @@ snapshots: - encoding - supports-color - gaxios@7.1.3: - dependencies: - extend: 3.0.2 - https-proxy-agent: 7.0.6 - node-fetch: 3.3.2 - rimraf: 5.0.10 - transitivePeerDependencies: - - supports-color - gaxios@7.1.4: dependencies: extend: 3.0.2 @@ -20289,6 +18341,10 @@ snapshots: dependencies: is-property: 1.0.2 + generic-names@4.0.0: + dependencies: + loader-utils: 3.3.1 + generic-pool@3.9.0: {} gensync@1.0.0-beta.2: {} @@ -20307,14 +18363,14 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-package-type@0.1.0: {} get-port-please@3.2.0: {} - get-port@7.1.0: {} + get-port@7.2.0: {} get-proto@1.0.1: dependencies: @@ -20323,7 +18379,7 @@ snapshots: get-stream@5.2.0: dependencies: - pump: 3.0.3 + pump: 3.0.4 optional: true get-stream@6.0.1: {} @@ -20335,11 +18391,7 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-tsconfig@4.13.6: - dependencies: - resolve-pkg-maps: 1.0.0 - - get-tsconfig@4.13.7: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -20361,7 +18413,7 @@ snapshots: node-fetch-native: 1.6.7 nypm: 0.5.4 pathe: 2.0.3 - tar: 7.5.11 + tar: 7.5.13 giget@2.0.0: dependencies: @@ -20372,6 +18424,8 @@ snapshots: nypm: 0.6.5 pathe: 2.0.3 + giget@3.2.0: {} + git-up@8.1.1: dependencies: is-ssh: 1.4.1 @@ -20395,14 +18449,14 @@ snapshots: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 - minimatch: 10.2.4 - minipass: 7.1.2 + minimatch: 10.2.5 + minipass: 7.1.3 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 glob@13.0.6: dependencies: - minimatch: 10.2.4 + minimatch: 10.2.5 minipass: 7.1.3 path-scurry: 2.0.2 @@ -20411,7 +18465,7 @@ snapshots: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 10.2.4 + minimatch: 10.2.5 once: 1.4.0 path-is-absolute: 1.0.1 @@ -20479,7 +18533,7 @@ snapshots: extend: 3.0.2 gaxios: 7.1.4 google-auth-library: 10.6.2 - qs: 6.15.0 + qs: 6.15.1 url-template: 2.0.8 transitivePeerDependencies: - supports-color @@ -20500,8 +18554,6 @@ snapshots: transitivePeerDependencies: - encoding - graphql@16.12.0: {} - graphql@16.13.2: {} groq-sdk@1.1.2: {} @@ -20538,11 +18590,11 @@ snapshots: has-unicode@2.0.1: optional: true - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 - hdb@0.19.8: + hdb@0.19.12: dependencies: iconv-lite: 0.4.24 @@ -20557,21 +18609,14 @@ snapshots: hnswlib-node@3.0.0: dependencies: bindings: 1.5.0 - node-addon-api: 8.5.0 + node-addon-api: 8.7.0 - hono@4.12.8: {} + hono@4.12.14: {} - hookable@6.1.0: {} + hookable@6.1.1: {} hpagent@1.2.0: {} - html-encoding-sniffer@6.0.0: - dependencies: - '@exodus/bytes': 1.15.0 - transitivePeerDependencies: - - '@noble/hashes' - optional: true - html-entities@2.6.0: {} html-escaper@2.0.2: {} @@ -20650,12 +18695,12 @@ snapshots: dependencies: ms: 2.1.3 - ibm-cloud-sdk-core@5.4.10: + ibm-cloud-sdk-core@5.4.11: dependencies: '@types/debug': 4.1.13 '@types/node': 18.19.130 '@types/tough-cookie': 4.0.5 - axios: 1.15.0(debug@4.4.3) + axios: 1.15.2(debug@4.4.3) camelcase: 6.3.0 debug: 4.4.3 dotenv: 16.6.1 @@ -20666,7 +18711,7 @@ snapshots: jsonwebtoken: 9.0.3 load-esm: 1.0.3 mime-types: 2.1.35 - retry-axios: 2.6.0(axios@1.15.0) + retry-axios: 2.6.0(axios@1.15.2) tough-cookie: 4.1.4 transitivePeerDependencies: - supports-color @@ -20689,6 +18734,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + icss-utils@5.1.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -20703,7 +18752,7 @@ snapshots: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - import-without-cache@0.2.5: {} + import-without-cache@0.3.3: {} imurmurhash@0.1.4: {} @@ -20722,17 +18771,17 @@ snapshots: ini@1.3.8: {} - inquirer@12.11.1(@types/node@25.5.0): + inquirer@12.11.1(@types/node@25.6.0): dependencies: '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@25.5.0) - '@inquirer/prompts': 7.10.1(@types/node@25.5.0) - '@inquirer/type': 3.0.10(@types/node@25.5.0) + '@inquirer/core': 10.3.2(@types/node@25.6.0) + '@inquirer/prompts': 7.10.1(@types/node@25.6.0) + '@inquirer/type': 3.0.10(@types/node@25.6.0) mute-stream: 2.0.0 run-async: 4.0.6 rxjs: 7.8.2 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 int53@1.0.0: {} @@ -20756,7 +18805,7 @@ snapshots: ipaddr.js@1.9.1: {} - is-any-array@2.0.1: {} + is-any-array@3.0.0: {} is-arrayish@0.2.1: {} @@ -20768,7 +18817,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-docker@2.2.1: optional: true @@ -20800,7 +18849,7 @@ snapshots: is-lambda@1.0.1: optional: true - is-network-error@1.3.0: {} + is-network-error@1.3.1: {} is-number@7.0.0: {} @@ -20808,9 +18857,6 @@ snapshots: is-plain-obj@4.1.0: {} - is-potential-custom-element-name@1.0.1: - optional: true - is-promise@4.0.0: {} is-property@1.0.2: {} @@ -20837,6 +18883,8 @@ snapshots: is-unicode-supported@2.1.0: {} + is-what@5.5.0: {} + is-windows@1.0.2: {} is-wsl@2.2.0: @@ -20844,7 +18892,7 @@ snapshots: is-docker: 2.2.1 optional: true - is-wsl@3.1.0: + is-wsl@3.1.1: dependencies: is-inside-container: 1.0.0 @@ -20885,8 +18933,8 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.29.0 - '@babel/parser': 7.29.0 - '@istanbuljs/schema': 0.1.3 + '@babel/parser': 7.29.2 + '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 semver: 7.7.4 transitivePeerDependencies: @@ -20929,10 +18977,10 @@ snapshots: '@jest/expect': 30.3.0 '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.1 + dedent: 1.7.2 is-generator-fn: 2.1.0 jest-each: 30.3.0 jest-matcher-utils: 30.3.0 @@ -20949,15 +18997,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)): + jest-cli@30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)): dependencies: - '@jest/core': 30.3.0(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + '@jest/core': 30.3.0(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + jest-config: 30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) jest-util: 30.3.0 jest-validate: 30.3.0 yargs: 17.7.2 @@ -20968,7 +19016,7 @@ snapshots: - supports-color - ts-node - jest-config@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)): + jest-config@30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)): dependencies: '@babel/core': 7.29.0 '@jest/get-type': 30.1.0 @@ -20994,19 +19042,12 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 25.5.0 - ts-node: 10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3) + '@types/node': 25.6.0 + ts-node: 10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-diff@30.2.0: - dependencies: - '@jest/diff-sequences': 30.0.1 - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - pretty-format: 30.2.0 - jest-diff@30.3.0: dependencies: '@jest/diff-sequences': 30.3.0 @@ -21031,7 +19072,7 @@ snapshots: '@jest/environment': 30.3.0 '@jest/fake-timers': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 jest-mock: 30.3.0 jest-util: 30.3.0 jest-validate: 30.3.0 @@ -21039,7 +19080,7 @@ snapshots: jest-haste-map@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -21056,13 +19097,6 @@ snapshots: '@jest/get-type': 30.1.0 pretty-format: 30.3.0 - jest-matcher-utils@30.2.0: - dependencies: - '@jest/get-type': 30.1.0 - chalk: 4.1.2 - jest-diff: 30.2.0 - pretty-format: 30.2.0 - jest-matcher-utils@30.3.0: dependencies: '@jest/get-type': 30.1.0 @@ -21070,18 +19104,6 @@ snapshots: jest-diff: 30.3.0 pretty-format: 30.3.0 - jest-message-util@30.2.0: - dependencies: - '@babel/code-frame': 7.29.0 - '@jest/types': 30.2.0 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.8 - pretty-format: 30.2.0 - slash: 3.0.0 - stack-utils: 2.0.6 - jest-message-util@30.3.0: dependencies: '@babel/code-frame': 7.29.0 @@ -21094,16 +19116,10 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@30.2.0: - dependencies: - '@jest/types': 30.2.0 - '@types/node': 25.5.0 - jest-util: 30.2.0 - jest-mock@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 jest-util: 30.3.0 jest-pnp-resolver@1.2.3(jest-resolve@30.3.0): @@ -21137,7 +19153,7 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 chalk: 4.1.2 emittery: 0.13.1 exit-x: 0.2.2 @@ -21166,7 +19182,7 @@ snapshots: '@jest/test-result': 30.3.0 '@jest/transform': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 chalk: 4.1.2 cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 @@ -21210,19 +19226,10 @@ snapshots: transitivePeerDependencies: - supports-color - jest-util@30.2.0: - dependencies: - '@jest/types': 30.2.0 - '@types/node': 25.5.0 - chalk: 4.1.2 - ci-info: 4.4.0 - graceful-fs: 4.2.11 - picomatch: 4.0.4 - jest-util@30.3.0: dependencies: '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 chalk: 4.1.2 ci-info: 4.4.0 graceful-fs: 4.2.11 @@ -21241,7 +19248,7 @@ snapshots: dependencies: '@jest/test-result': 30.3.0 '@jest/types': 30.3.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -21250,18 +19257,18 @@ snapshots: jest-worker@30.3.0: dependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 '@ungap/structured-clone': 1.3.0 jest-util: 30.3.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)): + jest@30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)): dependencies: - '@jest/core': 30.3.0(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + '@jest/core': 30.3.0(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) '@jest/types': 30.3.0 import-local: 3.2.0 - jest-cli: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + jest-cli: 30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -21275,7 +19282,7 @@ snapshots: jose@4.15.9: {} - jose@6.1.3: {} + jose@6.2.2: {} joycon@3.1.1: {} @@ -21298,34 +19305,6 @@ snapshots: dependencies: argparse: 2.0.1 - jsdom@28.1.0: - dependencies: - '@acemir/cssom': 0.9.31 - '@asamuzakjp/dom-selector': 6.8.1 - '@bramus/specificity': 2.4.2 - '@exodus/bytes': 1.15.0 - cssstyle: 6.2.0 - data-urls: 7.0.0 - decimal.js: 10.6.0 - html-encoding-sniffer: 6.0.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - is-potential-custom-element-name: 1.0.1 - parse5: 8.0.1 - saxes: 6.0.0 - symbol-tree: 3.2.4 - tough-cookie: 6.0.1 - undici: 8.1.0 - w3c-xmlserializer: 5.0.0 - webidl-conversions: 8.0.1 - whatwg-mimetype: 5.0.0 - whatwg-url: 16.0.1 - xml-name-validator: 5.0.0 - transitivePeerDependencies: - - '@noble/hashes' - - supports-color - optional: true - jsesc@3.1.0: {} json-bigint@1.0.0: @@ -21355,6 +19334,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-with-bigint@3.5.8: {} + json11@2.0.2: {} json5@2.2.3: {} @@ -21365,7 +19346,7 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.2.0: + jsonfile@6.2.1: dependencies: universalify: 2.0.1 optionalDependencies: @@ -21415,7 +19396,7 @@ snapshots: kleur@3.0.3: {} - knex@3.2.9(pg@8.18.0): + knex@3.2.9(pg@8.20.0): dependencies: colorette: 2.0.19 commander: 10.0.1 @@ -21432,38 +19413,29 @@ snapshots: tarn: 3.0.2 tildify: 2.0.0 optionalDependencies: - pg: 8.18.0 + pg: 8.20.0 transitivePeerDependencies: - supports-color - kolorist@1.8.0: {} - - kuler@2.0.0: {} - - langsmith@0.5.19(@opentelemetry/api@1.9.0)(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)): - dependencies: - p-queue: 6.6.2 - uuid: 10.0.0 - optionalDependencies: - '@opentelemetry/api': 1.9.0 - openai: 6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) - ws: 8.20.0(bufferutil@4.1.0) + kolorist@1.8.0: {} + + kuler@2.0.0: {} - langsmith@0.5.19(@opentelemetry/api@1.9.0)(openai@6.33.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6))(ws@5.2.4(bufferutil@4.1.0)): + langsmith@0.5.21(@opentelemetry/api@1.9.1)(openai@6.34.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6))(ws@5.2.4(bufferutil@4.1.0)): dependencies: p-queue: 6.6.2 uuid: 10.0.0 optionalDependencies: - '@opentelemetry/api': 1.9.0 - openai: 6.33.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6) + '@opentelemetry/api': 1.9.1 + openai: 6.34.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6) ws: 5.2.4(bufferutil@4.1.0) - langsmith@0.5.19(@opentelemetry/api@1.9.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)): + langsmith@0.5.21(@opentelemetry/api@1.9.1)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)): dependencies: p-queue: 6.6.2 uuid: 10.0.0 optionalDependencies: - '@opentelemetry/api': 1.9.0 + '@opentelemetry/api': 1.9.1 openai: 6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) ws: 8.20.0(bufferutil@4.1.0) @@ -21486,6 +19458,55 @@ snapshots: - supports-color optional: true + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + limiter@1.1.5: {} lines-and-columns@1.2.4: {} @@ -21496,12 +19517,12 @@ snapshots: listr2: 9.0.5 picomatch: 4.0.4 string-argv: 0.3.2 - tinyexec: 1.0.4 + tinyexec: 1.1.1 yaml: 2.8.3 listr2@9.0.5: dependencies: - cli-truncate: 5.1.1 + cli-truncate: 5.2.0 colorette: 2.0.20 eventemitter3: 5.0.4 log-update: 6.1.0 @@ -21510,6 +19531,8 @@ snapshots: load-esm@1.0.3: {} + loader-utils@3.3.1: {} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -21595,8 +19618,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.5: {} - lru-cache@11.3.5: {} lru-cache@5.1.1: @@ -21618,21 +19639,21 @@ snapshots: lru.min@1.1.4: {} - lunary@0.8.8(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(react@19.0.0): + lunary@0.8.8(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(openai@6.34.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6))(react@19.2.5): dependencies: unctx: 2.5.0 optionalDependencies: '@anthropic-ai/sdk': 0.91.1(zod@4.3.6) - openai: 6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) - react: 19.0.0 + openai: 6.34.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6) + react: 19.2.5 - lunary@0.8.8(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(openai@6.33.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6))(react@19.0.0): + lunary@0.8.8(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(react@19.2.5): dependencies: unctx: 2.5.0 optionalDependencies: '@anthropic-ai/sdk': 0.91.1(zod@4.3.6) - openai: 6.33.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6) - react: 19.0.0 + openai: 6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) + react: 19.2.5 lz4-wasm-nodejs@0.9.2: optional: true @@ -21645,13 +19666,13 @@ snapshots: magicast@0.3.5: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 magicast@0.5.2: dependencies: - '@babel/parser': 7.29.0 + '@babel/parser': 7.29.2 '@babel/types': 7.29.0 source-map-js: 1.2.1 @@ -21661,24 +19682,6 @@ snapshots: make-error@1.3.6: {} - make-fetch-happen@15.0.5: - dependencies: - '@gar/promise-retry': 1.0.3 - '@npmcli/agent': 4.0.0 - '@npmcli/redact': 4.0.0 - cacache: 20.0.4 - http-cache-semantics: 4.2.0 - minipass: 7.1.3 - minipass-fetch: 5.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 1.0.0 - proc-log: 6.1.0 - ssri: 13.0.1 - transitivePeerDependencies: - - supports-color - optional: true - make-fetch-happen@9.1.0: dependencies: agentkeepalive: 4.6.0 @@ -21691,7 +19694,7 @@ snapshots: minipass: 3.3.6 minipass-collect: 1.0.2 minipass-fetch: 1.4.1 - minipass-flush: 1.0.5 + minipass-flush: 1.0.7 minipass-pipeline: 1.2.4 negotiator: 0.6.4 promise-retry: 2.0.1 @@ -21709,7 +19712,7 @@ snapshots: mariadb@3.5.2: dependencies: '@types/geojson': 7946.0.16 - '@types/node': 25.5.0 + '@types/node': 25.6.0 denque: 2.1.0 iconv-lite: 0.7.2 lru-cache: 10.4.3 @@ -21719,32 +19722,29 @@ snapshots: math-intrinsics@1.1.0: {} - mdn-data@2.27.1: - optional: true - media-typer@1.1.0: {} - mem0ai@2.4.5(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(@azure/identity@4.13.0)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260405.1)(@google/genai@1.40.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0))(@langchain/core@libs+langchain-core)(@mistralai/mistralai@1.15.1(bufferutil@4.1.0))(@qdrant/js-client-rest@1.17.0(typescript@5.8.3))(@supabase/supabase-js@2.95.3(bufferutil@4.1.0))(@types/jest@30.0.0)(@types/pg@8.16.0)(better-sqlite3@12.6.2)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@1.1.2)(neo4j-driver@6.0.1)(ollama@0.6.3)(pg@8.18.0)(redis@4.7.1)(ws@8.20.0(bufferutil@4.1.0)): + mem0ai@2.4.6(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(@azure/identity@4.13.1)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260422.1)(@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0))(@langchain/core@libs+langchain-core)(@mistralai/mistralai@1.15.1(bufferutil@4.1.0))(@qdrant/js-client-rest@1.17.0(typescript@5.8.3))(@supabase/supabase-js@2.104.0(bufferutil@4.1.0))(@types/jest@30.0.0)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@1.1.2)(neo4j-driver@6.0.1)(ollama@0.6.3)(pg@8.20.0)(redis@4.7.1)(ws@8.20.0(bufferutil@4.1.0)): dependencies: '@anthropic-ai/sdk': 0.91.1(zod@4.3.6) - '@azure/identity': 4.13.0 + '@azure/identity': 4.13.1 '@azure/search-documents': 12.2.0 - '@cloudflare/workers-types': 4.20260405.1 - '@google/genai': 1.40.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0) + '@cloudflare/workers-types': 4.20260422.1 + '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0) '@langchain/core': link:libs/langchain-core '@mistralai/mistralai': 1.15.1(bufferutil@4.1.0) '@qdrant/js-client-rest': 1.17.0(typescript@5.8.3) - '@supabase/supabase-js': 2.95.3(bufferutil@4.1.0) + '@supabase/supabase-js': 2.104.0(bufferutil@4.1.0) '@types/jest': 30.0.0 - '@types/pg': 8.16.0 - axios: 1.15.0(debug@4.4.3) - better-sqlite3: 12.6.2 + '@types/pg': 8.20.0 + axios: 1.15.2(debug@4.4.3) + better-sqlite3: 12.9.0 cloudflare: 4.5.0(encoding@0.1.13) groq-sdk: 1.1.2 neo4j-driver: 6.0.1 ollama: 0.6.3 openai: 4.104.0(encoding@0.1.13)(ws@8.20.0(bufferutil@4.1.0))(zod@3.25.76) - pg: 8.18.0 + pg: 8.20.0 redis: 4.7.1 uuid: 9.0.1 zod: 3.25.76 @@ -21753,28 +19753,28 @@ snapshots: - encoding - ws - mem0ai@2.4.5(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(@azure/identity@4.13.1)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260405.1)(@google/genai@1.40.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0))(@langchain/core@libs+langchain-core)(@mistralai/mistralai@1.15.1(bufferutil@4.1.0))(@qdrant/js-client-rest@1.17.0(typescript@6.0.2))(@supabase/supabase-js@2.101.1(bufferutil@4.1.0))(@types/jest@30.0.0)(@types/pg@8.20.0)(better-sqlite3@12.6.2)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@1.1.2)(neo4j-driver@6.0.1)(ollama@0.6.3)(pg@8.20.0)(redis@5.11.0)(ws@5.2.4(bufferutil@4.1.0)): + mem0ai@2.4.6(@anthropic-ai/sdk@0.91.1(zod@4.3.6))(@azure/identity@4.13.1)(@azure/search-documents@12.2.0)(@cloudflare/workers-types@4.20260422.1)(@google/genai@1.50.1(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0))(@langchain/core@libs+langchain-core)(@mistralai/mistralai@1.15.1(bufferutil@4.1.0))(@qdrant/js-client-rest@1.17.0(typescript@6.0.3))(@supabase/supabase-js@2.104.0(bufferutil@4.1.0))(@types/jest@30.0.0)(@types/pg@8.20.0)(better-sqlite3@12.9.0)(cloudflare@4.5.0(encoding@0.1.13))(encoding@0.1.13)(groq-sdk@1.1.2)(neo4j-driver@6.0.1)(ollama@0.6.3)(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(ws@5.2.4(bufferutil@4.1.0)): dependencies: '@anthropic-ai/sdk': 0.91.1(zod@4.3.6) '@azure/identity': 4.13.1 '@azure/search-documents': 12.2.0 - '@cloudflare/workers-types': 4.20260405.1 - '@google/genai': 1.40.0(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0) + '@cloudflare/workers-types': 4.20260422.1 + '@google/genai': 1.50.1(@modelcontextprotocol/sdk@1.29.0(@cfworker/json-schema@4.1.1)(zod@4.3.6))(bufferutil@4.1.0) '@langchain/core': link:libs/langchain-core '@mistralai/mistralai': 1.15.1(bufferutil@4.1.0) - '@qdrant/js-client-rest': 1.17.0(typescript@6.0.2) - '@supabase/supabase-js': 2.101.1(bufferutil@4.1.0) + '@qdrant/js-client-rest': 1.17.0(typescript@6.0.3) + '@supabase/supabase-js': 2.104.0(bufferutil@4.1.0) '@types/jest': 30.0.0 '@types/pg': 8.20.0 - axios: 1.15.0(debug@4.4.3) - better-sqlite3: 12.6.2 + axios: 1.15.2(debug@4.4.3) + better-sqlite3: 12.9.0 cloudflare: 4.5.0(encoding@0.1.13) groq-sdk: 1.1.2 neo4j-driver: 6.0.1 ollama: 0.6.3 openai: 4.104.0(encoding@0.1.13)(ws@5.2.4(bufferutil@4.1.0))(zod@3.25.76) pg: 8.20.0 - redis: 5.11.0 + redis: 5.12.1(@opentelemetry/api@1.9.1) uuid: 9.0.1 zod: 3.25.76 transitivePeerDependencies: @@ -21822,7 +19822,7 @@ snapshots: mimic-response@3.1.0: {} - minimatch@10.2.4: + minimatch@10.2.5: dependencies: brace-expansion: 5.0.5 @@ -21833,11 +19833,6 @@ snapshots: minipass: 3.3.6 optional: true - minipass-collect@2.0.1: - dependencies: - minipass: 7.1.3 - optional: true - minipass-fetch@1.4.1: dependencies: minipass: 3.3.6 @@ -21847,16 +19842,7 @@ snapshots: encoding: 0.1.13 optional: true - minipass-fetch@5.0.2: - dependencies: - minipass: 7.1.3 - minipass-sized: 2.0.0 - minizlib: 3.1.0 - optionalDependencies: - iconv-lite: 0.7.2 - optional: true - - minipass-flush@1.0.5: + minipass-flush@1.0.7: dependencies: minipass: 3.3.6 optional: true @@ -21871,18 +19857,11 @@ snapshots: minipass: 3.3.6 optional: true - minipass-sized@2.0.0: - dependencies: - minipass: 7.1.3 - optional: true - minipass@3.3.6: dependencies: yallist: 4.0.0 optional: true - minipass@7.1.2: {} - minipass@7.1.3: {} minizlib@2.1.2: @@ -21905,28 +19884,28 @@ snapshots: mkdirp@3.0.1: {} - ml-array-max@1.2.4: + ml-array-max@2.0.0: dependencies: - is-any-array: 2.0.1 + is-any-array: 3.0.0 - ml-array-min@1.2.3: + ml-array-min@2.0.0: dependencies: - is-any-array: 2.0.1 + is-any-array: 3.0.0 - ml-array-rescale@1.3.7: + ml-array-rescale@2.0.0: dependencies: - is-any-array: 2.0.1 - ml-array-max: 1.2.4 - ml-array-min: 1.2.3 + is-any-array: 3.0.0 + ml-array-max: 2.0.0 + ml-array-min: 2.0.0 - ml-matrix@6.12.1: + ml-matrix@6.12.2: dependencies: - is-any-array: 2.0.1 - ml-array-rescale: 1.3.7 + is-any-array: 3.0.0 + ml-array-rescale: 2.0.0 - mlly@1.8.0: + mlly@1.8.2: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 @@ -21941,22 +19920,22 @@ snapshots: '@types/whatwg-url': 13.0.0 whatwg-url: 14.2.0 - mongodb@6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7): + mongodb@6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7): dependencies: - '@mongodb-js/saslprep': 1.4.5 + '@mongodb-js/saslprep': 1.4.8 bson: 6.10.4 mongodb-connection-string-url: 3.0.2 optionalDependencies: - '@aws-sdk/credential-providers': 3.985.0 + '@aws-sdk/credential-providers': 3.1034.0 socks: 2.8.7 - mongodb@7.1.1(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7): + mongodb@7.2.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7): dependencies: - '@mongodb-js/saslprep': 1.4.5 + '@mongodb-js/saslprep': 1.4.8 bson: 7.2.0 mongodb-connection-string-url: 7.0.1 optionalDependencies: - '@aws-sdk/credential-providers': 3.985.0 + '@aws-sdk/credential-providers': 3.1034.0 socks: 2.8.7 mri@1.2.0: {} @@ -21981,24 +19960,11 @@ snapshots: seq-queue: 0.0.5 sqlstring: 2.3.3 - mysql2@3.19.1(@types/node@25.5.0): - dependencies: - '@types/node': 25.5.0 - aws-ssl-profiles: 1.1.2 - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.7.2 - long: 5.3.2 - lru.min: 1.1.4 - named-placeholders: 1.1.6 - sql-escaper: 1.3.3 - optional: true - named-placeholders@1.1.6: dependencies: lru.min: 1.1.4 - nan@2.25.0: + nan@2.26.2: optional: true nanoid@3.3.11: {} @@ -22009,10 +19975,10 @@ snapshots: natural-compare@1.4.0: {} - needle@3.3.1: + needle@3.5.0: dependencies: iconv-lite: 0.6.3 - sax: 1.4.4 + sax: 1.6.0 negotiator@0.6.4: optional: true @@ -22035,34 +20001,34 @@ snapshots: neo4j-driver-core: 6.0.1 rxjs: 7.8.2 - netmask@2.0.2: {} + netmask@2.1.1: {} new-github-release-url@2.0.0: dependencies: type-fest: 2.19.0 - nice-grpc-client-middleware-retry@3.1.13: + nice-grpc-client-middleware-retry@3.1.14: dependencies: - abort-controller-x: 0.4.3 - nice-grpc-common: 2.0.2 + abort-controller-x: 0.5.0 + nice-grpc-common: 2.0.3 - nice-grpc-common@2.0.2: + nice-grpc-common@2.0.3: dependencies: ts-error: 1.0.6 - nice-grpc@2.1.14: + nice-grpc@2.1.15: dependencies: '@grpc/grpc-js': 1.14.3 - abort-controller-x: 0.4.3 - nice-grpc-common: 2.0.2 + abort-controller-x: 0.5.0 + nice-grpc-common: 2.0.3 - node-abi@3.87.0: + node-abi@3.89.0: dependencies: semver: 7.7.4 node-addon-api@7.1.1: {} - node-addon-api@8.5.0: {} + node-addon-api@8.7.0: {} node-domexception@1.0.0: {} @@ -22091,20 +20057,18 @@ snapshots: node-gyp-build@4.8.4: optional: true - node-gyp@12.2.0: + node-gyp@12.3.0: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.3 graceful-fs: 4.2.11 - make-fetch-happen: 15.0.5 nopt: 9.0.0 proc-log: 6.1.0 semver: 7.7.4 - tar: 7.5.11 - tinyglobby: 0.2.15 + tar: 7.5.13 + tinyglobby: 0.2.16 + undici: 8.1.0 which: 6.0.1 - transitivePeerDependencies: - - supports-color optional: true node-gyp@8.4.1: @@ -22117,7 +20081,7 @@ snapshots: npmlog: 6.0.2 rimraf: 3.0.2 semver: 7.7.4 - tar: 7.5.11 + tar: 7.5.13 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -22126,7 +20090,7 @@ snapshots: node-int64@0.4.0: {} - node-releases@2.0.36: {} + node-releases@2.0.38: {} nopt@5.0.0: dependencies: @@ -22189,9 +20153,9 @@ snapshots: nypm@0.6.5: dependencies: - citty: 0.2.0 + citty: 0.2.2 pathe: 2.0.3 - tinyexec: 1.0.4 + tinyexec: 1.1.1 object-assign@4.1.1: {} @@ -22326,12 +20290,7 @@ snapshots: ws: 8.20.0(bufferutil@4.1.0) zod: 3.25.76 - openai@6.22.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6): - optionalDependencies: - ws: 8.20.0(bufferutil@4.1.0) - zod: 4.3.6 - - openai@6.33.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6): + openai@6.34.0(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6): optionalDependencies: ws: 5.2.4(bufferutil@4.1.0) zod: 4.3.6 @@ -22384,7 +20343,7 @@ snapshots: is-interactive: 2.0.0 is-unicode-supported: 2.1.0 log-symbols: 7.0.1 - stdin-discarder: 0.3.1 + stdin-discarder: 0.3.2 string-width: 8.2.0 os-name@6.1.0: @@ -22418,27 +20377,27 @@ snapshots: '@oxfmt/binding-win32-ia32-msvc': 0.43.0 '@oxfmt/binding-win32-x64-msvc': 0.43.0 - oxlint@1.58.0: + oxlint@1.61.0: optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.58.0 - '@oxlint/binding-android-arm64': 1.58.0 - '@oxlint/binding-darwin-arm64': 1.58.0 - '@oxlint/binding-darwin-x64': 1.58.0 - '@oxlint/binding-freebsd-x64': 1.58.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.58.0 - '@oxlint/binding-linux-arm-musleabihf': 1.58.0 - '@oxlint/binding-linux-arm64-gnu': 1.58.0 - '@oxlint/binding-linux-arm64-musl': 1.58.0 - '@oxlint/binding-linux-ppc64-gnu': 1.58.0 - '@oxlint/binding-linux-riscv64-gnu': 1.58.0 - '@oxlint/binding-linux-riscv64-musl': 1.58.0 - '@oxlint/binding-linux-s390x-gnu': 1.58.0 - '@oxlint/binding-linux-x64-gnu': 1.58.0 - '@oxlint/binding-linux-x64-musl': 1.58.0 - '@oxlint/binding-openharmony-arm64': 1.58.0 - '@oxlint/binding-win32-arm64-msvc': 1.58.0 - '@oxlint/binding-win32-ia32-msvc': 1.58.0 - '@oxlint/binding-win32-x64-msvc': 1.58.0 + '@oxlint/binding-android-arm-eabi': 1.61.0 + '@oxlint/binding-android-arm64': 1.61.0 + '@oxlint/binding-darwin-arm64': 1.61.0 + '@oxlint/binding-darwin-x64': 1.61.0 + '@oxlint/binding-freebsd-x64': 1.61.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.61.0 + '@oxlint/binding-linux-arm-musleabihf': 1.61.0 + '@oxlint/binding-linux-arm64-gnu': 1.61.0 + '@oxlint/binding-linux-arm64-musl': 1.61.0 + '@oxlint/binding-linux-ppc64-gnu': 1.61.0 + '@oxlint/binding-linux-riscv64-gnu': 1.61.0 + '@oxlint/binding-linux-riscv64-musl': 1.61.0 + '@oxlint/binding-linux-s390x-gnu': 1.61.0 + '@oxlint/binding-linux-x64-gnu': 1.61.0 + '@oxlint/binding-linux-x64-musl': 1.61.0 + '@oxlint/binding-openharmony-arm64': 1.61.0 + '@oxlint/binding-win32-arm64-msvc': 1.61.0 + '@oxlint/binding-win32-ia32-msvc': 1.61.0 + '@oxlint/binding-win32-x64-msvc': 1.61.0 p-filter@2.1.0: dependencies: @@ -22469,9 +20428,6 @@ snapshots: aggregate-error: 3.1.0 optional: true - p-map@7.0.4: - optional: true - p-queue@6.6.2: dependencies: eventemitter3: 4.0.7 @@ -22489,7 +20445,7 @@ snapshots: p-retry@7.1.1: dependencies: - is-network-error: 1.3.0 + is-network-error: 1.3.1 p-throttle@7.0.0: {} @@ -22517,7 +20473,7 @@ snapshots: pac-resolver@7.0.1: dependencies: degenerator: 5.0.1 - netmask: 2.0.2 + netmask: 2.1.1 package-json-from-dist@1.0.1: {} @@ -22564,19 +20520,14 @@ snapshots: dependencies: entities: 6.0.1 - parse5@8.0.1: - dependencies: - entities: 8.0.0 - optional: true - parseurl@1.3.3: {} - patchright-core@1.59.1: + patchright-core@1.59.4: optional: true path-exists@4.0.0: {} - path-expression-matcher@1.2.0: {} + path-expression-matcher@1.5.0: {} path-is-absolute@1.0.1: {} @@ -22622,24 +20573,16 @@ snapshots: pg-cloudflare@1.3.0: optional: true - pg-connection-string@2.11.0: {} - pg-connection-string@2.12.0: {} pg-connection-string@2.6.2: {} pg-int8@1.0.1: {} - pg-pool@3.11.0(pg@8.18.0): - dependencies: - pg: 8.18.0 - pg-pool@3.13.0(pg@8.20.0): dependencies: pg: 8.20.0 - pg-protocol@1.11.0: {} - pg-protocol@1.13.0: {} pg-types@2.2.0: @@ -22650,16 +20593,6 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg@8.18.0: - dependencies: - pg-connection-string: 2.11.0 - pg-pool: 3.11.0(pg@8.18.0) - pg-protocol: 1.11.0 - pg-types: 2.2.0 - pgpass: 1.0.5 - optionalDependencies: - pg-cloudflare: 1.3.0 - pg@8.20.0: dependencies: pg-connection-string: 2.12.0 @@ -22698,14 +20631,14 @@ snapshots: dependencies: colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 4.0.2 + fast-copy: 4.0.3 fast-safe-stringify: 2.1.1 help-me: 5.0.0 joycon: 3.1.1 minimist: 1.2.8 on-exit-leak-free: 2.1.2 pino-abstract-transport: 3.0.0 - pump: 3.0.3 + pump: 3.0.4 secure-json-parse: 4.1.0 sonic-boom: 4.2.1 strip-json-comments: 5.0.3 @@ -22737,7 +20670,7 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.8.0 + mlly: 1.8.2 pathe: 2.0.3 pkg-types@2.3.0: @@ -22746,17 +20679,57 @@ snapshots: exsolve: 1.0.8 pathe: 2.0.3 - playwright-core@1.58.2: {} + playwright-core@1.59.1: {} - playwright@1.58.2: + playwright@1.59.1: dependencies: - playwright-core: 1.58.2 + playwright-core: 1.59.1 optionalDependencies: fsevents: 2.3.2 possible-typed-array-names@1.1.0: {} - postcss@8.5.6: + postcss-modules-extract-imports@3.1.0(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + + postcss-modules-local-by-default@4.2.0(postcss@8.5.10): + dependencies: + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 + postcss-selector-parser: 7.1.1 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.1(postcss@8.5.10): + dependencies: + postcss: 8.5.10 + postcss-selector-parser: 7.1.1 + + postcss-modules-values@4.0.0(postcss@8.5.10): + dependencies: + icss-utils: 5.1.0(postcss@8.5.10) + postcss: 8.5.10 + + postcss-modules@6.0.1(postcss@8.5.10): + dependencies: + generic-names: 4.0.0 + icss-utils: 5.1.0(postcss@8.5.10) + lodash.camelcase: 4.3.0 + postcss: 8.5.10 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.10) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.10) + postcss-modules-scope: 3.2.1(postcss@8.5.10) + postcss-modules-values: 4.0.0(postcss@8.5.10) + string-hash: 1.1.3 + + postcss-selector-parser@7.1.1: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.5.10: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -22782,8 +20755,8 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.87.0 - pump: 3.0.3 + node-abi: 3.89.0 + pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 tar-fs: 2.1.4 @@ -22793,13 +20766,7 @@ snapshots: prettier@2.8.8: {} - prettier@3.8.1: {} - - pretty-format@30.2.0: - dependencies: - '@jest/schemas': 30.0.5 - ansi-styles: 5.2.0 - react-is: 18.3.1 + prettier@3.8.3: {} pretty-format@30.3.0: dependencies: @@ -22815,17 +20782,17 @@ snapshots: dependencies: '@prisma/engines': 4.16.2 - prisma@7.6.0(@types/react@19.2.14)(better-sqlite3@12.6.2)(magicast@0.3.5)(react-dom@19.2.4(react@19.0.0))(react@19.0.0)(typescript@6.0.2): + prisma@7.7.0(@types/react@19.2.14)(better-sqlite3@12.9.0)(magicast@0.3.5)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(typescript@6.0.3): dependencies: - '@prisma/config': 7.6.0(magicast@0.3.5) - '@prisma/dev': 0.24.3(typescript@6.0.2) - '@prisma/engines': 7.6.0 - '@prisma/studio-core': 0.27.3(@types/react@19.2.14)(react-dom@19.2.4(react@19.0.0))(react@19.0.0) + '@prisma/config': 7.7.0(magicast@0.3.5) + '@prisma/dev': 0.24.3(typescript@6.0.3) + '@prisma/engines': 7.7.0 + '@prisma/studio-core': 0.27.3(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) mysql2: 3.15.3 postgres: 3.4.7 optionalDependencies: - better-sqlite3: 12.6.2 - typescript: 6.0.2 + better-sqlite3: 12.9.0 + typescript: 6.0.3 transitivePeerDependencies: - '@types/react' - '@types/react-dom' @@ -22889,7 +20856,7 @@ snapshots: '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 '@protobufjs/utf8': 1.1.0 - '@types/node': 25.5.0 + '@types/node': 25.6.0 long: 5.3.2 protocols@2.0.2: {} @@ -22920,14 +20887,14 @@ snapshots: dependencies: punycode: 2.3.1 - publint@0.3.17: + publint@0.3.18: dependencies: '@publint/pack': 0.1.4 package-manager-detector: 1.6.0 picocolors: 1.1.1 sade: 1.8.1 - pump@3.0.3: + pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 @@ -22958,7 +20925,7 @@ snapshots: q@1.5.1: {} - qs@6.15.0: + qs@6.15.1: dependencies: side-channel: 1.1.0 @@ -22986,6 +20953,11 @@ snapshots: defu: 6.1.7 destr: 2.0.5 + rc9@3.0.1: + dependencies: + defu: 6.1.7 + destr: 2.0.5 + rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -22993,14 +20965,14 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-dom@19.2.4(react@19.0.0): + react-dom@19.2.5(react@19.2.5): dependencies: - react: 19.0.0 + react: 19.2.5 scheduler: 0.27.0 react-is@18.3.1: {} - react@19.0.0: {} + react@19.2.5: {} read-package-json-fast@4.0.0: dependencies: @@ -23040,7 +21012,7 @@ snapshots: readdir-glob@1.1.3: dependencies: - minimatch: 10.2.4 + minimatch: 10.2.5 readdirp@3.6.0: dependencies: @@ -23056,7 +21028,7 @@ snapshots: rechoir@0.8.0: dependencies: - resolve: 1.22.11 + resolve: 1.22.12 redis-errors@1.2.0: {} @@ -23073,15 +21045,16 @@ snapshots: '@redis/search': 1.2.0(@redis/client@1.6.1) '@redis/time-series': 1.1.0(@redis/client@1.6.1) - redis@5.11.0: + redis@5.12.1(@opentelemetry/api@1.9.1): dependencies: - '@redis/bloom': 5.11.0(@redis/client@5.11.0) - '@redis/client': 5.11.0 - '@redis/json': 5.11.0(@redis/client@5.11.0) - '@redis/search': 5.11.0(@redis/client@5.11.0) - '@redis/time-series': 5.11.0(@redis/client@5.11.0) + '@redis/bloom': 5.12.1(@redis/client@5.12.1(@opentelemetry/api@1.9.1)) + '@redis/client': 5.12.1(@opentelemetry/api@1.9.1) + '@redis/json': 5.12.1(@redis/client@5.12.1(@opentelemetry/api@1.9.1)) + '@redis/search': 5.12.1(@redis/client@5.12.1(@opentelemetry/api@1.9.1)) + '@redis/time-series': 5.12.1(@redis/client@5.12.1(@opentelemetry/api@1.9.1)) transitivePeerDependencies: - '@node-rs/xxhash' + - '@opentelemetry/api' reflect-metadata@0.2.2: {} @@ -23094,19 +21067,19 @@ snapshots: dependencies: rc: 1.2.8 - release-it-pnpm@4.6.6(magicast@0.3.5)(release-it@19.2.4(@types/node@25.5.0)(magicast@0.3.5)): + release-it-pnpm@4.6.6(magicast@0.3.5)(release-it@19.2.4(@types/node@25.6.0)(magicast@0.3.5)): dependencies: bumpp: 10.4.1(magicast@0.3.5) changelogithub: 13.16.1(magicast@0.3.5) - conventional-changelog-conventionalcommits: 9.1.0 + conventional-changelog-conventionalcommits: 9.3.1 conventional-recommended-bump: 11.2.0 kolorist: 1.8.0 - release-it: 19.2.4(@types/node@25.5.0)(magicast@0.3.5) + release-it: 19.2.4(@types/node@25.6.0)(magicast@0.3.5) semver: 7.7.4 transitivePeerDependencies: - magicast - release-it@19.2.4(@types/node@25.5.0)(magicast@0.3.5): + release-it@19.2.4(@types/node@25.6.0)(magicast@0.3.5): dependencies: '@nodeutils/defaults-deep': 1.1.0 '@octokit/rest': 22.0.1 @@ -23116,7 +21089,7 @@ snapshots: ci-info: 4.4.0 eta: 4.5.0 git-url-parse: 16.1.0 - inquirer: 12.11.1(@types/node@25.5.0) + inquirer: 12.11.1(@types/node@25.6.0) issue-parser: 7.0.1 lodash.merge: 4.6.2 mime-types: 3.0.2 @@ -23127,7 +21100,7 @@ snapshots: proxy-agent: 6.5.0 semver: 7.7.3 tinyglobby: 0.2.15 - undici: 7.24.5 + undici: 8.1.0 url-join: 5.0.0 wildcard-match: 5.1.4 yargs-parser: 21.1.1 @@ -23154,8 +21127,9 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.12: dependencies: + es-errors: 1.3.0 is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -23170,9 +21144,9 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 - retry-axios@2.6.0(axios@1.15.0): + retry-axios@2.6.0(axios@1.15.2): dependencies: - axios: 1.15.0(debug@4.4.3) + axios: 1.15.2(debug@4.4.3) retry-request@7.0.2(encoding@0.1.13): dependencies: @@ -23199,16 +21173,12 @@ snapshots: glob: 7.2.3 optional: true - rimraf@5.0.10: - dependencies: - glob: 10.5.0 - rimraf@6.1.3: dependencies: glob: 13.0.6 package-json-from-dist: 1.0.1 - rolldown-plugin-dts@0.23.2(@typescript/native-preview@7.0.0-dev.20260405.1)(rolldown@1.0.0-rc.12)(typescript@5.9.3): + rolldown-plugin-dts@0.23.2(@typescript/native-preview@7.0.0-dev.20260421.2)(rolldown@1.0.0-rc.16)(typescript@5.9.3): dependencies: '@babel/generator': 8.0.0-rc.3 '@babel/helper-validator-identifier': 8.0.0-rc.3 @@ -23217,17 +21187,17 @@ snapshots: ast-kit: 3.0.0-beta.1 birpc: 4.0.0 dts-resolver: 2.1.3 - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 obug: 2.1.1 picomatch: 4.0.4 - rolldown: 1.0.0-rc.12 + rolldown: 1.0.0-rc.16 optionalDependencies: - '@typescript/native-preview': 7.0.0-dev.20260405.1 + '@typescript/native-preview': 7.0.0-dev.20260421.2 typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - rolldown-plugin-dts@0.23.2(@typescript/native-preview@7.0.0-dev.20260405.1)(rolldown@1.0.0-rc.12)(typescript@6.0.3): + rolldown-plugin-dts@0.23.2(@typescript/native-preview@7.0.0-dev.20260421.2)(rolldown@1.0.0-rc.16)(typescript@6.0.3): dependencies: '@babel/generator': 8.0.0-rc.3 '@babel/helper-validator-identifier': 8.0.0-rc.3 @@ -23236,85 +21206,66 @@ snapshots: ast-kit: 3.0.0-beta.1 birpc: 4.0.0 dts-resolver: 2.1.3 - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 obug: 2.1.1 picomatch: 4.0.4 - rolldown: 1.0.0-rc.12 + rolldown: 1.0.0-rc.16 optionalDependencies: - '@typescript/native-preview': 7.0.0-dev.20260405.1 + '@typescript/native-preview': 7.0.0-dev.20260421.2 typescript: 6.0.3 transitivePeerDependencies: - oxc-resolver - rolldown@1.0.0-rc.12: + rolldown@1.0.0-rc.16: dependencies: - '@oxc-project/types': 0.122.0 - '@rolldown/pluginutils': 1.0.0-rc.12 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.12 - '@rolldown/binding-darwin-x64': 1.0.0-rc.12 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.12 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.12 - '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.12 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.12 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.12 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.12 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.12 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.12 - - rolldown@1.0.0-rc.4: - dependencies: - '@oxc-project/types': 0.113.0 - '@rolldown/pluginutils': 1.0.0-rc.4 + '@oxc-project/types': 0.126.0 + '@rolldown/pluginutils': 1.0.0-rc.16 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-rc.4 - '@rolldown/binding-darwin-arm64': 1.0.0-rc.4 - '@rolldown/binding-darwin-x64': 1.0.0-rc.4 - '@rolldown/binding-freebsd-x64': 1.0.0-rc.4 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.4 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.4 - '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.4 - '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.4 - '@rolldown/binding-linux-x64-musl': 1.0.0-rc.4 - '@rolldown/binding-openharmony-arm64': 1.0.0-rc.4 - '@rolldown/binding-wasm32-wasi': 1.0.0-rc.4 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.4 - '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.4 - - rollup@4.59.0: + '@rolldown/binding-android-arm64': 1.0.0-rc.16 + '@rolldown/binding-darwin-arm64': 1.0.0-rc.16 + '@rolldown/binding-darwin-x64': 1.0.0-rc.16 + '@rolldown/binding-freebsd-x64': 1.0.0-rc.16 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.16 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.16 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.16 + '@rolldown/binding-linux-x64-musl': 1.0.0-rc.16 + '@rolldown/binding-openharmony-arm64': 1.0.0-rc.16 + '@rolldown/binding-wasm32-wasi': 1.0.0-rc.16 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.16 + '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.16 + + rollup@4.60.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.59.0 - '@rollup/rollup-android-arm64': 4.59.0 - '@rollup/rollup-darwin-arm64': 4.59.0 - '@rollup/rollup-darwin-x64': 4.59.0 - '@rollup/rollup-freebsd-arm64': 4.59.0 - '@rollup/rollup-freebsd-x64': 4.59.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.59.0 - '@rollup/rollup-linux-arm-musleabihf': 4.59.0 - '@rollup/rollup-linux-arm64-gnu': 4.59.0 - '@rollup/rollup-linux-arm64-musl': 4.59.0 - '@rollup/rollup-linux-loong64-gnu': 4.59.0 - '@rollup/rollup-linux-loong64-musl': 4.59.0 - '@rollup/rollup-linux-ppc64-gnu': 4.59.0 - '@rollup/rollup-linux-ppc64-musl': 4.59.0 - '@rollup/rollup-linux-riscv64-gnu': 4.59.0 - '@rollup/rollup-linux-riscv64-musl': 4.59.0 - '@rollup/rollup-linux-s390x-gnu': 4.59.0 - '@rollup/rollup-linux-x64-gnu': 4.59.0 - '@rollup/rollup-linux-x64-musl': 4.59.0 - '@rollup/rollup-openbsd-x64': 4.59.0 - '@rollup/rollup-openharmony-arm64': 4.59.0 - '@rollup/rollup-win32-arm64-msvc': 4.59.0 - '@rollup/rollup-win32-ia32-msvc': 4.59.0 - '@rollup/rollup-win32-x64-gnu': 4.59.0 - '@rollup/rollup-win32-x64-msvc': 4.59.0 + '@rollup/rollup-android-arm-eabi': 4.60.2 + '@rollup/rollup-android-arm64': 4.60.2 + '@rollup/rollup-darwin-arm64': 4.60.2 + '@rollup/rollup-darwin-x64': 4.60.2 + '@rollup/rollup-freebsd-arm64': 4.60.2 + '@rollup/rollup-freebsd-x64': 4.60.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.60.2 + '@rollup/rollup-linux-arm-musleabihf': 4.60.2 + '@rollup/rollup-linux-arm64-gnu': 4.60.2 + '@rollup/rollup-linux-arm64-musl': 4.60.2 + '@rollup/rollup-linux-loong64-gnu': 4.60.2 + '@rollup/rollup-linux-loong64-musl': 4.60.2 + '@rollup/rollup-linux-ppc64-gnu': 4.60.2 + '@rollup/rollup-linux-ppc64-musl': 4.60.2 + '@rollup/rollup-linux-riscv64-gnu': 4.60.2 + '@rollup/rollup-linux-riscv64-musl': 4.60.2 + '@rollup/rollup-linux-s390x-gnu': 4.60.2 + '@rollup/rollup-linux-x64-gnu': 4.60.2 + '@rollup/rollup-linux-x64-musl': 4.60.2 + '@rollup/rollup-openbsd-x64': 4.60.2 + '@rollup/rollup-openharmony-arm64': 4.60.2 + '@rollup/rollup-win32-arm64-msvc': 4.60.2 + '@rollup/rollup-win32-ia32-msvc': 4.60.2 + '@rollup/rollup-win32-x64-gnu': 4.60.2 + '@rollup/rollup-win32-x64-msvc': 4.60.2 fsevents: 2.3.3 router@2.2.0: @@ -23351,12 +21302,7 @@ snapshots: safer-buffer@2.1.2: {} - sax@1.4.4: {} - - saxes@6.0.0: - dependencies: - xmlchars: 2.2.0 - optional: true + sax@1.6.0: {} scheduler@0.27.0: {} @@ -23433,7 +21379,7 @@ snapshots: shell-quote@1.8.3: {} - side-channel-list@1.0.0: + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -23457,7 +21403,7 @@ snapshots: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.0 + side-channel-list: 1.0.1 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -23484,6 +21430,11 @@ snapshots: ansi-styles: 6.2.3 is-fullwidth-code-point: 5.1.0 + slice-ansi@8.0.0: + dependencies: + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 + smart-buffer@4.2.0: {} snappyjs@0.7.0: {} @@ -23523,12 +21474,6 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - optional: true - source-map@0.6.1: {} sparktype@0.1.3: @@ -23554,9 +21499,6 @@ snapshots: sprintf-js@1.0.3: {} - sql-escaper@1.3.3: - optional: true - sql-highlight@6.1.0: {} sqlite3@5.1.7: @@ -23564,7 +21506,7 @@ snapshots: bindings: 1.5.0 node-addon-api: 7.1.1 prebuild-install: 7.1.3 - tar: 7.5.11 + tar: 7.5.13 optionalDependencies: node-gyp: 8.4.1 transitivePeerDependencies: @@ -23574,13 +21516,11 @@ snapshots: sqlite3@6.0.1: dependencies: bindings: 1.5.0 - node-addon-api: 8.5.0 + node-addon-api: 8.7.0 prebuild-install: 7.1.3 - tar: 7.5.11 + tar: 7.5.13 optionalDependencies: - node-gyp: 12.2.0 - transitivePeerDependencies: - - supports-color + node-gyp: 12.3.0 sqlstring@2.3.3: {} @@ -23595,12 +21535,7 @@ snapshots: bcrypt-pbkdf: 1.0.2 optionalDependencies: cpu-features: 0.0.10 - nan: 2.25.0 - - ssri@13.0.1: - dependencies: - minipass: 7.1.3 - optional: true + nan: 2.26.2 ssri@8.0.1: dependencies: @@ -23615,17 +21550,21 @@ snapshots: stackback@0.0.2: {} + stacktrace-parser@0.1.11: + dependencies: + type-fest: 0.7.1 + standard-as-callback@2.1.0: {} statuses@2.0.2: {} std-env@3.10.0: {} - std-env@4.0.0: {} + std-env@4.1.0: {} stdin-discarder@0.2.2: {} - stdin-discarder@0.3.1: {} + stdin-discarder@0.3.2: {} stream-events@1.0.5: dependencies: @@ -23635,17 +21574,19 @@ snapshots: stream-shift@1.0.3: optional: true - streamx@2.23.0: + streamx@2.25.0: dependencies: events-universal: 1.0.1 fast-fifo: 1.3.2 - text-decoder: 1.2.3 + text-decoder: 1.2.7 transitivePeerDependencies: - bare-abort-controller - react-native-b4a string-argv@0.3.2: {} + string-hash@1.1.3: {} + string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -23710,7 +21651,7 @@ snapshots: dependencies: js-tokens: 9.0.1 - strnum@2.2.1: {} + strnum@2.2.3: {} strtok3@10.3.5: dependencies: @@ -23725,6 +21666,10 @@ snapshots: stubs@3.0.0: optional: true + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -23735,46 +21680,34 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: - optional: true - synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 table-layout@4.1.1: dependencies: - array-back: 6.2.2 + array-back: 6.2.3 wordwrapjs: 5.1.1 tagged-tag@1.0.0: {} + tailwindcss@4.2.4: {} + + tapable@2.3.3: {} + tar-fs@2.1.4: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.3 + pump: 3.0.4 tar-stream: 2.2.0 - tar-fs@3.1.1: - dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 - optionalDependencies: - bare-fs: 4.5.4 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-abort-controller - - bare-buffer - - react-native-b4a - optional: true - tar-fs@3.1.2: dependencies: - pump: 3.0.3 - tar-stream: 3.1.7 + pump: 3.0.4 + tar-stream: 3.1.8 optionalDependencies: - bare-fs: 4.5.4 + bare-fs: 4.7.1 bare-path: 3.0.0 transitivePeerDependencies: - bare-abort-controller @@ -23789,16 +21722,18 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - tar-stream@3.1.7: + tar-stream@3.1.8: dependencies: - b4a: 1.7.3 + b4a: 1.8.0 + bare-fs: 4.7.1 fast-fifo: 1.3.2 - streamx: 2.23.0 + streamx: 2.25.0 transitivePeerDependencies: - bare-abort-controller + - bare-buffer - react-native-b4a - tar@7.5.11: + tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -23822,35 +21757,26 @@ snapshots: teex@1.0.1: dependencies: - streamx: 2.23.0 + streamx: 2.25.0 transitivePeerDependencies: - bare-abort-controller - react-native-b4a - optional: true term-size@2.2.1: {} - terser@5.46.1: - dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.16.0 - commander: 2.20.3 - source-map-support: 0.5.21 - optional: true - test-exclude@6.0.0: dependencies: - '@istanbuljs/schema': 0.1.3 + '@istanbuljs/schema': 0.1.6 glob: 7.2.3 - minimatch: 10.2.4 + minimatch: 10.2.5 - test-exclude@7.0.1: + test-exclude@7.0.2: dependencies: - '@istanbuljs/schema': 0.1.3 + '@istanbuljs/schema': 0.1.6 glob: 10.5.0 - minimatch: 10.2.4 + minimatch: 10.2.5 - testcontainers@11.13.0: + testcontainers@11.14.0: dependencies: '@balena/dockerignore': 1.0.2 '@types/dockerode': 4.0.1 @@ -23859,23 +21785,23 @@ snapshots: byline: 5.0.0 debug: 4.4.3 docker-compose: 1.4.2 - dockerode: 4.0.9 - get-port: 7.1.0 + dockerode: 4.0.10 + get-port: 7.2.0 proper-lockfile: 4.1.2 properties-reader: 3.0.1 ssh-remote-port-forward: 1.0.4 tar-fs: 3.1.2 tmp: 0.2.5 - undici: 7.24.5 + undici: 8.1.0 transitivePeerDependencies: - bare-abort-controller - bare-buffer - react-native-b4a - supports-color - text-decoder@1.2.3: + text-decoder@1.2.7: dependencies: - b4a: 1.7.3 + b4a: 1.8.0 transitivePeerDependencies: - react-native-b4a @@ -23907,15 +21833,18 @@ snapshots: tinyexec@0.3.2: {} - tinyexec@1.0.2: {} - - tinyexec@1.0.4: {} + tinyexec@1.1.1: {} tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + tinypool@1.1.1: {} tinypool@2.1.0: {} @@ -23926,19 +21855,11 @@ snapshots: tinyspy@4.0.4: {} - tldts-core@7.0.23: {} - - tldts-core@7.0.29: - optional: true - - tldts@7.0.23: - dependencies: - tldts-core: 7.0.23 + tldts-core@7.0.28: {} - tldts@7.0.29: + tldts@7.0.28: dependencies: - tldts-core: 7.0.29 - optional: true + tldts-core: 7.0.28 tmp@0.2.5: {} @@ -23969,14 +21890,9 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 - tough-cookie@6.0.0: - dependencies: - tldts: 7.0.23 - tough-cookie@6.0.1: dependencies: - tldts: 7.0.29 - optional: true + tldts: 7.0.28 tr46@0.0.3: {} @@ -23984,11 +21900,6 @@ snapshots: dependencies: punycode: 2.3.1 - tr46@6.0.0: - dependencies: - punycode: 2.3.1 - optional: true - tree-kill@1.2.2: {} triple-beam@1.4.1: {} @@ -23997,12 +21908,12 @@ snapshots: ts-error@1.0.6: {} - ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.4.9(@babel/core@7.29.0)(@jest/transform@30.3.0)(@jest/types@30.3.0)(babel-jest@30.3.0(@babel/core@7.29.0))(jest-util@30.3.0)(jest@30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 handlebars: 4.7.9 - jest: 30.3.0(@types/node@25.5.0)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)) + jest: 30.3.0(@types/node@25.6.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 @@ -24017,7 +21928,7 @@ snapshots: babel-jest: 30.3.0(@babel/core@7.29.0) jest-util: 30.3.0 - ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@18.19.130)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@18.19.130)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -24025,8 +21936,8 @@ snapshots: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.19.130 - acorn: 8.15.0 - acorn-walk: 8.3.4 + acorn: 8.16.0 + acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.4 @@ -24035,18 +21946,18 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.24(@swc/helpers@0.5.18) + '@swc/core': 1.15.30(@swc/helpers@0.5.21) - ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 25.5.0 - acorn: 8.15.0 - acorn-walk: 8.3.4 + '@types/node': 25.6.0 + acorn: 8.16.0 + acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.4 @@ -24055,50 +21966,50 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.24(@swc/helpers@0.5.18) + '@swc/core': 1.15.30(@swc/helpers@0.5.21) - ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@6.0.2): + ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@6.0.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 25.5.0 - acorn: 8.15.0 - acorn-walk: 8.3.4 + '@types/node': 25.6.0 + acorn: 8.16.0 + acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 6.0.2 + typescript: 6.0.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.24(@swc/helpers@0.5.18) + '@swc/core': 1.15.30(@swc/helpers@0.5.21) optional: true - tsdown@0.21.7(@arethetypeswrong/core@0.18.2)(@typescript/native-preview@7.0.0-dev.20260405.1)(publint@0.3.17)(synckit@0.11.12)(typescript@5.9.3)(unplugin-unused@0.5.7): + tsdown@0.21.9(@arethetypeswrong/core@0.18.2)(@typescript/native-preview@7.0.0-dev.20260421.2)(publint@0.3.18)(synckit@0.11.12)(typescript@5.9.3)(unplugin-unused@0.5.7): dependencies: ansis: 4.2.0 cac: 7.0.0 defu: 6.1.7 empathic: 2.0.0 - hookable: 6.1.0 - import-without-cache: 0.2.5 + hookable: 6.1.1 + import-without-cache: 0.3.3 obug: 2.1.1 picomatch: 4.0.4 - rolldown: 1.0.0-rc.12 - rolldown-plugin-dts: 0.23.2(@typescript/native-preview@7.0.0-dev.20260405.1)(rolldown@1.0.0-rc.12)(typescript@5.9.3) + rolldown: 1.0.0-rc.16 + rolldown-plugin-dts: 0.23.2(@typescript/native-preview@7.0.0-dev.20260421.2)(rolldown@1.0.0-rc.16)(typescript@5.9.3) semver: 7.7.4 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 tree-kill: 1.2.2 unconfig-core: 7.5.0 - unrun: 0.2.34(synckit@0.11.12) + unrun: 0.2.36(synckit@0.11.12) optionalDependencies: '@arethetypeswrong/core': 0.18.2 - publint: 0.3.17 + publint: 0.3.18 typescript: 5.9.3 unplugin-unused: 0.5.7 transitivePeerDependencies: @@ -24108,27 +22019,27 @@ snapshots: - synckit - vue-tsc - tsdown@0.21.7(@arethetypeswrong/core@0.18.2)(@typescript/native-preview@7.0.0-dev.20260405.1)(publint@0.3.17)(synckit@0.11.12)(typescript@6.0.3)(unplugin-unused@0.5.7): + tsdown@0.21.9(@arethetypeswrong/core@0.18.2)(@typescript/native-preview@7.0.0-dev.20260421.2)(publint@0.3.18)(synckit@0.11.12)(typescript@6.0.3)(unplugin-unused@0.5.7): dependencies: ansis: 4.2.0 cac: 7.0.0 defu: 6.1.7 empathic: 2.0.0 - hookable: 6.1.0 - import-without-cache: 0.2.5 + hookable: 6.1.1 + import-without-cache: 0.3.3 obug: 2.1.1 picomatch: 4.0.4 - rolldown: 1.0.0-rc.12 - rolldown-plugin-dts: 0.23.2(@typescript/native-preview@7.0.0-dev.20260405.1)(rolldown@1.0.0-rc.12)(typescript@6.0.3) + rolldown: 1.0.0-rc.16 + rolldown-plugin-dts: 0.23.2(@typescript/native-preview@7.0.0-dev.20260421.2)(rolldown@1.0.0-rc.16)(typescript@6.0.3) semver: 7.7.4 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 tree-kill: 1.2.2 unconfig-core: 7.5.0 - unrun: 0.2.34(synckit@0.11.12) + unrun: 0.2.36(synckit@0.11.12) optionalDependencies: '@arethetypeswrong/core': 0.18.2 - publint: 0.3.17 + publint: 0.3.18 typescript: 6.0.3 unplugin-unused: 0.5.7 transitivePeerDependencies: @@ -24142,8 +22053,8 @@ snapshots: tsx@4.21.0: dependencies: - esbuild: 0.27.3 - get-tsconfig: 4.13.6 + esbuild: 0.28.0 + get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 @@ -24151,14 +22062,14 @@ snapshots: dependencies: safe-buffer: 5.2.1 - turbo@2.9.4: + turbo@2.9.6: optionalDependencies: - '@turbo/darwin-64': 2.9.4 - '@turbo/darwin-arm64': 2.9.4 - '@turbo/linux-64': 2.9.4 - '@turbo/linux-arm64': 2.9.4 - '@turbo/windows-64': 2.9.4 - '@turbo/windows-arm64': 2.9.4 + '@turbo/darwin-64': 2.9.6 + '@turbo/darwin-arm64': 2.9.6 + '@turbo/linux-64': 2.9.6 + '@turbo/linux-arm64': 2.9.6 + '@turbo/windows-64': 2.9.6 + '@turbo/windows-arm64': 2.9.6 tweetnacl@0.14.5: {} @@ -24170,11 +22081,13 @@ snapshots: type-fest@0.21.3: {} + type-fest@0.7.1: {} + type-fest@2.19.0: {} type-fest@4.41.0: {} - type-fest@5.4.4: + type-fest@5.6.0: dependencies: tagged-tag: 1.0.0 @@ -24190,15 +22103,15 @@ snapshots: es-errors: 1.3.0 is-typed-array: 1.1.15 - typeorm@0.3.28(better-sqlite3@12.6.2)(ioredis@5.10.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7))(mysql2@3.19.1(@types/node@25.5.0))(pg@8.18.0)(redis@4.7.1)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)): + typeorm@0.3.28(better-sqlite3@12.9.0)(ioredis@5.10.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7))(mysql2@3.15.3)(pg@8.20.0)(redis@4.7.1)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 4.2.0 app-root-path: 3.1.0 buffer: 6.0.3 - dayjs: 1.11.19 + dayjs: 1.11.20 debug: 4.4.3 - dedent: 1.7.1 + dedent: 1.7.2 dotenv: 16.6.1 glob: 10.5.0 reflect-metadata: 0.2.2 @@ -24208,27 +22121,27 @@ snapshots: uuid: 11.1.0 yargs: 17.7.2 optionalDependencies: - better-sqlite3: 12.6.2 + better-sqlite3: 12.9.0 ioredis: 5.10.1 - mongodb: 6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7) - mysql2: 3.19.1(@types/node@25.5.0) - pg: 8.18.0 + mongodb: 6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7) + mysql2: 3.15.3 + pg: 8.20.0 redis: 4.7.1 sqlite3: 5.1.7 - ts-node: 10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - typeorm@0.3.28(better-sqlite3@12.6.2)(ioredis@5.10.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7))(mysql2@3.19.1(@types/node@25.5.0))(pg@8.20.0)(redis@5.11.0)(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3)): + typeorm@0.3.28(better-sqlite3@12.9.0)(ioredis@5.10.1)(mongodb@6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7))(mysql2@3.15.3)(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(sqlite3@5.1.7)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 4.2.0 app-root-path: 3.1.0 buffer: 6.0.3 - dayjs: 1.11.19 + dayjs: 1.11.20 debug: 4.4.3 - dedent: 1.7.1 + dedent: 1.7.2 dotenv: 16.6.1 glob: 10.5.0 reflect-metadata: 0.2.2 @@ -24238,27 +22151,27 @@ snapshots: uuid: 11.1.0 yargs: 17.7.2 optionalDependencies: - better-sqlite3: 12.6.2 + better-sqlite3: 12.9.0 ioredis: 5.10.1 - mongodb: 6.21.0(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7) - mysql2: 3.19.1(@types/node@25.5.0) + mongodb: 6.21.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7) + mysql2: 3.15.3 pg: 8.20.0 - redis: 5.11.0 + redis: 5.12.1(@opentelemetry/api@1.9.1) sqlite3: 5.1.7 - ts-node: 10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - typeorm@0.3.28(better-sqlite3@12.6.2)(ioredis@5.10.1)(mongodb@7.1.1(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7))(mysql2@3.19.1(@types/node@25.5.0))(pg@8.20.0)(redis@5.11.0)(sqlite3@6.0.1)(ts-node@10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@6.0.2)): + typeorm@0.3.28(better-sqlite3@12.9.0)(ioredis@5.10.1)(mongodb@7.2.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7))(mysql2@3.15.3)(pg@8.20.0)(redis@5.12.1(@opentelemetry/api@1.9.1))(sqlite3@6.0.1)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@6.0.3)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 4.2.0 app-root-path: 3.1.0 buffer: 6.0.3 - dayjs: 1.11.19 + dayjs: 1.11.20 debug: 4.4.3 - dedent: 1.7.1 + dedent: 1.7.2 dotenv: 16.6.1 glob: 10.5.0 reflect-metadata: 0.2.2 @@ -24268,14 +22181,14 @@ snapshots: uuid: 11.1.0 yargs: 17.7.2 optionalDependencies: - better-sqlite3: 12.6.2 + better-sqlite3: 12.9.0 ioredis: 5.10.1 - mongodb: 7.1.1(@aws-sdk/credential-providers@3.985.0)(socks@2.8.7) - mysql2: 3.19.1(@types/node@25.5.0) + mongodb: 7.2.0(@aws-sdk/credential-providers@3.1034.0)(socks@2.8.7) + mysql2: 3.15.3 pg: 8.20.0 - redis: 5.11.0 + redis: 5.12.1(@opentelemetry/api@1.9.1) sqlite3: 6.0.1 - ts-node: 10.9.2(@swc/core@1.15.24(@swc/helpers@0.5.18))(@types/node@25.5.0)(typescript@6.0.2) + ts-node: 10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@25.6.0)(typescript@6.0.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -24286,14 +22199,12 @@ snapshots: typescript@5.9.3: {} - typescript@6.0.2: {} - typescript@6.0.3: {} - typesense@3.0.5(@babel/runtime@7.29.2): + typesense@3.0.6(@babel/runtime@7.29.2): dependencies: '@babel/runtime': 7.29.2 - axios: 1.15.0(debug@4.4.3) + axios: 1.15.2(debug@4.4.3) loglevel: 1.9.2 tslib: 2.8.1 transitivePeerDependencies: @@ -24323,7 +22234,7 @@ snapshots: unctx@2.5.0: dependencies: - acorn: 8.15.0 + acorn: 8.16.0 estree-walker: 3.0.3 magic-string: 0.30.21 unplugin: 2.3.11 @@ -24334,14 +22245,11 @@ snapshots: undici-types@7.16.0: {} - undici-types@7.18.2: {} - - undici-types@7.24.7: {} + undici-types@7.19.2: {} - undici@7.24.5: {} + undici-types@7.25.0: {} - undici@8.1.0: - optional: true + undici@8.1.0: {} unicorn-magic@0.3.0: {} @@ -24375,7 +22283,7 @@ snapshots: unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 + acorn: 8.16.0 picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 @@ -24409,15 +22317,15 @@ snapshots: '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 - unrun@0.2.34(synckit@0.11.12): + unrun@0.2.36(synckit@0.11.12): dependencies: - rolldown: 1.0.0-rc.12 + rolldown: 1.0.0-rc.16 optionalDependencies: synckit: 0.11.12 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.2 escalade: 3.2.0 picocolors: 1.1.1 @@ -24444,7 +22352,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.15.0 + qs: 6.15.1 urlpattern-polyfill@10.0.0: optional: true @@ -24477,9 +22385,9 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - valibot@1.2.0(typescript@6.0.2): + valibot@1.2.0(typescript@6.0.3): optionalDependencies: - typescript: 6.0.2 + typescript: 6.0.3 validate-npm-package-name@5.0.1: {} @@ -24489,13 +22397,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + vite-node@3.2.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) transitivePeerDependencies: - '@types/node' - jiti @@ -24510,27 +22418,27 @@ snapshots: - tsx - yaml - vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: - esbuild: 0.27.3 + esbuild: 0.28.0 fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - postcss: 8.5.6 - rollup: 4.59.0 - tinyglobby: 0.2.15 + postcss: 8.5.10 + rollup: 4.60.2 + tinyglobby: 0.2.16 optionalDependencies: - '@types/node': 25.5.0 + '@types/node': 25.6.0 fsevents: 2.3.3 jiti: 2.6.1 - terser: 5.46.1 + lightningcss: 1.32.0 tsx: 4.21.0 yaml: 2.8.3 - vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.5.0)(jiti@2.6.1)(jsdom@28.1.0)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3): + vitest@3.2.4(@types/debug@4.1.13)(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 3.2.4(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -24545,16 +22453,15 @@ snapshots: std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.15 + tinyglobby: 0.2.16 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) - vite-node: 3.2.4(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) + vite-node: 3.2.4(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.13 - '@types/node': 25.5.0 - jsdom: 28.1.0 + '@types/node': 25.6.0 transitivePeerDependencies: - jiti - less @@ -24569,39 +22476,39 @@ snapshots: - tsx - yaml - vitest@4.1.2(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@3.2.4)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: - '@vitest/expect': 4.1.2 - '@vitest/mocker': 4.1.2(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) - '@vitest/pretty-format': 4.1.2 - '@vitest/runner': 4.1.2 - '@vitest/snapshot': 4.1.2 - '@vitest/spy': 4.1.2 - '@vitest/utils': 4.1.2 + '@vitest/expect': 4.1.5 + '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/pretty-format': 4.1.5 + '@vitest/runner': 4.1.5 + '@vitest/snapshot': 4.1.5 + '@vitest/spy': 4.1.5 + '@vitest/utils': 4.1.5 es-module-lexer: 2.0.0 expect-type: 1.3.0 magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 4.0.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.0.2 - tinyglobby: 0.2.15 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 25.5.0 - jsdom: 28.1.0 + '@opentelemetry/api': 1.9.1 + '@types/node': 25.6.0 + '@vitest/coverage-v8': 3.2.4(vitest@4.1.5) transitivePeerDependencies: - msw - vitest@4.1.5(@opentelemetry/api@1.9.0)(@types/node@25.5.0)(jsdom@28.1.0)(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.5(@opentelemetry/api@1.9.1)(@types/node@25.6.0)(@vitest/coverage-v8@4.1.5)(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.5 - '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + '@vitest/mocker': 4.1.5(vite@7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3)) '@vitest/pretty-format': 4.1.5 '@vitest/runner': 4.1.5 '@vitest/snapshot': 4.1.5 @@ -24613,27 +22520,22 @@ snapshots: obug: 2.1.1 pathe: 2.0.3 picomatch: 4.0.4 - std-env: 4.0.0 + std-env: 4.1.0 tinybench: 2.9.0 - tinyexec: 1.0.4 - tinyglobby: 0.2.15 + tinyexec: 1.1.1 + tinyglobby: 0.2.16 tinyrainbow: 3.1.0 - vite: 7.3.2(@types/node@25.5.0)(jiti@2.6.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vite: 7.3.2(@types/node@25.6.0)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)(yaml@2.8.3) why-is-node-running: 2.3.0 optionalDependencies: - '@opentelemetry/api': 1.9.0 - '@types/node': 25.5.0 - jsdom: 28.1.0 + '@opentelemetry/api': 1.9.1 + '@types/node': 25.6.0 + '@vitest/coverage-v8': 4.1.5(vitest@4.1.5) transitivePeerDependencies: - msw voy-search@0.6.3: {} - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - optional: true - walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -24642,20 +22544,6 @@ snapshots: dependencies: defaults: 1.0.4 - weaviate-client@3.11.0(encoding@0.1.13): - dependencies: - '@datastructures-js/deque': 1.0.8 - abort-controller-x: 0.5.0 - graphql: 16.13.2 - graphql-request: 6.1.0(encoding@0.1.13)(graphql@16.13.2) - long: 5.3.2 - nice-grpc: 2.1.14 - nice-grpc-client-middleware-retry: 3.1.13 - nice-grpc-common: 2.0.2 - uuid: 9.0.1 - transitivePeerDependencies: - - encoding - weaviate-client@3.12.1(encoding@0.1.13): dependencies: '@datastructures-js/deque': 1.0.8 @@ -24663,9 +22551,9 @@ snapshots: graphql: 16.13.2 graphql-request: 6.1.0(encoding@0.1.13)(graphql@16.13.2) long: 5.3.2 - nice-grpc: 2.1.14 - nice-grpc-client-middleware-retry: 3.1.13 - nice-grpc-common: 2.0.2 + nice-grpc: 2.1.15 + nice-grpc-client-middleware-retry: 3.1.14 + nice-grpc-common: 2.0.3 uuid: 9.0.1 transitivePeerDependencies: - encoding @@ -24685,9 +22573,6 @@ snapshots: webidl-conversions@7.0.0: {} - webidl-conversions@8.0.1: - optional: true - webpack-virtual-modules@0.6.2: {} websocket-driver@0.7.4: @@ -24706,23 +22591,11 @@ snapshots: whatwg-mimetype@4.0.0: {} - whatwg-mimetype@5.0.0: - optional: true - whatwg-url@14.2.0: dependencies: tr46: 5.1.1 webidl-conversions: 7.0.0 - whatwg-url@16.0.1: - dependencies: - '@exodus/bytes': 1.15.0 - tr46: 6.0.0 - webidl-conversions: 8.0.1 - transitivePeerDependencies: - - '@noble/hashes' - optional: true - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -24733,7 +22606,7 @@ snapshots: which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 - call-bind: 1.0.8 + call-bind: 1.0.9 call-bound: 1.0.4 for-each: 0.3.5 get-proto: 1.0.1 @@ -24769,6 +22642,12 @@ snapshots: dependencies: execa: 8.0.1 + winston-console-format@1.0.8: + dependencies: + colors: 1.4.0 + logform: 2.7.0 + triple-beam: 1.4.1 + winston-transport@4.9.0: dependencies: logform: 2.7.0 @@ -24836,23 +22715,13 @@ snapshots: optionalDependencies: bufferutil: 4.1.0 - ws@8.19.0(bufferutil@4.1.0): - optionalDependencies: - bufferutil: 4.1.0 - ws@8.20.0(bufferutil@4.1.0): optionalDependencies: bufferutil: 4.1.0 wsl-utils@0.1.0: dependencies: - is-wsl: 3.1.0 - - xml-name-validator@5.0.0: - optional: true - - xmlchars@2.2.0: - optional: true + is-wsl: 3.1.1 xtend@4.0.2: {} From 805588394269b9e96c6067615658accc7a7218c2 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 24 Apr 2026 16:24:52 -0700 Subject: [PATCH 05/39] fix: updates to chat model stream / consolidation --- .../src/language_models/chat_models.ts | 2 +- .../src/language_models/compat.ts | 72 ++++++--------- .../src/language_models/event.ts | 81 ++++------------- .../src/language_models/stream.ts | 71 +++++++++------ .../src/language_models/tests/event.test.ts | 59 +++++-------- .../src/language_models/tests/stream.test.ts | 52 +++++------ .../tests/stream_bridge.test.ts | 18 ++-- .../tests/chat_models_stream_events.test.ts | 87 +++++++++++-------- .../src/utils/stream_events.ts | 44 +++------- 9 files changed, 213 insertions(+), 273 deletions(-) diff --git a/libs/langchain-core/src/language_models/chat_models.ts b/libs/langchain-core/src/language_models/chat_models.ts index 9fc38302d159..b646adc52a50 100644 --- a/libs/langchain-core/src/language_models/chat_models.ts +++ b/libs/langchain-core/src/language_models/chat_models.ts @@ -313,7 +313,7 @@ export abstract class BaseChatModel< * ``` * MessageStart * -> ContentBlockStart(index, contentBlock) - * -> ContentBlockDelta(index, contentBlock, delta) ... + * -> ContentBlockDelta(index, content) ... * -> ContentBlockFinish(index, contentBlock) * -> MessageFinish(reason, usage?) * ``` diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 6799e663eb37..3a557c83c898 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -9,7 +9,7 @@ import { isAIMessageChunk } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { ChatGenerationChunk } from "../outputs.js"; -import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; +import type { ChatModelStreamEvent } from "./event.js"; /** * Convert an async iterable of legacy `ChatGenerationChunk`s into @@ -74,7 +74,7 @@ export async function* convertChunksToEvents( yield { type: "content-block-delta" as const, index: blockIndex, - delta: { type: "text-delta" as const, text: content }, + content: { type: "text" as const, text: content }, }; } } else if (Array.isArray(content)) { @@ -94,12 +94,11 @@ export async function* convertChunksToEvents( }; } else { const block = activeBlocks.get(blockIndex)!; - const delta = contentBlockToDelta(part); - block.accumulated = applyDeltaToBlock(block.accumulated, delta); + block.accumulated = applyDeltaToBlock(block.accumulated, part); yield { type: "content-block-delta" as const, index: blockIndex, - delta, + content: part, }; } } @@ -136,7 +135,7 @@ export async function* convertChunksToEvents( }; } - // Accumulate tool call args internally, emit as block-delta with snapshot + // Accumulate tool call args internally, emit incremental content chunks. const block = activeBlocks.get(blockIndex)!; const acc = block.accumulated as { args?: string; @@ -149,10 +148,7 @@ export async function* convertChunksToEvents( yield { type: "content-block-delta" as const, index: blockIndex, - delta: { - type: "block-delta" as const, - fields: { ...block.accumulated }, - }, + content: { ...(block.accumulated as ContentBlock) }, }; } } @@ -196,54 +192,40 @@ export async function* convertChunksToEvents( */ function applyDeltaToBlock( block: ContentBlock, - delta: ContentBlockDelta + delta: ContentBlock ): ContentBlock { + if (block.type !== delta.type) { + return { ...delta }; + } + switch (delta.type) { - case "text-delta": + case "text": return { ...block, + ...delta, text: ((block as { text?: string }).text ?? "") + delta.text, }; - case "reasoning-delta": + case "reasoning": return { ...block, + ...delta, reasoning: ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, }; - case "block-delta": - return { ...block, ...delta.fields }; - default: - return block; - } -} - -/** - * Convert a legacy content block part to a typed delta. - * @internal - */ -function contentBlockToDelta(part: ContentBlock): ContentBlockDelta { - switch (part.type) { - case "text": - return { - type: "text-delta" as const, - text: (part as ContentBlock.Text).text ?? "", - }; - case "reasoning": - return { - type: "reasoning-delta" as const, - reasoning: (part as ContentBlock.Reasoning).reasoning ?? "", - }; case "tool_call_chunk": - case "tool_call": - return { - type: "block-delta" as const, - fields: part, - }; + case "server_tool_call_chunk": { + const merged = { ...block, ...delta } as Record; + if (delta.id == null && "id" in block && block.id != null) { + merged.id = block.id; + } + if (delta.name == null && "name" in block && block.name != null) { + merged.name = block.name; + } + merged.args = `${("args" in block ? block.args : "") ?? ""}${delta.args ?? ""}`; + return merged as unknown as ContentBlock; + } default: - return { - type: "block-delta" as const, - fields: part, - }; + return { ...block, ...delta }; } } diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts index eff0f60af0d6..5be0904d1a5b 100644 --- a/libs/langchain-core/src/language_models/event.ts +++ b/libs/langchain-core/src/language_models/event.ts @@ -3,13 +3,13 @@ * * Defines a content-block-centric event model for streaming chat model responses. * Events carry LangChain {@link ContentBlock} types on lifecycle boundaries - * (start/finish) and typed incremental deltas during streaming. + * and as incremental content updates during streaming. * * ## Design Principles * - * 1. **Typed deltas for common cases.** Text, reasoning, and tool call argument - * streaming get purpose-built delta types with explicit append semantics. - * Everything else uses `block-delta` with overwrite semantics. + * 1. **Content-block deltas use the content block shape.** Text, reasoning, + * and tool-call chunks are emitted as partial {@link ContentBlock} values + * with explicit append semantics. * * 2. **Lifecycle completeness.** Every streamable entity has explicit start and finish * events. Consumers never need to infer boundaries from absence of events. @@ -26,8 +26,8 @@ * ``` * MessageStart * -> ContentBlockStart(index=0, content=...) - * -> ContentBlockDelta(index=0, delta={ type: "text-delta", text: "Hello" }) - * -> ContentBlockDelta(index=0, delta={ type: "text-delta", text: " world" }) + * -> ContentBlockDelta(index=0, content={ type: "text", text: "Hello" }) + * -> ContentBlockDelta(index=0, content={ type: "text", text: " world" }) * -> ContentBlockFinish(index=0, content=...) * -> UsageUpdate(...) * -> MessageFinish(reason, usage?) @@ -37,56 +37,8 @@ */ import type { ContentBlock } from "../messages/content/index.js"; -import type { PartialContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; -// ─── Content Block Deltas ─────────────────────────────────────── - -/** - * Incremental text content. **Append** `text` to the block's `text` field. - */ -export interface TextDelta { - type: "text-delta"; - /** The new text to append. */ - text: string; -} - -/** - * Incremental reasoning content. **Append** `reasoning` to the block's `reasoning` field. - */ -export interface ReasoningDelta { - type: "reasoning-delta"; - /** The new reasoning text to append. */ - reasoning: string; -} - -/** - * Catch-all delta for content block types without a dedicated delta type. - * **Overwrite** fields from `fields` onto the accumulated block. - * - * The adapter is responsible for accumulating state internally. - * Each `block-delta` carries the accumulated snapshot of the fields - * it manages, so consumers simply overwrite. - * - * Used for tool call argument streaming, code interpreter output, - * signatures, citations, compaction, etc. - */ -export interface BlockDelta { - type: "block-delta"; - /** Fields to overwrite on the accumulated content block. */ - fields: PartialContentBlock; -} - -/** - * Union of all content block delta types. - * - * Accumulation rules: - * - `text-delta` → **append** `text` to block's text field - * - `reasoning-delta` → **append** `reasoning` to block's reasoning field - * - `block-delta` → **overwrite** fields onto block (adapter accumulates internally) - */ -export type ContentBlockDelta = TextDelta | ReasoningDelta | BlockDelta; - // ─── Message Lifecycle ────────────────────────────────────────── /** @@ -119,7 +71,7 @@ export type FinishReason = "stop" | "length" | "tool_use" | "content_filter"; export interface MessageFinishEvent { type: "message-finish"; /** Why the model stopped generating. */ - reason: FinishReason; + reason?: FinishReason; /** Final usage snapshot. */ usage?: UsageMetadata; /** Provider-specific response metadata (model name, response ID, headers, etc.). */ @@ -148,30 +100,35 @@ export interface ContentBlockStartEvent { /** * Emitted for each incremental update within a content block. * - * The `delta` field carries a typed incremental update. Consumers - * switch on `delta.type` to determine how to apply it. + * The `content` field carries the incremental content block update. + * Accumulation rules: + * - `text` → append `text` to the block's text field + * - `reasoning` → append `reasoning` to the block's reasoning field + * - `tool_call_chunk` / `server_tool_call_chunk` → append `args`, + * preserving stable `id`/`name` when later chunks omit them + * - all other fields are shallow-merged * * @example * ```ts * // Text token * { type: "content-block-delta", index: 0, - * delta: { type: "text-delta", text: " world" } } + * content: { type: "text", text: " world" } } * * // Tool call args chunk * { type: "content-block-delta", index: 1, - * delta: { type: "block-delta", fields: { type: "tool_call_chunk", args: '{"q":"wea' } } } + * content: { type: "tool_call_chunk", args: '{"q":"wea' } } * * // Provider-specific field (e.g., signature) * { type: "content-block-delta", index: 0, - * delta: { type: "block-delta", content: { type: "reasoning", signature: "sig_abc" } } } + * content: { type: "reasoning", signature: "sig_abc" } } * ``` */ export interface ContentBlockDeltaEvent { type: "content-block-delta"; /** Positional index of the block being updated. */ index: number; - /** Typed incremental delta. */ - delta: ContentBlockDelta; + /** Incremental content block update. */ + content: ContentBlock; } /** diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 8080519c489d..043a112a81b3 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -7,7 +7,7 @@ import { AIMessage } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; -import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; +import type { ChatModelStreamEvent } from "./event.js"; // ─── Replay Buffer ────────────────────────────────────────────── @@ -83,32 +83,47 @@ class ReplayBuffer { /** * Apply a typed delta to an accumulated content block. * - * - `text-delta` → append text - * - `reasoning-delta` → append reasoning - * - `block-delta` → overwrite fields + * - `text` → append text + * - `reasoning` → append reasoning + * - `tool_call_chunk` / `server_tool_call_chunk` → append args while + * preserving id/name from previous chunks when a later delta omits them + * - other block types → shallow merge * * @internal */ -function applyDelta( - block: ContentBlock, - delta: ContentBlockDelta -): ContentBlock { +function applyDelta(block: ContentBlock, delta: ContentBlock): ContentBlock { + if (block.type !== delta.type) { + return { ...delta }; + } + switch (delta.type) { - case "text-delta": + case "text": return { ...block, + ...delta, text: ((block as { text?: string }).text ?? "") + delta.text, }; - case "reasoning-delta": + case "reasoning": return { ...block, + ...delta, reasoning: ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, }; - case "block-delta": - return { ...block, ...delta.fields }; + case "tool_call_chunk": + case "server_tool_call_chunk": { + const merged = { ...block, ...delta } as Record; + if (delta.id == null && "id" in block && block.id != null) { + merged.id = block.id; + } + if (delta.name == null && "name" in block && block.name != null) { + merged.name = block.name; + } + merged.args = `${("args" in block ? block.args : "") ?? ""}${delta.args ?? ""}`; + return merged as unknown as ContentBlock; + } default: - return block; + return { ...block, ...delta }; } } @@ -141,9 +156,10 @@ export class TextContentStream for await (const event of buffer.iterate()) { if ( event.type === "content-block-delta" && - event.delta.type === "text-delta" + event.content.type === "text" && + typeof event.content.text === "string" ) { - accumulated += event.delta.text; + accumulated += event.content.text; yield accumulated; } } @@ -158,9 +174,10 @@ export class TextContentStream for await (const event of buffer.iterate()) { if ( event.type === "content-block-delta" && - event.delta.type === "text-delta" + event.content.type === "text" && + typeof event.content.text === "string" ) { - yield event.delta.text; + yield event.content.text; } } } @@ -281,9 +298,10 @@ export class ReasoningContentStream for await (const event of buffer.iterate()) { if ( event.type === "content-block-delta" && - event.delta.type === "reasoning-delta" + event.content.type === "reasoning" && + typeof event.content.reasoning === "string" ) { - accumulated += event.delta.reasoning; + accumulated += event.content.reasoning; yield accumulated; } } @@ -297,9 +315,10 @@ export class ReasoningContentStream for await (const event of buffer.iterate()) { if ( event.type === "content-block-delta" && - event.delta.type === "reasoning-delta" + event.content.type === "reasoning" && + typeof event.content.reasoning === "string" ) { - yield event.delta.reasoning; + yield event.content.reasoning; } } } @@ -327,7 +346,7 @@ export class ReasoningContentStream * Typed stream for usage metadata. */ export class UsageMetadataStream - implements AsyncIterable, PromiseLike + implements AsyncIterable, PromiseLike { /** @internal */ private _buffer: ReplayBuffer; @@ -353,9 +372,9 @@ export class UsageMetadataStream return gen(); } - then( + then( onfulfilled?: - | ((value: UsageMetadata) => TResult1 | PromiseLike) + | ((value: UsageMetadata | undefined) => TResult1 | PromiseLike) | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null ): PromiseLike { @@ -364,7 +383,7 @@ export class UsageMetadataStream for await (const usage of this) { latest = usage; } - return latest ?? { input_tokens: 0, output_tokens: 0, total_tokens: 0 }; + return latest; })(); return promise.then(onfulfilled, onrejected); } @@ -461,7 +480,7 @@ export class ChatModelStream case "content-block-delta": { const current = contentBlocks[event.index]; if (current) { - contentBlocks[event.index] = applyDelta(current, event.delta); + contentBlocks[event.index] = applyDelta(current, event.content); } break; } diff --git a/libs/langchain-core/src/language_models/tests/event.test.ts b/libs/langchain-core/src/language_models/tests/event.test.ts index 6c842565a171..5750072d9b9e 100644 --- a/libs/langchain-core/src/language_models/tests/event.test.ts +++ b/libs/langchain-core/src/language_models/tests/event.test.ts @@ -58,13 +58,13 @@ describe("ChatModelStreamEvent types", () => { const event: ContentBlockDeltaEvent = { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: " world" }, + content: { type: "text", text: " world" }, }; expect(event.type).toBe("content-block-delta"); expect(event.index).toBe(0); - expect(event.delta.type).toBe("text-delta"); - if (event.delta.type === "text-delta") { - expect(event.delta.text).toBe(" world"); + expect(event.content.type).toBe("text"); + if (event.content.type === "text") { + expect(event.content.text).toBe(" world"); } }); @@ -72,45 +72,36 @@ describe("ChatModelStreamEvent types", () => { const event: ContentBlockDeltaEvent = { type: "content-block-delta", index: 1, - delta: { - type: "block-delta", - fields: { - type: "tool_call_chunk", - id: "call_1", - name: "search", - args: '{"q":"wea', - }, + content: { + type: "tool_call_chunk", + id: "call_1", + name: "search", + args: '{"q":"wea', }, }; expect(event.type).toBe("content-block-delta"); - expect(event.delta.type).toBe("block-delta"); + expect(event.content.type).toBe("tool_call_chunk"); }); test("ContentBlockDeltaEvent with reasoning-delta", () => { const event: ContentBlockDeltaEvent = { type: "content-block-delta", index: 0, - delta: { type: "reasoning-delta", reasoning: "Let me think" }, + content: { type: "reasoning", reasoning: "Let me think" }, }; - expect(event.delta.type).toBe("reasoning-delta"); - if (event.delta.type === "reasoning-delta") { - expect(event.delta.reasoning).toBe("Let me think"); + expect(event.content.type).toBe("reasoning"); + if (event.content.type === "reasoning") { + expect(event.content.reasoning).toBe("Let me think"); } }); - test("ContentBlockDeltaEvent with block-delta", () => { + test("ContentBlockDeltaEvent with content block delta", () => { const event: ContentBlockDeltaEvent = { type: "content-block-delta", index: 0, - delta: { - type: "block-delta", - fields: { type: "reasoning", signature: "sig_abc" }, - }, + content: { type: "reasoning", signature: "sig_abc" }, }; - expect(event.delta.type).toBe("block-delta"); - if (event.delta.type === "block-delta") { - expect(event.delta.fields.type).toBe("reasoning"); - } + expect(event.content.type).toBe("reasoning"); }); test("ContentBlockFinishEvent with text", () => { @@ -179,7 +170,7 @@ describe("ChatModelStreamEvent types", () => { { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: "hi" }, + content: { type: "text", text: "hi" }, }, { type: "content-block-finish", @@ -233,20 +224,17 @@ describe("interleaving semantics", () => { { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: "Hello" }, + content: { type: "text", text: "Hello" }, }, { type: "content-block-delta", index: 1, - delta: { - type: "block-delta", - fields: { type: "tool_call_chunk", args: '{"q"' }, - }, + content: { type: "tool_call_chunk", args: '{"q"' }, }, { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: " world" }, + content: { type: "text", text: " world" }, }, { type: "content-block-finish", @@ -256,10 +244,7 @@ describe("interleaving semantics", () => { { type: "content-block-delta", index: 1, - delta: { - type: "block-delta", - fields: { type: "tool_call_chunk", args: '{"q":"test"}' }, - }, + content: { type: "tool_call_chunk", args: '{"q":"test"}' }, }, { type: "content-block-finish", diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 548357685204..dd2d40adcabc 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from "vitest"; import type { ChatModelStreamEvent } from "../event.js"; -import { ChatModelStream, ChatModelStream } from "../stream.js"; +import { ChatModelStream } from "../stream.js"; // Helper: create an async iterable from an array of events async function* iterEvents( @@ -23,12 +23,12 @@ function textStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: "Hello" }, + content: { type: "text", text: "Hello" }, }, { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: " world" }, + content: { type: "text", text: " world" }, }, { type: "content-block-finish", @@ -65,12 +65,12 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 0, - delta: { type: "reasoning-delta", reasoning: "Let me" }, + content: { type: "reasoning", reasoning: "Let me" }, }, { type: "content-block-delta", index: 0, - delta: { type: "reasoning-delta", reasoning: " think..." }, + content: { type: "reasoning", reasoning: " think..." }, }, { type: "content-block-finish", @@ -86,12 +86,12 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 1, - delta: { type: "text-delta", text: "The answer" }, + content: { type: "text", text: "The answer" }, }, { type: "content-block-delta", index: 1, - delta: { type: "text-delta", text: " is 42." }, + content: { type: "text", text: " is 42." }, }, { type: "content-block-finish", @@ -112,8 +112,8 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 2, - delta: { - type: "tool-call-delta", + content: { + type: "tool_call_chunk", id: "call_1", name: "calculator", args: '{"expr', @@ -122,14 +122,11 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { type: "content-block-delta", index: 2, - delta: { - type: "block-delta", - fields: { - type: "tool_call_chunk", - id: "call_1", - name: "calculator", - args: '{"expr":"6*7"}', - }, + content: { + type: "tool_call_chunk", + id: "call_1", + name: "calculator", + args: '":"6*7"}', }, }, { @@ -277,20 +274,19 @@ describe("ChatModelStream", () => { test("await resolves to final usage", async () => { const stream = new ChatModelStream(iterEvents(complexStreamEvents())); const usage = await stream.usage; - expect(usage.input_tokens).toBe(50); - expect(usage.output_tokens).toBe(30); - expect(usage.total_tokens).toBe(80); + expect(usage?.input_tokens).toBe(50); + expect(usage?.output_tokens).toBe(30); + expect(usage?.total_tokens).toBe(80); }); - test("resolves to zero usage when none provided", async () => { + test("resolves to undefined usage when none provided", async () => { const events: ChatModelStreamEvent[] = [ { type: "message-start" }, - { type: "message-finish", reason: "stop" }, + { type: "message-finish" }, ]; const stream = new ChatModelStream(iterEvents(events)); const usage = await stream.usage; - expect(usage.input_tokens).toBe(0); - expect(usage.output_tokens).toBe(0); + expect(usage).toBeUndefined(); }); }); @@ -378,7 +374,7 @@ describe("ChatModelStream", () => { expect(text).toBe("The answer is 42."); expect(tools.length).toBe(1); expect(tools[0]!.name).toBe("calculator"); - expect(usage.total_tokens).toBe(80); + expect(usage?.total_tokens).toBe(80); }); test("iterating raw events then awaiting sub-stream via replay", async () => { @@ -415,7 +411,7 @@ describe("ChatModelStream", () => { { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: "Result" }, + content: { type: "text", text: "Result" }, }, { type: "content-block-finish", @@ -458,7 +454,7 @@ describe("ChatModelStream", () => { { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: "Hello" }, + content: { type: "text", text: "Hello" }, }, { type: "content-block-finish", @@ -486,7 +482,7 @@ describe("ChatModelStream", () => { { type: "content-block-delta", index: 0, - delta: { type: "text-delta", text: "Partial" }, + content: { type: "text", text: "Partial" }, }, { type: "error", message: "Connection lost", code: "CONN_ERR" }, { type: "message-finish", reason: "stop" }, diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts index 1a91a317563b..695caf91d169 100644 --- a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -212,19 +212,19 @@ describe("_streamChatModelEvents bridge", () => { expect(events[2]!.type).toBe("content-block-delta"); const delta1 = events[2] as { index: number; - delta: { type: string; text?: string }; + content: { type: string; text?: string }; }; - expect(delta1.delta.type).toBe("text-delta"); - expect(delta1.delta.text).toBe("Hello"); + expect(delta1.content.type).toBe("text"); + expect(delta1.content.text).toBe("Hello"); // content-block-delta for " world" expect(events[3]!.type).toBe("content-block-delta"); const delta2 = events[3] as { index: number; - delta: { type: string; text?: string }; + content: { type: string; text?: string }; }; - expect(delta2.delta.type).toBe("text-delta"); - expect(delta2.delta.text).toBe(" world"); + expect(delta2.content.type).toBe("text"); + expect(delta2.content.text).toBe(" world"); // content-block-finish const finishIdx = events.findIndex( @@ -282,10 +282,10 @@ describe("_streamChatModelEvents bridge", () => { const lastReasoningDelta = reasoningDeltas[ reasoningDeltas.length - 1 ] as { - delta: { type: string; reasoning?: string }; + content: { type: string; reasoning?: string }; }; - expect(lastReasoningDelta.delta.type).toBe("reasoning-delta"); - expect(lastReasoningDelta.delta.reasoning).toBe(" hard..."); + expect(lastReasoningDelta.content.type).toBe("reasoning"); + expect(lastReasoningDelta.content.reasoning).toBe(" hard..."); // Finish events for both blocks const finishes = events.filter((e) => e.type === "content-block-finish"); diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts index e1aeb2621e77..b471c19593fa 100644 --- a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from "vitest"; import type { ChatModelStreamEvent } from "@langchain/core/language_models/event"; -import { ChatModelStream } from "@langchain/core/language_models/stream"; +import { ChatModelStream } from "../../../../langchain-core/src/language_models/stream.js"; import { ChatAnthropic } from "../chat_models.js"; import type { BaseChatModelCallOptions } from "@langchain/core/language_models/chat_models"; @@ -23,7 +23,7 @@ class MockStreamChatAnthropic extends ChatAnthropic { protected async createStreamWithRetry(): Promise { const events = this.mockEvents; return { - controller: { abort: () => {} }, + controller: { abort: () => { } }, async *[Symbol.asyncIterator]() { for (const event of events) { yield event; @@ -281,17 +281,17 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // First delta: incremental "Hello" const d1 = deltas[0] as { - delta: { type: string; text?: string }; + content: { type: string; text?: string }; }; - expect(d1.delta.type).toBe("text-delta"); - expect(d1.delta.text).toBe("Hello"); + expect(d1.content.type).toBe("text"); + expect(d1.content.text).toBe("Hello"); // Second delta: incremental " world" const d2 = deltas[1] as { - delta: { type: string; text?: string }; + content: { type: string; text?: string }; }; - expect(d2.delta.type).toBe("text-delta"); - expect(d2.delta.text).toBe(" world"); + expect(d2.content.type).toBe("text"); + expect(d2.content.text).toBe(" world"); }); test("content-block-finish carries finalized text", async () => { @@ -346,20 +346,21 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { e.type === "content-block-delta" && "index" in e && e.index === 0 && - "delta" in e && - (e.delta as { type: string }).type === "reasoning-delta" + "content" in e && + (e.content as { type: string }).type === "reasoning" && + "reasoning" in e.content ); expect(reasoningDeltas.length).toBe(2); const rd1 = reasoningDeltas[0] as { - delta: { type: string; reasoning: string }; + content: { type: string; reasoning: string }; }; - expect(rd1.delta.reasoning).toBe("Let me"); + expect(rd1.content.reasoning).toBe("Let me"); const rd2 = reasoningDeltas[1] as { - delta: { type: string; reasoning: string }; + content: { type: string; reasoning: string }; }; - expect(rd2.delta.reasoning).toBe(" reason..."); + expect(rd2.content.reasoning).toBe(" reason..."); // Reasoning finish const reasoningFinish = events.find( @@ -398,15 +399,15 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - // Signature delta should be emitted as a block-delta + // Signature delta should be emitted as a content block update const sigDelta = events.find( (e) => e.type === "content-block-delta" && - "delta" in e && - (e.delta as { type: string }).type === "block-delta" - ) as { delta: { type: string; fields?: { signature?: string } } }; + "content" in e && + (e.content as { signature?: string }).signature === "sig_abc" + ) as { content: { type: string; signature?: string } }; expect(sigDelta).toBeDefined(); - expect(sigDelta.delta.fields?.signature).toBe("sig_abc"); + expect(sigDelta.content.signature).toBe("sig_abc"); }); }); @@ -429,23 +430,23 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { expect(toolStart.content.name).toBe("web_search"); expect(toolStart.content.id).toBe("toolu_01ABC"); - // Deltas carry incremental tool-call-delta + // Deltas carry incremental tool_call_chunk content const toolDeltas = events.filter( (e) => e.type === "content-block-delta" && "index" in e && e.index === 1 ); expect(toolDeltas.length).toBe(2); const td1 = toolDeltas[0] as { - delta: { type: string; fields?: { args?: string } }; + content: { type: string; args?: string }; }; - expect(td1.delta.type).toBe("block-delta"); - expect(td1.delta.fields?.args).toBe('{"query"'); + expect(td1.content.type).toBe("tool_call_chunk"); + expect(td1.content.args).toBe('{"query"'); const td2 = toolDeltas[1] as { - delta: { type: string; fields?: { args?: string } }; + content: { type: string; args?: string }; }; - expect(td2.delta.type).toBe("block-delta"); - expect(td2.delta.fields?.args).toBe('{"query":"weather"}'); + expect(td2.content.type).toBe("tool_call_chunk"); + expect(td2.content.args).toBe(':"weather"}'); }); test("tool call finish has parsed args", async () => { @@ -621,14 +622,18 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { describe("integration with ChatModelStream", () => { test("text sub-stream works end-to-end", async () => { const model = new MockStreamChatAnthropic(textOnlyEvents()); - const stream = model.streamV2([]); + const stream = new ChatModelStream( + model._streamChatModelEvents([], {} as BaseChatModelCallOptions) + ); const text = await stream.text; expect(text).toBe("Hello world"); }); test("toolCalls sub-stream works end-to-end", async () => { const model = new MockStreamChatAnthropic(toolCallEvents()); - const stream = model.streamV2([]); + const stream = new ChatModelStream( + model._streamChatModelEvents([], {} as BaseChatModelCallOptions) + ); const calls = await stream.toolCalls; expect(calls.length).toBe(1); expect(calls[0]!.name).toBe("web_search"); @@ -637,14 +642,18 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { test("reasoning sub-stream works end-to-end", async () => { const model = new MockStreamChatAnthropic(thinkingPlusTextEvents()); - const stream = model.streamV2([]); + const stream = new ChatModelStream( + model._streamChatModelEvents([], {} as BaseChatModelCallOptions) + ); const reasoning = await stream.reasoning; expect(reasoning).toBe("Let me reason..."); }); test("output assembles correct AIMessage", async () => { const model = new MockStreamChatAnthropic(toolCallEvents()); - const stream = model.streamV2([]); + const stream = new ChatModelStream( + model._streamChatModelEvents([], {} as BaseChatModelCallOptions) + ); const message = await stream.output; expect(message.id).toBe("msg_03GHI"); @@ -672,22 +681,30 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { test("usage sub-stream works end-to-end", async () => { const model = new MockStreamChatAnthropic(cacheUsageEvents()); - const stream = model.streamV2([]); + const stream = new ChatModelStream( + model._streamChatModelEvents([], { + streamUsage: true, + } as BaseChatModelCallOptions) + ); const usage = await stream.usage; - expect(usage.input_tokens).toBe(800); - expect(usage.output_tokens).toBe(3); + expect(usage?.input_tokens).toBe(800); + expect(usage?.output_tokens).toBe(3); }); test("await stream returns AIMessage directly", async () => { const model = new MockStreamChatAnthropic(textOnlyEvents()); - const message = await model.streamV2([]); + const message = await new ChatModelStream( + model._streamChatModelEvents([], {} as BaseChatModelCallOptions) + ); expect(message._getType()).toBe("ai"); expect(message.id).toBe("msg_01ABC"); }); test("sequential sub-stream consumption", async () => { const model = new MockStreamChatAnthropic(toolCallEvents()); - const stream = model.streamV2([]); + const stream = new ChatModelStream( + model._streamChatModelEvents([], {} as BaseChatModelCallOptions) + ); // Sequential consumption works reliably. // Parallel consumption with Promise.all has a known microtask diff --git a/libs/providers/langchain-anthropic/src/utils/stream_events.ts b/libs/providers/langchain-anthropic/src/utils/stream_events.ts index 5283a3c3c2c3..623071b5a597 100644 --- a/libs/providers/langchain-anthropic/src/utils/stream_events.ts +++ b/libs/providers/langchain-anthropic/src/utils/stream_events.ts @@ -7,7 +7,6 @@ import type Anthropic from "@anthropic-ai/sdk"; import type { ChatModelStreamEvent, - ContentBlockDelta, FinishReason, } from "@langchain/core/language_models/event"; import type { ContentBlock } from "@langchain/core/messages/content"; @@ -125,13 +124,13 @@ export async function* convertAnthropicStream( const acc = blockAccumulators.get(index); if (!acc) break; - const { typedDelta, accumulated } = applyAnthropicDelta(acc, delta); + const { contentDelta, accumulated } = applyAnthropicDelta(acc, delta); blockAccumulators.set(index, accumulated); yield { type: "content-block-delta" as const, index, - delta: typedDelta, + content: contentDelta, }; break; } @@ -239,7 +238,7 @@ function mapBlockToContentBlock( } /** - * Map an Anthropic content_block_delta to a typed ContentBlockDelta + * Map an Anthropic content_block_delta to a content block update * and update the accumulated state. */ function applyAnthropicDelta( @@ -248,14 +247,14 @@ function applyAnthropicDelta( // oxlint-disable-next-line @typescript-eslint/no-explicit-any delta: any ): { - typedDelta: ContentBlockDelta; + contentDelta: ContentBlock; // oxlint-disable-next-line @typescript-eslint/no-explicit-any accumulated: Record; } { switch (delta.type) { case "text_delta": return { - typedDelta: { type: "text-delta" as const, text: delta.text }, + contentDelta: { type: "text" as const, text: delta.text }, accumulated: { ...accumulated, text: (accumulated.text ?? "") + delta.text, @@ -264,8 +263,8 @@ function applyAnthropicDelta( case "thinking_delta": return { - typedDelta: { - type: "reasoning-delta" as const, + contentDelta: { + type: "reasoning" as const, reasoning: delta.thinking, }, accumulated: { @@ -277,22 +276,16 @@ function applyAnthropicDelta( case "input_json_delta": { const newArgs = (accumulated.args ?? "") + delta.partial_json; return { - typedDelta: { - type: "block-delta" as const, - fields: { type: accumulated.type, args: newArgs }, - }, + contentDelta: { type: accumulated.type, args: delta.partial_json }, accumulated: { ...accumulated, args: newArgs }, }; } case "citations_delta": return { - typedDelta: { - type: "block-delta" as const, - fields: { - type: accumulated.type, - annotations: [...(accumulated.annotations ?? []), delta.citation], - }, + contentDelta: { + type: accumulated.type, + annotations: [...(accumulated.annotations ?? []), delta.citation], }, accumulated: { ...accumulated, @@ -302,19 +295,13 @@ function applyAnthropicDelta( case "signature_delta": return { - typedDelta: { - type: "block-delta" as const, - fields: { type: accumulated.type, signature: delta.signature }, - }, + contentDelta: { type: accumulated.type, signature: delta.signature }, accumulated: { ...accumulated, signature: delta.signature }, }; case "compaction_delta": return { - typedDelta: { - type: "block-delta" as const, - fields: { type: "non_standard", value: { compaction: delta } }, - }, + contentDelta: { type: "non_standard", value: { compaction: delta } }, accumulated: { ...accumulated, value: { ...(accumulated.value ?? {}), compaction: delta }, @@ -323,10 +310,7 @@ function applyAnthropicDelta( default: return { - typedDelta: { - type: "block-delta" as const, - fields: { type: accumulated.type, ...delta }, - }, + contentDelta: { type: accumulated.type, ...delta }, accumulated, }; } From ce737a03dafbc9d48a5581d47eb631c5820e14f2 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 24 Apr 2026 16:31:06 -0700 Subject: [PATCH 06/39] format --- .../langchain-core/src/language_models/stream.ts | 16 +++++++++------- libs/langchain/package.json | 2 +- .../src/tests/chat_models_stream_events.test.ts | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 043a112a81b3..77e3e497ad72 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -174,10 +174,10 @@ export class TextContentStream for await (const event of buffer.iterate()) { if ( event.type === "content-block-delta" && - event.content.type === "text" && - typeof event.content.text === "string" + event.content.type === "text" && + typeof event.content.text === "string" ) { - yield event.content.text; + yield event.content.text; } } } @@ -315,10 +315,10 @@ export class ReasoningContentStream for await (const event of buffer.iterate()) { if ( event.type === "content-block-delta" && - event.content.type === "reasoning" && - typeof event.content.reasoning === "string" + event.content.type === "reasoning" && + typeof event.content.reasoning === "string" ) { - yield event.content.reasoning; + yield event.content.reasoning; } } } @@ -346,7 +346,9 @@ export class ReasoningContentStream * Typed stream for usage metadata. */ export class UsageMetadataStream - implements AsyncIterable, PromiseLike + implements + AsyncIterable, + PromiseLike { /** @internal */ private _buffer: ReplayBuffer; diff --git a/libs/langchain/package.json b/libs/langchain/package.json index 628673b08598..6d8d5767cc0d 100644 --- a/libs/langchain/package.json +++ b/libs/langchain/package.json @@ -224,4 +224,4 @@ "./package.json": "./package.json" }, "module": "./dist/index.js" -} \ No newline at end of file +} diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts index b471c19593fa..45b2a2e1d196 100644 --- a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -23,7 +23,7 @@ class MockStreamChatAnthropic extends ChatAnthropic { protected async createStreamWithRetry(): Promise { const events = this.mockEvents; return { - controller: { abort: () => { } }, + controller: { abort: () => {} }, async *[Symbol.asyncIterator]() { for (const event of events) { yield event; From 79b295322c4a19c5354dc7f414b7bcc99a2e86b3 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 24 Apr 2026 16:33:43 -0700 Subject: [PATCH 07/39] update --- .changeset/swift-dodos-attack.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/swift-dodos-attack.md diff --git a/.changeset/swift-dodos-attack.md b/.changeset/swift-dodos-attack.md new file mode 100644 index 000000000000..a16d0169fd3d --- /dev/null +++ b/.changeset/swift-dodos-attack.md @@ -0,0 +1,5 @@ +--- +"@langchain/core": patch +--- + +chore(core): new stream primitives From 6b03d77428a8d697fe908223ba49df0ba1319a41 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Sat, 25 Apr 2026 07:30:46 -0700 Subject: [PATCH 08/39] align --- .../src/language_models/compat.ts | 10 +++ .../src/language_models/stream.ts | 89 ++++++++++++++++--- .../src/language_models/tests/stream.test.ts | 79 ++++++++++++++++ .../tests/stream_bridge.test.ts | 58 ++++++++++++ .../tests/chat_models_stream_events.test.ts | 2 +- 5 files changed, 225 insertions(+), 13 deletions(-) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 3a557c83c898..736febcebef2 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -198,6 +198,16 @@ function applyDeltaToBlock( return { ...delta }; } + if ( + (delta as { type?: string }).type === "thinking" && + (block as { type?: string }).type === "thinking" + ) { + const thinking = + ((block as { thinking?: string }).thinking ?? "") + + ((delta as { thinking?: string }).thinking ?? ""); + return { ...block, ...delta, thinking } as unknown as ContentBlock; + } + switch (delta.type) { case "text": return { diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 77e3e497ad72..5ee11bf179c6 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -84,7 +84,7 @@ class ReplayBuffer { * Apply a typed delta to an accumulated content block. * * - `text` → append text - * - `reasoning` → append reasoning + * - `reasoning` / provider `thinking` → append reasoning text * - `tool_call_chunk` / `server_tool_call_chunk` → append args while * preserving id/name from previous chunks when a later delta omits them * - other block types → shallow merge @@ -96,6 +96,16 @@ function applyDelta(block: ContentBlock, delta: ContentBlock): ContentBlock { return { ...delta }; } + if ( + (delta as { type?: string }).type === "thinking" && + (block as { type?: string }).type === "thinking" + ) { + const thinking = + ((block as { thinking?: string }).thinking ?? "") + + ((delta as { thinking?: string }).thinking ?? ""); + return { ...block, ...delta, thinking } as unknown as ContentBlock; + } + switch (delta.type) { case "text": return { @@ -127,6 +137,28 @@ function applyDelta(block: ContentBlock, delta: ContentBlock): ContentBlock { } } +function getReasoningDelta(content: unknown): string | undefined { + if (content == null || typeof content !== "object") return undefined; + const block = content as { + type?: string; + reasoning?: unknown; + thinking?: unknown; + }; + if (block.type === "reasoning" && typeof block.reasoning === "string") { + return block.reasoning; + } + if (block.type === "thinking" && typeof block.thinking === "string") { + return block.thinking; + } + return undefined; +} + +function isReasoningContent(content: unknown): boolean { + if (content == null || typeof content !== "object") return false; + const type = (content as { type?: unknown }).type; + return type === "reasoning" || type === "thinking"; +} + // ─── Sub-Stream: Text ─────────────────────────────────────────── /** @@ -295,14 +327,32 @@ export class ReasoningContentStream return { async *[Symbol.asyncIterator]() { let accumulated = ""; + let seenReasoning = false; for await (const event of buffer.iterate()) { - if ( - event.type === "content-block-delta" && - event.content.type === "reasoning" && - typeof event.content.reasoning === "string" - ) { - accumulated += event.content.reasoning; + if (event.type === "content-block-start") { + if (!isReasoningContent(event.content)) { + if (seenReasoning) return; + continue; + } + seenReasoning = true; + const delta = getReasoningDelta(event.content); + if (delta == null || delta.length === 0) continue; + accumulated += delta; + yield accumulated; + } else if (event.type === "content-block-delta") { + if (!isReasoningContent(event.content)) continue; + seenReasoning = true; + const delta = getReasoningDelta(event.content); + if (delta == null || delta.length === 0) continue; + accumulated += delta; yield accumulated; + } else if ( + event.type === "content-block-finish" && + isReasoningContent(event.content) + ) { + return; + } else if (event.type === "message-finish") { + return; } } }, @@ -312,13 +362,28 @@ export class ReasoningContentStream [Symbol.asyncIterator](): AsyncIterator { const buffer = this._buffer; async function* gen() { + let seenReasoning = false; for await (const event of buffer.iterate()) { - if ( - event.type === "content-block-delta" && - event.content.type === "reasoning" && - typeof event.content.reasoning === "string" + if (event.type === "content-block-start") { + if (!isReasoningContent(event.content)) { + if (seenReasoning) return; + continue; + } + seenReasoning = true; + const delta = getReasoningDelta(event.content); + if (delta != null && delta.length > 0) yield delta; + } else if (event.type === "content-block-delta") { + if (!isReasoningContent(event.content)) continue; + seenReasoning = true; + const delta = getReasoningDelta(event.content); + if (delta != null && delta.length > 0) yield delta; + } else if ( + event.type === "content-block-finish" && + isReasoningContent(event.content) ) { - yield event.content.reasoning; + return; + } else if (event.type === "message-finish") { + return; } } } diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index dd2d40adcabc..8a76e870b045 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -151,6 +151,64 @@ function complexStreamEvents(): ChatModelStreamEvent[] { ]; } +function providerThinkingStreamEvents(): ChatModelStreamEvent[] { + return [ + { type: "message-start", id: "msg_thinking" }, + { + type: "content-block-start", + index: 0, + content: { type: "thinking", thinking: "" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "thinking", thinking: "Let me" }, + }, + { + type: "content-block-delta", + index: 0, + content: { type: "thinking", thinking: " think..." }, + }, + { + type: "content-block-finish", + index: 0, + content: { type: "thinking", thinking: "Let me think..." }, + }, + { type: "message-finish", reason: "stop" }, + ] as unknown as ChatModelStreamEvent[]; +} + +async function* delayedTextAfterReasoningEvents( + onMessageFinish: () => void +): AsyncGenerator { + yield { type: "message-start", id: "msg_seq" }; + yield { + type: "content-block-start", + index: 0, + content: { type: "reasoning", reasoning: "" }, + }; + yield { + type: "content-block-delta", + index: 0, + content: { type: "reasoning", reasoning: "Let me think" }, + }; + yield { + type: "content-block-start", + index: 1, + content: { type: "text", text: "" }, + }; + yield { + type: "content-block-delta", + index: 1, + content: { type: "text", text: "Hello" }, + }; + await new Promise((resolve) => { + setTimeout(resolve, 50); + }); + onMessageFinish(); + yield { type: "message-finish", reason: "stop" }; +} + describe("ChatModelStream", () => { describe("raw event iteration", () => { test("iterates all events", async () => { @@ -251,6 +309,27 @@ describe("ChatModelStream", () => { const fullReasoning: string = await stream.reasoning; expect(fullReasoning).toBe("Let me think..."); }); + + test("accepts provider thinking deltas as reasoning", async () => { + const stream = new ChatModelStream( + iterEvents(providerThinkingStreamEvents()) + ); + + expect(await stream.reasoning).toBe("Let me think..."); + }); + + test("finishes before message end when text starts after reasoning", async () => { + let messageFinished = false; + const stream = new ChatModelStream( + delayedTextAfterReasoningEvents(() => { + messageFinished = true; + }) + ); + + expect(await stream.reasoning).toBe("Let me think"); + expect(messageFinished).toBe(false); + expect(await stream.text).toBe("Hello"); + }); }); describe(".usage sub-stream", () => { diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts index 695caf91d169..0c71e6fd4c56 100644 --- a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -89,6 +89,44 @@ class FakeBlockStreamModel extends BaseChatModel { } } +class FakeThinkingStreamModel extends BaseChatModel { + _llmType() { + return "fake-thinking-stream"; + } + + async _generate( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): Promise { + return { generations: [] }; + } + + async *_streamResponseChunks( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: [ + { type: "thinking", thinking: "Thinking", index: 0 }, + ] as unknown as ContentBlock[], + id: "msg_thinking", + }), + text: "", + }); + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: [ + { type: "thinking", thinking: " hard...", index: 0 }, + ] as unknown as ContentBlock[], + }), + text: "", + }); + } +} + /** * A model that yields tool call chunks via _streamResponseChunks. */ @@ -291,6 +329,26 @@ describe("_streamChatModelEvents bridge", () => { const finishes = events.filter((e) => e.type === "content-block-finish"); expect(finishes.length).toBe(2); }); + + test("accumulates provider thinking blocks", async () => { + const model = new FakeThinkingStreamModel({}); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const finish = events.find( + (e) => + e.type === "content-block-finish" && + (e as { index: number }).index === 0 + ) as { content: { type: string; thinking?: string } }; + + expect(finish.content.type).toBe("thinking"); + expect(finish.content.thinking).toBe("Thinking hard..."); + }); }); describe("tool call streaming", () => { diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts index 45b2a2e1d196..babb9d6187a9 100644 --- a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from "vitest"; import type { ChatModelStreamEvent } from "@langchain/core/language_models/event"; -import { ChatModelStream } from "../../../../langchain-core/src/language_models/stream.js"; +import { ChatModelStream } from "@langchain/core/language_models/stream"; import { ChatAnthropic } from "../chat_models.js"; import type { BaseChatModelCallOptions } from "@langchain/core/language_models/chat_models"; From 266086da3fc90f11d047a530d2502f4c82c74de8 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Sat, 25 Apr 2026 07:47:10 -0700 Subject: [PATCH 09/39] type -> event, responseMetadat -> metadata --- .../src/language_models/compat.ts | 20 +-- .../src/language_models/event.ts | 28 ++--- .../src/language_models/stream.ts | 44 +++---- .../src/language_models/tests/event.test.ts | 98 +++++++-------- .../src/language_models/tests/stream.test.ts | 118 +++++++++--------- .../tests/stream_bridge.test.ts | 30 ++--- .../tests/chat_models_stream_events.test.ts | 50 ++++---- .../src/utils/stream_events.ts | 20 +-- 8 files changed, 204 insertions(+), 204 deletions(-) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 736febcebef2..75dfdf814996 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -38,7 +38,7 @@ export async function* convertChunksToEvents( if (!messageStarted) { messageStarted = true; const startEvent: ChatModelStreamEvent = { - type: "message-start" as const, + event: "message-start" as const, id: msg.id ?? undefined, }; if (isAIMessageChunk(msg) && msg.usage_metadata) { @@ -61,7 +61,7 @@ export async function* convertChunksToEvents( accumulated: initial, }); yield { - type: "content-block-start" as const, + event: "content-block-start" as const, index: blockIndex, content: initial, }; @@ -72,7 +72,7 @@ export async function* convertChunksToEvents( text: ((block.accumulated as { text?: string }).text ?? "") + content, }; yield { - type: "content-block-delta" as const, + event: "content-block-delta" as const, index: blockIndex, content: { type: "text" as const, text: content }, }; @@ -88,7 +88,7 @@ export async function* convertChunksToEvents( accumulated: { ...part }, }); yield { - type: "content-block-start" as const, + event: "content-block-start" as const, index: blockIndex, content: { ...part }, }; @@ -96,7 +96,7 @@ export async function* convertChunksToEvents( const block = activeBlocks.get(blockIndex)!; block.accumulated = applyDeltaToBlock(block.accumulated, part); yield { - type: "content-block-delta" as const, + event: "content-block-delta" as const, index: blockIndex, content: part, }; @@ -129,7 +129,7 @@ export async function* convertChunksToEvents( accumulated: initial, }); yield { - type: "content-block-start" as const, + event: "content-block-start" as const, index: blockIndex, content: initial, }; @@ -146,7 +146,7 @@ export async function* convertChunksToEvents( if (toolChunk.name != null) acc.name = toolChunk.name; acc.args = (acc.args ?? "") + (toolChunk.args ?? ""); yield { - type: "content-block-delta" as const, + event: "content-block-delta" as const, index: blockIndex, content: { ...(block.accumulated as ContentBlock) }, }; @@ -165,7 +165,7 @@ export async function* convertChunksToEvents( total_tokens: lastUsage.total_tokens + chunkUsage.total_tokens, }; } - yield { type: "usage" as const, usage: { ...lastUsage } }; + yield { event: "usage" as const, usage: { ...lastUsage } }; } } @@ -173,14 +173,14 @@ export async function* convertChunksToEvents( for (const [index, block] of activeBlocks) { const finalized = finalizeContentBlock(block.accumulated); yield { - type: "content-block-finish" as const, + event: "content-block-finish" as const, index, content: finalized, }; } yield { - type: "message-finish" as const, + event: "message-finish" as const, reason: "stop" as const, ...(lastUsage ? { usage: lastUsage } : {}), }; diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts index 5be0904d1a5b..1abe7e24e48e 100644 --- a/libs/langchain-core/src/language_models/event.ts +++ b/libs/langchain-core/src/language_models/event.ts @@ -45,7 +45,7 @@ import type { UsageMetadata } from "../messages/metadata.js"; * Emitted once at the start of a model response. */ export interface MessageStartEvent { - type: "message-start"; + event: "message-start"; /** Optional message ID assigned by the provider. */ id?: string; /** @@ -69,13 +69,13 @@ export type FinishReason = "stop" | "length" | "tool_use" | "content_filter"; * Emitted once when the model response is complete. */ export interface MessageFinishEvent { - type: "message-finish"; + event: "message-finish"; /** Why the model stopped generating. */ reason?: FinishReason; /** Final usage snapshot. */ usage?: UsageMetadata; /** Provider-specific response metadata (model name, response ID, headers, etc.). */ - responseMetadata?: Record; + metadata?: Record; } // ─── Content Block Lifecycle ──────────────────────────────────── @@ -85,12 +85,12 @@ export interface MessageFinishEvent { * * @example * ```ts - * { type: "content-block-start", index: 0, + * { event: "content-block-start", index: 0, * content: { type: "text", text: "" } } * ``` */ export interface ContentBlockStartEvent { - type: "content-block-start"; + event: "content-block-start"; /** Positional index of this block within the message. */ index: number; /** Initial state of the content block. */ @@ -111,20 +111,20 @@ export interface ContentBlockStartEvent { * @example * ```ts * // Text token - * { type: "content-block-delta", index: 0, + * { event: "content-block-delta", index: 0, * content: { type: "text", text: " world" } } * * // Tool call args chunk - * { type: "content-block-delta", index: 1, + * { event: "content-block-delta", index: 1, * content: { type: "tool_call_chunk", args: '{"q":"wea' } } * * // Provider-specific field (e.g., signature) - * { type: "content-block-delta", index: 0, + * { event: "content-block-delta", index: 0, * content: { type: "reasoning", signature: "sig_abc" } } * ``` */ export interface ContentBlockDeltaEvent { - type: "content-block-delta"; + event: "content-block-delta"; /** Positional index of the block being updated. */ index: number; /** Incremental content block update. */ @@ -136,12 +136,12 @@ export interface ContentBlockDeltaEvent { * * @example * ```ts - * { type: "content-block-finish", index: 0, + * { event: "content-block-finish", index: 0, * content: { type: "text", text: "Hello world" } } * ``` */ export interface ContentBlockFinishEvent { - type: "content-block-finish"; + event: "content-block-finish"; /** Positional index of the completed block. */ index: number; /** Finalized content block. */ @@ -155,7 +155,7 @@ export interface ContentBlockFinishEvent { * Each event carries a **running snapshot** (not an additive delta). */ export interface UsageUpdateEvent { - type: "usage"; + event: "usage"; /** Current usage snapshot. */ usage: UsageMetadata; } @@ -166,7 +166,7 @@ export interface UsageUpdateEvent { * Passthrough for native provider events that don't map to standard types. */ export interface ProviderEvent { - type: "provider"; + event: "provider"; /** Provider identifier (e.g., `"openai"`, `"anthropic"`, `"google"`). */ provider: string; /** Raw event type name from the provider SDK. */ @@ -181,7 +181,7 @@ export interface ProviderEvent { * Emitted on unrecoverable stream errors. */ export interface StreamErrorEvent { - type: "error"; + event: "error"; /** Human-readable error message. */ message: string; /** Optional error code for programmatic handling. */ diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 5ee11bf179c6..aea98fe6f53c 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -187,7 +187,7 @@ export class TextContentStream let accumulated = ""; for await (const event of buffer.iterate()) { if ( - event.type === "content-block-delta" && + event.event === "content-block-delta" && event.content.type === "text" && typeof event.content.text === "string" ) { @@ -205,7 +205,7 @@ export class TextContentStream async function* gen() { for await (const event of buffer.iterate()) { if ( - event.type === "content-block-delta" && + event.event === "content-block-delta" && event.content.type === "text" && typeof event.content.text === "string" ) { @@ -260,7 +260,7 @@ export class ToolCallsStream const calls: Array = []; for await (const event of buffer.iterate()) { if ( - event.type === "content-block-finish" && + event.event === "content-block-finish" && event.content.type === "tool_call" ) { calls.push(event.content as ContentBlock.Tools.ToolCall); @@ -276,7 +276,7 @@ export class ToolCallsStream async function* gen() { for await (const event of buffer.iterate()) { if ( - event.type === "content-block-finish" && + event.event === "content-block-finish" && event.content.type === "tool_call" ) { yield event.content as ContentBlock.Tools.ToolCall; @@ -329,7 +329,7 @@ export class ReasoningContentStream let accumulated = ""; let seenReasoning = false; for await (const event of buffer.iterate()) { - if (event.type === "content-block-start") { + if (event.event === "content-block-start") { if (!isReasoningContent(event.content)) { if (seenReasoning) return; continue; @@ -339,7 +339,7 @@ export class ReasoningContentStream if (delta == null || delta.length === 0) continue; accumulated += delta; yield accumulated; - } else if (event.type === "content-block-delta") { + } else if (event.event === "content-block-delta") { if (!isReasoningContent(event.content)) continue; seenReasoning = true; const delta = getReasoningDelta(event.content); @@ -347,11 +347,11 @@ export class ReasoningContentStream accumulated += delta; yield accumulated; } else if ( - event.type === "content-block-finish" && + event.event === "content-block-finish" && isReasoningContent(event.content) ) { return; - } else if (event.type === "message-finish") { + } else if (event.event === "message-finish") { return; } } @@ -364,7 +364,7 @@ export class ReasoningContentStream async function* gen() { let seenReasoning = false; for await (const event of buffer.iterate()) { - if (event.type === "content-block-start") { + if (event.event === "content-block-start") { if (!isReasoningContent(event.content)) { if (seenReasoning) return; continue; @@ -372,17 +372,17 @@ export class ReasoningContentStream seenReasoning = true; const delta = getReasoningDelta(event.content); if (delta != null && delta.length > 0) yield delta; - } else if (event.type === "content-block-delta") { + } else if (event.event === "content-block-delta") { if (!isReasoningContent(event.content)) continue; seenReasoning = true; const delta = getReasoningDelta(event.content); if (delta != null && delta.length > 0) yield delta; } else if ( - event.type === "content-block-finish" && + event.event === "content-block-finish" && isReasoningContent(event.content) ) { return; - } else if (event.type === "message-finish") { + } else if (event.event === "message-finish") { return; } } @@ -427,11 +427,11 @@ export class UsageMetadataStream const buffer = this._buffer; async function* gen() { for await (const event of buffer.iterate()) { - if (event.type === "usage") { + if (event.event === "usage") { yield event.usage; - } else if (event.type === "message-start" && event.usage) { + } else if (event.event === "message-start" && event.usage) { yield event.usage; - } else if (event.type === "message-finish" && event.usage) { + } else if (event.event === "message-finish" && event.usage) { yield event.usage; } } @@ -530,11 +530,11 @@ export class ChatModelStream const contentBlocks: Array = []; let id: string | undefined; let usage: UsageMetadata | undefined; - let responseMetadata: Record = {}; + let metadata: Record = {}; let finishReason: string | undefined; for await (const event of this._buffer.iterate()) { - switch (event.type) { + switch (event.event) { case "message-start": id = event.id ?? id; if (event.usage) usage = event.usage; @@ -563,10 +563,10 @@ export class ChatModelStream case "message-finish": finishReason = event.reason; if (event.usage) usage = event.usage; - if (event.responseMetadata) { - responseMetadata = { - ...responseMetadata, - ...event.responseMetadata, + if (event.metadata) { + metadata = { + ...metadata, + ...event.metadata, }; } break; @@ -585,7 +585,7 @@ export class ChatModelStream content: filteredBlocks, usage_metadata: usage, response_metadata: { - ...responseMetadata, + ...metadata, ...(finishReason ? { finish_reason: finishReason } : {}), output_version: "v1" as const, }, diff --git a/libs/langchain-core/src/language_models/tests/event.test.ts b/libs/langchain-core/src/language_models/tests/event.test.ts index 5750072d9b9e..ba3839ef3f1d 100644 --- a/libs/langchain-core/src/language_models/tests/event.test.ts +++ b/libs/langchain-core/src/language_models/tests/event.test.ts @@ -14,53 +14,53 @@ import type { describe("ChatModelStreamEvent types", () => { test("MessageStartEvent", () => { const event: MessageStartEvent = { - type: "message-start", + event: "message-start", id: "msg_123", usage: { input_tokens: 100, output_tokens: 0, total_tokens: 100 }, }; - expect(event.type).toBe("message-start"); + expect(event.event).toBe("message-start"); expect(event.id).toBe("msg_123"); expect(event.usage?.input_tokens).toBe(100); }); test("MessageStartEvent without optional fields", () => { - const event: MessageStartEvent = { type: "message-start" }; - expect(event.type).toBe("message-start"); + const event: MessageStartEvent = { event: "message-start" }; + expect(event.event).toBe("message-start"); expect(event.id).toBeUndefined(); expect(event.usage).toBeUndefined(); }); test("MessageFinishEvent", () => { const event: MessageFinishEvent = { - type: "message-finish", + event: "message-finish", reason: "stop", usage: { input_tokens: 100, output_tokens: 50, total_tokens: 150 }, - responseMetadata: { model_name: "gpt-4" }, + metadata: { model_name: "gpt-4" }, }; - expect(event.type).toBe("message-finish"); + expect(event.event).toBe("message-finish"); expect(event.reason).toBe("stop"); expect(event.usage?.output_tokens).toBe(50); - expect(event.responseMetadata?.model_name).toBe("gpt-4"); + expect(event.metadata?.model_name).toBe("gpt-4"); }); test("ContentBlockStartEvent", () => { const event: ContentBlockStartEvent = { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "text", text: "" }, }; - expect(event.type).toBe("content-block-start"); + expect(event.event).toBe("content-block-start"); expect(event.index).toBe(0); expect(event.content.type).toBe("text"); }); test("ContentBlockDeltaEvent with text-delta", () => { const event: ContentBlockDeltaEvent = { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: " world" }, }; - expect(event.type).toBe("content-block-delta"); + expect(event.event).toBe("content-block-delta"); expect(event.index).toBe(0); expect(event.content.type).toBe("text"); if (event.content.type === "text") { @@ -70,7 +70,7 @@ describe("ChatModelStreamEvent types", () => { test("ContentBlockDeltaEvent with tool call block-delta", () => { const event: ContentBlockDeltaEvent = { - type: "content-block-delta", + event: "content-block-delta", index: 1, content: { type: "tool_call_chunk", @@ -79,13 +79,13 @@ describe("ChatModelStreamEvent types", () => { args: '{"q":"wea', }, }; - expect(event.type).toBe("content-block-delta"); + expect(event.event).toBe("content-block-delta"); expect(event.content.type).toBe("tool_call_chunk"); }); test("ContentBlockDeltaEvent with reasoning-delta", () => { const event: ContentBlockDeltaEvent = { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "reasoning", reasoning: "Let me think" }, }; @@ -97,7 +97,7 @@ describe("ChatModelStreamEvent types", () => { test("ContentBlockDeltaEvent with content block delta", () => { const event: ContentBlockDeltaEvent = { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "reasoning", signature: "sig_abc" }, }; @@ -106,17 +106,17 @@ describe("ChatModelStreamEvent types", () => { test("ContentBlockFinishEvent with text", () => { const event: ContentBlockFinishEvent = { - type: "content-block-finish", + event: "content-block-finish", index: 0, content: { type: "text", text: "Hello world" }, }; - expect(event.type).toBe("content-block-finish"); + expect(event.event).toBe("content-block-finish"); expect(event.content.type).toBe("text"); }); test("ContentBlockFinishEvent with finalized tool call", () => { const event: ContentBlockFinishEvent = { - type: "content-block-finish", + event: "content-block-finish", index: 1, content: { type: "tool_call", @@ -130,62 +130,62 @@ describe("ChatModelStreamEvent types", () => { test("UsageUpdateEvent", () => { const event: UsageUpdateEvent = { - type: "usage", + event: "usage", usage: { input_tokens: 100, output_tokens: 25, total_tokens: 125 }, }; - expect(event.type).toBe("usage"); + expect(event.event).toBe("usage"); expect(event.usage.total_tokens).toBe(125); }); test("ProviderEvent", () => { const event: ProviderEvent = { - type: "provider", + event: "provider", provider: "openai", name: "response.web_search_call.searching", payload: { item_id: "ws_123", output_index: 0 }, }; - expect(event.type).toBe("provider"); + expect(event.event).toBe("provider"); expect(event.provider).toBe("openai"); }); test("StreamErrorEvent", () => { const event: StreamErrorEvent = { - type: "error", + event: "error", message: "Connection lost", code: "CONNECTION_ERROR", }; - expect(event.type).toBe("error"); + expect(event.event).toBe("error"); expect(event.message).toBe("Connection lost"); }); - test("event types are mutually exclusive via type field", () => { + test("event types are mutually exclusive via event field", () => { const events: ChatModelStreamEvent[] = [ - { type: "message-start" }, - { type: "message-finish", reason: "stop" }, + { event: "message-start" }, + { event: "message-finish", reason: "stop" }, { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "text", text: "" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: "hi" }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 0, content: { type: "text", text: "hi" }, }, { - type: "usage", + event: "usage", usage: { input_tokens: 0, output_tokens: 0, total_tokens: 0 }, }, - { type: "provider", provider: "test", name: "test.event", payload: {} }, - { type: "error", message: "oops" }, + { event: "provider", provider: "test", name: "test.event", payload: {} }, + { event: "error", message: "oops" }, ]; - const expectedTypes = [ + const expectedEvents = [ "message-start", "message-finish", "content-block-start", @@ -197,7 +197,7 @@ describe("ChatModelStreamEvent types", () => { ]; for (let i = 0; i < events.length; i++) { - expect(events[i]!.type).toBe(expectedTypes[i]); + expect(events[i]!.event).toBe(expectedEvents[i]); } }); }); @@ -205,14 +205,14 @@ describe("ChatModelStreamEvent types", () => { describe("interleaving semantics", () => { test("interleaved content blocks have distinct indexes", () => { const events: ChatModelStreamEvent[] = [ - { type: "message-start" }, + { event: "message-start" }, { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "text", text: "" }, }, { - type: "content-block-start", + event: "content-block-start", index: 1, content: { type: "tool_call_chunk", @@ -222,32 +222,32 @@ describe("interleaving semantics", () => { }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: "Hello" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 1, content: { type: "tool_call_chunk", args: '{"q"' }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: " world" }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 0, content: { type: "text", text: "Hello world" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 1, content: { type: "tool_call_chunk", args: '{"q":"test"}' }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 1, content: { type: "tool_call", @@ -256,19 +256,19 @@ describe("interleaving semantics", () => { args: { q: "test" }, }, }, - { type: "message-finish", reason: "tool_use" }, + { event: "message-finish", reason: "tool_use" }, ]; const blockStates = new Map(); for (const event of events) { - if (event.type === "content-block-start") { + if (event.event === "content-block-start") { expect(blockStates.has(event.index)).toBe(false); blockStates.set(event.index, "started"); - } else if (event.type === "content-block-delta") { + } else if (event.event === "content-block-delta") { const state = blockStates.get(event.index); expect(state === "started" || state === "streaming").toBe(true); blockStates.set(event.index, "streaming"); - } else if (event.type === "content-block-finish") { + } else if (event.event === "content-block-finish") { const state = blockStates.get(event.index); expect(state === "started" || state === "streaming").toBe(true); blockStates.set(event.index, "finished"); diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 8a76e870b045..659ae8061e37 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -14,36 +14,36 @@ async function* iterEvents( // Helper: a realistic text-only stream function textStreamEvents(): ChatModelStreamEvent[] { return [ - { type: "message-start", id: "msg_1" }, + { event: "message-start", id: "msg_1" }, { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "text", text: "" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: "Hello" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: " world" }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 0, content: { type: "text", text: "Hello world" }, }, { - type: "usage", + event: "usage", usage: { input_tokens: 10, output_tokens: 2, total_tokens: 12 }, }, { - type: "message-finish", + event: "message-finish", reason: "stop", usage: { input_tokens: 10, output_tokens: 2, total_tokens: 12 }, - responseMetadata: { model_name: "test-model" }, + metadata: { model_name: "test-model" }, }, ]; } @@ -52,55 +52,55 @@ function textStreamEvents(): ChatModelStreamEvent[] { function complexStreamEvents(): ChatModelStreamEvent[] { return [ { - type: "message-start", + event: "message-start", id: "msg_2", usage: { input_tokens: 50, output_tokens: 0, total_tokens: 50 }, }, // Reasoning block { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "reasoning", reasoning: "" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "reasoning", reasoning: "Let me" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "reasoning", reasoning: " think..." }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 0, content: { type: "reasoning", reasoning: "Let me think..." }, }, // Text block { - type: "content-block-start", + event: "content-block-start", index: 1, content: { type: "text", text: "" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 1, content: { type: "text", text: "The answer" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 1, content: { type: "text", text: " is 42." }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 1, content: { type: "text", text: "The answer is 42." }, }, // Tool call block { - type: "content-block-start", + event: "content-block-start", index: 2, content: { type: "tool_call_chunk", @@ -110,7 +110,7 @@ function complexStreamEvents(): ChatModelStreamEvent[] { }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 2, content: { type: "tool_call_chunk", @@ -120,7 +120,7 @@ function complexStreamEvents(): ChatModelStreamEvent[] { }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 2, content: { type: "tool_call_chunk", @@ -130,7 +130,7 @@ function complexStreamEvents(): ChatModelStreamEvent[] { }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 2, content: { type: "tool_call", @@ -140,11 +140,11 @@ function complexStreamEvents(): ChatModelStreamEvent[] { }, }, { - type: "usage", + event: "usage", usage: { input_tokens: 50, output_tokens: 30, total_tokens: 80 }, }, { - type: "message-finish", + event: "message-finish", reason: "tool_use", usage: { input_tokens: 50, output_tokens: 30, total_tokens: 80 }, }, @@ -153,52 +153,52 @@ function complexStreamEvents(): ChatModelStreamEvent[] { function providerThinkingStreamEvents(): ChatModelStreamEvent[] { return [ - { type: "message-start", id: "msg_thinking" }, + { event: "message-start", id: "msg_thinking" }, { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "thinking", thinking: "" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "thinking", thinking: "Let me" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "thinking", thinking: " think..." }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 0, content: { type: "thinking", thinking: "Let me think..." }, }, - { type: "message-finish", reason: "stop" }, + { event: "message-finish", reason: "stop" }, ] as unknown as ChatModelStreamEvent[]; } async function* delayedTextAfterReasoningEvents( onMessageFinish: () => void ): AsyncGenerator { - yield { type: "message-start", id: "msg_seq" }; + yield { event: "message-start", id: "msg_seq" }; yield { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "reasoning", reasoning: "" }, }; yield { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "reasoning", reasoning: "Let me think" }, }; yield { - type: "content-block-start", + event: "content-block-start", index: 1, content: { type: "text", text: "" }, }; yield { - type: "content-block-delta", + event: "content-block-delta", index: 1, content: { type: "text", text: "Hello" }, }; @@ -206,7 +206,7 @@ async function* delayedTextAfterReasoningEvents( setTimeout(resolve, 50); }); onMessageFinish(); - yield { type: "message-finish", reason: "stop" }; + yield { event: "message-finish", reason: "stop" }; } describe("ChatModelStream", () => { @@ -221,8 +221,8 @@ describe("ChatModelStream", () => { } expect(collected.length).toBe(events.length); - expect(collected[0]!.type).toBe("message-start"); - expect(collected[collected.length - 1]!.type).toBe("message-finish"); + expect(collected[0]!.event).toBe("message-start"); + expect(collected[collected.length - 1]!.event).toBe("message-finish"); }); }); @@ -360,8 +360,8 @@ describe("ChatModelStream", () => { test("resolves to undefined usage when none provided", async () => { const events: ChatModelStreamEvent[] = [ - { type: "message-start" }, - { type: "message-finish" }, + { event: "message-start" }, + { event: "message-finish" }, ]; const stream = new ChatModelStream(iterEvents(events)); const usage = await stream.usage; @@ -475,36 +475,36 @@ describe("ChatModelStream", () => { describe("provider events passthrough", () => { test("provider events are visible in raw iteration", async () => { const events: ChatModelStreamEvent[] = [ - { type: "message-start" }, + { event: "message-start" }, { - type: "provider", + event: "provider", provider: "openai", name: "response.web_search_call.searching", payload: { item_id: "ws_1" }, }, { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "text", text: "" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: "Result" }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 0, content: { type: "text", text: "Result" }, }, - { type: "message-finish", reason: "stop" }, + { event: "message-finish", reason: "stop" }, ]; const stream = new ChatModelStream(iterEvents(events)); const providerEvents = []; for await (const event of stream) { - if (event.type === "provider") { + if (event.event === "provider") { providerEvents.push(event); } } @@ -518,29 +518,29 @@ describe("ChatModelStream", () => { test("provider events are ignored by sub-streams", async () => { const events: ChatModelStreamEvent[] = [ - { type: "message-start" }, + { event: "message-start" }, { - type: "provider", + event: "provider", provider: "openai", name: "response.web_search_call.searching", payload: {}, }, { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "text", text: "" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: "Hello" }, }, { - type: "content-block-finish", + event: "content-block-finish", index: 0, content: { type: "text", text: "Hello" }, }, - { type: "message-finish", reason: "stop" }, + { event: "message-finish", reason: "stop" }, ]; const stream = new ChatModelStream(iterEvents(events)); @@ -552,19 +552,19 @@ describe("ChatModelStream", () => { describe("error handling", () => { test("error event in stream", async () => { const events: ChatModelStreamEvent[] = [ - { type: "message-start" }, + { event: "message-start" }, { - type: "content-block-start", + event: "content-block-start", index: 0, content: { type: "text", text: "" }, }, { - type: "content-block-delta", + event: "content-block-delta", index: 0, content: { type: "text", text: "Partial" }, }, - { type: "error", message: "Connection lost", code: "CONN_ERR" }, - { type: "message-finish", reason: "stop" }, + { event: "error", message: "Connection lost", code: "CONN_ERR" }, + { event: "message-finish", reason: "stop" }, ]; const stream = new ChatModelStream(iterEvents(events)); @@ -573,13 +573,13 @@ describe("ChatModelStream", () => { for await (const event of stream) { collected.push(event); } - const errorEvents = collected.filter((e) => e.type === "error"); + const errorEvents = collected.filter((e) => e.event === "error"); expect(errorEvents.length).toBe(1); }); test("source async iterable throwing propagates", async () => { async function* throwingSource(): AsyncGenerator { - yield { type: "message-start" }; + yield { event: "message-start" }; throw new Error("Provider connection failed"); } diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts index 0c71e6fd4c56..913c8ed652b2 100644 --- a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -234,11 +234,11 @@ describe("_streamChatModelEvents bridge", () => { } // message-start - expect(events[0]!.type).toBe("message-start"); + expect(events[0]!.event).toBe("message-start"); expect((events[0] as { id?: string }).id).toBe("msg_test"); // content-block-start for text - expect(events[1]!.type).toBe("content-block-start"); + expect(events[1]!.event).toBe("content-block-start"); const startBlock = events[1] as { index: number; content: ContentBlock; @@ -247,7 +247,7 @@ describe("_streamChatModelEvents bridge", () => { expect(startBlock.content.type).toBe("text"); // content-block-delta for "Hello" - expect(events[2]!.type).toBe("content-block-delta"); + expect(events[2]!.event).toBe("content-block-delta"); const delta1 = events[2] as { index: number; content: { type: string; text?: string }; @@ -256,7 +256,7 @@ describe("_streamChatModelEvents bridge", () => { expect(delta1.content.text).toBe("Hello"); // content-block-delta for " world" - expect(events[3]!.type).toBe("content-block-delta"); + expect(events[3]!.event).toBe("content-block-delta"); const delta2 = events[3] as { index: number; content: { type: string; text?: string }; @@ -266,7 +266,7 @@ describe("_streamChatModelEvents bridge", () => { // content-block-finish const finishIdx = events.findIndex( - (e) => e.type === "content-block-finish" + (e) => e.event === "content-block-finish" ); expect(finishIdx).toBeGreaterThan(-1); const finish = events[finishIdx] as { @@ -276,7 +276,7 @@ describe("_streamChatModelEvents bridge", () => { // message-finish const msgFinish = events[events.length - 1]!; - expect(msgFinish.type).toBe("message-finish"); + expect(msgFinish.event).toBe("message-finish"); expect((msgFinish as { reason: string }).reason).toBe("stop"); }); }); @@ -293,7 +293,7 @@ describe("_streamChatModelEvents bridge", () => { } // Should have start events for both blocks - const starts = events.filter((e) => e.type === "content-block-start"); + const starts = events.filter((e) => e.event === "content-block-start"); expect(starts.length).toBe(2); // Block 0: reasoning @@ -311,7 +311,7 @@ describe("_streamChatModelEvents bridge", () => { // Reasoning deltas should accumulate const reasoningDeltas = events.filter( (e) => - e.type === "content-block-delta" && + e.event === "content-block-delta" && (e as { index: number }).index === 0 ); expect(reasoningDeltas.length).toBe(1); // second reasoning chunk is a delta @@ -326,7 +326,7 @@ describe("_streamChatModelEvents bridge", () => { expect(lastReasoningDelta.content.reasoning).toBe(" hard..."); // Finish events for both blocks - const finishes = events.filter((e) => e.type === "content-block-finish"); + const finishes = events.filter((e) => e.event === "content-block-finish"); expect(finishes.length).toBe(2); }); @@ -342,7 +342,7 @@ describe("_streamChatModelEvents bridge", () => { const finish = events.find( (e) => - e.type === "content-block-finish" && + e.event === "content-block-finish" && (e as { index: number }).index === 0 ) as { content: { type: string; thinking?: string } }; @@ -363,7 +363,7 @@ describe("_streamChatModelEvents bridge", () => { } // Should have a start event for the tool call - const starts = events.filter((e) => e.type === "content-block-start"); + const starts = events.filter((e) => e.event === "content-block-start"); expect(starts.length).toBeGreaterThanOrEqual(1); const toolStart = starts.find( @@ -374,7 +374,7 @@ describe("_streamChatModelEvents bridge", () => { expect(toolStart!.content.name).toBe("search"); // Should have a finish event with finalized tool call - const finishes = events.filter((e) => e.type === "content-block-finish"); + const finishes = events.filter((e) => e.event === "content-block-finish"); const toolFinish = finishes.find( (e) => (e as { content: ContentBlock.Standard }).content.type === "tool_call" @@ -396,7 +396,7 @@ describe("_streamChatModelEvents bridge", () => { events.push(event); } - const usageEvents = events.filter((e) => e.type === "usage"); + const usageEvents = events.filter((e) => e.event === "usage"); expect(usageEvents.length).toBeGreaterThanOrEqual(1); // First usage: input tokens @@ -405,10 +405,10 @@ describe("_streamChatModelEvents bridge", () => { // message-start should also have usage const msgStart = events[0] as { - type: string; + event: string; usage?: { input_tokens: number }; }; - expect(msgStart.type).toBe("message-start"); + expect(msgStart.event).toBe("message-start"); expect(msgStart.usage?.input_tokens).toBe(100); }); }); diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts index babb9d6187a9..f2ac46d65aa6 100644 --- a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -240,12 +240,12 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - const types = events.map((e) => e.type); - expect(types).toContain("message-start"); - expect(types).toContain("content-block-start"); - expect(types).toContain("content-block-delta"); - expect(types).toContain("content-block-finish"); - expect(types).toContain("message-finish"); + const eventNames = events.map((e) => e.event); + expect(eventNames).toContain("message-start"); + expect(eventNames).toContain("content-block-start"); + expect(eventNames).toContain("content-block-delta"); + expect(eventNames).toContain("content-block-finish"); + expect(eventNames).toContain("message-finish"); }); test("message-start carries id and usage", async () => { @@ -257,7 +257,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - const start = events.find((e) => e.type === "message-start"); + const start = events.find((e) => e.event === "message-start"); expect(start).toBeDefined(); expect((start as { id?: string }).id).toBe("msg_01ABC"); expect( @@ -275,7 +275,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { } const deltas = events.filter( - (e) => e.type === "content-block-delta" && "index" in e && e.index === 0 + (e) => e.event === "content-block-delta" && "index" in e && e.index === 0 ); expect(deltas.length).toBe(2); @@ -306,7 +306,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { const finish = events.find( (e) => - e.type === "content-block-finish" && "index" in e && e.index === 0 + e.event === "content-block-finish" && "index" in e && e.index === 0 ) as { content: { type: string; text: string } }; expect(finish).toBeDefined(); expect(finish.content.type).toBe("text"); @@ -323,7 +323,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - const finish = events.find((e) => e.type === "message-finish") as { + const finish = events.find((e) => e.event === "message-finish") as { reason: string; }; expect(finish.reason).toBe("stop"); @@ -343,7 +343,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // Reasoning deltas const reasoningDeltas = events.filter( (e) => - e.type === "content-block-delta" && + e.event === "content-block-delta" && "index" in e && e.index === 0 && "content" in e && @@ -365,7 +365,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // Reasoning finish const reasoningFinish = events.find( (e) => - e.type === "content-block-finish" && "index" in e && e.index === 0 + e.event === "content-block-finish" && "index" in e && e.index === 0 ) as { content: { type: string; reasoning: string } }; expect(reasoningFinish.content.type).toBe("reasoning"); expect(reasoningFinish.content.reasoning).toBe("Let me reason..."); @@ -383,7 +383,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { const textFinish = events.find( (e) => - e.type === "content-block-finish" && "index" in e && e.index === 1 + e.event === "content-block-finish" && "index" in e && e.index === 1 ) as { content: { type: string; text: string } }; expect(textFinish.content.type).toBe("text"); expect(textFinish.content.text).toBe("The answer is 42."); @@ -402,7 +402,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // Signature delta should be emitted as a content block update const sigDelta = events.find( (e) => - e.type === "content-block-delta" && + e.event === "content-block-delta" && "content" in e && (e.content as { signature?: string }).signature === "sig_abc" ) as { content: { type: string; signature?: string } }; @@ -424,7 +424,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // Start event for tool call const toolStart = events.find( - (e) => e.type === "content-block-start" && "index" in e && e.index === 1 + (e) => e.event === "content-block-start" && "index" in e && e.index === 1 ) as { content: { type: string; name: string; id: string } }; expect(toolStart.content.type).toBe("tool_call_chunk"); expect(toolStart.content.name).toBe("web_search"); @@ -432,7 +432,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // Deltas carry incremental tool_call_chunk content const toolDeltas = events.filter( - (e) => e.type === "content-block-delta" && "index" in e && e.index === 1 + (e) => e.event === "content-block-delta" && "index" in e && e.index === 1 ); expect(toolDeltas.length).toBe(2); @@ -461,7 +461,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { const toolFinish = events.find( (e) => - e.type === "content-block-finish" && "index" in e && e.index === 1 + e.event === "content-block-finish" && "index" in e && e.index === 1 ) as { content: { type: string; @@ -486,7 +486,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - const finish = events.find((e) => e.type === "message-finish") as { + const finish = events.find((e) => e.event === "message-finish") as { reason: string; }; expect(finish.reason).toBe("tool_use"); @@ -504,7 +504,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { } // message-start should have input usage with cache details - const start = events.find((e) => e.type === "message-start") as { + const start = events.find((e) => e.event === "message-start") as { usage: { input_tokens: number; input_token_details: { @@ -528,7 +528,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - const usageEvents = events.filter((e) => e.type === "usage"); + const usageEvents = events.filter((e) => e.event === "usage"); expect(usageEvents.length).toBeGreaterThanOrEqual(1); // Last usage should include output tokens @@ -547,7 +547,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - const finish = events.find((e) => e.type === "message-finish") as { + const finish = events.find((e) => e.event === "message-finish") as { usage: { input_tokens: number; output_tokens: number }; }; expect(finish.usage.input_tokens).toBe(800); @@ -565,11 +565,11 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - const usageEvents = events.filter((e) => e.type === "usage"); + const usageEvents = events.filter((e) => e.event === "usage"); expect(usageEvents.length).toBe(0); // message-start and message-finish should not have usage - const start = events.find((e) => e.type === "message-start") as { + const start = events.find((e) => e.event === "message-start") as { usage?: unknown; }; expect(start.usage).toBeUndefined(); @@ -587,7 +587,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { events.push(event); } - const providerEvents = events.filter((e) => e.type === "provider"); + const providerEvents = events.filter((e) => e.event === "provider"); const metaEvent = providerEvents.find( (e) => (e as { name: string }).name === "message_start" ) as { provider: string; payload: { model: string; id: string } }; @@ -613,7 +613,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { } const pingEvent = events.find( - (e) => e.type === "provider" && (e as { name: string }).name === "ping" + (e) => e.event === "provider" && (e as { name: string }).name === "ping" ); expect(pingEvent).toBeDefined(); }); diff --git a/libs/providers/langchain-anthropic/src/utils/stream_events.ts b/libs/providers/langchain-anthropic/src/utils/stream_events.ts index 623071b5a597..a950a96f8cbe 100644 --- a/libs/providers/langchain-anthropic/src/utils/stream_events.ts +++ b/libs/providers/langchain-anthropic/src/utils/stream_events.ts @@ -47,12 +47,12 @@ export async function* convertAnthropicStream( usageSnapshot = buildUsageSnapshot(usage); } yield { - type: "message-start" as const, + event: "message-start" as const, id, ...(usageSnapshot ? { usage: usageSnapshot } : {}), }; yield { - type: "provider" as const, + event: "provider" as const, provider: "anthropic", name: "message_start", payload: { model, id }, @@ -80,14 +80,14 @@ export async function* convertAnthropicStream( data.usage.output_tokens, }; } - yield { type: "usage" as const, usage: usageSnapshot }; + yield { event: "usage" as const, usage: usageSnapshot }; } if ( "context_management" in data.delta && data.delta.context_management ) { yield { - type: "provider" as const, + event: "provider" as const, provider: "anthropic", name: "context_management", payload: data.delta.context_management, @@ -98,10 +98,10 @@ export async function* convertAnthropicStream( case "message_stop": { yield { - type: "message-finish" as const, + event: "message-finish" as const, reason: mapStopReason(stopReason), ...(usageSnapshot ? { usage: usageSnapshot } : {}), - responseMetadata: { model_provider: "anthropic" }, + metadata: { model_provider: "anthropic" }, }; break; } @@ -112,7 +112,7 @@ export async function* convertAnthropicStream( const mapped = mapBlockToContentBlock(content_block, index); blockAccumulators.set(index, { ...mapped }); yield { - type: "content-block-start" as const, + event: "content-block-start" as const, index, content: mapped, }; @@ -128,7 +128,7 @@ export async function* convertAnthropicStream( blockAccumulators.set(index, accumulated); yield { - type: "content-block-delta" as const, + event: "content-block-delta" as const, index, content: contentDelta, }; @@ -142,7 +142,7 @@ export async function* convertAnthropicStream( const finalized = finalizeBlock(acc); yield { - type: "content-block-finish" as const, + event: "content-block-finish" as const, index, content: finalized, }; @@ -153,7 +153,7 @@ export async function* convertAnthropicStream( // ── Unhandled → provider passthrough ─────────────────── default: { yield { - type: "provider" as const, + event: "provider" as const, provider: "anthropic", name: data.type, payload: data, From 227d02be6a5d313f892a15e120035e51aeb4edd0 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Sat, 25 Apr 2026 08:03:47 -0700 Subject: [PATCH 10/39] widen types --- .../src/language_models/event.ts | 15 ++++++-- .../src/language_models/stream.ts | 36 +++++++++++++++---- .../src/language_models/tests/stream.test.ts | 21 +++++++++++ 3 files changed, 63 insertions(+), 9 deletions(-) diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts index 1abe7e24e48e..e9ed08f3001f 100644 --- a/libs/langchain-core/src/language_models/event.ts +++ b/libs/langchain-core/src/language_models/event.ts @@ -39,6 +39,15 @@ import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; +/** + * Usage shape accepted by chat model stream events. + * + * This is intentionally wider than {@link UsageMetadata}: protocol sources + * may report partial token snapshots, while {@link ChatModelStream} normalizes + * them before exposing `.usage` or the final `AIMessage.usage_metadata`. + */ +export type UsageMetadataLike = Partial; + // ─── Message Lifecycle ────────────────────────────────────────── /** @@ -52,7 +61,7 @@ export interface MessageStartEvent { * Initial usage snapshot, if the provider reports input token counts * before content begins streaming (e.g., Anthropic's `message_start`). */ - usage?: UsageMetadata; + usage?: UsageMetadataLike; } /** @@ -73,7 +82,7 @@ export interface MessageFinishEvent { /** Why the model stopped generating. */ reason?: FinishReason; /** Final usage snapshot. */ - usage?: UsageMetadata; + usage?: UsageMetadataLike; /** Provider-specific response metadata (model name, response ID, headers, etc.). */ metadata?: Record; } @@ -157,7 +166,7 @@ export interface ContentBlockFinishEvent { export interface UsageUpdateEvent { event: "usage"; /** Current usage snapshot. */ - usage: UsageMetadata; + usage: UsageMetadataLike; } // ─── Provider Passthrough ─────────────────────────────────────── diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index aea98fe6f53c..4dead6a88388 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -9,6 +9,8 @@ import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; import type { ChatModelStreamEvent } from "./event.js"; +type UsageMetadataLike = Partial; + // ─── Replay Buffer ────────────────────────────────────────────── /** @@ -159,6 +161,25 @@ function isReasoningContent(content: unknown): boolean { return type === "reasoning" || type === "thinking"; } +/** + * Normalize protocol-compatible partial usage into Core's concrete usage shape. + * + * Some stream sources emit usage snapshots without every aggregate token field. + * Keep the stream event input permissive, then normalize at read time so + * high-level Core consumers always receive a complete {@link UsageMetadata}. + */ +function normalizeUsage( + usage: UsageMetadataLike | undefined +): UsageMetadata | undefined { + if (!usage) return undefined; + return { + ...usage, + input_tokens: usage.input_tokens ?? 0, + output_tokens: usage.output_tokens ?? 0, + total_tokens: usage.total_tokens ?? 0, + }; +} + // ─── Sub-Stream: Text ─────────────────────────────────────────── /** @@ -428,11 +449,14 @@ export class UsageMetadataStream async function* gen() { for await (const event of buffer.iterate()) { if (event.event === "usage") { - yield event.usage; + const usage = normalizeUsage(event.usage); + if (usage) yield usage; } else if (event.event === "message-start" && event.usage) { - yield event.usage; + const usage = normalizeUsage(event.usage); + if (usage) yield usage; } else if (event.event === "message-finish" && event.usage) { - yield event.usage; + const usage = normalizeUsage(event.usage); + if (usage) yield usage; } } } @@ -537,7 +561,7 @@ export class ChatModelStream switch (event.event) { case "message-start": id = event.id ?? id; - if (event.usage) usage = event.usage; + if (event.usage) usage = normalizeUsage(event.usage); break; case "content-block-start": @@ -557,12 +581,12 @@ export class ChatModelStream break; case "usage": - usage = event.usage; + usage = normalizeUsage(event.usage); break; case "message-finish": finishReason = event.reason; - if (event.usage) usage = event.usage; + if (event.usage) usage = normalizeUsage(event.usage); if (event.metadata) { metadata = { ...metadata, diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 659ae8061e37..762ff5d7e438 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -367,6 +367,27 @@ describe("ChatModelStream", () => { const usage = await stream.usage; expect(usage).toBeUndefined(); }); + + test("normalizes partial usage snapshots", async () => { + const events: ChatModelStreamEvent[] = [ + { event: "message-start", usage: { input_tokens: 3 } }, + { event: "message-finish", usage: { output_tokens: 5 } }, + ]; + const stream = new ChatModelStream(iterEvents(events)); + + await expect(stream.usage).resolves.toEqual({ + input_tokens: 0, + output_tokens: 5, + total_tokens: 0, + }); + await expect(stream.output).resolves.toMatchObject({ + usage_metadata: { + input_tokens: 0, + output_tokens: 5, + total_tokens: 0, + }, + }); + }); }); describe(".output (AIMessage assembly)", () => { From 53d041d8cd7e8197d56d15ab078a925ff291e8a0 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Mon, 27 Apr 2026 13:10:05 -0700 Subject: [PATCH 11/39] format --- .../src/tests/chat_models_stream_events.test.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts index f2ac46d65aa6..0f61caf4708c 100644 --- a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -275,7 +275,8 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { } const deltas = events.filter( - (e) => e.event === "content-block-delta" && "index" in e && e.index === 0 + (e) => + e.event === "content-block-delta" && "index" in e && e.index === 0 ); expect(deltas.length).toBe(2); @@ -424,7 +425,8 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // Start event for tool call const toolStart = events.find( - (e) => e.event === "content-block-start" && "index" in e && e.index === 1 + (e) => + e.event === "content-block-start" && "index" in e && e.index === 1 ) as { content: { type: string; name: string; id: string } }; expect(toolStart.content.type).toBe("tool_call_chunk"); expect(toolStart.content.name).toBe("web_search"); @@ -432,7 +434,8 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // Deltas carry incremental tool_call_chunk content const toolDeltas = events.filter( - (e) => e.event === "content-block-delta" && "index" in e && e.index === 1 + (e) => + e.event === "content-block-delta" && "index" in e && e.index === 1 ); expect(toolDeltas.length).toBe(2); From bc82974a5a55cf131a283cd7ae7e59fed708eaee Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Mon, 27 Apr 2026 13:17:24 -0700 Subject: [PATCH 12/39] respect headless tools --- libs/langchain/src/agents/stream.ts | 30 ++++++++ .../langchain/src/agents/tests/stream.test.ts | 77 ++++++++++++++++++- 2 files changed, 106 insertions(+), 1 deletion(-) diff --git a/libs/langchain/src/agents/stream.ts b/libs/langchain/src/agents/stream.ts index 03ce213085c3..be400078669c 100644 --- a/libs/langchain/src/agents/stream.ts +++ b/libs/langchain/src/agents/stream.ts @@ -186,6 +186,33 @@ function isOwnEvent(ns: Namespace, path: Namespace): boolean { return true; } +function isHeadlessToolInterruptError( + message: string, + toolCallId: string | undefined +): boolean { + try { + const parsed = JSON.parse(message) as unknown; + if (!Array.isArray(parsed)) return false; + return parsed.some((entry) => { + if (entry == null || typeof entry !== "object") return false; + const value = (entry as { value?: unknown }).value; + if (value == null || typeof value !== "object") return false; + const payload = value as { + type?: unknown; + toolCall?: { id?: unknown }; + }; + return ( + payload.type === "tool" && + (toolCallId == null || + payload.toolCall?.id == null || + payload.toolCall.id === toolCallId) + ); + }); + } catch { + return false; + } +} + /** * Creates a native transformer that correlates `tools` channel events * into per-call {@link ToolCallStream} objects. @@ -306,6 +333,9 @@ export function createToolCallTransformer( const message = ((data as Record).message as string) ?? "unknown error"; + if (isHeadlessToolInterruptError(message, toolCallId)) { + return true; + } pending.rejectOutput(new Error(message)); pending.resolveStatus("error"); pending.resolveError(message); diff --git a/libs/langchain/src/agents/tests/stream.test.ts b/libs/langchain/src/agents/tests/stream.test.ts index d205cdf9534c..6aa9bbc6f466 100644 --- a/libs/langchain/src/agents/tests/stream.test.ts +++ b/libs/langchain/src/agents/tests/stream.test.ts @@ -3,11 +3,16 @@ import { z } from "zod/v3"; import { AIMessage, HumanMessage } from "@langchain/core/messages"; import { tool } from "@langchain/core/tools"; import { fakeModel } from "@langchain/core/testing"; -import { StreamChannel, type StreamTransformer } from "@langchain/langgraph"; +import { + StreamChannel, + type ProtocolEvent, + type StreamTransformer, +} from "@langchain/langgraph"; import { MemorySaver } from "@langchain/langgraph-checkpoint"; import { createAgent, createMiddleware } from "../index.js"; import { humanInTheLoopMiddleware } from "../middleware/hitl.js"; +import { createToolCallTransformer } from "../stream.js"; describe("stream_v2", () => { it("should emit tool call streams for each tool invocation", async () => { @@ -414,4 +419,74 @@ describe("stream_v2", () => { }), ]); }); + + it("should keep tool call streams pending across headless tool interrupts", async () => { + const transformer = createToolCallTransformer([])(); + const projection = transformer.init(); + const toolEvent = (data: Record): ProtocolEvent => + ({ + method: "tools", + params: { + namespace: ["tools:abc"], + data, + }, + }) as ProtocolEvent; + + transformer.process( + toolEvent({ + event: "tool-started", + tool_call_id: "call_1", + tool_name: "memory_list", + input: '{"limit":100}', + }) + ); + + const iterator = projection.toolCalls[Symbol.asyncIterator](); + const pendingCall = await iterator.next(); + + transformer.process( + toolEvent({ + event: "tool-error", + tool_call_id: "call_1", + message: JSON.stringify([ + { + id: "interrupt_1", + value: { + type: "tool", + toolCall: { + id: "call_1", + name: "memory_list", + args: { limit: 100 }, + }, + }, + }, + ]), + }) + ); + + transformer.process( + toolEvent({ + event: "tool-started", + tool_call_id: "call_1", + tool_name: "memory_list", + input: '{"limit":100}', + }) + ); + + transformer.process( + toolEvent({ + event: "tool-finished", + tool_call_id: "call_1", + output: { count: 1 }, + }) + ); + + transformer.finalize?.(); + + expect(pendingCall.done).toBe(false); + expect(pendingCall.value.callId).toBe("call_1"); + expect(await pendingCall.value.status).toBe("finished"); + expect(await pendingCall.value.output).toEqual({ count: 1 }); + expect(await iterator.next()).toEqual({ done: true, value: undefined }); + }); }); From 261aaf198d7d7bb0d5eb1cdd9ca5ec1bf1cef494 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Mon, 27 Apr 2026 13:34:13 -0700 Subject: [PATCH 13/39] fix cjs tests --- .github/workflows/test-exports.yml | 8 ++++++++ environment_tests/docker-compose.yml | 9 +++++++++ environment_tests/scripts/test-runner.ts | 4 ++++ 3 files changed, 21 insertions(+) diff --git a/.github/workflows/test-exports.yml b/.github/workflows/test-exports.yml index 83440c690e40..7bf5c805b441 100644 --- a/.github/workflows/test-exports.yml +++ b/.github/workflows/test-exports.yml @@ -57,6 +57,7 @@ jobs: --filter @langchain/openai --filter @langchain/ollama --filter @langchain/google-gauth + --filter @langchain/google-common --filter @langchain/textsplitters shell: bash @@ -86,6 +87,7 @@ jobs: --filter @langchain/openai --filter @langchain/ollama --filter @langchain/google-gauth + --filter @langchain/google-common shell: bash @@ -115,6 +117,7 @@ jobs: --filter @langchain/openai --filter @langchain/ollama --filter @langchain/google-gauth + --filter @langchain/google-common shell: bash @@ -144,6 +147,7 @@ jobs: --filter @langchain/openai --filter @langchain/ollama --filter @langchain/google-gauth + --filter @langchain/google-common shell: bash @@ -173,6 +177,7 @@ jobs: --filter @langchain/openai --filter @langchain/ollama --filter @langchain/google-gauth + --filter @langchain/google-common shell: bash @@ -202,6 +207,7 @@ jobs: --filter @langchain/openai --filter @langchain/ollama --filter @langchain/google-gauth + --filter @langchain/google-common shell: bash @@ -231,6 +237,7 @@ jobs: --filter @langchain/openai --filter @langchain/ollama --filter @langchain/google-gauth + --filter @langchain/google-common shell: bash @@ -261,6 +268,7 @@ jobs: --filter @langchain/openai --filter @langchain/ollama --filter @langchain/google-gauth + --filter @langchain/google-common shell: bash diff --git a/environment_tests/docker-compose.yml b/environment_tests/docker-compose.yml index 078349cb7d9b..fac90eb28582 100644 --- a/environment_tests/docker-compose.yml +++ b/environment_tests/docker-compose.yml @@ -17,6 +17,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters @@ -41,6 +42,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters @@ -65,6 +67,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters @@ -89,6 +92,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters @@ -113,6 +117,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters @@ -137,6 +142,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters @@ -161,6 +167,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters @@ -182,6 +189,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters @@ -206,6 +214,7 @@ services: - ../libs/providers/langchain-ollama:/langchain-ollama - ../libs/providers/langchain-google-gauth:/langchain-google-gauth + - ../libs/providers/langchain-google-common:/langchain-google-common - ../internal/standard-tests:/langchain-standard-tests - ../libs/langchain-scripts:/langchain-scripts - ../libs/langchain-textsplitters:/langchain-textsplitters diff --git a/environment_tests/scripts/test-runner.ts b/environment_tests/scripts/test-runner.ts index 564df6f5acda..96c39bc8a297 100644 --- a/environment_tests/scripts/test-runner.ts +++ b/environment_tests/scripts/test-runner.ts @@ -29,6 +29,10 @@ const dockerPackages: WorkspacePackage[] = [ pkg: { name: "@langchain/google-gauth" }, path: "/langchain-google-gauth", }, + { + pkg: { name: "@langchain/google-common" }, + path: "/langchain-google-common", + }, { pkg: { name: "@langchain/standard-tests" }, path: "/langchain-standard-tests", From 9d2a0be2d331ee45e193e73e52f6c939165d2a58 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Tue, 28 Apr 2026 18:26:51 -0700 Subject: [PATCH 14/39] update deltas --- .../src/language_models/chat_models.ts | 2 +- .../src/language_models/compat.ts | 111 +++++++++------ .../src/language_models/event.ts | 91 ++++++++++--- .../src/language_models/stream.ts | 128 ++++++++++-------- .../src/language_models/tests/event.test.ts | 66 +++++---- .../src/language_models/tests/stream.test.ts | 85 ++++++++---- .../tests/stream_bridge.test.ts | 18 +-- .../tests/chat_models_stream_events.test.ts | 51 +++---- .../src/utils/stream_events.ts | 47 +++++-- 9 files changed, 391 insertions(+), 208 deletions(-) diff --git a/libs/langchain-core/src/language_models/chat_models.ts b/libs/langchain-core/src/language_models/chat_models.ts index b646adc52a50..e62d329023aa 100644 --- a/libs/langchain-core/src/language_models/chat_models.ts +++ b/libs/langchain-core/src/language_models/chat_models.ts @@ -313,7 +313,7 @@ export abstract class BaseChatModel< * ``` * MessageStart * -> ContentBlockStart(index, contentBlock) - * -> ContentBlockDelta(index, content) ... + * -> ContentBlockDelta(index, delta) ... * -> ContentBlockFinish(index, contentBlock) * -> MessageFinish(reason, usage?) * ``` diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 75dfdf814996..4cf0c152cde4 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -9,7 +9,7 @@ import { isAIMessageChunk } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { ChatGenerationChunk } from "../outputs.js"; -import type { ChatModelStreamEvent } from "./event.js"; +import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; /** * Convert an async iterable of legacy `ChatGenerationChunk`s into @@ -74,7 +74,7 @@ export async function* convertChunksToEvents( yield { event: "content-block-delta" as const, index: blockIndex, - content: { type: "text" as const, text: content }, + delta: { type: "text-delta" as const, text: content }, }; } } else if (Array.isArray(content)) { @@ -94,11 +94,12 @@ export async function* convertChunksToEvents( }; } else { const block = activeBlocks.get(blockIndex)!; - block.accumulated = applyDeltaToBlock(block.accumulated, part); + const delta = contentBlockToDelta(part); + block.accumulated = applyDeltaToBlock(block.accumulated, delta); yield { event: "content-block-delta" as const, index: blockIndex, - content: part, + delta, }; } } @@ -148,7 +149,15 @@ export async function* convertChunksToEvents( yield { event: "content-block-delta" as const, index: blockIndex, - content: { ...(block.accumulated as ContentBlock) }, + delta: { + type: "block-delta" as const, + fields: { + type: "tool_call_chunk", + ...("id" in acc && acc.id != null ? { id: acc.id } : {}), + ...("name" in acc && acc.name != null ? { name: acc.name } : {}), + args: acc.args, + }, + }, }; } } @@ -192,51 +201,75 @@ export async function* convertChunksToEvents( */ function applyDeltaToBlock( block: ContentBlock, - delta: ContentBlock + delta: ContentBlockDelta ): ContentBlock { - if (block.type !== delta.type) { - return { ...delta }; - } - - if ( - (delta as { type?: string }).type === "thinking" && - (block as { type?: string }).type === "thinking" - ) { - const thinking = - ((block as { thinking?: string }).thinking ?? "") + - ((delta as { thinking?: string }).thinking ?? ""); - return { ...block, ...delta, thinking } as unknown as ContentBlock; - } - switch (delta.type) { - case "text": + case "text-delta": return { ...block, - ...delta, text: ((block as { text?: string }).text ?? "") + delta.text, - }; - case "reasoning": + } as ContentBlock; + case "reasoning-delta": + if ((block as { type?: string }).type === "thinking") { + return { + ...block, + thinking: + ((block as { thinking?: string }).thinking ?? "") + delta.reasoning, + } as unknown as ContentBlock; + } return { ...block, - ...delta, reasoning: ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, - }; - case "tool_call_chunk": - case "server_tool_call_chunk": { - const merged = { ...block, ...delta } as Record; - if (delta.id == null && "id" in block && block.id != null) { - merged.id = block.id; - } - if (delta.name == null && "name" in block && block.name != null) { - merged.name = block.name; - } - merged.args = `${("args" in block ? block.args : "") ?? ""}${delta.args ?? ""}`; - return merged as unknown as ContentBlock; - } + } as ContentBlock; + case "data-delta": + return { + ...block, + data: ((block as { data?: string }).data ?? "") + delta.data, + } as ContentBlock; + case "block-delta": + return { ...block, ...delta.fields } as ContentBlock; default: - return { ...block, ...delta }; + throw new Error(`Unknown delta type: ${JSON.stringify(delta)}`); + } +} + +function contentBlockToDelta(block: ContentBlock): ContentBlockDelta { + if (block.type === "text") { + return { type: "text-delta", text: (block as ContentBlock.Text).text }; + } + if (block.type === "reasoning") { + return { + type: "reasoning-delta", + reasoning: (block as ContentBlock.Reasoning).reasoning, + }; + } + if ( + (block as { type?: string }).type === "thinking" && + typeof (block as { thinking?: unknown }).thinking === "string" + ) { + return { + type: "reasoning-delta", + reasoning: (block as unknown as { thinking: string }).thinking, + }; + } + if (typeof (block as { data?: unknown }).data === "string") { + return { + type: "data-delta", + data: (block as unknown as { data: string }).data, + encoding: "base64", + }; } + if (typeof (block as { type?: unknown }).type === "string") { + return { + type: "block-delta", + fields: { + ...(block as unknown as { type: string } & Record), + }, + }; + } + + throw new Error(`Unsupported content block delta: ${JSON.stringify(block)}`); } /** diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts index e9ed08f3001f..8b3d31a94169 100644 --- a/libs/langchain-core/src/language_models/event.ts +++ b/libs/langchain-core/src/language_models/event.ts @@ -3,13 +3,13 @@ * * Defines a content-block-centric event model for streaming chat model responses. * Events carry LangChain {@link ContentBlock} types on lifecycle boundaries - * and as incremental content updates during streaming. + * and explicit delta variants for incremental updates during streaming. * * ## Design Principles * - * 1. **Content-block deltas use the content block shape.** Text, reasoning, - * and tool-call chunks are emitted as partial {@link ContentBlock} values - * with explicit append semantics. + * 1. **Content-block deltas have explicit merge semantics.** Text, + * reasoning, and data deltas append to named fields. Generic block deltas + * shallow-merge fields onto the active content block. * * 2. **Lifecycle completeness.** Every streamable entity has explicit start and finish * events. Consumers never need to infer boundaries from absence of events. @@ -26,8 +26,8 @@ * ``` * MessageStart * -> ContentBlockStart(index=0, content=...) - * -> ContentBlockDelta(index=0, content={ type: "text", text: "Hello" }) - * -> ContentBlockDelta(index=0, content={ type: "text", text: " world" }) + * -> ContentBlockDelta(index=0, delta={ type: "text-delta", text: "Hello" }) + * -> ContentBlockDelta(index=0, delta={ type: "text-delta", text: " world" }) * -> ContentBlockFinish(index=0, content=...) * -> UsageUpdate(...) * -> MessageFinish(reason, usage?) @@ -38,7 +38,6 @@ import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; - /** * Usage shape accepted by chat model stream events. * @@ -88,6 +87,7 @@ export interface MessageFinishEvent { } // ─── Content Block Lifecycle ──────────────────────────────────── +// See https://github.com/langchain-ai/agent-protocol/blob/main/streaming/protocol.cddl /** * Emitted when a new content block begins streaming. @@ -106,38 +106,91 @@ export interface ContentBlockStartEvent { content: ContentBlock; } +// ─── Content Block Deltas ─────────────────────────────────────── + +/** + * Incremental text content. Append `text` to the active block's `text` field. + */ +export interface TextDelta { + type: "text-delta"; + /** The new text to append. */ + text: string; +} + +/** + * Incremental reasoning content. Append `reasoning` to the active block's + * `reasoning` field. + */ +export interface ReasoningDelta { + type: "reasoning-delta"; + /** The new reasoning text to append. */ + reasoning: string; +} + +/** + * Incremental encoded data. Append `data` to the active multimodal block's + * data field. + */ +export interface DataDelta { + type: "data-delta"; + /** Encoded data chunk to append. */ + data: string; + /** Encoding for the data chunk. Defaults to `"base64"` when omitted. */ + encoding?: "base64"; +} + +/** + * Generic content block field update. Shallow-merge `fields` onto the active + * content block. + */ +export interface BlockDelta { + type: "block-delta"; + /** Fields to shallow-merge onto the active content block. */ + fields: { type: string } & Record; +} + +/** + * Union of all content block delta types. + */ +export type ContentBlockDelta = + | TextDelta + | ReasoningDelta + | DataDelta + | BlockDelta; + /** * Emitted for each incremental update within a content block. * - * The `content` field carries the incremental content block update. + * The `delta` field carries the incremental content block update. * Accumulation rules: - * - `text` → append `text` to the block's text field - * - `reasoning` → append `reasoning` to the block's reasoning field - * - `tool_call_chunk` / `server_tool_call_chunk` → append `args`, - * preserving stable `id`/`name` when later chunks omit them - * - all other fields are shallow-merged + * - `text-delta` → append `text` to the active block's text field + * - `reasoning-delta` → append `reasoning` to the active block's reasoning field + * - `data-delta` → append `data` to the active block's data field + * - `block-delta` → shallow-merge `fields` onto the active block * * @example * ```ts * // Text token * { event: "content-block-delta", index: 0, - * content: { type: "text", text: " world" } } + * delta: { type: "text-delta", text: " world" } } * - * // Tool call args chunk + * // Tool call args snapshot * { event: "content-block-delta", index: 1, - * content: { type: "tool_call_chunk", args: '{"q":"wea' } } + * delta: { type: "block-delta", + * fields: { type: "tool_call_chunk", args: '{"q":"wea' } } } } * * // Provider-specific field (e.g., signature) * { event: "content-block-delta", index: 0, - * content: { type: "reasoning", signature: "sig_abc" } } + * delta: { type: "block-delta", + * fields: { type: "reasoning", signature: "sig_abc" } } } * ``` */ export interface ContentBlockDeltaEvent { event: "content-block-delta"; /** Positional index of the block being updated. */ index: number; - /** Incremental content block update. */ - content: ContentBlock; + /** Incremental content block delta. */ + delta: ContentBlockDelta; } /** diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 4dead6a88388..7d9032e7b31b 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -7,7 +7,7 @@ import { AIMessage } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; -import type { ChatModelStreamEvent } from "./event.js"; +import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; type UsageMetadataLike = Partial; @@ -85,58 +85,75 @@ class ReplayBuffer { /** * Apply a typed delta to an accumulated content block. * - * - `text` → append text - * - `reasoning` / provider `thinking` → append reasoning text - * - `tool_call_chunk` / `server_tool_call_chunk` → append args while - * preserving id/name from previous chunks when a later delta omits them - * - other block types → shallow merge + * - `text-delta` → append text + * - `reasoning-delta` → append reasoning text + * - `data-delta` → append encoded data to `data` + * - `block-delta` → shallow merge fields * * @internal */ -function applyDelta(block: ContentBlock, delta: ContentBlock): ContentBlock { - if (block.type !== delta.type) { - return { ...delta }; - } - - if ( - (delta as { type?: string }).type === "thinking" && - (block as { type?: string }).type === "thinking" - ) { - const thinking = - ((block as { thinking?: string }).thinking ?? "") + - ((delta as { thinking?: string }).thinking ?? ""); - return { ...block, ...delta, thinking } as unknown as ContentBlock; - } - +function applyDelta( + block: ContentBlock, + delta: ContentBlockDelta +): ContentBlock { switch (delta.type) { - case "text": + case "text-delta": return { ...block, - ...delta, text: ((block as { text?: string }).text ?? "") + delta.text, - }; - case "reasoning": + } as ContentBlock; + case "reasoning-delta": + if ((block as { type?: string }).type === "thinking") { + return { + ...block, + thinking: + ((block as { thinking?: string }).thinking ?? "") + delta.reasoning, + } as unknown as ContentBlock; + } return { ...block, - ...delta, reasoning: ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, - }; - case "tool_call_chunk": - case "server_tool_call_chunk": { - const merged = { ...block, ...delta } as Record; - if (delta.id == null && "id" in block && block.id != null) { - merged.id = block.id; - } - if (delta.name == null && "name" in block && block.name != null) { - merged.name = block.name; - } - merged.args = `${("args" in block ? block.args : "") ?? ""}${delta.args ?? ""}`; - return merged as unknown as ContentBlock; - } + } as ContentBlock; + case "data-delta": + return { + ...block, + data: ((block as { data?: string }).data ?? "") + delta.data, + } as ContentBlock; + case "block-delta": + return { ...block, ...delta.fields } as ContentBlock; default: - return { ...block, ...delta }; + throw new Error(`Unknown delta type: ${JSON.stringify(delta)}`); + } +} + +function getEventDelta( + event: ChatModelStreamEvent +): ContentBlockDelta | undefined { + if (event.event !== "content-block-delta") return undefined; + if ("delta" in event && event.delta) return event.delta; + + // Transitional tolerance for any stream sources still emitting the previous + // content-shaped delta object. + const content = (event as { content?: unknown }).content; + if (content == null || typeof content !== "object") return undefined; + const block = content as { type?: string } & Record; + if (block.type === "text" && typeof block.text === "string") { + return { type: "text-delta", text: block.text }; + } + if (block.type === "reasoning" && typeof block.reasoning === "string") { + return { type: "reasoning-delta", reasoning: block.reasoning }; + } + if (block.type === "thinking" && typeof block.thinking === "string") { + return { type: "reasoning-delta", reasoning: block.thinking }; + } + if (typeof block.data === "string") { + return { type: "data-delta", data: block.data, encoding: "base64" }; + } + if (typeof block.type === "string") { + return { type: "block-delta", fields: { ...block, type: block.type } }; } + return undefined; } function getReasoningDelta(content: unknown): string | undefined { @@ -207,12 +224,9 @@ export class TextContentStream async *[Symbol.asyncIterator]() { let accumulated = ""; for await (const event of buffer.iterate()) { - if ( - event.event === "content-block-delta" && - event.content.type === "text" && - typeof event.content.text === "string" - ) { - accumulated += event.content.text; + const delta = getEventDelta(event); + if (delta?.type === "text-delta") { + accumulated += delta.text; yield accumulated; } } @@ -225,12 +239,9 @@ export class TextContentStream const buffer = this._buffer; async function* gen() { for await (const event of buffer.iterate()) { - if ( - event.event === "content-block-delta" && - event.content.type === "text" && - typeof event.content.text === "string" - ) { - yield event.content.text; + const delta = getEventDelta(event); + if (delta?.type === "text-delta") { + yield delta.text; } } } @@ -361,9 +372,10 @@ export class ReasoningContentStream accumulated += delta; yield accumulated; } else if (event.event === "content-block-delta") { - if (!isReasoningContent(event.content)) continue; + const eventDelta = getEventDelta(event); + if (eventDelta?.type !== "reasoning-delta") continue; seenReasoning = true; - const delta = getReasoningDelta(event.content); + const delta = eventDelta.reasoning; if (delta == null || delta.length === 0) continue; accumulated += delta; yield accumulated; @@ -394,9 +406,10 @@ export class ReasoningContentStream const delta = getReasoningDelta(event.content); if (delta != null && delta.length > 0) yield delta; } else if (event.event === "content-block-delta") { - if (!isReasoningContent(event.content)) continue; + const eventDelta = getEventDelta(event); + if (eventDelta?.type !== "reasoning-delta") continue; seenReasoning = true; - const delta = getReasoningDelta(event.content); + const delta = eventDelta.reasoning; if (delta != null && delta.length > 0) yield delta; } else if ( event.event === "content-block-finish" && @@ -570,8 +583,9 @@ export class ChatModelStream case "content-block-delta": { const current = contentBlocks[event.index]; + const delta = getEventDelta(event); if (current) { - contentBlocks[event.index] = applyDelta(current, event.content); + if (delta) contentBlocks[event.index] = applyDelta(current, delta); } break; } diff --git a/libs/langchain-core/src/language_models/tests/event.test.ts b/libs/langchain-core/src/language_models/tests/event.test.ts index ba3839ef3f1d..e77d52765e75 100644 --- a/libs/langchain-core/src/language_models/tests/event.test.ts +++ b/libs/langchain-core/src/language_models/tests/event.test.ts @@ -58,50 +58,64 @@ describe("ChatModelStreamEvent types", () => { const event: ContentBlockDeltaEvent = { event: "content-block-delta", index: 0, - content: { type: "text", text: " world" }, + delta: { type: "text-delta", text: " world" }, }; expect(event.event).toBe("content-block-delta"); expect(event.index).toBe(0); - expect(event.content.type).toBe("text"); - if (event.content.type === "text") { - expect(event.content.text).toBe(" world"); - } + expect(event.delta.type).toBe("text-delta"); + expect(event.delta.text).toBe(" world"); }); test("ContentBlockDeltaEvent with tool call block-delta", () => { const event: ContentBlockDeltaEvent = { event: "content-block-delta", index: 1, - content: { - type: "tool_call_chunk", - id: "call_1", - name: "search", - args: '{"q":"wea', + delta: { + type: "block-delta", + fields: { + type: "tool_call_chunk", + id: "call_1", + name: "search", + args: '{"q":"wea', + }, }, }; expect(event.event).toBe("content-block-delta"); - expect(event.content.type).toBe("tool_call_chunk"); + expect(event.delta.type).toBe("block-delta"); + expect(event.delta.fields.type).toBe("tool_call_chunk"); }); test("ContentBlockDeltaEvent with reasoning-delta", () => { const event: ContentBlockDeltaEvent = { event: "content-block-delta", index: 0, - content: { type: "reasoning", reasoning: "Let me think" }, + delta: { type: "reasoning-delta", reasoning: "Let me think" }, }; - expect(event.content.type).toBe("reasoning"); - if (event.content.type === "reasoning") { - expect(event.content.reasoning).toBe("Let me think"); - } + expect(event.delta.type).toBe("reasoning-delta"); + expect(event.delta.reasoning).toBe("Let me think"); + }); + + test("ContentBlockDeltaEvent with data-delta", () => { + const event: ContentBlockDeltaEvent = { + event: "content-block-delta", + index: 0, + delta: { type: "data-delta", data: "UklGR", encoding: "base64" }, + }; + expect(event.delta.type).toBe("data-delta"); + expect(event.delta.data).toBe("UklGR"); }); test("ContentBlockDeltaEvent with content block delta", () => { const event: ContentBlockDeltaEvent = { event: "content-block-delta", index: 0, - content: { type: "reasoning", signature: "sig_abc" }, + delta: { + type: "block-delta", + fields: { type: "reasoning", signature: "sig_abc" }, + }, }; - expect(event.content.type).toBe("reasoning"); + expect(event.delta.type).toBe("block-delta"); + expect(event.delta.fields.type).toBe("reasoning"); }); test("ContentBlockFinishEvent with text", () => { @@ -170,7 +184,7 @@ describe("ChatModelStreamEvent types", () => { { event: "content-block-delta", index: 0, - content: { type: "text", text: "hi" }, + delta: { type: "text-delta", text: "hi" }, }, { event: "content-block-finish", @@ -224,17 +238,20 @@ describe("interleaving semantics", () => { { event: "content-block-delta", index: 0, - content: { type: "text", text: "Hello" }, + delta: { type: "text-delta", text: "Hello" }, }, { event: "content-block-delta", index: 1, - content: { type: "tool_call_chunk", args: '{"q"' }, + delta: { + type: "block-delta", + fields: { type: "tool_call_chunk", args: '{"q"' }, + }, }, { event: "content-block-delta", index: 0, - content: { type: "text", text: " world" }, + delta: { type: "text-delta", text: " world" }, }, { event: "content-block-finish", @@ -244,7 +261,10 @@ describe("interleaving semantics", () => { { event: "content-block-delta", index: 1, - content: { type: "tool_call_chunk", args: '{"q":"test"}' }, + delta: { + type: "block-delta", + fields: { type: "tool_call_chunk", args: '{"q":"test"}' }, + }, }, { event: "content-block-finish", diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 762ff5d7e438..7fee352e6c82 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -23,12 +23,12 @@ function textStreamEvents(): ChatModelStreamEvent[] { { event: "content-block-delta", index: 0, - content: { type: "text", text: "Hello" }, + delta: { type: "text-delta", text: "Hello" }, }, { event: "content-block-delta", index: 0, - content: { type: "text", text: " world" }, + delta: { type: "text-delta", text: " world" }, }, { event: "content-block-finish", @@ -65,12 +65,12 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { event: "content-block-delta", index: 0, - content: { type: "reasoning", reasoning: "Let me" }, + delta: { type: "reasoning-delta", reasoning: "Let me" }, }, { event: "content-block-delta", index: 0, - content: { type: "reasoning", reasoning: " think..." }, + delta: { type: "reasoning-delta", reasoning: " think..." }, }, { event: "content-block-finish", @@ -86,12 +86,12 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { event: "content-block-delta", index: 1, - content: { type: "text", text: "The answer" }, + delta: { type: "text-delta", text: "The answer" }, }, { event: "content-block-delta", index: 1, - content: { type: "text", text: " is 42." }, + delta: { type: "text-delta", text: " is 42." }, }, { event: "content-block-finish", @@ -112,21 +112,27 @@ function complexStreamEvents(): ChatModelStreamEvent[] { { event: "content-block-delta", index: 2, - content: { - type: "tool_call_chunk", - id: "call_1", - name: "calculator", - args: '{"expr', + delta: { + type: "block-delta", + fields: { + type: "tool_call_chunk", + id: "call_1", + name: "calculator", + args: '{"expr', + }, }, }, { event: "content-block-delta", index: 2, - content: { - type: "tool_call_chunk", - id: "call_1", - name: "calculator", - args: '":"6*7"}', + delta: { + type: "block-delta", + fields: { + type: "tool_call_chunk", + id: "call_1", + name: "calculator", + args: '{"expr":"6*7"}', + }, }, }, { @@ -162,12 +168,12 @@ function providerThinkingStreamEvents(): ChatModelStreamEvent[] { { event: "content-block-delta", index: 0, - content: { type: "thinking", thinking: "Let me" }, + delta: { type: "reasoning-delta", reasoning: "Let me" }, }, { event: "content-block-delta", index: 0, - content: { type: "thinking", thinking: " think..." }, + delta: { type: "reasoning-delta", reasoning: " think..." }, }, { event: "content-block-finish", @@ -190,7 +196,7 @@ async function* delayedTextAfterReasoningEvents( yield { event: "content-block-delta", index: 0, - content: { type: "reasoning", reasoning: "Let me think" }, + delta: { type: "reasoning-delta", reasoning: "Let me think" }, }; yield { event: "content-block-start", @@ -200,7 +206,7 @@ async function* delayedTextAfterReasoningEvents( yield { event: "content-block-delta", index: 1, - content: { type: "text", text: "Hello" }, + delta: { type: "text-delta", text: "Hello" }, }; await new Promise((resolve) => { setTimeout(resolve, 50); @@ -449,6 +455,39 @@ describe("ChatModelStream", () => { // Finish reason expect(message.response_metadata?.finish_reason).toBe("tool_use"); }); + + test("assembles multimodal data chunks", async () => { + const stream = new ChatModelStream( + iterEvents([ + { event: "message-start", id: "msg_audio" }, + { + event: "content-block-start", + index: 0, + content: { + type: "audio", + mimeType: "audio/wav", + data: "", + }, + }, + { + event: "content-block-delta", + index: 0, + delta: { type: "data-delta", data: "UklG", encoding: "base64" }, + }, + { + event: "content-block-delta", + index: 0, + delta: { type: "data-delta", data: "Rg==" }, + }, + { event: "message-finish", reason: "stop" }, + ]) + ); + + const message = await stream.output; + expect(message.content).toEqual([ + { type: "audio", mimeType: "audio/wav", data: "UklGRg==" }, + ]); + }); }); describe("PromiseLike (await stream)", () => { @@ -511,7 +550,7 @@ describe("ChatModelStream", () => { { event: "content-block-delta", index: 0, - content: { type: "text", text: "Result" }, + delta: { type: "text-delta", text: "Result" }, }, { event: "content-block-finish", @@ -554,7 +593,7 @@ describe("ChatModelStream", () => { { event: "content-block-delta", index: 0, - content: { type: "text", text: "Hello" }, + delta: { type: "text-delta", text: "Hello" }, }, { event: "content-block-finish", @@ -582,7 +621,7 @@ describe("ChatModelStream", () => { { event: "content-block-delta", index: 0, - content: { type: "text", text: "Partial" }, + delta: { type: "text-delta", text: "Partial" }, }, { event: "error", message: "Connection lost", code: "CONN_ERR" }, { event: "message-finish", reason: "stop" }, diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts index 913c8ed652b2..7c0dcb199500 100644 --- a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -250,19 +250,19 @@ describe("_streamChatModelEvents bridge", () => { expect(events[2]!.event).toBe("content-block-delta"); const delta1 = events[2] as { index: number; - content: { type: string; text?: string }; + delta: { type: string; text?: string }; }; - expect(delta1.content.type).toBe("text"); - expect(delta1.content.text).toBe("Hello"); + expect(delta1.delta.type).toBe("text-delta"); + expect(delta1.delta.text).toBe("Hello"); // content-block-delta for " world" expect(events[3]!.event).toBe("content-block-delta"); const delta2 = events[3] as { index: number; - content: { type: string; text?: string }; + delta: { type: string; text?: string }; }; - expect(delta2.content.type).toBe("text"); - expect(delta2.content.text).toBe(" world"); + expect(delta2.delta.type).toBe("text-delta"); + expect(delta2.delta.text).toBe(" world"); // content-block-finish const finishIdx = events.findIndex( @@ -320,10 +320,10 @@ describe("_streamChatModelEvents bridge", () => { const lastReasoningDelta = reasoningDeltas[ reasoningDeltas.length - 1 ] as { - content: { type: string; reasoning?: string }; + delta: { type: string; reasoning?: string }; }; - expect(lastReasoningDelta.content.type).toBe("reasoning"); - expect(lastReasoningDelta.content.reasoning).toBe(" hard..."); + expect(lastReasoningDelta.delta.type).toBe("reasoning-delta"); + expect(lastReasoningDelta.delta.reasoning).toBe(" hard..."); // Finish events for both blocks const finishes = events.filter((e) => e.event === "content-block-finish"); diff --git a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts index 0f61caf4708c..3d3382541dd6 100644 --- a/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts +++ b/libs/providers/langchain-anthropic/src/tests/chat_models_stream_events.test.ts @@ -282,17 +282,17 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { // First delta: incremental "Hello" const d1 = deltas[0] as { - content: { type: string; text?: string }; + delta: { type: string; text?: string }; }; - expect(d1.content.type).toBe("text"); - expect(d1.content.text).toBe("Hello"); + expect(d1.delta.type).toBe("text-delta"); + expect(d1.delta.text).toBe("Hello"); // Second delta: incremental " world" const d2 = deltas[1] as { - content: { type: string; text?: string }; + delta: { type: string; text?: string }; }; - expect(d2.content.type).toBe("text"); - expect(d2.content.text).toBe(" world"); + expect(d2.delta.type).toBe("text-delta"); + expect(d2.delta.text).toBe(" world"); }); test("content-block-finish carries finalized text", async () => { @@ -347,21 +347,20 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { e.event === "content-block-delta" && "index" in e && e.index === 0 && - "content" in e && - (e.content as { type: string }).type === "reasoning" && - "reasoning" in e.content + "delta" in e && + (e.delta as { type: string }).type === "reasoning-delta" ); expect(reasoningDeltas.length).toBe(2); const rd1 = reasoningDeltas[0] as { - content: { type: string; reasoning: string }; + delta: { type: string; reasoning: string }; }; - expect(rd1.content.reasoning).toBe("Let me"); + expect(rd1.delta.reasoning).toBe("Let me"); const rd2 = reasoningDeltas[1] as { - content: { type: string; reasoning: string }; + delta: { type: string; reasoning: string }; }; - expect(rd2.content.reasoning).toBe(" reason..."); + expect(rd2.delta.reasoning).toBe(" reason..."); // Reasoning finish const reasoningFinish = events.find( @@ -404,11 +403,13 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { const sigDelta = events.find( (e) => e.event === "content-block-delta" && - "content" in e && - (e.content as { signature?: string }).signature === "sig_abc" - ) as { content: { type: string; signature?: string } }; + "delta" in e && + (e.delta as { fields?: { signature?: string } }).fields?.signature === + "sig_abc" + ) as { delta: { type: string; fields?: { signature?: string } } }; expect(sigDelta).toBeDefined(); - expect(sigDelta.content.signature).toBe("sig_abc"); + expect(sigDelta.delta.type).toBe("block-delta"); + expect(sigDelta.delta.fields?.signature).toBe("sig_abc"); }); }); @@ -432,7 +433,7 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { expect(toolStart.content.name).toBe("web_search"); expect(toolStart.content.id).toBe("toolu_01ABC"); - // Deltas carry incremental tool_call_chunk content + // Deltas carry accumulated tool_call_chunk field snapshots const toolDeltas = events.filter( (e) => e.event === "content-block-delta" && "index" in e && e.index === 1 @@ -440,16 +441,18 @@ describe("ChatAnthropic._streamChatModelEvents (native)", () => { expect(toolDeltas.length).toBe(2); const td1 = toolDeltas[0] as { - content: { type: string; args?: string }; + delta: { type: string; fields: { type: string; args?: string } }; }; - expect(td1.content.type).toBe("tool_call_chunk"); - expect(td1.content.args).toBe('{"query"'); + expect(td1.delta.type).toBe("block-delta"); + expect(td1.delta.fields.type).toBe("tool_call_chunk"); + expect(td1.delta.fields.args).toBe('{"query"'); const td2 = toolDeltas[1] as { - content: { type: string; args?: string }; + delta: { type: string; fields: { type: string; args?: string } }; }; - expect(td2.content.type).toBe("tool_call_chunk"); - expect(td2.content.args).toBe(':"weather"}'); + expect(td2.delta.type).toBe("block-delta"); + expect(td2.delta.fields.type).toBe("tool_call_chunk"); + expect(td2.delta.fields.args).toBe('{"query":"weather"}'); }); test("tool call finish has parsed args", async () => { diff --git a/libs/providers/langchain-anthropic/src/utils/stream_events.ts b/libs/providers/langchain-anthropic/src/utils/stream_events.ts index a950a96f8cbe..decde23f4fb5 100644 --- a/libs/providers/langchain-anthropic/src/utils/stream_events.ts +++ b/libs/providers/langchain-anthropic/src/utils/stream_events.ts @@ -7,6 +7,7 @@ import type Anthropic from "@anthropic-ai/sdk"; import type { ChatModelStreamEvent, + ContentBlockDelta, FinishReason, } from "@langchain/core/language_models/event"; import type { ContentBlock } from "@langchain/core/messages/content"; @@ -130,7 +131,7 @@ export async function* convertAnthropicStream( yield { event: "content-block-delta" as const, index, - content: contentDelta, + delta: contentDelta, }; break; } @@ -238,7 +239,7 @@ function mapBlockToContentBlock( } /** - * Map an Anthropic content_block_delta to a content block update + * Map an Anthropic content_block_delta to a content block delta * and update the accumulated state. */ function applyAnthropicDelta( @@ -247,14 +248,14 @@ function applyAnthropicDelta( // oxlint-disable-next-line @typescript-eslint/no-explicit-any delta: any ): { - contentDelta: ContentBlock; + contentDelta: ContentBlockDelta; // oxlint-disable-next-line @typescript-eslint/no-explicit-any accumulated: Record; } { switch (delta.type) { case "text_delta": return { - contentDelta: { type: "text" as const, text: delta.text }, + contentDelta: { type: "text-delta" as const, text: delta.text }, accumulated: { ...accumulated, text: (accumulated.text ?? "") + delta.text, @@ -264,7 +265,7 @@ function applyAnthropicDelta( case "thinking_delta": return { contentDelta: { - type: "reasoning" as const, + type: "reasoning-delta" as const, reasoning: delta.thinking, }, accumulated: { @@ -276,32 +277,49 @@ function applyAnthropicDelta( case "input_json_delta": { const newArgs = (accumulated.args ?? "") + delta.partial_json; return { - contentDelta: { type: accumulated.type, args: delta.partial_json }, + contentDelta: { + type: "block-delta" as const, + fields: { type: accumulated.type, args: newArgs }, + }, accumulated: { ...accumulated, args: newArgs }, }; } - case "citations_delta": + case "citations_delta": { + const annotations = [...(accumulated.annotations ?? []), delta.citation]; return { contentDelta: { - type: accumulated.type, - annotations: [...(accumulated.annotations ?? []), delta.citation], + type: "block-delta" as const, + fields: { + type: accumulated.type, + annotations, + }, }, accumulated: { ...accumulated, - annotations: [...(accumulated.annotations ?? []), delta.citation], + annotations, }, }; + } case "signature_delta": return { - contentDelta: { type: accumulated.type, signature: delta.signature }, + contentDelta: { + type: "block-delta" as const, + fields: { type: accumulated.type, signature: delta.signature }, + }, accumulated: { ...accumulated, signature: delta.signature }, }; case "compaction_delta": return { - contentDelta: { type: "non_standard", value: { compaction: delta } }, + contentDelta: { + type: "block-delta" as const, + fields: { + type: "non_standard", + value: { ...(accumulated.value ?? {}), compaction: delta }, + }, + }, accumulated: { ...accumulated, value: { ...(accumulated.value ?? {}), compaction: delta }, @@ -310,7 +328,10 @@ function applyAnthropicDelta( default: return { - contentDelta: { type: accumulated.type, ...delta }, + contentDelta: { + type: "block-delta" as const, + fields: { type: accumulated.type, ...delta }, + }, accumulated, }; } From f2d2ef78504965da212e69f1225eb395841886c2 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Tue, 28 Apr 2026 18:59:47 -0700 Subject: [PATCH 15/39] cr --- .../src/language_models/tests/event.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libs/langchain-core/src/language_models/tests/event.test.ts b/libs/langchain-core/src/language_models/tests/event.test.ts index e77d52765e75..173b8bb345e5 100644 --- a/libs/langchain-core/src/language_models/tests/event.test.ts +++ b/libs/langchain-core/src/language_models/tests/event.test.ts @@ -63,6 +63,9 @@ describe("ChatModelStreamEvent types", () => { expect(event.event).toBe("content-block-delta"); expect(event.index).toBe(0); expect(event.delta.type).toBe("text-delta"); + if (event.delta.type !== "text-delta") { + throw new Error("Expected text-delta"); + } expect(event.delta.text).toBe(" world"); }); @@ -82,6 +85,9 @@ describe("ChatModelStreamEvent types", () => { }; expect(event.event).toBe("content-block-delta"); expect(event.delta.type).toBe("block-delta"); + if (event.delta.type !== "block-delta") { + throw new Error("Expected block-delta"); + } expect(event.delta.fields.type).toBe("tool_call_chunk"); }); @@ -92,6 +98,9 @@ describe("ChatModelStreamEvent types", () => { delta: { type: "reasoning-delta", reasoning: "Let me think" }, }; expect(event.delta.type).toBe("reasoning-delta"); + if (event.delta.type !== "reasoning-delta") { + throw new Error("Expected reasoning-delta"); + } expect(event.delta.reasoning).toBe("Let me think"); }); @@ -102,6 +111,9 @@ describe("ChatModelStreamEvent types", () => { delta: { type: "data-delta", data: "UklGR", encoding: "base64" }, }; expect(event.delta.type).toBe("data-delta"); + if (event.delta.type !== "data-delta") { + throw new Error("Expected data-delta"); + } expect(event.delta.data).toBe("UklGR"); }); @@ -115,6 +127,9 @@ describe("ChatModelStreamEvent types", () => { }, }; expect(event.delta.type).toBe("block-delta"); + if (event.delta.type !== "block-delta") { + throw new Error("Expected block-delta"); + } expect(event.delta.fields.type).toBe("reasoning"); }); From c18e06a500f01fb269633b5acc263917cec34302 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Tue, 28 Apr 2026 19:03:52 -0700 Subject: [PATCH 16/39] feedback --- libs/langchain-core/src/language_models/event.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts index 8b3d31a94169..0d823386ea53 100644 --- a/libs/langchain-core/src/language_models/event.ts +++ b/libs/langchain-core/src/language_models/event.ts @@ -38,14 +38,6 @@ import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; -/** - * Usage shape accepted by chat model stream events. - * - * This is intentionally wider than {@link UsageMetadata}: protocol sources - * may report partial token snapshots, while {@link ChatModelStream} normalizes - * them before exposing `.usage` or the final `AIMessage.usage_metadata`. - */ -export type UsageMetadataLike = Partial; // ─── Message Lifecycle ────────────────────────────────────────── @@ -60,7 +52,7 @@ export interface MessageStartEvent { * Initial usage snapshot, if the provider reports input token counts * before content begins streaming (e.g., Anthropic's `message_start`). */ - usage?: UsageMetadataLike; + usage?: Partial; } /** @@ -81,7 +73,7 @@ export interface MessageFinishEvent { /** Why the model stopped generating. */ reason?: FinishReason; /** Final usage snapshot. */ - usage?: UsageMetadataLike; + usage?: Partial; /** Provider-specific response metadata (model name, response ID, headers, etc.). */ metadata?: Record; } @@ -219,7 +211,7 @@ export interface ContentBlockFinishEvent { export interface UsageUpdateEvent { event: "usage"; /** Current usage snapshot. */ - usage: UsageMetadataLike; + usage: Partial; } // ─── Provider Passthrough ─────────────────────────────────────── From 45fed8c15e00c7a1a8116c590c6c544e7e3e6108 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Tue, 28 Apr 2026 19:05:52 -0700 Subject: [PATCH 17/39] some revert --- libs/langchain-core/src/language_models/event.ts | 2 +- libs/langchain-core/src/language_models/tests/event.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/langchain-core/src/language_models/event.ts b/libs/langchain-core/src/language_models/event.ts index 0d823386ea53..4c8f4cc44b56 100644 --- a/libs/langchain-core/src/language_models/event.ts +++ b/libs/langchain-core/src/language_models/event.ts @@ -75,7 +75,7 @@ export interface MessageFinishEvent { /** Final usage snapshot. */ usage?: Partial; /** Provider-specific response metadata (model name, response ID, headers, etc.). */ - metadata?: Record; + responseMetadata?: Record; } // ─── Content Block Lifecycle ──────────────────────────────────── diff --git a/libs/langchain-core/src/language_models/tests/event.test.ts b/libs/langchain-core/src/language_models/tests/event.test.ts index 173b8bb345e5..3d5f41033e6d 100644 --- a/libs/langchain-core/src/language_models/tests/event.test.ts +++ b/libs/langchain-core/src/language_models/tests/event.test.ts @@ -35,12 +35,12 @@ describe("ChatModelStreamEvent types", () => { event: "message-finish", reason: "stop", usage: { input_tokens: 100, output_tokens: 50, total_tokens: 150 }, - metadata: { model_name: "gpt-4" }, + responseMetadata: { model_name: "gpt-4" }, }; expect(event.event).toBe("message-finish"); expect(event.reason).toBe("stop"); expect(event.usage?.output_tokens).toBe(50); - expect(event.metadata?.model_name).toBe("gpt-4"); + expect(event.responseMetadata?.model_name).toBe("gpt-4"); }); test("ContentBlockStartEvent", () => { From 5b2378a83315719d1a6fd04085e51bd38e11fbcf Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Tue, 28 Apr 2026 20:05:20 -0700 Subject: [PATCH 18/39] fix --- libs/langchain-core/src/language_models/stream.ts | 4 ++-- libs/langchain-core/src/language_models/tests/stream.test.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 7d9032e7b31b..f7869ba53da7 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -601,10 +601,10 @@ export class ChatModelStream case "message-finish": finishReason = event.reason; if (event.usage) usage = normalizeUsage(event.usage); - if (event.metadata) { + if (event.responseMetadata) { metadata = { ...metadata, - ...event.metadata, + ...event.responseMetadata, }; } break; diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 7fee352e6c82..46e577f912b3 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -43,7 +43,7 @@ function textStreamEvents(): ChatModelStreamEvent[] { event: "message-finish", reason: "stop", usage: { input_tokens: 10, output_tokens: 2, total_tokens: 12 }, - metadata: { model_name: "test-model" }, + responseMetadata: { model_name: "test-model" }, }, ]; } From 25447aa8d15f86d77c13b2d23ee814f2803d99a1 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Tue, 28 Apr 2026 20:21:53 -0700 Subject: [PATCH 19/39] migrate to StreamChannel --- libs/langchain/package.json | 8 +-- libs/langchain/src/agents/ReactAgent.ts | 3 +- libs/langchain/src/agents/stream.ts | 10 +-- .../src/agents/tests/stream.test-d.ts | 4 +- .../langchain/src/agents/tests/stream.test.ts | 4 +- libs/langchain/src/agents/types.ts | 2 +- pnpm-lock.yaml | 72 +++++++++---------- 7 files changed, 52 insertions(+), 51 deletions(-) diff --git a/libs/langchain/package.json b/libs/langchain/package.json index 6d8d5767cc0d..11678da8158e 100644 --- a/libs/langchain/package.json +++ b/libs/langchain/package.json @@ -46,8 +46,8 @@ "@langchain/anthropic": "workspace:*", "@langchain/core": "workspace:^", "@langchain/fireworks": "workspace:*", - "@langchain/langgraph-api": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b", - "@langchain/langgraph-sdk": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b", + "@langchain/langgraph-api": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3", + "@langchain/langgraph-sdk": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3", "@langchain/openai": "workspace:*", "@langchain/tsconfig": "workspace:*", "@tsconfig/recommended": "^1.0.2", @@ -59,8 +59,8 @@ "cheerio": "1.2.0", "dotenv": "^17.4.0", "dpdm": "^3.14.0", - "openai": "^6.22.0", "hono": "^4.12.12", + "openai": "^6.22.0", "peggy": "^5.1.0", "reflect-metadata": "^0.2.2", "rimraf": "^6.1.3", @@ -74,7 +74,7 @@ "@langchain/core": "workspace:^" }, "dependencies": { - "@langchain/langgraph": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b", + "@langchain/langgraph": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3", "@langchain/langgraph-checkpoint": "^1.0.1", "langsmith": ">=0.5.0 <1.0.0", "zod": "^3.25.76 || ^4" diff --git a/libs/langchain/src/agents/ReactAgent.ts b/libs/langchain/src/agents/ReactAgent.ts index cfa58acb25e1..47ae058e400c 100644 --- a/libs/langchain/src/agents/ReactAgent.ts +++ b/libs/langchain/src/agents/ReactAgent.ts @@ -1377,8 +1377,9 @@ export class ReactAgent< mergedConfig as RunnableConfig ); - return (await this.#graph.stream_v2(initializedState, { + return (await this.#graph.streamEvents(initializedState, { ...(mergedConfig as Record), + version: "v3", transformers: callSiteTransformers, })) as unknown as AgentRunStream< FullState, diff --git a/libs/langchain/src/agents/stream.ts b/libs/langchain/src/agents/stream.ts index be400078669c..1c5ff7af2342 100644 --- a/libs/langchain/src/agents/stream.ts +++ b/libs/langchain/src/agents/stream.ts @@ -15,7 +15,7 @@ import { GraphRunStream, - EventLog, + StreamChannel, type NativeStreamTransformer, type ProtocolEvent, type StreamTransformer, @@ -224,7 +224,7 @@ export function createToolCallTransformer( path: Namespace ): () => NativeStreamTransformer { return () => { - const toolCallsLog = new EventLog(); + const toolCallsLog = StreamChannel.local(); const pendingCalls = new Map< string, @@ -282,7 +282,7 @@ export function createToolCallTransformer( __native: true as const, init: () => ({ - toolCalls: toolCallsLog.toAsyncIterable(), + toolCalls: toolCallsLog, }), process(event: ProtocolEvent): boolean { @@ -391,13 +391,13 @@ export function createMiddlewareTransformer( path: Namespace ): () => NativeStreamTransformer { return () => { - const middlewareLog = new EventLog(); + const middlewareLog = StreamChannel.local(); return { __native: true as const, init: () => ({ - middleware: middlewareLog.toAsyncIterable(), + middleware: middlewareLog, }), process(event: ProtocolEvent): boolean { diff --git a/libs/langchain/src/agents/tests/stream.test-d.ts b/libs/langchain/src/agents/tests/stream.test-d.ts index cb481e67b044..f06b7884e95c 100644 --- a/libs/langchain/src/agents/tests/stream.test-d.ts +++ b/libs/langchain/src/agents/tests/stream.test-d.ts @@ -94,7 +94,7 @@ describe("stream_v2 types", () => { const eventCounter = (): StreamTransformer<{ eventCount: StreamChannel; }> => { - const eventCount = new StreamChannel("eventCount"); + const eventCount = StreamChannel.remote("eventCount"); return { init: () => ({ eventCount }), process() { @@ -106,7 +106,7 @@ describe("stream_v2 types", () => { const methodTracker = (): StreamTransformer<{ methods: StreamChannel; }> => { - const methods = new StreamChannel("methods"); + const methods = StreamChannel.remote("methods"); return { init: () => ({ methods }), process() { diff --git a/libs/langchain/src/agents/tests/stream.test.ts b/libs/langchain/src/agents/tests/stream.test.ts index 6aa9bbc6f466..97f327a1c593 100644 --- a/libs/langchain/src/agents/tests/stream.test.ts +++ b/libs/langchain/src/agents/tests/stream.test.ts @@ -249,7 +249,7 @@ describe("stream_v2", () => { const eventCounter = (): StreamTransformer<{ eventCount: StreamChannel; }> => { - const eventCount = new StreamChannel("eventCount"); + const eventCount = StreamChannel.remote("eventCount"); let count = 0; return { @@ -288,7 +288,7 @@ describe("stream_v2", () => { const methodTracker = (): StreamTransformer<{ methods: StreamChannel; }> => { - const methods = new StreamChannel("methods"); + const methods = StreamChannel.remote("methods"); return { init: () => ({ methods }), process(event) { diff --git a/libs/langchain/src/agents/types.ts b/libs/langchain/src/agents/types.ts index 2edb4d72281f..db450ba26581 100644 --- a/libs/langchain/src/agents/types.ts +++ b/libs/langchain/src/agents/types.ts @@ -855,7 +855,7 @@ export type CreateAgentParams< * import { StreamChannel } from "@langchain/langgraph"; * * const costTracker = () => ({ - * init: () => ({ cost: new StreamChannel("cost") }), + * init: () => ({ cost: StreamChannel.remote("cost") }), * process(event) { * // track token costs... * return true; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f151423c620c..c8fe693801f4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -589,8 +589,8 @@ importers: libs/langchain: dependencies: '@langchain/langgraph': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3 + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/langgraph-checkpoint': specifier: ^1.0.1 version: 1.0.1(@langchain/core@libs+langchain-core) @@ -614,11 +614,11 @@ importers: specifier: workspace:* version: link:../providers/langchain-fireworks '@langchain/langgraph-api': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0)) + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3 + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0)) '@langchain/langgraph-sdk': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3 + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@langchain/openai': specifier: workspace:* version: link:../providers/langchain-openai @@ -4066,8 +4066,8 @@ packages: peerDependencies: apache-arrow: '>=15.0.0 <=18.1.0' - '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b} + '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3} version: 1.1.17 engines: {node: ^18.19.0 || >=20.16.0} peerDependencies: @@ -4092,8 +4092,8 @@ packages: peerDependencies: '@langchain/core': workspace:^ - '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8} + '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@ea62da3d61586a249ec0911ac3b22d0e243b5ab1': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@ea62da3d61586a249ec0911ac3b22d0e243b5ab1} version: 1.0.1 engines: {node: '>=18'} peerDependencies: @@ -4133,8 +4133,8 @@ packages: vue: optional: true - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b} + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3} version: 1.8.8 peerDependencies: react: ^18 || ^19 @@ -4151,8 +4151,8 @@ packages: vue: optional: true - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8} + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3d61586a249ec0911ac3b22d0e243b5ab1': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3d61586a249ec0911ac3b22d0e243b5ab1} version: 1.8.8 peerDependencies: react: ^18 || ^19 @@ -4169,8 +4169,8 @@ packages: vue: optional: true - '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8} + '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@ea62da3d61586a249ec0911ac3b22d0e243b5ab1': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@ea62da3d61586a249ec0911ac3b22d0e243b5ab1} version: 1.1.17 engines: {node: ^18.19.0 || >=20.16.0} hasBin: true @@ -4197,8 +4197,8 @@ packages: zod-to-json-schema: optional: true - '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b} + '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3} version: 1.2.8 engines: {node: '>=18'} peerDependencies: @@ -4215,8 +4215,8 @@ packages: peerDependencies: '@langchain/core': workspace:^ - '@langchain/protocol@0.0.12': - resolution: {integrity: sha512-BvWqm74n6cyY8cqRxeaV4WGe4aizA5Nmr3K5ACEvTd1MjkX5PyhCuMZouyR328xnT0mH0cnXlIUEc1cLioGjKA==} + '@langchain/protocol@0.0.13': + resolution: {integrity: sha512-DDBmP5XEJEtt9lHXUVCuaSqRo5Vqz5hQbsTIkcB5ILgK+ymrv4d9k5fxLinap/uewWnMDUbyYCeh3jid5NBRVA==} '@layerup/layerup-security@1.6.0': resolution: {integrity: sha512-HSBZobDxgi0aHrEoN49RwLSbv60614upoE+noAR/nlysp8K1H1mu9EBw2cY5YTk6XbmEqEjddu9dMPb71NABMA==} @@ -14271,17 +14271,17 @@ snapshots: '@lancedb/lancedb-win32-arm64-msvc': 0.27.2 '@lancedb/lancedb-win32-x64-msvc': 0.27.2 - '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@71b7b0b(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0))': + '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0))': dependencies: '@babel/code-frame': 7.29.0 '@hono/node-server': 2.0.0(hono@4.12.14) '@hono/node-ws': 1.3.0(@hono/node-server@2.0.0(hono@4.12.14))(bufferutil@4.1.0)(hono@4.12.14) '@hono/zod-validator': 0.7.6(hono@4.12.14)(zod@4.3.6) '@langchain/core': link:libs/langchain-core - '@langchain/langgraph': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@libs+langchain-core) - '@langchain/langgraph-ui': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8 - '@langchain/protocol': 0.0.12 + '@langchain/langgraph-ui': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@ea62da3d61586a249ec0911ac3b22d0e243b5ab1 + '@langchain/protocol': 0.0.13 '@types/json-schema': 7.0.15 '@typescript/vfs': 1.6.4(typescript@5.8.3) dedent: 1.7.2 @@ -14300,7 +14300,7 @@ snapshots: winston-console-format: 1.0.8 zod: 4.3.6 optionalDependencies: - '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' @@ -14322,7 +14322,7 @@ snapshots: '@langchain/core': link:libs/langchain-core uuid: 10.0.0 - '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8(@langchain/core@libs+langchain-core)': + '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@ea62da3d61586a249ec0911ac3b22d0e243b5ab1(@langchain/core@libs+langchain-core)': dependencies: '@langchain/core': link:libs/langchain-core uuid: 10.0.0 @@ -14349,10 +14349,10 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0b(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/protocol': 0.0.12 + '@langchain/protocol': 0.0.13 '@types/json-schema': 7.0.15 p-queue: 9.1.2 p-retry: 7.1.1 @@ -14361,10 +14361,10 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3d61586a249ec0911ac3b22d0e243b5ab1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/protocol': 0.0.12 + '@langchain/protocol': 0.0.13 '@types/json-schema': 7.0.15 p-queue: 9.1.2 p-retry: 7.1.1 @@ -14373,7 +14373,7 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8': + '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@ea62da3d61586a249ec0911ac3b22d0e243b5ab1': dependencies: '@commander-js/extra-typings': 13.1.0(commander@13.1.0) commander: 13.1.0 @@ -14410,12 +14410,12 @@ snapshots: - svelte - vue - '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@71b7b0b(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': + '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/langgraph-checkpoint': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8(@langchain/core@libs+langchain-core) - '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@71b7b0bd2ba61e71e3d8a1af512dd26fc4f3e7b8(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@langchain/protocol': 0.0.12 + '@langchain/langgraph-checkpoint': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@ea62da3d61586a249ec0911ac3b22d0e243b5ab1(@langchain/core@libs+langchain-core) + '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3d61586a249ec0911ac3b22d0e243b5ab1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@langchain/protocol': 0.0.13 '@standard-schema/spec': 1.1.0 uuid: 10.0.0 zod: 4.3.6 @@ -14438,7 +14438,7 @@ snapshots: - encoding - ws - '@langchain/protocol@0.0.12': {} + '@langchain/protocol@0.0.13': {} '@layerup/layerup-security@1.6.0(encoding@0.1.13)(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6)': dependencies: From c335134e40eb1e32ad06f9ef59ca6455deea3bc4 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Tue, 28 Apr 2026 20:43:20 -0700 Subject: [PATCH 20/39] migrate to streamEvents --- libs/langchain/src/agents/ReactAgent.ts | 215 ++++++++++++------ libs/langchain/src/agents/stream.ts | 2 +- .../src/agents/tests/stream.int.test.ts | 2 +- .../src/agents/tests/stream.test-d.ts | 29 ++- .../langchain/src/agents/tests/stream.test.ts | 75 +++--- libs/langchain/src/agents/types.ts | 13 +- 6 files changed, 228 insertions(+), 108 deletions(-) diff --git a/libs/langchain/src/agents/ReactAgent.ts b/libs/langchain/src/agents/ReactAgent.ts index 47ae058e400c..9f30e10f8f94 100644 --- a/libs/langchain/src/agents/ReactAgent.ts +++ b/libs/langchain/src/agents/ReactAgent.ts @@ -1295,18 +1295,26 @@ export class ReactAgent< } /** - * Executes the agent with the new v2 streaming interface, returning an + * Executes the agent with the v3 streaming interface, returning an * {@link AgentRunStream} that provides ergonomic, typed projections for * messages, tool calls, and middleware events — without requiring knowledge * of Pregel channels, stream modes, or namespace routing. * - * This method is experimental and its API may change in future releases. + * Pass `version: "v3"` to opt into this projection-oriented stream. Omitting + * `version` preserves the legacy internal LangGraph event-stream behavior + * for compatibility with LangGraph Platform integrations. + * + * This v3 stream is experimental and its API may change in future releases. + * It will become the default in a future major release. * * @param state - The initial state for the agent execution. Can be: * - An object containing `messages` array and any middleware-specific state properties * - A Command object for more advanced control flow * - * @param config - Optional runtime configuration including: + * @param config - Runtime configuration including: + * @param config.version - Must be `"v3"` to use the {@link AgentRunStream} + * interface. The default legacy event stream is maintained for internal + * integrations and should not be used for new user-facing agent streaming. * @param config.context - The context for the agent execution. * @param config.configurable - LangGraph configuration options like `thread_id`, `run_id`, etc. * @param config.store - The store for the agent execution for persisting state. @@ -1327,9 +1335,12 @@ export class ReactAgent< * * @example * ```typescript - * const run = await agent.stream_v2({ - * messages: [{ role: "user", content: "What's the weather in Paris?" }], - * }); + * const run = await agent.streamEvents( + * { + * messages: [{ role: "user", content: "What's the weather in Paris?" }], + * }, + * { version: "v3" } + * ); * * // Stream all messages * for await (const msg of run.messages) { @@ -1348,9 +1359,9 @@ export class ReactAgent< * const state = await run.output; * ``` */ - async stream_v2( + streamEvents( state: InvokeStateParameter, - config?: InvokeConfiguration< + config: InvokeConfiguration< InferContextInput< Types["Context"] extends AnyAnnotationRoot | InteropZodObject ? Types["Context"] @@ -1358,6 +1369,7 @@ export class ReactAgent< > & InferMiddlewareContextInputs > & { + version: "v3"; transformers?: ReadonlyArray<() => StreamTransformer>; } ): Promise< @@ -1367,26 +1379,139 @@ export class ReactAgent< Types["Middleware"], InferStreamExtensions > - > { - type FullState = MergedAgentState; + >; - const { transformers: callSiteTransformers, ...restConfig } = config ?? {}; - const mergedConfig = mergeConfigs(this.#defaultConfig, restConfig); - const initializedState = await this.#initializeMiddlewareStates( - state, - mergedConfig as RunnableConfig - ); + streamEvents( + state: InvokeStateParameter, + config?: StreamConfiguration< + InferContextInput< + Types["Context"] extends AnyAnnotationRoot | InteropZodObject + ? Types["Context"] + : AnyAnnotationRoot + > & + InferMiddlewareContextInputs, + StreamMode | StreamMode[] | undefined, + boolean, + "text/event-stream" | undefined + > & { version?: "v1" | "v2" }, + streamOptions?: Parameters[2] + ): IterableReadableStream; - return (await this.#graph.streamEvents(initializedState, { - ...(mergedConfig as Record), - version: "v3", - transformers: callSiteTransformers, - })) as unknown as AgentRunStream< - FullState, - Types["Tools"], - Types["Middleware"], - InferStreamExtensions - >; + streamEvents( + state: InvokeStateParameter, + config: + | (StreamConfiguration< + InferContextInput< + Types["Context"] extends AnyAnnotationRoot | InteropZodObject + ? Types["Context"] + : AnyAnnotationRoot + > & + InferMiddlewareContextInputs, + StreamMode | StreamMode[] | undefined, + boolean, + "text/event-stream" | undefined + > & { version?: "v1" | "v2" }) + | undefined, + streamOptions: Parameters[2] + ): IterableReadableStream; + + streamEvents( + state: InvokeStateParameter, + config?: + | (InvokeConfiguration< + InferContextInput< + Types["Context"] extends AnyAnnotationRoot | InteropZodObject + ? Types["Context"] + : AnyAnnotationRoot + > & + InferMiddlewareContextInputs + > & { + version: "v3"; + transformers?: ReadonlyArray<() => StreamTransformer>; + }) + | (StreamConfiguration< + InferContextInput< + Types["Context"] extends AnyAnnotationRoot | InteropZodObject + ? Types["Context"] + : AnyAnnotationRoot + > & + InferMiddlewareContextInputs, + StreamMode | StreamMode[] | undefined, + boolean, + "text/event-stream" | undefined + > & { version?: "v1" | "v2" }), + streamOptions?: Parameters[2] + ): + | Promise< + AgentRunStream< + MergedAgentState, + Types["Tools"], + Types["Middleware"], + InferStreamExtensions + > + > + | IterableReadableStream { + if (config?.version !== "v3" || streamOptions != null) { + const mergedConfig = mergeConfigs(this.#defaultConfig, config); + const version = + config?.version === "v1" || config?.version === "v2" + ? config.version + : "v2"; + return this.#graph.streamEvents( + state, + { + ...(mergedConfig as Partial< + PregelOptions< + any, + any, + any, + StreamMode | StreamMode[] | undefined, + boolean, + "text/event-stream" + > + >), + version, + }, + streamOptions + ); + } + + return (async () => { + type FullState = MergedAgentState; + const agentConfig = config as InvokeConfiguration< + InferContextInput< + Types["Context"] extends AnyAnnotationRoot | InteropZodObject + ? Types["Context"] + : AnyAnnotationRoot + > & + InferMiddlewareContextInputs + > & { + version: "v3"; + transformers?: ReadonlyArray<() => StreamTransformer>; + }; + + const { + transformers: callSiteTransformers, + version: _version, + ...restConfig + } = agentConfig ?? {}; + const mergedConfig = mergeConfigs(this.#defaultConfig, restConfig); + const initializedState = await this.#initializeMiddlewareStates( + state, + mergedConfig as RunnableConfig + ); + + return (await this.#graph.streamEvents(initializedState, { + ...(mergedConfig as Record), + version: "v3", + transformers: callSiteTransformers, + })) as unknown as AgentRunStream< + FullState, + Types["Tools"], + Types["Middleware"], + InferStreamExtensions + >; + })(); } /** @@ -1440,44 +1565,6 @@ export class ReactAgent< * * Note: we intentionally return as `never` to avoid type errors due to type inference. */ - - /** - * @internal - */ - streamEvents( - state: InvokeStateParameter, - config?: StreamConfiguration< - InferContextInput< - Types["Context"] extends AnyAnnotationRoot | InteropZodObject - ? Types["Context"] - : AnyAnnotationRoot - > & - InferMiddlewareContextInputs, - StreamMode | StreamMode[] | undefined, - boolean, - "text/event-stream" | undefined - > & { version?: "v1" | "v2" }, - streamOptions?: Parameters[2] - ): IterableReadableStream { - const mergedConfig = mergeConfigs(this.#defaultConfig, config); - return this.#graph.streamEvents( - state, - { - ...(mergedConfig as Partial< - PregelOptions< - any, - any, - any, - StreamMode | StreamMode[] | undefined, - boolean, - "text/event-stream" - > - >), - version: config?.version ?? "v2", - }, - streamOptions - ); - } /** * @internal */ diff --git a/libs/langchain/src/agents/stream.ts b/libs/langchain/src/agents/stream.ts index 1c5ff7af2342..8587e9170317 100644 --- a/libs/langchain/src/agents/stream.ts +++ b/libs/langchain/src/agents/stream.ts @@ -139,7 +139,7 @@ export type MiddlewareEventUnion< * * This is a pure type overlay — no runtime subclass exists. Use the * `AgentRunStream` type when you need to describe the return type of - * `stream_v2()`. + * `streamEvents(..., { version: "v3" })`. * * @typeParam TValues - Shape of the graph's state values. * @typeParam TTools - Tuple of tools registered on the agent, used to type diff --git a/libs/langchain/src/agents/tests/stream.int.test.ts b/libs/langchain/src/agents/tests/stream.int.test.ts index 77a073636d51..3524cd9b7829 100644 --- a/libs/langchain/src/agents/tests/stream.int.test.ts +++ b/libs/langchain/src/agents/tests/stream.int.test.ts @@ -150,7 +150,7 @@ async function collectAllEvents( beforeAll(setup); -describe("stream_v2", () => { +describe("streamEvents", () => { it("should emit stream evebts for each tool and middleware invocation", async () => { console.log("url", url); const client = new Client({ apiUrl: url! }); diff --git a/libs/langchain/src/agents/tests/stream.test-d.ts b/libs/langchain/src/agents/tests/stream.test-d.ts index f06b7884e95c..8c67f2eedf95 100644 --- a/libs/langchain/src/agents/tests/stream.test-d.ts +++ b/libs/langchain/src/agents/tests/stream.test-d.ts @@ -7,7 +7,7 @@ import { StreamChannel, type StreamTransformer } from "@langchain/langgraph"; import { createAgent, createMiddleware } from "../index.js"; -describe("stream_v2 types", () => { +describe("streamEvents types", () => { it("should type tool calls as a discriminated union", async () => { const addTool = tool( (input: { a: number; b: number }) => `The sum is ${input.a + input.b}`, @@ -36,9 +36,12 @@ describe("stream_v2 types", () => { .respond(new AIMessage("The answer is 7.")); const agent = createAgent({ model, tools: [addTool, minusTool] }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("What is 3 + 4?")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("What is 3 + 4?")], + }, + { version: "v3" } + ); for await (const call of run.toolCalls) { expectTypeOf(call.name).toEqualTypeOf<"add" | "minus">(); @@ -72,9 +75,12 @@ describe("stream_v2 types", () => { middleware: [tracker], }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("hi")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("hi")], + }, + { version: "v3" } + ); for await (const event of run.middleware) { expectTypeOf(event.phase).toEqualTypeOf< @@ -121,9 +127,12 @@ describe("stream_v2 types", () => { streamTransformers: [eventCounter, methodTracker], }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("hi")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("hi")], + }, + { version: "v3" } + ); expectTypeOf(run.extensions.eventCount).toEqualTypeOf< StreamChannel diff --git a/libs/langchain/src/agents/tests/stream.test.ts b/libs/langchain/src/agents/tests/stream.test.ts index 97f327a1c593..3b0493122f85 100644 --- a/libs/langchain/src/agents/tests/stream.test.ts +++ b/libs/langchain/src/agents/tests/stream.test.ts @@ -14,7 +14,7 @@ import { createAgent, createMiddleware } from "../index.js"; import { humanInTheLoopMiddleware } from "../middleware/hitl.js"; import { createToolCallTransformer } from "../stream.js"; -describe("stream_v2", () => { +describe("streamEvents", () => { it("should emit tool call streams for each tool invocation", async () => { const addTool = tool( (input: { a: number; b: number }) => `The sum is ${input.a + input.b}`, @@ -43,9 +43,12 @@ describe("stream_v2", () => { .respond(new AIMessage("The answer is 7.")); const agent = createAgent({ model, tools: [addTool, minusTool] }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("What is 3 + 4?")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("What is 3 + 4?")], + }, + { version: "v3" } + ); const toolCalls: Array<{ name: string; @@ -95,9 +98,12 @@ describe("stream_v2", () => { middleware: [testMiddleware], }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("hello")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("hello")], + }, + { version: "v3" } + ); const middlewareEvents: Array<{ phase: string; @@ -139,9 +145,12 @@ describe("stream_v2", () => { .respond(new AIMessage("The weather is sunny.")); const agent = createAgent({ model, tools: [searchTool] }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("Search for weather")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("Search for weather")], + }, + { version: "v3" } + ); const [toolCallResults, finalState] = await Promise.all([ (async () => { @@ -192,9 +201,12 @@ describe("stream_v2", () => { middleware: [middleware], }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("What is 6 * 7?")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("What is 6 * 7?")], + }, + { version: "v3" } + ); const [toolNames, middlewarePhases, output] = await Promise.all([ (async () => { @@ -232,9 +244,12 @@ describe("stream_v2", () => { it("should resolve output with the final agent state", async () => { const model = fakeModel().respond(new AIMessage("hi there")); const agent = createAgent({ model, tools: [] }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("hi")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("hi")], + }, + { version: "v3" } + ); const state = await run.output; @@ -268,9 +283,12 @@ describe("stream_v2", () => { streamTransformers: [eventCounter], }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("hi")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("hi")], + }, + { version: "v3" } + ); const counts: number[] = []; for await (const c of run.extensions.eventCount as AsyncIterable) { @@ -281,7 +299,7 @@ describe("stream_v2", () => { expect(counts[counts.length - 1]).toBe(counts.length); }); - it("should pass call-site transformers via stream_v2 config", async () => { + it("should pass call-site transformers via streamEvents config", async () => { const model = fakeModel().respond(new AIMessage("ok")); const agent = createAgent({ model, tools: [] }); @@ -298,9 +316,9 @@ describe("stream_v2", () => { }; }; - const run = await agent.stream_v2( + const run = await agent.streamEvents( { messages: [new HumanMessage("hi")] }, - { transformers: [methodTracker] } + { version: "v3", transformers: [methodTracker] } ); const seenMethods: string[] = []; @@ -330,9 +348,12 @@ describe("stream_v2", () => { .respond(new AIMessage("Done: 3 and 7")); const agent = createAgent({ model, tools: [addTool] }); - const run = await agent.stream_v2({ - messages: [new HumanMessage("Add 1+2 and 3+4")], - }); + const run = await agent.streamEvents( + { + messages: [new HumanMessage("Add 1+2 and 3+4")], + }, + { version: "v3" } + ); const toolCalls: Array<{ name: string; callId: string; output: unknown }> = []; @@ -390,9 +411,9 @@ describe("stream_v2", () => { const config = { configurable: { thread_id: "hitl-stream-test" } }; - const run = await agent.stream_v2( + const run = await agent.streamEvents( { messages: [new HumanMessage("Write hello to test.txt")] }, - config + { ...config, version: "v3" } ); const state = await run.output; diff --git a/libs/langchain/src/agents/types.ts b/libs/langchain/src/agents/types.ts index db450ba26581..cccabebd03b5 100644 --- a/libs/langchain/src/agents/types.ts +++ b/libs/langchain/src/agents/types.ts @@ -69,7 +69,8 @@ import type { JumpToTarget } from "./constants.js"; * * @typeParam TStreamTransformers - The tuple of user-supplied stream transformer * factories registered at `createAgent({ streamTransformers })`. Used to type - * `run.extensions` on the stream returned from `stream_v2()`. + * `run.extensions` on the stream returned from + * `streamEvents(..., { version: "v3" })`. * * @example * ```typescript @@ -118,7 +119,8 @@ export interface AgentTypeConfig< /** * The tuple of stream transformer factories registered at * `createAgent({ streamTransformers })`. Used to infer the shape of - * `run.extensions` on the stream returned by `stream_v2()`. + * `run.extensions` on the stream returned by + * `streamEvents(..., { version: "v3" })`. */ StreamTransformers: TStreamTransformers; } @@ -842,9 +844,10 @@ export type CreateAgentParams< /** * Stream transformer factories baked into the compiled graph. These run - * automatically for every `stream_v2()` call, after the built-in + * automatically for every `streamEvents(..., { version: "v3" })` call, after the built-in * agent transformers (tool calls, middleware) and before any call-site - * transformers passed via `stream_v2(input, { transformers })`. + * transformers passed via + * `streamEvents(input, { version: "v3", transformers })`. * * Use this to add domain-specific streaming projections that should always * be available on the agent's run stream. The projection values are @@ -868,7 +871,7 @@ export type CreateAgentParams< * streamTransformers: [costTracker], * }); * - * const run = await agent.stream_v2({ messages }); + * const run = await agent.streamEvents({ messages }, { version: "v3" }); * for await (const c of run.extensions.cost) { * console.log("cost delta:", c); * } From aff46b1ae230df371d85dc1a5e5e5e34ccfa468c Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 12:11:19 -0700 Subject: [PATCH 21/39] chore(core): Add a v2 chat model stream-event callback path Add a v2 chat model stream-event callback path so handlers can opt into receiving `ChatModelStreamEvent`s directly during `invoke()`. This lets downstream integrations consume Core-owned content-block lifecycle events from `_streamChatModelEvents()` instead of reconstructing message streaming from legacy token callbacks. Existing `lc_prefer_streaming` behavior remains unchanged for legacy stream/log handlers, and focused tests cover callback dispatch plus invoke routing. --- libs/langchain-core/src/callbacks/base.ts | 29 ++++++++ libs/langchain-core/src/callbacks/manager.ts | 32 +++++++++ .../src/callbacks/tests/callbacks.test.ts | 55 ++++++++++++++ .../src/language_models/chat_models.ts | 72 ++++++++++++++++++- .../tests/stream_bridge.test.ts | 43 +++++++++++ 5 files changed, 230 insertions(+), 1 deletion(-) diff --git a/libs/langchain-core/src/callbacks/base.ts b/libs/langchain-core/src/callbacks/base.ts index b491649256d1..5972845013dd 100644 --- a/libs/langchain-core/src/callbacks/base.ts +++ b/libs/langchain-core/src/callbacks/base.ts @@ -1,6 +1,7 @@ import * as uuid from "../utils/uuid/index.js"; import type { ChainValues } from "../utils/types/index.js"; import type { BaseMessage } from "../messages/base.js"; +import type { ChatModelStreamEvent } from "../language_models/event.js"; import type { AgentAction, AgentFinish } from "../agents.js"; import type { ChatGenerationChunk, @@ -90,6 +91,17 @@ abstract class BaseCallbackHandlerMethodsClass { ): // oxlint-disable-next-line @typescript-eslint/no-explicit-any Promise | any; + /** + * Called when a Chat Model emits a content-block-centric stream event. + */ + handleChatModelStreamEvent?( + event: ChatModelStreamEvent, + runId: string, + parentRunId?: string, + tags?: string[] + ): // oxlint-disable-next-line @typescript-eslint/no-explicit-any + Promise | any; + /** * Called if an LLM/ChatModel run encounters an error */ @@ -314,6 +326,23 @@ export function callbackHandlerPrefersStreaming(x: BaseCallbackHandler) { return "lc_prefer_streaming" in x && x.lc_prefer_streaming; } +/** + * Interface for handlers that prefer chat model stream events instead of + * legacy token/chunk callbacks. + */ +export interface CallbackHandlerPrefersChatModelStreamEvents { + readonly lc_prefer_chat_model_stream_events: boolean; +} + +export function callbackHandlerPrefersChatModelStreamEvents( + x: BaseCallbackHandler +) { + return ( + "lc_prefer_chat_model_stream_events" in x && + x.lc_prefer_chat_model_stream_events + ); +} + /** * Abstract base class for creating callback handlers in the LangChain * framework. It provides a set of optional methods that can be overridden diff --git a/libs/langchain-core/src/callbacks/manager.ts b/libs/langchain-core/src/callbacks/manager.ts index 84cc799f076b..8446a76cd3df 100644 --- a/libs/langchain-core/src/callbacks/manager.ts +++ b/libs/langchain-core/src/callbacks/manager.ts @@ -17,6 +17,7 @@ import { LangChainTracer } from "../tracers/tracer_langchain.js"; import { consumeCallback } from "./promises.js"; import { Serialized } from "../load/serializable.js"; import type { DocumentInterface } from "../documents/document.js"; +import type { ChatModelStreamEvent } from "../language_models/event.js"; import { isTracingEnabled } from "../utils/callbacks.js"; import { isBaseTracer } from "../tracers/base.js"; import { @@ -302,6 +303,37 @@ export class CallbackManagerForLLMRun ); } + async handleChatModelStreamEvent( + event: ChatModelStreamEvent + ): Promise { + await Promise.all( + this.handlers.map((handler) => + consumeCallback(async () => { + if (!handler.ignoreLLM) { + try { + await handler.handleChatModelStreamEvent?.( + event, + this.runId, + this._parentRunId, + this.tags + ); + } catch (err) { + const logFunction = handler.raiseError + ? console.error + : console.warn; + logFunction( + `Error in handler ${handler.constructor.name}, handleChatModelStreamEvent: ${err}` + ); + if (handler.raiseError) { + throw err; + } + } + } + }, handler.awaitHandlers) + ) + ); + } + async handleLLMError( err: Error | unknown, _runId?: string, diff --git a/libs/langchain-core/src/callbacks/tests/callbacks.test.ts b/libs/langchain-core/src/callbacks/tests/callbacks.test.ts index 350e3743b6eb..42bfb717e3b0 100644 --- a/libs/langchain-core/src/callbacks/tests/callbacks.test.ts +++ b/libs/langchain-core/src/callbacks/tests/callbacks.test.ts @@ -10,6 +10,7 @@ import type { ChainValues } from "../../utils/types/index.js"; import type { AgentAction, AgentFinish } from "../../agents.js"; import { BaseMessage, HumanMessage } from "../../messages/index.js"; import type { LLMResult } from "../../outputs.js"; +import type { ChatModelStreamEvent } from "../../language_models/event.js"; import { RunnableLambda } from "../../runnables/base.js"; import { AsyncLocalStorageProviderSingleton } from "../../singletons/index.js"; import { awaitAllCallbacks } from "../promises.js"; @@ -166,6 +167,20 @@ class FakeCallbackHandlerWithChatStart extends FakeCallbackHandler { } } +class FakeChatModelStreamEventHandler extends BaseCallbackHandler { + name = `fake-stream-event-${uuid.v4()}`; + + events: ChatModelStreamEvent[] = []; + + constructor(inputs?: BaseCallbackHandlerInput) { + super(inputs); + } + + handleChatModelStreamEvent(event: ChatModelStreamEvent): void { + this.events.push(event); + } +} + const serialized: Serialized = { lc: 1, type: "constructor", @@ -280,6 +295,46 @@ test("CallbackHandler with ignoreLLM", async () => { expect(handler.llmStreams).toBe(0); }); +test("CallbackManager dispatches chat model stream events", async () => { + const manager = new CallbackManager(); + const handler = new FakeChatModelStreamEventHandler(); + manager.addHandler(handler); + + const llmCbs = await manager.handleChatModelStart(serialized, [ + [new HumanMessage("test")], + ]); + await Promise.all( + llmCbs.map(async (llmCb) => { + await llmCb.handleChatModelStreamEvent({ + event: "message-start", + id: "msg-1", + }); + }) + ); + + expect(handler.events).toEqual([{ event: "message-start", id: "msg-1" }]); +}); + +test("CallbackManager respects ignoreLLM for chat model stream events", async () => { + const manager = new CallbackManager(); + const handler = new FakeChatModelStreamEventHandler({ ignoreLLM: true }); + manager.addHandler(handler); + + const llmCbs = await manager.handleChatModelStart(serialized, [ + [new HumanMessage("test")], + ]); + await Promise.all( + llmCbs.map(async (llmCb) => { + await llmCb.handleChatModelStreamEvent({ + event: "message-start", + id: "msg-1", + }); + }) + ); + + expect(handler.events).toEqual([]); +}); + test("CallbackHandler with ignoreRetriever", async () => { const handler = new FakeCallbackHandler({ ignoreRetriever: true, diff --git a/libs/langchain-core/src/language_models/chat_models.ts b/libs/langchain-core/src/language_models/chat_models.ts index e62d329023aa..9cb16c53569e 100644 --- a/libs/langchain-core/src/language_models/chat_models.ts +++ b/libs/langchain-core/src/language_models/chat_models.ts @@ -56,7 +56,10 @@ import { isInteropZodSchema, } from "../utils/types/zod.js"; import { ModelAbortError } from "../errors/index.js"; -import { callbackHandlerPrefersStreaming } from "../callbacks/base.js"; +import { + callbackHandlerPrefersChatModelStreamEvents, + callbackHandlerPrefersStreaming, +} from "../callbacks/base.js"; import { toJsonSchema } from "../utils/json_schema.js"; import { getEnvironmentVariable } from "../utils/env.js"; import { castStandardMessageContent, iife } from "./utils.js"; @@ -574,10 +577,77 @@ export abstract class BaseChatModel< // Even if stream is not explicitly called, check if model is implicitly // called from streamEvents() or streamLog() to get all streamed events. // Bail out if _streamResponseChunks not overridden + const hasChatModelStreamEventHandler = !!runManagers?.[0].handlers.find( + callbackHandlerPrefersChatModelStreamEvents + ); const hasStreamingHandler = !!runManagers?.[0].handlers.find( callbackHandlerPrefersStreaming ); if ( + hasChatModelStreamEventHandler && + !this.disableStreaming && + baseMessages.length === 1 && + (this._streamChatModelEvents !== + BaseChatModel.prototype._streamChatModelEvents || + this._streamResponseChunks !== + BaseChatModel.prototype._streamResponseChunks) + ) { + try { + let sawEvent = false; + const runManager = runManagers?.[0]; + const events = this._streamChatModelEvents( + baseMessages[0], + parsedOptions + ); + const forwardedEvents = { + async *[Symbol.asyncIterator]() { + for await (const event of events) { + parsedOptions.signal?.throwIfAborted(); + sawEvent = true; + const streamEvent = + event.event === "message-start" && + event.id == null && + runManager?.runId != null + ? { ...event, id: `run-${runManager.runId}` } + : event; + await runManager?.handleChatModelStreamEvent(streamEvent); + yield streamEvent; + } + }, + }; + const message = await new ChatModelStream(forwardedEvents); + parsedOptions.signal?.throwIfAborted(); + if (!sawEvent) { + throw new Error("Received empty response from chat model call."); + } + if (message.id == null) { + const runId = runManagers?.at(0)?.runId; + if (runId != null) message._updateId(`run-${runId}`); + } + const generation: ChatGeneration = { + text: message.text, + message, + }; + generations.push([generation]); + const llmOutput = + message.usage_metadata !== undefined + ? { + tokenUsage: { + promptTokens: message.usage_metadata.input_tokens, + completionTokens: message.usage_metadata.output_tokens, + totalTokens: message.usage_metadata.total_tokens, + }, + } + : undefined; + await runManagers?.[0].handleLLMEnd({ + generations, + llmOutput, + }); + } catch (e) { + await runManagers?.[0].handleLLMError(e); + throw e; + } + } else if ( hasStreamingHandler && !this.disableStreaming && baseMessages.length === 1 && diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts index 7c0dcb199500..8a5ef1ec33c9 100644 --- a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -8,6 +8,7 @@ import { import type { ChatModelStreamEvent } from "../event.js"; import type { BaseMessage } from "../../messages/base.js"; import type { CallbackManagerForLLMRun } from "../../callbacks/manager.js"; +import { BaseCallbackHandler } from "../../callbacks/base.js"; import type { ChatResult } from "../../outputs.js"; import type { ContentBlock } from "../../messages/content/index.js"; @@ -221,6 +222,24 @@ class FakeUsageStreamModel extends BaseChatModel { } } +class FakeV2StreamEventHandler extends BaseCallbackHandler { + name = "fake-v2-stream-event-handler"; + + lc_prefer_chat_model_stream_events = true; + + events: ChatModelStreamEvent[] = []; + + tokens: string[] = []; + + handleChatModelStreamEvent(event: ChatModelStreamEvent): void { + this.events.push(event); + } + + handleLLMNewToken(token: string): void { + this.tokens.push(token); + } +} + describe("_streamChatModelEvents bridge", () => { describe("text streaming", () => { test("bridges string content to text content block events", async () => { @@ -454,4 +473,28 @@ describe("_streamChatModelEvents bridge", () => { expect(message.id).toBe("msg_test"); }); }); + + describe("invoke with v2 stream event callbacks", () => { + test("routes invoke through ChatModelStreamEvent callbacks", async () => { + const model = new FakeTextStreamModel({}); + const handler = new FakeV2StreamEventHandler(); + + const message = await model.invoke("Hello", { callbacks: [handler] }); + + expect(message.id).toBe("msg_test"); + expect( + handler.events.map((event) => + event.event === "content-block-delta" ? event.delta : event.event + ) + ).toEqual([ + "message-start", + "content-block-start", + { type: "text-delta", text: "Hello" }, + { type: "text-delta", text: " world" }, + "content-block-finish", + "message-finish", + ]); + expect(handler.tokens).toEqual([]); + }); + }); }); From faa8ca2686183a0f2a5dcd1c2936dd21d3e17222 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 12:12:13 -0700 Subject: [PATCH 22/39] format --- libs/langchain-core/src/callbacks/manager.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libs/langchain-core/src/callbacks/manager.ts b/libs/langchain-core/src/callbacks/manager.ts index 8446a76cd3df..aa0a4f7b6214 100644 --- a/libs/langchain-core/src/callbacks/manager.ts +++ b/libs/langchain-core/src/callbacks/manager.ts @@ -303,9 +303,7 @@ export class CallbackManagerForLLMRun ); } - async handleChatModelStreamEvent( - event: ChatModelStreamEvent - ): Promise { + async handleChatModelStreamEvent(event: ChatModelStreamEvent): Promise { await Promise.all( this.handlers.map((handler) => consumeCallback(async () => { From 0d7540684a5b6eaf27c302a39d1e3f933596ab24 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 13:43:11 -0700 Subject: [PATCH 23/39] support multi modal --- .../src/language_models/compat.ts | 212 ++++++++++++++++++ .../tests/stream_bridge.test.ts | 159 +++++++++++++ 2 files changed, 371 insertions(+) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 4cf0c152cde4..d0b9496169c0 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -11,6 +11,121 @@ import type { ContentBlock } from "../messages/content/index.js"; import type { ChatGenerationChunk } from "../outputs.js"; import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; +const MIME_TYPE_BY_AUDIO_FORMAT: Record = { + wav: "audio/wav", + mp3: "audio/mpeg", + flac: "audio/flac", + opus: "audio/opus", + aac: "audio/aac", + pcm16: "audio/pcm", +}; + +const MIME_TYPE_BY_IMAGE_FORMAT: Record = { + png: "image/png", + jpeg: "image/jpeg", + jpg: "image/jpeg", + webp: "image/webp", + gif: "image/gif", +}; + +type AudioStreamState = { + index: number; + id?: string; + mimeType: string; + transcript: string; +}; + +function nextBlockIndex(activeBlocks: Map): number { + let next = 0; + for (const index of activeBlocks.keys()) { + if (index >= next) next = index + 1; + } + return next; +} + +function getAdditionalKwargs(message: unknown): Record { + const additional = (message as { additional_kwargs?: unknown }) + .additional_kwargs; + return additional != null && typeof additional === "object" + ? (additional as Record) + : {}; +} + +function extractImageBlocksFromToolOutputs(message: unknown): ContentBlock[] { + const toolOutputs = getAdditionalKwargs(message).tool_outputs; + if (!Array.isArray(toolOutputs)) return []; + + const blocks: ContentBlock[] = []; + for (const entry of toolOutputs) { + if (entry == null || typeof entry !== "object") continue; + const record = entry as Record; + if (record.type !== "image_generation_call") continue; + + const data = typeof record.result === "string" ? record.result : undefined; + const url = typeof record.url === "string" ? record.url : undefined; + if (data == null && url == null) continue; + + const outputFormat = + typeof record.output_format === "string" + ? record.output_format.toLowerCase() + : undefined; + const mimeType = + (outputFormat != null + ? MIME_TYPE_BY_IMAGE_FORMAT[outputFormat] + : undefined) ?? "image/png"; + + blocks.push({ + type: "image", + ...(typeof record.id === "string" ? { id: record.id } : {}), + ...(url != null ? { url } : {}), + ...(data != null ? { data } : {}), + mimeType, + } as ContentBlock); + } + return blocks; +} + +function getAudioPayload(message: unknown): + | { + id?: string; + data?: string; + url?: string; + transcript?: string; + mimeType: string; + } + | undefined { + const audio = getAdditionalKwargs(message).audio; + if (audio == null || typeof audio !== "object") return undefined; + const record = audio as Record; + + const data = typeof record.data === "string" ? record.data : undefined; + const url = typeof record.url === "string" ? record.url : undefined; + const transcript = + typeof record.transcript === "string" ? record.transcript : undefined; + if (data == null && url == null && transcript == null) return undefined; + + const explicitMimeType = + typeof record.mime_type === "string" + ? record.mime_type + : typeof record.mimeType === "string" + ? record.mimeType + : undefined; + const format = + typeof record.format === "string" ? record.format.toLowerCase() : undefined; + const mimeType = + explicitMimeType ?? + (format != null ? MIME_TYPE_BY_AUDIO_FORMAT[format] : undefined) ?? + (data != null ? "audio/wav" : "audio/pcm"); + + return { + ...(typeof record.id === "string" ? { id: record.id } : {}), + ...(data != null ? { data } : {}), + ...(url != null ? { url } : {}), + ...(transcript != null ? { transcript } : {}), + mimeType, + }; +} + /** * Convert an async iterable of legacy `ChatGenerationChunk`s into * `ChatModelStreamEvent`s with typed deltas. @@ -27,6 +142,8 @@ export async function* convertChunksToEvents( let lastUsage: | { input_tokens: number; output_tokens: number; total_tokens: number } | undefined; + let audioStream: AudioStreamState | undefined; + const emittedImageKeys = new Set(); for await (const chunk of chunks) { options?.signal?.throwIfAborted(); @@ -162,6 +279,101 @@ export async function* convertChunksToEvents( } } + const audioPayload = getAudioPayload(msg); + if (audioPayload != null) { + if (audioStream == null) { + const index = nextBlockIndex(activeBlocks); + audioStream = { + index, + id: audioPayload.id, + mimeType: audioPayload.mimeType, + transcript: "", + }; + const initial = { + type: "audio", + ...(audioPayload.id != null ? { id: audioPayload.id } : {}), + ...(audioPayload.url != null ? { url: audioPayload.url } : {}), + data: "", + mimeType: audioPayload.mimeType, + } as ContentBlock; + activeBlocks.set(index, { + type: "audio", + accumulated: initial, + }); + yield { + event: "content-block-start" as const, + index, + content: initial, + }; + } + + const activeAudio = activeBlocks.get(audioStream.index); + if (activeAudio != null) { + const accumulated = activeAudio.accumulated as ContentBlock & { + data?: string; + transcript?: string; + }; + if (audioPayload.id != null && audioStream.id == null) { + audioStream.id = audioPayload.id; + (accumulated as { id?: string }).id = audioPayload.id; + } + if (audioPayload.transcript != null) { + audioStream.transcript += audioPayload.transcript; + accumulated.transcript = audioStream.transcript; + yield { + event: "content-block-delta" as const, + index: audioStream.index, + delta: { + type: "block-delta" as const, + fields: { + type: "audio", + transcript: audioStream.transcript, + }, + }, + }; + } + if (audioPayload.data != null && audioPayload.data.length > 0) { + accumulated.data = (accumulated.data ?? "") + audioPayload.data; + yield { + event: "content-block-delta" as const, + index: audioStream.index, + delta: { + type: "data-delta" as const, + data: audioPayload.data, + encoding: "base64" as const, + }, + }; + } + } + } + + for (const imageBlock of extractImageBlocksFromToolOutputs(msg)) { + const imageRecord = imageBlock as ContentBlock & { + id?: string; + url?: string; + data?: string; + }; + const imageKey = + imageRecord.id ?? + imageRecord.url ?? + (imageRecord.data != null + ? `${imageRecord.data.length}:${imageRecord.data.slice(0, 32)}` + : undefined); + if (imageKey != null && emittedImageKeys.has(imageKey)) continue; + if (imageKey != null) emittedImageKeys.add(imageKey); + + const index = nextBlockIndex(activeBlocks); + activeBlocks.set(index, { + type: "image", + accumulated: imageBlock, + }); + yield { + event: "content-block-start" as const, + index, + content: imageBlock, + }; + } + // Usage if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) { const chunkUsage = msg.usage_metadata; diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts index 8a5ef1ec33c9..21d82ad462cd 100644 --- a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -222,6 +222,93 @@ class FakeUsageStreamModel extends BaseChatModel { } } +class FakeAudioAdditionalKwargsStreamModel extends BaseChatModel { + _llmType() { + return "fake-audio-additional-kwargs-stream"; + } + + async _generate( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): Promise { + return { generations: [] }; + } + + async *_streamResponseChunks( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: "", + id: "msg_audio", + additional_kwargs: { + audio: { + id: "audio_1", + data: "AAAA", + transcript: "Once", + format: "pcm16", + }, + }, + }), + text: "", + }); + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: "", + additional_kwargs: { + audio: { + data: "BBBB", + transcript: " upon", + format: "pcm16", + }, + }, + }), + text: "", + }); + } +} + +class FakeImageToolOutputsStreamModel extends BaseChatModel { + _llmType() { + return "fake-image-tool-outputs-stream"; + } + + async _generate( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): Promise { + return { generations: [] }; + } + + async *_streamResponseChunks( + _messages: BaseMessage[], + _options: this["ParsedCallOptions"], + _runManager?: CallbackManagerForLLMRun + ): AsyncGenerator { + yield new ChatGenerationChunk({ + message: new AIMessageChunk({ + content: "", + id: "msg_image", + additional_kwargs: { + tool_outputs: [ + { + type: "image_generation_call", + id: "img_1", + result: "iVBORw0KGgo=", + output_format: "png", + }, + ], + }, + }), + text: "", + }); + } +} + class FakeV2StreamEventHandler extends BaseCallbackHandler { name = "fake-v2-stream-event-handler"; @@ -432,6 +519,78 @@ describe("_streamChatModelEvents bridge", () => { }); }); + describe("provider multimodal payloads", () => { + test("lifts OpenAI audio chunks from additional_kwargs into audio events", async () => { + const model = new FakeAudioAdditionalKwargsStreamModel({}); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const start = events.find( + (event) => + event.event === "content-block-start" && + event.content.type === "audio" + ) as { content: { type: "audio"; id?: string; mimeType?: string } }; + expect(start.content.id).toBe("audio_1"); + expect(start.content.mimeType).toBe("audio/pcm"); + + const dataDeltas = events.filter( + (event) => + event.event === "content-block-delta" && + event.delta.type === "data-delta" + ) as Array<{ delta: { data: string } }>; + expect(dataDeltas.map((event) => event.delta.data)).toEqual([ + "AAAA", + "BBBB", + ]); + + const finish = events.find( + (event) => + event.event === "content-block-finish" && + event.content.type === "audio" + ) as { + content: { type: "audio"; data?: string; transcript?: string }; + }; + expect(finish.content.data).toBe("AAAABBBB"); + expect(finish.content.transcript).toBe("Once upon"); + }); + + test("lifts OpenAI Responses image tool outputs into image events", async () => { + const model = new FakeImageToolOutputsStreamModel({}); + const events: ChatModelStreamEvent[] = []; + for await (const event of model._streamChatModelEvents( + [], + {} as BaseChatModelCallOptions + )) { + events.push(event); + } + + const start = events.find( + (event) => + event.event === "content-block-start" && + event.content.type === "image" + ) as { + content: { type: "image"; id?: string; mimeType?: string; data?: string }; + }; + expect(start.content).toMatchObject({ + id: "img_1", + mimeType: "image/png", + data: "iVBORw0KGgo=", + }); + + const finish = events.find( + (event) => + event.event === "content-block-finish" && + event.content.type === "image" + ) as { content: { type: "image"; id?: string } }; + expect(finish.content.id).toBe("img_1"); + }); + }); + describe("streamV2 method", () => { test("returns ChatModelStream from streamV2()", async () => { const model = new FakeTextStreamModel({}); From abd458f616e114adede9b4ca26ce86824ff166dd Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 15:17:11 -0700 Subject: [PATCH 24/39] fix: derrive tool calls from finalized content blocks --- .../src/language_models/stream.ts | 59 +++++++++++++++++- .../src/language_models/tests/stream.test.ts | 60 +++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index f7869ba53da7..e3f98102ae61 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -7,6 +7,7 @@ import { AIMessage } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; +import type { ToolCall } from "../messages/tool.js"; import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; type UsageMetadataLike = Partial; @@ -197,6 +198,60 @@ function normalizeUsage( }; } +function parseToolArgs(value: unknown): Record { + if (value != null && typeof value === "object" && !Array.isArray(value)) { + return value as Record; + } + if (typeof value !== "string" || value.length === 0) return {}; + try { + const parsed = JSON.parse(value); + return parsed != null && typeof parsed === "object" && !Array.isArray(parsed) + ? (parsed as Record) + : {}; + } catch { + return {}; + } +} + +function standardizeToolBlock(block: ContentBlock): ContentBlock { + const record = block as Record; + if (block.type === "tool_call") return block; + if ( + block.type !== "tool_call_chunk" && + block.type !== "tool_use" && + block.type !== "input_json_delta" + ) { + return block; + } + + const name = typeof record.name === "string" ? record.name : undefined; + if (name == null) return block; + + const args = record.args ?? record.input; + return { + ...record, + type: "tool_call", + name, + args: parseToolArgs(args), + } as unknown as ContentBlock; +} + +function extractToolCalls(blocks: ContentBlock[]): ToolCall[] { + const calls: ToolCall[] = []; + for (const block of blocks) { + if (block.type !== "tool_call") continue; + const record = block as Record; + if (typeof record.name !== "string") continue; + calls.push({ + type: "tool_call", + ...(typeof record.id === "string" ? { id: record.id } : {}), + name: record.name, + args: parseToolArgs(record.args), + }); + } + return calls; +} + // ─── Sub-Stream: Text ─────────────────────────────────────────── /** @@ -616,11 +671,13 @@ export class ChatModelStream const filteredBlocks = contentBlocks.filter( (b): b is ContentBlock => b != null - ); + ).map(standardizeToolBlock); + const toolCalls = extractToolCalls(filteredBlocks); return new AIMessage({ id, content: filteredBlocks, + ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}), usage_metadata: usage, response_metadata: { ...metadata, diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 46e577f912b3..6a5160da58b2 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -1,6 +1,7 @@ import { describe, test, expect } from "vitest"; import type { ChatModelStreamEvent } from "../event.js"; import { ChatModelStream } from "../stream.js"; +import type { ContentBlock } from "../../messages/content/index.js"; // Helper: create an async iterable from an array of events async function* iterEvents( @@ -456,6 +457,65 @@ describe("ChatModelStream", () => { expect(message.response_metadata?.finish_reason).toBe("tool_use"); }); + test("normalizes provider tool-use blocks into tool calls", async () => { + const stream = new ChatModelStream( + iterEvents([ + { event: "message-start", id: "msg_provider_tool" }, + { + event: "content-block-start", + index: 0, + content: { + type: "tool_use", + id: "toolu_1", + name: "calculator", + input: "", + caller: { type: "direct" }, + } as unknown as ContentBlock, + }, + { + event: "content-block-delta", + index: 0, + delta: { + type: "block-delta", + fields: { + type: "tool_call_chunk", + id: "toolu_1", + name: "calculator", + args: '{"expression": "12345 + 67890"}', + }, + }, + }, + { + event: "content-block-finish", + index: 0, + content: { + type: "input_json_delta", + id: "toolu_1", + name: "calculator", + input: '7890"}', + args: '{"expression": "12345 + 67890"}', + caller: { type: "direct" }, + } as unknown as ContentBlock, + }, + { event: "message-finish", reason: "tool_use" }, + ]) + ); + + const message = await stream.output; + + expect(message.tool_calls).toEqual([ + { + type: "tool_call", + id: "toolu_1", + name: "calculator", + args: { expression: "12345 + 67890" }, + }, + ]); + expect((message.content as Array<{ type: string }>)[0]?.type).toBe( + "tool_call" + ); + }); + test("assembles multimodal data chunks", async () => { const stream = new ChatModelStream( iterEvents([ From eb220e25ce0a4f33caf70685eb10257f0847c3f6 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 15:17:39 -0700 Subject: [PATCH 25/39] format --- libs/langchain-core/src/language_models/stream.ts | 10 ++++++---- .../src/language_models/tests/stream_bridge.test.ts | 7 ++++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index e3f98102ae61..7b6e5959e44d 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -205,7 +205,9 @@ function parseToolArgs(value: unknown): Record { if (typeof value !== "string" || value.length === 0) return {}; try { const parsed = JSON.parse(value); - return parsed != null && typeof parsed === "object" && !Array.isArray(parsed) + return parsed != null && + typeof parsed === "object" && + !Array.isArray(parsed) ? (parsed as Record) : {}; } catch { @@ -669,9 +671,9 @@ export class ChatModelStream } } - const filteredBlocks = contentBlocks.filter( - (b): b is ContentBlock => b != null - ).map(standardizeToolBlock); + const filteredBlocks = contentBlocks + .filter((b): b is ContentBlock => b != null) + .map(standardizeToolBlock); const toolCalls = extractToolCalls(filteredBlocks); return new AIMessage({ diff --git a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts index 21d82ad462cd..ea5c79a0f3fe 100644 --- a/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream_bridge.test.ts @@ -574,7 +574,12 @@ describe("_streamChatModelEvents bridge", () => { event.event === "content-block-start" && event.content.type === "image" ) as { - content: { type: "image"; id?: string; mimeType?: string; data?: string }; + content: { + type: "image"; + id?: string; + mimeType?: string; + data?: string; + }; }; expect(start.content).toMatchObject({ id: "img_1", From 703562b7ab78a33d8dd15387fe782c98a4884667 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 15:19:31 -0700 Subject: [PATCH 26/39] fix --- .../src/language_models/stream.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 7b6e5959e44d..54c329a2668d 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -7,7 +7,6 @@ import { AIMessage } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { UsageMetadata } from "../messages/metadata.js"; -import type { ToolCall } from "../messages/tool.js"; import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; type UsageMetadataLike = Partial; @@ -238,22 +237,6 @@ function standardizeToolBlock(block: ContentBlock): ContentBlock { } as unknown as ContentBlock; } -function extractToolCalls(blocks: ContentBlock[]): ToolCall[] { - const calls: ToolCall[] = []; - for (const block of blocks) { - if (block.type !== "tool_call") continue; - const record = block as Record; - if (typeof record.name !== "string") continue; - calls.push({ - type: "tool_call", - ...(typeof record.id === "string" ? { id: record.id } : {}), - name: record.name, - args: parseToolArgs(record.args), - }); - } - return calls; -} - // ─── Sub-Stream: Text ─────────────────────────────────────────── /** @@ -674,12 +657,10 @@ export class ChatModelStream const filteredBlocks = contentBlocks .filter((b): b is ContentBlock => b != null) .map(standardizeToolBlock); - const toolCalls = extractToolCalls(filteredBlocks); return new AIMessage({ id, content: filteredBlocks, - ...(toolCalls.length > 0 ? { tool_calls: toolCalls } : {}), usage_metadata: usage, response_metadata: { ...metadata, From e0e68efd4adbfbeaa8b245929a7f90f7aeb2b3e7 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 15:59:02 -0700 Subject: [PATCH 27/39] fix(core): Avoid duplicating v1 tool call content blocks Avoid duplicating v1 tool call content blocks when reconstructing AI messages from serialized state. When an AIMessage already contains standard v1 `tool_call` blocks in `content`, the constructor should not append the same entries again from `tool_calls`. This preserves checkpoint round-tripping for streamed tool calls and prevents providers like Anthropic from receiving duplicate `tool_use` IDs after HITL resume. --- .../src/language_models/tests/stream.test.ts | 8 +++++ libs/langchain-core/src/messages/ai.ts | 29 ++++++++++++----- .../src/messages/tests/base_message.test.ts | 32 +++++++++++++++++++ 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 6a5160da58b2..2ce683f27a4f 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -514,6 +514,14 @@ describe("ChatModelStream", () => { expect((message.content as Array<{ type: string }>)[0]?.type).toBe( "tool_call" ); + expect(message.contentBlocks).toEqual([ + { + type: "tool_call", + id: "toolu_1", + name: "calculator", + args: { expression: "12345 + 67890" }, + }, + ]); }); test("assembles multimodal data chunks", async () => { diff --git a/libs/langchain-core/src/messages/ai.ts b/libs/langchain-core/src/messages/ai.ts index eb043cf57b99..5586639f4dd8 100644 --- a/libs/langchain-core/src/messages/ai.ts +++ b/libs/langchain-core/src/messages/ai.ts @@ -110,10 +110,20 @@ export class AIMessage } if (initParams.contentBlocks !== undefined) { - // Add constructor tool calls as content blocks + // Add constructor tool calls as content blocks only when they are not + // already represented in the v1 content payload. if (initParams.tool_calls) { + const missingContentBlockToolCalls = initParams.tool_calls.filter( + (toolCall) => + !initParams.contentBlocks?.some( + (block) => + block.type === "tool_call" && + block.id === toolCall.id && + block.name === toolCall.name + ) + ); initParams.contentBlocks.push( - ...initParams.tool_calls.map((toolCall) => ({ + ...missingContentBlockToolCalls.map((toolCall) => ({ type: "tool_call" as const, id: toolCall.id, name: toolCall.name, @@ -135,12 +145,15 @@ export class AIMessage ) ); if (missingToolCalls.length > 0) { - initParams.tool_calls = missingToolCalls.map((block) => ({ - type: "tool_call" as const, - id: block.id!, - name: block.name, - args: block.args as Record, - })) as $InferToolCalls[]; + initParams.tool_calls = [ + ...(initParams.tool_calls ?? []), + ...missingToolCalls.map((block) => ({ + type: "tool_call" as const, + id: block.id!, + name: block.name, + args: block.args as Record, + })), + ] as $InferToolCalls[]; } } } diff --git a/libs/langchain-core/src/messages/tests/base_message.test.ts b/libs/langchain-core/src/messages/tests/base_message.test.ts index b6f90fc5df4b..d9009915ce19 100644 --- a/libs/langchain-core/src/messages/tests/base_message.test.ts +++ b/libs/langchain-core/src/messages/tests/base_message.test.ts @@ -49,6 +49,38 @@ test("Test ChatPromptTemplate can format OpenAI content image messages", async ( ); }); +test("AIMessage v1 content does not duplicate existing tool call blocks", () => { + const message = new AIMessage({ + content: [ + { + type: "tool_call", + id: "toolu_1", + name: "calculator", + args: { expression: "12345 + 67890" }, + }, + ], + tool_calls: [ + { + type: "tool_call", + id: "toolu_1", + name: "calculator", + args: { expression: "12345 + 67890" }, + }, + ], + response_metadata: { output_version: "v1" }, + }); + + expect(message.contentBlocks).toEqual([ + { + type: "tool_call", + id: "toolu_1", + name: "calculator", + args: { expression: "12345 + 67890" }, + }, + ]); + expect(message.tool_calls).toHaveLength(1); +}); + test("Test ChatPromptTemplate can format OpenAI content image messages", async () => { const message = new HumanMessage({ content: [ From d27c83eb085c965dea374c0775a027725e75f253 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 22:35:09 -0700 Subject: [PATCH 28/39] bump deps --- .../src/language_models/tests/stream.test.ts | 4 + libs/langchain/package.json | 6 +- pnpm-lock.yaml | 78 +++++++++---------- 3 files changed, 46 insertions(+), 42 deletions(-) diff --git a/libs/langchain-core/src/language_models/tests/stream.test.ts b/libs/langchain-core/src/language_models/tests/stream.test.ts index 2ce683f27a4f..4eb49ff223e2 100644 --- a/libs/langchain-core/src/language_models/tests/stream.test.ts +++ b/libs/langchain-core/src/language_models/tests/stream.test.ts @@ -518,8 +518,12 @@ describe("ChatModelStream", () => { { type: "tool_call", id: "toolu_1", + input: '7890"}', name: "calculator", args: { expression: "12345 + 67890" }, + caller: { + type: "direct", + }, }, ]); }); diff --git a/libs/langchain/package.json b/libs/langchain/package.json index 11678da8158e..ec4d4643f66f 100644 --- a/libs/langchain/package.json +++ b/libs/langchain/package.json @@ -46,8 +46,8 @@ "@langchain/anthropic": "workspace:*", "@langchain/core": "workspace:^", "@langchain/fireworks": "workspace:*", - "@langchain/langgraph-api": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3", - "@langchain/langgraph-sdk": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3", + "@langchain/langgraph-api": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004", + "@langchain/langgraph-sdk": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004", "@langchain/openai": "workspace:*", "@langchain/tsconfig": "workspace:*", "@tsconfig/recommended": "^1.0.2", @@ -74,7 +74,7 @@ "@langchain/core": "workspace:^" }, "dependencies": { - "@langchain/langgraph": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3", + "@langchain/langgraph": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004", "@langchain/langgraph-checkpoint": "^1.0.1", "langsmith": ">=0.5.0 <1.0.0", "zod": "^3.25.76 || ^4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8fe693801f4..c6447a0889f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -589,8 +589,8 @@ importers: libs/langchain: dependencies: '@langchain/langgraph': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3 - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004 + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/langgraph-checkpoint': specifier: ^1.0.1 version: 1.0.1(@langchain/core@libs+langchain-core) @@ -614,11 +614,11 @@ importers: specifier: workspace:* version: link:../providers/langchain-fireworks '@langchain/langgraph-api': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3 - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0)) + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004 + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0)) '@langchain/langgraph-sdk': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3 - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004 + version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@langchain/openai': specifier: workspace:* version: link:../providers/langchain-openai @@ -4066,8 +4066,8 @@ packages: peerDependencies: apache-arrow: '>=15.0.0 <=18.1.0' - '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3} + '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004} version: 1.1.17 engines: {node: ^18.19.0 || >=20.16.0} peerDependencies: @@ -4092,8 +4092,8 @@ packages: peerDependencies: '@langchain/core': workspace:^ - '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@ea62da3d61586a249ec0911ac3b22d0e243b5ab1': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@ea62da3d61586a249ec0911ac3b22d0e243b5ab1} + '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@9c3a00400d74dceef95b19911fae1cb37d801959': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@9c3a00400d74dceef95b19911fae1cb37d801959} version: 1.0.1 engines: {node: '>=18'} peerDependencies: @@ -4133,9 +4133,9 @@ packages: vue: optional: true - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3} - version: 1.8.8 + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004} + version: 1.8.10 peerDependencies: react: ^18 || ^19 react-dom: ^18 || ^19 @@ -4151,9 +4151,9 @@ packages: vue: optional: true - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3d61586a249ec0911ac3b22d0e243b5ab1': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3d61586a249ec0911ac3b22d0e243b5ab1} - version: 1.8.8 + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a00400d74dceef95b19911fae1cb37d801959': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a00400d74dceef95b19911fae1cb37d801959} + version: 1.8.10 peerDependencies: react: ^18 || ^19 react-dom: ^18 || ^19 @@ -4169,8 +4169,8 @@ packages: vue: optional: true - '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@ea62da3d61586a249ec0911ac3b22d0e243b5ab1': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@ea62da3d61586a249ec0911ac3b22d0e243b5ab1} + '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@9c3a00400d74dceef95b19911fae1cb37d801959': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@9c3a00400d74dceef95b19911fae1cb37d801959} version: 1.1.17 engines: {node: ^18.19.0 || >=20.16.0} hasBin: true @@ -4197,9 +4197,9 @@ packages: zod-to-json-schema: optional: true - '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3} - version: 1.2.8 + '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004': + resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004} + version: 1.2.9 engines: {node: '>=18'} peerDependencies: '@langchain/core': workspace:^ @@ -4215,8 +4215,8 @@ packages: peerDependencies: '@langchain/core': workspace:^ - '@langchain/protocol@0.0.13': - resolution: {integrity: sha512-DDBmP5XEJEtt9lHXUVCuaSqRo5Vqz5hQbsTIkcB5ILgK+ymrv4d9k5fxLinap/uewWnMDUbyYCeh3jid5NBRVA==} + '@langchain/protocol@0.0.15': + resolution: {integrity: sha512-MllvbpMjqHevUm+v94M422mH7XKN+wGCvJRBVROTWBotEDOATYB4Ktk2UheYP859y9o2LlhtPek5t1T9eyfAbQ==} '@layerup/layerup-security@1.6.0': resolution: {integrity: sha512-HSBZobDxgi0aHrEoN49RwLSbv60614upoE+noAR/nlysp8K1H1mu9EBw2cY5YTk6XbmEqEjddu9dMPb71NABMA==} @@ -14271,17 +14271,17 @@ snapshots: '@lancedb/lancedb-win32-arm64-msvc': 0.27.2 '@lancedb/lancedb-win32-x64-msvc': 0.27.2 - '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@ea62da3(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0))': + '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0))': dependencies: '@babel/code-frame': 7.29.0 '@hono/node-server': 2.0.0(hono@4.12.14) '@hono/node-ws': 1.3.0(@hono/node-server@2.0.0(hono@4.12.14))(bufferutil@4.1.0)(hono@4.12.14) '@hono/zod-validator': 0.7.6(hono@4.12.14)(zod@4.3.6) '@langchain/core': link:libs/langchain-core - '@langchain/langgraph': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + '@langchain/langgraph': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@libs+langchain-core) - '@langchain/langgraph-ui': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@ea62da3d61586a249ec0911ac3b22d0e243b5ab1 - '@langchain/protocol': 0.0.13 + '@langchain/langgraph-ui': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@9c3a00400d74dceef95b19911fae1cb37d801959 + '@langchain/protocol': 0.0.15 '@types/json-schema': 7.0.15 '@typescript/vfs': 1.6.4(typescript@5.8.3) dedent: 1.7.2 @@ -14300,7 +14300,7 @@ snapshots: winston-console-format: 1.0.8 zod: 4.3.6 optionalDependencies: - '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5) transitivePeerDependencies: - '@opentelemetry/api' - '@opentelemetry/exporter-trace-otlp-proto' @@ -14322,7 +14322,7 @@ snapshots: '@langchain/core': link:libs/langchain-core uuid: 10.0.0 - '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@ea62da3d61586a249ec0911ac3b22d0e243b5ab1(@langchain/core@libs+langchain-core)': + '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@9c3a00400d74dceef95b19911fae1cb37d801959(@langchain/core@libs+langchain-core)': dependencies: '@langchain/core': link:libs/langchain-core uuid: 10.0.0 @@ -14349,10 +14349,10 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/protocol': 0.0.13 + '@langchain/protocol': 0.0.15 '@types/json-schema': 7.0.15 p-queue: 9.1.2 p-retry: 7.1.1 @@ -14361,10 +14361,10 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3d61586a249ec0911ac3b22d0e243b5ab1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a00400d74dceef95b19911fae1cb37d801959(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/protocol': 0.0.13 + '@langchain/protocol': 0.0.15 '@types/json-schema': 7.0.15 p-queue: 9.1.2 p-retry: 7.1.1 @@ -14373,7 +14373,7 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@ea62da3d61586a249ec0911ac3b22d0e243b5ab1': + '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@9c3a00400d74dceef95b19911fae1cb37d801959': dependencies: '@commander-js/extra-typings': 13.1.0(commander@13.1.0) commander: 13.1.0 @@ -14410,12 +14410,12 @@ snapshots: - svelte - vue - '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@ea62da3(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': + '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': dependencies: '@langchain/core': link:libs/langchain-core - '@langchain/langgraph-checkpoint': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@ea62da3d61586a249ec0911ac3b22d0e243b5ab1(@langchain/core@libs+langchain-core) - '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@ea62da3d61586a249ec0911ac3b22d0e243b5ab1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@langchain/protocol': 0.0.13 + '@langchain/langgraph-checkpoint': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@9c3a00400d74dceef95b19911fae1cb37d801959(@langchain/core@libs+langchain-core) + '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a00400d74dceef95b19911fae1cb37d801959(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@langchain/protocol': 0.0.15 '@standard-schema/spec': 1.1.0 uuid: 10.0.0 zod: 4.3.6 @@ -14438,7 +14438,7 @@ snapshots: - encoding - ws - '@langchain/protocol@0.0.13': {} + '@langchain/protocol@0.0.15': {} '@layerup/layerup-security@1.6.0(encoding@0.1.13)(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6)': dependencies: From 9a9b4c24cf5ff039a0158fe3d1cf5e919ee57198 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Thu, 30 Apr 2026 22:38:10 -0700 Subject: [PATCH 29/39] cr --- libs/langchain/src/agents/tests/stream.int.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/langchain/src/agents/tests/stream.int.test.ts b/libs/langchain/src/agents/tests/stream.int.test.ts index 3524cd9b7829..62a0a87f8cbd 100644 --- a/libs/langchain/src/agents/tests/stream.int.test.ts +++ b/libs/langchain/src/agents/tests/stream.int.test.ts @@ -161,7 +161,7 @@ describe("streamEvents", () => { }); const subscription = await run.subscribe({ channels: [...ALL_CHANNELS] }); - await run.run.input({ + await run.run.start({ input: { messages: [{ role: "human", content: "What is 3+4 and 3-4?" }], }, From 0776bf5e618612e32a7192f7580b75f3400f1f05 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 14:21:35 -0700 Subject: [PATCH 30/39] fix getEventDelta --- libs/langchain-core/package.json | 11 +++++++++ .../src/language_models/stream.ts | 24 +------------------ libs/langchain-core/src/load/import_map.ts | 1 + .../langchain-google-common/package.json | 10 ++++---- libs/providers/langchain-google/package.json | 6 ++++- 5 files changed, 23 insertions(+), 29 deletions(-) diff --git a/libs/langchain-core/package.json b/libs/langchain-core/package.json index a1e1fd67a45c..300ab05125d2 100644 --- a/libs/langchain-core/package.json +++ b/libs/langchain-core/package.json @@ -815,6 +815,17 @@ "default": "./dist/utils/types/index.js" } }, + "./utils/uuid": { + "input": "./src/utils/uuid/index.ts", + "require": { + "types": "./dist/utils/uuid/index.d.cts", + "default": "./dist/utils/uuid/index.cjs" + }, + "import": { + "types": "./dist/utils/uuid/index.d.ts", + "default": "./dist/utils/uuid/index.js" + } + }, "./vectorstores": { "input": "./src/vectorstores.ts", "require": { diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 54c329a2668d..422d5f2a9615 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -131,29 +131,7 @@ function getEventDelta( event: ChatModelStreamEvent ): ContentBlockDelta | undefined { if (event.event !== "content-block-delta") return undefined; - if ("delta" in event && event.delta) return event.delta; - - // Transitional tolerance for any stream sources still emitting the previous - // content-shaped delta object. - const content = (event as { content?: unknown }).content; - if (content == null || typeof content !== "object") return undefined; - const block = content as { type?: string } & Record; - if (block.type === "text" && typeof block.text === "string") { - return { type: "text-delta", text: block.text }; - } - if (block.type === "reasoning" && typeof block.reasoning === "string") { - return { type: "reasoning-delta", reasoning: block.reasoning }; - } - if (block.type === "thinking" && typeof block.thinking === "string") { - return { type: "reasoning-delta", reasoning: block.thinking }; - } - if (typeof block.data === "string") { - return { type: "data-delta", data: block.data, encoding: "base64" }; - } - if (typeof block.type === "string") { - return { type: "block-delta", fields: { ...block, type: block.type } }; - } - return undefined; + return event.delta; } function getReasoningDelta(content: unknown): string | undefined { diff --git a/libs/langchain-core/src/load/import_map.ts b/libs/langchain-core/src/load/import_map.ts index 25849f05c42f..97923227db65 100644 --- a/libs/langchain-core/src/load/import_map.ts +++ b/libs/langchain-core/src/load/import_map.ts @@ -64,4 +64,5 @@ export * as utils__stream from "../utils/stream.js"; export * as utils__testing from "../utils/testing/index.js"; export * as utils__tiktoken from "../utils/tiktoken.js"; export * as utils__types from "../utils/types/index.js"; +export * as utils__uuid from "../utils/uuid/index.js"; export * as vectorstores from "../vectorstores.js"; diff --git a/libs/providers/langchain-google-common/package.json b/libs/providers/langchain-google-common/package.json index 8319677b35a1..98fc282b086a 100644 --- a/libs/providers/langchain-google-common/package.json +++ b/libs/providers/langchain-google-common/package.json @@ -106,15 +106,15 @@ "CHANGELOG.md", "README.md", "LICENSE", + "utils.d.cts", + "utils.cjs", + "utils.d.ts", + "utils.js", "types.d.cts", "types.cjs", "types.d.ts", "types.js", - "experimental", - "utils.d.cts", - "utils.cjs", - "utils.d.ts", - "utils.js" + "experimental" ], "module": "./dist/index.js" } diff --git a/libs/providers/langchain-google/package.json b/libs/providers/langchain-google/package.json index 53c630347b2b..72588c06864c 100644 --- a/libs/providers/langchain-google/package.json +++ b/libs/providers/langchain-google/package.json @@ -79,7 +79,11 @@ "dist/", "CHANGELOG.md", "README.md", - "LICENSE" + "LICENSE", + "node.d.cts", + "node.cjs", + "node.d.ts", + "node.js" ], "main": "./dist/index.cjs", "module": "./dist/index.js", From f0587501f9c1354d57f906fc7d344516a01dd37a Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 14:45:31 -0700 Subject: [PATCH 31/39] cr --- .../src/language_models/compat.ts | 22 +++++++++++++++---- .../src/language_models/stream.ts | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index d0b9496169c0..a3fcc588f270 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -6,7 +6,7 @@ * @module */ -import { isAIMessageChunk } from "../messages/ai.js"; +import { AIMessageChunk } from "../messages/ai.js"; import type { ContentBlock } from "../messages/content/index.js"; import type { ChatGenerationChunk } from "../outputs.js"; import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; @@ -85,6 +85,16 @@ function extractImageBlocksFromToolOutputs(message: unknown): ContentBlock[] { return blocks; } +/** + * Get the audio payload from the message. + * + * This handles the OpenAI-shaped `additional_kwargs.audio` payload used by + * legacy chunk streams; other providers must normalize into this shape first. + * + * @param message - The message to get the audio payload from. + * @returns The audio payload. + * @internal + */ function getAudioPayload(message: unknown): | { id?: string; @@ -158,7 +168,7 @@ export async function* convertChunksToEvents( event: "message-start" as const, id: msg.id ?? undefined, }; - if (isAIMessageChunk(msg) && msg.usage_metadata) { + if (AIMessageChunk.isInstance(msg) && msg.usage_metadata) { (startEvent as { usage?: unknown }).usage = msg.usage_metadata; lastUsage = { ...msg.usage_metadata }; usageHandledInStart = true; @@ -224,7 +234,7 @@ export async function* convertChunksToEvents( // Tool call chunks if ( - isAIMessageChunk(msg) && + AIMessageChunk.isInstance(msg) && msg.tool_call_chunks && msg.tool_call_chunks.length > 0 ) { @@ -375,7 +385,11 @@ export async function* convertChunksToEvents( } // Usage - if (!usageHandledInStart && isAIMessageChunk(msg) && msg.usage_metadata) { + if ( + !usageHandledInStart && + AIMessageChunk.isInstance(msg) && + msg.usage_metadata + ) { const chunkUsage = msg.usage_metadata; if (!lastUsage) { lastUsage = { ...chunkUsage }; diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 422d5f2a9615..2164a92e3069 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -212,7 +212,7 @@ function standardizeToolBlock(block: ContentBlock): ContentBlock { type: "tool_call", name, args: parseToolArgs(args), - } as unknown as ContentBlock; + } as ContentBlock; } // ─── Sub-Stream: Text ─────────────────────────────────────────── From 69f40c684b6858516f13be3ba7e04225f8777d3c Mon Sep 17 00:00:00 2001 From: Hunter Lovell Date: Fri, 1 May 2026 15:09:46 -0700 Subject: [PATCH 32/39] type cleanup --- .../src/language_models/compat.ts | 51 +++++++-------- .../src/language_models/stream.ts | 62 +++++++++---------- 2 files changed, 57 insertions(+), 56 deletions(-) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index a3fcc588f270..4be07dac0f8a 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -142,7 +142,7 @@ function getAudioPayload(message: unknown): */ export async function* convertChunksToEvents( chunks: AsyncIterable, - options?: { signal?: AbortSignal } + options?: { signal?: AbortSignal }, ): AsyncGenerator { const activeBlocks = new Map< number, @@ -427,32 +427,36 @@ export async function* convertChunksToEvents( */ function applyDeltaToBlock( block: ContentBlock, - delta: ContentBlockDelta + delta: ContentBlockDelta, ): ContentBlock { switch (delta.type) { case "text-delta": - return { - ...block, - text: ((block as { text?: string }).text ?? "") + delta.text, - } as ContentBlock; + if (block.type === "text") { + return { + ...block, + text: block.text ?? "" + delta.text, + }; + } + return block; case "reasoning-delta": - if ((block as { type?: string }).type === "thinking") { + if (block.type === "thinking") { + return { + ...block, + thinking: block.thinking ?? "" + delta.reasoning, + }; + } + if (block.type === "reasoning") { return { ...block, - thinking: - ((block as { thinking?: string }).thinking ?? "") + delta.reasoning, - } as unknown as ContentBlock; + reasoning: block.reasoning ?? "" + delta.reasoning, + }; } - return { - ...block, - reasoning: - ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, - } as ContentBlock; + return block; case "data-delta": return { ...block, - data: ((block as { data?: string }).data ?? "") + delta.data, - } as ContentBlock; + data: block.data ?? "" + delta.data, + }; case "block-delta": return { ...block, ...delta.fields } as ContentBlock; default: @@ -470,23 +474,20 @@ function contentBlockToDelta(block: ContentBlock): ContentBlockDelta { reasoning: (block as ContentBlock.Reasoning).reasoning, }; } - if ( - (block as { type?: string }).type === "thinking" && - typeof (block as { thinking?: unknown }).thinking === "string" - ) { + if (block.type === "thinking" && block.thinking === "string") { return { type: "reasoning-delta", - reasoning: (block as unknown as { thinking: string }).thinking, + reasoning: block.thinking, }; } - if (typeof (block as { data?: unknown }).data === "string") { + if (block.data === "string") { return { type: "data-delta", - data: (block as unknown as { data: string }).data, + data: block.data, encoding: "base64", }; } - if (typeof (block as { type?: unknown }).type === "string") { + if (typeof block.type === "string") { return { type: "block-delta", fields: { diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 2164a92e3069..509890a43796 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -11,8 +11,6 @@ import type { ChatModelStreamEvent, ContentBlockDelta } from "./event.js"; type UsageMetadataLike = Partial; -// ─── Replay Buffer ────────────────────────────────────────────── - /** * A buffer that caches emitted events for replay. * @@ -80,8 +78,6 @@ class ReplayBuffer { } } -// ─── Accumulator ──────────────────────────────────────────────── - /** * Apply a typed delta to an accumulated content block. * @@ -94,32 +90,36 @@ class ReplayBuffer { */ function applyDelta( block: ContentBlock, - delta: ContentBlockDelta + delta: ContentBlockDelta, ): ContentBlock { switch (delta.type) { case "text-delta": - return { - ...block, - text: ((block as { text?: string }).text ?? "") + delta.text, - } as ContentBlock; + if (block.type === "text") { + return { + ...block, + text: block.text ?? "" + delta.text, + }; + } + return block; case "reasoning-delta": - if ((block as { type?: string }).type === "thinking") { + if (block.type === "thinking") { return { ...block, - thinking: - ((block as { thinking?: string }).thinking ?? "") + delta.reasoning, - } as unknown as ContentBlock; + thinking: block.thinking ?? "" + delta.reasoning, + }; } - return { - ...block, - reasoning: - ((block as { reasoning?: string }).reasoning ?? "") + delta.reasoning, - } as ContentBlock; + if (block.type === "reasoning") { + return { + ...block, + reasoning: block.reasoning ?? "" + delta.reasoning, + }; + } + return block; case "data-delta": return { ...block, - data: ((block as { data?: string }).data ?? "") + delta.data, - } as ContentBlock; + data: block.data ?? "" + delta.data, + }; case "block-delta": return { ...block, ...delta.fields } as ContentBlock; default: @@ -128,7 +128,7 @@ function applyDelta( } function getEventDelta( - event: ChatModelStreamEvent + event: ChatModelStreamEvent, ): ContentBlockDelta | undefined { if (event.event !== "content-block-delta") return undefined; return event.delta; @@ -164,7 +164,7 @@ function isReasoningContent(content: unknown): boolean { * high-level Core consumers always receive a complete {@link UsageMetadata}. */ function normalizeUsage( - usage: UsageMetadataLike | undefined + usage: UsageMetadataLike | undefined, ): UsageMetadata | undefined { if (!usage) return undefined; return { @@ -268,7 +268,7 @@ export class TextContentStream then( onfulfilled?: ((value: string) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, ): PromiseLike { const promise = (async () => { let text = ""; @@ -339,10 +339,10 @@ export class ToolCallsStream then, TResult2 = never>( onfulfilled?: | (( - value: Array + value: Array, ) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, ): PromiseLike { const promise = (async () => { const calls: Array = []; @@ -444,7 +444,7 @@ export class ReasoningContentStream then( onfulfilled?: ((value: string) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, ): PromiseLike { const promise = (async () => { let text = ""; @@ -498,7 +498,7 @@ export class UsageMetadataStream onfulfilled?: | ((value: UsageMetadata | undefined) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, ): PromiseLike { const promise = (async () => { let latest: UsageMetadata | undefined; @@ -533,7 +533,7 @@ export class ChatModelStream /** @internal */ private async _consume( - source: AsyncIterable + source: AsyncIterable, ): Promise { try { for await (const event of source) { @@ -542,7 +542,7 @@ export class ChatModelStream this._buffer.finish(); } catch (err) { this._buffer.setError( - err instanceof Error ? err : new Error(String(err)) + err instanceof Error ? err : new Error(String(err)), ); } } @@ -568,14 +568,14 @@ export class ChatModelStream } get output(): PromiseLike { - return { then: (onf, onr) => this._assembleMessage().then(onf, onr) }; + return this._assembleMessage(); } then( onfulfilled?: | ((value: AIMessage) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, ): PromiseLike { return this._assembleMessage().then(onfulfilled, onrejected); } From b6485cc6712fe8d872f7d57d492a16f93812e090 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 15:13:24 -0700 Subject: [PATCH 33/39] don't ship middleware transformer --- .../src/language_models/chat_models.ts | 4 +- libs/langchain/src/agents/ReactAgent.ts | 5 - libs/langchain/src/agents/index.ts | 13 +- libs/langchain/src/agents/stream.ts | 111 --------------- .../src/agents/tests/stream.int.test.ts | 31 +---- .../src/agents/tests/stream.test-d.ts | 38 +----- .../langchain/src/agents/tests/stream.test.ts | 126 +----------------- 7 files changed, 8 insertions(+), 320 deletions(-) diff --git a/libs/langchain-core/src/language_models/chat_models.ts b/libs/langchain-core/src/language_models/chat_models.ts index 9cb16c53569e..e41b0188fba7 100644 --- a/libs/langchain-core/src/language_models/chat_models.ts +++ b/libs/langchain-core/src/language_models/chat_models.ts @@ -353,7 +353,7 @@ export abstract class BaseChatModel< * * @example * ```ts - * const stream = model.streamV2([{ role: "user", content: "Hello" }]); + * const stream = model.streamEvents([{ role: "user", content: "Hello" }]); * * // Stream text * for await (const token of stream.text) { @@ -364,7 +364,7 @@ export abstract class BaseChatModel< * const message = await stream; * ``` */ - streamV2( + streamEvents( input: BaseLanguageModelInput, options?: Partial ): ChatModelStream { diff --git a/libs/langchain/src/agents/ReactAgent.ts b/libs/langchain/src/agents/ReactAgent.ts index 9f30e10f8f94..bb7885e67110 100644 --- a/libs/langchain/src/agents/ReactAgent.ts +++ b/libs/langchain/src/agents/ReactAgent.ts @@ -54,7 +54,6 @@ import { } from "./nodes/utils.js"; import { createToolCallTransformer, - createMiddlewareTransformer, type AgentRunStream, type InferStreamExtensions, } from "./stream.js"; @@ -674,7 +673,6 @@ export class ReactAgent< */ const compileTransformers = [ createToolCallTransformer([]), - createMiddlewareTransformer([]), /* user-defined stream transformers */ ...(this.options.streamTransformers ?? []), ]; @@ -1376,7 +1374,6 @@ export class ReactAgent< AgentRunStream< MergedAgentState, Types["Tools"], - Types["Middleware"], InferStreamExtensions > >; @@ -1446,7 +1443,6 @@ export class ReactAgent< AgentRunStream< MergedAgentState, Types["Tools"], - Types["Middleware"], InferStreamExtensions > > @@ -1508,7 +1504,6 @@ export class ReactAgent< })) as unknown as AgentRunStream< FullState, Types["Tools"], - Types["Middleware"], InferStreamExtensions >; })(); diff --git a/libs/langchain/src/agents/index.ts b/libs/langchain/src/agents/index.ts index 49177fd8e056..0614f9755baa 100644 --- a/libs/langchain/src/agents/index.ts +++ b/libs/langchain/src/agents/index.ts @@ -716,14 +716,5 @@ export { MIDDLEWARE_BRAND } from "./middleware/types.js"; export type * from "./middleware/types.js"; export { FakeToolCallingModel } from "./tests/utils.js"; export type { ReactAgent } from "./ReactAgent.js"; -export { - createToolCallTransformer, - createMiddlewareTransformer, -} from "./stream.js"; -export type { - AgentRunStream, - MiddlewarePhase, - MiddlewareEvent, - MiddlewareEventUnion, - ToolCallStreamUnion, -} from "./stream.js"; +export { createToolCallTransformer } from "./stream.js"; +export type { AgentRunStream, ToolCallStreamUnion } from "./stream.js"; diff --git a/libs/langchain/src/agents/stream.ts b/libs/langchain/src/agents/stream.ts index 8587e9170317..0d06833e28e4 100644 --- a/libs/langchain/src/agents/stream.ts +++ b/libs/langchain/src/agents/stream.ts @@ -22,7 +22,6 @@ import { type ToolCallStream, type ToolCallStatus, type ToolsEventData, - type UpdatesEventData, type Namespace, } from "@langchain/langgraph"; import type { @@ -31,10 +30,6 @@ import type { DynamicStructuredTool, StructuredToolInterface, } from "@langchain/core/tools"; -import type { - AgentMiddleware, - InferMiddlewareState, -} from "./middleware/types.js"; /** * Infers the merged extensions shape from a tuple of stream transformer @@ -92,46 +87,6 @@ export type ToolCallStreamUnion< >; }[number]; -/** - * Lifecycle phase that a middleware hook occupies within an agent turn. - */ -export type MiddlewarePhase = - | "before_agent" - | "before_model" - | "after_model" - | "after_agent"; - -/** - * Represents a single middleware lifecycle event observed during an - * agent run. Emitted by the middleware transformer. - * - * @typeParam TStateDelta - Shape of the state delta produced by this - * middleware. Defaults to `Record` when the - * middleware tuple is not typed. - */ -export interface MiddlewareEvent> { - phase: MiddlewarePhase; - name: string; - stateDelta: TStateDelta; - timestamp: number; -} - -/** - * Discriminated union of {@link MiddlewareEvent} variants, one per - * middleware in `TMiddleware`. When the middleware array is typed, - * `event.stateDelta` narrows to the middleware's inferred state type. - * - * Falls back to `MiddlewareEvent` (untyped) when the middleware array - * is a plain `AgentMiddleware[]`. - */ -export type MiddlewareEventUnion< - TMiddleware extends readonly AgentMiddleware[], -> = { - [K in keyof TMiddleware]: TMiddleware[K] extends AgentMiddleware - ? MiddlewareEvent> - : MiddlewareEvent; -}[number]; - /** * A {@link GraphRunStream} with native agent-level projections assigned * directly on the instance by `createGraphRunStream` (via `__native` @@ -156,13 +111,10 @@ export type AgentRunStream< | ClientTool | ServerTool )[], - TMiddleware extends readonly AgentMiddleware[] = readonly AgentMiddleware[], TExtensions extends Record = Record, > = GraphRunStream & { /** Tool call streams from the native ToolCallTransformer. */ toolCalls: AsyncIterable>; - /** Middleware lifecycle events from the native MiddlewareTransformer. */ - middleware: AsyncIterable>; }; interface ToolCallProjection { @@ -371,66 +323,3 @@ export function createToolCallTransformer( }; }; } - -interface MiddlewareProjection { - middleware: AsyncIterable; -} - -const MIDDLEWARE_NODE_PATTERN = - /^(.+)\.(before_agent|before_model|after_model|after_agent)$/; - -/** - * Creates a native transformer that watches `updates` events from - * middleware nodes and surfaces them as typed {@link MiddlewareEvent} - * objects. - * - * Marked `__native: true` — projection key lands directly on the - * `GraphRunStream` instance as `run.middleware`. - */ -export function createMiddlewareTransformer( - path: Namespace -): () => NativeStreamTransformer { - return () => { - const middlewareLog = StreamChannel.local(); - - return { - __native: true as const, - - init: () => ({ - middleware: middlewareLog, - }), - - process(event: ProtocolEvent): boolean { - if (event.method !== "updates") return true; - if (!isOwnEvent(event.params.namespace, path)) return true; - - const data = event.params.data as UpdatesEventData; - const nodeName = data.node ?? event.params.node; - if (!nodeName) return true; - - const match = MIDDLEWARE_NODE_PATTERN.exec(nodeName); - if (!match) return true; - - const name = match[1]; - const phase = match[2] as MiddlewarePhase; - - middlewareLog.push({ - phase, - name, - stateDelta: data.values ?? {}, - timestamp: event.params.timestamp, - }); - - return true; - }, - - finalize(): void { - middlewareLog.close(); - }, - - fail(err: unknown): void { - middlewareLog.fail(err); - }, - }; - }; -} diff --git a/libs/langchain/src/agents/tests/stream.int.test.ts b/libs/langchain/src/agents/tests/stream.int.test.ts index 62a0a87f8cbd..0ffb9c540b5e 100644 --- a/libs/langchain/src/agents/tests/stream.int.test.ts +++ b/libs/langchain/src/agents/tests/stream.int.test.ts @@ -14,7 +14,7 @@ import { tool } from "@langchain/core/tools"; import { AIMessage } from "@langchain/core/messages"; import { Client } from "@langchain/langgraph-sdk"; -import { createMiddleware, createAgent } from "../index.js"; +import { createAgent } from "../index.js"; const threads: ThreadSaver = (() => { const THREADS: Record< @@ -55,24 +55,6 @@ const minusTool = tool( schema: z.object({ a: z.number(), b: z.number() }), } ); -const middlewareA = createMiddleware({ - name: "trackerA", - stateSchema: z.object({ - trackerState: z.string().default("init"), - }), - beforeModel: () => ({ trackerState: "before", before: true }), - afterModel: () => ({ trackerState: "after", after: true }), -}); - -const middlewareB = createMiddleware({ - name: "trackerB", - stateSchema: z.object({ - trackerState: z.string().default("init"), - }), - wrapModelCall: async (request, handler) => { - return await handler(request); - }, -}); const model = fakeModel() .respondWithTools([ @@ -84,7 +66,6 @@ const model = fakeModel() const agent = createAgent({ model, tools: [addTool, minusTool], - middleware: [middlewareA, middlewareB], // oxlint-disable-next-line typescript/no-explicit-any }) as unknown as Pregel; @@ -151,7 +132,7 @@ async function collectAllEvents( beforeAll(setup); describe("streamEvents", () => { - it("should emit stream evebts for each tool and middleware invocation", async () => { + it("should emit stream events for each tool invocation", async () => { console.log("url", url); const client = new Client({ apiUrl: url! }); @@ -234,14 +215,10 @@ describe("streamEvents", () => { expect(updates.length).toBe(8); const updateNodes = updates.map(nodeOf); expect(updateNodes).toEqual([ - "trackerA.before_model", "model_request", - "trackerA.after_model", "tools", "tools", - "trackerA.before_model", "model_request", - "trackerA.after_model", ]); // first model_request produced tool calls @@ -269,10 +246,6 @@ describe("streamEvents", () => { tool_call_id: "call_2", }); - // middleware state transitions are reflected - expect(dataOf(updates[0]).trackerState).toBe("before"); - expect(dataOf(updates[2]).trackerState).toBe("after"); - // --- values: 8 state snapshots --- const values = eventsByChannel.get("values") ?? []; expect(values.length).toBe(8); diff --git a/libs/langchain/src/agents/tests/stream.test-d.ts b/libs/langchain/src/agents/tests/stream.test-d.ts index 8c67f2eedf95..bdaca4684266 100644 --- a/libs/langchain/src/agents/tests/stream.test-d.ts +++ b/libs/langchain/src/agents/tests/stream.test-d.ts @@ -5,7 +5,7 @@ import { tool } from "@langchain/core/tools"; import { fakeModel } from "@langchain/core/testing"; import { StreamChannel, type StreamTransformer } from "@langchain/langgraph"; -import { createAgent, createMiddleware } from "../index.js"; +import { createAgent } from "../index.js"; describe("streamEvents types", () => { it("should type tool calls as a discriminated union", async () => { @@ -58,42 +58,6 @@ describe("streamEvents types", () => { } }); - it("should type middleware events with inferred state delta", async () => { - const model = fakeModel().respond(new AIMessage("ok")); - - const tracker = createMiddleware({ - name: "tracker", - stateSchema: z.object({ - trackerState: z.string().default("init"), - }), - beforeModel: () => ({ trackerState: "before" }), - }); - - const agent = createAgent({ - model, - tools: [], - middleware: [tracker], - }); - - const run = await agent.streamEvents( - { - messages: [new HumanMessage("hi")], - }, - { version: "v3" } - ); - - for await (const event of run.middleware) { - expectTypeOf(event.phase).toEqualTypeOf< - "before_model" | "after_model" | "before_agent" | "after_agent" - >(); - expectTypeOf(event.name).toEqualTypeOf(); - expectTypeOf(event.stateDelta).toEqualTypeOf<{ - trackerState: string; - }>(); - expectTypeOf(event.timestamp).toEqualTypeOf(); - } - }); - it("should type run.extensions from streamTransformers registered at creation time", async () => { const model = fakeModel().respond(new AIMessage("ok")); diff --git a/libs/langchain/src/agents/tests/stream.test.ts b/libs/langchain/src/agents/tests/stream.test.ts index 3b0493122f85..f30f1b1fe49c 100644 --- a/libs/langchain/src/agents/tests/stream.test.ts +++ b/libs/langchain/src/agents/tests/stream.test.ts @@ -10,7 +10,7 @@ import { } from "@langchain/langgraph"; import { MemorySaver } from "@langchain/langgraph-checkpoint"; -import { createAgent, createMiddleware } from "../index.js"; +import { createAgent } from "../index.js"; import { humanInTheLoopMiddleware } from "../middleware/hitl.js"; import { createToolCallTransformer } from "../stream.js"; @@ -76,58 +76,6 @@ describe("streamEvents", () => { expect(toolCalls[0].output).toHaveProperty("content", "The sum is 7"); }); - it("should emit middleware events for before/after model hooks", async () => { - const model = fakeModel().respond(new AIMessage("hello back")); - - const testMiddleware = createMiddleware({ - name: "tracker", - stateSchema: z.object({ - trackerState: z.string().default("init"), - }), - beforeModel: () => ({ - trackerState: "before_model_ran", - }), - afterModel: () => ({ - trackerState: "after_model_ran", - }), - }); - - const agent = createAgent({ - model, - tools: [], - middleware: [testMiddleware], - }); - - const run = await agent.streamEvents( - { - messages: [new HumanMessage("hello")], - }, - { version: "v3" } - ); - - const middlewareEvents: Array<{ - phase: string; - middlewareName: string; - }> = []; - - for await (const event of run.middleware) { - middlewareEvents.push({ - phase: event.phase, - middlewareName: event.name, - }); - } - - expect(middlewareEvents.length).toBeGreaterThanOrEqual(2); - - const phases = middlewareEvents.map((e) => e.phase); - expect(phases).toContain("before_model"); - expect(phases).toContain("after_model"); - - for (const event of middlewareEvents) { - expect(event.middlewareName).toBe("tracker"); - } - }); - it("should stream messages alongside tool calls", async () => { const searchTool = tool( (input: { query: string }) => `Results for: ${input.query}`, @@ -169,78 +117,6 @@ describe("streamEvents", () => { expect(finalState.messages.length).toBeGreaterThanOrEqual(3); }); - it("should support parallel consumption of projections", async () => { - const multiplyTool = tool( - (input: { a: number; b: number }) => `${input.a * input.b}`, - { - name: "multiply", - description: "Multiplies two numbers", - schema: z.object({ a: z.number(), b: z.number() }), - } - ); - - const model = fakeModel() - .respondWithTools([ - { name: "multiply", args: { a: 6, b: 7 }, id: "call_m1" }, - ]) - .respond(new AIMessage("42")); - - const middleware = createMiddleware({ - name: "logger", - stateSchema: z.object({ - logState: z.string().default(""), - }), - beforeModel: () => ({ - logState: "before", - }), - }); - - const agent = createAgent({ - model, - tools: [multiplyTool], - middleware: [middleware], - }); - - const run = await agent.streamEvents( - { - messages: [new HumanMessage("What is 6 * 7?")], - }, - { version: "v3" } - ); - - const [toolNames, middlewarePhases, output] = await Promise.all([ - (async () => { - const names: string[] = []; - for await (const call of run.toolCalls) { - names.push(call.name); - await call.output; - } - return names; - })(), - (async () => { - const phases: string[] = []; - for await (const event of run.middleware) { - phases.push(event.phase); - } - return phases; - })(), - run.output, - ]); - - expect(toolNames).toMatchInlineSnapshot(` - [ - "multiply", - ] - `); - expect(middlewarePhases).toMatchInlineSnapshot(` - [ - "before_model", - "before_model", - ] - `); - expect(output.messages).toHaveLength(3); - }); - it("should resolve output with the final agent state", async () => { const model = fakeModel().respond(new AIMessage("hi there")); const agent = createAgent({ model, tools: [] }); From a69e3599c88589d70048c22ca2ed092f4d0f708e Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 15:19:44 -0700 Subject: [PATCH 34/39] tweak --- .../src/language_models/compat.ts | 12 ++++---- .../src/language_models/stream.ts | 30 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 4be07dac0f8a..758a730e7ee0 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -142,7 +142,7 @@ function getAudioPayload(message: unknown): */ export async function* convertChunksToEvents( chunks: AsyncIterable, - options?: { signal?: AbortSignal }, + options?: { signal?: AbortSignal } ): AsyncGenerator { const activeBlocks = new Map< number, @@ -427,14 +427,14 @@ export async function* convertChunksToEvents( */ function applyDeltaToBlock( block: ContentBlock, - delta: ContentBlockDelta, + delta: ContentBlockDelta ): ContentBlock { switch (delta.type) { case "text-delta": if (block.type === "text") { return { ...block, - text: block.text ?? "" + delta.text, + text: (block.text ?? "") + delta.text, }; } return block; @@ -442,20 +442,20 @@ function applyDeltaToBlock( if (block.type === "thinking") { return { ...block, - thinking: block.thinking ?? "" + delta.reasoning, + thinking: (block.thinking ?? "") + delta.reasoning, }; } if (block.type === "reasoning") { return { ...block, - reasoning: block.reasoning ?? "" + delta.reasoning, + reasoning: (block.reasoning ?? "") + delta.reasoning, }; } return block; case "data-delta": return { ...block, - data: block.data ?? "" + delta.data, + data: (block.data ?? "") + delta.data, }; case "block-delta": return { ...block, ...delta.fields } as ContentBlock; diff --git a/libs/langchain-core/src/language_models/stream.ts b/libs/langchain-core/src/language_models/stream.ts index 509890a43796..ec0b2af3f87d 100644 --- a/libs/langchain-core/src/language_models/stream.ts +++ b/libs/langchain-core/src/language_models/stream.ts @@ -90,14 +90,14 @@ class ReplayBuffer { */ function applyDelta( block: ContentBlock, - delta: ContentBlockDelta, + delta: ContentBlockDelta ): ContentBlock { switch (delta.type) { case "text-delta": if (block.type === "text") { return { ...block, - text: block.text ?? "" + delta.text, + text: (block.text ?? "") + delta.text, }; } return block; @@ -105,20 +105,20 @@ function applyDelta( if (block.type === "thinking") { return { ...block, - thinking: block.thinking ?? "" + delta.reasoning, + thinking: (block.thinking ?? "") + delta.reasoning, }; } if (block.type === "reasoning") { return { ...block, - reasoning: block.reasoning ?? "" + delta.reasoning, + reasoning: (block.reasoning ?? "") + delta.reasoning, }; } return block; case "data-delta": return { ...block, - data: block.data ?? "" + delta.data, + data: (block.data ?? "") + delta.data, }; case "block-delta": return { ...block, ...delta.fields } as ContentBlock; @@ -128,7 +128,7 @@ function applyDelta( } function getEventDelta( - event: ChatModelStreamEvent, + event: ChatModelStreamEvent ): ContentBlockDelta | undefined { if (event.event !== "content-block-delta") return undefined; return event.delta; @@ -164,7 +164,7 @@ function isReasoningContent(content: unknown): boolean { * high-level Core consumers always receive a complete {@link UsageMetadata}. */ function normalizeUsage( - usage: UsageMetadataLike | undefined, + usage: UsageMetadataLike | undefined ): UsageMetadata | undefined { if (!usage) return undefined; return { @@ -268,7 +268,7 @@ export class TextContentStream then( onfulfilled?: ((value: string) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null ): PromiseLike { const promise = (async () => { let text = ""; @@ -339,10 +339,10 @@ export class ToolCallsStream then, TResult2 = never>( onfulfilled?: | (( - value: Array, + value: Array ) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null ): PromiseLike { const promise = (async () => { const calls: Array = []; @@ -444,7 +444,7 @@ export class ReasoningContentStream then( onfulfilled?: ((value: string) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null ): PromiseLike { const promise = (async () => { let text = ""; @@ -498,7 +498,7 @@ export class UsageMetadataStream onfulfilled?: | ((value: UsageMetadata | undefined) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null ): PromiseLike { const promise = (async () => { let latest: UsageMetadata | undefined; @@ -533,7 +533,7 @@ export class ChatModelStream /** @internal */ private async _consume( - source: AsyncIterable, + source: AsyncIterable ): Promise { try { for await (const event of source) { @@ -542,7 +542,7 @@ export class ChatModelStream this._buffer.finish(); } catch (err) { this._buffer.setError( - err instanceof Error ? err : new Error(String(err)), + err instanceof Error ? err : new Error(String(err)) ); } } @@ -575,7 +575,7 @@ export class ChatModelStream onfulfilled?: | ((value: AIMessage) => TResult1 | PromiseLike) | null, - onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null, + onrejected?: ((reason: unknown) => TResult2 | PromiseLike) | null ): PromiseLike { return this._assembleMessage().then(onfulfilled, onrejected); } From 1ec7a5d0b60b91d39e42b710dcffcb7119053a47 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 15:24:21 -0700 Subject: [PATCH 35/39] revert --- libs/langchain-core/src/language_models/chat_models.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/langchain-core/src/language_models/chat_models.ts b/libs/langchain-core/src/language_models/chat_models.ts index e41b0188fba7..9cb16c53569e 100644 --- a/libs/langchain-core/src/language_models/chat_models.ts +++ b/libs/langchain-core/src/language_models/chat_models.ts @@ -353,7 +353,7 @@ export abstract class BaseChatModel< * * @example * ```ts - * const stream = model.streamEvents([{ role: "user", content: "Hello" }]); + * const stream = model.streamV2([{ role: "user", content: "Hello" }]); * * // Stream text * for await (const token of stream.text) { @@ -364,7 +364,7 @@ export abstract class BaseChatModel< * const message = await stream; * ``` */ - streamEvents( + streamV2( input: BaseLanguageModelInput, options?: Partial ): ChatModelStream { From b8cbb05f2a1a08f9b597d7dce524e51856e5ff7f Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 15:27:19 -0700 Subject: [PATCH 36/39] revert langchain changes --- .changeset/new-guests-yell.md | 5 - libs/langchain/package.json | 17 +- libs/langchain/src/agents/ReactAgent.ts | 275 ++----------- libs/langchain/src/agents/index.ts | 108 +---- libs/langchain/src/agents/stream.ts | 325 --------------- .../src/agents/tests/stream.int.test.ts | 271 ------------ .../src/agents/tests/stream.test-d.ts | 106 ----- .../langchain/src/agents/tests/stream.test.ts | 389 ------------------ libs/langchain/src/agents/types.ts | 75 +--- libs/langchain/src/load/import_map.ts | 1 - 10 files changed, 59 insertions(+), 1513 deletions(-) delete mode 100644 .changeset/new-guests-yell.md delete mode 100644 libs/langchain/src/agents/stream.ts delete mode 100644 libs/langchain/src/agents/tests/stream.int.test.ts delete mode 100644 libs/langchain/src/agents/tests/stream.test-d.ts delete mode 100644 libs/langchain/src/agents/tests/stream.test.ts diff --git a/.changeset/new-guests-yell.md b/.changeset/new-guests-yell.md deleted file mode 100644 index 448865727350..000000000000 --- a/.changeset/new-guests-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"langchain": minor ---- - -feat(langchain): adopt new streaming primitives diff --git a/libs/langchain/package.json b/libs/langchain/package.json index ec4d4643f66f..2d89e5d3ab45 100644 --- a/libs/langchain/package.json +++ b/libs/langchain/package.json @@ -42,12 +42,9 @@ "test:integration": "vitest --mode int" }, "devDependencies": { - "@hono/node-server": "^1.19.14", "@langchain/anthropic": "workspace:*", "@langchain/core": "workspace:^", "@langchain/fireworks": "workspace:*", - "@langchain/langgraph-api": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004", - "@langchain/langgraph-sdk": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004", "@langchain/openai": "workspace:*", "@langchain/tsconfig": "workspace:*", "@tsconfig/recommended": "^1.0.2", @@ -59,7 +56,6 @@ "cheerio": "1.2.0", "dotenv": "^17.4.0", "dpdm": "^3.14.0", - "hono": "^4.12.12", "openai": "^6.22.0", "peggy": "^5.1.0", "reflect-metadata": "^0.2.2", @@ -74,7 +70,7 @@ "@langchain/core": "workspace:^" }, "dependencies": { - "@langchain/langgraph": "https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004", + "@langchain/langgraph": "^1.2.9", "@langchain/langgraph-checkpoint": "^1.0.1", "langsmith": ">=0.5.0 <1.0.0", "zod": "^3.25.76 || ^4" @@ -210,17 +206,6 @@ "default": "./dist/storage/in_memory.js" } }, - "./tools": { - "input": "./src/tools/index.ts", - "require": { - "types": "./dist/tools/index.d.cts", - "default": "./dist/tools/index.cjs" - }, - "import": { - "types": "./dist/tools/index.d.ts", - "default": "./dist/tools/index.js" - } - }, "./package.json": "./package.json" }, "module": "./dist/index.js" diff --git a/libs/langchain/src/agents/ReactAgent.ts b/libs/langchain/src/agents/ReactAgent.ts index bb7885e67110..a2e7b35cb555 100644 --- a/libs/langchain/src/agents/ReactAgent.ts +++ b/libs/langchain/src/agents/ReactAgent.ts @@ -14,7 +14,6 @@ import { type StreamMode, type StreamOutputMap, type PregelOptions, - type StreamTransformer, } from "@langchain/langgraph"; import type { BaseCheckpointSaver, @@ -52,11 +51,6 @@ import { initializeMiddlewareStates, parseJumpToTarget, } from "./nodes/utils.js"; -import { - createToolCallTransformer, - type AgentRunStream, - type InferStreamExtensions, -} from "./stream.js"; import type { WithStateGraphNodes, @@ -164,8 +158,7 @@ export class ReactAgent< undefined, AnyAnnotationRoot, readonly AgentMiddleware[], - readonly (ClientTool | ServerTool)[], - ReadonlyArray<() => StreamTransformer> + readonly (ClientTool | ServerTool)[] >, > { /** @@ -175,7 +168,7 @@ export class ReactAgent< */ declare readonly "~agentTypes": Types; - #graph: CompiledStateGraph; + #graph: AgentGraph; #toolBehaviorVersion: "v1" | "v2" = "v2"; @@ -669,20 +662,13 @@ export class ReactAgent< } /** - * compile the graph with native + user-defined stream transformers + * compile the graph */ - const compileTransformers = [ - createToolCallTransformer([]), - /* user-defined stream transformers */ - ...(this.options.streamTransformers ?? []), - ]; - this.#graph = allNodeWorkflows.compile({ checkpointer: this.options.checkpointer, store: this.options.store, name: this.options.name, description: this.options.description, - transformers: compileTransformers, }) as unknown as AgentGraph; } @@ -1292,223 +1278,6 @@ export class ReactAgent< >; } - /** - * Executes the agent with the v3 streaming interface, returning an - * {@link AgentRunStream} that provides ergonomic, typed projections for - * messages, tool calls, and middleware events — without requiring knowledge - * of Pregel channels, stream modes, or namespace routing. - * - * Pass `version: "v3"` to opt into this projection-oriented stream. Omitting - * `version` preserves the legacy internal LangGraph event-stream behavior - * for compatibility with LangGraph Platform integrations. - * - * This v3 stream is experimental and its API may change in future releases. - * It will become the default in a future major release. - * - * @param state - The initial state for the agent execution. Can be: - * - An object containing `messages` array and any middleware-specific state properties - * - A Command object for more advanced control flow - * - * @param config - Runtime configuration including: - * @param config.version - Must be `"v3"` to use the {@link AgentRunStream} - * interface. The default legacy event stream is maintained for internal - * integrations and should not be used for new user-facing agent streaming. - * @param config.context - The context for the agent execution. - * @param config.configurable - LangGraph configuration options like `thread_id`, `run_id`, etc. - * @param config.store - The store for the agent execution for persisting state. - * @param config.signal - An optional AbortSignal for the agent execution. - * @param config.recursionLimit - The recursion limit for the agent execution. - * @param config.transformers - Additional call-site stream transformers. These - * run after the built-in agent transformers and any transformers registered - * at creation time via `createAgent({ streamTransformers })`. - * - * @returns A Promise that resolves to an {@link AgentRunStream} providing: - * - `run.messages` — all AI message lifecycles with streaming `.text` and `.reasoning` - * - `run.toolCalls` — individual tool call streams with `.input`, `.output`, `.status` - * - `run.middleware` — middleware lifecycle events (before/after agent/model) - * - `run.values` — state snapshots (async iterable + promise-like) - * - `run.output` — final agent state when the run completes - * - `run.subgraphs` — child subgraph run streams - * - `run.extensions` — merged projections from user-supplied transformers - * - * @example - * ```typescript - * const run = await agent.streamEvents( - * { - * messages: [{ role: "user", content: "What's the weather in Paris?" }], - * }, - * { version: "v3" } - * ); - * - * // Stream all messages - * for await (const msg of run.messages) { - * for await (const token of msg.text) { - * process.stdout.write(token); - * } - * } - * - * // Observe tool calls - * for await (const call of run.toolCalls) { - * console.log(`Tool: ${call.name}`, call.input); - * console.log(`Result:`, await call.output); - * } - * - * // Get final state - * const state = await run.output; - * ``` - */ - streamEvents( - state: InvokeStateParameter, - config: InvokeConfiguration< - InferContextInput< - Types["Context"] extends AnyAnnotationRoot | InteropZodObject - ? Types["Context"] - : AnyAnnotationRoot - > & - InferMiddlewareContextInputs - > & { - version: "v3"; - transformers?: ReadonlyArray<() => StreamTransformer>; - } - ): Promise< - AgentRunStream< - MergedAgentState, - Types["Tools"], - InferStreamExtensions - > - >; - - streamEvents( - state: InvokeStateParameter, - config?: StreamConfiguration< - InferContextInput< - Types["Context"] extends AnyAnnotationRoot | InteropZodObject - ? Types["Context"] - : AnyAnnotationRoot - > & - InferMiddlewareContextInputs, - StreamMode | StreamMode[] | undefined, - boolean, - "text/event-stream" | undefined - > & { version?: "v1" | "v2" }, - streamOptions?: Parameters[2] - ): IterableReadableStream; - - streamEvents( - state: InvokeStateParameter, - config: - | (StreamConfiguration< - InferContextInput< - Types["Context"] extends AnyAnnotationRoot | InteropZodObject - ? Types["Context"] - : AnyAnnotationRoot - > & - InferMiddlewareContextInputs, - StreamMode | StreamMode[] | undefined, - boolean, - "text/event-stream" | undefined - > & { version?: "v1" | "v2" }) - | undefined, - streamOptions: Parameters[2] - ): IterableReadableStream; - - streamEvents( - state: InvokeStateParameter, - config?: - | (InvokeConfiguration< - InferContextInput< - Types["Context"] extends AnyAnnotationRoot | InteropZodObject - ? Types["Context"] - : AnyAnnotationRoot - > & - InferMiddlewareContextInputs - > & { - version: "v3"; - transformers?: ReadonlyArray<() => StreamTransformer>; - }) - | (StreamConfiguration< - InferContextInput< - Types["Context"] extends AnyAnnotationRoot | InteropZodObject - ? Types["Context"] - : AnyAnnotationRoot - > & - InferMiddlewareContextInputs, - StreamMode | StreamMode[] | undefined, - boolean, - "text/event-stream" | undefined - > & { version?: "v1" | "v2" }), - streamOptions?: Parameters[2] - ): - | Promise< - AgentRunStream< - MergedAgentState, - Types["Tools"], - InferStreamExtensions - > - > - | IterableReadableStream { - if (config?.version !== "v3" || streamOptions != null) { - const mergedConfig = mergeConfigs(this.#defaultConfig, config); - const version = - config?.version === "v1" || config?.version === "v2" - ? config.version - : "v2"; - return this.#graph.streamEvents( - state, - { - ...(mergedConfig as Partial< - PregelOptions< - any, - any, - any, - StreamMode | StreamMode[] | undefined, - boolean, - "text/event-stream" - > - >), - version, - }, - streamOptions - ); - } - - return (async () => { - type FullState = MergedAgentState; - const agentConfig = config as InvokeConfiguration< - InferContextInput< - Types["Context"] extends AnyAnnotationRoot | InteropZodObject - ? Types["Context"] - : AnyAnnotationRoot - > & - InferMiddlewareContextInputs - > & { - version: "v3"; - transformers?: ReadonlyArray<() => StreamTransformer>; - }; - - const { - transformers: callSiteTransformers, - version: _version, - ...restConfig - } = agentConfig ?? {}; - const mergedConfig = mergeConfigs(this.#defaultConfig, restConfig); - const initializedState = await this.#initializeMiddlewareStates( - state, - mergedConfig as RunnableConfig - ); - - return (await this.#graph.streamEvents(initializedState, { - ...(mergedConfig as Record), - version: "v3", - transformers: callSiteTransformers, - })) as unknown as AgentRunStream< - FullState, - Types["Tools"], - InferStreamExtensions - >; - })(); - } - /** * Visualize the graph as a PNG image. * @param params - Parameters for the drawMermaidPng method. @@ -1560,6 +1329,44 @@ export class ReactAgent< * * Note: we intentionally return as `never` to avoid type errors due to type inference. */ + + /** + * @internal + */ + streamEvents( + state: InvokeStateParameter, + config?: StreamConfiguration< + InferContextInput< + Types["Context"] extends AnyAnnotationRoot | InteropZodObject + ? Types["Context"] + : AnyAnnotationRoot + > & + InferMiddlewareContextInputs, + StreamMode | StreamMode[] | undefined, + boolean, + "text/event-stream" | undefined + > & { version?: "v1" | "v2" }, + streamOptions?: Parameters[2] + ): IterableReadableStream { + const mergedConfig = mergeConfigs(this.#defaultConfig, config); + return this.#graph.streamEvents( + state, + { + ...(mergedConfig as Partial< + PregelOptions< + any, + any, + any, + StreamMode | StreamMode[] | undefined, + boolean, + "text/event-stream" + > + >), + version: config?.version ?? "v2", + }, + streamOptions + ); + } /** * @internal */ diff --git a/libs/langchain/src/agents/index.ts b/libs/langchain/src/agents/index.ts index 0614f9755baa..63ae854a8dcd 100644 --- a/libs/langchain/src/agents/index.ts +++ b/libs/langchain/src/agents/index.ts @@ -4,10 +4,7 @@ import type { InteropZodType, } from "@langchain/core/utils/types"; import type { ClientTool, ServerTool } from "@langchain/core/tools"; -import type { - StateDefinitionInit, - StreamTransformer, -} from "@langchain/langgraph"; +import type { StateDefinitionInit } from "@langchain/langgraph"; import type { ResponseFormatUndefined } from "./responses.js"; import type { @@ -180,9 +177,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -193,7 +187,6 @@ export function createAgent< responseFormat: InteropZodType; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -201,8 +194,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -218,9 +210,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< ExtractZodArrayTypes extends Record @@ -233,7 +222,6 @@ export function createAgent< responseFormat: StructuredResponseFormat; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -243,8 +231,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -259,9 +246,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< Record, @@ -272,7 +256,6 @@ export function createAgent< responseFormat: JsonSchemaFormat; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -280,8 +263,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -296,9 +278,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< Record, @@ -309,7 +288,6 @@ export function createAgent< responseFormat: JsonSchemaFormat[]; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -317,8 +295,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -333,9 +310,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< Record, @@ -346,7 +320,6 @@ export function createAgent< responseFormat: JsonSchemaFormat | JsonSchemaFormat[]; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -354,8 +327,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -370,9 +342,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< Record, @@ -383,7 +352,6 @@ export function createAgent< responseFormat: SerializableSchema; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -391,8 +359,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -407,9 +374,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< Record, @@ -420,7 +384,6 @@ export function createAgent< responseFormat: SerializableSchema[]; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -428,8 +391,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -445,9 +407,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -458,7 +417,6 @@ export function createAgent< responseFormat: TypedToolStrategy; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -466,8 +424,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -483,9 +440,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -496,7 +450,6 @@ export function createAgent< responseFormat: ToolStrategy; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -504,8 +457,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -521,9 +473,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -534,7 +483,6 @@ export function createAgent< responseFormat: ProviderStrategy; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -542,8 +490,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -558,9 +505,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: Omit< CreateAgentParams< @@ -570,19 +514,14 @@ export function createAgent< never >, "responseFormat" - > & { - middleware?: TMiddleware; - tools?: TTools; - streamTransformers?: TStreamTransformers; - } + > & { middleware?: TMiddleware; tools?: TTools } ): ReactAgent< AgentTypeConfig< ResponseFormatUndefined, TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -597,9 +536,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: Omit< CreateAgentParams< @@ -613,7 +549,6 @@ export function createAgent< responseFormat?: undefined; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -621,8 +556,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -638,9 +572,6 @@ export function createAgent< | ClientTool | ServerTool )[], - const TStreamTransformers extends ReadonlyArray< - () => StreamTransformer - > = readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -651,7 +582,6 @@ export function createAgent< responseFormat: ResponseFormat; middleware?: TMiddleware; tools?: TTools; - streamTransformers?: TStreamTransformers; } ): ReactAgent< AgentTypeConfig< @@ -659,8 +589,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > >; @@ -674,8 +603,6 @@ export function createAgent< | ClientTool | ServerTool )[], - TStreamTransformers extends ReadonlyArray<() => StreamTransformer> = - readonly [], >( params: CreateAgentParams< StructuredResponseFormat, @@ -689,8 +616,7 @@ export function createAgent< TStateSchema, ContextSchema, TMiddleware, - CombineTools, - TStreamTransformers + CombineTools > > { return new ReactAgent(params); @@ -716,5 +642,3 @@ export { MIDDLEWARE_BRAND } from "./middleware/types.js"; export type * from "./middleware/types.js"; export { FakeToolCallingModel } from "./tests/utils.js"; export type { ReactAgent } from "./ReactAgent.js"; -export { createToolCallTransformer } from "./stream.js"; -export type { AgentRunStream, ToolCallStreamUnion } from "./stream.js"; diff --git a/libs/langchain/src/agents/stream.ts b/libs/langchain/src/agents/stream.ts deleted file mode 100644 index 0d06833e28e4..000000000000 --- a/libs/langchain/src/agents/stream.ts +++ /dev/null @@ -1,325 +0,0 @@ -/* oxlint-disable @typescript-eslint/no-explicit-any */ - -/** - * Agent-level streaming support (experimental). - * - * Provides native stream transformer factories for tool calls and - * middleware events. When marked `__native: true`, their projections - * are assigned directly onto the `GraphRunStream` instance by - * `createGraphRunStream` in langgraph-core — no subclass or wrapper - * needed. - * - * See protocol proposal §15 (In-Process Streaming Interface) and §16 - * (Native Stream Transformers). - */ - -import { - GraphRunStream, - StreamChannel, - type NativeStreamTransformer, - type ProtocolEvent, - type StreamTransformer, - type ToolCallStream, - type ToolCallStatus, - type ToolsEventData, - type Namespace, -} from "@langchain/langgraph"; -import type { - ClientTool, - ServerTool, - DynamicStructuredTool, - StructuredToolInterface, -} from "@langchain/core/tools"; - -/** - * Infers the merged extensions shape from a tuple of stream transformer - * factories. Mirrors `InferExtensions` from `@langchain/langgraph`, which - * is not exported from the package's public surface. - * - * Given `[() => StreamTransformer<{ a: number }>, () => StreamTransformer<{ b: string }>]`, - * produces `{ a: number } & { b: string }`. - */ -export type InferStreamExtensions< - T extends ReadonlyArray<() => StreamTransformer>, -> = T extends readonly [] - ? Record - : T extends readonly [ - () => StreamTransformer, - ...infer Rest extends ReadonlyArray<() => StreamTransformer>, - ] - ? P & InferStreamExtensions - : Record; - -/** Extract the literal `name` string from a tool type. */ -type ToolNameOf = T extends { name: infer N extends string } ? N : string; - -/** Extract the parsed input type from a tool type. */ -type ToolInputOf = - T extends DynamicStructuredTool - ? SchemaInputT - : T extends StructuredToolInterface - ? SchemaInputT - : unknown; - -/** Extract the return/output type from a tool type. */ -type ToolOutputOf = - T extends DynamicStructuredTool - ? ToolOutputT - : T extends StructuredToolInterface - ? ToolOutputT - : unknown; - -/** - * Discriminated union of {@link ToolCallStream} variants, one per tool - * in `TTools`. Enables TypeScript to narrow `.input` and `.output` - * when the consumer checks `call.name === "someToolName"`. - * - * Falls back to `ToolCallStream` (untyped) when the tools tuple is a - * plain `(ClientTool | ServerTool)[]` without literal name types. - */ -export type ToolCallStreamUnion< - TTools extends readonly (ClientTool | ServerTool)[], -> = { - [K in keyof TTools]: ToolCallStream< - ToolNameOf, - ToolInputOf, - ToolOutputOf - >; -}[number]; - -/** - * A {@link GraphRunStream} with native agent-level projections assigned - * directly on the instance by `createGraphRunStream` (via `__native` - * transformers). - * - * This is a pure type overlay — no runtime subclass exists. Use the - * `AgentRunStream` type when you need to describe the return type of - * `streamEvents(..., { version: "v3" })`. - * - * @typeParam TValues - Shape of the graph's state values. - * @typeParam TTools - Tuple of tools registered on the agent, used to type - * the per-tool `toolCalls` discriminated union. - * @typeParam TMiddleware - Tuple of middleware registered on the agent, used - * to type the per-middleware `middleware` event union. - * @typeParam TExtensions - Shape of `run.extensions` produced by user-supplied - * stream transformer factories. Derived via - * `InferExtensions`. - */ -export type AgentRunStream< - TValues = Record, - TTools extends readonly (ClientTool | ServerTool)[] = readonly ( - | ClientTool - | ServerTool - )[], - TExtensions extends Record = Record, -> = GraphRunStream & { - /** Tool call streams from the native ToolCallTransformer. */ - toolCalls: AsyncIterable>; -}; - -interface ToolCallProjection { - toolCalls: AsyncIterable; -} - -/** - * Returns true when `ns` belongs to the agent's own graph — i.e. it - * starts with `path` and is at most one level deeper (the agent's - * internal nodes like `tools`, `model_request`, etc.). - * - * Events from subagent subgraphs (two or more levels deeper) are - * excluded, so `run.toolCalls` / `run.middleware` only show events - * from the agent itself, not from its subagents. - */ -function isOwnEvent(ns: Namespace, path: Namespace): boolean { - if (ns.length < path.length || ns.length > path.length + 1) return false; - for (let i = 0; i < path.length; i += 1) { - if (ns[i] !== path[i]) return false; - } - return true; -} - -function isHeadlessToolInterruptError( - message: string, - toolCallId: string | undefined -): boolean { - try { - const parsed = JSON.parse(message) as unknown; - if (!Array.isArray(parsed)) return false; - return parsed.some((entry) => { - if (entry == null || typeof entry !== "object") return false; - const value = (entry as { value?: unknown }).value; - if (value == null || typeof value !== "object") return false; - const payload = value as { - type?: unknown; - toolCall?: { id?: unknown }; - }; - return ( - payload.type === "tool" && - (toolCallId == null || - payload.toolCall?.id == null || - payload.toolCall.id === toolCallId) - ); - }); - } catch { - return false; - } -} - -/** - * Creates a native transformer that correlates `tools` channel events - * into per-call {@link ToolCallStream} objects. - * - * Marked `__native: true` — projection keys land directly on the - * `GraphRunStream` instance as `run.toolCalls`. - */ -export function createToolCallTransformer( - path: Namespace -): () => NativeStreamTransformer { - return () => { - const toolCallsLog = StreamChannel.local(); - - const pendingCalls = new Map< - string, - { - resolveOutput: (v: unknown) => void; - rejectOutput: (e: unknown) => void; - resolveStatus: (v: ToolCallStatus) => void; - resolveError: (v: string | undefined) => void; - } - >(); - - function createToolCallEntry( - callId: string, - name: string, - rawInput: unknown - ): void { - if (pendingCalls.has(callId)) return; - const input = - typeof rawInput === "string" ? JSON.parse(rawInput) : rawInput; - - let resolveOutput!: (v: unknown) => void; - let rejectOutput!: (e: unknown) => void; - let resolveStatus!: (v: ToolCallStatus) => void; - let resolveError!: (v: string | undefined) => void; - - const output = new Promise((res, rej) => { - resolveOutput = res; - rejectOutput = rej; - }); - const status = new Promise((res) => { - resolveStatus = res; - }); - const error = new Promise((res) => { - resolveError = res; - }); - - pendingCalls.set(callId, { - resolveOutput, - rejectOutput, - resolveStatus, - resolveError, - }); - - toolCallsLog.push({ - name, - callId, - input, - output, - status, - error, - } as ToolCallStream); - } - - return { - __native: true as const, - - init: () => ({ - toolCalls: toolCallsLog, - }), - - process(event: ProtocolEvent): boolean { - /** - * Only process events that are at the same depth as the agent's graph. - */ - if (!isOwnEvent(event.params.namespace, path)) return true; - - if (event.method === "messages") { - const data = event.params.data as Record; - if (data.event === "content-block-finish") { - const cb = (data.contentBlock ?? data.content_block) as - | Record - | undefined; - if (cb?.type === "tool_call") { - createToolCallEntry( - String(cb.id ?? ""), - String(cb.name ?? ""), - cb.args ?? cb.input - ); - } - } - } - - if (event.method === "tools") { - const data = event.params.data as ToolsEventData; - const toolCallId = (data as Record) - .tool_call_id as string; - - if (data.event === "tool-started") { - createToolCallEntry( - toolCallId, - ((data as Record).tool_name as string) ?? - "unknown", - (data as Record).input - ); - } - - const pending = toolCallId ? pendingCalls.get(toolCallId) : undefined; - - if (pending) { - if (data.event === "tool-finished") { - pending.resolveOutput((data as Record).output); - pending.resolveStatus("finished"); - pending.resolveError(undefined); - pendingCalls.delete(toolCallId); - } else if (data.event === "tool-error") { - const message = - ((data as Record).message as string) ?? - "unknown error"; - if (isHeadlessToolInterruptError(message, toolCallId)) { - return true; - } - pending.rejectOutput(new Error(message)); - pending.resolveStatus("error"); - pending.resolveError(message); - pendingCalls.delete(toolCallId); - } - } - } - - return true; - }, - - finalize(): void { - for (const pending of pendingCalls.values()) { - pending.resolveStatus("finished"); - pending.resolveError(undefined); - pending.resolveOutput(undefined); - } - pendingCalls.clear(); - toolCallsLog.close(); - }, - - fail(err: unknown): void { - for (const pending of pendingCalls.values()) { - pending.resolveStatus("error"); - pending.resolveError( - err instanceof Error ? err.message : String(err) - ); - pending.rejectOutput(err); - } - pendingCalls.clear(); - toolCallsLog.fail(err); - }, - }; - }; -} diff --git a/libs/langchain/src/agents/tests/stream.int.test.ts b/libs/langchain/src/agents/tests/stream.int.test.ts deleted file mode 100644 index 0ffb9c540b5e..000000000000 --- a/libs/langchain/src/agents/tests/stream.int.test.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { z } from "zod/v3"; -import { describe, it, expect, beforeAll, afterAll } from "vitest"; -import { - createEmbedServer, - type ThreadSaver, -} from "@langchain/langgraph-api/experimental/embed"; -import { Hono } from "hono"; -import { cors } from "hono/cors"; -import { serve } from "@hono/node-server"; -import type { Pregel } from "@langchain/langgraph"; -import { MemorySaver } from "@langchain/langgraph-checkpoint"; -import { fakeModel } from "@langchain/core/testing"; -import { tool } from "@langchain/core/tools"; -import { AIMessage } from "@langchain/core/messages"; -import { Client } from "@langchain/langgraph-sdk"; - -import { createAgent } from "../index.js"; - -const threads: ThreadSaver = (() => { - const THREADS: Record< - string, - { thread_id: string; metadata: Record } - > = {}; - - return { - get: async (id) => THREADS[id], - set: async (threadId, { metadata }) => { - THREADS[threadId] = { - thread_id: threadId, - metadata: { ...THREADS[threadId]?.metadata, ...metadata }, - }; - return THREADS[threadId]; - }, - delete: async (threadId) => { - delete THREADS[threadId]; - }, - }; -})(); - -const checkpointer = new MemorySaver(); -const addTool = tool( - (input: { a: number; b: number }) => `The sum is ${input.a + input.b}`, - { - name: "add", - description: "Adds two numbers", - schema: z.object({ a: z.number(), b: z.number() }), - } -); - -const minusTool = tool( - (input: { a: number; b: number }) => `The difference is ${input.a - input.b}`, - { - name: "minus", - description: "Subtracts two numbers", - schema: z.object({ a: z.number(), b: z.number() }), - } -); - -const model = fakeModel() - .respondWithTools([ - { name: "add", args: { a: 3, b: 4 }, id: "call_1" }, - { name: "minus", args: { a: 3, b: 4 }, id: "call_2" }, - ]) - .respond(new AIMessage("The answer is 7 and the difference is 1.")); - -const agent = createAgent({ - model, - tools: [addTool, minusTool], - // oxlint-disable-next-line typescript/no-explicit-any -}) as unknown as Pregel; - -let httpServer: { close: () => void } | null = null; -let url: string | null = null; - -async function setup() { - const embedApp = createEmbedServer({ - graph: { agent }, - checkpointer, - threads, - }); - const app = new Hono(); - app.use("*", cors({ origin: "*", exposeHeaders: ["Content-Location"] })); - app.route("/", embedApp); - - await new Promise((resolve) => { - httpServer = serve({ fetch: app.fetch, port: 0 }, (info) => { - url = `http://localhost:${info.port}`; - console.log(`Mock server started at ${url}`); - resolve(); - }); - }); -} - -const ALL_CHANNELS = [ - "lifecycle", - "messages", - "tools", - "values", - "updates", - "custom", - "tasks", -] as const; - -async function collectAllEvents( - // oxlint-disable-next-line typescript/no-explicit-any - iterable: AsyncIterable -): Promise> { - const byChannel = new Map(); - for await (const event of iterable) { - const channel: string = event.method ?? "unknown"; - let list = byChannel.get(channel); - if (!list) { - list = []; - byChannel.set(channel, list); - } - list.push(event); - - if (channel === "lifecycle" && event.params?.namespace?.length === 0) { - const status = event.params?.data?.event; - if ( - status === "completed" || - status === "failed" || - status === "interrupted" - ) { - break; - } - } - } - return byChannel; -} - -beforeAll(setup); - -describe("streamEvents", () => { - it("should emit stream events for each tool invocation", async () => { - console.log("url", url); - const client = new Client({ apiUrl: url! }); - - const thread = await client.threads.create(); - const run = await client.threads.stream(thread.thread_id, { - assistantId: "agent", - }); - const subscription = await run.subscribe({ channels: [...ALL_CHANNELS] }); - - await run.run.start({ - input: { - messages: [{ role: "human", content: "What is 3+4 and 3-4?" }], - }, - config: { - configurable: { thread_id: thread.thread_id }, - }, - }); - - const eventsByChannel = await collectAllEvents(subscription); - await run.close(); - - // --- helpers to extract event data from protocol envelopes --- - // oxlint-disable-next-line typescript/no-explicit-any - const dataOf = (evt: any) => evt.params?.data; - // oxlint-disable-next-line typescript/no-explicit-any - const nodeOf = (evt: any) => evt.params?.node; - - // --- lifecycle: running → 2 tool spawns → completed --- - const lifecycle = eventsByChannel.get("lifecycle") ?? []; - expect(lifecycle.length).toBe(4); - expect(dataOf(lifecycle[0])).toMatchObject({ - event: "running", - graph_name: "agent", - }); - expect(dataOf(lifecycle[1])).toMatchObject({ - event: "spawned", - graph_name: "tools", - }); - expect(dataOf(lifecycle[2])).toMatchObject({ - event: "spawned", - graph_name: "tools", - }); - expect(dataOf(lifecycle[3])).toMatchObject({ - event: "completed", - graph_name: "agent", - }); - - // --- tools: started/finished for both add and minus --- - const tools = eventsByChannel.get("tools") ?? []; - expect(tools.length).toBe(4); - expect(dataOf(tools[0])).toMatchObject({ - event: "tool-started", - tool_call_id: "call_1", - tool_name: "add", - }); - expect(dataOf(tools[1])).toMatchObject({ - event: "tool-started", - tool_call_id: "call_2", - tool_name: "minus", - }); - expect(dataOf(tools[2])).toMatchObject({ - event: "tool-finished", - tool_call_id: "call_1", - output: expect.objectContaining({ - content: "The sum is 7", - name: "add", - }), - }); - expect(dataOf(tools[3])).toMatchObject({ - event: "tool-finished", - tool_call_id: "call_2", - output: expect.objectContaining({ - content: "The difference is -1", - name: "minus", - }), - }); - - // --- updates: verify node execution order and key state transitions --- - const updates = eventsByChannel.get("updates") ?? []; - expect(updates.length).toBe(8); - const updateNodes = updates.map(nodeOf); - expect(updateNodes).toEqual([ - "model_request", - "tools", - "tools", - "model_request", - ]); - - // first model_request produced tool calls - const firstModelUpdate = dataOf(updates[1]); - expect(firstModelUpdate.messages).toHaveLength(1); - expect(firstModelUpdate.messages[0].type).toBe("ai"); - expect(firstModelUpdate.messages[0].tool_calls).toEqual( - expect.arrayContaining([ - expect.objectContaining({ name: "add", id: "call_1" }), - expect.objectContaining({ name: "minus", id: "call_2" }), - ]) - ); - - // tool updates carry the correct results - expect(dataOf(updates[3]).messages[0]).toMatchObject({ - type: "tool", - content: "The sum is 7", - name: "add", - tool_call_id: "call_1", - }); - expect(dataOf(updates[4]).messages[0]).toMatchObject({ - type: "tool", - content: "The difference is -1", - name: "minus", - tool_call_id: "call_2", - }); - - // --- values: 8 state snapshots --- - const values = eventsByChannel.get("values") ?? []; - expect(values.length).toBe(8); - - // --- checkpoints: 9 checkpoint events --- - const checkpoints = eventsByChannel.get("checkpoints") ?? []; - expect(checkpoints.length).toBe(9); - - // --- tasks: 16 task events --- - const tasks = eventsByChannel.get("tasks") ?? []; - expect(tasks.length).toBe(16); - - // --- debug: 25 debug events --- - const debug = eventsByChannel.get("debug") ?? []; - expect(debug.length).toBe(25); - }); -}); - -afterAll(() => { - if (httpServer) { - httpServer.close(); - } -}); diff --git a/libs/langchain/src/agents/tests/stream.test-d.ts b/libs/langchain/src/agents/tests/stream.test-d.ts deleted file mode 100644 index bdaca4684266..000000000000 --- a/libs/langchain/src/agents/tests/stream.test-d.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { describe, it, expectTypeOf } from "vitest"; -import { z } from "zod/v3"; -import { AIMessage, HumanMessage } from "@langchain/core/messages"; -import { tool } from "@langchain/core/tools"; -import { fakeModel } from "@langchain/core/testing"; -import { StreamChannel, type StreamTransformer } from "@langchain/langgraph"; - -import { createAgent } from "../index.js"; - -describe("streamEvents types", () => { - it("should type tool calls as a discriminated union", async () => { - const addTool = tool( - (input: { a: number; b: number }) => `The sum is ${input.a + input.b}`, - { - name: "add", - description: "Adds two numbers", - schema: z.object({ a: z.number(), b: z.number() }), - } - ); - - const minusTool = tool( - (input: { a: number; b: number }) => - `The difference is ${input.a - input.b}`, - { - name: "minus", - description: "Subtracts two numbers", - schema: z.object({ a: z.number(), b: z.number() }), - } - ); - - const model = fakeModel() - .respondWithTools([ - { name: "add", args: { a: 3, b: 4 }, id: "call_1" }, - { name: "minus", args: { a: 3, b: 4 }, id: "call_2" }, - ]) - .respond(new AIMessage("The answer is 7.")); - - const agent = createAgent({ model, tools: [addTool, minusTool] }); - const run = await agent.streamEvents( - { - messages: [new HumanMessage("What is 3 + 4?")], - }, - { version: "v3" } - ); - - for await (const call of run.toolCalls) { - expectTypeOf(call.name).toEqualTypeOf<"add" | "minus">(); - expectTypeOf(call.status).toEqualTypeOf< - Promise<"running" | "finished" | "error"> - >(); - if (call.name === "add") { - expectTypeOf(call.input).toEqualTypeOf<{ a: number; b: number }>(); - expectTypeOf(call.output).toEqualTypeOf>(); - } else if (call.name === "minus") { - expectTypeOf(call.input).toEqualTypeOf<{ a: number; b: number }>(); - expectTypeOf(call.output).toEqualTypeOf>(); - } - } - }); - - it("should type run.extensions from streamTransformers registered at creation time", async () => { - const model = fakeModel().respond(new AIMessage("ok")); - - const eventCounter = (): StreamTransformer<{ - eventCount: StreamChannel; - }> => { - const eventCount = StreamChannel.remote("eventCount"); - return { - init: () => ({ eventCount }), - process() { - return true; - }, - }; - }; - - const methodTracker = (): StreamTransformer<{ - methods: StreamChannel; - }> => { - const methods = StreamChannel.remote("methods"); - return { - init: () => ({ methods }), - process() { - return true; - }, - }; - }; - - const agent = createAgent({ - model, - tools: [], - streamTransformers: [eventCounter, methodTracker], - }); - - const run = await agent.streamEvents( - { - messages: [new HumanMessage("hi")], - }, - { version: "v3" } - ); - - expectTypeOf(run.extensions.eventCount).toEqualTypeOf< - StreamChannel - >(); - expectTypeOf(run.extensions.methods).toEqualTypeOf>(); - }); -}); diff --git a/libs/langchain/src/agents/tests/stream.test.ts b/libs/langchain/src/agents/tests/stream.test.ts deleted file mode 100644 index f30f1b1fe49c..000000000000 --- a/libs/langchain/src/agents/tests/stream.test.ts +++ /dev/null @@ -1,389 +0,0 @@ -import { describe, it, expect } from "vitest"; -import { z } from "zod/v3"; -import { AIMessage, HumanMessage } from "@langchain/core/messages"; -import { tool } from "@langchain/core/tools"; -import { fakeModel } from "@langchain/core/testing"; -import { - StreamChannel, - type ProtocolEvent, - type StreamTransformer, -} from "@langchain/langgraph"; -import { MemorySaver } from "@langchain/langgraph-checkpoint"; - -import { createAgent } from "../index.js"; -import { humanInTheLoopMiddleware } from "../middleware/hitl.js"; -import { createToolCallTransformer } from "../stream.js"; - -describe("streamEvents", () => { - it("should emit tool call streams for each tool invocation", async () => { - const addTool = tool( - (input: { a: number; b: number }) => `The sum is ${input.a + input.b}`, - { - name: "add", - description: "Adds two numbers", - schema: z.object({ a: z.number(), b: z.number() }), - } - ); - - const minusTool = tool( - (input: { a: number; b: number }) => - `The difference is ${input.a - input.b}`, - { - name: "minus", - description: "Subtracts two numbers", - schema: z.object({ a: z.number(), b: z.number() }), - } - ); - - const model = fakeModel() - .respondWithTools([ - { name: "add", args: { a: 3, b: 4 }, id: "call_1" }, - { name: "minus", args: { a: 3, b: 4 }, id: "call_2" }, - ]) - .respond(new AIMessage("The answer is 7.")); - - const agent = createAgent({ model, tools: [addTool, minusTool] }); - const run = await agent.streamEvents( - { - messages: [new HumanMessage("What is 3 + 4?")], - }, - { version: "v3" } - ); - - const toolCalls: Array<{ - name: string; - callId: string; - input: unknown; - output: unknown; - status: string; - }> = []; - - for await (const call of run.toolCalls) { - toolCalls.push({ - name: call.name, - callId: call.callId, - input: call.input, - output: await call.output, - status: await call.status, - }); - } - - expect(toolCalls).toHaveLength(2); - expect(toolCalls[0].name).toBe("add"); - expect(toolCalls[0].callId).toBe("call_1"); - expect(toolCalls[0].status).toBe("finished"); - expect(toolCalls[0].input).toEqual({ a: 3, b: 4 }); - expect(toolCalls[0].output).toHaveProperty("content", "The sum is 7"); - }); - - it("should stream messages alongside tool calls", async () => { - const searchTool = tool( - (input: { query: string }) => `Results for: ${input.query}`, - { - name: "search", - description: "Search the web", - schema: z.object({ query: z.string() }), - } - ); - - const model = fakeModel() - .respondWithTools([ - { name: "search", args: { query: "weather" }, id: "call_s1" }, - ]) - .respond(new AIMessage("The weather is sunny.")); - - const agent = createAgent({ model, tools: [searchTool] }); - const run = await agent.streamEvents( - { - messages: [new HumanMessage("Search for weather")], - }, - { version: "v3" } - ); - - const [toolCallResults, finalState] = await Promise.all([ - (async () => { - const calls: string[] = []; - for await (const call of run.toolCalls) { - calls.push(call.name); - await call.output; - } - return calls; - })(), - run.output, - ]); - - expect(toolCallResults).toContain("search"); - expect(finalState).toBeDefined(); - expect(finalState.messages.length).toBeGreaterThanOrEqual(3); - }); - - it("should resolve output with the final agent state", async () => { - const model = fakeModel().respond(new AIMessage("hi there")); - const agent = createAgent({ model, tools: [] }); - const run = await agent.streamEvents( - { - messages: [new HumanMessage("hi")], - }, - { version: "v3" } - ); - - const state = await run.output; - - expect(state).toBeDefined(); - expect(state.messages).toBeDefined(); - expect(state.messages.length).toBeGreaterThanOrEqual(2); - }); - - it("should pass user-defined streamTransformers registered at creation time", async () => { - const model = fakeModel().respond(new AIMessage("ok")); - - const eventCounter = (): StreamTransformer<{ - eventCount: StreamChannel; - }> => { - const eventCount = StreamChannel.remote("eventCount"); - let count = 0; - - return { - init: () => ({ eventCount }), - process() { - count += 1; - eventCount.push(count); - return true; - }, - }; - }; - - const agent = createAgent({ - model, - tools: [], - streamTransformers: [eventCounter], - }); - - const run = await agent.streamEvents( - { - messages: [new HumanMessage("hi")], - }, - { version: "v3" } - ); - - const counts: number[] = []; - for await (const c of run.extensions.eventCount as AsyncIterable) { - counts.push(c); - } - - expect(counts.length).toBeGreaterThan(0); - expect(counts[counts.length - 1]).toBe(counts.length); - }); - - it("should pass call-site transformers via streamEvents config", async () => { - const model = fakeModel().respond(new AIMessage("ok")); - const agent = createAgent({ model, tools: [] }); - - const methodTracker = (): StreamTransformer<{ - methods: StreamChannel; - }> => { - const methods = StreamChannel.remote("methods"); - return { - init: () => ({ methods }), - process(event) { - methods.push(event.method); - return true; - }, - }; - }; - - const run = await agent.streamEvents( - { messages: [new HumanMessage("hi")] }, - { version: "v3", transformers: [methodTracker] } - ); - - const seenMethods: string[] = []; - for await (const m of run.extensions.methods as AsyncIterable) { - seenMethods.push(m); - } - - expect(seenMethods.length).toBeGreaterThan(0); - expect(seenMethods).toContain("values"); - }); - - it("should handle multiple tool calls in a single turn", async () => { - const addTool = tool( - (input: { a: number; b: number }) => `${input.a + input.b}`, - { - name: "add", - description: "Adds two numbers", - schema: z.object({ a: z.number(), b: z.number() }), - } - ); - - const model = fakeModel() - .respondWithTools([ - { name: "add", args: { a: 1, b: 2 }, id: "call_a" }, - { name: "add", args: { a: 3, b: 4 }, id: "call_b" }, - ]) - .respond(new AIMessage("Done: 3 and 7")); - - const agent = createAgent({ model, tools: [addTool] }); - const run = await agent.streamEvents( - { - messages: [new HumanMessage("Add 1+2 and 3+4")], - }, - { version: "v3" } - ); - - const toolCalls: Array<{ name: string; callId: string; output: unknown }> = - []; - - for await (const call of run.toolCalls) { - toolCalls.push({ - name: call.name, - callId: call.callId, - output: await call.output, - }); - } - - expect(toolCalls).toHaveLength(2); - const ids = toolCalls.map((c) => c.callId).sort(); - expect(ids).toEqual(["call_a", "call_b"]); - }); - - it("should expose interrupted flag when HITL middleware triggers an interrupt", async () => { - const writeFileTool = tool( - (input: { filename: string; content: string }) => - `Wrote ${input.content.length} chars to ${input.filename}`, - { - name: "write_file", - description: "Write content to a file", - schema: z.object({ - filename: z.string(), - content: z.string(), - }), - } - ); - - const hitl = humanInTheLoopMiddleware({ - interruptOn: { - write_file: { allowedDecisions: ["approve"] }, - }, - }); - - const model = fakeModel() - .respondWithTools([ - { - name: "write_file", - args: { filename: "test.txt", content: "hello" }, - id: "call_w1", - }, - ]) - .respond(new AIMessage("Done writing.")); - - const checkpointer = new MemorySaver(); - const agent = createAgent({ - model, - tools: [writeFileTool], - middleware: [hitl], - checkpointer, - }); - - const config = { configurable: { thread_id: "hitl-stream-test" } }; - - const run = await agent.streamEvents( - { messages: [new HumanMessage("Write hello to test.txt")] }, - { ...config, version: "v3" } - ); - - const state = await run.output; - expect(state).toBeDefined(); - expect(run.interrupted).toBe(true); - expect(run.interrupts.length).toBeGreaterThanOrEqual(1); - expect(run.interrupts).toEqual([ - expect.objectContaining({ - payload: { - actionRequests: [ - { - args: { content: "hello", filename: "test.txt" }, - description: expect.stringContaining("write_file"), - name: "write_file", - }, - ], - reviewConfigs: [ - { - actionName: "write_file", - allowedDecisions: ["approve"], - }, - ], - }, - }), - ]); - }); - - it("should keep tool call streams pending across headless tool interrupts", async () => { - const transformer = createToolCallTransformer([])(); - const projection = transformer.init(); - const toolEvent = (data: Record): ProtocolEvent => - ({ - method: "tools", - params: { - namespace: ["tools:abc"], - data, - }, - }) as ProtocolEvent; - - transformer.process( - toolEvent({ - event: "tool-started", - tool_call_id: "call_1", - tool_name: "memory_list", - input: '{"limit":100}', - }) - ); - - const iterator = projection.toolCalls[Symbol.asyncIterator](); - const pendingCall = await iterator.next(); - - transformer.process( - toolEvent({ - event: "tool-error", - tool_call_id: "call_1", - message: JSON.stringify([ - { - id: "interrupt_1", - value: { - type: "tool", - toolCall: { - id: "call_1", - name: "memory_list", - args: { limit: 100 }, - }, - }, - }, - ]), - }) - ); - - transformer.process( - toolEvent({ - event: "tool-started", - tool_call_id: "call_1", - tool_name: "memory_list", - input: '{"limit":100}', - }) - ); - - transformer.process( - toolEvent({ - event: "tool-finished", - tool_call_id: "call_1", - output: { count: 1 }, - }) - ); - - transformer.finalize?.(); - - expect(pendingCall.done).toBe(false); - expect(pendingCall.value.callId).toBe("call_1"); - expect(await pendingCall.value.status).toBe("finished"); - expect(await pendingCall.value.output).toEqual({ count: 1 }); - expect(await iterator.next()).toEqual({ done: true, value: undefined }); - }); -}); diff --git a/libs/langchain/src/agents/types.ts b/libs/langchain/src/agents/types.ts index cccabebd03b5..5f23acbac371 100644 --- a/libs/langchain/src/agents/types.ts +++ b/libs/langchain/src/agents/types.ts @@ -8,7 +8,6 @@ import type { END, StateGraph, StateDefinitionInit, - StreamTransformer, } from "@langchain/langgraph"; import type { @@ -67,11 +66,6 @@ import type { JumpToTarget } from "./constants.js"; * @typeParam TTools - The combined tools type from both `createAgent` tools parameter * and middleware tools. This is a readonly array of `ClientTool | ServerTool`. * - * @typeParam TStreamTransformers - The tuple of user-supplied stream transformer - * factories registered at `createAgent({ streamTransformers })`. Used to type - * `run.extensions` on the stream returned from - * `streamEvents(..., { version: "v3" })`. - * * @example * ```typescript * // Define a type configuration @@ -80,8 +74,7 @@ import type { JumpToTarget } from "./constants.js"; * typeof MyStateSchema, // State schema * typeof MyContextSchema, // Context schema * typeof myMiddleware, // Middleware array - * typeof myTools, // Tools array - * typeof myStreamTransformers // Stream transformer factories + * typeof myTools // Tools array * >; * * // Use with ReactAgent @@ -103,8 +96,6 @@ export interface AgentTypeConfig< | ClientTool | ServerTool )[], - TStreamTransformers extends ReadonlyArray<() => StreamTransformer> = - ReadonlyArray<() => StreamTransformer>, > { /** The structured response type when using `responseFormat` */ Response: TResponse; @@ -116,13 +107,6 @@ export interface AgentTypeConfig< Middleware: TMiddleware; /** The combined tools type from agent and middleware */ Tools: TTools; - /** - * The tuple of stream transformer factories registered at - * `createAgent({ streamTransformers })`. Used to infer the shape of - * `run.extensions` on the stream returned by - * `streamEvents(..., { version: "v3" })`. - */ - StreamTransformers: TStreamTransformers; } /** @@ -135,7 +119,6 @@ export interface DefaultAgentTypeConfig extends AgentTypeConfig { Context: AnyAnnotationRoot; Middleware: readonly AgentMiddleware[]; Tools: readonly (ClientTool | ServerTool)[]; - StreamTransformers: readonly []; } /** @@ -388,25 +371,6 @@ export type InferAgentMiddleware = InferAgentType; */ export type InferAgentTools = InferAgentType; -/** - * Shorthand helper to extract the StreamTransformers type (the tuple of - * transformer factories) from an AgentTypeConfig or ReactAgent. - * - * @example - * ```typescript - * const agent = createAgent({ - * streamTransformers: [costTracker, methodTracker], - * // ... - * }); - * type STF = InferAgentStreamTransformers; - * // readonly [typeof costTracker, typeof methodTracker] - * ``` - */ -export type InferAgentStreamTransformers = InferAgentType< - T, - "StreamTransformers" ->; - export type N = typeof START | "model_request" | "tools"; /** @@ -841,43 +805,6 @@ export type CreateAgentParams< * @default `"v2"` */ version?: "v1" | "v2"; - - /** - * Stream transformer factories baked into the compiled graph. These run - * automatically for every `streamEvents(..., { version: "v3" })` call, after the built-in - * agent transformers (tool calls, middleware) and before any call-site - * transformers passed via - * `streamEvents(input, { version: "v3", transformers })`. - * - * Use this to add domain-specific streaming projections that should always - * be available on the agent's run stream. The projection values are - * accessible via `run.extensions`. - * - * @example - * ```typescript - * import { StreamChannel } from "@langchain/langgraph"; - * - * const costTracker = () => ({ - * init: () => ({ cost: StreamChannel.remote("cost") }), - * process(event) { - * // track token costs... - * return true; - * }, - * }); - * - * const agent = createAgent({ - * model: "openai:gpt-4o", - * tools: [myTool], - * streamTransformers: [costTracker], - * }); - * - * const run = await agent.streamEvents({ messages }, { version: "v3" }); - * for await (const c of run.extensions.cost) { - * console.log("cost delta:", c); - * } - * ``` - */ - streamTransformers?: ReadonlyArray<() => StreamTransformer>; }; /** diff --git a/libs/langchain/src/load/import_map.ts b/libs/langchain/src/load/import_map.ts index 2e02a169f4c0..8d1bdad8b1f0 100644 --- a/libs/langchain/src/load/import_map.ts +++ b/libs/langchain/src/load/import_map.ts @@ -7,7 +7,6 @@ export * as load__serializable from "../load/serializable.js"; export * as storage__encoder_backed from "../storage/encoder_backed.js"; export * as storage__file_system from "../storage/file_system.js"; export * as storage__in_memory from "../storage/in_memory.js"; -export * as tools from "../tools/index.js"; import { PromptTemplate, AIMessagePromptTemplate, From e9af44f5fb759e8a6703cb5b6ed1c0af9ccc1293 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 15:29:28 -0700 Subject: [PATCH 37/39] update pnpm-lock --- pnpm-lock.yaml | 629 +------------------------------------------------ 1 file changed, 3 insertions(+), 626 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c6447a0889f7..ee5355248d35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -589,8 +589,8 @@ importers: libs/langchain: dependencies: '@langchain/langgraph': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004 - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) + specifier: ^1.2.9 + version: 1.2.9(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) '@langchain/langgraph-checkpoint': specifier: ^1.0.1 version: 1.0.1(@langchain/core@libs+langchain-core) @@ -601,9 +601,6 @@ importers: specifier: ^3.25.76 || ^4 version: 4.3.6 devDependencies: - '@hono/node-server': - specifier: '>=1.19.10' - version: 2.0.0(hono@4.12.14) '@langchain/anthropic': specifier: workspace:* version: link:../providers/langchain-anthropic @@ -613,12 +610,6 @@ importers: '@langchain/fireworks': specifier: workspace:* version: link:../providers/langchain-fireworks - '@langchain/langgraph-api': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004 - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0)) - '@langchain/langgraph-sdk': - specifier: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004 - version: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@langchain/openai': specifier: workspace:* version: link:../providers/langchain-openai @@ -652,9 +643,6 @@ importers: dpdm: specifier: ^3.14.0 version: 3.15.1 - hono: - specifier: '>=4.12.7' - version: 4.12.14 openai: specifier: ^6.22.0 version: 6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6) @@ -2624,10 +2612,6 @@ packages: peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -3230,11 +3214,6 @@ packages: resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} - '@commander-js/extra-typings@13.1.0': - resolution: {integrity: sha512-q5P52BYb1hwVWE6dtID7VvuJWrlfbCv4klj7BjUUOqMz4jbSZD4C9fJ9lRjL2jnBGTg+gDDlaXN51rkWcLk4fg==} - peerDependencies: - commander: ~13.1.0 - '@conventional-changelog/git-client@2.7.0': resolution: {integrity: sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==} engines: {node: '>=18'} @@ -3652,20 +3631,6 @@ packages: peerDependencies: hono: '>=4.12.7' - '@hono/node-ws@1.3.0': - resolution: {integrity: sha512-ju25YbbvLuXdqBCmLZLqnNYu1nbHIQjoyUqA8ApZOeL1k4skuiTcw5SW77/5SUYo2Xi2NVBJoVlfQurnKEp03Q==} - engines: {node: '>=18.14.1'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - peerDependencies: - '@hono/node-server': '>=1.19.10' - hono: '>=4.12.7' - - '@hono/zod-validator@0.7.6': - resolution: {integrity: sha512-Io1B6d011Gj1KknV4rXYz4le5+5EubcWEU/speUjuw9XMMIaP3n78yXLhjd2A3PXaXaUwEAluOiAyLqhBEJgsw==} - peerDependencies: - hono: '>=4.12.7' - zod: ^3.25.0 || ^4.0.0 - '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} @@ -4066,20 +4031,6 @@ packages: peerDependencies: apache-arrow: '>=15.0.0 <=18.1.0' - '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004} - version: 1.1.17 - engines: {node: ^18.19.0 || >=20.16.0} - peerDependencies: - '@langchain/core': workspace:^ - '@langchain/langgraph': ^0.2.57 || ^0.3.0 || ^0.4.0 || ^1.0.0-alpha || ^1.0.0 - '@langchain/langgraph-checkpoint': ~0.0.16 || ^0.1.0 || ~1.0.0 - '@langchain/langgraph-sdk': ^1.6.5 - typescript: ^5.5.4 - peerDependenciesMeta: - '@langchain/langgraph-sdk': - optional: true - '@langchain/langgraph-checkpoint@0.1.1': resolution: {integrity: sha512-h2bP0RUikQZu0Um1ZUPErQLXyhzroJqKRbRcxYRTAh49oNlsfeq4A3K4YEDRbGGuyPZI/Jiqwhks1wZwY73AZw==} engines: {node: '>=18'} @@ -4092,13 +4043,6 @@ packages: peerDependencies: '@langchain/core': workspace:^ - '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@9c3a00400d74dceef95b19911fae1cb37d801959': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@9c3a00400d74dceef95b19911fae1cb37d801959} - version: 1.0.1 - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': workspace:^ - '@langchain/langgraph-sdk@0.1.10': resolution: {integrity: sha512-9srSCb2bSvcvehMgjA2sMMwX0o1VUgPN6ghwm5Fwc9JGAKsQa6n1S4eCwy1h4abuYxwajH5n3spBw+4I2WYbgw==} peerDependencies: @@ -4133,48 +4077,6 @@ packages: vue: optional: true - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004} - version: 1.8.10 - peerDependencies: - react: ^18 || ^19 - react-dom: ^18 || ^19 - svelte: ^4.0.0 || ^5.0.0 - vue: ^3.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - svelte: - optional: true - vue: - optional: true - - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a00400d74dceef95b19911fae1cb37d801959': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a00400d74dceef95b19911fae1cb37d801959} - version: 1.8.10 - peerDependencies: - react: ^18 || ^19 - react-dom: ^18 || ^19 - svelte: ^4.0.0 || ^5.0.0 - vue: ^3.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - svelte: - optional: true - vue: - optional: true - - '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@9c3a00400d74dceef95b19911fae1cb37d801959': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@9c3a00400d74dceef95b19911fae1cb37d801959} - version: 1.1.17 - engines: {node: ^18.19.0 || >=20.16.0} - hasBin: true - '@langchain/langgraph@1.0.0-alpha.5': resolution: {integrity: sha512-Sg0LZ/zb0osMT+2/poTRH6GbmzSYxPVzZPXikjryCFMCw52HGbq0sLEXFsaqfs+1HCcDs1Ob6IPw8IucE5pM9Q==} engines: {node: '>=18'} @@ -4197,27 +4099,12 @@ packages: zod-to-json-schema: optional: true - '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004': - resolution: {tarball: https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004} - version: 1.2.9 - engines: {node: '>=18'} - peerDependencies: - '@langchain/core': workspace:^ - zod: ^3.25.32 || ^4.2.0 - zod-to-json-schema: ^3.x - peerDependenciesMeta: - zod-to-json-schema: - optional: true - '@langchain/openai@0.4.9': resolution: {integrity: sha512-NAsaionRHNdqaMjVLPkFCyjUDze+OqRHghA1Cn4fPoAafz+FXcl9c7LlEl9Xo0FH6/8yiCl7Rw2t780C/SBVxQ==} engines: {node: '>=18'} peerDependencies: '@langchain/core': workspace:^ - '@langchain/protocol@0.0.15': - resolution: {integrity: sha512-MllvbpMjqHevUm+v94M422mH7XKN+wGCvJRBVROTWBotEDOATYB4Ktk2UheYP859y9o2LlhtPek5t1T9eyfAbQ==} - '@layerup/layerup-security@1.6.0': resolution: {integrity: sha512-HSBZobDxgi0aHrEoN49RwLSbv60614upoE+noAR/nlysp8K1H1mu9EBw2cY5YTk6XbmEqEjddu9dMPb71NABMA==} @@ -5559,94 +5446,6 @@ packages: '@swc/types@0.1.26': resolution: {integrity: sha512-lyMwd7WGgG79RS7EERZV3T8wMdmPq3xwyg+1nmAM64kIhx5yl+juO2PYIHb7vTiPgPCj8LYjsNV2T5wiQHUEaw==} - '@tailwindcss/node@4.2.4': - resolution: {integrity: sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==} - - '@tailwindcss/oxide-android-arm64@4.2.4': - resolution: {integrity: sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [android] - - '@tailwindcss/oxide-darwin-arm64@4.2.4': - resolution: {integrity: sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - '@tailwindcss/oxide-darwin-x64@4.2.4': - resolution: {integrity: sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - '@tailwindcss/oxide-freebsd-x64@4.2.4': - resolution: {integrity: sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [freebsd] - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': - resolution: {integrity: sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==} - engines: {node: '>= 20'} - cpu: [arm] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': - resolution: {integrity: sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': - resolution: {integrity: sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': - resolution: {integrity: sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-linux-x64-musl@4.2.4': - resolution: {integrity: sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - - '@tailwindcss/oxide-wasm32-wasi@4.2.4': - resolution: {integrity: sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - bundledDependencies: - - '@napi-rs/wasm-runtime' - - '@emnapi/core' - - '@emnapi/runtime' - - '@tybys/wasm-util' - - '@emnapi/wasi-threads' - - tslib - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': - resolution: {integrity: sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [win32] - - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': - resolution: {integrity: sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [win32] - - '@tailwindcss/oxide@4.2.4': - resolution: {integrity: sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==} - engines: {node: '>= 20'} - - '@tailwindcss/postcss@4.2.4': - resolution: {integrity: sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==} - '@tensorflow/tfjs-backend-cpu@4.22.0': resolution: {integrity: sha512-1u0FmuLGuRAi8D2c3cocHTASGXOmHc/4OvoVDENJayjYkS119fcTcQf4iHrtLthWyDIPy3JiPhRrZQC9EwnhLw==} engines: {yarn: '>= 1.3.2'} @@ -5988,11 +5787,6 @@ packages: resolution: {integrity: sha512-CmajHI25HpVWE9R1XFoxr+cphJPxoYD3eFioQtAvXYkMFKnLdICMS9pXre9Pybizb75ejRxjKD5/CVG055rEIg==} hasBin: true - '@typescript/vfs@1.6.4': - resolution: {integrity: sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ==} - peerDependencies: - typescript: '*' - '@typespec/ts-http-runtime@0.3.5': resolution: {integrity: sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==} engines: {node: '>=20.0.0'} @@ -6412,13 +6206,6 @@ packages: atomically@2.1.1: resolution: {integrity: sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==} - autoprefixer@10.5.0: - resolution: {integrity: sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -6988,10 +6775,6 @@ packages: colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - colors@1.4.0: - resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} - engines: {node: '>=0.1.90'} - combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -7013,10 +6796,6 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} - commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} - commander@14.0.3: resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} @@ -7116,10 +6895,6 @@ packages: resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} - copy-anything@4.0.5: - resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} - engines: {node: '>=18'} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -7160,11 +6935,6 @@ packages: resolution: {integrity: sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==} engines: {node: '>= 6'} - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -7439,10 +7209,6 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.20.1: - resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} - engines: {node: '>=10.13.0'} - enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -7499,9 +7265,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - esbuild-plugin-tailwindcss@2.2.0: - resolution: {integrity: sha512-xzLRHuDZfbDAld+PlQkY028juyfMrYaMRsB4yLfvF3hKBna/cq3bWAHNKz2WQ2YbwbYwYh3B33N1oqBUoX7aww==} - esbuild@0.28.0: resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} @@ -7640,10 +7403,6 @@ packages: resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} engines: {node: ^18.19.0 || >=20.5.0} - exit-hook@4.0.0: - resolution: {integrity: sha512-Fqs7ChZm72y40wKjOFXBKg7nJZvQJmewP5/7LtePDdnah/+FH9Hp5sgMujSCMPXlxOAW2//1jrW9pnsY7o20vQ==} - engines: {node: '>=18'} - exit-x@0.2.2: resolution: {integrity: sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==} engines: {node: '>= 0.8.0'} @@ -7873,9 +7632,6 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -7942,9 +7698,6 @@ packages: generate-function@2.3.1: resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - generic-names@4.0.0: - resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} - generic-pool@3.9.0: resolution: {integrity: sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g==} engines: {node: '>= 4'} @@ -8250,12 +8003,6 @@ packages: resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} - icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -8442,10 +8189,6 @@ packages: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} - is-what@5.5.0: - resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} - engines: {node: '>=18'} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -8930,10 +8673,6 @@ packages: resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} engines: {node: '>=13.2.0'} - loader-utils@3.3.1: - resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} - engines: {node: '>= 12.13.0'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -9978,42 +9717,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules@6.0.1: - resolution: {integrity: sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ==} - peerDependencies: - postcss: ^8.0.0 - - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.10: resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} engines: {node: ^10 || ^12 || >=14} @@ -10678,10 +10381,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - stacktrace-parser@0.1.11: - resolution: {integrity: sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==} - engines: {node: '>=6'} - standard-as-callback@2.1.0: resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==} @@ -10716,9 +10415,6 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - string-hash@1.1.3: - resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} - string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -10804,10 +10500,6 @@ packages: stubs@3.0.0: resolution: {integrity: sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==} - superjson@2.2.6: - resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} - engines: {node: '>=16'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -10832,13 +10524,6 @@ packages: resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} engines: {node: '>=20'} - tailwindcss@4.2.4: - resolution: {integrity: sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==} - - tapable@2.3.3: - resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} - engines: {node: '>=6'} - tar-fs@2.1.4: resolution: {integrity: sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==} @@ -11102,10 +10787,6 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} - type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} @@ -11619,9 +11300,6 @@ packages: resolution: {integrity: sha512-1lOb3qdzw6OFmOzoY0nauhLG72TpWtb5qgYPiSh/62rjc1XidBSDio2qw0pwHh17VINF217ebIkZJdFLZFn9SA==} engines: {node: '>=18'} - winston-console-format@1.0.8: - resolution: {integrity: sha512-dq7t/E0D0QRi4XIOwu6HM1+5e//WPqylH88GVjKEhQVrzGFg34MCz+G7pMJcXFBen9C0kBsu5GYgbYsE2LDwKw==} - winston-transport@4.9.0: resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==} engines: {node: '>= 12.0.0'} @@ -11922,8 +11600,6 @@ snapshots: zod: 4.3.6 optional: true - '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -13330,10 +13006,6 @@ snapshots: '@colors/colors@1.6.0': {} - '@commander-js/extra-typings@13.1.0(commander@13.1.0)': - dependencies: - commander: 13.1.0 - '@conventional-changelog/git-client@2.7.0(conventional-commits-filter@5.0.0)(conventional-commits-parser@6.4.0)': dependencies: '@simple-libs/child-process-utils': 1.0.2 @@ -13789,20 +13461,6 @@ snapshots: dependencies: hono: 4.12.14 - '@hono/node-ws@1.3.0(@hono/node-server@2.0.0(hono@4.12.14))(bufferutil@4.1.0)(hono@4.12.14)': - dependencies: - '@hono/node-server': 2.0.0(hono@4.12.14) - hono: 4.12.14 - ws: 8.20.0(bufferutil@4.1.0) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@hono/zod-validator@0.7.6(hono@4.12.14)(zod@4.3.6)': - dependencies: - hono: 4.12.14 - zod: 4.3.6 - '@humanfs/core@0.19.2': dependencies: '@humanfs/types': 0.15.0 @@ -14271,47 +13929,6 @@ snapshots: '@lancedb/lancedb-win32-arm64-msvc': 0.27.2 '@lancedb/lancedb-win32-x64-msvc': 0.27.2 - '@langchain/langgraph-api@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-api@9c3a004(@langchain/core@libs+langchain-core)(@langchain/langgraph-checkpoint@1.0.1(@langchain/core@libs+langchain-core))(@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5))(@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6))(@opentelemetry/api@1.9.1)(bufferutil@4.1.0)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(typescript@5.8.3)(ws@8.20.0(bufferutil@4.1.0))': - dependencies: - '@babel/code-frame': 7.29.0 - '@hono/node-server': 2.0.0(hono@4.12.14) - '@hono/node-ws': 1.3.0(@hono/node-server@2.0.0(hono@4.12.14))(bufferutil@4.1.0)(hono@4.12.14) - '@hono/zod-validator': 0.7.6(hono@4.12.14)(zod@4.3.6) - '@langchain/core': link:libs/langchain-core - '@langchain/langgraph': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6) - '@langchain/langgraph-checkpoint': 1.0.1(@langchain/core@libs+langchain-core) - '@langchain/langgraph-ui': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@9c3a00400d74dceef95b19911fae1cb37d801959 - '@langchain/protocol': 0.0.15 - '@types/json-schema': 7.0.15 - '@typescript/vfs': 1.6.4(typescript@5.8.3) - dedent: 1.7.2 - dotenv: 16.6.1 - exit-hook: 4.0.0 - hono: 4.12.14 - langsmith: 0.5.21(@opentelemetry/api@1.9.1)(openai@6.34.0(ws@8.20.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.20.0(bufferutil@4.1.0)) - open: 10.2.0 - semver: 7.7.4 - stacktrace-parser: 0.1.11 - superjson: 2.2.6 - tsx: 4.21.0 - typescript: 5.8.3 - uuid: 10.0.0 - winston: 3.19.0 - winston-console-format: 1.0.8 - zod: 4.3.6 - optionalDependencies: - '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - transitivePeerDependencies: - - '@opentelemetry/api' - - '@opentelemetry/exporter-trace-otlp-proto' - - '@opentelemetry/sdk-trace-base' - - babel-plugin-macros - - bufferutil - - openai - - supports-color - - utf-8-validate - - ws - '@langchain/langgraph-checkpoint@0.1.1(@langchain/core@libs+langchain-core)': dependencies: '@langchain/core': link:libs/langchain-core @@ -14322,11 +13939,6 @@ snapshots: '@langchain/core': link:libs/langchain-core uuid: 10.0.0 - '@langchain/langgraph-checkpoint@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@9c3a00400d74dceef95b19911fae1cb37d801959(@langchain/core@libs+langchain-core)': - dependencies: - '@langchain/core': link:libs/langchain-core - uuid: 10.0.0 - '@langchain/langgraph-sdk@0.1.10(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@types/json-schema': 7.0.15 @@ -14349,38 +13961,6 @@ snapshots: react: 19.2.5 react-dom: 19.2.5(react@19.2.5) - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a004(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@langchain/core': link:libs/langchain-core - '@langchain/protocol': 0.0.15 - '@types/json-schema': 7.0.15 - p-queue: 9.1.2 - p-retry: 7.1.1 - uuid: 13.0.0 - optionalDependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - - '@langchain/langgraph-sdk@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a00400d74dceef95b19911fae1cb37d801959(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@langchain/core': link:libs/langchain-core - '@langchain/protocol': 0.0.15 - '@types/json-schema': 7.0.15 - p-queue: 9.1.2 - p-retry: 7.1.1 - uuid: 13.0.0 - optionalDependencies: - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - - '@langchain/langgraph-ui@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-ui@9c3a00400d74dceef95b19911fae1cb37d801959': - dependencies: - '@commander-js/extra-typings': 13.1.0(commander@13.1.0) - commander: 13.1.0 - esbuild: 0.28.0 - esbuild-plugin-tailwindcss: 2.2.0 - zod: 4.3.6 - '@langchain/langgraph@1.0.0-alpha.5(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': dependencies: '@langchain/core': link:libs/langchain-core @@ -14410,23 +13990,6 @@ snapshots: - svelte - vue - '@langchain/langgraph@https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph@9c3a004(@langchain/core@libs+langchain-core)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)(zod-to-json-schema@3.25.2(zod@4.3.6))(zod@4.3.6)': - dependencies: - '@langchain/core': link:libs/langchain-core - '@langchain/langgraph-checkpoint': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-checkpoint@9c3a00400d74dceef95b19911fae1cb37d801959(@langchain/core@libs+langchain-core) - '@langchain/langgraph-sdk': https://pkg.pr.new/langchain-ai/langgraphjs/@langchain/langgraph-sdk@9c3a00400d74dceef95b19911fae1cb37d801959(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@langchain/protocol': 0.0.15 - '@standard-schema/spec': 1.1.0 - uuid: 10.0.0 - zod: 4.3.6 - optionalDependencies: - zod-to-json-schema: 3.25.2(zod@4.3.6) - transitivePeerDependencies: - - react - - react-dom - - svelte - - vue - '@langchain/openai@0.4.9(@langchain/core@libs+langchain-core)(encoding@0.1.13)(ws@8.20.0(bufferutil@4.1.0))': dependencies: '@langchain/core': link:libs/langchain-core @@ -14438,8 +14001,6 @@ snapshots: - encoding - ws - '@langchain/protocol@0.0.15': {} - '@layerup/layerup-security@1.6.0(encoding@0.1.13)(ws@5.2.4(bufferutil@4.1.0))(zod@4.3.6)': dependencies: axios: 1.15.2(debug@4.4.3) @@ -15707,75 +15268,6 @@ snapshots: dependencies: '@swc/counter': 0.1.3 - '@tailwindcss/node@4.2.4': - dependencies: - '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.20.1 - jiti: 2.6.1 - lightningcss: 1.32.0 - magic-string: 0.30.21 - source-map-js: 1.2.1 - tailwindcss: 4.2.4 - - '@tailwindcss/oxide-android-arm64@4.2.4': - optional: true - - '@tailwindcss/oxide-darwin-arm64@4.2.4': - optional: true - - '@tailwindcss/oxide-darwin-x64@4.2.4': - optional: true - - '@tailwindcss/oxide-freebsd-x64@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-arm64-gnu@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-arm64-musl@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-x64-gnu@4.2.4': - optional: true - - '@tailwindcss/oxide-linux-x64-musl@4.2.4': - optional: true - - '@tailwindcss/oxide-wasm32-wasi@4.2.4': - optional: true - - '@tailwindcss/oxide-win32-arm64-msvc@4.2.4': - optional: true - - '@tailwindcss/oxide-win32-x64-msvc@4.2.4': - optional: true - - '@tailwindcss/oxide@4.2.4': - optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-arm64': 4.2.4 - '@tailwindcss/oxide-darwin-x64': 4.2.4 - '@tailwindcss/oxide-freebsd-x64': 4.2.4 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.4 - '@tailwindcss/oxide-linux-arm64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-arm64-musl': 4.2.4 - '@tailwindcss/oxide-linux-x64-gnu': 4.2.4 - '@tailwindcss/oxide-linux-x64-musl': 4.2.4 - '@tailwindcss/oxide-wasm32-wasi': 4.2.4 - '@tailwindcss/oxide-win32-arm64-msvc': 4.2.4 - '@tailwindcss/oxide-win32-x64-msvc': 4.2.4 - - '@tailwindcss/postcss@4.2.4': - dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.2.4 - '@tailwindcss/oxide': 4.2.4 - postcss: 8.5.10 - tailwindcss: 4.2.4 - '@tensorflow/tfjs-backend-cpu@4.22.0(@tensorflow/tfjs-core@4.22.0(encoding@0.1.13))': dependencies: '@tensorflow/tfjs-core': 4.22.0(encoding@0.1.13) @@ -16150,13 +15642,6 @@ snapshots: '@typescript/native-preview-win32-arm64': 7.0.0-dev.20260421.2 '@typescript/native-preview-win32-x64': 7.0.0-dev.20260421.2 - '@typescript/vfs@1.6.4(typescript@5.8.3)': - dependencies: - debug: 4.4.3 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typespec/ts-http-runtime@0.3.5': dependencies: http-proxy-agent: 7.0.2 @@ -16629,15 +16114,6 @@ snapshots: stubborn-fs: 2.0.0 when-exit: 2.1.5 - autoprefixer@10.5.0(postcss@8.5.10): - dependencies: - browserslist: 4.28.2 - caniuse-lite: 1.0.30001788 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.10 - postcss-value-parser: 4.2.0 - available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -17299,8 +16775,6 @@ snapshots: colorette@2.0.20: {} - colors@1.4.0: {} - combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -17321,8 +16795,6 @@ snapshots: commander@10.0.1: {} - commander@13.1.0: {} - commander@14.0.3: {} commander@9.5.0: {} @@ -17410,10 +16882,6 @@ snapshots: cookie@0.7.2: {} - copy-anything@4.0.5: - dependencies: - is-what: 5.5.0 - core-util-is@1.0.3: {} cors@2.8.6: @@ -17464,8 +16932,6 @@ snapshots: css-what@6.2.2: {} - cssesc@3.0.0: {} - csstype@3.2.3: {} data-uri-to-buffer@4.0.1: {} @@ -17708,11 +17174,6 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.20.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.3 - enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -17757,13 +17218,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.3 - esbuild-plugin-tailwindcss@2.2.0: - dependencies: - '@tailwindcss/postcss': 4.2.4 - autoprefixer: 10.5.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-modules: 6.0.1(postcss@8.5.10) - esbuild@0.28.0: optionalDependencies: '@esbuild/aix-ppc64': 0.28.0 @@ -17976,8 +17430,6 @@ snapshots: strip-final-newline: 4.0.0 yoctocolors: 2.1.2 - exit-hook@4.0.0: {} - exit-x@0.2.2: {} expand-template@2.0.3: {} @@ -18247,8 +17699,6 @@ snapshots: forwarded@0.2.0: {} - fraction.js@5.3.4: {} - fresh@2.0.0: {} fs-constants@1.0.0: {} @@ -18341,10 +17791,6 @@ snapshots: dependencies: is-property: 1.0.2 - generic-names@4.0.0: - dependencies: - loader-utils: 3.3.1 - generic-pool@3.9.0: {} gensync@1.0.0-beta.2: {} @@ -18734,10 +18180,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - ieee754@1.2.1: {} ignore@5.3.2: {} @@ -18883,8 +18325,6 @@ snapshots: is-unicode-supported@2.1.0: {} - is-what@5.5.0: {} - is-windows@1.0.2: {} is-wsl@2.2.0: @@ -19506,6 +18946,7 @@ snapshots: lightningcss-linux-x64-musl: 1.32.0 lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 + optional: true limiter@1.1.5: {} @@ -19531,8 +18972,6 @@ snapshots: load-esm@1.0.3: {} - loader-utils@3.3.1: {} - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -20689,46 +20128,6 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-modules-extract-imports@3.1.0(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - - postcss-modules-local-by-default@4.2.0(postcss@8.5.10): - dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 - postcss-selector-parser: 7.1.1 - postcss-value-parser: 4.2.0 - - postcss-modules-scope@3.2.1(postcss@8.5.10): - dependencies: - postcss: 8.5.10 - postcss-selector-parser: 7.1.1 - - postcss-modules-values@4.0.0(postcss@8.5.10): - dependencies: - icss-utils: 5.1.0(postcss@8.5.10) - postcss: 8.5.10 - - postcss-modules@6.0.1(postcss@8.5.10): - dependencies: - generic-names: 4.0.0 - icss-utils: 5.1.0(postcss@8.5.10) - lodash.camelcase: 4.3.0 - postcss: 8.5.10 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.10) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.10) - postcss-modules-scope: 3.2.1(postcss@8.5.10) - postcss-modules-values: 4.0.0(postcss@8.5.10) - string-hash: 1.1.3 - - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-value-parser@4.2.0: {} - postcss@8.5.10: dependencies: nanoid: 3.3.11 @@ -21550,10 +20949,6 @@ snapshots: stackback@0.0.2: {} - stacktrace-parser@0.1.11: - dependencies: - type-fest: 0.7.1 - standard-as-callback@2.1.0: {} statuses@2.0.2: {} @@ -21585,8 +20980,6 @@ snapshots: string-argv@0.3.2: {} - string-hash@1.1.3: {} - string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -21666,10 +21059,6 @@ snapshots: stubs@3.0.0: optional: true - superjson@2.2.6: - dependencies: - copy-anything: 4.0.5 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -21691,10 +21080,6 @@ snapshots: tagged-tag@1.0.0: {} - tailwindcss@4.2.4: {} - - tapable@2.3.3: {} - tar-fs@2.1.4: dependencies: chownr: 1.1.4 @@ -22081,8 +21466,6 @@ snapshots: type-fest@0.21.3: {} - type-fest@0.7.1: {} - type-fest@2.19.0: {} type-fest@4.41.0: {} @@ -22642,12 +22025,6 @@ snapshots: dependencies: execa: 8.0.1 - winston-console-format@1.0.8: - dependencies: - colors: 1.4.0 - logform: 2.7.0 - triple-beam: 1.4.1 - winston-transport@4.9.0: dependencies: logform: 2.7.0 From 37fc0103b21290758fbb0c96676690154af45b03 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 15:33:40 -0700 Subject: [PATCH 38/39] cr --- libs/langchain/package.json | 11 +++++++++++ libs/langchain/src/load/import_map.ts | 1 + 2 files changed, 12 insertions(+) diff --git a/libs/langchain/package.json b/libs/langchain/package.json index 2d89e5d3ab45..b06017f24d82 100644 --- a/libs/langchain/package.json +++ b/libs/langchain/package.json @@ -206,6 +206,17 @@ "default": "./dist/storage/in_memory.js" } }, + "./tools": { + "input": "./src/tools/index.ts", + "require": { + "types": "./dist/tools/index.d.cts", + "default": "./dist/tools/index.cjs" + }, + "import": { + "types": "./dist/tools/index.d.ts", + "default": "./dist/tools/index.js" + } + }, "./package.json": "./package.json" }, "module": "./dist/index.js" diff --git a/libs/langchain/src/load/import_map.ts b/libs/langchain/src/load/import_map.ts index 8d1bdad8b1f0..2e02a169f4c0 100644 --- a/libs/langchain/src/load/import_map.ts +++ b/libs/langchain/src/load/import_map.ts @@ -7,6 +7,7 @@ export * as load__serializable from "../load/serializable.js"; export * as storage__encoder_backed from "../storage/encoder_backed.js"; export * as storage__file_system from "../storage/file_system.js"; export * as storage__in_memory from "../storage/in_memory.js"; +export * as tools from "../tools/index.js"; import { PromptTemplate, AIMessagePromptTemplate, From a4840ac56c93950c0b85add096c41060cd5f2e64 Mon Sep 17 00:00:00 2001 From: Christian Bromann Date: Fri, 1 May 2026 15:38:55 -0700 Subject: [PATCH 39/39] cr --- libs/langchain-core/src/language_models/compat.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/langchain-core/src/language_models/compat.ts b/libs/langchain-core/src/language_models/compat.ts index 758a730e7ee0..7fd372f2e0a0 100644 --- a/libs/langchain-core/src/language_models/compat.ts +++ b/libs/langchain-core/src/language_models/compat.ts @@ -474,13 +474,13 @@ function contentBlockToDelta(block: ContentBlock): ContentBlockDelta { reasoning: (block as ContentBlock.Reasoning).reasoning, }; } - if (block.type === "thinking" && block.thinking === "string") { + if (block.type === "thinking" && typeof block.thinking === "string") { return { type: "reasoning-delta", reasoning: block.thinking, }; } - if (block.data === "string") { + if (typeof block.data === "string") { return { type: "data-delta", data: block.data,