@cat-factory/app 0.60.3 → 0.62.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.
@@ -62,6 +62,10 @@ const FragmentLibraryPanel = defineAsyncComponent(
62
62
  const PipelineHealthModal = defineAsyncComponent(
63
63
  () => import('~/components/pipeline/PipelineHealthModal.vue'),
64
64
  )
65
+ // Startup advisory for new / outdated built-in merge presets — same once-per-session pattern.
66
+ const MergePresetHealthModal = defineAsyncComponent(
67
+ () => import('~/components/settings/MergePresetHealthModal.vue'),
68
+ )
65
69
  const IntegrationsHub = defineAsyncComponent(
66
70
  () => import('~/components/layout/IntegrationsHub.vue'),
67
71
  )
@@ -150,6 +154,18 @@ watch(
150
154
  },
151
155
  { immediate: true },
152
156
  )
157
+ // Same advisory for built-in merge presets: surface new / outdated ones once per session. Defers
158
+ // to the pipeline advisory when both fire, so at most one modal auto-opens on a given load.
159
+ const { hasIssues: mergePresetIssues } = useMergePresetHealth()
160
+ watch(
161
+ () => [workspace.ready, mergePresetIssues.value, ui.pipelineHealthOpen],
162
+ () => {
163
+ if (workspace.ready && mergePresetIssues.value && !ui.pipelineHealthOpen) {
164
+ ui.maybeOpenMergePresetHealth()
165
+ }
166
+ },
167
+ { immediate: true },
168
+ )
153
169
 
154
170
  // Auto-open the right AI-onboarding dialog once per session: the no-source prompt takes
155
171
  // precedence over the preset-mismatch prompt. Honour the per-session dismissed flags so a
