@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 +11 -0
- package/dist/browser/agent-messages.d.ts +6 -1
- package/dist/browser/agent-messages.js +12 -5
- package/dist/browser/chat-client.d.ts +12 -5
- package/dist/browser/chat-client.js +115 -16
- package/dist/browser/thread-storage.js +5 -2
- package/dist/esm/agent-messages.d.ts +6 -1
- package/dist/esm/agent-messages.js +8 -1
- package/dist/esm/chat-client.d.ts +12 -5
- package/dist/esm/chat-client.js +116 -17
- package/dist/esm/thread-storage.js +6 -3
- package/dist/node/agent-messages.d.ts +6 -1
- package/dist/node/agent-messages.js +12 -5
- package/dist/node/chat-client.d.ts +12 -5
- package/dist/node/chat-client.js +115 -16
- package/dist/node/thread-storage.js +5 -2
- package/package.json +2 -2
package/dist/esm/chat-client.js
CHANGED
|
@@ -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({
|
|
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
|
-
|
|
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), {
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
4
|
-
exports.
|
|
5
|
-
exports.
|
|
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;
|