cozy-search 0.25.2 → 0.26.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.
@@ -25,6 +25,8 @@ export interface AssistantContextValue {
25
25
  setSelectedTwakeKnowledge: React.Dispatch<
26
26
  React.SetStateAction<TwakeKnowledgeState>
27
27
  >
28
+ websearchEnabled: boolean
29
+ setWebsearchEnabled: React.Dispatch<React.SetStateAction<boolean>>
28
30
  }
29
31
 
30
32
  export function useAssistant(): AssistantContextValue
@@ -84,6 +84,11 @@ var AssistantProvider = function AssistantProvider(_ref) {
84
84
  openedKnowledgePanel = _useState16[0],
85
85
  setOpenedKnowledgePanel = _useState16[1];
86
86
 
87
+ var _useState17 = (0, _react.useState)(false),
88
+ _useState18 = (0, _slicedToArray2.default)(_useState17, 2),
89
+ websearchEnabled = _useState18[0],
90
+ setWebsearchEnabled = _useState18[1];
91
+
87
92
  var value = (0, _react.useMemo)(function () {
88
93
  return {
89
94
  isOpenCreateAssistant: isOpenCreateAssistant,
@@ -101,9 +106,11 @@ var AssistantProvider = function AssistantProvider(_ref) {
101
106
  setSelectedAssistantId: setSelectedAssistantId,
102
107
  setIsOpenSearchConversation: setIsOpenSearchConversation,
103
108
  setOpenedKnowledgePanel: setOpenedKnowledgePanel,
104
- setSelectedTwakeKnowledge: setSelectedTwakeKnowledge
109
+ setSelectedTwakeKnowledge: setSelectedTwakeKnowledge,
110
+ websearchEnabled: websearchEnabled,
111
+ setWebsearchEnabled: setWebsearchEnabled
105
112
  };
106
- }, [isOpenCreateAssistant, isOpenDeleteAssistant, isOpenEditAssistant, assistantIdInAction, selectedAssistantId, isOpenSearchConversation, openedKnowledgePanel, selectedTwakeKnowledge]);
113
+ }, [isOpenCreateAssistant, isOpenDeleteAssistant, isOpenEditAssistant, assistantIdInAction, selectedAssistantId, isOpenSearchConversation, openedKnowledgePanel, selectedTwakeKnowledge, websearchEnabled]);
107
114
  return /*#__PURE__*/_react.default.createElement(AssistantContext.Provider, {
108
115
  value: value
109
116
  }, children);
@@ -1,5 +1,5 @@
1
1
  export default ConversationBar;
