@cat-factory/app 0.70.1 → 0.71.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 (42) hide show
  1. package/app/components/auth/LoginScreen.vue +3 -2
  2. package/app/components/board/AddTaskModal.vue +7 -1
  3. package/app/components/board/RecurringPipelineModal.vue +6 -1
  4. package/app/components/bootstrap/BootstrapModal.vue +3 -0
  5. package/app/components/documents/DocumentSourceConnectModal.vue +4 -3
  6. package/app/components/focus/BlockFocusView.vue +12 -7
  7. package/app/components/humanTest/HumanTestWindow.vue +15 -1
  8. package/app/components/layout/AccountDeploymentSettings.vue +4 -0
  9. package/app/components/layout/AccountTeamSettings.vue +8 -2
  10. package/app/components/layout/AiProvidersBanner.vue +3 -1
  11. package/app/components/layout/InfraSetupBanner.vue +192 -0
  12. package/app/components/layout/ProviderConfigBanner.vue +3 -1
  13. package/app/components/panels/InspectorPanel.vue +13 -7
  14. package/app/components/panels/inspector/FrontendConfig.vue +19 -4
  15. package/app/components/panels/inspector/ServiceReleaseHealthConfig.vue +4 -0
  16. package/app/components/panels/inspector/TaskRunSettings.vue +8 -1
  17. package/app/components/providers/ApiKeysSection.vue +4 -0
  18. package/app/components/settings/CustomManifestTypeEditor.vue +3 -0
  19. package/app/components/settings/InfraHandlersConfigurator.vue +72 -12
  20. package/app/components/settings/KubernetesEngineForm.vue +41 -5
  21. package/app/components/settings/ObservabilityConnectionPanel.vue +7 -0
  22. package/app/components/settings/ProviderConnectionTab.vue +2 -0
  23. package/app/components/tasks/TaskSourceConnectModal.vue +4 -3
  24. package/app/composables/useConfirmAction.ts +96 -0
  25. package/app/composables/usePipelineErrorToast.ts +2 -0
  26. package/app/composables/useWorkspaceStream.ts +26 -6
  27. package/app/pages/index.vue +20 -4
  28. package/app/stores/agentRuns.spec.ts +20 -2
  29. package/app/stores/agentRuns.ts +21 -11
  30. package/app/stores/ui.ts +17 -1
  31. package/app/stores/workspace.ts +10 -2
  32. package/app/types/domain.ts +3 -0
  33. package/app/utils/pipeline.ts +22 -0
  34. package/i18n/locales/en.json +74 -10
  35. package/i18n/locales/es.json +71 -10
  36. package/i18n/locales/fr.json +71 -10
  37. package/i18n/locales/he.json +71 -10
  38. package/i18n/locales/ja.json +71 -10
  39. package/i18n/locales/pl.json +71 -10
  40. package/i18n/locales/tr.json +71 -10
  41. package/i18n/locales/uk.json +71 -10
  42. package/package.json +3 -2
@@ -0,0 +1,22 @@
1
+ import { frameAllowsVisualPipeline, pipelineHasVisualStep } from '@cat-factory/contracts'
2
+ import type { Block, Pipeline } from '~/types/domain'
3
+
4
+ // Surface counterpart to the backend's slice-4c run-start gate: a pipeline with a visual step
5
+ // (`tester-ui` / `visual-confirmation`) may run only on a frame with a UI to exercise — a
6
+ // `frontend` frame, or a frame a `frontend` frame links to. The SPA hides such pipelines from
7
+ // the pickers where they can't run so a user never picks one the backend would refuse. Both
8
+ // sides share the pure predicates from `@cat-factory/contracts`, so the surface can't drift from
9
+ // the gate.
10
+
11
+ /**
12
+ * Whether `pipeline` may run on a task under `frame`. A non-visual pipeline is always allowed;
13
+ * a visual one only when the frame has a UI (see {@link frameAllowsVisualPipeline}). `blocks` is
14
+ * the board's block list, used to find frontend→service links.
15
+ */
16
+ export function pipelineAllowedForFrame(
17
+ pipeline: Pipeline,
18
+ frame: Block | undefined,
19
+ blocks: readonly Block[],
20
+ ): boolean {
21
+ return !pipelineHasVisualStep(pipeline) || frameAllowsVisualPipeline(frame, blocks)
22
+ }
@@ -18,7 +18,17 @@
18
18
  "remove": "Remove",
