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.
- package/dist/components/AssistantProvider.d.ts +2 -0
- package/dist/components/AssistantProvider.js +9 -2
- package/dist/components/Conversations/ConversationBar.d.ts +3 -1
- package/dist/components/Conversations/ConversationBar.js +10 -3
- package/dist/components/Conversations/ConversationComposer.js +12 -2
- package/dist/components/Conversations/Sources/Sources.js +23 -5
- package/dist/components/Conversations/Sources/WebSourceItem.d.ts +4 -0
- package/dist/components/Conversations/Sources/WebSourceItem.js +54 -0
- package/dist/components/Conversations/WebsearchButton.d.ts +5 -0
- package/dist/components/Conversations/WebsearchButton.js +57 -0
- package/dist/components/CozyAssistantRuntimeProvider.js +7 -6
- package/dist/components/adapters/CozyRealtimeChatAdapter.d.ts +4 -2
- package/dist/components/adapters/CozyRealtimeChatAdapter.js +65 -52
- package/dist/components/adapters/StreamBridge.d.ts +10 -2
- package/dist/locales/en.json +4 -1
- package/dist/locales/fr.json +4 -1
- package/dist/locales/index.js +8 -2
- package/package.json +3 -3
|
@@ -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
|
|
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:
|
|
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.
|
|
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,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,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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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 =
|
|
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
|
|
85
|
+
case 6:
|
|
85
86
|
stream = streamBridge.createStream(conversationId);
|
|
86
|
-
|
|
87
|
-
|
|
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
|
|
100
|
-
_context.next =
|
|
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
|
|
119
|
+
case 15:
|
|
107
120
|
fullText = '';
|
|
108
121
|
wasAborted = false;
|
|
109
122
|
_iteratorAbruptCompletion = false;
|
|
110
123
|
_didIteratorError = false;
|
|
111
|
-
_context.prev =
|
|
124
|
+
_context.prev = 19;
|
|
112
125
|
_iterator = _asyncIterator(stream);
|
|
113
126
|
|
|
114
|
-
case
|
|
115
|
-
_context.next =
|
|
127
|
+
case 21:
|
|
128
|
+
_context.next = 23;
|
|
116
129
|
return (0, _awaitAsyncGenerator2.default)(_iterator.next());
|
|
117
130
|
|
|
118
|
-
case
|
|
131
|
+
case 23:
|
|
119
132
|
if (!(_iteratorAbruptCompletion = !(_step = _context.sent).done)) {
|
|
120
|
-
_context.next =
|
|
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 =
|
|
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",
|
|
146
|
+
return _context.abrupt("break", 36);
|
|
134
147
|
|
|
135
|
-
case
|
|
148
|
+
case 29:
|
|
136
149
|
fullText += chunk;
|
|
137
150
|
sanitizedText = (0, _helpers.sanitizeChatContent)(fullText);
|
|
138
|
-
_context.next =
|
|
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
|
|
162
|
+
case 33:
|
|
150
163
|
_iteratorAbruptCompletion = false;
|
|
151
|
-
_context.next =
|
|
164
|
+
_context.next = 21;
|
|
152
165
|
break;
|
|
153
166
|
|
|
154
|
-
case
|
|
155
|
-
_context.next =
|
|
167
|
+
case 36:
|
|
168
|
+
_context.next = 42;
|
|
156
169
|
break;
|
|
157
170
|
|
|
158
|
-
case
|
|
159
|
-
_context.prev =
|
|
160
|
-
_context.t0 = _context["catch"](
|
|
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
|
|
165
|
-
_context.prev =
|
|
166
|
-
_context.prev =
|
|
177
|
+
case 42:
|
|
178
|
+
_context.prev = 42;
|
|
179
|
+
_context.prev = 43;
|
|
167
180
|
|
|
168
181
|
if (!(_iteratorAbruptCompletion && _iterator.return != null)) {
|
|
169
|
-
_context.next =
|
|
182
|
+
_context.next = 47;
|
|
170
183
|
break;
|
|
171
184
|
}
|
|
172
185
|
|
|
173
|
-
_context.next =
|
|
186
|
+
_context.next = 47;
|
|
174
187
|
return (0, _awaitAsyncGenerator2.default)(_iterator.return());
|
|
175
188
|
|
|
176
|
-
case
|
|
177
|
-
_context.prev =
|
|
189
|
+
case 47:
|
|
190
|
+
_context.prev = 47;
|
|
178
191
|
|
|
179
192
|
if (!_didIteratorError) {
|
|
180
|
-
_context.next =
|
|
193
|
+
_context.next = 50;
|
|
181
194
|
break;
|
|
182
195
|
}
|
|
183
196
|
|
|
184
197
|
throw _iteratorError;
|
|
185
198
|
|
|
186
|
-
case
|
|
187
|
-
return _context.finish(
|
|
199
|
+
case 50:
|
|
200
|
+
return _context.finish(47);
|
|
188
201
|
|
|
189
|
-
case
|
|
190
|
-
return _context.finish(
|
|
202
|
+
case 51:
|
|
203
|
+
return _context.finish(42);
|
|
191
204
|
|
|
192
|
-
case
|
|
205
|
+
case 52:
|
|
193
206
|
if (wasAborted) {
|
|
194
|
-
_context.next =
|
|
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 =
|
|
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
|
|
231
|
+
case 57:
|
|
219
232
|
streamBridge.cleanup(conversationId);
|
|
220
233
|
|
|
221
|
-
case
|
|
222
|
-
_context.next =
|
|
234
|
+
case 58:
|
|
235
|
+
_context.next = 66;
|
|
223
236
|
break;
|
|
224
237
|
|
|
225
|
-
case
|
|
226
|
-
_context.prev =
|
|
227
|
-
_context.t1 = _context["catch"](
|
|
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 =
|
|
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
|
|
260
|
+
case 66:
|
|
248
261
|
case "end":
|
|
249
262
|
return _context.stop();
|
|
250
263
|
}
|
|
251
264
|
}
|
|
252
|
-
}, _callee, null, [[
|
|
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
|
|
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
|
|
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.
|
package/dist/locales/en.json
CHANGED
|
@@ -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": "
|
|
49
|
+
"default_error": "An error occurred during response generation. Please try again",
|
|
47
50
|
"hide": "Hide",
|
|
48
51
|
"show": "Show",
|
|
49
52
|
"search_conversation": {
|
package/dist/locales/fr.json
CHANGED
|
@@ -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
|
|
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": {
|
package/dist/locales/index.js
CHANGED
|
@@ -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: "
|
|
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
|
|
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.
|
|
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": "^
|
|
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": "
|
|
95
|
+
"gitHead": "817a8f2cfeb4e832a54b218f6f982a3651c5cd9f"
|
|
96
96
|
}
|