@langchain/langgraph-sdk 1.9.1 → 1.9.3-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/crons/index.cjs +8 -2
- package/dist/client/crons/index.cjs.map +1 -1
- package/dist/client/crons/index.d.cts +7 -1
- package/dist/client/crons/index.d.cts.map +1 -1
- package/dist/client/crons/index.d.ts +7 -1
- package/dist/client/crons/index.d.ts.map +1 -1
- package/dist/client/crons/index.js +8 -2
- package/dist/client/crons/index.js.map +1 -1
- package/dist/client/stream/index.cjs +103 -14
- package/dist/client/stream/index.cjs.map +1 -1
- package/dist/client/stream/index.d.cts +21 -1
- package/dist/client/stream/index.d.cts.map +1 -1
- package/dist/client/stream/index.d.ts +21 -1
- package/dist/client/stream/index.d.ts.map +1 -1
- package/dist/client/stream/index.js +103 -14
- package/dist/client/stream/index.js.map +1 -1
- package/dist/client/stream/messages.cjs +50 -10
- package/dist/client/stream/messages.cjs.map +1 -1
- package/dist/client/stream/messages.d.cts +4 -0
- package/dist/client/stream/messages.d.cts.map +1 -1
- package/dist/client/stream/messages.d.ts +4 -0
- package/dist/client/stream/messages.d.ts.map +1 -1
- package/dist/client/stream/messages.js +50 -10
- package/dist/client/stream/messages.js.map +1 -1
- package/dist/client/stream/transport.d.cts +12 -0
- package/dist/client/stream/transport.d.cts.map +1 -1
- package/dist/client/stream/transport.d.ts +12 -0
- package/dist/client/stream/transport.d.ts.map +1 -1
- package/dist/stream/assembled-to-message.cjs +10 -6
- package/dist/stream/assembled-to-message.cjs.map +1 -1
- package/dist/stream/assembled-to-message.d.cts.map +1 -1
- package/dist/stream/assembled-to-message.d.ts.map +1 -1
- package/dist/stream/assembled-to-message.js +10 -6
- package/dist/stream/assembled-to-message.js.map +1 -1
- package/dist/stream/controller.cjs +163 -13
- package/dist/stream/controller.cjs.map +1 -1
- package/dist/stream/controller.d.cts.map +1 -1
- package/dist/stream/controller.d.ts.map +1 -1
- package/dist/stream/controller.js +163 -13
- package/dist/stream/controller.js.map +1 -1
- package/dist/stream/discovery/subagents.cjs +31 -0
- package/dist/stream/discovery/subagents.cjs.map +1 -1
- package/dist/stream/discovery/subagents.d.cts.map +1 -1
- package/dist/stream/discovery/subagents.d.ts.map +1 -1
- package/dist/stream/discovery/subagents.js +31 -0
- package/dist/stream/discovery/subagents.js.map +1 -1
- package/dist/stream/message-reconciliation.cjs +11 -1
- package/dist/stream/message-reconciliation.cjs.map +1 -1
- package/dist/stream/message-reconciliation.js +11 -1
- package/dist/stream/message-reconciliation.js.map +1 -1
- package/dist/stream/projections/runtime.cjs +3 -2
- package/dist/stream/projections/runtime.cjs.map +1 -1
- package/dist/stream/projections/runtime.js +3 -2
- package/dist/stream/projections/runtime.js.map +1 -1
- package/dist/stream/root-message-projection.cjs +98 -53
- package/dist/stream/root-message-projection.cjs.map +1 -1
- package/dist/stream/root-message-projection.js +98 -53
- package/dist/stream/root-message-projection.js.map +1 -1
- package/dist/stream/submit-coordinator.cjs +30 -4
- package/dist/stream/submit-coordinator.cjs.map +1 -1
- package/dist/stream/submit-coordinator.js +30 -4
- package/dist/stream/submit-coordinator.js.map +1 -1
- package/dist/ui/manager.cjs +3 -2
- package/dist/ui/manager.cjs.map +1 -1
- package/dist/ui/manager.d.cts.map +1 -1
- package/dist/ui/manager.d.ts.map +1 -1
- package/dist/ui/manager.js +3 -2
- package/dist/ui/manager.js.map +1 -1
- package/package.json +3 -3
|
@@ -379,10 +379,6 @@ function toStreamingMessageHandle(message) {
|
|
|
379
379
|
function cloneBlock(block) {
|
|
380
380
|
return structuredClone(block);
|
|
381
381
|
}
|
|
382
|
-
function ensureBlockIndex(blocks, index, fallback) {
|
|
383
|
-
while (blocks.length <= index) blocks.push(cloneBlock(fallback));
|
|
384
|
-
return blocks[index] ?? (blocks[index] = cloneBlock(fallback));
|
|
385
|
-
}
|
|
386
382
|
function blockFromDelta(delta, current) {
|
|
387
383
|
return coreContentBlockFromDelta(delta, current);
|
|
388
384
|
}
|
|
@@ -431,6 +427,7 @@ function toChatModelStreamEvent(event) {
|
|
|
431
427
|
var MessageAssembler = class {
|
|
432
428
|
activeMessages = /* @__PURE__ */ new Map();
|
|
433
429
|
activeByNamespaceNode = /* @__PURE__ */ new Map();
|
|
430
|
+
blockIndexByProtocolIndexAndType = /* @__PURE__ */ new Map();
|
|
434
431
|
/**
|
|
435
432
|
* Applies a single message event and returns the resulting assembly update.
|
|
436
433
|
*
|
|
@@ -484,6 +481,7 @@ var MessageAssembler = class {
|
|
|
484
481
|
switch (data.event) {
|
|
485
482
|
case "content-block-start":
|
|
486
483
|
message.blocks[data.index] = cloneBlock(data.content);
|
|
484
|
+
this.blockIndexByProtocolIndexAndType.set(blockIndexKey(activeKey, data.index, data.content.type), data.index);
|
|
487
485
|
return {
|
|
488
486
|
kind: "content-block-start",
|
|
489
487
|
key: activeKey,
|
|
@@ -496,32 +494,36 @@ var MessageAssembler = class {
|
|
|
496
494
|
const deltaEvent = data;
|
|
497
495
|
const deltaBlock = deltaEvent.content ?? (deltaEvent.delta != null ? blockFromDelta(deltaEvent.delta, message.blocks[data.index]) : void 0);
|
|
498
496
|
if (deltaBlock == null) throw new Error("Received content-block-delta without content");
|
|
499
|
-
const
|
|
500
|
-
message.blocks[
|
|
497
|
+
const targetIndex = this.resolveBlockIndex(activeKey, message.blocks, data.index, deltaBlock.type);
|
|
498
|
+
const current = message.blocks[targetIndex];
|
|
499
|
+
message.blocks[targetIndex] = deltaEvent.content != null ? current == null ? cloneBlock(deltaEvent.content) : applyContentDelta(current, deltaEvent.content) : applyCoreEventDelta(current, data);
|
|
501
500
|
return {
|
|
502
501
|
kind: "content-block-delta",
|
|
503
502
|
key: activeKey,
|
|
504
503
|
message,
|
|
505
|
-
index:
|
|
504
|
+
index: targetIndex,
|
|
506
505
|
block: deltaBlock,
|
|
507
506
|
event
|
|
508
507
|
};
|
|
509
508
|
}
|
|
510
|
-
case "content-block-finish":
|
|
511
|
-
|
|
509
|
+
case "content-block-finish": {
|
|
510
|
+
const targetIndex = this.resolveFinishBlockIndex(activeKey, data.index, data.content.type);
|
|
511
|
+
message.blocks[targetIndex] = cloneBlock(data.content);
|
|
512
512
|
return {
|
|
513
513
|
kind: "content-block-finish",
|
|
514
514
|
key: activeKey,
|
|
515
515
|
message,
|
|
516
|
-
index:
|
|
516
|
+
index: targetIndex,
|
|
517
517
|
block: data.content,
|
|
518
518
|
event
|
|
519
519
|
};
|
|
520
|
+
}
|
|
520
521
|
case "message-finish":
|
|
521
522
|
message.usage = data.usage;
|
|
522
523
|
message.finishMetadata = data.responseMetadata;
|
|
523
524
|
this.activeMessages.delete(activeKey);
|
|
524
525
|
this.activeByNamespaceNode.delete(namespaceNodeKey);
|
|
526
|
+
this.clearBlockIndexAliases(activeKey);
|
|
525
527
|
return {
|
|
526
528
|
kind: "message-finish",
|
|
527
529
|
key: activeKey,
|
|
@@ -535,6 +537,7 @@ var MessageAssembler = class {
|
|
|
535
537
|
};
|
|
536
538
|
this.activeMessages.delete(activeKey);
|
|
537
539
|
this.activeByNamespaceNode.delete(namespaceNodeKey);
|
|
540
|
+
this.clearBlockIndexAliases(activeKey);
|
|
538
541
|
return {
|
|
539
542
|
kind: "message-error",
|
|
540
543
|
key: activeKey,
|
|
@@ -543,7 +546,44 @@ var MessageAssembler = class {
|
|
|
543
546
|
};
|
|
544
547
|
}
|
|
545
548
|
}
|
|
549
|
+
resolveBlockIndex(activeKey, blocks, protocolIndex, blockType) {
|
|
550
|
+
const current = blocks[protocolIndex];
|
|
551
|
+
if (current == null || current.type === blockType || areCompatibleBlockTypes(current.type, blockType)) {
|
|
552
|
+
this.blockIndexByProtocolIndexAndType.set(blockIndexKey(activeKey, protocolIndex, blockType), protocolIndex);
|
|
553
|
+
return protocolIndex;
|
|
554
|
+
}
|
|
555
|
+
const key = blockIndexKey(activeKey, protocolIndex, blockType);
|
|
556
|
+
const existing = this.blockIndexByProtocolIndexAndType.get(key);
|
|
557
|
+
if (existing != null) return existing;
|
|
558
|
+
const nextIndex = blocks.length;
|
|
559
|
+
this.blockIndexByProtocolIndexAndType.set(key, nextIndex);
|
|
560
|
+
return nextIndex;
|
|
561
|
+
}
|
|
562
|
+
resolveFinishBlockIndex(activeKey, protocolIndex, blockType) {
|
|
563
|
+
const key = blockIndexKey(activeKey, protocolIndex, blockType);
|
|
564
|
+
const existing = this.blockIndexByProtocolIndexAndType.get(key);
|
|
565
|
+
if (existing != null) return existing;
|
|
566
|
+
this.blockIndexByProtocolIndexAndType.set(key, protocolIndex);
|
|
567
|
+
return protocolIndex;
|
|
568
|
+
}
|
|
569
|
+
clearBlockIndexAliases(activeKey) {
|
|
570
|
+
const prefix = `${activeKey}::`;
|
|
571
|
+
for (const key of this.blockIndexByProtocolIndexAndType.keys()) if (key.startsWith(prefix)) this.blockIndexByProtocolIndexAndType.delete(key);
|
|
572
|
+
}
|
|
546
573
|
};
|
|
574
|
+
function blockIndexKey(activeKey, protocolIndex, blockType) {
|
|
575
|
+
return `${activeKey}::${protocolIndex}::${blockType}`;
|
|
576
|
+
}
|
|
577
|
+
function areCompatibleBlockTypes(currentType, nextType) {
|
|
578
|
+
const toolCallTypes = new Set([
|
|
579
|
+
"tool_call",
|
|
580
|
+
"tool_call_chunk",
|
|
581
|
+
"tool_use",
|
|
582
|
+
"input_json_delta"
|
|
583
|
+
]);
|
|
584
|
+
const serverToolCallTypes = new Set(["server_tool_call", "server_tool_call_chunk"]);
|
|
585
|
+
return toolCallTypes.has(currentType) && toolCallTypes.has(nextType) || serverToolCallTypes.has(currentType) && serverToolCallTypes.has(nextType);
|
|
586
|
+
}
|
|
547
587
|
/**
|
|
548
588
|
* Assembles `messages` events into {@link StreamingMessage} instances
|
|
549
589
|
* with live text/reasoning delta streams, matching the in-process
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.cjs","names":["#events","MultiCursorBuffer","#textPromise","#reasoningPromise","#resolveText","#resolveReasoning","#textChunks","#textWaiters","#textDone","#reasoningChunks","#reasoningWaiters","#reasoningDone","#usageIterator","#assembleMessage","AIMessage","#assembler","#activeStreaming"],"sources":["../../../src/client/stream/messages.ts"],"sourcesContent":["import {\n AIMessage,\n type ContentBlock as CoreContentBlock,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type {\n ChatModelStreamEvent,\n ContentBlockDelta as CoreContentBlockDelta,\n} from \"@langchain/core/language_models/event\";\nimport type {\n ContentBlock,\n FinalizedContentBlock,\n MessageMetadata,\n MessagesEvent,\n UsageInfo,\n} from \"@langchain/protocol\";\n\nimport { MultiCursorBuffer } from \"./multi-cursor-buffer.js\";\n\ntype TextContentStream = AsyncIterable<string> &\n PromiseLike<string> & { full: AsyncIterable<string> };\n\ntype UsageMetadataStream = AsyncIterable<UsageMetadata> &\n PromiseLike<UsageMetadata | undefined>;\n\ntype ToolCallsStream = AsyncIterable<CoreContentBlock.Tools.ToolCall> &\n PromiseLike<Array<CoreContentBlock.Tools.ToolCall>> & {\n full: AsyncIterable<Array<CoreContentBlock.Tools.ToolCall>>;\n };\n\nfunction applyCoreContentDelta(\n target: CoreContentBlock,\n delta: CoreContentBlock\n): CoreContentBlock {\n if (target.type !== delta.type) {\n return structuredClone(delta);\n }\n\n switch (delta.type) {\n case \"text\":\n return {\n ...target,\n ...delta,\n text: `${\"text\" in target ? target.text : \"\"}${delta.text}`,\n } as CoreContentBlock;\n case \"reasoning\":\n return {\n ...target,\n ...delta,\n reasoning: `${\"reasoning\" in target ? target.reasoning : \"\"}${delta.reasoning}`,\n } as CoreContentBlock;\n case \"tool_call_chunk\":\n case \"server_tool_call_chunk\": {\n const merged = { ...target, ...delta } as Record<string, unknown>;\n if (delta.id == null && \"id\" in target && target.id != null) {\n merged.id = target.id;\n }\n if (delta.name == null && \"name\" in target && target.name != null) {\n merged.name = target.name;\n }\n merged.args = `${(\"args\" in target ? target.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n return merged as unknown as CoreContentBlock;\n }\n default:\n return { ...target, ...delta } as CoreContentBlock;\n }\n}\n\nfunction coreContentBlockFromDelta(\n delta: CoreContentBlockDelta,\n current?: CoreContentBlock\n): CoreContentBlock {\n switch (delta.type) {\n case \"text-delta\":\n return { type: \"text\", text: delta.text } as CoreContentBlock;\n case \"reasoning-delta\":\n return {\n type: \"reasoning\",\n reasoning: delta.reasoning,\n } as CoreContentBlock;\n case \"data-delta\": {\n const merged = { ...(current ?? {}), data: delta.data } as Record<\n string,\n unknown\n >;\n if (delta.encoding) merged.encoding = delta.encoding;\n return merged as unknown as CoreContentBlock;\n }\n case \"block-delta\":\n return delta.fields as CoreContentBlock;\n }\n}\n\nfunction applyCoreEventDelta(\n current: CoreContentBlock | undefined,\n event: Extract<ChatModelStreamEvent, { event: \"content-block-delta\" }> & {\n content?: CoreContentBlock;\n }\n): CoreContentBlock {\n if (event.content) {\n return current\n ? applyCoreContentDelta(current, event.content)\n : event.content;\n }\n\n switch (event.delta.type) {\n case \"text-delta\":\n if (current?.type === \"text\") {\n return {\n ...current,\n text: `${\"text\" in current ? current.text : \"\"}${event.delta.text}`,\n } as CoreContentBlock;\n }\n return coreContentBlockFromDelta(event.delta, current);\n case \"reasoning-delta\":\n if (current?.type === \"reasoning\") {\n return {\n ...current,\n reasoning: `${\"reasoning\" in current ? current.reasoning : \"\"}${event.delta.reasoning}`,\n } as CoreContentBlock;\n }\n return coreContentBlockFromDelta(event.delta, current);\n case \"data-delta\": {\n const merged = { ...(current ?? {}) } as Record<string, unknown>;\n merged.data = `${(merged.data as string | undefined) ?? \"\"}${event.delta.data}`;\n if (event.delta.encoding) merged.encoding = event.delta.encoding;\n return merged as unknown as CoreContentBlock;\n }\n case \"block-delta\":\n return {\n ...(current ?? {}),\n ...event.delta.fields,\n } as CoreContentBlock;\n }\n}\n\nfunction normalizeUsage(\n usage: UsageInfo | Partial<UsageMetadata> | undefined\n): UsageMetadata | undefined {\n if (!usage) return undefined;\n return {\n ...usage,\n input_tokens: usage.input_tokens ?? 0,\n output_tokens: usage.output_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n };\n}\n\n/**\n * Mutable view of a streamed message as message and content-block events are\n * assembled into a single structure.\n */\nexport interface AssembledMessage {\n id: string;\n namespace: string[];\n blocks: ContentBlock[];\n node?: string;\n usage?: UsageInfo;\n metadata?: MessageMetadata;\n finishMetadata?: Record<string, any>;\n error?: {\n message: string;\n code?: string;\n };\n}\n\n/**\n * Symbol keys for assembler → StreamingMessage communication.\n * Module-private: invisible to external consumers, accessible to\n * {@link StreamingMessageAssembler} within this file.\n */\nconst PUSH_TEXT: unique symbol = Symbol(\"pushText\");\nconst PUSH_REASONING: unique symbol = Symbol(\"pushReasoning\");\nconst PUSH_EVENT: unique symbol = Symbol(\"pushEvent\");\nconst UPDATE_CONTEXT: unique symbol = Symbol(\"updateContext\");\nconst FINISH: unique symbol = Symbol(\"finish\");\nconst ERROR: unique symbol = Symbol(\"error\");\n\n/**\n * Live streaming view of a single message lifecycle, matching the\n * in-process `ChatModelStream` dual-interface pattern.\n *\n * - `text` / `reasoning`: iterate for streaming deltas, or await for\n * the full concatenated string after the message completes.\n * - `usage`: promise that resolves with token usage on message-finish.\n * - `blocks`: the assembled content blocks (updated as deltas arrive).\n *\n * Created by {@link StreamingMessageAssembler} and yielded by\n * the `session.messages` lazy getter.\n */\nexport class StreamingMessage\n implements AsyncIterable<ChatModelStreamEvent>, PromiseLike<AIMessage>\n{\n readonly id: string;\n readonly namespace: string[];\n node: string | undefined;\n readonly metadata: MessageMetadata | undefined;\n readonly assembled: AssembledMessage;\n readonly #events = new MultiCursorBuffer<ChatModelStreamEvent>();\n\n #textChunks: string[] = [];\n #reasoningChunks: string[] = [];\n #textWaiters: Array<() => void> = [];\n #reasoningWaiters: Array<() => void> = [];\n #textDone = false;\n #reasoningDone = false;\n\n #resolveText!: (v: string) => void;\n #resolveReasoning!: (v: string) => void;\n readonly #textPromise: Promise<string>;\n readonly #reasoningPromise: Promise<string>;\n\n constructor(assembled: AssembledMessage) {\n this.id = assembled.id;\n this.assembled = assembled;\n this.namespace = assembled.namespace;\n this.node = assembled.node;\n this.metadata = assembled.metadata;\n this.#textPromise = new Promise<string>((r) => {\n this.#resolveText = r;\n });\n this.#reasoningPromise = new Promise<string>((r) => {\n this.#resolveReasoning = r;\n });\n }\n\n get text(): TextContentStream {\n const chunks = this.#textChunks;\n const waiters = this.#textWaiters;\n const getDone = () => this.#textDone;\n let cursor = 0;\n return {\n [Symbol.asyncIterator]() {\n return {\n async next(): Promise<IteratorResult<string>> {\n while (true) {\n if (cursor < chunks.length) {\n return { done: false, value: chunks[cursor++] };\n }\n if (getDone()) {\n return { done: true, value: undefined };\n }\n await new Promise<void>((resolve) => {\n waiters.push(resolve);\n });\n }\n },\n };\n },\n then: this.#textPromise.then.bind(this.#textPromise),\n full: {\n async *[Symbol.asyncIterator]() {\n let accumulated = \"\";\n for await (const chunk of {\n [Symbol.asyncIterator]: () =>\n ({\n next: async (): Promise<IteratorResult<string>> => {\n while (true) {\n if (cursor < chunks.length) {\n return { done: false, value: chunks[cursor++] };\n }\n if (getDone()) {\n return { done: true, value: undefined };\n }\n await new Promise<void>((resolve) => {\n waiters.push(resolve);\n });\n }\n },\n }) satisfies AsyncIterator<string>,\n }) {\n accumulated += chunk;\n yield accumulated;\n }\n },\n },\n };\n }\n\n get reasoning(): TextContentStream {\n const chunks = this.#reasoningChunks;\n const waiters = this.#reasoningWaiters;\n const getDone = () => this.#reasoningDone;\n let cursor = 0;\n return {\n [Symbol.asyncIterator]() {\n return {\n async next(): Promise<IteratorResult<string>> {\n while (true) {\n if (cursor < chunks.length) {\n return { done: false, value: chunks[cursor++] };\n }\n if (getDone()) {\n return { done: true, value: undefined };\n }\n await new Promise<void>((resolve) => {\n waiters.push(resolve);\n });\n }\n },\n };\n },\n then: this.#reasoningPromise.then.bind(this.#reasoningPromise),\n full: {\n async *[Symbol.asyncIterator]() {\n let accumulated = \"\";\n for await (const chunk of {\n [Symbol.asyncIterator]: () =>\n ({\n next: async (): Promise<IteratorResult<string>> => {\n while (true) {\n if (cursor < chunks.length) {\n return { done: false, value: chunks[cursor++] };\n }\n if (getDone()) {\n return { done: true, value: undefined };\n }\n await new Promise<void>((resolve) => {\n waiters.push(resolve);\n });\n }\n },\n }) satisfies AsyncIterator<string>,\n }) {\n accumulated += chunk;\n yield accumulated;\n }\n },\n },\n };\n }\n\n get usage(): UsageMetadataStream {\n const promise = (async () => {\n let usage: UsageMetadata | undefined;\n for await (const snapshot of this.#usageIterator()) {\n usage = snapshot;\n }\n return usage;\n })();\n return {\n [Symbol.asyncIterator]: () => this.#usageIterator(),\n then: promise.then.bind(promise),\n };\n }\n\n get toolCalls(): ToolCallsStream {\n const events = this.#events;\n const iterator = async function* () {\n for await (const event of events) {\n if (\n event.event === \"content-block-finish\" &&\n event.content.type === \"tool_call\"\n ) {\n yield event.content as CoreContentBlock.Tools.ToolCall;\n }\n }\n };\n return {\n [Symbol.asyncIterator]: iterator,\n then: async (onfulfilled, onrejected) => {\n try {\n const calls: CoreContentBlock.Tools.ToolCall[] = [];\n for await (const call of iterator()) calls.push(call);\n return onfulfilled ? onfulfilled(calls) : (calls as never);\n } catch (err) {\n if (onrejected) return onrejected(err);\n throw err;\n }\n },\n full: {\n async *[Symbol.asyncIterator]() {\n const calls: CoreContentBlock.Tools.ToolCall[] = [];\n for await (const call of iterator()) {\n calls.push(call);\n yield [...calls];\n }\n },\n },\n };\n }\n\n get output(): PromiseLike<AIMessage> {\n return { then: (onf, onr) => this.#assembleMessage().then(onf, onr) };\n }\n\n get blocks(): ContentBlock[] {\n return this.assembled.blocks;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<ChatModelStreamEvent> {\n return this.#events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = AIMessage, TResult2 = never>(\n onfulfilled?:\n | ((value: AIMessage) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n return this.#assembleMessage().then(onfulfilled, onrejected);\n }\n\n async *#usageIterator(): AsyncGenerator<UsageMetadata> {\n for await (const event of this.#events) {\n if (event.event === \"message-start\" && event.usage) {\n yield normalizeUsage(event.usage)!;\n } else if (event.event === \"message-finish\" && event.usage) {\n yield normalizeUsage(event.usage)!;\n }\n }\n }\n\n async #assembleMessage(): Promise<AIMessage> {\n const contentBlocks: Array<CoreContentBlock | undefined> = [];\n let id: string | undefined;\n let usage: UsageMetadata | undefined;\n let metadata: Record<string, unknown> = {};\n let finishReason: string | undefined;\n\n for await (const event of this.#events) {\n switch (event.event) {\n case \"message-start\":\n id = event.id ?? id;\n if (event.usage) usage = normalizeUsage(event.usage);\n break;\n case \"content-block-start\":\n contentBlocks[event.index] = event.content;\n break;\n case \"content-block-delta\": {\n const current = contentBlocks[event.index];\n contentBlocks[event.index] = applyCoreEventDelta(current, event);\n break;\n }\n case \"content-block-finish\":\n contentBlocks[event.index] = event.content;\n break;\n case \"message-finish\":\n finishReason = event.reason;\n if (event.usage) usage = normalizeUsage(event.usage);\n if (event.responseMetadata) {\n metadata = {\n ...metadata,\n ...event.responseMetadata,\n };\n }\n break;\n default:\n break;\n }\n }\n\n return new AIMessage({\n id,\n content: contentBlocks.filter(\n (block): block is CoreContentBlock => block != null\n ),\n usage_metadata: usage,\n response_metadata: {\n ...metadata,\n ...(finishReason ? { finish_reason: finishReason } : {}),\n output_version: \"v1\" as const,\n },\n });\n }\n\n [PUSH_EVENT](event: ChatModelStreamEvent): void {\n this.#events.push(event);\n }\n\n [UPDATE_CONTEXT](event: MessagesEvent): void {\n this.node = event.params.node ?? this.node;\n }\n\n [PUSH_TEXT](delta: string): void {\n this.#textChunks.push(delta);\n // Wake every caught-up iterator so each one advances its own cursor.\n // Iterators re-check `chunks.length` before delivering, which keeps\n // the cursor the single source of truth for what a consumer has seen.\n const pending = this.#textWaiters.splice(0, this.#textWaiters.length);\n for (const waiter of pending) waiter();\n }\n\n [PUSH_REASONING](delta: string): void {\n this.#reasoningChunks.push(delta);\n const pending = this.#reasoningWaiters.splice(\n 0,\n this.#reasoningWaiters.length\n );\n for (const waiter of pending) waiter();\n }\n\n [FINISH](): void {\n this.#textDone = true;\n this.#reasoningDone = true;\n this.#resolveText(this.#textChunks.join(\"\"));\n this.#resolveReasoning(this.#reasoningChunks.join(\"\"));\n const textPending = this.#textWaiters.splice(0, this.#textWaiters.length);\n for (const waiter of textPending) waiter();\n const reasoningPending = this.#reasoningWaiters.splice(\n 0,\n this.#reasoningWaiters.length\n );\n for (const waiter of reasoningPending) waiter();\n this.#events.close();\n }\n\n [ERROR](): void {\n this[FINISH]();\n }\n}\n\n/**\n * Public view yielded by message projections.\n *\n * `StreamingMessage` is PromiseLike so callers can still `await` a message\n * object directly, but TypeScript applies `Awaited<T>` to values produced by\n * `for await`. Exposing a non-thenable view keeps loop variables typed as the\n * streaming handle instead of as the finalized `AIMessage`.\n */\nexport type StreamingMessageHandle = Omit<StreamingMessage, \"then\">;\n\nexport function toStreamingMessageHandle(\n message: StreamingMessage\n): StreamingMessageHandle {\n return new Proxy(message, {\n get(target, prop) {\n if (prop === \"then\") return undefined;\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n has(target, prop) {\n if (prop === \"then\") return false;\n return prop in target;\n },\n }) as StreamingMessageHandle;\n}\n\n/**\n * Emitted by `MessageAssembler.consume()` to describe how a message changed in\n * response to a single protocol event.\n */\nexport type MessageAssemblyUpdate =\n | {\n kind: \"message-start\";\n key: string;\n message: AssembledMessage;\n event: MessagesEvent;\n }\n | {\n kind: \"content-block-start\" | \"content-block-delta\";\n key: string;\n message: AssembledMessage;\n index: number;\n block: ContentBlock;\n event: MessagesEvent;\n }\n | {\n kind: \"content-block-finish\";\n key: string;\n message: AssembledMessage;\n index: number;\n block: FinalizedContentBlock;\n event: MessagesEvent;\n }\n | {\n kind: \"usage\";\n key: string;\n message: AssembledMessage;\n event: MessagesEvent;\n }\n | {\n kind: \"message-finish\";\n key: string;\n message: AssembledMessage;\n event: MessagesEvent;\n }\n | {\n kind: \"message-error\";\n key: string;\n message: AssembledMessage;\n event: MessagesEvent;\n };\n\nfunction cloneBlock<T extends ContentBlock>(block: T): T {\n return structuredClone(block);\n}\n\nfunction ensureBlockIndex(\n blocks: ContentBlock[],\n index: number,\n fallback: ContentBlock\n): ContentBlock {\n while (blocks.length <= index) {\n blocks.push(cloneBlock(fallback));\n }\n return blocks[index] ?? (blocks[index] = cloneBlock(fallback));\n}\n\nfunction blockFromDelta(\n delta: CoreContentBlockDelta,\n current?: ContentBlock\n): ContentBlock {\n return coreContentBlockFromDelta(\n delta,\n current as unknown as CoreContentBlock | undefined\n ) as unknown as ContentBlock;\n}\n\nfunction applyContentDelta(\n target: ContentBlock,\n delta: ContentBlock\n): ContentBlock {\n if (target.type !== delta.type) {\n return cloneBlock(delta);\n }\n\n switch (delta.type) {\n case \"text\":\n return {\n ...target,\n ...delta,\n text: `${\"text\" in target ? target.text : \"\"}${delta.text}`,\n } as ContentBlock;\n case \"reasoning\":\n return {\n ...target,\n ...delta,\n reasoning: `${\"reasoning\" in target ? target.reasoning : \"\"}${delta.reasoning}`,\n } as ContentBlock;\n case \"tool_call_chunk\":\n case \"server_tool_call_chunk\": {\n // Spread target first, then delta — but preserve target's\n // ``id``/``name`` when the delta explicitly sets them to\n // null/undefined. Some providers (notably Anthropic via the\n // langchain-core compat bridge) only attach the tool-call\n // identifiers to the first ``content-block-start`` chunk; every\n // subsequent ``input_json_delta`` chunk carries ``id=null,\n // name=null``. A naive ``{...target, ...delta}`` spread\n // overwrites the captured identifiers with null, which in turn\n // makes downstream consumers (e.g. ``extractToolCallChunks`` in\n // ``assembled-to-message.ts``) drop the chunk on the floor until\n // the final ``content-block-finish`` event promotes it to a\n // finalized ``tool_call`` — causing tool-call cards to appear\n // all-at-once at the end of the turn instead of incrementally.\n const merged = { ...target, ...delta } as Record<string, unknown>;\n if (delta.id == null && \"id\" in target && target.id != null) {\n merged.id = target.id;\n }\n if (delta.name == null && \"name\" in target && target.name != null) {\n merged.name = target.name;\n }\n merged.args = `${(\"args\" in target ? target.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n return merged as unknown as ContentBlock;\n }\n default:\n return {\n ...target,\n ...delta,\n } as ContentBlock;\n }\n}\n\nfunction messageKeyFor(event: MessagesEvent): string {\n const { namespace, node, data } = event.params;\n const namespaceKey = namespace.join(\"/\");\n const messageId = data.event === \"message-start\" ? (data.id ?? \"\") : \"\";\n return `${namespaceKey}::${node ?? \"\"}::${messageId}`;\n}\n\nfunction toChatModelStreamEvent(event: MessagesEvent): ChatModelStreamEvent {\n return event.params.data as unknown as ChatModelStreamEvent;\n}\n\n/**\n * Incrementally assembles `messages` events into complete message objects.\n */\nexport class MessageAssembler {\n private readonly activeMessages = new Map<string, AssembledMessage>();\n private readonly activeByNamespaceNode = new Map<string, string>();\n\n /**\n * Applies a single message event and returns the resulting assembly update.\n *\n * @param event - Incoming `messages` event to fold into the assembler state.\n */\n consume(event: MessagesEvent): MessageAssemblyUpdate {\n const data = event.params.data;\n const namespaceNodeKey = `${event.params.namespace.join(\"/\")}::${event.params.node ?? \"\"}`;\n\n if (data.event === \"message-start\") {\n const key = messageKeyFor(event);\n this.activeByNamespaceNode.set(namespaceNodeKey, key);\n const message: AssembledMessage = {\n id: data.id,\n namespace: [...event.params.namespace],\n node: event.params.node,\n metadata: data.metadata,\n blocks: [],\n };\n this.activeMessages.set(key, message);\n return { kind: \"message-start\", key, message, event };\n }\n\n const activeKey = this.activeByNamespaceNode.get(namespaceNodeKey);\n if (!activeKey) {\n // A continuation event (delta/finish/error) arrived without a\n // prior `message-start`. This can happen on late-attaching\n // subscriptions when the server has already trimmed the\n // `message-start` from its replay buffer. Synthesize a minimal\n // active message so the assembler can still fold subsequent\n // events instead of hard-failing the caller.\n const syntheticKey = `${namespaceNodeKey}::`;\n this.activeByNamespaceNode.set(namespaceNodeKey, syntheticKey);\n const synthetic: AssembledMessage = {\n id: data.id,\n namespace: [...event.params.namespace],\n node: event.params.node,\n blocks: [],\n };\n this.activeMessages.set(syntheticKey, synthetic);\n return this.consume(event);\n }\n\n const message = this.activeMessages.get(activeKey);\n if (!message) {\n throw new Error(`No active message state found for key ${activeKey}`);\n }\n\n if ((data as { event?: string }).event === \"usage\") {\n message.usage = (data as { usage?: UsageInfo }).usage;\n return {\n kind: \"usage\",\n key: activeKey,\n message,\n event,\n };\n }\n\n switch (data.event) {\n case \"content-block-start\": {\n message.blocks[data.index] = cloneBlock(data.content);\n return {\n kind: \"content-block-start\",\n key: activeKey,\n message,\n index: data.index,\n block: data.content,\n event,\n };\n }\n case \"content-block-delta\": {\n const deltaEvent = data as typeof data & {\n content?: ContentBlock;\n delta?: CoreContentBlockDelta;\n };\n const deltaBlock =\n deltaEvent.content ??\n (deltaEvent.delta != null\n ? blockFromDelta(deltaEvent.delta, message.blocks[data.index])\n : undefined);\n if (deltaBlock == null) {\n throw new Error(\"Received content-block-delta without content\");\n }\n const current = ensureBlockIndex(\n message.blocks,\n data.index,\n deltaBlock\n );\n message.blocks[data.index] =\n deltaEvent.content != null\n ? applyContentDelta(current, deltaEvent.content)\n : (applyCoreEventDelta(\n current as unknown as CoreContentBlock,\n data as unknown as Extract<\n ChatModelStreamEvent,\n { event: \"content-block-delta\" }\n >\n ) as unknown as ContentBlock);\n return {\n kind: \"content-block-delta\",\n key: activeKey,\n message,\n index: data.index,\n block: deltaBlock,\n event,\n };\n }\n case \"content-block-finish\": {\n message.blocks[data.index] = cloneBlock(data.content);\n return {\n kind: \"content-block-finish\",\n key: activeKey,\n message,\n index: data.index,\n block: data.content,\n event,\n };\n }\n case \"message-finish\": {\n message.usage = data.usage;\n message.finishMetadata = data.responseMetadata;\n this.activeMessages.delete(activeKey);\n this.activeByNamespaceNode.delete(namespaceNodeKey);\n return {\n kind: \"message-finish\",\n key: activeKey,\n message: structuredClone(message),\n event,\n };\n }\n case \"error\": {\n message.error = { message: data.message, code: data.code };\n this.activeMessages.delete(activeKey);\n this.activeByNamespaceNode.delete(namespaceNodeKey);\n return {\n kind: \"message-error\",\n key: activeKey,\n message: structuredClone(message),\n event,\n };\n }\n }\n }\n}\n\n/**\n * Assembles `messages` events into {@link StreamingMessage} instances\n * with live text/reasoning delta streams, matching the in-process\n * `ChatModelStream` dual-interface pattern.\n */\nexport class StreamingMessageAssembler {\n readonly #assembler = new MessageAssembler();\n readonly #activeStreaming = new Map<string, StreamingMessage>();\n\n /**\n * Folds a single event and returns a new {@link StreamingMessage}\n * when a `message-start` is seen, or `undefined` for continuation\n * events (deltas, finish, error).\n */\n consume(event: MessagesEvent): StreamingMessage | undefined {\n const update = this.#assembler.consume(event);\n if (update == null) return undefined;\n\n switch (update.kind) {\n case \"message-start\": {\n const streaming = new StreamingMessage(update.message);\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n this.#activeStreaming.set(update.key, streaming);\n return streaming;\n }\n case \"content-block-start\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n }\n if (\n streaming &&\n update.block.type === \"text\" &&\n \"text\" in update.block &&\n update.block.text\n ) {\n streaming[PUSH_TEXT](update.block.text);\n }\n if (\n streaming &&\n update.block.type === \"reasoning\" &&\n \"reasoning\" in update.block &&\n update.block.reasoning\n ) {\n streaming[PUSH_REASONING](update.block.reasoning);\n }\n return undefined;\n }\n case \"content-block-delta\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (!streaming) return undefined;\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n if (update.block.type === \"text\" && \"text\" in update.block) {\n streaming[PUSH_TEXT](update.block.text);\n }\n if (update.block.type === \"reasoning\" && \"reasoning\" in update.block) {\n streaming[PUSH_REASONING](update.block.reasoning);\n }\n return undefined;\n }\n case \"content-block-finish\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n }\n return undefined;\n }\n case \"usage\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n }\n return undefined;\n }\n case \"message-finish\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n streaming[FINISH]();\n this.#activeStreaming.delete(update.key);\n }\n return undefined;\n }\n case \"message-error\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n streaming[ERROR]();\n this.#activeStreaming.delete(update.key);\n }\n return undefined;\n }\n }\n }\n}\n"],"mappings":";;;;AA8BA,SAAS,sBACP,QACA,OACkB;AAClB,KAAI,OAAO,SAAS,MAAM,KACxB,QAAO,gBAAgB,MAAM;AAG/B,SAAQ,MAAM,MAAd;EACE,KAAK,OACH,QAAO;GACL,GAAG;GACH,GAAG;GACH,MAAM,GAAG,UAAU,SAAS,OAAO,OAAO,KAAK,MAAM;GACtD;EACH,KAAK,YACH,QAAO;GACL,GAAG;GACH,GAAG;GACH,WAAW,GAAG,eAAe,SAAS,OAAO,YAAY,KAAK,MAAM;GACrE;EACH,KAAK;EACL,KAAK,0BAA0B;GAC7B,MAAM,SAAS;IAAE,GAAG;IAAQ,GAAG;IAAO;AACtC,OAAI,MAAM,MAAM,QAAQ,QAAQ,UAAU,OAAO,MAAM,KACrD,QAAO,KAAK,OAAO;AAErB,OAAI,MAAM,QAAQ,QAAQ,UAAU,UAAU,OAAO,QAAQ,KAC3D,QAAO,OAAO,OAAO;AAEvB,UAAO,OAAO,IAAI,UAAU,SAAS,OAAO,OAAO,OAAO,KAAK,MAAM,QAAQ;AAC7E,UAAO;;EAET,QACE,QAAO;GAAE,GAAG;GAAQ,GAAG;GAAO;;;AAIpC,SAAS,0BACP,OACA,SACkB;AAClB,SAAQ,MAAM,MAAd;EACE,KAAK,aACH,QAAO;GAAE,MAAM;GAAQ,MAAM,MAAM;GAAM;EAC3C,KAAK,kBACH,QAAO;GACL,MAAM;GACN,WAAW,MAAM;GAClB;EACH,KAAK,cAAc;GACjB,MAAM,SAAS;IAAE,GAAI,WAAW,EAAE;IAAG,MAAM,MAAM;IAAM;AAIvD,OAAI,MAAM,SAAU,QAAO,WAAW,MAAM;AAC5C,UAAO;;EAET,KAAK,cACH,QAAO,MAAM;;;AAInB,SAAS,oBACP,SACA,OAGkB;AAClB,KAAI,MAAM,QACR,QAAO,UACH,sBAAsB,SAAS,MAAM,QAAQ,GAC7C,MAAM;AAGZ,SAAQ,MAAM,MAAM,MAApB;EACE,KAAK;AACH,OAAI,SAAS,SAAS,OACpB,QAAO;IACL,GAAG;IACH,MAAM,GAAG,UAAU,UAAU,QAAQ,OAAO,KAAK,MAAM,MAAM;IAC9D;AAEH,UAAO,0BAA0B,MAAM,OAAO,QAAQ;EACxD,KAAK;AACH,OAAI,SAAS,SAAS,YACpB,QAAO;IACL,GAAG;IACH,WAAW,GAAG,eAAe,UAAU,QAAQ,YAAY,KAAK,MAAM,MAAM;IAC7E;AAEH,UAAO,0BAA0B,MAAM,OAAO,QAAQ;EACxD,KAAK,cAAc;GACjB,MAAM,SAAS,EAAE,GAAI,WAAW,EAAE,EAAG;AACrC,UAAO,OAAO,GAAI,OAAO,QAA+B,KAAK,MAAM,MAAM;AACzE,OAAI,MAAM,MAAM,SAAU,QAAO,WAAW,MAAM,MAAM;AACxD,UAAO;;EAET,KAAK,cACH,QAAO;GACL,GAAI,WAAW,EAAE;GACjB,GAAG,MAAM,MAAM;GAChB;;;AAIP,SAAS,eACP,OAC2B;AAC3B,KAAI,CAAC,MAAO,QAAO,KAAA;AACnB,QAAO;EACL,GAAG;EACH,cAAc,MAAM,gBAAgB;EACpC,eAAe,MAAM,iBAAiB;EACtC,cAAc,MAAM,gBAAgB;EACrC;;;;;;;AA0BH,MAAM,YAA2B,OAAO,WAAW;AACnD,MAAM,iBAAgC,OAAO,gBAAgB;AAC7D,MAAM,aAA4B,OAAO,YAAY;AACrD,MAAM,iBAAgC,OAAO,gBAAgB;AAC7D,MAAM,SAAwB,OAAO,SAAS;AAC9C,MAAM,QAAuB,OAAO,QAAQ;;;;;;;;;;;;;AAc5C,IAAa,mBAAb,MAEA;CACE;CACA;CACA;CACA;CACA;CACA,UAAmB,IAAIC,4BAAAA,mBAAyC;CAEhE,cAAwB,EAAE;CAC1B,mBAA6B,EAAE;CAC/B,eAAkC,EAAE;CACpC,oBAAuC,EAAE;CACzC,YAAY;CACZ,iBAAiB;CAEjB;CACA;CACA;CACA;CAEA,YAAY,WAA6B;AACvC,OAAK,KAAK,UAAU;AACpB,OAAK,YAAY;AACjB,OAAK,YAAY,UAAU;AAC3B,OAAK,OAAO,UAAU;AACtB,OAAK,WAAW,UAAU;AAC1B,QAAA,cAAoB,IAAI,SAAiB,MAAM;AAC7C,SAAA,cAAoB;IACpB;AACF,QAAA,mBAAyB,IAAI,SAAiB,MAAM;AAClD,SAAA,mBAAyB;IACzB;;CAGJ,IAAI,OAA0B;EAC5B,MAAM,SAAS,MAAA;EACf,MAAM,UAAU,MAAA;EAChB,MAAM,gBAAgB,MAAA;EACtB,IAAI,SAAS;AACb,SAAO;GACL,CAAC,OAAO,iBAAiB;AACvB,WAAO,EACL,MAAM,OAAwC;AAC5C,YAAO,MAAM;AACX,UAAI,SAAS,OAAO,OAClB,QAAO;OAAE,MAAM;OAAO,OAAO,OAAO;OAAW;AAEjD,UAAI,SAAS,CACX,QAAO;OAAE,MAAM;OAAM,OAAO,KAAA;OAAW;AAEzC,YAAM,IAAI,SAAe,YAAY;AACnC,eAAQ,KAAK,QAAQ;QACrB;;OAGP;;GAEH,MAAM,MAAA,YAAkB,KAAK,KAAK,MAAA,YAAkB;GACpD,MAAM,EACJ,QAAQ,OAAO,iBAAiB;IAC9B,IAAI,cAAc;AAClB,eAAW,MAAM,SAAS,GACvB,OAAO,uBACL,EACC,MAAM,YAA6C;AACjD,YAAO,MAAM;AACX,UAAI,SAAS,OAAO,OAClB,QAAO;OAAE,MAAM;OAAO,OAAO,OAAO;OAAW;AAEjD,UAAI,SAAS,CACX,QAAO;OAAE,MAAM;OAAM,OAAO,KAAA;OAAW;AAEzC,YAAM,IAAI,SAAe,YAAY;AACnC,eAAQ,KAAK,QAAQ;QACrB;;OAGP,GACJ,EAAE;AACD,oBAAe;AACf,WAAM;;MAGX;GACF;;CAGH,IAAI,YAA+B;EACjC,MAAM,SAAS,MAAA;EACf,MAAM,UAAU,MAAA;EAChB,MAAM,gBAAgB,MAAA;EACtB,IAAI,SAAS;AACb,SAAO;GACL,CAAC,OAAO,iBAAiB;AACvB,WAAO,EACL,MAAM,OAAwC;AAC5C,YAAO,MAAM;AACX,UAAI,SAAS,OAAO,OAClB,QAAO;OAAE,MAAM;OAAO,OAAO,OAAO;OAAW;AAEjD,UAAI,SAAS,CACX,QAAO;OAAE,MAAM;OAAM,OAAO,KAAA;OAAW;AAEzC,YAAM,IAAI,SAAe,YAAY;AACnC,eAAQ,KAAK,QAAQ;QACrB;;OAGP;;GAEH,MAAM,MAAA,iBAAuB,KAAK,KAAK,MAAA,iBAAuB;GAC9D,MAAM,EACJ,QAAQ,OAAO,iBAAiB;IAC9B,IAAI,cAAc;AAClB,eAAW,MAAM,SAAS,GACvB,OAAO,uBACL,EACC,MAAM,YAA6C;AACjD,YAAO,MAAM;AACX,UAAI,SAAS,OAAO,OAClB,QAAO;OAAE,MAAM;OAAO,OAAO,OAAO;OAAW;AAEjD,UAAI,SAAS,CACX,QAAO;OAAE,MAAM;OAAM,OAAO,KAAA;OAAW;AAEzC,YAAM,IAAI,SAAe,YAAY;AACnC,eAAQ,KAAK,QAAQ;QACrB;;OAGP,GACJ,EAAE;AACD,oBAAe;AACf,WAAM;;MAGX;GACF;;CAGH,IAAI,QAA6B;EAC/B,MAAM,WAAW,YAAY;GAC3B,IAAI;AACJ,cAAW,MAAM,YAAY,MAAA,eAAqB,CAChD,SAAQ;AAEV,UAAO;MACL;AACJ,SAAO;IACJ,OAAO,sBAAsB,MAAA,eAAqB;GACnD,MAAM,QAAQ,KAAK,KAAK,QAAQ;GACjC;;CAGH,IAAI,YAA6B;EAC/B,MAAM,SAAS,MAAA;EACf,MAAM,WAAW,mBAAmB;AAClC,cAAW,MAAM,SAAS,OACxB,KACE,MAAM,UAAU,0BAChB,MAAM,QAAQ,SAAS,YAEvB,OAAM,MAAM;;AAIlB,SAAO;IACJ,OAAO,gBAAgB;GACxB,MAAM,OAAO,aAAa,eAAe;AACvC,QAAI;KACF,MAAM,QAA2C,EAAE;AACnD,gBAAW,MAAM,QAAQ,UAAU,CAAE,OAAM,KAAK,KAAK;AACrD,YAAO,cAAc,YAAY,MAAM,GAAI;aACpC,KAAK;AACZ,SAAI,WAAY,QAAO,WAAW,IAAI;AACtC,WAAM;;;GAGV,MAAM,EACJ,QAAQ,OAAO,iBAAiB;IAC9B,MAAM,QAA2C,EAAE;AACnD,eAAW,MAAM,QAAQ,UAAU,EAAE;AACnC,WAAM,KAAK,KAAK;AAChB,WAAM,CAAC,GAAG,MAAM;;MAGrB;GACF;;CAGH,IAAI,SAAiC;AACnC,SAAO,EAAE,OAAO,KAAK,QAAQ,MAAA,iBAAuB,CAAC,KAAK,KAAK,IAAI,EAAE;;CAGvE,IAAI,SAAyB;AAC3B,SAAO,KAAK,UAAU;;CAGxB,CAAC,OAAO,iBAAsD;AAC5D,SAAO,MAAA,OAAa,OAAO,gBAAgB;;CAG7C,KACE,aAGA,YACkC;AAClC,SAAO,MAAA,iBAAuB,CAAC,KAAK,aAAa,WAAW;;CAG9D,QAAA,gBAAuD;AACrD,aAAW,MAAM,SAAS,MAAA,OACxB,KAAI,MAAM,UAAU,mBAAmB,MAAM,MAC3C,OAAM,eAAe,MAAM,MAAM;WACxB,MAAM,UAAU,oBAAoB,MAAM,MACnD,OAAM,eAAe,MAAM,MAAM;;CAKvC,OAAA,kBAA6C;EAC3C,MAAM,gBAAqD,EAAE;EAC7D,IAAI;EACJ,IAAI;EACJ,IAAI,WAAoC,EAAE;EAC1C,IAAI;AAEJ,aAAW,MAAM,SAAS,MAAA,OACxB,SAAQ,MAAM,OAAd;GACE,KAAK;AACH,SAAK,MAAM,MAAM;AACjB,QAAI,MAAM,MAAO,SAAQ,eAAe,MAAM,MAAM;AACpD;GACF,KAAK;AACH,kBAAc,MAAM,SAAS,MAAM;AACnC;GACF,KAAK,uBAAuB;IAC1B,MAAM,UAAU,cAAc,MAAM;AACpC,kBAAc,MAAM,SAAS,oBAAoB,SAAS,MAAM;AAChE;;GAEF,KAAK;AACH,kBAAc,MAAM,SAAS,MAAM;AACnC;GACF,KAAK;AACH,mBAAe,MAAM;AACrB,QAAI,MAAM,MAAO,SAAQ,eAAe,MAAM,MAAM;AACpD,QAAI,MAAM,iBACR,YAAW;KACT,GAAG;KACH,GAAG,MAAM;KACV;AAEH;GACF,QACE;;AAIN,SAAO,IAAIa,yBAAAA,UAAU;GACnB;GACA,SAAS,cAAc,QACpB,UAAqC,SAAS,KAChD;GACD,gBAAgB;GAChB,mBAAmB;IACjB,GAAG;IACH,GAAI,eAAe,EAAE,eAAe,cAAc,GAAG,EAAE;IACvD,gBAAgB;IACjB;GACF,CAAC;;CAGJ,CAAC,YAAY,OAAmC;AAC9C,QAAA,OAAa,KAAK,MAAM;;CAG1B,CAAC,gBAAgB,OAA4B;AAC3C,OAAK,OAAO,MAAM,OAAO,QAAQ,KAAK;;CAGxC,CAAC,WAAW,OAAqB;AAC/B,QAAA,WAAiB,KAAK,MAAM;EAI5B,MAAM,UAAU,MAAA,YAAkB,OAAO,GAAG,MAAA,YAAkB,OAAO;AACrE,OAAK,MAAM,UAAU,QAAS,SAAQ;;CAGxC,CAAC,gBAAgB,OAAqB;AACpC,QAAA,gBAAsB,KAAK,MAAM;EACjC,MAAM,UAAU,MAAA,iBAAuB,OACrC,GACA,MAAA,iBAAuB,OACxB;AACD,OAAK,MAAM,UAAU,QAAS,SAAQ;;CAGxC,CAAC,UAAgB;AACf,QAAA,WAAiB;AACjB,QAAA,gBAAsB;AACtB,QAAA,YAAkB,MAAA,WAAiB,KAAK,GAAG,CAAC;AAC5C,QAAA,iBAAuB,MAAA,gBAAsB,KAAK,GAAG,CAAC;EACtD,MAAM,cAAc,MAAA,YAAkB,OAAO,GAAG,MAAA,YAAkB,OAAO;AACzE,OAAK,MAAM,UAAU,YAAa,SAAQ;EAC1C,MAAM,mBAAmB,MAAA,iBAAuB,OAC9C,GACA,MAAA,iBAAuB,OACxB;AACD,OAAK,MAAM,UAAU,iBAAkB,SAAQ;AAC/C,QAAA,OAAa,OAAO;;CAGtB,CAAC,SAAe;AACd,OAAK,SAAS;;;AAclB,SAAgB,yBACd,SACwB;AACxB,QAAO,IAAI,MAAM,SAAS;EACxB,IAAI,QAAQ,MAAM;AAChB,OAAI,SAAS,OAAQ,QAAO,KAAA;GAC5B,MAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM,OAAO;AAC/C,UAAO,OAAO,UAAU,aAAa,MAAM,KAAK,OAAO,GAAG;;EAE5D,IAAI,QAAQ,MAAM;AAChB,OAAI,SAAS,OAAQ,QAAO;AAC5B,UAAO,QAAQ;;EAElB,CAAC;;AAiDJ,SAAS,WAAmC,OAAa;AACvD,QAAO,gBAAgB,MAAM;;AAG/B,SAAS,iBACP,QACA,OACA,UACc;AACd,QAAO,OAAO,UAAU,MACtB,QAAO,KAAK,WAAW,SAAS,CAAC;AAEnC,QAAO,OAAO,WAAW,OAAO,SAAS,WAAW,SAAS;;AAG/D,SAAS,eACP,OACA,SACc;AACd,QAAO,0BACL,OACA,QACD;;AAGH,SAAS,kBACP,QACA,OACc;AACd,KAAI,OAAO,SAAS,MAAM,KACxB,QAAO,WAAW,MAAM;AAG1B,SAAQ,MAAM,MAAd;EACE,KAAK,OACH,QAAO;GACL,GAAG;GACH,GAAG;GACH,MAAM,GAAG,UAAU,SAAS,OAAO,OAAO,KAAK,MAAM;GACtD;EACH,KAAK,YACH,QAAO;GACL,GAAG;GACH,GAAG;GACH,WAAW,GAAG,eAAe,SAAS,OAAO,YAAY,KAAK,MAAM;GACrE;EACH,KAAK;EACL,KAAK,0BAA0B;GAc7B,MAAM,SAAS;IAAE,GAAG;IAAQ,GAAG;IAAO;AACtC,OAAI,MAAM,MAAM,QAAQ,QAAQ,UAAU,OAAO,MAAM,KACrD,QAAO,KAAK,OAAO;AAErB,OAAI,MAAM,QAAQ,QAAQ,UAAU,UAAU,OAAO,QAAQ,KAC3D,QAAO,OAAO,OAAO;AAEvB,UAAO,OAAO,IAAI,UAAU,SAAS,OAAO,OAAO,OAAO,KAAK,MAAM,QAAQ;AAC7E,UAAO;;EAET,QACE,QAAO;GACL,GAAG;GACH,GAAG;GACJ;;;AAIP,SAAS,cAAc,OAA8B;CACnD,MAAM,EAAE,WAAW,MAAM,SAAS,MAAM;CACxC,MAAM,eAAe,UAAU,KAAK,IAAI;CACxC,MAAM,YAAY,KAAK,UAAU,kBAAmB,KAAK,MAAM,KAAM;AACrE,QAAO,GAAG,aAAa,IAAI,QAAQ,GAAG,IAAI;;AAG5C,SAAS,uBAAuB,OAA4C;AAC1E,QAAO,MAAM,OAAO;;;;;AAMtB,IAAa,mBAAb,MAA8B;CAC5B,iCAAkC,IAAI,KAA+B;CACrE,wCAAyC,IAAI,KAAqB;;;;;;CAOlE,QAAQ,OAA6C;EACnD,MAAM,OAAO,MAAM,OAAO;EAC1B,MAAM,mBAAmB,GAAG,MAAM,OAAO,UAAU,KAAK,IAAI,CAAC,IAAI,MAAM,OAAO,QAAQ;AAEtF,MAAI,KAAK,UAAU,iBAAiB;GAClC,MAAM,MAAM,cAAc,MAAM;AAChC,QAAK,sBAAsB,IAAI,kBAAkB,IAAI;GACrD,MAAM,UAA4B;IAChC,IAAI,KAAK;IACT,WAAW,CAAC,GAAG,MAAM,OAAO,UAAU;IACtC,MAAM,MAAM,OAAO;IACnB,UAAU,KAAK;IACf,QAAQ,EAAE;IACX;AACD,QAAK,eAAe,IAAI,KAAK,QAAQ;AACrC,UAAO;IAAE,MAAM;IAAiB;IAAK;IAAS;IAAO;;EAGvD,MAAM,YAAY,KAAK,sBAAsB,IAAI,iBAAiB;AAClE,MAAI,CAAC,WAAW;GAOd,MAAM,eAAe,GAAG,iBAAiB;AACzC,QAAK,sBAAsB,IAAI,kBAAkB,aAAa;GAC9D,MAAM,YAA8B;IAClC,IAAI,KAAK;IACT,WAAW,CAAC,GAAG,MAAM,OAAO,UAAU;IACtC,MAAM,MAAM,OAAO;IACnB,QAAQ,EAAE;IACX;AACD,QAAK,eAAe,IAAI,cAAc,UAAU;AAChD,UAAO,KAAK,QAAQ,MAAM;;EAG5B,MAAM,UAAU,KAAK,eAAe,IAAI,UAAU;AAClD,MAAI,CAAC,QACH,OAAM,IAAI,MAAM,yCAAyC,YAAY;AAGvE,MAAK,KAA4B,UAAU,SAAS;AAClD,WAAQ,QAAS,KAA+B;AAChD,UAAO;IACL,MAAM;IACN,KAAK;IACL;IACA;IACD;;AAGH,UAAQ,KAAK,OAAb;GACE,KAAK;AACH,YAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,QAAQ;AACrD,WAAO;KACL,MAAM;KACN,KAAK;KACL;KACA,OAAO,KAAK;KACZ,OAAO,KAAK;KACZ;KACD;GAEH,KAAK,uBAAuB;IAC1B,MAAM,aAAa;IAInB,MAAM,aACJ,WAAW,YACV,WAAW,SAAS,OACjB,eAAe,WAAW,OAAO,QAAQ,OAAO,KAAK,OAAO,GAC5D,KAAA;AACN,QAAI,cAAc,KAChB,OAAM,IAAI,MAAM,+CAA+C;IAEjE,MAAM,UAAU,iBACd,QAAQ,QACR,KAAK,OACL,WACD;AACD,YAAQ,OAAO,KAAK,SAClB,WAAW,WAAW,OAClB,kBAAkB,SAAS,WAAW,QAAQ,GAC7C,oBACC,SACA,KAID;AACP,WAAO;KACL,MAAM;KACN,KAAK;KACL;KACA,OAAO,KAAK;KACZ,OAAO;KACP;KACD;;GAEH,KAAK;AACH,YAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,QAAQ;AACrD,WAAO;KACL,MAAM;KACN,KAAK;KACL;KACA,OAAO,KAAK;KACZ,OAAO,KAAK;KACZ;KACD;GAEH,KAAK;AACH,YAAQ,QAAQ,KAAK;AACrB,YAAQ,iBAAiB,KAAK;AAC9B,SAAK,eAAe,OAAO,UAAU;AACrC,SAAK,sBAAsB,OAAO,iBAAiB;AACnD,WAAO;KACL,MAAM;KACN,KAAK;KACL,SAAS,gBAAgB,QAAQ;KACjC;KACD;GAEH,KAAK;AACH,YAAQ,QAAQ;KAAE,SAAS,KAAK;KAAS,MAAM,KAAK;KAAM;AAC1D,SAAK,eAAe,OAAO,UAAU;AACrC,SAAK,sBAAsB,OAAO,iBAAiB;AACnD,WAAO;KACL,MAAM;KACN,KAAK;KACL,SAAS,gBAAgB,QAAQ;KACjC;KACD;;;;;;;;;AAWT,IAAa,4BAAb,MAAuC;CACrC,aAAsB,IAAI,kBAAkB;CAC5C,mCAA4B,IAAI,KAA+B;;;;;;CAO/D,QAAQ,OAAoD;EAC1D,MAAM,SAAS,MAAA,UAAgB,QAAQ,MAAM;AAC7C,MAAI,UAAU,KAAM,QAAO,KAAA;AAE3B,UAAQ,OAAO,MAAf;GACE,KAAK,iBAAiB;IACpB,MAAM,YAAY,IAAI,iBAAiB,OAAO,QAAQ;AACtD,cAAU,gBAAgB,OAAO,MAAM;AACvC,cAAU,YAAY,uBAAuB,OAAO,MAAM,CAAC;AAC3D,UAAA,gBAAsB,IAAI,OAAO,KAAK,UAAU;AAChD,WAAO;;GAET,KAAK,uBAAuB;IAC1B,MAAM,YAAY,MAAA,gBAAsB,IAAI,OAAO,IAAI;AACvD,QAAI,WAAW;AACb,eAAU,gBAAgB,OAAO,MAAM;AACvC,eAAU,YAAY,uBAAuB,OAAO,MAAM,CAAC;;AAE7D,QACE,aACA,OAAO,MAAM,SAAS,UACtB,UAAU,OAAO,SACjB,OAAO,MAAM,KAEb,WAAU,WAAW,OAAO,MAAM,KAAK;AAEzC,QACE,aACA,OAAO,MAAM,SAAS,eACtB,eAAe,OAAO,SACtB,OAAO,MAAM,UAEb,WAAU,gBAAgB,OAAO,MAAM,UAAU;AAEnD;;GAEF,KAAK,uBAAuB;IAC1B,MAAM,YAAY,MAAA,gBAAsB,IAAI,OAAO,IAAI;AACvD,QAAI,CAAC,UAAW,QAAO,KAAA;AACvB,cAAU,gBAAgB,OAAO,MAAM;AACvC,cAAU,YAAY,uBAAuB,OAAO,MAAM,CAAC;AAC3D,QAAI,OAAO,MAAM,SAAS,UAAU,UAAU,OAAO,MACnD,WAAU,WAAW,OAAO,MAAM,KAAK;AAEzC,QAAI,OAAO,MAAM,SAAS,eAAe,eAAe,OAAO,MAC7D,WAAU,gBAAgB,OAAO,MAAM,UAAU;AAEnD;;GAEF,KAAK,wBAAwB;IAC3B,MAAM,YAAY,MAAA,gBAAsB,IAAI,OAAO,IAAI;AACvD,QAAI,WAAW;AACb,eAAU,gBAAgB,OAAO,MAAM;AACvC,eAAU,YAAY,uBAAuB,OAAO,MAAM,CAAC;;AAE7D;;GAEF,KAAK,SAAS;IACZ,MAAM,YAAY,MAAA,gBAAsB,IAAI,OAAO,IAAI;AACvD,QAAI,WAAW;AACb,eAAU,gBAAgB,OAAO,MAAM;AACvC,eAAU,YAAY,uBAAuB,OAAO,MAAM,CAAC;;AAE7D;;GAEF,KAAK,kBAAkB;IACrB,MAAM,YAAY,MAAA,gBAAsB,IAAI,OAAO,IAAI;AACvD,QAAI,WAAW;AACb,eAAU,gBAAgB,OAAO,MAAM;AACvC,eAAU,YAAY,uBAAuB,OAAO,MAAM,CAAC;AAC3D,eAAU,SAAS;AACnB,WAAA,gBAAsB,OAAO,OAAO,IAAI;;AAE1C;;GAEF,KAAK,iBAAiB;IACpB,MAAM,YAAY,MAAA,gBAAsB,IAAI,OAAO,IAAI;AACvD,QAAI,WAAW;AACb,eAAU,gBAAgB,OAAO,MAAM;AACvC,eAAU,YAAY,uBAAuB,OAAO,MAAM,CAAC;AAC3D,eAAU,QAAQ;AAClB,WAAA,gBAAsB,OAAO,OAAO,IAAI;;AAE1C"}
|
|
1
|
+
{"version":3,"file":"messages.cjs","names":["#events","MultiCursorBuffer","#textPromise","#reasoningPromise","#resolveText","#resolveReasoning","#textChunks","#textWaiters","#textDone","#reasoningChunks","#reasoningWaiters","#reasoningDone","#usageIterator","#assembleMessage","AIMessage","#assembler","#activeStreaming"],"sources":["../../../src/client/stream/messages.ts"],"sourcesContent":["import {\n AIMessage,\n type ContentBlock as CoreContentBlock,\n type UsageMetadata,\n} from \"@langchain/core/messages\";\nimport type {\n ChatModelStreamEvent,\n ContentBlockDelta as CoreContentBlockDelta,\n} from \"@langchain/core/language_models/event\";\nimport type {\n ContentBlock,\n FinalizedContentBlock,\n MessageMetadata,\n MessagesEvent,\n UsageInfo,\n} from \"@langchain/protocol\";\n\nimport { MultiCursorBuffer } from \"./multi-cursor-buffer.js\";\n\ntype TextContentStream = AsyncIterable<string> &\n PromiseLike<string> & { full: AsyncIterable<string> };\n\ntype UsageMetadataStream = AsyncIterable<UsageMetadata> &\n PromiseLike<UsageMetadata | undefined>;\n\ntype ToolCallsStream = AsyncIterable<CoreContentBlock.Tools.ToolCall> &\n PromiseLike<Array<CoreContentBlock.Tools.ToolCall>> & {\n full: AsyncIterable<Array<CoreContentBlock.Tools.ToolCall>>;\n };\n\nfunction applyCoreContentDelta(\n target: CoreContentBlock,\n delta: CoreContentBlock\n): CoreContentBlock {\n if (target.type !== delta.type) {\n return structuredClone(delta);\n }\n\n switch (delta.type) {\n case \"text\":\n return {\n ...target,\n ...delta,\n text: `${\"text\" in target ? target.text : \"\"}${delta.text}`,\n } as CoreContentBlock;\n case \"reasoning\":\n return {\n ...target,\n ...delta,\n reasoning: `${\"reasoning\" in target ? target.reasoning : \"\"}${delta.reasoning}`,\n } as CoreContentBlock;\n case \"tool_call_chunk\":\n case \"server_tool_call_chunk\": {\n const merged = { ...target, ...delta } as Record<string, unknown>;\n if (delta.id == null && \"id\" in target && target.id != null) {\n merged.id = target.id;\n }\n if (delta.name == null && \"name\" in target && target.name != null) {\n merged.name = target.name;\n }\n merged.args = `${(\"args\" in target ? target.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n return merged as unknown as CoreContentBlock;\n }\n default:\n return { ...target, ...delta } as CoreContentBlock;\n }\n}\n\nfunction coreContentBlockFromDelta(\n delta: CoreContentBlockDelta,\n current?: CoreContentBlock\n): CoreContentBlock {\n switch (delta.type) {\n case \"text-delta\":\n return { type: \"text\", text: delta.text } as CoreContentBlock;\n case \"reasoning-delta\":\n return {\n type: \"reasoning\",\n reasoning: delta.reasoning,\n } as CoreContentBlock;\n case \"data-delta\": {\n const merged = { ...(current ?? {}), data: delta.data } as Record<\n string,\n unknown\n >;\n if (delta.encoding) merged.encoding = delta.encoding;\n return merged as unknown as CoreContentBlock;\n }\n case \"block-delta\":\n return delta.fields as CoreContentBlock;\n }\n}\n\nfunction applyCoreEventDelta(\n current: CoreContentBlock | undefined,\n event: Extract<ChatModelStreamEvent, { event: \"content-block-delta\" }> & {\n content?: CoreContentBlock;\n }\n): CoreContentBlock {\n if (event.content) {\n return current\n ? applyCoreContentDelta(current, event.content)\n : event.content;\n }\n\n switch (event.delta.type) {\n case \"text-delta\":\n if (current?.type === \"text\") {\n return {\n ...current,\n text: `${\"text\" in current ? current.text : \"\"}${event.delta.text}`,\n } as CoreContentBlock;\n }\n return coreContentBlockFromDelta(event.delta, current);\n case \"reasoning-delta\":\n if (current?.type === \"reasoning\") {\n return {\n ...current,\n reasoning: `${\"reasoning\" in current ? current.reasoning : \"\"}${event.delta.reasoning}`,\n } as CoreContentBlock;\n }\n return coreContentBlockFromDelta(event.delta, current);\n case \"data-delta\": {\n const merged = { ...(current ?? {}) } as Record<string, unknown>;\n merged.data = `${(merged.data as string | undefined) ?? \"\"}${event.delta.data}`;\n if (event.delta.encoding) merged.encoding = event.delta.encoding;\n return merged as unknown as CoreContentBlock;\n }\n case \"block-delta\":\n return {\n ...(current ?? {}),\n ...event.delta.fields,\n } as CoreContentBlock;\n }\n}\n\nfunction normalizeUsage(\n usage: UsageInfo | Partial<UsageMetadata> | undefined\n): UsageMetadata | undefined {\n if (!usage) return undefined;\n return {\n ...usage,\n input_tokens: usage.input_tokens ?? 0,\n output_tokens: usage.output_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n };\n}\n\n/**\n * Mutable view of a streamed message as message and content-block events are\n * assembled into a single structure.\n */\nexport interface AssembledMessage {\n id: string;\n namespace: string[];\n blocks: ContentBlock[];\n node?: string;\n usage?: UsageInfo;\n metadata?: MessageMetadata;\n finishMetadata?: Record<string, any>;\n error?: {\n message: string;\n code?: string;\n };\n}\n\n/**\n * Symbol keys for assembler → StreamingMessage communication.\n * Module-private: invisible to external consumers, accessible to\n * {@link StreamingMessageAssembler} within this file.\n */\nconst PUSH_TEXT: unique symbol = Symbol(\"pushText\");\nconst PUSH_REASONING: unique symbol = Symbol(\"pushReasoning\");\nconst PUSH_EVENT: unique symbol = Symbol(\"pushEvent\");\nconst UPDATE_CONTEXT: unique symbol = Symbol(\"updateContext\");\nconst FINISH: unique symbol = Symbol(\"finish\");\nconst ERROR: unique symbol = Symbol(\"error\");\n\n/**\n * Live streaming view of a single message lifecycle, matching the\n * in-process `ChatModelStream` dual-interface pattern.\n *\n * - `text` / `reasoning`: iterate for streaming deltas, or await for\n * the full concatenated string after the message completes.\n * - `usage`: promise that resolves with token usage on message-finish.\n * - `blocks`: the assembled content blocks (updated as deltas arrive).\n *\n * Created by {@link StreamingMessageAssembler} and yielded by\n * the `session.messages` lazy getter.\n */\nexport class StreamingMessage\n implements AsyncIterable<ChatModelStreamEvent>, PromiseLike<AIMessage>\n{\n readonly id: string;\n readonly namespace: string[];\n node: string | undefined;\n readonly metadata: MessageMetadata | undefined;\n readonly assembled: AssembledMessage;\n readonly #events = new MultiCursorBuffer<ChatModelStreamEvent>();\n\n #textChunks: string[] = [];\n #reasoningChunks: string[] = [];\n #textWaiters: Array<() => void> = [];\n #reasoningWaiters: Array<() => void> = [];\n #textDone = false;\n #reasoningDone = false;\n\n #resolveText!: (v: string) => void;\n #resolveReasoning!: (v: string) => void;\n readonly #textPromise: Promise<string>;\n readonly #reasoningPromise: Promise<string>;\n\n constructor(assembled: AssembledMessage) {\n this.id = assembled.id;\n this.assembled = assembled;\n this.namespace = assembled.namespace;\n this.node = assembled.node;\n this.metadata = assembled.metadata;\n this.#textPromise = new Promise<string>((r) => {\n this.#resolveText = r;\n });\n this.#reasoningPromise = new Promise<string>((r) => {\n this.#resolveReasoning = r;\n });\n }\n\n get text(): TextContentStream {\n const chunks = this.#textChunks;\n const waiters = this.#textWaiters;\n const getDone = () => this.#textDone;\n let cursor = 0;\n return {\n [Symbol.asyncIterator]() {\n return {\n async next(): Promise<IteratorResult<string>> {\n while (true) {\n if (cursor < chunks.length) {\n return { done: false, value: chunks[cursor++] };\n }\n if (getDone()) {\n return { done: true, value: undefined };\n }\n await new Promise<void>((resolve) => {\n waiters.push(resolve);\n });\n }\n },\n };\n },\n then: this.#textPromise.then.bind(this.#textPromise),\n full: {\n async *[Symbol.asyncIterator]() {\n let accumulated = \"\";\n for await (const chunk of {\n [Symbol.asyncIterator]: () =>\n ({\n next: async (): Promise<IteratorResult<string>> => {\n while (true) {\n if (cursor < chunks.length) {\n return { done: false, value: chunks[cursor++] };\n }\n if (getDone()) {\n return { done: true, value: undefined };\n }\n await new Promise<void>((resolve) => {\n waiters.push(resolve);\n });\n }\n },\n }) satisfies AsyncIterator<string>,\n }) {\n accumulated += chunk;\n yield accumulated;\n }\n },\n },\n };\n }\n\n get reasoning(): TextContentStream {\n const chunks = this.#reasoningChunks;\n const waiters = this.#reasoningWaiters;\n const getDone = () => this.#reasoningDone;\n let cursor = 0;\n return {\n [Symbol.asyncIterator]() {\n return {\n async next(): Promise<IteratorResult<string>> {\n while (true) {\n if (cursor < chunks.length) {\n return { done: false, value: chunks[cursor++] };\n }\n if (getDone()) {\n return { done: true, value: undefined };\n }\n await new Promise<void>((resolve) => {\n waiters.push(resolve);\n });\n }\n },\n };\n },\n then: this.#reasoningPromise.then.bind(this.#reasoningPromise),\n full: {\n async *[Symbol.asyncIterator]() {\n let accumulated = \"\";\n for await (const chunk of {\n [Symbol.asyncIterator]: () =>\n ({\n next: async (): Promise<IteratorResult<string>> => {\n while (true) {\n if (cursor < chunks.length) {\n return { done: false, value: chunks[cursor++] };\n }\n if (getDone()) {\n return { done: true, value: undefined };\n }\n await new Promise<void>((resolve) => {\n waiters.push(resolve);\n });\n }\n },\n }) satisfies AsyncIterator<string>,\n }) {\n accumulated += chunk;\n yield accumulated;\n }\n },\n },\n };\n }\n\n get usage(): UsageMetadataStream {\n const promise = (async () => {\n let usage: UsageMetadata | undefined;\n for await (const snapshot of this.#usageIterator()) {\n usage = snapshot;\n }\n return usage;\n })();\n return {\n [Symbol.asyncIterator]: () => this.#usageIterator(),\n then: promise.then.bind(promise),\n };\n }\n\n get toolCalls(): ToolCallsStream {\n const events = this.#events;\n const iterator = async function* () {\n for await (const event of events) {\n if (\n event.event === \"content-block-finish\" &&\n event.content.type === \"tool_call\"\n ) {\n yield event.content as CoreContentBlock.Tools.ToolCall;\n }\n }\n };\n return {\n [Symbol.asyncIterator]: iterator,\n then: async (onfulfilled, onrejected) => {\n try {\n const calls: CoreContentBlock.Tools.ToolCall[] = [];\n for await (const call of iterator()) calls.push(call);\n return onfulfilled ? onfulfilled(calls) : (calls as never);\n } catch (err) {\n if (onrejected) return onrejected(err);\n throw err;\n }\n },\n full: {\n async *[Symbol.asyncIterator]() {\n const calls: CoreContentBlock.Tools.ToolCall[] = [];\n for await (const call of iterator()) {\n calls.push(call);\n yield [...calls];\n }\n },\n },\n };\n }\n\n get output(): PromiseLike<AIMessage> {\n return { then: (onf, onr) => this.#assembleMessage().then(onf, onr) };\n }\n\n get blocks(): ContentBlock[] {\n return this.assembled.blocks;\n }\n\n [Symbol.asyncIterator](): AsyncIterator<ChatModelStreamEvent> {\n return this.#events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = AIMessage, TResult2 = never>(\n onfulfilled?:\n | ((value: AIMessage) => TResult1 | PromiseLike<TResult1>)\n | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): PromiseLike<TResult1 | TResult2> {\n return this.#assembleMessage().then(onfulfilled, onrejected);\n }\n\n async *#usageIterator(): AsyncGenerator<UsageMetadata> {\n for await (const event of this.#events) {\n if (event.event === \"message-start\" && event.usage) {\n yield normalizeUsage(event.usage)!;\n } else if (event.event === \"message-finish\" && event.usage) {\n yield normalizeUsage(event.usage)!;\n }\n }\n }\n\n async #assembleMessage(): Promise<AIMessage> {\n const contentBlocks: Array<CoreContentBlock | undefined> = [];\n let id: string | undefined;\n let usage: UsageMetadata | undefined;\n let metadata: Record<string, unknown> = {};\n let finishReason: string | undefined;\n\n for await (const event of this.#events) {\n switch (event.event) {\n case \"message-start\":\n id = event.id ?? id;\n if (event.usage) usage = normalizeUsage(event.usage);\n break;\n case \"content-block-start\":\n contentBlocks[event.index] = event.content;\n break;\n case \"content-block-delta\": {\n const current = contentBlocks[event.index];\n contentBlocks[event.index] = applyCoreEventDelta(current, event);\n break;\n }\n case \"content-block-finish\":\n contentBlocks[event.index] = event.content;\n break;\n case \"message-finish\":\n finishReason = event.reason;\n if (event.usage) usage = normalizeUsage(event.usage);\n if (event.responseMetadata) {\n metadata = {\n ...metadata,\n ...event.responseMetadata,\n };\n }\n break;\n default:\n break;\n }\n }\n\n return new AIMessage({\n id,\n content: contentBlocks.filter(\n (block): block is CoreContentBlock => block != null\n ),\n usage_metadata: usage,\n response_metadata: {\n ...metadata,\n ...(finishReason ? { finish_reason: finishReason } : {}),\n output_version: \"v1\" as const,\n },\n });\n }\n\n [PUSH_EVENT](event: ChatModelStreamEvent): void {\n this.#events.push(event);\n }\n\n [UPDATE_CONTEXT](event: MessagesEvent): void {\n this.node = event.params.node ?? this.node;\n }\n\n [PUSH_TEXT](delta: string): void {\n this.#textChunks.push(delta);\n // Wake every caught-up iterator so each one advances its own cursor.\n // Iterators re-check `chunks.length` before delivering, which keeps\n // the cursor the single source of truth for what a consumer has seen.\n const pending = this.#textWaiters.splice(0, this.#textWaiters.length);\n for (const waiter of pending) waiter();\n }\n\n [PUSH_REASONING](delta: string): void {\n this.#reasoningChunks.push(delta);\n const pending = this.#reasoningWaiters.splice(\n 0,\n this.#reasoningWaiters.length\n );\n for (const waiter of pending) waiter();\n }\n\n [FINISH](): void {\n this.#textDone = true;\n this.#reasoningDone = true;\n this.#resolveText(this.#textChunks.join(\"\"));\n this.#resolveReasoning(this.#reasoningChunks.join(\"\"));\n const textPending = this.#textWaiters.splice(0, this.#textWaiters.length);\n for (const waiter of textPending) waiter();\n const reasoningPending = this.#reasoningWaiters.splice(\n 0,\n this.#reasoningWaiters.length\n );\n for (const waiter of reasoningPending) waiter();\n this.#events.close();\n }\n\n [ERROR](): void {\n this[FINISH]();\n }\n}\n\n/**\n * Public view yielded by message projections.\n *\n * `StreamingMessage` is PromiseLike so callers can still `await` a message\n * object directly, but TypeScript applies `Awaited<T>` to values produced by\n * `for await`. Exposing a non-thenable view keeps loop variables typed as the\n * streaming handle instead of as the finalized `AIMessage`.\n */\nexport type StreamingMessageHandle = Omit<StreamingMessage, \"then\">;\n\nexport function toStreamingMessageHandle(\n message: StreamingMessage\n): StreamingMessageHandle {\n return new Proxy(message, {\n get(target, prop) {\n if (prop === \"then\") return undefined;\n const value = Reflect.get(target, prop, target);\n return typeof value === \"function\" ? value.bind(target) : value;\n },\n has(target, prop) {\n if (prop === \"then\") return false;\n return prop in target;\n },\n }) as StreamingMessageHandle;\n}\n\n/**\n * Emitted by `MessageAssembler.consume()` to describe how a message changed in\n * response to a single protocol event.\n */\nexport type MessageAssemblyUpdate =\n | {\n kind: \"message-start\";\n key: string;\n message: AssembledMessage;\n event: MessagesEvent;\n }\n | {\n kind: \"content-block-start\" | \"content-block-delta\";\n key: string;\n message: AssembledMessage;\n index: number;\n block: ContentBlock;\n event: MessagesEvent;\n }\n | {\n kind: \"content-block-finish\";\n key: string;\n message: AssembledMessage;\n index: number;\n block: FinalizedContentBlock;\n event: MessagesEvent;\n }\n | {\n kind: \"usage\";\n key: string;\n message: AssembledMessage;\n event: MessagesEvent;\n }\n | {\n kind: \"message-finish\";\n key: string;\n message: AssembledMessage;\n event: MessagesEvent;\n }\n | {\n kind: \"message-error\";\n key: string;\n message: AssembledMessage;\n event: MessagesEvent;\n };\n\nfunction cloneBlock<T extends ContentBlock>(block: T): T {\n return structuredClone(block);\n}\n\nfunction blockFromDelta(\n delta: CoreContentBlockDelta,\n current?: ContentBlock\n): ContentBlock {\n return coreContentBlockFromDelta(\n delta,\n current as unknown as CoreContentBlock | undefined\n ) as unknown as ContentBlock;\n}\n\nfunction applyContentDelta(\n target: ContentBlock,\n delta: ContentBlock\n): ContentBlock {\n if (target.type !== delta.type) {\n return cloneBlock(delta);\n }\n\n switch (delta.type) {\n case \"text\":\n return {\n ...target,\n ...delta,\n text: `${\"text\" in target ? target.text : \"\"}${delta.text}`,\n } as ContentBlock;\n case \"reasoning\":\n return {\n ...target,\n ...delta,\n reasoning: `${\"reasoning\" in target ? target.reasoning : \"\"}${delta.reasoning}`,\n } as ContentBlock;\n case \"tool_call_chunk\":\n case \"server_tool_call_chunk\": {\n // Spread target first, then delta — but preserve target's\n // ``id``/``name`` when the delta explicitly sets them to\n // null/undefined. Some providers (notably Anthropic via the\n // langchain-core compat bridge) only attach the tool-call\n // identifiers to the first ``content-block-start`` chunk; every\n // subsequent ``input_json_delta`` chunk carries ``id=null,\n // name=null``. A naive ``{...target, ...delta}`` spread\n // overwrites the captured identifiers with null, which in turn\n // makes downstream consumers (e.g. ``extractToolCallChunks`` in\n // ``assembled-to-message.ts``) drop the chunk on the floor until\n // the final ``content-block-finish`` event promotes it to a\n // finalized ``tool_call`` — causing tool-call cards to appear\n // all-at-once at the end of the turn instead of incrementally.\n const merged = { ...target, ...delta } as Record<string, unknown>;\n if (delta.id == null && \"id\" in target && target.id != null) {\n merged.id = target.id;\n }\n if (delta.name == null && \"name\" in target && target.name != null) {\n merged.name = target.name;\n }\n merged.args = `${(\"args\" in target ? target.args : \"\") ?? \"\"}${delta.args ?? \"\"}`;\n return merged as unknown as ContentBlock;\n }\n default:\n return {\n ...target,\n ...delta,\n } as ContentBlock;\n }\n}\n\nfunction messageKeyFor(event: MessagesEvent): string {\n const { namespace, node, data } = event.params;\n const namespaceKey = namespace.join(\"/\");\n const messageId = data.event === \"message-start\" ? (data.id ?? \"\") : \"\";\n return `${namespaceKey}::${node ?? \"\"}::${messageId}`;\n}\n\nfunction toChatModelStreamEvent(event: MessagesEvent): ChatModelStreamEvent {\n return event.params.data as unknown as ChatModelStreamEvent;\n}\n\n/**\n * Incrementally assembles `messages` events into complete message objects.\n */\nexport class MessageAssembler {\n private readonly activeMessages = new Map<string, AssembledMessage>();\n private readonly activeByNamespaceNode = new Map<string, string>();\n private readonly blockIndexByProtocolIndexAndType = new Map<string, number>();\n\n /**\n * Applies a single message event and returns the resulting assembly update.\n *\n * @param event - Incoming `messages` event to fold into the assembler state.\n */\n consume(event: MessagesEvent): MessageAssemblyUpdate {\n const data = event.params.data;\n const namespaceNodeKey = `${event.params.namespace.join(\"/\")}::${event.params.node ?? \"\"}`;\n\n if (data.event === \"message-start\") {\n const key = messageKeyFor(event);\n this.activeByNamespaceNode.set(namespaceNodeKey, key);\n const message: AssembledMessage = {\n id: data.id,\n namespace: [...event.params.namespace],\n node: event.params.node,\n metadata: data.metadata,\n blocks: [],\n };\n this.activeMessages.set(key, message);\n return { kind: \"message-start\", key, message, event };\n }\n\n const activeKey = this.activeByNamespaceNode.get(namespaceNodeKey);\n if (!activeKey) {\n // A continuation event (delta/finish/error) arrived without a\n // prior `message-start`. This can happen on late-attaching\n // subscriptions when the server has already trimmed the\n // `message-start` from its replay buffer. Synthesize a minimal\n // active message so the assembler can still fold subsequent\n // events instead of hard-failing the caller.\n const syntheticKey = `${namespaceNodeKey}::`;\n this.activeByNamespaceNode.set(namespaceNodeKey, syntheticKey);\n const synthetic: AssembledMessage = {\n id: data.id,\n namespace: [...event.params.namespace],\n node: event.params.node,\n blocks: [],\n };\n this.activeMessages.set(syntheticKey, synthetic);\n return this.consume(event);\n }\n\n const message = this.activeMessages.get(activeKey);\n if (!message) {\n throw new Error(`No active message state found for key ${activeKey}`);\n }\n\n if ((data as { event?: string }).event === \"usage\") {\n message.usage = (data as { usage?: UsageInfo }).usage;\n return {\n kind: \"usage\",\n key: activeKey,\n message,\n event,\n };\n }\n\n switch (data.event) {\n case \"content-block-start\": {\n message.blocks[data.index] = cloneBlock(data.content);\n this.blockIndexByProtocolIndexAndType.set(\n blockIndexKey(activeKey, data.index, data.content.type),\n data.index\n );\n return {\n kind: \"content-block-start\",\n key: activeKey,\n message,\n index: data.index,\n block: data.content,\n event,\n };\n }\n case \"content-block-delta\": {\n const deltaEvent = data as typeof data & {\n content?: ContentBlock;\n delta?: CoreContentBlockDelta;\n };\n const deltaBlock =\n deltaEvent.content ??\n (deltaEvent.delta != null\n ? blockFromDelta(deltaEvent.delta, message.blocks[data.index])\n : undefined);\n if (deltaBlock == null) {\n throw new Error(\"Received content-block-delta without content\");\n }\n const targetIndex = this.resolveBlockIndex(\n activeKey,\n message.blocks,\n data.index,\n deltaBlock.type\n );\n const current = message.blocks[targetIndex];\n message.blocks[targetIndex] =\n deltaEvent.content != null\n ? current == null\n ? cloneBlock(deltaEvent.content)\n : applyContentDelta(current, deltaEvent.content)\n : (applyCoreEventDelta(\n current as CoreContentBlock | undefined,\n data as unknown as Extract<\n ChatModelStreamEvent,\n { event: \"content-block-delta\" }\n >\n ) as unknown as ContentBlock);\n return {\n kind: \"content-block-delta\",\n key: activeKey,\n message,\n index: targetIndex,\n block: deltaBlock,\n event,\n };\n }\n case \"content-block-finish\": {\n const targetIndex = this.resolveFinishBlockIndex(\n activeKey,\n data.index,\n data.content.type\n );\n message.blocks[targetIndex] = cloneBlock(data.content);\n return {\n kind: \"content-block-finish\",\n key: activeKey,\n message,\n index: targetIndex,\n block: data.content,\n event,\n };\n }\n case \"message-finish\": {\n message.usage = data.usage;\n message.finishMetadata = data.responseMetadata;\n this.activeMessages.delete(activeKey);\n this.activeByNamespaceNode.delete(namespaceNodeKey);\n this.clearBlockIndexAliases(activeKey);\n return {\n kind: \"message-finish\",\n key: activeKey,\n message: structuredClone(message),\n event,\n };\n }\n case \"error\": {\n message.error = { message: data.message, code: data.code };\n this.activeMessages.delete(activeKey);\n this.activeByNamespaceNode.delete(namespaceNodeKey);\n this.clearBlockIndexAliases(activeKey);\n return {\n kind: \"message-error\",\n key: activeKey,\n message: structuredClone(message),\n event,\n };\n }\n }\n }\n\n private resolveBlockIndex(\n activeKey: string,\n blocks: ContentBlock[],\n protocolIndex: number,\n blockType: string\n ): number {\n const current = blocks[protocolIndex];\n if (\n current == null ||\n current.type === blockType ||\n areCompatibleBlockTypes(current.type, blockType)\n ) {\n this.blockIndexByProtocolIndexAndType.set(\n blockIndexKey(activeKey, protocolIndex, blockType),\n protocolIndex\n );\n return protocolIndex;\n }\n\n const key = blockIndexKey(activeKey, protocolIndex, blockType);\n const existing = this.blockIndexByProtocolIndexAndType.get(key);\n if (existing != null) return existing;\n\n const nextIndex = blocks.length;\n this.blockIndexByProtocolIndexAndType.set(key, nextIndex);\n return nextIndex;\n }\n\n private resolveFinishBlockIndex(\n activeKey: string,\n protocolIndex: number,\n blockType: string\n ): number {\n const key = blockIndexKey(activeKey, protocolIndex, blockType);\n const existing = this.blockIndexByProtocolIndexAndType.get(key);\n if (existing != null) return existing;\n\n this.blockIndexByProtocolIndexAndType.set(key, protocolIndex);\n return protocolIndex;\n }\n\n private clearBlockIndexAliases(activeKey: string): void {\n const prefix = `${activeKey}::`;\n for (const key of this.blockIndexByProtocolIndexAndType.keys()) {\n if (key.startsWith(prefix))\n this.blockIndexByProtocolIndexAndType.delete(key);\n }\n }\n}\n\nfunction blockIndexKey(\n activeKey: string,\n protocolIndex: number,\n blockType: string\n): string {\n return `${activeKey}::${protocolIndex}::${blockType}`;\n}\n\nfunction areCompatibleBlockTypes(\n currentType: string,\n nextType: string\n): boolean {\n const toolCallTypes = new Set([\n \"tool_call\",\n \"tool_call_chunk\",\n \"tool_use\",\n \"input_json_delta\",\n ]);\n const serverToolCallTypes = new Set([\n \"server_tool_call\",\n \"server_tool_call_chunk\",\n ]);\n\n return (\n (toolCallTypes.has(currentType) && toolCallTypes.has(nextType)) ||\n (serverToolCallTypes.has(currentType) && serverToolCallTypes.has(nextType))\n );\n}\n\n/**\n * Assembles `messages` events into {@link StreamingMessage} instances\n * with live text/reasoning delta streams, matching the in-process\n * `ChatModelStream` dual-interface pattern.\n */\nexport class StreamingMessageAssembler {\n readonly #assembler = new MessageAssembler();\n readonly #activeStreaming = new Map<string, StreamingMessage>();\n\n /**\n * Folds a single event and returns a new {@link StreamingMessage}\n * when a `message-start` is seen, or `undefined` for continuation\n * events (deltas, finish, error).\n */\n consume(event: MessagesEvent): StreamingMessage | undefined {\n const update = this.#assembler.consume(event);\n if (update == null) return undefined;\n\n switch (update.kind) {\n case \"message-start\": {\n const streaming = new StreamingMessage(update.message);\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n this.#activeStreaming.set(update.key, streaming);\n return streaming;\n }\n case \"content-block-start\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n }\n if (\n streaming &&\n update.block.type === \"text\" &&\n \"text\" in update.block &&\n update.block.text\n ) {\n streaming[PUSH_TEXT](update.block.text);\n }\n if (\n streaming &&\n update.block.type === \"reasoning\" &&\n \"reasoning\" in update.block &&\n update.block.reasoning\n ) {\n streaming[PUSH_REASONING](update.block.reasoning);\n }\n return undefined;\n }\n case \"content-block-delta\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (!streaming) return undefined;\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n if (update.block.type === \"text\" && \"text\" in update.block) {\n streaming[PUSH_TEXT](update.block.text);\n }\n if (update.block.type === \"reasoning\" && \"reasoning\" in update.block) {\n streaming[PUSH_REASONING](update.block.reasoning);\n }\n return undefined;\n }\n case \"content-block-finish\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n }\n return undefined;\n }\n case \"usage\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n }\n return undefined;\n }\n case \"message-finish\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n streaming[FINISH]();\n this.#activeStreaming.delete(update.key);\n }\n return undefined;\n }\n case \"message-error\": {\n const streaming = this.#activeStreaming.get(update.key);\n if (streaming) {\n streaming[UPDATE_CONTEXT](update.event);\n streaming[PUSH_EVENT](toChatModelStreamEvent(update.event));\n streaming[ERROR]();\n this.#activeStreaming.delete(update.key);\n }\n return undefined;\n }\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -127,12 +127,16 @@ type MessageAssemblyUpdate = {
|
|
|
127
127
|
declare class MessageAssembler {
|
|
128
128
|
private readonly activeMessages;
|
|
129
129
|
private readonly activeByNamespaceNode;
|
|
130
|
+
private readonly blockIndexByProtocolIndexAndType;
|
|
130
131
|
/**
|
|
131
132
|
* Applies a single message event and returns the resulting assembly update.
|
|
132
133
|
*
|
|
133
134
|
* @param event - Incoming `messages` event to fold into the assembler state.
|
|
134
135
|
*/
|
|
135
136
|
consume(event: MessagesEvent): MessageAssemblyUpdate;
|
|
137
|
+
private resolveBlockIndex;
|
|
138
|
+
private resolveFinishBlockIndex;
|
|
139
|
+
private clearBlockIndexAliases;
|
|
136
140
|
}
|
|
137
141
|
//#endregion
|
|
138
142
|
export { AssembledMessage, MessageAssembler, MessageAssemblyUpdate, StreamingMessage, StreamingMessageHandle };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.cts","names":[],"sources":["../../../src/client/stream/messages.ts"],"mappings":";;;;;KAmBK,iBAAA,GAAoB,aAAA,WACvB,WAAA;EAAwB,IAAA,EAAM,aAAA;AAAA;AAAA,KAE3B,mBAAA,GAAsB,aAAA,CAAc,aAAA,IACvC,WAAA,CAAY,aAAA;AAAA,KAET,eAAA,GAAkB,aAAA,CAAc,cAAA,CAAiB,KAAA,CAAM,QAAA,IAC1D,WAAA,CAAY,KAAA,CAAM,cAAA,CAAiB,KAAA,CAAM,QAAA;EACvC,IAAA,EAAM,aAAA,CAAc,KAAA,CAAM,cAAA,CAAiB,KAAA,CAAM,QAAA;AAAA;;;;;UA6HpC,gBAAA;EACf,EAAA;EACA,SAAA;EACA,MAAA,EAAQ,YAAA;EACR,IAAA;EACA,KAAA,GAAQ,SAAA;EACR,QAAA,GAAW,eAAA;EACX,cAAA,GAAiB,MAAA;EACjB,KAAA;IACE,OAAA;IACA,IAAA;EAAA;AAAA;;;;;;cASE,SAAA;AAAA,cACA,cAAA;AAAA,cACA,UAAA;AAAA,cACA,cAAA;AAAA,cACA,MAAA;AAAA,cACA,KAAA;;;;;;;;;;;;;cAcO,gBAAA,YACA,aAAA,CAAc,oBAAA,GAAuB,WAAA,CAAY,SAAA;EAAA;WAEnD,EAAA;EAAA,SACA,SAAA;EACT,IAAA;EAAA,SACS,QAAA,EAAU,eAAA;EAAA,SACV,SAAA,EAAW,gBAAA;EAepB,WAAA,CAAY,SAAA,EAAW,gBAAA;EAAA,IAcnB,IAAA,CAAA,GAAQ,iBAAA;EAAA,IAqDR,SAAA,CAAA,GAAa,iBAAA;EAAA,IAqDb,KAAA,CAAA,GAAS,mBAAA;EAAA,IAcT,SAAA,CAAA,GAAa,eAAA;EAAA,IAoCb,MAAA,CAAA,GAAU,WAAA,CAAY,SAAA;EAAA,IAItB,MAAA,CAAA,GAAU,YAAA;EAAA,CAIb,MAAA,CAAO,aAAA,KAAkB,aAAA,CAAc,oBAAA;EAIxC,IAAA,YAAgB,SAAA,mBAAA,CACd,WAAA,KACM,KAAA,EAAO,SAAA,KAAc,QAAA,GAAW,WAAA,CAAY,QAAA,WAElD,UAAA,KAAe,MAAA,cAAoB,QAAA,GAAW,WAAA,CAAY,QAAA,YACzD,WAAA,CAAY,QAAA,GAAW,QAAA;EAAA,CAmEzB,UAAA,EAAY,KAAA,EAAO,oBAAA;EAAA,CAInB,cAAA,EAAgB,KAAA,EAAO,aAAA;EAAA,CAIvB,SAAA,EAAW,KAAA;EAAA,CASX,cAAA,EAAgB,KAAA;EAAA,CAShB,MAAA;EAAA,CAeA,KAAA;AAAA;;;;;;;;;KAaS,sBAAA,GAAyB,IAAA,CAAK,gBAAA;;;;;KAsB9B,qBAAA;EAEN,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA;EACA,KAAA,EAAO,YAAA;EACP,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA;EACA,KAAA,EAAO,qBAAA;EACP,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA,EAAO,aAAA;AAAA;;;;
|
|
1
|
+
{"version":3,"file":"messages.d.cts","names":[],"sources":["../../../src/client/stream/messages.ts"],"mappings":"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"}
|
|
@@ -127,12 +127,16 @@ type MessageAssemblyUpdate = {
|
|
|
127
127
|
declare class MessageAssembler {
|
|
128
128
|
private readonly activeMessages;
|
|
129
129
|
private readonly activeByNamespaceNode;
|
|
130
|
+
private readonly blockIndexByProtocolIndexAndType;
|
|
130
131
|
/**
|
|
131
132
|
* Applies a single message event and returns the resulting assembly update.
|
|
132
133
|
*
|
|
133
134
|
* @param event - Incoming `messages` event to fold into the assembler state.
|
|
134
135
|
*/
|
|
135
136
|
consume(event: MessagesEvent): MessageAssemblyUpdate;
|
|
137
|
+
private resolveBlockIndex;
|
|
138
|
+
private resolveFinishBlockIndex;
|
|
139
|
+
private clearBlockIndexAliases;
|
|
136
140
|
}
|
|
137
141
|
//#endregion
|
|
138
142
|
export { AssembledMessage, MessageAssembler, MessageAssemblyUpdate, StreamingMessage, StreamingMessageHandle };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.d.ts","names":[],"sources":["../../../src/client/stream/messages.ts"],"mappings":";;;;;KAmBK,iBAAA,GAAoB,aAAA,WACvB,WAAA;EAAwB,IAAA,EAAM,aAAA;AAAA;AAAA,KAE3B,mBAAA,GAAsB,aAAA,CAAc,aAAA,IACvC,WAAA,CAAY,aAAA;AAAA,KAET,eAAA,GAAkB,aAAA,CAAc,YAAA,CAAiB,KAAA,CAAM,QAAA,IAC1D,WAAA,CAAY,KAAA,CAAM,YAAA,CAAiB,KAAA,CAAM,QAAA;EACvC,IAAA,EAAM,aAAA,CAAc,KAAA,CAAM,YAAA,CAAiB,KAAA,CAAM,QAAA;AAAA;;;;;UA6HpC,gBAAA;EACf,EAAA;EACA,SAAA;EACA,MAAA,EAAQ,cAAA;EACR,IAAA;EACA,KAAA,GAAQ,SAAA;EACR,QAAA,GAAW,eAAA;EACX,cAAA,GAAiB,MAAA;EACjB,KAAA;IACE,OAAA;IACA,IAAA;EAAA;AAAA;;;;;;cASE,SAAA;AAAA,cACA,cAAA;AAAA,cACA,UAAA;AAAA,cACA,cAAA;AAAA,cACA,MAAA;AAAA,cACA,KAAA;;;;;;;;;;;;;cAcO,gBAAA,YACA,aAAA,CAAc,oBAAA,GAAuB,WAAA,CAAY,SAAA;EAAA;WAEnD,EAAA;EAAA,SACA,SAAA;EACT,IAAA;EAAA,SACS,QAAA,EAAU,eAAA;EAAA,SACV,SAAA,EAAW,gBAAA;EAepB,WAAA,CAAY,SAAA,EAAW,gBAAA;EAAA,IAcnB,IAAA,CAAA,GAAQ,iBAAA;EAAA,IAqDR,SAAA,CAAA,GAAa,iBAAA;EAAA,IAqDb,KAAA,CAAA,GAAS,mBAAA;EAAA,IAcT,SAAA,CAAA,GAAa,eAAA;EAAA,IAoCb,MAAA,CAAA,GAAU,WAAA,CAAY,SAAA;EAAA,IAItB,MAAA,CAAA,GAAU,cAAA;EAAA,CAIb,MAAA,CAAO,aAAA,KAAkB,aAAA,CAAc,oBAAA;EAIxC,IAAA,YAAgB,SAAA,mBAAA,CACd,WAAA,KACM,KAAA,EAAO,SAAA,KAAc,QAAA,GAAW,WAAA,CAAY,QAAA,WAElD,UAAA,KAAe,MAAA,cAAoB,QAAA,GAAW,WAAA,CAAY,QAAA,YACzD,WAAA,CAAY,QAAA,GAAW,QAAA;EAAA,CAmEzB,UAAA,EAAY,KAAA,EAAO,oBAAA;EAAA,CAInB,cAAA,EAAgB,KAAA,EAAO,aAAA;EAAA,CAIvB,SAAA,EAAW,KAAA;EAAA,CASX,cAAA,EAAgB,KAAA;EAAA,CAShB,MAAA;EAAA,CAeA,KAAA;AAAA;;;;;;;;;KAaS,sBAAA,GAAyB,IAAA,CAAK,gBAAA;;;;;KAsB9B,qBAAA;EAEN,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA;EACA,KAAA,EAAO,cAAA;EACP,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA;EACA,KAAA,EAAO,qBAAA;EACP,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA,EAAO,aAAA;AAAA;EAGP,IAAA;EACA,GAAA;EACA,OAAA,EAAS,gBAAA;EACT,KAAA,EAAO,aAAA;AAAA;;;;
|
|
1
|
+
{"version":3,"file":"messages.d.ts","names":[],"sources":["../../../src/client/stream/messages.ts"],"mappings":"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"}
|
|
@@ -378,10 +378,6 @@ function toStreamingMessageHandle(message) {
|
|
|
378
378
|
function cloneBlock(block) {
|
|
379
379
|
return structuredClone(block);
|
|
380
380
|
}
|
|
381
|
-
function ensureBlockIndex(blocks, index, fallback) {
|
|
382
|
-
while (blocks.length <= index) blocks.push(cloneBlock(fallback));
|
|
383
|
-
return blocks[index] ?? (blocks[index] = cloneBlock(fallback));
|
|
384
|
-
}
|
|
385
381
|
function blockFromDelta(delta, current) {
|
|
386
382
|
return coreContentBlockFromDelta(delta, current);
|
|
387
383
|
}
|
|
@@ -430,6 +426,7 @@ function toChatModelStreamEvent(event) {
|
|
|
430
426
|
var MessageAssembler = class {
|
|
431
427
|
activeMessages = /* @__PURE__ */ new Map();
|
|
432
428
|
activeByNamespaceNode = /* @__PURE__ */ new Map();
|
|
429
|
+
blockIndexByProtocolIndexAndType = /* @__PURE__ */ new Map();
|
|
433
430
|
/**
|
|
434
431
|
* Applies a single message event and returns the resulting assembly update.
|
|
435
432
|
*
|
|
@@ -483,6 +480,7 @@ var MessageAssembler = class {
|
|
|
483
480
|
switch (data.event) {
|
|
484
481
|
case "content-block-start":
|
|
485
482
|
message.blocks[data.index] = cloneBlock(data.content);
|
|
483
|
+
this.blockIndexByProtocolIndexAndType.set(blockIndexKey(activeKey, data.index, data.content.type), data.index);
|
|
486
484
|
return {
|
|
487
485
|
kind: "content-block-start",
|
|
488
486
|
key: activeKey,
|
|
@@ -495,32 +493,36 @@ var MessageAssembler = class {
|
|
|
495
493
|
const deltaEvent = data;
|
|
496
494
|
const deltaBlock = deltaEvent.content ?? (deltaEvent.delta != null ? blockFromDelta(deltaEvent.delta, message.blocks[data.index]) : void 0);
|
|
497
495
|
if (deltaBlock == null) throw new Error("Received content-block-delta without content");
|
|
498
|
-
const
|
|
499
|
-
message.blocks[
|
|
496
|
+
const targetIndex = this.resolveBlockIndex(activeKey, message.blocks, data.index, deltaBlock.type);
|
|
497
|
+
const current = message.blocks[targetIndex];
|
|
498
|
+
message.blocks[targetIndex] = deltaEvent.content != null ? current == null ? cloneBlock(deltaEvent.content) : applyContentDelta(current, deltaEvent.content) : applyCoreEventDelta(current, data);
|
|
500
499
|
return {
|
|
501
500
|
kind: "content-block-delta",
|
|
502
501
|
key: activeKey,
|
|
503
502
|
message,
|
|
504
|
-
index:
|
|
503
|
+
index: targetIndex,
|
|
505
504
|
block: deltaBlock,
|
|
506
505
|
event
|
|
507
506
|
};
|
|
508
507
|
}
|
|
509
|
-
case "content-block-finish":
|
|
510
|
-
|
|
508
|
+
case "content-block-finish": {
|
|
509
|
+
const targetIndex = this.resolveFinishBlockIndex(activeKey, data.index, data.content.type);
|
|
510
|
+
message.blocks[targetIndex] = cloneBlock(data.content);
|
|
511
511
|
return {
|
|
512
512
|
kind: "content-block-finish",
|
|
513
513
|
key: activeKey,
|
|
514
514
|
message,
|
|
515
|
-
index:
|
|
515
|
+
index: targetIndex,
|
|
516
516
|
block: data.content,
|
|
517
517
|
event
|
|
518
518
|
};
|
|
519
|
+
}
|
|
519
520
|
case "message-finish":
|
|
520
521
|
message.usage = data.usage;
|
|
521
522
|
message.finishMetadata = data.responseMetadata;
|
|
522
523
|
this.activeMessages.delete(activeKey);
|
|
523
524
|
this.activeByNamespaceNode.delete(namespaceNodeKey);
|
|
525
|
+
this.clearBlockIndexAliases(activeKey);
|
|
524
526
|
return {
|
|
525
527
|
kind: "message-finish",
|
|
526
528
|
key: activeKey,
|
|
@@ -534,6 +536,7 @@ var MessageAssembler = class {
|
|
|
534
536
|
};
|
|
535
537
|
this.activeMessages.delete(activeKey);
|
|
536
538
|
this.activeByNamespaceNode.delete(namespaceNodeKey);
|
|
539
|
+
this.clearBlockIndexAliases(activeKey);
|
|
537
540
|
return {
|
|
538
541
|
kind: "message-error",
|
|
539
542
|
key: activeKey,
|
|
@@ -542,7 +545,44 @@ var MessageAssembler = class {
|
|
|
542
545
|
};
|
|
543
546
|
}
|
|
544
547
|
}
|
|
548
|
+
resolveBlockIndex(activeKey, blocks, protocolIndex, blockType) {
|
|
549
|
+
const current = blocks[protocolIndex];
|
|
550
|
+
if (current == null || current.type === blockType || areCompatibleBlockTypes(current.type, blockType)) {
|
|
551
|
+
this.blockIndexByProtocolIndexAndType.set(blockIndexKey(activeKey, protocolIndex, blockType), protocolIndex);
|
|
552
|
+
return protocolIndex;
|
|
553
|
+
}
|
|
554
|
+
const key = blockIndexKey(activeKey, protocolIndex, blockType);
|
|
555
|
+
const existing = this.blockIndexByProtocolIndexAndType.get(key);
|
|
556
|
+
if (existing != null) return existing;
|
|
557
|
+
const nextIndex = blocks.length;
|
|
558
|
+
this.blockIndexByProtocolIndexAndType.set(key, nextIndex);
|
|
559
|
+
return nextIndex;
|
|
560
|
+
}
|
|
561
|
+
resolveFinishBlockIndex(activeKey, protocolIndex, blockType) {
|
|
562
|
+
const key = blockIndexKey(activeKey, protocolIndex, blockType);
|
|
563
|
+
const existing = this.blockIndexByProtocolIndexAndType.get(key);
|
|
564
|
+
if (existing != null) return existing;
|
|
565
|
+
this.blockIndexByProtocolIndexAndType.set(key, protocolIndex);
|
|
566
|
+
return protocolIndex;
|
|
567
|
+
}
|
|
568
|
+
clearBlockIndexAliases(activeKey) {
|
|
569
|
+
const prefix = `${activeKey}::`;
|
|
570
|
+
for (const key of this.blockIndexByProtocolIndexAndType.keys()) if (key.startsWith(prefix)) this.blockIndexByProtocolIndexAndType.delete(key);
|
|
571
|
+
}
|
|
545
572
|
};
|
|
573
|
+
function blockIndexKey(activeKey, protocolIndex, blockType) {
|
|
574
|
+
return `${activeKey}::${protocolIndex}::${blockType}`;
|
|
575
|
+
}
|
|
576
|
+
function areCompatibleBlockTypes(currentType, nextType) {
|
|
577
|
+
const toolCallTypes = new Set([
|
|
578
|
+
"tool_call",
|
|
579
|
+
"tool_call_chunk",
|
|
580
|
+
"tool_use",
|
|
581
|
+
"input_json_delta"
|
|
582
|
+
]);
|
|
583
|
+
const serverToolCallTypes = new Set(["server_tool_call", "server_tool_call_chunk"]);
|
|
584
|
+
return toolCallTypes.has(currentType) && toolCallTypes.has(nextType) || serverToolCallTypes.has(currentType) && serverToolCallTypes.has(nextType);
|
|
585
|
+
}
|
|
546
586
|
/**
|
|
547
587
|
* Assembles `messages` events into {@link StreamingMessage} instances
|
|
548
588
|
* with live text/reasoning delta streams, matching the in-process
|