@yolk-sdk/agent 0.1.0-canary.25 → 0.1.0-canary.26

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/README.md CHANGED
@@ -66,7 +66,11 @@ import {
66
66
  makeQuestionToolModule,
67
67
  resolveTools
68
68
  } from '@yolk-sdk/agent/tools'
69
- import { useAgentChat } from '@yolk-sdk/agent/react'
69
+ import {
70
+ applyAgentEventToChatProjection,
71
+ makeAgentChatEventProjectionState,
72
+ useAgentChat
73
+ } from '@yolk-sdk/agent/react'
70
74
  import { makeOpenAiProviderLayer } from '@yolk-sdk/agent/providers/openai/provider'
71
75
  ```
72
76
 
@@ -207,6 +211,29 @@ Annotations must be JSON-compatible. Use stable app-owned keys, preferably `snak
207
211
  strings for dates inside annotations. Never put secrets, credentials, private ids, auth state, or
208
212
  hidden policy in annotations, author, or timestamps; providers may send them to models.
209
213
 
214
+ ## Replay-safe chat projection
215
+
216
+ Durable transports may reconnect or replay overlapping chunks. Protocol events can carry optional
217
+ `eventId`; `LLMTextDelta` and `LLMReasoningDelta` can also carry `textSoFar` / `reasoningSoFar`
218
+ snapshots when a host can provide cumulative text.
219
+
220
+ Use `applyAgentEventToChatProjection` for replayable event logs:
221
+
222
+ ```ts
223
+ import {
224
+ applyAgentEventToChatProjection,
225
+ makeAgentChatEventProjectionState
226
+ } from '@yolk-sdk/agent/react'
227
+
228
+ const projection = events.reduce(
229
+ (state, event) => applyAgentEventToChatProjection(state, event),
230
+ makeAgentChatEventProjectionState()
231
+ )
232
+ ```
233
+
234
+ Use `applyAgentEventToChatMessages` only for ephemeral local streams where append-only deltas cannot
235
+ replay.
236
+
210
237
  ## Transcript invariants
211
238
 
212
239
  Every assistant host tool call must be followed by a matching `ToolResultMessage` before the next
@@ -100,12 +100,14 @@ declare const LLMStreamStart_base: Schema.Class<LLMStreamStart, Schema.TaggedStr
100
100
  declare class LLMStreamStart extends LLMStreamStart_base {}
101
101
  declare const LLMTextDelta_base: Schema.Class<LLMTextDelta, Schema.TaggedStruct<"LLMTextDelta", {
102
102
  readonly text: Schema.String;
103
+ readonly textSoFar: Schema.optional<Schema.String>;
103
104
  readonly eventId: Schema.optional<Schema.Trimmed>;
104
105
  readonly createdAtMs: Schema.optional<Schema.Number>;
105
106
  }>, {}>;
106
107
  declare class LLMTextDelta extends LLMTextDelta_base {}
107
108
  declare const LLMReasoningDelta_base: Schema.Class<LLMReasoningDelta, Schema.TaggedStruct<"LLMReasoningDelta", {
108
109
  readonly text: Schema.String;
110
+ readonly reasoningSoFar: Schema.optional<Schema.String>;
109
111
  readonly eventId: Schema.optional<Schema.Trimmed>;
110
112
  readonly createdAtMs: Schema.optional<Schema.Number>;
111
113
  }>, {}>;
@@ -1 +1 @@
1
- {"version":3,"file":"event.d.mts","names":[],"sources":["../../src/protocol/event.ts"],"mappings":"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"}
1
+ {"version":3,"file":"event.d.mts","names":[],"sources":["../../src/protocol/event.ts"],"mappings":"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"}
@@ -105,11 +105,13 @@ var LLMStreamStart = class extends Schema.TaggedClass()("LLMStreamStart", {
105
105
  }) {};
106
106
  var LLMTextDelta = class extends Schema.TaggedClass()("LLMTextDelta", {
107
107
  ...EventIdentity,
108
- text: Schema.String
108
+ text: Schema.String,
109
+ textSoFar: Schema.optional(Schema.String)
109
110
  }) {};
110
111
  var LLMReasoningDelta = class extends Schema.TaggedClass()("LLMReasoningDelta", {
111
112
  ...EventIdentity,
112
- text: Schema.String
113
+ text: Schema.String,
114
+ reasoningSoFar: Schema.optional(Schema.String)
113
115
  }) {};