19
19
  "confirm": {
20
20
  "defaultTitle": "Are you sure?",
21
- "confirm": "Confirm"
21
+ "confirm": "Confirm",
22
+ "irreversible": "This can't be undone.",
23
+ "reconnectHint": "You'll need to reconnect it before you can use it again.",
24
+ "titles": {
25
+ "disconnect": "Disconnect {name}?",
26
+ "remove": "Remove {name}?",
27
+ "revoke": "Revoke {name}?",
28
+ "clear": "Clear {name}?",
29
+ "destroy": "Destroy {name}?"
30
+ },
31
+ "reconfigureHint": "You can set it up again later."
22
32
  },
23
33
  "block": "Block",
24
34
  "@block": {
@@ -30,7 +40,20 @@
30
40
  "description": "Verb meaning dismiss / shut (a panel, drawer, dialog), NOT the adjective 'near'. Used as an aria-label on close affordances - translate as the imperative verb."
31
41
  },
32
42
  "disconnect": "Disconnect",
33
- "copyFailed": "Couldn't copy to clipboard"
43
+ "copyFailed": "Couldn't copy to clipboard",
44
+ "revoke": "Revoke",
45
+ "clear": "Clear",
46
+ "destroy": "Destroy",
47
+ "toast": {
48
+ "disconnected": "Disconnected {name}",
49
+ "removed": "Removed {name}",
50
+ "revoked": "Revoked {name}",
51
+ "cleared": "Cleared {name}",
52
+ "destroyed": "Destroyed {name}"
53
+ },
54
+ "@clear": {
55
+ "description": "Verb meaning empty / reset a stored value (a config, a saved connection), NOT the adjective 'transparent / obvious'. Used as a destructive-action button label."
56
+ }
34
57
  },
35
58
  "nav": {
36
59
  "menu": "Navigation menu",
@@ -304,7 +327,9 @@
304
327
  "github_not_connected": "GitHub not connected",
305
328
  "bootstrap_not_retryable": "Bootstrap can’t be retried",
306
329
  "bootstrap_reference_missing": "Reference architecture is gone",
307
- "provision_type_unhandled": "No handler for this provision type"
330
+ "provision_type_unhandled": "No handler for this provision type",
331
+ "preset_unsatisfiable": "Model preset can't run this pipeline",
332
+ "visual_pipeline_no_frontend": "No frontend to test"
308
333
  },
309
334
  "fallbackMessage": "This action conflicts with the current state.",
310
335
  "providersUnconfigured": {
@@ -446,12 +471,14 @@
446
471
  "serveScript": "Serve script",
447
472
  "servePort": "Serve port",
448
473
  "mockMappingsPath": "Mock mappings path",
474
+ "mockMappingsHint": "WireMock's root directory. Put stub JSON in a mappings/ subfolder inside it (and response bodies in __files/), e.g. mocks/mappings/. A folder with no mappings/ inside runs an empty mock.",
449
475
  "envInjection": "Env injection",
450
476
  "envBuild": "Build-time",
451
477
  "envRuntime": "Runtime",
452
- "envInjectionHint": "Build-time injects the backend URLs as build env vars; Runtime writes them into a window.env shim.",
478
+ "envInjectionHint": "Build-time injects the backend URLs as build env vars; Runtime writes them into a window.env shim. Note your build tool may only expose prefixed vars (e.g. VITE_) to the browser, so name bindings to match its convention.",
453
479
  "previewEnabled": "Enable browsable preview",
454
480
  "previewHint": "Keeps a served preview running with a clickable URL. Local and Node runtimes only.",
481
+ "previewUnsupported": "This deployment can't host a browsable preview. Run on a Local or Node deployment to keep a served preview with a clickable URL.",
455
482
  "bindings": {
456
483
  "title": "Backend bindings",
457
484
  "hint": "Each env var the frontend reads for an upstream URL, and where it resolves: a bound service's ephemeral environment, or a WireMock stub.",
@@ -473,7 +500,8 @@
473
500
  "saveMonitoring": "Save monitoring",
474
501
  "savedToast": "Monitoring saved",
475
502
  "saveFailed": "Could not save the mapping",
476
- "clearFailed": "Could not clear the mapping"
503
+ "clearFailed": "Could not clear the mapping",
504
+ "configNoun": "the release health configuration"
477
505
  },
478
506
  "testConfig": {
479
507
  "title": "Test infrastructure",
@@ -1104,7 +1132,8 @@
1104
1132
  "revokeInvite": "Could not revoke invitation",
1105
1133
  "connectEmail": "Could not connect email sender",
1106
1134
  "disconnectEmail": "Could not disconnect email sender"
1107
- }
1135
+ },
1136
+ "emailNoun": "email sending"
1108
1137
  },
