@gitlab/ui 91.0.0 → 91.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (18) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/components/experimental/duo/chat/components/duo_chat_context/constants.js +5 -0
  3. package/dist/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_popover/duo_chat_context_item_popover.js +93 -0
  4. package/dist/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections.js +91 -0
  5. package/dist/components/experimental/duo/chat/components/duo_chat_context/mock_context_data.js +121 -0
  6. package/dist/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.js +24 -1
  7. package/dist/components/experimental/duo/chat/mock_data.js +9 -3
  8. package/dist/tailwind.css +1 -1
  9. package/dist/tailwind.css.map +1 -1
  10. package/package.json +1 -1
  11. package/src/components/experimental/duo/chat/components/duo_chat_context/constants.js +3 -0
  12. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_popover/duo_chat_context_item_popover.vue +111 -0
  13. package/src/components/experimental/duo/chat/components/duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections.vue +94 -0
  14. package/src/components/experimental/duo/chat/components/duo_chat_context/mock_context_data.js +137 -0
  15. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.md +5 -0
  16. package/src/components/experimental/duo/chat/components/duo_chat_message/duo_chat_message.vue +43 -0
  17. package/src/components/experimental/duo/chat/mock_data.js +8 -2
  18. package/translations.js +3 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [91.1.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v91.0.0...v91.1.0) (2024-08-29)
2
+
3
+
4
+ ### Features
5
+
6
+ * **GlDuoChat:** display attached context in chat messages ([be92188](https://gitlab.com/gitlab-org/gitlab-ui/commit/be92188062f895f5f27117f501d4b31ba52ac598))
7
+
1
8
  # [91.0.0](https://gitlab.com/gitlab-org/gitlab-ui/compare/v90.5.0...v91.0.0) (2024-08-29)
2
9
 
3
10
 
@@ -0,0 +1,5 @@
1
+ const CONTEXT_ITEM_TYPE_ISSUE = 'issue';
2
+ const CONTEXT_ITEM_TYPE_MERGE_REQUEST = 'merge_request';
3
+ const CONTEXT_ITEM_TYPE_PROJECT_FILE = 'project_file';
4
+
5
+ export { CONTEXT_ITEM_TYPE_ISSUE, CONTEXT_ITEM_TYPE_MERGE_REQUEST, CONTEXT_ITEM_TYPE_PROJECT_FILE };
@@ -0,0 +1,93 @@
1
+ import GlPopover from '../../../../../../base/popover/popover';
2
+ import { translate } from '../../../../../../../utils/i18n';
3
+ import { CONTEXT_ITEM_TYPE_ISSUE, CONTEXT_ITEM_TYPE_MERGE_REQUEST, CONTEXT_ITEM_TYPE_PROJECT_FILE } from '../constants';
4
+ import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
5
+
6
+ const ID_PREFIXES = {
7
+ issue: '#',
8
+ merge_request: '!'
9
+ };
10
+ var script = {
11
+ name: 'DuoChatContextItemPopover',
12
+ components: {
13
+ GlPopover
14
+ },
15
+ props: {
16
+ item: {
17
+ type: Object,
18
+ required: true
19
+ },
20
+ target: {
21
+ type: String,
22
+ required: true
23
+ },
24
+ placement: {
25
+ type: String,
26
+ default: 'bottom',
27
+ required: false
28
+ }
29
+ },
30
+ computed: {
31
+ itemInfo() {
32
+ var _this$item$metadata;
33
+ return ((_this$item$metadata = this.item.metadata) === null || _this$item$metadata === void 0 ? void 0 : _this$item$metadata.info) || {};
34
+ },
35
+ id() {
36
+ const isIssuable = this.item.type === CONTEXT_ITEM_TYPE_ISSUE || this.item.type === CONTEXT_ITEM_TYPE_MERGE_REQUEST;
37
+ return isIssuable ? this.itemInfo.iid || '' : null;
38
+ },
39
+ idPrefix() {
40
+ return ID_PREFIXES[this.item.type] || '';
41
+ },
42
+ filePath() {
43
+ return this.item.type === CONTEXT_ITEM_TYPE_PROJECT_FILE ? this.itemInfo.relFilePath || '' : null;
44
+ },
45
+ isEnabled() {
46
+ return this.item.isEnabled !== false;
47
+ },
48
+ disabledMessage() {
49
+ return Array.isArray(this.item.disabledReasons) && this.item.disabledReasons.length > 0 ? this.item.disabledReasons.join(', ') : translate('DuoChatContextItemPopover.DisabledReason', 'This item is disabled');
50
+ }
51
+ },
52
+ methods: {
53
+ translate
54
+ }
55
+ };
56
+
57
+ /* script */
58
+ const __vue_script__ = script;
59
+
60
+ /* template */
61
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('gl-popover',{attrs:{"target":_vm.target,"triggers":"hover focus","placement":_vm.placement,"title":_vm.item.metadata.name,"custom-class":"gl-duo-chat-item-popover"},scopedSlots:_vm._u([{key:"title",fn:function(){return [_c('span',{staticClass:"gl-text-sm gl-text-gray-500",attrs:{"data-testid":"chat-context-popover-title"}},[_vm._v(_vm._s(_vm.item.metadata.name))])]},proxy:true}])},[_vm._v(" "),_c('div',{staticClass:"gl-p-3"},[_c('div',{staticClass:"gl-mb-2"},[_c('strong',{staticClass:"gl-mr-1"},[_vm._v(_vm._s(_vm.translate('DuoChatContextItemPopover.ProjectLabel', 'Project:')))]),_vm._v(" "),_c('span',[_vm._v(_vm._s(_vm.itemInfo.project))])]),_vm._v(" "),(_vm.filePath !== null)?_c('div',{staticClass:"gl-mb-2"},[_c('strong',{staticClass:"gl-mr-1"},[_vm._v(_vm._s(_vm.translate('DuoChatContextItemPopover.PathLabel', 'Path:')))]),_vm._v(" "),_c('span',[_vm._v(_vm._s(_vm.filePath))])]):_vm._e(),_vm._v(" "),(_vm.id !== null)?_c('div',{staticClass:"gl-mb-2"},[_c('strong',{staticClass:"gl-mr-1"},[_vm._v(_vm._s(_vm.translate('DuoChatContextItemPopover.IdLabel', 'ID:')))]),_vm._v(" "),_c('span',[_vm._v(_vm._s(_vm.idPrefix)+_vm._s(_vm.id))])]):_vm._e(),_vm._v(" "),_c('div',{staticClass:"gl-mb-2"},[_c('strong',{staticClass:"gl-mr-1"},[_vm._v(_vm._s(_vm.translate('DuoChatContextItemPopover.TypeLabel', 'Type:')))]),_vm._v(" "),_c('span',[_vm._v(_vm._s(_vm.item.type))])]),_vm._v(" "),(!_vm.isEnabled)?_c('div',{staticClass:"gl-text-red-500",attrs:{"data-testid":"chat-context-popover-disabled"}},[_c('strong',{staticClass:"gl-mr-1"},[_vm._v(_vm._s(_vm.translate('DuoChatContextItemPopover.DisabledMessageLabel', 'Note:')))]),_vm._v(" "),_c('span',[_vm._v(_vm._s(_vm.disabledMessage))])]):_vm._e()])])};
62
+ var __vue_staticRenderFns__ = [];
63
+
64
+ /* style */
65
+ const __vue_inject_styles__ = undefined;
66
+ /* scoped */
67
+ const __vue_scope_id__ = undefined;
68
+ /* module identifier */
69
+ const __vue_module_identifier__ = undefined;
70
+ /* functional template */
71
+ const __vue_is_functional_template__ = false;
72
+ /* style inject */
73
+
74
+ /* style inject SSR */
75
+
76
+ /* style inject shadow dom */
77
+
78
+
79
+
80
+ const __vue_component__ = __vue_normalize__(
81
+ { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
82
+ __vue_inject_styles__,
83
+ __vue_script__,
84
+ __vue_scope_id__,
85
+ __vue_is_functional_template__,
86
+ __vue_module_identifier__,
87
+ false,
88
+ undefined,
89
+ undefined,
90
+ undefined
91
+ );
92
+
93
+ export default __vue_component__;
@@ -0,0 +1,91 @@
1
+ import uniqueId from 'lodash/uniqueId';
2
+ import GlIcon from '../../../../../../base/icon/icon';
3
+ import GlToken from '../../../../../../base/token/token';
4
+ import GlDuoChatContextItemPopover from '../duo_chat_context_item_popover/duo_chat_context_item_popover';
5
+ import { CONTEXT_ITEM_TYPE_PROJECT_FILE, CONTEXT_ITEM_TYPE_ISSUE, CONTEXT_ITEM_TYPE_MERGE_REQUEST } from '../constants';
6
+ import __vue_normalize__ from 'vue-runtime-helpers/dist/normalize-component.js';
7
+
8
+ var script = {
9
+ name: 'GlDuoChatContextItemSelections',
10
+ components: {
11
+ GlIcon,
12
+ GlDuoChatContextItemPopover,
13
+ GlToken
14
+ },
15
+ props: {
16
+ selections: {
17
+ type: Array,
18
+ required: true
19
+ },
20
+ title: {
21
+ type: String,
22
+ required: true
23
+ },
24
+ defaultCollapsed: {
25
+ type: Boolean,
26
+ required: true
27
+ }
28
+ },
29
+ data() {
30
+ return {
31
+ isCollapsed: this.defaultCollapsed,
32
+ selectionsId: uniqueId()
33
+ };
34
+ },
35
+ computed: {
36
+ collapseIconName() {
37
+ return this.isCollapsed ? 'chevron-right' : 'chevron-down';
38
+ }
39
+ },
40
+ methods: {
41
+ getIconName(type) {
42
+ const iconMap = {
43
+ [CONTEXT_ITEM_TYPE_PROJECT_FILE]: 'document',
44
+ [CONTEXT_ITEM_TYPE_ISSUE]: 'issues',
45
+ [CONTEXT_ITEM_TYPE_MERGE_REQUEST]: 'merge-request'
46
+ };
47
+ return iconMap[type] || 'document';
48
+ },
49
+ toggleCollapse() {
50
+ this.isCollapsed = !this.isCollapsed;
51
+ }
52
+ }
53
+ };
54
+
55
+ /* script */
56
+ const __vue_script__ = script;
57
+
58
+ /* template */
59
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"gl-mb-3 gl-flex gl-flex-col"},[_c('button',{staticClass:"gl-flex gl-w-full gl-items-center gl-border-0 gl-bg-transparent gl-p-0 gl-text-left gl-text-xs gl-lowercase gl-text-gray-500",attrs:{"data-testid":"chat-context-selections-title"},on:{"click":_vm.toggleCollapse}},[_c('gl-icon',{attrs:{"name":_vm.collapseIconName,"data-testid":"chat-context-collapse-icon"}}),_vm._v(" "+_vm._s(_vm.title)+"\n ")],1),_vm._v(" "),_c('div',{directives:[{name:"show",rawName:"v-show",value:(!_vm.isCollapsed),expression:"!isCollapsed"}],staticClass:"gl-mt-1 gl-flex gl-grow gl-flex-wrap",attrs:{"data-testid":"chat-context-tokens-wrapper"}},_vm._l((_vm.selections),function(item){return _c('gl-token',{key:item.id,staticClass:"gl-mb-2 gl-mr-2",attrs:{"view-only":true,"variant":"default"}},[_c('div',{staticClass:"gl-flex gl-items-center",attrs:{"id":("context-item-" + (item.id) + "-" + _vm.selectionsId)}},[_c('gl-icon',{staticClass:"gl-mr-1",attrs:{"name":_vm.getIconName(item.type),"size":12}}),_vm._v("\n "+_vm._s(item.metadata.name)+"\n ")],1),_vm._v(" "),_c('gl-duo-chat-context-item-popover',{attrs:{"item":item,"target":("context-item-" + (item.id) + "-" + _vm.selectionsId),"placement":"bottom"}})],1)}),1)])};
60
+ var __vue_staticRenderFns__ = [];
61
+
62
+ /* style */
63
+ const __vue_inject_styles__ = undefined;
64
+ /* scoped */
65
+ const __vue_scope_id__ = undefined;
66
+ /* module identifier */
67
+ const __vue_module_identifier__ = undefined;
68
+ /* functional template */
69
+ const __vue_is_functional_template__ = false;
70
+ /* style inject */
71
+
72
+ /* style inject SSR */
73
+
74
+ /* style inject shadow dom */
75
+
76
+
77
+
78
+ const __vue_component__ = __vue_normalize__(
79
+ { render: __vue_render__, staticRenderFns: __vue_staticRenderFns__ },
80
+ __vue_inject_styles__,
81
+ __vue_script__,
82
+ __vue_scope_id__,
83
+ __vue_is_functional_template__,
84
+ __vue_module_identifier__,
85
+ false,
86
+ undefined,
87
+ undefined,
88
+ undefined
89
+ );
90
+
91
+ export default __vue_component__;
@@ -0,0 +1,121 @@
1
+ const MOCK_CONTEXT_ITEM_FILE = {
2
+ id: '123e4567-e89b-12d3-a456-426614174000',
3
+ isEnabled: true,
4
+ metadata: {
5
+ name: 'strawberry.ts',
6
+ info: {
7
+ project: 'example/garden',
8
+ relFilePath: 'src/plants/strawberry.ts'
9
+ }
10
+ },
11
+ type: 'project_file'
12
+ };
13
+ const MOCK_CONTEXT_ITEM_FILE_DISABLED = {
14
+ id: '323e4567-e89b-12d3-a456-426614174002',
15
+ isEnabled: false,
16
+ metadata: {
17
+ name: 'motorbike.cs',
18
+ info: {
19
+ project: 'example/vehicles',
20
+ relFilePath: '/src/VehicleFoo/motorbike.cs'
21
+ }
22
+ },
23
+ type: 'project_file'
24
+ };
25
+ const mockFiles = [MOCK_CONTEXT_ITEM_FILE, {
26
+ id: '223e4567-e89b-12d3-a456-426614174001',
27
+ isEnabled: true,
28
+ metadata: {
29
+ name: 'potato.ts',
30
+ info: {
31
+ project: 'example/garden',
32
+ relFilePath: '/src/plants/potato.ts'
33
+ }
34
+ },
35
+ type: 'project_file'
36
+ }, MOCK_CONTEXT_ITEM_FILE_DISABLED];
37
+ const MOCK_CONTEXT_ITEM_ISSUE = {
38
+ id: '423e4567-e89b-12d3-a456-426614174003',
39
+ isEnabled: true,
40
+ metadata: {
41
+ name: 'Implement watering schedule',
42
+ info: {
43
+ project: 'example/garden',
44
+ iid: 1234
45
+ }
46
+ },
47
+ type: 'issue'
48
+ };
49
+ const MOCK_CONTEXT_ITEM_ISSUE_DISABLED = {
50
+ id: 'c463fb31-2a4c-4f8e-a609-97230ac48ae5',
51
+ isEnabled: false,
52
+ metadata: {
53
+ name: 'Fix vehicle colours',
54
+ info: {
55
+ project: 'example/vehicle',
56
+ iid: 91011
57
+ }
58
+ },
59
+ disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
60
+ type: 'issue'
61
+ };
62
+ const mockIssues = [MOCK_CONTEXT_ITEM_ISSUE, {
63
+ id: '523e4567-e89b-12d3-a456-426614174004',
64
+ isEnabled: true,
65
+ metadata: {
66
+ name: 'Refactor plant growth rates',
67
+ info: {
68
+ project: 'example/garden',
69
+ iid: 5678
70
+ }
71
+ },
72
+ type: 'issue'
73
+ }, MOCK_CONTEXT_ITEM_ISSUE_DISABLED];
74
+ const MOCK_CONTEXT_ITEM_MERGE_REQUEST = {
75
+ id: '623e4567-e89b-12d3-a456-426614174005',
76
+ isEnabled: true,
77
+ metadata: {
78
+ name: 'Improve database performance',
79
+ info: {
80
+ project: 'example/garden',
81
+ iid: 1122
82
+ }
83
+ },
84
+ type: 'merge_request'
85
+ };
86
+ const MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED = {
87
+ id: '4eb665fc-e5e1-49b0-9789-2a16964e461a',
88
+ isEnabled: false,
89
+ metadata: {
90
+ name: 'Fix broken layout at small viewports',
91
+ info: {
92
+ project: 'example/vehicle',
93
+ iid: 5566
94
+ }
95
+ },
96
+ disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
97
+ type: 'merge_request'
98
+ };
99
+ const mockMergeRequests = [MOCK_CONTEXT_ITEM_MERGE_REQUEST, {
100
+ id: '723e4567-e89b-12d3-a456-426614174006',
101
+ isEnabled: false,
102
+ metadata: {
103
+ name: 'Add vehicle registration details',
104
+ info: {
105
+ project: 'example/vehicle',
106
+ iid: 3344
107
+ }
108
+ },
109
+ disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
110
+ type: 'merge_request'
111
+ }, MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED];
112
+ const getMockContextItems = () => {
113
+ const allItems = [...mockFiles, ...mockIssues, ...mockMergeRequests];
114
+
115
+ // put disabled items in the back
116
+ const disabledItems = allItems.filter(item => !item.isEnabled);
117
+ const enabledItems = allItems.filter(item => item.isEnabled);
118
+ return [...enabledItems, ...disabledItems];
119
+ };
120
+
121
+ export { MOCK_CONTEXT_ITEM_FILE, MOCK_CONTEXT_ITEM_FILE_DISABLED, MOCK_CONTEXT_ITEM_ISSUE, MOCK_CONTEXT_ITEM_ISSUE_DISABLED, MOCK_CONTEXT_ITEM_MERGE_REQUEST, MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED, getMockContextItems };
@@ -1,10 +1,12 @@
1
1
  import GlIcon from '../../../../../base/icon/icon';
