diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 2f835acb252..742ed21ea10 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -707429494a96d985d94e0b10da1c1c5519fa5fb6 +3de4744135aca47419474d244258a5e285dad834 diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION index 1479a3ce767..805c4f079ff 100644 --- a/GITLAB_KAS_VERSION +++ b/GITLAB_KAS_VERSION @@ -1 +1 @@ -31259f5394382f015730d7bbfeb775623d69145f +7e5564cdc5834808c2d668ffd5788146defaf881 diff --git a/app/assets/javascripts/ai/catalog/ai_catalog_app.vue b/app/assets/javascripts/ai/catalog/ai_catalog_app.vue index 98240aef810..8ad7cabba4d 100644 --- a/app/assets/javascripts/ai/catalog/ai_catalog_app.vue +++ b/app/assets/javascripts/ai/catalog/ai_catalog_app.vue @@ -1,3 +1,20 @@ + + diff --git a/app/assets/javascripts/ai/catalog/components/ai_catalog_nav_tabs.vue b/app/assets/javascripts/ai/catalog/components/ai_catalog_nav_tabs.vue new file mode 100644 index 00000000000..d7118e5a0df --- /dev/null +++ b/app/assets/javascripts/ai/catalog/components/ai_catalog_nav_tabs.vue @@ -0,0 +1,42 @@ + + + diff --git a/app/assets/javascripts/ai/catalog/graphql/ai_catalog_agents.query.graphql b/app/assets/javascripts/ai/catalog/graphql/ai_catalog_agents.query.graphql new file mode 100644 index 00000000000..201ba45b8d0 --- /dev/null +++ b/app/assets/javascripts/ai/catalog/graphql/ai_catalog_agents.query.graphql @@ -0,0 +1,10 @@ +query aiCatalogAgents { + aiCatalogAgents @client { + nodes { + id + name + description + model + } + } +} diff --git a/app/assets/javascripts/ai/catalog/graphql/user_workflows.query.graphql b/app/assets/javascripts/ai/catalog/graphql/user_workflows.query.graphql deleted file mode 100644 index 0f02a5cf39c..00000000000 --- a/app/assets/javascripts/ai/catalog/graphql/user_workflows.query.graphql +++ /dev/null @@ -1,12 +0,0 @@ -query userWorkflows { - currentUser @client { - id - workflows { - nodes { - id - type - name - } - } - } -} diff --git a/app/assets/javascripts/ai/catalog/index.js b/app/assets/javascripts/ai/catalog/index.js index 3b71d2f679a..5a1ee06f941 100644 --- a/app/assets/javascripts/ai/catalog/index.js +++ b/app/assets/javascripts/ai/catalog/index.js @@ -6,7 +6,7 @@ import createDefaultClient from '~/lib/graphql'; import AiCatalogApp from './ai_catalog_app.vue'; import { createRouter } from './router'; -import userWorkflowsQuery from './graphql/user_workflows.query.graphql'; +import aiCatalogAgentsQuery from './graphql/ai_catalog_agents.query.graphql'; export const initAiCatalog = (selector = '#js-ai-catalog') => { const el = document.querySelector(selector); @@ -26,24 +26,23 @@ export const initAiCatalog = (selector = '#js-ai-catalog') => { /* eslint-disable @gitlab/require-i18n-strings */ apolloProvider.clients.defaultClient.cache.writeQuery({ - query: userWorkflowsQuery, + query: aiCatalogAgentsQuery, data: { - currentUser: { - id: 1, - workflows: { - nodes: [ - { - id: 1, - name: 'Workflow 1', - type: 'Type 1', - }, - { - id: 2, - name: 'Workflow 2', - type: 'Type 2', - }, - ], - }, + aiCatalogAgents: { + nodes: [ + { + id: 1, + name: 'Claude Sonnet 4', + description: 'Smart, efficient model for everyday user', + model: 'claude-sonnet-4-20250514', + }, + { + id: 2, + name: 'Claude Opus 4', + description: 'Powerful, large model for complex challenges', + model: 'claude-opus-4-20250514', + }, + ], }, }, }); diff --git a/app/assets/javascripts/ai/catalog/pages/ai_catalog_agents.vue b/app/assets/javascripts/ai/catalog/pages/ai_catalog_agents.vue new file mode 100644 index 00000000000..14253248ca7 --- /dev/null +++ b/app/assets/javascripts/ai/catalog/pages/ai_catalog_agents.vue @@ -0,0 +1,41 @@ + + diff --git a/app/assets/javascripts/ai/catalog/pages/ai_catalog_index.vue b/app/assets/javascripts/ai/catalog/pages/ai_catalog_index.vue deleted file mode 100644 index b96f32c7e10..00000000000 --- a/app/assets/javascripts/ai/catalog/pages/ai_catalog_index.vue +++ /dev/null @@ -1,41 +0,0 @@ - - diff --git a/app/assets/javascripts/ai/catalog/router/constants.js b/app/assets/javascripts/ai/catalog/router/constants.js index 25dd624e936..4da99064c71 100644 --- a/app/assets/javascripts/ai/catalog/router/constants.js +++ b/app/assets/javascripts/ai/catalog/router/constants.js @@ -1 +1,2 @@ export const AI_CATALOG_INDEX_ROUTE = 'ai-catalog'; +export const AI_CATALOG_AGENTS_ROUTE = '/agents'; diff --git a/app/assets/javascripts/ai/catalog/router/index.js b/app/assets/javascripts/ai/catalog/router/index.js index f099754a317..5086c9850ea 100644 --- a/app/assets/javascripts/ai/catalog/router/index.js +++ b/app/assets/javascripts/ai/catalog/router/index.js @@ -1,7 +1,7 @@ import Vue from 'vue'; import VueRouter from 'vue-router'; -import AiCatalogIndex from '../pages/ai_catalog_index.vue'; -import { AI_CATALOG_INDEX_ROUTE } from './constants'; +import AiCatalogAgents from '../pages/ai_catalog_agents.vue'; +import { AI_CATALOG_INDEX_ROUTE, AI_CATALOG_AGENTS_ROUTE } from './constants'; Vue.use(VueRouter); @@ -13,7 +13,12 @@ export const createRouter = (base) => { { name: AI_CATALOG_INDEX_ROUTE, path: '', - component: AiCatalogIndex, + component: AiCatalogAgents, + }, + { + name: AI_CATALOG_AGENTS_ROUTE, + path: '/agents', + component: AiCatalogAgents, }, ], }); diff --git a/app/assets/javascripts/content_editor/extensions/task_item.js b/app/assets/javascripts/content_editor/extensions/task_item.js index 00c72965720..d05944bc002 100644 --- a/app/assets/javascripts/content_editor/extensions/task_item.js +++ b/app/assets/javascripts/content_editor/extensions/task_item.js @@ -1,4 +1,6 @@ import { TaskItem } from '@tiptap/extension-task-item'; +import { __, sprintf } from '~/locale'; +import { truncate } from '~/lib/utils/text_utility'; import { PARSE_HTML_PRIORITY_HIGHEST } from '../constants'; export default TaskItem.extend({ @@ -55,12 +57,31 @@ export default TaskItem.extend({ const nodeView = this.parent?.(); return ({ node, ...args }) => { const nodeViewInstance = nodeView({ node, ...args }); + const checkbox = nodeViewInstance.dom.querySelector('input[type=checkbox]'); + + const updateAriaLabel = (textContent) => { + checkbox.setAttribute( + 'aria-label', + sprintf(__('Check option: %{option}'), { + option: truncate(textContent, 100), + }), + ); + }; + + updateAriaLabel(node.firstChild.textContent); if (node.attrs.inapplicable) { - nodeViewInstance.dom.querySelector('input[type=checkbox]').disabled = true; + checkbox.disabled = true; } - return nodeViewInstance; + return { + ...nodeViewInstance, + update: (updatedNode) => { + const result = nodeViewInstance.update(updatedNode); + updateAriaLabel(updatedNode.firstChild.textContent); + return result; + }, + }; }; }, }); diff --git a/app/assets/javascripts/feature_flags/components/feature_flags_table.vue b/app/assets/javascripts/feature_flags/components/feature_flags_table.vue index 1f97ab2420d..8ebd8cf9d34 100644 --- a/app/assets/javascripts/feature_flags/components/feature_flags_table.vue +++ b/app/assets/javascripts/feature_flags/components/feature_flags_table.vue @@ -205,7 +205,7 @@ export default { >