1109
1138
  "boardSwitcher": {
1110
1139
  "accountFallback": "Account",
@@ -1209,6 +1238,27 @@
1209
1238
  "runner-pool": "Configure runner pool"
1210
1239
  }
1211
1240
  },
1241
+ "infraSetupBanner": {
1242
+ "agentExecutor": {
1243
+ "title": "Agent executor not configured",
1244
+ "body": "This deployment runs agents on a self-hosted runner pool, but none is registered, so no agent can run until you connect one.",
1245
+ "action": "Configure runner pool"
1246
+ },
1247
+ "ephemeralEnvironments": {
1248
+ "title": "Test environment not configured",
1249
+ "body": "No ephemeral environment provider is registered, so testing agents that need a live environment can't run. Connect one to enable them.",
1250
+ "action": "Configure environment"
1251
+ },
1252
+ "binaryStorage": {
1253
+ "title": "Content storage not configured",
1254
+ "body": "No binary storage backend is configured for this account, so UI screenshots and reference images have nowhere to live and the visual checks are skipped. Configure storage to enable them.",
1255
+ "action": "Configure storage"
1256
+ },
1257
+ "dismiss": {
1258
+ "session": "Dismiss for this session",
1259
+ "permanent": "I'm OK with the limitations, don't notify me again"
1260
+ }
1261
+ },
1212
1262
  "spendWarningBanner": {
1213
1263
  "title": "Spend limit reached, agent execution paused",
1214
1264
  "body": "This month's token spend has hit the configured budget, so running pipelines were paused to avoid further cost. Execution resumes automatically when the budget rolls over next month, or once the limit is raised.",
@@ -1478,6 +1528,9 @@
1478
1528
  "apiServerUrlHelp": "The kube-apiserver root, e.g. https://my-cluster.example:6443.",
1479
1529
  "apiToken": "ServiceAccount token",
1480
1530
  "apiTokenHelp": "Write-only; re-enter it to rotate. Stored encrypted, never returned.",
1531
+ "apiTokenHelpStored": "A token is saved and reused for tests. Leave blank to keep it, or enter a new one to replace it.",
1532
+ "apiTokenPlaceholderStored": "Leave blank to keep the saved token",
1533
+ "tokenSaved": "Saved",
1481
1534
  "urlSourceLabel": "Environment URL source",
1482
1535
  "urlIngressTemplate": "Ingress host template",
1483
1536
  "urlIngressStatus": "Ingress status",
@@ -1530,6 +1583,9 @@
1530
1583
  "handler": {
1531
1584
  "intro": "Configure how each provision type a service declares is handled: the engine and connection. A service's manifests/compose path (the what/where) is set on the service.",
1532
1585
  "activeEngine": "Engine:",
1586
+ "connectionEstablished": "Connection established",
1587
+ "notConnected": "No connection configured yet",
1588
+ "disconnect": "Remove connection",
1533
1589
  "engineLabel": "Engine",
1534
1590
  "customHandlerTitle": "Remote-custom handler",
1535
1591
  "customTypeLabel": "Custom type",
@@ -1543,7 +1599,10 @@
1543
1599
  "overrideActive": "Active",
1544
1600
  "personalOverrideHint": "Override the workspace handler for this provision type on your own machine. Stored per user.",
1545
1601
  "removeOverride": "Remove override",
1546
- "loading": "Loading infrastructure settings…"
1602
+ "loading": "Loading infrastructure settings…",
1603
+ "kubeNoun": "the Kubernetes handler",
1604
+ "kubeOverrideNoun": "the Kubernetes override",
1605
+ "customNoun": "this handler"
1547
1606
  }
1548
1607
  },
1549
1608
  "providerConnection": {
@@ -1852,7 +1911,9 @@
1852
1911
  "connected": "Observability connected",
1853
1912
  "connectFailed": "Could not save the connection",
1854
1913
  "disconnectFailed": "Could not disconnect"
1855
- }
1914
+ },
1915
+ "connectionNoun": "the observability connection",
1916
+ "incidentNoun": "the incident provider"
1856
1917
  },
1857
1918
  "localMode": {
1858
1919
  "title": "Local mode",
@@ -2152,7 +2213,8 @@
2152
2213
  "step1": "Generate a virtual key on your LiteLLM gateway (or use its master key).",
2153
2214
  "step2": "The gateway's base URL is set by your deployment operator (LITELLM_BASE_URL), not here."
2154
2215
  }
2155
- }
2216
+ },
2217
+ "keyNoun": "this API key"
2156
2218
  },
