@cat-factory/app 0.174.0 → 0.178.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +52 -13
  2. package/app/components/board/nodes/BlockNode.vue +30 -0
  3. package/app/components/environments/steps/EnvPickStep.vue +3 -0
  4. package/app/components/layout/IntegrationBackTitle.vue +11 -8
  5. package/app/components/layout/IntegrationsHub.vue +35 -56
  6. package/app/components/layout/ModelProvidersHub.vue +250 -0
  7. package/app/components/panels/InspectorPanel.vue +3 -28
  8. package/app/components/panels/inspector/ContainerSummary.vue +54 -62
  9. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +11 -0
  10. package/app/components/panels/inspector/ServiceValidationConfig.vue +99 -1
  11. package/app/components/settings/ComposeEnvironmentSetupSection.vue +102 -0
  12. package/app/components/settings/InfrastructureWindow.vue +11 -1
  13. package/app/composables/api/validationChecks.ts +8 -0
  14. package/app/composables/useIntegrationBack.ts +5 -2
  15. package/app/composables/useNavContributions.ts +1 -1
  16. package/app/modular/nav-contributions.spec.ts +64 -21
  17. package/app/modular/nav-contributions.ts +59 -26
  18. package/app/pages/index.vue +4 -0
  19. package/app/stores/ui/modals.ts +32 -6
  20. package/app/stores/validationChecks.ts +17 -2
  21. package/app/types/validationChecks.ts +3 -0
  22. package/app/utils/validationDetection.spec.ts +51 -0
  23. package/app/utils/validationDetection.ts +67 -0
  24. package/i18n/locales/de.json +110 -33
  25. package/i18n/locales/en.json +110 -33
  26. package/i18n/locales/es.json +110 -33
  27. package/i18n/locales/fr.json +110 -33
  28. package/i18n/locales/he.json +110 -33
  29. package/i18n/locales/it.json +110 -33
  30. package/i18n/locales/ja.json +110 -33
  31. package/i18n/locales/pl.json +110 -33
  32. package/i18n/locales/tr.json +110 -33
  33. package/i18n/locales/uk.json +110 -33
  34. package/package.json +2 -2
@@ -111,6 +111,8 @@
111
111
  "repositories": "Repositorios",
112
112
  "addFromRepo": "Añadir desde un repositorio existente",
113
113
  "bootstrapRepo": "Inicializar repositorio",
114
+ "models": "Modelos",
115
+ "modelProviders": "Proveedores de modelos",
114
116
  "integrations": "Integraciones",
115
117
  "sandbox": "Entorno de pruebas",
116
118
  "kaizen": "Kaizen",
@@ -122,8 +124,7 @@
122
124
  "accountSettings": "Ajustes de la cuenta",
123
125
  "operatorDashboard": "Observabilidad de la plataforma",
124
126
  "reports": "Informes",
125
- "infrastructure": "Infraestructura",
126
- "environmentSetup": "Configuración de entorno"
127
+ "infrastructure": "Infraestructura"
127
128
  },
