@meshagent/meshagent-agents 0.43.2 → 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.
@@ -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";
@@ -170,6 +172,7 @@ export declare class AgentProviderInfo {
170
172
  readonly name: string;
171
173
  readonly friendlyName: string;
172
174
  readonly description?: string;
175
+ readonly backend?: string;
173
176
  readonly defaultModel: string;
174
177
  readonly models: AgentModelInfo[];
175
178
  constructor(params: JsonMap);
@@ -238,7 +241,8 @@ export declare abstract class AgentMessage {
238
241
  readonly type: string;
239
242
  readonly messageId: string;
240
243
  readonly senderName?: string;
241
- 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);
242
246
  toJson(): JsonMap;
243
247
  static fromJson(json: JsonMap): AgentMessage;
244
248
  }
@@ -271,6 +275,8 @@ export declare const ParticipantDisconnect: MessageCtor;
271
275
  export declare const DeleteThread: MessageCtor;
272
276
  export declare const RenameThread: MessageCtor;
273
277
  export declare const ListThreads: MessageCtor;
278
+ export declare const WatchThreads: MessageCtor;
279
+ export declare const UnwatchThreads: MessageCtor;
274
280
  export declare const ThreadsListed: MessageCtor;
275
281
  export declare const ThreadCreated: MessageCtor;
276
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";
@@ -476,6 +478,7 @@ export class AgentProviderInfo {
476
478
  this.name = String(params.name);
477
479
  this.friendlyName = String(params.friendlyName ?? params.friendly_name);
478
480
  this.description = stringOrNull(params.description);
481
+ this.backend = stringOrNull(params.backend);
479
482
  this.defaultModel = String(params.defaultModel ?? params.default_model);
480
483
  this.models = Array.isArray(params.models) ? params.models.map((entry) => entry instanceof AgentModelInfo ? entry : AgentModelInfo.fromJson(requiredObjectValue(entry))) : [];
481
484
  }
@@ -487,6 +490,7 @@ export class AgentProviderInfo {
487
490
  name: this.name,
488
491
  friendly_name: this.friendlyName,
489
492
  ...(this.description != null ? { description: this.description } : {}),
493
+ ...(this.backend != null ? { backend: this.backend } : {}),
490
494
  default_model: this.defaultModel,
491
495
  models: this.models.map((entry) => entry.toJson()),
492
496
  };
@@ -608,11 +612,12 @@ export class AgentContextWindowUsage {
608
612
  this.compactionThreshold = intOrNull(params.compactionThreshold ?? params.compaction_threshold);
609
613
  }
610
614
  static fromJson(json) {
615
+ const usedTokens = intOrNull(json.used_tokens ?? json.usedTokens) ?? 0;
611
616
  return new AgentContextWindowUsage({
612
- usedTokens: requiredInt(json, "used_tokens"),
613
- totalTokens: intOrNull(json.total_tokens),
614
- compactionMode: stringOrNull(json.compaction_mode),
615
- compactionThreshold: intOrNull(json.compaction_threshold),
617
+ usedTokens,
618
+ totalTokens: intOrNull(json.total_tokens ?? json.totalTokens),
619
+ compactionMode: stringOrNull(json.compaction_mode ?? json.compactionMode),
620
+ compactionThreshold: intOrNull(json.compaction_threshold ?? json.compactionThreshold),
616
621
  });
617
622
  }