2
- declare function ConversationBar({ value, isEmpty, isRunning, onKeyDown, onSend, onCancel, ...props }: {
2
+ declare function ConversationBar({ value, isEmpty, isRunning, onKeyDown, onSend, onCancel, websearchEnabled, onToggleWebsearch, ...props }: {
3
3
  [x: string]: any;
4
4
  value: any;
5
5
  isEmpty: any;
@@ -7,4 +7,6 @@ declare function ConversationBar({ value, isEmpty, isRunning, onKeyDown, onSend,
7
7
  onKeyDown: any;
8
8
  onSend: any;
9
9
  onCancel: any;
10
+ websearchEnabled: any;
11
+ onToggleWebsearch: any;
10
12
  }): JSX.Element;
@@ -37,7 +37,9 @@ var _Breakpoints = require("cozy-ui/transpiled/react/providers/Breakpoints");
37
37
 
38
38
  var _twakeI18n = require("twake-i18n");
39
39
 
40
- var _excluded = ["value", "isEmpty", "isRunning", "onKeyDown", "onSend", "onCancel"];
40
+ var _WebsearchButton = _interopRequireDefault(require("./WebsearchButton"));
41
+
42
+ var _excluded = ["value", "isEmpty", "isRunning", "onKeyDown", "onSend", "onCancel", "websearchEnabled", "onToggleWebsearch"];
41
43
 
42
44
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
43
45
 
@@ -75,6 +77,8 @@ var ConversationBar = function ConversationBar(_ref) {
75
77
  onKeyDown = _ref.onKeyDown,
76
78
  onSend = _ref.onSend,
77
79
  onCancel = _ref.onCancel,
80
+ websearchEnabled = _ref.websearchEnabled,
81
+ onToggleWebsearch = _ref.onToggleWebsearch,
78
82
  props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
79
83
 
80
84
  var _useI18n = (0, _twakeI18n.useI18n)(),
@@ -127,7 +131,10 @@ var ConversationBar = function ConversationBar(_ref) {
127
131
  },
128
132
  autoFocus: !isMobile,
129
133
  inputComponent: _react.ComposerPrimitive.Input,
130
- endAdornment: isRunning ? /*#__PURE__*/_react2.default.createElement(_IconButton.default, {
134
+ endAdornment: /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, /*#__PURE__*/_react2.default.createElement(_WebsearchButton.default, {
135
+ websearchEnabled: websearchEnabled,
136
+ onToggleWebsearch: onToggleWebsearch
137
+ }), isRunning ? /*#__PURE__*/_react2.default.createElement(_IconButton.default, {
131
138
  className: "u-p-0 u-mr-half"
132
139
  }, /*#__PURE__*/_react2.default.createElement(_Buttons.default, {
133
140
  size: "small",
@@ -157,7 +164,7 @@ var ConversationBar = function ConversationBar(_ref) {
157
164
  }),
158
165
  disabled: isEmpty,
159
166
  onClick: handleSend
160
- })),
167
+ }))),
161
168
  onKeyDown: handleKeyDown
162
169
  }
163
170
  }
@@ -42,7 +42,9 @@ var ConversationComposer = function ConversationComposer() {
42
42
  });
43
43
 
44
44
  var _useAssistant = (0, _AssistantProvider.useAssistant)(),
45
- setOpenedKnowledgePanel = _useAssistant.setOpenedKnowledgePanel;
45
+ setOpenedKnowledgePanel = _useAssistant.setOpenedKnowledgePanel,
46
+ websearchEnabled = _useAssistant.websearchEnabled,
47
+ setWebsearchEnabled = _useAssistant.setWebsearchEnabled;
46
48
 
47
49
  var value = (0, _react.useComposer)(function (state) {
48
50
  return state.text;
@@ -68,6 +70,12 @@ var ConversationComposer = function ConversationComposer() {
68
70
  }
69
71
  }
70
72
  }, [isMobile, handleSend]);