114
116
  var ToolInputStart = class extends Schema.TaggedClass()("ToolInputStart", {
115
117
  ...EventIdentity,
@@ -1 +1 @@
1
- {"version":3,"file":"event.mjs","names":[],"sources":["../../src/protocol/event.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\nimport { AssistantAgentMessage, AgentMessage } from './message.ts'\nimport {\n HitlRequest,\n QuestionAnswer,\n QuestionRequest,\n QuestionResponse,\n ToolApprovalRequest,\n ToolApprovalResponse,\n ToolCall,\n ToolResult,\n type HitlResponse\n} from './tool.ts'\nimport { AgentUsage } from './usage.ts'\n\nconst NonEmptyTrimmedString = Schema.Trimmed.pipe(Schema.check(Schema.isNonEmpty()))\n\nconst EventIdentity = {\n eventId: Schema.optional(NonEmptyTrimmedString),\n createdAtMs: Schema.optional(Schema.Number)\n}\n\nexport const SubagentStatus = Schema.Literals(['running', 'completed', 'error'])\nexport type SubagentStatus = typeof SubagentStatus.Type\n\nexport const AgentErrorCode = Schema.Literals([\n 'validation_error',\n 'provider_error',\n 'rate_limit',\n 'overloaded',\n 'context_overflow',\n 'invalid_response',\n 'tool_error',\n 'tool_denied',\n 'tool_timeout',\n 'store_error',\n 'aborted',\n 'session_not_found',\n 'conflict',\n 'unknown'\n])\nexport type AgentErrorCode = typeof AgentErrorCode.Type\n\nexport const ProviderFailureKind = Schema.Literals([\n 'rate_limit',\n 'overloaded',\n 'server_error',\n 'network',\n 'stream',\n 'auth',\n 'context_overflow',\n 'invalid_response',\n 'unknown'\n])\nexport type ProviderFailureKind = typeof ProviderFailureKind.Type\n\nexport class ProviderErrorInfo extends Schema.Class<ProviderErrorInfo>('ProviderErrorInfo')({\n provider: NonEmptyTrimmedString,\n kind: ProviderFailureKind,\n status: Schema.optional(Schema.Number),\n providerCode: Schema.optional(Schema.String),\n retryAfterMs: Schema.optional(Schema.Number)\n}) {}\n\nexport class AgentStart extends Schema.TaggedClass<AgentStart>()('AgentStart', {\n ...EventIdentity\n}) {}\n\nexport class AgentError extends Schema.TaggedClass<AgentError>()('AgentError', {\n ...EventIdentity,\n code: AgentErrorCode,\n message: Schema.String,\n retryable: Schema.Boolean,\n provider: Schema.optional(ProviderErrorInfo)\n}) {}\n\nexport class AgentEnd extends Schema.TaggedClass<AgentEnd>()('AgentEnd', {\n ...EventIdentity,\n messages: Schema.Array(AgentMessage),\n turns: Schema.Number,\n usage: AgentUsage\n}) {}\n\nexport class AgentAwaitingInput extends Schema.TaggedClass<AgentAwaitingInput>()(\n 'AgentAwaitingInput',\n {\n ...EventIdentity,\n requests: Schema.NonEmptyArray(HitlRequest),\n messages: Schema.Array(AgentMessage),\n turns: Schema.Number,\n usage: AgentUsage\n }\n) {}\n\nexport class UsageUpdate extends Schema.TaggedClass<UsageUpdate>()('UsageUpdate', {\n ...EventIdentity,\n usage: AgentUsage\n}) {}\n\nexport class AgentRetry extends Schema.TaggedClass<AgentRetry>()('AgentRetry', {\n ...EventIdentity,\n attempt: Schema.Number,\n reason: AgentErrorCode,\n delayMs: Schema.Number,\n message: Schema.String,\n provider: Schema.optional(ProviderErrorInfo)\n}) {}\n\nexport class CompactionStart extends Schema.TaggedClass<CompactionStart>()('CompactionStart', {\n ...EventIdentity,\n strategy: Schema.String\n}) {}\n\nexport class CompactionEnd extends Schema.TaggedClass<CompactionEnd>()('CompactionEnd', {\n ...EventIdentity,\n strategy: Schema.String,\n beforeTokens: Schema.optional(Schema.Number),\n afterTokens: Schema.optional(Schema.Number)\n}) {}\n\nexport class TurnStart extends Schema.TaggedClass<TurnStart>()('TurnStart', {\n ...EventIdentity,\n turn: Schema.Number\n}) {}\n\nexport class TurnEnd extends Schema.TaggedClass<TurnEnd>()('TurnEnd', {\n ...EventIdentity,\n turn: Schema.Number,\n reason: Schema.Literals(['stop', 'tool_use'])\n}) {}\n\nexport class LLMStreamStart extends Schema.TaggedClass<LLMStreamStart>()('LLMStreamStart', {\n ...EventIdentity,\n turn: Schema.Number\n}) {}\n\nexport class LLMTextDelta extends Schema.TaggedClass<LLMTextDelta>()('LLMTextDelta', {\n ...EventIdentity,\n text: Schema.String\n}) {}\n\nexport class LLMReasoningDelta extends Schema.TaggedClass<LLMReasoningDelta>()(\n 'LLMReasoningDelta',\n {\n ...EventIdentity,\n text: Schema.String\n }\n) {}\n\nexport class ToolInputStart extends Schema.TaggedClass<ToolInputStart>()('ToolInputStart', {\n ...EventIdentity,\n id: Schema.String,\n name: Schema.optional(Schema.String)\n}) {}\n\nexport class ToolInputDelta extends Schema.TaggedClass<ToolInputDelta>()('ToolInputDelta', {\n ...EventIdentity,\n id: Schema.String,\n delta: Schema.String\n}) {}\n\nexport class ToolInputEnd extends Schema.TaggedClass<ToolInputEnd>()('ToolInputEnd', {\n ...EventIdentity,\n call: ToolCall\n}) {}\n\nexport class ToolApprovalRequested extends Schema.TaggedClass<ToolApprovalRequested>()(\n 'ToolApprovalRequested',\n {\n ...EventIdentity,\n call: ToolCall,\n request: Schema.optional(ToolApprovalRequest)\n }\n) {}\n\nexport class ToolApprovalGranted extends Schema.TaggedClass<ToolApprovalGranted>()(\n 'ToolApprovalGranted',\n {\n ...EventIdentity,\n toolCallId: Schema.String,\n response: Schema.optional(ToolApprovalResponse)\n }\n) {}\n\nexport class ToolApprovalDenied extends Schema.TaggedClass<ToolApprovalDenied>()(\n 'ToolApprovalDenied',\n {\n ...EventIdentity,\n toolCallId: Schema.String,\n reason: Schema.String,\n response: Schema.optional(ToolApprovalResponse)\n }\n) {}\n\nexport class QuestionRequested extends Schema.TaggedClass<QuestionRequested>()(\n 'QuestionRequested',\n {\n ...EventIdentity,\n request: QuestionRequest\n }\n) {}\n\nexport class QuestionAnswered extends Schema.TaggedClass<QuestionAnswered>()('QuestionAnswered', {\n ...EventIdentity,\n response: QuestionResponse\n}) {}\n\nexport class QuestionCancelled extends Schema.TaggedClass<QuestionCancelled>()(\n 'QuestionCancelled',\n {\n ...EventIdentity,\n response: QuestionResponse\n }\n) {}\n\nexport class LLMStreamEnd extends Schema.TaggedClass<LLMStreamEnd>()('LLMStreamEnd', {\n ...EventIdentity,\n turn: Schema.Number\n}) {}\n\nexport class AssistantMessageEvent extends Schema.TaggedClass<AssistantMessageEvent>()(\n 'AssistantMessage',\n {\n ...EventIdentity,\n message: AssistantAgentMessage\n }\n) {}\n\nexport class ToolExecutionStarted extends Schema.TaggedClass<ToolExecutionStarted>()(\n 'ToolExecutionStarted',\n {\n ...EventIdentity,\n call: ToolCall\n }\n) {}\n\nexport class ToolExecutionCompleted extends Schema.TaggedClass<ToolExecutionCompleted>()(\n 'ToolExecutionCompleted',\n {\n ...EventIdentity,\n call: ToolCall,\n result: ToolResult\n }\n) {}\n\nexport class ToolExecutionError extends Schema.TaggedClass<ToolExecutionError>()(\n 'ToolExecutionError',\n {\n ...EventIdentity,\n call: ToolCall,\n message: Schema.String,\n code: AgentErrorCode\n }\n) {}\n\nexport class ProviderToolResult extends Schema.TaggedClass<ProviderToolResult>()(\n 'ProviderToolResult',\n {\n ...EventIdentity,\n call: ToolCall,\n result: ToolResult\n }\n) {}\n\nexport class SubagentStarted extends Schema.TaggedClass<SubagentStarted>()('SubagentStarted', {\n ...EventIdentity,\n parentToolCallId: NonEmptyTrimmedString,\n subagentRunId: NonEmptyTrimmedString,\n subagentType: NonEmptyTrimmedString,\n description: Schema.String,\n model: Schema.String\n}) {}\n\nexport class SubagentCompleted extends Schema.TaggedClass<SubagentCompleted>()(\n 'SubagentCompleted',\n {\n ...EventIdentity,\n parentToolCallId: NonEmptyTrimmedString,\n subagentRunId: NonEmptyTrimmedString,\n subagentType: NonEmptyTrimmedString,\n description: Schema.String,\n model: Schema.String,\n status: SubagentStatus,\n durationMs: Schema.Number,\n summary: Schema.optional(Schema.String)\n }\n) {}\n\nexport const makeSubagentRunId = (parentToolCallId: string) => `subagent:${parentToolCallId}`\n\nconst questionAnswerValue = (answer: QuestionAnswer) =>\n QuestionAnswer.make({\n questionId: answer.questionId,\n ...(answer.optionIds === undefined ? {} : { optionIds: [...answer.optionIds] }),\n ...(answer.customAnswer === undefined ? {} : { customAnswer: answer.customAnswer })\n })\n\nconst questionResponseValue = (response: QuestionResponse) =>\n QuestionResponse.make({\n requestId: response.requestId,\n toolCallId: response.toolCallId,\n outcome: response.outcome,\n source: response.source,\n ...(response.answers === undefined\n ? {}\n : { answers: response.answers.map(answer => questionAnswerValue(answer)) }),\n ...(response.reason === undefined ? {} : { reason: response.reason })\n })\n\nconst toolApprovalResponseValue = (response: ToolApprovalResponse) =>\n ToolApprovalResponse.make({\n requestId: response.requestId,\n toolCallId: response.toolCallId,\n decision: response.decision,\n source: response.source,\n ...(response.reason === undefined ? {} : { reason: response.reason })\n })\n\nexport const hitlResponseEvent = (response: HitlResponse): AgentEvent => {\n switch (response._tag) {\n case 'QuestionResponse': {\n const responseValue = questionResponseValue(response)\n\n return response.outcome === 'answered'\n ? QuestionAnswered.make({ response: responseValue })\n : QuestionCancelled.make({ response: responseValue })\n }\n case 'ToolApprovalResponse': {\n const responseValue = toolApprovalResponseValue(response)\n\n return response.decision === 'approved'\n ? ToolApprovalGranted.make({ toolCallId: response.toolCallId, response: responseValue })\n : ToolApprovalDenied.make({\n toolCallId: response.toolCallId,\n reason: response.reason ?? 'Denied by user',\n response: responseValue\n })\n }\n }\n}\n\nexport const AgentEvent = Schema.Union([\n AgentStart,\n AgentError,\n AgentEnd,\n AgentAwaitingInput,\n UsageUpdate,\n AgentRetry,\n CompactionStart,\n CompactionEnd,\n TurnStart,\n TurnEnd,\n LLMStreamStart,\n LLMTextDelta,\n LLMReasoningDelta,\n ToolInputStart,\n ToolInputDelta,\n ToolInputEnd,\n LLMStreamEnd,\n AssistantMessageEvent,\n ToolApprovalRequested,\n ToolApprovalGranted,\n ToolApprovalDenied,\n QuestionRequested,\n QuestionAnswered,\n QuestionCancelled,\n ToolExecutionStarted,\n ToolExecutionCompleted,\n ToolExecutionError,\n ProviderToolResult,\n SubagentStarted,\n SubagentCompleted\n])\nexport type AgentEvent = typeof AgentEvent.Type\n"],"mappings":"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"}
1
+ {"version":3,"file":"event.mjs","names":[],"sources":["../../src/protocol/event.ts"],"sourcesContent":["import * as Schema from 'effect/Schema'\nimport { AssistantAgentMessage, AgentMessage } from './message.ts'\nimport {\n HitlRequest,\n QuestionAnswer,\n QuestionRequest,\n QuestionResponse,\n ToolApprovalRequest,\n ToolApprovalResponse,\n ToolCall,\n ToolResult,\n type HitlResponse\n} from './tool.ts'\nimport { AgentUsage } from './usage.ts'\n\nconst NonEmptyTrimmedString = Schema.Trimmed.pipe(Schema.check(Schema.isNonEmpty()))\n\nconst EventIdentity = {\n eventId: Schema.optional(NonEmptyTrimmedString),\n createdAtMs: Schema.optional(Schema.Number)\n}\n\nexport const SubagentStatus = Schema.Literals(['running', 'completed', 'error'])\nexport type SubagentStatus = typeof SubagentStatus.Type\n\nexport const AgentErrorCode = Schema.Literals([\n 'validation_error',\n 'provider_error',\n 'rate_limit',\n 'overloaded',\n 'context_overflow',\n 'invalid_response',\n 'tool_error',\n 'tool_denied',\n 'tool_timeout',\n 'store_error',\n 'aborted',\n 'session_not_found',\n 'conflict',\n 'unknown'\n])\nexport type AgentErrorCode = typeof AgentErrorCode.Type\n\nexport const ProviderFailureKind = Schema.Literals([\n 'rate_limit',\n 'overloaded',\n 'server_error',\n 'network',\n 'stream',\n 'auth',\n 'context_overflow',\n 'invalid_response',\n 'unknown'\n])\nexport type ProviderFailureKind = typeof ProviderFailureKind.Type\n\nexport class ProviderErrorInfo extends Schema.Class<ProviderErrorInfo>('ProviderErrorInfo')({\n provider: NonEmptyTrimmedString,\n kind: ProviderFailureKind,\n status: Schema.optional(Schema.Number),\n providerCode: Schema.optional(Schema.String),\n retryAfterMs: Schema.optional(Schema.Number)\n}) {}\n\nexport class AgentStart extends Schema.TaggedClass<AgentStart>()('AgentStart', {\n ...EventIdentity\n}) {}\n\nexport class AgentError extends Schema.TaggedClass<AgentError>()('AgentError', {\n ...EventIdentity,\n code: AgentErrorCode,\n message: Schema.String,\n retryable: Schema.Boolean,\n provider: Schema.optional(ProviderErrorInfo)\n}) {}\n\nexport class AgentEnd extends Schema.TaggedClass<AgentEnd>()('AgentEnd', {\n ...EventIdentity,\n messages: Schema.Array(AgentMessage),\n turns: Schema.Number,\n usage: AgentUsage\n}) {}\n\nexport class AgentAwaitingInput extends Schema.TaggedClass<AgentAwaitingInput>()(\n 'AgentAwaitingInput',\n {\n ...EventIdentity,\n requests: Schema.NonEmptyArray(HitlRequest),\n messages: Schema.Array(AgentMessage),\n turns: Schema.Number,\n usage: AgentUsage\n }\n) {}\n\nexport class UsageUpdate extends Schema.TaggedClass<UsageUpdate>()('UsageUpdate', {\n ...EventIdentity,\n usage: AgentUsage\n}) {}\n\nexport class AgentRetry extends Schema.TaggedClass<AgentRetry>()('AgentRetry', {\n ...EventIdentity,\n attempt: Schema.Number,\n reason: AgentErrorCode,\n delayMs: Schema.Number,\n message: Schema.String,\n provider: Schema.optional(ProviderErrorInfo)\n}) {}\n\nexport class CompactionStart extends Schema.TaggedClass<CompactionStart>()('CompactionStart', {\n ...EventIdentity,\n strategy: Schema.String\n}) {}\n\nexport class CompactionEnd extends Schema.TaggedClass<CompactionEnd>()('CompactionEnd', {\n ...EventIdentity,\n strategy: Schema.String,\n beforeTokens: Schema.optional(Schema.Number),\n afterTokens: Schema.optional(Schema.Number)\n}) {}\n\nexport class TurnStart extends Schema.TaggedClass<TurnStart>()('TurnStart', {\n ...EventIdentity,\n turn: Schema.Number\n}) {}\n\nexport class TurnEnd extends Schema.TaggedClass<TurnEnd>()('TurnEnd', {\n ...EventIdentity,\n turn: Schema.Number,\n reason: Schema.Literals(['stop', 'tool_use'])\n}) {}\n\nexport class LLMStreamStart extends Schema.TaggedClass<LLMStreamStart>()('LLMStreamStart', {\n ...EventIdentity,\n turn: Schema.Number\n}) {}\n\nexport class LLMTextDelta extends Schema.TaggedClass<LLMTextDelta>()('LLMTextDelta', {\n ...EventIdentity,\n text: Schema.String,\n textSoFar: Schema.optional(Schema.String)\n}) {}\n\nexport class LLMReasoningDelta extends Schema.TaggedClass<LLMReasoningDelta>()(\n 'LLMReasoningDelta',\n {\n ...EventIdentity,\n text: Schema.String,\n reasoningSoFar: Schema.optional(Schema.String)\n }\n) {}\n\nexport class ToolInputStart extends Schema.TaggedClass<ToolInputStart>()('ToolInputStart', {\n ...EventIdentity,\n id: Schema.String,\n name: Schema.optional(Schema.String)\n}) {}\n\nexport class ToolInputDelta extends Schema.TaggedClass<ToolInputDelta>()('ToolInputDelta', {\n ...EventIdentity,\n id: Schema.String,\n delta: Schema.String\n}) {}\n\nexport class ToolInputEnd extends Schema.TaggedClass<ToolInputEnd>()('ToolInputEnd', {\n ...EventIdentity,\n call: ToolCall\n}) {}\n\nexport class ToolApprovalRequested extends Schema.TaggedClass<ToolApprovalRequested>()(\n 'ToolApprovalRequested',\n {\n ...EventIdentity,\n call: ToolCall,\n request: Schema.optional(ToolApprovalRequest)\n }\n) {}\n\nexport class ToolApprovalGranted extends Schema.TaggedClass<ToolApprovalGranted>()(\n 'ToolApprovalGranted',\n {\n ...EventIdentity,\n toolCallId: Schema.String,\n response: Schema.optional(ToolApprovalResponse)\n }\n) {}\n\nexport class ToolApprovalDenied extends Schema.TaggedClass<ToolApprovalDenied>()(\n 'ToolApprovalDenied',\n {\n ...EventIdentity,\n toolCallId: Schema.String,\n reason: Schema.String,\n response: Schema.optional(ToolApprovalResponse)\n }\n) {}\n\nexport class QuestionRequested extends Schema.TaggedClass<QuestionRequested>()(\n 'QuestionRequested',\n {\n ...EventIdentity,\n request: QuestionRequest\n }\n) {}\n\nexport class QuestionAnswered extends Schema.TaggedClass<QuestionAnswered>()('QuestionAnswered', {\n ...EventIdentity,\n response: QuestionResponse\n}) {}\n\nexport class QuestionCancelled extends Schema.TaggedClass<QuestionCancelled>()(\n 'QuestionCancelled',\n {\n ...EventIdentity,\n response: QuestionResponse\n }\n) {}\n\nexport class LLMStreamEnd extends Schema.TaggedClass<LLMStreamEnd>()('LLMStreamEnd', {\n ...EventIdentity,\n turn: Schema.Number\n}) {}\n\nexport class AssistantMessageEvent extends Schema.TaggedClass<AssistantMessageEvent>()(\n 'AssistantMessage',\n {\n ...EventIdentity,\n message: AssistantAgentMessage\n }\n) {}\n\nexport class ToolExecutionStarted extends Schema.TaggedClass<ToolExecutionStarted>()(\n 'ToolExecutionStarted',\n {\n ...EventIdentity,\n call: ToolCall\n }\n) {}\n\nexport class ToolExecutionCompleted extends Schema.TaggedClass<ToolExecutionCompleted>()(\n 'ToolExecutionCompleted',\n {\n ...EventIdentity,\n call: ToolCall,\n result: ToolResult\n }\n) {}\n\nexport class ToolExecutionError extends Schema.TaggedClass<ToolExecutionError>()(\n 'ToolExecutionError',\n {\n ...EventIdentity,\n call: ToolCall,\n message: Schema.String,\n code: AgentErrorCode\n }\n) {}\n\nexport class ProviderToolResult extends Schema.TaggedClass<ProviderToolResult>()(\n 'ProviderToolResult',\n {\n ...EventIdentity,\n call: ToolCall,\n result: ToolResult\n }\n) {}\n\nexport class SubagentStarted extends Schema.TaggedClass<SubagentStarted>()('SubagentStarted', {\n ...EventIdentity,\n parentToolCallId: NonEmptyTrimmedString,\n subagentRunId: NonEmptyTrimmedString,\n subagentType: NonEmptyTrimmedString,\n description: Schema.String,\n model: Schema.String\n}) {}\n\nexport class SubagentCompleted extends Schema.TaggedClass<SubagentCompleted>()(\n 'SubagentCompleted',\n {\n ...EventIdentity,\n parentToolCallId: NonEmptyTrimmedString,\n subagentRunId: NonEmptyTrimmedString,\n subagentType: NonEmptyTrimmedString,\n description: Schema.String,\n model: Schema.String,\n status: SubagentStatus,\n durationMs: Schema.Number,\n summary: Schema.optional(Schema.String)\n }\n) {}\n\nexport const makeSubagentRunId = (parentToolCallId: string) => `subagent:${parentToolCallId}`\n\nconst questionAnswerValue = (answer: QuestionAnswer) =>\n QuestionAnswer.make({\n questionId: answer.questionId,\n ...(answer.optionIds === undefined ? {} : { optionIds: [...answer.optionIds] }),\n ...(answer.customAnswer === undefined ? {} : { customAnswer: answer.customAnswer })\n })\n\nconst questionResponseValue = (response: QuestionResponse) =>\n QuestionResponse.make({\n requestId: response.requestId,\n toolCallId: response.toolCallId,\n outcome: response.outcome,\n source: response.source,\n ...(response.answers === undefined\n ? {}\n : { answers: response.answers.map(answer => questionAnswerValue(answer)) }),\n ...(response.reason === undefined ? {} : { reason: response.reason })\n })\n\nconst toolApprovalResponseValue = (response: ToolApprovalResponse) =>\n ToolApprovalResponse.make({\n requestId: response.requestId,\n toolCallId: response.toolCallId,\n decision: response.decision,\n source: response.source,\n ...(response.reason === undefined ? {} : { reason: response.reason })\n })\n\nexport const hitlResponseEvent = (response: HitlResponse): AgentEvent => {\n switch (response._tag) {\n case 'QuestionResponse': {\n const responseValue = questionResponseValue(response)\n\n return response.outcome === 'answered'\n ? QuestionAnswered.make({ response: responseValue })\n : QuestionCancelled.make({ response: responseValue })\n }\n case 'ToolApprovalResponse': {\n const responseValue = toolApprovalResponseValue(response)\n\n return response.decision === 'approved'\n ? ToolApprovalGranted.make({ toolCallId: response.toolCallId, response: responseValue })\n : ToolApprovalDenied.make({\n toolCallId: response.toolCallId,\n reason: response.reason ?? 'Denied by user',\n response: responseValue\n })\n }\n }\n}\n\nexport const AgentEvent = Schema.Union([\n AgentStart,\n AgentError,\n AgentEnd,\n AgentAwaitingInput,\n UsageUpdate,\n AgentRetry,\n CompactionStart,\n CompactionEnd,\n TurnStart,\n TurnEnd,\n LLMStreamStart,\n LLMTextDelta,\n LLMReasoningDelta,\n ToolInputStart,\n ToolInputDelta,\n ToolInputEnd,\n LLMStreamEnd,\n AssistantMessageEvent,\n ToolApprovalRequested,\n ToolApprovalGranted,\n ToolApprovalDenied,\n QuestionRequested,\n QuestionAnswered,\n QuestionCancelled,\n ToolExecutionStarted,\n ToolExecutionCompleted,\n ToolExecutionError,\n ProviderToolResult,\n SubagentStarted,\n SubagentCompleted\n])\nexport type AgentEvent = typeof AgentEvent.Type\n"],"mappings":"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"}
@@ -13,7 +13,19 @@ type AgentChatState = {
13
13
  readonly sessionEvents: ReadonlyArray<AgentChatSessionEvent>;
14
14
  readonly seenEventIds: ReadonlyArray<string>;
15
15
  };
16
+ type AgentChatEventProjectionState = {
17
+ readonly chatMessages: ReadonlyArray<AgentChatMessage>;
18
+ readonly seenEventIds: ReadonlyArray<string>;
19
+ };
16
20
  declare const initialAgentChatState: AgentChatState;
21
+ declare const makeAgentChatEventProjectionState: (chatMessages?: ReadonlyArray<AgentChatMessage>) => AgentChatEventProjectionState;
22
+ /**
23
+ * Applies replayable agent events to chat messages while deduping by `eventId`.
24
+ *
25
+ * Use this for durable streams that may reconnect, overlap, or replay events.
26
+ * For ephemeral local streams, `applyAgentEventToChatMessages` is still useful.
27
+ */
28
+ declare const applyAgentEventToChatProjection: (state: AgentChatEventProjectionState, event: AgentEvent, options?: ApplyAgentEventToChatMessagesOptions) => AgentChatEventProjectionState;
17
29
  type AgentChatAction = {
18
30
  readonly _tag: 'HydrateMessage';
19
31
  readonly message: AgentMessage;
@@ -79,5 +91,5 @@ declare const getAgentChatLiveActivityCount: ({
79
91
  isVoiceActive
80
92
  }: AgentChatLiveActivityInput) => number;
81
93
  //#endregion
82
- export { ActiveChatToolPart, AgentChatAction, AgentChatState, AgentRunStatus, CompletedChatToolPart, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, reduceAgentChatState };
94
+ export { ActiveChatToolPart, AgentChatAction, AgentChatEventProjectionState, AgentChatState, AgentRunStatus, CompletedChatToolPart, applyAgentEventToChatProjection, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, makeAgentChatEventProjectionState, reduceAgentChatState };
83
95
  //# sourceMappingURL=chat-core.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-core.d.mts","names":[],"sources":["../../src/react/chat-core.ts"],"mappings":";;;;;KA8BY,cAAA;AAAA,KAEA,cAAA;EAAA,SACD,MAAA,EAAQ,cAAA;EAAA,SACR,KAAA;EAAA,SACA,SAAA,EAAW,UAAA;EAAA,SACX,SAAA,EAAW,UAAA;EAAA,SACX,YAAA,EAAc,aAAA,CAAc,gBAAA;EAAA,SAC5B,aAAA,EAAe,aAAA,CAAc,qBAAA;EAAA,SAC7B,YAAA,EAAc,aAAA;AAAA;AAAA,cAGZ,qBAAA,EAAuB,cAQnC;AAAA,KAaW,eAAA;EAAA,SACG,IAAA;EAAA,SAAiC,OAAA,EAAS,YAAA;AAAA;EAAA,SAC1C,IAAA;EAAA,SAAyB,OAAA,EAAS,WAAA;AAAA;EAAA,SAClC,IAAA;EAAA,SAAgC,OAAA,EAAS,YAAA;AAAA;EAAA,SACzC,IAAA;EAAA,SAAqC,QAAA,EAAU,YAAA;AAAA;EAAA,SAC/C,IAAA;EAAA,SAA6B,SAAA;AAAA;EAAA,SAC7B,IAAA;EAAA,SAAiC,SAAA;AAAA;EAAA,SACjC,IAAA;EAAA,SAAkC,SAAA;EAAA,SAA4B,OAAA,EAAS,OAAA;AAAA;EAAA,SACtE,IAAA;EAAA,SAAwB,KAAA,EAAO,UAAA;AAAA,IAAe,oCAAA;EAAA,SAC/C,IAAA;EAAA,SAAwB,OAAA;AAAA;EAAA,SACxB,IAAA;AAAA;AAAA,cAEF,oBAAA,GACX,KAAA,EAAO,cAAA,EACP,MAAA,EAAQ,eAAA,KACP,cAAA;AAAA,cAwOU,wBAAA,GAA4B,OAAqB,EAAZ,YAAY;AAAA,cAIjD,4BAAA,GAAgC,KAAqB,EAAd,cAAc;AAAA,cAKrD,oBAAA,GAAwB,IAAmB,EAAb,aAAa;AAAA,KAQ5C,kBAAA,GAAqB,OAAO,CAAC,aAAA;EAAA,SAA0B,IAAA;AAAA;AAAA,cAEtD,uBAAA,GAA2B,IAAmB,EAAb,aAAa;AAAA,KAE/C,qBAAA,GAAwB,OAAO,CAAC,aAAA;EAAA,SAA0B,IAAA;AAAA;AAAA,cAEzD,sBAAA,GAA0B,QAAA,EAAU,aAAA,CAAc,gBAAA;EAAA;;;kBAAD,aAAA;AAAA;AAAA,cAKjD,yBAAA,GAA6B,QAAA,EAAU,aAAA,CAAc,gBAAA;EAAA;;;kBAAD,aAAA;AAAA;AAAA,KAK5D,0BAAA;EAAA,SACM,aAAA;EAAA,SACA,mBAAA;EAAA,SACA,aAAA;AAAA;AAAA,cAGE,6BAAA;EAAiC,aAAA;EAAA,mBAAA;EAAA;AAAA,GAI3C,0BAAA"}
1
+ {"version":3,"file":"chat-core.d.mts","names":[],"sources":["../../src/react/chat-core.ts"],"mappings":";;;;;KA8BY,cAAA;AAAA,KAEA,cAAA;EAAA,SACD,MAAA,EAAQ,cAAA;EAAA,SACR,KAAA;EAAA,SACA,SAAA,EAAW,UAAA;EAAA,SACX,SAAA,EAAW,UAAA;EAAA,SACX,YAAA,EAAc,aAAA,CAAc,gBAAA;EAAA,SAC5B,aAAA,EAAe,aAAA,CAAc,qBAAA;EAAA,SAC7B,YAAA,EAAc,aAAA;AAAA;AAAA,KAGb,6BAAA;EAAA,SACD,YAAA,EAAc,aAAA,CAAc,gBAAA;EAAA,SAC5B,YAAA,EAAc,aAAA;AAAA;AAAA,cAGZ,qBAAA,EAAuB,cAQnC;AAAA,cAmBY,iCAAA,GACX,YAAA,GAAc,aAAA,CAAc,gBAAA,MAC3B,6BAAA;;;;;;;cAWU,+BAAA,GACX,KAAA,EAAO,6BAAA,EACP,KAAA,EAAO,UAAA,EACP,OAAA,GAAS,oCAAA,KACR,6BAAA;AAAA,KAWS,eAAA;EAAA,SACG,IAAA;EAAA,SAAiC,OAAA,EAAS,YAAA;AAAA;EAAA,SAC1C,IAAA;EAAA,SAAyB,OAAA,EAAS,WAAA;AAAA;EAAA,SAClC,IAAA;EAAA,SAAgC,OAAA,EAAS,YAAA;AAAA;EAAA,SACzC,IAAA;EAAA,SAAqC,QAAA,EAAU,YAAA;AAAA;EAAA,SAC/C,IAAA;EAAA,SAA6B,SAAA;AAAA;EAAA,SAC7B,IAAA;EAAA,SAAiC,SAAA;AAAA;EAAA,SACjC,IAAA;EAAA,SAAkC,SAAA;EAAA,SAA4B,OAAA,EAAS,OAAA;AAAA;EAAA,SACtE,IAAA;EAAA,SAAwB,KAAA,EAAO,UAAA;AAAA,IAAe,oCAAA;EAAA,SAC/C,IAAA;EAAA,SAAwB,OAAA;AAAA;EAAA,SACxB,IAAA;AAAA;AAAA,cAEF,oBAAA,GACX,KAAA,EAAO,cAAA,EACP,MAAA,EAAQ,eAAA,KACP,cAAA;AAAA,cAwOU,wBAAA,GAA4B,OAAqB,EAAZ,YAAY;AAAA,cAIjD,4BAAA,GAAgC,KAAqB,EAAd,cAAc;AAAA,cAKrD,oBAAA,GAAwB,IAAmB,EAAb,aAAa;AAAA,KAQ5C,kBAAA,GAAqB,OAAO,CAAC,aAAA;EAAA,SAA0B,IAAA;AAAA;AAAA,cAEtD,uBAAA,GAA2B,IAAmB,EAAb,aAAa;AAAA,KAE/C,qBAAA,GAAwB,OAAO,CAAC,aAAA;EAAA,SAA0B,IAAA;AAAA;AAAA,cAEzD,sBAAA,GAA0B,QAAA,EAAU,aAAA,CAAc,gBAAA;EAAA;;;kBAAD,aAAA;AAAA;AAAA,cAKjD,yBAAA,GAA6B,QAAA,EAAU,aAAA,CAAc,gBAAA;EAAA;;;kBAAD,aAAA;AAAA;AAAA,KAK5D,0BAAA;EAAA,SACM,aAAA;EAAA,SACA,mBAAA;EAAA,SACA,aAAA;AAAA;AAAA,cAGE,6BAAA;EAAiC,aAAA;EAAA,mBAAA;EAAA;AAAA,GAI3C,0BAAA"}
@@ -11,15 +11,34 @@ const initialAgentChatState = {
11
11
  sessionEvents: [],
12
12
  seenEventIds: []
13
13
  };
14
- const hasSeenEvent = (state, event) => event.eventId !== void 0 && state.seenEventIds.includes(event.eventId);
14
+ const hasSeenEventId = (seenEventIds, event) => event.eventId !== void 0 && seenEventIds.includes(event.eventId);
15
+ const rememberEventId = (seenEventIds, event) => event.eventId === void 0 ? seenEventIds : [...seenEventIds, event.eventId];
16
+ const hasSeenEvent = (state, event) => hasSeenEventId(state.seenEventIds, event);
15
17
  const rememberEvent = (state, event) => event.eventId === void 0 ? state : {
16
18
  ...state,
17
- seenEventIds: [...state.seenEventIds, event.eventId]
19
+ seenEventIds: rememberEventId(state.seenEventIds, event)
18
20
  };
19
21
  const clearRetryInfo = (state) => state.retryInfo === null ? state : {
20
22
  ...state,
21
23
  retryInfo: null
22
24
  };
25
+ const makeAgentChatEventProjectionState = (chatMessages = []) => ({
26
+ chatMessages,
27
+ seenEventIds: []
28
+ });
29
+ /**
30
+ * Applies replayable agent events to chat messages while deduping by `eventId`.
31
+ *
32
+ * Use this for durable streams that may reconnect, overlap, or replay events.
33
+ * For ephemeral local streams, `applyAgentEventToChatMessages` is still useful.
34
+ */
35
+ const applyAgentEventToChatProjection = (state, event, options = {}) => {
36
+ if (hasSeenEventId(state.seenEventIds, event)) return state;
37
+ return {
38
+ chatMessages: applyAgentEventToChatMessages(state.chatMessages, event, options),
39
+ seenEventIds: rememberEventId(state.seenEventIds, event)
40
+ };
41
+ };
23
42
  const reduceAgentChatState = (state, action) => {
24
43
  switch (action._tag) {
25
44
  case "HydrateMessage": return {
@@ -200,6 +219,6 @@ const getActiveChatToolParts = (messages) => messages.flatMap((message) => messa
200
219
  const getCompletedChatToolParts = (messages) => messages.flatMap((message) => message.parts.filter((part) => isCompletedChatToolPart(part)));
201
220
  const getAgentChatLiveActivityCount = ({ isTextRunning, activeToolCallCount, isVoiceActive }) => (isTextRunning ? 1 : 0) + activeToolCallCount + (isVoiceActive ? 1 : 0);
202
221
  //#endregion
203
- export { getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, reduceAgentChatState };
222
+ export { applyAgentEventToChatProjection, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, makeAgentChatEventProjectionState, reduceAgentChatState };
204
223
 
205
224
  //# sourceMappingURL=chat-core.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-core.mjs","names":[],"sources":["../../src/react/chat-core.ts"],"sourcesContent":["import {\n hitlResponseEvent,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n type AgentRetry,\n type Content,\n type HitlResponse,\n type UserMessage\n} from '@yolk-sdk/agent/protocol'\nimport {\n appendProtocolMessage,\n applyAgentEventToChatMessages,\n deleteChatTurn,\n editChatUserMessage,\n markChatError,\n regenerateChatMessagesFrom,\n type AgentChatMessage,\n type AgentChatPart,\n type ApplyAgentEventToChatMessagesOptions\n} from './chat-messages.ts'\nimport {\n MessagesRegenerated,\n ProtocolMessageAppended,\n TurnDeleted,\n UserMessageEdited,\n UserMessageSubmitted,\n type AgentChatSessionEvent\n} from './chat-session-events.ts'\n\nexport type AgentRunStatus = 'idle' | 'running' | 'waiting' | 'done' | 'error' | 'aborted'\n\nexport type AgentChatState = {\n readonly status: AgentRunStatus\n readonly error: string | null\n readonly errorInfo: AgentError | null\n readonly retryInfo: AgentRetry | null\n readonly chatMessages: ReadonlyArray<AgentChatMessage>\n readonly sessionEvents: ReadonlyArray<AgentChatSessionEvent>\n readonly seenEventIds: ReadonlyArray<string>\n}\n\nexport const initialAgentChatState: AgentChatState = {\n status: 'idle',\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: [],\n sessionEvents: [],\n seenEventIds: []\n}\n\nconst hasSeenEvent = (state: AgentChatState, event: AgentEvent) =>\n event.eventId !== undefined && state.seenEventIds.includes(event.eventId)\n\nconst rememberEvent = (state: AgentChatState, event: AgentEvent): AgentChatState =>\n event.eventId === undefined\n ? state\n : { ...state, seenEventIds: [...state.seenEventIds, event.eventId] }\n\nconst clearRetryInfo = (state: AgentChatState): AgentChatState =>\n state.retryInfo === null ? state : { ...state, retryInfo: null }\n\nexport type AgentChatAction =\n | { readonly _tag: 'HydrateMessage'; readonly message: AgentMessage }\n | { readonly _tag: 'Submit'; readonly message: UserMessage }\n | { readonly _tag: 'AppendMessage'; readonly message: AgentMessage }\n | { readonly _tag: 'SubmitHitlResponse'; readonly response: HitlResponse }\n | { readonly _tag: 'DeleteTurn'; readonly messageId: string }\n | { readonly _tag: 'RegenerateFrom'; readonly messageId: string }\n | { readonly _tag: 'EditUserMessage'; readonly messageId: string; readonly content: Content }\n | ({ readonly _tag: 'Event'; readonly event: AgentEvent } & ApplyAgentEventToChatMessagesOptions)\n | { readonly _tag: 'Error'; readonly message: string }\n | { readonly _tag: 'Abort' }\n\nexport const reduceAgentChatState = (\n state: AgentChatState,\n action: AgentChatAction\n): AgentChatState => {\n switch (action._tag) {\n case 'HydrateMessage':\n return {\n ...state,\n chatMessages: appendProtocolMessage(state.chatMessages, action.message),\n error: null,\n errorInfo: null,\n retryInfo: null\n }\n case 'Submit':\n return {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n seenEventIds: [],\n chatMessages: appendProtocolMessage(state.chatMessages, action.message),\n sessionEvents: [\n ...state.sessionEvents,\n UserMessageSubmitted.make({ message: action.message })\n ]\n }\n case 'AppendMessage':\n return {\n ...state,\n chatMessages: appendProtocolMessage(state.chatMessages, action.message),\n error: null,\n errorInfo: null,\n retryInfo: null,\n sessionEvents: [\n ...state.sessionEvents,\n ProtocolMessageAppended.make({ message: action.message })\n ]\n }\n case 'SubmitHitlResponse':\n return {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n seenEventIds: [],\n chatMessages: applyAgentEventToChatMessages(\n state.chatMessages,\n hitlResponseEvent(action.response)\n )\n }\n case 'DeleteTurn': {\n const next = deleteChatTurn(state.chatMessages, action.messageId)\n\n if (next._tag === 'NotFound') {\n return state\n }\n\n return {\n ...state,\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: next.messages,\n sessionEvents: [\n ...state.sessionEvents,\n TurnDeleted.make({\n turnStartMessageId: next.turnStartMessageId,\n deletedMessageIds: next.deletedMessageIds\n })\n ]\n }\n }\n case 'RegenerateFrom': {\n const next = regenerateChatMessagesFrom(state.chatMessages, action.messageId)\n\n if (next._tag === 'NotFound') {\n return state\n }\n\n return {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n seenEventIds: [],\n chatMessages: next.messages,\n sessionEvents: [\n ...state.sessionEvents,\n MessagesRegenerated.make({\n fromMessageId: action.messageId,\n keptMessageIds: next.messages.map(message => message.id)\n })\n ]\n }\n }\n case 'EditUserMessage': {\n const next = editChatUserMessage(state.chatMessages, action.messageId, action.content)\n\n if (next._tag !== 'Edited') {\n return state\n }\n\n return {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n seenEventIds: [],\n chatMessages: next.messages,\n sessionEvents: [\n ...state.sessionEvents,\n UserMessageEdited.make({\n messageId: next.messageId,\n content: action.content,\n keptMessageIds: next.messages.map(message => message.id)\n })\n ]\n }\n }\n case 'Event': {\n if (hasSeenEvent(state, action.event)) {\n return state\n }\n\n switch (action.event._tag) {\n case 'AgentStart':\n return rememberEvent(\n {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'AgentError':\n return rememberEvent(\n {\n ...state,\n status: 'error',\n error: action.event.message,\n errorInfo: action.event,\n retryInfo: null,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'AgentEnd':\n return rememberEvent(\n {\n ...state,\n status: 'done',\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'AgentAwaitingInput':\n return rememberEvent(\n {\n ...state,\n status: 'waiting',\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'AgentRetry':\n return rememberEvent(\n {\n ...state,\n retryInfo: action.event,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'CompactionEnd':\n case 'AssistantMessage':\n case 'CompactionStart':\n case 'LLMReasoningDelta':\n case 'LLMStreamEnd':\n case 'LLMStreamStart':\n case 'LLMTextDelta':\n case 'ProviderToolResult':\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n case 'QuestionRequested':\n case 'SubagentCompleted':\n case 'SubagentStarted':\n case 'ToolApprovalDenied':\n case 'ToolApprovalGranted':\n case 'ToolApprovalRequested':\n case 'ToolExecutionCompleted':\n case 'ToolExecutionError':\n case 'ToolExecutionStarted':\n case 'ToolInputDelta':\n case 'ToolInputEnd':\n case 'ToolInputStart':\n case 'TurnEnd':\n case 'TurnStart':\n case 'UsageUpdate':\n return rememberEvent(\n clearRetryInfo({\n ...state,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n }),\n action.event\n )\n }\n }\n case 'Error': {\n return {\n ...state,\n status: 'error',\n error: action.message,\n errorInfo: null,\n retryInfo: null,\n chatMessages: markChatError(state.chatMessages, action.message)\n }\n }\n case 'Abort':\n return { ...state, status: 'aborted', error: null, errorInfo: null, retryInfo: null }\n }\n}\n\nexport const hasAgentMessageReasoning = (message: AgentMessage) =>\n message._tag === 'Assistant' &&\n message.parts.some(part => part._tag === 'Reasoning' && part.text.length > 0)\n\nexport const hasAgentChatReasoningSummary = (state: AgentChatState) =>\n state.chatMessages.some(message =>\n message.parts.some(part => part._tag === 'Reasoning' && part.text.length > 0)\n )\n\nexport const isActiveChatToolPart = (part: AgentChatPart) =>\n part._tag === 'ToolCall' &&\n part.state._tag !== 'Completed' &&\n part.state._tag !== 'ProviderCompleted' &&\n part.state._tag !== 'QuestionAnswered' &&\n part.state._tag !== 'QuestionCancelled' &&\n part.state._tag !== 'Errored' &&\n part.state._tag !== 'Denied'\nexport type ActiveChatToolPart = Extract<AgentChatPart, { readonly _tag: 'ToolCall' }>\n\nexport const isCompletedChatToolPart = (part: AgentChatPart) =>\n part._tag === 'ToolCall' && part.state._tag === 'Completed'\nexport type CompletedChatToolPart = Extract<AgentChatPart, { readonly _tag: 'ToolCall' }>\n\nexport const getActiveChatToolParts = (messages: ReadonlyArray<AgentChatMessage>) =>\n messages.flatMap(message =>\n message.parts.filter((part): part is ActiveChatToolPart => isActiveChatToolPart(part))\n )\n\nexport const getCompletedChatToolParts = (messages: ReadonlyArray<AgentChatMessage>) =>\n messages.flatMap(message =>\n message.parts.filter((part): part is CompletedChatToolPart => isCompletedChatToolPart(part))\n )\n\ntype AgentChatLiveActivityInput = {\n readonly isTextRunning: boolean\n readonly activeToolCallCount: number\n readonly isVoiceActive: boolean\n}\n\nexport const getAgentChatLiveActivityCount = ({\n isTextRunning,\n activeToolCallCount,\n isVoiceActive\n}: AgentChatLiveActivityInput) =>\n (isTextRunning ? 1 : 0) + activeToolCallCount + (isVoiceActive ? 1 : 0)\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-core.mjs","names":[],"sources":["../../src/react/chat-core.ts"],"sourcesContent":["import {\n hitlResponseEvent,\n type AgentError,\n type AgentEvent,\n type AgentMessage,\n type AgentRetry,\n type Content,\n type HitlResponse,\n type UserMessage\n} from '@yolk-sdk/agent/protocol'\nimport {\n appendProtocolMessage,\n applyAgentEventToChatMessages,\n deleteChatTurn,\n editChatUserMessage,\n markChatError,\n regenerateChatMessagesFrom,\n type AgentChatMessage,\n type AgentChatPart,\n type ApplyAgentEventToChatMessagesOptions\n} from './chat-messages.ts'\nimport {\n MessagesRegenerated,\n ProtocolMessageAppended,\n TurnDeleted,\n UserMessageEdited,\n UserMessageSubmitted,\n type AgentChatSessionEvent\n} from './chat-session-events.ts'\n\nexport type AgentRunStatus = 'idle' | 'running' | 'waiting' | 'done' | 'error' | 'aborted'\n\nexport type AgentChatState = {\n readonly status: AgentRunStatus\n readonly error: string | null\n readonly errorInfo: AgentError | null\n readonly retryInfo: AgentRetry | null\n readonly chatMessages: ReadonlyArray<AgentChatMessage>\n readonly sessionEvents: ReadonlyArray<AgentChatSessionEvent>\n readonly seenEventIds: ReadonlyArray<string>\n}\n\nexport type AgentChatEventProjectionState = {\n readonly chatMessages: ReadonlyArray<AgentChatMessage>\n readonly seenEventIds: ReadonlyArray<string>\n}\n\nexport const initialAgentChatState: AgentChatState = {\n status: 'idle',\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: [],\n sessionEvents: [],\n seenEventIds: []\n}\n\nconst hasSeenEventId = (seenEventIds: ReadonlyArray<string>, event: AgentEvent) =>\n event.eventId !== undefined && seenEventIds.includes(event.eventId)\n\nconst rememberEventId = (seenEventIds: ReadonlyArray<string>, event: AgentEvent) =>\n event.eventId === undefined ? seenEventIds : [...seenEventIds, event.eventId]\n\nconst hasSeenEvent = (state: AgentChatState, event: AgentEvent) =>\n hasSeenEventId(state.seenEventIds, event)\n\nconst rememberEvent = (state: AgentChatState, event: AgentEvent): AgentChatState =>\n event.eventId === undefined\n ? state\n : { ...state, seenEventIds: rememberEventId(state.seenEventIds, event) }\n\nconst clearRetryInfo = (state: AgentChatState): AgentChatState =>\n state.retryInfo === null ? state : { ...state, retryInfo: null }\n\nexport const makeAgentChatEventProjectionState = (\n chatMessages: ReadonlyArray<AgentChatMessage> = []\n): AgentChatEventProjectionState => ({\n chatMessages,\n seenEventIds: []\n})\n\n/**\n * Applies replayable agent events to chat messages while deduping by `eventId`.\n *\n * Use this for durable streams that may reconnect, overlap, or replay events.\n * For ephemeral local streams, `applyAgentEventToChatMessages` is still useful.\n */\nexport const applyAgentEventToChatProjection = (\n state: AgentChatEventProjectionState,\n event: AgentEvent,\n options: ApplyAgentEventToChatMessagesOptions = {}\n): AgentChatEventProjectionState => {\n if (hasSeenEventId(state.seenEventIds, event)) {\n return state\n }\n\n return {\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, event, options),\n seenEventIds: rememberEventId(state.seenEventIds, event)\n }\n}\n\nexport type AgentChatAction =\n | { readonly _tag: 'HydrateMessage'; readonly message: AgentMessage }\n | { readonly _tag: 'Submit'; readonly message: UserMessage }\n | { readonly _tag: 'AppendMessage'; readonly message: AgentMessage }\n | { readonly _tag: 'SubmitHitlResponse'; readonly response: HitlResponse }\n | { readonly _tag: 'DeleteTurn'; readonly messageId: string }\n | { readonly _tag: 'RegenerateFrom'; readonly messageId: string }\n | { readonly _tag: 'EditUserMessage'; readonly messageId: string; readonly content: Content }\n | ({ readonly _tag: 'Event'; readonly event: AgentEvent } & ApplyAgentEventToChatMessagesOptions)\n | { readonly _tag: 'Error'; readonly message: string }\n | { readonly _tag: 'Abort' }\n\nexport const reduceAgentChatState = (\n state: AgentChatState,\n action: AgentChatAction\n): AgentChatState => {\n switch (action._tag) {\n case 'HydrateMessage':\n return {\n ...state,\n chatMessages: appendProtocolMessage(state.chatMessages, action.message),\n error: null,\n errorInfo: null,\n retryInfo: null\n }\n case 'Submit':\n return {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n seenEventIds: [],\n chatMessages: appendProtocolMessage(state.chatMessages, action.message),\n sessionEvents: [\n ...state.sessionEvents,\n UserMessageSubmitted.make({ message: action.message })\n ]\n }\n case 'AppendMessage':\n return {\n ...state,\n chatMessages: appendProtocolMessage(state.chatMessages, action.message),\n error: null,\n errorInfo: null,\n retryInfo: null,\n sessionEvents: [\n ...state.sessionEvents,\n ProtocolMessageAppended.make({ message: action.message })\n ]\n }\n case 'SubmitHitlResponse':\n return {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n seenEventIds: [],\n chatMessages: applyAgentEventToChatMessages(\n state.chatMessages,\n hitlResponseEvent(action.response)\n )\n }\n case 'DeleteTurn': {\n const next = deleteChatTurn(state.chatMessages, action.messageId)\n\n if (next._tag === 'NotFound') {\n return state\n }\n\n return {\n ...state,\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: next.messages,\n sessionEvents: [\n ...state.sessionEvents,\n TurnDeleted.make({\n turnStartMessageId: next.turnStartMessageId,\n deletedMessageIds: next.deletedMessageIds\n })\n ]\n }\n }\n case 'RegenerateFrom': {\n const next = regenerateChatMessagesFrom(state.chatMessages, action.messageId)\n\n if (next._tag === 'NotFound') {\n return state\n }\n\n return {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n seenEventIds: [],\n chatMessages: next.messages,\n sessionEvents: [\n ...state.sessionEvents,\n MessagesRegenerated.make({\n fromMessageId: action.messageId,\n keptMessageIds: next.messages.map(message => message.id)\n })\n ]\n }\n }\n case 'EditUserMessage': {\n const next = editChatUserMessage(state.chatMessages, action.messageId, action.content)\n\n if (next._tag !== 'Edited') {\n return state\n }\n\n return {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n seenEventIds: [],\n chatMessages: next.messages,\n sessionEvents: [\n ...state.sessionEvents,\n UserMessageEdited.make({\n messageId: next.messageId,\n content: action.content,\n keptMessageIds: next.messages.map(message => message.id)\n })\n ]\n }\n }\n case 'Event': {\n if (hasSeenEvent(state, action.event)) {\n return state\n }\n\n switch (action.event._tag) {\n case 'AgentStart':\n return rememberEvent(\n {\n ...state,\n status: 'running',\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'AgentError':\n return rememberEvent(\n {\n ...state,\n status: 'error',\n error: action.event.message,\n errorInfo: action.event,\n retryInfo: null,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'AgentEnd':\n return rememberEvent(\n {\n ...state,\n status: 'done',\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'AgentAwaitingInput':\n return rememberEvent(\n {\n ...state,\n status: 'waiting',\n error: null,\n errorInfo: null,\n retryInfo: null,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'AgentRetry':\n return rememberEvent(\n {\n ...state,\n retryInfo: action.event,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n },\n action.event\n )\n case 'CompactionEnd':\n case 'AssistantMessage':\n case 'CompactionStart':\n case 'LLMReasoningDelta':\n case 'LLMStreamEnd':\n case 'LLMStreamStart':\n case 'LLMTextDelta':\n case 'ProviderToolResult':\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n case 'QuestionRequested':\n case 'SubagentCompleted':\n case 'SubagentStarted':\n case 'ToolApprovalDenied':\n case 'ToolApprovalGranted':\n case 'ToolApprovalRequested':\n case 'ToolExecutionCompleted':\n case 'ToolExecutionError':\n case 'ToolExecutionStarted':\n case 'ToolInputDelta':\n case 'ToolInputEnd':\n case 'ToolInputStart':\n case 'TurnEnd':\n case 'TurnStart':\n case 'UsageUpdate':\n return rememberEvent(\n clearRetryInfo({\n ...state,\n chatMessages: applyAgentEventToChatMessages(state.chatMessages, action.event, action)\n }),\n action.event\n )\n }\n }\n case 'Error': {\n return {\n ...state,\n status: 'error',\n error: action.message,\n errorInfo: null,\n retryInfo: null,\n chatMessages: markChatError(state.chatMessages, action.message)\n }\n }\n case 'Abort':\n return { ...state, status: 'aborted', error: null, errorInfo: null, retryInfo: null }\n }\n}\n\nexport const hasAgentMessageReasoning = (message: AgentMessage) =>\n message._tag === 'Assistant' &&\n message.parts.some(part => part._tag === 'Reasoning' && part.text.length > 0)\n\nexport const hasAgentChatReasoningSummary = (state: AgentChatState) =>\n state.chatMessages.some(message =>\n message.parts.some(part => part._tag === 'Reasoning' && part.text.length > 0)\n )\n\nexport const isActiveChatToolPart = (part: AgentChatPart) =>\n part._tag === 'ToolCall' &&\n part.state._tag !== 'Completed' &&\n part.state._tag !== 'ProviderCompleted' &&\n part.state._tag !== 'QuestionAnswered' &&\n part.state._tag !== 'QuestionCancelled' &&\n part.state._tag !== 'Errored' &&\n part.state._tag !== 'Denied'\nexport type ActiveChatToolPart = Extract<AgentChatPart, { readonly _tag: 'ToolCall' }>\n\nexport const isCompletedChatToolPart = (part: AgentChatPart) =>\n part._tag === 'ToolCall' && part.state._tag === 'Completed'\nexport type CompletedChatToolPart = Extract<AgentChatPart, { readonly _tag: 'ToolCall' }>\n\nexport const getActiveChatToolParts = (messages: ReadonlyArray<AgentChatMessage>) =>\n messages.flatMap(message =>\n message.parts.filter((part): part is ActiveChatToolPart => isActiveChatToolPart(part))\n )\n\nexport const getCompletedChatToolParts = (messages: ReadonlyArray<AgentChatMessage>) =>\n messages.flatMap(message =>\n message.parts.filter((part): part is CompletedChatToolPart => isCompletedChatToolPart(part))\n )\n\ntype AgentChatLiveActivityInput = {\n readonly isTextRunning: boolean\n readonly activeToolCallCount: number\n readonly isVoiceActive: boolean\n}\n\nexport const getAgentChatLiveActivityCount = ({\n isTextRunning,\n activeToolCallCount,\n isVoiceActive\n}: AgentChatLiveActivityInput) =>\n (isTextRunning ? 1 : 0) + activeToolCallCount + (isVoiceActive ? 1 : 0)\n"],"mappings":"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"}
@@ -119,6 +119,12 @@ declare const regenerateChatMessagesFrom: (messages: ReadonlyArray<AgentChatMess
119
119
  declare const editChatUserMessage: (messages: ReadonlyArray<AgentChatMessage>, messageId: string, content: Content) => EditChatUserMessageResult;
120
120
  declare const appendProtocolMessage: (messages: ReadonlyArray<AgentChatMessage>, message: AgentMessage) => readonly AgentChatMessage[];
121
121
  declare const markChatError: (messages: ReadonlyArray<AgentChatMessage>, message: string) => ReadonlyArray<AgentChatMessage>;
122
+ /**
123
+ * Applies one event without tracking `eventId` replay state.
124
+ *
125
+ * Prefer `applyAgentEventToChatProjection` for durable streams that can replay
126
+ * or overlap. Append-only text and reasoning deltas are not idempotent here.
127
+ */
122
128
  declare const applyAgentEventToChatMessages: (messages: ReadonlyArray<AgentChatMessage>, event: AgentEvent, options?: ApplyAgentEventToChatMessagesOptions) => ReadonlyArray<AgentChatMessage>;
123
129
  declare const buildAgentChatMessages: ({
124
130
  messages,
@@ -1 +1 @@
1
- {"version":3,"file":"chat-messages.d.mts","names":[],"sources":["../../src/react/chat-messages.ts"],"mappings":"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"}
1
+ {"version":3,"file":"chat-messages.d.mts","names":[],"sources":["../../src/react/chat-messages.ts"],"mappings":"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"}
@@ -252,44 +252,46 @@ const appendAssistantPart = (messages, part) => Option.match(targetAssistantInde
252
252
  parts: [...message.parts, part]
253
253
  } : message)
254
254
  });
255
- const appendAssistantTextDelta = (messages, delta) => {
255
+ const appendAssistantTextDelta = (messages, input) => {
256
256
  const index = targetAssistantIndex(messages);
257
+ const content = input.textSoFar ?? input.delta;
257
258
  if (Option.isNone(index)) return appendAssistantPart(messages, {
258
259
  _tag: "Text",
259
260
  id: `message-${nextMessageSequence(messages)}-assistant-text`,
260
- content: delta,
261
+ content,
261
262
  state: "streaming"
262
263
  });
263
264
  return messages.map((message, messageIndex) => messageIndex === index.value ? {
264
265
  ...message,
265
266
  parts: hasStreamingTextPart(message) ? message.parts.map((part) => part._tag === "Text" && part.state === "streaming" ? {
266
267
  ...part,
267
- content: appendTextToContent(part.content, delta)
268
+ content: input.textSoFar ?? appendTextToContent(part.content, input.delta)
268
269
  } : part) : [...message.parts, {
269
270
  _tag: "Text",
270
271
  id: `message-${message.sequence}-assistant-text`,
271
- content: delta,
272
+ content,
272
273
  state: "streaming"
273
274
  }]
274
275
  } : message);
275
276
  };
276
- const appendAssistantReasoningDelta = (messages, delta) => {
277
+ const appendAssistantReasoningDelta = (messages, input) => {
277
278
  const index = targetAssistantIndex(messages);
279
+ const text = input.reasoningSoFar ?? input.delta;
278
280
  if (Option.isNone(index)) return appendAssistantPart(messages, {
279
281
  _tag: "Reasoning",
280
282
  id: `message-${nextMessageSequence(messages)}-reasoning`,
281
- text: delta,
283
+ text,
282
284
  state: "streaming"
283
285
  });
284
286
  return messages.map((message, messageIndex) => messageIndex === index.value ? {
285
287
  ...message,
286
288
  parts: message.parts.some((part) => part._tag === "Reasoning" && part.state === "streaming") ? message.parts.map((part) => part._tag === "Reasoning" && part.state === "streaming" ? {
287
289
  ...part,
288
- text: `${part.text}${delta}`
290
+ text: input.reasoningSoFar ?? `${part.text}${input.delta}`
289
291
  } : part) : [...message.parts, {
290
292
  _tag: "Reasoning",
291
293
  id: `message-${message.sequence}-reasoning`,
292
- text: delta,
294
+ text,
293
295
  state: "streaming"
294
296
  }]
295
297
  } : message);
@@ -480,12 +482,24 @@ const markChatError = (messages, message) => [...messages.filter((chatMessage) =
480
482
  message
481
483
  }]
482
484
  }];
485
+ /**
486
+ * Applies one event without tracking `eventId` replay state.
487
+ *
488
+ * Prefer `applyAgentEventToChatProjection` for durable streams that can replay
489
+ * or overlap. Append-only text and reasoning deltas are not idempotent here.
490
+ */
483
491
  const applyAgentEventToChatMessages = (messages, event, options = {}) => {
484
492
  const eventTimeMs = event.createdAtMs ?? options.nowMs ?? 0;
485
493
  switch (event._tag) {
486
494
  case "AgentStart": return clearTransientParts(messages);
487
- case "LLMTextDelta": return appendAssistantTextDelta(messages, event.text);
488
- case "LLMReasoningDelta": return appendAssistantReasoningDelta(messages, event.text);
495
+ case "LLMTextDelta": return appendAssistantTextDelta(messages, {
496
+ delta: event.text,
497
+ textSoFar: event.textSoFar
498
+ });
499
+ case "LLMReasoningDelta": return appendAssistantReasoningDelta(messages, {
500
+ delta: event.text,
501
+ reasoningSoFar: event.reasoningSoFar
502
+ });
489
503
  case "ToolInputEnd": return upsertToolCallPart(messages, event.call, { _tag: "Called" });
490
504
  case "AssistantMessage": return appendOrReplaceAssistantMessage(messages, event.message);
491
505
  case "ToolInputStart": return upsertToolCallPart(messages, inputStreamingToolCall(event.id, event.name), {
@@ -1 +1 @@
1
- {"version":3,"file":"chat-messages.mjs","names":["Arr"],"sources":["../../src/react/chat-messages.ts"],"sourcesContent":["import { Array as Arr, Option } from 'effect'\nimport type { AgentToolRun } from '@yolk-sdk/agent/client'\nimport {\n AssistantAgentMessage,\n AssistantReasoningPart,\n AssistantTextPart,\n HostToolCallPart,\n ProviderToolCallPart,\n ProviderToolResultPart,\n type QuestionRequest,\n type QuestionResponse,\n type ToolApprovalRequest,\n ToolResult,\n ToolResultMessage,\n ToolCall,\n UserMessage,\n appendTextToContent,\n contentParts,\n formatQuestionResponseContent,\n isContentEmpty,\n questionResponseStructuredContent,\n type AgentEvent,\n type AgentMessage,\n type AssistantPart,\n type Content,\n type MessageAnnotations,\n type MessageAuthor,\n type MessageEnvelope\n} from '@yolk-sdk/agent/protocol'\n\nexport type ChatPartState = 'streaming' | 'done'\n\nexport type ChatToolState =\n | { readonly _tag: 'Called' }\n | { readonly _tag: 'InputStreaming'; readonly input: string }\n | { readonly _tag: 'ApprovalRequested'; readonly request?: ToolApprovalRequest }\n | { readonly _tag: 'Denied'; readonly reason: string }\n | { readonly _tag: 'QuestionRequested'; readonly request: QuestionRequest }\n | {\n readonly _tag: 'QuestionAnswered'\n readonly response: QuestionResponse\n readonly request?: QuestionRequest\n }\n | {\n readonly _tag: 'QuestionCancelled'\n readonly response: QuestionResponse\n readonly request?: QuestionRequest\n }\n | { readonly _tag: 'Running'; readonly startedAtMs: number }\n | {\n readonly _tag: 'Completed'\n readonly result: ToolResult\n readonly startedAtMs?: number\n readonly endedAtMs?: number\n }\n | {\n readonly _tag: 'Errored'\n readonly message: string\n readonly startedAtMs?: number\n readonly endedAtMs?: number\n }\n | { readonly _tag: 'ProviderCompleted'; readonly result: ToolResult }\n\nexport type AgentChatPart =\n | {\n readonly _tag: 'Text'\n readonly id: string\n readonly content: Content\n readonly state: ChatPartState\n }\n | {\n readonly _tag: 'Reasoning'\n readonly id: string\n readonly text: string\n readonly state: ChatPartState\n }\n | {\n readonly _tag: 'ToolCall'\n readonly id: string\n readonly call: ToolCall\n readonly state: ChatToolState\n }\n | {\n readonly _tag: 'ToolResult'\n readonly id: string\n readonly toolCallId: string\n readonly name: string\n readonly content: Content\n readonly isError?: boolean\n readonly structuredContent?: unknown\n }\n | { readonly _tag: 'Error'; readonly id: string; readonly message: string }\n\nexport type AgentChatMessage = {\n readonly id: string\n readonly turnId: string\n readonly sequence: number\n readonly role: 'user' | 'assistant' | 'system'\n readonly createdAtMs?: number\n readonly author?: MessageAuthor\n readonly annotations?: MessageAnnotations\n readonly parts: ReadonlyArray<AgentChatPart>\n}\n\nexport type DeleteChatTurnResult =\n | { readonly _tag: 'NotFound' }\n | {\n readonly _tag: 'Deleted'\n readonly turnStartMessageId: string\n readonly deletedMessageIds: ReadonlyArray<string>\n readonly messages: ReadonlyArray<AgentChatMessage>\n }\n\nexport type EditChatUserMessageResult =\n | { readonly _tag: 'NotFound' }\n | { readonly _tag: 'NotUserMessage' }\n | {\n readonly _tag: 'Edited'\n readonly messageId: string\n readonly messages: ReadonlyArray<AgentChatMessage>\n }\n\nexport type RegenerateChatMessagesResult =\n | { readonly _tag: 'NotFound' }\n | {\n readonly _tag: 'Regenerated'\n readonly messages: ReadonlyArray<AgentChatMessage>\n }\n\nexport type ApplyAgentEventToChatMessagesOptions = {\n readonly nowMs?: number\n}\n\nconst messageId = (sequence: number, role: AgentChatMessage['role']) =>\n `message-${sequence}-${role}`\n\nconst turnId = (sequence: number) => `turn-${sequence}`\n\nconst lastTurnId = (messages: ReadonlyArray<AgentChatMessage>) => messages.at(-1)?.turnId\n\nconst nextMessageSequence = (messages: ReadonlyArray<AgentChatMessage>) =>\n messages.reduce((max, message) => Math.max(max, message.sequence), -1) + 1\n\nconst chatMessageEnvelope = (message: MessageEnvelope) => ({\n ...(message.createdAtMs === undefined ? {} : { createdAtMs: message.createdAtMs }),\n ...(message.author === undefined ? {} : { author: message.author }),\n ...(message.annotations === undefined ? {} : { annotations: message.annotations })\n})\n\nconst userChatMessage = (message: UserMessage, sequence: number): AgentChatMessage => ({\n id: messageId(sequence, 'user'),\n turnId: turnId(sequence),\n sequence,\n role: 'user',\n ...chatMessageEnvelope(message),\n parts: [\n {\n _tag: 'Text',\n id: `message-${sequence}-user-text`,\n content: message.content,\n state: 'done'\n }\n ]\n})\n\nexport type BuildAgentChatMessagesInput = {\n readonly messages: ReadonlyArray<AgentMessage>\n readonly userDraft: string\n readonly assistantDraft: string\n readonly reasoningDraft: string\n readonly toolRuns: ReadonlyArray<AgentToolRun>\n readonly error: string | null\n}\n\nconst toolRunNameEntry = (run: AgentToolRun): ReadonlyArray<readonly [string, string]> => {\n switch (run._tag) {\n case 'InputStreaming':\n return run.name === undefined ? [] : [[run.id, run.name]]\n case 'Denied':\n return []\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return run.request === undefined ? [] : [[run.request.call.id, run.request.call.name]]\n case 'QuestionRequested':\n return [[run.request.call.id, run.request.call.name]]\n case 'InputReady':\n case 'ApprovalRequested':\n case 'Executing':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return [[run.call.id, run.call.name]]\n }\n}\n\nconst assistantToolNameEntries = (\n message: AgentMessage\n): ReadonlyArray<readonly [string, string]> =>\n message._tag === 'Assistant'\n ? message.parts.flatMap(part =>\n part._tag === 'HostToolCall' || part._tag === 'ProviderToolCall'\n ? [[part.call.id, part.call.name]]\n : []\n )\n : []\n\nconst collectToolNames = (\n messages: ReadonlyArray<AgentMessage>,\n toolRuns: ReadonlyArray<AgentToolRun>\n): ReadonlyMap<string, string> =>\n new Map([...toolRuns.flatMap(toolRunNameEntry), ...messages.flatMap(assistantToolNameEntries)])\n\nconst toolResultEntry = (message: AgentMessage): ReadonlyArray<readonly [string, ToolResult]> =>\n message._tag === 'ToolResult'\n ? [\n [\n message.toolCallId,\n ToolResult.make({\n toolCallId: message.toolCallId,\n content: message.content,\n isError: message.isError,\n structuredContent: message.structuredContent\n })\n ]\n ]\n : []\n\nconst collectToolResultsById = (messages: ReadonlyArray<AgentMessage>) =>\n new Map(messages.flatMap(toolResultEntry))\n\nconst collectToolCallIds = (messages: ReadonlyArray<AgentMessage>): ReadonlySet<string> =>\n new Set(\n messages.flatMap(message =>\n message._tag === 'Assistant'\n ? message.parts.flatMap(part =>\n part._tag === 'HostToolCall' || part._tag === 'ProviderToolCall' ? [part.call.id] : []\n )\n : []\n )\n )\n\nconst toolRunEntry = (run: AgentToolRun): readonly [string, AgentToolRun] => {\n switch (run._tag) {\n case 'InputStreaming':\n return [run.id, run]\n case 'Denied':\n return [run.toolCallId, run]\n case 'QuestionRequested':\n return [run.request.toolCallId, run]\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return [run.response.toolCallId, run]\n case 'InputReady':\n case 'ApprovalRequested':\n case 'Executing':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return [run.call.id, run]\n }\n}\n\nconst collectToolRunsById = (\n runs: ReadonlyArray<AgentToolRun>\n): ReadonlyMap<string, AgentToolRun> => new Map(runs.map(toolRunEntry))\n\nconst questionRequestFromToolState = (state: ChatToolState): QuestionRequest | undefined => {\n switch (state._tag) {\n case 'QuestionRequested':\n return state.request\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return state.request\n case 'Called':\n case 'InputStreaming':\n case 'ApprovalRequested':\n case 'Denied':\n case 'Running':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return undefined\n }\n}\n\ntype QuestionTerminalState = Extract<\n ChatToolState,\n { readonly _tag: 'QuestionAnswered' | 'QuestionCancelled' }\n>\n\nconst preserveQuestionRequest = (\n request: QuestionRequest | undefined,\n state: QuestionTerminalState\n): QuestionTerminalState =>\n state.request !== undefined || request === undefined ? state : { ...state, request }\n\nconst toolStateFor = (\n run: AgentToolRun | undefined,\n result: ToolResult | undefined\n): ChatToolState => {\n if (run?._tag === 'Executing') {\n return { _tag: 'Running', startedAtMs: run.startedAtMs }\n }\n\n if (run?._tag === 'InputStreaming') {\n return { _tag: 'InputStreaming', input: run.input }\n }\n\n if (run?._tag === 'ApprovalRequested') {\n return { _tag: 'ApprovalRequested', request: run.request }\n }\n\n if (run?._tag === 'Denied') {\n return { _tag: 'Denied', reason: run.reason }\n }\n\n if (run?._tag === 'QuestionRequested') {\n return { _tag: 'QuestionRequested', request: run.request }\n }\n\n if (run?._tag === 'QuestionAnswered') {\n return preserveQuestionRequest(run.request, {\n _tag: 'QuestionAnswered',\n response: run.response\n })\n }\n\n if (run?._tag === 'QuestionCancelled') {\n return preserveQuestionRequest(run.request, {\n _tag: 'QuestionCancelled',\n response: run.response\n })\n }\n\n if (run?._tag === 'Completed') {\n return {\n _tag: 'Completed',\n result: run.result,\n startedAtMs: run.startedAtMs,\n endedAtMs: run.endedAtMs\n }\n }\n\n if (run?._tag === 'Errored') {\n return { _tag: 'Errored', message: run.message, endedAtMs: run.endedAtMs }\n }\n\n if (run?._tag === 'ProviderCompleted') {\n return { _tag: 'ProviderCompleted', result: run.result }\n }\n\n if (result !== undefined) {\n return { _tag: 'Completed', result }\n }\n\n return { _tag: 'Called' }\n}\n\nconst assistantPartsFromMessage = ({\n message,\n messageIndex,\n toolResultsById,\n toolRunsById\n}: {\n readonly message: Extract<AgentMessage, { readonly _tag: 'Assistant' }>\n readonly messageIndex: number\n readonly toolResultsById: ReadonlyMap<string, ToolResult>\n readonly toolRunsById: ReadonlyMap<string, AgentToolRun>\n}): ReadonlyArray<AgentChatPart> => {\n return message.parts.flatMap((part, partIndex): ReadonlyArray<AgentChatPart> => {\n switch (part._tag) {\n case 'Reasoning':\n return part.text.length > 0\n ? [\n {\n _tag: 'Reasoning',\n id: `message-${messageIndex}-reasoning-${partIndex}`,\n text: part.text,\n state: 'done'\n }\n ]\n : []\n case 'Text':\n return [\n {\n _tag: 'Text',\n id: `message-${messageIndex}-assistant-text-${partIndex}`,\n content: part.content,\n state: 'done'\n }\n ]\n case 'HostToolCall':\n case 'ProviderToolCall':\n return [\n {\n _tag: 'ToolCall',\n id: `message-${messageIndex}-tool-call-${part.call.id}`,\n call: part.call,\n state: toolStateFor(toolRunsById.get(part.call.id), toolResultsById.get(part.call.id))\n }\n ]\n case 'ProviderToolResult':\n return [\n {\n _tag: 'ToolResult',\n id: `message-${messageIndex}-provider-tool-result-${part.toolCallId}`,\n toolCallId: part.toolCallId,\n name: part.toolCallId,\n content: part.result.content,\n isError: part.result.isError,\n structuredContent: part.result.structuredContent\n }\n ]\n }\n })\n}\n\nconst assistantChatMessage = (\n message: AssistantAgentMessage,\n sequence: number,\n currentTurnId: string,\n parts: ReadonlyArray<AgentChatPart> = assistantPartsFromMessage({\n message,\n messageIndex: sequence,\n toolResultsById: new Map(),\n toolRunsById: new Map()\n })\n): AgentChatMessage => ({\n id: messageId(sequence, 'assistant'),\n turnId: currentTurnId,\n sequence,\n role: 'assistant',\n ...chatMessageEnvelope(message),\n parts\n})\n\nconst hasStreamingPart = (message: AgentChatMessage) =>\n message.parts.some(\n part => (part._tag === 'Text' || part._tag === 'Reasoning') && part.state === 'streaming'\n )\n\nconst hasStreamingTextPart = (message: AgentChatMessage) =>\n message.parts.some(part => part._tag === 'Text' && part.state === 'streaming')\n\nconst hasToolCall = (message: AgentChatMessage, callId: string) =>\n message.parts.some(part => part._tag === 'ToolCall' && part.call.id === callId)\n\nconst isOpenToolState = (state: ChatToolState) =>\n state._tag === 'Called' ||\n state._tag === 'InputStreaming' ||\n state._tag === 'ApprovalRequested' ||\n state._tag === 'QuestionRequested' ||\n state._tag === 'Running'\n\nconst hasOpenToolCall = (message: AgentChatMessage) =>\n message.parts.some(part => part._tag === 'ToolCall' && isOpenToolState(part.state))\n\nconst findLastMessageIndex = (\n messages: ReadonlyArray<AgentChatMessage>,\n predicate: (message: AgentChatMessage) => boolean\n) => messages.reduce((lastIndex, message, index) => (predicate(message) ? index : lastIndex), -1)\n\nconst findMessageIndex = (messages: ReadonlyArray<AgentChatMessage>, messageId: string) =>\n messages.findIndex(message => message.id === messageId)\n\nexport const deleteChatTurn = (\n messages: ReadonlyArray<AgentChatMessage>,\n messageId: string\n): DeleteChatTurnResult => {\n const targetIndex = findMessageIndex(messages, messageId)\n\n if (targetIndex === -1) {\n return { _tag: 'NotFound' }\n }\n\n const target = messages[targetIndex]\n\n if (target === undefined) {\n return { _tag: 'NotFound' }\n }\n\n const deletedMessages = messages.filter(message => message.turnId === target.turnId)\n const turnStartMessage = deletedMessages[0]\n\n return {\n _tag: 'Deleted',\n turnStartMessageId: turnStartMessage?.id ?? target.id,\n deletedMessageIds: deletedMessages.map(message => message.id),\n messages: messages.filter(message => message.turnId !== target.turnId)\n }\n}\n\nexport const regenerateChatMessagesFrom = (\n messages: ReadonlyArray<AgentChatMessage>,\n messageId: string\n): RegenerateChatMessagesResult => {\n const targetIndex = findMessageIndex(messages, messageId)\n\n if (targetIndex === -1) {\n return { _tag: 'NotFound' }\n }\n\n const target = messages[targetIndex]\n\n if (target === undefined) {\n return { _tag: 'NotFound' }\n }\n\n return {\n _tag: 'Regenerated',\n messages: messages.slice(0, target.role === 'user' ? targetIndex + 1 : targetIndex)\n }\n}\n\nexport const editChatUserMessage = (\n messages: ReadonlyArray<AgentChatMessage>,\n messageId: string,\n content: Content\n): EditChatUserMessageResult => {\n const targetIndex = findMessageIndex(messages, messageId)\n\n if (targetIndex === -1) {\n return { _tag: 'NotFound' }\n }\n\n const target = messages[targetIndex]\n\n if (target === undefined) {\n return { _tag: 'NotFound' }\n }\n\n if (target.role !== 'user') {\n return { _tag: 'NotUserMessage' }\n }\n\n return {\n _tag: 'Edited',\n messageId: target.id,\n messages: [\n ...messages.slice(0, targetIndex),\n {\n ...target,\n parts: [\n {\n _tag: 'Text',\n id: `message-${target.sequence}-user-text`,\n content,\n state: 'done'\n }\n ]\n }\n ]\n }\n}\n\nconst lastAssistantIndex = (messages: ReadonlyArray<AgentChatMessage>) => {\n const index = findLastMessageIndex(messages, message => message.role === 'assistant')\n\n return index === -1 ? Option.none<number>() : Option.some(index)\n}\n\nconst targetAssistantIndex = (messages: ReadonlyArray<AgentChatMessage>) =>\n Option.filter(lastAssistantIndex(messages), index => hasStreamingPart(messages[index]))\n\nconst appendAssistantPart = (\n messages: ReadonlyArray<AgentChatMessage>,\n part: AgentChatPart\n): ReadonlyArray<AgentChatMessage> =>\n Option.match(targetAssistantIndex(messages), {\n onNone: () => {\n const sequence = nextMessageSequence(messages)\n const currentTurnId = lastTurnId(messages) ?? turnId(sequence)\n\n return [\n ...messages,\n {\n id: messageId(sequence, 'assistant'),\n turnId: currentTurnId,\n sequence,\n role: 'assistant',\n parts: [part]\n }\n ]\n },\n onSome: index =>\n messages.map((message, messageIndex) =>\n messageIndex === index ? { ...message, parts: [...message.parts, part] } : message\n )\n })\n\nconst appendAssistantTextDelta = (\n messages: ReadonlyArray<AgentChatMessage>,\n delta: string\n): ReadonlyArray<AgentChatMessage> => {\n const index = targetAssistantIndex(messages)\n\n if (Option.isNone(index)) {\n const sequence = nextMessageSequence(messages)\n\n return appendAssistantPart(messages, {\n _tag: 'Text',\n id: `message-${sequence}-assistant-text`,\n content: delta,\n state: 'streaming'\n })\n }\n\n return messages.map((message, messageIndex) =>\n messageIndex === index.value\n ? {\n ...message,\n parts: hasStreamingTextPart(message)\n ? message.parts.map(part =>\n part._tag === 'Text' && part.state === 'streaming'\n ? { ...part, content: appendTextToContent(part.content, delta) }\n : part\n )\n : [\n ...message.parts,\n {\n _tag: 'Text',\n id: `message-${message.sequence}-assistant-text`,\n content: delta,\n state: 'streaming'\n }\n ]\n }\n : message\n )\n}\n\nconst appendAssistantReasoningDelta = (\n messages: ReadonlyArray<AgentChatMessage>,\n delta: string\n): ReadonlyArray<AgentChatMessage> => {\n const index = targetAssistantIndex(messages)\n\n if (Option.isNone(index)) {\n const sequence = nextMessageSequence(messages)\n\n return appendAssistantPart(messages, {\n _tag: 'Reasoning',\n id: `message-${sequence}-reasoning`,\n text: delta,\n state: 'streaming'\n })\n }\n\n return messages.map((message, messageIndex) =>\n messageIndex === index.value\n ? {\n ...message,\n parts: message.parts.some(part => part._tag === 'Reasoning' && part.state === 'streaming')\n ? message.parts.map(part =>\n part._tag === 'Reasoning' && part.state === 'streaming'\n ? { ...part, text: `${part.text}${delta}` }\n : part\n )\n : [\n ...message.parts,\n {\n _tag: 'Reasoning',\n id: `message-${message.sequence}-reasoning`,\n text: delta,\n state: 'streaming'\n }\n ]\n }\n : message\n )\n}\n\nconst mergeToolState = (existing: ChatToolState, next: ChatToolState): ChatToolState => {\n if (next._tag === 'Errored') {\n return {\n ...next,\n startedAtMs:\n next.startedAtMs ??\n (existing._tag === 'Running' || existing._tag === 'Completed' || existing._tag === 'Errored'\n ? existing.startedAtMs\n : undefined),\n endedAtMs: next.endedAtMs ?? (existing._tag === 'Errored' ? existing.endedAtMs : undefined)\n }\n }\n\n if (next._tag === 'QuestionAnswered' || next._tag === 'QuestionCancelled') {\n return preserveQuestionRequest(questionRequestFromToolState(existing), next)\n }\n\n if (next._tag === 'Denied' || next._tag === 'ProviderCompleted') {\n return next\n }\n\n if (next._tag === 'Completed') {\n return {\n ...next,\n startedAtMs:\n next.startedAtMs ??\n (existing._tag === 'Running' || existing._tag === 'Completed'\n ? existing.startedAtMs\n : undefined),\n endedAtMs: next.endedAtMs ?? (existing._tag === 'Completed' ? existing.endedAtMs : undefined)\n }\n }\n\n if (next._tag === 'Running' && existing._tag === 'Completed') {\n return existing\n }\n\n return next\n}\n\nconst appendToolCallPart = (\n messages: ReadonlyArray<AgentChatMessage>,\n call: ToolCall,\n state: ChatToolState\n): ReadonlyArray<AgentChatMessage> => {\n const index = Option.filter(lastAssistantIndex(messages), assistantIndex => {\n const message = messages[assistantIndex]\n\n return hasStreamingPart(message) || hasOpenToolCall(message)\n })\n\n return Option.match(index, {\n onNone: () => {\n const sequence = nextMessageSequence(messages)\n const currentTurnId = lastTurnId(messages) ?? turnId(sequence)\n\n return [\n ...messages,\n {\n id: messageId(sequence, 'assistant'),\n turnId: currentTurnId,\n sequence,\n role: 'assistant',\n parts: [\n {\n _tag: 'ToolCall',\n id: `tool-call-${call.id}`,\n call,\n state\n }\n ]\n }\n ]\n },\n onSome: assistantIndex =>\n messages.map((message, messageIndex) =>\n messageIndex === assistantIndex\n ? {\n ...message,\n parts: [\n ...message.parts,\n {\n _tag: 'ToolCall',\n id: `tool-call-${call.id}`,\n call,\n state\n }\n ]\n }\n : message\n )\n })\n}\n\nconst upsertToolCallPart = (\n messages: ReadonlyArray<AgentChatMessage>,\n call: ToolCall,\n state: ChatToolState\n): ReadonlyArray<AgentChatMessage> => {\n const existingIndex = findLastMessageIndex(messages, message => hasToolCall(message, call.id))\n\n if (existingIndex !== -1) {\n return messages.map((message, messageIndex) =>\n messageIndex === existingIndex\n ? {\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === call.id\n ? { ...part, call, state: mergeToolState(part.state, state) }\n : part\n )\n }\n : message\n )\n }\n\n return appendToolCallPart(messages, call, state)\n}\n\nconst inputStreamingToolCall = (id: string, name: string | undefined) =>\n ToolCall.make({ id, name: name ?? id, params: {} })\n\nconst appendToolInputDelta = (\n messages: ReadonlyArray<AgentChatMessage>,\n id: string,\n delta: string\n): ReadonlyArray<AgentChatMessage> =>\n messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === id && part.state._tag === 'InputStreaming'\n ? { ...part, state: { ...part.state, input: `${part.state.input}${delta}` } }\n : part\n )\n }))\n\nconst finalizeAssistantParts = (\n parts: ReadonlyArray<AgentChatPart>\n): ReadonlyArray<AgentChatPart> =>\n parts.map(part => {\n switch (part._tag) {\n case 'Text':\n case 'Reasoning':\n return { ...part, state: 'done' satisfies ChatPartState }\n case 'Error':\n case 'ToolCall':\n case 'ToolResult':\n return part\n }\n })\n\nconst toolStateEntry = (part: AgentChatPart): ReadonlyArray<readonly [string, ChatToolState]> =>\n part._tag === 'ToolCall' ? [[part.call.id, part.state]] : []\n\nconst toolStateByCallId = (parts: ReadonlyArray<AgentChatPart>) =>\n new Map(parts.flatMap(toolStateEntry))\n\nconst partsFromAssistantMessage = (\n message: AssistantAgentMessage,\n messageIndex: number,\n existingParts: ReadonlyArray<AgentChatPart>\n) => {\n const states = toolStateByCallId(existingParts)\n\n return assistantPartsFromMessage({\n message,\n messageIndex,\n toolResultsById: new Map(),\n toolRunsById: new Map()\n }).map(part =>\n part._tag === 'ToolCall' ? { ...part, state: states.get(part.call.id) ?? part.state } : part\n )\n}\n\nconst appendOrReplaceAssistantMessage = (\n messages: ReadonlyArray<AgentChatMessage>,\n message: AssistantAgentMessage\n) => {\n const messageToolCallIds = message.parts.flatMap(part =>\n part._tag === 'HostToolCall' || part._tag === 'ProviderToolCall' ? [part.call.id] : []\n )\n const index = Option.filter(lastAssistantIndex(messages), assistantIndex => {\n const current = messages[assistantIndex]\n\n return (\n hasStreamingPart(current) || messageToolCallIds.some(callId => hasToolCall(current, callId))\n )\n })\n\n return Option.match(index, {\n onNone: () => {\n const sequence = nextMessageSequence(messages)\n\n return [\n ...messages,\n assistantChatMessage(message, sequence, lastTurnId(messages) ?? turnId(sequence))\n ]\n },\n onSome: assistantIndex =>\n messages.map((current, messageIndex) =>\n messageIndex === assistantIndex\n ? {\n ...current,\n parts: partsFromAssistantMessage(message, current.sequence, current.parts)\n }\n : current\n )\n })\n}\n\nconst appendOrphanToolResult = (\n messages: ReadonlyArray<AgentChatMessage>,\n result: ToolResult\n): ReadonlyArray<AgentChatMessage> => {\n const sequence = nextMessageSequence(messages)\n const currentTurnId = lastTurnId(messages) ?? turnId(sequence)\n\n return [\n ...messages,\n {\n id: `message-${sequence}-tool-result-message`,\n turnId: currentTurnId,\n sequence,\n role: 'system',\n parts: [\n {\n _tag: 'ToolResult',\n id: `tool-result-${result.toolCallId}`,\n toolCallId: result.toolCallId,\n name: result.toolCallId,\n content: result.content,\n isError: result.isError,\n structuredContent: result.structuredContent\n }\n ]\n }\n ]\n}\n\nconst clearTransientParts = (\n messages: ReadonlyArray<AgentChatMessage>\n): ReadonlyArray<AgentChatMessage> =>\n messages.flatMap(message => {\n const parts = message.parts.filter(part => part._tag !== 'Error')\n\n return parts.length > 0 ? [{ ...message, parts }] : []\n })\n\nconst finalizeStreamingParts = (\n messages: ReadonlyArray<AgentChatMessage>\n): ReadonlyArray<AgentChatMessage> =>\n messages.map(message =>\n message.role === 'assistant'\n ? { ...message, parts: finalizeAssistantParts(message.parts) }\n : message\n )\n\nconst appendRunMessagesIfEmpty = (\n messages: ReadonlyArray<AgentChatMessage>,\n runMessages: ReadonlyArray<AgentMessage>\n) => {\n const lastUserMessageIndex = findLastMessageIndex(messages, message => message.role === 'user')\n const hasAssistantAfterLastUser = messages.some(\n (message, index) => message.role === 'assistant' && index > lastUserMessageIndex\n )\n\n if (runMessages.length === 0 || hasAssistantAfterLastUser) {\n return messages\n }\n\n return [\n ...messages,\n ...buildAgentChatMessages({\n messages: runMessages,\n userDraft: '',\n assistantDraft: '',\n reasoningDraft: '',\n toolRuns: [],\n error: null\n })\n ]\n}\n\nexport const appendProtocolMessage = (\n messages: ReadonlyArray<AgentChatMessage>,\n message: AgentMessage\n) => {\n const sequence = nextMessageSequence(messages)\n\n switch (message._tag) {\n case 'User':\n return [...messages, userChatMessage(message, sequence)]\n case 'Assistant':\n return [\n ...messages,\n assistantChatMessage(message, sequence, lastTurnId(messages) ?? turnId(sequence))\n ]\n case 'ToolResult':\n return appendOrphanToolResult(\n messages,\n ToolResult.make({\n toolCallId: message.toolCallId,\n content: message.content,\n isError: message.isError,\n structuredContent: message.structuredContent\n })\n )\n }\n}\n\nexport const markChatError = (\n messages: ReadonlyArray<AgentChatMessage>,\n message: string\n): ReadonlyArray<AgentChatMessage> => [\n ...messages.filter(chatMessage => !chatMessage.parts.some(part => part._tag === 'Error')),\n {\n id: 'error-message',\n turnId: 'error-turn',\n sequence: nextMessageSequence(messages),\n role: 'system',\n parts: [{ _tag: 'Error', id: 'error', message }]\n }\n]\n\nexport const applyAgentEventToChatMessages = (\n messages: ReadonlyArray<AgentChatMessage>,\n event: AgentEvent,\n options: ApplyAgentEventToChatMessagesOptions = {}\n): ReadonlyArray<AgentChatMessage> => {\n const eventTimeMs = event.createdAtMs ?? options.nowMs ?? 0\n\n switch (event._tag) {\n case 'AgentStart':\n return clearTransientParts(messages)\n case 'LLMTextDelta':\n return appendAssistantTextDelta(messages, event.text)\n case 'LLMReasoningDelta':\n return appendAssistantReasoningDelta(messages, event.text)\n case 'ToolInputEnd':\n return upsertToolCallPart(messages, event.call, { _tag: 'Called' })\n case 'AssistantMessage':\n return appendOrReplaceAssistantMessage(messages, event.message)\n case 'ToolInputStart':\n return upsertToolCallPart(messages, inputStreamingToolCall(event.id, event.name), {\n _tag: 'InputStreaming',\n input: ''\n })\n case 'ToolInputDelta':\n return appendToolInputDelta(messages, event.id, event.delta)\n case 'ToolApprovalRequested':\n return upsertToolCallPart(messages, event.call, {\n _tag: 'ApprovalRequested',\n request: event.request\n })\n case 'ToolApprovalGranted':\n return messages\n case 'ToolApprovalDenied':\n return messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === event.toolCallId\n ? { ...part, state: { _tag: 'Denied', reason: event.reason } }\n : part\n )\n }))\n case 'QuestionRequested':\n return upsertToolCallPart(messages, event.request.call, {\n _tag: 'QuestionRequested',\n request: event.request\n })\n case 'QuestionAnswered':\n return messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === event.response.toolCallId\n ? {\n ...part,\n state: preserveQuestionRequest(questionRequestFromToolState(part.state), {\n _tag: 'QuestionAnswered',\n response: event.response\n })\n }\n : part\n )\n }))\n case 'QuestionCancelled':\n return messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === event.response.toolCallId\n ? {\n ...part,\n state: preserveQuestionRequest(questionRequestFromToolState(part.state), {\n _tag: 'QuestionCancelled',\n response: event.response\n })\n }\n : part\n )\n }))\n case 'ToolExecutionStarted':\n return upsertToolCallPart(messages, event.call, { _tag: 'Running', startedAtMs: eventTimeMs })\n case 'ToolExecutionCompleted':\n return upsertToolCallPart(messages, event.call, {\n _tag: 'Completed',\n result: event.result,\n endedAtMs: eventTimeMs\n })\n case 'ToolExecutionError':\n return upsertToolCallPart(messages, event.call, {\n _tag: 'Errored',\n message: event.message,\n endedAtMs: eventTimeMs\n })\n case 'ProviderToolResult':\n return upsertToolCallPart(messages, event.call, {\n _tag: 'ProviderCompleted',\n result: event.result\n })\n case 'AgentError':\n return markChatError(messages, event.message)\n case 'AgentEnd':\n return appendRunMessagesIfEmpty(finalizeStreamingParts(messages), event.messages)\n case 'AgentAwaitingInput':\n return appendRunMessagesIfEmpty(finalizeStreamingParts(messages), event.messages)\n case 'AgentRetry':\n case 'CompactionEnd':\n case 'CompactionStart':\n case 'LLMStreamEnd':\n case 'LLMStreamStart':\n case 'SubagentCompleted':\n case 'SubagentStarted':\n case 'TurnEnd':\n case 'TurnStart':\n case 'UsageUpdate':\n return messages\n }\n}\n\nconst chatMessagesFromProtocolMessage = ({\n message,\n sequence,\n currentTurnId,\n toolNames,\n toolResultsById,\n toolCallIds,\n toolRunsById\n}: {\n readonly message: AgentMessage\n readonly sequence: number\n readonly currentTurnId: string\n readonly toolNames: ReadonlyMap<string, string>\n readonly toolResultsById: ReadonlyMap<string, ToolResult>\n readonly toolCallIds: ReadonlySet<string>\n readonly toolRunsById: ReadonlyMap<string, AgentToolRun>\n}): ReadonlyArray<AgentChatMessage> => {\n switch (message._tag) {\n case 'User':\n return [userChatMessage(message, sequence)]\n case 'Assistant':\n return [\n {\n id: messageId(sequence, 'assistant'),\n turnId: currentTurnId,\n sequence,\n role: 'assistant',\n parts: assistantPartsFromMessage({\n message,\n messageIndex: sequence,\n toolResultsById,\n toolRunsById\n })\n }\n ]\n case 'ToolResult':\n return toolCallIds.has(message.toolCallId)\n ? []\n : [\n {\n id: `message-${sequence}-tool-result-message`,\n turnId: currentTurnId,\n sequence,\n role: 'system',\n parts: [\n {\n _tag: 'ToolResult',\n id: `message-${sequence}-tool-result-${message.toolCallId}`,\n toolCallId: message.toolCallId,\n name: toolNames.get(message.toolCallId) ?? message.toolCallId,\n content: message.content,\n isError: message.isError,\n structuredContent: message.structuredContent\n }\n ]\n }\n ]\n }\n}\n\nconst draftUserMessage = (userDraft: string): ReadonlyArray<AgentChatMessage> =>\n userDraft.length > 0\n ? [\n {\n id: 'draft-user',\n turnId: 'draft-user-turn',\n sequence: -1,\n role: 'user',\n parts: [{ _tag: 'Text', id: 'draft-user-text', content: userDraft, state: 'streaming' }]\n }\n ]\n : []\n\nconst draftReasoningPart = (reasoningDraft: string): ReadonlyArray<AgentChatPart> =>\n reasoningDraft.length > 0\n ? [\n {\n _tag: 'Reasoning',\n id: 'draft-reasoning',\n text: reasoningDraft,\n state: 'streaming'\n }\n ]\n : []\n\nconst draftTextPart = (assistantDraft: string): ReadonlyArray<AgentChatPart> =>\n assistantDraft.length > 0\n ? [\n {\n _tag: 'Text',\n id: 'draft-assistant-text',\n content: assistantDraft,\n state: 'streaming'\n }\n ]\n : []\n\nconst draftAssistantPart = ({\n reasoningDraft,\n assistantDraft\n}: {\n readonly reasoningDraft: string\n readonly assistantDraft: string\n}): ReadonlyArray<AgentChatPart> => [\n ...draftReasoningPart(reasoningDraft),\n ...draftTextPart(assistantDraft)\n]\n\nconst draftAssistantMessage = ({\n reasoningDraft,\n assistantDraft\n}: {\n readonly reasoningDraft: string\n readonly assistantDraft: string\n}): ReadonlyArray<AgentChatMessage> => {\n const parts = draftAssistantPart({ reasoningDraft, assistantDraft })\n\n return parts.length > 0\n ? [\n {\n id: 'draft-assistant',\n turnId: 'draft-assistant-turn',\n sequence: -1,\n role: 'assistant',\n parts\n }\n ]\n : []\n}\n\nconst errorChatMessage = (message: string | null): ReadonlyArray<AgentChatMessage> =>\n message === null\n ? []\n : [\n {\n id: 'error-message',\n turnId: 'error-turn',\n sequence: -1,\n role: 'system',\n parts: [{ _tag: 'Error', id: 'error', message }]\n }\n ]\n\nexport const buildAgentChatMessages = ({\n messages,\n userDraft,\n assistantDraft,\n reasoningDraft,\n toolRuns,\n error\n}: BuildAgentChatMessagesInput): ReadonlyArray<AgentChatMessage> => {\n const toolNames = collectToolNames(messages, toolRuns)\n const toolResultsById = collectToolResultsById(messages)\n const toolCallIds = collectToolCallIds(messages)\n const toolRunsById = collectToolRunsById(toolRuns)\n\n const builtMessages = messages.reduce<ReadonlyArray<AgentChatMessage>>(\n (current, message, index) => {\n const currentTurnId =\n message._tag === 'User' ? turnId(index) : (lastTurnId(current) ?? turnId(index))\n\n return [\n ...current,\n ...chatMessagesFromProtocolMessage({\n message,\n sequence: index,\n currentTurnId,\n toolNames,\n toolResultsById,\n toolCallIds,\n toolRunsById\n })\n ]\n },\n []\n )\n\n return [\n ...builtMessages,\n ...draftUserMessage(userDraft),\n ...draftAssistantMessage({ reasoningDraft, assistantDraft }),\n ...errorChatMessage(error)\n ]\n}\n\nconst collectContent = (parts: ReadonlyArray<AgentChatPart>): Content => {\n const contentPartsList = parts\n .filter(part => part._tag === 'Text')\n .flatMap(part => contentParts(part.content))\n\n const onlyPart = contentPartsList[0]\n\n if (onlyPart !== undefined && contentPartsList.length === 1 && onlyPart._tag === 'Text') {\n return onlyPart.text\n }\n\n return contentPartsList\n}\n\nconst collectToolResultMessages = (parts: ReadonlyArray<AgentChatPart>) =>\n parts.flatMap(part => {\n switch (part._tag) {\n case 'ToolCall': {\n if (part.state._tag === 'Completed') {\n return [\n ToolResultMessage.make({\n toolCallId: part.state.result.toolCallId,\n content: part.state.result.content,\n isError: part.state.result.isError,\n structuredContent: part.state.result.structuredContent\n })\n ]\n }\n\n if (part.state._tag === 'Denied') {\n return [\n ToolResultMessage.make({\n toolCallId: part.call.id,\n content: `Tool call denied: ${part.state.reason}`,\n isError: true,\n structuredContent: { type: 'tool_approval_denied', reason: part.state.reason }\n })\n ]\n }\n\n if (part.state._tag === 'QuestionAnswered' || part.state._tag === 'QuestionCancelled') {\n const response = part.state.response\n\n return [\n ToolResultMessage.make({\n toolCallId: response.toolCallId,\n content: formatQuestionResponseContent(response, part.state.request?.questions),\n isError: response.outcome === 'cancelled' ? true : undefined,\n structuredContent: questionResponseStructuredContent(response)\n })\n ]\n }\n\n return []\n }\n case 'ToolResult':\n return [\n ToolResultMessage.make({\n toolCallId: part.toolCallId,\n content: part.content,\n isError: part.isError,\n structuredContent: part.structuredContent\n })\n ]\n case 'Error':\n case 'Reasoning':\n case 'Text':\n return []\n }\n })\n\nconst assistantProtocolPartsFromChatParts = (\n parts: ReadonlyArray<AgentChatPart>\n): ReadonlyArray<AssistantPart> =>\n parts.flatMap((part): ReadonlyArray<AssistantPart> => {\n switch (part._tag) {\n case 'Text':\n return isContentEmpty(part.content)\n ? []\n : [AssistantTextPart.make({ content: part.content })]\n case 'Reasoning':\n return part.text.length === 0 ? [] : [AssistantReasoningPart.make({ text: part.text })]\n case 'ToolCall':\n return part.state._tag === 'ProviderCompleted'\n ? [\n ProviderToolCallPart.make({ call: part.call }),\n ProviderToolResultPart.make({\n toolCallId: part.call.id,\n result: part.state.result\n })\n ]\n : [HostToolCallPart.make({ call: part.call })]\n case 'Error':\n case 'ToolResult':\n return []\n }\n })\n\nconst assistantMessageFromParts = (message: AgentChatMessage) => {\n const parts = message.parts\n const assistantParts = assistantProtocolPartsFromChatParts(parts)\n\n if (assistantParts.length === 0) {\n return Option.none<AgentMessage>()\n }\n\n return Option.some(\n AssistantAgentMessage.make({ ...chatMessageEnvelope(message), parts: assistantParts })\n )\n}\n\nconst protocolMessagesFromChatMessage = (\n message: AgentChatMessage\n): ReadonlyArray<AgentMessage> => {\n switch (message.role) {\n case 'user': {\n const content = collectContent(message.parts)\n\n return isContentEmpty(content)\n ? []\n : [UserMessage.make({ ...chatMessageEnvelope(message), content })]\n }\n case 'assistant':\n return [\n ...Arr.getSomes([assistantMessageFromParts(message)]),\n ...collectToolResultMessages(message.parts)\n ]\n case 'system':\n return collectToolResultMessages(message.parts)\n }\n}\n\nexport const toAgentMessages = (messages: ReadonlyArray<AgentChatMessage>) =>\n Arr.flatMap(messages, protocolMessagesFromChatMessage)\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat-messages.mjs","names":["Arr"],"sources":["../../src/react/chat-messages.ts"],"sourcesContent":["import { Array as Arr, Option } from 'effect'\nimport type { AgentToolRun } from '@yolk-sdk/agent/client'\nimport {\n AssistantAgentMessage,\n AssistantReasoningPart,\n AssistantTextPart,\n HostToolCallPart,\n ProviderToolCallPart,\n ProviderToolResultPart,\n type QuestionRequest,\n type QuestionResponse,\n type ToolApprovalRequest,\n ToolResult,\n ToolResultMessage,\n ToolCall,\n UserMessage,\n appendTextToContent,\n contentParts,\n formatQuestionResponseContent,\n isContentEmpty,\n questionResponseStructuredContent,\n type AgentEvent,\n type AgentMessage,\n type AssistantPart,\n type Content,\n type MessageAnnotations,\n type MessageAuthor,\n type MessageEnvelope\n} from '@yolk-sdk/agent/protocol'\n\nexport type ChatPartState = 'streaming' | 'done'\n\nexport type ChatToolState =\n | { readonly _tag: 'Called' }\n | { readonly _tag: 'InputStreaming'; readonly input: string }\n | { readonly _tag: 'ApprovalRequested'; readonly request?: ToolApprovalRequest }\n | { readonly _tag: 'Denied'; readonly reason: string }\n | { readonly _tag: 'QuestionRequested'; readonly request: QuestionRequest }\n | {\n readonly _tag: 'QuestionAnswered'\n readonly response: QuestionResponse\n readonly request?: QuestionRequest\n }\n | {\n readonly _tag: 'QuestionCancelled'\n readonly response: QuestionResponse\n readonly request?: QuestionRequest\n }\n | { readonly _tag: 'Running'; readonly startedAtMs: number }\n | {\n readonly _tag: 'Completed'\n readonly result: ToolResult\n readonly startedAtMs?: number\n readonly endedAtMs?: number\n }\n | {\n readonly _tag: 'Errored'\n readonly message: string\n readonly startedAtMs?: number\n readonly endedAtMs?: number\n }\n | { readonly _tag: 'ProviderCompleted'; readonly result: ToolResult }\n\nexport type AgentChatPart =\n | {\n readonly _tag: 'Text'\n readonly id: string\n readonly content: Content\n readonly state: ChatPartState\n }\n | {\n readonly _tag: 'Reasoning'\n readonly id: string\n readonly text: string\n readonly state: ChatPartState\n }\n | {\n readonly _tag: 'ToolCall'\n readonly id: string\n readonly call: ToolCall\n readonly state: ChatToolState\n }\n | {\n readonly _tag: 'ToolResult'\n readonly id: string\n readonly toolCallId: string\n readonly name: string\n readonly content: Content\n readonly isError?: boolean\n readonly structuredContent?: unknown\n }\n | { readonly _tag: 'Error'; readonly id: string; readonly message: string }\n\nexport type AgentChatMessage = {\n readonly id: string\n readonly turnId: string\n readonly sequence: number\n readonly role: 'user' | 'assistant' | 'system'\n readonly createdAtMs?: number\n readonly author?: MessageAuthor\n readonly annotations?: MessageAnnotations\n readonly parts: ReadonlyArray<AgentChatPart>\n}\n\nexport type DeleteChatTurnResult =\n | { readonly _tag: 'NotFound' }\n | {\n readonly _tag: 'Deleted'\n readonly turnStartMessageId: string\n readonly deletedMessageIds: ReadonlyArray<string>\n readonly messages: ReadonlyArray<AgentChatMessage>\n }\n\nexport type EditChatUserMessageResult =\n | { readonly _tag: 'NotFound' }\n | { readonly _tag: 'NotUserMessage' }\n | {\n readonly _tag: 'Edited'\n readonly messageId: string\n readonly messages: ReadonlyArray<AgentChatMessage>\n }\n\nexport type RegenerateChatMessagesResult =\n | { readonly _tag: 'NotFound' }\n | {\n readonly _tag: 'Regenerated'\n readonly messages: ReadonlyArray<AgentChatMessage>\n }\n\nexport type ApplyAgentEventToChatMessagesOptions = {\n readonly nowMs?: number\n}\n\nconst messageId = (sequence: number, role: AgentChatMessage['role']) =>\n `message-${sequence}-${role}`\n\nconst turnId = (sequence: number) => `turn-${sequence}`\n\nconst lastTurnId = (messages: ReadonlyArray<AgentChatMessage>) => messages.at(-1)?.turnId\n\nconst nextMessageSequence = (messages: ReadonlyArray<AgentChatMessage>) =>\n messages.reduce((max, message) => Math.max(max, message.sequence), -1) + 1\n\nconst chatMessageEnvelope = (message: MessageEnvelope) => ({\n ...(message.createdAtMs === undefined ? {} : { createdAtMs: message.createdAtMs }),\n ...(message.author === undefined ? {} : { author: message.author }),\n ...(message.annotations === undefined ? {} : { annotations: message.annotations })\n})\n\nconst userChatMessage = (message: UserMessage, sequence: number): AgentChatMessage => ({\n id: messageId(sequence, 'user'),\n turnId: turnId(sequence),\n sequence,\n role: 'user',\n ...chatMessageEnvelope(message),\n parts: [\n {\n _tag: 'Text',\n id: `message-${sequence}-user-text`,\n content: message.content,\n state: 'done'\n }\n ]\n})\n\nexport type BuildAgentChatMessagesInput = {\n readonly messages: ReadonlyArray<AgentMessage>\n readonly userDraft: string\n readonly assistantDraft: string\n readonly reasoningDraft: string\n readonly toolRuns: ReadonlyArray<AgentToolRun>\n readonly error: string | null\n}\n\nconst toolRunNameEntry = (run: AgentToolRun): ReadonlyArray<readonly [string, string]> => {\n switch (run._tag) {\n case 'InputStreaming':\n return run.name === undefined ? [] : [[run.id, run.name]]\n case 'Denied':\n return []\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return run.request === undefined ? [] : [[run.request.call.id, run.request.call.name]]\n case 'QuestionRequested':\n return [[run.request.call.id, run.request.call.name]]\n case 'InputReady':\n case 'ApprovalRequested':\n case 'Executing':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return [[run.call.id, run.call.name]]\n }\n}\n\nconst assistantToolNameEntries = (\n message: AgentMessage\n): ReadonlyArray<readonly [string, string]> =>\n message._tag === 'Assistant'\n ? message.parts.flatMap(part =>\n part._tag === 'HostToolCall' || part._tag === 'ProviderToolCall'\n ? [[part.call.id, part.call.name]]\n : []\n )\n : []\n\nconst collectToolNames = (\n messages: ReadonlyArray<AgentMessage>,\n toolRuns: ReadonlyArray<AgentToolRun>\n): ReadonlyMap<string, string> =>\n new Map([...toolRuns.flatMap(toolRunNameEntry), ...messages.flatMap(assistantToolNameEntries)])\n\nconst toolResultEntry = (message: AgentMessage): ReadonlyArray<readonly [string, ToolResult]> =>\n message._tag === 'ToolResult'\n ? [\n [\n message.toolCallId,\n ToolResult.make({\n toolCallId: message.toolCallId,\n content: message.content,\n isError: message.isError,\n structuredContent: message.structuredContent\n })\n ]\n ]\n : []\n\nconst collectToolResultsById = (messages: ReadonlyArray<AgentMessage>) =>\n new Map(messages.flatMap(toolResultEntry))\n\nconst collectToolCallIds = (messages: ReadonlyArray<AgentMessage>): ReadonlySet<string> =>\n new Set(\n messages.flatMap(message =>\n message._tag === 'Assistant'\n ? message.parts.flatMap(part =>\n part._tag === 'HostToolCall' || part._tag === 'ProviderToolCall' ? [part.call.id] : []\n )\n : []\n )\n )\n\nconst toolRunEntry = (run: AgentToolRun): readonly [string, AgentToolRun] => {\n switch (run._tag) {\n case 'InputStreaming':\n return [run.id, run]\n case 'Denied':\n return [run.toolCallId, run]\n case 'QuestionRequested':\n return [run.request.toolCallId, run]\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return [run.response.toolCallId, run]\n case 'InputReady':\n case 'ApprovalRequested':\n case 'Executing':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return [run.call.id, run]\n }\n}\n\nconst collectToolRunsById = (\n runs: ReadonlyArray<AgentToolRun>\n): ReadonlyMap<string, AgentToolRun> => new Map(runs.map(toolRunEntry))\n\nconst questionRequestFromToolState = (state: ChatToolState): QuestionRequest | undefined => {\n switch (state._tag) {\n case 'QuestionRequested':\n return state.request\n case 'QuestionAnswered':\n case 'QuestionCancelled':\n return state.request\n case 'Called':\n case 'InputStreaming':\n case 'ApprovalRequested':\n case 'Denied':\n case 'Running':\n case 'Completed':\n case 'Errored':\n case 'ProviderCompleted':\n return undefined\n }\n}\n\ntype QuestionTerminalState = Extract<\n ChatToolState,\n { readonly _tag: 'QuestionAnswered' | 'QuestionCancelled' }\n>\n\nconst preserveQuestionRequest = (\n request: QuestionRequest | undefined,\n state: QuestionTerminalState\n): QuestionTerminalState =>\n state.request !== undefined || request === undefined ? state : { ...state, request }\n\nconst toolStateFor = (\n run: AgentToolRun | undefined,\n result: ToolResult | undefined\n): ChatToolState => {\n if (run?._tag === 'Executing') {\n return { _tag: 'Running', startedAtMs: run.startedAtMs }\n }\n\n if (run?._tag === 'InputStreaming') {\n return { _tag: 'InputStreaming', input: run.input }\n }\n\n if (run?._tag === 'ApprovalRequested') {\n return { _tag: 'ApprovalRequested', request: run.request }\n }\n\n if (run?._tag === 'Denied') {\n return { _tag: 'Denied', reason: run.reason }\n }\n\n if (run?._tag === 'QuestionRequested') {\n return { _tag: 'QuestionRequested', request: run.request }\n }\n\n if (run?._tag === 'QuestionAnswered') {\n return preserveQuestionRequest(run.request, {\n _tag: 'QuestionAnswered',\n response: run.response\n })\n }\n\n if (run?._tag === 'QuestionCancelled') {\n return preserveQuestionRequest(run.request, {\n _tag: 'QuestionCancelled',\n response: run.response\n })\n }\n\n if (run?._tag === 'Completed') {\n return {\n _tag: 'Completed',\n result: run.result,\n startedAtMs: run.startedAtMs,\n endedAtMs: run.endedAtMs\n }\n }\n\n if (run?._tag === 'Errored') {\n return { _tag: 'Errored', message: run.message, endedAtMs: run.endedAtMs }\n }\n\n if (run?._tag === 'ProviderCompleted') {\n return { _tag: 'ProviderCompleted', result: run.result }\n }\n\n if (result !== undefined) {\n return { _tag: 'Completed', result }\n }\n\n return { _tag: 'Called' }\n}\n\nconst assistantPartsFromMessage = ({\n message,\n messageIndex,\n toolResultsById,\n toolRunsById\n}: {\n readonly message: Extract<AgentMessage, { readonly _tag: 'Assistant' }>\n readonly messageIndex: number\n readonly toolResultsById: ReadonlyMap<string, ToolResult>\n readonly toolRunsById: ReadonlyMap<string, AgentToolRun>\n}): ReadonlyArray<AgentChatPart> => {\n return message.parts.flatMap((part, partIndex): ReadonlyArray<AgentChatPart> => {\n switch (part._tag) {\n case 'Reasoning':\n return part.text.length > 0\n ? [\n {\n _tag: 'Reasoning',\n id: `message-${messageIndex}-reasoning-${partIndex}`,\n text: part.text,\n state: 'done'\n }\n ]\n : []\n case 'Text':\n return [\n {\n _tag: 'Text',\n id: `message-${messageIndex}-assistant-text-${partIndex}`,\n content: part.content,\n state: 'done'\n }\n ]\n case 'HostToolCall':\n case 'ProviderToolCall':\n return [\n {\n _tag: 'ToolCall',\n id: `message-${messageIndex}-tool-call-${part.call.id}`,\n call: part.call,\n state: toolStateFor(toolRunsById.get(part.call.id), toolResultsById.get(part.call.id))\n }\n ]\n case 'ProviderToolResult':\n return [\n {\n _tag: 'ToolResult',\n id: `message-${messageIndex}-provider-tool-result-${part.toolCallId}`,\n toolCallId: part.toolCallId,\n name: part.toolCallId,\n content: part.result.content,\n isError: part.result.isError,\n structuredContent: part.result.structuredContent\n }\n ]\n }\n })\n}\n\nconst assistantChatMessage = (\n message: AssistantAgentMessage,\n sequence: number,\n currentTurnId: string,\n parts: ReadonlyArray<AgentChatPart> = assistantPartsFromMessage({\n message,\n messageIndex: sequence,\n toolResultsById: new Map(),\n toolRunsById: new Map()\n })\n): AgentChatMessage => ({\n id: messageId(sequence, 'assistant'),\n turnId: currentTurnId,\n sequence,\n role: 'assistant',\n ...chatMessageEnvelope(message),\n parts\n})\n\nconst hasStreamingPart = (message: AgentChatMessage) =>\n message.parts.some(\n part => (part._tag === 'Text' || part._tag === 'Reasoning') && part.state === 'streaming'\n )\n\nconst hasStreamingTextPart = (message: AgentChatMessage) =>\n message.parts.some(part => part._tag === 'Text' && part.state === 'streaming')\n\nconst hasToolCall = (message: AgentChatMessage, callId: string) =>\n message.parts.some(part => part._tag === 'ToolCall' && part.call.id === callId)\n\nconst isOpenToolState = (state: ChatToolState) =>\n state._tag === 'Called' ||\n state._tag === 'InputStreaming' ||\n state._tag === 'ApprovalRequested' ||\n state._tag === 'QuestionRequested' ||\n state._tag === 'Running'\n\nconst hasOpenToolCall = (message: AgentChatMessage) =>\n message.parts.some(part => part._tag === 'ToolCall' && isOpenToolState(part.state))\n\nconst findLastMessageIndex = (\n messages: ReadonlyArray<AgentChatMessage>,\n predicate: (message: AgentChatMessage) => boolean\n) => messages.reduce((lastIndex, message, index) => (predicate(message) ? index : lastIndex), -1)\n\nconst findMessageIndex = (messages: ReadonlyArray<AgentChatMessage>, messageId: string) =>\n messages.findIndex(message => message.id === messageId)\n\nexport const deleteChatTurn = (\n messages: ReadonlyArray<AgentChatMessage>,\n messageId: string\n): DeleteChatTurnResult => {\n const targetIndex = findMessageIndex(messages, messageId)\n\n if (targetIndex === -1) {\n return { _tag: 'NotFound' }\n }\n\n const target = messages[targetIndex]\n\n if (target === undefined) {\n return { _tag: 'NotFound' }\n }\n\n const deletedMessages = messages.filter(message => message.turnId === target.turnId)\n const turnStartMessage = deletedMessages[0]\n\n return {\n _tag: 'Deleted',\n turnStartMessageId: turnStartMessage?.id ?? target.id,\n deletedMessageIds: deletedMessages.map(message => message.id),\n messages: messages.filter(message => message.turnId !== target.turnId)\n }\n}\n\nexport const regenerateChatMessagesFrom = (\n messages: ReadonlyArray<AgentChatMessage>,\n messageId: string\n): RegenerateChatMessagesResult => {\n const targetIndex = findMessageIndex(messages, messageId)\n\n if (targetIndex === -1) {\n return { _tag: 'NotFound' }\n }\n\n const target = messages[targetIndex]\n\n if (target === undefined) {\n return { _tag: 'NotFound' }\n }\n\n return {\n _tag: 'Regenerated',\n messages: messages.slice(0, target.role === 'user' ? targetIndex + 1 : targetIndex)\n }\n}\n\nexport const editChatUserMessage = (\n messages: ReadonlyArray<AgentChatMessage>,\n messageId: string,\n content: Content\n): EditChatUserMessageResult => {\n const targetIndex = findMessageIndex(messages, messageId)\n\n if (targetIndex === -1) {\n return { _tag: 'NotFound' }\n }\n\n const target = messages[targetIndex]\n\n if (target === undefined) {\n return { _tag: 'NotFound' }\n }\n\n if (target.role !== 'user') {\n return { _tag: 'NotUserMessage' }\n }\n\n return {\n _tag: 'Edited',\n messageId: target.id,\n messages: [\n ...messages.slice(0, targetIndex),\n {\n ...target,\n parts: [\n {\n _tag: 'Text',\n id: `message-${target.sequence}-user-text`,\n content,\n state: 'done'\n }\n ]\n }\n ]\n }\n}\n\nconst lastAssistantIndex = (messages: ReadonlyArray<AgentChatMessage>) => {\n const index = findLastMessageIndex(messages, message => message.role === 'assistant')\n\n return index === -1 ? Option.none<number>() : Option.some(index)\n}\n\nconst targetAssistantIndex = (messages: ReadonlyArray<AgentChatMessage>) =>\n Option.filter(lastAssistantIndex(messages), index => hasStreamingPart(messages[index]))\n\nconst appendAssistantPart = (\n messages: ReadonlyArray<AgentChatMessage>,\n part: AgentChatPart\n): ReadonlyArray<AgentChatMessage> =>\n Option.match(targetAssistantIndex(messages), {\n onNone: () => {\n const sequence = nextMessageSequence(messages)\n const currentTurnId = lastTurnId(messages) ?? turnId(sequence)\n\n return [\n ...messages,\n {\n id: messageId(sequence, 'assistant'),\n turnId: currentTurnId,\n sequence,\n role: 'assistant',\n parts: [part]\n }\n ]\n },\n onSome: index =>\n messages.map((message, messageIndex) =>\n messageIndex === index ? { ...message, parts: [...message.parts, part] } : message\n )\n })\n\nconst appendAssistantTextDelta = (\n messages: ReadonlyArray<AgentChatMessage>,\n input: { readonly delta: string; readonly textSoFar?: string }\n): ReadonlyArray<AgentChatMessage> => {\n const index = targetAssistantIndex(messages)\n const content = input.textSoFar ?? input.delta\n\n if (Option.isNone(index)) {\n const sequence = nextMessageSequence(messages)\n\n return appendAssistantPart(messages, {\n _tag: 'Text',\n id: `message-${sequence}-assistant-text`,\n content,\n state: 'streaming'\n })\n }\n\n return messages.map((message, messageIndex) =>\n messageIndex === index.value\n ? {\n ...message,\n parts: hasStreamingTextPart(message)\n ? message.parts.map(part =>\n part._tag === 'Text' && part.state === 'streaming'\n ? {\n ...part,\n content: input.textSoFar ?? appendTextToContent(part.content, input.delta)\n }\n : part\n )\n : [\n ...message.parts,\n {\n _tag: 'Text',\n id: `message-${message.sequence}-assistant-text`,\n content,\n state: 'streaming'\n }\n ]\n }\n : message\n )\n}\n\nconst appendAssistantReasoningDelta = (\n messages: ReadonlyArray<AgentChatMessage>,\n input: { readonly delta: string; readonly reasoningSoFar?: string }\n): ReadonlyArray<AgentChatMessage> => {\n const index = targetAssistantIndex(messages)\n const text = input.reasoningSoFar ?? input.delta\n\n if (Option.isNone(index)) {\n const sequence = nextMessageSequence(messages)\n\n return appendAssistantPart(messages, {\n _tag: 'Reasoning',\n id: `message-${sequence}-reasoning`,\n text,\n state: 'streaming'\n })\n }\n\n return messages.map((message, messageIndex) =>\n messageIndex === index.value\n ? {\n ...message,\n parts: message.parts.some(part => part._tag === 'Reasoning' && part.state === 'streaming')\n ? message.parts.map(part =>\n part._tag === 'Reasoning' && part.state === 'streaming'\n ? { ...part, text: input.reasoningSoFar ?? `${part.text}${input.delta}` }\n : part\n )\n : [\n ...message.parts,\n {\n _tag: 'Reasoning',\n id: `message-${message.sequence}-reasoning`,\n text,\n state: 'streaming'\n }\n ]\n }\n : message\n )\n}\n\nconst mergeToolState = (existing: ChatToolState, next: ChatToolState): ChatToolState => {\n if (next._tag === 'Errored') {\n return {\n ...next,\n startedAtMs:\n next.startedAtMs ??\n (existing._tag === 'Running' || existing._tag === 'Completed' || existing._tag === 'Errored'\n ? existing.startedAtMs\n : undefined),\n endedAtMs: next.endedAtMs ?? (existing._tag === 'Errored' ? existing.endedAtMs : undefined)\n }\n }\n\n if (next._tag === 'QuestionAnswered' || next._tag === 'QuestionCancelled') {\n return preserveQuestionRequest(questionRequestFromToolState(existing), next)\n }\n\n if (next._tag === 'Denied' || next._tag === 'ProviderCompleted') {\n return next\n }\n\n if (next._tag === 'Completed') {\n return {\n ...next,\n startedAtMs:\n next.startedAtMs ??\n (existing._tag === 'Running' || existing._tag === 'Completed'\n ? existing.startedAtMs\n : undefined),\n endedAtMs: next.endedAtMs ?? (existing._tag === 'Completed' ? existing.endedAtMs : undefined)\n }\n }\n\n if (next._tag === 'Running' && existing._tag === 'Completed') {\n return existing\n }\n\n return next\n}\n\nconst appendToolCallPart = (\n messages: ReadonlyArray<AgentChatMessage>,\n call: ToolCall,\n state: ChatToolState\n): ReadonlyArray<AgentChatMessage> => {\n const index = Option.filter(lastAssistantIndex(messages), assistantIndex => {\n const message = messages[assistantIndex]\n\n return hasStreamingPart(message) || hasOpenToolCall(message)\n })\n\n return Option.match(index, {\n onNone: () => {\n const sequence = nextMessageSequence(messages)\n const currentTurnId = lastTurnId(messages) ?? turnId(sequence)\n\n return [\n ...messages,\n {\n id: messageId(sequence, 'assistant'),\n turnId: currentTurnId,\n sequence,\n role: 'assistant',\n parts: [\n {\n _tag: 'ToolCall',\n id: `tool-call-${call.id}`,\n call,\n state\n }\n ]\n }\n ]\n },\n onSome: assistantIndex =>\n messages.map((message, messageIndex) =>\n messageIndex === assistantIndex\n ? {\n ...message,\n parts: [\n ...message.parts,\n {\n _tag: 'ToolCall',\n id: `tool-call-${call.id}`,\n call,\n state\n }\n ]\n }\n : message\n )\n })\n}\n\nconst upsertToolCallPart = (\n messages: ReadonlyArray<AgentChatMessage>,\n call: ToolCall,\n state: ChatToolState\n): ReadonlyArray<AgentChatMessage> => {\n const existingIndex = findLastMessageIndex(messages, message => hasToolCall(message, call.id))\n\n if (existingIndex !== -1) {\n return messages.map((message, messageIndex) =>\n messageIndex === existingIndex\n ? {\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === call.id\n ? { ...part, call, state: mergeToolState(part.state, state) }\n : part\n )\n }\n : message\n )\n }\n\n return appendToolCallPart(messages, call, state)\n}\n\nconst inputStreamingToolCall = (id: string, name: string | undefined) =>\n ToolCall.make({ id, name: name ?? id, params: {} })\n\nconst appendToolInputDelta = (\n messages: ReadonlyArray<AgentChatMessage>,\n id: string,\n delta: string\n): ReadonlyArray<AgentChatMessage> =>\n messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === id && part.state._tag === 'InputStreaming'\n ? { ...part, state: { ...part.state, input: `${part.state.input}${delta}` } }\n : part\n )\n }))\n\nconst finalizeAssistantParts = (\n parts: ReadonlyArray<AgentChatPart>\n): ReadonlyArray<AgentChatPart> =>\n parts.map(part => {\n switch (part._tag) {\n case 'Text':\n case 'Reasoning':\n return { ...part, state: 'done' satisfies ChatPartState }\n case 'Error':\n case 'ToolCall':\n case 'ToolResult':\n return part\n }\n })\n\nconst toolStateEntry = (part: AgentChatPart): ReadonlyArray<readonly [string, ChatToolState]> =>\n part._tag === 'ToolCall' ? [[part.call.id, part.state]] : []\n\nconst toolStateByCallId = (parts: ReadonlyArray<AgentChatPart>) =>\n new Map(parts.flatMap(toolStateEntry))\n\nconst partsFromAssistantMessage = (\n message: AssistantAgentMessage,\n messageIndex: number,\n existingParts: ReadonlyArray<AgentChatPart>\n) => {\n const states = toolStateByCallId(existingParts)\n\n return assistantPartsFromMessage({\n message,\n messageIndex,\n toolResultsById: new Map(),\n toolRunsById: new Map()\n }).map(part =>\n part._tag === 'ToolCall' ? { ...part, state: states.get(part.call.id) ?? part.state } : part\n )\n}\n\nconst appendOrReplaceAssistantMessage = (\n messages: ReadonlyArray<AgentChatMessage>,\n message: AssistantAgentMessage\n) => {\n const messageToolCallIds = message.parts.flatMap(part =>\n part._tag === 'HostToolCall' || part._tag === 'ProviderToolCall' ? [part.call.id] : []\n )\n const index = Option.filter(lastAssistantIndex(messages), assistantIndex => {\n const current = messages[assistantIndex]\n\n return (\n hasStreamingPart(current) || messageToolCallIds.some(callId => hasToolCall(current, callId))\n )\n })\n\n return Option.match(index, {\n onNone: () => {\n const sequence = nextMessageSequence(messages)\n\n return [\n ...messages,\n assistantChatMessage(message, sequence, lastTurnId(messages) ?? turnId(sequence))\n ]\n },\n onSome: assistantIndex =>\n messages.map((current, messageIndex) =>\n messageIndex === assistantIndex\n ? {\n ...current,\n parts: partsFromAssistantMessage(message, current.sequence, current.parts)\n }\n : current\n )\n })\n}\n\nconst appendOrphanToolResult = (\n messages: ReadonlyArray<AgentChatMessage>,\n result: ToolResult\n): ReadonlyArray<AgentChatMessage> => {\n const sequence = nextMessageSequence(messages)\n const currentTurnId = lastTurnId(messages) ?? turnId(sequence)\n\n return [\n ...messages,\n {\n id: `message-${sequence}-tool-result-message`,\n turnId: currentTurnId,\n sequence,\n role: 'system',\n parts: [\n {\n _tag: 'ToolResult',\n id: `tool-result-${result.toolCallId}`,\n toolCallId: result.toolCallId,\n name: result.toolCallId,\n content: result.content,\n isError: result.isError,\n structuredContent: result.structuredContent\n }\n ]\n }\n ]\n}\n\nconst clearTransientParts = (\n messages: ReadonlyArray<AgentChatMessage>\n): ReadonlyArray<AgentChatMessage> =>\n messages.flatMap(message => {\n const parts = message.parts.filter(part => part._tag !== 'Error')\n\n return parts.length > 0 ? [{ ...message, parts }] : []\n })\n\nconst finalizeStreamingParts = (\n messages: ReadonlyArray<AgentChatMessage>\n): ReadonlyArray<AgentChatMessage> =>\n messages.map(message =>\n message.role === 'assistant'\n ? { ...message, parts: finalizeAssistantParts(message.parts) }\n : message\n )\n\nconst appendRunMessagesIfEmpty = (\n messages: ReadonlyArray<AgentChatMessage>,\n runMessages: ReadonlyArray<AgentMessage>\n) => {\n const lastUserMessageIndex = findLastMessageIndex(messages, message => message.role === 'user')\n const hasAssistantAfterLastUser = messages.some(\n (message, index) => message.role === 'assistant' && index > lastUserMessageIndex\n )\n\n if (runMessages.length === 0 || hasAssistantAfterLastUser) {\n return messages\n }\n\n return [\n ...messages,\n ...buildAgentChatMessages({\n messages: runMessages,\n userDraft: '',\n assistantDraft: '',\n reasoningDraft: '',\n toolRuns: [],\n error: null\n })\n ]\n}\n\nexport const appendProtocolMessage = (\n messages: ReadonlyArray<AgentChatMessage>,\n message: AgentMessage\n) => {\n const sequence = nextMessageSequence(messages)\n\n switch (message._tag) {\n case 'User':\n return [...messages, userChatMessage(message, sequence)]\n case 'Assistant':\n return [\n ...messages,\n assistantChatMessage(message, sequence, lastTurnId(messages) ?? turnId(sequence))\n ]\n case 'ToolResult':\n return appendOrphanToolResult(\n messages,\n ToolResult.make({\n toolCallId: message.toolCallId,\n content: message.content,\n isError: message.isError,\n structuredContent: message.structuredContent\n })\n )\n }\n}\n\nexport const markChatError = (\n messages: ReadonlyArray<AgentChatMessage>,\n message: string\n): ReadonlyArray<AgentChatMessage> => [\n ...messages.filter(chatMessage => !chatMessage.parts.some(part => part._tag === 'Error')),\n {\n id: 'error-message',\n turnId: 'error-turn',\n sequence: nextMessageSequence(messages),\n role: 'system',\n parts: [{ _tag: 'Error', id: 'error', message }]\n }\n]\n\n/**\n * Applies one event without tracking `eventId` replay state.\n *\n * Prefer `applyAgentEventToChatProjection` for durable streams that can replay\n * or overlap. Append-only text and reasoning deltas are not idempotent here.\n */\nexport const applyAgentEventToChatMessages = (\n messages: ReadonlyArray<AgentChatMessage>,\n event: AgentEvent,\n options: ApplyAgentEventToChatMessagesOptions = {}\n): ReadonlyArray<AgentChatMessage> => {\n const eventTimeMs = event.createdAtMs ?? options.nowMs ?? 0\n\n switch (event._tag) {\n case 'AgentStart':\n return clearTransientParts(messages)\n case 'LLMTextDelta':\n return appendAssistantTextDelta(messages, { delta: event.text, textSoFar: event.textSoFar })\n case 'LLMReasoningDelta':\n return appendAssistantReasoningDelta(messages, {\n delta: event.text,\n reasoningSoFar: event.reasoningSoFar\n })\n case 'ToolInputEnd':\n return upsertToolCallPart(messages, event.call, { _tag: 'Called' })\n case 'AssistantMessage':\n return appendOrReplaceAssistantMessage(messages, event.message)\n case 'ToolInputStart':\n return upsertToolCallPart(messages, inputStreamingToolCall(event.id, event.name), {\n _tag: 'InputStreaming',\n input: ''\n })\n case 'ToolInputDelta':\n return appendToolInputDelta(messages, event.id, event.delta)\n case 'ToolApprovalRequested':\n return upsertToolCallPart(messages, event.call, {\n _tag: 'ApprovalRequested',\n request: event.request\n })\n case 'ToolApprovalGranted':\n return messages\n case 'ToolApprovalDenied':\n return messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === event.toolCallId\n ? { ...part, state: { _tag: 'Denied', reason: event.reason } }\n : part\n )\n }))\n case 'QuestionRequested':\n return upsertToolCallPart(messages, event.request.call, {\n _tag: 'QuestionRequested',\n request: event.request\n })\n case 'QuestionAnswered':\n return messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === event.response.toolCallId\n ? {\n ...part,\n state: preserveQuestionRequest(questionRequestFromToolState(part.state), {\n _tag: 'QuestionAnswered',\n response: event.response\n })\n }\n : part\n )\n }))\n case 'QuestionCancelled':\n return messages.map(message => ({\n ...message,\n parts: message.parts.map(part =>\n part._tag === 'ToolCall' && part.call.id === event.response.toolCallId\n ? {\n ...part,\n state: preserveQuestionRequest(questionRequestFromToolState(part.state), {\n _tag: 'QuestionCancelled',\n response: event.response\n })\n }\n : part\n )\n }))\n case 'ToolExecutionStarted':\n return upsertToolCallPart(messages, event.call, { _tag: 'Running', startedAtMs: eventTimeMs })\n case 'ToolExecutionCompleted':\n return upsertToolCallPart(messages, event.call, {\n _tag: 'Completed',\n result: event.result,\n endedAtMs: eventTimeMs\n })\n case 'ToolExecutionError':\n return upsertToolCallPart(messages, event.call, {\n _tag: 'Errored',\n message: event.message,\n endedAtMs: eventTimeMs\n })\n case 'ProviderToolResult':\n return upsertToolCallPart(messages, event.call, {\n _tag: 'ProviderCompleted',\n result: event.result\n })\n case 'AgentError':\n return markChatError(messages, event.message)\n case 'AgentEnd':\n return appendRunMessagesIfEmpty(finalizeStreamingParts(messages), event.messages)\n case 'AgentAwaitingInput':\n return appendRunMessagesIfEmpty(finalizeStreamingParts(messages), event.messages)\n case 'AgentRetry':\n case 'CompactionEnd':\n case 'CompactionStart':\n case 'LLMStreamEnd':\n case 'LLMStreamStart':\n case 'SubagentCompleted':\n case 'SubagentStarted':\n case 'TurnEnd':\n case 'TurnStart':\n case 'UsageUpdate':\n return messages\n }\n}\n\nconst chatMessagesFromProtocolMessage = ({\n message,\n sequence,\n currentTurnId,\n toolNames,\n toolResultsById,\n toolCallIds,\n toolRunsById\n}: {\n readonly message: AgentMessage\n readonly sequence: number\n readonly currentTurnId: string\n readonly toolNames: ReadonlyMap<string, string>\n readonly toolResultsById: ReadonlyMap<string, ToolResult>\n readonly toolCallIds: ReadonlySet<string>\n readonly toolRunsById: ReadonlyMap<string, AgentToolRun>\n}): ReadonlyArray<AgentChatMessage> => {\n switch (message._tag) {\n case 'User':\n return [userChatMessage(message, sequence)]\n case 'Assistant':\n return [\n {\n id: messageId(sequence, 'assistant'),\n turnId: currentTurnId,\n sequence,\n role: 'assistant',\n parts: assistantPartsFromMessage({\n message,\n messageIndex: sequence,\n toolResultsById,\n toolRunsById\n })\n }\n ]\n case 'ToolResult':\n return toolCallIds.has(message.toolCallId)\n ? []\n : [\n {\n id: `message-${sequence}-tool-result-message`,\n turnId: currentTurnId,\n sequence,\n role: 'system',\n parts: [\n {\n _tag: 'ToolResult',\n id: `message-${sequence}-tool-result-${message.toolCallId}`,\n toolCallId: message.toolCallId,\n name: toolNames.get(message.toolCallId) ?? message.toolCallId,\n content: message.content,\n isError: message.isError,\n structuredContent: message.structuredContent\n }\n ]\n }\n ]\n }\n}\n\nconst draftUserMessage = (userDraft: string): ReadonlyArray<AgentChatMessage> =>\n userDraft.length > 0\n ? [\n {\n id: 'draft-user',\n turnId: 'draft-user-turn',\n sequence: -1,\n role: 'user',\n parts: [{ _tag: 'Text', id: 'draft-user-text', content: userDraft, state: 'streaming' }]\n }\n ]\n : []\n\nconst draftReasoningPart = (reasoningDraft: string): ReadonlyArray<AgentChatPart> =>\n reasoningDraft.length > 0\n ? [\n {\n _tag: 'Reasoning',\n id: 'draft-reasoning',\n text: reasoningDraft,\n state: 'streaming'\n }\n ]\n : []\n\nconst draftTextPart = (assistantDraft: string): ReadonlyArray<AgentChatPart> =>\n assistantDraft.length > 0\n ? [\n {\n _tag: 'Text',\n id: 'draft-assistant-text',\n content: assistantDraft,\n state: 'streaming'\n }\n ]\n : []\n\nconst draftAssistantPart = ({\n reasoningDraft,\n assistantDraft\n}: {\n readonly reasoningDraft: string\n readonly assistantDraft: string\n}): ReadonlyArray<AgentChatPart> => [\n ...draftReasoningPart(reasoningDraft),\n ...draftTextPart(assistantDraft)\n]\n\nconst draftAssistantMessage = ({\n reasoningDraft,\n assistantDraft\n}: {\n readonly reasoningDraft: string\n readonly assistantDraft: string\n}): ReadonlyArray<AgentChatMessage> => {\n const parts = draftAssistantPart({ reasoningDraft, assistantDraft })\n\n return parts.length > 0\n ? [\n {\n id: 'draft-assistant',\n turnId: 'draft-assistant-turn',\n sequence: -1,\n role: 'assistant',\n parts\n }\n ]\n : []\n}\n\nconst errorChatMessage = (message: string | null): ReadonlyArray<AgentChatMessage> =>\n message === null\n ? []\n : [\n {\n id: 'error-message',\n turnId: 'error-turn',\n sequence: -1,\n role: 'system',\n parts: [{ _tag: 'Error', id: 'error', message }]\n }\n ]\n\nexport const buildAgentChatMessages = ({\n messages,\n userDraft,\n assistantDraft,\n reasoningDraft,\n toolRuns,\n error\n}: BuildAgentChatMessagesInput): ReadonlyArray<AgentChatMessage> => {\n const toolNames = collectToolNames(messages, toolRuns)\n const toolResultsById = collectToolResultsById(messages)\n const toolCallIds = collectToolCallIds(messages)\n const toolRunsById = collectToolRunsById(toolRuns)\n\n const builtMessages = messages.reduce<ReadonlyArray<AgentChatMessage>>(\n (current, message, index) => {\n const currentTurnId =\n message._tag === 'User' ? turnId(index) : (lastTurnId(current) ?? turnId(index))\n\n return [\n ...current,\n ...chatMessagesFromProtocolMessage({\n message,\n sequence: index,\n currentTurnId,\n toolNames,\n toolResultsById,\n toolCallIds,\n toolRunsById\n })\n ]\n },\n []\n )\n\n return [\n ...builtMessages,\n ...draftUserMessage(userDraft),\n ...draftAssistantMessage({ reasoningDraft, assistantDraft }),\n ...errorChatMessage(error)\n ]\n}\n\nconst collectContent = (parts: ReadonlyArray<AgentChatPart>): Content => {\n const contentPartsList = parts\n .filter(part => part._tag === 'Text')\n .flatMap(part => contentParts(part.content))\n\n const onlyPart = contentPartsList[0]\n\n if (onlyPart !== undefined && contentPartsList.length === 1 && onlyPart._tag === 'Text') {\n return onlyPart.text\n }\n\n return contentPartsList\n}\n\nconst collectToolResultMessages = (parts: ReadonlyArray<AgentChatPart>) =>\n parts.flatMap(part => {\n switch (part._tag) {\n case 'ToolCall': {\n if (part.state._tag === 'Completed') {\n return [\n ToolResultMessage.make({\n toolCallId: part.state.result.toolCallId,\n content: part.state.result.content,\n isError: part.state.result.isError,\n structuredContent: part.state.result.structuredContent\n })\n ]\n }\n\n if (part.state._tag === 'Denied') {\n return [\n ToolResultMessage.make({\n toolCallId: part.call.id,\n content: `Tool call denied: ${part.state.reason}`,\n isError: true,\n structuredContent: { type: 'tool_approval_denied', reason: part.state.reason }\n })\n ]\n }\n\n if (part.state._tag === 'QuestionAnswered' || part.state._tag === 'QuestionCancelled') {\n const response = part.state.response\n\n return [\n ToolResultMessage.make({\n toolCallId: response.toolCallId,\n content: formatQuestionResponseContent(response, part.state.request?.questions),\n isError: response.outcome === 'cancelled' ? true : undefined,\n structuredContent: questionResponseStructuredContent(response)\n })\n ]\n }\n\n return []\n }\n case 'ToolResult':\n return [\n ToolResultMessage.make({\n toolCallId: part.toolCallId,\n content: part.content,\n isError: part.isError,\n structuredContent: part.structuredContent\n })\n ]\n case 'Error':\n case 'Reasoning':\n case 'Text':\n return []\n }\n })\n\nconst assistantProtocolPartsFromChatParts = (\n parts: ReadonlyArray<AgentChatPart>\n): ReadonlyArray<AssistantPart> =>\n parts.flatMap((part): ReadonlyArray<AssistantPart> => {\n switch (part._tag) {\n case 'Text':\n return isContentEmpty(part.content)\n ? []\n : [AssistantTextPart.make({ content: part.content })]\n case 'Reasoning':\n return part.text.length === 0 ? [] : [AssistantReasoningPart.make({ text: part.text })]\n case 'ToolCall':\n return part.state._tag === 'ProviderCompleted'\n ? [\n ProviderToolCallPart.make({ call: part.call }),\n ProviderToolResultPart.make({\n toolCallId: part.call.id,\n result: part.state.result\n })\n ]\n : [HostToolCallPart.make({ call: part.call })]\n case 'Error':\n case 'ToolResult':\n return []\n }\n })\n\nconst assistantMessageFromParts = (message: AgentChatMessage) => {\n const parts = message.parts\n const assistantParts = assistantProtocolPartsFromChatParts(parts)\n\n if (assistantParts.length === 0) {\n return Option.none<AgentMessage>()\n }\n\n return Option.some(\n AssistantAgentMessage.make({ ...chatMessageEnvelope(message), parts: assistantParts })\n )\n}\n\nconst protocolMessagesFromChatMessage = (\n message: AgentChatMessage\n): ReadonlyArray<AgentMessage> => {\n switch (message.role) {\n case 'user': {\n const content = collectContent(message.parts)\n\n return isContentEmpty(content)\n ? []\n : [UserMessage.make({ ...chatMessageEnvelope(message), content })]\n }\n case 'assistant':\n return [\n ...Arr.getSomes([assistantMessageFromParts(message)]),\n ...collectToolResultMessages(message.parts)\n ]\n case 'system':\n return collectToolResultMessages(message.parts)\n }\n}\n\nexport const toAgentMessages = (messages: ReadonlyArray<AgentChatMessage>) =>\n Arr.flatMap(messages, protocolMessagesFromChatMessage)\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { AgentChatMessage, AgentChatPart, ApplyAgentEventToChatMessagesOptions, BuildAgentChatMessagesInput, ChatPartState, ChatToolState, DeleteChatTurnResult, EditChatUserMessageResult, RegenerateChatMessagesResult, appendProtocolMessage, applyAgentEventToChatMessages, buildAgentChatMessages, deleteChatTurn, editChatUserMessage, markChatError, regenerateChatMessagesFrom, toAgentMessages } from "./chat-messages.mjs";
2
2
  import { AgentChatSessionEvent, MessagesRegenerated, ProtocolMessageAppended, TurnDeleted, UserMessageEdited, UserMessageSubmitted } from "./chat-session-events.mjs";
3
- import { ActiveChatToolPart, AgentChatAction, AgentChatState, AgentRunStatus, CompletedChatToolPart, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, reduceAgentChatState } from "./chat-core.mjs";
3
+ import { ActiveChatToolPart, AgentChatAction, AgentChatEventProjectionState, AgentChatState, AgentRunStatus, CompletedChatToolPart, applyAgentEventToChatProjection, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, makeAgentChatEventProjectionState, reduceAgentChatState } from "./chat-core.mjs";
4
4
  import { AgentChatItem, BuildAgentChatItemsInput, ToolDuration, ToolRunState, ToolRunTiming, buildAgentChatItems, dedupeAgentChatToolRunItems } from "./chat-items.mjs";
5
5
  import { AgentChatDeleteTurnResult, AgentChatEditUserMessageResult, AgentChatHitlResponseResult, AgentChatRegenerateResult, AgentChatSubmitResult, AgentChatTransport, AgentChatTransportRequest, UseAgentChatOptions, useAgentChat } from "./use-agent-chat.mjs";
6
- export { type ActiveChatToolPart, type AgentChatAction, type AgentChatDeleteTurnResult, type AgentChatEditUserMessageResult, type AgentChatHitlResponseResult, type AgentChatItem, type AgentChatMessage, type AgentChatPart, type AgentChatRegenerateResult, AgentChatSessionEvent, type AgentChatState, type AgentChatSubmitResult, type AgentChatTransport, type AgentChatTransportRequest, type AgentRunStatus, type ApplyAgentEventToChatMessagesOptions, type BuildAgentChatItemsInput, type BuildAgentChatMessagesInput, type ChatPartState, type ChatToolState, type CompletedChatToolPart, type DeleteChatTurnResult, type EditChatUserMessageResult, MessagesRegenerated, ProtocolMessageAppended, type RegenerateChatMessagesResult, type ToolDuration, type ToolRunState, type ToolRunTiming, TurnDeleted, type UseAgentChatOptions, UserMessageEdited, UserMessageSubmitted, appendProtocolMessage, applyAgentEventToChatMessages, buildAgentChatItems, buildAgentChatMessages, dedupeAgentChatToolRunItems, deleteChatTurn, editChatUserMessage, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, markChatError, reduceAgentChatState, regenerateChatMessagesFrom, toAgentMessages, useAgentChat };
6
+ export { type ActiveChatToolPart, type AgentChatAction, type AgentChatDeleteTurnResult, type AgentChatEditUserMessageResult, type AgentChatEventProjectionState, type AgentChatHitlResponseResult, type AgentChatItem, type AgentChatMessage, type AgentChatPart, type AgentChatRegenerateResult, AgentChatSessionEvent, type AgentChatState, type AgentChatSubmitResult, type AgentChatTransport, type AgentChatTransportRequest, type AgentRunStatus, type ApplyAgentEventToChatMessagesOptions, type BuildAgentChatItemsInput, type BuildAgentChatMessagesInput, type ChatPartState, type ChatToolState, type CompletedChatToolPart, type DeleteChatTurnResult, type EditChatUserMessageResult, MessagesRegenerated, ProtocolMessageAppended, type RegenerateChatMessagesResult, type ToolDuration, type ToolRunState, type ToolRunTiming, TurnDeleted, type UseAgentChatOptions, UserMessageEdited, UserMessageSubmitted, appendProtocolMessage, applyAgentEventToChatMessages, applyAgentEventToChatProjection, buildAgentChatItems, buildAgentChatMessages, dedupeAgentChatToolRunItems, deleteChatTurn, editChatUserMessage, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, makeAgentChatEventProjectionState, markChatError, reduceAgentChatState, regenerateChatMessagesFrom, toAgentMessages, useAgentChat };
@@ -1,6 +1,6 @@
1
1
  import { appendProtocolMessage, applyAgentEventToChatMessages, buildAgentChatMessages, deleteChatTurn, editChatUserMessage, markChatError, regenerateChatMessagesFrom, toAgentMessages } from "./chat-messages.mjs";
2
2
  import { AgentChatSessionEvent, MessagesRegenerated, ProtocolMessageAppended, TurnDeleted, UserMessageEdited, UserMessageSubmitted } from "./chat-session-events.mjs";
3
- import { getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, reduceAgentChatState } from "./chat-core.mjs";
3
+ import { applyAgentEventToChatProjection, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, makeAgentChatEventProjectionState, reduceAgentChatState } from "./chat-core.mjs";
4
4
  import { buildAgentChatItems, dedupeAgentChatToolRunItems } from "./chat-items.mjs";
5
5
  import { useAgentChat } from "./use-agent-chat.mjs";
6
- export { AgentChatSessionEvent, MessagesRegenerated, ProtocolMessageAppended, TurnDeleted, UserMessageEdited, UserMessageSubmitted, appendProtocolMessage, applyAgentEventToChatMessages, buildAgentChatItems, buildAgentChatMessages, dedupeAgentChatToolRunItems, deleteChatTurn, editChatUserMessage, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, markChatError, reduceAgentChatState, regenerateChatMessagesFrom, toAgentMessages, useAgentChat };
6
+ export { AgentChatSessionEvent, MessagesRegenerated, ProtocolMessageAppended, TurnDeleted, UserMessageEdited, UserMessageSubmitted, appendProtocolMessage, applyAgentEventToChatMessages, applyAgentEventToChatProjection, buildAgentChatItems, buildAgentChatMessages, dedupeAgentChatToolRunItems, deleteChatTurn, editChatUserMessage, getActiveChatToolParts, getAgentChatLiveActivityCount, getCompletedChatToolParts, hasAgentChatReasoningSummary, hasAgentMessageReasoning, initialAgentChatState, isActiveChatToolPart, isCompletedChatToolPart, makeAgentChatEventProjectionState, markChatError, reduceAgentChatState, regenerateChatMessagesFrom, toAgentMessages, useAgentChat };
@@ -27,6 +27,7 @@ declare const mergeSkillsets: (sources: ReadonlyArray<SkillsetSource>) => Effect
27
27
  readonly template: string;
28
28
  readonly source?: string | undefined;
29
29
  readonly description?: string | undefined;
30
+ readonly location?: string | undefined;
30
31
  readonly arguments?: readonly {
31
32
  readonly required: boolean;
32
33
  readonly name: string;
@@ -34,7 +35,6 @@ declare const mergeSkillsets: (sources: ReadonlyArray<SkillsetSource>) => Effect
34
35
  }[] | undefined;
35
36
  readonly access?: "read" | "write" | "destructive" | undefined;
36
37
  readonly fileRefs?: boolean | undefined;
37
- readonly location?: string | undefined;
38
38
  }[];
39
39
  }, SkillsetError, never>;
40
40
  //#endregion
@@ -3,8 +3,8 @@ import { Effect } from "effect";
3
3
 
4
4
  //#region src/skillset/name.d.ts
5
5
  declare const isValidSkillsetName: (name: string) => boolean;
6
- declare const validateSkillsetName: (name: string) => Effect.Effect<string, never, never> | Effect.Effect<never, SkillsetError, never>;
7
- declare const validateDirectoryName: (expected: string, actual: string) => Effect.Effect<string, never, never> | Effect.Effect<never, SkillsetError, never>;
6
+ declare const validateSkillsetName: (name: string) => Effect.Effect<never, SkillsetError, never> | Effect.Effect<string, never, never>;
7
+ declare const validateDirectoryName: (expected: string, actual: string) => Effect.Effect<never, SkillsetError, never> | Effect.Effect<string, never, never>;
8
8
  //#endregion
9
9
  export { isValidSkillsetName, validateDirectoryName, validateSkillsetName };
10
10
  //# sourceMappingURL=name.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"name.d.mts","names":[],"sources":["../../src/skillset/name.ts"],"mappings":";;;;cAMa,mBAAA,GAAuB,IAAY;AAAA,cAGnC,oBAAA,GAAwB,IAAA,aAAY,MAAA,CAAA,MAAA,yBAAA,MAAA,CAAA,MAAA,QAAA,aAAA;AAAA,cAUpC,qBAAA,GAAyB,QAAA,UAAkB,MAAA,aAAc,MAAA,CAAA,MAAA,yBAAA,MAAA,CAAA,MAAA,QAAA,aAAA"}
1
+ {"version":3,"file":"name.d.mts","names":[],"sources":["../../src/skillset/name.ts"],"mappings":";;;;cAMa,mBAAA,GAAuB,IAAY;AAAA,cAGnC,oBAAA,GAAwB,IAAA,aAAY,MAAA,CAAA,MAAA,QAAA,aAAA,WAAA,MAAA,CAAA,MAAA;AAAA,cAUpC,qBAAA,GAAyB,QAAA,UAAkB,MAAA,aAAc,MAAA,CAAA,MAAA,QAAA,aAAA,WAAA,MAAA,CAAA,MAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yolk-sdk/agent",
3
- "version": "0.1.0-canary.25",
3
+ "version": "0.1.0-canary.26",
4
4
  "description": "Protocol, loop, runtime, client, compaction, tools, React, providers, OAuth, skillset, and voice primitives for building Yolk agents.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -136,14 +136,16 @@ export class LLMStreamStart extends Schema.TaggedClass<LLMStreamStart>()('LLMStr
136
136
 
137
137
  export class LLMTextDelta extends Schema.TaggedClass<LLMTextDelta>()('LLMTextDelta', {
138
138
  ...EventIdentity,
139
- text: Schema.String
139
+ text: Schema.String,
140
+ textSoFar: Schema.optional(Schema.String)
140
141
  }) {}
141
142
 
142
143
  export class LLMReasoningDelta extends Schema.TaggedClass<LLMReasoningDelta>()(
143
144
  'LLMReasoningDelta',
144
145
  {
145
146
  ...EventIdentity,
146
- text: Schema.String
147
+ text: Schema.String,
148
+ reasoningSoFar: Schema.optional(Schema.String)
147
149
  }
148
150
  ) {}
149
151
 
@@ -40,6 +40,11 @@ export type AgentChatState = {
40
40
  readonly seenEventIds: ReadonlyArray<string>
41
41
  }
42
42
 
43
+ export type AgentChatEventProjectionState = {
44
+ readonly chatMessages: ReadonlyArray<AgentChatMessage>
45
+ readonly seenEventIds: ReadonlyArray<string>
46
+ }
47
+
43
48
  export const initialAgentChatState: AgentChatState = {
44
49
  status: 'idle',
45
50
  error: null,
@@ -50,17 +55,51 @@ export const initialAgentChatState: AgentChatState = {
50
55
  seenEventIds: []
51
56
  }
52
57
 
58
+ const hasSeenEventId = (seenEventIds: ReadonlyArray<string>, event: AgentEvent) =>
59
+ event.eventId !== undefined && seenEventIds.includes(event.eventId)
60
+
61
+ const rememberEventId = (seenEventIds: ReadonlyArray<string>, event: AgentEvent) =>
62
+ event.eventId === undefined ? seenEventIds : [...seenEventIds, event.eventId]
63
+
53
64
  const hasSeenEvent = (state: AgentChatState, event: AgentEvent) =>
54
- event.eventId !== undefined && state.seenEventIds.includes(event.eventId)
65
+ hasSeenEventId(state.seenEventIds, event)
55
66
 
56
67
  const rememberEvent = (state: AgentChatState, event: AgentEvent): AgentChatState =>
57
68
  event.eventId === undefined
58
69
  ? state
59
- : { ...state, seenEventIds: [...state.seenEventIds, event.eventId] }
70
+ : { ...state, seenEventIds: rememberEventId(state.seenEventIds, event) }
60
71
 
61
72
  const clearRetryInfo = (state: AgentChatState): AgentChatState =>
62
73
  state.retryInfo === null ? state : { ...state, retryInfo: null }
63
74
 
75
+ export const makeAgentChatEventProjectionState = (
76
+ chatMessages: ReadonlyArray<AgentChatMessage> = []
77
+ ): AgentChatEventProjectionState => ({
78
+ chatMessages,
79
+ seenEventIds: []
80
+ })
81
+
82
+ /**
83
+ * Applies replayable agent events to chat messages while deduping by `eventId`.
84
+ *
85
+ * Use this for durable streams that may reconnect, overlap, or replay events.
86
+ * For ephemeral local streams, `applyAgentEventToChatMessages` is still useful.
87
+ */
88
+ export const applyAgentEventToChatProjection = (
89
+ state: AgentChatEventProjectionState,
90
+ event: AgentEvent,
91
+ options: ApplyAgentEventToChatMessagesOptions = {}
92
+ ): AgentChatEventProjectionState => {
93
+ if (hasSeenEventId(state.seenEventIds, event)) {
94
+ return state
95
+ }
96
+
97
+ return {
98
+ chatMessages: applyAgentEventToChatMessages(state.chatMessages, event, options),
99
+ seenEventIds: rememberEventId(state.seenEventIds, event)
100
+ }
101
+ }
102
+
64
103
  export type AgentChatAction =
65
104
  | { readonly _tag: 'HydrateMessage'; readonly message: AgentMessage }
66
105
  | { readonly _tag: 'Submit'; readonly message: UserMessage }
@@ -590,9 +590,10 @@ const appendAssistantPart = (
590
590
 
591
591
  const appendAssistantTextDelta = (
592
592
  messages: ReadonlyArray<AgentChatMessage>,
593
- delta: string
593
+ input: { readonly delta: string; readonly textSoFar?: string }
594
594
  ): ReadonlyArray<AgentChatMessage> => {
595
595
  const index = targetAssistantIndex(messages)
596
+ const content = input.textSoFar ?? input.delta
596
597
 
597
598
  if (Option.isNone(index)) {
598
599
  const sequence = nextMessageSequence(messages)
@@ -600,7 +601,7 @@ const appendAssistantTextDelta = (
600
601
  return appendAssistantPart(messages, {
601
602
  _tag: 'Text',
602
603
  id: `message-${sequence}-assistant-text`,
603
- content: delta,
604
+ content,
604
605
  state: 'streaming'
605
606
  })
606
607
  }
@@ -612,7 +613,10 @@ const appendAssistantTextDelta = (
612
613
  parts: hasStreamingTextPart(message)
613
614
  ? message.parts.map(part =>
614
615
  part._tag === 'Text' && part.state === 'streaming'
615
- ? { ...part, content: appendTextToContent(part.content, delta) }
616
+ ? {
617
+ ...part,
618
+ content: input.textSoFar ?? appendTextToContent(part.content, input.delta)
619
+ }
616
620
  : part
617
621
  )
618
622
  : [
@@ -620,7 +624,7 @@ const appendAssistantTextDelta = (
620
624
  {
621
625
  _tag: 'Text',
622
626
  id: `message-${message.sequence}-assistant-text`,
623
- content: delta,
627
+ content,
624
628
  state: 'streaming'
625
629
  }
626
630
  ]
@@ -631,9 +635,10 @@ const appendAssistantTextDelta = (
631
635
 
632
636
  const appendAssistantReasoningDelta = (
633
637
  messages: ReadonlyArray<AgentChatMessage>,
634
- delta: string
638
+ input: { readonly delta: string; readonly reasoningSoFar?: string }
635
639
  ): ReadonlyArray<AgentChatMessage> => {
636
640
  const index = targetAssistantIndex(messages)
641
+ const text = input.reasoningSoFar ?? input.delta
637
642
 
638
643
  if (Option.isNone(index)) {
639
644
  const sequence = nextMessageSequence(messages)
@@ -641,7 +646,7 @@ const appendAssistantReasoningDelta = (
641
646
  return appendAssistantPart(messages, {
642
647
  _tag: 'Reasoning',
643
648
  id: `message-${sequence}-reasoning`,
644
- text: delta,
649
+ text,
645
650
  state: 'streaming'
646
651
  })
647
652
  }
@@ -653,7 +658,7 @@ const appendAssistantReasoningDelta = (
653
658
  parts: message.parts.some(part => part._tag === 'Reasoning' && part.state === 'streaming')
654
659
  ? message.parts.map(part =>
655
660
  part._tag === 'Reasoning' && part.state === 'streaming'
656
- ? { ...part, text: `${part.text}${delta}` }
661
+ ? { ...part, text: input.reasoningSoFar ?? `${part.text}${input.delta}` }
657
662
  : part
658
663
  )
659
664
  : [
@@ -661,7 +666,7 @@ const appendAssistantReasoningDelta = (
661
666
  {
662
667
  _tag: 'Reasoning',
663
668
  id: `message-${message.sequence}-reasoning`,
664
- text: delta,
669
+ text,
665
670
  state: 'streaming'
666
671
  }
667
672
  ]
@@ -994,6 +999,12 @@ export const markChatError = (
994
999
  }
995
1000
  ]
996
1001
 
1002
+ /**
1003
+ * Applies one event without tracking `eventId` replay state.
1004
+ *
1005
+ * Prefer `applyAgentEventToChatProjection` for durable streams that can replay
1006
+ * or overlap. Append-only text and reasoning deltas are not idempotent here.
1007
+ */
997
1008
  export const applyAgentEventToChatMessages = (
998
1009
  messages: ReadonlyArray<AgentChatMessage>,
999
1010
  event: AgentEvent,
@@ -1005,9 +1016,12 @@ export const applyAgentEventToChatMessages = (
1005
1016
  case 'AgentStart':
1006
1017
  return clearTransientParts(messages)
1007
1018
  case 'LLMTextDelta':
1008
- return appendAssistantTextDelta(messages, event.text)
1019
+ return appendAssistantTextDelta(messages, { delta: event.text, textSoFar: event.textSoFar })
1009
1020
  case 'LLMReasoningDelta':
1010
- return appendAssistantReasoningDelta(messages, event.text)
1021
+ return appendAssistantReasoningDelta(messages, {
1022
+ delta: event.text,
1023
+ reasoningSoFar: event.reasoningSoFar
1024
+ })
1011
1025
  case 'ToolInputEnd':
1012
1026
  return upsertToolCallPart(messages, event.call, { _tag: 'Called' })
1013
1027
  case 'AssistantMessage':
@@ -1,4 +1,5 @@
1
1
  export {
2
+ applyAgentEventToChatProjection,
2
3
  getActiveChatToolParts,
3
4
  getAgentChatLiveActivityCount,
4
5
  getCompletedChatToolParts,
@@ -7,11 +8,13 @@ export {
7
8
  initialAgentChatState,
8
9
  isActiveChatToolPart,
9
10
  isCompletedChatToolPart,
11
+ makeAgentChatEventProjectionState,
10
12
  reduceAgentChatState
11
13
  } from './chat-core.ts'
12
14
  export type {
13
15
  ActiveChatToolPart,
14
16
  AgentChatAction,
17
+ AgentChatEventProjectionState,
15
18
  AgentChatState,
16
19
  AgentRunStatus,
17
20
  CompletedChatToolPart