@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": "Завантаження…"
717
717
  },
718
+ "localMode": {
719
+ "continueWith": "Продовжити з {provider}",
720
+ "enterPatTitle": "Або увійдіть за допомогою особистого токена доступу",
721
+ "tokenPlaceholder": "вставте токен {provider}",
722
+ "createToken": "Створити токен {provider} ↗",
723
+ "submit": "Увійти",
724
+ "orDivider": "або",
725
+ "failed": "Не вдалося увійти. Перевірте токен і спробуйте ще раз."
726
+ },
727
+ "signInRequired": {
728
+ "personalSubscriptions": "Особисті підписки зберігаються у вашому обліковому записі, але це розгортання працює без входу, тому їх не можна зберегти тут. Скористайтеся пулом робочого простору або ключем API постачальника.",
729
+ "userApiKeys": "Ваші особисті ключі API зберігаються у вашому обліковому записі, але це розгортання працює без входу, тому їх не можна зберегти тут. Змініть область на «Цей робочий простір», щоб додати спільний ключ."
730
+ },
718
731
  "login": {
719
732
  "appTitle": "Architecture Board",
720
733
  "subtitle": "Увійдіть, щоб продовжити.",
@@ -789,6 +802,33 @@
789
802
  "saveFailed": "Не вдалося зберегти ключі вебпошуку",
790
803
  "cleared": "Ключі вебпошуку очищено",
791
804
  "clearFailed": "Не вдалося очистити ключі вебпошуку"
805
+ },
806
+ "contentStorage": {
807
+ "title": "Сховище вмісту",
808
+ "description": "Де зберігаються знімки екрана тестувальника UI та еталонні зображення дизайну для цього облікового запису. Метадані завжди зберігаються в базі даних; до обраного бекенду надходять лише байти файлів.",
809
+ "default": "За замовчуванням ({backend})",
810
+ "backends": {
811
+ "off": "Вимкнено (сховище вимкнено)",
812
+ "fs": "Локальна файлова система",
813
+ "s3": "Amazon S3 / сумісне з S3",
814
+ "r2": "Cloudflare R2",
815
+ "db": "База даних Postgres"
816
+ },
817
+ "basePath": "Базовий шлях (за замовчуванням: .file-storage)",
818
+ "region": "Регіон (напр. us-east-1)",
819
+ "bucket": "Bucket",
820
+ "prefix": "Префікс ключа (необов’язково)",
821
+ "endpoint": "Endpoint (необов’язково, сумісний з S3)",
822
+ "forcePathStyle": "Примусова адресація у стилі шляху (більшість сховищ, сумісних із S3)",
823
+ "accessKeys": "Ключі доступу",
824
+ "accessKeyId": "Ідентифікатор ключа доступу",
825
+ "secretAccessKey": "Секретний ключ доступу",
826
+ "keysHint": "Ключі запечатані в стані спокою й ніколи не показуються після збереження; залиште порожнім, щоб зберегти наявні ключі.",
827
+ "regionBucketValidation": "Введіть регіон і bucket S3",
828
+ "bothKeysValidation": "Введіть і ідентифікатор ключа доступу, і секрет",
829
+ "keysValidation": "Введіть ідентифікатор ключа доступу та секрет S3",
830
+ "saved": "Сховище вмісту збережено",
831
+ "saveFailed": "Не вдалося зберегти сховище вмісту"
792
832
  }
793
833
  },
794
834
  "accountFragments": {
@@ -1119,5 +1159,455 @@
1119
1159
  }
1120
1160
  }
1121
1161
  }
