diff --git a/apps/web/src/components/app-shell/app-sidebar.tsx b/apps/web/src/components/app-shell/app-sidebar.tsx index 1464ab4d..dcfbca59 100644 --- a/apps/web/src/components/app-shell/app-sidebar.tsx +++ b/apps/web/src/components/app-shell/app-sidebar.tsx @@ -19,6 +19,7 @@ import { GanttChart, Home, KanbanSquare, + MessageSquare, Monitor, Moon, MoreHorizontal, @@ -865,6 +866,11 @@ function NavItem({ // ── Project Nav ─────────────────────────────────────────────────────────────── const PROJECT_NAV_ITEMS = [ { segment: "agents", icon: Bot, labelKey: "nav.agents" }, + { + segment: "conversations", + icon: MessageSquare, + labelKey: "nav.conversations", + }, { segment: "automation", icon: Workflow, labelKey: "nav.automation" }, { segment: "team", icon: Users, labelKey: "nav.team" }, { segment: "settings", icon: Settings, labelKey: "nav.settings" }, @@ -894,6 +900,7 @@ function ProjectNav() { const ANON_HIDDEN_SEGMENTS = new Set([ "agents", + "conversations", "automation", "team", "settings", diff --git a/apps/web/src/i18n/locales/en/appShell.json b/apps/web/src/i18n/locales/en/appShell.json index 2d0c1cb8..16800650 100644 --- a/apps/web/src/i18n/locales/en/appShell.json +++ b/apps/web/src/i18n/locales/en/appShell.json @@ -24,6 +24,7 @@ "allProjects": "All Projects", "project": "Project", "agents": "Agents", + "conversations": "Conversations", "automation": "Automation", "team": "Team", "settings": "Settings" diff --git a/apps/web/src/i18n/locales/en/projects.json b/apps/web/src/i18n/locales/en/projects.json index d8c3e7ee..e43c29fa 100644 --- a/apps/web/src/i18n/locales/en/projects.json +++ b/apps/web/src/i18n/locales/en/projects.json @@ -121,8 +121,7 @@ "overview": "Overview", "mcpServers": "MCP Servers", "skills": "Skills", - "envVars": "Environment", - "conversations": "Conversations" + "envVars": "Environment" }, "overview": { "nameLabel": "Name", @@ -212,18 +211,6 @@ "cancel": "Cancel", "addSkill": "Add skill" } - }, - "conversations": { - "triggerChat": "Chat", - "triggerWriteDescription": "Write description", - "triggerTask": "Task", - "iterations_one": "{{count}} iteration", - "iterations_other": "{{count}} iterations", - "prOpened": "PR opened", - "empty": { - "title": "No conversations yet", - "description": "Conversations start when a task is assigned to this agent or someone messages it." - } } }, "conversationView": { @@ -985,6 +972,27 @@ "description": "All work items not assigned to a sprint." } }, + "conversationsPage": { + "title": "Conversations", + "triggerChat": "Chat", + "triggerWriteDescription": "Write description", + "triggerTask": "Task", + "iterations_one": "{{count}} iteration", + "iterations_other": "{{count}} iterations", + "prOpened": "PR opened", + "list": { + "empty": { + "title": "No conversations yet", + "description": "Conversations start when a task is assigned to an agent or someone messages one." + } + }, + "detail": { + "empty": { + "title": "No conversation selected", + "description": "Select a conversation from the list to view it." + } + } + }, "layout": { "shell": { "newSprint": "New sprint", diff --git a/apps/web/src/i18n/locales/es/appShell.json b/apps/web/src/i18n/locales/es/appShell.json index ab25c79d..0340d782 100644 --- a/apps/web/src/i18n/locales/es/appShell.json +++ b/apps/web/src/i18n/locales/es/appShell.json @@ -24,6 +24,7 @@ "allProjects": "Todos los proyectos", "project": "Proyecto", "agents": "Agentes", + "conversations": "Conversaciones", "automation": "Automatización", "team": "Equipo", "settings": "Configuración" diff --git a/apps/web/src/i18n/locales/es/projects.json b/apps/web/src/i18n/locales/es/projects.json index 0b18ad6b..ba18e9f2 100644 --- a/apps/web/src/i18n/locales/es/projects.json +++ b/apps/web/src/i18n/locales/es/projects.json @@ -121,8 +121,7 @@ "overview": "Resumen", "mcpServers": "Servidores MCP", "skills": "Skills", - "envVars": "Entorno", - "conversations": "Conversaciones" + "envVars": "Entorno" }, "overview": { "nameLabel": "Nombre", @@ -212,18 +211,6 @@ "cancel": "Cancelar", "addSkill": "Añadir skill" } - }, - "conversations": { - "triggerChat": "Chat", - "triggerWriteDescription": "Redactar descripción", - "triggerTask": "Tarea", - "iterations_one": "{{count}} iteración", - "iterations_other": "{{count}} iteraciones", - "prOpened": "PR abierto", - "empty": { - "title": "Aún no hay conversaciones", - "description": "Las conversaciones comienzan cuando se asigna una tarea a este agente o alguien le envía un mensaje." - } } }, "conversationView": { @@ -985,6 +972,27 @@ "description": "Todos los elementos de trabajo no asignados a un sprint." } }, + "conversationsPage": { + "title": "Conversaciones", + "triggerChat": "Chat", + "triggerWriteDescription": "Redactar descripción", + "triggerTask": "Tarea", + "iterations_one": "{{count}} iteración", + "iterations_other": "{{count}} iteraciones", + "prOpened": "PR abierto", + "list": { + "empty": { + "title": "Aún no hay conversaciones", + "description": "Las conversaciones comienzan cuando se asigna una tarea a un agente o alguien le envía un mensaje." + } + }, + "detail": { + "empty": { + "title": "Ninguna conversación seleccionada", + "description": "Selecciona una conversación de la lista para verla." + } + } + }, "layout": { "shell": { "newSprint": "Nuevo sprint", diff --git a/apps/web/src/i18n/locales/fr/appShell.json b/apps/web/src/i18n/locales/fr/appShell.json index a0ae9c79..2243a7eb 100644 --- a/apps/web/src/i18n/locales/fr/appShell.json +++ b/apps/web/src/i18n/locales/fr/appShell.json @@ -24,6 +24,7 @@ "allProjects": "Tous les projets", "project": "Projet", "agents": "Agents", + "conversations": "Conversations", "automation": "Automatisation", "team": "Équipe", "settings": "Paramètres" diff --git a/apps/web/src/i18n/locales/fr/projects.json b/apps/web/src/i18n/locales/fr/projects.json index 567e6ee7..6e709945 100644 --- a/apps/web/src/i18n/locales/fr/projects.json +++ b/apps/web/src/i18n/locales/fr/projects.json @@ -121,8 +121,7 @@ "overview": "Aperçu", "mcpServers": "Serveurs MCP", "skills": "Compétences", - "envVars": "Environnement", - "conversations": "Conversations" + "envVars": "Environnement" }, "overview": { "nameLabel": "Nom", @@ -212,18 +211,6 @@ "cancel": "Annuler", "addSkill": "Ajouter la compétence" } - }, - "conversations": { - "triggerChat": "Discussion", - "triggerWriteDescription": "Rédaction de description", - "triggerTask": "Tâche", - "iterations_one": "{{count}} itération", - "iterations_other": "{{count}} itérations", - "prOpened": "PR ouverte", - "empty": { - "title": "Aucune conversation pour le moment", - "description": "Les conversations démarrent lorsqu'une tâche est attribuée à cet agent ou que quelqu'un lui envoie un message." - } } }, "conversationView": { @@ -985,6 +972,27 @@ "description": "Tous les éléments de travail non assignés à un sprint." } }, + "conversationsPage": { + "title": "Conversations", + "triggerChat": "Discussion", + "triggerWriteDescription": "Rédaction de description", + "triggerTask": "Tâche", + "iterations_one": "{{count}} itération", + "iterations_other": "{{count}} itérations", + "prOpened": "PR ouverte", + "list": { + "empty": { + "title": "Aucune conversation pour le moment", + "description": "Les conversations démarrent lorsqu'une tâche est attribuée à un agent ou que quelqu'un lui envoie un message." + } + }, + "detail": { + "empty": { + "title": "Aucune conversation sélectionnée", + "description": "Sélectionnez une conversation dans la liste pour l'afficher." + } + } + }, "layout": { "shell": { "newSprint": "Nouveau sprint", diff --git a/apps/web/src/i18n/locales/ja/appShell.json b/apps/web/src/i18n/locales/ja/appShell.json index a295363a..0d1acb33 100644 --- a/apps/web/src/i18n/locales/ja/appShell.json +++ b/apps/web/src/i18n/locales/ja/appShell.json @@ -24,6 +24,7 @@ "allProjects": "すべてのプロジェクト", "project": "プロジェクト", "agents": "エージェント", + "conversations": "会話", "automation": "自動化", "team": "チーム", "settings": "設定" diff --git a/apps/web/src/i18n/locales/ja/projects.json b/apps/web/src/i18n/locales/ja/projects.json index b995eca6..7d8c29c5 100644 --- a/apps/web/src/i18n/locales/ja/projects.json +++ b/apps/web/src/i18n/locales/ja/projects.json @@ -121,8 +121,7 @@ "overview": "概要", "mcpServers": "MCPサーバー", "skills": "スキル", - "envVars": "環境変数", - "conversations": "会話" + "envVars": "環境変数" }, "overview": { "nameLabel": "名前", @@ -212,18 +211,6 @@ "cancel": "キャンセル", "addSkill": "スキルを追加" } - }, - "conversations": { - "triggerChat": "チャット", - "triggerWriteDescription": "説明の作成", - "triggerTask": "タスク", - "iterations_one": "{{count}}回の反復", - "iterations_other": "{{count}}回の反復", - "prOpened": "PRを作成しました", - "empty": { - "title": "会話はまだありません", - "description": "タスクがこのエージェントに割り当てられるか、誰かがメッセージを送ると会話が始まります。" - } } }, "conversationView": { @@ -985,6 +972,27 @@ "description": "スプリントに割り当てられていないすべての作業項目です。" } }, + "conversationsPage": { + "title": "会話", + "triggerChat": "チャット", + "triggerWriteDescription": "説明の作成", + "triggerTask": "タスク", + "iterations_one": "{{count}}回の反復", + "iterations_other": "{{count}}回の反復", + "prOpened": "PRを作成しました", + "list": { + "empty": { + "title": "会話はまだありません", + "description": "タスクがエージェントに割り当てられるか、誰かがメッセージを送ると会話が始まります。" + } + }, + "detail": { + "empty": { + "title": "会話が選択されていません", + "description": "リストから会話を選択すると表示されます。" + } + } + }, "layout": { "shell": { "newSprint": "新規スプリント", diff --git a/apps/web/src/i18n/locales/ko/appShell.json b/apps/web/src/i18n/locales/ko/appShell.json index bceb4240..d41643dd 100644 --- a/apps/web/src/i18n/locales/ko/appShell.json +++ b/apps/web/src/i18n/locales/ko/appShell.json @@ -24,6 +24,7 @@ "allProjects": "모든 프로젝트", "project": "프로젝트", "agents": "에이전트", + "conversations": "대화", "automation": "자동화", "team": "팀", "settings": "설정" diff --git a/apps/web/src/i18n/locales/ko/projects.json b/apps/web/src/i18n/locales/ko/projects.json index 2c3fb1fe..7498877a 100644 --- a/apps/web/src/i18n/locales/ko/projects.json +++ b/apps/web/src/i18n/locales/ko/projects.json @@ -121,8 +121,7 @@ "overview": "개요", "mcpServers": "MCP 서버", "skills": "스킬", - "envVars": "환경 변수", - "conversations": "대화" + "envVars": "환경 변수" }, "overview": { "nameLabel": "이름", @@ -212,18 +211,6 @@ "cancel": "취소", "addSkill": "스킬 추가" } - }, - "conversations": { - "triggerChat": "채팅", - "triggerWriteDescription": "설명 작성", - "triggerTask": "작업", - "iterations_one": "{{count}}회 반복", - "iterations_other": "{{count}}회 반복", - "prOpened": "PR 열림", - "empty": { - "title": "아직 대화가 없습니다", - "description": "이 에이전트에게 작업이 배정되거나 누군가 메시지를 보내면 대화가 시작됩니다." - } } }, "conversationView": { @@ -985,6 +972,27 @@ "description": "스프린트에 배정되지 않은 모든 작업 항목입니다." } }, + "conversationsPage": { + "title": "대화", + "triggerChat": "채팅", + "triggerWriteDescription": "설명 작성", + "triggerTask": "작업", + "iterations_one": "{{count}}회 반복", + "iterations_other": "{{count}}회 반복", + "prOpened": "PR 열림", + "list": { + "empty": { + "title": "아직 대화가 없습니다", + "description": "에이전트에게 작업이 배정되거나 누군가 메시지를 보내면 대화가 시작됩니다." + } + }, + "detail": { + "empty": { + "title": "선택된 대화가 없습니다", + "description": "목록에서 대화를 선택하면 여기에 표시됩니다." + } + } + }, "layout": { "shell": { "newSprint": "새 스프린트", diff --git a/apps/web/src/i18n/locales/pt-BR/appShell.json b/apps/web/src/i18n/locales/pt-BR/appShell.json index d9ec57f2..e40cb2f5 100644 --- a/apps/web/src/i18n/locales/pt-BR/appShell.json +++ b/apps/web/src/i18n/locales/pt-BR/appShell.json @@ -24,6 +24,7 @@ "allProjects": "Todos os Projetos", "project": "Projeto", "agents": "Agentes", + "conversations": "Conversas", "automation": "Automação", "team": "Equipe", "settings": "Configurações" diff --git a/apps/web/src/i18n/locales/pt-BR/projects.json b/apps/web/src/i18n/locales/pt-BR/projects.json index ffcb86ca..d6623a0e 100644 --- a/apps/web/src/i18n/locales/pt-BR/projects.json +++ b/apps/web/src/i18n/locales/pt-BR/projects.json @@ -121,8 +121,7 @@ "overview": "Visão geral", "mcpServers": "Servidores MCP", "skills": "Skills", - "envVars": "Ambiente", - "conversations": "Conversas" + "envVars": "Ambiente" }, "overview": { "nameLabel": "Nome", @@ -212,18 +211,6 @@ "cancel": "Cancelar", "addSkill": "Adicionar skill" } - }, - "conversations": { - "triggerChat": "Chat", - "triggerWriteDescription": "Escrever descrição", - "triggerTask": "Tarefa", - "iterations_one": "{{count}} iteração", - "iterations_other": "{{count}} iterações", - "prOpened": "PR aberto", - "empty": { - "title": "Nenhuma conversa ainda", - "description": "As conversas começam quando uma tarefa é atribuída a este agente ou quando alguém envia uma mensagem a ele." - } } }, "conversationView": { @@ -985,6 +972,27 @@ "description": "Todos os itens de trabalho não atribuídos a um sprint." } }, + "conversationsPage": { + "title": "Conversas", + "triggerChat": "Chat", + "triggerWriteDescription": "Escrever descrição", + "triggerTask": "Tarefa", + "iterations_one": "{{count}} iteração", + "iterations_other": "{{count}} iterações", + "prOpened": "PR aberto", + "list": { + "empty": { + "title": "Nenhuma conversa ainda", + "description": "As conversas começam quando uma tarefa é atribuída a um agente ou quando alguém envia uma mensagem a ele." + } + }, + "detail": { + "empty": { + "title": "Nenhuma conversa selecionada", + "description": "Selecione uma conversa na lista para visualizá-la." + } + } + }, "layout": { "shell": { "newSprint": "Novo sprint", diff --git a/apps/web/src/i18n/locales/ru/appShell.json b/apps/web/src/i18n/locales/ru/appShell.json index 1466e623..af427601 100644 --- a/apps/web/src/i18n/locales/ru/appShell.json +++ b/apps/web/src/i18n/locales/ru/appShell.json @@ -24,6 +24,7 @@ "allProjects": "Все проекты", "project": "Проект", "agents": "Агенты", + "conversations": "Диалоги", "automation": "Автоматизация", "team": "Команда", "settings": "Настройки" diff --git a/apps/web/src/i18n/locales/ru/projects.json b/apps/web/src/i18n/locales/ru/projects.json index 78718ad2..85a16e76 100644 --- a/apps/web/src/i18n/locales/ru/projects.json +++ b/apps/web/src/i18n/locales/ru/projects.json @@ -121,8 +121,7 @@ "overview": "Обзор", "mcpServers": "MCP-серверы", "skills": "Навыки", - "envVars": "Окружение", - "conversations": "Диалоги" + "envVars": "Окружение" }, "overview": { "nameLabel": "Имя", @@ -218,20 +217,6 @@ "cancel": "Отмена", "addSkill": "Добавить навык" } - }, - "conversations": { - "triggerChat": "Чат", - "triggerWriteDescription": "Написать описание", - "triggerTask": "Задача", - "iterations_one": "{{count}} итерация", - "iterations_few": "{{count}} итерации", - "iterations_many": "{{count}} итераций", - "iterations_other": "{{count}} итерации", - "prOpened": "PR открыт", - "empty": { - "title": "Диалогов пока нет", - "description": "Диалоги начинаются, когда задача назначена этому агенту или кто-то пишет ему сообщение." - } } }, "conversationView": { @@ -1003,6 +988,29 @@ "description": "Все элементы работы, не назначенные в спринт." } }, + "conversationsPage": { + "title": "Диалоги", + "triggerChat": "Чат", + "triggerWriteDescription": "Написать описание", + "triggerTask": "Задача", + "iterations_one": "{{count}} итерация", + "iterations_few": "{{count}} итерации", + "iterations_many": "{{count}} итераций", + "iterations_other": "{{count}} итерации", + "prOpened": "PR открыт", + "list": { + "empty": { + "title": "Диалогов пока нет", + "description": "Диалоги начинаются, когда задача назначена агенту или кто-то пишет ему сообщение." + } + }, + "detail": { + "empty": { + "title": "Диалог не выбран", + "description": "Выберите диалог из списка, чтобы просмотреть его." + } + } + }, "layout": { "shell": { "newSprint": "Новый спринт", diff --git a/apps/web/src/i18n/locales/vi/appShell.json b/apps/web/src/i18n/locales/vi/appShell.json index 4d1a77bd..68e7c6b2 100644 --- a/apps/web/src/i18n/locales/vi/appShell.json +++ b/apps/web/src/i18n/locales/vi/appShell.json @@ -24,6 +24,7 @@ "allProjects": "Tất cả dự án", "project": "Dự án", "agents": "Agent", + "conversations": "Hội thoại", "automation": "Tự động hóa", "team": "Đội nhóm", "settings": "Cài đặt" diff --git a/apps/web/src/i18n/locales/vi/projects.json b/apps/web/src/i18n/locales/vi/projects.json index 401f3a34..ca48f3a3 100644 --- a/apps/web/src/i18n/locales/vi/projects.json +++ b/apps/web/src/i18n/locales/vi/projects.json @@ -121,8 +121,7 @@ "overview": "Tổng quan", "mcpServers": "Máy chủ MCP", "skills": "Skill", - "envVars": "Môi trường", - "conversations": "Hội thoại" + "envVars": "Môi trường" }, "overview": { "nameLabel": "Tên", @@ -212,18 +211,6 @@ "cancel": "Hủy", "addSkill": "Thêm skill" } - }, - "conversations": { - "triggerChat": "Trò chuyện", - "triggerWriteDescription": "Viết mô tả", - "triggerTask": "Nhiệm vụ", - "iterations_one": "{{count}} lượt lặp", - "iterations_other": "{{count}} lượt lặp", - "prOpened": "PR đã mở", - "empty": { - "title": "Chưa có hội thoại nào", - "description": "Hội thoại bắt đầu khi một nhiệm vụ được giao cho agent này hoặc khi có ai đó nhắn tin cho nó." - } } }, "conversationView": { @@ -985,6 +972,27 @@ "description": "Tất cả công việc chưa được gán vào sprint nào." } }, + "conversationsPage": { + "title": "Hội thoại", + "triggerChat": "Trò chuyện", + "triggerWriteDescription": "Viết mô tả", + "triggerTask": "Nhiệm vụ", + "iterations_one": "{{count}} lượt lặp", + "iterations_other": "{{count}} lượt lặp", + "prOpened": "PR đã mở", + "list": { + "empty": { + "title": "Chưa có hội thoại nào", + "description": "Hội thoại bắt đầu khi một nhiệm vụ được giao cho agent hoặc khi có ai đó nhắn tin cho agent đó." + } + }, + "detail": { + "empty": { + "title": "Chưa chọn hội thoại nào", + "description": "Chọn một hội thoại từ danh sách để xem." + } + } + }, "layout": { "shell": { "newSprint": "Sprint mới", diff --git a/apps/web/src/i18n/locales/zh-CN/appShell.json b/apps/web/src/i18n/locales/zh-CN/appShell.json index 8c25c9b0..91a27bf8 100644 --- a/apps/web/src/i18n/locales/zh-CN/appShell.json +++ b/apps/web/src/i18n/locales/zh-CN/appShell.json @@ -24,6 +24,7 @@ "allProjects": "所有项目", "project": "项目", "agents": "智能体", + "conversations": "对话", "automation": "自动化", "team": "团队", "settings": "设置" diff --git a/apps/web/src/i18n/locales/zh-CN/projects.json b/apps/web/src/i18n/locales/zh-CN/projects.json index 9af68010..e52a2425 100644 --- a/apps/web/src/i18n/locales/zh-CN/projects.json +++ b/apps/web/src/i18n/locales/zh-CN/projects.json @@ -121,8 +121,7 @@ "overview": "概览", "mcpServers": "MCP 服务器", "skills": "技能", - "envVars": "环境变量", - "conversations": "对话" + "envVars": "环境变量" }, "overview": { "nameLabel": "名称", @@ -212,18 +211,6 @@ "cancel": "取消", "addSkill": "添加技能" } - }, - "conversations": { - "triggerChat": "聊天", - "triggerWriteDescription": "编写描述", - "triggerTask": "任务", - "iterations_one": "{{count}} 次迭代", - "iterations_other": "{{count}} 次迭代", - "prOpened": "PR 已创建", - "empty": { - "title": "暂无对话", - "description": "当任务分配给该智能体或有人向其发送消息时,对话将开始。" - } } }, "conversationView": { @@ -985,6 +972,27 @@ "description": "所有未分配到冲刺的工作项。" } }, + "conversationsPage": { + "title": "对话", + "triggerChat": "聊天", + "triggerWriteDescription": "编写描述", + "triggerTask": "任务", + "iterations_one": "{{count}} 次迭代", + "iterations_other": "{{count}} 次迭代", + "prOpened": "PR 已创建", + "list": { + "empty": { + "title": "暂无对话", + "description": "当任务分配给某个智能体或有人向其发送消息时,对话将开始。" + } + }, + "detail": { + "empty": { + "title": "未选择对话", + "description": "从列表中选择一个对话即可查看。" + } + } + }, "layout": { "shell": { "newSprint": "新建冲刺", diff --git a/apps/web/src/routeTree.gen.ts b/apps/web/src/routeTree.gen.ts index b0ccf1ae..f1252d75 100644 --- a/apps/web/src/routeTree.gen.ts +++ b/apps/web/src/routeTree.gen.ts @@ -20,9 +20,11 @@ import { Route as AuthenticatedProjectsProjectIdIndexRouteImport } from './route import { Route as AuthenticatedAdminUsersIndexRouteImport } from './routes/_authenticated/admin/users/index' import { Route as AuthenticatedAdminPluginsIndexRouteImport } from './routes/_authenticated/admin/plugins/index' import { Route as AuthenticatedAdminGlobalRolesIndexRouteImport } from './routes/_authenticated/admin/global-roles/index' +import { Route as AuthenticatedProjectsProjectIdConversationsRouteImport } from './routes/_authenticated/projects/$projectId/conversations' import { Route as AuthenticatedProjectsProjectIdTeamIndexRouteImport } from './routes/_authenticated/projects/$projectId/team/index' import { Route as AuthenticatedProjectsProjectIdSettingsIndexRouteImport } from './routes/_authenticated/projects/$projectId/settings/index' import { Route as AuthenticatedProjectsProjectIdDocsIndexRouteImport } from './routes/_authenticated/projects/$projectId/docs/index' +import { Route as AuthenticatedProjectsProjectIdConversationsIndexRouteImport } from './routes/_authenticated/projects/$projectId/conversations/index' import { Route as AuthenticatedProjectsProjectIdAutomationIndexRouteImport } from './routes/_authenticated/projects/$projectId/automation/index' import { Route as AuthenticatedProjectsProjectIdAgentsIndexRouteImport } from './routes/_authenticated/projects/$projectId/agents/index' import { Route as AuthenticatedProjectsProjectIdTasksTaskIdRouteImport } from './routes/_authenticated/projects/$projectId/tasks/$taskId' @@ -97,6 +99,12 @@ const AuthenticatedAdminGlobalRolesIndexRoute = path: '/admin/global-roles/', getParentRoute: () => AuthenticatedRoute, } as any) +const AuthenticatedProjectsProjectIdConversationsRoute = + AuthenticatedProjectsProjectIdConversationsRouteImport.update({ + id: '/conversations', + path: '/conversations', + getParentRoute: () => AuthenticatedProjectsProjectIdRoute, + } as any) const AuthenticatedProjectsProjectIdTeamIndexRoute = AuthenticatedProjectsProjectIdTeamIndexRouteImport.update({ id: '/team/', @@ -115,6 +123,12 @@ const AuthenticatedProjectsProjectIdDocsIndexRoute = path: '/docs/', getParentRoute: () => AuthenticatedProjectsProjectIdRoute, } as any) +const AuthenticatedProjectsProjectIdConversationsIndexRoute = + AuthenticatedProjectsProjectIdConversationsIndexRouteImport.update({ + id: '/', + path: '/', + getParentRoute: () => AuthenticatedProjectsProjectIdConversationsRoute, + } as any) const AuthenticatedProjectsProjectIdAutomationIndexRoute = AuthenticatedProjectsProjectIdAutomationIndexRouteImport.update({ id: '/automation/', @@ -153,9 +167,9 @@ const AuthenticatedProjectsProjectIdDocsDocIdRoute = } as any) const AuthenticatedProjectsProjectIdConversationsConversationIdRoute = AuthenticatedProjectsProjectIdConversationsConversationIdRouteImport.update({ - id: '/conversations/$conversationId', - path: '/conversations/$conversationId', - getParentRoute: () => AuthenticatedProjectsProjectIdRoute, + id: '/$conversationId', + path: '/$conversationId', + getParentRoute: () => AuthenticatedProjectsProjectIdConversationsRoute, } as any) const AuthenticatedProjectsProjectIdAutomationWorkflowIdRoute = AuthenticatedProjectsProjectIdAutomationWorkflowIdRouteImport.update({ @@ -195,6 +209,7 @@ export interface FileRoutesByFullPath { '/projects/$projectId': typeof AuthenticatedProjectsProjectIdRouteWithChildren '/home/': typeof AuthenticatedHomeIndexRoute '/profile/': typeof AuthenticatedProfileIndexRoute + '/projects/$projectId/conversations': typeof AuthenticatedProjectsProjectIdConversationsRouteWithChildren '/admin/global-roles/': typeof AuthenticatedAdminGlobalRolesIndexRoute '/admin/plugins/': typeof AuthenticatedAdminPluginsIndexRoute '/admin/users/': typeof AuthenticatedAdminUsersIndexRoute @@ -208,6 +223,7 @@ export interface FileRoutesByFullPath { '/projects/$projectId/tasks/$taskId': typeof AuthenticatedProjectsProjectIdTasksTaskIdRoute '/projects/$projectId/agents/': typeof AuthenticatedProjectsProjectIdAgentsIndexRoute '/projects/$projectId/automation/': typeof AuthenticatedProjectsProjectIdAutomationIndexRoute + '/projects/$projectId/conversations/': typeof AuthenticatedProjectsProjectIdConversationsIndexRoute '/projects/$projectId/docs/': typeof AuthenticatedProjectsProjectIdDocsIndexRoute '/projects/$projectId/settings/': typeof AuthenticatedProjectsProjectIdSettingsIndexRoute '/projects/$projectId/team/': typeof AuthenticatedProjectsProjectIdTeamIndexRoute @@ -234,6 +250,7 @@ export interface FileRoutesByTo { '/projects/$projectId/tasks/$taskId': typeof AuthenticatedProjectsProjectIdTasksTaskIdRoute '/projects/$projectId/agents': typeof AuthenticatedProjectsProjectIdAgentsIndexRoute '/projects/$projectId/automation': typeof AuthenticatedProjectsProjectIdAutomationIndexRoute + '/projects/$projectId/conversations': typeof AuthenticatedProjectsProjectIdConversationsIndexRoute '/projects/$projectId/docs': typeof AuthenticatedProjectsProjectIdDocsIndexRoute '/projects/$projectId/settings': typeof AuthenticatedProjectsProjectIdSettingsIndexRoute '/projects/$projectId/team': typeof AuthenticatedProjectsProjectIdTeamIndexRoute @@ -250,6 +267,7 @@ export interface FileRoutesById { '/_authenticated/projects/$projectId': typeof AuthenticatedProjectsProjectIdRouteWithChildren '/_authenticated/home/': typeof AuthenticatedHomeIndexRoute '/_authenticated/profile/': typeof AuthenticatedProfileIndexRoute + '/_authenticated/projects/$projectId/conversations': typeof AuthenticatedProjectsProjectIdConversationsRouteWithChildren '/_authenticated/admin/global-roles/': typeof AuthenticatedAdminGlobalRolesIndexRoute '/_authenticated/admin/plugins/': typeof AuthenticatedAdminPluginsIndexRoute '/_authenticated/admin/users/': typeof AuthenticatedAdminUsersIndexRoute @@ -263,6 +281,7 @@ export interface FileRoutesById { '/_authenticated/projects/$projectId/tasks/$taskId': typeof AuthenticatedProjectsProjectIdTasksTaskIdRoute '/_authenticated/projects/$projectId/agents/': typeof AuthenticatedProjectsProjectIdAgentsIndexRoute '/_authenticated/projects/$projectId/automation/': typeof AuthenticatedProjectsProjectIdAutomationIndexRoute + '/_authenticated/projects/$projectId/conversations/': typeof AuthenticatedProjectsProjectIdConversationsIndexRoute '/_authenticated/projects/$projectId/docs/': typeof AuthenticatedProjectsProjectIdDocsIndexRoute '/_authenticated/projects/$projectId/settings/': typeof AuthenticatedProjectsProjectIdSettingsIndexRoute '/_authenticated/projects/$projectId/team/': typeof AuthenticatedProjectsProjectIdTeamIndexRoute @@ -279,6 +298,7 @@ export interface FileRouteTypes { | '/projects/$projectId' | '/home/' | '/profile/' + | '/projects/$projectId/conversations' | '/admin/global-roles/' | '/admin/plugins/' | '/admin/users/' @@ -292,6 +312,7 @@ export interface FileRouteTypes { | '/projects/$projectId/tasks/$taskId' | '/projects/$projectId/agents/' | '/projects/$projectId/automation/' + | '/projects/$projectId/conversations/' | '/projects/$projectId/docs/' | '/projects/$projectId/settings/' | '/projects/$projectId/team/' @@ -318,6 +339,7 @@ export interface FileRouteTypes { | '/projects/$projectId/tasks/$taskId' | '/projects/$projectId/agents' | '/projects/$projectId/automation' + | '/projects/$projectId/conversations' | '/projects/$projectId/docs' | '/projects/$projectId/settings' | '/projects/$projectId/team' @@ -333,6 +355,7 @@ export interface FileRouteTypes { | '/_authenticated/projects/$projectId' | '/_authenticated/home/' | '/_authenticated/profile/' + | '/_authenticated/projects/$projectId/conversations' | '/_authenticated/admin/global-roles/' | '/_authenticated/admin/plugins/' | '/_authenticated/admin/users/' @@ -346,6 +369,7 @@ export interface FileRouteTypes { | '/_authenticated/projects/$projectId/tasks/$taskId' | '/_authenticated/projects/$projectId/agents/' | '/_authenticated/projects/$projectId/automation/' + | '/_authenticated/projects/$projectId/conversations/' | '/_authenticated/projects/$projectId/docs/' | '/_authenticated/projects/$projectId/settings/' | '/_authenticated/projects/$projectId/team/' @@ -439,6 +463,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AuthenticatedAdminGlobalRolesIndexRouteImport parentRoute: typeof AuthenticatedRoute } + '/_authenticated/projects/$projectId/conversations': { + id: '/_authenticated/projects/$projectId/conversations' + path: '/conversations' + fullPath: '/projects/$projectId/conversations' + preLoaderRoute: typeof AuthenticatedProjectsProjectIdConversationsRouteImport + parentRoute: typeof AuthenticatedProjectsProjectIdRoute + } '/_authenticated/projects/$projectId/team/': { id: '/_authenticated/projects/$projectId/team/' path: '/team' @@ -460,6 +491,13 @@ declare module '@tanstack/react-router' { preLoaderRoute: typeof AuthenticatedProjectsProjectIdDocsIndexRouteImport parentRoute: typeof AuthenticatedProjectsProjectIdRoute } + '/_authenticated/projects/$projectId/conversations/': { + id: '/_authenticated/projects/$projectId/conversations/' + path: '/' + fullPath: '/projects/$projectId/conversations/' + preLoaderRoute: typeof AuthenticatedProjectsProjectIdConversationsIndexRouteImport + parentRoute: typeof AuthenticatedProjectsProjectIdConversationsRoute + } '/_authenticated/projects/$projectId/automation/': { id: '/_authenticated/projects/$projectId/automation/' path: '/automation' @@ -504,10 +542,10 @@ declare module '@tanstack/react-router' { } '/_authenticated/projects/$projectId/conversations/$conversationId': { id: '/_authenticated/projects/$projectId/conversations/$conversationId' - path: '/conversations/$conversationId' + path: '/$conversationId' fullPath: '/projects/$projectId/conversations/$conversationId' preLoaderRoute: typeof AuthenticatedProjectsProjectIdConversationsConversationIdRouteImport - parentRoute: typeof AuthenticatedProjectsProjectIdRoute + parentRoute: typeof AuthenticatedProjectsProjectIdConversationsRoute } '/_authenticated/projects/$projectId/automation/$workflowId': { id: '/_authenticated/projects/$projectId/automation/$workflowId' @@ -547,10 +585,28 @@ declare module '@tanstack/react-router' { } } +interface AuthenticatedProjectsProjectIdConversationsRouteChildren { + AuthenticatedProjectsProjectIdConversationsConversationIdRoute: typeof AuthenticatedProjectsProjectIdConversationsConversationIdRoute + AuthenticatedProjectsProjectIdConversationsIndexRoute: typeof AuthenticatedProjectsProjectIdConversationsIndexRoute +} + +const AuthenticatedProjectsProjectIdConversationsRouteChildren: AuthenticatedProjectsProjectIdConversationsRouteChildren = + { + AuthenticatedProjectsProjectIdConversationsConversationIdRoute: + AuthenticatedProjectsProjectIdConversationsConversationIdRoute, + AuthenticatedProjectsProjectIdConversationsIndexRoute: + AuthenticatedProjectsProjectIdConversationsIndexRoute, + } + +const AuthenticatedProjectsProjectIdConversationsRouteWithChildren = + AuthenticatedProjectsProjectIdConversationsRoute._addFileChildren( + AuthenticatedProjectsProjectIdConversationsRouteChildren, + ) + interface AuthenticatedProjectsProjectIdRouteChildren { + AuthenticatedProjectsProjectIdConversationsRoute: typeof AuthenticatedProjectsProjectIdConversationsRouteWithChildren AuthenticatedProjectsProjectIdIndexRoute: typeof AuthenticatedProjectsProjectIdIndexRoute AuthenticatedProjectsProjectIdAutomationWorkflowIdRoute: typeof AuthenticatedProjectsProjectIdAutomationWorkflowIdRoute - AuthenticatedProjectsProjectIdConversationsConversationIdRoute: typeof AuthenticatedProjectsProjectIdConversationsConversationIdRoute AuthenticatedProjectsProjectIdDocsDocIdRoute: typeof AuthenticatedProjectsProjectIdDocsDocIdRoute AuthenticatedProjectsProjectIdInteractionsBacklogRoute: typeof AuthenticatedProjectsProjectIdInteractionsBacklogRoute AuthenticatedProjectsProjectIdInteractionsTimelineRoute: typeof AuthenticatedProjectsProjectIdInteractionsTimelineRoute @@ -567,12 +623,12 @@ interface AuthenticatedProjectsProjectIdRouteChildren { const AuthenticatedProjectsProjectIdRouteChildren: AuthenticatedProjectsProjectIdRouteChildren = { + AuthenticatedProjectsProjectIdConversationsRoute: + AuthenticatedProjectsProjectIdConversationsRouteWithChildren, AuthenticatedProjectsProjectIdIndexRoute: AuthenticatedProjectsProjectIdIndexRoute, AuthenticatedProjectsProjectIdAutomationWorkflowIdRoute: AuthenticatedProjectsProjectIdAutomationWorkflowIdRoute, - AuthenticatedProjectsProjectIdConversationsConversationIdRoute: - AuthenticatedProjectsProjectIdConversationsConversationIdRoute, AuthenticatedProjectsProjectIdDocsDocIdRoute: AuthenticatedProjectsProjectIdDocsDocIdRoute, AuthenticatedProjectsProjectIdInteractionsBacklogRoute: diff --git a/apps/web/src/routes/_authenticated/projects/$projectId/agents/$agentId/index.tsx b/apps/web/src/routes/_authenticated/projects/$projectId/agents/$agentId/index.tsx index 46fb7c3a..c5448594 100644 --- a/apps/web/src/routes/_authenticated/projects/$projectId/agents/$agentId/index.tsx +++ b/apps/web/src/routes/_authenticated/projects/$projectId/agents/$agentId/index.tsx @@ -1,21 +1,16 @@ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { createFileRoute, Link } from "@tanstack/react-router"; +import { createFileRoute } from "@tanstack/react-router"; import { Bot, Check, - Clock, Code2, - GitBranch, - GitPullRequest, KeyRound, Loader2, - MessageSquare, Plus, Save, Server, Trash2, Wand2, - Zap, } from "lucide-react"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; @@ -49,7 +44,6 @@ import { useProjectPermissions } from "@/hooks/use-project-permissions"; import { type ACPProvider, type Agent, - type AgentConversation, type AgentMCPServer, type AgentSkill, addEnvVar, @@ -59,9 +53,6 @@ import { agentMCPServersQueryOptions, agentQueryOptions, agentSkillsQueryOptions, - CONVERSATION_STATUS_COLORS, - CONVERSATION_STATUS_LABELS, - conversationsQueryOptions, deleteEnvVar, deleteMCPServer, deleteSkill, @@ -86,16 +77,13 @@ export const Route = createFileRoute( ), queryClient.ensureQueryData(agentSkillsQueryOptions(projectId, agentId)), queryClient.ensureQueryData(agentEnvVarsQueryOptions(projectId, agentId)), - queryClient.ensureQueryData( - conversationsQueryOptions(projectId, agentId), - ), queryClient.ensureQueryData(llmModelsQueryOptions), ]); }, component: AgentDetailPage, }); -type Tab = "overview" | "mcp-servers" | "skills" | "env-vars" | "conversations"; +type Tab = "overview" | "mcp-servers" | "skills" | "env-vars"; const CUSTOM = "__custom__"; @@ -1232,115 +1220,6 @@ function EnvVarsTab({ ); } -// ── Conversations Tab ───────────────────────────────────────────────────────── - -function ConversationRow({ - conv, - projectId, -}: { - conv: AgentConversation; - projectId: string; -}) { - const { t } = useTranslation("projects"); - const statusColor = CONVERSATION_STATUS_COLORS[conv.status]; - const statusLabel = CONVERSATION_STATUS_LABELS[conv.status]; - - return ( - -
- {t("agents.detail.conversations.empty.title")} -
-- {t("agents.detail.conversations.empty.description")} -
-+ {t("conversationsPage.list.empty.title")} +
++ {t("conversationsPage.list.empty.description")} +
++ {t("conversationsPage.detail.empty.title")} +
++ {t("conversationsPage.detail.empty.description")} +
+