2157
2219
  "vendorCredentials": {
2158
2220
  "title": "LLM Vendors",
@@ -3245,7 +3307,9 @@
3245
3307
  "completed": "completed",
3246
3308
  "failed": "failed",
3247
3309
  "inProgress": "in progress"
3248
- }
3310
+ },
3311
+ "envNoun": "the test environment",
3312
+ "destroyFailed": "Could not destroy the environment"
3249
3313
  },
3250
3314
  "testing": {
3251
3315
  "title": "Test report",
@@ -20,11 +20,31 @@
20
20
  "remove": "Quitar",
21
21
  "confirm": {
22
22
  "defaultTitle": "¿Estás seguro?",
23
- "confirm": "Confirmar"
23
+ "confirm": "Confirmar",
24
+ "irreversible": "Esta acción no se puede deshacer.",
25
+ "reconnectHint": "Tendrás que volver a conectarlo antes de poder usarlo de nuevo.",
26
+ "titles": {
27
+ "disconnect": "¿Desconectar {name}?",
28
+ "remove": "¿Quitar {name}?",
29
+ "revoke": "¿Revocar {name}?",
30
+ "clear": "¿Borrar {name}?",
31
+ "destroy": "¿Destruir {name}?"
32
+ },
33
+ "reconfigureHint": "Puedes volver a configurarlo más tarde."
24
34
  },
25
35
  "copied": "Copiado al portapapeles",
26
36
  "disconnect": "Desconectar",
27
- "copyFailed": "No se pudo copiar al portapapeles"
37
+ "copyFailed": "No se pudo copiar al portapapeles",
38
+ "revoke": "Revocar",
39
+ "clear": "Borrar",
40
+ "destroy": "Destruir",
41
+ "toast": {
42
+ "disconnected": "{name} desconectado",
43
+ "removed": "{name} eliminado",
44
+ "revoked": "{name} revocado",
45
+ "cleared": "{name} borrado",
46
+ "destroyed": "{name} destruido"
47
+ }
28
48
  },
29
49
  "nav": {
30
50
  "menu": "Menú de navegación",
@@ -273,7 +293,9 @@
273
293
  "no_pr_to_merge": "No hay PR para fusionar",
274
294
  "github_not_connected": "GitHub no conectado",
275
295
  "bootstrap_not_retryable": "La inicialización no se puede reintentar",
276
- "bootstrap_reference_missing": "La arquitectura de referencia ha desaparecido"
296
+ "bootstrap_reference_missing": "La arquitectura de referencia ha desaparecido",
297
+ "preset_unsatisfiable": "El preajuste de modelo no puede ejecutar esta canalización",
298
+ "visual_pipeline_no_frontend": "No hay frontend que probar"
277
299
  },
278
300
  "fallbackMessage": "Esta acción entra en conflicto con el estado actual.",
279
301
  "providersUnconfigured": {
@@ -409,12 +431,14 @@
409
431
  "serveScript": "Script de servicio",
410
432
  "servePort": "Puerto de servicio",
411
433
  "mockMappingsPath": "Ruta de asignaciones de simulación",
434
+ "mockMappingsHint": "Directorio raíz de WireMock. Coloca los JSON de stub en una subcarpeta mappings/ dentro de él (y los cuerpos de respuesta en __files/), p. ej. mocks/mappings/. Una carpeta sin mappings/ dentro ejecuta un mock vacío.",
412
435
  "envInjection": "Inyección de variables de entorno",
413
436
  "envBuild": "En compilación",
414
437
  "envRuntime": "En ejecución",
415
- "envInjectionHint": "En compilación inyecta las URL del backend como variables de entorno de compilación; En ejecución las escribe en un shim de window.env.",
438
+ "envInjectionHint": "En compilación inyecta las URL del backend como variables de entorno de compilación; En ejecución las escribe en un shim de window.env. Ten en cuenta que tu herramienta de compilación puede exponer al navegador solo variables con prefijo (p. ej. VITE_), así que nombra los enlaces según su convención.",
416
439
  "previewEnabled": "Activar vista previa navegable",
417
440
  "previewHint": "Mantiene una vista previa servida en ejecución con una URL clicable. Solo en los entornos Local y Node.",
441
+ "previewUnsupported": "Este despliegue no puede alojar una vista previa navegable. Ejecuta en un despliegue Local o Node para mantener una vista previa servida con una URL clicable.",
418
442
  "bindings": {
419
443
  "title": "Vinculaciones del backend",
420
444
  "hint": "Cada variable de entorno que el frontend lee para una URL upstream, y dónde se resuelve: el entorno efímero de un servicio vinculado, o un stub de WireMock.",
@@ -436,7 +460,8 @@
436
460
  "saveMonitoring": "Guardar monitoreo",
437
461
  "savedToast": "Monitoreo guardado",
438
462
  "saveFailed": "No se pudo guardar la asignación",
439
- "clearFailed": "No se pudo limpiar la asignación"
463
+ "clearFailed": "No se pudo limpiar la asignación",
464
+ "configNoun": "la configuración de salud de la versión"
440
465
  },
441
466
  "testConfig": {
442
467
  "title": "Infraestructura de pruebas",
@@ -1064,7 +1089,8 @@
1064
1089
  "revokeInvite": "No se pudo revocar la invitación",
1065
1090
  "connectEmail": "No se pudo conectar el remitente de correo",
1066
1091
  "disconnectEmail": "No se pudo desconectar el remitente de correo"
1067
- }
1092
+ },
1093
+ "emailNoun": "el envío de correo"
1068
1094
  },
