@meshagent/meshagent-agents 0.43.3 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## [0.44.0]
2
+ - TypeScript agent clients now support thread watch/unwatch, multiple thread storages, and richer start-thread payloads, including tool-choice metadata.
3
+ - Chat sessions now preserve event timestamps, reset replay state correctly, and handle more agent message types such as tool-call progress, secret requests, model changes, interrupts, and usage updates.
4
+ - Tailwind chat UI now tracks thread status, reasoning traces, shell output, file attachments, and improved file preview behavior for streamed agent content.
5
+
6
+ ## [0.43.4]
7
+ - TypeScript agent messages and events now carry `created_at`, parse it on input, and preserve it when streamed deltas are merged.
8
+ - Messaging chat clients now accept thread lifecycle events without a participant ID and carry room message timestamps into session events for more accurate live synchronization.
9
+ - Live chat test coverage expanded for thread creation, acknowledgements, steer/interrupt flows, and client tool request handling.
10
+ - The workspace app template was rebranded from the meeting app naming and its deploy tag was updated accordingly.
11
+
1
12
  ## [0.43.3]
2
13
  - Stability
3
14
 
@@ -19,6 +19,8 @@ export declare const agentParticipantDisconnectType = "meshagent.agent.participa
19
19
  export declare const agentThreadDeleteType = "meshagent.agent.thread.delete";
20
20
  export declare const agentThreadRenameType = "meshagent.agent.thread.rename";
21
21
  export declare const agentThreadListType = "meshagent.agent.thread.list";
22
+ export declare const agentThreadWatchType = "meshagent.agent.thread.watch";
23
+ export declare const agentThreadUnwatchType = "meshagent.agent.thread.unwatch";
22
24
  export declare const agentThreadListedType = "meshagent.agent.thread.listed";
23
25
  export declare const agentThreadCreatedType = "meshagent.agent.thread.created";
24
26
  export declare const agentThreadUpdatedType = "meshagent.agent.thread.updated";
@@ -239,7 +241,8 @@ export declare abstract class AgentMessage {
239
241
  readonly type: string;
240
242
  readonly messageId: string;
241
243
  readonly senderName?: string;
242
- protected constructor({ type, messageId, message_id, senderName, sender_name }: JsonMap);
244
+ readonly createdAt: string;
245
+ protected constructor({ type, messageId, message_id, senderName, sender_name, createdAt, created_at }: JsonMap);
243
246
  toJson(): JsonMap;
244
247
  static fromJson(json: JsonMap): AgentMessage;
245
248
  }
@@ -272,6 +275,8 @@ export declare const ParticipantDisconnect: MessageCtor;
272
275
  export declare const DeleteThread: MessageCtor;
273
276
  export declare const RenameThread: MessageCtor;
274
277
  export declare const ListThreads: MessageCtor;
278
+ export declare const WatchThreads: MessageCtor;
279
+ export declare const UnwatchThreads: MessageCtor;
275
280
  export declare const ThreadsListed: MessageCtor;
276
281
  export declare const ThreadCreated: MessageCtor;
277
282
  export declare const ThreadUpdated: MessageCtor;
