@ai-group/chat-sdk 3.6.11 → 3.7.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.
Files changed (149) hide show
  1. package/dist/cjs/components/XAdkChatbot/index.js +27 -15
  2. package/dist/cjs/components/XAdkChatbot/index.js.map +2 -2
  3. package/dist/cjs/components/XAdkProvider/compound/Sender.d.ts +2 -2
  4. package/dist/cjs/components/XAdkProvider/compound/Sender.js +20 -17
  5. package/dist/cjs/components/XAdkProvider/compound/Sender.js.map +2 -2
  6. package/dist/cjs/components/XAdkProvider/compound/Sidebar.js +6 -2
  7. package/dist/cjs/components/XAdkProvider/compound/Sidebar.js.map +2 -2
  8. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.d.ts +6 -2
  9. package/dist/cjs/components/XAdkProvider/context/ChatSenderStateContext.js.map +2 -2
  10. package/dist/cjs/components/XAdkProvider/index.js +8 -5
  11. package/dist/cjs/components/XAdkProvider/index.js.map +2 -2
  12. package/dist/cjs/components/XAdkSender/index.js +502 -496
  13. package/dist/cjs/components/XAdkSender/index.js.map +2 -2
  14. package/dist/cjs/components/XAdkSender/styles.js +0 -13
  15. package/dist/cjs/components/XAdkSender/styles.js.map +2 -2
  16. package/dist/cjs/core/index.d.ts +2 -0
  17. package/dist/cjs/core/index.js +26 -0
  18. package/dist/cjs/core/index.js.map +7 -0
  19. package/dist/cjs/core/protocol/index.d.ts +3 -0
  20. package/dist/cjs/core/protocol/index.js +28 -0
  21. package/dist/cjs/core/protocol/index.js.map +7 -0
  22. package/dist/cjs/core/protocol/messages.d.ts +55 -0
  23. package/dist/cjs/core/protocol/messages.js +307 -0
  24. package/dist/cjs/core/protocol/messages.js.map +7 -0
  25. package/dist/cjs/core/protocol/parts.d.ts +24 -0
  26. package/dist/cjs/core/protocol/parts.js +106 -0
  27. package/dist/cjs/core/protocol/parts.js.map +7 -0
  28. package/dist/cjs/core/protocol/types.d.ts +57 -0
  29. package/dist/cjs/core/protocol/types.js +18 -0
  30. package/dist/cjs/core/protocol/types.js.map +7 -0
  31. package/dist/cjs/core/runtime/createAdkConversationController.d.ts +8 -0
  32. package/dist/cjs/core/runtime/createAdkConversationController.js +424 -0
  33. package/dist/cjs/core/runtime/createAdkConversationController.js.map +7 -0
  34. package/dist/cjs/core/runtime/index.d.ts +2 -0
  35. package/dist/cjs/core/runtime/index.js +26 -0
  36. package/dist/cjs/core/runtime/index.js.map +7 -0
  37. package/dist/cjs/core/runtime/types.d.ts +130 -0
  38. package/dist/cjs/core/runtime/types.js +18 -0
  39. package/dist/cjs/core/runtime/types.js.map +7 -0
  40. package/dist/{esm/utils/umdEntry.d.ts → cjs/entries/umd.d.ts} +7 -0
  41. package/dist/cjs/{utils/umdEntry.js → entries/umd.js} +19 -9
  42. package/dist/cjs/entries/umd.js.map +7 -0
  43. package/dist/cjs/hooks/useADKChat.js +1 -0
  44. package/dist/cjs/hooks/useADKChat.js.map +2 -2
  45. package/dist/cjs/index.d.ts +6 -1
  46. package/dist/cjs/index.js +19 -11
  47. package/dist/cjs/index.js.map +3 -3
  48. package/dist/cjs/presets/xgroup/index.d.ts +4 -0
  49. package/dist/cjs/presets/xgroup/index.js +30 -0
  50. package/dist/cjs/presets/xgroup/index.js.map +7 -0
  51. package/dist/cjs/presets/xgroup/preset.d.ts +15 -0
  52. package/dist/cjs/presets/xgroup/preset.js +69 -0
  53. package/dist/cjs/presets/xgroup/preset.js.map +7 -0
  54. package/dist/cjs/presets/xgroup/strategies.d.ts +8 -0
  55. package/dist/cjs/presets/xgroup/strategies.js +53 -0
  56. package/dist/cjs/presets/xgroup/strategies.js.map +7 -0
  57. package/dist/cjs/presets/xgroup/transport.d.ts +15 -0
  58. package/dist/cjs/presets/xgroup/transport.js +183 -0
  59. package/dist/cjs/presets/xgroup/transport.js.map +7 -0
  60. package/dist/cjs/presets/xgroup/upload.d.ts +8 -0
  61. package/dist/cjs/presets/xgroup/upload.js +65 -0
  62. package/dist/cjs/presets/xgroup/upload.js.map +7 -0
  63. package/dist/cjs/react/index.d.ts +6 -0
  64. package/dist/cjs/react/index.js +53 -0
  65. package/dist/cjs/react/index.js.map +7 -0
  66. package/dist/cjs/react/useAdkConversation.d.ts +27 -0
  67. package/dist/cjs/react/useAdkConversation.js +69 -0
  68. package/dist/cjs/react/useAdkConversation.js.map +7 -0
  69. package/dist/cjs/types/XAdkSender.d.ts +0 -2
  70. package/dist/cjs/types/XAdkSender.js.map +1 -1
  71. package/dist/esm/components/XAdkChatbot/index.js +1 -1
  72. package/dist/esm/components/XAdkChatbot/index.js.map +1 -1
  73. package/dist/esm/components/XAdkProvider/compound/Sender.d.ts +2 -2
  74. package/dist/esm/components/XAdkProvider/compound/Sender.js +7 -4
  75. package/dist/esm/components/XAdkProvider/compound/Sender.js.map +1 -1
  76. package/dist/esm/components/XAdkProvider/compound/Sidebar.js +7 -2
  77. package/dist/esm/components/XAdkProvider/compound/Sidebar.js.map +1 -1
  78. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.d.ts +6 -2
  79. package/dist/esm/components/XAdkProvider/context/ChatSenderStateContext.js.map +1 -1
  80. package/dist/esm/components/XAdkProvider/index.js +13 -4
  81. package/dist/esm/components/XAdkProvider/index.js.map +1 -1
  82. package/dist/esm/components/XAdkSender/index.js +2 -5
  83. package/dist/esm/components/XAdkSender/index.js.map +1 -1
  84. package/dist/esm/components/XAdkSender/styles.js +1 -1
  85. package/dist/esm/components/XAdkSender/styles.js.map +1 -1
  86. package/dist/esm/core/index.d.ts +2 -0
  87. package/dist/esm/core/index.js +3 -0
  88. package/dist/esm/core/index.js.map +1 -0
  89. package/dist/esm/core/protocol/index.d.ts +3 -0
  90. package/dist/esm/core/protocol/index.js +4 -0
  91. package/dist/esm/core/protocol/index.js.map +1 -0
  92. package/dist/esm/core/protocol/messages.d.ts +55 -0
  93. package/dist/esm/core/protocol/messages.js +315 -0
  94. package/dist/esm/core/protocol/messages.js.map +1 -0
  95. package/dist/esm/core/protocol/parts.d.ts +24 -0
  96. package/dist/esm/core/protocol/parts.js +100 -0
  97. package/dist/esm/core/protocol/parts.js.map +1 -0
  98. package/dist/esm/core/protocol/types.d.ts +57 -0
  99. package/dist/esm/core/protocol/types.js +2 -0
  100. package/dist/esm/core/protocol/types.js.map +1 -0
  101. package/dist/esm/core/runtime/createAdkConversationController.d.ts +8 -0
  102. package/dist/esm/core/runtime/createAdkConversationController.js +742 -0
  103. package/dist/esm/core/runtime/createAdkConversationController.js.map +1 -0
  104. package/dist/esm/core/runtime/index.d.ts +2 -0
  105. package/dist/esm/core/runtime/index.js +3 -0
  106. package/dist/esm/core/runtime/index.js.map +1 -0
  107. package/dist/esm/core/runtime/types.d.ts +130 -0
  108. package/dist/esm/core/runtime/types.js +2 -0
  109. package/dist/esm/core/runtime/types.js.map +1 -0
  110. package/dist/{cjs/utils/umdEntry.d.ts → esm/entries/umd.d.ts} +7 -0
  111. package/dist/esm/{utils/umdEntry.js → entries/umd.js} +10 -1
  112. package/dist/esm/entries/umd.js.map +1 -0
  113. package/dist/esm/hooks/useADKChat.js +2 -1
  114. package/dist/esm/hooks/useADKChat.js.map +1 -1
  115. package/dist/esm/index.d.ts +6 -1
  116. package/dist/esm/index.js +6 -1
  117. package/dist/esm/index.js.map +1 -1
  118. package/dist/esm/presets/xgroup/index.d.ts +4 -0
  119. package/dist/esm/presets/xgroup/index.js +5 -0
  120. package/dist/esm/presets/xgroup/index.js.map +1 -0
  121. package/dist/esm/presets/xgroup/preset.d.ts +15 -0
  122. package/dist/esm/presets/xgroup/preset.js +44 -0
  123. package/dist/esm/presets/xgroup/preset.js.map +1 -0
  124. package/dist/esm/presets/xgroup/strategies.d.ts +8 -0
  125. package/dist/esm/presets/xgroup/strategies.js +30 -0
  126. package/dist/esm/presets/xgroup/strategies.js.map +1 -0
  127. package/dist/esm/presets/xgroup/transport.d.ts +15 -0
  128. package/dist/esm/presets/xgroup/transport.js +322 -0
  129. package/dist/esm/presets/xgroup/transport.js.map +1 -0
  130. package/dist/esm/presets/xgroup/upload.d.ts +8 -0
  131. package/dist/esm/presets/{xGroupAdk.js → xgroup/upload.js} +9 -63
  132. package/dist/esm/presets/xgroup/upload.js.map +1 -0
  133. package/dist/esm/react/index.d.ts +6 -0
  134. package/dist/esm/react/index.js +5 -0
  135. package/dist/esm/react/index.js.map +1 -0
  136. package/dist/esm/react/useAdkConversation.d.ts +27 -0
  137. package/dist/esm/react/useAdkConversation.js +53 -0
  138. package/dist/esm/react/useAdkConversation.js.map +1 -0
  139. package/dist/esm/types/XAdkSender.d.ts +0 -2
  140. package/dist/esm/types/XAdkSender.js.map +1 -1
  141. package/dist/umd/chat-sdk.min.js +1 -1
  142. package/package.json +36 -2
  143. package/dist/cjs/presets/xGroupAdk.d.ts +0 -20
  144. package/dist/cjs/presets/xGroupAdk.js +0 -130
  145. package/dist/cjs/presets/xGroupAdk.js.map +0 -7
  146. package/dist/cjs/utils/umdEntry.js.map +0 -7
  147. package/dist/esm/presets/xGroupAdk.d.ts +0 -20
  148. package/dist/esm/presets/xGroupAdk.js.map +0 -1
  149. package/dist/esm/utils/umdEntry.js.map +0 -1