128
129
  "board": {
129
130
  "toast": {
@@ -394,6 +395,7 @@
394
395
  "dragToResize": "Arrastra para cambiar el tamaño",
395
396
  "addFirstTask": "Añade la primera tarea",
396
397
  "createInitiativeTitle": "Crear iniciativa",
398
+ "huntBugsTitle": "Cazar errores",
397
399
  "accessDenied": {
398
400
  "title": "Permiso denegado",
399
401
  "hint": "No tienes acceso al repositorio que respalda este servicio."
@@ -631,12 +633,12 @@
631
633
  "inspector": {
632
634
  "detectRepoUnresolved": "El repositorio de este bloque no está entre los repositorios de GitHub conectados, por lo que no se puede leer. Conecta o sincroniza GitHub para él y vuelve a intentarlo.",
633
635
  "container": {
634
- "title": "Contenido",
635
- "hint": "Los módulos y tareas dentro de este bloque. Haz clic en una entrada para seleccionarla en el tablero.",
636
- "modules": "Módulos ({count})",
636
+ "modulesTitle": "Módulos",
637
+ "modulesHint": "Los módulos dentro de este servicio. Haz clic en uno para seleccionarlo en el tablero.",
637
638
  "taskCount": "{count} tarea | {count} tareas",
638
- "allTasks": "Todas las tareas ({count})",
639
- "tasks": "Tareas ({count})",
639
+ "tasksTitle": "Tareas",
640
+ "allTasksTitle": "Todas las tareas",
641
+ "tasksHint": "Las tareas dentro de este bloque. Haz clic en una para seleccionarla en el tablero.",
640
642
  "addTask": "Añadir tarea",
641
643
  "noTasks": "Aún no hay tareas. Añade una para empezar a trabajar.",
642
644
  "servicesHint": "Los servicios son de larga duración y no se completan. El trabajo ocurre en sus tareas y módulos."
@@ -1102,7 +1104,34 @@
1102
1104
  "save": "Guardar comprobaciones",
1103
1105
  "savedToast": "Comprobaciones guardadas",
1104
1106
  "saveFailed": "No se pudieron guardar las comprobaciones",
1105
- "clearFailed": "No se pudieron vaciar las comprobaciones"
1107
+ "clearFailed": "No se pudieron vaciar las comprobaciones",
1108
+ "detect": {
1109
+ "action": "Detectar",
1110
+ "hint": "Sugerir comprobaciones a partir del repositorio de este servicio",
1111
+ "added": "Se añadió {count} comprobación | Se añadieron {count} comprobaciones",
1112
+ "found": "Se reconoció {ecosystems}.",
1113
+ "capped": "Se omitieron algunas sugerencias: un servicio admite como máximo {max} comprobaciones.",
1114
+ "nothingNew": "No hay nada que añadir",
1115
+ "alreadyPresent": "Todos los comandos detectados ya están en la lista.",
1116
+ "unrecognised": "No se reconoció ningún ecosistema conocido en la raíz del repositorio. Añade los comandos a mano.",
1117
+ "repo_unavailable": "Este servicio no tiene ningún repositorio vinculado, así que no hay nada que inspeccionar.",
1118
+ "failed": "No se pudo leer el repositorio"
1119
+ },
1120
+ "ecosystem": {
1121
+ "node": "Node.js",
1122
+ "python": "Python",
1123
+ "go": "Go",
1124
+ "rust": "Rust",
1125
+ "maven": "Maven",
1126
+ "gradle": "Gradle",
1127
+ "dotnet": ".NET",
1128
+ "ruby": "Ruby",
1129
+ "php": "PHP",
1130
+ "elixir": "Elixir",
1131
+ "make": "Make",
1132
+ "just": "just",
1133
+ "task": "Task"
1134
+ }
1106
1135
  }
1107
1136
  },
1108
1137
  "panels": {
@@ -1318,8 +1347,6 @@
1318
1347
  "lastIncorporatedRequirements": "Últimos requisitos incorporados",
1319
1348
  "priorDocHint": "De la revisión anterior. Úsalo como base: edita la descripción de arriba y reenvíala.",
1320
1349
  "bootstrapping": "Inicializando…",
1321
- "importIssue": "Importar incidencia",
1322
- "connectTracker": "Conectar un tracker",
1323
1350
  "spawnFromDocument": "Generar desde documento",
1324
1351
  "viewRequirements": "Ver requisitos",
1325
1352
  "reRun": "Reejecutar",
@@ -1353,8 +1380,7 @@
1353
1380
  "title": "¿Archivar este servicio?",
1354
1381
  "body": "«{name}» y sus tareas se ocultarán del tablero. Puedes restaurarlo en cualquier momento."
1355
1382
  },
1356
- "runBlocked": "Bloqueado por una dependencia sin terminar: {names} | Bloqueado por {count} dependencias sin terminar: {names}",
1357
- "huntBugs": "Cazar errores"
1383
+ "runBlocked": "Bloqueado por una dependencia sin terminar: {names} | Bloqueado por {count} dependencias sin terminar: {names}"
1358
1384
  }
1359
1385
  },
1360
1386
  "observability": {
@@ -1936,7 +1962,8 @@
1936
1962
  },
1937
1963
  "integrationBack": {
1938
1964
  "backToMySetup": "Volver a Mi configuración",
1939
- "backToIntegrations": "Volver a Integraciones"
1965
+ "backToIntegrations": "Volver a Integraciones",
1966
+ "backToModelProviders": "Volver a Proveedores de modelos"
1940
1967
  },
1941
1968
  "commandBar": {
1942
1969
  "searchPlaceholder": "Busca o ejecuta un comando…",
@@ -1997,23 +2024,21 @@
1997
2024
  },
1998
2025
  "integrationsHub": {
1999
2026
  "title": "Integraciones",
2000
- "intro": "Conecta y gestiona los sistemas externos que este espacio de trabajo puede vincular.",
2027
+ "intro": "Conecta y gestiona los sistemas externos opcionales que este espacio de trabajo puede vincular. Los modelos con los que se ejecutan tus agentes están en Proveedores de modelos.",
2001
2028
  "searchPlaceholder": "Buscar integraciones…",
2002
2029
  "noMatches": "Ninguna integración coincide con \"{query}\".",
2003
2030
  "getStarted": {
2004
2031
  "title": "Primeros pasos",
2005
- "body": "Conecta una fuente de código y un proveedor de modelos para ejecutar tu primera canalización."
2032
+ "body": "Conecta una fuente de código para que tus canalizaciones tengan algo sobre lo que trabajar."
2006
2033
  },
2007
2034
  "status": {
2008
2035
  "connected": "Conectado",
2009
- "keyConnected": "Clave conectada",
2010
2036
  "notConnected": "Sin conectar",
2011
2037
  "needsAttention": "Requiere atención",
2012
2038
  "disabled": "Desactivado",
2013
2039
  "recommended": "Recomendado"
2014
2040
  },
2015
2041
  "groups": {
2016
- "models": "Modelos y proveedores",
2017
2042
  "sourceControl": "Control de código fuente",
2018
2043
  "communication": "Comunicación",
2019
2044
  "documents": "Documentos",
@@ -2023,16 +2048,6 @@
2023
2048
  "personal": "Personal (solo tú)"
2024
2049
  },
2025
2050
  "items": {
2026
- "openrouter": {
2027
- "description": "Una sola puerta de enlace a más de 300 modelos. Añade tu clave y activa modelos en un único lugar."
2028
- },
2029
- "vendors": {
2030
- "label": "Proveedores y claves",
2031
- "description": "Suscripciones de LLM del espacio de trabajo y claves API de proveedores."
2032
- },
2033
- "personalSubs": {
2034
- "label": "Suscripciones personales (Claude, ChatGPT/Codex, GLM)"
2035
- },
2036
2051
  "github": {
2037
2052
  "description": "Conecta la GitHub App del espacio de trabajo y explora repositorios, PR e incidencias."
2038
2053
  },
@@ -2072,10 +2087,6 @@
2072
2087
  "label": "Mi token de GitHub",
2073
2088
  "description": "Un token de acceso personal usado para las ejecuciones que inicias (pushes, PR, CI, fusión)."
2074
2089
  },
2075
- "localRunners": {
2076
- "label": "Mis ejecutores locales",
2077
- "description": "Tus ejecutores de modelos en tu propia máquina (Ollama, LM Studio, vLLM…)."
2078
- },
2079
2090
  "documentTemplates": {
2080
2091
  "label": "Plantillas y ejemplos"
2081
2092
  },
@@ -2085,6 +2096,45 @@
2085
2096
  }
2086
2097
  }
