@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.
- package/app/components/auth/AuthGate.vue +1 -1
- package/app/components/auth/LoginScreen.vue +131 -1
- package/app/components/layout/AccountDeploymentSettings.vue +232 -5
- package/app/components/providers/ApiKeysSection.vue +27 -3
- package/app/components/providers/PersonalSubscriptionSection.vue +17 -2
- package/app/components/providers/SignInRequiredNotice.vue +19 -0
- package/app/components/settings/AccountSettingsPanel.vue +9 -6
- package/app/components/settings/IssueTrackerPanel.vue +114 -53
- package/app/components/settings/LocalModeSettingsPanel.vue +60 -28
- package/app/components/settings/LocalModelEndpointsPanel.vue +72 -27
- package/app/components/settings/MergeThresholdsPanel.vue +93 -45
- package/app/components/settings/ModelConfigurationPanel.vue +62 -36
- package/app/components/settings/ObservabilityConnectionPanel.vue +65 -35
- package/app/components/settings/OpenRouterCatalogPanel.vue +70 -40
- package/app/components/settings/ProviderConnectionPanel.vue +115 -61
- package/app/components/settings/ServiceFragmentDefaultsPanel.vue +9 -12
- package/app/components/settings/UserSecretsSection.vue +37 -18
- package/app/components/settings/WorkspaceSettingsPanel.vue +114 -62
- package/app/composables/api/auth.ts +7 -0
- package/app/stores/auth.ts +25 -1
- package/app/types/accountSettings.ts +4 -0
- package/i18n/locales/en.json +496 -0
- package/i18n/locales/es.json +490 -0
- package/i18n/locales/fr.json +490 -0
- package/i18n/locales/pl.json +490 -0
- package/i18n/locales/uk.json +490 -0
- package/package.json +2 -2
package/i18n/locales/en.json
CHANGED
|
@@ -751,6 +751,19 @@
|
|
|
751
751
|
"gate": {
|
|
752
752
|
"loading": "Loading…"
|
|
753
753
|
},
|
|
754
|
+
"localMode": {
|
|
755
|
+
"continueWith": "Continue with {provider}",
|
|
756
|
+
"enterPatTitle": "Or sign in with a personal access token",
|
|
757
|
+
"tokenPlaceholder": "paste a {provider} token",
|
|
758
|
+
"createToken": "Create a {provider} token ↗",
|
|
759
|
+
"submit": "Sign in",
|
|
760
|
+
"orDivider": "or",
|
|
761
|
+
"failed": "Sign-in failed. Check the token and try again."
|
|
762
|
+
},
|
|
763
|
+
"signInRequired": {
|
|
764
|
+
"personalSubscriptions": "Personal subscriptions are saved to your account, but this deployment runs without sign-in, so they can't be stored here. Use the workspace pool or a provider API key instead.",
|
|
765
|
+
"userApiKeys": "Your personal API keys are saved to your account, but this deployment runs without sign-in, so they can't be stored here. Switch the scope to \"This workspace\" to add a shared key."
|
|
766
|
+
},
|
|
754
767
|
"login": {
|
|
755
768
|
"appTitle": "Architecture Board",
|
|
756
769
|
"@appTitle": {
|
|
@@ -828,6 +841,33 @@
|
|
|
828
841
|
"saveFailed": "Could not save web search keys",
|
|
829
842
|
"cleared": "Web search keys cleared",
|
|
830
843
|
"clearFailed": "Could not clear web search keys"
|
|
844
|
+
},
|
|
845
|
+
"contentStorage": {
|
|
846
|
+
"title": "Content storage",
|
|
847
|
+
"description": "Where UI-tester screenshots and reference design images for this account are stored. The metadata always lives in the database; only the file bytes go to the chosen backend.",
|
|
848
|
+
"default": "Default ({backend})",
|
|
849
|
+
"backends": {
|
|
850
|
+
"off": "Off (storage disabled)",
|
|
851
|
+
"fs": "Local filesystem",
|
|
852
|
+
"s3": "Amazon S3 / S3-compatible",
|
|
853
|
+
"r2": "Cloudflare R2",
|
|
854
|
+
"db": "Postgres database"
|
|
855
|
+
},
|
|
856
|
+
"basePath": "Base path (default: .file-storage)",
|
|
857
|
+
"region": "Region (e.g. us-east-1)",
|
|
858
|
+
"bucket": "Bucket",
|
|
859
|
+
"prefix": "Key prefix (optional)",
|
|
860
|
+
"endpoint": "Endpoint (optional, S3-compatible)",
|
|
861
|
+
"forcePathStyle": "Force path-style addressing (most S3-compatible stores)",
|
|
862
|
+
"accessKeys": "Access keys",
|
|
863
|
+
"accessKeyId": "Access key ID",
|
|
864
|
+
"secretAccessKey": "Secret access key",
|
|
865
|
+
"keysHint": "Keys are sealed at rest and never shown after saving; leave blank to keep the stored keys.",
|
|
866
|
+
"regionBucketValidation": "Enter the S3 region and bucket",
|
|
867
|
+
"bothKeysValidation": "Enter both the access key id and secret",
|
|
868
|
+
"keysValidation": "Enter the S3 access key id and secret",
|
|
869
|
+
"saved": "Content storage saved",
|
|
870
|
+
"saveFailed": "Could not save content storage"
|
|
831
871
|
}
|
|
832
872
|
},
|
|
833
873
|
"accountFragments": {
|
|
@@ -1158,5 +1198,461 @@
|
|
|
1158
1198
|
}
|
|
1159
1199
|
}
|
|
1160
1200
|
}
|
|
1201
|
+
},
|
|
1202
|
+
"settings": {
|
|
1203
|
+
"modelConfiguration": {
|
|
1204
|
+
"title": "Model Configuration",
|
|
1205
|
+
"subtitle": "Presets that map a model to every agent. A task picks one; tasks default to the workspace default preset.",
|
|
1206
|
+
"back": "Back",
|
|
1207
|
+
"closeEsc": "Close (Esc)",
|
|
1208
|
+
"quota": "quota",
|
|
1209
|
+
"list": {
|
|
1210
|
+
"intro": "Each preset sets a {baseModel} for every agent, with optional per-agent overrides. A model pinned on an individual task still overrides the preset.",
|
|
1211
|
+
"introBaseModel": "base model",
|
|
1212
|
+
"newPreset": "New preset",
|
|
1213
|
+
"loadingCatalog": "Loading model catalog…",
|
|
1214
|
+
"default": "Default",
|
|
1215
|
+
"setDefaultTitle": "Set as workspace default",
|
|
1216
|
+
"editTitle": "Edit preset",
|
|
1217
|
+
"deleteDisabledTitle": "The default preset cannot be deleted",
|
|
1218
|
+
"deleteTitle": "Delete preset",
|
|
1219
|
+
"basePrefix": "Base:",
|
|
1220
|
+
"overrideCount": "{count} override | {count} overrides",
|
|
1221
|
+
"empty": "No presets yet. Create one to map models to your agents."
|
|
1222
|
+
},
|
|
1223
|
+
"editor": {
|
|
1224
|
+
"useBaseModel": "Use base model",
|
|
1225
|
+
"baseModel": "Base model",
|
|
1226
|
+
"nameLabel": "Name",
|
|
1227
|
+
"namePlaceholder": "e.g. Kimi K2.7",
|
|
1228
|
+
"baseModelLabel": "Base model (applied to every agent)",
|
|
1229
|
+
"makeDefault": "Make this the workspace default",
|
|
1230
|
+
"perAgentOverrides": "Per-agent overrides",
|
|
1231
|
+
"filterPlaceholder": "Filter agents…",
|
|
1232
|
+
"noAgentsMatch": "No agents match \"{filter}\".",
|
|
1233
|
+
"saveChanges": "Save changes",
|
|
1234
|
+
"createPreset": "Create preset"
|
|
1235
|
+
},
|
|
1236
|
+
"toast": {
|
|
1237
|
+
"setDefaultFailed": "Could not set the default preset",
|
|
1238
|
+
"deleteFailed": "Could not delete the preset",
|
|
1239
|
+
"nameRequiredTitle": "Name required",
|
|
1240
|
+
"nameRequiredBody": "Give the preset a name.",
|
|
1241
|
+
"saveFailed": "Could not save the preset"
|
|
1242
|
+
}
|
|
1243
|
+
},
|
|
1244
|
+
"account": {
|
|
1245
|
+
"title": "Account settings",
|
|
1246
|
+
"noAccount": "No account selected.",
|
|
1247
|
+
"tabs": {
|
|
1248
|
+
"team": "Team & access",
|
|
1249
|
+
"fragments": "Context fragments"
|
|
1250
|
+
}
|
|
1251
|
+
},
|
|
1252
|
+
"providerConnection": {
|
|
1253
|
+
"fallbackTitle": "Provider",
|
|
1254
|
+
"kind": {
|
|
1255
|
+
"environment": {
|
|
1256
|
+
"title": "Ephemeral environment provider",
|
|
1257
|
+
"blurb": "Where the Tester agent runs against a live preview environment. Configure the per-workspace settings and credentials your provider needs."
|
|
1258
|
+
},
|
|
1259
|
+
"runner-pool": {
|
|
1260
|
+
"title": "Self-hosted runner pool",
|
|
1261
|
+
"blurb": "Where the coding agents run when not using Cloudflare Containers. Configure the pool scheduler endpoint and credentials."
|
|
1262
|
+
}
|
|
1263
|
+
},
|
|
1264
|
+
"delegation": {
|
|
1265
|
+
"title": "Local delegation",
|
|
1266
|
+
"intro": "By default this machine runs everything locally — container agents on host Docker, the Tester's infrastructure via in-container docker-compose. Opt in below to delegate either concern to an external service instead. Applies only in local mode.",
|
|
1267
|
+
"agentsToggle": "Run container agents on the runner pool",
|
|
1268
|
+
"agentsHint": "Dispatch every container agent (coder, tester, merger, bootstrap, …) to this workspace's self-hosted runner pool instead of host Docker.",
|
|
1269
|
+
"registerPoolPrompt": "{link} first to enable this.",
|
|
1270
|
+
"registerPoolLink": "Register a runner pool",
|
|
1271
|
+
"envToggle": "Provision Tester environments via the provider",
|
|
1272
|
+
"envHint": "Stand the Tester's preview environment up through the environment provider configured below instead of in-container docker-compose. Connect a provider first to enable this.",
|
|
1273
|
+
"updateFailed": "Could not update delegation"
|
|
1274
|
+
},
|
|
1275
|
+
"runnerPoolLocalHint": "Register your pool here, then enable \"Run container agents on the runner pool\" on the {link} screen to route this workspace's agents to it.",
|
|
1276
|
+
"ephemeralEnvironments": "Ephemeral environments",
|
|
1277
|
+
"viewLogs": "View logs",
|
|
1278
|
+
"hideLogs": "Hide logs",
|
|
1279
|
+
"connectedAt": "Connected · {baseUrl}",
|
|
1280
|
+
"missingConfig": "Missing required config: {fields}",
|
|
1281
|
+
"manifestEditorUnavailable": "This provider is configured by authoring a manifest. The in-app manifest editor isn't available yet — register it via the API for now.",
|
|
1282
|
+
"form": {
|
|
1283
|
+
"updateConfiguration": "Update configuration",
|
|
1284
|
+
"connect": "Connect",
|
|
1285
|
+
"reenterSecrets": "Re-enter the secret field to save changes — stored secrets are write-only and aren't shown. | Re-enter the secret fields to save changes — stored secrets are write-only and aren't shown.",
|
|
1286
|
+
"@reenterSecrets": {
|
|
1287
|
+
"description": "Count-based: how many write-only secret fields the user must re-supply before re-saving (count is always >= 1). Provide ALL plural forms your language needs (English has 2; Polish/Ukrainian need 3 - one/few/many - via the custom pluralRules in i18n.config.ts)."
|
|
1288
|
+
},
|
|
1289
|
+
"optionalLabel": "{label} (optional)"
|
|
1290
|
+
},
|
|
1291
|
+
"field": {
|
|
1292
|
+
"defaultsTo": "Defaults to {value}"
|
|
1293
|
+
},
|
|
1294
|
+
"test": {
|
|
1295
|
+
"button": "Test connection",
|
|
1296
|
+
"ok": "Connection OK",
|
|
1297
|
+
"failed": "Connection failed"
|
|
1298
|
+
},
|
|
1299
|
+
"toast": {
|
|
1300
|
+
"saved": "{title} saved",
|
|
1301
|
+
"saveFailed": "Could not save the connection",
|
|
1302
|
+
"removed": "Connection removed",
|
|
1303
|
+
"removeFailed": "Could not remove the connection"
|
|
1304
|
+
}
|
|
1305
|
+
},
|
|
1306
|
+
"serviceFragmentDefaults": {
|
|
1307
|
+
"intro": "Pick the best-practice fragments every new service starts with. Their guidance is folded into the prompt of every code-aware agent (coder, reviewer, architect, fixers) on the service's tasks. You can refine the set per service in its inspector; changing this default does not affect services that already exist.",
|
|
1308
|
+
"defaultFragments": "Default fragments",
|
|
1309
|
+
"addFragment": "Add fragment",
|
|
1310
|
+
"empty": "None — new services start with no service-level fragments.",
|
|
1311
|
+
"saveFailed": "Could not save default fragments",
|
|
1312
|
+
"footer": {
|
|
1313
|
+
"question": "Need to add or edit the fragments themselves (hand-authored, linked docs, repos)?",
|
|
1314
|
+
"manageBoard": "Manage this board's fragment library →",
|
|
1315
|
+
"manageAccount": "Manage account fragments →"
|
|
1316
|
+
}
|
|
1317
|
+
},
|
|
1318
|
+
"issueTracker": {
|
|
1319
|
+
"filing": {
|
|
1320
|
+
"heading": "Where tickets are filed",
|
|
1321
|
+
"description": "The tech-debt recurring pipeline raises an issue before implementation and files it in this tracker. Choose {none} to skip filing.",
|
|
1322
|
+
"none": "None",
|
|
1323
|
+
"githubHint": "GitHub Issues rides your installed GitHub App, which isn't connected yet. Install it under {link} — filing stays off until then.",
|
|
1324
|
+
"githubHintLink": "Integrations → GitHub",
|
|
1325
|
+
"jiraHint": "Jira isn't connected yet. {link} to file and link issues.",
|
|
1326
|
+
"linearHint": "Linear isn't connected yet. {link} to file and link issues.",
|
|
1327
|
+
"connectLink": "Connect it",
|
|
1328
|
+
"jiraProjectKey": "Jira project key",
|
|
1329
|
+
"jiraProjectKeyHelp": "New tickets are filed under this project.",
|
|
1330
|
+
"linearTeamId": "Linear team id",
|
|
1331
|
+
"linearTeamIdHelp": "New issues are created under this team (Linear requires a team to create an issue)."
|
|
1332
|
+
},
|
|
1333
|
+
"vendor": {
|
|
1334
|
+
"github": "GitHub Issues",
|
|
1335
|
+
"jira": "Jira",
|
|
1336
|
+
"linear": "Linear"
|
|
1337
|
+
},
|
|
1338
|
+
"linking": {
|
|
1339
|
+
"heading": "Link issues as context",
|
|
1340
|
+
"description": "When a source is offered you can import its issues and attach them to a task, so agents see the issue description and comments while implementing. This is independent of the filing tracker above.",
|
|
1341
|
+
"github": {
|
|
1342
|
+
"available": "Rides your installed GitHub App — no credentials needed.",
|
|
1343
|
+
"unavailable": "Install the GitHub App (Integrations → GitHub) to offer this source."
|
|
1344
|
+
},
|
|
1345
|
+
"checkSetup": "Check setup",
|
|
1346
|
+
"install": "Install",
|
|
1347
|
+
"connected": "Connected.",
|
|
1348
|
+
"jira": {
|
|
1349
|
+
"connectHint": "Connect with a Jira account and API token."
|
|
1350
|
+
},
|
|
1351
|
+
"linear": {
|
|
1352
|
+
"connectHint": "Connect with a Linear personal API key."
|
|
1353
|
+
},
|
|
1354
|
+
"connect": "Connect"
|
|
1355
|
+
},
|
|
1356
|
+
"writeback": {
|
|
1357
|
+
"heading": "Writeback",
|
|
1358
|
+
"description": "Write back to a task's linked issue(s) as its pull request progresses. Each toggle is the workspace default and can be overridden per task in the inspector. GitHub issues close natively; Jira issues transition to the first status in their {done} category.",
|
|
1359
|
+
"done": "Done",
|
|
1360
|
+
"commentOnOpen": {
|
|
1361
|
+
"label": "Comment when a PR opens",
|
|
1362
|
+
"help": "Post a comment on the linked issue with the new pull request's link."
|
|
1363
|
+
},
|
|
1364
|
+
"resolveOnMerge": {
|
|
1365
|
+
"label": "Close as resolved when a PR merges",
|
|
1366
|
+
"help": "Comment that the PR merged, then close / resolve the linked issue."
|
|
1367
|
+
}
|
|
1368
|
+
},
|
|
1369
|
+
"probeFailure": {
|
|
1370
|
+
"title": "Issue tracking isn't available",
|
|
1371
|
+
"disabled": "The task-source integration is turned off on this deployment (its encryption key is not configured). Set ENCRYPTION_KEY on the backend to enable issue tracking.",
|
|
1372
|
+
"serverError": "The issue-tracker service returned an error (HTTP {status}): {message}. This usually means the backend isn't fully migrated/configured.",
|
|
1373
|
+
"loadFailedStatus": "Couldn't load issue-tracker settings (HTTP {status}): {message}",
|
|
1374
|
+
"loadFailed": "Couldn't load issue-tracker settings: {message}"
|
|
1375
|
+
},
|
|
1376
|
+
"toast": {
|
|
1377
|
+
"saved": "Issue tracker saved",
|
|
1378
|
+
"saveFailed": "Could not save settings",
|
|
1379
|
+
"updateFailed": "Could not update",
|
|
1380
|
+
"checkFailed": "Check failed"
|
|
1381
|
+
}
|
|
1382
|
+
},
|
|
1383
|
+
"userSecrets": {
|
|
1384
|
+
"title": "My GitHub token",
|
|
1385
|
+
"intro": "Store a personal access token used for the runs {you} start — pushes, pull requests, the CI gate and merges are attributed to your GitHub access. Stored {scope}; the token is write-only and never shown again.",
|
|
1386
|
+
"introYou": "you",
|
|
1387
|
+
"introScope": "just for you",
|
|
1388
|
+
"connectedStored": "Connected · token stored",
|
|
1389
|
+
"replaceToken": "Replace token",
|
|
1390
|
+
"addToken": "Add token",
|
|
1391
|
+
"labelField": "Label (optional)",
|
|
1392
|
+
"optionalField": "{label} (optional)",
|
|
1393
|
+
"testConnection": "Test connection",
|
|
1394
|
+
"tokenValid": "Token valid",
|
|
1395
|
+
"tokenRejected": "Token rejected",
|
|
1396
|
+
"secretFallback": "Secret",
|
|
1397
|
+
"toast": {
|
|
1398
|
+
"saved": "{label} saved",
|
|
1399
|
+
"saveFailed": "Could not save secret",
|
|
1400
|
+
"removed": "Secret removed",
|
|
1401
|
+
"removeFailed": "Could not remove secret"
|
|
1402
|
+
}
|
|
1403
|
+
},
|
|
1404
|
+
"mergeThresholds": {
|
|
1405
|
+
"intro": "Named auto-merge policies a task can choose. After CI passes, the {merger} agent scores the PR on complexity, risk and impact (0-100%); the PR auto-merges only when every score is at or below the preset's ceilings, otherwise a review notification is raised. The default preset governs any task that picks none.",
|
|
1406
|
+
"mergerAgent": "merger",
|
|
1407
|
+
"concern": {
|
|
1408
|
+
"none": "None (always stop)",
|
|
1409
|
+
"low": "Low",
|
|
1410
|
+
"medium": "Medium",
|
|
1411
|
+
"high": "High (never stop)"
|
|
1412
|
+
},
|
|
1413
|
+
"presetNamePlaceholder": "Preset name",
|
|
1414
|
+
"default": "Default",
|
|
1415
|
+
"makeDefault": "Make default",
|
|
1416
|
+
"deleteDefaultBlocked": "The default preset cannot be deleted",
|
|
1417
|
+
"deletePreset": "Delete preset",
|
|
1418
|
+
"field": {
|
|
1419
|
+
"maxComplexity": "Max complexity %",
|
|
1420
|
+
"maxRisk": "Max risk %",
|
|
1421
|
+
"maxImpact": "Max impact %",
|
|
1422
|
+
"ciMaxAttempts": "CI-fix attempts",
|
|
1423
|
+
"maxRequirementIterations": "Requirement iterations",
|
|
1424
|
+
"maxRequirementConcernAllowed": "Auto-pass concerns at or below"
|
|
1425
|
+
},
|
|
1426
|
+
"newPreset": "New preset",
|
|
1427
|
+
"create": {
|
|
1428
|
+
"name": "Name",
|
|
1429
|
+
"namePlaceholder": "e.g. Cautious",
|
|
1430
|
+
"complexity": "Cmplx%",
|
|
1431
|
+
"risk": "Risk%",
|
|
1432
|
+
"impact": "Impact%",
|
|
1433
|
+
"ciFix": "CI-fix",
|
|
1434
|
+
"reqIter": "Req iter",
|
|
1435
|
+
"autoPass": "Auto-pass at or below"
|
|
1436
|
+
},
|
|
1437
|
+
"add": "Add",
|
|
1438
|
+
"toast": {
|
|
1439
|
+
"saved": "Preset saved",
|
|
1440
|
+
"saveFailed": "Could not save preset",
|
|
1441
|
+
"created": "Preset created",
|
|
1442
|
+
"createFailed": "Could not create preset",
|
|
1443
|
+
"defaultFailed": "Could not set default",
|
|
1444
|
+
"deleteFailed": "Could not delete preset"
|
|
1445
|
+
}
|
|
1446
|
+
},
|
|
1447
|
+
"observabilityConnection": {
|
|
1448
|
+
"title": "Post-release health",
|
|
1449
|
+
"intro": "After a release ships, the {gate} gate watches the configured observability monitors/SLOs. On a regression it spawns an on-call agent to investigate (a human decides whether to revert). Map which monitors/SLOs a service watches from that service's inspector.",
|
|
1450
|
+
"connection": {
|
|
1451
|
+
"heading": "Connection",
|
|
1452
|
+
"provider": "Provider"
|
|
1453
|
+
},
|
|
1454
|
+
"datadog": {
|
|
1455
|
+
"site": "Datadog site",
|
|
1456
|
+
"apiKey": "API key",
|
|
1457
|
+
"appKey": "Application key"
|
|
1458
|
+
},
|
|
1459
|
+
"saveConnection": "Save connection",
|
|
1460
|
+
"disconnect": "Disconnect",
|
|
1461
|
+
"incident": {
|
|
1462
|
+
"heading": "Incident enrichment",
|
|
1463
|
+
"configured": "Configured",
|
|
1464
|
+
"notSet": "Not set",
|
|
1465
|
+
"description": "Optional. On a regression, the on-call investigation is posted onto an incident these systems ALREADY opened from the same signals (annotate, never re-alert). Secrets are write-only: blank leaves a stored value unchanged.",
|
|
1466
|
+
"pagerDutyToken": "PagerDuty API token",
|
|
1467
|
+
"pagerDutyFromEmail": "PagerDuty From email",
|
|
1468
|
+
"incidentIoKey": "incident.io API key",
|
|
1469
|
+
"clear": "Clear"
|
|
1470
|
+
},
|
|
1471
|
+
"status": {
|
|
1472
|
+
"notConnected": "Not connected",
|
|
1473
|
+
"connected": "Connected",
|
|
1474
|
+
"connectedWithSite": "Connected ({site})"
|
|
1475
|
+
},
|
|
1476
|
+
"toast": {
|
|
1477
|
+
"loadFailed": "Could not load observability settings",
|
|
1478
|
+
"incidentCredsRequired": "Enter PagerDuty or incident.io credentials",
|
|
1479
|
+
"incidentSaved": "Incident enrichment saved",
|
|
1480
|
+
"incidentSaveFailed": "Could not save incident enrichment",
|
|
1481
|
+
"incidentDisconnectFailed": "Could not disconnect incident enrichment",
|
|
1482
|
+
"connected": "Observability connected",
|
|
1483
|
+
"connectFailed": "Could not save the connection",
|
|
1484
|
+
"disconnectFailed": "Could not disconnect"
|
|
1485
|
+
}
|
|
1486
|
+
},
|
|
1487
|
+
"localMode": {
|
|
1488
|
+
"title": "Local mode",
|
|
1489
|
+
"intro": "Tuning for the local container runner, stored on this machine's deployment (it replaced the {poolVars} / {harnessVars} env vars). Saving resizes the warm pool live, no restart needed; in-flight runs keep the container they already hold.",
|
|
1490
|
+
"pool": {
|
|
1491
|
+
"heading": "Warm container pool",
|
|
1492
|
+
"description": "Keep idle harness containers ready and re-lease one (preferring a container that already holds the run's repo) instead of cold-starting per run. Pool size 0 disables it. Requires a Docker-family runtime (Docker/Podman/OrbStack/Colima); ignored on Apple {appleContainer}.",
|
|
1493
|
+
"size": {
|
|
1494
|
+
"label": "Pool size",
|
|
1495
|
+
"help": "Max idle warm containers. 0 = pooling off."
|
|
1496
|
+
},
|
|
1497
|
+
"minWarm": {
|
|
1498
|
+
"label": "Pre-warm at boot",
|
|
1499
|
+
"help": "Containers started when the service boots."
|
|
1500
|
+
},
|
|
1501
|
+
"max": {
|
|
1502
|
+
"label": "Max containers",
|
|
1503
|
+
"help": "Hard cap (leased + idle). Blank = pool size.",
|
|
1504
|
+
"placeholder": "(pool size)"
|
|
1505
|
+
},
|
|
1506
|
+
"idleTimeout": {
|
|
1507
|
+
"label": "Idle timeout (minutes)",
|
|
1508
|
+
"help": "Evict an idle pooled container after."
|
|
1509
|
+
}
|
|
1510
|
+
},
|
|
1511
|
+
"checkout": {
|
|
1512
|
+
"heading": "Checkout reuse",
|
|
1513
|
+
"description": "When a warm container already holds the run's repo, the harness reuses its per-repo checkout (clean sweep + fetch + switch branch) instead of cloning fresh.",
|
|
1514
|
+
"workspaceRoot": {
|
|
1515
|
+
"label": "Workspace root",
|
|
1516
|
+
"help": "Absolute in-container directory the reused checkout lives under."
|
|
1517
|
+
},
|
|
1518
|
+
"cleanKeep": {
|
|
1519
|
+
"label": "Keep on clean (comma-separated)",
|
|
1520
|
+
"help": "Dependency-cache directories the per-run clean sweep preserves."
|
|
1521
|
+
}
|
|
1522
|
+
},
|
|
1523
|
+
"toast": {
|
|
1524
|
+
"saved": "Local settings saved",
|
|
1525
|
+
"saveFailed": "Could not save local settings"
|
|
1526
|
+
}
|
|
1527
|
+
},
|
|
1528
|
+
"openRouterCatalog": {
|
|
1529
|
+
"intro": "Reach {models} through one gateway. Add your OpenRouter key below, then enable the models you want. They appear in the model picker with their context window and price, and meter against your spend budget.",
|
|
1530
|
+
"introModels": "300+ models",
|
|
1531
|
+
"connectHeading": "Connect your OpenRouter key",
|
|
1532
|
+
"step1": "Open {link} and create an API key.",
|
|
1533
|
+
"step1Link": "openrouter.ai → Keys ↗",
|
|
1534
|
+
"step2": "Copy the key (starts with {prefix}) and paste it below.",
|
|
1535
|
+
"scope": "Scope",
|
|
1536
|
+
"scopeWorkspace": "This workspace",
|
|
1537
|
+
"scopeUser": "My keys (only me)",
|
|
1538
|
+
"labelOptional": "Label (optional)",
|
|
1539
|
+
"labelPlaceholder": "e.g. team key",
|
|
1540
|
+
"apiKey": "API key",
|
|
1541
|
+
"connectAndBrowse": "Connect & browse",
|
|
1542
|
+
"keyConnected": "OpenRouter key connected",
|
|
1543
|
+
"manageKeys": "Manage in Vendors & keys",
|
|
1544
|
+
"refresh": "Refresh catalog",
|
|
1545
|
+
"enableRecommended": "Enable recommended",
|
|
1546
|
+
"filterPlaceholder": "Filter by name or slug…",
|
|
1547
|
+
"empty": "No models yet. Hit {action} to load OpenRouter's live list.",
|
|
1548
|
+
"enabledCount": "no models enabled | {count} enabled | {count} enabled",
|
|
1549
|
+
"context": "{value} ctx",
|
|
1550
|
+
"contextThousands": "{value}K ctx",
|
|
1551
|
+
"price": "{input}/{output} per Mtok",
|
|
1552
|
+
"toast": {
|
|
1553
|
+
"connected": "OpenRouter key connected",
|
|
1554
|
+
"connectFailed": "Could not connect key",
|
|
1555
|
+
"rejected": "OpenRouter rejected the key.",
|
|
1556
|
+
"unreachable": "Could not reach OpenRouter",
|
|
1557
|
+
"connectFirst": "Connect an OpenRouter key first.",
|
|
1558
|
+
"saved": "OpenRouter catalog saved",
|
|
1559
|
+
"saveFailed": "Could not save catalog"
|
|
1560
|
+
}
|
|
1561
|
+
},
|
|
1562
|
+
"workspaceSettings": {
|
|
1563
|
+
"title": "Workspace settings",
|
|
1564
|
+
"tabs": {
|
|
1565
|
+
"workspace": "Workspace",
|
|
1566
|
+
"budget": "Budget",
|
|
1567
|
+
"merge": "Merge thresholds",
|
|
1568
|
+
"tracker": "Issue tracker",
|
|
1569
|
+
"fragments": "Service best practices"
|
|
1570
|
+
},
|
|
1571
|
+
"waiting": {
|
|
1572
|
+
"heading": "Waiting for a human",
|
|
1573
|
+
"body": "A run parked on a human decision (a review, an approval, a merge) waits as long as it needs and is never cancelled. After this many minutes its notification turns red and is flagged {overdue} in the inbox.",
|
|
1574
|
+
"overdue": "Overdue",
|
|
1575
|
+
"escalateAfter": "Escalate after (minutes)"
|
|
1576
|
+
},
|
|
1577
|
+
"taskLimit": {
|
|
1578
|
+
"heading": "Running tasks per service",
|
|
1579
|
+
"body": "Cap how many tasks may run at once under one service. Starting a task over the limit is refused with a clear message until a running task finishes.",
|
|
1580
|
+
"mode": "Mode",
|
|
1581
|
+
"maxRunning": "Max running tasks",
|
|
1582
|
+
"maxPerType": "Max {type} tasks",
|
|
1583
|
+
"modes": {
|
|
1584
|
+
"off": "No limit",
|
|
1585
|
+
"shared": "Shared across all types",
|
|
1586
|
+
"per_type": "Per task type"
|
|
1587
|
+
}
|
|
1588
|
+
},
|
|
1589
|
+
"taskTypes": {
|
|
1590
|
+
"feature": "feature",
|
|
1591
|
+
"bug": "bug",
|
|
1592
|
+
"document": "document",
|
|
1593
|
+
"spike": "spike"
|
|
1594
|
+
},
|
|
1595
|
+
"observability": {
|
|
1596
|
+
"heading": "Agent observability",
|
|
1597
|
+
"body": "Store the complete context provided to each agent: the composed prompts, the best-practice fragments folded in, and the full content of the files injected into its container, so it can be inspected later in the observability view. The bodies are kept for the same window as the per-call LLM telemetry. Turn off to stop storing it (existing snapshots are pruned by retention).",
|
|
1598
|
+
"toggle": "Store full agent context"
|
|
1599
|
+
},
|
|
1600
|
+
"retention": {
|
|
1601
|
+
"heading": "Screenshot retention",
|
|
1602
|
+
"body": "How long to keep the UI tester's captured screenshots and the reference design images they're reviewed against (the visual-confirmation gate). A daily cleanup job deletes both the image bytes and their metadata once they age past this window.",
|
|
1603
|
+
"days": "Retention (days)"
|
|
1604
|
+
},
|
|
1605
|
+
"kaizen": {
|
|
1606
|
+
"heading": "Kaizen agent",
|
|
1607
|
+
"body": "After each run completes, the Kaizen agent grades how every agent step went, from smooth and efficient to confused and chaotic, and recommends prompt/model improvements. A prompt + agent + model combination that grades highly with no recommendations five times in a row is marked verified and is no longer graded. Grading runs in the background and is shown inside run details and the Kaizen screen. Set the grader's model in Model Configuration (the \"Kaizen\" agent).",
|
|
1608
|
+
"@body": {
|
|
1609
|
+
"description": "\"Kaizen\" is a product feature name; keep it verbatim in every locale."
|
|
1610
|
+
},
|
|
1611
|
+
"toggle": "Grade agent runs with Kaizen"
|
|
1612
|
+
},
|
|
1613
|
+
"budget": {
|
|
1614
|
+
"heading": "Monthly spend budget",
|
|
1615
|
+
"body": "Token usage is metered per LLM call, priced, and gated by this budget. When reached, runs in this workspace pause and the board shows a warning. Leave blank to inherit the built-in default (about 100 EUR/month).",
|
|
1616
|
+
"monthlyLimit": "Monthly limit",
|
|
1617
|
+
"defaultPlaceholder": "Default",
|
|
1618
|
+
"currency": "Currency (ISO 4217)",
|
|
1619
|
+
"save": "Save budget"
|
|
1620
|
+
},
|
|
1621
|
+
"toast": {
|
|
1622
|
+
"saved": "Settings saved",
|
|
1623
|
+
"saveFailed": "Could not save settings",
|
|
1624
|
+
"budgetSaved": "Budget saved",
|
|
1625
|
+
"budgetSaveFailed": "Could not save budget"
|
|
1626
|
+
}
|
|
1627
|
+
},
|
|
1628
|
+
"localModelEndpoints": {
|
|
1629
|
+
"title": "My local runners",
|
|
1630
|
+
"intro": "Point agents at an LLM running on {ownMachine} (Ollama, LM Studio, llama.cpp, vLLM, or any OpenAI-compatible server). A runner is stored {justForYou} (a runner lives on your box), and the models you enable appear automatically in the model picker. The API key (most runners ignore it) is write-only and never shown again.",
|
|
1631
|
+
"introOwnMachine": "your own machine",
|
|
1632
|
+
"introJustForYou": "just for you",
|
|
1633
|
+
"modelCount": "no models | {count} model | {count} models",
|
|
1634
|
+
"keySet": "key set",
|
|
1635
|
+
"edit": "Edit",
|
|
1636
|
+
"editRunner": "Edit runner",
|
|
1637
|
+
"addRunner": "Add a runner",
|
|
1638
|
+
"runnerType": "Runner type",
|
|
1639
|
+
"labelOptional": "Label (optional)",
|
|
1640
|
+
"labelPlaceholder": "My {name}",
|
|
1641
|
+
"baseUrl": "Base URL",
|
|
1642
|
+
"apiKeyOptional": "API key (optional)",
|
|
1643
|
+
"apiKeyKeepPlaceholder": "leave blank to keep stored key",
|
|
1644
|
+
"apiKeyIgnorePlaceholder": "most runners ignore this",
|
|
1645
|
+
"testConnection": "Test connection",
|
|
1646
|
+
"unreachable": "Could not reach the runner.",
|
|
1647
|
+
"reachable": "Reachable · no models | Reachable · {count} model | Reachable · {count} models",
|
|
1648
|
+
"noModels": "No models reported.",
|
|
1649
|
+
"enableModels": "Enable models",
|
|
1650
|
+
"toast": {
|
|
1651
|
+
"saved": "{name} saved",
|
|
1652
|
+
"saveFailed": "Could not save runner",
|
|
1653
|
+
"removed": "Runner removed",
|
|
1654
|
+
"removeFailed": "Could not remove runner"
|
|
1655
|
+
}
|
|
1656
|
+
}
|
|
1161
1657
|
}
|
|
1162
1658
|
}
|