@empathyco/x-components 6.0.0-alpha.149 → 6.0.0-alpha.150

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/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## 6.0.0-alpha.150 (2025-09-22)
7
+
8
+ * feat(AiOverview): handle new noResult chunk in AiOverview (#1886) ([2c41469](https://github.com/empathyco/x/commit/2c41469)), closes [#1886](https://github.com/empathyco/x/issues/1886)
9
+
10
+
11
+
12
+
13
+
6
14
  ## 6.0.0-alpha.149 (2025-09-22)
7
15
 
8
16
  * style(ai-overview): fade animation to show results (#1880) ([84ee675](https://github.com/empathyco/x/commit/84ee675)), closes [#1880](https://github.com/empathyco/x/issues/1880)
@@ -19,6 +19,7 @@ export interface AiMutations extends ConfigMutations<AiState>, QueryMutations
19
19
  | --- | --- | --- | --- |
20
20
  | [resetAiState](./x-components.aimutations.resetaistate.md) | | () =&gt; void | Resets the ai state. |
21
21
  | [setAiRelatedTags](./x-components.aimutations.setairelatedtags.md) | | (relatedTags: RelatedTag\[\]) =&gt; void | Sets the related tags of the module. |
22
+ | [setIsNoResults](./x-components.aimutations.setisnoresults.md) | | (isNoResults: boolean) =&gt; void | Sets the no results flag of the module. |
22
23
  | [setParams](./x-components.aimutations.setparams.md) | | (params: Dictionary&lt;unknown&gt;) =&gt; void | Sets the extra params of the module. |
23
24
  | [setQueries](./x-components.aimutations.setqueries.md) | | (queries: AiSuggestionQuery\[\]) =&gt; void | Sets the queries from the streamed response. |
24
25
  | [setResponseText](./x-components.aimutations.setresponsetext.md) | | (responseText: string) =&gt; void | Sets the responseText from the streamed response. |
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@empathyco/x-components](./x-components.md) &gt; [AiMutations](./x-components.aimutations.md) &gt; [setIsNoResults](./x-components.aimutations.setisnoresults.md)
4
+
5
+ ## AiMutations.setIsNoResults property
6
+
7
+ Sets the no results flag of the module.
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ setIsNoResults: (isNoResults: boolean) => void;
13
+ ```
@@ -44,6 +44,8 @@ _default: import("vue").DefineComponent<{
44
44
  shouldAnimateSuggestion: import("vue").Ref<boolean>;
45
45
  query: import("vue").ComputedRef<string>;
46
46
  tagging: import("vue").ComputedRef<import("@empathyco/x-types").AiSuggestionTagging | undefined>;
47
+ isNoResults: import("vue").ComputedRef<boolean>;
48
+ queries: import("vue").ComputedRef<import("@empathyco/x-types").AiSuggestionQuery[]>;
47
49
  }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
48
50
  title: {
49
51
  type: PropType<string>;
@@ -0,0 +1,13 @@
1
+ <!-- Do not edit this file. It is automatically generated by API Documenter. -->
2
+
3
+ [Home](./index.md) &gt; [@empathyco/x-components](./x-components.md) &gt; [AiState](./x-components.aistate.md) &gt; [isNoResults](./x-components.aistate.isnoresults.md)
4
+
5
+ ## AiState.isNoResults property
6
+
7
+ Flag to indicate that the AI response has no results
8
+
9
+ **Signature:**
10
+
11
+ ```typescript
12
+ isNoResults: boolean;
13
+ ```
@@ -18,6 +18,7 @@ export interface AiState extends QueryState
18
18
  | Property | Modifiers | Type | Description |
19
19
  | --- | --- | --- | --- |
20
20
  | [config](./x-components.aistate.config.md) | | [AiConfig](./x-components.aiconfig.md) | |
21
+ | [isNoResults](./x-components.aistate.isnoresults.md) | | boolean | Flag to indicate that the AI response has no results |
21
22
  | [params](./x-components.aistate.params.md) | | Dictionary&lt;unknown&gt; | The extra params property of the state. |
22
23
  | [queries](./x-components.aistate.queries.md) | | AiSuggestionQuery\[\] | |
23
24
  | [relatedTags](./x-components.aistate.relatedtags.md) | | RelatedTag\[\] | The list of the related tags, related to the <code>query</code> property of the state. |
@@ -1,9 +1,13 @@
1
1
  import _sfc_main from './ai-overview.vue2.js';
2
- import { resolveComponent, openBlock, createElementBlock, createElementVNode, createVNode, withCtx, toDisplayString, createBlock, createTextVNode, createCommentVNode, normalizeStyle, withDirectives, Fragment, renderList, normalizeClass, renderSlot, vShow, withModifiers } from 'vue';
2
+ import { resolveComponent, openBlock, createBlock, withCtx, createElementBlock, createElementVNode, createVNode, toDisplayString, createTextVNode, createCommentVNode, normalizeStyle, withDirectives, Fragment, renderList, normalizeClass, renderSlot, vShow, withModifiers } from 'vue';
3
3
  import './ai-overview.vue3.js';
4
4
  import _export_sfc from '../../../_virtual/_plugin-vue_export-helper.js';
5
5
 
6
- const _hoisted_1 = { class: "x-ai-overview" };
6
+ const _hoisted_1 = {
7
+ key: 0,
8
+ class: "x-ai-overview",
9
+ "data-test": "ai-overview-wrapper"
10
+ };
7
11
  const _hoisted_2 = { class: "x-ai-overview-main" };
8
12
  const _hoisted_3 = {
9
13
  key: 0,
@@ -40,10 +44,7 @@ const _hoisted_11 = {
40
44
  class: "x-ai-overview-gradient",
41
45
  "data-test": "ai-overview-gradient"
42
46
  };
43
- const _hoisted_12 = {
44
- class: "x-ai-overview-toggle-wrapper",
45
- "data-test": "ai-overview-toggle-button-wrapper"
46
- };
47
+ const _hoisted_12 = { class: "x-ai-overview-toggle-wrapper" };
47
48
  function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
48
49
  const _component_AIStarIcon = resolveComponent("AIStarIcon");
49
50
  const _component_DisplayEmitter = resolveComponent("DisplayEmitter");
@@ -55,33 +56,61 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
55
56
  const _component_SlidingPanel = resolveComponent("SlidingPanel");
56
57
  const _component_CollapseHeight = resolveComponent("CollapseHeight");
57
58
  const _component_ChevronDownIcon = resolveComponent("ChevronDownIcon");
58
- return openBlock(), createElementBlock("div", _hoisted_1, [
59
- createElementVNode("div", _hoisted_2, [
60
- createVNode(_component_Fade, { mode: "out-in" }, {
61
- default: withCtx(() => [
62
- _ctx.suggestionsLoading ? (openBlock(), createElementBlock("span", _hoisted_3, [
63
- _hoisted_4,
64
- createElementVNode(
65
- "span",
66
- _hoisted_5,
67
- toDisplayString(_ctx.titleLoading),
68
- 1
69
- /* TEXT */
70
- )
71
- ])) : (openBlock(), createBlock(_component_DisplayEmitter, {
72
- key: 1,
73
- payload: _ctx.tagging?.toolingDisplay ?? { url: "", params: {} },
74
- "event-metadata": {
75
- feature: "overview",
76
- displayOriginalQuery: _ctx.query,
77
- replaceable: false
78
- }
79
- }, {
59
+ return openBlock(), createBlock(_component_CollapseHeight, null, {
60
+ default: withCtx(() => [
61
+ !_ctx.isNoResults ? (openBlock(), createElementBlock("div", _hoisted_1, [
62
+ createElementVNode("div", _hoisted_2, [
63
+ createVNode(_component_Fade, { mode: "out-in" }, {
80
64
  default: withCtx(() => [
81
- createElementVNode("span", _hoisted_6, [
82
- createVNode(_component_AIStarIcon, { class: "x-ai-overview-title-icon" }),
83
- createTextVNode(
84
- toDisplayString(!!_ctx.title ? _ctx.title : _ctx.suggestionText),
65
+ _ctx.suggestionsLoading ? (openBlock(), createElementBlock("span", _hoisted_3, [
66
+ _hoisted_4,
67
+ createElementVNode(
68
+ "span",
69
+ _hoisted_5,
70
+ toDisplayString(_ctx.titleLoading),
71
+ 1
72
+ /* TEXT */
73
+ )
74
+ ])) : (openBlock(), createBlock(_component_DisplayEmitter, {
75
+ key: 1,
76
+ payload: _ctx.tagging?.toolingDisplay ?? { url: "", params: {} },
77
+ "event-metadata": {
78
+ feature: "overview",
79
+ displayOriginalQuery: _ctx.query,
80
+ replaceable: false
81
+ }
82
+ }, {
83
+ default: withCtx(() => [
84
+ createElementVNode("span", _hoisted_6, [
85
+ createVNode(_component_AIStarIcon, { class: "x-ai-overview-title-icon" }),
86
+ createTextVNode(
87
+ toDisplayString(!!_ctx.title ? _ctx.title : _ctx.suggestionText),
88
+ 1
89
+ /* TEXT */
90
+ )
91
+ ])
92
+ ]),
93
+ _: 1
94
+ /* STABLE */
95
+ }, 8, ["payload", "event-metadata"]))
96
+ ]),
97
+ _: 1
98
+ /* STABLE */
99
+ }),
100
+ createVNode(_component_ChangeHeight, null, {
101
+ default: withCtx(() => [
102
+ createElementVNode("div", _hoisted_7, [
103
+ _ctx.title ? (openBlock(), createElementBlock(
104
+ "span",
105
+ _hoisted_8,
106
+ toDisplayString(_ctx.suggestionText),
107
+ 1
108
+ /* TEXT */
109
+ )) : createCommentVNode("v-if", true),
110
+ createElementVNode(
111
+ "p",
112
+ null,
113
+ toDisplayString(_ctx.responseText),
85
114
  1
86
115
  /* TEXT */
87
116
  )
@@ -89,185 +118,164 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
89
118
  ]),
90
119
  _: 1
91
120
  /* STABLE */
92
- }, 8, ["payload", "event-metadata"]))
121
+ })
93
122
  ]),
94
- _: 1
95
- /* STABLE */
96
- }),
97
- createVNode(_component_ChangeHeight, null, {
98
- default: withCtx(() => [
99
- createElementVNode("div", _hoisted_7, [
100
- _ctx.title ? (openBlock(), createElementBlock(
101
- "span",
102
- _hoisted_8,
103
- toDisplayString(_ctx.suggestionText),
104
- 1
105
- /* TEXT */
106
- )) : createCommentVNode("v-if", true),
107
- createElementVNode(
108
- "p",
123
+ createVNode(_component_CollapseHeight, {
124
+ style: normalizeStyle({
125
+ "--x-collapse-height-transition-duration": `${300 * _ctx.suggestionsSearch.length}ms`
126
+ }),
127
+ "data-test": "ai-overview-collapse-height-suggestions"
128
+ }, {
129
+ default: withCtx(() => [
130
+ withDirectives(createElementVNode(
131
+ "div",
109
132
  null,
110
- toDisplayString(_ctx.responseText),
111
- 1
112
- /* TEXT */
113
- )
114
- ])
115
- ]),
116
- _: 1
117
- /* STABLE */
118
- })
119
- ]),
120
- createVNode(_component_CollapseHeight, {
121
- style: normalizeStyle({
122
- "--x-collapse-height-transition-duration": `${300 * _ctx.suggestionsSearch.length}ms`
123
- }),
124
- "data-test": "ai-overview-collapse-height-suggestions"
125
- }, {
126
- default: withCtx(() => [
127
- withDirectives(createElementVNode(
128
- "div",
129
- null,
130
- [
131
- !_ctx.suggestionsSearch.length ? (openBlock(), createBlock(_component_SpinnerIcon, {
133
+ [
134
+ !_ctx.suggestionsSearch.length ? (openBlock(), createBlock(_component_SpinnerIcon, {
135
+ key: 0,
136
+ class: "x-ai-overview-suggestions-loading",
137
+ "data-test": "ai-overview-suggestions-loading"
138
+ })) : (openBlock(), createElementBlock("div", _hoisted_9, [
139
+ (openBlock(true), createElementBlock(
140
+ Fragment,
141
+ null,
142
+ renderList(_ctx.suggestionsSearch, ({ query: suggestionQuery, results: queriesResults }, suggestionIndex) => {
143
+ return openBlock(), createElementBlock(
144
+ "div",
145
+ {
146
+ key: suggestionQuery,
147
+ class: normalizeClass(["x-ai-overview-suggestion", {
148
+ "x-ai-overview-result-animation": _ctx.shouldAnimateSuggestion
149
+ }]),
150
+ "data-test": "ai-overview-suggestion",
151
+ style: normalizeStyle({ animationDelay: `${suggestionIndex * 300}ms` })
152
+ },
153
+ [
154
+ createVNode(_component_BaseEventButton, {
155
+ class: "x-ai-overview-suggestion-query-btn",
156
+ events: { UserAcceptedAQuery: suggestionQuery }
157
+ }, {
158
+ default: withCtx(() => [
159
+ createTextVNode(
160
+ toDisplayString(suggestionQuery) + " ",
161
+ 1
162
+ /* TEXT */
163
+ ),
164
+ createVNode(_component_ArrowRightIcon, { class: "x-ai-overview-suggestion-query-btn-icon" })
165
+ ]),
166
+ _: 2
167
+ /* DYNAMIC */
168
+ }, 1032, ["events"]),
169
+ renderSlot(_ctx.$slots, "sliding-panel", { results: queriesResults }, () => [
170
+ createVNode(_component_SlidingPanel, {
171
+ class: normalizeClass(_ctx.slidingPanelsClasses),
172
+ "scroll-container-class": _ctx.slidingPanelContainersClasses,
173
+ "button-class": _ctx.slidingPanelButtonsClasses,
174
+ "reset-on-content-change": false
175
+ }, {
176
+ "sliding-panel-addons": withCtx(({ arrivedState }) => [
177
+ renderSlot(_ctx.$slots, "sliding-panels-addons", { arrivedState })
178
+ ]),
179
+ "sliding-panel-left-button": withCtx(() => [
180
+ renderSlot(_ctx.$slots, "sliding-panels-left-button")
181
+ ]),
182
+ "sliding-panel-right-button": withCtx(() => [
183
+ renderSlot(_ctx.$slots, "sliding-panels-right-button")
184
+ ]),
185
+ default: withCtx(() => [
186
+ createElementVNode("ul", _hoisted_10, [
187
+ (openBlock(true), createElementBlock(
188
+ Fragment,
189
+ null,
190
+ renderList(queriesResults, (result, resultIndex) => {
191
+ return openBlock(), createElementBlock(
192
+ "li",
193
+ {
194
+ key: result.id,
195
+ "data-test": "ai-overview-suggestion-result",
196
+ class: normalizeClass({
197
+ "x-ai-overview-result-animation": _ctx.shouldAnimateSuggestion
198
+ }),
199
+ style: normalizeStyle({ animationDelay: `${suggestionIndex * 300 + resultIndex * 300}ms` })
200
+ },
201
+ [
202
+ renderSlot(_ctx.$slots, "result", { result })
203
+ ],
204
+ 6
205
+ /* CLASS, STYLE */
206
+ );
207
+ }),
208
+ 128
209
+ /* KEYED_FRAGMENT */
210
+ ))
211
+ ])
212
+ ]),
213
+ _: 2
214
+ /* DYNAMIC */
215
+ }, 1032, ["class", "scroll-container-class", "button-class"])
216
+ ])
217
+ ],
218
+ 6
219
+ /* CLASS, STYLE */
220
+ );
221
+ }),
222
+ 128
223
+ /* KEYED_FRAGMENT */
224
+ ))
225
+ ]))
226
+ ],
227
+ 512
228
+ /* NEED_PATCH */
229
+ ), [
230
+ [vShow, _ctx.expanded]
231
+ ])
232
+ ]),
233
+ _: 3
234
+ /* FORWARDED */
235
+ }, 8, ["style"]),
236
+ createVNode(_component_Fade, null, {
237
+ default: withCtx(() => [
238
+ _ctx.queries.length ? (openBlock(), createElementBlock("div", {
132
239
  key: 0,
133
- class: "x-ai-overview-suggestions-loading",
134
- "data-test": "ai-overview-suggestions-loading"
135
- })) : (openBlock(), createElementBlock("div", _hoisted_9, [
136
- (openBlock(true), createElementBlock(
137
- Fragment,
240
+ class: "x-cursor-pointer",
241
+ "data-test": "ai-overview-toggle-button-wrapper",
242
+ onClick: _cache[1] || (_cache[1] = ($event) => _ctx.onExpandButtonClick(!_ctx.expanded))
243
+ }, [
244
+ withDirectives(createElementVNode(
245
+ "div",
246
+ _hoisted_11,
138
247
  null,
139
- renderList(_ctx.suggestionsSearch, ({ query: suggestionQuery, results: queriesResults }, suggestionIndex) => {
140
- return openBlock(), createElementBlock(
141
- "div",
142
- {
143
- key: suggestionQuery,
144
- class: normalizeClass(["x-ai-overview-suggestion", {
145
- "x-ai-overview-result-animation": _ctx.shouldAnimateSuggestion
146
- }]),
147
- "data-test": "ai-overview-suggestion",
148
- style: normalizeStyle({ animationDelay: `${suggestionIndex * 300}ms` })
149
- },
150
- [
151
- createVNode(_component_BaseEventButton, {
152
- class: "x-ai-overview-suggestion-query-btn",
153
- events: { UserAcceptedAQuery: suggestionQuery }
154
- }, {
155
- default: withCtx(() => [
156
- createTextVNode(
157
- toDisplayString(suggestionQuery) + " ",
158
- 1
159
- /* TEXT */
160
- ),
161
- createVNode(_component_ArrowRightIcon, { class: "x-ai-overview-suggestion-query-btn-icon" })
162
- ]),
163
- _: 2
164
- /* DYNAMIC */
165
- }, 1032, ["events"]),
166
- renderSlot(_ctx.$slots, "sliding-panel", { results: queriesResults }, () => [
167
- createVNode(_component_SlidingPanel, {
168
- class: normalizeClass(_ctx.slidingPanelsClasses),
169
- "scroll-container-class": _ctx.slidingPanelContainersClasses,
170
- "button-class": _ctx.slidingPanelButtonsClasses,
171
- "reset-on-content-change": false
172
- }, {
173
- "sliding-panel-addons": withCtx(({ arrivedState }) => [
174
- renderSlot(_ctx.$slots, "sliding-panels-addons", { arrivedState })
175
- ]),
176
- "sliding-panel-left-button": withCtx(() => [
177
- renderSlot(_ctx.$slots, "sliding-panels-left-button")
178
- ]),
179
- "sliding-panel-right-button": withCtx(() => [
180
- renderSlot(_ctx.$slots, "sliding-panels-right-button")
181
- ]),
182
- default: withCtx(() => [
183
- createElementVNode("ul", _hoisted_10, [
184
- (openBlock(true), createElementBlock(
185
- Fragment,
186
- null,
187
- renderList(queriesResults, (result, resultIndex) => {
188
- return openBlock(), createElementBlock(
189
- "li",
190
- {
191
- key: result.id,
192
- "data-test": "ai-overview-suggestion-result",
193
- class: normalizeClass({
194
- "x-ai-overview-result-animation": _ctx.shouldAnimateSuggestion
195
- }),
196
- style: normalizeStyle({ animationDelay: `${suggestionIndex * 300 + resultIndex * 300}ms` })
197
- },
198
- [
199
- renderSlot(_ctx.$slots, "result", { result })
200
- ],
201
- 6
202
- /* CLASS, STYLE */
203
- );
204
- }),
205
- 128
206
- /* KEYED_FRAGMENT */
207
- ))
208
- ])
209
- ]),
210
- _: 2
211
- /* DYNAMIC */
212
- }, 1032, ["class", "scroll-container-class", "button-class"])
213
- ])
214
- ],
215
- 6
216
- /* CLASS, STYLE */
217
- );
218
- }),
219
- 128
220
- /* KEYED_FRAGMENT */
221
- ))
222
- ]))
223
- ],
224
- 512
225
- /* NEED_PATCH */
226
- ), [
227
- [vShow, _ctx.expanded]
228
- ])
229
- ]),
230
- _: 3
231
- /* FORWARDED */
232
- }, 8, ["style"]),
233
- createVNode(_component_Fade, null, {
234
- default: withCtx(() => [
235
- _ctx.responseText ? (openBlock(), createElementBlock("div", {
236
- key: 0,
237
- class: "x-cursor-pointer",
238
- onClick: _cache[1] || (_cache[1] = ($event) => _ctx.onExpandButtonClick(!_ctx.expanded))
239
- }, [
240
- withDirectives(createElementVNode(
241
- "div",
242
- _hoisted_11,
243
- null,
244
- 512
245
- /* NEED_PATCH */
246
- ), [
247
- [vShow, !_ctx.expanded]
248
+ 512
249
+ /* NEED_PATCH */
250
+ ), [
251
+ [vShow, !_ctx.expanded]
252
+ ]),
253
+ createElementVNode("div", _hoisted_12, [
254
+ createElementVNode("button", {
255
+ class: "x-ai-overview-toggle-btn",
256
+ "data-test": "ai-overview-toggle-button",
257
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => _ctx.onExpandButtonClick(!_ctx.expanded), ["stop"]))
258
+ }, [
259
+ createTextVNode(
260
+ toDisplayString(_ctx.buttonText) + " ",
261
+ 1
262
+ /* TEXT */
263
+ ),
264
+ createVNode(_component_ChevronDownIcon, {
265
+ class: normalizeClass(["x-ai-overview-toggle-btn-icon", { "x-ai-overview-toggle-btn-icon-expanded": _ctx.expanded }])
266
+ }, null, 8, ["class"])
267
+ ])
268
+ ])
269
+ ])) : createCommentVNode("v-if", true)
248
270
  ]),
249
- createElementVNode("div", _hoisted_12, [
250
- createElementVNode("button", {
251
- class: "x-ai-overview-toggle-btn",
252
- "data-test": "ai-overview-toggle-button",
253
- onClick: _cache[0] || (_cache[0] = withModifiers(($event) => _ctx.onExpandButtonClick(!_ctx.expanded), ["stop"]))
254
- }, [
255
- createTextVNode(
256
- toDisplayString(_ctx.buttonText) + " ",
257
- 1
258
- /* TEXT */
259
- ),
260
- createVNode(_component_ChevronDownIcon, {
261
- class: normalizeClass(["x-ai-overview-toggle-btn-icon", { "x-ai-overview-toggle-btn-icon-expanded": _ctx.expanded }])
262
- }, null, 8, ["class"])
263
- ])
264
- ])
265
- ])) : createCommentVNode("v-if", true)
266
- ]),
267
- _: 1
268
- /* STABLE */
269
- })
270
- ]);
271
+ _: 1
272
+ /* STABLE */
273
+ })
274
+ ])) : createCommentVNode("v-if", true)
275
+ ]),
276
+ _: 3
277
+ /* FORWARDED */
278
+ });
271
279
  }
272
280
  var aiOverview = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
273
281
 
@@ -1 +1 @@
1
- {"version":3,"file":"ai-overview.vue.js","sources":["../../../../../src/x-modules/ai/components/ai-overview.vue"],"sourcesContent":["<template>\n <div class=\"x-ai-overview\">\n <div class=\"x-ai-overview-main\">\n <Fade mode=\"out-in\">\n <span\n v-if=\"suggestionsLoading\"\n class=\"x-ai-overview-title-loading\"\n data-test=\"ai-overview-title-loading\"\n >\n <span class=\"x-ai-overview-title-loading-indicator\" />\n <span class=\"x-ai-overview-title-loading-text\" data-test=\"ai-overview-title-loading-text\">\n {{ titleLoading }}\n </span>\n </span>\n <DisplayEmitter\n v-else\n :payload=\"tagging?.toolingDisplay ?? { url: '', params: {} }\"\n :event-metadata=\"{\n feature: 'overview',\n displayOriginalQuery: query,\n replaceable: false,\n }\"\n >\n <span class=\"x-ai-overview-title\" data-test=\"ai-overview-title\">\n <AIStarIcon class=\"x-ai-overview-title-icon\" />{{ !!title ? title : suggestionText }}\n </span>\n </DisplayEmitter>\n </Fade>\n <ChangeHeight>\n <div class=\"x-ai-overview-content\" data-test=\"ai-overview-content\">\n <span v-if=\"title\">{{ suggestionText }}</span>\n <p>{{ responseText }}</p>\n </div>\n </ChangeHeight>\n </div>\n <CollapseHeight\n :style=\"{\n '--x-collapse-height-transition-duration': `${300 * suggestionsSearch.length}ms`,\n }\"\n data-test=\"ai-overview-collapse-height-suggestions\"\n >\n <div v-show=\"expanded\">\n <SpinnerIcon\n v-if=\"!suggestionsSearch.length\"\n class=\"x-ai-overview-suggestions-loading\"\n data-test=\"ai-overview-suggestions-loading\"\n />\n <div v-else class=\"x-ai-overview-suggestions\" data-test=\"ai-overview-suggestions-container\">\n <div\n v-for=\"(\n { query: suggestionQuery, results: queriesResults }, suggestionIndex\n ) in suggestionsSearch\"\n :key=\"suggestionQuery\"\n class=\"x-ai-overview-suggestion\"\n data-test=\"ai-overview-suggestion\"\n :class=\"{\n 'x-ai-overview-result-animation': shouldAnimateSuggestion,\n }\"\n :style=\"{ animationDelay: `${suggestionIndex * 300}ms` }\"\n >\n <BaseEventButton\n class=\"x-ai-overview-suggestion-query-btn\"\n :events=\"{ UserAcceptedAQuery: suggestionQuery }\"\n >\n {{ suggestionQuery }}\n <ArrowRightIcon class=\"x-ai-overview-suggestion-query-btn-icon\" />\n </BaseEventButton>\n\n <slot name=\"sliding-panel\" :results=\"queriesResults\">\n <SlidingPanel\n :class=\"slidingPanelsClasses\"\n :scroll-container-class=\"slidingPanelContainersClasses\"\n :button-class=\"slidingPanelButtonsClasses\"\n :reset-on-content-change=\"false\"\n >\n <template #sliding-panel-addons=\"{ arrivedState }\">\n <slot name=\"sliding-panels-addons\" :arrived-state=\"arrivedState\" />\n </template>\n <template #sliding-panel-left-button>\n <slot name=\"sliding-panels-left-button\" />\n </template>\n <template #sliding-panel-right-button>\n <slot name=\"sliding-panels-right-button\" />\n </template>\n <ul class=\"x-ai-overview-suggestion-results\">\n <li\n v-for=\"(result, resultIndex) in queriesResults\"\n :key=\"result.id\"\n data-test=\"ai-overview-suggestion-result\"\n :class=\"{\n 'x-ai-overview-result-animation': shouldAnimateSuggestion,\n }\"\n :style=\"{ animationDelay: `${suggestionIndex * 300 + resultIndex * 300}ms` }\"\n >\n <!-- @slot (required) result card -->\n <slot name=\"result\" :result=\"result\" />\n </li>\n </ul>\n </SlidingPanel>\n </slot>\n </div>\n </div>\n </div>\n </CollapseHeight>\n\n <Fade>\n <div v-if=\"responseText\" class=\"x-cursor-pointer\" @click=\"onExpandButtonClick(!expanded)\">\n <div v-show=\"!expanded\" class=\"x-ai-overview-gradient\" data-test=\"ai-overview-gradient\" />\n\n <div class=\"x-ai-overview-toggle-wrapper\" data-test=\"ai-overview-toggle-button-wrapper\">\n <button\n class=\"x-ai-overview-toggle-btn\"\n data-test=\"ai-overview-toggle-button\"\n @click.stop=\"onExpandButtonClick(!expanded)\"\n >\n {{ buttonText }}\n <ChevronDownIcon\n class=\"x-ai-overview-toggle-btn-icon\"\n :class=\"{ 'x-ai-overview-toggle-btn-icon-expanded': expanded }\"\n />\n </button>\n </div>\n </div>\n </Fade>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, ref, watch } from 'vue'\nimport {\n AIStarIcon,\n ArrowRightIcon,\n BaseEventButton,\n ChangeHeight,\n ChevronDownIcon,\n CollapseHeight,\n Fade,\n SlidingPanel,\n SpinnerIcon,\n} from '../../../components'\nimport DisplayEmitter from '../../../components/display-emitter.vue'\nimport { use$x, useGetter, useState } from '../../../composables'\nimport { typing } from '../../../directives'\nimport { aiXModule } from '../x-module'\n\nexport default defineComponent({\n directives: {\n typing,\n },\n xModule: aiXModule.name,\n components: {\n AIStarIcon,\n ArrowRightIcon,\n BaseEventButton,\n ChevronDownIcon,\n CollapseHeight,\n ChangeHeight,\n Fade,\n SlidingPanel,\n SpinnerIcon,\n DisplayEmitter,\n },\n props: {\n /**\n * The text displayed when the question ended loading\n *\n * @public\n */\n title: {\n type: String as PropType<string>,\n },\n /**\n * The text displayed when the question is loading.\n *\n * @public\n */\n titleLoading: {\n type: String as PropType<string>,\n default: 'Generating with Empathy AI',\n },\n /**\n * The text displayed on the toggle button when collapsed.\n *\n * @public\n */\n expandText: {\n type: String as PropType<string>,\n default: 'Show more',\n },\n /**\n * The text displayed on the toggle button when expanded.\n *\n * @public\n */\n collapseText: {\n type: String as PropType<string>,\n default: 'Show less',\n },\n\n /**\n * The classes added to each sliding panel for each query.\n *\n * @public\n */\n slidingPanelsClasses: {\n type: String as PropType<string>,\n },\n /**\n * The classes added to each sliding panel container of each query.\n *\n * @public\n */\n slidingPanelContainersClasses: {\n type: String as PropType<string>,\n },\n /**\n * The classes added to each sliding panel buttons of each query.\n *\n * @public\n */\n slidingPanelButtonsClasses: {\n type: String as PropType<string>,\n },\n },\n setup(props) {\n const $x = use$x()\n const { query } = useGetter('ai')\n const { suggestionText, responseText, suggestionsSearch, suggestionsLoading, tagging } =\n useState('ai')\n\n const expanded = ref(false)\n const shouldAnimateSuggestion = ref(true)\n\n const buttonText = computed(() => (expanded.value ? props.collapseText : props.expandText))\n\n function onExpandButtonClick(newValue: boolean) {\n $x.emit('UserClickedAiOverviewExpandButton', expanded.value, {\n suggestionText: suggestionText.value,\n toolingDisplayClick: tagging.value?.toolingDisplayClick,\n })\n setExpanded(newValue)\n }\n\n function setExpanded(newValue: boolean) {\n expanded.value = newValue\n !expanded.value && (shouldAnimateSuggestion.value = false)\n }\n\n watch(query, () => {\n expanded.value = false\n shouldAnimateSuggestion.value = true\n })\n\n return {\n buttonText,\n expanded,\n responseText,\n suggestionsLoading,\n suggestionsSearch,\n suggestionText,\n setExpanded,\n onExpandButtonClick,\n shouldAnimateSuggestion,\n query,\n tagging,\n }\n },\n})\n</script>\n\n<style lang=\"css\">\n.x-ai-overview {\n --color: var(--x-ai-overview-color, #bbc9cf);\n --color-lighter: var(--x-ai-overview-color-lighter, color-mix(in srgb, var(--color) 25%, white));\n\n @apply x-relative x-rounded-3xl x-bg-[var(--color-lighter)];\n}\n\n.x-ai-overview-main {\n @apply x-p-16 x-rounded-lg;\n}\n\n.x-ai-overview-title-loading {\n @apply x-flex x-items-center x-gap-1.5 x-mb-8;\n}\n.x-ai-overview-title-loading-indicator {\n @apply x-size-3 x-animate-pulse x-rounded-full x-bg-[var(--color)];\n}\n.x-ai-overview-title-loading-text {\n @apply x-animate-pulse x-text-xs;\n}\n\n.x-ai-overview-title {\n @apply x-flex x-text-sm x-font-bold x-gap-4 x-items-center x-mb-8;\n}\n.x-ai-overview-title-icon {\n @apply x-icon x-text-[var(--color)];\n}\n\n.x-ai-overview-content {\n @apply x-flex x-flex-col x-text-left x-leading-5 x-gap-2;\n}\n.x-ai-overview-content span {\n @apply x-font-medium;\n}\n\n.x-ai-overview-gradient {\n @apply x-cursor-pointer x-content-none x-absolute x-w-full x-h-80 x-bottom-5 x-bg-gradient-to-b x-from-0% x-from-transparent x-to-100% x-to-[var(--color-lighter)];\n}\n\n.x-ai-overview-toggle-wrapper {\n @apply x-flex x-relative x-z-[1];\n}\n.x-ai-overview-toggle-btn {\n @apply x-button x-button-outlined x-rounded-full x-w-full x-mx-auto sm:x-transition-all sm:x-duration-500 sm:x-translate-y-1/2 sm:x-w-[var(--expand-button-width,200px)];\n}\n.x-ai-overview-toggle-btn-icon {\n @apply x-rotate-0 x-icon x-transition-all x-duration-300;\n}\n.x-ai-overview-toggle-btn-icon-expanded {\n @apply x-rotate-180;\n}\n\n.x-ai-overview-suggestion-query-btn {\n @apply x-button-tight x-mx-16 x-font-bold x-text-gray-900 x-w-fit x-min-h-fit x-flex x-gap-16 x-items-center;\n}\n.x-ai-overview-suggestion-query-btn-icon {\n @apply x-icon-md;\n}\n.x-ai-overview-suggestions {\n @apply x-flex x-flex-col x-gap-16 x-pb-16;\n}\n.x-ai-overview-suggestion {\n @apply x-flex x-flex-col x-gap-8;\n}\n.x-ai-overview-suggestion-results {\n @apply x-flex x-gap-16 x-px-16;\n}\n\n.x-ai-overview-suggestions-loading {\n width: 2.5rem /* 40px */;\n height: 2.5rem /* 40px */;\n margin: auto;\n animation: x-spin 1s linear infinite;\n\n @keyframes x-spin {\n to {\n transform: rotate(360deg);\n }\n }\n}\n\n.x-ai-overview-result-animation {\n opacity: 0;\n animation: x-fade 0.3s ease-in-out forwards;\n\n @keyframes x-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n}\n</style>\n"],"names":["_createElementVNode","_openBlock","_createElementBlock","_createVNode","_toDisplayString","_createBlock","_withCtx","_createTextVNode","_createCommentVNode","_normalizeStyle","_withDirectives","_Fragment","_renderList","_normalizeClass","_renderSlot","_vShow","_withModifiers"],"mappings":"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"}
1
+ {"version":3,"file":"ai-overview.vue.js","sources":["../../../../../src/x-modules/ai/components/ai-overview.vue"],"sourcesContent":["<template>\n <CollapseHeight>\n <div v-if=\"!isNoResults\" class=\"x-ai-overview\" data-test=\"ai-overview-wrapper\">\n <div class=\"x-ai-overview-main\">\n <Fade mode=\"out-in\">\n <span\n v-if=\"suggestionsLoading\"\n class=\"x-ai-overview-title-loading\"\n data-test=\"ai-overview-title-loading\"\n >\n <span class=\"x-ai-overview-title-loading-indicator\" />\n <span\n class=\"x-ai-overview-title-loading-text\"\n data-test=\"ai-overview-title-loading-text\"\n >\n {{ titleLoading }}\n </span>\n </span>\n <DisplayEmitter\n v-else\n :payload=\"tagging?.toolingDisplay ?? { url: '', params: {} }\"\n :event-metadata=\"{\n feature: 'overview',\n displayOriginalQuery: query,\n replaceable: false,\n }\"\n >\n <span class=\"x-ai-overview-title\" data-test=\"ai-overview-title\">\n <AIStarIcon class=\"x-ai-overview-title-icon\" />{{ !!title ? title : suggestionText }}\n </span>\n </DisplayEmitter>\n </Fade>\n <ChangeHeight>\n <div class=\"x-ai-overview-content\" data-test=\"ai-overview-content\">\n <span v-if=\"title\">{{ suggestionText }}</span>\n <p>{{ responseText }}</p>\n </div>\n </ChangeHeight>\n </div>\n <CollapseHeight\n :style=\"{\n '--x-collapse-height-transition-duration': `${300 * suggestionsSearch.length}ms`,\n }\"\n data-test=\"ai-overview-collapse-height-suggestions\"\n >\n <div v-show=\"expanded\">\n <SpinnerIcon\n v-if=\"!suggestionsSearch.length\"\n class=\"x-ai-overview-suggestions-loading\"\n data-test=\"ai-overview-suggestions-loading\"\n />\n <div\n v-else\n class=\"x-ai-overview-suggestions\"\n data-test=\"ai-overview-suggestions-container\"\n >\n <div\n v-for=\"(\n { query: suggestionQuery, results: queriesResults }, suggestionIndex\n ) in suggestionsSearch\"\n :key=\"suggestionQuery\"\n class=\"x-ai-overview-suggestion\"\n data-test=\"ai-overview-suggestion\"\n :class=\"{\n 'x-ai-overview-result-animation': shouldAnimateSuggestion,\n }\"\n :style=\"{ animationDelay: `${suggestionIndex * 300}ms` }\"\n >\n <BaseEventButton\n class=\"x-ai-overview-suggestion-query-btn\"\n :events=\"{ UserAcceptedAQuery: suggestionQuery }\"\n >\n {{ suggestionQuery }}\n <ArrowRightIcon class=\"x-ai-overview-suggestion-query-btn-icon\" />\n </BaseEventButton>\n\n <slot name=\"sliding-panel\" :results=\"queriesResults\">\n <SlidingPanel\n :class=\"slidingPanelsClasses\"\n :scroll-container-class=\"slidingPanelContainersClasses\"\n :button-class=\"slidingPanelButtonsClasses\"\n :reset-on-content-change=\"false\"\n >\n <template #sliding-panel-addons=\"{ arrivedState }\">\n <slot name=\"sliding-panels-addons\" :arrived-state=\"arrivedState\" />\n </template>\n <template #sliding-panel-left-button>\n <slot name=\"sliding-panels-left-button\" />\n </template>\n <template #sliding-panel-right-button>\n <slot name=\"sliding-panels-right-button\" />\n </template>\n <ul class=\"x-ai-overview-suggestion-results\">\n <li\n v-for=\"(result, resultIndex) in queriesResults\"\n :key=\"result.id\"\n data-test=\"ai-overview-suggestion-result\"\n :class=\"{\n 'x-ai-overview-result-animation': shouldAnimateSuggestion,\n }\"\n :style=\"{ animationDelay: `${suggestionIndex * 300 + resultIndex * 300}ms` }\"\n >\n <!-- @slot (required) result card -->\n <slot name=\"result\" :result=\"result\" />\n </li>\n </ul>\n </SlidingPanel>\n </slot>\n </div>\n </div>\n </div>\n </CollapseHeight>\n\n <Fade>\n <div\n v-if=\"queries.length\"\n class=\"x-cursor-pointer\"\n data-test=\"ai-overview-toggle-button-wrapper\"\n @click=\"onExpandButtonClick(!expanded)\"\n >\n <div v-show=\"!expanded\" class=\"x-ai-overview-gradient\" data-test=\"ai-overview-gradient\" />\n <div class=\"x-ai-overview-toggle-wrapper\">\n <button\n class=\"x-ai-overview-toggle-btn\"\n data-test=\"ai-overview-toggle-button\"\n @click.stop=\"onExpandButtonClick(!expanded)\"\n >\n {{ buttonText }}\n <ChevronDownIcon\n class=\"x-ai-overview-toggle-btn-icon\"\n :class=\"{ 'x-ai-overview-toggle-btn-icon-expanded': expanded }\"\n />\n </button>\n </div>\n </div>\n </Fade>\n </div>\n </CollapseHeight>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, ref, watch } from 'vue'\nimport {\n AIStarIcon,\n ArrowRightIcon,\n BaseEventButton,\n ChangeHeight,\n ChevronDownIcon,\n CollapseHeight,\n Fade,\n SlidingPanel,\n SpinnerIcon,\n} from '../../../components'\nimport DisplayEmitter from '../../../components/display-emitter.vue'\nimport { use$x, useGetter, useState } from '../../../composables'\nimport { typing } from '../../../directives'\nimport { aiXModule } from '../x-module'\n\nexport default defineComponent({\n directives: {\n typing,\n },\n xModule: aiXModule.name,\n components: {\n AIStarIcon,\n ArrowRightIcon,\n BaseEventButton,\n ChevronDownIcon,\n CollapseHeight,\n ChangeHeight,\n Fade,\n SlidingPanel,\n SpinnerIcon,\n DisplayEmitter,\n },\n props: {\n /**\n * The text displayed when the question ended loading\n *\n * @public\n */\n title: {\n type: String as PropType<string>,\n },\n /**\n * The text displayed when the question is loading.\n *\n * @public\n */\n titleLoading: {\n type: String as PropType<string>,\n default: 'Generating with Empathy AI',\n },\n /**\n * The text displayed on the toggle button when collapsed.\n *\n * @public\n */\n expandText: {\n type: String as PropType<string>,\n default: 'Show more',\n },\n /**\n * The text displayed on the toggle button when expanded.\n *\n * @public\n */\n collapseText: {\n type: String as PropType<string>,\n default: 'Show less',\n },\n\n /**\n * The classes added to each sliding panel for each query.\n *\n * @public\n */\n slidingPanelsClasses: {\n type: String as PropType<string>,\n },\n /**\n * The classes added to each sliding panel container of each query.\n *\n * @public\n */\n slidingPanelContainersClasses: {\n type: String as PropType<string>,\n },\n /**\n * The classes added to each sliding panel buttons of each query.\n *\n * @public\n */\n slidingPanelButtonsClasses: {\n type: String as PropType<string>,\n },\n },\n setup(props) {\n const $x = use$x()\n const { query } = useGetter('ai')\n const {\n suggestionText,\n responseText,\n suggestionsSearch,\n suggestionsLoading,\n tagging,\n isNoResults,\n queries,\n } = useState('ai')\n\n const expanded = ref(false)\n const shouldAnimateSuggestion = ref(true)\n\n const buttonText = computed(() => (expanded.value ? props.collapseText : props.expandText))\n\n function onExpandButtonClick(newValue: boolean) {\n $x.emit('UserClickedAiOverviewExpandButton', expanded.value, {\n suggestionText: suggestionText.value,\n toolingDisplayClick: tagging.value?.toolingDisplayClick,\n })\n setExpanded(newValue)\n }\n\n function setExpanded(newValue: boolean) {\n expanded.value = newValue\n !expanded.value && (shouldAnimateSuggestion.value = false)\n }\n\n watch(query, () => {\n expanded.value = false\n shouldAnimateSuggestion.value = true\n })\n\n return {\n buttonText,\n expanded,\n responseText,\n suggestionsLoading,\n suggestionsSearch,\n suggestionText,\n setExpanded,\n onExpandButtonClick,\n shouldAnimateSuggestion,\n query,\n tagging,\n isNoResults,\n queries,\n }\n },\n})\n</script>\n\n<style lang=\"css\">\n.x-ai-overview {\n --color: var(--x-ai-overview-color, #bbc9cf);\n --color-lighter: var(--x-ai-overview-color-lighter, color-mix(in srgb, var(--color) 25%, white));\n\n @apply x-relative x-rounded-3xl x-bg-[var(--color-lighter)];\n}\n\n.x-ai-overview-main {\n @apply x-p-16 x-rounded-lg;\n}\n\n.x-ai-overview-title-loading {\n @apply x-flex x-items-center x-gap-1.5 x-mb-8;\n}\n.x-ai-overview-title-loading-indicator {\n @apply x-size-3 x-animate-pulse x-rounded-full x-bg-[var(--color)];\n}\n.x-ai-overview-title-loading-text {\n @apply x-animate-pulse x-text-xs;\n}\n\n.x-ai-overview-title {\n @apply x-flex x-text-sm x-font-bold x-gap-4 x-items-center x-mb-8;\n}\n.x-ai-overview-title-icon {\n @apply x-icon x-text-[var(--color)];\n}\n\n.x-ai-overview-content {\n @apply x-flex x-flex-col x-text-left x-leading-5 x-gap-2;\n}\n.x-ai-overview-content span {\n @apply x-font-medium;\n}\n\n.x-ai-overview-gradient {\n @apply x-cursor-pointer x-content-none x-absolute x-w-full x-h-80 x-bottom-5 x-bg-gradient-to-b x-from-0% x-from-transparent x-to-100% x-to-[var(--color-lighter)];\n}\n\n.x-ai-overview-toggle-wrapper {\n @apply x-flex x-relative x-z-[1];\n}\n.x-ai-overview-toggle-btn {\n @apply x-button x-button-outlined x-rounded-full x-w-full x-mx-auto sm:x-transition-all sm:x-duration-500 sm:x-translate-y-1/2 sm:x-w-[var(--expand-button-width,200px)];\n}\n.x-ai-overview-toggle-btn-icon {\n @apply x-rotate-0 x-icon x-transition-all x-duration-300;\n}\n.x-ai-overview-toggle-btn-icon-expanded {\n @apply x-rotate-180;\n}\n\n.x-ai-overview-suggestion-query-btn {\n @apply x-button-tight x-mx-16 x-font-bold x-text-gray-900 x-w-fit x-min-h-fit x-flex x-gap-16 x-items-center;\n}\n.x-ai-overview-suggestion-query-btn-icon {\n @apply x-icon-md;\n}\n.x-ai-overview-suggestions {\n @apply x-flex x-flex-col x-gap-16 x-pb-16;\n}\n.x-ai-overview-suggestion {\n @apply x-flex x-flex-col x-gap-8;\n}\n.x-ai-overview-suggestion-results {\n @apply x-flex x-gap-16 x-px-16;\n}\n\n.x-ai-overview-suggestions-loading {\n width: 2.5rem /* 40px */;\n height: 2.5rem /* 40px */;\n margin: auto;\n animation: x-spin 1s linear infinite;\n\n @keyframes x-spin {\n to {\n transform: rotate(360deg);\n }\n }\n}\n\n.x-ai-overview-result-animation {\n opacity: 0;\n animation: x-fade 0.3s ease-in-out forwards;\n\n @keyframes x-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n}\n</style>\n"],"names":["_createElementVNode","_createBlock","_openBlock","_createElementBlock","_createVNode","_toDisplayString","_withCtx","_createTextVNode","_createCommentVNode","_normalizeStyle","_withDirectives","_Fragment","_renderList","_normalizeClass","_renderSlot","_vShow","_withModifiers"],"mappings":"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"}
@@ -192,7 +192,7 @@ var _sfc_main = defineComponent({
192
192
  setup(props) {
193
193
  const $x = use$x();
194
194
  const { query } = useGetter('ai');
195
- const { suggestionText, responseText, suggestionsSearch, suggestionsLoading, tagging } = useState('ai');
195
+ const { suggestionText, responseText, suggestionsSearch, suggestionsLoading, tagging, isNoResults, queries, } = useState('ai');
196
196
  const expanded = ref(false);
197
197
  const shouldAnimateSuggestion = ref(true);
198
198
  const buttonText = computed(() => (expanded.value ? props.collapseText : props.expandText));
@@ -223,6 +223,8 @@ var _sfc_main = defineComponent({
223
223
  shouldAnimateSuggestion,
224
224
  query,
225
225
  tagging,
226
+ isNoResults,
227
+ queries,
226
228
  };
227
229
  },
228
230
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ai-overview.vue2.js","sources":["../../../../../src/x-modules/ai/components/ai-overview.vue"],"sourcesContent":["<template>\n <div class=\"x-ai-overview\">\n <div class=\"x-ai-overview-main\">\n <Fade mode=\"out-in\">\n <span\n v-if=\"suggestionsLoading\"\n class=\"x-ai-overview-title-loading\"\n data-test=\"ai-overview-title-loading\"\n >\n <span class=\"x-ai-overview-title-loading-indicator\" />\n <span class=\"x-ai-overview-title-loading-text\" data-test=\"ai-overview-title-loading-text\">\n {{ titleLoading }}\n </span>\n </span>\n <DisplayEmitter\n v-else\n :payload=\"tagging?.toolingDisplay ?? { url: '', params: {} }\"\n :event-metadata=\"{\n feature: 'overview',\n displayOriginalQuery: query,\n replaceable: false,\n }\"\n >\n <span class=\"x-ai-overview-title\" data-test=\"ai-overview-title\">\n <AIStarIcon class=\"x-ai-overview-title-icon\" />{{ !!title ? title : suggestionText }}\n </span>\n </DisplayEmitter>\n </Fade>\n <ChangeHeight>\n <div class=\"x-ai-overview-content\" data-test=\"ai-overview-content\">\n <span v-if=\"title\">{{ suggestionText }}</span>\n <p>{{ responseText }}</p>\n </div>\n </ChangeHeight>\n </div>\n <CollapseHeight\n :style=\"{\n '--x-collapse-height-transition-duration': `${300 * suggestionsSearch.length}ms`,\n }\"\n data-test=\"ai-overview-collapse-height-suggestions\"\n >\n <div v-show=\"expanded\">\n <SpinnerIcon\n v-if=\"!suggestionsSearch.length\"\n class=\"x-ai-overview-suggestions-loading\"\n data-test=\"ai-overview-suggestions-loading\"\n />\n <div v-else class=\"x-ai-overview-suggestions\" data-test=\"ai-overview-suggestions-container\">\n <div\n v-for=\"(\n { query: suggestionQuery, results: queriesResults }, suggestionIndex\n ) in suggestionsSearch\"\n :key=\"suggestionQuery\"\n class=\"x-ai-overview-suggestion\"\n data-test=\"ai-overview-suggestion\"\n :class=\"{\n 'x-ai-overview-result-animation': shouldAnimateSuggestion,\n }\"\n :style=\"{ animationDelay: `${suggestionIndex * 300}ms` }\"\n >\n <BaseEventButton\n class=\"x-ai-overview-suggestion-query-btn\"\n :events=\"{ UserAcceptedAQuery: suggestionQuery }\"\n >\n {{ suggestionQuery }}\n <ArrowRightIcon class=\"x-ai-overview-suggestion-query-btn-icon\" />\n </BaseEventButton>\n\n <slot name=\"sliding-panel\" :results=\"queriesResults\">\n <SlidingPanel\n :class=\"slidingPanelsClasses\"\n :scroll-container-class=\"slidingPanelContainersClasses\"\n :button-class=\"slidingPanelButtonsClasses\"\n :reset-on-content-change=\"false\"\n >\n <template #sliding-panel-addons=\"{ arrivedState }\">\n <slot name=\"sliding-panels-addons\" :arrived-state=\"arrivedState\" />\n </template>\n <template #sliding-panel-left-button>\n <slot name=\"sliding-panels-left-button\" />\n </template>\n <template #sliding-panel-right-button>\n <slot name=\"sliding-panels-right-button\" />\n </template>\n <ul class=\"x-ai-overview-suggestion-results\">\n <li\n v-for=\"(result, resultIndex) in queriesResults\"\n :key=\"result.id\"\n data-test=\"ai-overview-suggestion-result\"\n :class=\"{\n 'x-ai-overview-result-animation': shouldAnimateSuggestion,\n }\"\n :style=\"{ animationDelay: `${suggestionIndex * 300 + resultIndex * 300}ms` }\"\n >\n <!-- @slot (required) result card -->\n <slot name=\"result\" :result=\"result\" />\n </li>\n </ul>\n </SlidingPanel>\n </slot>\n </div>\n </div>\n </div>\n </CollapseHeight>\n\n <Fade>\n <div v-if=\"responseText\" class=\"x-cursor-pointer\" @click=\"onExpandButtonClick(!expanded)\">\n <div v-show=\"!expanded\" class=\"x-ai-overview-gradient\" data-test=\"ai-overview-gradient\" />\n\n <div class=\"x-ai-overview-toggle-wrapper\" data-test=\"ai-overview-toggle-button-wrapper\">\n <button\n class=\"x-ai-overview-toggle-btn\"\n data-test=\"ai-overview-toggle-button\"\n @click.stop=\"onExpandButtonClick(!expanded)\"\n >\n {{ buttonText }}\n <ChevronDownIcon\n class=\"x-ai-overview-toggle-btn-icon\"\n :class=\"{ 'x-ai-overview-toggle-btn-icon-expanded': expanded }\"\n />\n </button>\n </div>\n </div>\n </Fade>\n </div>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, ref, watch } from 'vue'\nimport {\n AIStarIcon,\n ArrowRightIcon,\n BaseEventButton,\n ChangeHeight,\n ChevronDownIcon,\n CollapseHeight,\n Fade,\n SlidingPanel,\n SpinnerIcon,\n} from '../../../components'\nimport DisplayEmitter from '../../../components/display-emitter.vue'\nimport { use$x, useGetter, useState } from '../../../composables'\nimport { typing } from '../../../directives'\nimport { aiXModule } from '../x-module'\n\nexport default defineComponent({\n directives: {\n typing,\n },\n xModule: aiXModule.name,\n components: {\n AIStarIcon,\n ArrowRightIcon,\n BaseEventButton,\n ChevronDownIcon,\n CollapseHeight,\n ChangeHeight,\n Fade,\n SlidingPanel,\n SpinnerIcon,\n DisplayEmitter,\n },\n props: {\n /**\n * The text displayed when the question ended loading\n *\n * @public\n */\n title: {\n type: String as PropType<string>,\n },\n /**\n * The text displayed when the question is loading.\n *\n * @public\n */\n titleLoading: {\n type: String as PropType<string>,\n default: 'Generating with Empathy AI',\n },\n /**\n * The text displayed on the toggle button when collapsed.\n *\n * @public\n */\n expandText: {\n type: String as PropType<string>,\n default: 'Show more',\n },\n /**\n * The text displayed on the toggle button when expanded.\n *\n * @public\n */\n collapseText: {\n type: String as PropType<string>,\n default: 'Show less',\n },\n\n /**\n * The classes added to each sliding panel for each query.\n *\n * @public\n */\n slidingPanelsClasses: {\n type: String as PropType<string>,\n },\n /**\n * The classes added to each sliding panel container of each query.\n *\n * @public\n */\n slidingPanelContainersClasses: {\n type: String as PropType<string>,\n },\n /**\n * The classes added to each sliding panel buttons of each query.\n *\n * @public\n */\n slidingPanelButtonsClasses: {\n type: String as PropType<string>,\n },\n },\n setup(props) {\n const $x = use$x()\n const { query } = useGetter('ai')\n const { suggestionText, responseText, suggestionsSearch, suggestionsLoading, tagging } =\n useState('ai')\n\n const expanded = ref(false)\n const shouldAnimateSuggestion = ref(true)\n\n const buttonText = computed(() => (expanded.value ? props.collapseText : props.expandText))\n\n function onExpandButtonClick(newValue: boolean) {\n $x.emit('UserClickedAiOverviewExpandButton', expanded.value, {\n suggestionText: suggestionText.value,\n toolingDisplayClick: tagging.value?.toolingDisplayClick,\n })\n setExpanded(newValue)\n }\n\n function setExpanded(newValue: boolean) {\n expanded.value = newValue\n !expanded.value && (shouldAnimateSuggestion.value = false)\n }\n\n watch(query, () => {\n expanded.value = false\n shouldAnimateSuggestion.value = true\n })\n\n return {\n buttonText,\n expanded,\n responseText,\n suggestionsLoading,\n suggestionsSearch,\n suggestionText,\n setExpanded,\n onExpandButtonClick,\n shouldAnimateSuggestion,\n query,\n tagging,\n }\n },\n})\n</script>\n\n<style lang=\"css\">\n.x-ai-overview {\n --color: var(--x-ai-overview-color, #bbc9cf);\n --color-lighter: var(--x-ai-overview-color-lighter, color-mix(in srgb, var(--color) 25%, white));\n\n @apply x-relative x-rounded-3xl x-bg-[var(--color-lighter)];\n}\n\n.x-ai-overview-main {\n @apply x-p-16 x-rounded-lg;\n}\n\n.x-ai-overview-title-loading {\n @apply x-flex x-items-center x-gap-1.5 x-mb-8;\n}\n.x-ai-overview-title-loading-indicator {\n @apply x-size-3 x-animate-pulse x-rounded-full x-bg-[var(--color)];\n}\n.x-ai-overview-title-loading-text {\n @apply x-animate-pulse x-text-xs;\n}\n\n.x-ai-overview-title {\n @apply x-flex x-text-sm x-font-bold x-gap-4 x-items-center x-mb-8;\n}\n.x-ai-overview-title-icon {\n @apply x-icon x-text-[var(--color)];\n}\n\n.x-ai-overview-content {\n @apply x-flex x-flex-col x-text-left x-leading-5 x-gap-2;\n}\n.x-ai-overview-content span {\n @apply x-font-medium;\n}\n\n.x-ai-overview-gradient {\n @apply x-cursor-pointer x-content-none x-absolute x-w-full x-h-80 x-bottom-5 x-bg-gradient-to-b x-from-0% x-from-transparent x-to-100% x-to-[var(--color-lighter)];\n}\n\n.x-ai-overview-toggle-wrapper {\n @apply x-flex x-relative x-z-[1];\n}\n.x-ai-overview-toggle-btn {\n @apply x-button x-button-outlined x-rounded-full x-w-full x-mx-auto sm:x-transition-all sm:x-duration-500 sm:x-translate-y-1/2 sm:x-w-[var(--expand-button-width,200px)];\n}\n.x-ai-overview-toggle-btn-icon {\n @apply x-rotate-0 x-icon x-transition-all x-duration-300;\n}\n.x-ai-overview-toggle-btn-icon-expanded {\n @apply x-rotate-180;\n}\n\n.x-ai-overview-suggestion-query-btn {\n @apply x-button-tight x-mx-16 x-font-bold x-text-gray-900 x-w-fit x-min-h-fit x-flex x-gap-16 x-items-center;\n}\n.x-ai-overview-suggestion-query-btn-icon {\n @apply x-icon-md;\n}\n.x-ai-overview-suggestions {\n @apply x-flex x-flex-col x-gap-16 x-pb-16;\n}\n.x-ai-overview-suggestion {\n @apply x-flex x-flex-col x-gap-8;\n}\n.x-ai-overview-suggestion-results {\n @apply x-flex x-gap-16 x-px-16;\n}\n\n.x-ai-overview-suggestions-loading {\n width: 2.5rem /* 40px */;\n height: 2.5rem /* 40px */;\n margin: auto;\n animation: x-spin 1s linear infinite;\n\n @keyframes x-spin {\n to {\n transform: rotate(360deg);\n }\n }\n}\n\n.x-ai-overview-result-animation {\n opacity: 0;\n animation: x-fade 0.3s ease-in-out forwards;\n\n @keyframes x-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n}\n</style>\n"],"names":["DisplayEmitter"],"mappings":"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"}
1
+ {"version":3,"file":"ai-overview.vue2.js","sources":["../../../../../src/x-modules/ai/components/ai-overview.vue"],"sourcesContent":["<template>\n <CollapseHeight>\n <div v-if=\"!isNoResults\" class=\"x-ai-overview\" data-test=\"ai-overview-wrapper\">\n <div class=\"x-ai-overview-main\">\n <Fade mode=\"out-in\">\n <span\n v-if=\"suggestionsLoading\"\n class=\"x-ai-overview-title-loading\"\n data-test=\"ai-overview-title-loading\"\n >\n <span class=\"x-ai-overview-title-loading-indicator\" />\n <span\n class=\"x-ai-overview-title-loading-text\"\n data-test=\"ai-overview-title-loading-text\"\n >\n {{ titleLoading }}\n </span>\n </span>\n <DisplayEmitter\n v-else\n :payload=\"tagging?.toolingDisplay ?? { url: '', params: {} }\"\n :event-metadata=\"{\n feature: 'overview',\n displayOriginalQuery: query,\n replaceable: false,\n }\"\n >\n <span class=\"x-ai-overview-title\" data-test=\"ai-overview-title\">\n <AIStarIcon class=\"x-ai-overview-title-icon\" />{{ !!title ? title : suggestionText }}\n </span>\n </DisplayEmitter>\n </Fade>\n <ChangeHeight>\n <div class=\"x-ai-overview-content\" data-test=\"ai-overview-content\">\n <span v-if=\"title\">{{ suggestionText }}</span>\n <p>{{ responseText }}</p>\n </div>\n </ChangeHeight>\n </div>\n <CollapseHeight\n :style=\"{\n '--x-collapse-height-transition-duration': `${300 * suggestionsSearch.length}ms`,\n }\"\n data-test=\"ai-overview-collapse-height-suggestions\"\n >\n <div v-show=\"expanded\">\n <SpinnerIcon\n v-if=\"!suggestionsSearch.length\"\n class=\"x-ai-overview-suggestions-loading\"\n data-test=\"ai-overview-suggestions-loading\"\n />\n <div\n v-else\n class=\"x-ai-overview-suggestions\"\n data-test=\"ai-overview-suggestions-container\"\n >\n <div\n v-for=\"(\n { query: suggestionQuery, results: queriesResults }, suggestionIndex\n ) in suggestionsSearch\"\n :key=\"suggestionQuery\"\n class=\"x-ai-overview-suggestion\"\n data-test=\"ai-overview-suggestion\"\n :class=\"{\n 'x-ai-overview-result-animation': shouldAnimateSuggestion,\n }\"\n :style=\"{ animationDelay: `${suggestionIndex * 300}ms` }\"\n >\n <BaseEventButton\n class=\"x-ai-overview-suggestion-query-btn\"\n :events=\"{ UserAcceptedAQuery: suggestionQuery }\"\n >\n {{ suggestionQuery }}\n <ArrowRightIcon class=\"x-ai-overview-suggestion-query-btn-icon\" />\n </BaseEventButton>\n\n <slot name=\"sliding-panel\" :results=\"queriesResults\">\n <SlidingPanel\n :class=\"slidingPanelsClasses\"\n :scroll-container-class=\"slidingPanelContainersClasses\"\n :button-class=\"slidingPanelButtonsClasses\"\n :reset-on-content-change=\"false\"\n >\n <template #sliding-panel-addons=\"{ arrivedState }\">\n <slot name=\"sliding-panels-addons\" :arrived-state=\"arrivedState\" />\n </template>\n <template #sliding-panel-left-button>\n <slot name=\"sliding-panels-left-button\" />\n </template>\n <template #sliding-panel-right-button>\n <slot name=\"sliding-panels-right-button\" />\n </template>\n <ul class=\"x-ai-overview-suggestion-results\">\n <li\n v-for=\"(result, resultIndex) in queriesResults\"\n :key=\"result.id\"\n data-test=\"ai-overview-suggestion-result\"\n :class=\"{\n 'x-ai-overview-result-animation': shouldAnimateSuggestion,\n }\"\n :style=\"{ animationDelay: `${suggestionIndex * 300 + resultIndex * 300}ms` }\"\n >\n <!-- @slot (required) result card -->\n <slot name=\"result\" :result=\"result\" />\n </li>\n </ul>\n </SlidingPanel>\n </slot>\n </div>\n </div>\n </div>\n </CollapseHeight>\n\n <Fade>\n <div\n v-if=\"queries.length\"\n class=\"x-cursor-pointer\"\n data-test=\"ai-overview-toggle-button-wrapper\"\n @click=\"onExpandButtonClick(!expanded)\"\n >\n <div v-show=\"!expanded\" class=\"x-ai-overview-gradient\" data-test=\"ai-overview-gradient\" />\n <div class=\"x-ai-overview-toggle-wrapper\">\n <button\n class=\"x-ai-overview-toggle-btn\"\n data-test=\"ai-overview-toggle-button\"\n @click.stop=\"onExpandButtonClick(!expanded)\"\n >\n {{ buttonText }}\n <ChevronDownIcon\n class=\"x-ai-overview-toggle-btn-icon\"\n :class=\"{ 'x-ai-overview-toggle-btn-icon-expanded': expanded }\"\n />\n </button>\n </div>\n </div>\n </Fade>\n </div>\n </CollapseHeight>\n</template>\n\n<script lang=\"ts\">\nimport type { PropType } from 'vue'\nimport { computed, defineComponent, ref, watch } from 'vue'\nimport {\n AIStarIcon,\n ArrowRightIcon,\n BaseEventButton,\n ChangeHeight,\n ChevronDownIcon,\n CollapseHeight,\n Fade,\n SlidingPanel,\n SpinnerIcon,\n} from '../../../components'\nimport DisplayEmitter from '../../../components/display-emitter.vue'\nimport { use$x, useGetter, useState } from '../../../composables'\nimport { typing } from '../../../directives'\nimport { aiXModule } from '../x-module'\n\nexport default defineComponent({\n directives: {\n typing,\n },\n xModule: aiXModule.name,\n components: {\n AIStarIcon,\n ArrowRightIcon,\n BaseEventButton,\n ChevronDownIcon,\n CollapseHeight,\n ChangeHeight,\n Fade,\n SlidingPanel,\n SpinnerIcon,\n DisplayEmitter,\n },\n props: {\n /**\n * The text displayed when the question ended loading\n *\n * @public\n */\n title: {\n type: String as PropType<string>,\n },\n /**\n * The text displayed when the question is loading.\n *\n * @public\n */\n titleLoading: {\n type: String as PropType<string>,\n default: 'Generating with Empathy AI',\n },\n /**\n * The text displayed on the toggle button when collapsed.\n *\n * @public\n */\n expandText: {\n type: String as PropType<string>,\n default: 'Show more',\n },\n /**\n * The text displayed on the toggle button when expanded.\n *\n * @public\n */\n collapseText: {\n type: String as PropType<string>,\n default: 'Show less',\n },\n\n /**\n * The classes added to each sliding panel for each query.\n *\n * @public\n */\n slidingPanelsClasses: {\n type: String as PropType<string>,\n },\n /**\n * The classes added to each sliding panel container of each query.\n *\n * @public\n */\n slidingPanelContainersClasses: {\n type: String as PropType<string>,\n },\n /**\n * The classes added to each sliding panel buttons of each query.\n *\n * @public\n */\n slidingPanelButtonsClasses: {\n type: String as PropType<string>,\n },\n },\n setup(props) {\n const $x = use$x()\n const { query } = useGetter('ai')\n const {\n suggestionText,\n responseText,\n suggestionsSearch,\n suggestionsLoading,\n tagging,\n isNoResults,\n queries,\n } = useState('ai')\n\n const expanded = ref(false)\n const shouldAnimateSuggestion = ref(true)\n\n const buttonText = computed(() => (expanded.value ? props.collapseText : props.expandText))\n\n function onExpandButtonClick(newValue: boolean) {\n $x.emit('UserClickedAiOverviewExpandButton', expanded.value, {\n suggestionText: suggestionText.value,\n toolingDisplayClick: tagging.value?.toolingDisplayClick,\n })\n setExpanded(newValue)\n }\n\n function setExpanded(newValue: boolean) {\n expanded.value = newValue\n !expanded.value && (shouldAnimateSuggestion.value = false)\n }\n\n watch(query, () => {\n expanded.value = false\n shouldAnimateSuggestion.value = true\n })\n\n return {\n buttonText,\n expanded,\n responseText,\n suggestionsLoading,\n suggestionsSearch,\n suggestionText,\n setExpanded,\n onExpandButtonClick,\n shouldAnimateSuggestion,\n query,\n tagging,\n isNoResults,\n queries,\n }\n },\n})\n</script>\n\n<style lang=\"css\">\n.x-ai-overview {\n --color: var(--x-ai-overview-color, #bbc9cf);\n --color-lighter: var(--x-ai-overview-color-lighter, color-mix(in srgb, var(--color) 25%, white));\n\n @apply x-relative x-rounded-3xl x-bg-[var(--color-lighter)];\n}\n\n.x-ai-overview-main {\n @apply x-p-16 x-rounded-lg;\n}\n\n.x-ai-overview-title-loading {\n @apply x-flex x-items-center x-gap-1.5 x-mb-8;\n}\n.x-ai-overview-title-loading-indicator {\n @apply x-size-3 x-animate-pulse x-rounded-full x-bg-[var(--color)];\n}\n.x-ai-overview-title-loading-text {\n @apply x-animate-pulse x-text-xs;\n}\n\n.x-ai-overview-title {\n @apply x-flex x-text-sm x-font-bold x-gap-4 x-items-center x-mb-8;\n}\n.x-ai-overview-title-icon {\n @apply x-icon x-text-[var(--color)];\n}\n\n.x-ai-overview-content {\n @apply x-flex x-flex-col x-text-left x-leading-5 x-gap-2;\n}\n.x-ai-overview-content span {\n @apply x-font-medium;\n}\n\n.x-ai-overview-gradient {\n @apply x-cursor-pointer x-content-none x-absolute x-w-full x-h-80 x-bottom-5 x-bg-gradient-to-b x-from-0% x-from-transparent x-to-100% x-to-[var(--color-lighter)];\n}\n\n.x-ai-overview-toggle-wrapper {\n @apply x-flex x-relative x-z-[1];\n}\n.x-ai-overview-toggle-btn {\n @apply x-button x-button-outlined x-rounded-full x-w-full x-mx-auto sm:x-transition-all sm:x-duration-500 sm:x-translate-y-1/2 sm:x-w-[var(--expand-button-width,200px)];\n}\n.x-ai-overview-toggle-btn-icon {\n @apply x-rotate-0 x-icon x-transition-all x-duration-300;\n}\n.x-ai-overview-toggle-btn-icon-expanded {\n @apply x-rotate-180;\n}\n\n.x-ai-overview-suggestion-query-btn {\n @apply x-button-tight x-mx-16 x-font-bold x-text-gray-900 x-w-fit x-min-h-fit x-flex x-gap-16 x-items-center;\n}\n.x-ai-overview-suggestion-query-btn-icon {\n @apply x-icon-md;\n}\n.x-ai-overview-suggestions {\n @apply x-flex x-flex-col x-gap-16 x-pb-16;\n}\n.x-ai-overview-suggestion {\n @apply x-flex x-flex-col x-gap-8;\n}\n.x-ai-overview-suggestion-results {\n @apply x-flex x-gap-16 x-px-16;\n}\n\n.x-ai-overview-suggestions-loading {\n width: 2.5rem /* 40px */;\n height: 2.5rem /* 40px */;\n margin: auto;\n animation: x-spin 1s linear infinite;\n\n @keyframes x-spin {\n to {\n transform: rotate(360deg);\n }\n }\n}\n\n.x-ai-overview-result-animation {\n opacity: 0;\n animation: x-fade 0.3s ease-in-out forwards;\n\n @keyframes x-fade {\n 0% {\n opacity: 0;\n }\n 100% {\n opacity: 1;\n }\n }\n}\n</style>\n"],"names":["DisplayEmitter"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+JA,gBAAe,eAAe,CAAC;AAC7B,IAAA,UAAU,EAAE;QACV,MAAM;AACP,KAAA;IACD,OAAO,EAAE,SAAS,CAAC,IAAI;AACvB,IAAA,UAAU,EAAE;QACV,UAAU;QACV,cAAc;QACd,eAAe;QACf,eAAe;QACf,cAAc;QACd,YAAY;QACZ,IAAI;QACJ,YAAY;QACZ,WAAW;wBACXA,WAAc;AACf,KAAA;AACD,IAAA,KAAK,EAAE;AACL;;;;AAIE;AACF,QAAA,KAAK,EAAE;AACL,YAAA,IAAI,EAAE,MAA0B;AACjC,SAAA;AACD;;;;AAIE;AACF,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,MAA0B;AAChC,YAAA,OAAO,EAAE,4BAA4B;AACtC,SAAA;AACD;;;;AAIE;AACF,QAAA,UAAU,EAAE;AACV,YAAA,IAAI,EAAE,MAA0B;AAChC,YAAA,OAAO,EAAE,WAAW;AACrB,SAAA;AACD;;;;AAIE;AACF,QAAA,YAAY,EAAE;AACZ,YAAA,IAAI,EAAE,MAA0B;AAChC,YAAA,OAAO,EAAE,WAAW;AACrB,SAAA;AAED;;;;AAIE;AACF,QAAA,oBAAoB,EAAE;AACpB,YAAA,IAAI,EAAE,MAA0B;AACjC,SAAA;AACD;;;;AAIE;AACF,QAAA,6BAA6B,EAAE;AAC7B,YAAA,IAAI,EAAE,MAA0B;AACjC,SAAA;AACD;;;;AAIE;AACF,QAAA,0BAA0B,EAAE;AAC1B,YAAA,IAAI,EAAE,MAA0B;AACjC,SAAA;AACF,KAAA;AACD,IAAA,KAAK,CAAC,KAAK,EAAA;AACT,QAAA,MAAM,EAAC,GAAI,KAAK,EAAC,CAAA;QACjB,MAAM,EAAE,KAAI,EAAI,GAAE,SAAS,CAAC,IAAI,CAAA,CAAA;QAChC,MAAM,EACJ,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,OAAO,EACP,WAAW,EACX,OAAO,GACT,GAAI,QAAQ,CAAC,IAAI,CAAA,CAAA;AAEjB,QAAA,MAAM,QAAS,GAAE,GAAG,CAAC,KAAK,CAAA,CAAA;AAC1B,QAAA,MAAM,uBAAsB,GAAI,GAAG,CAAC,IAAI,CAAA,CAAA;QAExC,MAAM,UAAW,GAAE,QAAQ,CAAC,OAAO,QAAQ,CAAC,KAAM,GAAE,KAAK,CAAC,YAAW,GAAI,KAAK,CAAC,UAAU,CAAC,CAAA,CAAA;QAE1F,SAAS,mBAAmB,CAAC,QAAiB,EAAA;YAC5C,EAAE,CAAC,IAAI,CAAC,mCAAmC,EAAE,QAAQ,CAAC,KAAK,EAAE;gBAC3D,cAAc,EAAE,cAAc,CAAC,KAAK;AACpC,gBAAA,mBAAmB,EAAE,OAAO,CAAC,KAAK,EAAE,mBAAmB;AACxD,aAAA,CAAA,CAAA;YACD,WAAW,CAAC,QAAQ,CAAA,CAAA;SACtB;QAEA,SAAS,WAAW,CAAC,QAAiB,EAAA;AACpC,YAAA,QAAQ,CAAC,KAAI,GAAI,QAAO,CAAA;YACxB,CAAC,QAAQ,CAAC,KAAI,KAAM,uBAAuB,CAAC,KAAI,GAAI,KAAK,CAAA,CAAA;SAC3D;AAEA,QAAA,KAAK,CAAC,KAAK,EAAE,MAAM;AACjB,YAAA,QAAQ,CAAC,KAAI,GAAI,KAAI,CAAA;AACrB,YAAA,uBAAuB,CAAC,KAAI,GAAI,IAAG,CAAA;AACrC,SAAC,CAAA,CAAA;QAED,OAAO;YACL,UAAU;YACV,QAAQ;YACR,YAAY;YACZ,kBAAkB;YAClB,iBAAiB;YACjB,cAAc;YACd,WAAW;YACX,mBAAmB;YACnB,uBAAuB;YACvB,KAAK;YACL,OAAO;YACP,WAAW;YACX,OAAO;SACT,CAAA;KACD;AACF,CAAA,CAAA;;;;"}
@@ -49,12 +49,13 @@ function readAnswer(reader, commit) {
49
49
  // line.length check to avoid empty data chunks
50
50
  if (line.startsWith('data:') && line.length > 5) {
51
51
  data = JSON.parse(line.slice(5).trim());
52
- if ('responseText' in data) {
53
- commit('setResponseText', data.responseText);
54
- }
55
52
  if ('suggestionText' in data) {
53
+ commit('setIsNoResults', false);
56
54
  commit('setSuggestionText', data.suggestionText);
57
55
  }
56
+ if ('responseText' in data) {
57
+ commit('setResponseText', data.responseText);
58
+ }
58
59
  if ('queries' in data) {
59
60
  commit('setQueries', data.queries);
60
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"fetch-and-save-ai-suggestions.action.js","sources":["../../../../../../src/x-modules/ai/store/actions/fetch-and-save-ai-suggestions.action.ts"],"sourcesContent":["import type { AiSuggestionQuery } from '@empathyco/x-types'\nimport type { AiActionContext, AiXStoreModule } from '../types'\nimport { getTaggingInfoFromUrl } from '@empathyco/x-adapter-platform'\nimport { XPlugin } from '../../../../plugins'\n\ntype AnswerChunk =\n | { responseText: string }\n | { suggestionText: string }\n | { queries: AiSuggestionQuery[] }\n | {\n taggings: {\n toolingDisplay: string\n toolingDisplayClick: string\n }[]\n }\n/**\n * Default implementation for the {@link AiActions.fetchAndSaveAiSuggestions}.\n *\n * @param _ - The {@link https://vuex.vuejs.org/guide/actions.html | context} of the actions,\n * provided by Vuex.\n * @param request - The AI request to make.\n * @returns The AI response.\n *\n * @public\n */\nexport const fetchAndSaveAiSuggestions: AiXStoreModule['actions']['fetchAndSaveAiSuggestions'] =\n async ({ commit }, request) => {\n if (!request) {\n return\n }\n commit('setSuggestionsLoading', true)\n return XPlugin.adapter.aiSuggestions(request).then(({ body, status }) => {\n if (status !== 200) {\n return\n }\n if (body) {\n const reader = body.getReader()\n readAnswer(reader, commit)\n }\n })\n }\n\nfunction readAnswer(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n commit: AiActionContext['commit'],\n): void {\n reader\n .read()\n .then(({ value, done }) => {\n if (done) {\n return\n }\n const result = new TextDecoder().decode(value, { stream: true })\n const parts = result.split('\\n\\n')\n for (const part of parts) {\n const lines = part.split('\\n')\n let data: AnswerChunk\n\n for (const line of lines) {\n // line.length check to avoid empty data chunks\n if (line.startsWith('data:') && line.length > 5) {\n data = JSON.parse(line.slice(5).trim()) as AnswerChunk\n if ('responseText' in data) {\n commit('setResponseText', data.responseText)\n }\n if ('suggestionText' in data) {\n commit('setSuggestionText', data.suggestionText)\n }\n if ('queries' in data) {\n commit('setQueries', data.queries)\n }\n if ('taggings' in data) {\n const { toolingDisplay, toolingDisplayClick } = data.taggings[0]\n const tagging = {\n toolingDisplay: getTaggingInfoFromUrl(toolingDisplay),\n toolingDisplayClick: getTaggingInfoFromUrl(toolingDisplayClick),\n }\n\n commit('setTagging', tagging)\n }\n }\n }\n }\n readAnswer(reader, commit)\n })\n .catch((error: { code: number }) => {\n // AbortError code === 20\n if (error.code !== 20) {\n console.error(error)\n }\n })\n .finally(() => {\n commit('setSuggestionsLoading', false)\n })\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fetch-and-save-ai-suggestions.action.js","sources":["../../../../../../src/x-modules/ai/store/actions/fetch-and-save-ai-suggestions.action.ts"],"sourcesContent":["import type { AiSuggestionQuery } from '@empathyco/x-types'\nimport type { AiActionContext, AiXStoreModule } from '../types'\nimport { getTaggingInfoFromUrl } from '@empathyco/x-adapter-platform'\nimport { XPlugin } from '../../../../plugins'\n\ntype AnswerChunk =\n | { responseText: string }\n | { suggestionText: string }\n | { queries: AiSuggestionQuery[] }\n | {\n taggings: {\n toolingDisplay: string\n toolingDisplayClick: string\n }[]\n }\n/**\n * Default implementation for the {@link AiActions.fetchAndSaveAiSuggestions}.\n *\n * @param _ - The {@link https://vuex.vuejs.org/guide/actions.html | context} of the actions,\n * provided by Vuex.\n * @param request - The AI request to make.\n * @returns The AI response.\n *\n * @public\n */\nexport const fetchAndSaveAiSuggestions: AiXStoreModule['actions']['fetchAndSaveAiSuggestions'] =\n async ({ commit }, request) => {\n if (!request) {\n return\n }\n commit('setSuggestionsLoading', true)\n return XPlugin.adapter.aiSuggestions(request).then(({ body, status }) => {\n if (status !== 200) {\n return\n }\n if (body) {\n const reader = body.getReader()\n readAnswer(reader, commit)\n }\n })\n }\n\nfunction readAnswer(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n commit: AiActionContext['commit'],\n): void {\n reader\n .read()\n .then(({ value, done }) => {\n if (done) {\n return\n }\n const result = new TextDecoder().decode(value, { stream: true })\n const parts = result.split('\\n\\n')\n for (const part of parts) {\n const lines = part.split('\\n')\n let data: AnswerChunk\n\n for (const line of lines) {\n // line.length check to avoid empty data chunks\n if (line.startsWith('data:') && line.length > 5) {\n data = JSON.parse(line.slice(5).trim()) as AnswerChunk\n if ('suggestionText' in data) {\n commit('setIsNoResults', false)\n commit('setSuggestionText', data.suggestionText)\n }\n if ('responseText' in data) {\n commit('setResponseText', data.responseText)\n }\n if ('queries' in data) {\n commit('setQueries', data.queries)\n }\n if ('taggings' in data) {\n const { toolingDisplay, toolingDisplayClick } = data.taggings[0]\n const tagging = {\n toolingDisplay: getTaggingInfoFromUrl(toolingDisplay),\n toolingDisplayClick: getTaggingInfoFromUrl(toolingDisplayClick),\n }\n\n commit('setTagging', tagging)\n }\n }\n }\n }\n readAnswer(reader, commit)\n })\n .catch((error: { code: number }) => {\n // AbortError code === 20\n if (error.code !== 20) {\n console.error(error)\n }\n })\n .finally(() => {\n commit('setSuggestionsLoading', false)\n })\n}\n"],"names":[],"mappings":"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"}
@@ -62,6 +62,9 @@ const aiXStoreModule = {
62
62
  setAiRelatedTags(state, relatedTags) {
63
63
  state.relatedTags = relatedTags;
64
64
  },
65
+ setIsNoResults(state, isNoResults) {
66
+ state.isNoResults = isNoResults;
67
+ },
65
68
  },
66
69
  actions: {
67
70
  fetchAndSaveAiSuggestions,
@@ -86,6 +89,7 @@ function resettableAiState() {
86
89
  suggestionsSearch: [],
87
90
  suggestionsLoading: false,
88
91
  suggestionsSearchLoading: false,
92
+ isNoResults: true,
89
93
  };
90
94
  }
91
95
 
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sources":["../../../../../src/x-modules/ai/store/module.ts"],"sourcesContent":["import type { AiSuggestionQuery, AiSuggestionSearch } from '@empathyco/x-types'\nimport type { QueryState } from '../../../store'\nimport type { AiXStoreModule } from './types'\nimport { mergeConfig, setConfig } from '../../../store/utils/config-store.utils'\nimport { fetchAndSaveAiSuggestionsSearch } from './actions/fetch-and-save-ai-suggestions-search.action'\nimport { fetchAndSaveAiSuggestions } from './actions/fetch-and-save-ai-suggestions.action'\nimport { setUrlParams } from './actions/set-url-params.action'\nimport {\n aiQuery as query,\n aiSuggestionsRequest as suggestionsRequest,\n aiSuggestionsSearchRequest as suggestionsSearchRequest,\n} from './getters'\n/**\n * {@link XStoreModule} For the ai module.\n *\n * @internal\n */\nexport const aiXStoreModule: AiXStoreModule = {\n state: () => ({\n ...resettableAiState(),\n query: '',\n config: {},\n params: {},\n relatedTags: [],\n }),\n getters: {\n suggestionsRequest,\n suggestionsSearchRequest,\n query,\n },\n mutations: {\n /* Streamed fields */\n setResponseText: (state, responseText: string) => {\n state.responseText = responseText\n },\n setSuggestionText: (state, suggestionText: string) => {\n state.suggestionText = suggestionText\n },\n setQueries: (state, queries: AiSuggestionQuery[]) => {\n state.queries = queries\n },\n setTagging: (state, tagging) => {\n state.tagging = tagging\n },\n /* END Streamed fields */\n setSuggestionsSearch: (state, suggestionsSearch: AiSuggestionSearch[]) => {\n state.suggestionsSearch = suggestionsSearch\n },\n setSuggestionsLoading: (state, value) => {\n state.suggestionsLoading = value\n },\n setSuggestionsSearchLoading: (state, value) => {\n state.suggestionsSearchLoading = value\n },\n setConfig,\n mergeConfig,\n setQuery: (state: QueryState, query: string) => {\n state.query = query\n },\n setParams(state, params) {\n state.params = params\n },\n resetAiState(state) {\n Object.assign(state, resettableAiState())\n },\n setAiRelatedTags(state, relatedTags) {\n state.relatedTags = relatedTags\n },\n },\n actions: {\n fetchAndSaveAiSuggestions,\n fetchAndSaveAiSuggestionsSearch,\n setUrlParams,\n },\n}\n\n/**\n * Function to return the \"resettable\" part of the state. This will be used in the `resetState`\n * mutation to reset to the initial state.\n *\n * @returns The \"resettable\" part of the {@link AiState}.\n *\n * @internal\n */\nfunction resettableAiState() {\n return {\n responseText: '',\n suggestionText: '',\n queries: [],\n tagging: undefined,\n suggestionsSearch: [],\n suggestionsLoading: false,\n suggestionsSearchLoading: false,\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAYA;;;;AAIG;AACU,MAAA,cAAc,GAAmB;AAC5C,IAAA,KAAK,EAAE,OAAO;AACZ,QAAA,GAAG,iBAAiB,EAAE;AACtB,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,WAAW,EAAE,EAAE;KAChB,CAAC;AACF,IAAA,OAAO,EAAE;QACP,kBAAkB;QAClB,wBAAwB;QACxB,KAAK;AACN,KAAA;AACD,IAAA,SAAS,EAAE;;AAET,QAAA,eAAe,EAAE,CAAC,KAAK,EAAE,YAAoB,KAAI;AAC/C,YAAA,KAAK,CAAC,YAAY,GAAG,YAAY,CAAA;SAClC;AACD,QAAA,iBAAiB,EAAE,CAAC,KAAK,EAAE,cAAsB,KAAI;AACnD,YAAA,KAAK,CAAC,cAAc,GAAG,cAAc,CAAA;SACtC;AACD,QAAA,UAAU,EAAE,CAAC,KAAK,EAAE,OAA4B,KAAI;AAClD,YAAA,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;SACxB;AACD,QAAA,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;AAC7B,YAAA,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;SACxB;;AAED,QAAA,oBAAoB,EAAE,CAAC,KAAK,EAAE,iBAAuC,KAAI;AACvE,YAAA,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;SAC5C;AACD,QAAA,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAI;AACtC,YAAA,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAA;SACjC;AACD,QAAA,2BAA2B,EAAE,CAAC,KAAK,EAAE,KAAK,KAAI;AAC5C,YAAA,KAAK,CAAC,wBAAwB,GAAG,KAAK,CAAA;SACvC;QACD,SAAS;QACT,WAAW;AACX,QAAA,QAAQ,EAAE,CAAC,KAAiB,EAAE,KAAa,KAAI;AAC7C,YAAA,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;SACpB;QACD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAA;AACrB,YAAA,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;SACtB;AACD,QAAA,YAAY,CAAC,KAAK,EAAA;YAChB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAA;SAC1C;QACD,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAA;AACjC,YAAA,KAAK,CAAC,WAAW,GAAG,WAAW,CAAA;SAChC;AACF,KAAA;AACD,IAAA,OAAO,EAAE;QACP,yBAAyB;QACzB,+BAA+B;QAC/B,YAAY;AACb,KAAA;EACF;AAED;;;;;;;AAOG;AACH,SAAS,iBAAiB,GAAA;IACxB,OAAO;AACL,QAAA,YAAY,EAAE,EAAE;AAChB,QAAA,cAAc,EAAE,EAAE;AAClB,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,iBAAiB,EAAE,EAAE;AACrB,QAAA,kBAAkB,EAAE,KAAK;AACzB,QAAA,wBAAwB,EAAE,KAAK;KAChC,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"module.js","sources":["../../../../../src/x-modules/ai/store/module.ts"],"sourcesContent":["import type { AiSuggestionQuery, AiSuggestionSearch } from '@empathyco/x-types'\nimport type { QueryState } from '../../../store'\nimport type { AiXStoreModule } from './types'\nimport { mergeConfig, setConfig } from '../../../store/utils/config-store.utils'\nimport { fetchAndSaveAiSuggestionsSearch } from './actions/fetch-and-save-ai-suggestions-search.action'\nimport { fetchAndSaveAiSuggestions } from './actions/fetch-and-save-ai-suggestions.action'\nimport { setUrlParams } from './actions/set-url-params.action'\nimport {\n aiQuery as query,\n aiSuggestionsRequest as suggestionsRequest,\n aiSuggestionsSearchRequest as suggestionsSearchRequest,\n} from './getters'\n/**\n * {@link XStoreModule} For the ai module.\n *\n * @internal\n */\nexport const aiXStoreModule: AiXStoreModule = {\n state: () => ({\n ...resettableAiState(),\n query: '',\n config: {},\n params: {},\n relatedTags: [],\n }),\n getters: {\n suggestionsRequest,\n suggestionsSearchRequest,\n query,\n },\n mutations: {\n /* Streamed fields */\n setResponseText: (state, responseText: string) => {\n state.responseText = responseText\n },\n setSuggestionText: (state, suggestionText: string) => {\n state.suggestionText = suggestionText\n },\n setQueries: (state, queries: AiSuggestionQuery[]) => {\n state.queries = queries\n },\n setTagging: (state, tagging) => {\n state.tagging = tagging\n },\n /* END Streamed fields */\n setSuggestionsSearch: (state, suggestionsSearch: AiSuggestionSearch[]) => {\n state.suggestionsSearch = suggestionsSearch\n },\n setSuggestionsLoading: (state, value) => {\n state.suggestionsLoading = value\n },\n setSuggestionsSearchLoading: (state, value) => {\n state.suggestionsSearchLoading = value\n },\n setConfig,\n mergeConfig,\n setQuery: (state: QueryState, query: string) => {\n state.query = query\n },\n setParams(state, params) {\n state.params = params\n },\n resetAiState(state) {\n Object.assign(state, resettableAiState())\n },\n setAiRelatedTags(state, relatedTags) {\n state.relatedTags = relatedTags\n },\n setIsNoResults(state, isNoResults: boolean) {\n state.isNoResults = isNoResults\n },\n },\n actions: {\n fetchAndSaveAiSuggestions,\n fetchAndSaveAiSuggestionsSearch,\n setUrlParams,\n },\n}\n\n/**\n * Function to return the \"resettable\" part of the state. This will be used in the `resetState`\n * mutation to reset to the initial state.\n *\n * @returns The \"resettable\" part of the {@link AiState}.\n *\n * @internal\n */\nfunction resettableAiState() {\n return {\n responseText: '',\n suggestionText: '',\n queries: [],\n tagging: undefined,\n suggestionsSearch: [],\n suggestionsLoading: false,\n suggestionsSearchLoading: false,\n isNoResults: true,\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAYA;;;;AAIG;AACU,MAAA,cAAc,GAAmB;AAC5C,IAAA,KAAK,EAAE,OAAO;AACZ,QAAA,GAAG,iBAAiB,EAAE;AACtB,QAAA,KAAK,EAAE,EAAE;AACT,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,MAAM,EAAE,EAAE;AACV,QAAA,WAAW,EAAE,EAAE;KAChB,CAAC;AACF,IAAA,OAAO,EAAE;QACP,kBAAkB;QAClB,wBAAwB;QACxB,KAAK;AACN,KAAA;AACD,IAAA,SAAS,EAAE;;AAET,QAAA,eAAe,EAAE,CAAC,KAAK,EAAE,YAAoB,KAAI;AAC/C,YAAA,KAAK,CAAC,YAAY,GAAG,YAAY,CAAA;SAClC;AACD,QAAA,iBAAiB,EAAE,CAAC,KAAK,EAAE,cAAsB,KAAI;AACnD,YAAA,KAAK,CAAC,cAAc,GAAG,cAAc,CAAA;SACtC;AACD,QAAA,UAAU,EAAE,CAAC,KAAK,EAAE,OAA4B,KAAI;AAClD,YAAA,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;SACxB;AACD,QAAA,UAAU,EAAE,CAAC,KAAK,EAAE,OAAO,KAAI;AAC7B,YAAA,KAAK,CAAC,OAAO,GAAG,OAAO,CAAA;SACxB;;AAED,QAAA,oBAAoB,EAAE,CAAC,KAAK,EAAE,iBAAuC,KAAI;AACvE,YAAA,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAA;SAC5C;AACD,QAAA,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAI;AACtC,YAAA,KAAK,CAAC,kBAAkB,GAAG,KAAK,CAAA;SACjC;AACD,QAAA,2BAA2B,EAAE,CAAC,KAAK,EAAE,KAAK,KAAI;AAC5C,YAAA,KAAK,CAAC,wBAAwB,GAAG,KAAK,CAAA;SACvC;QACD,SAAS;QACT,WAAW;AACX,QAAA,QAAQ,EAAE,CAAC,KAAiB,EAAE,KAAa,KAAI;AAC7C,YAAA,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;SACpB;QACD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAA;AACrB,YAAA,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;SACtB;AACD,QAAA,YAAY,CAAC,KAAK,EAAA;YAChB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAA;SAC1C;QACD,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAA;AACjC,YAAA,KAAK,CAAC,WAAW,GAAG,WAAW,CAAA;SAChC;QACD,cAAc,CAAC,KAAK,EAAE,WAAoB,EAAA;AACxC,YAAA,KAAK,CAAC,WAAW,GAAG,WAAW,CAAA;SAChC;AACF,KAAA;AACD,IAAA,OAAO,EAAE;QACP,yBAAyB;QACzB,+BAA+B;QAC/B,YAAY;AACb,KAAA;EACF;AAED;;;;;;;AAOG;AACH,SAAS,iBAAiB,GAAA;IACxB,OAAO;AACL,QAAA,YAAY,EAAE,EAAE;AAChB,QAAA,cAAc,EAAE,EAAE;AAClB,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,OAAO,EAAE,SAAS;AAClB,QAAA,iBAAiB,EAAE,EAAE;AACrB,QAAA,kBAAkB,EAAE,KAAK;AACzB,QAAA,wBAAwB,EAAE,KAAK;AAC/B,QAAA,WAAW,EAAE,IAAI;KAClB,CAAA;AACH;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empathyco/x-components",
3
- "version": "6.0.0-alpha.149",
3
+ "version": "6.0.0-alpha.150",
4
4
  "description": "Empathy X Components",
5
5
  "author": "Empathy Systems Corporation S.L.",
6
6
  "license": "Apache-2.0",
@@ -142,5 +142,5 @@
142
142
  "access": "public",
143
143
  "directory": "dist"
144
144
  },
145
- "gitHead": "674a475f15468a2c674955ce60f46ac5da2cac13"
145
+ "gitHead": "d272f45b60457c0f8a2ccd4f380c9648e6000bf7"
146
146
  }
@@ -1199,6 +1199,33 @@
1199
1199
  "endIndex": 4
1200
1200
  }
1201
1201
  },
1202
+ {
1203
+ "kind": "PropertySignature",
1204
+ "canonicalReference": "@empathyco/x-components!AiMutations#setIsNoResults:member",
1205
+ "docComment": "/**\n * Sets the no results flag of the module.\n *\n * @param isNoResults - The new no results value.\n */\n",
1206
+ "excerptTokens": [
1207
+ {
1208
+ "kind": "Content",
1209
+ "text": "setIsNoResults: "
1210
+ },
1211
+ {
1212
+ "kind": "Content",
1213
+ "text": "(isNoResults: boolean) => void"
1214
+ },
1215
+ {
1216
+ "kind": "Content",
1217
+ "text": ";"
1218
+ }
1219
+ ],
1220
+ "isReadonly": false,
1221
+ "isOptional": false,
1222
+ "releaseTag": "Public",
1223
+ "name": "setIsNoResults",
1224
+ "propertyTypeTokenRange": {
1225
+ "startIndex": 1,
1226
+ "endIndex": 2
1227
+ }
1228
+ },
1202
1229
  {
1203
1230
  "kind": "PropertySignature",
1204
1231
  "canonicalReference": "@empathyco/x-components!AiMutations#setParams:member",
@@ -1645,7 +1672,34 @@
1645
1672
  },
1646
1673
  {
1647
1674
  "kind": "Content",
1648
- "text": " | undefined>;\n}, unknown, {}, {}, import(\"vue\")."
1675
+ "text": " | undefined>;\n isNoResults: import(\"vue\")."
1676
+ },
1677
+ {
1678
+ "kind": "Reference",
1679
+ "text": "ComputedRef",
1680
+ "canonicalReference": "@vue/reactivity!ComputedRef:interface"
1681
+ },
1682
+ {
1683
+ "kind": "Content",
1684
+ "text": "<boolean>;\n queries: import(\"vue\")."
1685
+ },
1686
+ {
1687
+ "kind": "Reference",
1688
+ "text": "ComputedRef",
1689
+ "canonicalReference": "@vue/reactivity!ComputedRef:interface"
1690
+ },
1691
+ {
1692
+ "kind": "Content",
1693
+ "text": "<import(\"@empathyco/x-types\")."
1694
+ },
1695
+ {
1696
+ "kind": "Reference",
1697
+ "text": "AiSuggestionQuery",
1698
+ "canonicalReference": "@empathyco/x-components!AiSuggestionQuery:interface"
1699
+ },
1700
+ {
1701
+ "kind": "Content",
1702
+ "text": "[]>;\n}, unknown, {}, {}, import(\"vue\")."
1649
1703
  },
1650
1704
  {
1651
1705
  "kind": "Reference",
@@ -1762,7 +1816,7 @@
1762
1816
  "name": "AiOverview",
1763
1817
  "variableTypeTokenRange": {
1764
1818
  "startIndex": 1,
1765
- "endIndex": 64
1819
+ "endIndex": 70
1766
1820
  }
1767
1821
  },
1768
1822
  {
@@ -1817,6 +1871,33 @@
1817
1871
  "endIndex": 2
1818
1872
  }
1819
1873
  },
1874
+ {
1875
+ "kind": "PropertySignature",
1876
+ "canonicalReference": "@empathyco/x-components!AiState#isNoResults:member",
1877
+ "docComment": "/**\n * Flag to indicate that the AI response has no results\n */\n",
1878
+ "excerptTokens": [
1879
+ {
1880
+ "kind": "Content",
1881
+ "text": "isNoResults: "
1882
+ },
1883
+ {
1884
+ "kind": "Content",
1885
+ "text": "boolean"
1886
+ },
1887
+ {
1888
+ "kind": "Content",
1889
+ "text": ";"
1890
+ }
1891
+ ],
1892
+ "isReadonly": false,
1893
+ "isOptional": false,
1894
+ "releaseTag": "Public",
1895
+ "name": "isNoResults",
1896
+ "propertyTypeTokenRange": {
1897
+ "startIndex": 1,
1898
+ "endIndex": 2
1899
+ }
1900
+ },
1820
1901
  {
1821
1902
  "kind": "PropertySignature",
1822
1903
  "canonicalReference": "@empathyco/x-components!AiState#params:member",
@@ -204,6 +204,7 @@ export interface AiMutations extends ConfigMutations<AiState>, QueryMutations {
204
204
  resetAiState: () => void;
205
205
  // Warning: (ae-forgotten-export) The symbol "RelatedTag_2" needs to be exported by the entry point index.d.ts
206
206
  setAiRelatedTags: (relatedTags: RelatedTag_2[]) => void;
207
+ setIsNoResults: (isNoResults: boolean) => void;
207
208
  setParams: (params: Dictionary<unknown>) => void;
208
209
  // Warning: (ae-forgotten-export) The symbol "AiSuggestionQuery" needs to be exported by the entry point index.d.ts
209
210
  setQueries: (queries: AiSuggestionQuery[]) => void;
@@ -255,6 +256,8 @@ onExpandButtonClick: (newValue: boolean) => void;
255
256
  shouldAnimateSuggestion: Ref<boolean>;
256
257
  query: ComputedRef<string>;
257
258
  tagging: ComputedRef<AiSuggestionTagging | undefined>;
259
+ isNoResults: ComputedRef<boolean>;
260
+ queries: ComputedRef<AiSuggestionQuery[]>;
258
261
  }, unknown, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<ExtractPropTypes< {
259
262
  title: {
260
263
  type: PropType<string>;
@@ -292,6 +295,7 @@ export { AIStarIcon }
292
295
  export interface AiState extends QueryState {
293
296
  // (undocumented)
294
297
  config: AiConfig;
298
+ isNoResults: boolean;
295
299
  params: Dictionary<unknown>;
296
300
  // (undocumented)
297
301
  queries: AiSuggestionQuery[];
@@ -71,6 +71,8 @@ declare const _default: import("vue").DefineComponent<{
71
71
  shouldAnimateSuggestion: import("vue").Ref<boolean>;
72
72
  query: import("vue").ComputedRef<string>;
73
73
  tagging: import("vue").ComputedRef<import("@empathyco/x-types").AiSuggestionTagging | undefined>;
74
+ isNoResults: import("vue").ComputedRef<boolean>;
75
+ queries: import("vue").ComputedRef<import("@empathyco/x-types").AiSuggestionQuery[]>;
74
76
  }, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
75
77
  /**
76
78
  * The text displayed when the question ended loading
@@ -1 +1 @@
1
- {"version":3,"file":"ai-overview.vue?vue&type=script&lang.d.ts","sourceRoot":"","sources":["../../../../../src/x-modules/ai/components/ai-overview.vue?vue&type=script&lang.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;;IAoC/B;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAGlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAGlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAIlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;;;;;;;4BAsBH,OAAO;oCARC,OAAO;;;;;IAxE9C;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAGlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAGlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAIlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;;;;;AA5EtC,wBA0HE"}
1
+ {"version":3,"file":"ai-overview.vue?vue&type=script&lang.d.ts","sourceRoot":"","sources":["../../../../../src/x-modules/ai/components/ai-overview.vue?vue&type=script&lang.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAA;;IAoC/B;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAGlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAGlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAIlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;;;;;;;4BA6BH,OAAO;oCARC,OAAO;;;;;;;IA/E9C;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAGlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAGlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;IAIlC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;IAElC;;;;OAIG;;cAEe,QAAQ,CAAC,MAAM,CAAC;;;;;;;AA5EtC,wBAmIE"}
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/x-modules/ai/store/module.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,cAyD5B,CAAA"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../src/x-modules/ai/store/module.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAU7C;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,cA4D5B,CAAA"}
@@ -25,6 +25,8 @@ export interface AiState extends QueryState {
25
25
  params: Dictionary<unknown>;
26
26
  /** The list of the related tags, related to the `query` property of the state. */
27
27
  relatedTags: RelatedTag[];
28
+ /** Flag to indicate that the AI response has no results */
29
+ isNoResults: boolean;
28
30
  }
29
31
  /**
30
32
  * Ai module getters.
@@ -108,6 +110,12 @@ export interface AiMutations extends ConfigMutations<AiState>, QueryMutations {
108
110
  * @param relatedTags - The new related tags to save to the state.
109
111
  */
110
112
  setAiRelatedTags: (relatedTags: RelatedTag[]) => void;
113
+ /**
114
+ * Sets the no results flag of the module.
115
+ *
116
+ * @param isNoResults - The new no results value.
117
+ */
118
+ setIsNoResults: (isNoResults: boolean) => void;
111
119
  }
112
120
  /**
113
121
  * Ai module actions.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/x-modules/ai/store/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/x-modules/ai/store/types.ts"],"names":[],"mappings":"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"}