2087
2098
  },
2099
+ "modelProvidersHub": {
2100
+ "title": "Proveedores de modelos",
2101
+ "intro": "Los motores con los que se ejecutan tus agentes. Debe haber al menos un proveedor conectado antes de que pueda ejecutarse cualquier paso de una canalización.",
2102
+ "searchPlaceholder": "Buscar proveedores…",
2103
+ "noMatches": "Ningún proveedor coincide con \"{query}\".",
2104
+ "getStarted": {
2105
+ "title": "Todavía no hay ningún proveedor conectado",
2106
+ "body": "Los pasos de agente no pueden ejecutarse hasta que haya un modelo accesible. Una clave de OpenRouter es la forma más rápida de desbloquear un catálogo amplio, pero las claves de proveedor, un plan personal o tu propio ejecutor local funcionan igual de bien."
2107
+ },
2108
+ "status": {
2109
+ "connected": "Conectado",
2110
+ "keyConnected": "Clave conectada",
2111
+ "notConnected": "Sin conectar",
2112
+ "recommended": "Recomendado",
2113
+ "connectedCount": "ninguno conectado | {count} conectado | {count} conectados"
2114
+ },
2115
+ "groups": {
2116
+ "workspace": "Proveedores del espacio de trabajo",
2117
+ "personal": "Personal (solo tú)",
2118
+ "personalNote": "Pertenecen a tu cuenta y no al espacio de trabajo, y solo se usan en las ejecuciones que inicias tú. También aparecen en Mi configuración."
2119
+ },
2120
+ "items": {
2121
+ "openrouter": {
2122
+ "description": "Una sola puerta de enlace a más de 300 modelos. Añade tu clave y activa modelos en un único lugar."
2123
+ },
2124
+ "vendors": {
2125
+ "label": "Proveedores y claves",
2126
+ "description": "Suscripciones de LLM del espacio de trabajo y claves API de proveedores."
2127
+ },
2128
+ "personalSubs": {
2129
+ "label": "Mis suscripciones",
2130
+ "description": "Planes de uso individual que desbloqueas con una contraseña personal (Claude, GLM, Codex)."
2131
+ },
2132
+ "localRunners": {
2133
+ "label": "Mis ejecutores locales",
2134
+ "description": "Tus ejecutores de modelos en tu propia máquina (Ollama, LM Studio, vLLM)."
2135
+ }
2136
+ }
2137
+ },
2088
2138
  "shortcuts": {
2089
2139
  "title": "Atajos de teclado",
2090
2140
  "commandBar": "Abrir la barra de comandos",
@@ -2653,6 +2703,32 @@
2653
2703
  "removeFailed": "No se pudo eliminar el stack compartido"
2654
2704
  }
