@rtsee/messenger-signaling 0.0.108 → 0.0.110

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.
Files changed (147) hide show
  1. package/dist/messenger-signaling/src/index.d.ts +2 -2
  2. package/dist/messenger-signaling/src/index.d.ts.map +1 -1
  3. package/dist/messenger-signaling/src/index.js +2 -2
  4. package/dist/messenger-signaling/src/index.js.map +1 -1
  5. package/dist/messenger-signaling/src/interfaces/RTSeeMessengerSignalingOptions.d.ts +2 -0
  6. package/dist/messenger-signaling/src/interfaces/RTSeeMessengerSignalingOptions.d.ts.map +1 -1
  7. package/dist/messenger-signaling/src/interfaces/index.d.ts +2 -1
  8. package/dist/messenger-signaling/src/interfaces/index.d.ts.map +1 -1
  9. package/dist/messenger-signaling/src/interfaces/index.js +2 -1
  10. package/dist/messenger-signaling/src/interfaces/index.js.map +1 -1
  11. package/dist/messenger-signaling/src/interfaces/ozzy/OzzyOptions.d.ts +12 -0
  12. package/dist/messenger-signaling/src/interfaces/ozzy/OzzyOptions.d.ts.map +1 -0
  13. package/dist/messenger-signaling/src/interfaces/ozzy/OzzyOptions.js +3 -0
  14. package/dist/messenger-signaling/src/interfaces/ozzy/OzzyOptions.js.map +1 -0
  15. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/BedrockConverseConnector.d.ts +7 -0
  16. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/BedrockConverseConnector.d.ts.map +1 -0
  17. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/BedrockConverseConnector.js +3 -0
  18. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/BedrockConverseConnector.js.map +1 -0
  19. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/Connector.d.ts +6 -0
  20. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/Connector.d.ts.map +1 -0
  21. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/Connector.js +3 -0
  22. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/Connector.js.map +1 -0
  23. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/GCloudConverseConnector.d.ts +14 -0
  24. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/GCloudConverseConnector.d.ts.map +1 -0
  25. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/GCloudConverseConnector.js +3 -0
  26. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/GCloudConverseConnector.js.map +1 -0
  27. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/index.d.ts +4 -0
  28. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/index.d.ts.map +1 -0
  29. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/index.js +20 -0
  30. package/dist/messenger-signaling/src/interfaces/ozzy/connectors/index.js.map +1 -0
  31. package/dist/messenger-signaling/src/interfaces/ozzy/index.d.ts +6 -0
  32. package/dist/messenger-signaling/src/interfaces/ozzy/index.d.ts.map +1 -0
  33. package/dist/messenger-signaling/src/interfaces/ozzy/index.js +22 -0
  34. package/dist/messenger-signaling/src/interfaces/ozzy/index.js.map +1 -0
  35. package/dist/messenger-signaling/src/interfaces/ozzy/messages/Flow.d.ts +7 -0
  36. package/dist/messenger-signaling/src/interfaces/ozzy/messages/Flow.d.ts.map +1 -0
  37. package/dist/messenger-signaling/src/interfaces/ozzy/messages/Flow.js +3 -0
  38. package/dist/messenger-signaling/src/interfaces/ozzy/messages/Flow.js.map +1 -0
  39. package/dist/messenger-signaling/src/interfaces/ozzy/messages/Message.d.ts +6 -0
  40. package/dist/messenger-signaling/src/interfaces/ozzy/messages/Message.d.ts.map +1 -0
  41. package/dist/messenger-signaling/src/interfaces/ozzy/messages/Message.js +3 -0
  42. package/dist/messenger-signaling/src/interfaces/ozzy/messages/Message.js.map +1 -0
  43. package/dist/messenger-signaling/src/interfaces/ozzy/messages/index.d.ts +3 -0
  44. package/dist/messenger-signaling/src/interfaces/ozzy/messages/index.d.ts.map +1 -0
  45. package/dist/messenger-signaling/src/interfaces/ozzy/messages/index.js +19 -0
  46. package/dist/messenger-signaling/src/interfaces/ozzy/messages/index.js.map +1 -0
  47. package/dist/messenger-signaling/src/interfaces/ozzy/tasks/Task.d.ts +41 -0
  48. package/dist/messenger-signaling/src/interfaces/ozzy/tasks/Task.d.ts.map +1 -0
  49. package/dist/messenger-signaling/src/interfaces/ozzy/tasks/Task.js +3 -0
  50. package/dist/messenger-signaling/src/interfaces/ozzy/tasks/Task.js.map +1 -0
  51. package/dist/messenger-signaling/src/interfaces/ozzy/tasks/index.d.ts +2 -0
  52. package/dist/messenger-signaling/src/interfaces/ozzy/tasks/index.d.ts.map +1 -0
  53. package/dist/messenger-signaling/src/interfaces/ozzy/tasks/index.js +18 -0
  54. package/dist/messenger-signaling/src/interfaces/ozzy/tasks/index.js.map +1 -0
  55. package/dist/messenger-signaling/src/interfaces/ozzy/tools/Tool.d.ts +11 -0
  56. package/dist/messenger-signaling/src/interfaces/ozzy/tools/Tool.d.ts.map +1 -0
  57. package/dist/messenger-signaling/src/interfaces/ozzy/tools/Tool.js +3 -0
  58. package/dist/messenger-signaling/src/interfaces/ozzy/tools/Tool.js.map +1 -0
  59. package/dist/messenger-signaling/src/interfaces/ozzy/tools/index.d.ts +2 -0
  60. package/dist/messenger-signaling/src/interfaces/ozzy/tools/index.d.ts.map +1 -0
  61. package/dist/messenger-signaling/src/interfaces/ozzy/tools/index.js +18 -0
  62. package/dist/messenger-signaling/src/interfaces/ozzy/tools/index.js.map +1 -0
  63. package/dist/messenger-signaling/src/models/RTSeeMessengerSignaling.d.ts +63 -16
  64. package/dist/messenger-signaling/src/models/RTSeeMessengerSignaling.d.ts.map +1 -1
  65. package/dist/messenger-signaling/src/models/RTSeeMessengerSignaling.js +628 -164
  66. package/dist/messenger-signaling/src/models/RTSeeMessengerSignaling.js.map +1 -1
  67. package/dist/messenger-signaling/src/models/handlers.d.ts +23 -0
  68. package/dist/messenger-signaling/src/models/handlers.d.ts.map +1 -1
  69. package/dist/messenger-signaling/src/models/handlers.js +214 -24
  70. package/dist/messenger-signaling/src/models/handlers.js.map +1 -1
  71. package/dist/messenger-signaling/src/models/index.d.ts +3 -2
  72. package/dist/messenger-signaling/src/models/index.d.ts.map +1 -1
  73. package/dist/messenger-signaling/src/models/index.js +3 -2
  74. package/dist/messenger-signaling/src/models/index.js.map +1 -1
  75. package/dist/messenger-signaling/src/models/ozzy/Ozzy.d.ts +70 -0
  76. package/dist/messenger-signaling/src/models/ozzy/Ozzy.d.ts.map +1 -0
  77. package/dist/messenger-signaling/src/models/ozzy/Ozzy.js +166 -0
  78. package/dist/messenger-signaling/src/models/ozzy/Ozzy.js.map +1 -0
  79. package/dist/messenger-signaling/src/models/ozzy/connectors/BedrockConverseConnector.d.ts +29 -0
  80. package/dist/messenger-signaling/src/models/ozzy/connectors/BedrockConverseConnector.d.ts.map +1 -0
  81. package/dist/messenger-signaling/src/models/ozzy/connectors/BedrockConverseConnector.js +278 -0
  82. package/dist/messenger-signaling/src/models/ozzy/connectors/BedrockConverseConnector.js.map +1 -0
  83. package/dist/messenger-signaling/src/models/ozzy/connectors/GCloudConverseConnector.d.ts +57 -0
  84. package/dist/messenger-signaling/src/models/ozzy/connectors/GCloudConverseConnector.d.ts.map +1 -0
  85. package/dist/messenger-signaling/src/models/ozzy/connectors/GCloudConverseConnector.js +502 -0
  86. package/dist/messenger-signaling/src/models/ozzy/connectors/GCloudConverseConnector.js.map +1 -0
  87. package/dist/messenger-signaling/src/models/ozzy/connectors/LLMConverseStream.d.ts +53 -0
  88. package/dist/messenger-signaling/src/models/ozzy/connectors/LLMConverseStream.d.ts.map +1 -0
  89. package/dist/messenger-signaling/src/models/ozzy/connectors/LLMConverseStream.js +77 -0
  90. package/dist/messenger-signaling/src/models/ozzy/connectors/LLMConverseStream.js.map +1 -0
  91. package/dist/messenger-signaling/src/models/ozzy/connectors/LlmConverseConnector.d.ts +39 -0
  92. package/dist/messenger-signaling/src/models/ozzy/connectors/LlmConverseConnector.d.ts.map +1 -0
  93. package/dist/messenger-signaling/src/models/ozzy/connectors/LlmConverseConnector.js +94 -0
  94. package/dist/messenger-signaling/src/models/ozzy/connectors/LlmConverseConnector.js.map +1 -0
  95. package/dist/messenger-signaling/src/models/ozzy/connectors/index.d.ts +5 -0
  96. package/dist/messenger-signaling/src/models/ozzy/connectors/index.d.ts.map +1 -0
  97. package/dist/messenger-signaling/src/models/ozzy/connectors/index.js +21 -0
  98. package/dist/messenger-signaling/src/models/ozzy/connectors/index.js.map +1 -0
  99. package/dist/messenger-signaling/src/models/ozzy/index.d.ts +6 -0
  100. package/dist/messenger-signaling/src/models/ozzy/index.d.ts.map +1 -0
  101. package/dist/messenger-signaling/src/models/ozzy/index.js +22 -0
  102. package/dist/messenger-signaling/src/models/ozzy/index.js.map +1 -0
  103. package/dist/messenger-signaling/src/models/ozzy/tasks/StoryCreatorTask.d.ts +36 -0
  104. package/dist/messenger-signaling/src/models/ozzy/tasks/StoryCreatorTask.d.ts.map +1 -0
  105. package/dist/messenger-signaling/src/models/ozzy/tasks/StoryCreatorTask.js +151 -0
  106. package/dist/messenger-signaling/src/models/ozzy/tasks/StoryCreatorTask.js.map +1 -0
  107. package/dist/messenger-signaling/src/models/ozzy/tasks/Task.d.ts +52 -0
  108. package/dist/messenger-signaling/src/models/ozzy/tasks/Task.d.ts.map +1 -0
  109. package/dist/messenger-signaling/src/models/ozzy/tasks/Task.js +202 -0
  110. package/dist/messenger-signaling/src/models/ozzy/tasks/Task.js.map +1 -0
  111. package/dist/messenger-signaling/src/models/ozzy/tasks/TasksManager.d.ts +45 -0
  112. package/dist/messenger-signaling/src/models/ozzy/tasks/TasksManager.d.ts.map +1 -0
  113. package/dist/messenger-signaling/src/models/ozzy/tasks/TasksManager.js +145 -0
  114. package/dist/messenger-signaling/src/models/ozzy/tasks/TasksManager.js.map +1 -0
  115. package/dist/messenger-signaling/src/models/ozzy/tasks/index.d.ts +4 -0
  116. package/dist/messenger-signaling/src/models/ozzy/tasks/index.d.ts.map +1 -0
  117. package/dist/messenger-signaling/src/models/ozzy/tasks/index.js +20 -0
  118. package/dist/messenger-signaling/src/models/ozzy/tasks/index.js.map +1 -0
  119. package/dist/messenger-signaling/src/models/ozzy/tools/entities.d.ts +4 -0
  120. package/dist/messenger-signaling/src/models/ozzy/tools/entities.d.ts.map +1 -0
  121. package/dist/messenger-signaling/src/models/ozzy/tools/entities.js +155 -0
  122. package/dist/messenger-signaling/src/models/ozzy/tools/entities.js.map +1 -0
  123. package/dist/messenger-signaling/src/models/ozzy/tools/index.d.ts +4 -0
  124. package/dist/messenger-signaling/src/models/ozzy/tools/index.d.ts.map +1 -0
  125. package/dist/messenger-signaling/src/models/ozzy/tools/index.js +20 -0
  126. package/dist/messenger-signaling/src/models/ozzy/tools/index.js.map +1 -0
  127. package/dist/messenger-signaling/src/models/ozzy/tools/stories.d.ts +4 -0
  128. package/dist/messenger-signaling/src/models/ozzy/tools/stories.d.ts.map +1 -0
  129. package/dist/messenger-signaling/src/models/ozzy/tools/stories.js +269 -0
  130. package/dist/messenger-signaling/src/models/ozzy/tools/stories.js.map +1 -0
  131. package/dist/messenger-signaling/src/models/ozzy/tools/tags.d.ts +4 -0
  132. package/dist/messenger-signaling/src/models/ozzy/tools/tags.d.ts.map +1 -0
  133. package/dist/messenger-signaling/src/models/ozzy/tools/tags.js +166 -0
  134. package/dist/messenger-signaling/src/models/ozzy/tools/tags.js.map +1 -0
  135. package/dist/messenger-signaling/src/models/ozzy/workflows/WorkflowsManager.d.ts +39 -0
  136. package/dist/messenger-signaling/src/models/ozzy/workflows/WorkflowsManager.d.ts.map +1 -0
  137. package/dist/messenger-signaling/src/models/ozzy/workflows/WorkflowsManager.js +235 -0
  138. package/dist/messenger-signaling/src/models/ozzy/workflows/WorkflowsManager.js.map +1 -0
  139. package/dist/messenger-signaling/src/models/ozzy/workflows/index.d.ts +3 -0
  140. package/dist/messenger-signaling/src/models/ozzy/workflows/index.d.ts.map +1 -0
  141. package/dist/messenger-signaling/src/models/ozzy/workflows/index.js +19 -0
  142. package/dist/messenger-signaling/src/models/ozzy/workflows/index.js.map +1 -0
  143. package/dist/messenger-signaling/src/models/ozzy/workflows/storyteller.d.ts +10 -0
  144. package/dist/messenger-signaling/src/models/ozzy/workflows/storyteller.d.ts.map +1 -0
  145. package/dist/messenger-signaling/src/models/ozzy/workflows/storyteller.js +37 -0
  146. package/dist/messenger-signaling/src/models/ozzy/workflows/storyteller.js.map +1 -0
  147. package/package.json +11 -4
