@cat-factory/app 0.49.1 → 0.50.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.
@@ -34,7 +34,8 @@
34
34
  "configuration": "Configuration",
35
35
  "workspaceSettings": "Paramètres de l’espace de travail",
36
36
  "modelConfiguration": "Configuration du modèle",
37
- "accountSettings": "Paramètres du compte"
37
+ "accountSettings": "Paramètres du compte",
38
+ "infrastructure": "Infrastructure"
38
39
  },
39
40
  "board": {
40
41
  "toolbar": {
@@ -1111,7 +1112,6 @@
1111
1112
  "documents": "Documents",
1112
1113
  "taskTrackers": "Outils de suivi des tâches",
1113
1114
  "observability": "Observabilité",
1114
- "infrastructure": "Infrastructure",
1115
1115
  "personal": "Personnel (vous uniquement)"
1116
1116
  },
1117
1117
  "items": {
@@ -1149,16 +1149,6 @@
1149
1149
  "label": "Santé après publication",
1150
1150
  "description": "Surveillez les moniteurs et les SLO après la publication d'une version (Datadog)."
1151
1151
  },
1152
- "infrastructure": {
1153
- "label": "Infrastructure",
1154
- "description": "Pool d'exécuteurs auto-hébergé pour les agents de conteneur et environnements de test éphémères.",
1155
- "agents": "Agents : {state}",
1156
- "envs": "Environnements : {state}"
1157
- },
1158
- "localMode": {
1159
- "label": "Mode local",
1160
- "description": "Pool de conteneurs à chaud et réutilisation du checkout par dépôt pour l'exécuteur local."
1161
- },
1162
1152
  "githubPat": {
1163
1153
  "label": "Mon jeton GitHub",
1164
1154
  "description": "Un jeton d'accès personnel utilisé pour les exécutions que vous lancez (pushes, PR, CI, fusion)."
@@ -1225,8 +1215,8 @@
1225
1215
  "windowTitle": "Infrastructure",
1226
1216
  "noneAvailable": "Aucun fournisseur d'infrastructure n'est activé sur ce déploiement.",
1227
1217
  "tabs": {
1228
- "containerAgents": "Agents de conteneur",
1229
- "testEnvironments": "Environnements de test"
1218
+ "testEnvironments": "Environnements de test",
1219
+ "agentContainers": "Agents de conteneur"
1230
1220
  },
1231
1221
  "kind": {
1232
1222
  "environment": {
@@ -1250,17 +1240,6 @@
1250
1240
  "reenterSecrets": "Saisissez à nouveau chaque secret pour enregistrer : les secrets stockés sont en écriture seule et ne sont pas affichés.",
1251
1241
  "starterHint": "Ceci est un exemple de départ. Modifiez-le pour qu'il corresponde à l'API de votre fournisseur."
1252
1242
  },
1253
- "delegation": {
1254
- "title": "Délégation locale",
1255
- "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.",
1256
- "agentsToggle": "Exécuter les agents de conteneur sur le pool d'exécuteurs",
1257
- "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.",
1258
- "registerPoolPrompt": "{link} d'abord pour activer cette option.",
1259
- "registerPoolLink": "Enregistrez un pool d'exécuteurs",
1260
- "envToggle": "Provisionner les environnements du Tester via le fournisseur",
1261
- "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.",
1262
- "updateFailed": "Impossible de mettre à jour la délégation"
1263
- },
1264
1243
  "viewLogs": "Voir les journaux",
1265
1244
  "hideLogs": "Masquer les journaux",
1266
1245
  "connectedAt": "Connecté · {baseUrl}",
@@ -1288,7 +1267,46 @@
1288
1267
  "backend": {
1289
1268
  "selectorLabel": "Backend d'exécution",
1290
1269
  "manifest": "Pool auto-hébergé (manifeste)",
1291
- "kubernetes": "Kubernetes"
1270
+ "kubernetes": "Kubernetes",
1271
+ "environmentSelectorLabel": "Backend d'environnement",
1272
+ "environmentManifest": "API HTTP personnalisée (manifeste)"
1273
+ },
1274
+ "kubernetesEnv": {
1275
+ "label": "Nom",
1276
+ "labelPlaceholder": "Cluster de prévisualisation",
1277
+ "apiServerUrl": "URL du serveur d'API",
1278
+ "apiServerUrlHelp": "La racine du kube-apiserver, p. ex. https://10.0.0.1:6443. L'orchestrateur applique les manifestes de chaque PR via l'apiserver, donc seul ce point d'accès doit être accessible.",
1279
+ "apiToken": "Jeton de ServiceAccount",
1280
+ "apiTokenHelp": "Un jeton bearer avec les droits RBAC pour créer des namespaces et appliquer les ressources de l'opérateur. Stocké chiffré ; jamais réaffiché.",
1281
+ "manifestSourceLabel": "Source des manifestes",
1282
+ "sourceColocated": "Dans le dépôt de la PR",
1283
+ "sourceSeparate": "Dépôt séparé",
1284
+ "repo": "Dépôt des manifestes",
1285
+ "repoHelp": "Le owner/repo qui contient les manifestes Kubernetes, p. ex. acme/preview-manifests.",
1286
+ "ref": "Réf",
1287
+ "refHelp": "Branche, tag ou SHA où lire les manifestes. Vide utilise la branche par défaut du dépôt.",
1288
+ "path": "Chemin du manifeste",
1289
+ "pathHelp": "Fichier ou répertoire du dépôt contenant les ressources à appliquer.",
1290
+ "urlSourceLabel": "URL de l'environnement",
1291
+ "urlIngressTemplate": "Modèle d'hôte Ingress",
1292
+ "urlIngressStatus": "Lire l'état de l'Ingress",
1293
+ "urlServiceStatus": "Lire l'état du Service",
1294
+ "hostTemplate": "Modèle d'hôte",
1295
+ "hostTemplateHelp": "Modèle d'hôte rendu avec les variables de provisionnement telles que branch et pullNumber ; l'hôte obtenu devient l'URL de l'environnement.",
1296
+ "ingressName": "Nom de l'Ingress",
1297
+ "ingressNameHelp": "Ingress dont lire l'hôte du load-balancer. Vide utilise le seul Ingress appliqué.",
1298
+ "serviceName": "Nom du Service",
1299
+ "port": "Port",
1300
+ "scheme": "Schéma d'URL",
1301
+ "schemeDefault": "https (par défaut)",
1302
+ "namespaceTemplate": "Modèle de namespace",
1303
+ "namespaceTemplateHelp": "Nom du namespace par PR rendu avec les variables de provisionnement telles que pullNumber. Vide en dérive un à partir du numéro de la PR.",
1304
+ "imageTemplate": "Modèle d'image",
1305
+ "imageTemplateHelp": "Référence d'image exposée aux manifestes, rendue avec les variables de provisionnement telles que branch et sha.",
1306
+ "caCertPem": "Certificat CA du cluster (PEM)",
1307
+ "caCertPemHelp": "Collez le bundle CA du cluster pour que le certificat TLS de l'apiserver soit vérifié. À omettre uniquement pour une CA publiquement approuvée.",
1308
+ "insecureSkipTlsVerify": "Ignorer la vérification TLS",
1309
+ "insecureSkipTlsVerifyHelp": "Fortement déconseillé. Désactive la vérification TLS de l'apiserver ; à utiliser uniquement pour des clusters kind/dev."
1292
1310
  },
1293
1311
  "kubernetes": {
1294
1312
  "label": "Nom",
@@ -1304,6 +1322,10 @@
1304
1322
  "caCertPem": "Certificat CA du cluster (PEM)",
1305
1323
  "caCertPemHelp": "Collez le bundle CA du cluster pour que le certificat TLS de l'apiserver soit vérifié. À omettre uniquement pour une CA publiquement approuvée.",
1306
1324
  "harnessPort": "Port du harness"
1325
+ },
1326
+ "advancedManifest": {
1327
+ "summary": "Avancé : planificateur personnalisé basé sur une API",
1328
+ "intro": "Nécessaire uniquement pour intégrer un planificateur personnalisé basé sur une API. Les backends courants (Docker local, Cloudflare Containers et Kubernetes) n'en ont pas besoin ; décrivez ici l'API HTTP de votre propre planificateur uniquement si vous en utilisez un."
1307
1329
  }
1308
1330
  },
1309
1331
  "serviceFragmentDefaults": {
@@ -1654,6 +1676,22 @@
1654
1676
  "removed": "Runner supprimé",
1655
1677
  "removeFailed": "Impossible de supprimer le runner"
1656
1678
  }
1679
+ },
1680
+ "infrastructure": {
1681
+ "active": "Actif : {backend}",
1682
+ "registerHint": "Enregistrez un pool d'exécuteurs ci-dessous pour l'activer.",
1683
+ "updateFailed": "Impossible de mettre à jour le backend d'exécution",
1684
+ "executionBackend": {
1685
+ "label": "Où s'exécutent les agents",
1686
+ "local-docker": "Docker local (hôte)",
1687
+ "cloudflare-containers": "Cloudflare Containers (intégré)",
1688
+ "runner-pool": "Pool d'exécuteurs auto-hébergé"
1689
+ },
1690
+ "testEnvBackend": {
1691
+ "label": "Où s'exécutent les environnements de test",
1692
+ "local-compose": "docker-compose dans le conteneur",
1693
+ "environment-provider": "Fournisseur d'environnements"
1694
+ }
1657
1695
  }
1658
1696
  },