@@ -303,6 +319,7 @@ watch(
303
319
  <SlackPanel v-if="ui.slackOpen" />
304
320
  <FragmentLibraryPanel v-if="ui.fragmentLibraryOpen" />
305
321
  <PipelineHealthModal v-if="ui.pipelineHealthOpen" />
322
+ <MergePresetHealthModal v-if="ui.mergePresetHealthOpen" />
306
323
  <IntegrationsHub v-if="ui.integrationsOpen" />
307
324
  <PersonalSetupModal v-if="ui.personalSetupOpen" />
308
325
  <WorkspaceSettingsPanel v-if="ui.workspaceSettingsOpen" />
@@ -2,6 +2,7 @@ import { defineStore } from 'pinia'
2
2
  import { ref, type Ref } from 'vue'
3
3
  import type {
4
4
  CustomManifestType,
5
+ DetectServiceProvisioningInput,
5
6
  EnvironmentHandlerView,
6
7
  ProvisionType,
7
8
  RegisterEnvironmentHandlerInput,
@@ -94,6 +95,16 @@ export const useInfraConfigStore = defineStore('infraConfig', () => {
94
95
  return saved
95
96
  }
96
97
 
98
+ /**
99
+ * Auto-detect a NON-BINDING recommended provisioning config from a service's repo. The SPA
100
+ * prefills the confirm form from the result; nothing is persisted server-side. Detection is
101
+ * pure repo introspection, so it works regardless of which handlers are registered.
102
+ */
103
+ async function detectProvisioning(input: DetectServiceProvisioningInput) {
104
+ const ws = useWorkspaceStore()
105
+ return api.detectServiceProvisioning(ws.requireId(), input)
106
+ }
107
+
97
108
  async function unregisterHandler(type: ProvisionType, manifestId?: string | null) {
98
109
  const ws = useWorkspaceStore()
99
110
  await api.unregisterEnvironmentHandler(ws.requireId(), type, manifestId ?? undefined)
@@ -161,6 +172,7 @@ export const useInfraConfigStore = defineStore('infraConfig', () => {
161
172
  ensureLoaded,
162
173
  handlerFor,
163
174
  registerHandler,
175
+ detectProvisioning,
164
176
  unregisterHandler,
165
177
  upsertCustomType,
166
178
  removeCustomType,
@@ -13,9 +13,18 @@ export const useMergePresetsStore = defineStore('mergePresets', () => {
13
13
  const api = useApi()
14
14
 
15
15
  const presets = ref<MergeThresholdPreset[]>([])
16
+ /**
17
+ * Current built-in catalog versions (`seedMergePresets()`), keyed by preset id, from the
18
+ * workspace snapshot. The keys ARE the set of built-in ids: a stored preset whose id is a
19
+ * key here is a built-in (and is outdated when its `version` is below the catalog value),
20
+ * and a key with no matching stored preset is a NEW built-in the workspace can add. Drives
21
+ * `useMergePresetHealth`.
22
+ */
23
+ const catalogVersions = ref<Record<string, number>>({})
16
24
 
17
- function hydrate(list: MergeThresholdPreset[]) {
25
+ function hydrate(list: MergeThresholdPreset[], versions?: Record<string, number>) {
18
26
  presets.value = [...list].sort((a, b) => a.createdAt - b.createdAt)
27
+ if (versions) catalogVersions.value = versions
19
28
  }
20
29
 
21
30
  /** The workspace default (fallback for a task that picks none). */
@@ -50,5 +59,27 @@ export const useMergePresetsStore = defineStore('mergePresets', () => {
50
59
  await ws.refresh()
51
60
  }
52
61
 
53
- return { presets, defaultPreset, resolve, hydrate, create, update, remove }
62
+ /**
63
+ * Reseed a built-in preset from the backend's current catalog: adopt an updated definition,
64
+ * repair a drifted one, or materialise a NEW built-in that appeared after the workspace was
65
+ * created. The `presetId` is the catalog id (e.g. `mp_balanced`). Refreshes the snapshot.
66
+ */
67
+ async function reseed(presetId: string) {
68
+ const ws = useWorkspaceStore()
69
+ const updated = await api.reseedMergePreset(ws.requireId(), presetId)
70
+ await ws.refresh()
71
+ return updated
72
+ }
73
+
74
+ return {
75
+ presets,
76
+ catalogVersions,
77
+ defaultPreset,
78
+ resolve,
79
+ hydrate,
80
+ create,
81
+ update,
82
+ remove,
83
+ reseed,
84
+ }
54
85
  })
package/app/stores/ui.ts CHANGED
@@ -24,6 +24,11 @@ export const useUiStore = defineStore('ui', () => {
24
24
  // session so it does not re-pop on every snapshot re-hydration.
25
25
  const pipelineHealthOpen = ref(false)
26
26
  const pipelineHealthSeen = ref(false)
27
+ // Merge-preset health startup advisory: lists built-ins with a newer catalog version (reseed)
28
+ // and new built-in presets the workspace can add. `mergePresetHealthSeen` gates auto-open to
29
+ // once per session so it does not re-pop on every snapshot re-hydration (mirrors pipelines).
30
+ const mergePresetHealthOpen = ref(false)
31
+ const mergePresetHealthSeen = ref(false)
27
32
  const decisionContext = ref<{ instanceId: string; decisionId: string } | null>(null)
28
33
 
29
34
  // Document-source integration modals, keyed by source. `documentImport` and
@@ -250,6 +255,22 @@ export const useUiStore = defineStore('ui', () => {
250
255
  pipelineHealthOpen.value = false
251
256
  }
252
257
 
258
+ /** Auto-open the merge-preset health advisory once per session (no-op after it's been shown). */
259
+ function maybeOpenMergePresetHealth() {
260
+ if (mergePresetHealthSeen.value) return
261
+ mergePresetHealthSeen.value = true
262
+ mergePresetHealthOpen.value = true
263
+ }
264
+
265
+ function openMergePresetHealth() {
266
+ mergePresetHealthSeen.value = true
267
+ mergePresetHealthOpen.value = true
268
+ }
269
+
270
+ function closeMergePresetHealth() {
271
+ mergePresetHealthOpen.value = false
272
+ }
273
+
253
274
  function openDecision(instanceId: string, decisionId: string) {
254
275
  decisionContext.value = { instanceId, decisionId }
255
276
  }
@@ -658,6 +679,8 @@ export const useUiStore = defineStore('ui', () => {
658
679
  builderOpen,
659
680
  pipelineHealthOpen,
660
681
  pipelineHealthSeen,
682
+ mergePresetHealthOpen,
683
+ mergePresetHealthSeen,
661
684
  decisionContext,
662
685
  documentConnect,
663
686
  documentImport,
@@ -715,6 +738,9 @@ export const useUiStore = defineStore('ui', () => {
715
738
  maybeOpenPipelineHealth,
716
739
  openPipelineHealth,
717
740
  closePipelineHealth,
741
+ maybeOpenMergePresetHealth,
742
+ openMergePresetHealth,
743
+ closeMergePresetHealth,
718
744
  openDecision,
719
745
  closeDecision,
720
746
  openApprovalDetail,
@@ -88,7 +88,10 @@ export const useWorkspaceStore = defineStore(
88
88
  useAgentRunsStore().hydrate(snapshot.bootstrapJobs ?? [])
89
89
  useAgentRunsStore().hydrateEnvConfigRepair(snapshot.envConfigRepairJobs ?? [])
90
90
  useNotificationsStore().hydrate(snapshot.notifications ?? [])
91
- useMergePresetsStore().hydrate(snapshot.mergePresets ?? [])
91
+ useMergePresetsStore().hydrate(
92
+ snapshot.mergePresets ?? [],
93
+ snapshot.mergePresetCatalogVersions,
94
+ )
92
95
  useWorkspaceSettingsStore().hydrate(snapshot.settings)
93
96
  useAgentConfigStore().hydrate(snapshot.agentConfigCatalog ?? [])
94
97
  useModelPresetsStore().hydrate(snapshot.modelPresets ?? [])
@@ -7,6 +7,8 @@ import type { MergeThresholdPreset } from '~/types/merge'
7
7
  * rendered as whole percents.
8
8
  */
9
9
  export function mergePresetThresholds(p: MergeThresholdPreset): string {
10
+ // Auto-merge disabled: the thresholds don't apply, every PR goes to human review.
11
+ if (!p.autoMergeEnabled) return `manual review only · ${p.ciMaxAttempts} CI fixes`
10
12
  const pct = (n: number) => `${Math.round(n * 100)}%`
11
13
  return `cx ≤${pct(p.maxComplexity)} · risk ≤${pct(p.maxRisk)} · impact ≤${pct(
12
14
  p.maxImpact,
@@ -474,7 +474,20 @@
474
474
  "customManifestIdPlaceholder": "Pick a manifest type",
475
475
  "customNoTypes": "No custom manifest types are defined yet. Add one in the Infrastructure window.",
476
476
  "customManifestIdHint": "The custom type this service produces, matched to a remote-custom handler the workspace configures.",
477
- "customManifestPath": "Manifest path (optional)"
477
+ "customManifestPath": "Manifest path (optional)",
478
+ "detect": {
479
+ "title": "Auto-detect",
480
+ "button": "Detect from repo",
481
+ "hint": "Inspect the repository and suggest a provisioning config. You confirm and edit everything below; nothing is saved automatically.",
482
+ "error": "Could not read the repository to detect provisioning.",
483
+ "none": "No Kubernetes manifests or Compose file were detected.",
484
+ "applied": "Suggested a {type} config. Review and adjust the fields below.",
485
+ "overlayTitle": "Ephemeral overlay",
486
+ "urlSource": "Suggested environment URL source: {source}. The workspace handler owns this; set it there.",
487
+ "namespace": "Manifests pin namespace \"{namespace}\"; recommend honoring it on the workspace handler.",
488
+ "confidenceHigh": "Detected",
489
+ "confidenceLow": "Suggestion"
490
+ }
478
491
  },
479
492
  "agentConfig": {
480
493
  "title": "Agent configuration",
@@ -1630,8 +1643,11 @@
1630
1643
  "maxImpact": "Max impact %",
1631
1644
  "ciMaxAttempts": "CI-fix attempts",
1632
1645
  "maxRequirementIterations": "Requirement iterations",
1633
- "maxRequirementConcernAllowed": "Auto-pass concerns at or below"
1646
+ "maxRequirementConcernAllowed": "Auto-pass concerns at or below",
1647
+ "autoMerge": "Auto-merge"
1634
1648
  },
1649
+ "autoMergeOnHint": "Merge automatically when within thresholds.",
1650
+ "autoMergeOffHint": "Always route the PR to a human review.",
1635
1651
  "newPreset": "New preset",
1636
1652
  "create": {
1637
1653
  "name": "Name",
@@ -2516,6 +2532,25 @@
2516
2532
  }
2517
2533
  }
2518
2534
  },
2535
+ "mergePreset": {
2536
+ "health": {
2537
+ "title": "Merge preset updates",
2538
+ "allValid": "All built-in merge presets are up to date.",
2539
+ "newHeading": "New presets available",
2540
+ "newDescription": "New built-in merge presets have shipped. Add them to this board's library.",
2541
+ "add": "Add",
2542
+ "updatesHeading": "Updates available",
2543
+ "updatesDescription": "A newer version of these built-in merge presets has shipped. Reseed to adopt it (the default and ordering are kept).",
2544
+ "versionAvailable": "Version {from} → {to} available.",
2545
+ "reseed": "Reseed",
2546
+ "reseedAll": "Update all ({count})",
2547
+ "dismiss": "Dismiss",
2548
+ "done": "Done",
2549
+ "toast": {
2550
+ "reseedFailed": "Could not reseed merge preset"
2551
+ }
2552
+ }
2553
+ },
2519
2554
  "palette": {
2520
2555
  "hint": "Click an agent to append it to the pipeline.",
2521
2556
  "customAgents": "Custom agents"
@@ -437,7 +437,20 @@
437
437
  "customManifestIdPlaceholder": "Elige un tipo de manifiesto",
438
438
  "customNoTypes": "Aún no hay tipos de manifiesto personalizados. Añade uno en la ventana de Infraestructura.",
439
439
  "customManifestIdHint": "El tipo personalizado que produce este servicio, emparejado con un gestor remote-custom que configura el espacio de trabajo.",
440
- "customManifestPath": "Ruta del manifiesto (opcional)"
440
+ "customManifestPath": "Ruta del manifiesto (opcional)",
441
+ "detect": {
442
+ "title": "Detección automática",
443
+ "button": "Detectar desde el repo",
444
+ "hint": "Inspecciona el repositorio y sugiere una configuración de aprovisionamiento. Confirmas y editas todo lo de abajo; nada se guarda automáticamente.",
445
+ "error": "No se pudo leer el repositorio para detectar el aprovisionamiento.",
446
+ "none": "No se detectaron manifiestos de Kubernetes ni archivo Compose.",
447
+ "applied": "Se sugirió una configuración {type}. Revisa y ajusta los campos de abajo.",
448
+ "overlayTitle": "Overlay efímero",
449
+ "urlSource": "Fuente de URL del entorno sugerida: {source}. El gestor del espacio de trabajo la controla; configúrala allí.",
450
+ "namespace": "Los manifiestos fijan el espacio de nombres \"{namespace}\"; se recomienda respetarlo en el gestor del espacio de trabajo.",
451
+ "confidenceHigh": "Detectado",
452
+ "confidenceLow": "Sugerencia"
453
+ }
441
454
  },
442
455
  "agentConfig": {
443
456
  "title": "Configuración del agente",
@@ -1486,7 +1499,8 @@
1486
1499
  "maxImpact": "Impacto máx. %",
1487
1500
  "ciMaxAttempts": "Intentos de corrección de CI",
1488
1501
  "maxRequirementIterations": "Iteraciones de requisitos",
1489
- "maxRequirementConcernAllowed": "Aprobación automática de inquietudes hasta"
1502
+ "maxRequirementConcernAllowed": "Aprobación automática de inquietudes hasta",
1503
+ "autoMerge": "Fusión automática"
1490
1504
  },
1491
1505
  "newPreset": "Nuevo ajuste",
1492
1506
  "create": {
@@ -1507,7 +1521,9 @@
1507
1521
  "createFailed": "No se pudo crear el ajuste",
1508
1522
  "defaultFailed": "No se pudo establecer el predeterminado",
1509
1523
  "deleteFailed": "No se pudo eliminar el ajuste"
1510
- }
1524
+ },
1525
+ "autoMergeOnHint": "Fusionar automáticamente cuando esté dentro de los umbrales.",
1526
+ "autoMergeOffHint": "Enviar siempre el PR a revisión humana."
1511
1527
  },
1512
1528
  "observabilityConnection": {
1513
1529
  "title": "Salud posterior al lanzamiento",
@@ -3485,5 +3501,24 @@
3485
3501
  "saveArchFailed": "No se pudo guardar la arquitectura de referencia",
3486
3502
  "deleteFailed": "No se pudo eliminar"
3487
3503
  }
3504
+ },
3505
+ "mergePreset": {
3506
+ "health": {
3507
+ "title": "Actualizaciones de presets de fusión",
3508
+ "allValid": "Todos los presets de fusión integrados están actualizados.",
3509
+ "newHeading": "Nuevos presets disponibles",
3510
+ "newDescription": "Hay nuevos presets de fusión integrados. Añádelos a la biblioteca de este tablero.",
3511
+ "add": "Añadir",
3512
+ "updatesHeading": "Actualizaciones disponibles",
3513
+ "updatesDescription": "Hay una versión más reciente de estos presets de fusión integrados. Regenera para adoptarla (se conservan el predeterminado y el orden).",
3514
+ "versionAvailable": "Versión {from} → {to} disponible.",
3515
+ "reseed": "Regenerar",
3516
+ "reseedAll": "Actualizar todos ({count})",
3517
+ "dismiss": "Descartar",
3518
+ "done": "Hecho",
3519
+ "toast": {
3520
+ "reseedFailed": "No se pudo regenerar el preset de fusión"
3521
+ }
3522
+ }
3488
3523
  }
3489
3524
  }
@@ -437,7 +437,20 @@
437
437
  "customManifestIdPlaceholder": "Choisir un type de manifeste",
438
438
  "customNoTypes": "Aucun type de manifeste personnalisé n'est encore défini. Ajoutez-en un dans la fenêtre Infrastructure.",
439
439
  "customManifestIdHint": "Le type personnalisé que ce service produit, associé à un gestionnaire remote-custom configuré par l'espace de travail.",
440
- "customManifestPath": "Chemin du manifeste (facultatif)"
440
+ "customManifestPath": "Chemin du manifeste (facultatif)",
441
+ "detect": {
442
+ "title": "Détection automatique",
443
+ "button": "Détecter depuis le dépôt",
444
+ "hint": "Inspecte le dépôt et propose une configuration de provisionnement. Vous confirmez et modifiez tout ci-dessous ; rien n'est enregistré automatiquement.",
445
+ "error": "Impossible de lire le dépôt pour détecter le provisionnement.",
446
+ "none": "Aucun manifeste Kubernetes ni fichier Compose détecté.",
447
+ "applied": "Configuration {type} suggérée. Vérifiez et ajustez les champs ci-dessous.",
448
+ "overlayTitle": "Overlay éphémère",
449
+ "urlSource": "Source d'URL d'environnement suggérée : {source}. Le gestionnaire de l'espace de travail la contrôle ; définissez-la là.",
450
+ "namespace": "Les manifestes fixent l'espace de noms « {namespace} » ; il est recommandé de le respecter sur le gestionnaire de l'espace de travail.",
451
+ "confidenceHigh": "Détecté",
452
+ "confidenceLow": "Suggestion"
453
+ }
441
454
  },
442
455
  "agentConfig": {
443
456
  "title": "Configuration de l'agent",
@@ -1486,7 +1499,8 @@
1486
1499
  "maxImpact": "Impact max %",
1487
1500
  "ciMaxAttempts": "Tentatives de correction CI",
1488
1501
  "maxRequirementIterations": "Itérations d'exigences",
1489
- "maxRequirementConcernAllowed": "Validation auto. des préoccupations jusqu'à"
1502
+ "maxRequirementConcernAllowed": "Validation auto. des préoccupations jusqu'à",
1503
+ "autoMerge": "Fusion automatique"
1490
1504
  },
1491
1505
  "newPreset": "Nouveau préréglage",
1492
1506
  "create": {
@@ -1507,7 +1521,9 @@
1507
1521
  "createFailed": "Impossible de créer le préréglage",
1508
1522
  "defaultFailed": "Impossible de définir par défaut",
1509
1523
  "deleteFailed": "Impossible de supprimer le préréglage"
1510
- }
1524
+ },
1525
+ "autoMergeOnHint": "Fusionner automatiquement si dans les seuils.",
1526
+ "autoMergeOffHint": "Toujours envoyer la PR en revue humaine."
1511
1527
  },
1512
1528
  "observabilityConnection": {
1513
1529
  "title": "Santé post-publication",
@@ -3485,5 +3501,24 @@
3485
3501
  "saveArchFailed": "Impossible d'enregistrer l'architecture de référence",
3486
3502
  "deleteFailed": "Impossible de supprimer"
3487
3503
  }
3504
+ },
3505
+ "mergePreset": {
3506
+ "health": {
3507
+ "title": "Mises à jour des presets de fusion",
3508
+ "allValid": "Tous les presets de fusion intégrés sont à jour.",
3509
+ "newHeading": "Nouveaux presets disponibles",
3510
+ "newDescription": "De nouveaux presets de fusion intégrés sont arrivés. Ajoutez-les à la bibliothèque de ce tableau.",
3511
+ "add": "Ajouter",
3512
+ "updatesHeading": "Mises à jour disponibles",
3513
+ "updatesDescription": "Une version plus récente de ces presets de fusion intégrés est arrivée. Régénérez pour l'adopter (le preset par défaut et l'ordre sont conservés).",
3514
+ "versionAvailable": "Version {from} → {to} disponible.",
3515
+ "reseed": "Régénérer",
3516
+ "reseedAll": "Tout mettre à jour ({count})",
3517
+ "dismiss": "Ignorer",
3518
+ "done": "Terminé",
3519
+ "toast": {
3520
+ "reseedFailed": "Impossible de régénérer le preset de fusion"
3521
+ }
3522
+ }
3488
3523
  }
3489
3524
  }
@@ -437,7 +437,20 @@
437
437
  "customManifestIdPlaceholder": "בחר סוג מניפסט",
438
438
  "customNoTypes": "עדיין לא הוגדרו סוגי מניפסט מותאמים. הוסף אחד בחלון התשתית.",
439
439
  "customManifestIdHint": "הסוג המותאם שהשירות הזה מייצר, המותאם למטפל remote-custom שהמרחב מגדיר.",
440
- "customManifestPath": "נתיב המניפסט (אופציונלי)"
440
+ "customManifestPath": "נתיב המניפסט (אופציונלי)",
441
+ "detect": {
442
+ "title": "זיהוי אוטומטי",
443
+ "button": "זהה מהמאגר",
444
+ "hint": "בדיקת המאגר והצעת תצורת הקצאה. אתה מאשר ועורך הכול למטה; שום דבר לא נשמר אוטומטית.",
445
+ "error": "לא ניתן לקרוא את המאגר כדי לזהות את ההקצאה.",
446
+ "none": "לא זוהו מניפסטים של Kubernetes או קובץ Compose.",
447
+ "applied": "הוצעה תצורת {type}. בדוק והתאם את השדות למטה.",
448
+ "overlayTitle": "שכבת סביבה זמנית",
449
+ "urlSource": "מקור כתובת הסביבה המוצע: {source}. המטפל של המרחב שולט בכך; הגדר זאת שם.",
450
+ "namespace": "המניפסטים מקבעים את מרחב השמות \"{namespace}\"; מומלץ לכבד אותו במטפל של המרחב.",
451
+ "confidenceHigh": "זוהה",
452
+ "confidenceLow": "הצעה"
453
+ }
441
454
  },
442
455
  "agentConfig": {
443
456
  "title": "תצורת סוכן",
@@ -1585,7 +1598,8 @@
1585
1598
  "maxImpact": "השפעה מרבית %",
1586
1599
  "ciMaxAttempts": "ניסיונות תיקון CI",
1587
1600
  "maxRequirementIterations": "איטרציות דרישות",
1588
- "maxRequirementConcernAllowed": "מעבר אוטומטי בחששות ברף או מתחתיו"
1601
+ "maxRequirementConcernAllowed": "מעבר אוטומטי בחששות ברף או מתחתיו",
1602
+ "autoMerge": "מיזוג אוטומטי"
1589
1603
  },
1590
1604
  "newPreset": "תצורה חדשה",
1591
1605
  "create": {
@@ -1606,7 +1620,9 @@
1606
1620
  "createFailed": "לא ניתן היה ליצור תצורה",
1607
1621
  "defaultFailed": "לא ניתן היה להגדיר ברירת מחדל",
1608
1622
  "deleteFailed": "לא ניתן היה למחוק את התצורה"
1609
- }
1623
+ },
1624
+ "autoMergeOnHint": "מזג אוטומטית כשבתוך הספים.",
1625
+ "autoMergeOffHint": "נתב תמיד את ה-PR לבדיקה אנושית."
1610
1626
  },
1611
1627
  "observabilityConnection": {
1612
1628
  "title": "בריאות שלאחר שחרור",
@@ -3496,5 +3512,24 @@
3496
3512
  "saveArchFailed": "לא ניתן היה לשמור ארכיטקטורת ייחוס",
3497
3513
  "deleteFailed": "לא ניתן היה למחוק"
3498
3514
  }
3515
+ },
3516
+ "mergePreset": {
3517
+ "health": {
3518
+ "title": "עדכוני קביעות מיזוג",
3519
+ "allValid": "כל קביעות המיזוג המובנות מעודכנות.",
3520
+ "newHeading": "קביעות חדשות זמינות",
3521
+ "newDescription": "הגיעו קביעות מיזוג מובנות חדשות. הוסף אותן לספריית הלוח הזה.",
3522
+ "add": "הוסף",
3523
+ "updatesHeading": "עדכונים זמינים",
3524
+ "updatesDescription": "גרסה חדשה יותר של קביעות המיזוג המובנות האלה הגיעה. זרע מחדש כדי לאמץ אותה (ברירת המחדל והסדר נשמרים).",
3525
+ "versionAvailable": "גרסה {from} → {to} זמינה.",
3526
+ "reseed": "זרע מחדש",
3527
+ "reseedAll": "עדכן הכל ({count})",
3528
+ "dismiss": "התעלם",
3529
+ "done": "בוצע",
3530
+ "toast": {
3531
+ "reseedFailed": "לא ניתן לזרוע מחדש את קביעת המיזוג"
3532
+ }
3533
+ }
3499
3534
  }
3500
3535
  }
@@ -437,7 +437,20 @@
437
437
  "customManifestIdPlaceholder": "マニフェストタイプを選択",
438
438
  "customNoTypes": "カスタムマニフェストタイプはまだ定義されていません。インフラウィンドウで追加してください。",
439
439
  "customManifestIdHint": "このサービスが生成するカスタムタイプ。ワークスペースが構成する remote-custom ハンドラーと照合されます。",
440
- "customManifestPath": "マニフェストのパス(任意)"
440
+ "customManifestPath": "マニフェストのパス(任意)",
441
+ "detect": {
442
+ "title": "自動検出",
443
+ "button": "リポジトリから検出",
444
+ "hint": "リポジトリを調べてプロビジョニング設定を提案します。以下の内容はすべて確認・編集でき、自動保存はされません。",
445
+ "error": "リポジトリを読み取ってプロビジョニングを検出できませんでした。",
446
+ "none": "Kubernetes マニフェストや Compose ファイルは検出されませんでした。",
447
+ "applied": "{type} の設定を提案しました。以下のフィールドを確認して調整してください。",
448
+ "overlayTitle": "一時環境のオーバーレイ",
449
+ "urlSource": "推奨される環境 URL ソース: {source}。これはワークスペースのハンドラーが管理します。そちらで設定してください。",
450
+ "namespace": "マニフェストは名前空間「{namespace}」を固定しています。ワークスペースのハンドラーでそれを尊重することを推奨します。",
451
+ "confidenceHigh": "検出",
452
+ "confidenceLow": "提案"
453
+ }
441
454
  },
442
455
  "agentConfig": {
443
456
  "title": "エージェント設定",
@@ -1587,7 +1600,8 @@
1587
1600
  "maxImpact": "最大影響度 %",
1588
1601
  "ciMaxAttempts": "CI 修正の試行回数",
1589
1602
  "maxRequirementIterations": "要件のイテレーション回数",
1590
- "maxRequirementConcernAllowed": "この水準以下の懸念を自動承認"
1603
+ "maxRequirementConcernAllowed": "この水準以下の懸念を自動承認",
1604
+ "autoMerge": "自動マージ"
1591
1605
  },
1592
1606
  "newPreset": "新しいプリセット",
1593
1607
  "create": {
@@ -1608,7 +1622,9 @@
1608
1622
  "createFailed": "プリセットを作成できませんでした",
1609
1623
  "defaultFailed": "デフォルトを設定できませんでした",
1610
1624
  "deleteFailed": "プリセットを削除できませんでした"
1611
- }
1625
+ },
1626
+ "autoMergeOnHint": "しきい値内なら自動的にマージします。",
1627
+ "autoMergeOffHint": "常にPRを人間のレビューに回します。"
1612
1628
  },
1613
1629
  "observabilityConnection": {
1614
1630
  "title": "リリース後のヘルス",
@@ -3498,5 +3514,24 @@
3498
3514
  "saveArchFailed": "リファレンスアーキテクチャを保存できませんでした",
3499
3515
  "deleteFailed": "削除できませんでした"
3500
3516
  }
3517
+ },
3518
+ "mergePreset": {
3519
+ "health": {
3520
+ "title": "マージプリセットの更新",
3521
+ "allValid": "組み込みのマージプリセットはすべて最新です。",
3522
+ "newHeading": "新しいプリセットがあります",
3523
+ "newDescription": "新しい組み込みマージプリセットが追加されました。このボードのライブラリに追加してください。",
3524
+ "add": "追加",
3525
+ "updatesHeading": "更新あり",
3526
+ "updatesDescription": "これらの組み込みマージプリセットの新しいバージョンがあります。再シードして取り込みます(既定と並び順は保持されます)。",
3527
+ "versionAvailable": "バージョン {from} → {to} が利用可能です。",
3528
+ "reseed": "再シード",
3529
+ "reseedAll": "すべて更新 ({count})",
3530
+ "dismiss": "閉じる",
3531
+ "done": "完了",
3532
+ "toast": {
3533
+ "reseedFailed": "マージプリセットを再シードできませんでした"
3534
+ }
3535
+ }
3501
3536
  }
3502
3537
  }
@@ -437,7 +437,20 @@
437
437
  "customManifestIdPlaceholder": "Wybierz typ manifestu",
438
438
  "customNoTypes": "Nie zdefiniowano jeszcze niestandardowych typów manifestów. Dodaj jeden w oknie Infrastruktura.",
439
439
  "customManifestIdHint": "Niestandardowy typ, który tworzy ta usługa, dopasowany do handlera remote-custom skonfigurowanego przez przestrzeń roboczą.",
440
- "customManifestPath": "Ścieżka manifestu (opcjonalnie)"
440
+ "customManifestPath": "Ścieżka manifestu (opcjonalnie)",
441
+ "detect": {
442
+ "title": "Autowykrywanie",
443
+ "button": "Wykryj z repozytorium",
444
+ "hint": "Sprawdza repozytorium i proponuje konfigurację provisioningu. Potwierdzasz i edytujesz wszystko poniżej; nic nie jest zapisywane automatycznie.",
445
+ "error": "Nie udało się odczytać repozytorium, aby wykryć provisioning.",
446
+ "none": "Nie wykryto manifestów Kubernetes ani pliku Compose.",
447
+ "applied": "Zaproponowano konfigurację {type}. Przejrzyj i dostosuj pola poniżej.",
448
+ "overlayTitle": "Tymczasowy overlay",
449
+ "urlSource": "Sugerowane źródło adresu URL środowiska: {source}. Zarządza tym handler przestrzeni roboczej; ustaw to tam.",
450
+ "namespace": "Manifesty ustalają przestrzeń nazw \"{namespace}\"; zaleca się jej przestrzeganie w handlerze przestrzeni roboczej.",
451
+ "confidenceHigh": "Wykryto",
452
+ "confidenceLow": "Sugestia"
453
+ }
441
454
  },
442
455
  "agentConfig": {
443
456
  "title": "Konfiguracja agenta",
@@ -1486,7 +1499,8 @@
1486
1499
  "maxImpact": "Maks. wpływ %",
1487
1500
  "ciMaxAttempts": "Próby naprawy CI",
1488
1501
  "maxRequirementIterations": "Iteracje wymagań",
1489
- "maxRequirementConcernAllowed": "Automatyczne zaliczenie zastrzeżeń do"
1502
+ "maxRequirementConcernAllowed": "Automatyczne zaliczenie zastrzeżeń do",
1503
+ "autoMerge": "Auto-scalanie"
1490
1504
  },
1491
1505
  "newPreset": "Nowe ustawienie",
1492
1506
  "create": {
@@ -1507,7 +1521,9 @@
1507
1521
  "createFailed": "Nie można utworzyć ustawienia",
1508
1522
  "defaultFailed": "Nie można ustawić jako domyślne",
1509
1523
  "deleteFailed": "Nie można usunąć ustawienia"
1510
- }
1524
+ },
1525
+ "autoMergeOnHint": "Scalaj automatycznie, gdy mieści się w progach.",
1526
+ "autoMergeOffHint": "Zawsze kieruj PR do recenzji człowieka."
1511
1527
  },
1512
1528
  "observabilityConnection": {
1513
1529
  "title": "Kondycja po wydaniu",
@@ -3485,5 +3501,24 @@
3485
3501
  "saveArchFailed": "Nie udało się zapisać architektury referencyjnej",
3486
3502
  "deleteFailed": "Nie udało się usunąć"
3487
3503
  }
3504
+ },
3505
+ "mergePreset": {
3506
+ "health": {
3507
+ "title": "Aktualizacje presetów scalania",
3508
+ "allValid": "Wszystkie wbudowane presety scalania są aktualne.",
3509
+ "newHeading": "Dostępne nowe presety",
3510
+ "newDescription": "Pojawiły się nowe wbudowane presety scalania. Dodaj je do biblioteki tej tablicy.",
3511
+ "add": "Dodaj",
3512
+ "updatesHeading": "Dostępne aktualizacje",
3513
+ "updatesDescription": "Dostępna jest nowsza wersja tych wbudowanych presetów scalania. Zregeneruj, aby ją przyjąć (domyślny i kolejność są zachowane).",
3514
+ "versionAvailable": "Dostępna wersja {from} → {to}.",
3515
+ "reseed": "Zregeneruj",
3516
+ "reseedAll": "Zaktualizuj wszystkie ({count})",
3517
+ "dismiss": "Odrzuć",
3518
+ "done": "Gotowe",
3519
+ "toast": {
3520
+ "reseedFailed": "Nie udało się zregenerować presetu scalania"
3521
+ }
3522
+ }
3488
3523
  }
3489
3524
  }