1069
1095
  "boardSwitcher": {
1070
1096
  "accountFallback": "Cuenta",
@@ -1169,6 +1195,27 @@
1169
1195
  "runner-pool": "Configurar grupo de ejecutores"
1170
1196
  }
1171
1197
  },
1198
+ "infraSetupBanner": {
1199
+ "agentExecutor": {
1200
+ "title": "Ejecutor de agentes no configurado",
1201
+ "body": "Este despliegue ejecuta los agentes en un pool de runners autoalojado, pero no hay ninguno registrado, así que ningún agente podrá ejecutarse hasta que conectes uno.",
1202
+ "action": "Configurar pool de runners"
1203
+ },
1204
+ "ephemeralEnvironments": {
1205
+ "title": "Entorno de pruebas no configurado",
1206
+ "body": "No hay ningún proveedor de entornos efímeros registrado, así que los agentes de pruebas que necesitan un entorno activo no pueden ejecutarse. Conecta uno para habilitarlos.",
1207
+ "action": "Configurar entorno"
1208
+ },
1209
+ "binaryStorage": {
1210
+ "title": "Almacenamiento de contenido no configurado",
1211
+ "body": "No hay ningún backend de almacenamiento binario configurado para esta cuenta, así que las capturas de la interfaz y las imágenes de referencia no tienen dónde guardarse y las comprobaciones visuales se omiten. Configura el almacenamiento para habilitarlas.",
1212
+ "action": "Configurar almacenamiento"
1213
+ },
1214
+ "dismiss": {
1215
+ "session": "Descartar durante esta sesión",
1216
+ "permanent": "Acepto las limitaciones, no volver a avisarme"
1217
+ }
1218
+ },
1172
1219
  "spendWarningBanner": {
1173
1220
  "title": "Límite de gasto alcanzado, ejecución de agentes en pausa",
1174
1221
  "body": "El gasto de tokens de este mes ha alcanzado el presupuesto configurado, por lo que las canalizaciones en curso se pausaron para evitar más costes. La ejecución se reanuda automáticamente cuando el presupuesto se renueva el mes que viene, o una vez que se aumente el límite.",
@@ -1696,7 +1743,9 @@
1696
1743
  "connected": "Observabilidad conectada",
1697
1744
  "connectFailed": "No se pudo guardar la conexión",
1698
1745
  "disconnectFailed": "No se pudo desconectar"
1699
- }
1746
+ },
1747
+ "connectionNoun": "la conexión de observabilidad",
1748
+ "incidentNoun": "el proveedor de incidencias"
1700
1749
  },
