cozy-search 0.23.1 → 0.23.3

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.
@@ -1,11 +1,5 @@
1
1
  import React from 'react'
2
2
 
3
- export interface AssistantState {
4
- message: Record<string, string>
5
- status: 'idle' | 'writing' | 'pending'
6
- messagesId: string[]
7
- }
8
-
9
3
  export interface TwakeKnowledgeState {
10
4
  drive: { id: string; name: string }[]
11
5
  mail: { id: string; name: string }[]
@@ -13,7 +7,6 @@ export interface TwakeKnowledgeState {
13
7
  }
14
8
 
15
9
  export interface AssistantContextValue {
16
- assistantState: AssistantState
17
10
  isOpenCreateAssistant: boolean
18
11
  isOpenDeleteAssistant: boolean
19
12
  isOpenEditAssistant: boolean
@@ -24,12 +17,6 @@ export interface AssistantContextValue {
24
17
  selectedTwakeKnowledge: TwakeKnowledgeState
25
18
  setAssistantIdInAction: (id: string | null) => void
26
19
  setIsOpenDeleteAssistant: (isOpen: boolean) => void
27
- setAssistantState: React.Dispatch<React.SetStateAction<AssistantState>>
28
- clearAssistant: () => void
29
- onAssistantExecute: (
30
- params: { value: string; conversationId: string },
31
- callback?: () => void
32
- ) => Promise<void>
33
20
  setIsOpenCreateAssistant: (isOpen: boolean) => void
34
21
  setIsOpenEditAssistant: (isOpen: boolean) => void
35
22
  setSelectedAssistantId: (id: string) => void
@@ -7,38 +7,16 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.useAssistant = exports.default = exports.AssistantContext = void 0;
9
9
 
10
- var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
-
12
- var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
-
14
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
11
 
18
- var _set = _interopRequireDefault(require("lodash/set"));
19
-
20
12
  var _react = _interopRequireWildcard(require("react"));
21
13
 
22
- var _reactRouterDom = require("react-router-dom");
23
-
24
- var _cozyClient = require("cozy-client");
25
-
26
- var _useRealtime3 = _interopRequireDefault(require("cozy-realtime/dist/useRealtime"));
27
-
28
14
  var _constants = require("./constants");
29
15
 
30
- var _helpers = require("./helpers");
31
-
32
- var _queries = require("./queries");
33
-
34
16
  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); }
35
17
 
36
18
  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; }
37
19
 
38
- 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; }
39
-
40
- 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; }
41
-
42
20
  var AssistantContext = /*#__PURE__*/_react.default.createContext();
