@cat-factory/app 0.176.0 → 0.178.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/README.md +28 -1
- package/app/components/environments/steps/EnvPickStep.vue +3 -0
- package/app/components/layout/IntegrationBackTitle.vue +11 -8
- package/app/components/layout/IntegrationsHub.vue +21 -55
- package/app/components/layout/ModelProvidersHub.vue +250 -0
- package/app/components/panels/inspector/ServiceValidationConfig.vue +99 -1
- package/app/components/settings/ComposeEnvironmentSetupSection.vue +102 -0
- package/app/components/settings/InfrastructureWindow.vue +11 -1
- package/app/composables/api/validationChecks.ts +8 -0
- package/app/composables/useIntegrationBack.ts +5 -2
- package/app/composables/useNavContributions.ts +1 -1
- package/app/modular/nav-contributions.spec.ts +11 -3
- package/app/modular/nav-contributions.ts +35 -16
- package/app/pages/index.vue +4 -0
- package/app/stores/ui/modals.ts +32 -6
- package/app/stores/validationChecks.ts +17 -2
- package/app/types/validationChecks.ts +3 -0
- package/app/utils/validationDetection.spec.ts +51 -0
- package/app/utils/validationDetection.ts +67 -0
- package/i18n/locales/de.json +103 -24
- package/i18n/locales/en.json +103 -24
- package/i18n/locales/es.json +103 -24
- package/i18n/locales/fr.json +103 -24
- package/i18n/locales/he.json +103 -24
- package/i18n/locales/it.json +103 -24
- package/i18n/locales/ja.json +103 -24
- package/i18n/locales/pl.json +103 -24
- package/i18n/locales/tr.json +103 -24
- package/i18n/locales/uk.json +103 -24
- package/package.json +2 -2
package/i18n/locales/fr.json
CHANGED
|
@@ -111,6 +111,8 @@
|
|
|
111
111
|
"repositories": "Dépôts",
|
|
112
112
|
"addFromRepo": "Ajouter depuis un dépôt existant",
|
|
113
113
|
"bootstrapRepo": "Initialiser un dépôt",
|
|
114
|
+
"models": "Modèles",
|
|
115
|
+
"modelProviders": "Fournisseurs de modèles",
|
|
114
116
|
"integrations": "Intégrations",
|
|
115
117
|
"sandbox": "Bac à sable",
|
|
116
118
|
"kaizen": "Kaizen",
|
|
@@ -122,8 +124,7 @@
|
|
|
122
124
|
"accountSettings": "Paramètres du compte",
|
|
123
125
|
"operatorDashboard": "Observabilité de la plateforme",
|
|
124
126
|
"reports": "Rapports",
|
|
125
|
-
"infrastructure": "Infrastructure"
|
|
126
|
-
"environmentSetup": "Configuration d'environnement"
|
|
127
|
+
"infrastructure": "Infrastructure"
|
|
127
128
|
},
|
|
128
129
|
"board": {
|
|
129
130
|
"toast": {
|
|
@@ -1103,7 +1104,34 @@
|
|
|
1103
1104
|
"save": "Enregistrer les vérifications",
|
|
1104
1105
|
"savedToast": "Vérifications enregistrées",
|
|
1105
1106
|
"saveFailed": "Impossible d'enregistrer les vérifications",
|
|
1106
|
-
"clearFailed": "Impossible de vider les vérifications"
|
|
1107
|
+
"clearFailed": "Impossible de vider les vérifications",
|
|
1108
|
+
"detect": {
|
|
1109
|
+
"action": "Détecter",
|
|
1110
|
+
"hint": "Proposer des vérifications à partir du dépôt de ce service",
|
|
1111
|
+
"added": "{count} vérification ajoutée | {count} vérifications ajoutées",
|
|
1112
|
+
"found": "Reconnu : {ecosystems}.",
|
|
1113
|
+
"capped": "Certaines suggestions ont été écartées : un service accepte au plus {max} vérifications.",
|
|
1114
|
+
"nothingNew": "Rien à ajouter",
|
|
1115
|
+
"alreadyPresent": "Toutes les commandes détectées figurent déjà dans la liste.",
|
|
1116
|
+
"unrecognised": "Aucun écosystème connu n'a été reconnu à la racine du dépôt. Ajoutez les commandes à la main.",
|
|
1117
|
+
"repo_unavailable": "Aucun dépôt n'est lié à ce service, il n'y a donc rien à inspecter.",
|
|
1118
|
+
"failed": "Le dépôt n'a pas pu être lu"
|
|
1119
|
+
},
|
|
1120
|
+
"ecosystem": {
|
|
1121
|
+
"node": "Node.js",
|
|
1122
|
+
"python": "Python",
|
|
1123
|
+
"go": "Go",
|
|
1124
|
+
"rust": "Rust",
|
|
1125
|
+
"maven": "Maven",
|
|
1126
|
+
"gradle": "Gradle",
|
|
1127
|
+
"dotnet": ".NET",
|
|
1128
|
+
"ruby": "Ruby",
|
|
1129
|
+
"php": "PHP",
|
|
1130
|
+
"elixir": "Elixir",
|
|
1131
|
+
"make": "Make",
|
|
1132
|
+
"just": "just",
|
|
1133
|
+
"task": "Task"
|
|
1134
|
+
}
|
|
1107
1135
|
}
|
|
1108
1136
|
},
|
|
1109
1137
|
"panels": {
|
|
@@ -1934,7 +1962,8 @@
|
|
|
1934
1962
|
},
|
|
1935
1963
|
"integrationBack": {
|
|
1936
1964
|
"backToMySetup": "Retour à Ma configuration",
|
|
1937
|
-
"backToIntegrations": "Retour aux Intégrations"
|
|
1965
|
+
"backToIntegrations": "Retour aux Intégrations",
|
|
1966
|
+
"backToModelProviders": "Retour aux Fournisseurs de modèles"
|
|
1938
1967
|
},
|
|
1939
1968
|
"commandBar": {
|
|
1940
1969
|
"searchPlaceholder": "Rechercher ou exécuter une commande…",
|
|
@@ -1995,23 +2024,21 @@
|
|
|
1995
2024
|
},
|
|
1996
2025
|
"integrationsHub": {
|
|
1997
2026
|
"title": "Intégrations",
|
|
1998
|
-
"intro": "Connectez et gérez les systèmes externes que cet espace de travail peut relier.",
|
|
2027
|
+
"intro": "Connectez et gérez les systèmes externes optionnels que cet espace de travail peut relier. Les modèles qui font tourner vos agents se trouvent dans Fournisseurs de modèles.",
|
|
1999
2028
|
"searchPlaceholder": "Rechercher des intégrations…",
|
|
2000
2029
|
"noMatches": "Aucune intégration ne correspond à \"{query}\".",
|
|
2001
2030
|
"getStarted": {
|
|
2002
2031
|
"title": "Pour commencer",
|
|
2003
|
-
"body": "Connectez une source de code
|
|
2032
|
+
"body": "Connectez une source de code pour que vos pipelines aient de quoi travailler."
|
|
2004
2033
|
},
|
|
2005
2034
|
"status": {
|
|
2006
2035
|
"connected": "Connecté",
|
|
2007
|
-
"keyConnected": "Clé connectée",
|
|
2008
2036
|
"notConnected": "Non connecté",
|
|
2009
2037
|
"needsAttention": "Nécessite une intervention",
|
|
2010
2038
|
"disabled": "Désactivé",
|
|
2011
2039
|
"recommended": "Recommandé"
|
|
2012
2040
|
},
|
|
2013
2041
|
"groups": {
|
|
2014
|
-
"models": "Modèles et fournisseurs",
|
|
2015
2042
|
"sourceControl": "Gestion de code source",
|
|
2016
2043
|
"communication": "Communication",
|
|
2017
2044
|
"documents": "Documents",
|
|
@@ -2021,16 +2048,6 @@
|
|
|
2021
2048
|
"personal": "Personnel (vous uniquement)"
|
|
2022
2049
|
},
|
|
2023
2050
|
"items": {
|
|
2024
|
-
"openrouter": {
|
|
2025
|
-
"description": "Une seule passerelle vers plus de 300 modèles. Ajoutez votre clé et activez des modèles au même endroit."
|
|
2026
|
-
},
|
|
2027
|
-
"vendors": {
|
|
2028
|
-
"label": "Fournisseurs et clés",
|
|
2029
|
-
"description": "Abonnements LLM de l'espace de travail et clés API des fournisseurs."
|
|
2030
|
-
},
|
|
2031
|
-
"personalSubs": {
|
|
2032
|
-
"label": "Abonnements personnels (Claude, ChatGPT/Codex, GLM)"
|
|
2033
|
-
},
|
|
2034
2051
|
"github": {
|
|
2035
2052
|
"description": "Connectez la GitHub App de l'espace de travail, parcourez dépôts, PR et tickets."
|
|
2036
2053
|
},
|
|
@@ -2070,10 +2087,6 @@
|
|
|
2070
2087
|
"label": "Mon jeton GitHub",
|
|
2071
2088
|
"description": "Un jeton d'accès personnel utilisé pour les exécutions que vous lancez (pushes, PR, CI, fusion)."
|
|
2072
2089
|
},
|
|
2073
|
-
"localRunners": {
|
|
2074
|
-
"label": "Mes exécuteurs locaux",
|
|
2075
|
-
"description": "Vos exécuteurs de modèles sur votre propre machine (Ollama, LM Studio, vLLM…)."
|
|
2076
|
-
},
|
|
2077
2090
|
"documentTemplates": {
|
|
2078
2091
|
"label": "Modèles et exemples"
|
|
2079
2092
|
},
|
|
@@ -2083,6 +2096,45 @@
|
|
|
2083
2096
|
}
|
|
2084
2097
|
}
|
|
2085
2098
|
},
|
|
2099
|
+
"modelProvidersHub": {
|
|
2100
|
+
"title": "Fournisseurs de modèles",
|
|
2101
|
+
"intro": "Les moteurs qui font tourner vos agents. Au moins un fournisseur doit être connecté avant qu'une étape de pipeline puisse s'exécuter.",
|
|
2102
|
+
"searchPlaceholder": "Rechercher un fournisseur…",
|
|
2103
|
+
"noMatches": "Aucun fournisseur ne correspond à \"{query}\".",
|
|
2104
|
+
"getStarted": {
|
|
2105
|
+
"title": "Aucun fournisseur connecté pour l'instant",
|
|
2106
|
+
"body": "Les étapes d'agent ne peuvent pas s'exécuter tant qu'aucun modèle n'est accessible. Une clé OpenRouter est le moyen le plus rapide d'ouvrir un large catalogue, mais des clés de fournisseur, un abonnement personnel ou votre propre exécuteur local conviennent tout autant."
|
|
2107
|
+
},
|
|
2108
|
+
"status": {
|
|
2109
|
+
"connected": "Connecté",
|
|
2110
|
+
"keyConnected": "Clé connectée",
|
|
2111
|
+
"notConnected": "Non connecté",
|
|
2112
|
+
"recommended": "Recommandé",
|
|
2113
|
+
"connectedCount": "aucun connecté | {count} connecté | {count} connectés"
|
|
2114
|
+
},
|
|
2115
|
+
"groups": {
|
|
2116
|
+
"workspace": "Fournisseurs de l'espace de travail",
|
|
2117
|
+
"personal": "Personnel (vous uniquement)",
|
|
2118
|
+
"personalNote": "Ils appartiennent à votre compte et non à l'espace de travail, et ne servent qu'aux exécutions que vous lancez. Ils figurent aussi dans Ma configuration."
|
|
2119
|
+
},
|
|
2120
|
+
"items": {
|
|
2121
|
+
"openrouter": {
|
|
2122
|
+
"description": "Une seule passerelle vers plus de 300 modèles. Ajoutez votre clé et activez des modèles au même endroit."
|
|
2123
|
+
},
|
|
2124
|
+
"vendors": {
|
|
2125
|
+
"label": "Fournisseurs et clés",
|
|
2126
|
+
"description": "Abonnements LLM de l'espace de travail et clés API des fournisseurs."
|
|
2127
|
+
},
|
|
2128
|
+
"personalSubs": {
|
|
2129
|
+
"label": "Mes abonnements",
|
|
2130
|
+
"description": "Plans à usage individuel que vous déverrouillez avec un mot de passe personnel (Claude, GLM, Codex)."
|
|
2131
|
+
},
|
|
2132
|
+
"localRunners": {
|
|
2133
|
+
"label": "Mes exécuteurs locaux",
|
|
2134
|
+
"description": "Vos exécuteurs de modèles sur votre propre machine (Ollama, LM Studio, vLLM)."
|
|
2135
|
+
}
|
|
2136
|
+
}
|
|
2137
|
+
},
|
|
2086
2138
|
"shortcuts": {
|
|
2087
2139
|
"title": "Raccourcis clavier",
|
|
2088
2140
|
"commandBar": "Ouvrir la barre de commandes",
|
|
@@ -2651,6 +2703,32 @@
|
|
|
2651
2703
|
"removeFailed": "Impossible de supprimer le stack partagé"
|
|
2652
2704
|
}
|
|
2653
2705
|
},
|
|
2706
|
+
"composeEnvSetup": {
|
|
2707
|
+
"title": "Configuration guidée Docker Compose pour un service",
|
|
2708
|
+
"lead": "Accompagne un service dans la création de la recette Docker Compose à partir de laquelle ses environnements de test sont montés, au lieu d'écrire à la main le chemin du compose et les étapes de préparation.",
|
|
2709
|
+
"how": {
|
|
2710
|
+
"title": "Comment ça marche",
|
|
2711
|
+
"scan": "Analyse le dépôt lié au service à la recherche de fichiers compose, de profils, de fichiers d'environnement et de jeux de données initiales.",
|
|
2712
|
+
"analyse": "Exécute éventuellement l'agent analyste d'environnement pour rédiger des étapes de préparation et un contrôle de santé à partir des scripts du dépôt.",
|
|
2713
|
+
"preflight": "Exécute les vérifications préalables de la recette sur la machine qui la provisionnera.",
|
|
2714
|
+
"save": "Enregistre la recette sur le service et déclare le gestionnaire Docker Compose de l'espace de travail.",
|
|
2715
|
+
"outcome": "Ensuite, le Deployer monte exactement cette pile dès qu'un pipeline a besoin d'un environnement réel, et le Tester s'exécute dessus. Rien n'est appliqué tant que vous n'avez pas enregistré."
|
|
2716
|
+
},
|
|
2717
|
+
"needed": {
|
|
2718
|
+
"title": "Vous en avez besoin quand",
|
|
2719
|
+
"running": "Les tests du service exigent que l'application tourne vraiment : tests d'API ou d'interface, migrations, données initiales.",
|
|
2720
|
+
"compose": "Le service est provisionné via Docker Compose et n'a pas encore de recette enregistrée.",
|
|
2721
|
+
"setup": "Monter la pile demande plus d'une commande : profils, fichiers d'environnement, données initiales ou contrôle de disponibilité."
|
|
2722
|
+
},
|
|
2723
|
+
"notNeeded": {
|
|
2724
|
+
"title": "Vous pouvez l'ignorer quand",
|
|
2725
|
+
"inContainer": "Le pipeline se contente de linter, compiler ou lancer des tests unitaires. Cela se fait dans le conteneur de l'agent comme vérifications avant PR, sans provisionner d'environnement.",
|
|
2726
|
+
"otherBackend": "Le service est provisionné autrement (Kubernetes, un aperçu cloud, ou aucune infrastructure). Configurez cela plus haut.",
|
|
2727
|
+
"noRepo": "Le service n'a pas de dépôt lié, il n'y a donc rien à analyser."
|
|
2728
|
+
},
|
|
2729
|
+
"start": "Lancer la configuration guidée",
|
|
2730
|
+
"rerunHint": "Relancez-la à tout moment pour modifier une recette enregistrée."
|
|
2731
|
+
},
|
|
2654
2732
|
"localMode": {
|
|
2655
2733
|
"title": "Mode local",
|
|
2656
2734
|
"intro": "Réglage de l'exécuteur de conteneurs local, stocké sur le déploiement de cette machine (il a remplacé les variables d'environnement {poolVars} / {harnessVars}). L'enregistrement redimensionne le pool à chaud en direct, sans redémarrage nécessaire; les exécutions en cours conservent le conteneur qu'elles détiennent déjà.",
|
|
@@ -5255,8 +5333,8 @@
|
|
|
5255
5333
|
},
|
|
5256
5334
|
"environmentWizard": {
|
|
5257
5335
|
"progress": "Étape {index} sur {total}",
|
|
5258
|
-
"title": "
|
|
5259
|
-
"subtitle": "
|
|
5336
|
+
"title": "Configuration d'environnement Docker Compose",
|
|
5337
|
+
"subtitle": "Créez la recette Docker Compose à partir de laquelle les environnements de test d'un service sont montés : analyse du dépôt, revue, vérifications préalables, enregistrement.",
|
|
5260
5338
|
"recommended": "recommandé",
|
|
5261
5339
|
"steps": {
|
|
5262
5340
|
"pick": "Choisir le service",
|
|
@@ -5266,6 +5344,7 @@
|
|
|
5266
5344
|
},
|
|
5267
5345
|
"pick": {
|
|
5268
5346
|
"intro": "Choisissez le service pour lequel configurer un environnement Docker Compose.",
|
|
5347
|
+
"scope": "Seul le service choisi est modifié. Relancez ceci plus tard pour modifier sa recette.",
|
|
5269
5348
|
"empty": "Aucun service pour l'instant. Ajoutez-en un d'abord."
|
|
5270
5349
|
},
|
|
5271
5350
|
"review": {
|
package/i18n/locales/he.json
CHANGED
|
@@ -111,6 +111,8 @@
|
|
|
111
111
|
"repositories": "מאגרים",
|
|
112
112
|
"addFromRepo": "הוסף ממאגר קיים",
|
|
113
113
|
"bootstrapRepo": "אתחל מאגר",
|
|
114
|
+
"models": "מודלים",
|
|
115
|
+
"modelProviders": "ספקי מודלים",
|
|
114
116
|
"integrations": "אינטגרציות",
|
|
115
117
|
"infrastructure": "תשתית",
|
|
116
118
|
"sandbox": "ארגז חול",
|
|
@@ -122,8 +124,7 @@
|
|
|
122
124
|
"modelConfiguration": "תצורת מודל",
|
|
123
125
|
"accountSettings": "הגדרות חשבון",
|
|
124
126
|
"operatorDashboard": "תצפית על הפלטפורמה",
|
|
125
|
-
"reports": "דוחות"
|
|
126
|
-
"environmentSetup": "הגדרת סביבה"
|
|
127
|
+
"reports": "דוחות"
|
|
127
128
|
},
|
|
128
129
|
"board": {
|
|
129
130
|
"toast": {
|
|
@@ -1103,7 +1104,34 @@
|
|
|
1103
1104
|
"save": "שמירת בדיקות",
|
|
1104
1105
|
"savedToast": "הבדיקות נשמרו",
|
|
1105
1106
|
"saveFailed": "לא ניתן היה לשמור את הבדיקות",
|
|
1106
|
-
"clearFailed": "לא ניתן היה לנקות את הבדיקות"
|
|
1107
|
+
"clearFailed": "לא ניתן היה לנקות את הבדיקות",
|
|
1108
|
+
"detect": {
|
|
1109
|
+
"action": "זהה",
|
|
1110
|
+
"hint": "הצע בדיקות מתוך המאגר של שירות זה",
|
|
1111
|
+
"added": "נוספה בדיקה {count} | נוספו {count} בדיקות",
|
|
1112
|
+
"found": "זוהה: {ecosystems}.",
|
|
1113
|
+
"capped": "חלק מההצעות הושמטו — שירות מקבל לכל היותר {max} בדיקות.",
|
|
1114
|
+
"nothingNew": "אין מה להוסיף",
|
|
1115
|
+
"alreadyPresent": "כל הפקודות שזוהו כבר מופיעות ברשימה.",
|
|
1116
|
+
"unrecognised": "לא זוהתה מערכת אקולוגית מוכרת בשורש המאגר. הוסף את הפקודות ידנית.",
|
|
1117
|
+
"repo_unavailable": "לשירות זה לא משויך מאגר, ולכן אין מה לבדוק.",
|
|
1118
|
+
"failed": "לא ניתן היה לקרוא את המאגר"
|
|
1119
|
+
},
|
|
1120
|
+
"ecosystem": {
|
|
1121
|
+
"node": "Node.js",
|
|
1122
|
+
"python": "Python",
|
|
1123
|
+
"go": "Go",
|
|
1124
|
+
"rust": "Rust",
|
|
1125
|
+
"maven": "Maven",
|
|
1126
|
+
"gradle": "Gradle",
|
|
1127
|
+
"dotnet": ".NET",
|
|
1128
|
+
"ruby": "Ruby",
|
|
1129
|
+
"php": "PHP",
|
|
1130
|
+
"elixir": "Elixir",
|
|
1131
|
+
"make": "Make",
|
|
1132
|
+
"just": "just",
|
|
1133
|
+
"task": "Task"
|
|
1134
|
+
}
|
|
1107
1135
|
}
|
|
1108
1136
|
},
|
|
1109
1137
|
"panels": {
|
|
@@ -1934,7 +1962,8 @@
|
|
|
1934
1962
|
},
|
|
1935
1963
|
"integrationBack": {
|
|
1936
1964
|
"backToMySetup": "חזרה להגדרות שלי",
|
|
1937
|
-
"backToIntegrations": "חזרה לאינטגרציות"
|
|
1965
|
+
"backToIntegrations": "חזרה לאינטגרציות",
|
|
1966
|
+
"backToModelProviders": "חזרה לספקי מודלים"
|
|
1938
1967
|
},
|
|
1939
1968
|
"commandBar": {
|
|
1940
1969
|
"searchPlaceholder": "חפש או הרץ פקודה…",
|
|
@@ -1995,23 +2024,21 @@
|
|
|
1995
2024
|
},
|
|
1996
2025
|
"integrationsHub": {
|
|
1997
2026
|
"title": "אינטגרציות",
|
|
1998
|
-
"intro": "חבר ונהל את המערכות החיצוניות שסביבת עבודה זו יכולה לקשר.",
|
|
2027
|
+
"intro": "חבר ונהל את המערכות החיצוניות האופציונליות שסביבת עבודה זו יכולה לקשר. המודלים שהסוכנים שלך רצים עליהם נמצאים תחת ספקי מודלים.",
|
|
1999
2028
|
"searchPlaceholder": "חפש אינטגרציות…",
|
|
2000
2029
|
"noMatches": "אין אינטגרציות התואמות ל-\"{query}\".",
|
|
2001
2030
|
"getStarted": {
|
|
2002
2031
|
"title": "צא לדרך",
|
|
2003
|
-
"body": "חבר מקור קוד
|
|
2032
|
+
"body": "חבר מקור קוד כדי שלצינורות שלך יהיה על מה לעבוד."
|
|
2004
2033
|
},
|
|
2005
2034
|
"status": {
|
|
2006
2035
|
"connected": "מחובר",
|
|
2007
|
-
"keyConnected": "מפתח מחובר",
|
|
2008
2036
|
"notConnected": "לא מחובר",
|
|
2009
2037
|
"needsAttention": "דורש תשומת לב",
|
|
2010
2038
|
"disabled": "מושבת",
|
|
2011
2039
|
"recommended": "מומלץ"
|
|
2012
2040
|
},
|
|
2013
2041
|
"groups": {
|
|
2014
|
-
"models": "מודלים וספקים",
|
|
2015
2042
|
"sourceControl": "בקרת מקור",
|
|
2016
2043
|
"communication": "תקשורת",
|
|
2017
2044
|
"documents": "מסמכים",
|
|
@@ -2021,16 +2048,6 @@
|
|
|
2021
2048
|
"personal": "אישי (רק אתה)"
|
|
2022
2049
|
},
|
|
2023
2050
|
"items": {
|
|
2024
|
-
"openrouter": {
|
|
2025
|
-
"description": "שער אחד ל-300+ מודלים. הוסף את המפתח שלך והפעל מודלים במקום אחד."
|
|
2026
|
-
},
|
|
2027
|
-
"vendors": {
|
|
2028
|
-
"label": "ספקים ומפתחות",
|
|
2029
|
-
"description": "מנויי LLM של סביבת העבודה ומפתחות API של ספקים."
|
|
2030
|
-
},
|
|
2031
|
-
"personalSubs": {
|
|
2032
|
-
"label": "מנויים אישיים (Claude, ChatGPT/Codex, GLM)"
|
|
2033
|
-
},
|
|
2034
2051
|
"github": {
|
|
2035
2052
|
"description": "חבר את אפליקציית ה-GitHub של סביבת העבודה, עיין במאגרים, ב-PR ובבעיות."
|
|
2036
2053
|
},
|
|
@@ -2070,10 +2087,6 @@
|
|
|
2070
2087
|
"label": "אסימון ה-GitHub שלי",
|
|
2071
2088
|
"description": "אסימון גישה אישי המשמש להרצות שאתה מתחיל (דחיפות, PR, CI, מיזוג)."
|
|
2072
2089
|
},
|
|
2073
|
-
"localRunners": {
|
|
2074
|
-
"label": "המריצים המקומיים שלי",
|
|
2075
|
-
"description": "מריצי מודלים על המכונה שלך (Ollama, LM Studio, vLLM…)."
|
|
2076
|
-
},
|
|
2077
2090
|
"documentTemplates": {
|
|
2078
2091
|
"label": "תבניות ודוגמאות"
|
|
2079
2092
|
},
|
|
@@ -2083,6 +2096,45 @@
|
|
|
2083
2096
|
}
|
|
2084
2097
|
}
|
|
2085
2098
|
},
|
|
2099
|
+
"modelProvidersHub": {
|
|
2100
|
+
"title": "ספקי מודלים",
|
|
2101
|
+
"intro": "המנועים שהסוכנים שלך רצים עליהם. לפחות ספק אחד חייב להיות מחובר לפני שאפשר להריץ שלב כלשהו בצינור.",
|
|
2102
|
+
"searchPlaceholder": "חיפוש ספקים…",
|
|
2103
|
+
"noMatches": "אין ספקים התואמים ל-\"{query}\".",
|
|
2104
|
+
"getStarted": {
|
|
2105
|
+
"title": "עדיין לא מחובר אף ספק",
|
|
2106
|
+
"body": "שלבי סוכן לא יכולים לרוץ עד שיהיה מודל זמין. מפתח OpenRouter הוא הדרך המהירה ביותר לפתוח קטלוג רחב, אבל גם מפתחות ספקים, תוכנית אישית או מריץ מקומי משלך עובדים באותה מידה."
|
|
2107
|
+
},
|
|
2108
|
+
"status": {
|
|
2109
|
+
"connected": "מחובר",
|
|
2110
|
+
"keyConnected": "מפתח מחובר",
|
|
2111
|
+
"notConnected": "לא מחובר",
|
|
2112
|
+
"recommended": "מומלץ",
|
|
2113
|
+
"connectedCount": "לא מחוברים | {count} מחוברים | {count} מחוברים"
|
|
2114
|
+
},
|
|
2115
|
+
"groups": {
|
|
2116
|
+
"workspace": "ספקים של סביבת העבודה",
|
|
2117
|
+
"personal": "אישי (רק אתה)",
|
|
2118
|
+
"personalNote": "אלה שייכים לחשבון שלך ולא לסביבת העבודה, ומשמשים רק להרצות שאתה מתחיל. הם מופיעים גם תחת ההגדרות שלי."
|
|
2119
|
+
},
|
|
2120
|
+
"items": {
|
|
2121
|
+
"openrouter": {
|
|
2122
|
+
"description": "שער אחד ל-300+ מודלים. הוסף את המפתח שלך והפעל מודלים במקום אחד."
|
|
2123
|
+
},
|
|
2124
|
+
"vendors": {
|
|
2125
|
+
"label": "ספקים ומפתחות",
|
|
2126
|
+
"description": "מנויי LLM של סביבת העבודה ומפתחות API של ספקים."
|
|
2127
|
+
},
|
|
2128
|
+
"personalSubs": {
|
|
2129
|
+
"label": "המנויים שלי",
|
|
2130
|
+
"description": "תוכניות לשימוש אישי שאתה פותח באמצעות סיסמה אישית (Claude, GLM, Codex)."
|
|
2131
|
+
},
|
|
2132
|
+
"localRunners": {
|
|
2133
|
+
"label": "המריצים המקומיים שלי",
|
|
2134
|
+
"description": "מריצי מודלים על המכונה שלך (Ollama, LM Studio, vLLM)."
|
|
2135
|
+
}
|
|
2136
|
+
}
|
|
2137
|
+
},
|
|
2086
2138
|
"shortcuts": {
|
|
2087
2139
|
"title": "קיצורי מקלדת",
|
|
2088
2140
|
"commandBar": "פתח את שורת הפקודות",
|
|
@@ -2791,6 +2843,32 @@
|
|
|
2791
2843
|
"removeFailed": "לא ניתן למחוק את המקבץ המשותף"
|
|
2792
2844
|
}
|
|
2793
2845
|
},
|
|
2846
|
+
"composeEnvSetup": {
|
|
2847
|
+
"title": "הגדרה מונחית של Docker Compose לשירות",
|
|
2848
|
+
"lead": "מלווה שירות אחד ביצירת מתכון ה-Docker Compose שממנו מוקמות סביבות הבדיקה שלו, במקום לכתוב ביד את נתיב ה-compose ואת שלבי ההתקנה.",
|
|
2849
|
+
"how": {
|
|
2850
|
+
"title": "איך זה עובד",
|
|
2851
|
+
"scan": "סורק את המאגר המקושר של השירות אחר קובצי compose, פרופילים, קובצי env ומאגרי נתוני זריעה.",
|
|
2852
|
+
"analyse": "מריץ באופן אופציונלי את סוכן ניתוח הסביבה כדי לנסח שלבי התקנה ובדיקת בריאות מתוך הסקריפטים של המאגר עצמו.",
|
|
2853
|
+
"preflight": "מריץ את בדיקות המוכנות של המתכון על המכונה שתקים אותו.",
|
|
2854
|
+
"save": "שומר את המתכון על השירות ורושם את מטפל ה-Docker Compose של סביבת העבודה.",
|
|
2855
|
+
"outcome": "מכאן ואילך ה-Deployer מקים בדיוק את הערימה הזו בכל פעם שצינור זקוק לסביבה חיה, וה-Tester רץ מולה. שום דבר לא מוחל עד שתשמור."
|
|
2856
|
+
},
|
|
2857
|
+
"needed": {
|
|
2858
|
+
"title": "אתה זקוק לזה כאשר",
|
|
2859
|
+
"running": "הבדיקות של השירות דורשות שהאפליקציה תרוץ באמת: בדיקות API או ממשק, מיגרציות, נתוני זריעה.",
|
|
2860
|
+
"compose": "השירות מוקם באמצעות Docker Compose ועדיין אין לו מתכון שמור.",
|
|
2861
|
+
"setup": "הקמת הערימה דורשת יותר מפקודה אחת: פרופילים, קובצי env, נתוני זריעה או בדיקת מוכנות."
|
|
2862
|
+
},
|
|
2863
|
+
"notNeeded": {
|
|
2864
|
+
"title": "אפשר לדלג על זה כאשר",
|
|
2865
|
+
"inContainer": "הצינור רק מריץ lint, בונה או מריץ בדיקות יחידה. אלה רצות בתוך מכולת הסוכן כבדיקות אימות לפני PR, בלי להקים סביבה.",
|
|
2866
|
+
"otherBackend": "השירות מוקם בדרך אחרת (Kubernetes, תצוגה מקדימה בענן, או בלי תשתית בכלל). הגדר זאת למעלה במקום.",
|
|
2867
|
+
"noRepo": "לשירות אין מאגר מקושר, ולכן אין מה לסרוק."
|
|
2868
|
+
},
|
|
2869
|
+
"start": "התחל הגדרה מונחית",
|
|
2870
|
+
"rerunHint": "אפשר להריץ שוב בכל עת כדי לשנות מתכון שמור."
|
|
2871
|
+
},
|
|
2794
2872
|
"localMode": {
|
|
2795
2873
|
"title": "מצב מקומי",
|
|
2796
2874
|
"intro": "כוונון עבור מריץ הקונטיינרים המקומי, נשמר בפריסה של מכונה זו (הוא החליף את משתני הסביבה {poolVars} / {harnessVars}). שמירה משנה את גודל המאגר החם בזמן אמת, ללא צורך באתחול מחדש; הרצות פעילות שומרות את הקונטיינר שהן כבר מחזיקות.",
|
|
@@ -5266,8 +5344,8 @@
|
|
|
5266
5344
|
},
|
|
5267
5345
|
"environmentWizard": {
|
|
5268
5346
|
"progress": "שלב {index} מתוך {total}",
|
|
5269
|
-
"title": "הגדרת סביבת
|
|
5270
|
-
"subtitle": "
|
|
5347
|
+
"title": "הגדרת סביבת Docker Compose",
|
|
5348
|
+
"subtitle": "בנה את מתכון ה-Docker Compose שממנו מוקמות סביבות הבדיקה של שירות: סריקת המאגר, סקירה, בדיקות מוכנות, שמירה.",
|
|
5271
5349
|
"recommended": "מומלץ",
|
|
5272
5350
|
"steps": {
|
|
5273
5351
|
"pick": "בחירת שירות",
|
|
@@ -5277,6 +5355,7 @@
|
|
|
5277
5355
|
},
|
|
5278
5356
|
"pick": {
|
|
5279
5357
|
"intro": "בחרו את השירות שעבורו להגדיר סביבת Docker Compose.",
|
|
5358
|
+
"scope": "רק השירות שתבחר משתנה. הרץ זאת שוב מאוחר יותר כדי לערוך את המתכון שלו.",
|
|
5280
5359
|
"empty": "אין שירותים עדיין. הוסיפו שירות תחילה."
|
|
5281
5360
|
},
|
|
5282
5361
|
"review": {
|
package/i18n/locales/it.json
CHANGED
|
@@ -658,6 +658,32 @@
|
|
|
658
658
|
"removeFailed": "Impossibile eliminare lo stack condiviso"
|
|
659
659
|
}
|
|
660
660
|
},
|
|
661
|
+
"composeEnvSetup": {
|
|
662
|
+
"title": "Configurazione guidata Docker Compose per un servizio",
|
|
663
|
+
"lead": "Accompagna un servizio nella creazione della ricetta Docker Compose da cui vengono avviati i suoi ambienti di test, invece di scrivere a mano il percorso del compose e i passi di preparazione.",
|
|
664
|
+
"how": {
|
|
665
|
+
"title": "Come funziona",
|
|
666
|
+
"scan": "Analizza il repository collegato al servizio in cerca di file compose, profili, file di ambiente e dump di dati iniziali.",
|
|
667
|
+
"analyse": "Esegue facoltativamente l'agente analista degli ambienti per abbozzare i passi di preparazione e un controllo di salute dagli script del repository.",
|
|
668
|
+
"preflight": "Esegue i controlli preliminari della ricetta sulla macchina che la provisionerà.",
|
|
669
|
+
"save": "Salva la ricetta sul servizio e registra l'handler Docker Compose del workspace.",
|
|
670
|
+
"outcome": "Da quel momento il Deployer avvia esattamente quello stack ogni volta che una pipeline ha bisogno di un ambiente reale, e il Tester ci gira contro. Nulla viene applicato finché non salvi."
|
|
671
|
+
},
|
|
672
|
+
"needed": {
|
|
673
|
+
"title": "Ti serve quando",
|
|
674
|
+
"running": "I test del servizio richiedono l'applicazione realmente in esecuzione: test di API o interfaccia, migrazioni, dati iniziali.",
|
|
675
|
+
"compose": "Il servizio viene provisionato con Docker Compose e non ha ancora una ricetta salvata.",
|
|
676
|
+
"setup": "Avviare lo stack richiede più di un comando: profili, file di ambiente, dati iniziali o un controllo di prontezza."
|
|
677
|
+
},
|
|
678
|
+
"notNeeded": {
|
|
679
|
+
"title": "Puoi saltarlo quando",
|
|
680
|
+
"inContainer": "La pipeline si limita a lint, build o test unitari. Girano dentro il container dell'agente come controlli di validazione pre-PR, senza provisionare alcun ambiente.",
|
|
681
|
+
"otherBackend": "Il servizio viene provisionato in altro modo (Kubernetes, un'anteprima cloud, o nessuna infrastruttura). Configuralo sopra.",
|
|
682
|
+
"noRepo": "Il servizio non ha un repository collegato, quindi non c'è nulla da analizzare."
|
|
683
|
+
},
|
|
684
|
+
"start": "Avvia la configurazione guidata",
|
|
685
|
+
"rerunHint": "Rieseguila quando vuoi per cambiare una ricetta salvata."
|
|
686
|
+
},
|
|
661
687
|
"localMode": {
|
|
662
688
|
"title": "Modalita locale",
|
|
663
689
|
"intro": "Ottimizzazione per il runner di container locale, memorizzata sul deployment di questa macchina (ha sostituito le variabili d'ambiente {poolVars} / {harnessVars}). Il salvataggio ridimensiona il pool caldo in tempo reale, senza necessita di riavvio; i run in corso mantengono il container che gia detengono.",
|
|
@@ -1419,7 +1445,34 @@
|
|
|
1419
1445
|
"save": "Salva controlli",
|
|
1420
1446
|
"savedToast": "Controlli salvati",
|
|
1421
1447
|
"saveFailed": "Impossibile salvare i controlli",
|
|
1422
|
-
"clearFailed": "Impossibile svuotare i controlli"
|
|
1448
|
+
"clearFailed": "Impossibile svuotare i controlli",
|
|
1449
|
+
"detect": {
|
|
1450
|
+
"action": "Rileva",
|
|
1451
|
+
"hint": "Suggerisci controlli a partire dal repository di questo servizio",
|
|
1452
|
+
"added": "Aggiunto {count} controllo | Aggiunti {count} controlli",
|
|
1453
|
+
"found": "Riconosciuto: {ecosystems}.",
|
|
1454
|
+
"capped": "Alcuni suggerimenti sono stati esclusi: un servizio accetta al massimo {max} controlli.",
|
|
1455
|
+
"nothingNew": "Niente da aggiungere",
|
|
1456
|
+
"alreadyPresent": "Tutti i comandi rilevati sono già presenti nell'elenco.",
|
|
1457
|
+
"unrecognised": "Nessun ecosistema noto riconosciuto nella radice del repository. Aggiungi i comandi a mano.",
|
|
1458
|
+
"repo_unavailable": "Questo servizio non ha un repository collegato, quindi non c'è nulla da esaminare.",
|
|
1459
|
+
"failed": "Non è stato possibile leggere il repository"
|
|
1460
|
+
},
|
|
1461
|
+
"ecosystem": {
|
|
1462
|
+
"node": "Node.js",
|
|
1463
|
+
"python": "Python",
|
|
1464
|
+
"go": "Go",
|
|
1465
|
+
"rust": "Rust",
|
|
1466
|
+
"maven": "Maven",
|
|
1467
|
+
"gradle": "Gradle",
|
|
1468
|
+
"dotnet": ".NET",
|
|
1469
|
+
"ruby": "Ruby",
|
|
1470
|
+
"php": "PHP",
|
|
1471
|
+
"elixir": "Elixir",
|
|
1472
|
+
"make": "Make",
|
|
1473
|
+
"just": "just",
|
|
1474
|
+
"task": "Task"
|
|
1475
|
+
}
|
|
1423
1476
|
}
|
|
1424
1477
|
},
|
|
1425
1478
|
"panels": {
|
|
@@ -1975,7 +2028,8 @@
|
|
|
1975
2028
|
},
|
|
1976
2029
|
"integrationBack": {
|
|
1977
2030
|
"backToMySetup": "Torna a La mia configurazione",
|
|
1978
|
-
"backToIntegrations": "Torna a Integrazioni"
|
|
2031
|
+
"backToIntegrations": "Torna a Integrazioni",
|
|
2032
|
+
"backToModelProviders": "Torna a Provider di modelli"
|
|
1979
2033
|
},
|
|
1980
2034
|
"commandBar": {
|
|
1981
2035
|
"searchPlaceholder": "Cerca o esegui un comando…",
|
|
@@ -2043,23 +2097,21 @@
|
|
|
2043
2097
|
},
|
|
2044
2098
|
"integrationsHub": {
|
|
2045
2099
|
"title": "Integrazioni",
|
|
2046
|
-
"intro": "Connetti e gestisci i sistemi esterni che questo workspace può collegare.",
|
|
2100
|
+
"intro": "Connetti e gestisci i sistemi esterni opzionali che questo workspace può collegare. I modelli su cui girano i tuoi agenti si trovano in Provider di modelli.",
|
|
2047
2101
|
"searchPlaceholder": "Cerca integrazioni…",
|
|
2048
2102
|
"noMatches": "Nessuna integrazione corrisponde a \"{query}\".",
|
|
2049
2103
|
"getStarted": {
|
|
2050
2104
|
"title": "Per iniziare",
|
|
2051
|
-
"body": "Connetti una sorgente di codice
|
|
2105
|
+
"body": "Connetti una sorgente di codice, così le tue pipeline hanno qualcosa su cui lavorare."
|
|
2052
2106
|
},
|
|
2053
2107
|
"status": {
|
|
2054
2108
|
"connected": "Connesso",
|
|
2055
|
-
"keyConnected": "Chiave connessa",
|
|
2056
2109
|
"notConnected": "Non connesso",
|
|
2057
2110
|
"needsAttention": "Richiede attenzione",
|
|
2058
2111
|
"disabled": "Disabilitato",
|
|
2059
2112
|
"recommended": "Consigliato"
|
|
2060
2113
|
},
|
|
2061
2114
|
"groups": {
|
|
2062
|
-
"models": "Modelli e provider",
|
|
2063
2115
|
"sourceControl": "Controllo del codice sorgente",
|
|
2064
2116
|
"communication": "Comunicazione",
|
|
2065
2117
|
"documents": "Documenti",
|
|
@@ -2069,16 +2121,6 @@
|
|
|
2069
2121
|
"personal": "Personale (solo tu)"
|
|
2070
2122
|
},
|
|
2071
2123
|
"items": {
|
|
2072
|
-
"openrouter": {
|
|
2073
|
-
"description": "Un unico gateway per oltre 300 modelli. Aggiungi la tua chiave e abilita i modelli in un solo posto."
|
|
2074
|
-
},
|
|
2075
|
-
"vendors": {
|
|
2076
|
-
"label": "Vendor e chiavi",
|
|
2077
|
-
"description": "Abbonamenti LLM del workspace e chiavi API dei provider."
|
|
2078
|
-
},
|
|
2079
|
-
"personalSubs": {
|
|
2080
|
-
"label": "Abbonamenti personali (Claude, ChatGPT/Codex, GLM)"
|
|
2081
|
-
},
|
|
2082
2124
|
"github": {
|
|
2083
2125
|
"description": "Connetti la GitHub App del workspace, esplora repo, PR e issue."
|
|
2084
2126
|
},
|
|
@@ -2118,10 +2160,6 @@
|
|
|
2118
2160
|
"label": "Il mio token GitHub",
|
|
2119
2161
|
"description": "Un personal access token usato per le esecuzioni che avvii tu (push, PR, CI, merge)."
|
|
2120
2162
|
},
|
|
2121
|
-
"localRunners": {
|
|
2122
|
-
"label": "I miei runner locali",
|
|
2123
|
-
"description": "I runner di modelli sulla tua macchina (Ollama, LM Studio, vLLM…)."
|
|
2124
|
-
},
|
|
2125
2163
|
"documentTemplates": {
|
|
2126
2164
|
"label": "Template ed esempi"
|
|
2127
2165
|
},
|
|
@@ -2131,6 +2169,45 @@
|
|
|
2131
2169
|
}
|
|
2132
2170
|
}
|
|
2133
2171
|
},
|
|
2172
|
+
"modelProvidersHub": {
|
|
2173
|
+
"title": "Provider di modelli",
|
|
2174
|
+
"intro": "I motori su cui girano i tuoi agenti. Almeno un provider deve essere connesso prima che qualsiasi passo di una pipeline possa essere eseguito.",
|
|
2175
|
+
"searchPlaceholder": "Cerca provider…",
|
|
2176
|
+
"noMatches": "Nessun provider corrisponde a \"{query}\".",
|
|
2177
|
+
"getStarted": {
|
|
2178
|
+
"title": "Nessun provider ancora connesso",
|
|
2179
|
+
"body": "I passi di agente non possono partire finché non c'è un modello raggiungibile. Una chiave OpenRouter è il modo più rapido per sbloccare un catalogo ampio, ma vanno bene anche le chiavi dei vendor, un piano personale o un runner locale tuo."
|
|
2180
|
+
},
|
|
2181
|
+
"status": {
|
|
2182
|
+
"connected": "Connesso",
|
|
2183
|
+
"keyConnected": "Chiave connessa",
|
|
2184
|
+
"notConnected": "Non connesso",
|
|
2185
|
+
"recommended": "Consigliato",
|
|
2186
|
+
"connectedCount": "nessuno connesso | {count} connesso | {count} connessi"
|
|
2187
|
+
},
|
|
2188
|
+
"groups": {
|
|
2189
|
+
"workspace": "Provider del workspace",
|
|
2190
|
+
"personal": "Personale (solo tu)",
|
|
2191
|
+
"personalNote": "Appartengono al tuo account e non al workspace, e vengono usati solo per le esecuzioni che avvii tu. Sono elencati anche in La mia configurazione."
|
|
2192
|
+
},
|
|
2193
|
+
"items": {
|
|
2194
|
+
"openrouter": {
|
|
2195
|
+
"description": "Un unico gateway per oltre 300 modelli. Aggiungi la tua chiave e abilita i modelli in un solo posto."
|
|
2196
|
+
},
|
|
2197
|
+
"vendors": {
|
|
2198
|
+
"label": "Vendor e chiavi",
|
|
2199
|
+
"description": "Abbonamenti LLM del workspace e chiavi API dei provider."
|
|
2200
|
+
},
|
|
2201
|
+
"personalSubs": {
|
|
2202
|
+
"label": "I miei abbonamenti",
|
|
2203
|
+
"description": "Piani a uso individuale che sblocchi con una password personale (Claude, GLM, Codex)."
|
|
2204
|
+
},
|
|
2205
|
+
"localRunners": {
|
|
2206
|
+
"label": "I miei runner locali",
|
|
2207
|
+
"description": "I runner di modelli sulla tua macchina (Ollama, LM Studio, vLLM)."
|
|
2208
|
+
}
|
|
2209
|
+
}
|
|
2210
|
+
},
|
|
2134
2211
|
"accountSkills": {
|
|
2135
2212
|
"intro": "Collega i repository dove il tuo team crea le Claude Skills (una cartella SKILL.md più file di risorse). Le competenze sincronizzate entrano nel catalogo di questo account, condiviso da tutte le board, e il passo Skill di una pipeline ne esegue una su un'attività."
|
|
2136
2213
|
},
|
|
@@ -4356,6 +4433,8 @@
|
|
|
4356
4433
|
"repositories": "Repository",
|
|
4357
4434
|
"addFromRepo": "Aggiungi da un repository esistente",
|
|
4358
4435
|
"bootstrapRepo": "Inizializza repository",
|
|
4436
|
+
"models": "Modelli",
|
|
4437
|
+
"modelProviders": "Provider di modelli",
|
|
4359
4438
|
"integrations": "Integrazioni",
|
|
4360
4439
|
"infrastructure": "Infrastruttura",
|
|
4361
4440
|
"sandbox": "Sandbox",
|
|
@@ -4367,8 +4446,7 @@
|
|
|
4367
4446
|
"modelConfiguration": "Configurazione del modello",
|
|
4368
4447
|
"accountSettings": "Impostazioni dell'account",
|
|
4369
4448
|
"operatorDashboard": "Osservabilità della piattaforma",
|
|
4370
|
-
"reports": "Report"
|
|
4371
|
-
"environmentSetup": "Configurazione dell'ambiente"
|
|
4449
|
+
"reports": "Report"
|
|
4372
4450
|
},
|
|
4373
4451
|
"errors": {
|
|
4374
4452
|
"action": {
|
|
@@ -5263,8 +5341,8 @@
|
|
|
5263
5341
|
},
|
|
5264
5342
|
"environmentWizard": {
|
|
5265
5343
|
"progress": "Passaggio {index} di {total}",
|
|
5266
|
-
"title": "
|
|
5267
|
-
"subtitle": "
|
|
5344
|
+
"title": "Configurazione dell'ambiente Docker Compose",
|
|
5345
|
+
"subtitle": "Costruisci la ricetta Docker Compose da cui vengono avviati gli ambienti di test di un servizio: analizza il repository, rivedi, controlli preliminari, salva.",
|
|
5268
5346
|
"recommended": "consigliato",
|
|
5269
5347
|
"steps": {
|
|
5270
5348
|
"pick": "Scegli servizio",
|
|
@@ -5274,6 +5352,7 @@
|
|
|
5274
5352
|
},
|
|
5275
5353
|
"pick": {
|
|
5276
5354
|
"intro": "Scegli il servizio per cui configurare un ambiente Docker Compose.",
|
|
5355
|
+
"scope": "Viene modificato solo il servizio che scegli. Riesegui più tardi per modificarne la ricetta.",
|
|
5277
5356
|
"empty": "Ancora nessun servizio. Aggiungi prima un servizio."
|
|
5278
5357
|
},
|
|
5279
5358
|
"review": {
|