2
2
  import GlLoadingIcon from '../../../../../base/loading_icon/loading_icon';
3
3
  import { GlTooltipDirective } from '../../../../../../directives/tooltip';
4
+ import GlDuoChatContextItemSelections from '../duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections';
4
5
  import GlDuoUserFeedback from '../../../user_feedback/user_feedback';
5
6
  import GlFormGroup from '../../../../../base/form/form_group/form_group';
6
7
  import GlFormTextarea from '../../../../../base/form/form_textarea/form_textarea';
7
8
  import { SafeHtmlDirective } from '../../../../../../directives/safe_html/safe_html';
9
+ import { translatePlural, sprintf } from '../../../../../../utils/i18n';
8
10
  import { MESSAGE_MODEL_ROLES } from '../../constants';
9
11
  import DocumentationSources from '../duo_chat_message_sources/duo_chat_message_sources';
10
12
  import { renderDuoChatMarkdownPreview } from '../../markdown_renderer';
@@ -32,6 +34,7 @@ var script = {
32
34
  },
33
35
  components: {
34
36
  DocumentationSources,
37
+ GlDuoChatContextItemSelections,
35
38
  GlDuoUserFeedback,
36
39
  GlFormGroup,
37
40
  GlFormTextarea,
@@ -129,6 +132,26 @@ var script = {
129
132
  error() {
130
133
  var _this$message, _this$message$errors2;
131
134
  return Boolean((_this$message = this.message) === null || _this$message === void 0 ? void 0 : (_this$message$errors2 = _this$message.errors) === null || _this$message$errors2 === void 0 ? void 0 : _this$message$errors2.length) && this.message.errors.join('; ');
135
+ },
136
+ selectedContextItems() {
137
+ var _this$message$extras3;
138
+ return ((_this$message$extras3 = this.message.extras) === null || _this$message$extras3 === void 0 ? void 0 : _this$message$extras3.contextItems) || [];
139
+ },
140
+ displaySelectedContextItems() {
141
+ return Boolean(this.selectedContextItems.length);
142
+ },
143
+ selectedContextItemsDefaultCollapsed() {
144
+ return this.isAssistantMessage;
145
+ },
146
+ selectedContextItemsTitle() {
147
+ if (!this.displaySelectedContextItems) return '';
148
+ const count = this.selectedContextItems.length;
149
+ if (this.isUserMessage) {
150
+ return translatePlural('GlDuoChatMessage.SelectedContextItemsTitleUserMessage', 'Included reference', 'Included references')(count);
151
+ }
152
+ return sprintf(translatePlural('GlDuoChatMessage.SelectedContextItemsTitleAssistantMessage', 'Used %{count} included reference', 'Used %{count} included references')(count), {
153
+ count
154
+ });
132
155
  }
133
156
  },
134
157
  beforeCreate() {
@@ -205,7 +228,7 @@ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=
205
228
  _vm.isAssistantMessage,
206
229
  'gl-bg-white': _vm.isAssistantMessage && !_vm.error,
207
230
  '!gl-border-none gl-bg-red-50': _vm.error,
208
- },on:{"insert-code-snippet":_vm.onInsertCodeSnippet}},[(_vm.error)?_c('gl-icon',{staticClass:"error-icon gl-border gl-mr-3 gl-flex-shrink-0 gl-rounded-full gl-border-red-500 gl-text-red-600",attrs:{"aria-label":_vm.$options.i18n.MESSAGE_ERROR,"name":"status_warning_borderless","size":16,"data-testid":"error"}}):_vm._e(),_vm._v(" "),_c('div',{ref:"content-wrapper",class:{ 'has-error': _vm.error }},[(_vm.error)?_c('div',{directives:[{name:"safe-html",rawName:"v-safe-html:[$options.safeHtmlConfigExtension]",value:(_vm.renderedError),expression:"renderedError",arg:_vm.$options.safeHtmlConfigExtension}],ref:"error-message"}):_c('div',[_c('div',{directives:[{name:"safe-html",rawName:"v-safe-html:[$options.safeHtmlConfigExtension]",value:(_vm.messageContent),expression:"messageContent",arg:_vm.$options.safeHtmlConfigExtension}],ref:"content"}),_vm._v(" "),(_vm.isAssistantMessage)?[(_vm.sources)?_c('documentation-sources',{attrs:{"sources":_vm.sources}}):_vm._e(),_vm._v(" "),_c('div',{staticClass:"duo-chat-message-feedback gl-mt-4 gl-flex gl-items-end"},[(_vm.isChunkAndNotCancelled)?_c('gl-loading-icon',{staticClass:"gl-pt-4",attrs:{"variant":"dots","inline":""}}):_vm._e(),_vm._v(" "),(_vm.isNotChunkOrCancelled)?_c('gl-duo-user-feedback',{attrs:{"feedback-received":_vm.hasFeedback,"modal-title":_vm.$options.i18n.MODAL.TITLE,"modal-alert":_vm.$options.i18n.MODAL.ALERT_TEXT},on:{"feedback":_vm.logEvent},scopedSlots:_vm._u([{key:"feedback-extra-fields",fn:function(){return [_c('gl-form-group',{attrs:{"label":_vm.$options.i18n.MODAL.DID_WHAT,"optional":""}},[_c('gl-form-textarea',{attrs:{"placeholder":_vm.$options.i18n.MODAL.INTERACTION},model:{value:(_vm.didWhat),callback:function ($$v) {_vm.didWhat=$$v;},expression:"didWhat"}})],1),_vm._v(" "),_c('gl-form-group',{attrs:{"label":_vm.$options.i18n.MODAL.IMPROVE_WHAT,"optional":""}},[_c('gl-form-textarea',{attrs:{"placeholder":_vm.$options.i18n.MODAL.BETTER_RESPONSE},model:{value:(_vm.improveWhat),callback:function ($$v) {_vm.improveWhat=$$v;},expression:"improveWhat"}})],1)]},proxy:true}],null,false,419229417)}):_vm._e()],1)]:_vm._e()],2)])],1)};
231
+ },on:{"insert-code-snippet":_vm.onInsertCodeSnippet}},[(_vm.error)?_c('gl-icon',{staticClass:"error-icon gl-border gl-mr-3 gl-flex-shrink-0 gl-rounded-full gl-border-red-500 gl-text-red-600",attrs:{"aria-label":_vm.$options.i18n.MESSAGE_ERROR,"name":"status_warning_borderless","size":16,"data-testid":"error"}}):_vm._e(),_vm._v(" "),_c('div',{ref:"content-wrapper",class:{ 'has-error': _vm.error }},[(_vm.displaySelectedContextItems)?_c('gl-duo-chat-context-item-selections',{staticClass:"gl-mb-3",attrs:{"selections":_vm.selectedContextItems,"title":_vm.selectedContextItemsTitle,"default-collapsed":_vm.selectedContextItemsDefaultCollapsed}}):_vm._e(),_vm._v(" "),(_vm.error)?_c('div',{directives:[{name:"safe-html",rawName:"v-safe-html:[$options.safeHtmlConfigExtension]",value:(_vm.renderedError),expression:"renderedError",arg:_vm.$options.safeHtmlConfigExtension}],ref:"error-message"}):_c('div',[_c('div',{directives:[{name:"safe-html",rawName:"v-safe-html:[$options.safeHtmlConfigExtension]",value:(_vm.messageContent),expression:"messageContent",arg:_vm.$options.safeHtmlConfigExtension}],ref:"content"}),_vm._v(" "),(_vm.isAssistantMessage)?[(_vm.sources)?_c('documentation-sources',{attrs:{"sources":_vm.sources}}):_vm._e(),_vm._v(" "),_c('div',{staticClass:"duo-chat-message-feedback gl-mt-4 gl-flex gl-items-end"},[(_vm.isChunkAndNotCancelled)?_c('gl-loading-icon',{staticClass:"gl-pt-4",attrs:{"variant":"dots","inline":""}}):_vm._e(),_vm._v(" "),(_vm.isNotChunkOrCancelled)?_c('gl-duo-user-feedback',{attrs:{"feedback-received":_vm.hasFeedback,"modal-title":_vm.$options.i18n.MODAL.TITLE,"modal-alert":_vm.$options.i18n.MODAL.ALERT_TEXT},on:{"feedback":_vm.logEvent},scopedSlots:_vm._u([{key:"feedback-extra-fields",fn:function(){return [_c('gl-form-group',{attrs:{"label":_vm.$options.i18n.MODAL.DID_WHAT,"optional":""}},[_c('gl-form-textarea',{attrs:{"placeholder":_vm.$options.i18n.MODAL.INTERACTION},model:{value:(_vm.didWhat),callback:function ($$v) {_vm.didWhat=$$v;},expression:"didWhat"}})],1),_vm._v(" "),_c('gl-form-group',{attrs:{"label":_vm.$options.i18n.MODAL.IMPROVE_WHAT,"optional":""}},[_c('gl-form-textarea',{attrs:{"placeholder":_vm.$options.i18n.MODAL.BETTER_RESPONSE},model:{value:(_vm.improveWhat),callback:function ($$v) {_vm.improveWhat=$$v;},expression:"improveWhat"}})],1)]},proxy:true}],null,false,419229417)}):_vm._e()],1)]:_vm._e()],2)],1)],1)};
209
232
  var __vue_staticRenderFns__ = [];
