cozy-search 0.23.0 → 0.23.2

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.
@@ -59,7 +59,7 @@ var AssistantContainer = function AssistantContainer() {
59
59
  className: "u-w-5 u-pb-0-t u-pb-1"
60
60
  }), /*#__PURE__*/_react.default.createElement(_PrettyScrollbar.default, {
61
61
  className: "u-flex-auto u-flex u-flex-column u-pb-0-t u-pb-1 u-ov-hidden"
62
- }, isOpenSearchConversation && (0, _cozyFlags.default)('cozy.search-conversation.enabled') ? /*#__PURE__*/_react.default.createElement(_SearchConversation.default, null) : /*#__PURE__*/_react.default.createElement(_CozyAssistantRuntimeProvider.default, null, /*#__PURE__*/_react.default.createElement(_Conversation.default, null))), openedKnowledgePanel && (0, _cozyFlags.default)('cozy.source-knowledge.enabled') && /*#__PURE__*/_react.default.createElement("div", {
62
+ }, isOpenSearchConversation && (0, _cozyFlags.default)('cozy.assistant.search-conversation.enabled') ? /*#__PURE__*/_react.default.createElement(_SearchConversation.default, null) : /*#__PURE__*/_react.default.createElement(_CozyAssistantRuntimeProvider.default, null, /*#__PURE__*/_react.default.createElement(_Conversation.default, null))), openedKnowledgePanel && (0, _cozyFlags.default)('cozy.assistant.source-knowledge.enabled') && /*#__PURE__*/_react.default.createElement("div", {
63
63
  className: (0, _classnames.default)('u-h-100 u-maw-7 u-pl-half', styles["knowledge-panel--".concat(theme)])
64
64
  }, /*#__PURE__*/_react.default.createElement(_TwakeKnowledgePanel.default, {
65
65
  onClose: function onClose() {
@@ -182,7 +182,7 @@ var ConversationActions = function ConversationActions(_ref) {
182
182
  };
183
183
  }();
184
184
 
185
- var actions = (0, _Actions.makeActions)([_rename.rename, (0, _cozyFlags.default)('cozy.conversation-sharing.enabled') && _share.share, _delete.remove].filter(Boolean), {
185
+ var actions = (0, _Actions.makeActions)([_rename.rename, (0, _cozyFlags.default)('cozy.assistant.conversation-sharing.enabled') && _share.share, _delete.remove].filter(Boolean), {
186
186
  t: t,
187
187
  onRename: handleOpenRename,
188
188
  onDelete: function onDelete() {
@@ -83,9 +83,9 @@ var ConversationComposer = function ConversationComposer() {
83
83
  onSend: handleSend
84
84
  }), /*#__PURE__*/_react2.default.createElement("div", {
85
85
  className: "u-flex u-flex-items-center u-flex-justify-between u-mt-1"
86
- }, (0, _cozyFlags.default)('cozy.create-assistant.enabled') && /*#__PURE__*/_react2.default.createElement(_AssistantSelection.default, {
86
+ }, (0, _cozyFlags.default)('cozy.assistant.create-assistant.enabled') && /*#__PURE__*/_react2.default.createElement(_AssistantSelection.default, {
87
87
  disabled: !isThreadEmpty
88
- }), (0, _cozyFlags.default)('cozy.source-knowledge.enabled') && /*#__PURE__*/_react2.default.createElement(_TwakeKnowledgeSelector.default, {
88
+ }), (0, _cozyFlags.default)('cozy.assistant.source-knowledge.enabled') && /*#__PURE__*/_react2.default.createElement(_TwakeKnowledgeSelector.default, {
89
89
  onSelectTwakeKnowledge: setOpenedKnowledgePanel
90
90
  })));
91
91
  };
@@ -70,8 +70,18 @@ var Sources = function Sources(_ref) {
70
70
  }, []);
71
71
  (0, _react.useEffect)(function () {
72
72
  if (showSources) {
73
+ var _ref$current2;
74
+
75
+ var innerContainer = (_ref$current2 = ref.current) === null || _ref$current2 === void 0 ? void 0 : _ref$current2.closest('.cozyDialogContent');
76
+
77
+ if (!innerContainer) {
78
+ var _ref$current3;
79
+
80
+ (_ref$current3 = ref.current) === null || _ref$current3 === void 0 ? void 0 : _ref$current3.scrollIntoView(false);
81
+ return;
82
+ }
83
+
73
84
  var sourcesBottom = ref.current.getBoundingClientRect().bottom;
74
- var innerContainer = document.getElementsByClassName('cozyDialogContent')[0];
75
85
  var innerContainerBottom = innerContainer.getBoundingClientRect().bottom;
76
86
 
77
87
  if (sourcesBottom > innerContainerBottom) {
@@ -205,6 +205,10 @@ var CozyAssistantRuntimeProviderInner = function CozyAssistantRuntimeProviderInn
205
205
  streamBridgeRef.current.onDelta(conversationId, res.content, res.position);
206
206
  }
207
207
 
208
+ if (res.object === 'sources') {
209
+ streamBridgeRef.current.onSources(conversationId, res.content);
210
+ }
211
+
208
212
  if (res.object === 'done') {
209
213
  streamBridgeRef.current.onDone(conversationId);
210
214
  currentStreamingMessageIdRef.current = null;
@@ -128,7 +128,7 @@ var Sidebar = function Sidebar(_ref) {
128
128
  icon: _Burger.default,
129
129
  "aria-hidden": "true"
130
130
  })
131
- })), /*#__PURE__*/_react.default.createElement("div", null, sidebarOpen && (0, _cozyFlags.default)('cozy.search-conversation.enabled') && /*#__PURE__*/_react.default.createElement(_IconButton.default, {
131
+ })), /*#__PURE__*/_react.default.createElement("div", null, sidebarOpen && (0, _cozyFlags.default)('cozy.assistant.search-conversation.enabled') && /*#__PURE__*/_react.default.createElement(_IconButton.default, {
132
132
  size: "medium",
133
133
  className: "u-bdrs-6",
134
134
  onClick: onToggleSearch,
@@ -9,6 +9,8 @@ exports.createCozyRealtimeChatAdapter = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
12
14
  var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/awaitAsyncGenerator"));
13
15
 
14
16
  var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator"));
@@ -17,6 +19,10 @@ var _cozyMinilog = _interopRequireDefault(require("cozy-minilog"));
17
19
 
18
20
  var _helpers = require("../helpers");
19
21
 
22
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
23
+
24
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
25
+
20
26
  function _asyncIterator(iterable) { var method, async, sync, retry = 2; for ("undefined" != typeof Symbol && (async = Symbol.asyncIterator, sync = Symbol.iterator); retry--;) { if (async && null != (method = iterable[async])) return method.call(iterable); if (sync && null != (method = iterable[sync])) return new AsyncFromSyncIterator(method.call(iterable)); async = "@@asyncIterator", sync = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
21
27
 
22
28
  function AsyncFromSyncIterator(s) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var done = r.done; return Promise.resolve(r.value).then(function (value) { return { value: value, done: done }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(s) { this.s = s, this.n = s.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, return: function _return(value) { var ret = this.s.return; return void 0 === ret ? Promise.resolve({ value: value, done: !0 }) : AsyncFromSyncIteratorContinuation(ret.apply(this.s, arguments)); }, throw: function _throw(value) { var thr = this.s.return; return void 0 === thr ? Promise.reject(value) : AsyncFromSyncIteratorContinuation(thr.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(s); }
@@ -58,7 +64,7 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
58
64
  var messages = _ref.messages,
59
65
  abortSignal = _ref.abortSignal;
60
66
  return (0, _wrapAsyncGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
61
- var client, conversationId, streamBridge, assistantId, userQuery, stream, fullText, wasAborted, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, sanitizedText, finalText;
67
+ var client, conversationId, streamBridge, assistantId, userQuery, stream, fullText, wasAborted, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, sanitizedText, finalText, sources;
62
68
 
63
69
  return _regenerator.default.wrap(function _callee$(_context) {
64
70
  while (1) {
@@ -185,13 +191,14 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
185
191
 
186
192
  case 48:
187
193
  if (wasAborted) {
188
- _context.next = 53;
194
+ _context.next = 54;
189
195
  break;
190
196
  }
191
197
 
192
198
  finalText = (0, _helpers.sanitizeChatContent)(fullText);
193
- _context.next = 52;
194
- return {
199
+ sources = streamBridge.getSources(conversationId);
200
+ _context.next = 53;
201
+ return _objectSpread({
195
202
  content: [{
196
203
  type: 'text',
197
204
  text: finalText
@@ -200,21 +207,27 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
200
207
  type: 'complete',
201
208
  reason: 'stop'
202
209
  }
203
- };
210
+ }, sources ? {
211
+ metadata: {
212
+ custom: {
213
+ sources: sources
214
+ }
215
+ }
216
+ } : {});
204
217
 
205
- case 52:
218
+ case 53:
206
219
  streamBridge.cleanup(conversationId);
207
220
 
208
- case 53:
209
- _context.next = 61;
221
+ case 54:
222
+ _context.next = 62;
210
223
  break;
211
224
 
212
- case 55:
213
- _context.prev = 55;
225
+ case 56:
226
+ _context.prev = 56;
214
227
  _context.t1 = _context["catch"](6);
215
228
  log.error('Error:', _context.t1);
216
229
  streamBridge.cleanup(conversationId);
217
- _context.next = 61;
230
+ _context.next = 62;
218
231
  return {
219
232
  content: [{
220
233
  type: 'text',
@@ -226,12 +239,12 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
226
239
  }
227
240
  };
228
241
 
229
- case 61:
242
+ case 62:
230
243
  case "end":
231
244
  return _context.stop();
232
245
  }
233
246
  }
234
- }, _callee, null, [[6, 55], [15, 34, 38, 48], [39,, 43, 47]]);
247
+ }, _callee, null, [[6, 56], [15, 34, 38, 48], [39,, 43, 47]]);
235
248
  }))();
236
249
  }
237
250
  };
@@ -10,6 +10,7 @@ export declare class StreamBridge {
10
10
  private cleanupCallback;
11
11
  private positionBuffers;
12
12
  private nextPositions;
13
+ private sourcesMap;
13
14
  /**
14
15
  * Sets a callback to be invoked when cleanup is called.
15
16
  * This allows the provider to mark the current message as cancelled.
@@ -31,6 +32,21 @@ export declare class StreamBridge {
31
32
  * Completes the stream for the conversation.
32
33
  */
33
34
  onDone(conversationId: string): void;
35
+ /**
36
+ * Called when a 'sources' event is received from WebSocket.
37
+ * Stores sources for the conversation to be retrieved by the adapter.
38
+ */
39
+ onSources(conversationId: string, sources: Array<{
40
+ id: string;
41
+ doctype?: string;
42
+ }>): void;
43
+ /**
44
+ * Returns stored sources for a conversation.
45
+ */
46
+ getSources(conversationId: string): Array<{
47
+ id: string;
48
+ doctype?: string;
49
+ }> | undefined;
34
50
  /**
35
51
  * Called when an error occurs.
36
52
  * Errors the stream for the conversation.
@@ -27,6 +27,7 @@ var StreamBridge = /*#__PURE__*/function () {
27
27
  (0, _defineProperty2.default)(this, "cleanupCallback", null);
28
28
  (0, _defineProperty2.default)(this, "positionBuffers", new Map());
29
29
  (0, _defineProperty2.default)(this, "nextPositions", new Map());
30
+ (0, _defineProperty2.default)(this, "sourcesMap", new Map());
30
31
  }
31
32
 
32
33
  (0, _createClass2.default)(StreamBridge, [{
@@ -200,6 +201,26 @@ var StreamBridge = /*#__PURE__*/function () {
200
201
  this.nextPositions.delete(conversationId);
201
202
  }
202
203
  }
204
+ /**
205
+ * Called when a 'sources' event is received from WebSocket.
206
+ * Stores sources for the conversation to be retrieved by the adapter.
207
+ */
208
+
209
+ }, {
210
+ key: "onSources",
211
+ value: function onSources(conversationId, sources) {
212
+ if (!this.streams.has(conversationId)) return;
213
+ this.sourcesMap.set(conversationId, sources);
214
+ }
215
+ /**
216
+ * Returns stored sources for a conversation.
217
+ */
218
+
219
+ }, {
220
+ key: "getSources",
221
+ value: function getSources(conversationId) {
222
+ return this.sourcesMap.get(conversationId);
223
+ }
203
224
  /**
204
225
  * Called when an error occurs.
205
226
  * Errors the stream for the conversation.
@@ -212,9 +233,11 @@ var StreamBridge = /*#__PURE__*/function () {
212
233
 
213
234
  if (stream) {
214
235
  stream.error(error);
215
- this.positionBuffers.delete(conversationId);
216
- this.nextPositions.delete(conversationId);
217
236
  }
237
+
238
+ this.positionBuffers.delete(conversationId);
239
+ this.nextPositions.delete(conversationId);
240
+ this.sourcesMap.delete(conversationId);
218
241
  }
219
242
  /**
220
243
  * Cleans up the stream for a conversation.
@@ -233,9 +256,11 @@ var StreamBridge = /*#__PURE__*/function () {
233
256
 
234
257
  stream.complete();
235
258
  this.streams.delete(conversationId);
236
- this.positionBuffers.delete(conversationId);
237
- this.nextPositions.delete(conversationId);
238
259
  }
260
+
261
+ this.positionBuffers.delete(conversationId);
262
+ this.nextPositions.delete(conversationId);
263
+ this.sourcesMap.delete(conversationId);
239
264
  }
240
265
  /**
241
266
  * Checks if there's an active stream for a conversation.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "cozy-search",
3
3
  "description": "UI components about search bar and IA assistant",
4
- "version": "0.23.0",
4
+ "version": "0.23.2",
5
5
  "author": {
6
6
  "name": "Cozy Cloud",
7
7
  "url": "https://github.com/cozy"
@@ -94,5 +94,5 @@
94
94
  "lint": "cd .. && yarn eslint --ext js,jsx,ts packages/cozy-search"
95
95
  },
96
96
  "types": "dist/index.d.ts",
97
- "gitHead": "7d0b0b566aae3b7601b60eb3f2910d6920f049ba"
97
+ "gitHead": "447d3d18c58cda9265ae8f73733993ea05be9fbb"
98
98
  }