1701
1750
  "localMode": {
1702
1751
  "title": "Modo local",
@@ -1901,6 +1950,9 @@
1901
1950
  "apiServerUrlHelp": "La raíz del kube-apiserver, p. ej. https://my-cluster.example:6443.",
1902
1951
  "apiToken": "Token de ServiceAccount",
1903
1952
  "apiTokenHelp": "Solo escritura; vuelve a introducirlo para rotarlo. Se guarda cifrado y nunca se devuelve.",
1953
+ "apiTokenHelpStored": "Hay un token guardado que se reutiliza para las pruebas. Déjalo en blanco para conservarlo o introduce uno nuevo para reemplazarlo.",
1954
+ "apiTokenPlaceholderStored": "Déjalo en blanco para conservar el token guardado",
1955
+ "tokenSaved": "Guardado",
1904
1956
  "urlSourceLabel": "Origen de la URL del entorno",
1905
1957
  "urlIngressTemplate": "Plantilla de host de Ingress",
1906
1958
  "urlIngressStatus": "Estado de Ingress",
@@ -1953,6 +2005,9 @@
1953
2005
  "handler": {
1954
2006
  "intro": "Configura cómo se gestiona cada tipo de aprovisionamiento que declara un servicio: el motor y la conexión. Los manifiestos o la ruta de compose de un servicio (el qué/dónde) se definen en el servicio.",
1955
2007
  "activeEngine": "Motor:",
2008
+ "connectionEstablished": "Conexión establecida",
2009
+ "notConnected": "Aún no hay ninguna conexión configurada",
2010
+ "disconnect": "Eliminar conexión",
1956
2011
  "engineLabel": "Motor",
1957
2012
  "customHandlerTitle": "Gestor remote-custom",
1958
2013
  "customTypeLabel": "Tipo personalizado",
@@ -1966,7 +2021,10 @@
1966
2021
  "overrideActive": "Activa",
1967
2022
  "personalOverrideHint": "Anula el gestor del espacio de trabajo para este tipo de aprovisionamiento en tu propia máquina. Se guarda por usuario.",
1968
2023
  "removeOverride": "Quitar anulación",
1969
- "loading": "Cargando la configuración de infraestructura…"
2024
+ "loading": "Cargando la configuración de infraestructura…",
2025
+ "kubeNoun": "el controlador de Kubernetes",
2026
+ "kubeOverrideNoun": "la anulación de Kubernetes",
2027
+ "customNoun": "este controlador"
1970
2028
  }
1971
2029
  }
1972
2030
  },
@@ -2090,7 +2148,8 @@
2090
2148
  "step1": "Genera una clave virtual en tu pasarela LiteLLM (o usa su clave maestra).",
2091
2149
  "step2": "La URL base de la pasarela la establece el operador de tu despliegue (LITELLM_BASE_URL), no aquí."
2092
2150
  }
2093
- }
2151
+ },
2152
+ "keyNoun": "esta clave de API"
2094
2153
  },
2095
2154
  "vendorCredentials": {
2096
2155
  "title": "Proveedores de LLM",
@@ -3125,7 +3184,9 @@
3125
3184
  "completed": "completado",
3126
3185
  "failed": "fallido",
3127
3186
  "inProgress": "en curso"
3128
- }
3187
+ },
3188
+ "envNoun": "el entorno de prueba",
3189
+ "destroyFailed": "No se pudo destruir el entorno"
3129
3190
  },
3130
3191
  "testing": {
3131
3192
  "title": "Informe de pruebas",
@@ -20,11 +20,31 @@
20
20
  "remove": "Retirer",
21
21
  "confirm": {
22
22
  "defaultTitle": "Êtes-vous sûr ?",
23
- "confirm": "Confirmer"
23
+ "confirm": "Confirmer",
24
+ "irreversible": "Cette action est irréversible.",
25
+ "reconnectHint": "Vous devrez le reconnecter avant de pouvoir l’utiliser à nouveau.",
26
+ "titles": {
27
+ "disconnect": "Déconnecter {name} ?",
28
+ "remove": "Supprimer {name} ?",
29
+ "revoke": "Révoquer {name} ?",
30
+ "clear": "Effacer {name} ?",
31
+ "destroy": "Détruire {name} ?"
32
+ },
33
+ "reconfigureHint": "Vous pourrez le reconfigurer plus tard."
24
34
  },
25
35
  "copied": "Copié dans le presse-papiers",
26
36
  "disconnect": "Déconnecter",
27
- "copyFailed": "Échec de la copie dans le presse-papiers"
37
+ "copyFailed": "Échec de la copie dans le presse-papiers",
38
+ "revoke": "Révoquer",
39
+ "clear": "Effacer",
40
+ "destroy": "Détruire",
41
+ "toast": {
42
+ "disconnected": "{name} déconnecté",
43
+ "removed": "{name} supprimé",
44
+ "revoked": "{name} révoqué",
45
+ "cleared": "{name} effacé",
46
+ "destroyed": "{name} détruit"
47
+ }
28
48
  },
29
49
  "nav": {
30
50
  "menu": "Menu de navigation",
@@ -273,7 +293,9 @@
273
293
  "no_pr_to_merge": "Aucune PR à fusionner",
274
294
  "github_not_connected": "GitHub non connecté",
275
295
  "bootstrap_not_retryable": "L’initialisation ne peut pas être relancée",
276
- "bootstrap_reference_missing": "L’architecture de référence a disparu"
296
+ "bootstrap_reference_missing": "L’architecture de référence a disparu",
297
+ "preset_unsatisfiable": "Le préréglage de modèle ne peut pas exécuter ce pipeline",
298
+ "visual_pipeline_no_frontend": "Aucun frontend à tester"
277
299
  },
