@gitlab/duo-ui 10.11.0 → 10.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ # [10.12.0](https://gitlab.com/gitlab-org/duo-ui/compare/v10.11.0...v10.12.0) (2025-07-22)
2
+
3
+
4
+ ### Features
5
+
6
+ * introduce support for the agentic chat history ([f95b16f](https://gitlab.com/gitlab-org/duo-ui/commit/f95b16f9c09570a0b81939339da2776814c54bf5))
7
+
1
8
  # [10.11.0](https://gitlab.com/gitlab-org/duo-ui/compare/v10.10.0...v10.11.0) (2025-07-21)
2
9
 
3
10
 
@@ -29,7 +29,7 @@ const isSlashCommand = command => Boolean(command) && (command === null || comma
29
29
  const itemsValidator = items => items.every(isMessage);
30
30
  // eslint-disable-next-line unicorn/no-array-callback-reference
31
31
  const slashCommandsValidator = commands => commands.every(isSlashCommand);
32
- const isThread = thread => typeof thread === 'object' && typeof thread.id === 'string' && typeof thread.lastUpdatedAt === 'string' && typeof thread.createdAt === 'string' && typeof thread.conversationType === 'string' && (thread.title === null || typeof thread.title === 'string');
32
+ const isThread = thread => typeof thread === 'object' && typeof thread.id === 'string' && typeof thread.lastUpdatedAt === 'string' || typeof thread.updatedAt === 'string' && (thread.title === null || typeof thread.title === 'string' || typeof thread.goal === 'string');
33
33
 
34
34
  // eslint-disable-next-line unicorn/no-array-callback-reference
35
35
  const threadListValidator = threads => threads.every(isThread);
@@ -30,8 +30,9 @@ var script = {
30
30
  if (!this.hasThreads) {
31
31
  return {};
32
32
  }
33
- return this.threads.slice().sort((a, b) => this.compareThreadDates(b.lastUpdatedAt, a.lastUpdatedAt)).reduce((grouped, thread) => {
34
- const dateKey = this.getDateKey(thread.lastUpdatedAt);
33
+ return this.threads.slice().sort((a, b) => this.compareThreadDates(b.updatedAt, a.updatedAt)).sort((a, b) => this.compareThreadDates(b.lastUpdatedAt, a.lastUpdatedAt)).reduce((grouped, thread) => {
34
+ const dateField = thread.updatedAt || thread.lastUpdatedAt;
35
+ const dateKey = this.getDateKey(dateField);
35
36
  return {
36
37
  ...grouped,
37
38
  [dateKey]: [...(grouped[dateKey] || []), thread]
@@ -75,7 +76,9 @@ var script = {
75
76
  const __vue_script__ = script;
76
77
 
77
78
  /* template */
78
- var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"gl-p-5"},[_c('div',{staticClass:"gl-bg-gray-50 gl-text-gray-500 gl-p-4 gl-mb-5 gl-rounded-base",attrs:{"data-testid":"chat-threads-info-banner"}},[_c('p',{staticClass:"gl-m-0 gl-flex"},[_vm._v("\n "+_vm._s(_vm.$options.i18n.CHAT_HISTORY_INFO)+"\n ")])]),_vm._v(" "),(_vm.hasThreads)?_vm._l((_vm.groupedThreads),function(threadsForDate,date){return _c('div',{key:date},[_c('div',{staticClass:"gl-font-bold gl-neutral-900 gl-my-4",attrs:{"data-testid":"chat-threads-date-header"}},[_vm._v("\n "+_vm._s(_vm.formattedLocalDate(date))+"\n ")]),_vm._v(" "),_c('div',_vm._l((threadsForDate),function(thread){return _c('div',{key:thread.id,staticClass:"gl-flex gl-align-center"},[_c('gl-button',{staticClass:"hover:gl-bg-gray-50 gl-text-ellipsis !gl-text-default justify-content-start gl-overflow-hidden gl-rounded-base gl-p-4 gl-w-full gl-whitespace-nowrap",attrs:{"data-testid":"chat-threads-thread-box","category":"tertiary","aria-label":_vm.sprintf(_vm.$options.i18n.OPEN_CHAT_LABEL, { title: thread.title || 'Untitled Chat' })},on:{"click":function($event){return _vm.onSelectThread(thread)}}},[_vm._v("\n "+_vm._s(thread.title || 'Untitled Chat')+"\n ")]),_vm._v(" "),_c('gl-button',{staticClass:"gl-neutral-900 !gl-px-3",attrs:{"data-testid":"chat-threads-delete-thread-button","icon":"remove","category":"tertiary","size":"small","title":_vm.$options.i18n.THREAD_DELETE_LABEL,"aria-label":_vm.$options.i18n.THREAD_DELETE_LABEL},on:{"click":function($event){return _vm.$emit('delete-thread', thread.id)}}})],1)}),0)])}):_c('duo-chat-threads-empty')],2)};
79
+ var __vue_render__ = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:"gl-p-5"},[_c('div',{staticClass:"gl-bg-gray-50 gl-text-gray-500 gl-p-4 gl-mb-5 gl-rounded-base",attrs:{"data-testid":"chat-threads-info-banner"}},[_c('p',{staticClass:"gl-m-0 gl-flex"},[_vm._v("\n "+_vm._s(_vm.$options.i18n.CHAT_HISTORY_INFO)+"\n ")])]),_vm._v(" "),(_vm.hasThreads)?_vm._l((_vm.groupedThreads),function(threadsForDate,date){return _c('div',{key:date},[_c('div',{staticClass:"gl-font-bold gl-neutral-900 gl-my-4",attrs:{"data-testid":"chat-threads-date-header"}},[_vm._v("\n "+_vm._s(_vm.formattedLocalDate(date))+"\n ")]),_vm._v(" "),_c('div',_vm._l((threadsForDate),function(thread){return _c('div',{key:thread.id,staticClass:"gl-flex gl-align-center"},[_c('gl-button',{staticClass:"hover:gl-bg-gray-50 gl-text-ellipsis !gl-text-default justify-content-start gl-overflow-hidden gl-rounded-base gl-p-4 gl-w-full gl-whitespace-nowrap",attrs:{"data-testid":"chat-threads-thread-box","category":"tertiary","aria-label":_vm.sprintf(_vm.$options.i18n.OPEN_CHAT_LABEL, {
80
+ title: thread.title || thread.goal || 'Untitled Chat',
81
+ })},on:{"click":function($event){return _vm.onSelectThread(thread)}}},[_vm._v("\n "+_vm._s(thread.title || thread.goal || 'Untitled Chat')+"\n ")]),_vm._v(" "),_c('gl-button',{staticClass:"gl-neutral-900 !gl-px-3",attrs:{"data-testid":"chat-threads-delete-thread-button","icon":"remove","category":"tertiary","size":"small","title":_vm.$options.i18n.THREAD_DELETE_LABEL,"aria-label":_vm.$options.i18n.THREAD_DELETE_LABEL},on:{"click":function($event){return _vm.$emit('delete-thread', thread.id)}}})],1)}),0)])}):_c('duo-chat-threads-empty')],2)};
79
82
  var __vue_staticRenderFns__ = [];
80
83
 
81
84
  /* style */
@@ -346,5 +346,116 @@ const THREADLIST = [{
346
346
  conversationType: 'DUO_CHAT',
347
347
  title: 'Before the Configuration Committee'
348
348
  }];
349
+ const AGENTIC_THREADLIST = [{
350
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1031434',
351
+ projectId: 'gid://gitlab/Project/62039593',
352
+ humanStatus: 'input required',
353
+ updatedAt: '2025-01-24T19:27:15Z',
354
+ goal: 'Help me migrate the legacy duo_chat_component to the modern tech stack of the current project. If there are ways to simplify it (remove unnecessary CSS, functionality, etc) and rely more on the default shadcn-ui components, please suggest those simplifications. If you need to install any shadcn-ui component, feel free to do so',
355
+ stalled: false,
356
+ archived: false,
357
+ firstCheckpoint: {
358
+ checkpoint: '{"v":3,"id":"1f0659ae-d2f8-6230-bfff-fea961e0365f","ts":"2025-07-20T18:54:12.716786+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":62039593,"name":"Duo UI","web_url":"https://gitlab.com/gitlab-org/duo-ui","languages":[{"name":"JavaScript","share":72.16},{"name":"Vue","share":22.06},{"name":"SCSS","share":2.68},{"name":"Ruby","share":1.54},{"name":"TypeScript","share":0.6}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/duo-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"Help me migrate the legacy duo_chat_component to the modern tech stack of the current project. If there are ways to simplify it (remove unnecessary CSS, functionality, etc) and rely more on the default shadcn-ui components, please suggest those simplifications. If you need to install any shadcn-ui component, feel free to do so","timestamp":"2025-07-20T18:54:12.429236+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"1","type":"AdditionalContext","content":"The user wants you to adhere to these rules:\\nThe project is built with Vue 3, Typescript, Tailwind, shadcn-vue and other modern technologies.\\n\\nFor some transient time, this project is used to migrate legacy Vue 2 + JS + gitlab-ui components to the new tech stack. While migrating components all of the gitlab-ui components should be replaced with the shadcn-ui analogues or explicitly agreed with the user. If you see any better analogue in shadcn-ui or better way to implement functionality, speak up and ask for user\'s confirmation on what path to take.\\n\\nEvery component should have a story and a test spec alongside itself.","category":"user_rule","metadata":{"icon":"user","title":"User instruction","enabled":true,"subType":"user_rule","subTypeLabel":"User instruction","secondaryText":"chat-rules.md"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"Help me migrate the legacy duo_chat_component to the modern tech stack of the current project. If there are ways to simplify it (remove unnecessary CSS, functionality, etc) and rely more on the default shadcn-ui components, please suggest those simplifications. If you need to install any shadcn-ui component, feel free to do so","example":false,"additional_kwargs":{"additional_context":[{"id":"1","content":"The user wants you to adhere to these rules:\\nThe project is built with Vue 3, Typescript, Tailwind, shadcn-vue and other modern technologies.\\n\\nFor some transient time, this project is used to migrate legacy Vue 2 + JS + gitlab-ui components to the new tech stack. While migrating components all of the gitlab-ui components should be replaced with the shadcn-ui analogues or explicitly agreed with the user. If you see any better analogue in shadcn-ui or better way to implement functionality, speak up and ask for user\'s confirmation on what path to take.\\n\\nEvery component should have a story and a test spec alongside itself.","category":"user_rule","metadata":{"icon":"user","title":"User instruction","enabled":true,"subType":"user_rule","subTypeLabel":"User instruction","secondaryText":"chat-rules.md"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
359
+ }
360
+ }, {
361
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1031775',
362
+ projectId: 'gid://gitlab/Project/278964',
363
+ humanStatus: 'input required',
364
+ updatedAt: '2025-01-31T12:20:31Z',
365
+ goal: 'I have the following data structure: "edges": [\n {\n "node": {\n "id": "gid://gitlab/Ai::DuoWorkflows::Workflow/1031434",\n "projectId": "gid://gitlab/Project/62039593",\n "humanStatus": "input required",\n "updatedAt": "2025-07-20T19:27:15Z",\n "createdAt": "2025-07-20T18:51:44Z",\n "goal": "Hel",\n "stalled": false,\n "archived": false\n }\n },\n {\n "node": {\n "id": "gid://gitlab/Ai::DuoWorkflows::Workflow/1031206",\n "projectId": "gid://gitlab/Project/62039593",\n "humanStatus": "input required",\n "updatedAt": "2025-07-19T12:20:31Z",\n "createdAt": "2025-07-19T12:15:49Z",\n "goal": "Hel",\n "stalled": false,\n "archived": false\n }\n },]\n\nHow can I "unwrap" nodes so that, let\'s say a constant `nodes` would contain an array of nodes like: [\n {\n "id": "gid://gitlab/Ai::DuoWorkflows::Workflow/1031434",\n "projectId": "gid://gitlab/Project/62039593",\n "humanStatus": "input required",\n "updatedAt": "2025-07-20T19:27:15Z",\n "createdAt": "2025-07-20T18:51:44Z",\n "goal": "Hel",\n "stalled": false,\n "archived": false\n },\n {\n "id": "gid://gitlab/Ai::DuoWorkflows::Workflow/1031206",\n "projectId": "gid://gitlab/Project/62039593",\n "humanStatus": "input required",\n "updatedAt": "2025-07-19T12:20:31Z",\n "createdAt": "2025-07-19T12:15:49Z",\n "goal": "Hel",\n "stalled": false,\n "archived": false\n },]?',
366
+ stalled: false,
367
+ archived: false,
368
+ firstCheckpoint: {
369
+ checkpoint: '{"v":3,"id":"1f0660ac-f31d-611f-bfff-989cc966f3d3","ts":"2025-07-21T08:15:06.033987+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":278964,"name":"GitLab","web_url":"https://gitlab.com/gitlab-org/gitlab","languages":[{"name":"Ruby","share":68.37},{"name":"JavaScript","share":19.23},{"name":"Vue","share":8.04},{"name":"PLpgSQL","share":1.86},{"name":"Haml","share":1.22}],"description":"GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more. Self-host GitLab on your own servers, in a container, or on a cloud provider.","http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"I have the following data structure: \\"edges\\": [\\n {\\n \\"node\\": {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031434\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-20T19:27:15Z\\",\\n \\"createdAt\\": \\"2025-07-20T18:51:44Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n }\\n },\\n {\\n \\"node\\": {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031206\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-19T12:20:31Z\\",\\n \\"createdAt\\": \\"2025-07-19T12:15:49Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n }\\n },]\\n\\nHow can I \\"unwrap\\" nodes so that, let\'s say a constant `nodes` would contain an array of nodes like: [\\n {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031434\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-20T19:27:15Z\\",\\n \\"createdAt\\": \\"2025-07-20T18:51:44Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n },\\n {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031206\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-19T12:20:31Z\\",\\n \\"createdAt\\": \\"2025-07-19T12:15:49Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n },]?","timestamp":"2025-07-21T08:15:05.647932+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"I have the following data structure: \\"edges\\": [\\n {\\n \\"node\\": {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031434\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-20T19:27:15Z\\",\\n \\"createdAt\\": \\"2025-07-20T18:51:44Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n }\\n },\\n {\\n \\"node\\": {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031206\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-19T12:20:31Z\\",\\n \\"createdAt\\": \\"2025-07-19T12:15:49Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n }\\n },]\\n\\nHow can I \\"unwrap\\" nodes so that, let\'s say a constant `nodes` would contain an array of nodes like: [\\n {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031434\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-20T19:27:15Z\\",\\n \\"createdAt\\": \\"2025-07-20T18:51:44Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n },\\n {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031206\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-19T12:20:31Z\\",\\n \\"createdAt\\": \\"2025-07-19T12:15:49Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n },]?","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
370
+ }
371
+ }, {
372
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1031206',
373
+ projectId: 'gid://gitlab/Project/62039593',
374
+ humanStatus: 'input required',
375
+ updatedAt: '2025-01-31T08:15:32Z',
376
+ goal: 'Help me introduce translation support for the selected string using the Vue-18n dependency',
377
+ stalled: false,
378
+ archived: false,
379
+ firstCheckpoint: {
380
+ checkpoint: '{"v":3,"id":"1f0649a2-cee3-6c86-bfff-b35ddd3c4901","ts":"2025-07-19T12:16:19.003703+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":62039593,"name":"Duo UI","web_url":"https://gitlab.com/gitlab-org/duo-ui","languages":[{"name":"JavaScript","share":72.16},{"name":"Vue","share":22.06},{"name":"SCSS","share":2.68},{"name":"Ruby","share":1.54},{"name":"TypeScript","share":0.6}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/duo-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"Help me introduce translation support for the selected string using the Vue-18n dependency","timestamp":"2025-07-19T12:16:18.708768+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"editor_selection:src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue_893edb37-6d20-4f81-83eb-2f5fbb290609","type":"AdditionalContext","content":" return count === 1 ? \'Source\' : \'Sources\';","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue","enabled":true,"subType":"snippet","fileName":"src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue","subTypeLabel":"Editor Selection","secondaryText":"src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue"}},{"id":"1","type":"AdditionalContext","content":"The user wants you to adhere to these rules:\\nThe project is built with Vue 3, Typescript, Tailwind, shadcn-vue and other modern technologies.\\n\\nFor some transient time, this project is used to migrate legacy Vue 2 + JS + gitlab-ui components to the new tech stack. While migrating components all of the gitlab-ui components should be replaced with the shadcn-ui analogues or explicitly agreed with the user. If you see any better analogue in shadcn-ui or better way to implement functionality, speak up and ask for user\'s confirmation on what path to take.\\n\\nEvery string that is meant to be output in the UI, should be translated. The package is using Vue-18 dependency for translations.\\n\\nEvery component should have a story and a test spec alongside itself.","category":"user_rule","metadata":{"icon":"user","title":"User instruction","enabled":true,"subType":"user_rule","subTypeLabel":"User instruction","secondaryText":"chat-rules.md"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"Help me introduce translation support for the selected string using the Vue-18n dependency","example":false,"additional_kwargs":{"additional_context":[{"id":"editor_selection:src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue_893edb37-6d20-4f81-83eb-2f5fbb290609","content":" return count === 1 ? \'Source\' : \'Sources\';","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue","enabled":true,"subType":"snippet","fileName":"src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue","subTypeLabel":"Editor Selection","secondaryText":"src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue"}},{"id":"1","content":"The user wants you to adhere to these rules:\\nThe project is built with Vue 3, Typescript, Tailwind, shadcn-vue and other modern technologies.\\n\\nFor some transient time, this project is used to migrate legacy Vue 2 + JS + gitlab-ui components to the new tech stack. While migrating components all of the gitlab-ui components should be replaced with the shadcn-ui analogues or explicitly agreed with the user. If you see any better analogue in shadcn-ui or better way to implement functionality, speak up and ask for user\'s confirmation on what path to take.\\n\\nEvery string that is meant to be output in the UI, should be translated. The package is using Vue-18 dependency for translations.\\n\\nEvery component should have a story and a test spec alongside itself.","category":"user_rule","metadata":{"icon":"user","title":"User instruction","enabled":true,"subType":"user_rule","subTypeLabel":"User instruction","secondaryText":"chat-rules.md"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
381
+ }
382
+ }, {
383
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1031041',
384
+ projectId: 'gid://gitlab/Project/62039593',
385
+ humanStatus: 'failed',
386
+ updatedAt: '2025-01-15T20:35:23Z',
387
+ goal: 'I need your help migrating the src/components/custom/duo_chat_message_sources folder (component, story, and the test), that were copied over from a legacy project to the tech stack used in this project. Can you help?',
388
+ stalled: false,
389
+ archived: false,
390
+ firstCheckpoint: {
391
+ checkpoint: '{"v":3,"id":"1f064155-71df-6f90-bfff-eaa94aa27ec1","ts":"2025-07-18T20:25:26.715981+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":62039593,"name":"Duo UI","web_url":"https://gitlab.com/gitlab-org/duo-ui","languages":[{"name":"JavaScript","share":72.16},{"name":"Vue","share":22.06},{"name":"SCSS","share":2.68},{"name":"Ruby","share":1.54},{"name":"TypeScript","share":0.6}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/duo-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"I need your help migrating the src/components/custom/duo_chat_message_sources folder (component, story, and the test), that were copied over from a legacy project to the tech stack used in this project. Can you help?","timestamp":"2025-07-18T20:25:26.401616+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"I need your help migrating the src/components/custom/duo_chat_message_sources folder (component, story, and the test), that were copied over from a legacy project to the tech stack used in this project. Can you help?","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
392
+ }
393
+ }, {
394
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1030377',
395
+ projectId: 'gid://gitlab/Project/46519181',
396
+ humanStatus: 'input required',
397
+ updatedAt: '2025-01-15T12:03:06Z',
398
+ goal: "How should I update the CSP derectives to allow images from `https://secure.gravatar.com/avatar/`? I've tried with the selected update, but it doesn't work - I get the \"The source list for the Content Security Policy directive 'img-src' contains an invalid source: ''secure.gravatar.com''. It will be ignored.\" error. Can you help me fix this and allow images from that domain?",
399
+ stalled: false,
400
+ archived: false,
401
+ firstCheckpoint: {
402
+ checkpoint: '{"v":3,"id":"1f063cf2-1522-60d4-bfff-b222b997066b","ts":"2025-07-18T12:02:51.689588+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":46519181,"name":"GitLab Language Server","web_url":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp","languages":[{"name":"TypeScript","share":79.66},{"name":"JavaScript","share":12.25},{"name":"Vue","share":5.62},{"name":"SCSS","share":2.01},{"name":"Shell","share":0.38}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"How should I update the CSP derectives to allow images from `https://secure.gravatar.com/avatar/`? I\'ve tried with the selected update, but it doesn\'t work - I get the \\"The source list for the Content Security Policy directive \'img-src\' contains an invalid source: \'\'secure.gravatar.com\'\'. It will be ignored.\\" error. Can you help me fix this and allow images from that domain?","timestamp":"2025-07-18T12:02:51.347774+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"editor_selection:src/common/webview/html/utils/csp_builder.ts_cd5c7d74-f642-4b6f-ac74-5aacff408dd6","type":"AdditionalContext","content":" \'img-src\': [\\"\'self\'\\", \\"\'secure.gravatar.com\'\\"],","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/common/webview/html/utils/csp_builder.ts","enabled":true,"subType":"snippet","fileName":"src/common/webview/html/utils/csp_builder.ts","subTypeLabel":"Editor Selection","secondaryText":"src/common/webview/html/utils/csp_builder.ts"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"How should I update the CSP derectives to allow images from `https://secure.gravatar.com/avatar/`? I\'ve tried with the selected update, but it doesn\'t work - I get the \\"The source list for the Content Security Policy directive \'img-src\' contains an invalid source: \'\'secure.gravatar.com\'\'. It will be ignored.\\" error. Can you help me fix this and allow images from that domain?","example":false,"additional_kwargs":{"additional_context":[{"id":"editor_selection:src/common/webview/html/utils/csp_builder.ts_cd5c7d74-f642-4b6f-ac74-5aacff408dd6","content":" \'img-src\': [\\"\'self\'\\", \\"\'secure.gravatar.com\'\\"],","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/common/webview/html/utils/csp_builder.ts","enabled":true,"subType":"snippet","fileName":"src/common/webview/html/utils/csp_builder.ts","subTypeLabel":"Editor Selection","secondaryText":"src/common/webview/html/utils/csp_builder.ts"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
403
+ }
404
+ }, {
405
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1029369',
406
+ projectId: 'gid://gitlab/Project/7071551',
407
+ humanStatus: 'input required',
408
+ updatedAt: '2025-01-08T15:55:58Z',
409
+ goal: 'explain this to me',
410
+ stalled: false,
411
+ archived: false,
412
+ firstCheckpoint: {
413
+ checkpoint: '{"v":3,"id":"1f063217-75c6-6ace-bfff-9c250f04abb6","ts":"2025-07-17T15:19:43.610124+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":7071551,"name":"gitlab-ui","web_url":"https://gitlab.com/gitlab-org/gitlab-ui","languages":[{"name":"JavaScript","share":56.13},{"name":"Vue","share":19.71},{"name":"SCSS","share":15.81},{"name":"CSS","share":7.21},{"name":"Ruby","share":0.39}],"description":"Development of this project has moved to https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com.\\r\\n\\r\\nSee https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com/-/issues/2035 for more information.","http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"foo bar","timestamp":"2025-07-17T15:19:43.272681+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"foo bar","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
414
+ }
415
+ }, {
416
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1029334',
417
+ projectId: 'gid://gitlab/Project/7071551',
418
+ humanStatus: 'input required',
419
+ updatedAt: '2025-01-08T15:19:49Z',
420
+ goal: 'foo bar',
421
+ stalled: false,
422
+ archived: false,
423
+ firstCheckpoint: {
424
+ checkpoint: '{"v":3,"id":"1f063217-75c6-6ace-bfff-9c250f04abb6","ts":"2025-07-17T15:19:43.610124+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":7071551,"name":"gitlab-ui","web_url":"https://gitlab.com/gitlab-org/gitlab-ui","languages":[{"name":"JavaScript","share":56.13},{"name":"Vue","share":19.71},{"name":"SCSS","share":15.81},{"name":"CSS","share":7.21},{"name":"Ruby","share":0.39}],"description":"Development of this project has moved to https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com.\\r\\n\\r\\nSee https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com/-/issues/2035 for more information.","http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"foo bar","timestamp":"2025-07-17T15:19:43.272681+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"foo bar","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
425
+ }
426
+ }, {
427
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1029330',
428
+ projectId: 'gid://gitlab/Project/7071551',
429
+ humanStatus: 'input required',
430
+ updatedAt: '2025-01-08T15:17:28Z',
431
+ goal: 'test me',
432
+ stalled: false,
433
+ archived: false,
434
+ firstCheckpoint: {
435
+ checkpoint: '{"v":3,"id":"1f063212-2bac-68c0-bfff-fc55ae272eb1","ts":"2025-07-17T15:17:21.622232+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":7071551,"name":"gitlab-ui","web_url":"https://gitlab.com/gitlab-org/gitlab-ui","languages":[{"name":"JavaScript","share":56.13},{"name":"Vue","share":19.71},{"name":"SCSS","share":15.81},{"name":"CSS","share":7.21},{"name":"Ruby","share":0.39}],"description":"Development of this project has moved to https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com.\\r\\n\\r\\nSee https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com/-/issues/2035 for more information.","http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"test me","timestamp":"2025-07-17T15:17:21.275711+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"test me","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
436
+ }
437
+ }, {
438
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1028684',
439
+ projectId: 'gid://gitlab/Project/46519181',
440
+ humanStatus: 'input required',
441
+ updatedAt: '2025-01-08T22:16:28Z',
442
+ goal: 'In the `packages/lib_webview_agentic_chat/src/app/common/chat.test.js` file, help me fill out the "provides avatarUrl to the underlying components" and the "provides renderGFM to the underlying components" test placeholders based on the implementation in `packages/lib_webview_agentic_chat/src/app/common/chat.vue`',
443
+ stalled: false,
444
+ archived: false,
445
+ firstCheckpoint: {
446
+ checkpoint: '{"v":3,"id":"1f062927-1357-6124-bfff-af05cc284fdb","ts":"2025-07-16T22:15:55.256032+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":46519181,"name":"GitLab Language Server","web_url":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp","languages":[{"name":"TypeScript","share":79.68},{"name":"JavaScript","share":12.26},{"name":"Vue","share":5.33},{"name":"SCSS","share":2.26},{"name":"Shell","share":0.38}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"In the `packages/lib_webview_agentic_chat/src/app/common/chat.test.js` file, help me fill out the \\"provides avatarUrl to the underlying components\\" and the \\"provides renderGFM to the underlying components\\" test placeholders based on the implementation in `packages/lib_webview_agentic_chat/src/app/common/chat.vue`","timestamp":"2025-07-16T22:15:54.359309+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"editor_selection:packages/lib_webview_agentic_chat/src/app/common/chat.test.js_b5815a3e-099c-466d-9ef0-f48536f69ddd","type":"AdditionalContext","content":"provides renderGFM to the underlying components","category":"snippet","metadata":{"icon":"selection","title":"Selected text in packages/lib_webview_agentic_chat/src/app/common/chat.test.js","enabled":true,"subType":"snippet","fileName":"packages/lib_webview_agentic_chat/src/app/common/chat.test.js","subTypeLabel":"Editor Selection","secondaryText":"packages/lib_webview_agentic_chat/src/app/common/chat.test.js"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"In the `packages/lib_webview_agentic_chat/src/app/common/chat.test.js` file, help me fill out the \\"provides avatarUrl to the underlying components\\" and the \\"provides renderGFM to the underlying components\\" test placeholders based on the implementation in `packages/lib_webview_agentic_chat/src/app/common/chat.vue`","example":false,"additional_kwargs":{"additional_context":[{"id":"editor_selection:packages/lib_webview_agentic_chat/src/app/common/chat.test.js_b5815a3e-099c-466d-9ef0-f48536f69ddd","content":"provides renderGFM to the underlying components","category":"snippet","metadata":{"icon":"selection","title":"Selected text in packages/lib_webview_agentic_chat/src/app/common/chat.test.js","enabled":true,"subType":"snippet","fileName":"packages/lib_webview_agentic_chat/src/app/common/chat.test.js","subTypeLabel":"Editor Selection","secondaryText":"packages/lib_webview_agentic_chat/src/app/common/chat.test.js"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
447
+ }
448
+ }, {
449
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1028594',
450
+ projectId: 'gid://gitlab/Project/46519181',
451
+ humanStatus: 'tool call approval required',
452
+ updatedAt: '2025-01-08T20:03:24Z',
453
+ goal: "In the current project I need to ensure that a webview in packages/lib_webview_agentic_chat has information about `avatarUrl` of the currently logged in user. The GraphQl query to get that information is in user_service (src/common/core/services/user_service.ts). Can you help me connect that service to the webview somehow? I would need to get that information sent down to the webview as part of the `pluginToWebview` communication channel, I guess. But please analyze all the options and let's see how far we can get",
454
+ stalled: false,
455
+ archived: false,
456
+ firstCheckpoint: {
457
+ checkpoint: '{"v":3,"id":"1f0627f5-1510-677c-bfff-624b1a456de4","ts":"2025-07-16T19:59:01.311877+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":46519181,"name":"GitLab Language Server","web_url":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp","languages":[{"name":"TypeScript","share":79.68},{"name":"JavaScript","share":12.26},{"name":"Vue","share":5.33},{"name":"SCSS","share":2.26},{"name":"Shell","share":0.38}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"In the current project I need to ensure that a webview in packages/lib_webview_agentic_chat has information about `avatarUrl` of the currently logged in user. The GraphQl query to get that information is in user_service (src/common/core/services/user_service.ts). Can you help me connect that service to the webview somehow? I would need to get that information sent down to the webview as part of the `pluginToWebview` communication channel, I guess. But please analyze all the options and let\'s see how far we can get","timestamp":"2025-07-16T19:59:00.775754+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"editor_selection:src/common/core/services/user_service.ts_22d20969-dfd7-4b78-9dac-c63de2f559ea","type":"AdditionalContext","content":"DefaultUserService","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/common/core/services/user_service.ts","enabled":true,"subType":"snippet","fileName":"src/common/core/services/user_service.ts","subTypeLabel":"Editor Selection","secondaryText":"src/common/core/services/user_service.ts"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"In the current project I need to ensure that a webview in packages/lib_webview_agentic_chat has information about `avatarUrl` of the currently logged in user. The GraphQl query to get that information is in user_service (src/common/core/services/user_service.ts). Can you help me connect that service to the webview somehow? I would need to get that information sent down to the webview as part of the `pluginToWebview` communication channel, I guess. But please analyze all the options and let\'s see how far we can get","example":false,"additional_kwargs":{"additional_context":[{"id":"editor_selection:src/common/core/services/user_service.ts_22d20969-dfd7-4b78-9dac-c63de2f559ea","content":"DefaultUserService","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/common/core/services/user_service.ts","enabled":true,"subType":"snippet","fileName":"src/common/core/services/user_service.ts","subTypeLabel":"Editor Selection","secondaryText":"src/common/core/services/user_service.ts"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}'
458
+ }
459
+ }];
349
460
 
350
- export { INCLUDE_SLASH_COMMAND, MOCK_AGENT_MESSAGE, MOCK_REQUEST_MESSAGE, MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL, MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL_PARAMS, MOCK_RESPONSE_MESSAGE, MOCK_RESPONSE_MESSAGE_FOR_STREAMING, MOCK_TOOL_MESSAGE, MOCK_TOOL_MESSAGE_WITH_LINK, MOCK_USER_PROMPT_MESSAGE, MOCK_WORKFLOW_END_MESSAGE, SLASH_COMMANDS, THREADLIST, generateMockResponseChunks, generateSeparateChunks, renderGFM, renderMarkdown };
461
+ export { AGENTIC_THREADLIST, INCLUDE_SLASH_COMMAND, MOCK_AGENT_MESSAGE, MOCK_REQUEST_MESSAGE, MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL, MOCK_REQUEST_MESSAGE_WITH_TOOL_APPROVAL_PARAMS, MOCK_RESPONSE_MESSAGE, MOCK_RESPONSE_MESSAGE_FOR_STREAMING, MOCK_TOOL_MESSAGE, MOCK_TOOL_MESSAGE_WITH_LINK, MOCK_USER_PROMPT_MESSAGE, MOCK_WORKFLOW_END_MESSAGE, SLASH_COMMANDS, THREADLIST, generateMockResponseChunks, generateSeparateChunks, renderGFM, renderMarkdown };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gitlab/duo-ui",
3
- "version": "10.11.0",
3
+ "version": "10.12.0",
4
4
  "description": "Duo UI Components",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -78,12 +78,11 @@ const itemsValidator = (items) => items.every(isMessage);
78
78
  const slashCommandsValidator = (commands) => commands.every(isSlashCommand);
79
79
 
80
80
  const isThread = (thread) =>
81
- typeof thread === 'object' &&
82
- typeof thread.id === 'string' &&
83
- typeof thread.lastUpdatedAt === 'string' &&
84
- typeof thread.createdAt === 'string' &&
85
- typeof thread.conversationType === 'string' &&
86
- (thread.title === null || typeof thread.title === 'string');
81
+ (typeof thread === 'object' &&
82
+ typeof thread.id === 'string' &&
83
+ typeof thread.lastUpdatedAt === 'string') ||
84
+ (typeof thread.updatedAt === 'string' &&
85
+ (thread.title === null || typeof thread.title === 'string' || typeof thread.goal === 'string'));
87
86
 
88
87
  // eslint-disable-next-line unicorn/no-array-callback-reference
89
88
  const threadListValidator = (threads) => threads.every(isThread);
@@ -40,9 +40,11 @@ export default {
40
40
 
41
41
  return this.threads
42
42
  .slice()
43
+ .sort((a, b) => this.compareThreadDates(b.updatedAt, a.updatedAt))
43
44
  .sort((a, b) => this.compareThreadDates(b.lastUpdatedAt, a.lastUpdatedAt))
44
45
  .reduce((grouped, thread) => {
45
- const dateKey = this.getDateKey(thread.lastUpdatedAt);
46
+ const dateField = thread.updatedAt || thread.lastUpdatedAt;
47
+ const dateKey = this.getDateKey(dateField);
46
48
  return {
47
49
  ...grouped,
48
50
  [dateKey]: [...(grouped[dateKey] || []), thread],
@@ -108,11 +110,13 @@ export default {
108
110
  category="tertiary"
109
111
  class="hover:gl-bg-gray-50 gl-text-ellipsis !gl-text-default justify-content-start gl-overflow-hidden gl-rounded-base gl-p-4 gl-w-full gl-whitespace-nowrap"
110
112
  :aria-label="
111
- sprintf($options.i18n.OPEN_CHAT_LABEL, { title: thread.title || 'Untitled Chat' })
113
+ sprintf($options.i18n.OPEN_CHAT_LABEL, {
114
+ title: thread.title || thread.goal || 'Untitled Chat',
115
+ })
112
116
  "
113
117
  @click="onSelectThread(thread)"
114
118
  >
115
- {{ thread.title || 'Untitled Chat' }}
119
+ {{ thread.title || thread.goal || 'Untitled Chat' }}
116
120
  </gl-button>
117
121
 
118
122
  <gl-button
@@ -391,3 +391,136 @@ export const THREADLIST = [
391
391
  title: 'Before the Configuration Committee',
392
392
  },
393
393
  ];
394
+
395
+ export const AGENTIC_THREADLIST = [
396
+ {
397
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1031434',
398
+ projectId: 'gid://gitlab/Project/62039593',
399
+ humanStatus: 'input required',
400
+ updatedAt: '2025-01-24T19:27:15Z',
401
+ goal: 'Help me migrate the legacy duo_chat_component to the modern tech stack of the current project. If there are ways to simplify it (remove unnecessary CSS, functionality, etc) and rely more on the default shadcn-ui components, please suggest those simplifications. If you need to install any shadcn-ui component, feel free to do so',
402
+ stalled: false,
403
+ archived: false,
404
+ firstCheckpoint: {
405
+ checkpoint:
406
+ '{"v":3,"id":"1f0659ae-d2f8-6230-bfff-fea961e0365f","ts":"2025-07-20T18:54:12.716786+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":62039593,"name":"Duo UI","web_url":"https://gitlab.com/gitlab-org/duo-ui","languages":[{"name":"JavaScript","share":72.16},{"name":"Vue","share":22.06},{"name":"SCSS","share":2.68},{"name":"Ruby","share":1.54},{"name":"TypeScript","share":0.6}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/duo-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"Help me migrate the legacy duo_chat_component to the modern tech stack of the current project. If there are ways to simplify it (remove unnecessary CSS, functionality, etc) and rely more on the default shadcn-ui components, please suggest those simplifications. If you need to install any shadcn-ui component, feel free to do so","timestamp":"2025-07-20T18:54:12.429236+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"1","type":"AdditionalContext","content":"The user wants you to adhere to these rules:\\nThe project is built with Vue 3, Typescript, Tailwind, shadcn-vue and other modern technologies.\\n\\nFor some transient time, this project is used to migrate legacy Vue 2 + JS + gitlab-ui components to the new tech stack. While migrating components all of the gitlab-ui components should be replaced with the shadcn-ui analogues or explicitly agreed with the user. If you see any better analogue in shadcn-ui or better way to implement functionality, speak up and ask for user\'s confirmation on what path to take.\\n\\nEvery component should have a story and a test spec alongside itself.","category":"user_rule","metadata":{"icon":"user","title":"User instruction","enabled":true,"subType":"user_rule","subTypeLabel":"User instruction","secondaryText":"chat-rules.md"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"Help me migrate the legacy duo_chat_component to the modern tech stack of the current project. If there are ways to simplify it (remove unnecessary CSS, functionality, etc) and rely more on the default shadcn-ui components, please suggest those simplifications. If you need to install any shadcn-ui component, feel free to do so","example":false,"additional_kwargs":{"additional_context":[{"id":"1","content":"The user wants you to adhere to these rules:\\nThe project is built with Vue 3, Typescript, Tailwind, shadcn-vue and other modern technologies.\\n\\nFor some transient time, this project is used to migrate legacy Vue 2 + JS + gitlab-ui components to the new tech stack. While migrating components all of the gitlab-ui components should be replaced with the shadcn-ui analogues or explicitly agreed with the user. If you see any better analogue in shadcn-ui or better way to implement functionality, speak up and ask for user\'s confirmation on what path to take.\\n\\nEvery component should have a story and a test spec alongside itself.","category":"user_rule","metadata":{"icon":"user","title":"User instruction","enabled":true,"subType":"user_rule","subTypeLabel":"User instruction","secondaryText":"chat-rules.md"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
407
+ },
408
+ },
409
+ {
410
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1031775',
411
+ projectId: 'gid://gitlab/Project/278964',
412
+ humanStatus: 'input required',
413
+ updatedAt: '2025-01-31T12:20:31Z',
414
+ goal: 'I have the following data structure: "edges": [\n {\n "node": {\n "id": "gid://gitlab/Ai::DuoWorkflows::Workflow/1031434",\n "projectId": "gid://gitlab/Project/62039593",\n "humanStatus": "input required",\n "updatedAt": "2025-07-20T19:27:15Z",\n "createdAt": "2025-07-20T18:51:44Z",\n "goal": "Hel",\n "stalled": false,\n "archived": false\n }\n },\n {\n "node": {\n "id": "gid://gitlab/Ai::DuoWorkflows::Workflow/1031206",\n "projectId": "gid://gitlab/Project/62039593",\n "humanStatus": "input required",\n "updatedAt": "2025-07-19T12:20:31Z",\n "createdAt": "2025-07-19T12:15:49Z",\n "goal": "Hel",\n "stalled": false,\n "archived": false\n }\n },]\n\nHow can I "unwrap" nodes so that, let\'s say a constant `nodes` would contain an array of nodes like: [\n {\n "id": "gid://gitlab/Ai::DuoWorkflows::Workflow/1031434",\n "projectId": "gid://gitlab/Project/62039593",\n "humanStatus": "input required",\n "updatedAt": "2025-07-20T19:27:15Z",\n "createdAt": "2025-07-20T18:51:44Z",\n "goal": "Hel",\n "stalled": false,\n "archived": false\n },\n {\n "id": "gid://gitlab/Ai::DuoWorkflows::Workflow/1031206",\n "projectId": "gid://gitlab/Project/62039593",\n "humanStatus": "input required",\n "updatedAt": "2025-07-19T12:20:31Z",\n "createdAt": "2025-07-19T12:15:49Z",\n "goal": "Hel",\n "stalled": false,\n "archived": false\n },]?',
415
+ stalled: false,
416
+ archived: false,
417
+ firstCheckpoint: {
418
+ checkpoint:
419
+ '{"v":3,"id":"1f0660ac-f31d-611f-bfff-989cc966f3d3","ts":"2025-07-21T08:15:06.033987+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":278964,"name":"GitLab","web_url":"https://gitlab.com/gitlab-org/gitlab","languages":[{"name":"Ruby","share":68.37},{"name":"JavaScript","share":19.23},{"name":"Vue","share":8.04},{"name":"PLpgSQL","share":1.86},{"name":"Haml","share":1.22}],"description":"GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more. Self-host GitLab on your own servers, in a container, or on a cloud provider.","http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"I have the following data structure: \\"edges\\": [\\n {\\n \\"node\\": {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031434\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-20T19:27:15Z\\",\\n \\"createdAt\\": \\"2025-07-20T18:51:44Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n }\\n },\\n {\\n \\"node\\": {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031206\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-19T12:20:31Z\\",\\n \\"createdAt\\": \\"2025-07-19T12:15:49Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n }\\n },]\\n\\nHow can I \\"unwrap\\" nodes so that, let\'s say a constant `nodes` would contain an array of nodes like: [\\n {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031434\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-20T19:27:15Z\\",\\n \\"createdAt\\": \\"2025-07-20T18:51:44Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n },\\n {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031206\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-19T12:20:31Z\\",\\n \\"createdAt\\": \\"2025-07-19T12:15:49Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n },]?","timestamp":"2025-07-21T08:15:05.647932+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"I have the following data structure: \\"edges\\": [\\n {\\n \\"node\\": {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031434\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-20T19:27:15Z\\",\\n \\"createdAt\\": \\"2025-07-20T18:51:44Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n }\\n },\\n {\\n \\"node\\": {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031206\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-19T12:20:31Z\\",\\n \\"createdAt\\": \\"2025-07-19T12:15:49Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n }\\n },]\\n\\nHow can I \\"unwrap\\" nodes so that, let\'s say a constant `nodes` would contain an array of nodes like: [\\n {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031434\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-20T19:27:15Z\\",\\n \\"createdAt\\": \\"2025-07-20T18:51:44Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n },\\n {\\n \\"id\\": \\"gid://gitlab/Ai::DuoWorkflows::Workflow/1031206\\",\\n \\"projectId\\": \\"gid://gitlab/Project/62039593\\",\\n \\"humanStatus\\": \\"input required\\",\\n \\"updatedAt\\": \\"2025-07-19T12:20:31Z\\",\\n \\"createdAt\\": \\"2025-07-19T12:15:49Z\\",\\n \\"goal\\": \\"Hel\\",\\n \\"stalled\\": false,\\n \\"archived\\": false\\n },]?","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
420
+ },
421
+ },
422
+ {
423
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1031206',
424
+ projectId: 'gid://gitlab/Project/62039593',
425
+ humanStatus: 'input required',
426
+ updatedAt: '2025-01-31T08:15:32Z',
427
+ goal: 'Help me introduce translation support for the selected string using the Vue-18n dependency',
428
+ stalled: false,
429
+ archived: false,
430
+ firstCheckpoint: {
431
+ checkpoint:
432
+ '{"v":3,"id":"1f0649a2-cee3-6c86-bfff-b35ddd3c4901","ts":"2025-07-19T12:16:19.003703+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":62039593,"name":"Duo UI","web_url":"https://gitlab.com/gitlab-org/duo-ui","languages":[{"name":"JavaScript","share":72.16},{"name":"Vue","share":22.06},{"name":"SCSS","share":2.68},{"name":"Ruby","share":1.54},{"name":"TypeScript","share":0.6}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/duo-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"Help me introduce translation support for the selected string using the Vue-18n dependency","timestamp":"2025-07-19T12:16:18.708768+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"editor_selection:src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue_893edb37-6d20-4f81-83eb-2f5fbb290609","type":"AdditionalContext","content":" return count === 1 ? \'Source\' : \'Sources\';","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue","enabled":true,"subType":"snippet","fileName":"src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue","subTypeLabel":"Editor Selection","secondaryText":"src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue"}},{"id":"1","type":"AdditionalContext","content":"The user wants you to adhere to these rules:\\nThe project is built with Vue 3, Typescript, Tailwind, shadcn-vue and other modern technologies.\\n\\nFor some transient time, this project is used to migrate legacy Vue 2 + JS + gitlab-ui components to the new tech stack. While migrating components all of the gitlab-ui components should be replaced with the shadcn-ui analogues or explicitly agreed with the user. If you see any better analogue in shadcn-ui or better way to implement functionality, speak up and ask for user\'s confirmation on what path to take.\\n\\nEvery string that is meant to be output in the UI, should be translated. The package is using Vue-18 dependency for translations.\\n\\nEvery component should have a story and a test spec alongside itself.","category":"user_rule","metadata":{"icon":"user","title":"User instruction","enabled":true,"subType":"user_rule","subTypeLabel":"User instruction","secondaryText":"chat-rules.md"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"Help me introduce translation support for the selected string using the Vue-18n dependency","example":false,"additional_kwargs":{"additional_context":[{"id":"editor_selection:src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue_893edb37-6d20-4f81-83eb-2f5fbb290609","content":" return count === 1 ? \'Source\' : \'Sources\';","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue","enabled":true,"subType":"snippet","fileName":"src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue","subTypeLabel":"Editor Selection","secondaryText":"src/components/custom/duo_chat_message_sources/duo_chat_message_sources.vue"}},{"id":"1","content":"The user wants you to adhere to these rules:\\nThe project is built with Vue 3, Typescript, Tailwind, shadcn-vue and other modern technologies.\\n\\nFor some transient time, this project is used to migrate legacy Vue 2 + JS + gitlab-ui components to the new tech stack. While migrating components all of the gitlab-ui components should be replaced with the shadcn-ui analogues or explicitly agreed with the user. If you see any better analogue in shadcn-ui or better way to implement functionality, speak up and ask for user\'s confirmation on what path to take.\\n\\nEvery string that is meant to be output in the UI, should be translated. The package is using Vue-18 dependency for translations.\\n\\nEvery component should have a story and a test spec alongside itself.","category":"user_rule","metadata":{"icon":"user","title":"User instruction","enabled":true,"subType":"user_rule","subTypeLabel":"User instruction","secondaryText":"chat-rules.md"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
433
+ },
434
+ },
435
+ {
436
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1031041',
437
+ projectId: 'gid://gitlab/Project/62039593',
438
+ humanStatus: 'failed',
439
+ updatedAt: '2025-01-15T20:35:23Z',
440
+ goal: 'I need your help migrating the src/components/custom/duo_chat_message_sources folder (component, story, and the test), that were copied over from a legacy project to the tech stack used in this project. Can you help?',
441
+ stalled: false,
442
+ archived: false,
443
+ firstCheckpoint: {
444
+ checkpoint:
445
+ '{"v":3,"id":"1f064155-71df-6f90-bfff-eaa94aa27ec1","ts":"2025-07-18T20:25:26.715981+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":62039593,"name":"Duo UI","web_url":"https://gitlab.com/gitlab-org/duo-ui","languages":[{"name":"JavaScript","share":72.16},{"name":"Vue","share":22.06},{"name":"SCSS","share":2.68},{"name":"Ruby","share":1.54},{"name":"TypeScript","share":0.6}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/duo-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"I need your help migrating the src/components/custom/duo_chat_message_sources folder (component, story, and the test), that were copied over from a legacy project to the tech stack used in this project. Can you help?","timestamp":"2025-07-18T20:25:26.401616+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"I need your help migrating the src/components/custom/duo_chat_message_sources folder (component, story, and the test), that were copied over from a legacy project to the tech stack used in this project. Can you help?","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
446
+ },
447
+ },
448
+ {
449
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1030377',
450
+ projectId: 'gid://gitlab/Project/46519181',
451
+ humanStatus: 'input required',
452
+ updatedAt: '2025-01-15T12:03:06Z',
453
+ goal: "How should I update the CSP derectives to allow images from `https://secure.gravatar.com/avatar/`? I've tried with the selected update, but it doesn't work - I get the \"The source list for the Content Security Policy directive 'img-src' contains an invalid source: ''secure.gravatar.com''. It will be ignored.\" error. Can you help me fix this and allow images from that domain?",
454
+ stalled: false,
455
+ archived: false,
456
+ firstCheckpoint: {
457
+ checkpoint:
458
+ '{"v":3,"id":"1f063cf2-1522-60d4-bfff-b222b997066b","ts":"2025-07-18T12:02:51.689588+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":46519181,"name":"GitLab Language Server","web_url":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp","languages":[{"name":"TypeScript","share":79.66},{"name":"JavaScript","share":12.25},{"name":"Vue","share":5.62},{"name":"SCSS","share":2.01},{"name":"Shell","share":0.38}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"How should I update the CSP derectives to allow images from `https://secure.gravatar.com/avatar/`? I\'ve tried with the selected update, but it doesn\'t work - I get the \\"The source list for the Content Security Policy directive \'img-src\' contains an invalid source: \'\'secure.gravatar.com\'\'. It will be ignored.\\" error. Can you help me fix this and allow images from that domain?","timestamp":"2025-07-18T12:02:51.347774+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"editor_selection:src/common/webview/html/utils/csp_builder.ts_cd5c7d74-f642-4b6f-ac74-5aacff408dd6","type":"AdditionalContext","content":" \'img-src\': [\\"\'self\'\\", \\"\'secure.gravatar.com\'\\"],","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/common/webview/html/utils/csp_builder.ts","enabled":true,"subType":"snippet","fileName":"src/common/webview/html/utils/csp_builder.ts","subTypeLabel":"Editor Selection","secondaryText":"src/common/webview/html/utils/csp_builder.ts"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"How should I update the CSP derectives to allow images from `https://secure.gravatar.com/avatar/`? I\'ve tried with the selected update, but it doesn\'t work - I get the \\"The source list for the Content Security Policy directive \'img-src\' contains an invalid source: \'\'secure.gravatar.com\'\'. It will be ignored.\\" error. Can you help me fix this and allow images from that domain?","example":false,"additional_kwargs":{"additional_context":[{"id":"editor_selection:src/common/webview/html/utils/csp_builder.ts_cd5c7d74-f642-4b6f-ac74-5aacff408dd6","content":" \'img-src\': [\\"\'self\'\\", \\"\'secure.gravatar.com\'\\"],","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/common/webview/html/utils/csp_builder.ts","enabled":true,"subType":"snippet","fileName":"src/common/webview/html/utils/csp_builder.ts","subTypeLabel":"Editor Selection","secondaryText":"src/common/webview/html/utils/csp_builder.ts"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
459
+ },
460
+ },
461
+ {
462
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1029369',
463
+ projectId: 'gid://gitlab/Project/7071551',
464
+ humanStatus: 'input required',
465
+ updatedAt: '2025-01-08T15:55:58Z',
466
+ goal: 'explain this to me',
467
+ stalled: false,
468
+ archived: false,
469
+ firstCheckpoint: {
470
+ checkpoint:
471
+ '{"v":3,"id":"1f063217-75c6-6ace-bfff-9c250f04abb6","ts":"2025-07-17T15:19:43.610124+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":7071551,"name":"gitlab-ui","web_url":"https://gitlab.com/gitlab-org/gitlab-ui","languages":[{"name":"JavaScript","share":56.13},{"name":"Vue","share":19.71},{"name":"SCSS","share":15.81},{"name":"CSS","share":7.21},{"name":"Ruby","share":0.39}],"description":"Development of this project has moved to https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com.\\r\\n\\r\\nSee https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com/-/issues/2035 for more information.","http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"foo bar","timestamp":"2025-07-17T15:19:43.272681+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"foo bar","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
472
+ },
473
+ },
474
+ {
475
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1029334',
476
+ projectId: 'gid://gitlab/Project/7071551',
477
+ humanStatus: 'input required',
478
+ updatedAt: '2025-01-08T15:19:49Z',
479
+ goal: 'foo bar',
480
+ stalled: false,
481
+ archived: false,
482
+ firstCheckpoint: {
483
+ checkpoint:
484
+ '{"v":3,"id":"1f063217-75c6-6ace-bfff-9c250f04abb6","ts":"2025-07-17T15:19:43.610124+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":7071551,"name":"gitlab-ui","web_url":"https://gitlab.com/gitlab-org/gitlab-ui","languages":[{"name":"JavaScript","share":56.13},{"name":"Vue","share":19.71},{"name":"SCSS","share":15.81},{"name":"CSS","share":7.21},{"name":"Ruby","share":0.39}],"description":"Development of this project has moved to https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com.\\r\\n\\r\\nSee https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com/-/issues/2035 for more information.","http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"foo bar","timestamp":"2025-07-17T15:19:43.272681+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"foo bar","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
485
+ },
486
+ },
487
+ {
488
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1029330',
489
+ projectId: 'gid://gitlab/Project/7071551',
490
+ humanStatus: 'input required',
491
+ updatedAt: '2025-01-08T15:17:28Z',
492
+ goal: 'test me',
493
+ stalled: false,
494
+ archived: false,
495
+ firstCheckpoint: {
496
+ checkpoint:
497
+ '{"v":3,"id":"1f063212-2bac-68c0-bfff-fc55ae272eb1","ts":"2025-07-17T15:17:21.622232+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":7071551,"name":"gitlab-ui","web_url":"https://gitlab.com/gitlab-org/gitlab-ui","languages":[{"name":"JavaScript","share":56.13},{"name":"Vue","share":19.71},{"name":"SCSS","share":15.81},{"name":"CSS","share":7.21},{"name":"Ruby","share":0.39}],"description":"Development of this project has moved to https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com.\\r\\n\\r\\nSee https://gitlab.com/gitlab-org/gitlab-services/design.gitlab.com/-/issues/2035 for more information.","http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab-ui.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"test me","timestamp":"2025-07-17T15:17:21.275711+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":null}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"test me","example":false,"additional_kwargs":{"additional_context":null},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
498
+ },
499
+ },
500
+ {
501
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1028684',
502
+ projectId: 'gid://gitlab/Project/46519181',
503
+ humanStatus: 'input required',
504
+ updatedAt: '2025-01-08T22:16:28Z',
505
+ goal: 'In the `packages/lib_webview_agentic_chat/src/app/common/chat.test.js` file, help me fill out the "provides avatarUrl to the underlying components" and the "provides renderGFM to the underlying components" test placeholders based on the implementation in `packages/lib_webview_agentic_chat/src/app/common/chat.vue`',
506
+ stalled: false,
507
+ archived: false,
508
+ firstCheckpoint: {
509
+ checkpoint:
510
+ '{"v":3,"id":"1f062927-1357-6124-bfff-af05cc284fdb","ts":"2025-07-16T22:15:55.256032+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":46519181,"name":"GitLab Language Server","web_url":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp","languages":[{"name":"TypeScript","share":79.68},{"name":"JavaScript","share":12.26},{"name":"Vue","share":5.33},{"name":"SCSS","share":2.26},{"name":"Shell","share":0.38}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"In the `packages/lib_webview_agentic_chat/src/app/common/chat.test.js` file, help me fill out the \\"provides avatarUrl to the underlying components\\" and the \\"provides renderGFM to the underlying components\\" test placeholders based on the implementation in `packages/lib_webview_agentic_chat/src/app/common/chat.vue`","timestamp":"2025-07-16T22:15:54.359309+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"editor_selection:packages/lib_webview_agentic_chat/src/app/common/chat.test.js_b5815a3e-099c-466d-9ef0-f48536f69ddd","type":"AdditionalContext","content":"provides renderGFM to the underlying components","category":"snippet","metadata":{"icon":"selection","title":"Selected text in packages/lib_webview_agentic_chat/src/app/common/chat.test.js","enabled":true,"subType":"snippet","fileName":"packages/lib_webview_agentic_chat/src/app/common/chat.test.js","subTypeLabel":"Editor Selection","secondaryText":"packages/lib_webview_agentic_chat/src/app/common/chat.test.js"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"In the `packages/lib_webview_agentic_chat/src/app/common/chat.test.js` file, help me fill out the \\"provides avatarUrl to the underlying components\\" and the \\"provides renderGFM to the underlying components\\" test placeholders based on the implementation in `packages/lib_webview_agentic_chat/src/app/common/chat.vue`","example":false,"additional_kwargs":{"additional_context":[{"id":"editor_selection:packages/lib_webview_agentic_chat/src/app/common/chat.test.js_b5815a3e-099c-466d-9ef0-f48536f69ddd","content":"provides renderGFM to the underlying components","category":"snippet","metadata":{"icon":"selection","title":"Selected text in packages/lib_webview_agentic_chat/src/app/common/chat.test.js","enabled":true,"subType":"snippet","fileName":"packages/lib_webview_agentic_chat/src/app/common/chat.test.js","subTypeLabel":"Editor Selection","secondaryText":"packages/lib_webview_agentic_chat/src/app/common/chat.test.js"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
511
+ },
512
+ },
513
+ {
514
+ id: 'gid://gitlab/Ai::DuoWorkflows::Workflow/1028594',
515
+ projectId: 'gid://gitlab/Project/46519181',
516
+ humanStatus: 'tool call approval required',
517
+ updatedAt: '2025-01-08T20:03:24Z',
518
+ goal: "In the current project I need to ensure that a webview in packages/lib_webview_agentic_chat has information about `avatarUrl` of the currently logged in user. The GraphQl query to get that information is in user_service (src/common/core/services/user_service.ts). Can you help me connect that service to the webview somehow? I would need to get that information sent down to the webview as part of the `pluginToWebview` communication channel, I guess. But please analyze all the options and let's see how far we can get",
519
+ stalled: false,
520
+ archived: false,
521
+ firstCheckpoint: {
522
+ checkpoint:
523
+ '{"v":3,"id":"1f0627f5-1510-677c-bfff-624b1a456de4","ts":"2025-07-16T19:59:01.311877+00:00","pending_sends":[],"versions_seen":{"__input__":{}},"channel_values":{"__start__":{"plan":{"steps":[]},"status":"Not Started","project":{"id":46519181,"name":"GitLab Language Server","web_url":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp","languages":[{"name":"TypeScript","share":79.68},{"name":"JavaScript","share":12.26},{"name":"Vue","share":5.33},{"name":"SCSS","share":2.26},{"name":"Shell","share":0.38}],"description":"","http_url_to_repo":"https://gitlab.com/gitlab-org/editor-extensions/gitlab-lsp.git"},"approval":null,"ui_chat_log":[{"status":"success","content":"In the current project I need to ensure that a webview in packages/lib_webview_agentic_chat has information about `avatarUrl` of the currently logged in user. The GraphQl query to get that information is in user_service (src/common/core/services/user_service.ts). Can you help me connect that service to the webview somehow? I would need to get that information sent down to the webview as part of the `pluginToWebview` communication channel, I guess. But please analyze all the options and let\'s see how far we can get","timestamp":"2025-07-16T19:59:00.775754+00:00","tool_info":null,"message_type":"user","correlation_id":null,"message_sub_type":null,"additional_context":[{"id":"editor_selection:src/common/core/services/user_service.ts_22d20969-dfd7-4b78-9dac-c63de2f559ea","type":"AdditionalContext","content":"DefaultUserService","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/common/core/services/user_service.ts","enabled":true,"subType":"snippet","fileName":"src/common/core/services/user_service.ts","subTypeLabel":"Editor Selection","secondaryText":"src/common/core/services/user_service.ts"}}]}],"last_human_input":null,"conversation_history":{"Chat Agent":[{"id":null,"name":null,"type":"HumanMessage","content":"In the current project I need to ensure that a webview in packages/lib_webview_agentic_chat has information about `avatarUrl` of the currently logged in user. The GraphQl query to get that information is in user_service (src/common/core/services/user_service.ts). Can you help me connect that service to the webview somehow? I would need to get that information sent down to the webview as part of the `pluginToWebview` communication channel, I guess. But please analyze all the options and let\'s see how far we can get","example":false,"additional_kwargs":{"additional_context":[{"id":"editor_selection:src/common/core/services/user_service.ts_22d20969-dfd7-4b78-9dac-c63de2f559ea","content":"DefaultUserService","category":"snippet","metadata":{"icon":"selection","title":"Selected text in src/common/core/services/user_service.ts","enabled":true,"subType":"snippet","fileName":"src/common/core/services/user_service.ts","subTypeLabel":"Editor Selection","secondaryText":"src/common/core/services/user_service.ts"}}]},"response_metadata":{}}]}}},"channel_versions":{"__start__":1}}',
524
+ },
525
+ },
526
+ ];