2655
2705
  },
2706
+ "composeEnvSetup": {
2707
+ "title": "Configuración guiada de Docker Compose para un servicio",
2708
+ "lead": "Guía a un servicio en la creación de la receta de Docker Compose con la que se levantan sus entornos de prueba, en lugar de escribir a mano la ruta del compose y los pasos de preparación.",
2709
+ "how": {
2710
+ "title": "Cómo funciona",
2711
+ "scan": "Analiza el repositorio vinculado del servicio en busca de archivos compose, perfiles, archivos de entorno y volcados de datos iniciales.",
2712
+ "analyse": "Opcionalmente ejecuta el agente analista de entornos para redactar pasos de preparación y una comprobación de salud a partir de los propios scripts del repositorio.",
2713
+ "preflight": "Ejecuta las comprobaciones previas de la receta en la máquina que la aprovisionará.",
2714
+ "save": "Guarda la receta en el servicio y registra el gestor de Docker Compose del espacio de trabajo.",
2715
+ "outcome": "A partir de ahí el Deployer levanta exactamente esa pila siempre que una canalización necesita un entorno vivo, y el Tester se ejecuta contra ella. No se aplica nada hasta que guardas."
2716
+ },
2717
+ "needed": {
2718
+ "title": "Lo necesitas cuando",
2719
+ "running": "Las pruebas del servicio necesitan la aplicación realmente en marcha: pruebas de API o de interfaz, migraciones, datos iniciales.",
2720
+ "compose": "El servicio se aprovisiona con Docker Compose y todavía no tiene ninguna receta guardada.",
2721
+ "setup": "Levantar la pila requiere más de un comando: perfiles, archivos de entorno, datos iniciales o una comprobación de disponibilidad."
2722
+ },
2723
+ "notNeeded": {
2724
+ "title": "Puedes omitirlo cuando",
2725
+ "inContainer": "La canalización solo pasa el linter, compila o ejecuta pruebas unitarias. Eso se ejecuta dentro del contenedor del agente como comprobaciones previas a la PR, sin aprovisionar ningún entorno.",
2726
+ "otherBackend": "El servicio se aprovisiona de otra forma (Kubernetes, una vista previa en la nube o sin infraestructura). Configúralo arriba en su lugar.",
2727
+ "noRepo": "El servicio no tiene repositorio vinculado, así que no hay nada que analizar."
2728
+ },
2729
+ "start": "Iniciar configuración guiada",
2730
+ "rerunHint": "Vuelve a ejecutarlo cuando quieras para cambiar una receta guardada."
2731
+ },
2656
2732
  "localMode": {
2657
2733
  "title": "Modo local",
2658
2734
  "intro": "Ajustes del ejecutor de contenedores local, almacenados en el despliegue de esta máquina (reemplazó las variables de entorno {poolVars} / {harnessVars}). Guardar redimensiona el grupo en caliente en vivo, sin necesidad de reiniciar; las ejecuciones en curso conservan el contenedor que ya tienen.",
@@ -5257,8 +5333,8 @@
5257
5333
  },