43
21
  /**
44
22
  * @returns {import('./AssistantProvider').AssistantContextValue}
@@ -62,153 +40,52 @@ exports.useAssistant = useAssistant;
62
40
  var AssistantProvider = function AssistantProvider(_ref) {
63
41
  var children = _ref.children;
64
42
 
65
- var _useParams = (0, _reactRouterDom.useParams)(),
66
- conversationId = _useParams.conversationId;
67
-
68
- var client = (0, _cozyClient.useClient)();
69
-
70
- var _useState = (0, _react.useState)({
71
- message: {},
72
- status: 'idle',
73
- messagesId: []
74
- }),
43
+ var _useState = (0, _react.useState)(false),
75
44
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
76
- assistantState = _useState2[0],
77
- setAssistantState = _useState2[1];
45
+ isOpenCreateAssistant = _useState2[0],
46
+ setIsOpenCreateAssistant = _useState2[1];
78
47
 
79
48
  var _useState3 = (0, _react.useState)(false),
80
49
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
81
- isOpenCreateAssistant = _useState4[0],
82
- setIsOpenCreateAssistant = _useState4[1];
50
+ isOpenDeleteAssistant = _useState4[0],
51
+ setIsOpenDeleteAssistant = _useState4[1];
83
52
 
84
53
  var _useState5 = (0, _react.useState)(false),
85
54
  _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
86
- isOpenDeleteAssistant = _useState6[0],
87
- setIsOpenDeleteAssistant = _useState6[1];
55
+ isOpenEditAssistant = _useState6[0],
56
+ setIsOpenEditAssistant = _useState6[1];
88
57
 
89
- var _useState7 = (0, _react.useState)(false),
58
+ var _useState7 = (0, _react.useState)(null),
90
59
  _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
91
- isOpenEditAssistant = _useState8[0],
92
- setIsOpenEditAssistant = _useState8[1];
60
+ assistantIdInAction = _useState8[0],
61
+ setAssistantIdInAction = _useState8[1];
93
62
 
94
- var _useState9 = (0, _react.useState)(null),
63
+ var _useState9 = (0, _react.useState)(_constants.DEFAULT_ASSISTANT._id),
95
64
  _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
96
- assistantIdInAction = _useState10[0],
97
- setAssistantIdInAction = _useState10[1];
65
+ selectedAssistantId = _useState10[0],
66
+ setSelectedAssistantId = _useState10[1];
98
67
 
99
- var _useState11 = (0, _react.useState)(_constants.DEFAULT_ASSISTANT._id),
68
+ var _useState11 = (0, _react.useState)(false),
100
69
  _useState12 = (0, _slicedToArray2.default)(_useState11, 2),
101
- selectedAssistantId = _useState12[0],
102
- setSelectedAssistantId = _useState12[1];
103
-
104
- var _useState13 = (0, _react.useState)(false),
105
- _useState14 = (0, _slicedToArray2.default)(_useState13, 2),
106
- isOpenSearchConversation = _useState14[0],
107
- setIsOpenSearchConversation = _useState14[1];
70
+ isOpenSearchConversation = _useState12[0],
71
+ setIsOpenSearchConversation = _useState12[1];
108
72
 
109
- var _useState15 = (0, _react.useState)({
73
+ var _useState13 = (0, _react.useState)({
110
74
  drive: [],
111
75
  mail: [],
112
76
  chat: []
113
77
  }),
78
+ _useState14 = (0, _slicedToArray2.default)(_useState13, 2),
79
+ selectedTwakeKnowledge = _useState14[0],
80
+ setSelectedTwakeKnowledge = _useState14[1];
81
+
82
+ var _useState15 = (0, _react.useState)(null),
114
83
  _useState16 = (0, _slicedToArray2.default)(_useState15, 2),
115
- selectedTwakeKnowledge = _useState16[0],
116
- setSelectedTwakeKnowledge = _useState16[1];
117
-
118
- var _useState17 = (0, _react.useState)(null),
119
- _useState18 = (0, _slicedToArray2.default)(_useState17, 2),
120
- openedKnowledgePanel = _useState18[0],
121
- setOpenedKnowledgePanel = _useState18[1];
122
-
123
- (0, _useRealtime3.default)(client, (0, _defineProperty2.default)({}, _queries.CHAT_CONVERSATIONS_DOCTYPE, {
124
- created: function created(res) {
125
- (0, _helpers.pushMessagesIdInState)(conversationId, res, setAssistantState);
126
- },
127
- updated: function updated(res) {
128
- (0, _helpers.pushMessagesIdInState)(conversationId, res, setAssistantState);
129
- }
130
- }), []);
131
- (0, _useRealtime3.default)(client, (0, _defineProperty2.default)({}, _queries.CHAT_EVENTS_DOCTYPE, {
132
- created: function created(res) {
133
- setAssistantState(function (prevState) {
134
- // to exclude realtime messages if not relevant to the actual conversation
135
- if (!(0, _helpers.isMessageForThisConversation)(res, prevState.messagesId)) {
136
- return prevState;
137
- }
138
-
139
- if (res.object === 'done') {
140
- if (prevState.status !== 'idle') {
141
- return _objectSpread(_objectSpread({}, prevState), {}, {
142
- status: 'idle'
143
- });
144
- }
145
- }
146
-
147
- if (res.object === 'delta') {
148
- var message = (0, _set.default)(prevState.message, res.position, res.content);
149
- return _objectSpread(_objectSpread({}, prevState), {}, {
150
- message: message,
151
- status: 'writing'
152
- });
153
- }
154
-
155
- return prevState;
156
- });
157
- }
158
- }), []);
159
- var clearAssistant = (0, _react.useCallback)(function () {
160
- return setAssistantState({
161
- message: {},
162
- status: 'pending',
163
- messagesId: []
164
- });
165
- }, []);
166
- var onAssistantExecute = (0, _react.useCallback)( /*#__PURE__*/function () {
167
- var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref2, callback) {
168
- var value, conversationId;
169
- return _regenerator.default.wrap(function _callee$(_context) {
170
- while (1) {
171
- switch (_context.prev = _context.next) {
172
- case 0:
173
- value = _ref2.value, conversationId = _ref2.conversationId;
174
-
175
- if (value) {
176
- _context.next = 3;
177
- break;
178
- }
179
-
180
- return _context.abrupt("return");
181
-
182
- case 3:
183
- callback === null || callback === void 0 ? void 0 : callback();
184
- clearAssistant();
185
- _context.next = 7;
186
- return client.stackClient.fetchJSON('POST', "/ai/chat/conversations/".concat(conversationId), {
187
- q: value
188
- });
189
-
190
- case 7:
191
- setAssistantState(function (v) {
192
- return _objectSpread(_objectSpread({}, v), {}, {
193
- status: 'pending'
194
- });
195
- });
196
-
197
- case 8:
198
- case "end":
199
- return _context.stop();
200
- }
201
- }
202
- }, _callee);
203
- }));
204
-
205
- return function (_x, _x2) {
206
- return _ref3.apply(this, arguments);
207
- };
208
- }(), [client, clearAssistant]);
84
+ openedKnowledgePanel = _useState16[0],
85
+ setOpenedKnowledgePanel = _useState16[1];
86
+
209
87
  var value = (0, _react.useMemo)(function () {
210
88
  return {
211
- assistantState: assistantState,
212
89
  isOpenCreateAssistant: isOpenCreateAssistant,
213
90
  isOpenDeleteAssistant: isOpenDeleteAssistant,
214
91
  isOpenEditAssistant: isOpenEditAssistant,
@@ -219,9 +96,6 @@ var AssistantProvider = function AssistantProvider(_ref) {
219
96
  selectedTwakeKnowledge: selectedTwakeKnowledge,
220
97
  setAssistantIdInAction: setAssistantIdInAction,
221
98
  setIsOpenDeleteAssistant: setIsOpenDeleteAssistant,
222
- setAssistantState: setAssistantState,
223
- clearAssistant: clearAssistant,
224
- onAssistantExecute: onAssistantExecute,
225
99
  setIsOpenCreateAssistant: setIsOpenCreateAssistant,
226
100
  setIsOpenEditAssistant: setIsOpenEditAssistant,
227
101
  setSelectedAssistantId: setSelectedAssistantId,
@@ -229,7 +103,7 @@ var AssistantProvider = function AssistantProvider(_ref) {
229
103
  setOpenedKnowledgePanel: setOpenedKnowledgePanel,
230
104
  setSelectedTwakeKnowledge: setSelectedTwakeKnowledge
231
105
  };
232
- }, [assistantState, isOpenCreateAssistant, isOpenDeleteAssistant, isOpenEditAssistant, assistantIdInAction, selectedAssistantId, isOpenSearchConversation, openedKnowledgePanel, selectedTwakeKnowledge, clearAssistant, onAssistantExecute]);
106
+ }, [isOpenCreateAssistant, isOpenDeleteAssistant, isOpenEditAssistant, assistantIdInAction, selectedAssistantId, isOpenSearchConversation, openedKnowledgePanel, selectedTwakeKnowledge]);
233
107
  return /*#__PURE__*/_react.default.createElement(AssistantContext.Provider, {
234
108
  value: value
235
109
  }, children);
