@cat-factory/app 0.46.12 → 0.47.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 (27) hide show
  1. package/app/components/auth/AuthGate.vue +1 -1
  2. package/app/components/auth/LoginScreen.vue +131 -1
  3. package/app/components/layout/AccountDeploymentSettings.vue +232 -5
  4. package/app/components/providers/ApiKeysSection.vue +27 -3
  5. package/app/components/providers/PersonalSubscriptionSection.vue +17 -2
  6. package/app/components/providers/SignInRequiredNotice.vue +19 -0
  7. package/app/components/settings/AccountSettingsPanel.vue +9 -6
  8. package/app/components/settings/IssueTrackerPanel.vue +114 -53
  9. package/app/components/settings/LocalModeSettingsPanel.vue +60 -28
  10. package/app/components/settings/LocalModelEndpointsPanel.vue +72 -27
  11. package/app/components/settings/MergeThresholdsPanel.vue +93 -45
  12. package/app/components/settings/ModelConfigurationPanel.vue +62 -36
  13. package/app/components/settings/ObservabilityConnectionPanel.vue +65 -35
  14. package/app/components/settings/OpenRouterCatalogPanel.vue +70 -40
  15. package/app/components/settings/ProviderConnectionPanel.vue +115 -61
  16. package/app/components/settings/ServiceFragmentDefaultsPanel.vue +9 -12
  17. package/app/components/settings/UserSecretsSection.vue +37 -18
  18. package/app/components/settings/WorkspaceSettingsPanel.vue +114 -62
  19. package/app/composables/api/auth.ts +7 -0
  20. package/app/stores/auth.ts +25 -1
  21. package/app/types/accountSettings.ts +4 -0
  22. package/i18n/locales/en.json +496 -0
  23. package/i18n/locales/es.json +490 -0
  24. package/i18n/locales/fr.json +490 -0
  25. package/i18n/locales/pl.json +490 -0
  26. package/i18n/locales/uk.json +490 -0
  27. package/package.json +2 -2
@@ -715,6 +715,19 @@
715
715
  "gate": {
716
716
  "loading": "Chargement…"
717
717
  },
718
+ "localMode": {
719
+ "continueWith": "Continuer avec {provider}",
720
+ "enterPatTitle": "Ou connectez-vous avec un jeton d'accès personnel",
721
+ "tokenPlaceholder": "collez un jeton {provider}",
722
+ "createToken": "Créer un jeton {provider} ↗",
723
+ "submit": "Se connecter",
724
+ "orDivider": "ou",
725
+ "failed": "Échec de la connexion. Vérifiez le jeton et réessayez."
726
+ },
727
+ "signInRequired": {
728
+ "personalSubscriptions": "Les abonnements personnels sont enregistrés sur votre compte, mais ce déploiement fonctionne sans connexion, ils ne peuvent donc pas être stockés ici. Utilisez le pool de l'espace de travail ou une clé d'API de fournisseur.",
729
+ "userApiKeys": "Vos clés d'API personnelles sont enregistrées sur votre compte, mais ce déploiement fonctionne sans connexion, elles ne peuvent donc pas être stockées ici. Basculez la portée sur « Cet espace de travail » pour ajouter une clé partagée."
730
+ },
718
731
  "login": {
719
732
  "appTitle": "Architecture Board",
720
733
  "subtitle": "Connectez-vous pour continuer.",
@@ -789,6 +802,33 @@
789
802
  "saveFailed": "Impossible d'enregistrer les clés de recherche web",
790
803
  "cleared": "Clés de recherche web effacées",
791
804
  "clearFailed": "Impossible d'effacer les clés de recherche web"
805
+ },
806
+ "contentStorage": {
807
+ "title": "Stockage de contenu",
808
+ "description": "Où sont stockées les captures d’écran du testeur d’UI et les images de design de référence de ce compte. Les métadonnées vivent toujours dans la base de données ; seuls les octets des fichiers vont vers le backend choisi.",
809
+ "default": "Par défaut ({backend})",
810
+ "backends": {
811
+ "off": "Désactivé (stockage désactivé)",
812
+ "fs": "Système de fichiers local",
813
+ "s3": "Amazon S3 / compatible S3",
814
+ "r2": "Cloudflare R2",
815
+ "db": "Base de données Postgres"
816
+ },
817
+ "basePath": "Chemin de base (par défaut : .file-storage)",
818
+ "region": "Région (p. ex. us-east-1)",
819
+ "bucket": "Bucket",
820
+ "prefix": "Préfixe de clé (facultatif)",
821
+ "endpoint": "Endpoint (facultatif, compatible S3)",
822
+ "forcePathStyle": "Forcer l’adressage de style chemin (la plupart des stockages compatibles S3)",
823
+ "accessKeys": "Clés d’accès",
824
+ "accessKeyId": "ID de clé d’accès",
825
+ "secretAccessKey": "Clé d’accès secrète",
826
+ "keysHint": "Les clés sont scellées au repos et ne sont jamais affichées après enregistrement ; laissez vide pour conserver les clés stockées.",
827
+ "regionBucketValidation": "Saisissez la région et le bucket S3",
828
+ "bothKeysValidation": "Saisissez à la fois l’id de clé d’accès et le secret",
829
+ "keysValidation": "Saisissez l’id de clé d’accès et le secret S3",
830
+ "saved": "Stockage de contenu enregistré",
831
+ "saveFailed": "Impossible d’enregistrer le stockage de contenu"
792
832
  }