5258
5334
  "environmentWizard": {
5259
5335
  "progress": "Paso {index} de {total}",
5260
- "title": "Configurar un entorno de pruebas",
5261
- "subtitle": "Detecta, revisa y guarda una receta de Docker Compose para que el Deployer la aprovisione.",
5336
+ "title": "Configuración de entorno de Docker Compose",
5337
+ "subtitle": "Crea la receta de Docker Compose con la que se levantan los entornos de prueba de un servicio: analiza el repositorio, revisa, comprueba y guarda.",
5262
5338
  "recommended": "recomendado",
5263
5339
  "steps": {
5264
5340
  "pick": "Elegir servicio",
@@ -5268,6 +5344,7 @@
5268
5344
  },
5269
5345
  "pick": {
5270
5346
  "intro": "Elige el servicio para el que configurar un entorno de Docker Compose.",
5347
+ "scope": "Solo cambia el servicio que elijas. Vuelve a ejecutar esto más adelante para editar su receta.",
5271
5348
  "empty": "Aún no hay servicios. Añade uno primero."
5272
5349
  },
5273
5350
  "review": {
@@ -111,6 +111,8 @@
111
111
  "repositories": "Dépôts",
112
112
  "addFromRepo": "Ajouter depuis un dépôt existant",
113
113
  "bootstrapRepo": "Initialiser un dépôt",
114
+ "models": "Modèles",
115
+ "modelProviders": "Fournisseurs de modèles",
114
116
  "integrations": "Intégrations",
115
117
  "sandbox": "Bac à sable",
116
118
  "kaizen": "Kaizen",
@@ -122,8 +124,7 @@
122
124
  "accountSettings": "Paramètres du compte",
123
125
  "operatorDashboard": "Observabilité de la plateforme",
124
126
  "reports": "Rapports",
125
- "infrastructure": "Infrastructure",
126
- "environmentSetup": "Configuration d'environnement"
127
+ "infrastructure": "Infrastructure"
127
128
  },
128
129
  "board": {
129
130
  "toast": {
@@ -394,6 +395,7 @@
394
395
  "dragToResize": "Glisser pour redimensionner",
395
396
  "addFirstTask": "Ajouter la première tâche",
396
397
  "createInitiativeTitle": "Creer une initiative",
398
+ "huntBugsTitle": "Chasser les bugs",
397
399
  "accessDenied": {
398
400
  "title": "Autorisation refusée",
399
401
  "hint": "Vous n'avez pas accès au dépôt sur lequel repose ce service."
@@ -631,12 +633,12 @@
631
633
  "inspector": {
632
634
  "detectRepoUnresolved": "Le dépôt de ce bloc ne figure pas parmi les dépôts GitHub connectés et ne peut donc pas être lu. Connectez ou synchronisez GitHub pour ce dépôt, puis réessayez.",
633
635
  "container": {
634
- "title": "Contenu",
635
- "hint": "Les modules et les tâches contenus dans ce bloc. Cliquez sur une entrée pour la sélectionner sur le tableau.",
636
- "modules": "Modules ({count})",
636
+ "modulesTitle": "Modules",
637
+ "modulesHint": "Les modules de ce service. Cliquez sur l'un d'eux pour le sélectionner sur le tableau.",
637
638
  "taskCount": "{count} tâche | {count} tâches",
638
- "allTasks": "Toutes les tâches ({count})",
639
- "tasks": "Tâches ({count})",
639
+ "tasksTitle": "Tâches",
640
+ "allTasksTitle": "Toutes les tâches",
641
+ "tasksHint": "Les tâches contenues dans ce bloc. Cliquez sur l'une d'elles pour la sélectionner sur le tableau.",
640
642
  "addTask": "Ajouter une tâche",
641
643
  "noTasks": "Aucune tâche pour le moment. Ajoutez-en une pour commencer.",
642
644
  "servicesHint": "Les services sont permanents et ne se terminent pas. Le travail se fait dans leurs tâches et modules."
@@ -1102,7 +1104,34 @@
1102
1104
  "save": "Enregistrer les vérifications",
1103
1105
  "savedToast": "Vérifications enregistrées",
1104
1106
  "saveFailed": "Impossible d'enregistrer les vérifications",
1105
- "clearFailed": "Impossible de vider les vérifications"
1107
+ "clearFailed": "Impossible de vider les vérifications",
1108
+ "detect": {
1109
+ "action": "Détecter",
1110
+ "hint": "Proposer des vérifications à partir du dépôt de ce service",
1111
+ "added": "{count} vérification ajoutée | {count} vérifications ajoutées",
1112
+ "found": "Reconnu : {ecosystems}.",
1113
+ "capped": "Certaines suggestions ont été écartées : un service accepte au plus {max} vérifications.",
1114
+ "nothingNew": "Rien à ajouter",
1115
+ "alreadyPresent": "Toutes les commandes détectées figurent déjà dans la liste.",
1116
+ "unrecognised": "Aucun écosystème connu n'a été reconnu à la racine du dépôt. Ajoutez les commandes à la main.",
1117
+ "repo_unavailable": "Aucun dépôt n'est lié à ce service, il n'y a donc rien à inspecter.",
1118
+ "failed": "Le dépôt n'a pas pu être lu"
1119
+ },
1120
+ "ecosystem": {
1121
+ "node": "Node.js",
1122
+ "python": "Python",
1123
+ "go": "Go",
1124
+ "rust": "Rust",
1125
+ "maven": "Maven",
1126
+ "gradle": "Gradle",
1127
+ "dotnet": ".NET",
1128
+ "ruby": "Ruby",
1129
+ "php": "PHP",
1130
+ "elixir": "Elixir",
1131
+ "make": "Make",
1132
+ "just": "just",
1133
+ "task": "Task"
1134
+ }
1106
1135
  }
1107
1136
  },
1108
1137
  "panels": {
@@ -1318,8 +1347,6 @@
1318
1347
  "lastIncorporatedRequirements": "Dernières exigences intégrées",
1319
1348
  "priorDocHint": "Issu de la revue précédente. Utilisez-le comme base : modifiez la description ci-dessus et resoumettez.",
1320
1349
  "bootstrapping": "Initialisation…",
1321
- "importIssue": "Importer une issue",
1322
- "connectTracker": "Connecter un tracker",
1323
1350
  "spawnFromDocument": "Créer à partir d'un document",
1324
1351
  "viewRequirements": "Voir les exigences",
1325
1352
  "reRun": "Relancer",
@@ -1353,8 +1380,7 @@
1353
1380
  "title": "Archiver ce service ?",
1354
1381
  "body": "« {name} » et ses tâches seront masqués du tableau. Vous pouvez le restaurer à tout moment."
1355
1382
  },
1356
- "runBlocked": "Bloqué par une dépendance non terminée : {names} | Bloqué par {count} dépendances non terminées : {names}",
1357
- "huntBugs": "Chasser les bugs"
1383
+ "runBlocked": "Bloqué par une dépendance non terminée : {names} | Bloqué par {count} dépendances non terminées : {names}"
1358
1384
  }
1359
1385
  },
1360
1386
  "observability": {
@@ -1936,7 +1962,8 @@
1936
1962
  },
1937
1963
  "integrationBack": {
1938
1964
  "backToMySetup": "Retour à Ma configuration",
1939
- "backToIntegrations": "Retour aux Intégrations"
1965
+ "backToIntegrations": "Retour aux Intégrations",
1966
+ "backToModelProviders": "Retour aux Fournisseurs de modèles"
1940
1967
  },
1941
1968
  "commandBar": {
1942
1969
  "searchPlaceholder": "Rechercher ou exécuter une commande…",
@@ -1997,23 +2024,21 @@
1997
2024
  },
1998
2025
  "integrationsHub": {
1999
2026
  "title": "Intégrations",
2000
- "intro": "Connectez et gérez les systèmes externes que cet espace de travail peut relier.",
2027
+ "intro": "Connectez et gérez les systèmes externes optionnels que cet espace de travail peut relier. Les modèles qui font tourner vos agents se trouvent dans Fournisseurs de modèles.",
2001
2028
  "searchPlaceholder": "Rechercher des intégrations…",
2002
2029
  "noMatches": "Aucune intégration ne correspond à \"{query}\".",
2003
2030
  "getStarted": {
2004
2031
  "title": "Pour commencer",
2005
- "body": "Connectez une source de code et un fournisseur de modèles pour exécuter votre premier pipeline."
2032
+ "body": "Connectez une source de code pour que vos pipelines aient de quoi travailler."
2006
2033
  },
2007
2034
  "status": {
2008
2035
  "connected": "Connecté",
2009
- "keyConnected": "Clé connectée",
2010
2036
  "notConnected": "Non connecté",
2011
2037
  "needsAttention": "Nécessite une intervention",
2012
2038
  "disabled": "Désactivé",
2013
2039
  "recommended": "Recommandé"
2014
2040
  },
2015
2041
  "groups": {
2016
- "models": "Modèles et fournisseurs",
2017
2042
  "sourceControl": "Gestion de code source",
2018
2043
  "communication": "Communication",
2019
2044
  "documents": "Documents",
@@ -2023,16 +2048,6 @@
2023
2048
  "personal": "Personnel (vous uniquement)"
2024
2049
  },
2025
2050
  "items": {
2026
- "openrouter": {
2027
- "description": "Une seule passerelle vers plus de 300 modèles. Ajoutez votre clé et activez des modèles au même endroit."
2028
- },
2029
- "vendors": {
2030
- "label": "Fournisseurs et clés",
2031
- "description": "Abonnements LLM de l'espace de travail et clés API des fournisseurs."
2032
- },
2033
- "personalSubs": {
2034
- "label": "Abonnements personnels (Claude, ChatGPT/Codex, GLM)"
2035
- },
2036
2051
  "github": {
2037
2052
  "description": "Connectez la GitHub App de l'espace de travail, parcourez dépôts, PR et tickets."
2038
2053
  },
@@ -2072,10 +2087,6 @@
2072
2087
  "label": "Mon jeton GitHub",
2073
2088
  "description": "Un jeton d'accès personnel utilisé pour les exécutions que vous lancez (pushes, PR, CI, fusion)."
2074
2089
  },
2075
- "localRunners": {
2076
- "label": "Mes exécuteurs locaux",
2077
- "description": "Vos exécuteurs de modèles sur votre propre machine (Ollama, LM Studio, vLLM…)."
2078
- },
2079
2090
  "documentTemplates": {
2080
2091
  "label": "Modèles et exemples"
2081
2092
  },
@@ -2085,6 +2096,45 @@
2085
2096
  }
2086
2097
  }
2087
2098
  },