618
623
  toJson() {
@@ -628,16 +633,18 @@ function omitUndefined(value) {
628
633
  return Object.fromEntries(Object.entries(value).filter(([, entry]) => entry !== undefined));
629
634
  }
630
635
  export class AgentMessage {
631
- constructor({ type, messageId, message_id, senderName, sender_name }) {
636
+ constructor({ type, messageId, message_id, senderName, sender_name, createdAt, created_at }) {
632
637
  this.type = String(type);
633
638
  const resolvedMessageId = stringOrNull(messageId ?? message_id)?.trim();
634
639
  this.messageId = resolvedMessageId == null || resolvedMessageId.length === 0 ? uuidv4() : resolvedMessageId;
635
640
  this.senderName = stringOrNull(senderName ?? sender_name);
641
+ this.createdAt = stringOrNull(createdAt ?? created_at) ?? new Date().toISOString();
636
642
  }
637
643
  toJson() {
638
644
  return {
639
645
  type: this.type,
640
646
  message_id: this.messageId,
647
+ created_at: this.createdAt,
641
648
  ...(this.senderName != null ? { sender_name: this.senderName } : {}),
642
649
  };
643
650
  }
@@ -701,6 +708,7 @@ function makeMessageClass({ type, base = "message", fields = [], }) {
701
708
  const params = {
702
709
  messageId: stringOrNull(json.message_id),
703
710
  senderName: stringOrNull(json.sender_name),
711
+ createdAt: stringOrNull(json.created_at),
704
712
  };
705
713
  if (base !== "message") {
706
714
  params.threadId = requiredString(json, "thread_id");
@@ -852,6 +860,7 @@ const turnOptions = [
852
860
  s("turnId"),
853
861
  contentList("content"),
854
862
  s("provider"),
863
+ s("backend"),
855
864
  s("model"),
856
865
  s("voice"),
857
866
  sl("outputModalities"),
@@ -886,6 +895,7 @@ export const StartThread = makeMessageClass({
886
895
  s("name"),
887
896
  s("realtimeProtocol"),
888
897
  s("provider"),
898
+ s("backend"),
889
899
  s("model"),
890
900
  s("voice"),
891
901
  sl("outputModalities"),
@@ -909,6 +919,8 @@ export const ParticipantDisconnect = makeMessageClass({ type: agentParticipantDi
909
919
  export const DeleteThread = makeMessageClass({ type: agentThreadDeleteType, base: "thread" });
910
920
  export const RenameThread = makeMessageClass({ type: agentThreadRenameType, base: "thread", fields: [s("name", "name", true)] });
911
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 });
912
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")] });
913
925
  export const ThreadCreated = makeMessageClass({ type: agentThreadCreatedType, fields: [obj("thread", "thread", AgentThreadListEntry.fromJson, true)] });
914
926
  export const ThreadUpdated = makeMessageClass({ type: agentThreadUpdatedType, fields: [obj("thread", "thread", AgentThreadListEntry.fromJson, true)] });
@@ -917,8 +929,8 @@ export const CapabilitiesRequest = makeMessageClass({ type: agentCapabilitiesReq
917
929
  export const CapabilitiesResponse = makeMessageClass({ type: agentCapabilitiesResponseType, base: "thread", fields: [s("sourceMessageId", "source_message_id", true), s("version", "version", true), objList("toolkits", "toolkits", ToolkitCapabilities.fromJson, true)] });
918
930
  export const ModelsRequest = makeMessageClass({ type: agentModelsRequestType });
919
931
  export const ModelsResponse = makeMessageClass({ type: agentModelsResponseType, fields: [s("sourceMessageId", "source_message_id", true), objList("providers", "providers", AgentProviderInfo.fromJson, true)] });
920
- export const ChangeModel = makeMessageClass({ type: agentModelChangeType, base: "thread", fields: [s("provider"), s("model"), s("voice")] });
921
- export const AgentModelChanged = makeMessageClass({ type: agentModelChangedType, base: "thread", fields: [s("sourceMessageId"), s("provider", "provider", true), s("model", "model", true), s("voice"), audioFormat("inputFormat"), audioFormat("outputFormat"), s("turnDetection"), sl("outputModalities", "output_modalities", ["text"], true), sl("realtimeProtocols", "realtime_protocols", [], true)] });
932
+ export const ChangeModel = makeMessageClass({ type: agentModelChangeType, base: "thread", fields: [s("backend"), s("provider"), s("model"), s("voice")] });
933
+ export const AgentModelChanged = makeMessageClass({ type: agentModelChangedType, base: "thread", fields: [s("sourceMessageId"), s("backend"), s("provider", "provider", true), s("model", "model", true), s("voice"), audioFormat("inputFormat"), audioFormat("outputFormat"), s("turnDetection"), sl("outputModalities", "output_modalities", ["text"], true), sl("realtimeProtocols", "realtime_protocols", [], true), { prop: "supportsAttachments", json: "supports_attachments", from: (value) => value === true, default: () => false }, sl("accepts", "accepts", [], true)] });
922
934
  export const ThreadCleared = makeMessageClass({ type: agentThreadClearedType, base: "thread", fields: [s("sourceMessageId", "source_message_id", true)] });
923
935
  export const TurnStartAccepted = makeMessageClass({ type: agentTurnStartAcceptedType, base: "thread", fields: [s("turnId"), s("sourceMessageId", "source_message_id", true), contentList("content")] });
924
936
  export const TurnStartRejected = makeMessageClass({ type: agentTurnStartRejectedType, base: "thread", fields: [s("sourceMessageId", "source_message_id", true), obj("error", "error", AgentError.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, 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;
@@ -78,6 +80,7 @@ export declare class ChatThreadStartResult {
78
80
  export declare abstract class BaseChatClient extends ChangeEmitter {
79
81
  private readonly sessionsByPath;
80
82
  private readonly pendingStartRequests;
83
+ private readonly pendingSessionEventsByPath;
81
84
  private readonly eventQueue;
82
85
  private _connectionStatus?;
83
86
  get events(): AsyncIterable<AgentMessageEvent>;
@@ -88,16 +91,19 @@ export declare abstract class BaseChatClient extends ChangeEmitter {
88
91
  agentParticipant(): RemoteParticipant | null;
89
92
  localParticipantName(): string | undefined;
90
93
  protected cleanParticipantName(value: string | undefined): string | undefined;
91
- openThread(threadPath: string, { load, sinceTurn, reloadIfOpen }?: {
94
+ openThread(threadPath: string, { load, sinceTurn, reloadIfOpen, drainPendingEvents, }?: {
92
95
  load?: boolean;
93
96
  sinceTurn?: string;
94
97
  reloadIfOpen?: boolean;
98
+ drainPendingEvents?: boolean;
95
99
  }): ChatThreadSession;
96
- startThread({ messageId, message, attachments, name, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, omitContent, }: {
100
+ private openSession;
101
+ startThread({ messageId, message, attachments, name, backend, provider, model, voice, outputModalities, realtimeProtocol, senderName, clientToolkits, toolChoice, omitContent, }: {
97
102
  messageId?: string;
98
103
  message: string;
99
104
  attachments: string[];
100
105
  name?: string;
106
+ backend?: string;
101
107
  provider?: string;
102
108
  model?: string;
103
109
  voice?: string;
@@ -105,13 +111,17 @@ export declare abstract class BaseChatClient extends ChangeEmitter {
105
111
  realtimeProtocol?: string;
106
112
  senderName?: string;
107
113
  clientToolkits?: ClientToolkitDescription[];
114
+ toolChoice?: ToolChoice;
108
115
  omitContent?: boolean;
109
116
  }): Promise<ChatThreadStartResult>;
117
+ private resolvedStartThreadMessage;
110
118
  abstract sendAgentMessage(message: AgentMessage, options?: {
111
119
  attachment?: Uint8Array;
112
120
  ignoreOffline?: boolean;
113
121
  }): Promise<void>;
114
- handleAgentMessage(message: AgentMessage, { attachment }?: {
122
+ private drainPendingSessionEvents;
123
+ handleAgentMessage(message: AgentMessage, { createdAt, attachment }?: {
124
+ createdAt?: Date;
115
125
  attachment?: Uint8Array;
116
126
  }): void;
117
127
  emitConnectionStatus({ status, message, reason, retryDelay, }: {
@@ -126,9 +136,7 @@ export declare class MessagingChatClient extends BaseChatClient {
126
136
  readonly room: RoomClient;
127
137
  readonly agentName?: string;
128
138
  private readonly pendingParticipantWaits;
129
- private readonly roomAbortController;
130
139
  private started;
131
- private roomPump?;
132
140
  constructor({ room, agentName }: {
133
141
  room: RoomClient;
134
142
  agentName?: string;
@@ -145,17 +153,24 @@ export declare class MessagingChatClient extends BaseChatClient {
145
153
  ignoreOffline?: boolean;
146
154
  }): Promise<void>;
147
155
  private readonly onMessagingChanged;
148
- private consumeRoomEvents;
149
- private onRoomEvent;
156
+ private readonly onMessagingMessage;
150
157
  }
151
158
  export declare class ChatThreadSession extends ChangeEmitter {
152
159
  private readonly client;
153
160
  readonly threadPath: string;
154
161
  private readonly _messages;
162
+ private readonly messageIndexes;
163
+ private readonly localAgentMessageIds;
164
+ private readonly pendingLocalInputMessageIds;
165
+ private readonly mergedDeltaMessageIds;
155
166
  private readonly pendingInputsById;
156
167
  private openState;
157
168
  private loadStateValue;
158
169
  private lastCompletedTurnIdValue?;
170
+ private activeTurnIdValue?;
171
+ private threadStatusValue?;
172
+ private currentModelValue?;
173
+ private modelsResponseValue?;
159
174
  private lastAgentMessageType?;
160
175
  private lastAgentMessageAt?;
161
176
  constructor({ client, threadPath }: {
@@ -168,15 +183,21 @@ export declare class ChatThreadSession extends ChangeEmitter {
168
183
  get loadState(): ChatThreadSessionLoadState;
169
184
  get isLoading(): boolean;
170
185
  get lastCompletedTurnId(): string | undefined;
186
+ get activeTurnId(): string | undefined;
187
+ get threadStatus(): InstanceType<typeof AgentThreadStatus> | undefined;
188
+ get currentModel(): InstanceType<typeof AgentModelChanged> | undefined;
189
+ get modelsResponse(): InstanceType<typeof ModelsResponse> | undefined;
171
190
  open({ load, sinceTurn }?: {
172
191
  load?: boolean;
173
192
  sinceTurn?: string;
174
193
  }): Promise<void>;
194
+ private resetReplayState;
175
195
  close(): Promise<void>;
176
196
  requestModels({ ignoreOffline }?: {
177
197
  ignoreOffline?: boolean;
178
198
  }): Promise<void>;
179
- changeModel({ provider, model, voice }: {
199
+ changeModel({ backend, provider, model, voice }: {
200
+ backend?: string;
180
201
  provider: string;
181
202
  model: string;
182
203
  voice?: string;
@@ -187,18 +208,20 @@ export declare class ChatThreadSession extends ChangeEmitter {
187
208
  requestId: string;
188
209
  response: Content;
189
210
  }): Promise<void>;
190
- sendText({ messageId, text, attachments, steer, turnId, provider, model, voice, outputModalities, senderName, clientToolkits, }: {
211
+ sendText({ messageId, text, attachments, steer, turnId, backend, provider, model, voice, outputModalities, senderName, clientToolkits, toolChoice, }: {
191
212
  messageId?: string;
192
213
  text: string;
193
214
  attachments: string[];
194
215
  steer?: boolean;
195
216
  turnId?: string;
217
+ backend?: string;
196
218
  provider?: string;
197
219
  model?: string;
198
220
  voice?: string;
199
221
  outputModalities?: string[];
200
222
  senderName?: string;
201
223
  clientToolkits?: ClientToolkitDescription[];
224
+ toolChoice?: ToolChoice;
202
225
  }): Promise<string>;
203
226
  sendRealtimeAudioChunk({ chunk, format }: {
204
227
  chunk: Uint8Array;
@@ -214,6 +237,14 @@ export declare class ChatThreadSession extends ChangeEmitter {
214
237
  deleteThread(threadPath: string): Promise<void>;
215
238
  renameThread(threadPath: string, name: string): Promise<void>;
216
239
  addAgentMessage(event: AgentMessageEvent): void;
240
+ private updateSessionState;
241
+ private updatePendingInputsForMessage;
242
+ private appendRenderableMessage;
243
+ private appendMessage;
244
+ private upsertItemMessage;
245
+ private appendOrMergeDelta;
246
+ private indexMessagesFrom;
247
+ private applyActiveModel;
217
248
  markClosed({ notify }?: {
218
249
  notify?: boolean;
219
250
  }): void;