@miso.ai/client-sdk-ui 1.13.2-beta.1 → 1.14.0-beta.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.
Files changed (226) hide show
  1. package/dist/cjs/asset/svgs.js +17 -4
  2. package/dist/cjs/combo/ask/index.js +2 -2
  3. package/dist/cjs/constants.js +120 -98
  4. package/dist/cjs/defaults/ask/controls.js +1 -1
  5. package/dist/cjs/defaults/hybrid-search/answer-box.js +4 -4
  6. package/dist/cjs/defaults.js +259 -0
  7. package/dist/cjs/element/container/index.js +28 -0
  8. package/dist/cjs/element/container/miso-ask.js +3 -3
  9. package/dist/cjs/element/container/miso-conversation.js +21 -0
  10. package/dist/cjs/element/container/miso-explore.js +1 -1
  11. package/dist/cjs/element/container/miso-history.js +21 -0
  12. package/dist/cjs/element/container/miso-hybrid-search.js +1 -1
  13. package/dist/cjs/element/container/miso-message-item.js +91 -0
  14. package/dist/cjs/element/container/miso-recommendation.js +1 -1
  15. package/dist/cjs/element/container/miso-search.js +1 -1
  16. package/dist/cjs/element/container/miso-thread-item.js +91 -0
  17. package/dist/cjs/element/context/miso-follow-ups.js +1 -1
  18. package/dist/cjs/element/role/index.js +49 -0
  19. package/dist/cjs/element/role/miso-delete.js +20 -0
  20. package/dist/cjs/element/role/miso-messages.js +20 -0
  21. package/dist/cjs/element/role/miso-new-thread.js +20 -0
  22. package/dist/cjs/element/role/miso-rename.js +20 -0
  23. package/dist/cjs/element/role/miso-subscription.js +20 -0
  24. package/dist/cjs/element/role/miso-threads.js +20 -0
  25. package/dist/cjs/element/role/miso-title.js +20 -0
  26. package/dist/cjs/layout/affiliation/affiliation.js +1 -1
  27. package/dist/cjs/layout/banner/banner.js +2 -1
  28. package/dist/cjs/layout/button/button.js +170 -0
  29. package/dist/cjs/layout/button/checkbox.js +116 -0
  30. package/dist/cjs/layout/button/more-button.js +3 -3
  31. package/dist/cjs/layout/container/container.js +1 -1
  32. package/dist/cjs/layout/container/item-container.js +99 -0
  33. package/dist/cjs/layout/error/error.js +2 -1
  34. package/dist/cjs/layout/index.js +42 -0
  35. package/dist/cjs/layout/input/facets.js +4 -3
  36. package/dist/cjs/layout/input/option-list.js +3 -2
  37. package/dist/cjs/layout/input/search-box.js +50 -12
  38. package/dist/cjs/layout/input/select.js +2 -1
  39. package/dist/cjs/layout/list/cards.js +2 -1
  40. package/dist/cjs/layout/list/carousel.js +2 -1
  41. package/dist/cjs/layout/list/collection.js +13 -1
  42. package/dist/cjs/layout/list/gallery.js +2 -1
  43. package/dist/cjs/layout/list/horizontal.js +2 -1
  44. package/dist/cjs/layout/list/list.js +2 -1
  45. package/dist/cjs/layout/list/messages.js +359 -0
  46. package/dist/cjs/layout/list/threads.js +199 -0
  47. package/dist/cjs/layout/mixin/trackable.js +4 -5
  48. package/dist/cjs/layout/mixin/triggerable.js +2 -2
  49. package/dist/cjs/layout/radio/feedback.js +4 -3
  50. package/dist/cjs/layout/templates.js +97 -0
  51. package/dist/cjs/layout/text/question.js +71 -0
  52. package/dist/cjs/layout/text/text.js +2 -1
  53. package/dist/cjs/layout/text/typewriter/index.js +18 -23
  54. package/dist/cjs/plugin.js +43 -104
  55. package/dist/cjs/util/confirm.js +33 -0
  56. package/dist/cjs/util/dom.js +21 -0
  57. package/dist/cjs/util/modal.js +48 -0
  58. package/dist/cjs/util/prompt.js +47 -0
  59. package/dist/cjs/version.js +1 -1
  60. package/package.json +5 -4
  61. package/src/CLAUDE.md +51 -104
  62. package/src/asset/svgs.js +16 -3
  63. package/src/combo/ask/index.js +2 -2
  64. package/src/constants.js +39 -147
  65. package/src/defaults/ask/controls.js +1 -1
  66. package/src/defaults/hybrid-search/answer-box.js +2 -2
  67. package/src/defaults.js +174 -0
  68. package/src/element/container/index.js +4 -0
  69. package/src/element/container/miso-ask.js +3 -3
  70. package/src/element/container/miso-conversation.js +19 -0
  71. package/src/element/container/miso-explore.js +1 -1
  72. package/src/element/container/miso-history.js +19 -0
  73. package/src/element/container/miso-hybrid-search.js +1 -1
  74. package/src/element/container/miso-message-item.js +94 -0
  75. package/src/element/container/miso-recommendation.js +1 -1
  76. package/src/element/container/miso-search.js +1 -1
  77. package/src/element/container/miso-thread-item.js +94 -0
  78. package/src/element/context/miso-follow-ups.js +1 -1
  79. package/src/element/role/index.js +7 -0
  80. package/src/element/role/miso-delete.js +16 -0
  81. package/src/element/role/miso-messages.js +16 -0
  82. package/src/element/role/miso-new-thread.js +16 -0
  83. package/src/element/role/miso-rename.js +16 -0
  84. package/src/element/role/miso-subscription.js +16 -0
  85. package/src/element/role/miso-threads.js +16 -0
  86. package/src/element/role/miso-title.js +16 -0
  87. package/src/layout/affiliation/affiliation.js +2 -2
  88. package/src/layout/banner/banner.js +2 -1
  89. package/src/layout/button/button.js +152 -0
  90. package/src/layout/button/checkbox.js +92 -0
  91. package/src/layout/button/more-button.js +3 -3
  92. package/src/layout/container/container.js +2 -2
  93. package/src/layout/container/item-container.js +99 -0
  94. package/src/layout/error/error.js +2 -1
  95. package/src/layout/index.js +6 -0
  96. package/src/layout/input/facets.js +3 -2
  97. package/src/layout/input/option-list.js +3 -2
  98. package/src/layout/input/search-box.js +45 -8
  99. package/src/layout/input/select.js +2 -1
  100. package/src/layout/list/cards.js +2 -1
  101. package/src/layout/list/carousel.js +2 -1
  102. package/src/layout/list/collection.js +15 -2
  103. package/src/layout/list/gallery.js +2 -1
  104. package/src/layout/list/horizontal.js +2 -1
  105. package/src/layout/list/list.js +2 -1
  106. package/src/layout/list/messages.js +316 -0
  107. package/src/layout/list/threads.js +166 -0
  108. package/src/layout/mixin/trackable.js +2 -3
  109. package/src/layout/mixin/triggerable.js +1 -1
  110. package/src/layout/radio/feedback.js +3 -2
  111. package/src/layout/templates.js +97 -0
  112. package/src/layout/text/question.js +58 -0
  113. package/src/layout/text/text.js +2 -1
  114. package/src/layout/text/typewriter/index.js +15 -18
  115. package/src/plugin.js +31 -117
  116. package/src/util/confirm.js +28 -0
  117. package/src/util/dom.js +16 -0
  118. package/src/util/modal.js +49 -0
  119. package/src/util/prompt.js +42 -0
  120. package/src/version.js +1 -1
  121. package/dist/cjs/actor/data.js +0 -132
  122. package/dist/cjs/actor/feedback.js +0 -29
  123. package/dist/cjs/actor/fields.js +0 -57
  124. package/dist/cjs/actor/filters.js +0 -161
  125. package/dist/cjs/actor/hub.js +0 -57
  126. package/dist/cjs/actor/index.js +0 -73
  127. package/dist/cjs/actor/interactions.js +0 -36
  128. package/dist/cjs/actor/sessions.js +0 -25
  129. package/dist/cjs/actor/tracker-states.js +0 -61
  130. package/dist/cjs/actor/tracker.js +0 -109
  131. package/dist/cjs/actor/trackers.js +0 -52
  132. package/dist/cjs/actor/utils.js +0 -15
  133. package/dist/cjs/actor/view.js +0 -294
  134. package/dist/cjs/actor/views.js +0 -209
  135. package/dist/cjs/source.js +0 -27
  136. package/dist/cjs/util/proxy.js +0 -88
  137. package/dist/cjs/util/trackers.js +0 -88
  138. package/dist/cjs/workflow/affiliations.js +0 -140
  139. package/dist/cjs/workflow/answer-based.js +0 -337
  140. package/dist/cjs/workflow/ask.js +0 -319
  141. package/dist/cjs/workflow/asks.js +0 -150
  142. package/dist/cjs/workflow/autocompletable.js +0 -63
  143. package/dist/cjs/workflow/autocomplete.js +0 -120
  144. package/dist/cjs/workflow/base.js +0 -418
  145. package/dist/cjs/workflow/context.js +0 -19
  146. package/dist/cjs/workflow/explore.js +0 -210
  147. package/dist/cjs/workflow/explores.js +0 -21
  148. package/dist/cjs/workflow/hybrid-search-answer.js +0 -88
  149. package/dist/cjs/workflow/hybrid-search-views.js +0 -109
  150. package/dist/cjs/workflow/hybrid-search.js +0 -213
  151. package/dist/cjs/workflow/index.js +0 -41
  152. package/dist/cjs/workflow/options/api.js +0 -41
  153. package/dist/cjs/workflow/options/auto-query.js +0 -97
  154. package/dist/cjs/workflow/options/configurable.js +0 -45
  155. package/dist/cjs/workflow/options/data-processor.js +0 -20
  156. package/dist/cjs/workflow/options/filters.js +0 -15
  157. package/dist/cjs/workflow/options/index.js +0 -126
  158. package/dist/cjs/workflow/options/interactions.js +0 -41
  159. package/dist/cjs/workflow/options/layouts.js +0 -79
  160. package/dist/cjs/workflow/options/options.js +0 -156
  161. package/dist/cjs/workflow/options/pagination.js +0 -25
  162. package/dist/cjs/workflow/options/roles.js +0 -15
  163. package/dist/cjs/workflow/options/templates.js +0 -30
  164. package/dist/cjs/workflow/options/trackers.js +0 -83
  165. package/dist/cjs/workflow/options/utils.js +0 -33
  166. package/dist/cjs/workflow/processors.js +0 -607
  167. package/dist/cjs/workflow/recommendation.js +0 -57
  168. package/dist/cjs/workflow/recommendations.js +0 -18
  169. package/dist/cjs/workflow/search-based.js +0 -337
  170. package/dist/cjs/workflow/search.js +0 -64
  171. package/dist/cjs/workflow/unit.js +0 -57
  172. package/dist/cjs/workflow/units.js +0 -42
  173. package/dist/cjs/workflow/use-link.js +0 -49
  174. package/src/actor/data.js +0 -106
  175. package/src/actor/feedback.js +0 -28
  176. package/src/actor/fields.js +0 -51
  177. package/src/actor/filters.js +0 -149
  178. package/src/actor/hub.js +0 -47
  179. package/src/actor/index.js +0 -10
  180. package/src/actor/interactions.js +0 -32
  181. package/src/actor/sessions.js +0 -21
  182. package/src/actor/tracker-states.js +0 -57
  183. package/src/actor/tracker.js +0 -104
  184. package/src/actor/trackers.js +0 -45
  185. package/src/actor/utils.js +0 -7
  186. package/src/actor/view.js +0 -272
  187. package/src/actor/views.js +0 -224
  188. package/src/source.js +0 -17
  189. package/src/util/proxy.js +0 -81
  190. package/src/util/trackers.js +0 -84
  191. package/src/workflow/affiliations.js +0 -121
  192. package/src/workflow/answer-based.js +0 -312
  193. package/src/workflow/ask.js +0 -284
  194. package/src/workflow/asks.js +0 -143
  195. package/src/workflow/autocompletable.js +0 -67
  196. package/src/workflow/autocomplete.js +0 -114
  197. package/src/workflow/base.js +0 -396
  198. package/src/workflow/context.js +0 -16
  199. package/src/workflow/explore.js +0 -194
  200. package/src/workflow/explores.js +0 -18
  201. package/src/workflow/hybrid-search-answer.js +0 -73
  202. package/src/workflow/hybrid-search-views.js +0 -116
  203. package/src/workflow/hybrid-search.js +0 -230
  204. package/src/workflow/index.js +0 -5
  205. package/src/workflow/options/api.js +0 -31
  206. package/src/workflow/options/auto-query.js +0 -70
  207. package/src/workflow/options/configurable.js +0 -48
  208. package/src/workflow/options/data-processor.js +0 -15
  209. package/src/workflow/options/filters.js +0 -10
  210. package/src/workflow/options/index.js +0 -11
  211. package/src/workflow/options/interactions.js +0 -36
  212. package/src/workflow/options/layouts.js +0 -73
  213. package/src/workflow/options/options.js +0 -175
  214. package/src/workflow/options/pagination.js +0 -18
  215. package/src/workflow/options/roles.js +0 -12
  216. package/src/workflow/options/templates.js +0 -27
  217. package/src/workflow/options/trackers.js +0 -80
  218. package/src/workflow/options/utils.js +0 -26
  219. package/src/workflow/processors.js +0 -490
  220. package/src/workflow/recommendation.js +0 -63
  221. package/src/workflow/recommendations.js +0 -14
  222. package/src/workflow/search-based.js +0 -329
  223. package/src/workflow/search.js +0 -73
  224. package/src/workflow/unit.js +0 -51
  225. package/src/workflow/units.js +0 -43
  226. 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
- }