@@ -1,22 +1,17 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
2
  Object.defineProperty(exports, "__esModule", { value: true });
12
3
  exports.RTSeeMessengerSignaling = void 0;
13
4
  const signaling_1 = require("@rtsee/signaling");
14
5
  const common_1 = require("@rtsee/common");
15
6
  const live_storage_1 = require("@rtsee/live-storage");
16
7
  const messenger_signaling_1 = require("@rtsee/messenger-signaling");
8
+ const LLMConverseStream_js_1 = require("./ozzy/connectors/LLMConverseStream.js");
17
9
  const core_1 = require("@rtsee/core");
18
- const DEFAULT_LIMIT = 20;
10
+ const CHAT_ROOM_PREFIX = 'messenger-chat';
19
11
  class RTSeeMessengerSignaling extends signaling_1.RTSeeSignalingBase {
12
+ storage;
13
+ handlers;
14
+ ozzy;
20
15
  constructor(options) {
21
16
  super(options);
22
17
  if (options.storageHandlers) {
@@ -28,174 +23,667 @@ class RTSeeMessengerSignaling extends signaling_1.RTSeeSignalingBase {
28
23
  this.storage = new live_storage_1.RTSeeMessengerStorage();
29
24
  }
30
25
  this.handlers = (0, messenger_signaling_1.getMessengerHandlers)(this.storage);
26
+ this.attachChatRoomsJoining();
27
+ if (options.ozzy) {
28
+ this.ozzy = options.ozzy;
29
+ this.ozzy.attachBridge({
30
+ emitToChat: (transport, chatId, event, data) => this.emitToChatRoom(transport, chatId, event, data),
31
+ getChatMember: (transport, chatId, memberId) => this.storage.getChatMember(transport, { chatId, memberId }),
32
+ });
33
+ }
31
34
  }
32
35
  onAfterConnected(socket) {
36
+ // --- Peer ---
33
37
  socket.on(common_1.RTSeeMessengerEvents.GET_PEER, (peerId, requestId) => this.handlers.getPeer.run(socket, requestId, peerId));
34
38
  socket.on(common_1.RTSeeMessengerEvents.UPDATE_PEER, (peer, requestId) => this.handlers.updatePeer.run(socket, requestId, peer));
35
- socket.on(common_1.RTSeeMessengerEvents.CREATE_CHAT, (chat) => void this.handleCreateChat(socket, chat));
36
- socket.on(common_1.RTSeeMessengerEvents.OUTGOING_MESSAGE, (message) => void this.handleOutgoingMessage(socket, message));
37
- socket.on(common_1.RTSeeMessengerEvents.GET_CHATS, (options) => void this.handleGetChats(socket, options));
38
- socket.on(common_1.RTSeeMessengerEvents.GET_CHAT, (options) => void this.handleGetChat(socket, options));
39
- socket.on(common_1.RTSeeMessengerEvents.GET_MESSAGES, (options) => void this.handleGetMessages(socket, options));
40
- socket.on(common_1.RTSeeMessengerEvents.MESSAGE_RECEIVED, (options) => void this.handleMessageReceived(socket, options));
41
- socket.on(common_1.RTSeeMessengerEvents.INCOMING_MESSAGES_SEEN, (options) => void this.handleMessageSeen(socket, options));
42
- socket.on(common_1.RTSeeMessengerEvents.SEARCH, (options) => void this.handleSearch(socket, options));
43
- }
44
- handleCreateChat(socket, chatOptions) {
45
- return __awaiter(this, void 0, void 0, function* () {
46
- if (!socket.rtseePeer) {
47
- console.log("Peer is not yet initialized, can not create chats!");
39
+ // --- Chats ---
40
+ socket.on(common_1.RTSeeMessengerEvents.GET_CHATS, (options, requestId) => this.handlers.getChats.run(socket, requestId, options));
41
+ socket.on(common_1.RTSeeMessengerEvents.GET_CHAT, (options, requestId) => this.handlers.getChat.run(socket, requestId, options));
42
+ socket.on(common_1.RTSeeMessengerEvents.CREATE_CHAT, (options, requestId) => this.handleCreateChat(socket, requestId, options));
43
+ socket.on(common_1.RTSeeMessengerEvents.EDIT_CHAT, (options, requestId) => this.handleEditChat(socket, requestId, options));
44
+ socket.on(common_1.RTSeeMessengerEvents.DELETE_CHAT, (chatId, requestId) => this.handleDeleteChat(socket, requestId, chatId));
45
+ // --- Messages ---
46
+ socket.on(common_1.RTSeeMessengerEvents.GET_MESSAGES, (options, requestId) => this.handlers.getMessages.run(socket, requestId, options));
47
+ socket.on(common_1.RTSeeMessengerEvents.SEND_MESSAGE, (message, requestId) => this.handleSendMessage(socket, requestId, message));
48
+ // --- Message Status ---
49
+ socket.on(common_1.RTSeeMessengerEvents.MESSAGE_RECEIVED, (options, requestId) => this.handleMessageReceived(socket, requestId, options));
50
+ socket.on(common_1.RTSeeMessengerEvents.INCOMING_MESSAGES_SEEN, (options, requestId) => this.handleMessageSeen(socket, requestId, options));
51
+ // --- Search ---
52
+ socket.on(common_1.RTSeeMessengerEvents.SEARCH, (options, requestId) => this.handlers.search.run(socket, requestId, options));
53
+ // --- Chat Members ---
54
+ socket.on(common_1.RTSeeMessengerEvents.GET_CHAT_MEMBERS, (options, requestId) => this.handlers.getChatMembers.run(socket, requestId, options));
55
+ socket.on(common_1.RTSeeMessengerEvents.GET_CHAT_MEMBER, (options, requestId) => this.handlers.getChatMember.run(socket, requestId, options));
56
+ socket.on(common_1.RTSeeMessengerEvents.ADD_CHAT_MEMBER, (options, requestId) => this.handleAddChatMember(socket, requestId, options));
57
+ socket.on(common_1.RTSeeMessengerEvents.EDIT_CHAT_MEMBER, (options, requestId) => this.handleEditChatMember(socket, requestId, options));
58
+ socket.on(common_1.RTSeeMessengerEvents.REMOVE_CHAT_MEMBER, (options, requestId) => this.handleRemoveChatMember(socket, requestId, options));
59
+ socket.on(common_1.RTSeeMessengerEvents.GET_CHAT_INVITATION_LINK, (options, requestId) => this.handlers.getChatMember.run(socket, requestId, options));
60
+ socket.on(common_1.RTSeeMessengerEvents.GET_CHAT_INVITATION_LINK, (options, requestId) => this.handlers.getChatInvitationLink.run(socket, requestId, options));
61
+ socket.on(common_1.RTSeeMessengerEvents.JOIN_CHAT_BY_TOKEN, (token, requestId) => this.handlers.joinChatByToken.run(socket, requestId, token));
62
+ // --- Agent Streaming ---
63
+ socket.on(common_1.RTSeeMessengerEvents.ABORT_AGENT_STREAM, async (data) => {
64
+ if (!socket.rtseePeer || !this.ozzy) {
48
65
  return;
49
66
  }
50
- const createChatOptions = Object.assign(Object.assign({}, chatOptions), { creatorId: socket.rtseePeer.clientId });
51
- const peers = this.storage.isLocalProcessor
52
- ? {
53
- creator: this.getChatMemberByPeerId(socket.rtseePeer.clientId),
54
- members: this.getChatMembersByPeerIds(chatOptions.membersIds),
55
- }
56
- : null;
57
- return yield this.storage.processChat((0, core_1.socketPeerToTransport)(socket, peers || undefined), createChatOptions);
58
- });
59
- }
60
- handleOutgoingMessage(socket, message) {
61
- return __awaiter(this, void 0, void 0, function* () {
62
- if (!socket.rtseePeer) {
63
- console.log("Peer is not yet initialized, can not send messages!");
64
- return;
67
+ try {
68
+ const transport = (0, core_1.socketPeerToTransport)(socket);
69
+ // Abort the LLM flow
70
+ this.ozzy.abortFlow(data.flowId);
71
+ // Save the partial response as a message from the agent
72
+ // (the streaming text was accumulated client-side)
73
+ // Send stop-widget message from the aborter
74
+ const stopMessage = await this.storage.processMessage(transport, {
75
+ from: socket.rtseePeer.clientId,
76
+ chatId: data.chatId,
77
+ text: '',
78
+ widget: 'rtsee-agent-stopped',
79
+ });
80
+ // Broadcast stop message + stream end
81
+ void this.emitEventToChatId(transport, data.chatId, common_1.RTSeeMessengerEvents.INCOMING_MESSAGE, stopMessage);
82
+ void this.emitEventToChatId(transport, data.chatId, common_1.RTSeeMessengerEvents.AGENT_STREAM_END, { chatId: data.chatId });
65
83
  }
66
- yield this.sendMessage((0, core_1.socketPeerToTransport)(socket), message);
67
- });
68
- }
69
- handleGetChats(socket, options) {
70
- return __awaiter(this, void 0, void 0, function* () {
71
- if (!socket.rtseePeer) {
72
- console.log("Peer is not yet initialized, can not send messages!");
73
- return;
84
+ catch (e) {
85
+ console.error('Failed to abort agent stream:', e);
74
86
  }
75
- const result = yield this.storage.getChats((0, core_1.socketPeerToTransport)(socket), {
76
- clientId: socket.rtseePeer.clientId,
77
- limit: options.limit | DEFAULT_LIMIT,
78
- offset: options.offset | 0,
79
- });
80
- socket.emit(common_1.RTSeeMessengerEvents.CHATS_FETCHED, result);
81
87
  });
82
- }
83
- handleGetChat(socket, options) {
84
- return __awaiter(this, void 0, void 0, function* () {
85
- if (!socket.rtseePeer) {
86
- console.log("Peer is not yet initialized, can not send messages!");
88
+ // --- Tool Use Approval Response (client → server) ---
89
+ socket.on(common_1.RTSeeMessengerEvents.TOOL_USE_REQUEST_RESPONSE, (data) => {
90
+ if (!socket.rtseePeer || !this.ozzy) {
87
91
  return;
88
92
  }
89
- const result = yield this.storage.getChat((0, core_1.socketPeerToTransport)(socket), {
90
- chatId: options.id,
93
+ this.ozzy.handleToolUseResponse(data.flowId, {
94
+ toolUseId: data.toolUseId,
95
+ granted: data.granted,
91
96
  });
92
- socket.emit(common_1.RTSeeMessengerEvents.CHAT_FETCHED, result);
93
97
  });
98
+ // --- Ozzy Workflows & Tasks ---
99
+ if (this.ozzy) {
100
+ this.attachOzzyEvents(socket);
101
+ }
94
102
  }
95
- handleGetMessages(socket, options) {
96
- return __awaiter(this, void 0, void 0, function* () {
97
- let result;
98
- if (!socket.rtseePeer) {
99
- console.log("Peer is not yet initialized, can not send messages!");
103
+ /**
104
+ * Create chat: run handler, then auto-send a welcome message from the creator.
105
+ */
106
+ async handleCreateChat(socket, requestId, options) {
107
+ if (!socket.rtseePeer) {
108
+ return;
109
+ }
110
+ let createdChat = null;
111
+ if (!options.membersIds) {
112
+ options.membersIds = [socket.rtseePeer.clientId];
113
+ }
114
+ try {
115
+ const transport = (0, core_1.socketPeerToTransport)(socket);
116
+ createdChat = await this.storage.processChat(transport, {
117
+ ...options,
118
+ creatorId: socket.rtseePeer.clientId || options.creatorId,
119
+ });
120
+ if (!createdChat) {
121
+ this.handlers.createChat.onError({
122
+ socketPeer: socket,
123
+ requestId,
124
+ payload: options,
125
+ error: new Error('Chat creation returned null'),
126
+ eventName: `${common_1.RTSeeMessengerEvents.CREATE_CHAT}-failure-${requestId}`,
127
+ });
100
128
  return;
101
129
  }
102
- if (this.storage.getMessages) {
103
- result = yield this.storage.getMessages((0, core_1.socketPeerToTransport)(socket), {
104
- chatId: options.chatId,
105
- limit: options.limit | DEFAULT_LIMIT,
106
- offset: options.offset | 0,
107
- lastLoadedMessageId: options.lastLoadedMessageId || null,
108
- direction: options.direction,
130
+ this.handlers.createChat.onSuccess({
131
+ socketPeer: socket,
132
+ requestId,
133
+ data: createdChat,
134
+ eventName: `${common_1.RTSeeMessengerEvents.CREATE_CHAT}-success-${requestId}`,
135
+ });
136
+ void this.joinChatRoom((0, core_1.socketPeerToTransport)(socket), createdChat.id);
137
+ }
138
+ catch (e) {
139
+ this.handlers.createChat.onError({
140
+ socketPeer: socket,
141
+ requestId,
142
+ payload: options,
143
+ error: e,
144
+ eventName: `${common_1.RTSeeMessengerEvents.CREATE_CHAT}-failure-${requestId}`,
145
+ });
146
+ return;
147
+ }
148
+ // Auto-send a welcome message from the creator (separate try-catch
149
+ // so a failure here does not emit a duplicate error after success).
150
+ try {
151
+ const transport = (0, core_1.socketPeerToTransport)(socket);
152
+ const peerName = socket.rtseePeer.name || socket.rtseePeer.clientId;
153
+ const welcomeMessage = await this.storage.processMessage(transport, {
154
+ from: socket.rtseePeer.clientId,
155
+ chatId: createdChat.id,
156
+ text: `${peerName} created a chat.`,
157
+ });
158
+ if (welcomeMessage) {
159
+ const ids = await this.storage.getChatPeersIds(transport, createdChat.id);
160
+ ids.forEach((id) => {
161
+ if (id !== transport.peer.clientId) {
162
+ this.sendToIndividualRoom({ peer: { clientId: id, rtseeAppId: transport.peer.rtseeAppId } }, common_1.RTSeeMessengerEvents.INCOMING_MESSAGE, welcomeMessage);
163
+ }
109
164
  });
110
165
  }
111
- else {
112
- result = {
113
- chatId: options.chatId,
114
- messages: [],
115
- unreadCount: 0,
116
- direction: options.direction,
117
- };
118
- }
119
- socket.emit(common_1.RTSeeMessengerEvents.MESSAGES_FETCHED, result);
120
- });
166
+ }
167
+ catch (e) {
168
+ console.error('Failed to send welcome message for new chat:', e?.message);
169
+ }
121
170
  }
122
- handleMessageReceived(socket, options) {
123
- return __awaiter(this, void 0, void 0, function* () {
124
- if (!socket.rtseePeer) {
125
- console.log("Peer is not yet initialized, can not send messages!");
126
- return;
171
+ /**
172
+ * Send message: run handler, then broadcast INCOMING_MESSAGE to other chat members.
173
+ */
174
+ async handleSendMessage(socket, requestId, message) {
175
+ if (!socket.rtseePeer) {
176
+ console.log("Peer is not yet initialized, can not send messages!");
177
+ return;
178
+ }
179
+ try {
180
+ const transport = (0, core_1.socketPeerToTransport)(socket);
181
+ const savedMessage = await this.storage.processMessage(transport, message);
182
+ // Respond to sender with the saved message
183
+ this.handlers.sendMessage.onSuccess({
184
+ socketPeer: socket,
185
+ requestId,
186
+ data: savedMessage,
187
+ eventName: `${common_1.RTSeeMessengerEvents.SEND_MESSAGE}-success-${requestId}`,
188
+ });
189
+ // Broadcast INCOMING_MESSAGE to other chat members
190
+ const ids = await this.storage.getChatPeersIds(transport, savedMessage.chatId);
191
+ ids.forEach((id) => {
192
+ if (id !== transport.peer.clientId) {
193
+ this.sendToIndividualRoom({ peer: { clientId: id, rtseeAppId: transport.peer.rtseeAppId } }, common_1.RTSeeMessengerEvents.INCOMING_MESSAGE, savedMessage);
194
+ }
195
+ });
196
+ // --- Agent Detection & Ozzy Dispatch ---
197
+ if (this.ozzy && savedMessage.to) {
198
+ try {
199
+ await this.dispatchToAgent(socket, transport, savedMessage);
200
+ }
201
+ catch (agentError) {
202
+ console.error('Failed to dispatch agent message:', agentError);
203
+ }
127
204
  }
128
- yield this.storage.processMessagesReceivedEvent((0, core_1.socketPeerToTransport)(socket), options);
129
- const groups = this.groupBySender(options.messages);
130
- groups.forEach((g) => {
131
- this.sendToIndividualRoom({
132
- peer: {
133
- clientId: g.senderId,
134
- rtseeAppId: socket.rtseePeer.rtseeAppId,
135
- },
136
- }, common_1.RTSeeMessengerEvents.MESSAGE_RECEIVED, g);
205
+ }
206
+ catch (e) {
207
+ this.handlers.sendMessage.onError({
208
+ socketPeer: socket,
209
+ requestId,
210
+ payload: message,
211
+ error: e,
212
+ eventName: `${common_1.RTSeeMessengerEvents.SEND_MESSAGE}-failure-${requestId}`,
137
213
  });
138
- });
214
+ }
139
215
  }
140
- handleMessageSeen(socket, options) {
141
- return __awaiter(this, void 0, void 0, function* () {
142
- if (!socket.rtseePeer) {
143
- console.log("Peer is not yet initialized, can not send messages!");
144
- return;
145
- }
146
- if (this.storage.processMessagesSeenEvent) {
147
- yield this.storage.processMessagesSeenEvent((0, core_1.socketPeerToTransport)(socket), options);
148
- }
149
- const groups = this.groupBySender(options.messages);
150
- groups.forEach((g) => {
151
- this.sendToIndividualRoom({
152
- peer: {
153
- clientId: g.senderId,
154
- rtseeAppId: socket.rtseePeer.rtseeAppId,
155
- },
156
- }, common_1.RTSeeMessengerEvents.INCOMING_MESSAGES_SEEN, g);
216
+ /**
217
+ * If the message targets an agent member, start an LLM stream via Ozzy.
218
+ * Relays text chunks to all chat members, then saves the assembled response.
219
+ */
220
+ async dispatchToAgent(socket, transport, message) {
221
+ // Look up the target member
222
+ let targetMember = null;
223
+ if (this.storage.getChatMember) {
224
+ targetMember = await this.storage.getChatMember(transport, {
225
+ chatId: message.chatId,
226
+ memberId: message.to,
227
+ });
228
+ }
229
+ if (!targetMember || !targetMember.isAgent) {
230
+ return;
231
+ }
232
+ const canCallAgents = (0, core_1.hasPermission)(transport.peer, core_1.RTSeePeerPermissions.ADMINISTER_STORIES);
233
+ if (!canCallAgents) {
234
+ socket.emit(common_1.RTSeeMessengerEvents.AGENT_ACCESS_DENIED, {
235
+ chatId: message.chatId,
236
+ });
237
+ return;
238
+ }
239
+ const agentMember = targetMember;
240
+ const flowId = core_1.RTSeeCore.uuidv4();
241
+ // Broadcast AGENT_STREAM_START to all chat members
242
+ void this.emitEventToChatId(transport, message.chatId, common_1.RTSeeMessengerEvents.AGENT_STREAM_START, { chatId: message.chatId, flowId, agentId: agentMember.id });
243
+ socket.emit(common_1.RTSeeMessengerEvents.AGENT_STREAM_START, {
244
+ chatId: message.chatId, flowId, agentId: agentMember.id,
245
+ });
246
+ // Relay text chunks from LLM to all chat members
247
+ let accumulatedText = '';
248
+ let streamCost = null;
249
+ const generatedImages = [];
250
+ // ozzy.send() returns the LLMConverseStream directly — subscribe to it
251
+ const stream = this.ozzy.send(flowId, message.text, agentMember.agentConfiguration.systemPrompt, transport, agentMember.agentConfiguration.model.model, undefined, agentMember.id);
252
+ stream.on(LLMConverseStream_js_1.StreamEvents.TEXT_CHUNK, (chunkData) => {
253
+ accumulatedText += chunkData.text;
254
+ void this.emitEventToChatId(transport, message.chatId, common_1.RTSeeMessengerEvents.AGENT_TEXT_CHUNK, { chatId: message.chatId, flowId, text: chunkData.text });
255
+ socket.emit(common_1.RTSeeMessengerEvents.AGENT_TEXT_CHUNK, {
256
+ chatId: message.chatId, flowId, text: chunkData.text,
157
257
  });
158
258
  });
159
- }
160
- handleSearch(socket, options) {
161
- return __awaiter(this, void 0, void 0, function* () {
162
- if (!this.storage.processSearch) {
163
- return false;
259
+ stream.on(LLMConverseStream_js_1.StreamEvents.COST, (cost) => {
260
+ streamCost = cost;
261
+ });
262
+ stream.on(LLMConverseStream_js_1.StreamEvents.IMAGE_GENERATED, (imageData) => {
263
+ generatedImages.push({
264
+ name: `generated-${generatedImages.length + 1}`,
265
+ url: imageData.url,
266
+ });
267
+ });
268
+ stream.on(LLMConverseStream_js_1.StreamEvents.TOOL_USE_REQUEST, (request) => {
269
+ const toolRequestPayload = {
270
+ chatId: message.chatId,
271
+ flowId,
272
+ toolUseId: request.toolUseId,
273
+ params: request.params,
274
+ agentId: request.agentId,
275
+ createdAt: request.createdAt,
276
+ };
277
+ void this.emitEventToChatId(transport, message.chatId, common_1.RTSeeMessengerEvents.TOOL_USE_REQUEST, toolRequestPayload);
278
+ socket.emit(common_1.RTSeeMessengerEvents.TOOL_USE_REQUEST, toolRequestPayload);
279
+ });
280
+ stream.on(LLMConverseStream_js_1.StreamEvents.STREAM_END, async () => {
281
+ this.ozzy.releaseStream(flowId);
282
+ // Determine if we have content to save
283
+ const hasText = accumulatedText.trim().length > 0;
284
+ const hasImages = generatedImages.length > 0;
285
+ // Determine the widget type: image generation models always respond via the media widget
286
+ const isImageModel = !!(0, common_1.getOzzyLlm)(agentMember.agentConfiguration.model?.model)?.imageGeneration;
287
+ const widget = hasImages && (isImageModel || !hasText)
288
+ ? 'rtsee-media'
289
+ : 'agentic-text-response';
290
+ // Final message shipped to clients with AGENT_STREAM_END (images are not streamed as chunks)
291
+ let finalMessage;
292
+ if (hasText || hasImages) {
293
+ try {
294
+ const agentMessage = await this.storage.processMessage({
295
+ ...transport,
296
+ agentId: agentMember.id
297
+ }, {
298
+ from: agentMember.id,
299
+ chatId: message.chatId,
300
+ text: accumulatedText,
301
+ widget,
302
+ cost: streamCost || undefined,
303
+ images: hasImages ? generatedImages : undefined,
304
+ });
305
+ finalMessage = {
306
+ id: agentMessage?.id,
307
+ createdAt: agentMessage?.createdAt,
308
+ text: accumulatedText,
309
+ widget,
310
+ cost: streamCost || undefined,
311
+ // Prefer persisted (uploaded) image urls over the raw base64 data urls
312
+ images: agentMessage?.images?.length
313
+ ? agentMessage.images
314
+ : (hasImages ? generatedImages : undefined),
315
+ };
316
+ // Persist cost server-side (authoritative, independent of client)
317
+ if (streamCost && agentMessage.id && this.storage.persistAgenticCost) {
318
+ const costWithMessageId = {
319
+ ...streamCost,
320
+ messageId: agentMessage.id,
321
+ };
322
+ void this.storage.persistAgenticCost(transport, costWithMessageId).catch((e) => console.error('Failed to persist agentic cost:', e));
323
+ }
324
+ }
325
+ catch (saveError) {
326
+ console.error('Failed to save agent response message:', saveError);
327
+ // Still deliver what was generated, even if persisting failed
328
+ finalMessage = {
329
+ text: accumulatedText,
330
+ widget,
331
+ cost: streamCost || undefined,
332
+ images: hasImages ? generatedImages : undefined,
333
+ };
334
+ }
164
335
  }
165
- const result = yield this.storage.processSearch((0, core_1.socketPeerToTransport)(socket), options);
166
- socket.emit(common_1.RTSeeMessengerEvents.SEARCH_SUCCESS, result);
336
+ // Broadcast AGENT_STREAM_END (with the final message so clients can render images/cost)
337
+ const streamEndPayload = { chatId: message.chatId, flowId, message: finalMessage };
338
+ void this.emitEventToChatId(transport, message.chatId, common_1.RTSeeMessengerEvents.AGENT_STREAM_END, streamEndPayload);
339
+ socket.emit(common_1.RTSeeMessengerEvents.AGENT_STREAM_END, streamEndPayload);
167
340
  });
168
341
  }
169
- emitEventToChatId(transport, chatId, eventName, data) {
170
- return __awaiter(this, void 0, void 0, function* () {
171
- const ids = yield this.storage.getChatPeersIds(transport, chatId);
342
+ /**
343
+ * Edit chat: run handler, then broadcast CHAT_UPDATED to other chat members.
344
+ */
345
+ async handleEditChat(socket, requestId, options) {
346
+ if (!socket.rtseePeer) {
347
+ return;
348
+ }
349
+ try {
350
+ const transport = (0, core_1.socketPeerToTransport)(socket);
351
+ const updatedChat = await this.storage.editChat(transport, options);
352
+ this.handlers.editChat.onSuccess({
353
+ socketPeer: socket,
354
+ requestId,
355
+ data: updatedChat,
356
+ eventName: `${common_1.RTSeeMessengerEvents.EDIT_CHAT}-success-${requestId}`,
357
+ });
358
+ // Broadcast to other chat members
359
+ void this.emitEventToChatId(transport, updatedChat.id, common_1.RTSeeMessengerEvents.CHAT_UPDATED, updatedChat);
360
+ }
361
+ catch (e) {
362
+ this.handlers.editChat.onError({
363
+ socketPeer: socket,
364
+ requestId,
365
+ payload: options,
366
+ error: e,
367
+ eventName: `${common_1.RTSeeMessengerEvents.EDIT_CHAT}-failure-${requestId}`,
368
+ });
369
+ }
370
+ }
371
+ /**
372
+ * Delete chat: run handler, then broadcast CHAT_DELETED to all chat members.
373
+ */
374
+ async handleDeleteChat(socket, requestId, chatId) {
375
+ if (!socket.rtseePeer) {
376
+ return;
377
+ }
378
+ try {
379
+ const transport = (0, core_1.socketPeerToTransport)(socket);
380
+ // Get member IDs before deleting
381
+ const ids = await this.storage.getChatPeersIds(transport, chatId);
382
+ const deletedChat = await this.storage.deleteChat(transport, chatId);
383
+ this.handlers.deleteChat.onSuccess({
384
+ socketPeer: socket,
385
+ requestId,
386
+ data: deletedChat,
387
+ eventName: `${common_1.RTSeeMessengerEvents.DELETE_CHAT}-success-${requestId}`,
388
+ });
389
+ // Broadcast to other chat members
172
390
  ids.forEach((id) => {
173
391
  if (id !== transport.peer.clientId) {
174
- this.sendToIndividualRoom({ peer: { clientId: id, rtseeAppId: transport.peer.rtseeAppId } }, eventName, data);
392
+ this.sendToIndividualRoom({ peer: { clientId: id, rtseeAppId: transport.peer.rtseeAppId } }, common_1.RTSeeMessengerEvents.CHAT_DELETED, { chatId });
175
393
  }
176
394
  });
395
+ }
396
+ catch (e) {
397
+ this.handlers.deleteChat.onError({
398
+ socketPeer: socket,
399
+ requestId,
400
+ payload: chatId,
401
+ error: e,
402
+ eventName: `${common_1.RTSeeMessengerEvents.DELETE_CHAT}-failure-${requestId}`,
403
+ });
404
+ }
405
+ }
406
+ /**
407
+ * Message received status: process and forward to original senders.
408
+ */
409
+ async handleMessageReceived(socket, requestId, options) {
410
+ if (!socket.rtseePeer) {
411
+ return;
412
+ }
413
+ if (this.storage.processMessagesReceivedEvent) {
414
+ await this.storage.processMessagesReceivedEvent((0, core_1.socketPeerToTransport)(socket), options);
415
+ }
416
+ const groups = this.groupBySender(options.messages);
417
+ groups.forEach((g) => {
418
+ this.sendToIndividualRoom({
419
+ peer: {
420
+ clientId: g.senderId,
421
+ rtseeAppId: socket.rtseePeer.rtseeAppId,
422
+ },
423
+ }, common_1.RTSeeMessengerEvents.MESSAGE_RECEIVED, g);
177
424
  });
178
425
  }
179
- getChatMemberByPeerId(id) {
180
- // move this logic to local storage processor
181
- if (this.storage.isLocalProcessor) {
182
- const peer = this.connectionsManager.getPeerByClientId(id);
183
- return Object.assign(Object.assign({}, peer), { id: peer.clientId });
426
+ /**
427
+ * Messages seen: process and forward to original senders.
428
+ */
429
+ async handleMessageSeen(socket, requestId, options) {
430
+ if (!socket.rtseePeer) {
431
+ return;
184
432
  }
185
- else {
186
- return null;
433
+ if (this.storage.processMessagesSeenEvent) {
434
+ await this.storage.processMessagesSeenEvent((0, core_1.socketPeerToTransport)(socket), options);
187
435
  }
436
+ const groups = this.groupBySender(options.messages);
437
+ groups.forEach((g) => {
438
+ this.sendToIndividualRoom({
439
+ peer: {
440
+ clientId: g.senderId,
441
+ rtseeAppId: socket.rtseePeer.rtseeAppId,
442
+ },
443
+ }, common_1.RTSeeMessengerEvents.INCOMING_MESSAGES_SEEN, g);
444
+ });
188
445
  }
189
- getChatMembersByPeerIds(ids) {
190
- // move this logic to local storage processor
191
- if (this.storage.isLocalProcessor) {
192
- const peers = this.connectionsManager.getPeerByClientIdsList(ids);
193
- return peers.map((e) => {
194
- return Object.assign(Object.assign({}, e), { id: e.clientId });
446
+ /**
447
+ * Add chat member: run handler, then broadcast CHAT_MEMBER_ADDED.
448
+ */
449
+ async handleAddChatMember(socket, requestId, options) {
450
+ if (!socket.rtseePeer) {
451
+ return;
452
+ }
453
+ try {
454
+ const transport = (0, core_1.socketPeerToTransport)(socket);
455
+ const member = await this.storage.addChatMember(transport, options);
456
+ this.handlers.addChatMember.onSuccess({
457
+ socketPeer: socket,
458
+ requestId,
459
+ data: member,
460
+ eventName: `${common_1.RTSeeMessengerEvents.ADD_CHAT_MEMBER}-success-${requestId}`,
461
+ });
462
+ if (member?.id) {
463
+ this.joinPeersToChatRoom(transport, options.chatId, [member.id]);
464
+ }
465
+ void this.emitEventToChatId(transport, options.chatId, common_1.RTSeeMessengerEvents.CHAT_MEMBER_ADDED, member);
466
+ }
467
+ catch (e) {
468
+ this.handlers.addChatMember.onError({
469
+ socketPeer: socket,
470
+ requestId,
471
+ payload: options,
472
+ error: e,
473
+ eventName: `${common_1.RTSeeMessengerEvents.ADD_CHAT_MEMBER}-failure-${requestId}`,
195
474
  });
196
475
  }
197
- else {
198
- return null;
476
+ }
477
+ /**
478
+ * Edit chat member: run handler, then broadcast CHAT_MEMBER_UPDATED.
479
+ */
480
+ async handleEditChatMember(socket, requestId, options) {
481
+ if (!socket.rtseePeer) {
482
+ return;
483
+ }
484
+ try {
485
+ const transport = (0, core_1.socketPeerToTransport)(socket);
486
+ const member = await this.storage.editChatMember(transport, options);
487
+ this.handlers.editChatMember.onSuccess({
488
+ socketPeer: socket,
489
+ requestId,
490
+ data: member,
491
+ eventName: `${common_1.RTSeeMessengerEvents.EDIT_CHAT_MEMBER}-success-${requestId}`,
492
+ });
493
+ void this.emitEventToChatId(transport, options.chatId, common_1.RTSeeMessengerEvents.CHAT_MEMBER_UPDATED, member);
494
+ }
495
+ catch (e) {
496
+ this.handlers.editChatMember.onError({
497
+ socketPeer: socket,
498
+ requestId,
499
+ payload: options,
500
+ error: e,
501
+ eventName: `${common_1.RTSeeMessengerEvents.EDIT_CHAT_MEMBER}-failure-${requestId}`,
502
+ });
503
+ }
504
+ }
505
+ /**
506
+ * Remove chat member: run handler, then broadcast CHAT_MEMBER_REMOVED.
507
+ */
508
+ async handleRemoveChatMember(socket, requestId, options) {
509
+ if (!socket.rtseePeer) {
510
+ return;
511
+ }
512
+ try {
513
+ const transport = (0, core_1.socketPeerToTransport)(socket);
514
+ const member = await this.storage.removeChatMember(transport, options);
515
+ this.handlers.removeChatMember.onSuccess({
516
+ socketPeer: socket,
517
+ requestId,
518
+ data: member,
519
+ eventName: `${common_1.RTSeeMessengerEvents.REMOVE_CHAT_MEMBER}-success-${requestId}`,
520
+ });
521
+ void this.emitEventToChatId(transport, options.chatId, common_1.RTSeeMessengerEvents.CHAT_MEMBER_REMOVED, { chatId: options.chatId, memberId: options.memberId });
522
+ this.io
523
+ ?.in(signaling_1.RTSeeSignalingBase.getPersonalRoomName({
524
+ peer: { clientId: options.memberId, rtseeAppId: transport.peer.rtseeAppId },
525
+ }))
526
+ .socketsLeave(RTSeeMessengerSignaling.getChatRoomName(transport, options.chatId));
527
+ }
528
+ catch (e) {
529
+ this.handlers.removeChatMember.onError({
530
+ socketPeer: socket,
531
+ requestId,
532
+ payload: options,
533
+ error: e,
534
+ eventName: `${common_1.RTSeeMessengerEvents.REMOVE_CHAT_MEMBER}-failure-${requestId}`,
535
+ });
536
+ }
537
+ }
538
+ async emitEventToChatId(transport, chatId, eventName, data) {
539
+ const ids = await this.storage.getChatPeersIds(transport, chatId);
540
+ ids.forEach((id) => {
541
+ if (id !== transport.peer.clientId) {
542
+ this.sendToIndividualRoom({ peer: { clientId: id, rtseeAppId: transport.peer.rtseeAppId } }, eventName, data);
543
+ }
544
+ });
545
+ }
546
+ // ─── Chat rooms ──────────────────────────────────────────────────────
547
+ static getChatRoomName(transport, chatId) {
548
+ return `${CHAT_ROOM_PREFIX}-${transport.peer.rtseeAppId}-${chatId}`;
549
+ }
550
+ /** Emits to every socket of every chat member (including the sender) */
551
+ emitToChatRoom(transport, chatId, eventName, data) {
552
+ this.io?.to(RTSeeMessengerSignaling.getChatRoomName(transport, chatId)).emit(eventName, data);
553
+ }
554
+ /** Joins all sockets of the given peers (personal rooms) to the chat room */
555
+ joinPeersToChatRoom(transport, chatId, peerIds) {
556
+ if (!this.io) {
557
+ return;
558
+ }
559
+ const roomName = RTSeeMessengerSignaling.getChatRoomName(transport, chatId);
560
+ const personalRooms = peerIds.map((clientId) => signaling_1.RTSeeSignalingBase.getPersonalRoomName({
561
+ peer: { clientId, rtseeAppId: transport.peer.rtseeAppId },
562
+ }));
563
+ if (personalRooms.length) {
564
+ this.io.in(personalRooms).socketsJoin(roomName);
565
+ }
566
+ }
567
+ /** Joins all members of the chat to its room */
568
+ async joinChatRoom(transport, chatId) {
569
+ const ids = (await this.storage.getChatPeersIds(transport, chatId)) || [];
570
+ this.joinPeersToChatRoom(transport, chatId, ids);
571
+ return ids;
572
+ }
573
+ /**
574
+ * Requester's sockets join the rooms of the chats they fetch.
575
+ */
576
+ attachChatRoomsJoining() {
577
+ const getChats = this.handlers.getChats.processor;
578
+ this.handlers.getChats.processor = async (socketPeer, requestId, payload) => {
579
+ const result = await getChats(socketPeer, requestId, payload);
580
+ const transport = (0, core_1.socketPeerToTransport)(socketPeer);
581
+ (result?.chats || []).forEach((chat) => this.joinPeersToChatRoom(transport, chat.id, [transport.peer.clientId]));
582
+ return result;
583
+ };
584
+ const getChat = this.handlers.getChat.processor;
585
+ this.handlers.getChat.processor = async (socketPeer, requestId, payload) => {
586
+ const chat = await getChat(socketPeer, requestId, payload);
587
+ if (chat?.id) {
588
+ const transport = (0, core_1.socketPeerToTransport)(socketPeer);
589
+ this.joinPeersToChatRoom(transport, chat.id, [transport.peer.clientId]);
590
+ }
591
+ return chat;
592
+ };
593
+ const joinChatByToken = this.handlers.joinChatByToken.processor;
594
+ this.handlers.joinChatByToken.processor = async (socketPeer, requestId, payload) => {
595
+ const chat = await joinChatByToken(socketPeer, requestId, payload);
596
+ if (chat?.id) {
597
+ const transport = (0, core_1.socketPeerToTransport)(socketPeer);
598
+ this.joinPeersToChatRoom(transport, chat.id, [transport.peer.clientId]);
599
+ }
600
+ return chat;
601
+ };
602
+ }
603
+ // ─── Ozzy: workflows & tasks ─────────────────────────────────────────
604
+ attachOzzyEvents(socket) {
605
+ socket.on(common_1.OzzyWorkflowEvents.GET_WORKFLOW_DEFINITIONS, (_, requestId) => this.respond(socket, common_1.OzzyWorkflowEvents.GET_WORKFLOW_DEFINITIONS, requestId, async () => this.ozzy.workflows.getDefinitions(), 'Failed to load workflows.'));
606
+ socket.on(common_1.OzzyWorkflowEvents.CREATE_WORKFLOW, (request, requestId) => this.respond(socket, common_1.OzzyWorkflowEvents.CREATE_WORKFLOW, requestId, (transport) => this.handleCreateWorkflow(transport, request), 'Failed to create workflow.'));
607
+ socket.on(common_1.OzzyWorkflowEvents.GET_WORKFLOW, (request, requestId) => this.respond(socket, common_1.OzzyWorkflowEvents.GET_WORKFLOW, requestId, async (transport) => {
608
+ const workflow = await this.ozzy.workflows.get(transport, request.workflowId);
609
+ if (!workflow) {
610
+ throw new Error(`Workflow ${request.workflowId} not found.`);
611
+ }
612
+ await this.assertChatMember(transport, workflow.chatId);
613
+ this.joinPeersToChatRoom(transport, workflow.chatId, [transport.peer.clientId]);
614
+ return workflow;
615
+ }, 'Failed to load workflow.'));
616
+ socket.on(common_1.OzzyWorkflowEvents.COMPLETE_STEP, (request, requestId) => this.respond(socket, common_1.OzzyWorkflowEvents.COMPLETE_STEP, requestId, async (transport) => {
617
+ const workflow = await this.ozzy.workflows.get(transport, request.workflowId);
618
+ await this.assertChatMember(transport, workflow?.chatId);
619
+ return this.ozzy.workflows.completeStep(transport, request);
620
+ }, 'Failed to complete workflow step.'));
621
+ socket.on(common_1.OzzyTaskEvents.EXECUTE_TASK, (request, requestId) => this.respond(socket, common_1.OzzyTaskEvents.EXECUTE_TASK, requestId, async (transport) => {
622
+ const task = await this.ozzy.tasks.get(transport, request.taskId);
623
+ await this.assertChatMember(transport, task?.chatId);
624
+ await this.joinChatRoom(transport, task.chatId);
625
+ return this.ozzy.tasks.execute(transport, request.taskId);
626
+ }, 'Failed to execute task.'));
627
+ socket.on(common_1.OzzyTaskEvents.GET_TASK, (request, requestId) => this.respond(socket, common_1.OzzyTaskEvents.GET_TASK, requestId, async (transport) => {
628
+ const task = await this.ozzy.tasks.get(transport, request.taskId);
629
+ if (!task) {
630
+ throw new Error(`Task ${request.taskId} not found.`);
631
+ }
632
+ await this.assertChatMember(transport, task.chatId);
633
+ return task;
634
+ }, 'Failed to load task.'));
635
+ }
636
+ /**
637
+ * Persists the workflow (first step = submitted form), attaches an "rts-workflow" message to the chat,
638
+ * then activates the next step (which may start a task).
639
+ */
640
+ async handleCreateWorkflow(transport, request) {
641
+ await this.assertChatMember(transport, request.chatId);
642
+ const peersIds = await this.joinChatRoom(transport, request.chatId);
643
+ const workflow = await this.ozzy.workflows.create(transport, request);
644
+ const message = await this.storage.processMessage(transport, {
645
+ from: transport.peer.clientId,
646
+ chatId: request.chatId,
647
+ text: workflow.title || workflow.name,
648
+ widget: 'rts-workflow',
649
+ ozzyWorkflowId: workflow.id,
650
+ });
651
+ await this.ozzy.workflows.attachMessage(transport, workflow, message.id);
652
+ peersIds.forEach((id) => {
653
+ if (id !== transport.peer.clientId) {
654
+ this.sendToIndividualRoom({ peer: { clientId: id, rtseeAppId: transport.peer.rtseeAppId } }, common_1.RTSeeMessengerEvents.INCOMING_MESSAGE, message);
655
+ }
656
+ });
657
+ // continue in background - progress is broadcast to the chat room
658
+ void this.ozzy.workflows.start(transport, workflow).catch((e) => console.error(`[Ozzy] failed to start workflow ${workflow.id}`, e));
659
+ return { workflow, message };
660
+ }
661
+ async assertChatMember(transport, chatId) {
662
+ if (!chatId) {
663
+ throw new Error('Chat not found.');
664
+ }
665
+ const ids = (await this.storage.getChatPeersIds(transport, chatId)) || [];
666
+ if (!ids.includes(transport.peer.clientId)) {
667
+ throw new Error('You are not a member of this chat.');
668
+ }
669
+ }
670
+ async respond(socket, eventName, requestId, processor, friendlyMessage) {
671
+ if (!socket.rtseePeer) {
672
+ return;
673
+ }
674
+ try {
675
+ const result = await processor((0, core_1.socketPeerToTransport)(socket));
676
+ socket.emit(`${eventName}-${core_1.REQUEST_SUCCESS_SUFFIX}-${requestId}`, result);
677
+ }
678
+ catch (e) {
679
+ console.error(`[Ozzy] ${eventName} failed:`, e?.message || e);
680
+ const error = {
681
+ name: eventName,
682
+ code: eventName,
683
+ message: `${e?.message || e}`,
684
+ friendlyMessage,
685
+ };
686
+ socket.emit(`${eventName}-${core_1.REQUEST_FAILURE_SUFFIX}-${requestId}`, error);
199
687
  }
200
688
  }
201
689
  groupBySender(messages) {
@@ -215,30 +703,6 @@ class RTSeeMessengerSignaling extends signaling_1.RTSeeSignalingBase {
215
703
  });
216
704
  return groups;
217
705
  }
218
- sendMessage(transport, message) {
219
- return __awaiter(this, void 0, void 0, function* () {
220
- const peers = this.storage.isLocalProcessor
221
- ? {
222
- creator: this.getChatMemberByPeerId(transport.peer.clientId),
223
- members: this.getChatMembersByPeerIds([
224
- transport.peer.clientId,
225
- message.to,
226
- ]),
227
- }
228
- : null;
229
- if (peers) {
230
- transport.peers = peers;
231
- }
232
- const savedMessage = yield this.storage.processMessage(transport, message);
233
- const ids = yield this.storage.getChatPeersIds(transport, savedMessage.chatId);
234
- this.sendToIndividualRoom(transport, common_1.RTSeeMessengerEvents.MESSAGE_SEND_SUCCEED, Object.assign(Object.assign({}, savedMessage), { temporaryId: message.temporaryId, temporaryChatId: message.temporaryChatId }));
235
- ids.forEach((id) => {
236
- if (id !== transport.peer.clientId) {
237
- this.sendToIndividualRoom({ peer: { clientId: id, rtseeAppId: transport.peer.rtseeAppId } }, common_1.RTSeeMessengerEvents.INCOMING_MESSAGE, savedMessage);
238
- }
239
- });
240
- });
241
- }
242
706
  }
243
707
  exports.RTSeeMessengerSignaling = RTSeeMessengerSignaling;
244
708
  //# sourceMappingURL=RTSeeMessengerSignaling.js.map