@miso.ai/client-sdk-ui 1.13.2-beta.1 → 1.14.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/asset/svgs.js +15 -4
- package/dist/cjs/combo/ask/index.js +2 -2
- package/dist/cjs/constants.js +118 -98
- package/dist/cjs/defaults/ask/controls.js +1 -1
- package/dist/cjs/defaults/hybrid-search/answer-box.js +4 -4
- package/dist/cjs/defaults.js +169 -0
- package/dist/cjs/element/container/index.js +14 -0
- package/dist/cjs/element/container/miso-ask.js +3 -3
- package/dist/cjs/element/container/miso-conversation.js +21 -0
- package/dist/cjs/element/container/miso-explore.js +1 -1
- package/dist/cjs/element/container/miso-history.js +21 -0
- package/dist/cjs/element/container/miso-hybrid-search.js +1 -1
- package/dist/cjs/element/container/miso-recommendation.js +1 -1
- package/dist/cjs/element/container/miso-search.js +1 -1
- package/dist/cjs/element/context/miso-follow-ups.js +1 -1
- package/dist/cjs/element/role/index.js +42 -0
- package/dist/cjs/element/role/miso-messages.js +20 -0
- package/dist/cjs/element/role/miso-new-thread.js +20 -0
- package/dist/cjs/element/role/miso-rename.js +20 -0
- package/dist/cjs/element/role/miso-subscription.js +20 -0
- package/dist/cjs/element/role/miso-threads.js +20 -0
- package/dist/cjs/element/role/miso-title.js +20 -0
- package/dist/cjs/layout/affiliation/affiliation.js +1 -1
- package/dist/cjs/layout/banner/banner.js +2 -1
- package/dist/cjs/layout/button/button.js +130 -0
- package/dist/cjs/layout/button/checkbox.js +115 -0
- package/dist/cjs/layout/button/more-button.js +3 -3
- package/dist/cjs/layout/container/container.js +1 -1
- package/dist/cjs/layout/error/error.js +2 -1
- package/dist/cjs/layout/index.js +28 -0
- package/dist/cjs/layout/input/facets.js +4 -3
- package/dist/cjs/layout/input/option-list.js +3 -2
- package/dist/cjs/layout/input/search-box.js +42 -9
- package/dist/cjs/layout/input/select.js +2 -1
- package/dist/cjs/layout/list/cards.js +2 -1
- package/dist/cjs/layout/list/carousel.js +2 -1
- package/dist/cjs/layout/list/collection.js +5 -0
- package/dist/cjs/layout/list/gallery.js +2 -1
- package/dist/cjs/layout/list/horizontal.js +2 -1
- package/dist/cjs/layout/list/list.js +2 -1
- package/dist/cjs/layout/list/messages.js +346 -0
- package/dist/cjs/layout/list/threads.js +257 -0
- package/dist/cjs/layout/mixin/trackable.js +4 -5
- package/dist/cjs/layout/mixin/triggerable.js +2 -2
- package/dist/cjs/layout/radio/feedback.js +4 -3
- package/dist/cjs/layout/templates.js +70 -0
- package/dist/cjs/layout/text/text.js +2 -1
- package/dist/cjs/layout/text/typewriter/index.js +4 -2
- package/dist/cjs/plugin.js +43 -104
- package/dist/cjs/util/confirm.js +33 -0
- package/dist/cjs/util/modal.js +48 -0
- package/dist/cjs/util/prompt.js +47 -0
- package/dist/cjs/version.js +1 -1
- package/package.json +5 -4
- package/src/CLAUDE.md +48 -105
- package/src/asset/svgs.js +14 -3
- package/src/combo/ask/index.js +2 -2
- package/src/constants.js +37 -147
- package/src/defaults/ask/controls.js +1 -1
- package/src/defaults/hybrid-search/answer-box.js +2 -2
- package/src/defaults.js +107 -0
- package/src/element/container/index.js +2 -0
- package/src/element/container/miso-ask.js +3 -3
- package/src/element/container/miso-conversation.js +19 -0
- package/src/element/container/miso-explore.js +1 -1
- package/src/element/container/miso-history.js +19 -0
- package/src/element/container/miso-hybrid-search.js +1 -1
- package/src/element/container/miso-recommendation.js +1 -1
- package/src/element/container/miso-search.js +1 -1
- package/src/element/context/miso-follow-ups.js +1 -1
- package/src/element/role/index.js +6 -0
- package/src/element/role/miso-messages.js +16 -0
- package/src/element/role/miso-new-thread.js +16 -0
- package/src/element/role/miso-rename.js +16 -0
- package/src/element/role/miso-subscription.js +16 -0
- package/src/element/role/miso-threads.js +16 -0
- package/src/element/role/miso-title.js +16 -0
- package/src/layout/affiliation/affiliation.js +2 -2
- package/src/layout/banner/banner.js +2 -1
- package/src/layout/button/button.js +116 -0
- package/src/layout/button/checkbox.js +91 -0
- package/src/layout/button/more-button.js +3 -3
- package/src/layout/container/container.js +2 -2
- package/src/layout/error/error.js +2 -1
- package/src/layout/index.js +4 -0
- package/src/layout/input/facets.js +3 -2
- package/src/layout/input/option-list.js +3 -2
- package/src/layout/input/search-box.js +41 -6
- package/src/layout/input/select.js +2 -1
- package/src/layout/list/cards.js +2 -1
- package/src/layout/list/carousel.js +2 -1
- package/src/layout/list/collection.js +6 -1
- package/src/layout/list/gallery.js +2 -1
- package/src/layout/list/horizontal.js +2 -1
- package/src/layout/list/list.js +2 -1
- package/src/layout/list/messages.js +318 -0
- package/src/layout/list/threads.js +206 -0
- package/src/layout/mixin/trackable.js +2 -3
- package/src/layout/mixin/triggerable.js +1 -1
- package/src/layout/radio/feedback.js +3 -2
- package/src/layout/templates.js +62 -0
- package/src/layout/text/text.js +2 -1
- package/src/layout/text/typewriter/index.js +5 -3
- package/src/plugin.js +31 -117
- package/src/util/confirm.js +28 -0
- package/src/util/modal.js +49 -0
- package/src/util/prompt.js +42 -0
- package/src/version.js +1 -1
- package/dist/cjs/actor/data.js +0 -132
- package/dist/cjs/actor/feedback.js +0 -29
- package/dist/cjs/actor/fields.js +0 -57
- package/dist/cjs/actor/filters.js +0 -161
- package/dist/cjs/actor/hub.js +0 -57
- package/dist/cjs/actor/index.js +0 -73
- package/dist/cjs/actor/interactions.js +0 -36
- package/dist/cjs/actor/sessions.js +0 -25
- package/dist/cjs/actor/tracker-states.js +0 -61
- package/dist/cjs/actor/tracker.js +0 -109
- package/dist/cjs/actor/trackers.js +0 -52
- package/dist/cjs/actor/utils.js +0 -15
- package/dist/cjs/actor/view.js +0 -294
- package/dist/cjs/actor/views.js +0 -209
- package/dist/cjs/source.js +0 -27
- package/dist/cjs/util/proxy.js +0 -88
- package/dist/cjs/util/trackers.js +0 -88
- package/dist/cjs/workflow/affiliations.js +0 -140
- package/dist/cjs/workflow/answer-based.js +0 -337
- package/dist/cjs/workflow/ask.js +0 -319
- package/dist/cjs/workflow/asks.js +0 -150
- package/dist/cjs/workflow/autocompletable.js +0 -63
- package/dist/cjs/workflow/autocomplete.js +0 -120
- package/dist/cjs/workflow/base.js +0 -418
- package/dist/cjs/workflow/context.js +0 -19
- package/dist/cjs/workflow/explore.js +0 -210
- package/dist/cjs/workflow/explores.js +0 -21
- package/dist/cjs/workflow/hybrid-search-answer.js +0 -88
- package/dist/cjs/workflow/hybrid-search-views.js +0 -109
- package/dist/cjs/workflow/hybrid-search.js +0 -213
- package/dist/cjs/workflow/index.js +0 -41
- package/dist/cjs/workflow/options/api.js +0 -41
- package/dist/cjs/workflow/options/auto-query.js +0 -97
- package/dist/cjs/workflow/options/configurable.js +0 -45
- package/dist/cjs/workflow/options/data-processor.js +0 -20
- package/dist/cjs/workflow/options/filters.js +0 -15
- package/dist/cjs/workflow/options/index.js +0 -126
- package/dist/cjs/workflow/options/interactions.js +0 -41
- package/dist/cjs/workflow/options/layouts.js +0 -79
- package/dist/cjs/workflow/options/options.js +0 -156
- package/dist/cjs/workflow/options/pagination.js +0 -25
- package/dist/cjs/workflow/options/roles.js +0 -15
- package/dist/cjs/workflow/options/templates.js +0 -30
- package/dist/cjs/workflow/options/trackers.js +0 -83
- package/dist/cjs/workflow/options/utils.js +0 -33
- package/dist/cjs/workflow/processors.js +0 -607
- package/dist/cjs/workflow/recommendation.js +0 -57
- package/dist/cjs/workflow/recommendations.js +0 -18
- package/dist/cjs/workflow/search-based.js +0 -337
- package/dist/cjs/workflow/search.js +0 -64
- package/dist/cjs/workflow/unit.js +0 -57
- package/dist/cjs/workflow/units.js +0 -42
- package/dist/cjs/workflow/use-link.js +0 -49
- package/src/actor/data.js +0 -106
- package/src/actor/feedback.js +0 -28
- package/src/actor/fields.js +0 -51
- package/src/actor/filters.js +0 -149
- package/src/actor/hub.js +0 -47
- package/src/actor/index.js +0 -10
- package/src/actor/interactions.js +0 -32
- package/src/actor/sessions.js +0 -21
- package/src/actor/tracker-states.js +0 -57
- package/src/actor/tracker.js +0 -104
- package/src/actor/trackers.js +0 -45
- package/src/actor/utils.js +0 -7
- package/src/actor/view.js +0 -272
- package/src/actor/views.js +0 -224
- package/src/source.js +0 -17
- package/src/util/proxy.js +0 -81
- package/src/util/trackers.js +0 -84
- package/src/workflow/affiliations.js +0 -121
- package/src/workflow/answer-based.js +0 -312
- package/src/workflow/ask.js +0 -284
- package/src/workflow/asks.js +0 -143
- package/src/workflow/autocompletable.js +0 -67
- package/src/workflow/autocomplete.js +0 -114
- package/src/workflow/base.js +0 -396
- package/src/workflow/context.js +0 -16
- package/src/workflow/explore.js +0 -194
- package/src/workflow/explores.js +0 -18
- package/src/workflow/hybrid-search-answer.js +0 -73
- package/src/workflow/hybrid-search-views.js +0 -116
- package/src/workflow/hybrid-search.js +0 -230
- package/src/workflow/index.js +0 -5
- package/src/workflow/options/api.js +0 -31
- package/src/workflow/options/auto-query.js +0 -70
- package/src/workflow/options/configurable.js +0 -48
- package/src/workflow/options/data-processor.js +0 -15
- package/src/workflow/options/filters.js +0 -10
- package/src/workflow/options/index.js +0 -11
- package/src/workflow/options/interactions.js +0 -36
- package/src/workflow/options/layouts.js +0 -73
- package/src/workflow/options/options.js +0 -175
- package/src/workflow/options/pagination.js +0 -18
- package/src/workflow/options/roles.js +0 -12
- package/src/workflow/options/templates.js +0 -27
- package/src/workflow/options/trackers.js +0 -80
- package/src/workflow/options/utils.js +0 -26
- package/src/workflow/processors.js +0 -490
- package/src/workflow/recommendation.js +0 -63
- package/src/workflow/recommendations.js +0 -14
- package/src/workflow/search-based.js +0 -329
- package/src/workflow/search.js +0 -73
- package/src/workflow/unit.js +0 -51
- package/src/workflow/units.js +0 -43
- package/src/workflow/use-link.js +0 -41
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
import { trimObj, mergeApiPayloads, mergeInteractions } from '@miso.ai/commons';
|
|
2
|
-
import { STATUS, ROLE, EVENT_TYPE, REQUEST_TYPE, QUESTION_SOURCE, isPerformanceEventType, isProductRole } from '../constants.js';
|
|
3
|
-
import { fields } from '../actor/index.js';
|
|
4
|
-
|
|
5
|
-
// role mappings //
|
|
6
|
-
export function mappingSortData(_, { hub, workflowOptions = {} } = {}) {
|
|
7
|
-
const { sort: { options = [] } = {} } = workflowOptions.filters || {};
|
|
8
|
-
if (!options.length) {
|
|
9
|
-
return [];
|
|
10
|
-
}
|
|
11
|
-
const { sort } = hub.states[fields.filters()] || {};
|
|
12
|
-
const selectedField = (sort && sort.field) || findDefaultSortOption(options).field;
|
|
13
|
-
if (!selectedField) {
|
|
14
|
-
return options;
|
|
15
|
-
}
|
|
16
|
-
// mark selected
|
|
17
|
-
return options.map(option => {
|
|
18
|
-
return {
|
|
19
|
-
...option,
|
|
20
|
-
selected: option.field === selectedField,
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function findDefaultSortOption(options) {
|
|
26
|
-
for (const option of options) {
|
|
27
|
-
if (option.default) {
|
|
28
|
-
return option;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return options[0];
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export function mappingAnswerData(data) {
|
|
35
|
-
if (!data || !data.value) {
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
const { answer = '', answer_stage, finished } = data.value;
|
|
39
|
-
return Object.freeze({ value: answer, stage: answer_stage, finished: !!finished });
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export function mappingReasoningData(data) {
|
|
43
|
-
if (!data || !data.value) {
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
const { reasoning = '', reasoning_finished } = data.value;
|
|
47
|
-
return Object.freeze({ value: reasoning, stage: 'reasoning', finished: !!reasoning_finished });
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export function mappingSuggestionsData(_, { workflow } = {}) {
|
|
51
|
-
const previous = workflow.previous;
|
|
52
|
-
const values = previous && previous.states[fields.data()].value;
|
|
53
|
-
const value = values && (values.suggested_followup_questions || values.followup_questions || []);
|
|
54
|
-
return value && value.map(text => ({ text }));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function mappingFollowUpQuestionsData(data) {
|
|
58
|
-
if (!data || !data.value) {
|
|
59
|
-
return undefined;
|
|
60
|
-
}
|
|
61
|
-
return (data.value.followup_questions || []).map(text => ({ text }));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// payload //
|
|
65
|
-
export function writeQuestionSourceToPayload({ qs, ...payload } = {}) {
|
|
66
|
-
return mergeApiPayloads(payload, {
|
|
67
|
-
metadata: {
|
|
68
|
-
question_source: qs || QUESTION_SOURCE.ORGANIC, // might be null, not undefined
|
|
69
|
-
},
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function disableAnswerForNonQueryRequest(payload, type) {
|
|
74
|
-
if (type === REQUEST_TYPE.QUERY) {
|
|
75
|
-
return payload;
|
|
76
|
-
}
|
|
77
|
-
return { ...payload, answer: false };
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// data //
|
|
81
|
-
export function getRevision(data) {
|
|
82
|
-
return data && data.value && data.value.revision;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export function writeRequestFromPreviousData(data, oldData) {
|
|
86
|
-
// patch request in case user call updateData() without request object in custom data scenario
|
|
87
|
-
if (!data || !data.value || data.request || !oldData || !oldData.request) {
|
|
88
|
-
return data;
|
|
89
|
-
}
|
|
90
|
-
const { request } = oldData;
|
|
91
|
-
return {
|
|
92
|
-
...data,
|
|
93
|
-
request,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function writeDataStatus(data) {
|
|
98
|
-
const status = getStatus(data);
|
|
99
|
-
const ongoing = status === STATUS.READY ? data.ongoing : undefined;
|
|
100
|
-
return trimObj({ status, ongoing, ...data }); // let orinigal data override status and ongoing
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function getStatus(data) {
|
|
104
|
-
if (!data) {
|
|
105
|
-
return STATUS.INITIAL;
|
|
106
|
-
}
|
|
107
|
-
const { request, error, value } = data;
|
|
108
|
-
return error ? STATUS.ERRONEOUS : value ? STATUS.READY : request ? STATUS.LOADING : STATUS.INITIAL;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function writeMisoIdToMeta(data) {
|
|
112
|
-
const { value } = data;
|
|
113
|
-
if (!value) {
|
|
114
|
-
return data;
|
|
115
|
-
}
|
|
116
|
-
const { miso_id } = value;
|
|
117
|
-
if (!miso_id) {
|
|
118
|
-
return data;
|
|
119
|
-
}
|
|
120
|
-
return {
|
|
121
|
-
...data,
|
|
122
|
-
meta: {
|
|
123
|
-
...data.meta,
|
|
124
|
-
miso_id,
|
|
125
|
-
},
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export function writeMisoIdToSession(data) {
|
|
130
|
-
const { session, value } = data;
|
|
131
|
-
if (!session || !value) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
const { miso_id } = value;
|
|
135
|
-
if (!miso_id) {
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
session.meta.miso_id = miso_id;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
export function writeMisoIdFromSession(data) {
|
|
142
|
-
const { session, value } = data;
|
|
143
|
-
if (!session || !value) {
|
|
144
|
-
return data;
|
|
145
|
-
}
|
|
146
|
-
const { meta: { miso_id } = {} } = session;
|
|
147
|
-
if (!miso_id) {
|
|
148
|
-
return data;
|
|
149
|
-
}
|
|
150
|
-
return {
|
|
151
|
-
...data,
|
|
152
|
-
meta: {
|
|
153
|
-
...data.meta,
|
|
154
|
-
miso_id,
|
|
155
|
-
},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
export function writeKeywordsToData(data) {
|
|
160
|
-
const { request, value } = data;
|
|
161
|
-
// we still want the value in loading status
|
|
162
|
-
if (!request) {
|
|
163
|
-
return data;
|
|
164
|
-
}
|
|
165
|
-
const { payload } = request || {};
|
|
166
|
-
const { q: keywords } = payload || {};
|
|
167
|
-
if (!keywords) {
|
|
168
|
-
return data;
|
|
169
|
-
}
|
|
170
|
-
return {
|
|
171
|
-
...data,
|
|
172
|
-
value: {
|
|
173
|
-
...value,
|
|
174
|
-
keywords,
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
export function writeAnswerStageToMeta(data) {
|
|
180
|
-
const { value } = data;
|
|
181
|
-
if (!value) {
|
|
182
|
-
return data;
|
|
183
|
-
}
|
|
184
|
-
const { answer_stage } = value;
|
|
185
|
-
if (!answer_stage) {
|
|
186
|
-
return data;
|
|
187
|
-
}
|
|
188
|
-
// 1. put answer_stage to meta
|
|
189
|
-
// 2. mark ongoing flag
|
|
190
|
-
return {
|
|
191
|
-
...data,
|
|
192
|
-
ongoing: !value.finished,
|
|
193
|
-
meta: {
|
|
194
|
-
...data.meta,
|
|
195
|
-
answer_stage,
|
|
196
|
-
},
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export function retainFacetCountsInData(data, currentFacetCounts) {
|
|
201
|
-
if (!currentFacetCounts) {
|
|
202
|
-
return data;
|
|
203
|
-
}
|
|
204
|
-
const { status, value } = data;
|
|
205
|
-
switch (status) {
|
|
206
|
-
case STATUS.INITIAL:
|
|
207
|
-
case STATUS.LOADING:
|
|
208
|
-
break;
|
|
209
|
-
default:
|
|
210
|
-
return data;
|
|
211
|
-
}
|
|
212
|
-
if (value && value.facet_counts) {
|
|
213
|
-
return data;
|
|
214
|
-
}
|
|
215
|
-
return {
|
|
216
|
-
...data,
|
|
217
|
-
value: {
|
|
218
|
-
...value,
|
|
219
|
-
facet_counts: currentFacetCounts,
|
|
220
|
-
},
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
export function writeMisoIdAsRootMisoId(data) {
|
|
225
|
-
const { value } = data;
|
|
226
|
-
if (!value) {
|
|
227
|
-
return data;
|
|
228
|
-
}
|
|
229
|
-
const { miso_id } = value;
|
|
230
|
-
if (!miso_id) {
|
|
231
|
-
return data;
|
|
232
|
-
}
|
|
233
|
-
return {
|
|
234
|
-
...data,
|
|
235
|
-
value: {
|
|
236
|
-
...value,
|
|
237
|
-
root_miso_id: miso_id,
|
|
238
|
-
},
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
export function concatItemsFromMoreResponse(oldData, newData, { role = ROLE.PRODUCTS } = {}) {
|
|
243
|
-
if (!newData.value) {
|
|
244
|
-
return oldData;
|
|
245
|
-
}
|
|
246
|
-
const { [role]: oldProducts = [], facet_counts, total, root_miso_id } = oldData.value;
|
|
247
|
-
const { [role]: newProducts = [] } = newData.value;
|
|
248
|
-
// keep old exhaustion flag, just in case
|
|
249
|
-
// TODO
|
|
250
|
-
|
|
251
|
-
// use old values of facet_counts and total, for they are affected by product_id exclusion
|
|
252
|
-
return {
|
|
253
|
-
...newData,
|
|
254
|
-
value: {
|
|
255
|
-
...newData.value,
|
|
256
|
-
facet_counts,
|
|
257
|
-
total,
|
|
258
|
-
root_miso_id,
|
|
259
|
-
[role]: [...oldProducts, ...newProducts],
|
|
260
|
-
},
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
export function writeExhaustionToData(data, { role = ROLE.PRODUCTS } = {}) {
|
|
265
|
-
const { status, request, value } = data;
|
|
266
|
-
// keep track of the exhaustion state
|
|
267
|
-
if (status !== STATUS.READY || !request || !value) {
|
|
268
|
-
return data;
|
|
269
|
-
}
|
|
270
|
-
const { [role]: items } = value;
|
|
271
|
-
if (!items) {
|
|
272
|
-
return data;
|
|
273
|
-
}
|
|
274
|
-
const { rows } = request.payload;
|
|
275
|
-
const { length } = items;
|
|
276
|
-
const exhausted = length < rows;
|
|
277
|
-
if (!exhausted) {
|
|
278
|
-
return data;
|
|
279
|
-
}
|
|
280
|
-
return {
|
|
281
|
-
...data,
|
|
282
|
-
meta: {
|
|
283
|
-
...data.meta,
|
|
284
|
-
exhausted: true,
|
|
285
|
-
},
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
export function carryOverQuestionIdToData(data, oldData) {
|
|
290
|
-
const { question_id } = (oldData && oldData.value) || {};
|
|
291
|
-
if (!question_id) {
|
|
292
|
-
return data;
|
|
293
|
-
}
|
|
294
|
-
return {
|
|
295
|
-
...data,
|
|
296
|
-
value: {
|
|
297
|
-
...data.value,
|
|
298
|
-
question_id,
|
|
299
|
-
},
|
|
300
|
-
};
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
export function writeUnanswerableToMeta(data) {
|
|
304
|
-
const { value } = data;
|
|
305
|
-
if (!value) {
|
|
306
|
-
return data;
|
|
307
|
-
}
|
|
308
|
-
if (!value.finished || value.finish_reason !== 'success' || (value.sources && value.sources.length > 0)) {
|
|
309
|
-
return data;
|
|
310
|
-
}
|
|
311
|
-
return {
|
|
312
|
-
...data,
|
|
313
|
-
meta: {
|
|
314
|
-
...data.meta,
|
|
315
|
-
unanswerable: true,
|
|
316
|
-
},
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// interactions //
|
|
321
|
-
export function buildBaseInteraction(args) {
|
|
322
|
-
const { role, type, items, ...rest } = args;
|
|
323
|
-
const payload = {
|
|
324
|
-
type: type === 'viewable' ? 'viewable_impression' : type,
|
|
325
|
-
context: {
|
|
326
|
-
custom_context: trimObj({
|
|
327
|
-
property: role,
|
|
328
|
-
}),
|
|
329
|
-
},
|
|
330
|
-
};
|
|
331
|
-
|
|
332
|
-
if (isPerformanceEventType(type)) {
|
|
333
|
-
if (areProducts(role, items)) {
|
|
334
|
-
payload.product_ids = (items || []).map(v => typeof v === 'string' ? v : v.product_id).filter(v => v);
|
|
335
|
-
} else {
|
|
336
|
-
payload.product_ids = [];
|
|
337
|
-
payload.context.custom_context.items = (items || []).map(v => v.text || v.id || v);
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
switch (type) {
|
|
342
|
-
case EVENT_TYPE.SUBMIT:
|
|
343
|
-
payload.context.custom_context.value = args.value;
|
|
344
|
-
break;
|
|
345
|
-
case EVENT_TYPE.FEEDBACK:
|
|
346
|
-
payload.context.custom_context.value = payload.value = args.value;
|
|
347
|
-
payload.context.custom_context.result_type = payload.result_type = args.result_type;
|
|
348
|
-
break;
|
|
349
|
-
case EVENT_TYPE.HEARTBEAT:
|
|
350
|
-
payload.type = 'custom';
|
|
351
|
-
payload.custom_action_name = 'heartbeat';
|
|
352
|
-
break;
|
|
353
|
-
case EVENT_TYPE.GENERIC_CLICK:
|
|
354
|
-
payload.type = 'custom';
|
|
355
|
-
payload.custom_action_name = 'generic_click';
|
|
356
|
-
payload.context.custom_context.href = args.href;
|
|
357
|
-
break;
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
return trimObj(payload);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
function areProducts(role, items = []) {
|
|
364
|
-
return isProductRole(role) || (items.length > 0 && typeof items[0] === 'object' && items[0].product_id);
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
export function writeSessionInfoToInteraction(payload, args) {
|
|
368
|
-
const { session } = args && args.data || {};
|
|
369
|
-
if (!session) {
|
|
370
|
-
return payload;
|
|
371
|
-
}
|
|
372
|
-
const now = args.now || Date.now();
|
|
373
|
-
return mergeInteractions(payload, {
|
|
374
|
-
context: {
|
|
375
|
-
custom_context: {
|
|
376
|
-
session_id: session.uuid,
|
|
377
|
-
session_elapsed: now - session.startAt,
|
|
378
|
-
session_request_elapsed: session.meta.requestAt ? now - session.meta.requestAt : undefined,
|
|
379
|
-
},
|
|
380
|
-
},
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
export function writeRequestMetadataToInteraction(payload, args) {
|
|
385
|
-
const { data } = args;
|
|
386
|
-
if (!data) {
|
|
387
|
-
return payload;
|
|
388
|
-
}
|
|
389
|
-
const metadata = data.request && data.request.payload && data.request.payload.metadata;
|
|
390
|
-
if (!metadata) {
|
|
391
|
-
return payload;
|
|
392
|
-
}
|
|
393
|
-
return mergeInteractions(payload, {
|
|
394
|
-
context: {
|
|
395
|
-
custom_context: metadata,
|
|
396
|
-
},
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
export function writeRequestInfoToInteraction(payload, args) {
|
|
401
|
-
const { data } = args;
|
|
402
|
-
if (!data) {
|
|
403
|
-
return payload;
|
|
404
|
-
}
|
|
405
|
-
const requestPayload = data.request && data.request.payload;
|
|
406
|
-
if (!requestPayload) {
|
|
407
|
-
return payload;
|
|
408
|
-
}
|
|
409
|
-
const { question, q, fq } = requestPayload;
|
|
410
|
-
return mergeInteractions(payload, {
|
|
411
|
-
context: {
|
|
412
|
-
custom_context: {
|
|
413
|
-
question,
|
|
414
|
-
q,
|
|
415
|
-
fq,
|
|
416
|
-
},
|
|
417
|
-
},
|
|
418
|
-
});
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
export function writeAffiliationInfoToInteraction(payload, args) {
|
|
422
|
-
if (args.role !== ROLE.AFFILIATION) {
|
|
423
|
-
return payload;
|
|
424
|
-
}
|
|
425
|
-
const { items } = args;
|
|
426
|
-
const channel = (items[0] && items[0].channel) || undefined;
|
|
427
|
-
const positions = items.map(v => v.position);
|
|
428
|
-
return mergeInteractions(payload, {
|
|
429
|
-
context: {
|
|
430
|
-
custom_context: {
|
|
431
|
-
channel,
|
|
432
|
-
positions,
|
|
433
|
-
},
|
|
434
|
-
},
|
|
435
|
-
});
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
export function writeAnswerInfoToInteraction(payload, args) {
|
|
439
|
-
payload = writeQuestionInfoToInteraction(payload, args);
|
|
440
|
-
payload = writeAnswerClickInfoToInteraction(payload, args);
|
|
441
|
-
payload = writeEventTargetToInteraction(payload, args);
|
|
442
|
-
return payload;
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
export function writeQuestionInfoToInteraction(payload = {}, { data } = {}) {
|
|
446
|
-
if (!data) {
|
|
447
|
-
return payload;
|
|
448
|
-
}
|
|
449
|
-
const { request = {}, value = {} } = data;
|
|
450
|
-
const { question_source } = request.payload && request.payload.metadata || {};
|
|
451
|
-
const { question_id } = value;
|
|
452
|
-
return mergeInteractions(payload, {
|
|
453
|
-
context: {
|
|
454
|
-
custom_context: {
|
|
455
|
-
question_source,
|
|
456
|
-
question_id,
|
|
457
|
-
},
|
|
458
|
-
},
|
|
459
|
-
});
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
export function writeAnswerClickInfoToInteraction(payload, args) {
|
|
463
|
-
if (args.role !== ROLE.ANSWER) {
|
|
464
|
-
return payload;
|
|
465
|
-
}
|
|
466
|
-
const { items = [] } = args;
|
|
467
|
-
return mergeInteractions(payload, {
|
|
468
|
-
context: {
|
|
469
|
-
custom_context: {
|
|
470
|
-
urls: items.map(item => item.url),
|
|
471
|
-
texts: items.map(item => item.text),
|
|
472
|
-
class_names: items.map(item => item.className),
|
|
473
|
-
attributes: items.map(item => item.attributes),
|
|
474
|
-
},
|
|
475
|
-
},
|
|
476
|
-
});
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
export function writeEventTargetToInteraction(payload, { event_target } = {}) {
|
|
480
|
-
if (!event_target) {
|
|
481
|
-
return payload;
|
|
482
|
-
}
|
|
483
|
-
return mergeInteractions(payload, {
|
|
484
|
-
context: {
|
|
485
|
-
custom_context: {
|
|
486
|
-
event_target,
|
|
487
|
-
},
|
|
488
|
-
},
|
|
489
|
-
});
|
|
490
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { API } from '@miso.ai/commons';
|
|
2
|
-
import UnitWorkflow from './unit.js';
|
|
3
|
-
import { ListLayout } from '../layout/index.js';
|
|
4
|
-
import { ROLE } from '../constants.js';
|
|
5
|
-
import { mergeRolesOptions, DEFAULT_TRACKER_OPTIONS } from './options/index.js';
|
|
6
|
-
|
|
7
|
-
const DEFAULT_API_OPTIONS = Object.freeze({
|
|
8
|
-
...UnitWorkflow.DEFAULT_API_OPTIONS,
|
|
9
|
-
group: API.GROUP.RECOMMENDATION,
|
|
10
|
-
name: API.NAME.USER_TO_PRODUCTS,
|
|
11
|
-
payload: {
|
|
12
|
-
...UnitWorkflow.DEFAULT_API_OPTIONS.payload,
|
|
13
|
-
fl: ['*'],
|
|
14
|
-
},
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
const DEFAULT_LAYOUTS = Object.freeze({
|
|
18
|
-
...UnitWorkflow.DEFAULT_LAYOUTS,
|
|
19
|
-
[ROLE.PRODUCTS]: ListLayout.type,
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
const DEFAULT_TRACKERS = Object.freeze({
|
|
23
|
-
...UnitWorkflow.DEFAULT_TRACKERS,
|
|
24
|
-
[ROLE.PRODUCTS]: DEFAULT_TRACKER_OPTIONS,
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const DEFAULT_OPTIONS = Object.freeze({
|
|
28
|
-
...UnitWorkflow.DEFAULT_OPTIONS,
|
|
29
|
-
api: DEFAULT_API_OPTIONS,
|
|
30
|
-
layouts: DEFAULT_LAYOUTS,
|
|
31
|
-
trackers: DEFAULT_TRACKERS,
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
const ROLES_OPTIONS = mergeRolesOptions(UnitWorkflow.ROLES_OPTIONS, {
|
|
35
|
-
main: ROLE.PRODUCTS,
|
|
36
|
-
members: Object.keys(DEFAULT_LAYOUTS),
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
export default class Recommendation extends UnitWorkflow {
|
|
40
|
-
|
|
41
|
-
constructor(context, id) {
|
|
42
|
-
super({
|
|
43
|
-
name: 'recommendation',
|
|
44
|
-
context,
|
|
45
|
-
roles: ROLES_OPTIONS,
|
|
46
|
-
defaults: DEFAULT_OPTIONS,
|
|
47
|
-
id,
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// lifecycle //
|
|
52
|
-
start() {
|
|
53
|
-
// in recommendation workflow, start() triggers query
|
|
54
|
-
this._request();
|
|
55
|
-
return this;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
notifyViewUpdate(role = ROLE.PRODUCTS, ...args) {
|
|
59
|
-
super.notifyViewUpdate(role, ...args);
|
|
60
|
-
return this;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import UnitWorkflowContext from './units.js';
|
|
2
|
-
import Recommendation from './recommendation.js';
|
|
3
|
-
|
|
4
|
-
export default class Recommendations extends UnitWorkflowContext {
|
|
5
|
-
|
|
6
|
-
constructor(plugin, client) {
|
|
7
|
-
super('recommendations', plugin, client);
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
_create(unitId) {
|
|
11
|
-
return new Recommendation(this, unitId);
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
}
|