73
+ var handleToggleWebsearch = (0, _react2.useCallback)(function () {
74
+ if (isRunning) return;
75
+ setWebsearchEnabled(function (prev) {
76
+ return !prev;
77
+ });
78
+ }, [isRunning, setWebsearchEnabled]);
71
79
  return /*#__PURE__*/_react2.default.createElement(_react.ComposerPrimitive.Root, {
72
80
  className: (0, _classnames.default)('u-w-100 u-maw-7 u-mh-auto', {
73
81
  'u-card u-bxz u-elevation-1': isMobile
@@ -80,7 +88,9 @@ var ConversationComposer = function ConversationComposer() {
80
88
  isRunning: isRunning,
81
89
  onKeyDown: handleKeyDown,
82
90
  onCancel: handleCancel,
83
- onSend: handleSend
91
+ onSend: handleSend,
92
+ websearchEnabled: websearchEnabled,
93
+ onToggleWebsearch: handleToggleWebsearch
84
94
  }), /*#__PURE__*/_react2.default.createElement("div", {
85
95
  className: "u-flex u-flex-items-center u-flex-justify-between u-mt-1"
86
96
  }, (0, _cozyFlags.default)('cozy.assistant.create-assistant.enabled') && /*#__PURE__*/_react2.default.createElement(_AssistantSelection.default, {
@@ -33,6 +33,8 @@ var _EmailSourceItem = _interopRequireDefault(require("./EmailSourceItem"));
33
33
 
34
34
  var _FileSourcesItem = _interopRequireDefault(require("./FileSourcesItem"));
35
35
 
36
+ var _WebSourceItem = _interopRequireDefault(require("./WebSourceItem"));
37
+
36
38
  var _queries = require("../../queries");
37
39
 
38
40
  var _excluded = ["data"];
@@ -41,10 +43,13 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
41
43
 
42
44
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
43
45
 
46
+ var WEB_SOURCE_TYPE = 'web';
47
+
44
48
  var Sources = function Sources(_ref) {
45
49
  var messageId = _ref.messageId,
46
50
  files = _ref.files,
47
- emails = _ref.emails;
51
+ emails = _ref.emails,
52
+ urls = _ref.urls;
48
53
 
49
54
  var _useState = (0, _react.useState)(false),
50
55
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
@@ -99,7 +104,7 @@ var Sources = function Sources(_ref) {
99
104
  icon: _MultiFiles.default,
100
105
  className: "u-ml-half"
101
106
  }),
102
- label: t('assistant.sources', files.length + emails.length),
107
+ label: t('assistant.sources', files.length + emails.length + urls.length),
103
108
  deleteIcon: /*#__PURE__*/_react.default.createElement(_Icon.default, {
104
109
  className: "u-h-1",
105
110
  icon: _Right.default,
@@ -125,6 +130,11 @@ var Sources = function Sources(_ref) {
125
130
  key: "".concat(messageId, "-").concat(email.id),
126
131
  email: email
127
132
  });
133
+ }), urls === null || urls === void 0 ? void 0 : urls.map(function (url, index) {
134
+ return /*#__PURE__*/_react.default.createElement(_WebSourceItem.default, {
135
+ key: "".concat(messageId, "-").concat(url.url || index),
136
+ source: url
137
+ });
128
138
  }))));
129
139
  };
130
140
 
@@ -133,9 +143,16 @@ var SourcesWithFilesQuery = function SourcesWithFilesQuery(_ref2) {
133
143
  sources = _ref2.sources;
134
144
  var fileIds = [];
135
145
  var emails = [];
146
+ var urls = [];
136
147
  var files;
137
148
  sources.map(function (source) {
138
- source.doctype === _queries.EMAIL_DOCTYPE ? emails.push(source) : fileIds.push(source.id);
149
+ if (source.sourceType === WEB_SOURCE_TYPE) {
150
+ urls.push(source);
151
+ } else if (source.doctype === _queries.EMAIL_DOCTYPE) {
152
+ emails.push(source);
153
+ } else {
154
+ fileIds.push(source.id);
155
+ }
139
156
  });
140
157
  var enabled = fileIds && fileIds.length > 0;
141
158
  var filesByIds = (0, _queries.buildFilesByIds)(fileIds, enabled);
@@ -146,11 +163,12 @@ var SourcesWithFilesQuery = function SourcesWithFilesQuery(_ref2) {
146
163
 
147
164
  var isLoading = (0, _cozyClient.isQueryLoading)(queryResult);
148
165
  files = fetchedFiles || [];
149
- if (isLoading && enabled || files.length === 0 && emails.length === 0) return null;
166
+ if (isLoading && enabled || files.length === 0 && emails.length === 0 && urls.length === 0) return null;
150
167
  return /*#__PURE__*/_react.default.createElement(Sources, {
151
168
  messageId: messageId,
152
169
  files: files,
153
- emails: emails
170
+ emails: emails,
171
+ urls: urls
154
172
  });
155
173
  };
156
174
 
@@ -0,0 +1,4 @@
1
+ export default WebSourceItem;
2
+ declare function WebSourceItem({ source }: {
3
+ source: any;
4
+ }): JSX.Element | null;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _Icon = _interopRequireDefault(require("cozy-ui/transpiled/react/Icon"));
13
+
14
+ var _Globe = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/Globe"));
15
+
16
+ var _ListItem = _interopRequireDefault(require("cozy-ui/transpiled/react/ListItem"));
17
+
18
+ var _ListItemIcon = _interopRequireDefault(require("cozy-ui/transpiled/react/ListItemIcon"));
19
+
20
+ var _ListItemText = _interopRequireDefault(require("cozy-ui/transpiled/react/ListItemText"));
21
+
22
+ var styles = {
23
+ "sourcesItem": "styles__sourcesItem___204Zw"
24
+ };
25
+
26
+ var isHttpUrl = function isHttpUrl(url) {
27
+ return typeof url === 'string' && /^https?:\/\//i.test(url.trim());
28
+ };
29
+
30
+ var WebSourceItem = function WebSourceItem(_ref) {
31
+ var source = _ref.source;
32
+ var url = source.url,
33
+ title = source.title;
34
+ if (!isHttpUrl(url)) return null;
35
+ var displayTitle = title || url;
36
+ return /*#__PURE__*/_react.default.createElement(_ListItem.default, {
37
+ className: styles['sourcesItem'],
38
+ component: "a",
39
+ href: url,
40
+ target: "_blank",
41
+ rel: "noopener noreferrer",
42
+ button: true
43
+ }, /*#__PURE__*/_react.default.createElement(_ListItemIcon.default, null, /*#__PURE__*/_react.default.createElement(_Icon.default, {
44
+ icon: _Globe.default,
45
+ size: 32,
46
+ color: "var(--primaryColor)"
47
+ })), /*#__PURE__*/_react.default.createElement(_ListItemText.default, {
48
+ primary: displayTitle,
49
+ secondary: url
50
+ }));
51
+ };
52
+
53
+ var _default = WebSourceItem;
54
+ exports.default = _default;
@@ -0,0 +1,5 @@
1
+ export default WebsearchButton;
2
+ declare function WebsearchButton({ websearchEnabled, onToggleWebsearch }: {
3
+ websearchEnabled: any;
4
+ onToggleWebsearch: any;
5
+ }): JSX.Element | null;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _react = _interopRequireDefault(require("react"));
11
+
12
+ var _cozyFlags = _interopRequireDefault(require("cozy-flags"));
13
+
14
+ var _Buttons = _interopRequireDefault(require("cozy-ui/transpiled/react/Buttons"));
15
+
16
+ var _Icon = _interopRequireDefault(require("cozy-ui/transpiled/react/Icon"));
17
+
18
+ var _IconButton = _interopRequireDefault(require("cozy-ui/transpiled/react/IconButton"));
19
+
20
+ var _Globe = _interopRequireDefault(require("cozy-ui/transpiled/react/Icons/Globe"));
21
+
22
+ var _twakeI18n = require("twake-i18n");
23
+
24
+ var WebsearchButton = function WebsearchButton(_ref) {
25
+ var websearchEnabled = _ref.websearchEnabled,
26
+ onToggleWebsearch = _ref.onToggleWebsearch;
27
+
28
+ var _useI18n = (0, _twakeI18n.useI18n)(),
29
+ t = _useI18n.t;
30
+
31
+ if (!(0, _cozyFlags.default)('cozy.assistant.websearch.enabled')) {
32
+ return null;
33
+ }
34
+
35
+ return /*#__PURE__*/_react.default.createElement(_IconButton.default, {
36
+ className: "u-p-0 u-mr-half",
37
+ "aria-pressed": websearchEnabled,
38
+ "aria-label": t('assistant.websearch.label'),
39
+ title: t('assistant.websearch.label'),
40
+ onClick: onToggleWebsearch
41
+ }, /*#__PURE__*/_react.default.createElement(_Buttons.default, {
42
+ size: "small",
43
+ component: "div",
44
+ className: "u-miw-auto u-w-2 u-h-2 u-bdrs-circle",
45
+ classes: {
46
+ label: 'u-flex u-w-auto'
47
+ },
48
+ disabled: !websearchEnabled,
49
+ label: /*#__PURE__*/_react.default.createElement(_Icon.default, {
50
+ icon: _Globe.default,
51
+ size: 12
52
+ })
53
+ }));
54
+ };
55
+
56
+ var _default = WebsearchButton;
57
+ exports.default = _default;
@@ -131,7 +131,8 @@ var CozyAssistantRuntimeProviderInner = function CozyAssistantRuntimeProviderInn
131
131
  var currentStreamingMessageIdRef = (0, _react2.useRef)(null);
132
132
 
133
133
  var _useAssistant2 = (0, _AssistantProvider.useAssistant)(),
134
- selectedAssistantId = _useAssistant2.selectedAssistantId;
134
+ selectedAssistantId = _useAssistant2.selectedAssistantId,
135
+ websearchEnabled = _useAssistant2.websearchEnabled;
135
136
 
136
137
  (0, _react2.useEffect)(function () {
137
138
  messagesIdRef.current = initialMessages.map(function (m) {
@@ -228,11 +229,11 @@ var CozyAssistantRuntimeProviderInner = function CozyAssistantRuntimeProviderInn
228
229
  return (0, _CozyRealtimeChatAdapter.createCozyRealtimeChatAdapter)({
229
230
  client: client,
230
231
  conversationId: conversationId,
231
- // eslint-disable-next-line react-hooks/refs
232
- streamBridge: streamBridgeRef.current,
233
- assistantId: selectedAssistantId
234
- }, t);
235
- }, [client, conversationId, selectedAssistantId, t]);
232
+ assistantId: selectedAssistantId,
233
+ websearchEnabled: websearchEnabled
234
+ }, t, // eslint-disable-next-line react-hooks/refs -- streamBridgeRef is stable and only read inside adapter.run(), not during render
235
+ streamBridgeRef);
236
+ }, [client, conversationId, selectedAssistantId, websearchEnabled, t]);
236
237
  var runtime = (0, _react.useLocalRuntime)(adapter, {
237
238
  initialMessages: initialMessages
238
239
  });