@@ -1,9 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.agentToolCallStartedType = exports.agentToolCallInProgressType = exports.agentToolCallPendingType = exports.agentFileContentEndedType = exports.agentFileContentDeltaType = exports.agentFileContentStartedType = exports.agentTextContentEndedType = exports.agentTextContentDeltaType = exports.agentTextContentStartedType = exports.agentReasoningContentEndedType = exports.agentReasoningContentDeltaType = exports.agentReasoningContentStartedType = exports.agentTurnEndedType = exports.agentTurnStartedType = exports.agentTurnSteerRejectedType = exports.agentTurnSteeredType = exports.agentTurnSteerAcceptedType = exports.agentTurnInterruptedType = exports.agentTurnInterruptAcceptedType = exports.agentTurnStartRejectedType = exports.agentTurnStartAcceptedType = exports.agentThreadClearedType = exports.agentModelChangedType = exports.agentModelChangeType = exports.agentModelsResponseType = exports.agentModelsRequestType = exports.agentCapabilitiesResponseType = exports.agentCapabilitiesRequestType = exports.agentThreadDeletedType = exports.agentThreadUpdatedType = exports.agentThreadCreatedType = exports.agentThreadListedType = exports.agentThreadListType = exports.agentThreadRenameType = exports.agentThreadDeleteType = exports.agentParticipantDisconnectType = exports.agentParticipantConnectType = exports.agentThreadCloseType = exports.agentThreadOpenType = exports.agentThreadStartRejectedType = exports.agentThreadLoadedType = exports.agentThreadStartedType = exports.agentThreadStartType = exports.agentRealtimeAudioCommitType = exports.agentRealtimeAudioChunkType = exports.agentThreadClearType = exports.agentTurnInterruptType = exports.agentTurnSteerType = exports.agentTurnStartType = exports.agentRoomMessageType = void 0;
4
- exports.StartThread = exports.AgentLLMMessage = exports.AgentThreadMessage = exports.AgentMessage = exports.AgentContextWindowUsage = exports.AgentGeneratedAudio = exports.AgentGeneratedImage = exports.AgentToolCallLogLine = exports.AgentRealtimeConnectionInfo = exports.AgentThreadListEntry = exports.AgentProviderInfo = exports.AgentModelInfo = exports.ToolkitCapabilities = exports.ToolkitToolCapabilities = exports.AgentError = exports.AgentAudioFormat = exports.TurnToolkitConfig = exports.ClientToolkitDescription = exports.TurnMcpConfig = exports.ToolChoice = exports.agentClientToolCallResponseType = exports.agentSecretResponseType = exports.agentToolRejectType = exports.agentToolApproveType = exports.agentUsageUpdatedType = exports.agentContextCompactedType = exports.agentAudioInputSpeechEndedType = exports.agentAudioInputSpeechStartedType = exports.agentAudioTranscriptionFailedType = exports.agentAudioTranscriptionCompletedType = exports.agentAudioTranscriptionDeltaType = exports.agentAudioTranscriptionStartedType = exports.agentAudioGenerationFailedType = exports.agentAudioGenerationCompletedType = exports.agentAudioGenerationDeltaType = exports.agentAudioGenerationStartedType = exports.agentImageGenerationFailedType = exports.agentImageGenerationCompletedType = exports.agentImageGenerationPartialType = exports.agentImageGenerationStartedType = exports.agentThreadEventType = exports.agentConnectionStatusType = exports.agentThreadStatusType = exports.agentSecretRequestedType = exports.agentClientToolCallCancelledType = exports.agentClientToolCallRequestedType = exports.agentToolCallApprovalRequestedType = exports.agentToolCallEndedType = exports.agentToolCallLogDeltaType = exports.agentToolCallArgumentsDeltaType = void 0;
5
- exports.AgentToolCallLogDelta = exports.AgentToolCallArgumentsDelta = exports.AgentToolCallStarted = exports.AgentToolCallInProgress = exports.AgentToolCallPending = exports.AgentFileContentEnded = exports.AgentFileContentDelta = exports.AgentFileContentStarted = exports.AgentTextContentEnded = exports.AgentTextContentDelta = exports.AgentTextContentStarted = exports.AgentReasoningContentEnded = exports.AgentReasoningContentDelta = exports.AgentReasoningContentStarted = exports.ThreadStartRejected = exports.ThreadLoaded = exports.ThreadStarted = exports.TurnEnded = exports.TurnStarted = exports.TurnSteerRejected = exports.TurnSteered = exports.TurnSteerAccepted = exports.TurnInterrupted = exports.TurnInterruptAccepted = exports.TurnStartRejected = exports.TurnStartAccepted = exports.ThreadCleared = exports.AgentModelChanged = exports.ChangeModel = exports.ModelsResponse = exports.ModelsRequest = exports.CapabilitiesResponse = exports.CapabilitiesRequest = exports.ThreadDeleted = exports.ThreadUpdated = exports.ThreadCreated = exports.ThreadsListed = exports.ListThreads = exports.RenameThread = exports.DeleteThread = exports.ParticipantDisconnect = exports.ParticipantConnect = exports.CloseThread = exports.OpenThread = exports.ClearThread = exports.AgentRealtimeAudioCommit = exports.AgentRealtimeAudioChunk = exports.TurnInterrupt = exports.TurnSteer = exports.TurnStart = void 0;
6
- exports.AgentClientToolCallResponse = exports.AgentSecretResponse = exports.RejectAgentToolCall = exports.ApproveAgentToolCall = exports.AgentUsageUpdated = exports.AgentContextCompacted = exports.AgentAudioInputSpeechEnded = exports.AgentAudioInputSpeechStarted = exports.AgentAudioTranscriptionFailed = exports.AgentAudioTranscriptionCompleted = exports.AgentAudioTranscriptionDelta = exports.AgentAudioTranscriptionStarted = exports.AgentAudioGenerationFailed = exports.AgentAudioGenerationCompleted = exports.AgentAudioGenerationDelta = exports.AgentAudioGenerationStarted = exports.AgentImageGenerationFailed = exports.AgentImageGenerationCompleted = exports.AgentImageGenerationPartial = exports.AgentImageGenerationStarted = exports.AgentThreadEvent = exports.AgentConnectionStatus = exports.AgentThreadStatus = exports.AgentClientToolCallCancelled = exports.AgentClientToolCallRequested = exports.AgentSecretRequested = exports.AgentToolCallApprovalRequested = exports.AgentToolCallEnded = void 0;
3
+ exports.agentToolCallPendingType = exports.agentFileContentEndedType = exports.agentFileContentDeltaType = exports.agentFileContentStartedType = exports.agentTextContentEndedType = exports.agentTextContentDeltaType = exports.agentTextContentStartedType = exports.agentReasoningContentEndedType = exports.agentReasoningContentDeltaType = exports.agentReasoningContentStartedType = exports.agentTurnEndedType = exports.agentTurnStartedType = exports.agentTurnSteerRejectedType = exports.agentTurnSteeredType = exports.agentTurnSteerAcceptedType = exports.agentTurnInterruptedType = exports.agentTurnInterruptAcceptedType = exports.agentTurnStartRejectedType = exports.agentTurnStartAcceptedType = exports.agentThreadClearedType = exports.agentModelChangedType = exports.agentModelChangeType = exports.agentModelsResponseType = exports.agentModelsRequestType = exports.agentCapabilitiesResponseType = exports.agentCapabilitiesRequestType = exports.agentThreadDeletedType = exports.agentThreadUpdatedType = exports.agentThreadCreatedType = exports.agentThreadListedType = exports.agentThreadUnwatchType = exports.agentThreadWatchType = exports.agentThreadListType = exports.agentThreadRenameType = exports.agentThreadDeleteType = exports.agentParticipantDisconnectType = exports.agentParticipantConnectType = exports.agentThreadCloseType = exports.agentThreadOpenType = exports.agentThreadStartRejectedType = exports.agentThreadLoadedType = exports.agentThreadStartedType = exports.agentThreadStartType = exports.agentRealtimeAudioCommitType = exports.agentRealtimeAudioChunkType = exports.agentThreadClearType = exports.agentTurnInterruptType = exports.agentTurnSteerType = exports.agentTurnStartType = exports.agentRoomMessageType = void 0;
4
+ exports.AgentThreadMessage = exports.AgentMessage = exports.AgentContextWindowUsage = exports.AgentGeneratedAudio = exports.AgentGeneratedImage = exports.AgentToolCallLogLine = exports.AgentRealtimeConnectionInfo = exports.AgentThreadListEntry = exports.AgentProviderInfo = exports.AgentModelInfo = exports.ToolkitCapabilities = exports.ToolkitToolCapabilities = exports.AgentError = exports.AgentAudioFormat = exports.TurnToolkitConfig = exports.ClientToolkitDescription = exports.TurnMcpConfig = exports.ToolChoice = exports.agentClientToolCallResponseType = exports.agentSecretResponseType = exports.agentToolRejectType = exports.agentToolApproveType = exports.agentUsageUpdatedType = exports.agentContextCompactedType = exports.agentAudioInputSpeechEndedType = exports.agentAudioInputSpeechStartedType = exports.agentAudioTranscriptionFailedType = exports.agentAudioTranscriptionCompletedType = exports.agentAudioTranscriptionDeltaType = exports.agentAudioTranscriptionStartedType = exports.agentAudioGenerationFailedType = exports.agentAudioGenerationCompletedType = exports.agentAudioGenerationDeltaType = exports.agentAudioGenerationStartedType = exports.agentImageGenerationFailedType = exports.agentImageGenerationCompletedType = exports.agentImageGenerationPartialType = exports.agentImageGenerationStartedType = exports.agentThreadEventType = exports.agentConnectionStatusType = exports.agentThreadStatusType = exports.agentSecretRequestedType = exports.agentClientToolCallCancelledType = exports.agentClientToolCallRequestedType = exports.agentToolCallApprovalRequestedType = exports.agentToolCallEndedType = exports.agentToolCallLogDeltaType = exports.agentToolCallArgumentsDeltaType = exports.agentToolCallStartedType = exports.agentToolCallInProgressType = void 0;
5
+ exports.AgentToolCallPending = exports.AgentFileContentEnded = exports.AgentFileContentDelta = exports.AgentFileContentStarted = exports.AgentTextContentEnded = exports.AgentTextContentDelta = exports.AgentTextContentStarted = exports.AgentReasoningContentEnded = exports.AgentReasoningContentDelta = exports.AgentReasoningContentStarted = exports.ThreadStartRejected = exports.ThreadLoaded = exports.ThreadStarted = exports.TurnEnded = exports.TurnStarted = exports.TurnSteerRejected = exports.TurnSteered = exports.TurnSteerAccepted = exports.TurnInterrupted = exports.TurnInterruptAccepted = exports.TurnStartRejected = exports.TurnStartAccepted = exports.ThreadCleared = exports.AgentModelChanged = exports.ChangeModel = exports.ModelsResponse = exports.ModelsRequest = exports.CapabilitiesResponse = exports.CapabilitiesRequest = exports.ThreadDeleted = exports.ThreadUpdated = exports.ThreadCreated = exports.ThreadsListed = exports.UnwatchThreads = exports.WatchThreads = exports.ListThreads = exports.RenameThread = exports.DeleteThread = exports.ParticipantDisconnect = exports.ParticipantConnect = exports.CloseThread = exports.OpenThread = exports.ClearThread = exports.AgentRealtimeAudioCommit = exports.AgentRealtimeAudioChunk = exports.TurnInterrupt = exports.TurnSteer = exports.TurnStart = exports.StartThread = exports.AgentLLMMessage = void 0;
6
+ exports.AgentClientToolCallResponse = exports.AgentSecretResponse = exports.RejectAgentToolCall = exports.ApproveAgentToolCall = exports.AgentUsageUpdated = exports.AgentContextCompacted = exports.AgentAudioInputSpeechEnded = exports.AgentAudioInputSpeechStarted = exports.AgentAudioTranscriptionFailed = exports.AgentAudioTranscriptionCompleted = exports.AgentAudioTranscriptionDelta = exports.AgentAudioTranscriptionStarted = exports.AgentAudioGenerationFailed = exports.AgentAudioGenerationCompleted = exports.AgentAudioGenerationDelta = exports.AgentAudioGenerationStarted = exports.AgentImageGenerationFailed = exports.AgentImageGenerationCompleted = exports.AgentImageGenerationPartial = exports.AgentImageGenerationStarted = exports.AgentThreadEvent = exports.AgentConnectionStatus = exports.AgentThreadStatus = exports.AgentClientToolCallCancelled = exports.AgentClientToolCallRequested = exports.AgentSecretRequested = exports.AgentToolCallApprovalRequested = exports.AgentToolCallEnded = exports.AgentToolCallLogDelta = exports.AgentToolCallArgumentsDelta = exports.AgentToolCallStarted = exports.AgentToolCallInProgress = void 0;
7
7
  exports.agentInputContent = agentInputContent;