2099
+ "modelProvidersHub": {
2100
+ "title": "Fournisseurs de modèles",
2101
+ "intro": "Les moteurs qui font tourner vos agents. Au moins un fournisseur doit être connecté avant qu'une étape de pipeline puisse s'exécuter.",
2102
+ "searchPlaceholder": "Rechercher un fournisseur…",
2103
+ "noMatches": "Aucun fournisseur ne correspond à \"{query}\".",
2104
+ "getStarted": {
2105
+ "title": "Aucun fournisseur connecté pour l'instant",
2106
+ "body": "Les étapes d'agent ne peuvent pas s'exécuter tant qu'aucun modèle n'est accessible. Une clé OpenRouter est le moyen le plus rapide d'ouvrir un large catalogue, mais des clés de fournisseur, un abonnement personnel ou votre propre exécuteur local conviennent tout autant."
2107
+ },
2108
+ "status": {
2109
+ "connected": "Connecté",
2110
+ "keyConnected": "Clé connectée",
2111
+ "notConnected": "Non connecté",
2112
+ "recommended": "Recommandé",
2113
+ "connectedCount": "aucun connecté | {count} connecté | {count} connectés"
2114
+ },
2115
+ "groups": {
2116
+ "workspace": "Fournisseurs de l'espace de travail",
2117
+ "personal": "Personnel (vous uniquement)",
2118
+ "personalNote": "Ils appartiennent à votre compte et non à l'espace de travail, et ne servent qu'aux exécutions que vous lancez. Ils figurent aussi dans Ma configuration."
2119
+ },
2120
+ "items": {
2121
+ "openrouter": {
2122
+ "description": "Une seule passerelle vers plus de 300 modèles. Ajoutez votre clé et activez des modèles au même endroit."
2123
+ },
2124
+ "vendors": {
2125
+ "label": "Fournisseurs et clés",
2126
+ "description": "Abonnements LLM de l'espace de travail et clés API des fournisseurs."
2127
+ },
2128
+ "personalSubs": {
2129
+ "label": "Mes abonnements",
2130
+ "description": "Plans à usage individuel que vous déverrouillez avec un mot de passe personnel (Claude, GLM, Codex)."
2131
+ },
2132
+ "localRunners": {
2133
+ "label": "Mes exécuteurs locaux",
2134
+ "description": "Vos exécuteurs de modèles sur votre propre machine (Ollama, LM Studio, vLLM)."
2135
+ }
2136
+ }
2137
+ },
2088
2138
  "shortcuts": {
2089
2139
  "title": "Raccourcis clavier",
2090
2140
  "commandBar": "Ouvrir la barre de commandes",
@@ -2653,6 +2703,32 @@
2653
2703
  "removeFailed": "Impossible de supprimer le stack partagé"
2654
2704
  }