278
300
  "fallbackMessage": "Cette action est en conflit avec l’état actuel.",
279
301
  "providersUnconfigured": {
@@ -409,12 +431,14 @@
409
431
  "serveScript": "Script de service",
410
432
  "servePort": "Port de service",
411
433
  "mockMappingsPath": "Chemin des mappages de simulation",
434
+ "mockMappingsHint": "Répertoire racine de WireMock. Placez les JSON de stub dans un sous-dossier mappings/ à l'intérieur (et les corps de réponse dans __files/), p. ex. mocks/mappings/. Un dossier sans mappings/ à l'intérieur lance un mock vide.",
412
435
  "envInjection": "Injection de variables d'environnement",
413
436
  "envBuild": "À la compilation",
414
437
  "envRuntime": "À l'exécution",
415
- "envInjectionHint": "À la compilation, injecte les URL du backend comme variables d'environnement de compilation ; À l'exécution, les écrit dans un shim window.env.",
438
+ "envInjectionHint": "À la compilation, injecte les URL du backend comme variables d'environnement de compilation ; À l'exécution, les écrit dans un shim window.env. Notez que votre outil de build peut n'exposer au navigateur que les variables préfixées (p. ex. VITE_) ; nommez donc les liaisons selon sa convention.",
416
439
  "previewEnabled": "Activer l'aperçu navigable",
417
440
  "previewHint": "Maintient un aperçu servi en cours d'exécution avec une URL cliquable. Uniquement pour les runtimes Local et Node.",
441
+ "previewUnsupported": "Ce déploiement ne peut pas héberger d'aperçu navigable. Exécutez sur un déploiement Local ou Node pour conserver un aperçu servi avec une URL cliquable.",
418
442
  "bindings": {
419
443
  "title": "Liaisons du backend",
420
444
  "hint": "Chaque variable d'environnement que le frontend lit pour une URL en amont, et où elle se résout : l'environnement éphémère d'un service lié, ou un stub WireMock.",
@@ -436,7 +460,8 @@
436
460
  "saveMonitoring": "Enregistrer la surveillance",
437
461
  "savedToast": "Surveillance enregistrée",
438
462
  "saveFailed": "Impossible d'enregistrer le mappage",
439
- "clearFailed": "Impossible d'effacer le mappage"
463
+ "clearFailed": "Impossible d'effacer le mappage",
464
+ "configNoun": "la configuration de santé de la version"
440
465
  },
441
466
  "testConfig": {
442
467
  "title": "Infrastructure de test",
@@ -1064,7 +1089,8 @@
1064
1089
  "revokeInvite": "Impossible de révoquer l'invitation",
1065
1090
  "connectEmail": "Impossible de connecter l'expéditeur des e-mails",
1066
1091
  "disconnectEmail": "Impossible de déconnecter l'expéditeur des e-mails"
1067
- }
1092
+ },
1093
+ "emailNoun": "l’envoi d’e-mails"
1068
1094
  },
1069
1095
  "boardSwitcher": {
1070
1096
  "accountFallback": "Compte",
@@ -1169,6 +1195,27 @@
1169
1195
  "runner-pool": "Configurer le pool d'exécuteurs"
1170
1196
  }
1171
1197
  },
1198
+ "infraSetupBanner": {
1199
+ "agentExecutor": {
1200
+ "title": "Exécuteur d'agents non configuré",
1201
+ "body": "Ce déploiement exécute les agents sur un pool de runners auto-hébergé, mais aucun n'est enregistré, donc aucun agent ne pourra s'exécuter tant que vous n'en connectez pas un.",
1202
+ "action": "Configurer le pool de runners"
1203
+ },
1204
+ "ephemeralEnvironments": {
1205
+ "title": "Environnement de test non configuré",
1206
+ "body": "Aucun fournisseur d'environnements éphémères n'est enregistré, donc les agents de test qui nécessitent un environnement actif ne peuvent pas s'exécuter. Connectez-en un pour les activer.",
1207
+ "action": "Configurer l'environnement"
1208
+ },
1209
+ "binaryStorage": {
1210
+ "title": "Stockage de contenu non configuré",
1211
+ "body": "Aucun backend de stockage binaire n'est configuré pour ce compte, donc les captures d'écran de l'interface et les images de référence n'ont nulle part où être stockées et les contrôles visuels sont ignorés. Configurez le stockage pour les activer.",
1212
+ "action": "Configurer le stockage"
1213
+ },
1214
+ "dismiss": {
1215
+ "session": "Ignorer pour cette session",
1216
+ "permanent": "J'accepte les limitations, ne plus me notifier"
1217
+ }
1218
+ },
1172
1219
  "spendWarningBanner": {
1173
1220
  "title": "Limite de dépense atteinte, exécution des agents en pause",
1174
1221
  "body": "La dépense en jetons de ce mois a atteint le budget configuré, les pipelines en cours ont donc été mis en pause pour éviter des coûts supplémentaires. L'exécution reprend automatiquement au renouvellement du budget le mois prochain, ou dès que la limite est relevée.",
@@ -1696,7 +1743,9 @@
1696
1743
  "connected": "Observabilité connectée",
1697
1744
  "connectFailed": "Impossible d'enregistrer la connexion",
1698
1745
  "disconnectFailed": "Impossible de déconnecter"
1699
- }
1746
+ },
1747
+ "connectionNoun": "la connexion d’observabilité",
1748
+ "incidentNoun": "le fournisseur d’incidents"
1700
1749
  },