210
233
 
211
234
  /* style */
@@ -1,6 +1,7 @@
1
1
  import { setStoryTimeout } from '../../../../utils/test_utils';
2
2
  import { InsertCodeSnippetElement } from './components/duo_chat_message/insert_code_snippet_element';
3
3
  import { DOCUMENTATION_SOURCE_TYPES, MESSAGE_MODEL_ROLES, CHAT_RESET_MESSAGE, CHAT_CLEAN_MESSAGE } from './constants';
4
+ import { getMockContextItems } from './components/duo_chat_context/mock_context_data';
4
5
 
5
6
  const MOCK_SOURCES = [{
6
7
  title: 'GitLab Handbook',
@@ -23,7 +24,8 @@ const MOCK_RESPONSE_MESSAGE = {
23
24
  contentHtml: '<p data-sourcepos="1:1-1:56" dir="auto">Here is a simple JavaScript function to sum two numbers:</p>\n<div class="gl-relative markdown-code-block js-markdown-code">\n<pre data-sourcepos="3:1-7:3" data-canonical-lang="js" class="code highlight js-syntax-highlight language-javascript" lang="javascript" v-pre="true"><code><span id="LC1" class="line" lang="javascript"><span class="kd">function</span> <span class="nf">sum</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span></span>\n<span id="LC2" class="line" lang="javascript"> <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span></span>\n<span id="LC3" class="line" lang="javascript"><span class="p">}</span></span></code></pre>\n<copy-code></copy-code>\n<insert-code-snippet></insert-code-snippet>\n</div>\n<p data-sourcepos="9:1-9:10" dir="auto">To use it:</p>\n<div class="gl-relative markdown-code-block js-markdown-code">\n<pre data-sourcepos="11:1-13:3" data-canonical-lang="js" class="code highlight js-syntax-highlight language-javascript" lang="javascript" v-pre="true"><code><span id="LC1" class="line" lang="javascript"><span class="kd">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span> <span class="c1">// result = 8</span></span></code></pre>\n<copy-code></copy-code>\n</div>\n<p data-sourcepos="15:1-15:95" dir="auto">This function takes two number parameters, a and b. It returns the sum of adding them together.</p>',
24
25
  role: MESSAGE_MODEL_ROLES.assistant,
25
26
  extras: {
26
- sources: MOCK_SOURCES
27
+ sources: MOCK_SOURCES,
28
+ contextItems: getMockContextItems().slice(0, 2)
27
29
  },
28
30
  requestId: '987',
29
31
  errors: [],
@@ -67,7 +69,9 @@ const MOCK_RESPONSE_MESSAGE_FOR_STREAMING = {
67
69
  which is rendered while streaming.
68
70
  `,
69
71
  role: 'assistant',
70
- extras: {},
72
+ extras: {
73
+ contextItems: getMockContextItems().slice(0, 2)
74
+ },
71
75
  requestId: '987',
72
76
  errors: [],
73
77
  timestamp: '2021-04-21T12:00:00.000Z'
@@ -122,7 +126,9 @@ const MOCK_USER_PROMPT_MESSAGE = {
122
126
  requestId: '987',
123
127
  errors: [],
124
128
  timestamp: '2021-04-21T12:00:00.000Z',
125
- extras: null
129
+ extras: {
130
+ contextItems: getMockContextItems().slice(0, 2)
131
+ }
126
132
  };
127
133
  const renderMarkdown = content => content;
128
134
  const renderGFM = el => {
package/dist/tailwind.css CHANGED
@@ -1,2 +1,2 @@
1
- *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.gl-border{border-color:var(--gray-100,#dcdcde);border-style:solid}.gl-border-t{border-top-color:var(--gray-100,#dcdcde);border-top-style:solid}.gl-border-b{border-bottom-color:var(--gray-100,#dcdcde);border-bottom-style:solid}.gl-border-l{border-left-color:var(--gray-100,#dcdcde);border-left-style:solid}.gl-sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.gl-pointer-events-none{pointer-events:none}.gl-pointer-events-auto{pointer-events:auto}.gl-invisible{visibility:hidden}.gl-collapse{visibility:collapse}.gl-fixed{position:fixed}.\!gl-absolute{position:absolute!important}.gl-absolute{position:absolute}.gl-relative{position:relative}.gl-bottom-0{bottom:0}.gl-bottom-2{bottom:.25rem}.gl-left-0{left:0}.gl-right-2{right:.25rem}.\!gl-z-9999{z-index:9999!important}.gl-z-200{z-index:200}.gl-float-right{float:right}.\!gl-m-0{margin:0!important}.gl-m-0{margin:0}.gl-m-7{margin:2rem}.gl-m-auto{margin:auto}.\!gl-mx-2{margin-left:.25rem!important;margin-right:.25rem!important}.-gl-mx-1{margin-left:-.125rem;margin-right:-.125rem}.-gl-mx-4{margin-left:-.75rem;margin-right:-.75rem}.-gl-my-1{margin-bottom:-.125rem;margin-top:-.125rem}.-gl-my-3{margin-bottom:-.5rem;margin-top:-.5rem}.gl-mx-2{margin-left:.25rem;margin-right:.25rem}.gl-mx-4{margin-left:.75rem;margin-right:.75rem}.gl-mx-auto{margin-left:auto;margin-right:auto}.gl-my-0{margin-bottom:0;margin-top:0}.gl-my-3{margin-bottom:.5rem;margin-top:.5rem}.gl-my-5{margin-bottom:1rem;margin-top:1rem}.\!gl-mt-2{margin-top:.25rem!important}.-gl-ml-2{margin-left:-.25rem}.-gl-mr-3{margin-right:-.5rem}.-gl-mt-2{margin-top:-.25rem}.gl-mb-0{margin-bottom:0}.gl-mb-2{margin-bottom:.25rem}.gl-mb-3{margin-bottom:.5rem}.gl-mb-4{margin-bottom:.75rem}.gl-mb-5{margin-bottom:1rem}.gl-mb-8{margin-bottom:2.5rem}.gl-ml-2{margin-left:.25rem}.gl-ml-3{margin-left:.5rem}.gl-ml-5{margin-left:1rem}.gl-ml-6{margin-left:1.5rem}.gl-ml-7{margin-left:2rem}.gl-ml-auto{margin-left:auto}.gl-mr-1{margin-right:.125rem}.gl-mr-2{margin-right:.25rem}.gl-mr-3{margin-right:.5rem}.gl-mr-4{margin-right:.75rem}.gl-mr-auto{margin-right:auto}.gl-mt-0{margin-top:0}.gl-mt-2{margin-top:.25rem}.gl-mt-3{margin-top:.5rem}.gl-mt-4{margin-top:.75rem}.gl-mt-5{margin-top:1rem}.\!gl-block{display:block!important}.gl-block{display:block}.gl-inline-block{display:inline-block}.\!gl-flex{display:flex!important}.gl-flex{display:flex}.gl-inline-flex{display:inline-flex}.gl-table{display:table}.\!gl-hidden{display:none!important}.gl-hidden{display:none}.\!gl-h-full{height:100%!important}.gl-h-0{height:0}.gl-h-11{height:4rem}.gl-h-13{height:6rem}.gl-h-5{height:1rem}.gl-h-auto{height:auto}.gl-h-full{height:100%}.gl-max-h-full{max-height:100%}.gl-min-h-8{min-height:2.5rem}.\!gl-w-31{width:15.5rem!important}.\!gl-w-auto{width:auto!important}.gl-w-1\/2{width:50%}.gl-w-10{width:3.5rem}.gl-w-20{width:10rem}.gl-w-30{width:15rem}.gl-w-4\/10{width:40%}.gl-w-5{width:1rem}.gl-w-full{width:100%}.gl-max-w-1\/2{max-width:50%}.gl-max-w-75{max-width:37.5rem}.gl-max-w-full{max-width:100%}.gl-flex-shrink-0{flex-shrink:0}.gl-flex-grow,.gl-grow{flex-grow:1}.gl-basis-0{flex-basis:0}.-gl-translate-y-full{--tw-translate-y:-100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\!gl-cursor-not-allowed{cursor:not-allowed!important}.\!gl-cursor-text{cursor:text!important}.gl-cursor-default{cursor:default}.gl-cursor-pointer{cursor:pointer}.gl-cursor-text{cursor:text}.gl-list-none{list-style-type:none}.gl-flex-row{flex-direction:row}.gl-flex-col{flex-direction:column}.gl-flex-wrap{flex-wrap:wrap}.gl-flex-nowrap{flex-wrap:nowrap}.gl-items-start{align-items:flex-start}.gl-items-end{align-items:flex-end}.gl-items-center{align-items:center}.gl-items-baseline{align-items:baseline}.\!gl-justify-start{justify-content:flex-start!important}.gl-justify-start{justify-content:flex-start}.gl-justify-end{justify-content:flex-end}.gl-justify-center{justify-content:center}.gl-justify-between{justify-content:space-between}.gl-gap-2{gap:.25rem}.gl-gap-3{gap:.5rem}.gl-gap-4{gap:.75rem}.gl-gap-5{gap:1rem}.gl-gap-6{gap:1.5rem}.gl-gap-x-3{column-gap:.5rem}.gl-self-start{align-self:flex-start}.gl-overflow-hidden{overflow:hidden}.gl-overflow-visible{overflow:visible}.gl-overflow-y-auto{overflow-y:auto}.gl-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\!gl-text-ellipsis{text-overflow:ellipsis!important}.gl-text-ellipsis{text-overflow:ellipsis}.\!gl-whitespace-normal{white-space:normal!important}.gl-whitespace-normal{white-space:normal}.gl-whitespace-nowrap{white-space:nowrap}.gl-whitespace-pre-line{white-space:pre-line}.\!gl-rounded-base{border-radius:.25rem!important}.\!gl-rounded-none{border-radius:0!important}.gl-rounded-base{border-radius:.25rem}.gl-rounded-full{border-radius:50%}.gl-rounded-lg{border-radius:.5rem}.gl-rounded-bl-none{border-bottom-left-radius:0}.gl-rounded-br-none{border-bottom-right-radius:0}.gl-rounded-tr-none{border-top-right-radius:0}.gl-border,.gl-border-1{border-width:1px}.\!gl-border-b-0{border-bottom-width:0!important}.gl-border-b{border-bottom-width:1px}.gl-border-b-0{border-bottom-width:0}.gl-border-b-1{border-bottom-width:1px}.gl-border-l{border-left-width:1px}.gl-border-t,.gl-border-t-1{border-top-width:1px}.gl-border-solid{border-style:solid}.\!gl-border-none{border-style:none!important}.gl-border-none{border-style:none}.gl-border-gray-200{border-color:var(--gray-200,#bfbfc3)}.gl-border-gray-50{border-color:var(--gray-50,#ececef)}.gl-border-red-500{border-color:var(--red-500,#dd2b0e)}.gl-border-b-gray-200{border-bottom-color:var(--gray-200,#bfbfc3)}.gl-border-t-gray-200{border-top-color:var(--gray-200,#bfbfc3)}.\!gl-bg-data-viz-green-700{background-color:var(--data-viz-green-700,#366800)!important}.\!gl-bg-data-viz-magenta-950{background-color:var(--data-viz-magenta-950,#541d31)!important}.\!gl-bg-gray-10{background-color:var(--gray-10,#fbfafd)!important}.\!gl-bg-transparent{background-color:initial!important}.gl-bg-blue-100{background-color:var(--blue-100,#cbe2f9)}.gl-bg-data-viz-blue-500{background-color:var(--data-viz-blue-500,#617ae2)}.gl-bg-gray-10{background-color:var(--gray-10,#fbfafd)}.gl-bg-gray-50{background-color:var(--gray-50,#ececef)}.gl-bg-gray-900{background-color:var(--gray-900,#28272d)}.gl-bg-gray-950{background-color:var(--gray-950,#18171d)}.gl-bg-green-100{background-color:var(--green-100,#c3e6cd)}.gl-bg-purple-50{background-color:var(--purple-50,#f4f0ff)}.gl-bg-red-100{background-color:var(--red-100,#fdd4cd)}.gl-bg-red-50{background-color:var(--red-50,#fcf1ef)}.gl-bg-transparent{background-color:initial}.gl-bg-white{background-color:var(--white,#fff)}.gl-fill-current{fill:currentColor}.gl-fill-gray-100{fill:var(--gray-100,#dcdcde)}.gl-fill-icon-danger{fill:var(--gl-icon-color-danger,var(--gl-color-red-600,#c91c00))}.gl-fill-icon-default{fill:var(--gl-icon-color-default,var(--gl-color-neutral-700,#4c4b51))}.gl-fill-icon-disabled{fill:var(--gl-icon-color-disabled,var(--gl-color-neutral-300,#a4a3a8))}.gl-fill-icon-info{fill:var(--gl-icon-color-info,var(--gl-color-blue-600,#1068bf))}.gl-fill-icon-link{fill:var(--gl-icon-color-link,var(--gl-color-blue-600,#1068bf))}.gl-fill-icon-strong{fill:var(--gl-icon-color-strong,var(--gl-color-neutral-900,#28272d))}.gl-fill-icon-subtle{fill:var(--gl-icon-color-subtle,var(--gl-color-neutral-500,#737278))}.gl-fill-icon-success{fill:var(--gl-icon-color-success,var(--gl-color-green-600,#217645))}.gl-fill-icon-warning{fill:var(--gl-icon-color-warning,var(--gl-color-orange-600,#9e5400))}.\!gl-p-0{padding:0!important}.\!gl-p-2{padding:.25rem!important}.\!gl-p-4{padding:.75rem!important}.gl-p-0{padding:0}.gl-p-1{padding:.125rem}.gl-p-2{padding:.25rem}.gl-p-3{padding:.5rem}.gl-p-4{padding:.75rem}.gl-p-5{padding:1rem}.gl-p-7{padding:2rem}.\!gl-px-2{padding-left:.25rem!important;padding-right:.25rem!important}.\!gl-px-3{padding-left:.5rem!important;padding-right:.5rem!important}.\!gl-py-2{padding-bottom:.25rem!important;padding-top:.25rem!important}.\!gl-py-4{padding-bottom:.75rem!important;padding-top:.75rem!important}.gl-px-1{padding-left:.125rem;padding-right:.125rem}.gl-px-2{padding-left:.25rem;padding-right:.25rem}.gl-px-4{padding-left:.75rem;padding-right:.75rem}.gl-px-5{padding-left:1rem;padding-right:1rem}.gl-py-2{padding-bottom:.25rem;padding-top:.25rem}.gl-py-3{padding-bottom:.5rem;padding-top:.5rem}.gl-py-6{padding-bottom:1.5rem;padding-top:1.5rem}.\!gl-pl-9{padding-left:3rem!important}.\!gl-pr-7{padding-right:2rem!important}.\!gl-pr-9{padding-right:3rem!important}.\!gl-pt-0{padding-top:0!important}.gl-pb-2{padding-bottom:.25rem}.gl-pl-0{padding-left:0}.gl-pl-2{padding-left:.25rem}.gl-pl-3{padding-left:.5rem}.gl-pl-4{padding-left:.75rem}.gl-pl-5{padding-left:1rem}.gl-pl-6{padding-left:1.5rem}.gl-pl-7{padding-left:2rem}.gl-pr-2{padding-right:.25rem}.gl-pr-5{padding-right:1rem}.gl-pr-6{padding-right:1.5rem}.gl-pr-8{padding-right:2.5rem}.gl-pt-1{padding-top:.125rem}.gl-pt-2{padding-top:.25rem}.gl-pt-3{padding-top:.5rem}.gl-pt-4{padding-top:.75rem}.\!gl-text-left{text-align:left!important}.gl-text-left{text-align:left}.gl-text-center{text-align:center}.gl-text-right{text-align:right}.gl-align-top{vertical-align:top}.gl-align-bottom{vertical-align:bottom}.\!gl-align-text-bottom{vertical-align:text-bottom!important}.gl-font-regular{font-family:var(--default-regular-font,"GitLab Sans"),-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans",Ubuntu,Cantarell,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.\!gl-text-sm{font-size:.75rem!important}.gl-text-base{font-size:.875rem}.gl-text-lg{font-size:1rem}.gl-text-size-h-display{font-size:1.75rem}.gl-text-size-h2{font-size:1.1875rem}.gl-text-sm{font-size:.75rem}.gl-text-xs{font-size:.625rem}.gl-font-bold{font-weight:600}.gl-font-normal{font-weight:400}.gl-italic{font-style:italic}.gl-leading-1{line-height:1}.gl-leading-20{line-height:1.25rem}.gl-leading-36{line-height:2.25rem}.gl-leading-normal{line-height:1rem}.\!gl-text-gray-500{color:var(--gray-500,#737278)!important}.\!gl-text-red-500{color:var(--red-500,#dd2b0e)!important}.\!gl-text-white{color:var(--white,#fff)!important}.gl-text-blue-100{color:var(--blue-100,#cbe2f9)}.gl-text-blue-500{color:var(--blue-500,#1f75cb)}.gl-text-blue-900{color:var(--blue-900,#033464)}.gl-text-danger{color:var(--gl-text-color-danger,var(--gl-color-red-600,#c91c00))}.gl-text-gray-400{color:var(--gray-400,#89888d)}.gl-text-gray-500{color:var(--gray-500,#737278)}.gl-text-gray-600{color:var(--gray-600,#626168)}.gl-text-gray-700{color:var(--gray-700,#4c4b51)}.gl-text-gray-900{color:var(--gray-900,#28272d)}.gl-text-gray-950{color:var(--gray-950,#18171d)}.gl-text-green-500{color:var(--green-500,#108548)}.gl-text-green-600{color:var(--green-600,#217645)}.gl-text-inherit{color:inherit}.gl-text-orange-500{color:var(--orange-500,#ab6100)}.gl-text-red-300{color:var(--red-300,#f57f6c)}.gl-text-red-500{color:var(--red-500,#dd2b0e)}.gl-text-red-600{color:var(--red-600,#c91c00)}.gl-text-secondary{color:var(--gl-text-secondary,#737278)}.gl-text-strong{color:var(--gl-text-color-strong,var(--gl-color-neutral-950,#18171d))}.gl-text-subtle{color:var(--gl-text-color-subtle,var(--gl-color-neutral-600,#626168))}.gl-text-white{color:var(--white,#fff)}.\!gl-opacity-0{opacity:0!important}.gl-opacity-10{opacity:1}.\!gl-shadow-inner-1-gray-100{--tw-shadow:inset 0 0 0 1px var(--gray-100,#dcdcde)!important;--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)!important}.\!gl-shadow-inner-1-gray-100,.\!gl-shadow-inner-1-gray-400{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.\!gl-shadow-inner-1-gray-400{--tw-shadow:inset 0 0 0 1px var(--gray-400,#89888d)!important;--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)!important}.\!gl-shadow-inner-1-red-500{--tw-shadow:inset 0 0 0 1px var(--red-500,#dd2b0e)!important;--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)!important}.\!gl-shadow-inner-1-red-500,.\!gl-shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.\!gl-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.gl-shadow-inner-1-gray-400{--tw-shadow:inset 0 0 0 1px var(--gray-400,#89888d);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)}.gl-shadow-inner-1-gray-400,.gl-shadow-inner-1-red-300{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.gl-shadow-inner-1-red-300{--tw-shadow:inset 0 0 0 1px var(--red-300,#f57f6c);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)}.gl-shadow-inner-1-red-500{--tw-shadow:inset 0 0 0 1px var(--red-500,#dd2b0e);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)}.gl-shadow-inner-1-red-500,.gl-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.gl-shadow-md{--tw-shadow:0 2px 8px var(--gl-shadow-color-default,#05050629),0 0 2px var(--gl-shadow-color-default,#05050629);--tw-shadow-colored:0 2px 8px var(--tw-shadow-color),0 0 2px var(--tw-shadow-color)}.gl-shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.gl-outline-none{outline:2px solid #0000;outline-offset:2px}.gl-transition-all{transition-duration:.2s;transition-property:all;transition-timing-function:ease}.gl-font-monospace{font-family:var(--default-mono-font,"GitLab Mono"),"JetBrains Mono","Menlo","DejaVu Sans Mono","Liberation Mono","Consolas","Ubuntu Mono","Courier New","andale mono","lucida console",monospace;font-variant-ligatures:none}.gl-break-anywhere{overflow-wrap:anywhere;word-break:normal}.gl-border-b-solid{border-bottom-style:solid}.gl-border-t-solid{border-top-style:solid}.hover\:\!gl-cursor-not-allowed:hover{cursor:not-allowed!important}.hover\:gl-cursor-pointer:hover{cursor:pointer}.focus\:\!gl-shadow-inner-2-blue-400:focus{--tw-shadow:inset 0 0 0 2px var(--blue-400,#428fdc)!important;--tw-shadow-colored:inset 0 0 0 2px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}@media (min-width:576px){.sm\:gl-block{display:block}.sm\:\!gl-hidden{display:none!important}.sm\:gl-flex-nowrap{flex-wrap:nowrap}.sm\:gl-gap-3{gap:.5rem}}
1
+ *,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::-webkit-backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.gl-border{border-color:var(--gray-100,#dcdcde);border-style:solid}.gl-border-t{border-top-color:var(--gray-100,#dcdcde);border-top-style:solid}.gl-border-b{border-bottom-color:var(--gray-100,#dcdcde);border-bottom-style:solid}.gl-border-l{border-left-color:var(--gray-100,#dcdcde);border-left-style:solid}.gl-sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.gl-pointer-events-none{pointer-events:none}.gl-pointer-events-auto{pointer-events:auto}.gl-invisible{visibility:hidden}.gl-collapse{visibility:collapse}.gl-fixed{position:fixed}.\!gl-absolute{position:absolute!important}.gl-absolute{position:absolute}.gl-relative{position:relative}.gl-bottom-0{bottom:0}.gl-bottom-2{bottom:.25rem}.gl-left-0{left:0}.gl-right-2{right:.25rem}.\!gl-z-9999{z-index:9999!important}.gl-z-200{z-index:200}.gl-float-right{float:right}.\!gl-m-0{margin:0!important}.gl-m-0{margin:0}.gl-m-7{margin:2rem}.gl-m-auto{margin:auto}.\!gl-mx-2{margin-left:.25rem!important;margin-right:.25rem!important}.-gl-mx-1{margin-left:-.125rem;margin-right:-.125rem}.-gl-mx-4{margin-left:-.75rem;margin-right:-.75rem}.-gl-my-1{margin-bottom:-.125rem;margin-top:-.125rem}.-gl-my-3{margin-bottom:-.5rem;margin-top:-.5rem}.gl-mx-2{margin-left:.25rem;margin-right:.25rem}.gl-mx-4{margin-left:.75rem;margin-right:.75rem}.gl-mx-auto{margin-left:auto;margin-right:auto}.gl-my-0{margin-bottom:0;margin-top:0}.gl-my-3{margin-bottom:.5rem;margin-top:.5rem}.gl-my-5{margin-bottom:1rem;margin-top:1rem}.\!gl-mt-2{margin-top:.25rem!important}.-gl-ml-2{margin-left:-.25rem}.-gl-mr-3{margin-right:-.5rem}.-gl-mt-2{margin-top:-.25rem}.gl-mb-0{margin-bottom:0}.gl-mb-2{margin-bottom:.25rem}.gl-mb-3{margin-bottom:.5rem}.gl-mb-4{margin-bottom:.75rem}.gl-mb-5{margin-bottom:1rem}.gl-mb-8{margin-bottom:2.5rem}.gl-ml-2{margin-left:.25rem}.gl-ml-3{margin-left:.5rem}.gl-ml-5{margin-left:1rem}.gl-ml-6{margin-left:1.5rem}.gl-ml-7{margin-left:2rem}.gl-ml-auto{margin-left:auto}.gl-mr-1{margin-right:.125rem}.gl-mr-2{margin-right:.25rem}.gl-mr-3{margin-right:.5rem}.gl-mr-4{margin-right:.75rem}.gl-mr-auto{margin-right:auto}.gl-mt-0{margin-top:0}.gl-mt-1{margin-top:.125rem}.gl-mt-2{margin-top:.25rem}.gl-mt-3{margin-top:.5rem}.gl-mt-4{margin-top:.75rem}.gl-mt-5{margin-top:1rem}.\!gl-block{display:block!important}.gl-block{display:block}.gl-inline-block{display:inline-block}.\!gl-flex{display:flex!important}.gl-flex{display:flex}.gl-inline-flex{display:inline-flex}.gl-table{display:table}.\!gl-hidden{display:none!important}.gl-hidden{display:none}.\!gl-h-full{height:100%!important}.gl-h-0{height:0}.gl-h-11{height:4rem}.gl-h-13{height:6rem}.gl-h-5{height:1rem}.gl-h-auto{height:auto}.gl-h-full{height:100%}.gl-max-h-full{max-height:100%}.gl-min-h-8{min-height:2.5rem}.\!gl-w-31{width:15.5rem!important}.\!gl-w-auto{width:auto!important}.gl-w-1\/2{width:50%}.gl-w-10{width:3.5rem}.gl-w-20{width:10rem}.gl-w-30{width:15rem}.gl-w-4\/10{width:40%}.gl-w-5{width:1rem}.gl-w-full{width:100%}.gl-max-w-1\/2{max-width:50%}.gl-max-w-75{max-width:37.5rem}.gl-max-w-full{max-width:100%}.gl-flex-shrink-0{flex-shrink:0}.gl-flex-grow,.gl-grow{flex-grow:1}.gl-basis-0{flex-basis:0}.-gl-translate-y-full{--tw-translate-y:-100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.\!gl-cursor-not-allowed{cursor:not-allowed!important}.\!gl-cursor-text{cursor:text!important}.gl-cursor-default{cursor:default}.gl-cursor-pointer{cursor:pointer}.gl-cursor-text{cursor:text}.gl-list-none{list-style-type:none}.gl-flex-row{flex-direction:row}.gl-flex-col{flex-direction:column}.gl-flex-wrap{flex-wrap:wrap}.gl-flex-nowrap{flex-wrap:nowrap}.gl-items-start{align-items:flex-start}.gl-items-end{align-items:flex-end}.gl-items-center{align-items:center}.gl-items-baseline{align-items:baseline}.\!gl-justify-start{justify-content:flex-start!important}.gl-justify-start{justify-content:flex-start}.gl-justify-end{justify-content:flex-end}.gl-justify-center{justify-content:center}.gl-justify-between{justify-content:space-between}.gl-gap-2{gap:.25rem}.gl-gap-3{gap:.5rem}.gl-gap-4{gap:.75rem}.gl-gap-5{gap:1rem}.gl-gap-6{gap:1.5rem}.gl-gap-x-3{column-gap:.5rem}.gl-self-start{align-self:flex-start}.gl-overflow-hidden{overflow:hidden}.gl-overflow-visible{overflow:visible}.gl-overflow-y-auto{overflow-y:auto}.gl-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\!gl-text-ellipsis{text-overflow:ellipsis!important}.gl-text-ellipsis{text-overflow:ellipsis}.\!gl-whitespace-normal{white-space:normal!important}.gl-whitespace-normal{white-space:normal}.gl-whitespace-nowrap{white-space:nowrap}.gl-whitespace-pre-line{white-space:pre-line}.\!gl-rounded-base{border-radius:.25rem!important}.\!gl-rounded-none{border-radius:0!important}.gl-rounded-base{border-radius:.25rem}.gl-rounded-full{border-radius:50%}.gl-rounded-lg{border-radius:.5rem}.gl-rounded-bl-none{border-bottom-left-radius:0}.gl-rounded-br-none{border-bottom-right-radius:0}.gl-rounded-tr-none{border-top-right-radius:0}.gl-border{border-width:1px}.gl-border-0{border-width:0}.gl-border-1{border-width:1px}.\!gl-border-b-0{border-bottom-width:0!important}.gl-border-b{border-bottom-width:1px}.gl-border-b-0{border-bottom-width:0}.gl-border-b-1{border-bottom-width:1px}.gl-border-l{border-left-width:1px}.gl-border-t,.gl-border-t-1{border-top-width:1px}.gl-border-solid{border-style:solid}.\!gl-border-none{border-style:none!important}.gl-border-none{border-style:none}.gl-border-gray-200{border-color:var(--gray-200,#bfbfc3)}.gl-border-gray-50{border-color:var(--gray-50,#ececef)}.gl-border-red-500{border-color:var(--red-500,#dd2b0e)}.gl-border-b-gray-200{border-bottom-color:var(--gray-200,#bfbfc3)}.gl-border-t-gray-200{border-top-color:var(--gray-200,#bfbfc3)}.\!gl-bg-data-viz-green-700{background-color:var(--data-viz-green-700,#366800)!important}.\!gl-bg-data-viz-magenta-950{background-color:var(--data-viz-magenta-950,#541d31)!important}.\!gl-bg-gray-10{background-color:var(--gray-10,#fbfafd)!important}.\!gl-bg-transparent{background-color:initial!important}.gl-bg-blue-100{background-color:var(--blue-100,#cbe2f9)}.gl-bg-data-viz-blue-500{background-color:var(--data-viz-blue-500,#617ae2)}.gl-bg-gray-10{background-color:var(--gray-10,#fbfafd)}.gl-bg-gray-50{background-color:var(--gray-50,#ececef)}.gl-bg-gray-900{background-color:var(--gray-900,#28272d)}.gl-bg-gray-950{background-color:var(--gray-950,#18171d)}.gl-bg-green-100{background-color:var(--green-100,#c3e6cd)}.gl-bg-purple-50{background-color:var(--purple-50,#f4f0ff)}.gl-bg-red-100{background-color:var(--red-100,#fdd4cd)}.gl-bg-red-50{background-color:var(--red-50,#fcf1ef)}.gl-bg-transparent{background-color:initial}.gl-bg-white{background-color:var(--white,#fff)}.gl-fill-current{fill:currentColor}.gl-fill-gray-100{fill:var(--gray-100,#dcdcde)}.gl-fill-icon-danger{fill:var(--gl-icon-color-danger,var(--gl-color-red-600,#c91c00))}.gl-fill-icon-default{fill:var(--gl-icon-color-default,var(--gl-color-neutral-700,#4c4b51))}.gl-fill-icon-disabled{fill:var(--gl-icon-color-disabled,var(--gl-color-neutral-300,#a4a3a8))}.gl-fill-icon-info{fill:var(--gl-icon-color-info,var(--gl-color-blue-600,#1068bf))}.gl-fill-icon-link{fill:var(--gl-icon-color-link,var(--gl-color-blue-600,#1068bf))}.gl-fill-icon-strong{fill:var(--gl-icon-color-strong,var(--gl-color-neutral-900,#28272d))}.gl-fill-icon-subtle{fill:var(--gl-icon-color-subtle,var(--gl-color-neutral-500,#737278))}.gl-fill-icon-success{fill:var(--gl-icon-color-success,var(--gl-color-green-600,#217645))}.gl-fill-icon-warning{fill:var(--gl-icon-color-warning,var(--gl-color-orange-600,#9e5400))}.\!gl-p-0{padding:0!important}.\!gl-p-2{padding:.25rem!important}.\!gl-p-4{padding:.75rem!important}.gl-p-0{padding:0}.gl-p-1{padding:.125rem}.gl-p-2{padding:.25rem}.gl-p-3{padding:.5rem}.gl-p-4{padding:.75rem}.gl-p-5{padding:1rem}.gl-p-7{padding:2rem}.\!gl-px-2{padding-left:.25rem!important;padding-right:.25rem!important}.\!gl-px-3{padding-left:.5rem!important;padding-right:.5rem!important}.\!gl-py-2{padding-bottom:.25rem!important;padding-top:.25rem!important}.\!gl-py-4{padding-bottom:.75rem!important;padding-top:.75rem!important}.gl-px-1{padding-left:.125rem;padding-right:.125rem}.gl-px-2{padding-left:.25rem;padding-right:.25rem}.gl-px-4{padding-left:.75rem;padding-right:.75rem}.gl-px-5{padding-left:1rem;padding-right:1rem}.gl-py-2{padding-bottom:.25rem;padding-top:.25rem}.gl-py-3{padding-bottom:.5rem;padding-top:.5rem}.gl-py-6{padding-bottom:1.5rem;padding-top:1.5rem}.\!gl-pl-9{padding-left:3rem!important}.\!gl-pr-7{padding-right:2rem!important}.\!gl-pr-9{padding-right:3rem!important}.\!gl-pt-0{padding-top:0!important}.gl-pb-2{padding-bottom:.25rem}.gl-pl-0{padding-left:0}.gl-pl-2{padding-left:.25rem}.gl-pl-3{padding-left:.5rem}.gl-pl-4{padding-left:.75rem}.gl-pl-5{padding-left:1rem}.gl-pl-6{padding-left:1.5rem}.gl-pl-7{padding-left:2rem}.gl-pr-2{padding-right:.25rem}.gl-pr-5{padding-right:1rem}.gl-pr-6{padding-right:1.5rem}.gl-pr-8{padding-right:2.5rem}.gl-pt-1{padding-top:.125rem}.gl-pt-2{padding-top:.25rem}.gl-pt-3{padding-top:.5rem}.gl-pt-4{padding-top:.75rem}.\!gl-text-left{text-align:left!important}.gl-text-left{text-align:left}.gl-text-center{text-align:center}.gl-text-right{text-align:right}.gl-align-top{vertical-align:top}.gl-align-bottom{vertical-align:bottom}.\!gl-align-text-bottom{vertical-align:text-bottom!important}.gl-font-regular{font-family:var(--default-regular-font,"GitLab Sans"),-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Noto Sans",Ubuntu,Cantarell,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"}.\!gl-text-sm{font-size:.75rem!important}.gl-text-base{font-size:.875rem}.gl-text-lg{font-size:1rem}.gl-text-size-h-display{font-size:1.75rem}.gl-text-size-h2{font-size:1.1875rem}.gl-text-sm{font-size:.75rem}.gl-text-xs{font-size:.625rem}.gl-font-bold{font-weight:600}.gl-font-normal{font-weight:400}.gl-lowercase{text-transform:lowercase}.gl-italic{font-style:italic}.gl-leading-1{line-height:1}.gl-leading-20{line-height:1.25rem}.gl-leading-36{line-height:2.25rem}.gl-leading-normal{line-height:1rem}.\!gl-text-gray-500{color:var(--gray-500,#737278)!important}.\!gl-text-red-500{color:var(--red-500,#dd2b0e)!important}.\!gl-text-white{color:var(--white,#fff)!important}.gl-text-blue-100{color:var(--blue-100,#cbe2f9)}.gl-text-blue-500{color:var(--blue-500,#1f75cb)}.gl-text-blue-900{color:var(--blue-900,#033464)}.gl-text-danger{color:var(--gl-text-color-danger,var(--gl-color-red-600,#c91c00))}.gl-text-gray-400{color:var(--gray-400,#89888d)}.gl-text-gray-500{color:var(--gray-500,#737278)}.gl-text-gray-600{color:var(--gray-600,#626168)}.gl-text-gray-700{color:var(--gray-700,#4c4b51)}.gl-text-gray-900{color:var(--gray-900,#28272d)}.gl-text-gray-950{color:var(--gray-950,#18171d)}.gl-text-green-500{color:var(--green-500,#108548)}.gl-text-green-600{color:var(--green-600,#217645)}.gl-text-inherit{color:inherit}.gl-text-orange-500{color:var(--orange-500,#ab6100)}.gl-text-red-300{color:var(--red-300,#f57f6c)}.gl-text-red-500{color:var(--red-500,#dd2b0e)}.gl-text-red-600{color:var(--red-600,#c91c00)}.gl-text-secondary{color:var(--gl-text-secondary,#737278)}.gl-text-strong{color:var(--gl-text-color-strong,var(--gl-color-neutral-950,#18171d))}.gl-text-subtle{color:var(--gl-text-color-subtle,var(--gl-color-neutral-600,#626168))}.gl-text-white{color:var(--white,#fff)}.\!gl-opacity-0{opacity:0!important}.gl-opacity-10{opacity:1}.\!gl-shadow-inner-1-gray-100{--tw-shadow:inset 0 0 0 1px var(--gray-100,#dcdcde)!important;--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)!important}.\!gl-shadow-inner-1-gray-100,.\!gl-shadow-inner-1-gray-400{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.\!gl-shadow-inner-1-gray-400{--tw-shadow:inset 0 0 0 1px var(--gray-400,#89888d)!important;--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)!important}.\!gl-shadow-inner-1-red-500{--tw-shadow:inset 0 0 0 1px var(--red-500,#dd2b0e)!important;--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)!important}.\!gl-shadow-inner-1-red-500,.\!gl-shadow-none{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}.\!gl-shadow-none{--tw-shadow:0 0 #0000!important;--tw-shadow-colored:0 0 #0000!important}.gl-shadow-inner-1-gray-400{--tw-shadow:inset 0 0 0 1px var(--gray-400,#89888d);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)}.gl-shadow-inner-1-gray-400,.gl-shadow-inner-1-red-300{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.gl-shadow-inner-1-red-300{--tw-shadow:inset 0 0 0 1px var(--red-300,#f57f6c);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)}.gl-shadow-inner-1-red-500{--tw-shadow:inset 0 0 0 1px var(--red-500,#dd2b0e);--tw-shadow-colored:inset 0 0 0 1px var(--tw-shadow-color)}.gl-shadow-inner-1-red-500,.gl-shadow-md{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.gl-shadow-md{--tw-shadow:0 2px 8px var(--gl-shadow-color-default,#05050629),0 0 2px var(--gl-shadow-color-default,#05050629);--tw-shadow-colored:0 2px 8px var(--tw-shadow-color),0 0 2px var(--tw-shadow-color)}.gl-shadow-none{--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.gl-outline-none{outline:2px solid #0000;outline-offset:2px}.gl-transition-all{transition-duration:.2s;transition-property:all;transition-timing-function:ease}.gl-font-monospace{font-family:var(--default-mono-font,"GitLab Mono"),"JetBrains Mono","Menlo","DejaVu Sans Mono","Liberation Mono","Consolas","Ubuntu Mono","Courier New","andale mono","lucida console",monospace;font-variant-ligatures:none}.gl-break-anywhere{overflow-wrap:anywhere;word-break:normal}.gl-border-b-solid{border-bottom-style:solid}.gl-border-t-solid{border-top-style:solid}.hover\:\!gl-cursor-not-allowed:hover{cursor:not-allowed!important}.hover\:gl-cursor-pointer:hover{cursor:pointer}.focus\:\!gl-shadow-inner-2-blue-400:focus{--tw-shadow:inset 0 0 0 2px var(--blue-400,#428fdc)!important;--tw-shadow-colored:inset 0 0 0 2px var(--tw-shadow-color)!important;box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)!important}@media (min-width:576px){.sm\:gl-block{display:block}.sm\:\!gl-hidden{display:none!important}.sm\:gl-flex-nowrap{flex-wrap:nowrap}.sm\:gl-gap-3{gap:.5rem}}
2
2
  /*# sourceMappingURL=tailwind.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["tailwind.css"],"names":[],"mappings":"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","file":"tailwind.css","sourcesContent":["@tailwind base;\n@tailwind components;\n@tailwind utilities;\n"]}
1
+ {"version":3,"sources":["tailwind.css"],"names":[],"mappings":"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","file":"tailwind.css","sourcesContent":["@tailwind base;\n@tailwind components;\n@tailwind utilities;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/ui",
3
- "version": "91.0.0",
3
+ "version": "91.1.0",
4
4
  "description": "GitLab UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -0,0 +1,3 @@
1
+ export const CONTEXT_ITEM_TYPE_ISSUE = 'issue';
2
+ export const CONTEXT_ITEM_TYPE_MERGE_REQUEST = 'merge_request';
3
+ export const CONTEXT_ITEM_TYPE_PROJECT_FILE = 'project_file';
@@ -0,0 +1,111 @@
1
+ <script>
2
+ import GlPopover from '../../../../../../base/popover/popover.vue';
3
+ import { translate } from '../../../../../../../utils/i18n';
4
+ import {
5
+ CONTEXT_ITEM_TYPE_ISSUE,
6
+ CONTEXT_ITEM_TYPE_MERGE_REQUEST,
7
+ CONTEXT_ITEM_TYPE_PROJECT_FILE,
8
+ } from '../constants';
9
+
10
+ const ID_PREFIXES = {
11
+ issue: '#',
12
+ merge_request: '!',
13
+ };
14
+
15
+ export default {
16
+ name: 'DuoChatContextItemPopover',
17
+ components: {
18
+ GlPopover,
19
+ },
20
+ props: {
21
+ item: {
22
+ type: Object,
23
+ required: true,
24
+ },
25
+ target: {
26
+ type: String,
27
+ required: true,
28
+ },
29
+ placement: {
30
+ type: String,
31
+ default: 'bottom',
32
+ required: false,
33
+ },
34
+ },
35
+ computed: {
36
+ itemInfo() {
37
+ return this.item.metadata?.info || {};
38
+ },
39
+ id() {
40
+ const isIssuable =
41
+ this.item.type === CONTEXT_ITEM_TYPE_ISSUE ||
42
+ this.item.type === CONTEXT_ITEM_TYPE_MERGE_REQUEST;
43
+ return isIssuable ? this.itemInfo.iid || '' : null;
44
+ },
45
+ idPrefix() {
46
+ return ID_PREFIXES[this.item.type] || '';
47
+ },
48
+ filePath() {
49
+ return this.item.type === CONTEXT_ITEM_TYPE_PROJECT_FILE
50
+ ? this.itemInfo.relFilePath || ''
51
+ : null;
52
+ },
53
+ isEnabled() {
54
+ return this.item.isEnabled !== false;
55
+ },
56
+ disabledMessage() {
57
+ return Array.isArray(this.item.disabledReasons) && this.item.disabledReasons.length > 0
58
+ ? this.item.disabledReasons.join(', ')
59
+ : translate('DuoChatContextItemPopover.DisabledReason', 'This item is disabled');
60
+ },
61
+ },
62
+ methods: {
63
+ translate,
64
+ },
65
+ };
66
+ </script>
67
+ <template>
68
+ <gl-popover
69
+ :target="target"
70
+ triggers="hover focus"
71
+ :placement="placement"
72
+ :title="item.metadata.name"
73
+ custom-class="gl-duo-chat-item-popover"
74
+ >
75
+ <template #title>
76
+ <span class="gl-text-sm gl-text-gray-500" data-testid="chat-context-popover-title">{{
77
+ item.metadata.name
78
+ }}</span>
79
+ </template>
80
+ <div class="gl-p-3">
81
+ <div class="gl-mb-2">
82
+ <strong class="gl-mr-1">{{
83
+ translate('DuoChatContextItemPopover.ProjectLabel', 'Project:')
84
+ }}</strong>
85
+ <span>{{ itemInfo.project }}</span>
86
+ </div>
87
+ <div v-if="filePath !== null" class="gl-mb-2">
88
+ <strong class="gl-mr-1">{{
89
+ translate('DuoChatContextItemPopover.PathLabel', 'Path:')
90
+ }}</strong>
91
+ <span>{{ filePath }}</span>
92
+ </div>
93
+ <div v-if="id !== null" class="gl-mb-2">
94
+ <strong class="gl-mr-1">{{ translate('DuoChatContextItemPopover.IdLabel', 'ID:') }}</strong>
95
+ <span>{{ idPrefix }}{{ id }}</span>
96
+ </div>
97
+ <div class="gl-mb-2">
98
+ <strong class="gl-mr-1">{{
99
+ translate('DuoChatContextItemPopover.TypeLabel', 'Type:')
100
+ }}</strong>
101
+ <span>{{ item.type }}</span>
102
+ </div>
103
+ <div v-if="!isEnabled" class="gl-text-red-500" data-testid="chat-context-popover-disabled">
104
+ <strong class="gl-mr-1">{{
105
+ translate('DuoChatContextItemPopover.DisabledMessageLabel', 'Note:')
106
+ }}</strong>
107
+ <span>{{ disabledMessage }}</span>
108
+ </div>
109
+ </div>
110
+ </gl-popover>
111
+ </template>
@@ -0,0 +1,94 @@
1
+ <script>
2
+ import uniqueId from 'lodash/uniqueId';
3
+ import GlIcon from '../../../../../../base/icon/icon.vue';
4
+ import GlToken from '../../../../../../base/token/token.vue';
5
+ import GlDuoChatContextItemPopover from '../duo_chat_context_item_popover/duo_chat_context_item_popover.vue';
6
+ import {
7
+ CONTEXT_ITEM_TYPE_ISSUE,
8
+ CONTEXT_ITEM_TYPE_MERGE_REQUEST,
9
+ CONTEXT_ITEM_TYPE_PROJECT_FILE,
10
+ } from '../constants';
11
+
12
+ export default {
13
+ name: 'GlDuoChatContextItemSelections',
14
+ components: {
15
+ GlIcon,
16
+ GlDuoChatContextItemPopover,
17
+ GlToken,
18
+ },
19
+ props: {
20
+ selections: {
21
+ type: Array,
22
+ required: true,
23
+ },
24
+ title: {
25
+ type: String,
26
+ required: true,
27
+ },
28
+ defaultCollapsed: {
29
+ type: Boolean,
30
+ required: true,
31
+ },
32
+ },
33
+ data() {
34
+ return {
35
+ isCollapsed: this.defaultCollapsed,
36
+ selectionsId: uniqueId(),
37
+ };
38
+ },
39
+ computed: {
40
+ collapseIconName() {
41
+ return this.isCollapsed ? 'chevron-right' : 'chevron-down';
42
+ },
43
+ },
44
+ methods: {
45
+ getIconName(type) {
46
+ const iconMap = {
47
+ [CONTEXT_ITEM_TYPE_PROJECT_FILE]: 'document',
48
+ [CONTEXT_ITEM_TYPE_ISSUE]: 'issues',
49
+ [CONTEXT_ITEM_TYPE_MERGE_REQUEST]: 'merge-request',
50
+ };
51
+ return iconMap[type] || 'document';
52
+ },
53
+ toggleCollapse() {
54
+ this.isCollapsed = !this.isCollapsed;
55
+ },
56
+ },
57
+ };
58
+ </script>
59
+
60
+ <template>
61
+ <div class="gl-mb-3 gl-flex gl-flex-col">
62
+ <button
63
+ class="gl-flex gl-w-full gl-items-center gl-border-0 gl-bg-transparent gl-p-0 gl-text-left gl-text-xs gl-lowercase gl-text-gray-500"
64
+ data-testid="chat-context-selections-title"
65
+ @click="toggleCollapse"
66
+ >
67
+ <gl-icon :name="collapseIconName" data-testid="chat-context-collapse-icon" /> {{ title }}
68
+ </button>
69
+
70
+ <div
71
+ v-show="!isCollapsed"
72
+ class="gl-mt-1 gl-flex gl-grow gl-flex-wrap"
73
+ data-testid="chat-context-tokens-wrapper"
74
+ >
75
+ <gl-token
76
+ v-for="item in selections"
77
+ :key="item.id"
78
+ :view-only="true"
79
+ variant="default"
80
+ class="gl-mb-2 gl-mr-2"
81
+ >
82
+ <div :id="`context-item-${item.id}-${selectionsId}`" class="gl-flex gl-items-center">
83
+ <gl-icon :name="getIconName(item.type)" :size="12" class="gl-mr-1" />
84
+ {{ item.metadata.name }}
85
+ </div>
86
+ <gl-duo-chat-context-item-popover
87
+ :item="item"
88
+ :target="`context-item-${item.id}-${selectionsId}`"
89
+ placement="bottom"
90
+ />
91
+ </gl-token>
92
+ </div>
93
+ </div>
94
+ </template>
@@ -0,0 +1,137 @@
1
+ export const MOCK_CONTEXT_ITEM_FILE = {
2
+ id: '123e4567-e89b-12d3-a456-426614174000',
3
+ isEnabled: true,
4
+ metadata: {
5
+ name: 'strawberry.ts',
6
+ info: {
7
+ project: 'example/garden',
8
+ relFilePath: 'src/plants/strawberry.ts',
9
+ },
10
+ },
11
+ type: 'project_file',
12
+ };
13
+
14
+ export const MOCK_CONTEXT_ITEM_FILE_DISABLED = {
15
+ id: '323e4567-e89b-12d3-a456-426614174002',
16
+ isEnabled: false,
17
+ metadata: {
18
+ name: 'motorbike.cs',
19
+ info: {
20
+ project: 'example/vehicles',
21
+ relFilePath: '/src/VehicleFoo/motorbike.cs',
22
+ },
23
+ },
24
+ type: 'project_file',
25
+ };
26
+ const mockFiles = [
27
+ MOCK_CONTEXT_ITEM_FILE,
28
+ {
29
+ id: '223e4567-e89b-12d3-a456-426614174001',
30
+ isEnabled: true,
31
+ metadata: {
32
+ name: 'potato.ts',
33
+ info: {
34
+ project: 'example/garden',
35
+ relFilePath: '/src/plants/potato.ts',
36
+ },
37
+ },
38
+ type: 'project_file',
39
+ },
40
+ MOCK_CONTEXT_ITEM_FILE_DISABLED,
41
+ ];
42
+
43
+ export const MOCK_CONTEXT_ITEM_ISSUE = {
44
+ id: '423e4567-e89b-12d3-a456-426614174003',
45
+ isEnabled: true,
46
+ metadata: {
47
+ name: 'Implement watering schedule',
48
+ info: {
49
+ project: 'example/garden',
50
+ iid: 1234,
51
+ },
52
+ },
53
+ type: 'issue',
54
+ };
55
+ export const MOCK_CONTEXT_ITEM_ISSUE_DISABLED = {
56
+ id: 'c463fb31-2a4c-4f8e-a609-97230ac48ae5',
57
+ isEnabled: false,
58
+ metadata: {
59
+ name: 'Fix vehicle colours',
60
+ info: {
61
+ project: 'example/vehicle',
62
+ iid: 91011,
63
+ },
64
+ },
65
+ disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
66
+ type: 'issue',
67
+ };
68
+
69
+ const mockIssues = [
70
+ MOCK_CONTEXT_ITEM_ISSUE,
71
+ {
72
+ id: '523e4567-e89b-12d3-a456-426614174004',
73
+ isEnabled: true,
74
+ metadata: {
75
+ name: 'Refactor plant growth rates',
76
+ info: {
77
+ project: 'example/garden',
78
+ iid: 5678,
79
+ },
80
+ },
81
+ type: 'issue',
82
+ },
83
+ MOCK_CONTEXT_ITEM_ISSUE_DISABLED,
84
+ ];
85
+
86
+ export const MOCK_CONTEXT_ITEM_MERGE_REQUEST = {
87
+ id: '623e4567-e89b-12d3-a456-426614174005',
88
+ isEnabled: true,
89
+ metadata: {
90
+ name: 'Improve database performance',
91
+ info: {
92
+ project: 'example/garden',
93
+ iid: 1122,
94
+ },
95
+ },
96
+ type: 'merge_request',
97
+ };
98
+ export const MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED = {
99
+ id: '4eb665fc-e5e1-49b0-9789-2a16964e461a',
100
+ isEnabled: false,
101
+ metadata: {
102
+ name: 'Fix broken layout at small viewports',
103
+ info: {
104
+ project: 'example/vehicle',
105
+ iid: 5566,
106
+ },
107
+ },
108
+ disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
109
+ type: 'merge_request',
110
+ };
111
+
112
+ const mockMergeRequests = [
113
+ MOCK_CONTEXT_ITEM_MERGE_REQUEST,
114
+ {
115
+ id: '723e4567-e89b-12d3-a456-426614174006',
116
+ isEnabled: false,
117
+ metadata: {
118
+ name: 'Add vehicle registration details',
119
+ info: {
120
+ project: 'example/vehicle',
121
+ iid: 3344,
122
+ },
123
+ },
124
+ disabledReasons: ['This foo is not available to bar', 'Lorem something something wow?'],
125
+ type: 'merge_request',
126
+ },
127
+ MOCK_CONTEXT_ITEM_MERGE_REQUEST_DISABLED,
128
+ ];
129
+
130
+ export const getMockContextItems = () => {
131
+ const allItems = [...mockFiles, ...mockIssues, ...mockMergeRequests];
132
+
133
+ // put disabled items in the back
134
+ const disabledItems = allItems.filter((item) => !item.isEnabled);
135
+ const enabledItems = allItems.filter((item) => item.isEnabled);
136
+ return [...enabledItems, ...disabledItems];
137
+ };
@@ -62,3 +62,8 @@ The component emits the `track-feedback` event, a proxy of the `feedback` event
62
62
  the `GlDuoUserFeedback` component. Please refer to
63
63
  [the documentation on that component](/story/experimental-duo-user-feedback--docs#listening-to-the-feedback-form-submission)
64
64
  when processing feedback from users.
65
+
66
+ ## Included context references
67
+
68
+ Messages will display any included context references (files, issues merge requests etc.) when
69
+ the message `meta.contextItems` array contains valid items.
@@ -2,10 +2,12 @@
2
2
  import GlIcon from '../../../../../base/icon/icon.vue';
3
3
  import GlLoadingIcon from '../../../../../base/loading_icon/loading_icon.vue';
4
4
  import { GlTooltipDirective } from '../../../../../../directives/tooltip';
5
+ import GlDuoChatContextItemSelections from '../duo_chat_context/duo_chat_context_item_selections/duo_chat_context_item_selections.vue';
5
6
  import GlDuoUserFeedback from '../../../user_feedback/user_feedback.vue';
6
7
  import GlFormGroup from '../../../../../base/form/form_group/form_group.vue';
7
8
  import GlFormTextarea from '../../../../../base/form/form_textarea/form_textarea.vue';
8
9
  import { SafeHtmlDirective as SafeHtml } from '../../../../../../directives/safe_html/safe_html';
10
+ import { sprintf, translatePlural } from '../../../../../../utils/i18n';
9
11
  import { MESSAGE_MODEL_ROLES } from '../../constants';
10
12
  import DocumentationSources from '../duo_chat_message_sources/duo_chat_message_sources.vue';
11
13
  // eslint-disable-next-line no-restricted-imports
@@ -35,6 +37,7 @@ export default {
35
37
  },
36
38
  components: {
37
39
  DocumentationSources,
40
+ GlDuoChatContextItemSelections,
38
41
  GlDuoUserFeedback,
39
42
  GlFormGroup,
40
43
  GlFormTextarea,
@@ -130,6 +133,39 @@ export default {
130
133
  error() {
131
134
  return Boolean(this.message?.errors?.length) && this.message.errors.join('; ');
132
135
  },
136
+ selectedContextItems() {
137
+ return this.message.extras?.contextItems || [];
138
+ },
139
+ displaySelectedContextItems() {
140
+ return Boolean(this.selectedContextItems.length);
141
+ },
142
+ selectedContextItemsDefaultCollapsed() {
143
+ return this.isAssistantMessage;
144
+ },
145
+ selectedContextItemsTitle() {
146
+ if (!this.displaySelectedContextItems) return '';
147
+
148
+ const count = this.selectedContextItems.length;
149
+
150
+ if (this.isUserMessage) {
151
+ return translatePlural(
152
+ 'GlDuoChatMessage.SelectedContextItemsTitleUserMessage',
153
+ 'Included reference',
154
+ 'Included references'
155
+ )(count);
156
+ }
157
+
158
+ return sprintf(
159
+ translatePlural(
160
+ 'GlDuoChatMessage.SelectedContextItemsTitleAssistantMessage',
161
+ 'Used %{count} included reference',
162
+ 'Used %{count} included references'
163
+ )(count),
164
+ {
165
+ count,
166
+ }
167
+ );
168
+ },
133
169
  },
134
170
  beforeCreate() {
135
171
  if (!customElements.get('copy-code')) {
@@ -213,6 +249,13 @@ export default {
213
249
  data-testid="error"
214
250
  />
215
251
  <div ref="content-wrapper" :class="{ 'has-error': error }">
252
+ <gl-duo-chat-context-item-selections
253
+ v-if="displaySelectedContextItems"
254
+ :selections="selectedContextItems"
255
+ :title="selectedContextItemsTitle"
256
+ :default-collapsed="selectedContextItemsDefaultCollapsed"
257
+ class="gl-mb-3"
258
+ />
216
259
  <div
217
260
  v-if="error"
218
261
  ref="error-message"
@@ -6,6 +6,7 @@ import {
6
6
  CHAT_RESET_MESSAGE,
7
7
  CHAT_CLEAN_MESSAGE,
8
8
  } from './constants';
9
+ import { getMockContextItems } from './components/duo_chat_context/mock_context_data';
9
10
 
10
11
  const MOCK_SOURCES = [
11
12
  {
@@ -36,6 +37,7 @@ export const MOCK_RESPONSE_MESSAGE = {
36
37
  role: MESSAGE_MODEL_ROLES.assistant,
37
38
  extras: {
38
39
  sources: MOCK_SOURCES,
40
+ contextItems: getMockContextItems().slice(0, 2),
39
41
  },
40
42
  requestId: '987',
41
43
  errors: [],
@@ -81,7 +83,9 @@ export const MOCK_RESPONSE_MESSAGE_FOR_STREAMING = {
81
83
  which is rendered while streaming.
82
84
  `,
83
85
  role: 'assistant',
84
- extras: {},
86
+ extras: {
87
+ contextItems: getMockContextItems().slice(0, 2),
88
+ },
85
89
  requestId: '987',
86
90
  errors: [],
87
91
  timestamp: '2021-04-21T12:00:00.000Z',
@@ -130,7 +134,9 @@ export const MOCK_USER_PROMPT_MESSAGE = {
130
134
  requestId: '987',
131
135
  errors: [],
132
136
  timestamp: '2021-04-21T12:00:00.000Z',
133
- extras: null,
137
+ extras: {
138
+ contextItems: getMockContextItems().slice(0, 2),
139
+ },
134
140
  };
135
141
 
136
142
  export const renderMarkdown = (content) => content;
package/translations.js CHANGED
@@ -1,8 +1,11 @@
1
1
  /* eslint-disable import/no-default-export */
2
2
  export default {
3
3
  'ClearIconButton.title': 'Clear',
4
+ 'DuoChatContextItemPopover.DisabledReason': 'This item is disabled',
4
5
  'GlBreadcrumb.showMoreLabel': 'Show more breadcrumbs',
5
6
  'GlCollapsibleListbox.srOnlyResultsLabel': null,
7
+ 'GlDuoChatMessage.SelectedContextItemsTitleAssistantMessage': null,
8
+ 'GlDuoChatMessage.SelectedContextItemsTitleUserMessage': null,
6
9
  'GlDuoWorkflowPanel.collapseButtonTitle': 'Collapse',
7
10
  'GlDuoWorkflowPanel.expandButtonTitle': 'Expand',
8
11
  'GlDuoWorkflowPrompt.cancelButtonText': 'Cancel',