@@ -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) {
@@ -183,7 +183,7 @@ var CozyAssistantRuntimeProviderInner = function CozyAssistantRuntimeProviderInn
183
183
  (0, _useRealtime3.default)(client, (0, _defineProperty2.default)({}, _queries.CHAT_EVENTS_DOCTYPE, {
184
184
  created: function created(res) {
185
185
  if (cancelledMessageIdsRef.current.has(res._id)) {
186
- if (res.object === 'done') {
186
+ if (res.object === 'done' || res.object === 'error') {
187
187
  cancelledMessageIdsRef.current.delete(res._id);
188
188
  }
189
189
 
@@ -205,10 +205,20 @@ 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;
211
215
  }
216
+
217
+ if (res.object === 'error') {
218
+ log.error('LLM error:', res.message);
219
+ streamBridgeRef.current.onError(conversationId, new Error('LLM error'));
220
+ currentStreamingMessageIdRef.current = null;
221
+ }
212
222
  } catch (error) {
213
223
  log.error('Error handling chat real-time event:', error);
214
224
  }
@@ -11,6 +11,8 @@ var _react = require("@assistant-ui/react");
11
11
 
12
12
  var _react2 = _interopRequireDefault(require("react"));
13
13
 
14
+ var _Alert = _interopRequireDefault(require("cozy-ui/transpiled/react/Alert"));
15
+
14
16
  var _Box = _interopRequireDefault(require("cozy-ui/transpiled/react/Box"));
15
17
 
16
18
  var _Icon = _interopRequireDefault(require("cozy-ui/transpiled/react/Icon"));
@@ -25,6 +27,14 @@ var _TwakeAssistantIcon = require("../AssistantIcon/TwakeAssistantIcon");
25
27
 
26
28
  var _Sources = _interopRequireDefault(require("../Conversations/Sources/Sources"));
27
29
 
30
+ var useIsErrorMessage = function useIsErrorMessage() {
31
+ return (0, _react.useMessage)(function (s) {
32
+ var _s$metadata, _s$metadata$custom;
33
+
34
+ return ((_s$metadata = s.metadata) === null || _s$metadata === void 0 ? void 0 : (_s$metadata$custom = _s$metadata.custom) === null || _s$metadata$custom === void 0 ? void 0 : _s$metadata$custom.isError) === true;
35
+ });
36
+ };
37
+
28
38
  var AssistantMessage = function AssistantMessage() {
29
39
  var _useI18n = (0, _twakeI18n.useI18n)(),
30
40
  t = _useI18n.t;
@@ -34,13 +44,14 @@ var AssistantMessage = function AssistantMessage() {
34
44
 
35
45
  return ((_s$status = s.status) === null || _s$status === void 0 ? void 0 : _s$status.type) === 'requires-action';
36
46
  });
47
+ var isError = useIsErrorMessage();
37
48
  var messageId = (0, _react.useMessage)(function (s) {
38
49
  return s.id;
39
50
  });
40
51
  var sources = (0, _react.useMessage)(function (s) {
41
- var _s$metadata, _s$metadata$custom;
52
+ var _s$metadata2, _s$metadata2$custom;
42
53
 
43
- return (_s$metadata = s.metadata) === null || _s$metadata === void 0 ? void 0 : (_s$metadata$custom = _s$metadata.custom) === null || _s$metadata$custom === void 0 ? void 0 : _s$metadata$custom.sources;
54
+ return (_s$metadata2 = s.metadata) === null || _s$metadata2 === void 0 ? void 0 : (_s$metadata2$custom = _s$metadata2.custom) === null || _s$metadata2$custom === void 0 ? void 0 : _s$metadata2$custom.sources;
44
55
  });
45
56
  return /*#__PURE__*/_react2.default.createElement(_react.MessagePrimitive.Root, {
46
57
  className: "u-mt-1-half u-mr-3"
@@ -56,7 +67,9 @@ var AssistantMessage = function AssistantMessage() {
56
67
  }), /*#__PURE__*/_react2.default.createElement(_Typography.default, {
57
68
  variant: "h6",
58
69
  display: "inline"
59
- }, t('assistant.message.running'))), /*#__PURE__*/_react2.default.createElement(_react.MessagePrimitive.Content, {
70
+ }, t('assistant.message.running'))), isError ? /*#__PURE__*/_react2.default.createElement(_Alert.default, {
71
+ severity: "error"
72
+ }, t('assistant.default_error')) : /*#__PURE__*/_react2.default.createElement(_react.MessagePrimitive.Content, {
60
73
  components: {
61
74
  Text: _MarkdownText.default
62
75
  }
@@ -1,4 +1,4 @@
1
- export default AssistantLinkWrapper;
2
- declare function AssistantLinkWrapper({ children }: {
1
+ export default AssistantLink;
2
+ declare function AssistantLink({ children }: {
3
3
  children: any;
4
- }): JSX.Element;
4
+ }): any;
@@ -1,30 +1,16 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
3
  Object.defineProperty(exports, "__esModule", {
6
4
  value: true
7
5
  });
8
6
  exports.default = void 0;
9
7
 
10
- var _react = _interopRequireDefault(require("react"));
11
-
12
8
  var _reactRouterDom = require("react-router-dom");
13
9
 
14
- var _AssistantProvider = _interopRequireWildcard(require("../AssistantProvider"));
15
-
16
10
  var _helpers = require("../helpers");
17
11
 
18
- 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); }
19
-
20
- 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; }
21
-
22
12
  var AssistantLink = function AssistantLink(_ref) {
23
13
  var children = _ref.children;
24
-
25
- var _useAssistant = (0, _AssistantProvider.useAssistant)(),
26
- onAssistantExecute = _useAssistant.onAssistantExecute;
27
-
28
14
  var navigate = (0, _reactRouterDom.useNavigate)();
29
15
 
30
16
  var _useLocation = (0, _reactRouterDom.useLocation)(),
@@ -33,22 +19,13 @@ var AssistantLink = function AssistantLink(_ref) {
33
19
  var openAssistant = function openAssistant() {
34
20
  if (!(0, _helpers.isAssistantEnabled)()) return;
35
21
  var conversationId = (0, _helpers.makeConversationId)();
36
- onAssistantExecute({
37
- value: '',
38
- conversationId: conversationId
39
- });
40
22
  navigate("assistant/".concat(conversationId, "?returnPath=").concat(pathname));
41
23
  };
42
24
 
43
- return /*#__PURE__*/_react.default.createElement(_AssistantProvider.default, null, children({
25
+ return children({
44
26
  openAssistant: openAssistant
45
- }));
46
- };
47
-
48
- var AssistantLinkWrapper = function AssistantLinkWrapper(_ref2) {
49
- var children = _ref2.children;
50
- return /*#__PURE__*/_react.default.createElement(_AssistantProvider.default, null, /*#__PURE__*/_react.default.createElement(AssistantLink, null, children));
27
+ });
51
28
  };
52
29
 
53
- var _default = AssistantLinkWrapper;
30
+ var _default = AssistantLink;
54
31
  exports.default = _default;
@@ -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',
@@ -223,15 +236,20 @@ var createCozyRealtimeChatAdapter = function createCozyRealtimeChatAdapter(optio
223
236
  status: {
224
237
  type: 'incomplete',
225
238
  reason: 'error'
239
+ },
240
+ metadata: {
241
+ custom: {
242
+ isError: true
243
+ }
226
244
  }
227
245
  };
228
246
 
229
- case 61:
247
+ case 62:
230
248
  case "end":
231
249
  return _context.stop();
232
250
  }
233
251
  }
234
- }, _callee, null, [[6, 55], [15, 34, 38, 48], [39,, 43, 47]]);
252
+ }, _callee, null, [[6, 56], [15, 34, 38, 48], [39,, 43, 47]]);
235
253
  }))();