1659
1697
  "providers": {
@@ -34,7 +34,8 @@
34
34
  "configuration": "Konfiguracja",
35
35
  "workspaceSettings": "Ustawienia obszaru roboczego",
36
36
  "modelConfiguration": "Konfiguracja modelu",
37
- "accountSettings": "Ustawienia konta"
37
+ "accountSettings": "Ustawienia konta",
38
+ "infrastructure": "Infrastruktura"
38
39
  },
39
40
  "board": {
40
41
  "toolbar": {
@@ -1111,7 +1112,6 @@
1111
1112
  "documents": "Dokumenty",
1112
1113
  "taskTrackers": "Narzędzia do śledzenia zadań",
1113
1114
  "observability": "Obserwowalność",
1114
- "infrastructure": "Infrastruktura",
1115
1115
  "personal": "Osobiste (tylko Ty)"
1116
1116
  },
1117
1117
  "items": {
@@ -1149,16 +1149,6 @@
1149
1149
  "label": "Kondycja po wydaniu",
1150
1150
  "description": "Obserwuj monitory i SLO po wdrożeniu wydania (Datadog)."
1151
1151
  },
1152
- "infrastructure": {
1153
- "label": "Infrastruktura",
1154
- "description": "Samodzielnie hostowana pula wykonawców dla agentów kontenerowych oraz efemeryczne środowiska testowe.",
1155
- "agents": "Agenci: {state}",
1156
- "envs": "Środowiska: {state}"
1157
- },
1158
- "localMode": {
1159
- "label": "Tryb lokalny",
1160
- "description": "Pula ciepłych kontenerów oraz ponowne użycie checkoutu na repozytorium dla lokalnego silnika."
1161
- },
1162
1152
  "githubPat": {
1163
1153
  "label": "Mój token GitHub",
1164
1154
  "description": "Osobisty token dostępu używany do uruchomień, które rozpoczynasz (pushe, PR-y, CI, scalanie)."
@@ -1225,8 +1215,8 @@
1225
1215
  "windowTitle": "Infrastruktura",
1226
1216
  "noneAvailable": "W tym wdrożeniu nie włączono żadnych dostawców infrastruktury.",
1227
1217
  "tabs": {
1228
- "containerAgents": "Agenci kontenerowi",
1229
- "testEnvironments": "Środowiska testowe"
1218
+ "testEnvironments": "Środowiska testowe",
1219
+ "agentContainers": "Agenci kontenerowi"
1230
1220
  },
1231
1221
  "kind": {
1232
1222
  "environment": {
@@ -1250,17 +1240,6 @@
1250
1240
  "reenterSecrets": "Wprowadź ponownie każdy sekret, aby zapisać — przechowywane sekrety są tylko do zapisu i nie są wyświetlane.",
1251
1241
  "starterHint": "To jest przykład startowy. Zmodyfikuj go, aby pasował do API Twojego dostawcy."
1252
1242
  },
1253
- "delegation": {
1254
- "title": "Delegowanie lokalne",
1255
- "intro": "Domyślnie ta maszyna uruchamia wszystko lokalnie — agentów kontenerowych na Dockerze hosta, a infrastrukturę Testera przez docker-compose wewnątrz kontenera. Włącz poniższe opcje, aby przekazać dowolne z tych zadań do usługi zewnętrznej. Dotyczy wyłącznie trybu lokalnego.",
1256
- "agentsToggle": "Uruchamiaj agentów kontenerowych w puli wykonawców",
1257
- "agentsHint": "Wysyłaj każdego agenta kontenerowego (koder, tester, scalający, bootstrap, …) do samodzielnie hostowanej puli wykonawców tego obszaru roboczego zamiast na Dockera hosta.",
1258
- "registerPoolPrompt": "Najpierw {link}, aby to włączyć.",
1259
- "registerPoolLink": "Zarejestruj pulę wykonawców",
1260
- "envToggle": "Udostępniaj środowiska Testera przez dostawcę",
1261
- "envHint": "Uruchom środowisko podglądowe Testera przez dostawcę środowisk skonfigurowanego poniżej zamiast przez docker-compose wewnątrz kontenera. Najpierw połącz dostawcę, aby to włączyć.",
1262
- "updateFailed": "Nie udało się zaktualizować delegowania"
1263
- },
1264
1243
  "viewLogs": "Pokaż dzienniki",
1265
1244
  "hideLogs": "Ukryj dzienniki",
1266
1245
  "connectedAt": "Połączono · {baseUrl}",
@@ -1288,7 +1267,46 @@
1288
1267
  "backend": {
1289
1268
  "selectorLabel": "Backend wykonawczy",
1290
1269
  "manifest": "Własny pool (manifest)",
1291
- "kubernetes": "Kubernetes"
1270
+ "kubernetes": "Kubernetes",
1271
+ "environmentSelectorLabel": "Backend środowiska",
1272
+ "environmentManifest": "Własne API HTTP (manifest)"
1273
+ },
1274
+ "kubernetesEnv": {
1275
+ "label": "Nazwa",
1276
+ "labelPlaceholder": "Klaster podglądu",
1277
+ "apiServerUrl": "URL serwera API",
1278
+ "apiServerUrlHelp": "Główny adres kube-apiserver, np. https://10.0.0.1:6443. Orkiestrator stosuje manifesty każdego PR przez apiserver, więc tylko ten endpoint musi być osiągalny.",
1279
+ "apiToken": "Token ServiceAccount",
1280
+ "apiTokenHelp": "Token bearer z uprawnieniami RBAC do tworzenia namespace’ów i stosowania zasobów operatora. Przechowywany w postaci zaszyfrowanej; nie jest ponownie pokazywany.",
1281
+ "manifestSourceLabel": "Źródło manifestów",
1282
+ "sourceColocated": "W repozytorium PR",
1283
+ "sourceSeparate": "Osobne repozytorium",
1284
+ "repo": "Repozytorium manifestów",
1285
+ "repoHelp": "Owner/repo zawierające manifesty Kubernetes, np. acme/preview-manifests.",
1286
+ "ref": "Ref",
1287
+ "refHelp": "Gałąź, tag lub SHA, z którego czytać manifesty. Puste używa domyślnej gałęzi repozytorium.",
1288
+ "path": "Ścieżka manifestu",
1289
+ "pathHelp": "Plik lub katalog w repozytorium zawierający zasoby do zastosowania.",
1290
+ "urlSourceLabel": "URL środowiska",
1291
+ "urlIngressTemplate": "Szablon hosta Ingress",
1292
+ "urlIngressStatus": "Odczytaj stan Ingress",
1293
+ "urlServiceStatus": "Odczytaj stan Service",
1294
+ "hostTemplate": "Szablon hosta",
1295
+ "hostTemplateHelp": "Szablon hosta renderowany ze zmiennymi provisioningu, takimi jak branch i pullNumber; wynikowy host staje się URL-em środowiska.",
1296
+ "ingressName": "Nazwa Ingress",
1297
+ "ingressNameHelp": "Ingress, z którego odczytać host load-balancera. Puste używa jedynego zastosowanego Ingress.",
1298
+ "serviceName": "Nazwa Service",
1299
+ "port": "Port",
1300
+ "scheme": "Schemat URL",
1301
+ "schemeDefault": "https (domyślnie)",
1302
+ "namespaceTemplate": "Szablon namespace",
1303
+ "namespaceTemplateHelp": "Nazwa namespace per PR renderowana ze zmiennych provisioningu, takich jak pullNumber. Puste wyprowadza ją z numeru PR.",
1304
+ "imageTemplate": "Szablon obrazu",
1305
+ "imageTemplateHelp": "Referencja obrazu udostępniana manifestom, renderowana ze zmiennych provisioningu, takich jak branch i sha.",
1306
+ "caCertPem": "Certyfikat CA klastra (PEM)",
1307
+ "caCertPemHelp": "Wklej pakiet CA klastra, aby certyfikat TLS apiservera został zweryfikowany. Pomiń tylko dla publicznie zaufanego CA.",
1308
+ "insecureSkipTlsVerify": "Pomiń weryfikację TLS",
1309
+ "insecureSkipTlsVerifyHelp": "Zdecydowanie odradzane. Wyłącza weryfikację TLS apiservera; używaj tylko dla klastrów kind/dev."
1292
1310
  },
1293
1311
  "kubernetes": {
1294
1312
  "label": "Nazwa",
@@ -1304,6 +1322,10 @@
1304
1322
  "caCertPem": "Certyfikat CA klastra (PEM)",
1305
1323
  "caCertPemHelp": "Wklej pakiet CA klastra, aby certyfikat TLS apiservera został zweryfikowany. Pomiń tylko dla publicznie zaufanego CA.",
1306
1324
  "harnessPort": "Port harnessa"
1325
+ },
1326
+ "advancedManifest": {
1327
+ "summary": "Zaawansowane: niestandardowy harmonogram oparty na API",
1328
+ "intro": "Potrzebne tylko do zintegrowania niestandardowego harmonogramu opartego na API. Typowe backendy (lokalny Docker, Cloudflare Containers i Kubernetes) tego nie wymagają; opisz tutaj API HTTP własnego harmonogramu tylko, jeśli go używasz."
1307
1329
  }
1308
1330
  },
1309
1331
  "serviceFragmentDefaults": {
@@ -1654,6 +1676,22 @@
1654
1676
  "removed": "Runner usunięty",
1655
1677
  "removeFailed": "Nie udało się usunąć runnera"
1656
1678
  }
1679
+ },
1680
+ "infrastructure": {
1681
+ "active": "Aktywne: {backend}",
1682
+ "registerHint": "Zarejestruj pulę runnerów poniżej, aby to włączyć.",
1683
+ "updateFailed": "Nie udało się zaktualizować backendu wykonawczego",
1684
+ "executionBackend": {
1685
+ "label": "Gdzie działają agenci",
1686
+ "local-docker": "Lokalny Docker (host)",
1687
+ "cloudflare-containers": "Cloudflare Containers (wbudowane)",
1688
+ "runner-pool": "Samodzielnie hostowana pula runnerów"
1689
+ },
1690
+ "testEnvBackend": {
1691
+ "label": "Gdzie działają środowiska testowe",
1692
+ "local-compose": "docker-compose w kontenerze",
1693
+ "environment-provider": "Dostawca środowisk"
1694
+ }
1657
1695
  }
1658
1696
  },
