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.
- package/dist/components/AssistantProvider.d.ts +0 -13
- package/dist/components/AssistantProvider.js +26 -152
- package/dist/components/Conversations/Sources/Sources.js +11 -1
- package/dist/components/CozyAssistantRuntimeProvider.js +11 -1
- package/dist/components/Messages/AssistantMessage.js +16 -3
- package/dist/components/Search/AssistantLink.d.ts +3 -3
- package/dist/components/Search/AssistantLink.js +3 -26
- package/dist/components/adapters/CozyRealtimeChatAdapter.js +31 -13
- package/dist/components/adapters/StreamBridge.d.ts +16 -0
- package/dist/components/adapters/StreamBridge.js +29 -4
- package/dist/components/adapters/StreamBridge.spec.ts +12 -0
- package/dist/components/helpers.d.ts +0 -2
- package/dist/components/helpers.js +1 -27
- package/package.json +2 -2
|
@@ -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
|
|
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
|
-
|
|
77
|
-
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
87
|
-
|
|
55
|
+
isOpenEditAssistant = _useState6[0],
|
|
56
|
+
setIsOpenEditAssistant = _useState6[1];
|
|
88
57
|
|
|
89
|
-
var _useState7 = (0, _react.useState)(
|
|
58
|
+
var _useState7 = (0, _react.useState)(null),
|
|
90
59
|
_useState8 = (0, _slicedToArray2.default)(_useState7, 2),
|
|
91
|
-
|
|
92
|
-
|
|
60
|
+
assistantIdInAction = _useState8[0],
|
|
61
|
+
setAssistantIdInAction = _useState8[1];
|
|
93
62
|
|
|
94
|
-
var _useState9 = (0, _react.useState)(
|
|
63
|
+
var _useState9 = (0, _react.useState)(_constants.DEFAULT_ASSISTANT._id),
|
|
95
64
|
_useState10 = (0, _slicedToArray2.default)(_useState9, 2),
|
|
96
|
-
|
|
97
|
-
|
|
65
|
+
selectedAssistantId = _useState10[0],
|
|
66
|
+
setSelectedAssistantId = _useState10[1];
|
|
98
67
|
|
|
99
|
-
var _useState11 = (0, _react.useState)(
|
|
68
|
+
var _useState11 = (0, _react.useState)(false),
|
|
100
69
|
_useState12 = (0, _slicedToArray2.default)(_useState11, 2),
|
|
101
|
-
|
|
102
|
-
|
|
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
|
|
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
|
-
|
|
116
|
-
|
|
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
|
-
}, [
|
|
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$
|
|
52
|
+
var _s$metadata2, _s$metadata2$custom;
|
|
42
53
|
|
|
43
|
-
return (_s$
|
|
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(
|
|
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
|
|
2
|
-
declare function
|
|
1
|
+
export default AssistantLink;
|
|
2
|
+
declare function AssistantLink({ children }: {
|
|
3
3
|
children: any;
|
|
4
|
-
}):
|
|
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
|
|
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 =
|
|
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 =
|
|
194
|
+
_context.next = 54;
|
|
189
195
|
break;
|
|
190
196
|
}
|
|
191
197
|
|
|
192
198
|
finalText = (0, _helpers.sanitizeChatContent)(fullText);
|
|
193
|
-
|
|
194
|
-
|
|
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
|
|
218
|
+
case 53:
|
|
206
219
|
streamBridge.cleanup(conversationId);
|
|
207
220
|
|
|
208
|
-
case
|
|
209
|
-
_context.next =
|
|
221
|
+
case 54:
|
|
222
|
+
_context.next = 62;
|
|
210
223
|
break;
|
|
211
224
|
|
|
212
|
-
case
|
|
213
|
-
_context.prev =
|
|
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 =
|
|
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
|
|
247
|
+
case 62:
|
|
230
248
|
case "end":
|
|
231
249
|
return _context.stop();
|
|
232
250
|
}
|
|
233
251
|
}
|
|
234
|
-
}, _callee, null, [[6,
|
|
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.
|
|
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.
|
|
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": "
|
|
97
|
+
"gitHead": "e10a9ecf005814f4ff42fc35114172085c34abd5"
|
|
98
98
|
}
|