8
8
  const meshagent_1 = require("@meshagent/meshagent");
9
9
  const uuid_1 = require("uuid");
@@ -25,6 +25,8 @@ exports.agentParticipantDisconnectType = "meshagent.agent.participant.disconnect
25
25
  exports.agentThreadDeleteType = "meshagent.agent.thread.delete";
26
26
  exports.agentThreadRenameType = "meshagent.agent.thread.rename";
27
27
  exports.agentThreadListType = "meshagent.agent.thread.list";
28
+ exports.agentThreadWatchType = "meshagent.agent.thread.watch";
29
+ exports.agentThreadUnwatchType = "meshagent.agent.thread.unwatch";
28
30
  exports.agentThreadListedType = "meshagent.agent.thread.listed";
29
31
  exports.agentThreadCreatedType = "meshagent.agent.thread.created";
30
32
  exports.agentThreadUpdatedType = "meshagent.agent.thread.updated";
@@ -654,16 +656,18 @@ function omitUndefined(value) {
654
656
  return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
655
657
  }
656
658
  class AgentMessage {
657
- constructor({ type, messageId, message_id, senderName, sender_name }) {
659
+ constructor({ type, messageId, message_id, senderName, sender_name, createdAt, created_at }) {
658
660
  this.type = String(type);
659
661
  const resolvedMessageId = stringOrNull(messageId ?? message_id)?.trim();
660
662
  this.messageId = resolvedMessageId == null || resolvedMessageId.length === 0 ? (0, uuid_1.v4)() : resolvedMessageId;
661
663
  this.senderName = stringOrNull(senderName ?? sender_name);
664
+ this.createdAt = stringOrNull(createdAt ?? created_at) ?? new Date().toISOString();
662
665
  }
663
666
  toJson() {
664
667
  return {
665
668
  type: this.type,
666
669
  message_id: this.messageId,
670
+ created_at: this.createdAt,
667
671
  ...(this.senderName != null ? { sender_name: this.senderName } : {}),
668
672
  };
669
673
  }
@@ -730,6 +734,7 @@ function makeMessageClass({ type, base = "message", fields = [], }) {
730
734
  const params = {
731
735
  messageId: stringOrNull(json.message_id),
732
736
  senderName: stringOrNull(json.sender_name),
737
+ createdAt: stringOrNull(json.created_at),
733
738
  };
734
739
  if (base !== "message") {
735
740
  params.threadId = requiredString(json, "thread_id");
@@ -940,6 +945,8 @@ exports.ParticipantDisconnect = makeMessageClass({ type: exports.agentParticipan
940
945
  exports.DeleteThread = makeMessageClass({ type: exports.agentThreadDeleteType, base: "thread" });
941
946
  exports.RenameThread = makeMessageClass({ type: exports.agentThreadRenameType, base: "thread", fields: [s("name", "name", true)] });
942
947
  exports.ListThreads = makeMessageClass({ type: exports.agentThreadListType, fields: [{ prop: "limit", json: "limit", from: (value) => intOrNull(value) ?? 200, default: () => 200, always: true }, { prop: "offset", json: "offset", from: (value) => intOrNull(value) ?? 0, default: () => 0, always: true }] });
948
+ exports.WatchThreads = makeMessageClass({ type: exports.agentThreadWatchType });
949
+ exports.UnwatchThreads = makeMessageClass({ type: exports.agentThreadUnwatchType });
943
950
  exports.ThreadsListed = makeMessageClass({ type: exports.agentThreadListedType, fields: [s("sourceMessageId", "source_message_id", true), objList("threads", "threads", AgentThreadListEntry.fromJson, true), i("total"), i("offset"), i("limit")] });
944
951
  exports.ThreadCreated = makeMessageClass({ type: exports.agentThreadCreatedType, fields: [obj("thread", "thread", AgentThreadListEntry.fromJson, true)] });
945
952
  exports.ThreadUpdated = makeMessageClass({ type: exports.agentThreadUpdatedType, fields: [obj("thread", "thread", AgentThreadListEntry.fromJson, true)] });
@@ -1,13 +1,15 @@
1
1
  import { RemoteParticipant } from "@meshagent/meshagent";
2
2
  import type { RoomClient, Content } from "@meshagent/meshagent";
3
- import { AgentMessage, AgentModelChanged, AgentThreadStatus, ModelsResponse, AgentConnectionStatus } from "./agent-messages.js";
3
+ import { AgentMessage, AgentModelChanged, AgentThreadStatus, ModelsResponse, ToolChoice, AgentConnectionStatus } from "./agent-messages.js";
4
4
  import type { AgentPayload, JsonMap, ClientToolkitDescription } from "./agent-messages.js";
5
5
  import { ChangeEmitter } from "./change-emitter.js";
6
6
  export declare class AgentMessageEvent {
7
7
  readonly message: AgentMessage;
8
+ readonly createdAt: Date;
8
9
  readonly attachment?: Uint8Array;
9
- constructor({ message, attachment }: {
10
+ constructor({ message, createdAt, attachment }: {
10
11
  message: AgentMessage;
12
+ createdAt?: Date;
11
13
  attachment?: Uint8Array;
12
14
  });
13
15
  get payload(): AgentPayload;
@@ -96,7 +98,7 @@ export declare abstract class BaseChatClient extends ChangeEmitter {
96
98
  drainPendingEvents?: boolean;
97
99
  }): ChatThreadSession;
98
100
  private openSession;
99
- startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, omitContent, }: {
101
+ startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, toolChoice, omitContent, }: {
100
102
  messageId?: string;
101
103
  message: string;
102
104
  attachments: string[];
@@ -109,14 +111,17 @@ export declare abstract class BaseChatClient extends ChangeEmitter {
109
111
  realtimeProtocol?: string;
110
112
  senderName?: string;
111
113
  clientToolkits?: ClientToolkitDescription[];
114
+ toolChoice?: ToolChoice;
112
115
  omitContent?: boolean;
113
116
  }): Promise<ChatThreadStartResult>;
117
+ private resolvedStartThreadMessage;
114
118
  abstract sendAgentMessage(message: AgentMessage, options?: {
115
119
  attachment?: Uint8Array;
116
120
  ignoreOffline?: boolean;
117
121
  }): Promise<void>;
118
122
  private drainPendingSessionEvents;
119
- handleAgentMessage(message: AgentMessage, { attachment }?: {
123
+ handleAgentMessage(message: AgentMessage, { createdAt, attachment }?: {
124
+ createdAt?: Date;
120
125
  attachment?: Uint8Array;
121
126
  }): void;
122
127
  emitConnectionStatus({ status, message, reason, retryDelay, }: {
@@ -186,6 +191,7 @@ export declare class ChatThreadSession extends ChangeEmitter {
186
191
  load?: boolean;
187
192
  sinceTurn?: string;
188
193
  }): Promise<void>;
194
+ private resetReplayState;
189
195
  close(): Promise<void>;
190
196
  requestModels({ ignoreOffline }?: {
191
197
  ignoreOffline?: boolean;
@@ -202,7 +208,7 @@ export declare class ChatThreadSession extends ChangeEmitter {
202
208
  requestId: string;
203
209
  response: Content;
204
210
  }): Promise<void>;
205
- sendText({ messageId, text, attachments, steer, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, }: {
211
+ sendText({ messageId, text, attachments, steer, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, toolChoice, }: {
206
212
  messageId?: string;
207
213
  text: string;
208
214
  attachments: string[];
@@ -215,6 +221,7 @@ export declare class ChatThreadSession extends ChangeEmitter {
215
221
  outputModalities?: string[];
216
222
  senderName?: string;
217
223
  clientToolkits?: ClientToolkitDescription[];
224
+ toolChoice?: ToolChoice;
218
225
  }): Promise<string>;
219
226
  sendRealtimeAudioChunk({ chunk, format }: {
220
227
  chunk: Uint8Array;
@@ -6,12 +6,13 @@ const uuid_1 = require("uuid");
6
6
  const agent_messages_js_1 = require("./agent-messages.js");
7
7
  const change_emitter_js_1 = require("./change-emitter.js");
8
8
  class AgentMessageEvent {
9
- constructor({ message, attachment }) {
9
+ constructor({ message, createdAt, attachment }) {
10
10
  this.message = message;
11
+ this.createdAt = createdAt ?? dateOrNull(message.createdAt) ?? new Date();
11
12
  this.attachment = attachment;
12
13
  }
13
14
  get payload() {
14
- return this.message.toJson();
15
+ return { ...this.message.toJson(), created_at: this.createdAt.toISOString() };
15
16
  }
16
17
  }
17
18
  exports.AgentMessageEvent = AgentMessageEvent;
@@ -203,7 +204,7 @@ class BaseChatClient extends change_emitter_js_1.ChangeEmitter {
203
204
  this.notifyListeners();
204
205
  });
205
206
  }
206
- async startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, omitContent = false, }) {
207
+ async startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, toolChoice, omitContent = false, }) {
207
208
  const resolvedMessageId = messageId == null || messageId.trim() === "" ? (0, uuid_1.v4)() : messageId.trim();
208
209
  const resolvedSenderName = this.cleanParticipantName(senderName) ?? this.localParticipantName();
209
210
  const payload = new agent_messages_js_1.StartThread({
@@ -218,6 +219,7 @@ class BaseChatClient extends change_emitter_js_1.ChangeEmitter {
218
219
  realtimeProtocol: nonEmptyTrimmed(realtimeProtocol),
219
220
  senderName: resolvedSenderName,
220
221
  clientToolkits: clientToolkits != null && clientToolkits.length > 0 ? clientToolkits : undefined,
222
+ toolChoice: toolChoice?.toJson(),
221
223
  });
222
224
  const completer = new meshagent_1.Completer();
223
225
  this.pendingStartRequests.set(resolvedMessageId, completer);
@@ -232,7 +234,10 @@ class BaseChatClient extends change_emitter_js_1.ChangeEmitter {
232
234
  }
233
235
  const session = this.openThread(threadPath, { load: false, drainPendingEvents: false });
234
236
  if (!omitContent) {
235
- session.addAgentMessage(new AgentMessageEvent({ message: payload }));
237
+ session.addAgentMessage(new AgentMessageEvent({
238
+ message: this.resolvedStartThreadMessage({ payload, threadPath }),
239
+ createdAt: dateOrNull(payload.createdAt) ?? undefined,
240
+ }));
236
241
  }
237
242
  this.drainPendingSessionEvents(threadPath, session);
238
243
  return new ChatThreadStartResult({
@@ -247,6 +252,23 @@ class BaseChatClient extends change_emitter_js_1.ChangeEmitter {
247
252
  this.pendingStartRequests.delete(resolvedMessageId);
248
253
  }
249
254
  }
255
+ resolvedStartThreadMessage({ payload, threadPath, }) {
256
+ return new agent_messages_js_1.TurnStart({
257
+ threadId: threadPath,
258
+ messageId: payload.messageId,
259
+ senderName: payload.senderName,
260
+ content: payload.content,
261
+ backend: payload.backend,
262
+ provider: payload.provider,
263
+ model: payload.model,
264
+ voice: payload.voice,
265
+ outputModalities: payload.outputModalities,
266
+ instructions: payload.instructions,
267
+ mcp: payload.mcp,
268
+ clientToolkits: payload.clientToolkits,
269
+ toolkits: payload.toolkits,
270
+ });
271
+ }
250
272
  drainPendingSessionEvents(threadPath, session) {
251
273
  const pendingEvents = this.pendingSessionEventsByPath.get(threadPath);
252
274
  if (pendingEvents == null) {
@@ -257,16 +279,16 @@ class BaseChatClient extends change_emitter_js_1.ChangeEmitter {
257
279
  session.addAgentMessage(event);
258
280
  }
259
281
  }
260
- handleAgentMessage(message, { attachment } = {}) {
282
+ handleAgentMessage(message, { createdAt, attachment } = {}) {
261
283
  if (message.type === agent_messages_js_1.agentConnectionStatusType) {
262
284
  this._connectionStatus = message;
263
285
  for (const session of this.sessionsByPath.values()) {
264
286
  if (session.isOpen) {
265
- session.addAgentMessage(new AgentMessageEvent({ message, attachment }));
287
+ session.addAgentMessage(new AgentMessageEvent({ message, createdAt, attachment }));
266
288
  }
267
289
  }
268
290
  }
269
- this.eventQueue.add(new AgentMessageEvent({ message, attachment }));
291
+ this.eventQueue.add(new AgentMessageEvent({ message, createdAt, attachment }));
270
292
  const sourceMessageId = sourceMessageIdFor(message);
271
293
  if ((message.type === agent_messages_js_1.agentThreadStartedType || message.type === agent_messages_js_1.agentThreadStartRejectedType) &&
272
294
  sourceMessageId != null &&
@@ -281,7 +303,7 @@ class BaseChatClient extends change_emitter_js_1.ChangeEmitter {
281
303
  this.notifyListeners();
282
304
  return;
283
305
  }
284
- const event = new AgentMessageEvent({ message, attachment });
306
+ const event = new AgentMessageEvent({ message, createdAt, attachment });
285
307
  const session = this.sessionsByPath.get(threadPath);
286
308
  if (session != null) {
287
309
  session.addAgentMessage(event);
@@ -344,10 +366,15 @@ class MessagingChatClient extends BaseChatClient {
344
366
  return;
345
367
  }
346
368
  const participant = this.agentParticipant();
347
- if (participant == null || roomMessage.fromParticipantId !== participant.id) {
369
+ const fromSelectedAgent = participant != null && roomMessage.fromParticipantId === participant.id;
370
+ const fromParticipantlessThreadList = roomMessage.fromParticipantId == null && isThreadListMessage(roomMessage.message);
371
+ if (!fromSelectedAgent && !fromParticipantlessThreadList) {
348
372
  return;
349
373
  }
350
- this.handleAgentMessage(agent_messages_js_1.AgentMessage.fromJson(roomMessage.message), { attachment: roomMessage.attachment });
374
+ this.handleAgentMessage(agent_messages_js_1.AgentMessage.fromJson(roomMessage.message), {
375
+ createdAt: dateOrNull(roomMessage.message.created_at),
376
+ attachment: roomMessage.attachment,
377
+ });
351
378
  };
352
379
  this.room = room;
353
380
  this.agentName = agentName;
@@ -416,6 +443,12 @@ class MessagingChatClient extends BaseChatClient {
416
443
  }
417
444
  }
418
445
  exports.MessagingChatClient = MessagingChatClient;
446
+ function isThreadListMessage(message) {
447
+ return message.type === agent_messages_js_1.agentThreadListedType
448
+ || message.type === agent_messages_js_1.agentThreadCreatedType
449
+ || message.type === agent_messages_js_1.agentThreadUpdatedType
450
+ || message.type === agent_messages_js_1.agentThreadDeletedType;
451
+ }
419
452
  class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
420
453
  constructor({ client, threadPath }) {
421
454
  super();
@@ -463,6 +496,9 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
463
496
  async open({ load = true, sinceTurn } = {}) {
464
497
  if (this.openState) {
465
498
  if (load) {
499
+ if (sinceTurn == null) {
500
+ this.resetReplayState();
501
+ }
466
502
  const openThread = new agent_messages_js_1.OpenThread({ threadId: this.threadPath, load: true, sinceTurn });
467
503
  this.setLoadState(this.loadingStateForOpen(openThread, sinceTurn));
468
504
  try {
@@ -493,6 +529,17 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
493
529
  throw error;
494
530
  }
495
531
  }
532
+ resetReplayState() {
533
+ this._messages.length = 0;
534
+ this.messageIndexes.clear();
535
+ this.localAgentMessageIds.clear();
536
+ this.pendingLocalInputMessageIds.clear();
537
+ this.mergedDeltaMessageIds.clear();
538
+ this.pendingInputsById.clear();
539
+ this.lastCompletedTurnIdValue = undefined;
540
+ this.lastAgentMessageType = undefined;
541
+ this.lastAgentMessageAt = undefined;
542
+ }
496
543
  async close() {
497
544
  if (!this.openState) {
498
545
  return;
@@ -524,7 +571,7 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
524
571
  response,
525
572
  }));
526
573
  }
527
- async sendText({ messageId, text, attachments, steer = false, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, }) {
574
+ async sendText({ messageId, text, attachments, steer = false, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, toolChoice, }) {
528
575
  const resolvedMessageId = messageId == null || messageId.trim() === "" ? (0, uuid_1.v4)() : messageId.trim();
529
576
  const currentModel = this.currentModelValue;
530
577
  const resolvedBackend = nonEmptyTrimmed(backend) ?? currentModel?.backend;
@@ -553,6 +600,7 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
553
600
  voice: resolvedVoice,
554
601
  outputModalities: resolvedOutputModalities,
555
602
  clientToolkits: clientToolkits != null && clientToolkits.length > 0 ? clientToolkits : undefined,
603
+ toolChoice: toolChoice?.toJson(),
556
604
  });
557
605
  this.localAgentMessageIds.add(resolvedMessageId);
558
606
  this.pendingLocalInputMessageIds.add(resolvedMessageId);
@@ -602,9 +650,9 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
602
650
  const message = event.message;
603
651
  const type = message.type;
604
652
  this.lastAgentMessageType = type;
605
- this.lastAgentMessageAt = new Date();
653
+ this.lastAgentMessageAt = event.createdAt;
606
654
  this.updateSessionState(message);
607
- this.updatePendingInputsForMessage(message);
655
+ this.updatePendingInputsForMessage(message, event.createdAt);
608
656
  this.appendRenderableMessage(event);
609
657
  this.notifyListeners();
610
658
  }
@@ -670,7 +718,7 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
670
718
  }), { notify: false });
671
719
  }
672
720
  }
673
- updatePendingInputsForMessage(message) {
721
+ updatePendingInputsForMessage(message, createdAt) {
674
722
  const type = message.type;
675
723
  const messageId = message.messageId;
676
724
  const sourceMessageId = sourceMessageIdFor(message);
@@ -684,7 +732,7 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
684
732
  messageType: type,
685
733
  threadPath: this.threadPath,
686
734
  payload: message,
687
- createdAt: new Date(),
735
+ createdAt,
688
736
  awaitingAcceptance: true,
689
737
  awaitingApplication: true,
690
738
  }));
@@ -723,6 +771,31 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
723
771
  }
724
772
  return;
725
773
  }
774
+ if (message.type === agent_messages_js_1.agentToolCallEndedType) {
775
+ const itemId = normalizedString(message.itemId);
776
+ if (itemId != null) {
777
+ this.upsertItemMessage(`tool_call:${itemId}`, event);
778
+ }
779
+ else if (message.error != null) {
780
+ this.appendMessage(event);
781
+ }
782
+ return;
783
+ }
784
+ if (message.type === agent_messages_js_1.agentToolCallPendingType || message.type === agent_messages_js_1.agentToolCallInProgressType || message.type === agent_messages_js_1.agentToolCallStartedType) {
785
+ const itemId = normalizedString(message.itemId);
786
+ if (itemId != null) {
787
+ this.upsertItemMessage(`tool_call:${itemId}`, event);
788
+ }
789
+ return;
790
+ }
791
+ if (message.type === agent_messages_js_1.agentSecretRequestedType) {
792
+ this.appendMessage(event);
793
+ return;
794
+ }
795
+ if (message.type === agent_messages_js_1.agentModelChangedType) {
796
+ this.appendMessage(event);
797
+ return;
798
+ }
726
799
  if (message.type === agent_messages_js_1.agentThreadStartType || message.type === agent_messages_js_1.agentTurnStartType || message.type === agent_messages_js_1.agentTurnSteerType) {
727
800
  if (agentInputText(message.content).trim() !== "") {
728
801
  this.appendMessage(event);
@@ -738,6 +811,18 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
738
811
  if (agentInputText(message.content).trim() !== "") {
739
812
  this.appendMessage(event, { beforePendingLocalInputs: true });
740
813
  }
814
+ else {
815
+ this.appendMessage(event);
816
+ }
817
+ return;
818
+ }
819
+ if (message.type === agent_messages_js_1.agentTurnStartedType ||
820
+ message.type === agent_messages_js_1.agentTurnSteeredType ||
821
+ message.type === agent_messages_js_1.agentTurnStartRejectedType ||
822
+ message.type === agent_messages_js_1.agentTurnSteerRejectedType ||
823
+ message.type === agent_messages_js_1.agentTurnInterruptAcceptedType ||
824
+ message.type === agent_messages_js_1.agentTurnInterruptedType) {
825
+ this.appendMessage(event);
741
826
  return;
742
827
  }
743
828
  if (isMergeableDelta(message)) {
@@ -751,6 +836,10 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
751
836
  }
752
837
  return;
753
838
  }
839
+ if (message.type === agent_messages_js_1.agentUsageUpdatedType) {
840
+ this.appendMessage(event);
841
+ return;
842
+ }
754
843
  if (message instanceof agent_messages_js_1.AgentClientToolCallRequested) {
755
844
  this.appendMessage(event);
756
845
  }
@@ -803,7 +892,7 @@ class ChatThreadSession extends change_emitter_js_1.ChangeEmitter {
803
892
  const existing = this._messages[existingIndex].message;
804
893
  const merged = mergeDeltaMessage(existing, message);
805
894
  if (merged != null) {
806
- this._messages[existingIndex] = new AgentMessageEvent({ message: merged, attachment: event.attachment });
895
+ this._messages[existingIndex] = new AgentMessageEvent({ message: merged, createdAt: event.createdAt, attachment: event.attachment });
807
896
  }
808
897
  }
809
898
  indexMessagesFrom(start) {
@@ -968,6 +1057,16 @@ function normalizedString(value) {
968
1057
  const normalized = value?.trim();
969
1058
  return normalized == null || normalized === "" ? undefined : normalized;
970
1059
  }
1060
+ function dateOrNull(value) {
1061
+ if (value instanceof Date && !Number.isNaN(value.getTime())) {
1062
+ return value;
1063
+ }
1064
+ if (typeof value !== "string" || value.trim() === "") {
1065
+ return undefined;
1066
+ }
1067
+ const parsed = new Date(value);
1068
+ return Number.isNaN(parsed.getTime()) ? undefined : parsed;
1069
+ }
971
1070
  function nonEmptyTrimmed(value) {
972
1071
  const normalized = value?.trim();
973
1072
  return normalized == null || normalized === "" ? undefined : normalized;
@@ -313,10 +313,12 @@ class AgentThreadStorageRepository extends ThreadStorageRepository {
313
313
  this.handleEvent(next.value);
314
314
  }
315
315
  })();
316
- await new Promise((resolve) => {
316
+ const ready = new Promise((resolve) => {
317
317
  this.pendingOpen = { resolve };
318
- void this.requestList();
319
318
  });
319
+ await this.chatClient.sendAgentMessage(new agent_messages_js_1.WatchThreads(), { ignoreOffline: true });
320
+ await this.requestList();
321
+ await ready;
320
322
  }
321
323
  async close() {
322
324
  this.closed = true;
@@ -325,6 +327,7 @@ class AgentThreadStorageRepository extends ThreadStorageRepository {
325
327
  this.pendingListMessageId = undefined;
326
328
  this.pendingOpen?.resolve();
327
329
  this.pendingOpen = undefined;
330
+ await this.chatClient.sendAgentMessage(new agent_messages_js_1.UnwatchThreads(), { ignoreOffline: true }).catch(() => undefined);
328
331
  }
329
332
  entries() {
330
333
  return [...this.entriesByPath.values()];
@@ -19,6 +19,8 @@ export declare const agentParticipantDisconnectType = "meshagent.agent.participa
19
19
  export declare const agentThreadDeleteType = "meshagent.agent.thread.delete";
20
20
  export declare const agentThreadRenameType = "meshagent.agent.thread.rename";
21
21
  export declare const agentThreadListType = "meshagent.agent.thread.list";
22
+ export declare const agentThreadWatchType = "meshagent.agent.thread.watch";
23
+ export declare const agentThreadUnwatchType = "meshagent.agent.thread.unwatch";
22
24
  export declare const agentThreadListedType = "meshagent.agent.thread.listed";
23
25
  export declare const agentThreadCreatedType = "meshagent.agent.thread.created";
24
26
  export declare const agentThreadUpdatedType = "meshagent.agent.thread.updated";
@@ -239,7 +241,8 @@ export declare abstract class AgentMessage {
239
241
  readonly type: string;
240
242
  readonly messageId: string;
241
243
  readonly senderName?: string;
242
- protected constructor({ type, messageId, message_id, senderName, sender_name }: JsonMap);
244
+ readonly createdAt: string;
245
+ protected constructor({ type, messageId, message_id, senderName, sender_name, createdAt, created_at }: JsonMap);
243
246
  toJson(): JsonMap;
244
247
  static fromJson(json: JsonMap): AgentMessage;
245
248
  }
@@ -272,6 +275,8 @@ export declare const ParticipantDisconnect: MessageCtor;
272
275
  export declare const DeleteThread: MessageCtor;
273
276
  export declare const RenameThread: MessageCtor;
274
277
  export declare const ListThreads: MessageCtor;
278
+ export declare const WatchThreads: MessageCtor;
279
+ export declare const UnwatchThreads: MessageCtor;
275
280
  export declare const ThreadsListed: MessageCtor;
276
281
  export declare const ThreadCreated: MessageCtor;
277
282
  export declare const ThreadUpdated: MessageCtor;
@@ -18,6 +18,8 @@ export const agentParticipantDisconnectType = "meshagent.agent.participant.disco
18
18
  export const agentThreadDeleteType = "meshagent.agent.thread.delete";
19
19
  export const agentThreadRenameType = "meshagent.agent.thread.rename";
20
20
  export const agentThreadListType = "meshagent.agent.thread.list";
21
+ export const agentThreadWatchType = "meshagent.agent.thread.watch";
22
+ export const agentThreadUnwatchType = "meshagent.agent.thread.unwatch";
21
23
  export const agentThreadListedType = "meshagent.agent.thread.listed";
22
24
  export const agentThreadCreatedType = "meshagent.agent.thread.created";
23
25
  export const agentThreadUpdatedType = "meshagent.agent.thread.updated";
@@ -631,16 +633,18 @@ function omitUndefined(value) {
631
633
  return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
632
634
  }
633
635
  export class AgentMessage {
634
- constructor({ type, messageId, message_id, senderName, sender_name }) {
636
+ constructor({ type, messageId, message_id, senderName, sender_name, createdAt, created_at }) {
635
637
  this.type = String(type);
636
638
  const resolvedMessageId = stringOrNull(messageId ?? message_id)?.trim();
637
639
  this.messageId = resolvedMessageId == null || resolvedMessageId.length === 0 ? uuidv4() : resolvedMessageId;
638
640
  this.senderName = stringOrNull(senderName ?? sender_name);
641
+ this.createdAt = stringOrNull(createdAt ?? created_at) ?? new Date().toISOString();
639
642
  }
640
643
  toJson() {
641
644
  return {
642
645
  type: this.type,
643
646
  message_id: this.messageId,
647
+ created_at: this.createdAt,
644
648
  ...(this.senderName != null ? { sender_name: this.senderName } : {}),
645
649
  };
646
650
  }
@@ -704,6 +708,7 @@ function makeMessageClass({ type, base = "message", fields = [], }) {
704
708
  const params = {
705
709
  messageId: stringOrNull(json.message_id),
706
710
  senderName: stringOrNull(json.sender_name),
711
+ createdAt: stringOrNull(json.created_at),
707
712
  };
708
713
  if (base !== "message") {
709
714
  params.threadId = requiredString(json, "thread_id");
@@ -914,6 +919,8 @@ export const ParticipantDisconnect = makeMessageClass({ type: agentParticipantDi
914
919
  export const DeleteThread = makeMessageClass({ type: agentThreadDeleteType, base: "thread" });
915
920
  export const RenameThread = makeMessageClass({ type: agentThreadRenameType, base: "thread", fields: [s("name", "name", true)] });
916
921
  export const ListThreads = makeMessageClass({ type: agentThreadListType, fields: [{ prop: "limit", json: "limit", from: (value) => intOrNull(value) ?? 200, default: () => 200, always: true }, { prop: "offset", json: "offset", from: (value) => intOrNull(value) ?? 0, default: () => 0, always: true }] });
922
+ export const WatchThreads = makeMessageClass({ type: agentThreadWatchType });
923
+ export const UnwatchThreads = makeMessageClass({ type: agentThreadUnwatchType });
917
924
  export const ThreadsListed = makeMessageClass({ type: agentThreadListedType, fields: [s("sourceMessageId", "source_message_id", true), objList("threads", "threads", AgentThreadListEntry.fromJson, true), i("total"), i("offset"), i("limit")] });
918
925
  export const ThreadCreated = makeMessageClass({ type: agentThreadCreatedType, fields: [obj("thread", "thread", AgentThreadListEntry.fromJson, true)] });
919
926
  export const ThreadUpdated = makeMessageClass({ type: agentThreadUpdatedType, fields: [obj("thread", "thread", AgentThreadListEntry.fromJson, true)] });
@@ -1,13 +1,15 @@
1
1
  import { RemoteParticipant } from "@meshagent/meshagent";
2
2
  import type { RoomClient, Content } from "@meshagent/meshagent";
3
- import { AgentMessage, AgentModelChanged, AgentThreadStatus, ModelsResponse, AgentConnectionStatus } from "./agent-messages.js";
3
+ import { AgentMessage, AgentModelChanged, AgentThreadStatus, ModelsResponse, ToolChoice, AgentConnectionStatus } from "./agent-messages.js";
4
4
  import type { AgentPayload, JsonMap, ClientToolkitDescription } from "./agent-messages.js";
5
5
  import { ChangeEmitter } from "./change-emitter.js";
6
6
  export declare class AgentMessageEvent {
7
7
  readonly message: AgentMessage;
8
+ readonly createdAt: Date;
8
9
  readonly attachment?: Uint8Array;
9
- constructor({ message, attachment }: {
10
+ constructor({ message, createdAt, attachment }: {
10
11
  message: AgentMessage;
12
+ createdAt?: Date;
11
13
  attachment?: Uint8Array;
12
14
  });
13
15
  get payload(): AgentPayload;
@@ -96,7 +98,7 @@ export declare abstract class BaseChatClient extends ChangeEmitter {
96
98
  drainPendingEvents?: boolean;
97
99
  }): ChatThreadSession;
98
100
  private openSession;
99
- startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, omitContent, }: {
101
+ startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, toolChoice, omitContent, }: {
100
102
  messageId?: string;
101
103
  message: string;
102
104
  attachments: string[];
@@ -109,14 +111,17 @@ export declare abstract class BaseChatClient extends ChangeEmitter {
109
111
  realtimeProtocol?: string;
110
112
  senderName?: string;
111
113
  clientToolkits?: ClientToolkitDescription[];
114
+ toolChoice?: ToolChoice;
112
115
  omitContent?: boolean;
113
116
  }): Promise<ChatThreadStartResult>;
117
+ private resolvedStartThreadMessage;
114
118
  abstract sendAgentMessage(message: AgentMessage, options?: {
115
119
  attachment?: Uint8Array;
116
120
  ignoreOffline?: boolean;
117
121
  }): Promise<void>;
118
122
  private drainPendingSessionEvents;
119
- handleAgentMessage(message: AgentMessage, { attachment }?: {
123
+ handleAgentMessage(message: AgentMessage, { createdAt, attachment }?: {
124
+ createdAt?: Date;
120
125
  attachment?: Uint8Array;
121
126
  }): void;
122
127
  emitConnectionStatus({ status, message, reason, retryDelay, }: {
@@ -186,6 +191,7 @@ export declare class ChatThreadSession extends ChangeEmitter {
186
191
  load?: boolean;
187
192
  sinceTurn?: string;
188
193
  }): Promise<void>;
194
+ private resetReplayState;
189
195
  close(): Promise<void>;
190
196
  requestModels({ ignoreOffline }?: {
191
197
  ignoreOffline?: boolean;
@@ -202,7 +208,7 @@ export declare class ChatThreadSession extends ChangeEmitter {
202
208
  requestId: string;
203
209
  response: Content;
204
210
  }): Promise<void>;
205
- sendText({ messageId, text, attachments, steer, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, }: {
211
+ sendText({ messageId, text, attachments, steer, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, toolChoice, }: {
206
212
  messageId?: string;
207
213
  text: string;
208
214
  attachments: string[];
@@ -215,6 +221,7 @@ export declare class ChatThreadSession extends ChangeEmitter {
215
221
  outputModalities?: string[];
216
222
  senderName?: string;
217
223
  clientToolkits?: ClientToolkitDescription[];
224
+ toolChoice?: ToolChoice;
218
225
  }): Promise<string>;
219
226
  sendRealtimeAudioChunk({ chunk, format }: {
220
227
  chunk: Uint8Array;