793
833
  },
794
834
  "accountFragments": {
@@ -1119,5 +1159,455 @@
1119
1159
  }
1120
1160
  }
1121
1161
  }
1162
+ },
1163
+ "settings": {
1164
+ "modelConfiguration": {
1165
+ "title": "Configuration des modèles",
1166
+ "subtitle": "Des préréglages qui associent un modèle à chaque agent. Une tâche en choisit un ; par défaut, les tâches utilisent le préréglage par défaut de l'espace de travail.",
1167
+ "back": "Retour",
1168
+ "closeEsc": "Fermer (Échap)",
1169
+ "quota": "quota",
1170
+ "list": {
1171
+ "intro": "Chaque préréglage définit un {baseModel} pour chaque agent, avec des remplacements facultatifs par agent. Un modèle épinglé sur une tâche individuelle prévaut tout de même sur le préréglage.",
1172
+ "introBaseModel": "modèle de base",
1173
+ "newPreset": "Nouveau préréglage",
1174
+ "loadingCatalog": "Chargement du catalogue de modèles…",
1175
+ "default": "Par défaut",
1176
+ "setDefaultTitle": "Définir comme préréglage par défaut de l'espace de travail",
1177
+ "editTitle": "Modifier le préréglage",
1178
+ "deleteDisabledTitle": "Le préréglage par défaut ne peut pas être supprimé",
1179
+ "deleteTitle": "Supprimer le préréglage",
1180
+ "basePrefix": "Base :",
1181
+ "overrideCount": "{count} remplacement | {count} remplacements",
1182
+ "empty": "Aucun préréglage pour l'instant. Créez-en un pour associer des modèles à vos agents."
1183
+ },
1184
+ "editor": {
1185
+ "useBaseModel": "Utiliser le modèle de base",
1186
+ "baseModel": "Modèle de base",
1187
+ "nameLabel": "Nom",
1188
+ "namePlaceholder": "p. ex. Kimi K2.7",
1189
+ "baseModelLabel": "Modèle de base (appliqué à chaque agent)",
1190
+ "makeDefault": "En faire le préréglage par défaut de l'espace de travail",
1191
+ "perAgentOverrides": "Remplacements par agent",
1192
+ "filterPlaceholder": "Filtrer les agents…",
1193
+ "noAgentsMatch": "Aucun agent ne correspond à \"{filter}\".",
1194
+ "saveChanges": "Enregistrer les modifications",
1195
+ "createPreset": "Créer le préréglage"
1196
+ },
1197
+ "toast": {
1198
+ "setDefaultFailed": "Impossible de définir le préréglage par défaut",
1199
+ "deleteFailed": "Impossible de supprimer le préréglage",
1200
+ "nameRequiredTitle": "Nom requis",
1201
+ "nameRequiredBody": "Donnez un nom au préréglage.",
1202
+ "saveFailed": "Impossible d'enregistrer le préréglage"
1203
+ }
1204
+ },
1205
+ "account": {
1206
+ "title": "Paramètres du compte",
1207
+ "noAccount": "Aucun compte sélectionné.",
1208
+ "tabs": {
1209
+ "team": "Équipe et accès",
1210
+ "fragments": "Fragments de contexte"
1211
+ }
1212
+ },
1213
+ "providerConnection": {
1214
+ "fallbackTitle": "Fournisseur",
1215
+ "kind": {
1216
+ "environment": {
1217
+ "title": "Fournisseur d'environnements éphémères",
1218
+ "blurb": "Là où l'agent Tester s'exécute contre un environnement d'aperçu en direct. Configurez les paramètres par espace de travail et les identifiants dont votre fournisseur a besoin."
1219
+ },
1220
+ "runner-pool": {
1221
+ "title": "Pool d'exécuteurs auto-hébergé",
1222
+ "blurb": "Là où les agents de codage s'exécutent lorsque les conteneurs Cloudflare ne sont pas utilisés. Configurez le point de terminaison du planificateur du pool et les identifiants."
1223
+ }
1224
+ },
1225
+ "delegation": {
1226
+ "title": "Délégation locale",
1227
+ "intro": "Par défaut, cette machine exécute tout en local : les agents de conteneur sur le Docker de l'hôte, l'infrastructure du Tester via docker-compose dans le conteneur. Activez les options ci-dessous pour déléguer l'une ou l'autre de ces tâches à un service externe. S'applique uniquement en mode local.",
1228
+ "agentsToggle": "Exécuter les agents de conteneur sur le pool d'exécuteurs",
1229
+ "agentsHint": "Envoyez chaque agent de conteneur (codeur, tester, fusionneur, bootstrap, …) au pool d'exécuteurs auto-hébergé de cet espace de travail plutôt qu'au Docker de l'hôte.",
1230
+ "registerPoolPrompt": "{link} d'abord pour activer cette option.",
1231
+ "registerPoolLink": "Enregistrez un pool d'exécuteurs",
1232
+ "envToggle": "Provisionner les environnements du Tester via le fournisseur",
1233
+ "envHint": "Montez l'environnement d'aperçu du Tester via le fournisseur d'environnements configuré ci-dessous plutôt que via docker-compose dans le conteneur. Connectez d'abord un fournisseur pour activer cette option.",
1234
+ "updateFailed": "Impossible de mettre à jour la délégation"
1235
+ },
1236
+ "runnerPoolLocalHint": "Enregistrez votre pool ici, puis activez « Exécuter les agents de conteneur sur le pool d'exécuteurs » sur l'écran {link} pour y router les agents de cet espace de travail.",
1237
+ "ephemeralEnvironments": "Environnements éphémères",
1238
+ "viewLogs": "Voir les journaux",
1239
+ "hideLogs": "Masquer les journaux",
1240
+ "connectedAt": "Connecté · {baseUrl}",
1241
+ "missingConfig": "Configuration requise manquante : {fields}",
1242
+ "manifestEditorUnavailable": "Ce fournisseur se configure en rédigeant un manifeste. L'éditeur de manifeste intégré n'est pas encore disponible ; enregistrez-le via l'API pour le moment.",
1243
+ "form": {
1244
+ "updateConfiguration": "Mettre à jour la configuration",
1245
+ "connect": "Connecter",
1246
+ "reenterSecrets": "Saisissez à nouveau le champ secret pour enregistrer les modifications : les secrets stockés sont en écriture seule et ne sont pas affichés. | Saisissez à nouveau les champs secrets pour enregistrer les modifications : les secrets stockés sont en écriture seule et ne sont pas affichés.",
1247
+ "optionalLabel": "{label} (facultatif)"
1248
+ },
1249
+ "field": {
1250
+ "defaultsTo": "Valeur par défaut : {value}"
1251
+ },
1252
+ "test": {
1253
+ "button": "Tester la connexion",
1254
+ "ok": "Connexion réussie",
1255
+ "failed": "Échec de la connexion"
1256
+ },
1257
+ "toast": {
1258
+ "saved": "{title} enregistré",
1259
+ "saveFailed": "Impossible d'enregistrer la connexion",
1260
+ "removed": "Connexion supprimée",
1261
+ "removeFailed": "Impossible de supprimer la connexion"
1262
+ }
1263
+ },
1264
+ "serviceFragmentDefaults": {
1265
+ "intro": "Choisissez les fragments de bonnes pratiques avec lesquels chaque nouveau service démarre. Leurs recommandations sont intégrées au prompt de chaque agent travaillant avec le code (codeur, relecteur, architecte, correcteurs) sur les tâches du service. Vous pouvez affiner l'ensemble par service dans son inspecteur ; modifier cette valeur par défaut n'affecte pas les services déjà existants.",
1266
+ "defaultFragments": "Fragments par défaut",
1267
+ "addFragment": "Ajouter un fragment",
1268
+ "empty": "Aucun : les nouveaux services démarrent sans fragment au niveau du service.",
1269
+ "saveFailed": "Impossible d'enregistrer les fragments par défaut",
1270
+ "footer": {
1271
+ "question": "Besoin d'ajouter ou de modifier les fragments eux-mêmes (rédigés à la main, documents liés, dépôts) ?",
1272
+ "manageBoard": "Gérer la bibliothèque de fragments de ce tableau →",
1273
+ "manageAccount": "Gérer les fragments du compte →"
1274
+ }
1275
+ },
1276
+ "issueTracker": {
1277
+ "filing": {
1278
+ "heading": "Où les tickets sont créés",
1279
+ "description": "Le pipeline récurrent de dette technique ouvre un ticket avant l'implémentation et le crée dans ce suivi. Choisissez {none} pour ne pas créer de ticket.",
1280
+ "none": "Aucun",
1281
+ "githubHint": "GitHub Issues s'appuie sur votre GitHub App installée, qui n'est pas encore connectée. Installez-la dans {link} : la création de tickets reste désactivée jusque-là.",
1282
+ "githubHintLink": "Intégrations → GitHub",
1283
+ "jiraHint": "Jira n'est pas encore connecté. {link} pour créer et lier des tickets.",
1284
+ "linearHint": "Linear n'est pas encore connecté. {link} pour créer et lier des tickets.",
1285
+ "connectLink": "Connectez-le",
1286
+ "jiraProjectKey": "Clé de projet Jira",
1287
+ "jiraProjectKeyHelp": "Les nouveaux tickets sont créés dans ce projet.",
1288
+ "linearTeamId": "Id d'équipe Linear",
1289
+ "linearTeamIdHelp": "Les nouveaux tickets sont créés dans cette équipe (Linear exige une équipe pour créer un ticket)."
1290
+ },
1291
+ "vendor": {
1292
+ "github": "GitHub Issues",
1293
+ "jira": "Jira",
1294
+ "linear": "Linear"
1295
+ },
1296
+ "linking": {
1297
+ "heading": "Lier des tickets comme contexte",
1298
+ "description": "Lorsqu'une source est proposée, vous pouvez importer ses tickets et les rattacher à une tâche, afin que les agents voient la description du ticket et les commentaires pendant l'implémentation. C'est indépendant du suivi de création ci-dessus.",
1299
+ "github": {
1300
+ "available": "S'appuie sur votre GitHub App installée : aucun identifiant nécessaire.",
1301
+ "unavailable": "Installez la GitHub App (Intégrations → GitHub) pour proposer cette source."
1302
+ },
1303
+ "checkSetup": "Vérifier la configuration",
1304
+ "install": "Installer",
1305
+ "connected": "Connecté.",
1306
+ "jira": {
1307
+ "connectHint": "Connectez-vous avec un compte Jira et un jeton d'API."
1308
+ },
1309
+ "linear": {
1310
+ "connectHint": "Connectez-vous avec une clé d'API personnelle Linear."
1311
+ },
1312
+ "connect": "Connecter"
1313
+ },
1314
+ "writeback": {
1315
+ "heading": "Écriture en retour",
1316
+ "description": "Écrivez en retour sur le ou les tickets liés à une tâche au fur et à mesure que sa pull request progresse. Chaque option est la valeur par défaut de l'espace de travail et peut être remplacée par tâche dans l'inspecteur. Les tickets GitHub se ferment nativement ; les tickets Jira passent au premier statut de leur catégorie {done}.",
1317
+ "done": "Terminé",
1318
+ "commentOnOpen": {
1319
+ "label": "Commenter à l'ouverture d'une PR",
1320
+ "help": "Publie un commentaire sur le ticket lié avec le lien de la nouvelle pull request."
1321
+ },
1322
+ "resolveOnMerge": {
1323
+ "label": "Clore comme résolu à la fusion d'une PR",
1324
+ "help": "Commente que la PR a été fusionnée, puis ferme / résout le ticket lié."
1325
+ }
1326
+ },
1327
+ "probeFailure": {
1328
+ "title": "Le suivi des tickets n'est pas disponible",
1329
+ "disabled": "L'intégration des sources de tâches est désactivée sur ce déploiement (sa clé de chiffrement n'est pas configurée). Définissez ENCRYPTION_KEY sur le backend pour activer le suivi des tickets.",
1330
+ "serverError": "Le service de suivi des tickets a renvoyé une erreur (HTTP {status}) : {message}. Cela signifie généralement que le backend n'est pas entièrement migré/configuré.",
1331
+ "loadFailedStatus": "Impossible de charger les paramètres du suivi des tickets (HTTP {status}) : {message}",
1332
+ "loadFailed": "Impossible de charger les paramètres du suivi des tickets : {message}"
1333
+ },
1334
+ "toast": {
1335
+ "saved": "Suivi des tickets enregistré",
1336
+ "saveFailed": "Impossible d'enregistrer les paramètres",
1337
+ "updateFailed": "Impossible de mettre à jour",
1338
+ "checkFailed": "Échec de la vérification"
1339
+ }
1340
+ },
1341
+ "userSecrets": {
1342
+ "title": "Mon jeton GitHub",
1343
+ "intro": "Stockez un jeton d'accès personnel utilisé pour les exécutions que {you} lancez : les pushes, les pull requests, la barrière de CI et les fusions sont attribués à votre accès GitHub. Stocké {scope} ; le jeton est en écriture seule et n'est plus jamais affiché.",
1344
+ "introYou": "vous",
1345
+ "introScope": "rien que pour vous",
1346
+ "connectedStored": "Connecté · jeton stocké",
1347
+ "replaceToken": "Remplacer le jeton",
1348
+ "addToken": "Ajouter un jeton",
1349
+ "labelField": "Libellé (facultatif)",
1350
+ "optionalField": "{label} (facultatif)",
1351
+ "testConnection": "Tester la connexion",
1352
+ "tokenValid": "Jeton valide",
1353
+ "tokenRejected": "Jeton rejeté",
1354
+ "secretFallback": "Secret",
1355
+ "toast": {
1356
+ "saved": "{label} enregistré",
1357
+ "saveFailed": "Impossible d'enregistrer le secret",
1358
+ "removed": "Secret supprimé",
1359
+ "removeFailed": "Impossible de supprimer le secret"
1360
+ }
1361
+ },
1362
+ "mergeThresholds": {
1363
+ "intro": "Politiques de fusion automatique nommées qu'une tâche peut choisir. Une fois la CI réussie, l'agent {merger} note la PR sur la complexité, le risque et l'impact (0-100%); la PR est fusionnée automatiquement uniquement lorsque chaque note est inférieure ou égale aux plafonds du préréglage, sinon une notification de revue est levée. Le préréglage par défaut régit toute tâche qui n'en choisit aucun.",
1364
+ "mergerAgent": "merger",
1365
+ "concern": {
1366
+ "none": "Aucun (toujours arrêter)",
1367
+ "low": "Faible",
1368
+ "medium": "Moyen",
1369
+ "high": "Élevé (ne jamais arrêter)"
1370
+ },
1371
+ "presetNamePlaceholder": "Nom du préréglage",
1372
+ "default": "Par défaut",
1373
+ "makeDefault": "Définir par défaut",
1374
+ "deleteDefaultBlocked": "Le préréglage par défaut ne peut pas être supprimé",
1375
+ "deletePreset": "Supprimer le préréglage",
1376
+ "field": {
1377
+ "maxComplexity": "Complexité max %",
1378
+ "maxRisk": "Risque max %",
1379
+ "maxImpact": "Impact max %",
1380
+ "ciMaxAttempts": "Tentatives de correction CI",
1381
+ "maxRequirementIterations": "Itérations d'exigences",
1382
+ "maxRequirementConcernAllowed": "Validation auto. des préoccupations jusqu'à"
1383
+ },
1384
+ "newPreset": "Nouveau préréglage",
1385
+ "create": {
1386
+ "name": "Nom",
1387
+ "namePlaceholder": "p. ex. Prudent",
1388
+ "complexity": "Cmplx%",
1389
+ "risk": "Risque%",
1390
+ "impact": "Impact%",
1391
+ "ciFix": "Corr. CI",
1392
+ "reqIter": "Itér. exig.",
1393
+ "autoPass": "Valid. auto. jusqu'à"
1394
+ },
1395
+ "add": "Ajouter",
1396
+ "toast": {
1397
+ "saved": "Préréglage enregistré",
1398
+ "saveFailed": "Impossible d'enregistrer le préréglage",
1399
+ "created": "Préréglage créé",
1400
+ "createFailed": "Impossible de créer le préréglage",
1401
+ "defaultFailed": "Impossible de définir par défaut",
1402
+ "deleteFailed": "Impossible de supprimer le préréglage"
1403
+ }
1404
+ },
1405
+ "observabilityConnection": {
1406
+ "title": "Santé post-publication",
1407
+ "intro": "Après la publication d'une version, la barrière {gate} surveille les moniteurs/SLO d'observabilité configurés. En cas de régression, elle lance un agent d'astreinte pour enquêter (un humain décide s'il faut annuler). Indiquez quels moniteurs/SLO un service surveille depuis l'inspecteur de ce service.",
1408
+ "connection": {
1409
+ "heading": "Connexion",
1410
+ "provider": "Fournisseur"
1411
+ },
1412
+ "datadog": {
1413
+ "site": "Site Datadog",
1414
+ "apiKey": "Clé d'API",
1415
+ "appKey": "Clé d'application"
1416
+ },
1417
+ "saveConnection": "Enregistrer la connexion",
1418
+ "disconnect": "Déconnecter",
1419
+ "incident": {
1420
+ "heading": "Enrichissement d'incident",
1421
+ "configured": "Configuré",
1422
+ "notSet": "Non défini",
1423
+ "description": "Facultatif. En cas de régression, l'investigation d'astreinte est publiée sur un incident que ces systèmes ont DÉJÀ ouvert à partir des mêmes signaux (annoter, jamais réalerter). Les secrets sont en écriture seule : les laisser vides conserve la valeur stockée inchangée.",
1424
+ "pagerDutyToken": "Jeton d'API PagerDuty",
1425
+ "pagerDutyFromEmail": "E-mail expéditeur PagerDuty",
1426
+ "incidentIoKey": "Clé d'API incident.io",
1427
+ "clear": "Effacer"
1428
+ },
1429
+ "status": {
1430
+ "notConnected": "Non connecté",
1431
+ "connected": "Connecté",
1432
+ "connectedWithSite": "Connecté ({site})"
1433
+ },
1434
+ "toast": {
1435
+ "loadFailed": "Impossible de charger les paramètres d'observabilité",
1436
+ "incidentCredsRequired": "Saisissez les identifiants PagerDuty ou incident.io",
1437
+ "incidentSaved": "Enrichissement d'incident enregistré",
1438
+ "incidentSaveFailed": "Impossible d'enregistrer l'enrichissement d'incident",
1439
+ "incidentDisconnectFailed": "Impossible de déconnecter l'enrichissement d'incident",
1440
+ "connected": "Observabilité connectée",
1441
+ "connectFailed": "Impossible d'enregistrer la connexion",
1442
+ "disconnectFailed": "Impossible de déconnecter"
1443
+ }
1444
+ },
1445
+ "localMode": {
1446
+ "title": "Mode local",
1447
+ "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à.",
1448
+ "pool": {
1449
+ "heading": "Pool de conteneurs à chaud",
1450
+ "description": "Gardez des conteneurs de harnais inactifs prêts et réaffectez-en un (en privilégiant un conteneur qui détient déjà le dépôt de l'exécution) au lieu d'un démarrage à froid par exécution. Une taille de pool de 0 le désactive. Nécessite un environnement de la famille Docker (Docker/Podman/OrbStack/Colima); ignoré sur Apple {appleContainer}.",
1451
+ "size": {
1452
+ "label": "Taille du pool",
1453
+ "help": "Maximum de conteneurs à chaud inactifs. 0 = mise en pool désactivée."
1454
+ },
1455
+ "minWarm": {
1456
+ "label": "Préchauffer au démarrage",
1457
+ "help": "Conteneurs démarrés au lancement du service."
1458
+ },
1459
+ "max": {
1460
+ "label": "Max de conteneurs",
1461
+ "help": "Plafond strict (affectés + inactifs). Vide = taille du pool.",
1462
+ "placeholder": "(taille du pool)"
1463
+ },
1464
+ "idleTimeout": {
1465
+ "label": "Délai d'inactivité (minutes)",
1466
+ "help": "Évincer un conteneur en pool inactif après."
1467
+ }
1468
+ },
1469
+ "checkout": {
1470
+ "heading": "Réutilisation de la copie de travail",
1471
+ "description": "Lorsqu'un conteneur à chaud détient déjà le dépôt de l'exécution, le harnais réutilise sa copie de travail par dépôt (nettoyage + récupération + changement de branche) au lieu de cloner à neuf.",
1472
+ "workspaceRoot": {
1473
+ "label": "Racine de l'espace de travail",
1474
+ "help": "Répertoire absolu dans le conteneur où réside la copie de travail réutilisée."
1475
+ },
1476
+ "cleanKeep": {
1477
+ "label": "Conserver au nettoyage (séparés par des virgules)",
1478
+ "help": "Répertoires de cache de dépendances que le nettoyage par exécution préserve."
1479
+ }
1480
+ },
1481
+ "toast": {
1482
+ "saved": "Paramètres locaux enregistrés",
1483
+ "saveFailed": "Impossible d'enregistrer les paramètres locaux"
1484
+ }
1485
+ },
1486
+ "openRouterCatalog": {
1487
+ "intro": "Accédez à {models} via une seule passerelle. Ajoutez votre clé OpenRouter ci-dessous, puis activez les modèles souhaités. Ils apparaissent dans le sélecteur de modèles avec leur fenêtre de contexte et leur prix, et sont décomptés de votre budget de dépenses.",
1488
+ "introModels": "plus de 300 modèles",
1489
+ "connectHeading": "Connectez votre clé OpenRouter",
1490
+ "step1": "Ouvrez {link} et créez une clé d'API.",
1491
+ "step1Link": "openrouter.ai → Clés ↗",
1492
+ "step2": "Copiez la clé (commence par {prefix}) et collez-la ci-dessous.",
1493
+ "scope": "Portée",
1494
+ "scopeWorkspace": "Cet espace de travail",
1495
+ "scopeUser": "Mes clés (moi uniquement)",
1496
+ "labelOptional": "Libellé (facultatif)",
1497
+ "labelPlaceholder": "ex. clé d'équipe",
1498
+ "apiKey": "Clé d'API",
1499
+ "connectAndBrowse": "Connecter et parcourir",
1500
+ "keyConnected": "Clé OpenRouter connectée",
1501
+ "manageKeys": "Gérer dans Fournisseurs et clés",
1502
+ "refresh": "Actualiser le catalogue",
1503
+ "enableRecommended": "Activer les recommandés",
1504
+ "filterPlaceholder": "Filtrer par nom ou slug…",
1505
+ "empty": "Aucun modèle pour l'instant. Appuyez sur {action} pour charger la liste en direct d'OpenRouter.",
1506
+ "enabledCount": "aucun modèle activé | {count} activé | {count} activés",
1507
+ "context": "{value} ctx",
1508
+ "contextThousands": "{value}K ctx",
1509
+ "price": "{input}/{output} par Mtok",
1510
+ "toast": {
1511
+ "connected": "Clé OpenRouter connectée",
1512
+ "connectFailed": "Impossible de connecter la clé",
1513
+ "rejected": "OpenRouter a rejeté la clé.",
1514
+ "unreachable": "Impossible de joindre OpenRouter",
1515
+ "connectFirst": "Connectez d'abord une clé OpenRouter.",
1516
+ "saved": "Catalogue OpenRouter enregistré",
1517
+ "saveFailed": "Impossible d'enregistrer le catalogue"
1518
+ }
1519
+ },
1520
+ "workspaceSettings": {
1521
+ "title": "Paramètres de l'espace de travail",
1522
+ "tabs": {
1523
+ "workspace": "Espace de travail",
1524
+ "budget": "Budget",
1525
+ "merge": "Seuils de fusion",
1526
+ "tracker": "Suivi des tickets",
1527
+ "fragments": "Bonnes pratiques du service"
1528
+ },
1529
+ "waiting": {
1530
+ "heading": "En attente d'un humain",
1531
+ "body": "Une exécution mise en pause sur une décision humaine (une revue, une approbation, une fusion) attend aussi longtemps que nécessaire et n'est jamais annulée. Passé ce nombre de minutes, sa notification devient rouge et est signalée comme {overdue} dans la boîte de réception.",
1532
+ "overdue": "En retard",
1533
+ "escalateAfter": "Escalader après (minutes)"
1534
+ },
1535
+ "taskLimit": {
1536
+ "heading": "Tâches en cours par service",
1537
+ "body": "Limitez le nombre de tâches pouvant s'exécuter en même temps sous un service. Démarrer une tâche au-delà de la limite est refusé avec un message clair jusqu'à ce qu'une tâche en cours se termine.",
1538
+ "mode": "Mode",
1539
+ "maxRunning": "Maximum de tâches en cours",
1540
+ "maxPerType": "Maximum de tâches de type {type}",
1541
+ "modes": {
1542
+ "off": "Aucune limite",
1543
+ "shared": "Partagé entre tous les types",
1544
+ "per_type": "Par type de tâche"
1545
+ }
1546
+ },
1547
+ "taskTypes": {
1548
+ "feature": "fonctionnalité",
1549
+ "bug": "bug",
1550
+ "document": "document",
1551
+ "spike": "spike"
1552
+ },
1553
+ "observability": {
1554
+ "heading": "Observabilité de l'agent",
1555
+ "body": "Stockez le contexte complet fourni à chaque agent : les prompts composés, les fragments de bonnes pratiques intégrés et le contenu intégral des fichiers injectés dans son conteneur, afin de pouvoir l'inspecter plus tard dans la vue d'observabilité. Les corps sont conservés pendant la même fenêtre que la télémétrie LLM par appel. Désactivez pour cesser de le stocker (les instantanés existants sont supprimés par la rétention).",
1556
+ "toggle": "Stocker le contexte complet de l'agent"
1557
+ },
1558
+ "retention": {
1559
+ "heading": "Rétention des captures d'écran",
1560
+ "body": "Combien de temps conserver les captures d'écran du testeur d'UI et les images de conception de référence auxquelles elles sont comparées (la vérification visuelle). Un nettoyage quotidien supprime à la fois les octets des images et leurs métadonnées une fois qu'ils dépassent cette fenêtre.",
1561
+ "days": "Rétention (jours)"
1562
+ },
1563
+ "kaizen": {
1564
+ "heading": "Agent Kaizen",
1565
+ "body": "À la fin de chaque exécution, l'agent Kaizen évalue le déroulement de chaque étape de l'agent, de fluide et efficace à confus et chaotique, et recommande des améliorations de prompt/modèle. Une combinaison prompt + agent + modèle bien notée sans recommandation cinq fois de suite est marquée comme vérifiée et n'est plus évaluée. L'évaluation s'exécute en arrière-plan et s'affiche dans les détails de l'exécution et l'écran Kaizen. Définissez le modèle de l'évaluateur dans Configuration des modèles (l'agent \"Kaizen\").",
1566
+ "toggle": "Évaluer les exécutions d'agents avec Kaizen"
1567
+ },
1568
+ "budget": {
1569
+ "heading": "Budget de dépenses mensuel",
1570
+ "body": "L'utilisation des jetons est décomptée par appel LLM, valorisée et plafonnée par ce budget. Une fois atteint, les exécutions de cet espace de travail sont mises en pause et le tableau affiche un avertissement. Laissez vide pour hériter de la valeur par défaut intégrée (environ 100 EUR/mois).",
1571
+ "monthlyLimit": "Limite mensuelle",
1572
+ "defaultPlaceholder": "Par défaut",
1573
+ "currency": "Devise (ISO 4217)",
1574
+ "save": "Enregistrer le budget"
1575
+ },
1576
+ "toast": {
1577
+ "saved": "Paramètres enregistrés",
1578
+ "saveFailed": "Impossible d'enregistrer les paramètres",
1579
+ "budgetSaved": "Budget enregistré",
1580
+ "budgetSaveFailed": "Impossible d'enregistrer le budget"
1581
+ }
1582
+ },
1583
+ "localModelEndpoints": {
1584
+ "title": "Mes runners locaux",
1585
+ "intro": "Pointez les agents vers un LLM exécuté sur {ownMachine} (Ollama, LM Studio, llama.cpp, vLLM ou tout serveur compatible OpenAI). Un runner est stocké {justForYou} (un runner vit sur votre machine), et les modèles que vous activez apparaissent automatiquement dans le sélecteur de modèles. La clé d'API (que la plupart des runners ignorent) est en écriture seule et n'est plus jamais affichée.",
1586
+ "introOwnMachine": "votre propre machine",
1587
+ "introJustForYou": "rien que pour vous",
1588
+ "modelCount": "aucun modèle | {count} modèle | {count} modèles",
1589
+ "keySet": "clé définie",
1590
+ "edit": "Modifier",
1591
+ "editRunner": "Modifier le runner",
1592
+ "addRunner": "Ajouter un runner",
1593
+ "runnerType": "Type de runner",
1594
+ "labelOptional": "Libellé (facultatif)",
1595
+ "labelPlaceholder": "Mon {name}",
1596
+ "baseUrl": "URL de base",
1597
+ "apiKeyOptional": "Clé d'API (facultatif)",
1598
+ "apiKeyKeepPlaceholder": "laissez vide pour conserver la clé enregistrée",
1599
+ "apiKeyIgnorePlaceholder": "la plupart des runners l'ignorent",
1600
+ "testConnection": "Tester la connexion",
1601
+ "unreachable": "Impossible de joindre le runner.",
1602
+ "reachable": "Joignable · aucun modèle | Joignable · {count} modèle | Joignable · {count} modèles",
1603
+ "noModels": "Aucun modèle signalé.",
1604
+ "enableModels": "Activer les modèles",
1605
+ "toast": {
1606
+ "saved": "{name} enregistré",
1607
+ "saveFailed": "Impossible d'enregistrer le runner",
1608
+ "removed": "Runner supprimé",
1609
+ "removeFailed": "Impossible de supprimer le runner"
1610
+ }
1611
+ }
1122
1612
  }
1123
1613
  }