@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.
@@ -1,14 +1,15 @@
1
1
  import { Completer, } from "@meshagent/meshagent";
2
2
  import { v4 as uuidv4 } from "uuid";
3
- import { AgentMessage as AgentMessageFactory, AgentAudioGenerationDelta, AgentAudioTranscriptionDelta, AgentRealtimeAudioChunk, AgentRealtimeAudioCommit, AgentFileContentDelta, AgentModelChanged, AgentReasoningContentDelta, AgentTextContentDelta, AgentThreadStatus, AgentToolCallArgumentsDelta, AgentToolCallLogDelta, ChangeModel, CloseThread, DeleteThread, ModelsResponse, ModelsRequest, OpenThread, RenameThread, StartThread, AgentConnectionStatus, TurnInterrupt, TurnStart, TurnSteer, AgentClientToolCallRequested, AgentClientToolCallResponse, agentInputContent, agentAudioGenerationDeltaType, agentAudioTranscriptionDeltaType, agentFileContentDeltaType, agentImageGenerationCompletedType, agentImageGenerationPartialType, agentModelChangedType, agentModelsResponseType, agentReasoningContentDeltaType, agentRoomMessageType, agentTextContentDeltaType, agentThreadClearedType, agentThreadLoadedType, agentConnectionStatusType, agentThreadStatusType, agentThreadStartType, agentThreadStartRejectedType, agentThreadStartedType, agentToolCallArgumentsDeltaType, agentToolCallLogDeltaType, agentTurnEndedType, agentTurnStartAcceptedType, agentTurnStartRejectedType, agentTurnStartType, agentTurnStartedType, agentTurnSteerAcceptedType, agentTurnSteerRejectedType, agentTurnSteerType, agentTurnSteeredType, } from "./agent-messages.js";
3
+ import { AgentMessage as AgentMessageFactory, AgentAudioGenerationDelta, AgentAudioTranscriptionDelta, AgentRealtimeAudioChunk, AgentRealtimeAudioCommit, AgentFileContentDelta, AgentModelChanged, AgentReasoningContentDelta, AgentTextContentDelta, AgentThreadStatus, AgentToolCallArgumentsDelta, AgentToolCallLogDelta, ChangeModel, CloseThread, DeleteThread, ModelsResponse, ModelsRequest, OpenThread, RenameThread, StartThread, AgentConnectionStatus, TurnInterrupt, TurnStart, TurnSteer, AgentClientToolCallRequested, AgentClientToolCallResponse, agentInputContent, agentAudioGenerationDeltaType, agentAudioTranscriptionDeltaType, agentFileContentDeltaType, agentImageGenerationCompletedType, agentImageGenerationPartialType, agentModelChangedType, agentModelsResponseType, agentReasoningContentDeltaType, agentRoomMessageType, agentTextContentDeltaType, agentThreadClearedType, agentThreadCreatedType, agentThreadDeletedType, agentThreadLoadedType, agentThreadListedType, agentThreadUpdatedType, agentConnectionStatusType, agentThreadStatusType, agentThreadStartType, agentThreadStartRejectedType, agentThreadStartedType, agentToolCallArgumentsDeltaType, agentToolCallLogDeltaType, agentToolCallEndedType, agentToolCallInProgressType, agentToolCallPendingType, agentToolCallStartedType, agentSecretRequestedType, agentTurnEndedType, agentTurnInterruptAcceptedType, agentTurnInterruptedType, agentTurnStartAcceptedType, agentTurnStartRejectedType, agentTurnStartType, agentTurnStartedType, agentTurnSteerAcceptedType, agentTurnSteerRejectedType, agentTurnSteerType, agentTurnSteeredType, agentUsageUpdatedType, } from "./agent-messages.js";
4
4
  import { ChangeEmitter } from "./change-emitter.js";