@@ -17,13 +17,15 @@ type CozyClient = {
17
17
  export interface CozyRealtimeChatAdapterOptions {
18
18
  client: CozyClient;
19
19
  conversationId: string;
20
- streamBridge: StreamBridge;
21
20
  assistantId?: string;
21
+ websearchEnabled?: boolean;
22
22
  }
23
23
  /**
24
24
  * Creates a ChatModelAdapter that integrates with Cozy's backend.
25
25
  * The adapter posts messages to the backend and yields streaming responses
26
26
  * from the WebSocket via StreamBridge.
27
27
  */
28
- export declare const createCozyRealtimeChatAdapter: (options: CozyRealtimeChatAdapterOptions, t: (key: string, options?: Record<string, unknown>) => string) => ChatModelAdapter;
28
+ export declare const createCozyRealtimeChatAdapter: (options: CozyRealtimeChatAdapterOptions, t: (key: string, options?: Record<string, unknown>) => string, streamBridgeRef: {
29
+ current: StreamBridge;
30
+ }) => ChatModelAdapter;
29
31
  export {};
@@ -58,33 +58,44 @@ var findUserQuery = function findUserQuery(messages) {
58
58
  */
59
59
 
60
60
 
61
- var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(options, t) {
61
+ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(options, t, streamBridgeRef) {
62
62
  return {
63
63
  run: function run(_ref) {
64
64
  var messages = _ref.messages,
65
65
  abortSignal = _ref.abortSignal;
66
66
  return (0, _wrapAsyncGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
67
- var client, conversationId, streamBridge, assistantId, userQuery, stream, fullText, wasAborted, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, sanitizedText, finalText, sources;
67
+ var client, conversationId, assistantId, websearchEnabled, streamBridge, userQuery, stream, fullText, wasAborted, _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, chunk, sanitizedText, finalText, sources;
68
68
 
69
69
  return _regenerator.default.wrap(function _callee$(_context) {
70
70
  while (1) {
71
71
  switch (_context.prev = _context.next) {
72
72
  case 0:
73
- client = options.client, conversationId = options.conversationId, streamBridge = options.streamBridge, assistantId = options.assistantId;
73
+ client = options.client, conversationId = options.conversationId, assistantId = options.assistantId, websearchEnabled = options.websearchEnabled;
74
+ streamBridge = streamBridgeRef.current;
74
75
  userQuery = findUserQuery(messages);
75
76
 
76
77
  if (userQuery) {
77
- _context.next = 5;
78
+ _context.next = 6;
78
79
  break;
79
80
  }
80
81
 
81
82
  log.error('No user message found in:', messages);
82
83
  return _context.abrupt("return");
83
84
 
84
- case 5:
85
+ case 6:
85
86
  stream = streamBridge.createStream(conversationId);
86
- _context.prev = 6;
87
- _context.next = 9;
87
+
88
+ if (!(abortSignal !== null && abortSignal !== void 0 && abortSignal.aborted)) {
89
+ _context.next = 10;
90
+ break;
91
+ }
92
+
93
+ streamBridge.cleanup(conversationId);
94
+ return _context.abrupt("return");
95
+
96
+ case 10:
97
+ _context.prev = 10;
98
+ _context.next = 13;
88
99
  return {
89
100
  content: [{
90
101
  type: 'text',
@@ -96,46 +107,48 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
96
107
  }
97
108
  };
98
109
 
99
- case 9:
100
- _context.next = 11;
101
- return (0, _awaitAsyncGenerator2.default)(client.stackClient.fetchJSON('POST', "/ai/chat/conversations/".concat(conversationId), {
110
+ case 13:
111
+ _context.next = 15;
112
+ return (0, _awaitAsyncGenerator2.default)(client.stackClient.fetchJSON('POST', "/ai/chat/conversations/".concat(conversationId), _objectSpread({
102
113
  q: userQuery,
103
114
  assistantID: assistantId
104
- }));
115
+ }, websearchEnabled && {
116
+ websearch: true
117
+ })));
105
118
 
106
- case 11:
119
+ case 15:
107
120
  fullText = '';
108
121
  wasAborted = false;
109
122
  _iteratorAbruptCompletion = false;
110
123
  _didIteratorError = false;
111
- _context.prev = 15;
124
+ _context.prev = 19;
112
125
  _iterator = _asyncIterator(stream);
113
126
 
114
- case 17:
115
- _context.next = 19;
127
+ case 21:
128
+ _context.next = 23;
116
129
  return (0, _awaitAsyncGenerator2.default)(_iterator.next());
117
130
 
118
- case 19:
131
+ case 23:
119
132
  if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) {
120
- _context.next = 32;
133
+ _context.next = 36;
121
134
  break;
122
135
  }
123
136
 
124
137
  chunk = _step.value;
125
138
 
126
139
  if (!(abortSignal !== null && abortSignal !== void 0 && abortSignal.aborted)) {
127
- _context.next = 25;
140
+ _context.next = 29;
128
141
  break;
129
142
  }
130
143
 
131
144
  wasAborted = true;
132
145
  streamBridge.cleanup(conversationId);
133
- return _context.abrupt("break", 32);
146
+ return _context.abrupt("break", 36);
134
147
 
135
- case 25:
148
+ case 29:
136
149
  fullText += chunk;
137
150
  sanitizedText = (0, _helpers.sanitizeChatContent)(fullText);
138
- _context.next = 29;
151
+ _context.next = 33;
139
152
  return {
140
153
  content: [{
141
154
  type: 'text',
@@ -146,58 +159,58 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
146
159
  }
147
160
  };
148
161
 
149
- case 29:
162
+ case 33:
150
163
  _iteratorAbruptCompletion = false;
151
- _context.next = 17;
164
+ _context.next = 21;
152
165
  break;
153
166
 
154
- case 32:
155
- _context.next = 38;
167
+ case 36:
168
+ _context.next = 42;
156
169
  break;
157
170
 
158
- case 34:
159
- _context.prev = 34;
160
- _context.t0 = _context["catch"](15);
171
+ case 38:
172
+ _context.prev = 38;
173
+ _context.t0 = _context["catch"](19);
161
174
  _didIteratorError = true;
162
175
  _iteratorError = _context.t0;
163
176
 
164
- case 38:
165
- _context.prev = 38;
166
- _context.prev = 39;
177
+ case 42:
178
+ _context.prev = 42;
179
+ _context.prev = 43;
167
180
 
168
181
  if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
169
- _context.next = 43;
182
+ _context.next = 47;
170
183
  break;
171
184
  }
172
185
 
173
- _context.next = 43;
186
+ _context.next = 47;
174
187
  return (0, _awaitAsyncGenerator2.default)(_iterator.return());
175
188
 
176
- case 43:
177
- _context.prev = 43;
189
+ case 47:
190
+ _context.prev = 47;
178
191
 
179
192
  if (!_didIteratorError) {
180
- _context.next = 46;
193
+ _context.next = 50;
181
194
  break;
182
195
  }
183
196
 
184
197
  throw _iteratorError;
185
198
 
186
- case 46:
187
- return _context.finish(43);
199
+ case 50:
200
+ return _context.finish(47);
188
201
 
189
- case 47:
190
- return _context.finish(38);
202
+ case 51:
203
+ return _context.finish(42);
191
204
 
192
- case 48:
205
+ case 52:
193
206
  if (wasAborted) {
194
- _context.next = 54;
207
+ _context.next = 58;
195
208
  break;
196
209
  }
197
210
 
198
211
  finalText = (0, _helpers.sanitizeChatContent)(fullText);
199
212
  sources = streamBridge.getSources(conversationId);
200
- _context.next = 53;
213
+ _context.next = 57;
201
214
  return _objectSpread({
202
215
  content: [{
203
216
  type: 'text',
@@ -215,19 +228,19 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
215
228
  }
216
229
  } : {});
217
230
 
218
- case 53:
231
+ case 57:
219
232
  streamBridge.cleanup(conversationId);
220
233
 
221
- case 54:
222
- _context.next = 62;
234
+ case 58:
235
+ _context.next = 66;
223
236
  break;
224
237
 
225
- case 56:
226
- _context.prev = 56;
227
- _context.t1 = _context["catch"](6);
238
+ case 60:
239
+ _context.prev = 60;
240
+ _context.t1 = _context["catch"](10);
228
241
  log.error('Error:', _context.t1);
229
242
  streamBridge.cleanup(conversationId);
230
- _context.next = 62;
243
+ _context.next = 66;
231
244
  return {
232
245
  content: [{
233
246
  type: 'text',
@@ -244,12 +257,12 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
244
257
  }
245
258
  };
246
259
 
247
- case 62:
260
+ case 66:
248
261
  case "end":
249
262
  return _context.stop();
250
263
  }
251
264
  }
252
- }, _callee, null, [[6, 56], [15, 34, 38, 48], [39,, 43, 47]]);
265
+ }, _callee, null, [[10, 60], [19, 38, 42, 52], [43,, 47, 51]]);
253
266
  }))();
254
267
  }
255
268
  };
@@ -37,15 +37,23 @@ export declare class StreamBridge {
37
37
  * Stores sources for the conversation to be retrieved by the adapter.
38
38
  */
39
39
  onSources(conversationId: string, sources: Array<{
40
- id: string;
40
+ id?: string;
41
41
  doctype?: string;
42
+ sourceType?: string;
43
+ url?: string;
44
+ title?: string;
45
+ snippet?: string;
42
46
  }>): void;
43
47
  /**
44
48
  * Returns stored sources for a conversation.
45
49
  */
46
50
  getSources(conversationId: string): Array<{
47
- id: string;
51
+ id?: string;
48
52
  doctype?: string;
53
+ sourceType?: string;
54
+ url?: string;
55
+ title?: string;
56
+ snippet?: string;
49
57
  }> | undefined;
50
58
  /**
51
59
  * Called when an error occurs.
@@ -6,6 +6,9 @@
6
6
  "noItem": "No results",
7
7
  "notEnough": "Your query must contain at least 3 characters"
8
8
  },
9
+ "websearch": {
10
+ "label": "Web search"
11
+ },
9
12
  "dialog": {
10
13
  "close": "Close"
11
14
  },
@@ -43,7 +46,7 @@
43
46
  "today": "Today",
44
47
  "yesterday": "Yesterday"
45
48
  },
46
- "default_error": "There was an error, please try again",
49
+ "default_error": "An error occurred during response generation. Please try again",
47
50
  "hide": "Hide",
48
51
  "show": "Show",
49
52
  "search_conversation": {
@@ -6,6 +6,9 @@
6
6
  "noItem": "Aucun résultat",
7
7
  "notEnough": "Votre recherche doit contenir au moins 3 caractères"
8
8
  },
9
+ "websearch": {
10
+ "label": "Recherche web"
11
+ },
9
12
  "dialog": {
10
13
  "close": "Fermer"
11
14
  },
@@ -43,7 +46,7 @@
43
46
  "today": "Aujourd'hui",
44
47
  "yesterday": "Hier"
45
48
  },
46
- "default_error": "Une erreur s'est produite, veuillez réessayer",
49
+ "default_error": "Une erreur est survenue lors de la génération de la réponse. Veuillez réessayer",
47
50
  "hide": "Masquer",
48
51
  "show": "Afficher",
49
52
  "search_conversation": {
@@ -12,6 +12,9 @@ var en = {
12
12
  noItem: "No results",
13
13
  notEnough: "Your query must contain at least 3 characters"
14
14
  },
15
+ websearch: {
16
+ label: "Web search"
17
+ },
15
18
  dialog: {
16
19
  close: "Close"
17
20
  },
@@ -49,7 +52,7 @@ var en = {
49
52
  today: "Today",
50
53
  yesterday: "Yesterday"
51
54
  },
52
- default_error: "There was an error, please try again",
55
+ default_error: "An error occurred during response generation. Please try again",
53
56
  hide: "Hide",
54
57
  show: "Show",
55
58
  search_conversation: {
@@ -212,6 +215,9 @@ var fr = {
212
215
  noItem: "Aucun r\xE9sultat",
213
216
  notEnough: "Votre recherche doit contenir au moins 3 caract\xE8res"
214
217
  },
218
+ websearch: {
219
+ label: "Recherche web"
220
+ },
215
221
  dialog: {
216
222
  close: "Fermer"
217
223
  },
@@ -249,7 +255,7 @@ var fr = {
249
255
  today: "Aujourd'hui",
250
256
  yesterday: "Hier"
251
257
  },
252
- default_error: "Une erreur s'est produite, veuillez r\xE9essayer",
258
+ default_error: "Une erreur est survenue lors de la g\xE9n\xE9ration de la r\xE9ponse. Veuillez r\xE9essayer",
253
259
  hide: "Masquer",
254
260
  show: "Afficher",
255
261
  search_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.25.2",
4
+ "version": "0.26.0",
5
5
  "author": {
6
6
  "name": "Cozy Cloud",
7
7
  "url": "https://github.com/cozy"
@@ -35,7 +35,7 @@
35
35
  "cozy-pouch-link": "^54.0.0",
36
36
  "cozy-realtime": "^5.9.1",
37
37
  "cozy-ui": "^138.1.0",
38
- "cozy-ui-plus": "^6.1.1",
38
+ "cozy-ui-plus": "^7.0.0",
39
39
  "cross-fetch": "^4.0.0",
40
40
  "jest": "30.3.0",
41
41
  "react": "18.2.0",
@@ -92,5 +92,5 @@
92
92
  "lint": "cd .. && yarn eslint --ext js,jsx,ts packages/cozy-search"
93
93
  },
94
94
  "types": "dist/index.d.ts",
95
- "gitHead": "aee7d46723561ad42f2cdc4fe96036ffe92adcdd"
95
+ "gitHead": "817a8f2cfeb4e832a54b218f6f982a3651c5cd9f"
96
96
  }