1162
+ },
1163
+ "settings": {
1164
+ "modelConfiguration": {
1165
+ "title": "Налаштування моделей",
1166
+ "subtitle": "Набори налаштувань, які призначають модель кожному агенту. Завдання обирає один із них; за замовчуванням завдання використовують стандартний набір робочого простору.",
1167
+ "back": "Назад",
1168
+ "closeEsc": "Закрити (Esc)",
1169
+ "quota": "квота",
1170
+ "list": {
1171
+ "intro": "Кожен набір задає {baseModel} для кожного агента, з необов'язковими перевизначеннями для окремих агентів. Модель, закріплена за окремим завданням, усе одно має перевагу над набором.",
1172
+ "introBaseModel": "базову модель",
1173
+ "newPreset": "Новий набір",
1174
+ "loadingCatalog": "Завантаження каталогу моделей…",
1175
+ "default": "За замовчуванням",
1176
+ "setDefaultTitle": "Зробити стандартним для робочого простору",
1177
+ "editTitle": "Редагувати набір",
1178
+ "deleteDisabledTitle": "Стандартний набір не можна видалити",
1179
+ "deleteTitle": "Видалити набір",
1180
+ "basePrefix": "Базова:",
1181
+ "overrideCount": "{count} перевизначення | {count} перевизначення | {count} перевизначень",
1182
+ "empty": "Наборів ще немає. Створіть один, щоб призначити моделі вашим агентам."
1183
+ },
1184
+ "editor": {
1185
+ "useBaseModel": "Використати базову модель",
1186
+ "baseModel": "Базова модель",
1187
+ "nameLabel": "Назва",
1188
+ "namePlaceholder": "напр. Kimi K2.7",
1189
+ "baseModelLabel": "Базова модель (застосовується до кожного агента)",
1190
+ "makeDefault": "Зробити стандартним для робочого простору",
1191
+ "perAgentOverrides": "Перевизначення для окремих агентів",
1192
+ "filterPlaceholder": "Фільтрувати агентів…",
1193
+ "noAgentsMatch": "Жоден агент не відповідає \"{filter}\".",
1194
+ "saveChanges": "Зберегти зміни",
1195
+ "createPreset": "Створити набір"
1196
+ },
1197
+ "toast": {
1198
+ "setDefaultFailed": "Не вдалося встановити стандартний набір",
1199
+ "deleteFailed": "Не вдалося видалити набір",
1200
+ "nameRequiredTitle": "Потрібна назва",
1201
+ "nameRequiredBody": "Дайте набору назву.",
1202
+ "saveFailed": "Не вдалося зберегти набір"
1203
+ }
1204
+ },
1205
+ "account": {
1206
+ "title": "Налаштування облікового запису",
1207
+ "noAccount": "Обліковий запис не вибрано.",
1208
+ "tabs": {
1209
+ "team": "Команда та доступ",
1210
+ "fragments": "Фрагменти контексту"
1211
+ }
1212
+ },
1213
+ "providerConnection": {
1214
+ "fallbackTitle": "Постачальник",
1215
+ "kind": {
1216
+ "environment": {
1217
+ "title": "Постачальник ефемерних середовищ",
1218
+ "blurb": "Місце, де агент Tester працює проти живого середовища попереднього перегляду. Налаштуйте параметри для робочого простору та облікові дані, потрібні вашому постачальнику."
1219
+ },
1220
+ "runner-pool": {
1221
+ "title": "Самостійно розміщений пул виконавців",
1222
+ "blurb": "Місце, де працюють агенти кодування, коли не використовуються контейнери Cloudflare. Налаштуйте кінцеву точку планувальника пулу та облікові дані."
1223
+ }
1224
+ },
1225
+ "delegation": {
1226
+ "title": "Локальне делегування",
1227
+ "intro": "Типово ця машина виконує все локально — контейнерні агенти на Docker хоста, а інфраструктуру Tester через docker-compose всередині контейнера. Увімкніть опції нижче, щоб делегувати будь-яке з цих завдань зовнішньому сервісу. Застосовується лише в локальному режимі.",
1228
+ "agentsToggle": "Запускати контейнерні агенти в пулі виконавців",
1229
+ "agentsHint": "Надсилайте кожного контейнерного агента (кодер, tester, об'єднувач, bootstrap, …) до самостійно розміщеного пулу виконавців цього робочого простору замість Docker хоста.",
1230
+ "registerPoolPrompt": "Спершу {link}, щоб увімкнути це.",
1231
+ "registerPoolLink": "Зареєструйте пул виконавців",
1232
+ "envToggle": "Надавати середовища Tester через постачальника",
1233
+ "envHint": "Підніміть середовище попереднього перегляду Tester через постачальника середовищ, налаштованого нижче, замість docker-compose всередині контейнера. Спершу підключіть постачальника, щоб увімкнути це.",
1234
+ "updateFailed": "Не вдалося оновити делегування"
1235
+ },
1236
+ "runnerPoolLocalHint": "Зареєструйте свій пул тут, а потім увімкніть «Запускати контейнерні агенти в пулі виконавців» на екрані {link}, щоб спрямувати до нього агентів цього робочого простору.",
1237
+ "ephemeralEnvironments": "Ефемерні середовища",
1238
+ "viewLogs": "Переглянути журнали",
1239
+ "hideLogs": "Сховати журнали",
1240
+ "connectedAt": "Підключено · {baseUrl}",
1241
+ "missingConfig": "Відсутня обов'язкова конфігурація: {fields}",
1242
+ "manifestEditorUnavailable": "Цього постачальника налаштовують, складаючи маніфест. Вбудований редактор маніфестів ще недоступний — наразі зареєструйте його через API.",
1243
+ "form": {
1244
+ "updateConfiguration": "Оновити конфігурацію",
1245
+ "connect": "Підключити",
1246
+ "reenterSecrets": "Введіть секретне поле повторно, щоб зберегти зміни — збережені секрети доступні лише для запису й не показуються. | Введіть секретні поля повторно, щоб зберегти зміни — збережені секрети доступні лише для запису й не показуються. | Введіть секретні поля повторно, щоб зберегти зміни — збережені секрети доступні лише для запису й не показуються.",
1247
+ "optionalLabel": "{label} (необов'язково)"
1248
+ },
1249
+ "field": {
1250
+ "defaultsTo": "Типово: {value}"
1251
+ },
1252
+ "test": {
1253
+ "button": "Перевірити підключення",
1254
+ "ok": "Підключення в порядку",
1255
+ "failed": "Не вдалося підключитися"
1256
+ },
1257
+ "toast": {
1258
+ "saved": "{title} збережено",
1259
+ "saveFailed": "Не вдалося зберегти підключення",
1260
+ "removed": "Підключення видалено",
1261
+ "removeFailed": "Не вдалося видалити підключення"
1262
+ }
1263
+ },
1264
+ "serviceFragmentDefaults": {
1265
+ "intro": "Виберіть фрагменти з найкращими практиками, з якими стартує кожен новий сервіс. Їхні поради вплітаються в промпт кожного агента, що працює з кодом (кодер, рецензент, архітектор, виправлячі), на завданнях сервісу. Набір можна уточнити окремо для кожного сервісу в його інспекторі; зміна цього типового значення не впливає на вже наявні сервіси.",
1266
+ "defaultFragments": "Типові фрагменти",
1267
+ "addFragment": "Додати фрагмент",
1268
+ "empty": "Немає — нові сервіси стартують без фрагментів на рівні сервісу.",
1269
+ "saveFailed": "Не вдалося зберегти типові фрагменти",
1270
+ "footer": {
1271
+ "question": "Потрібно додати чи відредагувати самі фрагменти (написані вручну, пов'язані документи, репозиторії)?",
1272
+ "manageBoard": "Керувати бібліотекою фрагментів цієї дошки →",
1273
+ "manageAccount": "Керувати фрагментами облікового запису →"
1274
+ }
1275
+ },
1276
+ "issueTracker": {
1277
+ "filing": {
1278
+ "heading": "Де реєструються тикети",
1279
+ "description": "Циклічний конвеєр технічного боргу створює тикет перед реалізацією й реєструє його в цьому трекері. Виберіть {none}, щоб пропустити реєстрацію.",
1280
+ "none": "Немає",
1281
+ "githubHint": "GitHub Issues використовує встановлений GitHub App, який ще не під'єднано. Встановіть його в {link} — реєстрація залишається вимкненою до того часу.",
1282
+ "githubHintLink": "Інтеграції → GitHub",
1283
+ "jiraHint": "Jira ще не під'єднано. {link}, щоб реєструвати й пов'язувати тикети.",
1284
+ "linearHint": "Linear ще не під'єднано. {link}, щоб реєструвати й пов'язувати тикети.",
1285
+ "connectLink": "Під'єднайте",
1286
+ "jiraProjectKey": "Ключ проєкту Jira",
1287
+ "jiraProjectKeyHelp": "Нові тикети реєструються в цьому проєкті.",
1288
+ "linearTeamId": "Ідентифікатор команди Linear",
1289
+ "linearTeamIdHelp": "Нові тикети створюються в цій команді (Linear вимагає команду для створення тикета)."
1290
+ },
1291
+ "vendor": {
1292
+ "github": "GitHub Issues",
1293
+ "jira": "Jira",
1294
+ "linear": "Linear"
1295
+ },
1296
+ "linking": {
1297
+ "heading": "Пов'язуйте тикети як контекст",
1298
+ "description": "Коли джерело доступне, ви можете імпортувати його тикети та прикріпити їх до завдання, щоб агенти бачили опис тикета й коментарі під час реалізації. Це незалежно від трекера реєстрації вище.",
1299
+ "github": {
1300
+ "available": "Використовує встановлений GitHub App — облікові дані не потрібні.",
1301
+ "unavailable": "Встановіть GitHub App (Інтеграції → GitHub), щоб запропонувати це джерело."
1302
+ },
1303
+ "checkSetup": "Перевірити налаштування",
1304
+ "install": "Встановити",
1305
+ "connected": "Під'єднано.",
1306
+ "jira": {
1307
+ "connectHint": "Під'єднайтеся за допомогою облікового запису Jira та токена API."
1308
+ },
1309
+ "linear": {
1310
+ "connectHint": "Під'єднайтеся за допомогою особистого ключа API Linear."
1311
+ },
1312
+ "connect": "Під'єднати"
1313
+ },
1314
+ "writeback": {
1315
+ "heading": "Зворотний запис",
1316
+ "description": "Записуйте назад до пов'язаних тикетів завдання в міру просування його pull request. Кожен перемикач — це значення за замовчуванням робочого простору, і його можна перевизначити для завдання в інспекторі. Тикети GitHub закриваються нативно; тикети Jira переходять до першого статусу у своїй категорії {done}.",
1317
+ "done": "Готово",
1318
+ "commentOnOpen": {
1319
+ "label": "Коментувати, коли відкривається PR",
1320
+ "help": "Публікує коментар у пов'язаному тикеті з посиланням на новий pull request."
1321
+ },
1322
+ "resolveOnMerge": {
1323
+ "label": "Закрити як вирішене, коли PR зливається",
1324
+ "help": "Коментує, що PR злито, а потім закриває / вирішує пов'язаний тикет."
1325
+ }
1326
+ },
1327
+ "probeFailure": {
1328
+ "title": "Відстеження тикетів недоступне",
1329
+ "disabled": "Інтеграцію джерел завдань вимкнено в цьому розгортанні (її ключ шифрування не налаштовано). Встановіть ENCRYPTION_KEY на бекенді, щоб увімкнути відстеження тикетів.",
1330
+ "serverError": "Служба відстеження тикетів повернула помилку (HTTP {status}): {message}. Зазвичай це означає, що бекенд не повністю мігровано/налаштовано.",
1331
+ "loadFailedStatus": "Не вдалося завантажити налаштування трекера тикетів (HTTP {status}): {message}",
1332
+ "loadFailed": "Не вдалося завантажити налаштування трекера тикетів: {message}"
1333
+ },
1334
+ "toast": {
1335
+ "saved": "Трекер тикетів збережено",
1336
+ "saveFailed": "Не вдалося зберегти налаштування",
1337
+ "updateFailed": "Не вдалося оновити",
1338
+ "checkFailed": "Перевірка не вдалася"
1339
+ }
1340
+ },
1341
+ "userSecrets": {
1342
+ "title": "Мій токен GitHub",
1343
+ "intro": "Зберігайте особистий токен доступу, що використовується для запусків, які {you} розпочинаєте — пуші, pull request-и, шлюз CI та злиття приписуються вашому доступу GitHub. Зберігається {scope}; токен доступний лише для запису й більше ніколи не показується.",
1344
+ "introYou": "ви",
1345
+ "introScope": "лише для вас",
1346
+ "connectedStored": "Під'єднано · токен збережено",
1347
+ "replaceToken": "Замінити токен",
1348
+ "addToken": "Додати токен",
1349
+ "labelField": "Мітка (необов'язково)",
1350
+ "optionalField": "{label} (необов'язково)",
1351
+ "testConnection": "Перевірити з'єднання",
1352
+ "tokenValid": "Токен дійсний",
1353
+ "tokenRejected": "Токен відхилено",
1354
+ "secretFallback": "Секрет",
1355
+ "toast": {
1356
+ "saved": "{label} збережено",
1357
+ "saveFailed": "Не вдалося зберегти секрет",
1358
+ "removed": "Секрет видалено",
1359
+ "removeFailed": "Не вдалося видалити секрет"
1360
+ }
1361
+ },
1362
+ "mergeThresholds": {
1363
+ "intro": "Іменовані політики автоматичного злиття, які може обрати завдання. Після проходження CI агент {merger} оцінює PR за складністю, ризиком і впливом (0-100%); PR зливається автоматично лише тоді, коли кожна оцінка дорівнює або нижча за межі набору, інакше формується сповіщення про перегляд. Набір за замовчуванням керує будь-яким завданням, яке не обирає жодного.",
1364
+ "mergerAgent": "merger",
1365
+ "concern": {
1366
+ "none": "Немає (завжди зупиняти)",
1367
+ "low": "Низький",
1368
+ "medium": "Середній",
1369
+ "high": "Високий (ніколи не зупиняти)"
1370
+ },
1371
+ "presetNamePlaceholder": "Назва набору",
1372
+ "default": "За замовчуванням",
1373
+ "makeDefault": "Зробити за замовчуванням",
1374
+ "deleteDefaultBlocked": "Набір за замовчуванням не можна видалити",
1375
+ "deletePreset": "Видалити набір",
1376
+ "field": {
1377
+ "maxComplexity": "Макс. складність %",
1378
+ "maxRisk": "Макс. ризик %",
1379
+ "maxImpact": "Макс. вплив %",
1380
+ "ciMaxAttempts": "Спроби виправлення CI",
1381
+ "maxRequirementIterations": "Ітерації вимог",
1382
+ "maxRequirementConcernAllowed": "Авто-пропуск зауважень до"
1383
+ },
1384
+ "newPreset": "Новий набір",
1385
+ "create": {
1386
+ "name": "Назва",
1387
+ "namePlaceholder": "напр. Обережний",
1388
+ "complexity": "Складн.%",
1389
+ "risk": "Ризик%",
1390
+ "impact": "Вплив%",
1391
+ "ciFix": "Випр. CI",
1392
+ "reqIter": "Ітер. вим.",
1393
+ "autoPass": "Авто-пропуск до"
1394
+ },
1395
+ "add": "Додати",
1396
+ "toast": {
1397
+ "saved": "Набір збережено",
1398
+ "saveFailed": "Не вдалося зберегти набір",
1399
+ "created": "Набір створено",
1400
+ "createFailed": "Не вдалося створити набір",
1401
+ "defaultFailed": "Не вдалося встановити за замовчуванням",
1402
+ "deleteFailed": "Не вдалося видалити набір"
1403
+ }
1404
+ },
1405
+ "observabilityConnection": {
1406
+ "title": "Стан після випуску",
1407
+ "intro": "Після випуску шлюз {gate} спостерігає за налаштованими моніторами/SLO спостережуваності. У разі регресії він запускає чергового агента для розслідування (людина вирішує, чи відкочувати). Призначте, за якими моніторами/SLO спостерігає сервіс, в інспекторі цього сервісу.",
1408
+ "connection": {
1409
+ "heading": "З'єднання",
1410
+ "provider": "Постачальник"
1411
+ },
1412
+ "datadog": {
1413
+ "site": "Сайт Datadog",
1414
+ "apiKey": "Ключ API",
1415
+ "appKey": "Ключ застосунку"
1416
+ },
1417
+ "saveConnection": "Зберегти з'єднання",
1418
+ "disconnect": "Від'єднати",
1419
+ "incident": {
1420
+ "heading": "Збагачення інцидентів",
1421
+ "configured": "Налаштовано",
1422
+ "notSet": "Не встановлено",
1423
+ "description": "Необов'язково. У разі регресії результат розслідування чергового публікується в інциденті, який ці системи ВЖЕ відкрили за тими самими сигналами (анотувати, ніколи не сповіщати повторно). Секрети доступні лише для запису: порожнє поле залишає збережене значення без змін.",
1424
+ "pagerDutyToken": "Токен API PagerDuty",
1425
+ "pagerDutyFromEmail": "Електронна пошта відправника PagerDuty",
1426
+ "incidentIoKey": "Ключ API incident.io",
1427
+ "clear": "Очистити"
1428
+ },
1429
+ "status": {
1430
+ "notConnected": "Не під'єднано",
1431
+ "connected": "Під'єднано",
1432
+ "connectedWithSite": "Під'єднано ({site})"
1433
+ },
1434
+ "toast": {
1435
+ "loadFailed": "Не вдалося завантажити налаштування спостережуваності",
1436
+ "incidentCredsRequired": "Введіть облікові дані PagerDuty або incident.io",
1437
+ "incidentSaved": "Збагачення інцидентів збережено",
1438
+ "incidentSaveFailed": "Не вдалося зберегти збагачення інцидентів",
1439
+ "incidentDisconnectFailed": "Не вдалося від'єднати збагачення інцидентів",
1440
+ "connected": "Спостережуваність під'єднано",
1441
+ "connectFailed": "Не вдалося зберегти з'єднання",
1442
+ "disconnectFailed": "Не вдалося від'єднати"
1443
+ }
1444
+ },
1445
+ "localMode": {
1446
+ "title": "Локальний режим",
1447
+ "intro": "Налаштування локального запускача контейнерів, збережене на розгортанні цієї машини (воно замінило змінні середовища {poolVars} / {harnessVars}). Збереження змінює розмір теплого пулу наживо, без потреби в перезапуску; поточні запуски зберігають контейнер, який вони вже утримують.",
1448
+ "pool": {
1449
+ "heading": "Теплий пул контейнерів",
1450
+ "description": "Тримайте бездіяльні контейнери оснащення готовими та повторно призначайте один (віддаючи перевагу контейнеру, який уже містить репозиторій запуску) замість холодного старту на кожен запуск. Розмір пулу 0 вимикає його. Потребує середовища родини Docker (Docker/Podman/OrbStack/Colima); ігнорується на Apple {appleContainer}.",
1451
+ "size": {
1452
+ "label": "Розмір пулу",
1453
+ "help": "Макс. бездіяльних теплих контейнерів. 0 = пулінг вимкнено."
1454
+ },
1455
+ "minWarm": {
1456
+ "label": "Попередній розігрів під час запуску",
1457
+ "help": "Контейнери, що запускаються під час старту сервісу."
1458
+ },
1459
+ "max": {
1460
+ "label": "Макс. контейнерів",
1461
+ "help": "Жорстке обмеження (призначені + бездіяльні). Порожнє = розмір пулу.",
1462
+ "placeholder": "(розмір пулу)"
1463
+ },
1464
+ "idleTimeout": {
1465
+ "label": "Час бездіяльності (хвилини)",
1466
+ "help": "Вилучити бездіяльний контейнер з пулу після."
1467
+ }
1468
+ },
1469
+ "checkout": {
1470
+ "heading": "Повторне використання робочої копії",
1471
+ "description": "Коли теплий контейнер уже містить репозиторій запуску, оснащення повторно використовує його робочу копію для репозиторію (очищення + отримання + перемикання гілки) замість клонування з нуля.",
1472
+ "workspaceRoot": {
1473
+ "label": "Корінь робочого простору",
1474
+ "help": "Абсолютний каталог у контейнері, де розташована повторно використовувана робоча копія."
1475
+ },
1476
+ "cleanKeep": {
1477
+ "label": "Зберегти під час очищення (через кому)",
1478
+ "help": "Каталоги кешу залежностей, які зберігає очищення на кожен запуск."
1479
+ }
1480
+ },
1481
+ "toast": {
1482
+ "saved": "Локальні налаштування збережено",
1483
+ "saveFailed": "Не вдалося зберегти локальні налаштування"
1484
+ }
1485
+ },
1486
+ "openRouterCatalog": {
1487
+ "intro": "Отримайте доступ до {models} через єдиний шлюз. Додайте свій ключ OpenRouter нижче, а потім увімкніть потрібні моделі. Вони з'являються в селекторі моделей разом із вікном контексту та ціною й враховуються у вашому бюджеті витрат.",
1488
+ "introModels": "понад 300 моделей",
1489
+ "connectHeading": "Підключіть свій ключ OpenRouter",
1490
+ "step1": "Відкрийте {link} і створіть ключ API.",
1491
+ "step1Link": "openrouter.ai → Ключі ↗",
1492
+ "step2": "Скопіюйте ключ (починається з {prefix}) і вставте його нижче.",
1493
+ "scope": "Область",
1494
+ "scopeWorkspace": "Цей робочий простір",
1495
+ "scopeUser": "Мої ключі (лише я)",
1496
+ "labelOptional": "Мітка (необов'язково)",
1497
+ "labelPlaceholder": "напр. ключ команди",
1498
+ "apiKey": "Ключ API",
1499
+ "connectAndBrowse": "Підключити й переглянути",
1500
+ "keyConnected": "Ключ OpenRouter підключено",
1501
+ "manageKeys": "Керувати в Постачальники та ключі",
1502
+ "refresh": "Оновити каталог",
1503
+ "enableRecommended": "Увімкнути рекомендовані",
1504
+ "filterPlaceholder": "Фільтрувати за назвою або слагом…",
1505
+ "empty": "Поки що немає моделей. Натисніть {action}, щоб завантажити актуальний список з OpenRouter.",
1506
+ "enabledCount": "увімкнено {count} модель | увімкнено {count} моделі | увімкнено {count} моделей",
1507
+ "context": "{value} ctx",
1508
+ "contextThousands": "{value}K ctx",
1509
+ "price": "{input}/{output} за Mtok",
1510
+ "toast": {
1511
+ "connected": "Ключ OpenRouter підключено",
1512
+ "connectFailed": "Не вдалося підключити ключ",
1513
+ "rejected": "OpenRouter відхилив ключ.",
1514
+ "unreachable": "Не вдалося зв'язатися з OpenRouter",
1515
+ "connectFirst": "Спершу підключіть ключ OpenRouter.",
1516
+ "saved": "Каталог OpenRouter збережено",
1517
+ "saveFailed": "Не вдалося зберегти каталог"
1518
+ }
1519
+ },
1520
+ "workspaceSettings": {
1521
+ "title": "Налаштування робочого простору",
1522
+ "tabs": {
1523
+ "workspace": "Робочий простір",
1524
+ "budget": "Бюджет",
1525
+ "merge": "Пороги злиття",
1526
+ "tracker": "Трекер задач",
1527
+ "fragments": "Найкращі практики сервісу"
1528
+ },
1529
+ "waiting": {
1530
+ "heading": "Очікування на людину",
1531
+ "body": "Запуск, призупинений на рішенні людини (перегляд, схвалення, злиття), чекає стільки, скільки потрібно, і ніколи не скасовується. Після цієї кількості хвилин його сповіщення стає червоним і позначається як {overdue} у вхідних.",
1532
+ "overdue": "Прострочено",
1533
+ "escalateAfter": "Ескалувати через (хвилини)"
1534
+ },
1535
+ "taskLimit": {
1536
+ "heading": "Запущені задачі на сервіс",
1537
+ "body": "Обмежте, скільки задач можуть виконуватися одночасно в межах одного сервісу. Запуск задачі понад ліміт відхиляється з чітким повідомленням, доки запущена задача не завершиться.",
1538
+ "mode": "Режим",
1539
+ "maxRunning": "Максимум запущених задач",
1540
+ "maxPerType": "Максимум задач типу {type}",
1541
+ "modes": {
1542
+ "off": "Без обмеження",
1543
+ "shared": "Спільний для всіх типів",
1544
+ "per_type": "На тип задачі"
1545
+ }
1546
+ },
1547
+ "taskTypes": {
1548
+ "feature": "функція",
1549
+ "bug": "помилка",
1550
+ "document": "документ",
1551
+ "spike": "spike"
1552
+ },
1553
+ "observability": {
1554
+ "heading": "Спостережуваність агента",
1555
+ "body": "Зберігайте повний контекст, наданий кожному агенту: складені промпти, вбудовані фрагменти найкращих практик і повний вміст файлів, впроваджених у його контейнер, щоб згодом їх можна було переглянути у вікні спостережуваності. Тіла зберігаються протягом того самого вікна, що й телеметрія LLM для кожного виклику. Вимкніть, щоб припинити зберігання (наявні знімки видаляються за політикою зберігання).",
1556
+ "toggle": "Зберігати повний контекст агента"
1557
+ },
1558
+ "retention": {
1559
+ "heading": "Зберігання знімків екрана",
1560
+ "body": "Як довго зберігати знімки екрана від тестувальника UI та еталонні дизайнерські зображення, з якими їх порівнюють (візуальна перевірка). Щоденне завдання очищення видаляє як байти зображень, так і їхні метадані, щойно вони виходять за межі цього вікна.",
1561
+ "days": "Зберігання (днів)"
1562
+ },
1563
+ "kaizen": {
1564
+ "heading": "Агент Kaizen",
1565
+ "body": "Після завершення кожного запуску агент Kaizen оцінює, як пройшов кожен крок агента, від плавного й ефективного до заплутаного й хаотичного, і рекомендує покращення промпту/моделі. Комбінація промпт + агент + модель, яка п'ять разів поспіль отримує високу оцінку без рекомендацій, позначається як перевірена й більше не оцінюється. Оцінювання виконується у фоновому режимі й показується в деталях запуску та на екрані Kaizen. Налаштуйте модель оцінювача в Конфігурації моделей (агент \"Kaizen\").",
1566
+ "toggle": "Оцінювати запуски агентів за допомогою Kaizen"
1567
+ },
1568
+ "budget": {
1569
+ "heading": "Місячний бюджет витрат",
1570
+ "body": "Використання токенів вимірюється за кожен виклик LLM, оцінюється та обмежується цим бюджетом. Після його досягнення запуски в цьому робочому просторі призупиняються, а на дошці з'являється попередження. Залиште порожнім, щоб успадкувати вбудоване значення за замовчуванням (близько 100 EUR/місяць).",
1571
+ "monthlyLimit": "Місячний ліміт",
1572
+ "defaultPlaceholder": "За замовчуванням",
1573
+ "currency": "Валюта (ISO 4217)",
1574
+ "save": "Зберегти бюджет"
1575
+ },
1576
+ "toast": {
1577
+ "saved": "Налаштування збережено",
1578
+ "saveFailed": "Не вдалося зберегти налаштування",
1579
+ "budgetSaved": "Бюджет збережено",
1580
+ "budgetSaveFailed": "Не вдалося зберегти бюджет"
1581
+ }
1582
+ },
1583
+ "localModelEndpoints": {
1584
+ "title": "Мої локальні раннери",
1585
+ "intro": "Спрямуйте агентів на LLM, що працює на {ownMachine} (Ollama, LM Studio, llama.cpp, vLLM або будь-який сервер, сумісний з OpenAI). Раннер зберігається {justForYou} (раннер працює на вашому комп'ютері), а ввімкнені моделі автоматично з'являються в селекторі моделей. Ключ API (більшість раннерів його ігнорують) доступний лише для запису й більше ніколи не показується.",
1586
+ "introOwnMachine": "вашому власному комп'ютері",
1587
+ "introJustForYou": "лише для вас",
1588
+ "modelCount": "{count} модель | {count} моделі | {count} моделей",
1589
+ "keySet": "ключ встановлено",
1590
+ "edit": "Редагувати",
1591
+ "editRunner": "Редагувати раннер",
1592
+ "addRunner": "Додати раннер",
1593
+ "runnerType": "Тип раннера",
1594
+ "labelOptional": "Мітка (необов'язково)",
1595
+ "labelPlaceholder": "Мій {name}",
1596
+ "baseUrl": "Базова URL-адреса",
1597
+ "apiKeyOptional": "Ключ API (необов'язково)",
1598
+ "apiKeyKeepPlaceholder": "залиште порожнім, щоб зберегти збережений ключ",
1599
+ "apiKeyIgnorePlaceholder": "більшість раннерів його ігнорують",
1600
+ "testConnection": "Перевірити з'єднання",
1601
+ "unreachable": "Не вдалося зв'язатися з раннером.",
1602
+ "reachable": "Доступний · {count} модель | Доступний · {count} моделі | Доступний · {count} моделей",
1603
+ "noModels": "Жодної моделі не повідомлено.",
1604
+ "enableModels": "Увімкнути моделі",
1605
+ "toast": {
1606
+ "saved": "{name} збережено",
1607
+ "saveFailed": "Не вдалося зберегти раннер",
1608
+ "removed": "Раннер видалено",
1609
+ "removeFailed": "Не вдалося видалити раннер"
1610
+ }
1611
+ }
1122
1612
  }
1123
1613
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cat-factory/app",
3
- "version": "0.46.12",
3
+ "version": "0.47.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",
@@ -33,7 +33,7 @@
33
33
  "pinia-plugin-persistedstate": "^4.7.1",
34
34
  "vue": "^3.5.39",
35
35
  "wretch": "^3.0.9",
36
- "@cat-factory/contracts": "0.43.3"
36
+ "@cat-factory/contracts": "0.44.0"
37
37
  },
38
38
  "devDependencies": {
39
39
  "@toad-contracts/testing": "0.3.2",