@@ -0,0 +1,742 @@
1
+ import _regeneratorRuntime from "@babel/runtime/helpers/esm/regeneratorRuntime";
2
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
3
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
4
+ import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
5
+ import { v4 } from "uuid";
6
+ import { buildAdkUserMessage, buildAdkUserParts, dedupeAdkMessages, insertMissingAdkSessionEvents, mapAdkEventToMessages, mapAdkSessionEventsToMessages, pairFunctionResponses } from "../protocol";
7
+ var DEFAULT_PAGE_SIZE = 10;
8
+
9
+ /**
10
+ * 创建 controller 的初始状态。
11
+ * 这里不读取任何外部配置,确保 runtime 可以在 React、UMD、单测环境中复用。
12
+ */
13
+ var createInitialState = function createInitialState(sessionId) {
14
+ var pageSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : DEFAULT_PAGE_SIZE;
15
+ return {
16
+ appInfo: null,
17
+ initialized: false,
18
+ loading: false,
19
+ sessionLoading: false,
20
+ currentSessionId: sessionId || v4(),
21
+ messages: [],
22
+ sessionList: [],
23
+ sessionPagination: {
24
+ total: 0,
25
+ pageNum: 1,
26
+ pageSize: pageSize
27
+ },
28
+ prologue: "",
29
+ suggestions: []
30
+ };
31
+ };
32
+
33
+ /**
34
+ * 默认请求体构造器,适配当前 xgroup openApi 的 sendMsgStreaming 入参。
35
+ * 业务项目可通过 options.requestBuilder 注入 modelCode、agentNo、taskMode 等字段。
36
+ */
37
+ var defaultRequestBuilder = function defaultRequestBuilder(_ref) {
38
+ var content = _ref.content,
39
+ sessionId = _ref.sessionId,
40
+ stateDelta = _ref.stateDelta;
41
+ return _objectSpread({
42
+ stream: true,
43
+ sessionId: sessionId,
44
+ content: {
45
+ role: "user",
46
+ parts: buildAdkUserParts(content)
47
+ },
48
+ files: (content.files || []).map(function (file) {
49
+ var _file$response, _file$response2, _file$response3, _file$response4, _file$response5, _file$response6;
50
+ return {
51
+ fileName: file.fileName || ((_file$response = file.response) === null || _file$response === void 0 ? void 0 : _file$response.fileName),
52
+ fileId: file.fileId || ((_file$response2 = file.response) === null || _file$response2 === void 0 ? void 0 : _file$response2.fileId),
53
+ tempUrl: file.tempUrl || ((_file$response3 = file.response) === null || _file$response3 === void 0 ? void 0 : _file$response3.fileUrl) || ((_file$response4 = file.response) === null || _file$response4 === void 0 ? void 0 : _file$response4.tempUrl),
54
+ type: file.type || ((_file$response5 = file.response) === null || _file$response5 === void 0 ? void 0 : _file$response5.fileType),
55
+ mimeType: file.mimeType || ((_file$response6 = file.response) === null || _file$response6 === void 0 ? void 0 : _file$response6.mimeType)
56
+ };
57
+ })
58
+ }, stateDelta !== undefined ? {
59
+ stateDelta: stateDelta
60
+ } : {});
61
+ };
62
+
63
+ /**
64
+ * 创建无 React 依赖的 ADK 对话数据流控制器。
65
+ *
66
+ * controller 只管理状态和数据流编排;所有请求细节都交给 transport,
67
+ * 所有 UI 提示都通过 callbacks 抛给调用方。
68
+ */
69
+ export var createAdkConversationController = function createAdkConversationController(options) {
70
+ var _options$session;
71
+ var transport = options.transport,
72
+ callbacks = options.callbacks,
73
+ protocol = options.protocol,
74
+ _options$requestBuild = options.requestBuilder,
75
+ requestBuilder = _options$requestBuild === void 0 ? defaultRequestBuilder : _options$requestBuild,
76
+ _options$createFuncti = options.createFunctionResponse,
77
+ createFunctionResponse = _options$createFuncti === void 0 ? function (fnCall, confirmed) {
78
+ return {
79
+ id: fnCall.id,
80
+ name: fnCall.name,
81
+ response: {
82
+ confirmed: confirmed
83
+ }
84
+ };
85
+ } : _options$createFuncti;
86
+ var state = createInitialState(options.sessionId, (_options$session = options.session) === null || _options$session === void 0 ? void 0 : _options$session.pageSize);
87
+ var ctrl = null;
88
+ var pollingTimer = null;
89
+ var textMessage = null;
90
+ var stateDelta;
91
+ var disposed = false;
92
+ var subscribers = new Set();
93
+
94
+ /** 通知所有订阅者。React Hook、UMD 调用方都通过 subscribe 接收状态变化。 */
95
+ var emit = function emit() {
96
+ subscribers.forEach(function (subscriber) {
97
+ return subscriber(state);
98
+ });
99
+ };
100
+ var setState = function setState(patch) {
101
+ state = typeof patch === "function" ? patch(state) : _objectSpread(_objectSpread({}, state), patch);
102
+ emit();
103
+ };
104
+ var setMessages = function setMessages(messages) {
105
+ setState(function (current) {
106
+ return _objectSpread(_objectSpread({}, current), {}, {
107
+ // 所有入口写入 messages 时都统一做工具响应配对和文本去重。
108
+ messages: typeof messages === "function" ? pairFunctionResponses(dedupeAdkMessages(messages(current.messages))) : pairFunctionResponses(dedupeAdkMessages(messages))
109
+ });
110
+ });
111
+ };
112
+ var appendMessages = function appendMessages(messages) {
113
+ if (!messages.length) return;
114
+ setMessages(function (prev) {
115
+ return [].concat(_toConsumableArray(prev), _toConsumableArray(messages));
116
+ });
117
+ };
118
+ var updateLastBotMeta = function updateLastBotMeta(event) {
119
+ if (!event.modelCode && !event.usageMetadata && !event.finishReason) return;
120
+ setMessages(function (prev) {
121
+ var _event$modelCode, _event$usageMetadata, _event$finishReason;
122
+ var next = _toConsumableArray(prev);
123
+ var index = next.findLastIndex(function (message) {
124
+ return message.role === "bot";
125
+ });
126
+ if (index < 0) return prev;
127
+ next[index] = _objectSpread(_objectSpread({}, next[index]), {}, {
128
+ modelCode: (_event$modelCode = event.modelCode) !== null && _event$modelCode !== void 0 ? _event$modelCode : next[index].modelCode,
129
+ usageMetadata: (_event$usageMetadata = event.usageMetadata) !== null && _event$usageMetadata !== void 0 ? _event$usageMetadata : next[index].usageMetadata,
130
+ finishReason: (_event$finishReason = event.finishReason) !== null && _event$finishReason !== void 0 ? _event$finishReason : next[index].finishReason,
131
+ raw: _objectSpread(_objectSpread({}, next[index].raw || {}), event)
132
+ });
133
+ return next;
134
+ });
135
+ };
136
+
137
+ /**
138
+ * 处理单个 stream event。
139
+ *
140
+ * 对纯文本分片做流式拼接;遇到 fileData、functionCall、代码执行等非文本内容时,
141
+ * 直接作为独立消息插入,避免破坏工具类消息的渲染结构。
142
+ */
143
+ var processEvent = function processEvent(event) {
144
+ var _callbacks$onStream, _event$content, _event$content2;
145
+ var requestStream = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
146
+ callbacks === null || callbacks === void 0 || (_callbacks$onStream = callbacks.onStream) === null || _callbacks$onStream === void 0 || _callbacks$onStream.call(callbacks, event);
147
+ updateLastBotMeta(event);
148
+ if (((_event$content = event.content) === null || _event$content === void 0 ? void 0 : _event$content.role) === "followup") {
149
+ var _event$content$parts;
150
+ var text = (_event$content$parts = event.content.parts) === null || _event$content$parts === void 0 || (_event$content$parts = _event$content$parts[0]) === null || _event$content$parts === void 0 ? void 0 : _event$content$parts.text;
151
+ if (text) {
152
+ setState(function (current) {
153
+ return _objectSpread(_objectSpread({}, current), {}, {
154
+ suggestions: [].concat(_toConsumableArray(current.suggestions), [text])
155
+ });
156
+ });
157
+ }
158
+ return;
159
+ }
160
+ if ((_event$content2 = event.content) !== null && _event$content2 !== void 0 && (_event$content2 = _event$content2.parts) !== null && _event$content2 !== void 0 && _event$content2.length) {
161
+ var messages = mapAdkEventToMessages(event, protocol);
162
+ messages.forEach(function (message) {
163
+ var _message$fileData;
164
+ var isPureText = typeof message.text === "string" && !((_message$fileData = message.fileData) !== null && _message$fileData !== void 0 && _message$fileData.length) && !message.functionCall && !message.functionResponse && !message.executableCode && !message.codeExecutionResult;
165
+ if (isPureText && requestStream) {
166
+ var _textMessage;
167
+ if (event.partial === false) {
168
+ textMessage = null;
169
+ return;
170
+ }
171
+ var isNewInvocation = ((_textMessage = textMessage) === null || _textMessage === void 0 ? void 0 : _textMessage.invocationId) !== message.invocationId;
172
+ if (!textMessage || isNewInvocation || textMessage.thought !== message.thought) {
173
+ textMessage = message;
174
+ appendMessages([message]);
175
+ return;
176
+ }
177
+ textMessage = _objectSpread(_objectSpread(_objectSpread({}, textMessage), message), {}, {
178
+ text: "".concat(textMessage.text || "").concat(message.text || "")
179
+ });
180
+ setMessages(function (prev) {
181
+ return prev.map(function (item) {
182
+ return item.id === textMessage.id ? textMessage : item;
183
+ });
184
+ });
185
+ if (event.finishReason === "stop") textMessage = null;
186
+ return;
187
+ }
188
+ textMessage = null;
189
+ appendMessages([message]);
190
+ });
191
+ return;
192
+ }
193
+ appendMessages(mapAdkEventToMessages(event, protocol));
194
+ };
195
+ var loadSessions = /*#__PURE__*/function () {
196
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
197
+ var _response$pagination, _options$session2, _response$data, response, _callbacks$onError;
198
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
199
+ while (1) switch (_context.prev = _context.next) {
200
+ case 0:
201
+ if (transport.fetchSessions) {
202
+ _context.next = 2;
203
+ break;
204
+ }
205
+ return _context.abrupt("return");
206
+ case 2:
207
+ setState({
208
+ sessionLoading: true
209
+ });
210
+ _context.prev = 3;
211
+ _context.next = 6;
212
+ return transport.fetchSessions({
213
+ pageNum: state.sessionPagination.pageNum,
214
+ pageSize: state.sessionPagination.pageSize
215
+ });
216
+ case 6:
217
+ response = _context.sent;
218
+ setState({
219
+ sessionList: response.data || [],
220
+ sessionPagination: _objectSpread(_objectSpread({}, state.sessionPagination), {}, {
221
+ total: ((_response$pagination = response.pagination) === null || _response$pagination === void 0 ? void 0 : _response$pagination.total) || 0
222
+ })
223
+ });
224
+ if (!((_options$session2 = options.session) !== null && _options$session2 !== void 0 && _options$session2.showFirstSession && (_response$data = response.data) !== null && _response$data !== void 0 && (_response$data = _response$data[0]) !== null && _response$data !== void 0 && _response$data.sessionId)) {
225
+ _context.next = 11;
226
+ break;
227
+ }
228
+ _context.next = 11;
229
+ return controller.setCurrentSession(response.data[0].sessionId);
230
+ case 11:
231
+ _context.next = 16;
232
+ break;
233
+ case 13:
234
+ _context.prev = 13;
235
+ _context.t0 = _context["catch"](3);
236
+ callbacks === null || callbacks === void 0 || (_callbacks$onError = callbacks.onError) === null || _callbacks$onError === void 0 || _callbacks$onError.call(callbacks, _context.t0);
237
+ case 16:
238
+ _context.prev = 16;
239
+ setState({
240
+ sessionLoading: false
241
+ });
242
+ return _context.finish(16);
243
+ case 19:
244
+ case "end":
245
+ return _context.stop();
246
+ }
247
+ }, _callee, null, [[3, 13, 16, 19]]);
248
+ }));
249
+ return function loadSessions() {
250
+ return _ref2.apply(this, arguments);
251
+ };
252
+ }();
253
+
254
+ /**
255
+ * session events 轮询用于补齐后端异步产生的消息。
256
+ * 当前回复还在生成时不插入,避免流式拼接过程中消息数组结构被打乱。
257
+ */
258
+ var startSessionPolling = function startSessionPolling() {
259
+ var _options$session3;
260
+ if (!((_options$session3 = options.session) !== null && _options$session3 !== void 0 && _options$session3.pollSessionEvents) || !transport.fetchSessionEvents || pollingTimer) return;
261
+ var interval = Math.max(options.session.sessionEventsPollingInterval || 10000, 1000);
262
+ pollingTimer = setInterval(function () {
263
+ if (disposed || state.loading || !state.currentSessionId) return;
264
+ transport.fetchSessionEvents(state.currentSessionId).then(function (events) {
265
+ return controller.syncSessionEvents(events, state.currentSessionId);
266
+ }).catch(function (error) {
267
+ var _callbacks$onError2;
268
+ return callbacks === null || callbacks === void 0 || (_callbacks$onError2 = callbacks.onError) === null || _callbacks$onError2 === void 0 ? void 0 : _callbacks$onError2.call(callbacks, error);
269
+ });
270
+ }, interval);
271
+ };
272
+ var controller = {
273
+ getSnapshot: function getSnapshot() {
274
+ return state;
275
+ },
276
+ subscribe: function subscribe(subscriber) {
277
+ subscribers.add(subscriber);
278
+ return function () {
279
+ subscribers.delete(subscriber);
280
+ };
281
+ },
282
+ init: function () {
283
+ var _init = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
284
+ var _transport$fetchAppCo, _appInfo$onboardingIn, _appInfo$onboardingIn2, appInfo, _callbacks$onError3;
285
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
286
+ while (1) switch (_context2.prev = _context2.next) {
287
+ case 0:
288
+ if (!disposed) {
289
+ _context2.next = 2;
290
+ break;
291
+ }
292
+ return _context2.abrupt("return");
293
+ case 2:
294
+ setState({
295
+ sessionLoading: true
296
+ });
297
+ _context2.prev = 3;
298
+ _context2.next = 6;
299
+ return (_transport$fetchAppCo = transport.fetchAppConfig) === null || _transport$fetchAppCo === void 0 ? void 0 : _transport$fetchAppCo.call(transport);
300
+ case 6:
301
+ appInfo = _context2.sent;
302
+ setState({
303
+ appInfo: appInfo || null,
304
+ prologue: (appInfo === null || appInfo === void 0 || (_appInfo$onboardingIn = appInfo.onboardingInfo) === null || _appInfo$onboardingIn === void 0 ? void 0 : _appInfo$onboardingIn.prologue) || "",
305
+ suggestions: (appInfo === null || appInfo === void 0 || (_appInfo$onboardingIn2 = appInfo.onboardingInfo) === null || _appInfo$onboardingIn2 === void 0 ? void 0 : _appInfo$onboardingIn2.suggested_questions) || [],
306
+ initialized: true
307
+ });
308
+ _context2.next = 10;
309
+ return loadSessions();
310
+ case 10:
311
+ startSessionPolling();
312
+ _context2.next = 17;
313
+ break;
314
+ case 13:
315
+ _context2.prev = 13;
316
+ _context2.t0 = _context2["catch"](3);
317
+ callbacks === null || callbacks === void 0 || (_callbacks$onError3 = callbacks.onError) === null || _callbacks$onError3 === void 0 || _callbacks$onError3.call(callbacks, _context2.t0);
318
+ setState({
319
+ initialized: true
320
+ });
321
+ case 17:
322
+ _context2.prev = 17;
323
+ setState({
324
+ sessionLoading: false
325
+ });
326
+ return _context2.finish(17);
327
+ case 20:
328
+ case "end":
329
+ return _context2.stop();
330
+ }
331
+ }, _callee2, null, [[3, 13, 17, 20]]);
332
+ }));
333
+ function init() {
334
+ return _init.apply(this, arguments);
335
+ }
336
+ return init;
337
+ }(),
338
+ destroy: function destroy() {
339
+ var _ctrl;
340
+ disposed = true;
341
+ (_ctrl = ctrl) === null || _ctrl === void 0 || _ctrl.abort();
342
+ if (pollingTimer) clearInterval(pollingTimer);
343
+ pollingTimer = null;
344
+ subscribers.clear();
345
+ },
346
+ startChat: function () {
347
+ var _startChat = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(content) {
348
+ var _content$text, _content$files, _ctrl2;
349
+ var payload, requestStream, _callbacks$onError4, completedMessage, _callbacks$onMessage;
350
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
351
+ while (1) switch (_context3.prev = _context3.next) {
352
+ case 0:
353
+ if (!state.loading) {
354
+ _context3.next = 2;
355
+ break;
356
+ }
357
+ return _context3.abrupt("return");
358
+ case 2:
359
+ if (!(!((_content$text = content.text) !== null && _content$text !== void 0 && _content$text.trim()) && !((_content$files = content.files) !== null && _content$files !== void 0 && _content$files.length) && !content.functionResponse)) {
360
+ _context3.next = 4;
361
+ break;
362
+ }
363
+ return _context3.abrupt("return");
364
+ case 4:
365
+ (_ctrl2 = ctrl) === null || _ctrl2 === void 0 || _ctrl2.abort();
366
+ ctrl = new AbortController();
367
+ textMessage = null;
368
+ setState({
369
+ loading: true,
370
+ suggestions: []
371
+ });
372
+ appendMessages(buildAdkUserMessage(content));
373
+ payload = requestBuilder({
374
+ content: content,
375
+ sessionId: state.currentSessionId,
376
+ stateDelta: stateDelta
377
+ });
378
+ requestStream = payload.stream !== false;
379
+ _context3.prev = 11;
380
+ _context3.next = 14;
381
+ return transport.sendMessageStreaming(payload, {
382
+ signal: ctrl.signal,
383
+ onEvent: function onEvent(event) {
384
+ return processEvent(event, requestStream);
385
+ },
386
+ onError: callbacks === null || callbacks === void 0 ? void 0 : callbacks.onError,
387
+ onClose: callbacks === null || callbacks === void 0 ? void 0 : callbacks.onRequestComplete
388
+ });
389
+ case 14:
390
+ _context3.next = 19;
391
+ break;
392
+ case 16:
393
+ _context3.prev = 16;
394
+ _context3.t0 = _context3["catch"](11);
395
+ if ((_context3.t0 === null || _context3.t0 === void 0 ? void 0 : _context3.t0.name) !== "AbortError") callbacks === null || callbacks === void 0 || (_callbacks$onError4 = callbacks.onError) === null || _callbacks$onError4 === void 0 || _callbacks$onError4.call(callbacks, _context3.t0);
396
+ case 19:
397
+ _context3.prev = 19;
398
+ setState({
399
+ loading: false
400
+ });
401
+ completedMessage = textMessage;
402
+ if (completedMessage) {
403
+ callbacks === null || callbacks === void 0 || (_callbacks$onMessage = callbacks.onMessage) === null || _callbacks$onMessage === void 0 || _callbacks$onMessage.call(callbacks, completedMessage.text || "", completedMessage);
404
+ }
405
+ textMessage = null;
406
+ return _context3.finish(19);
407
+ case 25:
408
+ case "end":
409
+ return _context3.stop();
410
+ }
411
+ }, _callee3, null, [[11, 16, 19, 25]]);
412
+ }));
413
+ function startChat(_x) {
414
+ return _startChat.apply(this, arguments);
415
+ }
416
+ return startChat;
417
+ }(),
418
+ stopChat: function () {
419
+ var _stopChat = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
420
+ var _ctrl4;
421
+ var _transport$interrupt, _ctrl3;
422
+ return _regeneratorRuntime().wrap(function _callee4$(_context4) {
423
+ while (1) switch (_context4.prev = _context4.next) {
424
+ case 0:
425
+ _context4.prev = 0;
426
+ _context4.next = 3;
427
+ return (_transport$interrupt = transport.interrupt) === null || _transport$interrupt === void 0 ? void 0 : _transport$interrupt.call(transport, state.currentSessionId);
428
+ case 3:
429
+ _context4.next = 8;
430
+ break;
431
+ case 5:
432
+ _context4.prev = 5;
433
+ _context4.t0 = _context4["catch"](0);
434
+ (_ctrl3 = ctrl) === null || _ctrl3 === void 0 || _ctrl3.abort();
435
+ case 8:
436
+ (_ctrl4 = ctrl) === null || _ctrl4 === void 0 || _ctrl4.abort();
437
+ textMessage = null;
438
+ setState({
439
+ loading: false
440
+ });
441
+ case 11:
442
+ case "end":
443
+ return _context4.stop();
444
+ }
445
+ }, _callee4, null, [[0, 5]]);
446
+ }));
447
+ function stopChat() {
448
+ return _stopChat.apply(this, arguments);
449
+ }
450
+ return stopChat;
451
+ }(),
452
+ reChat: function () {
453
+ var _reChat = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5() {
454
+ var lastUserIndex, lastUserMessage, nextMessages;
455
+ return _regeneratorRuntime().wrap(function _callee5$(_context5) {
456
+ while (1) switch (_context5.prev = _context5.next) {
457
+ case 0:
458
+ lastUserIndex = state.messages.findLastIndex(function (message) {
459
+ return message.role === "user" && !message.functionResponse;
460
+ });
461
+ if (!(lastUserIndex < 0)) {
462
+ _context5.next = 3;
463
+ break;
464
+ }
465
+ return _context5.abrupt("return");
466
+ case 3:
467
+ lastUserMessage = state.messages[lastUserIndex]; // 先截断最后一条用户消息及其后的回复,再复用 startChat 重新插入用户消息并发起请求。
468
+ nextMessages = state.messages.slice(0, lastUserIndex);
469
+ setMessages(nextMessages);
470
+ _context5.next = 8;
471
+ return controller.startChat({
472
+ text: lastUserMessage.text || "",
473
+ files: (lastUserMessage.fileData || []).map(function (file) {
474
+ return {
475
+ fileName: file.displayName,
476
+ tempUrl: file.fileUri,
477
+ mimeType: file.mimeType
478
+ };
479
+ })
480
+ });
481
+ case 8:
482
+ case "end":
483
+ return _context5.stop();
484
+ }
485
+ }, _callee5);
486
+ }));
487
+ function reChat() {
488
+ return _reChat.apply(this, arguments);
489
+ }
490
+ return reChat;
491
+ }(),
492
+ clearChat: function clearChat() {
493
+ var _ctrl5, _state$appInfo, _state$appInfo2;
494
+ (_ctrl5 = ctrl) === null || _ctrl5 === void 0 || _ctrl5.abort();
495
+ textMessage = null;
496
+ setState({
497
+ currentSessionId: v4(),
498
+ messages: [],
499
+ loading: false,
500
+ prologue: ((_state$appInfo = state.appInfo) === null || _state$appInfo === void 0 || (_state$appInfo = _state$appInfo.onboardingInfo) === null || _state$appInfo === void 0 ? void 0 : _state$appInfo.prologue) || "",
501
+ suggestions: ((_state$appInfo2 = state.appInfo) === null || _state$appInfo2 === void 0 || (_state$appInfo2 = _state$appInfo2.onboardingInfo) === null || _state$appInfo2 === void 0 ? void 0 : _state$appInfo2.suggested_questions) || []
502
+ });
503
+ },
504
+ suggestChat: function () {
505
+ var _suggestChat = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee6(suggestion) {
506
+ return _regeneratorRuntime().wrap(function _callee6$(_context6) {
507
+ while (1) switch (_context6.prev = _context6.next) {
508
+ case 0:
509
+ _context6.next = 2;
510
+ return controller.startChat({
511
+ text: suggestion
512
+ });
513
+ case 2:
514
+ case "end":
515
+ return _context6.stop();
516
+ }
517
+ }, _callee6);
518
+ }));
519
+ function suggestChat(_x2) {
520
+ return _suggestChat.apply(this, arguments);
521
+ }
522
+ return suggestChat;
523
+ }(),
524
+ confirmFnCall: function () {
525
+ var _confirmFnCall = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee7(fnCall, confirmed) {
526
+ return _regeneratorRuntime().wrap(function _callee7$(_context7) {
527
+ while (1) switch (_context7.prev = _context7.next) {
528
+ case 0:
529
+ _context7.next = 2;
530
+ return controller.startChat({
531
+ functionResponse: createFunctionResponse(fnCall, confirmed)
532
+ });
533
+ case 2:
534
+ case "end":
535
+ return _context7.stop();
536
+ }
537
+ }, _callee7);
538
+ }));
539
+ function confirmFnCall(_x3, _x4) {
540
+ return _confirmFnCall.apply(this, arguments);
541
+ }
542
+ return confirmFnCall;
543
+ }(),
544
+ switchSession: function () {
545
+ var _switchSession = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee8(sessionId) {
546
+ return _regeneratorRuntime().wrap(function _callee8$(_context8) {
547
+ while (1) switch (_context8.prev = _context8.next) {
548
+ case 0:
549
+ return _context8.abrupt("return", controller.setCurrentSession(sessionId));
550
+ case 1:
551
+ case "end":
552
+ return _context8.stop();
553
+ }
554
+ }, _callee8);
555
+ }));
556
+ function switchSession(_x5) {
557
+ return _switchSession.apply(this, arguments);
558
+ }
559
+ return switchSession;
560
+ }(),
561
+ setCurrentSession: function () {
562
+ var _setCurrentSession = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee9(sessionId) {
563
+ var _ctrl6;
564
+ var events, _callbacks$onError5;
565
+ return _regeneratorRuntime().wrap(function _callee9$(_context9) {
566
+ while (1) switch (_context9.prev = _context9.next) {
567
+ case 0:
568
+ if (!(!sessionId || sessionId === state.currentSessionId)) {
569
+ _context9.next = 2;
570
+ break;
571
+ }
572
+ return _context9.abrupt("return");
573
+ case 2:
574
+ (_ctrl6 = ctrl) === null || _ctrl6 === void 0 || _ctrl6.abort();
575
+ textMessage = null;
576
+ setState({
577
+ currentSessionId: sessionId,
578
+ loading: false,
579
+ messages: [],
580
+ suggestions: []
581
+ });
582
+ if (transport.fetchSessionEvents) {
583
+ _context9.next = 7;
584
+ break;
585
+ }
586
+ return _context9.abrupt("return");
587
+ case 7:
588
+ setState({
589
+ sessionLoading: true
590
+ });
591
+ _context9.prev = 8;
592
+ _context9.next = 11;
593
+ return transport.fetchSessionEvents(sessionId);
594
+ case 11:
595
+ events = _context9.sent;
596
+ controller.replaceSessionEvents(events);
597
+ _context9.next = 18;
598
+ break;
599
+ case 15:
600
+ _context9.prev = 15;
601
+ _context9.t0 = _context9["catch"](8);
602
+ callbacks === null || callbacks === void 0 || (_callbacks$onError5 = callbacks.onError) === null || _callbacks$onError5 === void 0 || _callbacks$onError5.call(callbacks, _context9.t0);
603
+ case 18:
604
+ _context9.prev = 18;
605
+ setState({
606
+ sessionLoading: false
607
+ });
608
+ return _context9.finish(18);
609
+ case 21:
610
+ case "end":
611
+ return _context9.stop();
612
+ }
613
+ }, _callee9, null, [[8, 15, 18, 21]]);
614
+ }));
615
+ function setCurrentSession(_x6) {
616
+ return _setCurrentSession.apply(this, arguments);
617
+ }
618
+ return setCurrentSession;
619
+ }(),
620
+ deleteSession: function () {
621
+ var _deleteSession = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee10(sessionId) {
622
+ var _yield$transport$clos, _transport$closeSessi;
623
+ var success;
624
+ return _regeneratorRuntime().wrap(function _callee10$(_context10) {
625
+ while (1) switch (_context10.prev = _context10.next) {
626
+ case 0:
627
+ _context10.next = 2;
628
+ return (_transport$closeSessi = transport.closeSession) === null || _transport$closeSessi === void 0 ? void 0 : _transport$closeSessi.call(transport, sessionId);
629
+ case 2:
630
+ _context10.t1 = _yield$transport$clos = _context10.sent;
631
+ _context10.t0 = _context10.t1 !== null;
632
+ if (!_context10.t0) {
633
+ _context10.next = 6;
634
+ break;
635
+ }
636
+ _context10.t0 = _yield$transport$clos !== void 0;
637
+ case 6:
638
+ if (!_context10.t0) {
639
+ _context10.next = 10;
640
+ break;
641
+ }
642
+ _context10.t2 = _yield$transport$clos;
643
+ _context10.next = 11;
644
+ break;
645
+ case 10:
646
+ _context10.t2 = false;
647
+ case 11:
648
+ success = _context10.t2;
649
+ if (success) {
650
+ setState(function (current) {
651
+ return _objectSpread(_objectSpread({}, current), {}, {
652
+ sessionList: current.sessionList.filter(function (session) {
653
+ return session.sessionId !== sessionId;
654
+ })
655
+ });
656
+ });
657
+ if (sessionId === state.currentSessionId) controller.clearChat();
658
+ }
659
+ return _context10.abrupt("return", success);
660
+ case 14:
661
+ case "end":
662
+ return _context10.stop();
663
+ }
664
+ }, _callee10);
665
+ }));
666
+ function deleteSession(_x7) {
667
+ return _deleteSession.apply(this, arguments);
668
+ }
669
+ return deleteSession;
670
+ }(),
671
+ updateSession: function () {
672
+ var _updateSession = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee11(sessionId, title) {
673
+ var _yield$transport$upda, _transport$updateSess;
674
+ var success;
675
+ return _regeneratorRuntime().wrap(function _callee11$(_context11) {
676
+ while (1) switch (_context11.prev = _context11.next) {
677
+ case 0:
678
+ _context11.next = 2;
679
+ return (_transport$updateSess = transport.updateSessionTitle) === null || _transport$updateSess === void 0 ? void 0 : _transport$updateSess.call(transport, sessionId, title);
680
+ case 2:
681
+ _context11.t1 = _yield$transport$upda = _context11.sent;
682
+ _context11.t0 = _context11.t1 !== null;
683
+ if (!_context11.t0) {
684
+ _context11.next = 6;
685
+ break;
686
+ }
687
+ _context11.t0 = _yield$transport$upda !== void 0;
688
+ case 6:
689
+ if (!_context11.t0) {
690
+ _context11.next = 10;
691
+ break;
692
+ }
693
+ _context11.t2 = _yield$transport$upda;
694
+ _context11.next = 11;
695
+ break;
696
+ case 10:
697
+ _context11.t2 = false;
698
+ case 11:
699
+ success = _context11.t2;
700
+ if (success) {
701
+ setState(function (current) {
702
+ return _objectSpread(_objectSpread({}, current), {}, {
703
+ sessionList: current.sessionList.map(function (session) {
704
+ return session.sessionId === sessionId ? _objectSpread(_objectSpread({}, session), {}, {
705
+ title: title
706
+ }) : session;
707
+ })
708
+ });
709
+ });
710
+ }
711
+ return _context11.abrupt("return", success);
712
+ case 14:
713
+ case "end":
714
+ return _context11.stop();
715
+ }
716
+ }, _callee11);
717
+ }));
718
+ function updateSession(_x8, _x9) {
719
+ return _updateSession.apply(this, arguments);
720
+ }
721
+ return updateSession;
722
+ }(),
723
+ likeMessage: transport.feedback,
724
+ replaceSessionEvents: function replaceSessionEvents(events) {
725
+ // 切换历史会话时用服务端完整事件重建消息列表。
726
+ setMessages(mapAdkSessionEventsToMessages(events, protocol));
727
+ },
728
+ syncSessionEvents: function syncSessionEvents(events, sessionId) {
729
+ if (sessionId && sessionId !== state.currentSessionId) return;
730
+ // 轮询增量同步时只补齐页面尚未展示的模型事件。
731
+ setMessages(function (prev) {
732
+ return insertMissingAdkSessionEvents(prev, events, protocol);
733
+ });
734
+ },
735
+ setMessages: setMessages,
736
+ setStateDelta: function setStateDelta(delta) {
737
+ stateDelta = delta;
738
+ }
739
+ };
740
+ return controller;
741
+ };
742
+ //# sourceMappingURL=createAdkConversationController.js.map