236
254
  }
237
255
  };
@@ -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.
@@ -48,6 +48,18 @@ describe('StreamBridge', () => {
48
48
  await expect(iterator.next()).rejects.toThrow('Socket disconnected')
49
49
  })
50
50
 
51
+ it('should reject the iterator when an error occurs mid-stream', async () => {
52
+ const iterator = bridge.createStream('convo_1')
53
+
54
+ bridge.onDelta('convo_1', 'partial ')
55
+ const first = await iterator.next()
56
+ expect(first).toEqual({ value: 'partial ', done: false })
57
+
58
+ bridge.onError('convo_1', new Error('LLM unavailable'))
59
+
60
+ await expect(iterator.next()).rejects.toThrow('LLM unavailable')
61
+ })
62
+
51
63
  it('should call the cleanup callback and mark the stream complete on cleanup', async () => {
52
64
  const cleanupSpy = jest.fn()
53
65
  bridge.setCleanupCallback(cleanupSpy)
@@ -1,6 +1,4 @@
1
1
  export function makeConversationId(): string;
2
- export function pushMessagesIdInState(id: any, res: any, setState: any): void;
3
- export function isMessageForThisConversation(res: any, messagesId: any): any;
4
2
  export function isAssistantEnabled(): any;
5
3
  export function sanitizeChatContent(content: string): string;
6
4
  export function formatConversationDate(dateString: any, t: any, lang: any): string;
@@ -5,42 +5,16 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.sanitizeChatContent = exports.pushMessagesIdInState = exports.makeConversationId = exports.isMessageForThisConversation = exports.isAssistantEnabled = exports.getNameOfConversation = exports.getDescriptionOfConversation = exports.formatConversationDate = void 0;
9
-
10
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
8
+ exports.sanitizeChatContent = exports.makeConversationId = exports.isAssistantEnabled = exports.getNameOfConversation = exports.getDescriptionOfConversation = exports.formatConversationDate = void 0;
11
9
 
12
10
  var _cozyFlags = _interopRequireDefault(require("cozy-flags"));
13
11
 
14
- 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; }
15
-
16
- 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; }
17
-
18
12
  var makeConversationId = function makeConversationId() {
19
13
  return "".concat(Date.now(), "-").concat(Math.floor(Math.random() * 90000) + 10000);
20
14
  };
21
15
 
22
16
  exports.makeConversationId = makeConversationId;
23
17
 
24
- var pushMessagesIdInState = function pushMessagesIdInState(id, res, setState) {
25
- if (id !== res._id) return;
26
- var messagesId = res.messages.map(function (message) {
27
- return message.id;
28
- });
29
- setState(function (v) {
30
- return _objectSpread(_objectSpread({}, v), {}, {
31
- messagesId: messagesId
32
- });
33
- });
34
- };
35
-
36
- exports.pushMessagesIdInState = pushMessagesIdInState;
37
-
38
- var isMessageForThisConversation = function isMessageForThisConversation(res, messagesId) {
39
- return messagesId.includes(res._id);
40
- };
41
-
42
- exports.isMessageForThisConversation = isMessageForThisConversation;
43
-
44
18
  var isAssistantEnabled = function isAssistantEnabled() {
45
19
  return (0, _cozyFlags.default)('cozy.assistant.enabled');
46
20
  };
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.1",
4
+ "version": "0.23.3",
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": "1065f8b76289ccfb32c86e62086184de8ae4d340"
97
+ "gitHead": "e10a9ecf005814f4ff42fc35114172085c34abd5"
98
98
  }