1659
1697
  "providers": {
@@ -34,7 +34,8 @@
34
34
  "configuration": "Конфігурація",
35
35
  "workspaceSettings": "Налаштування робочого простору",
36
36
  "modelConfiguration": "Конфігурація моделі",
37
- "accountSettings": "Налаштування облікового запису"
37
+ "accountSettings": "Налаштування облікового запису",
38
+ "infrastructure": "Інфраструктура"
38
39
  },
39
40
  "board": {
40
41
  "toolbar": {
@@ -1111,7 +1112,6 @@
1111
1112
  "documents": "Документи",
1112
1113
  "taskTrackers": "Трекери завдань",
1113
1114
  "observability": "Спостережуваність",
1114
- "infrastructure": "Інфраструктура",
1115
1115
  "personal": "Особисте (лише ви)"
1116
1116
  },
1117
1117
  "items": {
@@ -1149,16 +1149,6 @@
1149
1149
  "label": "Стан після випуску",
1150
1150
  "description": "Стежте за моніторами й SLO після випуску версії (Datadog)."
1151
1151
  },
1152
- "infrastructure": {
1153
- "label": "Інфраструктура",
1154
- "description": "Самостійно розміщений пул виконавців для контейнерних агентів і ефемерні тестові середовища.",
1155
- "agents": "Агенти: {state}",
1156
- "envs": "Середовища: {state}"
1157
- },
1158
- "localMode": {
1159
- "label": "Локальний режим",
1160
- "description": "Пул теплих контейнерів і повторне використання checkout на репозиторій для локального виконавця."
1161
- },
1162
1152
  "githubPat": {
1163
1153
  "label": "Мій токен GitHub",
1164
1154
  "description": "Особистий токен доступу, який використовується для запусків, що ви розпочинаєте (pushes, PR-и, CI, злиття)."
@@ -1225,8 +1215,8 @@
1225
1215
  "windowTitle": "Інфраструктура",
1226
1216
  "noneAvailable": "У цьому розгортанні не ввімкнено жодного постачальника інфраструктури.",
1227
1217
  "tabs": {
1228
- "containerAgents": "Контейнерні агенти",
1229
- "testEnvironments": "Тестові середовища"
1218
+ "testEnvironments": "Тестові середовища",
1219
+ "agentContainers": "Контейнерні агенти"
1230
1220
  },
1231
1221
  "kind": {
1232
1222
  "environment": {
@@ -1250,17 +1240,6 @@
1250
1240
  "reenterSecrets": "Введіть кожен секрет повторно, щоб зберегти — збережені секрети доступні лише для запису й не показуються.",
1251
1241
  "starterHint": "Це початковий приклад. Відредагуйте його відповідно до API вашого постачальника."
1252
1242
  },
1253
- "delegation": {
1254
- "title": "Локальне делегування",
1255
- "intro": "Типово ця машина виконує все локально — контейнерні агенти на Docker хоста, а інфраструктуру Tester через docker-compose всередині контейнера. Увімкніть опції нижче, щоб делегувати будь-яке з цих завдань зовнішньому сервісу. Застосовується лише в локальному режимі.",
1256
- "agentsToggle": "Запускати контейнерні агенти в пулі виконавців",
1257
- "agentsHint": "Надсилайте кожного контейнерного агента (кодер, tester, об'єднувач, bootstrap, …) до самостійно розміщеного пулу виконавців цього робочого простору замість Docker хоста.",
1258
- "registerPoolPrompt": "Спершу {link}, щоб увімкнути це.",
1259
- "registerPoolLink": "Зареєструйте пул виконавців",
1260
- "envToggle": "Надавати середовища Tester через постачальника",
1261
- "envHint": "Підніміть середовище попереднього перегляду Tester через постачальника середовищ, налаштованого нижче, замість docker-compose всередині контейнера. Спершу підключіть постачальника, щоб увімкнути це.",
1262
- "updateFailed": "Не вдалося оновити делегування"
1263
- },
1264
1243
  "viewLogs": "Переглянути журнали",
1265
1244
  "hideLogs": "Сховати журнали",
1266
1245
  "connectedAt": "Підключено · {baseUrl}",
@@ -1288,7 +1267,46 @@
1288
1267
  "backend": {
1289
1268
  "selectorLabel": "Бекенд виконавця",
1290
1269
  "manifest": "Власний пул (маніфест)",
1291
- "kubernetes": "Kubernetes"
1270
+ "kubernetes": "Kubernetes",
1271
+ "environmentSelectorLabel": "Бекенд середовища",
1272
+ "environmentManifest": "Власний HTTP API (маніфест)"
1273
+ },
1274
+ "kubernetesEnv": {
1275
+ "label": "Назва",
1276
+ "labelPlaceholder": "Кластер попереднього перегляду",
1277
+ "apiServerUrl": "URL сервера API",
1278
+ "apiServerUrlHelp": "Кореневий адрес kube-apiserver, напр. https://10.0.0.1:6443. Оркестратор застосовує маніфести кожного PR через apiserver, тож лише цей endpoint має бути доступним.",
1279
+ "apiToken": "Токен ServiceAccount",
1280
+ "apiTokenHelp": "Bearer-токен з правами RBAC на створення просторів імен і застосування ресурсів оператора. Зберігається зашифрованим; більше не показується.",
1281
+ "manifestSourceLabel": "Джерело маніфестів",
1282
+ "sourceColocated": "У репозиторії PR",
1283
+ "sourceSeparate": "Окремий репозиторій",
1284
+ "repo": "Репозиторій маніфестів",
1285
+ "repoHelp": "Owner/repo, що містить маніфести Kubernetes, напр. acme/preview-manifests.",
1286
+ "ref": "Реф",
1287
+ "refHelp": "Гілка, тег або SHA, з якого читати маніфести. Порожнє використовує гілку за замовчуванням репозиторію.",
1288
+ "path": "Шлях маніфесту",
1289
+ "pathHelp": "Файл або каталог у репозиторії, що містить ресурси для застосування.",
1290
+ "urlSourceLabel": "URL середовища",
1291
+ "urlIngressTemplate": "Шаблон хоста Ingress",
1292
+ "urlIngressStatus": "Зчитати стан Ingress",
1293
+ "urlServiceStatus": "Зчитати стан Service",
1294
+ "hostTemplate": "Шаблон хоста",
1295
+ "hostTemplateHelp": "Шаблон хоста, відрендерений зі змінними провіженингу, такими як branch і pullNumber; отриманий хост стає URL середовища.",
1296
+ "ingressName": "Назва Ingress",
1297
+ "ingressNameHelp": "Ingress, з якого зчитати хост балансувальника. Порожнє використовує єдиний застосований Ingress.",
1298
+ "serviceName": "Назва Service",
1299
+ "port": "Порт",
1300
+ "scheme": "Схема URL",
1301
+ "schemeDefault": "https (за замовчуванням)",
1302
+ "namespaceTemplate": "Шаблон простору імен",
1303
+ "namespaceTemplateHelp": "Назва простору імен на кожен PR, відрендерена зі змінних провіженингу, таких як pullNumber. Порожнє виводить її з номера PR.",
1304
+ "imageTemplate": "Шаблон образу",
1305
+ "imageTemplateHelp": "Посилання на образ, доступне маніфестам, відрендерене зі змінними провіженингу, такими як branch і sha.",
1306
+ "caCertPem": "Сертифікат CA кластера (PEM)",
1307
+ "caCertPemHelp": "Вставте CA-набір кластера, щоб TLS-сертифікат apiserver проходив перевірку. Пропустіть лише для публічно довіреного CA.",
1308
+ "insecureSkipTlsVerify": "Пропустити перевірку TLS",
1309
+ "insecureSkipTlsVerifyHelp": "Наполегливо не рекомендується. Вимикає перевірку TLS apiserver; використовуйте лише для кластерів kind/dev."
1292
1310
  },
1293
1311
  "kubernetes": {
1294
1312
  "label": "Назва",
@@ -1304,6 +1322,10 @@
1304
1322
  "caCertPem": "Сертифікат CA кластера (PEM)",
1305
1323
  "caCertPemHelp": "Вставте CA-набір кластера, щоб TLS-сертифікат apiserver проходив перевірку. Пропустіть лише для публічно довіреного CA.",
1306
1324
  "harnessPort": "Порт harness"
1325
+ },
1326
+ "advancedManifest": {
1327
+ "summary": "Розширено: власний планувальник на основі API",
1328
+ "intro": "Потрібно лише для інтеграції власного планувальника на основі API. Звичайні бекенди (локальний Docker, Cloudflare Containers і Kubernetes) цього не потребують; опишіть тут HTTP API власного планувальника, лише якщо ви його використовуєте."
1307
1329
  }
1308
1330
  },
1309
1331
  "serviceFragmentDefaults": {
@@ -1654,6 +1676,22 @@
1654
1676
  "removed": "Раннер видалено",
1655
1677
  "removeFailed": "Не вдалося видалити раннер"
1656
1678
  }
1679
+ },
1680
+ "infrastructure": {
1681
+ "active": "Активно: {backend}",
1682
+ "registerHint": "Зареєструйте пул раннерів нижче, щоб увімкнути це.",
1683
+ "updateFailed": "Не вдалося оновити бекенд виконання",
1684
+ "executionBackend": {
1685
+ "label": "Де виконуються агенти",
1686
+ "local-docker": "Локальний Docker (хост)",
1687
+ "cloudflare-containers": "Cloudflare Containers (вбудовано)",
1688
+ "runner-pool": "Самостійно розміщений пул раннерів"
1689
+ },
1690
+ "testEnvBackend": {
1691
+ "label": "Де виконуються тестові середовища",
1692
+ "local-compose": "docker-compose у контейнері",
1693
+ "environment-provider": "Провайдер середовищ"
1694
+ }
1657
1695
  }
1658
1696
  },