5
5
  export class AgentMessageEvent {
6
- constructor({ message, attachment }) {
6
+ constructor({ message, createdAt, attachment }) {
7
7
  this.message = message;
8
+ this.createdAt = createdAt ?? dateOrNull(message.createdAt) ?? new Date();
8
9
  this.attachment = attachment;
9
10
  }
10
11
  get payload() {
11
- return this.message.toJson();
12
+ return { ...this.message.toJson(), created_at: this.createdAt.toISOString() };
12
13
  }
13
14
  }
14
15
  function agentRoomMessageFromEvent(event) {
@@ -196,7 +197,7 @@ export class BaseChatClient extends ChangeEmitter {
196
197
  this.notifyListeners();
197
198
  });
198
199
  }
199
- async startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, omitContent = false, }) {
200
+ async startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, toolChoice, omitContent = false, }) {
200
201
  const resolvedMessageId = messageId == null || messageId.trim() === "" ? uuidv4() : messageId.trim();
201
202
  const resolvedSenderName = this.cleanParticipantName(senderName) ?? this.localParticipantName();
202
203
  const payload = new StartThread({
@@ -211,6 +212,7 @@ export class BaseChatClient extends ChangeEmitter {
211
212
  realtimeProtocol: nonEmptyTrimmed(realtimeProtocol),
212
213
  senderName: resolvedSenderName,
213
214
  clientToolkits: clientToolkits != null && clientToolkits.length > 0 ? clientToolkits : undefined,
215
+ toolChoice: toolChoice?.toJson(),
214
216
  });
215
217
  const completer = new Completer();
216
218
  this.pendingStartRequests.set(resolvedMessageId, completer);
@@ -225,7 +227,10 @@ export class BaseChatClient extends ChangeEmitter {
225
227
  }
226
228
  const session = this.openThread(threadPath, { load: false, drainPendingEvents: false });
227
229
  if (!omitContent) {
228
- session.addAgentMessage(new AgentMessageEvent({ message: payload }));
230
+ session.addAgentMessage(new AgentMessageEvent({
231
+ message: this.resolvedStartThreadMessage({ payload, threadPath }),
232
+ createdAt: dateOrNull(payload.createdAt) ?? undefined,
233
+ }));
229
234
  }
230
235
  this.drainPendingSessionEvents(threadPath, session);
231
236
  return new ChatThreadStartResult({
@@ -240,6 +245,23 @@ export class BaseChatClient extends ChangeEmitter {
240
245
  this.pendingStartRequests.delete(resolvedMessageId);
241
246
  }
242
247
  }
248
+ resolvedStartThreadMessage({ payload, threadPath, }) {
249
+ return new TurnStart({
250
+ threadId: threadPath,
251
+ messageId: payload.messageId,
252
+ senderName: payload.senderName,
253
+ content: payload.content,
254
+ backend: payload.backend,
255
+ provider: payload.provider,
256
+ model: payload.model,
257
+ voice: payload.voice,
258
+ outputModalities: payload.outputModalities,
259
+ instructions: payload.instructions,
260
+ mcp: payload.mcp,
261
+ clientToolkits: payload.clientToolkits,
262
+ toolkits: payload.toolkits,
263
+ });
264
+ }
243
265
  drainPendingSessionEvents(threadPath, session) {
244
266
  const pendingEvents = this.pendingSessionEventsByPath.get(threadPath);
245
267
  if (pendingEvents == null) {
@@ -250,16 +272,16 @@ export class BaseChatClient extends ChangeEmitter {
250
272
  session.addAgentMessage(event);
251
273
  }
252
274
  }
253
- handleAgentMessage(message, { attachment } = {}) {
275
+ handleAgentMessage(message, { createdAt, attachment } = {}) {
254
276
  if (message.type === agentConnectionStatusType) {
255
277
  this._connectionStatus = message;
256
278
  for (const session of this.sessionsByPath.values()) {
257
279
  if (session.isOpen) {
258
- session.addAgentMessage(new AgentMessageEvent({ message, attachment }));
280
+ session.addAgentMessage(new AgentMessageEvent({ message, createdAt, attachment }));
259
281
  }
260
282
  }
261
283
  }
262
- this.eventQueue.add(new AgentMessageEvent({ message, attachment }));
284
+ this.eventQueue.add(new AgentMessageEvent({ message, createdAt, attachment }));
263
285
  const sourceMessageId = sourceMessageIdFor(message);
264
286
  if ((message.type === agentThreadStartedType || message.type === agentThreadStartRejectedType) &&
265
287
  sourceMessageId != null &&
@@ -274,7 +296,7 @@ export class BaseChatClient extends ChangeEmitter {
274
296
  this.notifyListeners();
275
297
  return;
276
298
  }
277
- const event = new AgentMessageEvent({ message, attachment });
299
+ const event = new AgentMessageEvent({ message, createdAt, attachment });
278
300
  const session = this.sessionsByPath.get(threadPath);
279
301
  if (session != null) {
280
302
  session.addAgentMessage(event);
@@ -336,10 +358,15 @@ export class MessagingChatClient extends BaseChatClient {
336
358
  return;
337
359
  }
338
360
  const participant = this.agentParticipant();
339
- if (participant == null || roomMessage.fromParticipantId !== participant.id) {
361
+ const fromSelectedAgent = participant != null && roomMessage.fromParticipantId === participant.id;
362
+ const fromParticipantlessThreadList = roomMessage.fromParticipantId == null && isThreadListMessage(roomMessage.message);
363
+ if (!fromSelectedAgent && !fromParticipantlessThreadList) {
340
364
  return;
341
365
  }
342
- this.handleAgentMessage(AgentMessageFactory.fromJson(roomMessage.message), { attachment: roomMessage.attachment });
366
+ this.handleAgentMessage(AgentMessageFactory.fromJson(roomMessage.message), {
367
+ createdAt: dateOrNull(roomMessage.message.created_at),
368
+ attachment: roomMessage.attachment,
369
+ });
343
370
  };
344
371
  this.room = room;
345
372
  this.agentName = agentName;
@@ -407,6 +434,12 @@ export class MessagingChatClient extends BaseChatClient {
407
434
  });
408
435
  }
409
436
  }
437
+ function isThreadListMessage(message) {
438
+ return message.type === agentThreadListedType
439
+ || message.type === agentThreadCreatedType
440
+ || message.type === agentThreadUpdatedType
441
+ || message.type === agentThreadDeletedType;
442
+ }
410
443
  export class ChatThreadSession extends ChangeEmitter {
411
444
  constructor({ client, threadPath }) {
412
445
  super();
@@ -454,6 +487,9 @@ export class ChatThreadSession extends ChangeEmitter {
454
487
  async open({ load = true, sinceTurn } = {}) {
455
488
  if (this.openState) {
456
489
  if (load) {
490
+ if (sinceTurn == null) {
491
+ this.resetReplayState();
492
+ }
457
493
  const openThread = new OpenThread({ threadId: this.threadPath, load: true, sinceTurn });
458
494
  this.setLoadState(this.loadingStateForOpen(openThread, sinceTurn));
459
495
  try {
@@ -484,6 +520,17 @@ export class ChatThreadSession extends ChangeEmitter {
484
520
  throw error;
485
521
  }
486
522
  }
523
+ resetReplayState() {
524
+ this._messages.length = 0;
525
+ this.messageIndexes.clear();
526
+ this.localAgentMessageIds.clear();
527
+ this.pendingLocalInputMessageIds.clear();
528
+ this.mergedDeltaMessageIds.clear();
529
+ this.pendingInputsById.clear();
530
+ this.lastCompletedTurnIdValue = undefined;
531
+ this.lastAgentMessageType = undefined;
532
+ this.lastAgentMessageAt = undefined;
533
+ }
487
534
  async close() {
488
535
  if (!this.openState) {
489
536
  return;
@@ -515,7 +562,7 @@ export class ChatThreadSession extends ChangeEmitter {
515
562
  response,
516
563
  }));
517
564
  }
518
- async sendText({ messageId, text, attachments, steer = false, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, }) {
565
+ async sendText({ messageId, text, attachments, steer = false, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, toolChoice, }) {
519
566
  const resolvedMessageId = messageId == null || messageId.trim() === "" ? uuidv4() : messageId.trim();
520
567
  const currentModel = this.currentModelValue;
521
568
  const resolvedBackend = nonEmptyTrimmed(backend) ?? currentModel?.backend;
@@ -544,6 +591,7 @@ export class ChatThreadSession extends ChangeEmitter {
544
591
  voice: resolvedVoice,
545
592
  outputModalities: resolvedOutputModalities,
546
593
  clientToolkits: clientToolkits != null && clientToolkits.length > 0 ? clientToolkits : undefined,
594
+ toolChoice: toolChoice?.toJson(),
547
595
  });
548
596
  this.localAgentMessageIds.add(resolvedMessageId);
549
597
  this.pendingLocalInputMessageIds.add(resolvedMessageId);
@@ -593,9 +641,9 @@ export class ChatThreadSession extends ChangeEmitter {
593
641
  const message = event.message;
594
642
  const type = message.type;
595
643
  this.lastAgentMessageType = type;
596
- this.lastAgentMessageAt = new Date();
644
+ this.lastAgentMessageAt = event.createdAt;
597
645
  this.updateSessionState(message);
598
- this.updatePendingInputsForMessage(message);
646
+ this.updatePendingInputsForMessage(message, event.createdAt);
599
647
  this.appendRenderableMessage(event);
600
648
  this.notifyListeners();
601
649
  }
@@ -661,7 +709,7 @@ export class ChatThreadSession extends ChangeEmitter {
661
709
  }), { notify: false });
662
710
  }
663
711
  }
664
- updatePendingInputsForMessage(message) {
712
+ updatePendingInputsForMessage(message, createdAt) {
665
713
  const type = message.type;
666
714
  const messageId = message.messageId;
667
715
  const sourceMessageId = sourceMessageIdFor(message);
@@ -675,7 +723,7 @@ export class ChatThreadSession extends ChangeEmitter {
675
723
  messageType: type,
676
724
  threadPath: this.threadPath,
677
725
  payload: message,
678
- createdAt: new Date(),
726
+ createdAt,
679
727
  awaitingAcceptance: true,
680
728
  awaitingApplication: true,
681
729
  }));
@@ -714,6 +762,31 @@ export class ChatThreadSession extends ChangeEmitter {
714
762
  }
715
763
  return;
716
764
  }
765
+ if (message.type === agentToolCallEndedType) {
766
+ const itemId = normalizedString(message.itemId);
767
+ if (itemId != null) {
768
+ this.upsertItemMessage(`tool_call:${itemId}`, event);
769
+ }
770
+ else if (message.error != null) {
771
+ this.appendMessage(event);
772
+ }
773
+ return;
774
+ }
775
+ if (message.type === agentToolCallPendingType || message.type === agentToolCallInProgressType || message.type === agentToolCallStartedType) {
776
+ const itemId = normalizedString(message.itemId);
777
+ if (itemId != null) {
778
+ this.upsertItemMessage(`tool_call:${itemId}`, event);
779
+ }
780
+ return;
781
+ }
782
+ if (message.type === agentSecretRequestedType) {
783
+ this.appendMessage(event);
784
+ return;
785
+ }
786
+ if (message.type === agentModelChangedType) {
787
+ this.appendMessage(event);
788
+ return;
789
+ }
717
790
  if (message.type === agentThreadStartType || message.type === agentTurnStartType || message.type === agentTurnSteerType) {
718
791
  if (agentInputText(message.content).trim() !== "") {
719
792
  this.appendMessage(event);
@@ -729,6 +802,18 @@ export class ChatThreadSession extends ChangeEmitter {
729
802
  if (agentInputText(message.content).trim() !== "") {
730
803
  this.appendMessage(event, { beforePendingLocalInputs: true });
731
804
  }
805
+ else {
806
+ this.appendMessage(event);
807
+ }
808
+ return;
809
+ }
810
+ if (message.type === agentTurnStartedType ||
811
+ message.type === agentTurnSteeredType ||
812
+ message.type === agentTurnStartRejectedType ||
813
+ message.type === agentTurnSteerRejectedType ||
814
+ message.type === agentTurnInterruptAcceptedType ||
815
+ message.type === agentTurnInterruptedType) {
816
+ this.appendMessage(event);
732
817
  return;
733
818
  }
734
819
  if (isMergeableDelta(message)) {
@@ -742,6 +827,10 @@ export class ChatThreadSession extends ChangeEmitter {
742
827
  }
743
828
  return;
744
829
  }
830
+ if (message.type === agentUsageUpdatedType) {
831
+ this.appendMessage(event);
832
+ return;
833
+ }
745
834
  if (message instanceof AgentClientToolCallRequested) {
746
835
  this.appendMessage(event);
747
836
  }
@@ -794,7 +883,7 @@ export class ChatThreadSession extends ChangeEmitter {
794
883
  const existing = this._messages[existingIndex].message;
795
884
  const merged = mergeDeltaMessage(existing, message);
796
885
  if (merged != null) {
797
- this._messages[existingIndex] = new AgentMessageEvent({ message: merged, attachment: event.attachment });
886
+ this._messages[existingIndex] = new AgentMessageEvent({ message: merged, createdAt: event.createdAt, attachment: event.attachment });
798
887
  }
799
888
  }
800
889
  indexMessagesFrom(start) {
@@ -958,6 +1047,16 @@ function normalizedString(value) {
958
1047
  const normalized = value?.trim();
959
1048
  return normalized == null || normalized === "" ? undefined : normalized;
960
1049
  }
1050
+ function dateOrNull(value) {
1051
+ if (value instanceof Date && !Number.isNaN(value.getTime())) {
1052
+ return value;
1053
+ }
1054
+ if (typeof value !== "string" || value.trim() === "") {
1055
+ return undefined;
1056
+ }
1057
+ const parsed = new Date(value);
1058
+ return Number.isNaN(parsed.getTime()) ? undefined : parsed;
1059
+ }
961
1060
  function nonEmptyTrimmed(value) {
962
1061
  const normalized = value?.trim();
963
1062
  return normalized == null || normalized === "" ? undefined : normalized;
@@ -1,6 +1,6 @@
1
1
  import { Field, Schema, Utf8, tableFromArrays, } from "apache-arrow";
2
2
  import { ChangeEmitter } from "./change-emitter.js";
3
- import { DeleteThread, ListThreads, RenameThread, } from "./agent-messages.js";
3
+ import { DeleteThread, ListThreads, RenameThread, UnwatchThreads, WatchThreads, } from "./agent-messages.js";
4
4
  export const defaultUntitledThreadName = "New Chat";
5
5
  const uuidPattern = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
6
6
  export class ThreadListEntry {
@@ -304,10 +304,12 @@ export class AgentThreadStorageRepository extends ThreadStorageRepository {
304
304
  this.handleEvent(next.value);
305
305
  }
306
306
  })();
307
- await new Promise((resolve) => {
307
+ const ready = new Promise((resolve) => {
308
308
  this.pendingOpen = { resolve };
309
- void this.requestList();
310
309
  });
310
+ await this.chatClient.sendAgentMessage(new WatchThreads(), { ignoreOffline: true });
311
+ await this.requestList();
312
+ await ready;
311
313
  }
312
314
  async close() {
313
315
  this.closed = true;
@@ -316,6 +318,7 @@ export class AgentThreadStorageRepository extends ThreadStorageRepository {
316
318
  this.pendingListMessageId = undefined;
317
319
  this.pendingOpen?.resolve();
318
320
  this.pendingOpen = undefined;
321
+ await this.chatClient.sendAgentMessage(new UnwatchThreads(), { ignoreOffline: true }).catch(() => undefined);
319
322
  }
320
323
  entries() {
321
324
  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;
@@ -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;