2655
2705
  },
2706
+ "composeEnvSetup": {
2707
+ "title": "Configuration guidée Docker Compose pour un service",
2708
+ "lead": "Accompagne un service dans la création de la recette Docker Compose à partir de laquelle ses environnements de test sont montés, au lieu d'écrire à la main le chemin du compose et les étapes de préparation.",
2709
+ "how": {
2710
+ "title": "Comment ça marche",
2711
+ "scan": "Analyse le dépôt lié au service à la recherche de fichiers compose, de profils, de fichiers d'environnement et de jeux de données initiales.",
2712
+ "analyse": "Exécute éventuellement l'agent analyste d'environnement pour rédiger des étapes de préparation et un contrôle de santé à partir des scripts du dépôt.",
2713
+ "preflight": "Exécute les vérifications préalables de la recette sur la machine qui la provisionnera.",
2714
+ "save": "Enregistre la recette sur le service et déclare le gestionnaire Docker Compose de l'espace de travail.",
2715
+ "outcome": "Ensuite, le Deployer monte exactement cette pile dès qu'un pipeline a besoin d'un environnement réel, et le Tester s'exécute dessus. Rien n'est appliqué tant que vous n'avez pas enregistré."
2716
+ },
2717
+ "needed": {
2718
+ "title": "Vous en avez besoin quand",
2719
+ "running": "Les tests du service exigent que l'application tourne vraiment : tests d'API ou d'interface, migrations, données initiales.",
2720
+ "compose": "Le service est provisionné via Docker Compose et n'a pas encore de recette enregistrée.",
2721
+ "setup": "Monter la pile demande plus d'une commande : profils, fichiers d'environnement, données initiales ou contrôle de disponibilité."
2722
+ },
2723
+ "notNeeded": {
2724
+ "title": "Vous pouvez l'ignorer quand",
2725
+ "inContainer": "Le pipeline se contente de linter, compiler ou lancer des tests unitaires. Cela se fait dans le conteneur de l'agent comme vérifications avant PR, sans provisionner d'environnement.",
2726
+ "otherBackend": "Le service est provisionné autrement (Kubernetes, un aperçu cloud, ou aucune infrastructure). Configurez cela plus haut.",
2727
+ "noRepo": "Le service n'a pas de dépôt lié, il n'y a donc rien à analyser."
2728
+ },
2729
+ "start": "Lancer la configuration guidée",
2730
+ "rerunHint": "Relancez-la à tout moment pour modifier une recette enregistrée."
2731
+ },
2656
2732
  "localMode": {
2657
2733
  "title": "Mode local",
2658
2734
  "intro": "Réglage de l'exécuteur de conteneurs local, stocké sur le déploiement de cette machine (il a remplacé les variables d'environnement {poolVars} / {harnessVars}). L'enregistrement redimensionne le pool à chaud en direct, sans redémarrage nécessaire; les exécutions en cours conservent le conteneur qu'elles détiennent déjà.",
@@ -5257,8 +5333,8 @@
5257
5333
  },
5258
5334
  "environmentWizard": {
5259
5335
  "progress": "Étape {index} sur {total}",
5260
- "title": "Configurer un environnement de test",
5261
- "subtitle": "Détectez, vérifiez et enregistrez une recette Docker Compose pour que le Deployer la provisionne.",
5336
+ "title": "Configuration d'environnement Docker Compose",
5337
+ "subtitle": "Créez la recette Docker Compose à partir de laquelle les environnements de test d'un service sont montés : analyse du dépôt, revue, vérifications préalables, enregistrement.",
5262
5338
  "recommended": "recommandé",
5263
5339
  "steps": {
5264
5340
  "pick": "Choisir le service",
@@ -5268,6 +5344,7 @@
5268
5344
  },
5269
5345
  "pick": {
5270
5346
  "intro": "Choisissez le service pour lequel configurer un environnement Docker Compose.",
5347
+ "scope": "Seul le service choisi est modifié. Relancez ceci plus tard pour modifier sa recette.",
5271
5348
  "empty": "Aucun service pour l'instant. Ajoutez-en un d'abord."
5272
5349
  },
5273
5350
  "review": {