1659
1697
  "providers": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.49.1",
3
+ "version": "0.50.0",
4
4
  "description": "Reusable Nuxt layer for the Agent Architecture Board SPA (components, stores, composables, pages). Consume it from a thin deployment app via `extends: ['@cat-factory/app']` and point it at your backend with NUXT_PUBLIC_API_BASE. See deploy/frontend for an example.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,7 +34,7 @@
34
34
  "valibot": "^1.4.2",
35
35
  "vue": "^3.5.39",
36
36
  "wretch": "^3.0.9",
37
- "@cat-factory/contracts": "0.50.1"
37
+ "@cat-factory/contracts": "0.52.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@toad-contracts/testing": "0.3.2",
@@ -1,195 +0,0 @@
1
- <script setup lang="ts">
2
- // Local-mode-only settings: the warm-container pool + per-repo checkout reuse. These are
3
- // a per-DEPLOYMENT singleton stored in the DB (they replaced the LOCAL_POOL_* / HARNESS_*
4
- // env vars), so a developer tunes them here instead of editing .env. The warm pool keeps
5
- // idle harness containers ready and re-leases one (preferring repo affinity) to each run —
6
- // far faster startup than a cold container per run. Saving applies the new sizing to the
7
- // running service immediately (the pool is resized live — no restart needed); in-flight
8
- // runs keep the container they already hold, and the checkout config applies to containers
9
- // started after the save.
10
- import { reactive, ref, watch } from 'vue'
11
-
12
- const { t } = useI18n()
13
- const ui = useUiStore()
14
- const store = useLocalSettingsStore()
15
- const toast = useToast()
16
-
17
- const open = computed({
18
- get: () => ui.localModeSettingsOpen,
19
- set: (v: boolean) => (v ? ui.openLocalModeSettings() : ui.closeLocalModeSettings()),
20
- })
21
-
22
- const saving = ref(false)
23
-
24
- // Editable draft. `idleMinutes` and `cleanKeep` are friendlier renderings of the stored
25
- // `pool.idleTtlMs` (ms) and `checkout.cleanKeep` (string[]).
26
- const draft = reactive({
27
- size: 0,
28
- minWarm: 0,
29
- max: null as number | null,
30
- idleMinutes: 10,
31
- workspaceRoot: '/workspace',
32
- cleanKeep: 'node_modules,.venv,target,.gradle,.pnpm-store',
33
- })
34
-
35
- function syncDraft() {
36
- const s = store.settings
37
- if (!s) return
38
- draft.size = s.pool.size
39
- draft.minWarm = s.pool.minWarm
40
- draft.max = s.pool.max
41
- draft.idleMinutes = Math.round(s.pool.idleTtlMs / 60_000)
42
- draft.workspaceRoot = s.checkout.workspaceRoot
43
- draft.cleanKeep = s.checkout.cleanKeep.join(',')
44
- }
45
-
46
- // Load + hydrate the draft whenever the panel opens.
47
- watch(
48
- open,
49
- (isOpen) => {
50
- if (isOpen) void store.load().then(syncDraft)
51
- },
52
- { immediate: true },
53
- )
54
- watch(() => store.settings, syncDraft)
55
-
56
- async function save() {
57
- const cleanKeep = draft.cleanKeep
58
- .split(',')
59
- .map((s) => s.trim())
60
- .filter(Boolean)
61
- saving.value = true
62
- try {
63
- await store.save({
64
- pool: {
65
- size: Math.max(0, Math.floor(draft.size)),
66
- minWarm: Math.max(0, Math.floor(draft.minWarm)),
67
- max: draft.max == null ? null : Math.max(0, Math.floor(draft.max)),
68
- idleTtlMs: Math.max(0, Math.floor(draft.idleMinutes * 60_000)),
69
- },
70
- checkout: { workspaceRoot: draft.workspaceRoot.trim() || '/workspace', cleanKeep },
71
- })
72
- toast.add({
73
- title: t('settings.localMode.toast.saved'),
74
- icon: 'i-lucide-check',
75
- color: 'success',
76
- })
77
- } catch (e) {
78
- toast.add({
79
- title: t('settings.localMode.toast.saveFailed'),
80
- description: e instanceof Error ? e.message : String(e),
81
- icon: 'i-lucide-triangle-alert',
82
- color: 'error',
83
- })
84
- } finally {
85
- saving.value = false
86
- }
87
- }
88
- </script>
89
-
90
- <template>
91
- <UModal v-model:open="open" :title="t('settings.localMode.title')" :ui="{ content: 'max-w-2xl' }">
92
- <template #body>
93
- <div class="space-y-6">
94
- <i18n-t
95
- keypath="settings.localMode.intro"
96
- tag="p"
97
- class="text-xs text-slate-400"
98
- scope="global"
99
- >
100
- <template #poolVars>
101
- <code>LOCAL_POOL_*</code>
102
- </template>
103
- <template #harnessVars>
104
- <code>HARNESS_*</code>
105
- </template>
106
- </i18n-t>
107
-
108
- <!-- Warm container pool -->
109
- <section class="space-y-3">
110
- <div>
111
- <h4 class="text-sm font-semibold text-slate-200">
112
- {{ t('settings.localMode.pool.heading') }}
113
- </h4>
114
- <i18n-t
115
- keypath="settings.localMode.pool.description"
116
- tag="p"
117
- class="text-[11px] text-slate-400"
118
- scope="global"
119
- >
120
- <template #appleContainer>
121
- <code>container</code>
122
- </template>
123
- </i18n-t>
124
- </div>
125
- <div class="grid grid-cols-1 gap-3 sm:grid-cols-2">
126
- <UFormField
127
- :label="t('settings.localMode.pool.size.label')"
128
- :help="t('settings.localMode.pool.size.help')"
129
- >
130
- <UInput v-model.number="draft.size" type="number" :min="0" size="sm" />
131
- </UFormField>
132
- <UFormField
133
- :label="t('settings.localMode.pool.minWarm.label')"
134
- :help="t('settings.localMode.pool.minWarm.help')"
135
- >
136
- <UInput v-model.number="draft.minWarm" type="number" :min="0" size="sm" />
137
- </UFormField>
138
- <UFormField
139
- :label="t('settings.localMode.pool.max.label')"
140
- :help="t('settings.localMode.pool.max.help')"
141
- >
142
- <UInput
143
- v-model.number="draft.max"
144
- type="number"
145
- :min="0"
146
- size="sm"
147
- :placeholder="t('settings.localMode.pool.max.placeholder')"
148
- />
149
- </UFormField>
150
- <UFormField
151
- :label="t('settings.localMode.pool.idleTimeout.label')"
152
- :help="t('settings.localMode.pool.idleTimeout.help')"
153
- >
154
- <UInput v-model.number="draft.idleMinutes" type="number" :min="0" size="sm" />
155
- </UFormField>
156
- </div>
157
- </section>
158
-
159
- <!-- Checkout reuse -->
160
- <section class="space-y-3 border-t border-slate-800 pt-6">
161
- <div>
162
- <h4 class="text-sm font-semibold text-slate-200">
163
- {{ t('settings.localMode.checkout.heading') }}
164
- </h4>
165
- <p class="text-[11px] text-slate-400">
166
- {{ t('settings.localMode.checkout.description') }}
167
- </p>
168
- </div>
169
- <UFormField
170
- :label="t('settings.localMode.checkout.workspaceRoot.label')"
171
- :help="t('settings.localMode.checkout.workspaceRoot.help')"
172
- >
173
- <UInput v-model="draft.workspaceRoot" size="sm" placeholder="/workspace" />
174
- </UFormField>
175
- <UFormField
176
- :label="t('settings.localMode.checkout.cleanKeep.label')"
177
- :help="t('settings.localMode.checkout.cleanKeep.help')"
178
- >
179
- <UInput
180
- v-model="draft.cleanKeep"
181
- size="sm"
182
- placeholder="node_modules,.venv,target,.gradle,.pnpm-store"
183
- />
184
- </UFormField>
185
- </section>
186
-
187
- <div class="flex justify-end">
188
- <UButton color="primary" icon="i-lucide-save" :loading="saving" @click="save">
189
- {{ t('common.save') }}
190
- </UButton>
191
- </div>
192
- </div>
193
- </template>
194
- </UModal>
195
- </template>