1701
1750
  "localMode": {
1702
1751
  "title": "Mode local",
@@ -1901,6 +1950,9 @@
1901
1950
  "apiServerUrlHelp": "La racine du kube-apiserver, p. ex. https://my-cluster.example:6443.",
1902
1951
  "apiToken": "Jeton ServiceAccount",
1903
1952
  "apiTokenHelp": "En écriture seule ; ressaisissez-le pour le faire tourner. Stocké chiffré, jamais renvoyé.",
1953
+ "apiTokenHelpStored": "Un jeton est enregistré et réutilisé pour les tests. Laissez vide pour le conserver, ou saisissez-en un nouveau pour le remplacer.",
1954
+ "apiTokenPlaceholderStored": "Laissez vide pour conserver le jeton enregistré",
1955
+ "tokenSaved": "Enregistré",
1904
1956
  "urlSourceLabel": "Source de l'URL de l'environnement",
1905
1957
  "urlIngressTemplate": "Modèle d'hôte Ingress",
1906
1958
  "urlIngressStatus": "Statut de l'Ingress",
@@ -1953,6 +2005,9 @@
1953
2005
  "handler": {
1954
2006
  "intro": "Configurez la manière dont chaque type de provisionnement déclaré par un service est géré: le moteur et la connexion. Les manifestes ou le chemin compose d'un service (le quoi/où) se définissent sur le service.",
1955
2007
  "activeEngine": "Moteur :",
2008
+ "connectionEstablished": "Connexion établie",
2009
+ "notConnected": "Aucune connexion configurée pour l'instant",
2010
+ "disconnect": "Supprimer la connexion",
1956
2011
  "engineLabel": "Moteur",
1957
2012
  "customHandlerTitle": "Gestionnaire remote-custom",
1958
2013
  "customTypeLabel": "Type personnalisé",
@@ -1966,7 +2021,10 @@
1966
2021
  "overrideActive": "Active",
1967
2022
  "personalOverrideHint": "Surchargez le gestionnaire de l'espace de travail pour ce type de provisionnement sur votre propre machine. Stocké par utilisateur.",
1968
2023
  "removeOverride": "Supprimer la surcharge",
1969
- "loading": "Chargement de la configuration de l'infrastructure…"
2024
+ "loading": "Chargement de la configuration de l'infrastructure…",
2025
+ "kubeNoun": "le gestionnaire Kubernetes",
2026
+ "kubeOverrideNoun": "le remplacement Kubernetes",
2027
+ "customNoun": "ce gestionnaire"
1970
2028
  }
1971
2029
  }
1972
2030
  },
@@ -2090,7 +2148,8 @@
2090
2148
  "step1": "Générez une clé virtuelle sur votre passerelle LiteLLM (ou utilisez sa clé maîtresse).",
2091
2149
  "step2": "L'URL de base de la passerelle est définie par l'opérateur de votre déploiement (LITELLM_BASE_URL), pas ici."
2092
2150
  }
2093
- }
2151
+ },
2152
+ "keyNoun": "cette clé API"
2094
2153
  },
2095
2154
  "vendorCredentials": {
2096
2155
  "title": "Fournisseurs de LLM",
@@ -3125,7 +3184,9 @@
3125
3184
  "completed": "terminé",
3126
3185
  "failed": "échoué",
3127
3186
  "inProgress": "en cours"
3128
- }
3187
+ },
3188
+ "envNoun": "l’environnement de test",
3189
+ "destroyFailed": "Impossible de détruire l'environnement"
3129
3190
  },
3130
3191
  "testing": {
3131
3192
  "title": "Rapport de tests",