@yolk-sdk/agent 0.1.0-canary.24 → 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 +28 -1
- package/dist/protocol/event.d.mts +2 -0
- package/dist/protocol/event.d.mts.map +1 -1
- package/dist/protocol/event.mjs +4 -2
- package/dist/protocol/event.mjs.map +1 -1
- package/dist/react/chat-core.d.mts +13 -1
- package/dist/react/chat-core.d.mts.map +1 -1
- package/dist/react/chat-core.mjs +22 -3
- package/dist/react/chat-core.mjs.map +1 -1
- package/dist/react/chat-messages.d.mts +6 -0
- package/dist/react/chat-messages.d.mts.map +1 -1
- package/dist/react/chat-messages.mjs +24 -10
- package/dist/react/chat-messages.mjs.map +1 -1
- package/dist/react/index.d.mts +2 -2
- package/dist/react/index.mjs +2 -2
- package/dist/skillset/merge.d.mts +1 -1
- package/dist/skillset/name.d.mts +2 -2
- package/dist/skillset/name.d.mts.map +1 -1
- package/package.json +1 -1
- package/src/protocol/event.ts +4 -2
- package/src/react/chat-core.ts +41 -2
- package/src/react/chat-messages.ts +24 -10
- package/src/react/index.ts +3 -0
package/README.md
CHANGED
|
@@ -66,7 +66,11 @@ import {
|
|
|
66
66
|
makeQuestionToolModule,
|
|
67
67
|
resolveTools
|
|
68
68
|
} from '@yolk-sdk/agent/tools'
|
|
69
|
-
import {
|
|
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":";;;;;;cAsBa,cAAA,EAAc,MAAA,CAAA,QAAA;AAAA,KACf,cAAA,UAAwB,cAAA,CAAe,IAAI;AAAA,cAE1C,cAAA,EAAc,MAAA,CAAA,QAAA;AAAA,KAgBf,cAAA,UAAwB,cAAA,CAAe,IAAI;AAAA,cAE1C,mBAAA,EAAmB,MAAA,CAAA,QAAA;AAAA,KAWpB,mBAAA,UAA6B,mBAAA,CAAoB,IAAI;AAAA,cAAA,sBAAA;;;;;;;cAEpD,iBAAA,SAA0B,sBAMrC;AAAA,cAAG,eAAA;;;;cAEQ,UAAA,SAAmB,eAE9B;AAAA,cAAG,eAAA;;;;;;;;cAEQ,UAAA,SAAmB,eAM9B;AAAA,cAAG,aAAA;;;;;;;cAEQ,QAAA,SAAiB,aAK5B;AAAA,cAAG,uBAAA;;;;;;;;cAEQ,kBAAA,SAA2B,uBASvC;AAAA,cAAG,gBAAA;;;;;cAES,WAAA,SAAoB,gBAG/B;AAAA,cAAG,eAAA;;;;;;;;;cAEQ,UAAA,SAAmB,eAO9B;AAAA,cAAG,oBAAA;;;;;cAEQ,eAAA,SAAwB,oBAGnC;AAAA,cAAG,kBAAA;;;;;;;cAEQ,aAAA,SAAsB,kBAKjC;AAAA,cAAG,cAAA;;;;;cAEQ,SAAA,SAAkB,cAG7B;AAAA,cAAG,YAAA;;;;;;cAEQ,OAAA,SAAgB,YAI3B;AAAA,cAAG,mBAAA;;;;;cAEQ,cAAA,SAAuB,mBAGlC;AAAA,cAAG,iBAAA
|
|
1
|
+
{"version":3,"file":"event.d.mts","names":[],"sources":["../../src/protocol/event.ts"],"mappings":"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"}
|
package/dist/protocol/event.mjs
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/react/chat-core.mjs
CHANGED
|
@@ -11,15 +11,34 @@ const initialAgentChatState = {
|
|
|
11
11
|
sessionEvents: [],
|
|
12
12
|
seenEventIds: []
|
|
13
13
|
};
|
|
14
|
-
const
|
|
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:
|
|
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":";;;;KA8BY,aAAA;AAAA,KAEA,aAAA;EAAA,SACG,IAAA;AAAA;EAAA,SACA,IAAA;EAAA,SAAiC,KAAA;AAAA;EAAA,SACjC,IAAA;EAAA,SAAoC,OAAA,GAAU,mBAAA;AAAA;EAAA,SAC9C,IAAA;EAAA,SAAyB,MAAA;AAAA;EAAA,SACzB,IAAA;EAAA,SAAoC,OAAA,EAAS,eAAA;AAAA;EAAA,SAE7C,IAAA;EAAA,SACA,QAAA,EAAU,gBAAA;EAAA,SACV,OAAA,GAAU,eAAA;AAAA;EAAA,SAGV,IAAA;EAAA,SACA,QAAA,EAAU,gBAAA;EAAA,SACV,OAAA,GAAU,eAAA;AAAA;EAAA,SAEV,IAAA;EAAA,SAA0B,WAAA;AAAA;EAAA,SAE1B,IAAA;EAAA,SACA,MAAA,EAAQ,UAAA;EAAA,SACR,WAAA;EAAA,SACA,SAAA;AAAA;EAAA,SAGA,IAAA;EAAA,SACA,OAAA;EAAA,SACA,WAAA;EAAA,SACA,SAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SAAoC,MAAA,EAAQ,UAAA;AAAA;AAAA,KAE/C,aAAA;EAAA,SAEG,IAAA;EAAA,SACA,EAAA;EAAA,SACA,OAAA,EAAS,OAAA;EAAA,SACT,KAAA,EAAO,aAAA;AAAA;EAAA,SAGP,IAAA;EAAA,SACA,EAAA;EAAA,SACA,IAAA;EAAA,SACA,KAAA,EAAO,aAAA;AAAA;EAAA,SAGP,IAAA;EAAA,SACA,EAAA;EAAA,SACA,IAAA,EAAM,QAAA;EAAA,SACN,KAAA,EAAO,aAAA;AAAA;EAAA,SAGP,IAAA;EAAA,SACA,EAAA;EAAA,SACA,UAAA;EAAA,SACA,IAAA;EAAA,SACA,OAAA,EAAS,OAAA;EAAA,SACT,OAAA;EAAA,SACA,iBAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SAAwB,EAAA;EAAA,SAAqB,OAAA;AAAA;AAAA,KAEhD,gBAAA;EAAA,SACD,EAAA;EAAA,SACA,MAAA;EAAA,SACA,QAAA;EAAA,SACA,IAAA;EAAA,SACA,WAAA;EAAA,SACA,MAAA,GAAS,aAAA;EAAA,SACT,WAAA,GAAc,kBAAA;EAAA,SACd,KAAA,EAAO,aAAA,CAAc,aAAA;AAAA;AAAA,KAGpB,oBAAA;EAAA,SACG,IAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SACA,kBAAA;EAAA,SACA,iBAAA,EAAmB,aAAA;EAAA,SACnB,QAAA,EAAU,aAAA,CAAc,gBAAA;AAAA;AAAA,KAG3B,yBAAA;EAAA,SACG,IAAA;AAAA;EAAA,SACA,IAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SACA,SAAA;EAAA,SACA,QAAA,EAAU,aAAa,CAAC,gBAAA;AAAA;AAAA,KAG3B,4BAAA;EAAA,SACG,IAAA;AAAA;EAAA,SAEA,IAAA;EAAA,SACA,QAAA,EAAU,aAAa,CAAC,gBAAA;AAAA;AAAA,KAG3B,oCAAA;EAAA,SACD,KAAK;AAAA;AAAA,KAmCJ,2BAAA;EAAA,SACD,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,SAAA;EAAA,SACA,cAAA;EAAA,SACA,cAAA;EAAA,SACA,QAAA,EAAU,aAAA,CAAc,YAAA;EAAA,SACxB,KAAA;AAAA;AAAA,cAsSE,cAAA,GACX,QAAA,EAAU,aAAA,CAAc,gBAAA,GACxB,SAAA,aACC,oBAAA;AAAA,cAwBU,0BAAA,GACX,QAAA,EAAU,aAAA,CAAc,gBAAA,GACxB,SAAA,aACC,4BAAA;AAAA,cAmBU,mBAAA,GACX,QAAA,EAAU,aAAA,CAAc,gBAAA,GACxB,SAAA,UACA,OAAA,EAAS,OAAA,KACR,yBAAA;AAAA,
|
|
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,
|
|
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
|
|
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
|
|
272
|
+
content,
|
|
272
273
|
state: "streaming"
|
|
273
274
|
}]
|
|
274
275
|
} : message);
|
|
275
276
|
};
|
|
276
|
-
const appendAssistantReasoningDelta = (messages,
|
|
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
|
|
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
|
|
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,
|
|
488
|
-
|
|
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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"}
|
package/dist/react/index.d.mts
CHANGED
|
@@ -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 };
|
package/dist/react/index.mjs
CHANGED
|
@@ -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
|
package/dist/skillset/name.d.mts
CHANGED
|
@@ -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<
|
|
7
|
-
declare const validateDirectoryName: (expected: string, actual: string) => Effect.Effect<
|
|
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,
|
|
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.
|
|
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",
|
package/src/protocol/event.ts
CHANGED
|
@@ -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
|
|
package/src/react/chat-core.ts
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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
|
|
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
|
-
? {
|
|
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
|
|
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
|
|
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
|
|
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,
|
|
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':
|
package/src/react/index.ts
CHANGED
|
@@ -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
|