dsh-perm-gate 5.0.2 → 5.0.4
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/CHANGELOG.ja.md +2 -0
- package/CHANGELOG.ko.md +2 -0
- package/CHANGELOG.md +2 -0
- package/INSTALL.ja.md +15 -0
- package/INSTALL.ko.md +15 -0
- package/INSTALL.md +15 -0
- package/INSTALL.zh.md +15 -0
- package/README.de.md +487 -0
- package/README.es.md +489 -0
- package/README.fr.md +498 -0
- package/README.it.md +490 -0
- package/README.ja.md +18 -1
- package/README.ko.md +18 -1
- package/README.md +18 -1
- package/README.ru.md +478 -0
- package/README.zh.md +18 -1
- package/lib/client.js +788 -5
- package/lib/client.js.map +1 -1
- package/package.json +1 -1
package/lib/client.js
CHANGED
|
@@ -7,7 +7,7 @@ window.__ModuleLoader__.load({
|
|
|
7
7
|
let react = require("react");
|
|
8
8
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
9
|
//#region src/client/locales.ts
|
|
10
|
-
/** `dsh-perm-gate` client dictionaries (zh / en / ja / ko). */
|
|
10
|
+
/** `dsh-perm-gate` client dictionaries (zh / en / ja / ko / fr / de / it / ru / es). */
|
|
11
11
|
/** Dictionary namespace owned by this plugin. */
|
|
12
12
|
const NS = "dsh-perm-gate";
|
|
13
13
|
/** Simplified Chinese dictionary (the key-set source of truth). */
|
|
@@ -316,6 +316,771 @@ window.__ModuleLoader__.load({
|
|
|
316
316
|
"card.rulesStale": "route missing (plugin not restarted?)",
|
|
317
317
|
"card.rulesNote": "Read-only: this panel cannot modify the rules. The allowlist section and \"allow always\" write back to this plugin's entry config."
|
|
318
318
|
};
|
|
319
|
+
/** French dictionary (keys mirror zh). */
|
|
320
|
+
const fr = {
|
|
321
|
+
"card.title": "自动审查 (Revue automatique)",
|
|
322
|
+
"section.title": "Porte de revue automatique",
|
|
323
|
+
"card.description": "Niveau d’approbation indépendant, parallèle à lecture seule / accès complet / liste blanche, affiché comme 自动审查 dans le sélecteur de permissions de session. Le front n’expose qu’un seul interrupteur ; les quatre stratégies d’approbation backend sont combinables depuis ce panneau et restent fail-closed face au refus dur P0.",
|
|
324
|
+
"card.permissive": "Activer le niveau 自动审查",
|
|
325
|
+
"card.permissiveHint": "Désactivée, la porte se comporte exactement comme avant.",
|
|
326
|
+
"card.scopeNote": "Portée prédéfinie : cette porte n’agit que lorsque le préréglage de permissions de session est %scope. Sous tout autre préréglage, la porte entière se met en retrait — refus dur P0 compris — et la politique du préréglage choisi prend le relais. Une mise en retrait enregistre un événement et laisse une bande permanente au-dessus de la zone de saisie.",
|
|
327
|
+
"card.strategies": "Stratégies d’approbation backend (au moins une effective ; combinables)",
|
|
328
|
+
"card.strategy.trustAutoAllow": "trustAutoAllow — les opérations sûres du périmètre sont autorisées d’office ; les dangereuses/inconnues demandent confirmation (référence du niveau intermédiaire)",
|
|
329
|
+
"card.strategy.alwaysConfirm": "alwaysConfirm — chaque passage demande confirmation ; les « contrôles d’autorisation » du panneau gagnent deux boutons étendus : « réautoriser ce type pour cette session » (autorisation limitée à la session) et « autoriser toutes les occurrences » (le mot de commande est persisté dans la liste blanche du rulesFile)",
|
|
330
|
+
"card.strategy.llmAssist": "llmAssist — un LLM personnalisé évalue le risque : safe est autorisé d’office ; les risques durs deletion/credential/remote/system/bulk restent soumis à l’humain (le classifieur ne refuse jamais — il ne fait qu’escalader) ; neutral entre en apprentissage par confirmation ; échec/timeout retombe sur l’humain",
|
|
331
|
+
"card.strategy.trustEscalation": "trustEscalation — élargissement de sandbox sans invite : pour un appel déjà autorisé par cette porte, l’extension de sandbox qu’un outil shell / pwsh / edit demande de l’intérieur est approuvée ici au lieu de vous demander",
|
|
332
|
+
"card.strategy.trustEscalationHint": "Une demande d’élargissement de sandbox est émise depuis le corps de l’outil, après tools/pre-execute, donc la porte ne l’a jamais vue — un appel jugé safe par le LLM et autorisé d’office vous demandait quand même d’approuver l’élargissement. Activée, seule la demande que la porte a réellement autorisée (correspondance exacte par callId) saute l’invite ; tout le reste passe par l’humain comme avant, de même qu’une raison non reconnue ou une cible autre que workspace-write / danger-full-access. Désactivez-la pour garder l’élargissement sous contrôle humain.",
|
|
333
|
+
"card.readonly": "Lecture seule",
|
|
334
|
+
"card.unavailable": "Espace de noms Settings indisponible : assurez-vous que dsh-perm-gate est assemblé dans ce profil.",
|
|
335
|
+
"card.llmReceiver": "LLM récepteur de llmAssist (compatible OpenAI ; toute API personnalisée)",
|
|
336
|
+
"card.llmEndpoint": "Endpoint (BaseURL, ex. https://api.openai.com/v1)",
|
|
337
|
+
"card.llmModel": "Model (id de modèle, ex. deepseek-chat)",
|
|
338
|
+
"card.llmKey": "Clé API (secrète)",
|
|
339
|
+
"card.llmKeyHidden": "Non définie · affichée sous forme de * après la première saisie",
|
|
340
|
+
"card.llmKeyMasked": "Définie · saisissez une nouvelle valeur pour la remplacer",
|
|
341
|
+
"card.llmKeyOverwrite": "Un secret est enregistré ; saisissez une nouvelle valeur puis quittez le champ pour la remplacer.",
|
|
342
|
+
"card.llmKeyClear": "Effacer",
|
|
343
|
+
"card.allowlist": "Liste blanche (allow, synchronisée au rulesFile)",
|
|
344
|
+
"card.allowlistHint": "Les motifs de la section allow autorisent directement ; ajoutez ou supprimez des entrées une à une, écrites au rulesFile et rechargées en direct.",
|
|
345
|
+
"card.allowlistPresetNote": "L’équivalent de liste blanche prédéfinie est la stratégie trustAutoAllow (opérations sûres du périmètre autorisées d’office), à activer dans la section des stratégies ci-dessus ; cette liste reflète la section allow de votre rulesFile et légitimement commence vide.",
|
|
346
|
+
"card.allowlistEmpty": "Aucune règle de liste blanche",
|
|
347
|
+
"card.allowlistPlaceholder": "Nouveau motif de commande, ex. npm test*",
|
|
348
|
+
"card.allowlistAdd": "Ajouter",
|
|
349
|
+
"card.allowlistRemove": "Supprimer ce motif",
|
|
350
|
+
"card.allowlistBulk": "Édition en masse",
|
|
351
|
+
"card.allowlistBulkHide": "Masquer l’édition en masse",
|
|
352
|
+
"card.allowlistSave": "Enregistrer la liste blanche",
|
|
353
|
+
"card.riskLearning": "riskLearning — apprentissage des verdicts : les demandes à risque neutral approuvées puis exécutées par l’humain comptent ; la même opération s’autorise d’office au seuil avec une empreinte correspondante",
|
|
354
|
+
"card.riskLearningHint": "L’état d’apprentissage appartient au plugin ($DSH_HOME/perm-gate/learning.json) et n’est jamais écrit dans vos règles YAML ; une cible différente ne réutilise jamais une autorité. Désactivé par défaut.",
|
|
355
|
+
"card.riskThreshold": "Confirmations humaines requises avant autorisation automatique (1–10)",
|
|
356
|
+
"notice.label": "Activité de la porte de permissions",
|
|
357
|
+
"history.label": "Approbations",
|
|
358
|
+
"history.title": "Registres d’approbation de permissions",
|
|
359
|
+
"history.subtitle": "Chaque décision de la porte dans cette conversation, de la plus récente à la plus ancienne",
|
|
360
|
+
"history.loading": "Chargement…",
|
|
361
|
+
"history.empty": "Aucun registre d’approbation dans cette session",
|
|
362
|
+
"history.error": "Échec du chargement : ",
|
|
363
|
+
"history.tag.auto": "Autorisé d’office",
|
|
364
|
+
"history.tag.ask": "Demandé",
|
|
365
|
+
"history.tag.deny": "Refusé",
|
|
366
|
+
"card.denylistRestore": "Restaurer la liste noire prédéfinie",
|
|
367
|
+
"card.denylist": "Liste noire (mots-clés deny, préréglage du plugin)",
|
|
368
|
+
"card.denylistHint": "Un appel dont le texte contient un mot-clé (sous-chaîne insensible à la casse) est refusé d’emblée, avant liste blanche / autorisations / LLM. La liste prédéfinie est héritée de dsh-approval-gate et active dès l’installation ; modifiez-la librement — vide ou effacée, elle retombe sur le préréglage (restauration en un clic disponible), la liste noire ne se désactive donc jamais en silence.",
|
|
369
|
+
"card.denylistEmpty": "Liste noire vide (aucun appel n’est bloqué par la couche de mots-clés)",
|
|
370
|
+
"card.denylistPlaceholder": "Nouveau mot-clé, ex. drop database",
|
|
371
|
+
"card.denylistAdd": "Ajouter",
|
|
372
|
+
"card.denylistRemove": "Supprimer ce mot-clé",
|
|
373
|
+
"card.denylistTagPreset": "Prédéfini",
|
|
374
|
+
"card.denylistTagCustom": "Personnalisé",
|
|
375
|
+
"card.riskSediment": "riskSediment — sédimentation d’apprentissage : les échantillons au seuil deviennent des autorisations déterministes",
|
|
376
|
+
"card.riskSedimentHint": "Une fois activée, quand une clé tool|category atteint le seuil, ses empreintes d’échantillons se sédimentent en règles d’autorisation — une correspondance exacte même outil/même cible autorise d’office sans nouvel appel LLM (reste actif même llmAssist désactivé).",
|
|
377
|
+
"card.sediment": "Sédiment d’apprentissage (règles d’autorisation déterministes)",
|
|
378
|
+
"card.sedimentHint": "Règles sédimentées des confirmations humaines : seule une correspondance d’empreinte exacte autorise, jamais une cible différente. Terminez un apprentissage ou supprimez un échantillon.",
|
|
379
|
+
"card.sedimentEmpty": "Aucune règle sédimentée pour l’instant (les échantillons au seuil apparaissent ici)",
|
|
380
|
+
"card.sedimentCount": "confirmés %n/%t",
|
|
381
|
+
"card.sedimentStop": "Terminer",
|
|
382
|
+
"card.sedimentStopTitle": "Terminer cet apprentissage (supprime le compteur et les échantillons)",
|
|
383
|
+
"card.sedimentStopConfirm": "Terminer l’apprentissage de « %k » ? Son compteur et tous ses échantillons seront supprimés.",
|
|
384
|
+
"card.sedimentSampleRemove": "Supprimer cet échantillon sédimenté",
|
|
385
|
+
"card.llmSource": "Source du récepteur",
|
|
386
|
+
"card.llmSourceCustom": "API personnalisée (compatible OpenAI)",
|
|
387
|
+
"card.llmSourceHost": "Utiliser le modèle par défaut actuel de la session (service llm DSH)",
|
|
388
|
+
"card.llmSourceHostHint": "Par défaut, l’évaluation d’approbation s’exécute sur le groupe de modèles que la session DSH utilise actuellement (la valeur effective s’affiche ci-dessous) ; laissez Provider / Model vides pour suivre la session, ou choisissez dans la liste déroulante ou saisissez pour épingler — vos groupes personnalisés configurés dans DSH (ex. local-35b) apparaissent automatiquement.",
|
|
389
|
+
"card.llmProvider": "Provider (vide = suivre la sélection de session)",
|
|
390
|
+
"card.llmProviderPlaceholder": "Suivre la sélection de session",
|
|
391
|
+
"card.llmModelHostPlaceholder": "Vide = suivre la sélection de session",
|
|
392
|
+
"card.llmResolved": "Effectif maintenant : %p / %m",
|
|
393
|
+
"card.llmPreset": "Préréglages d’endpoint (remplit les champs ; reste modifiable)",
|
|
394
|
+
"card.llmPresetChoose": "Choisir un préréglage…",
|
|
395
|
+
"card.llmPresetPublic": "Préréglages d’API publiques",
|
|
396
|
+
"card.llmPresetHost": "Groupes de modèles DSH (la sélection bascule vers le récepteur de session)",
|
|
397
|
+
"card.networkEnabled": "Interception réseau (networkEnabled)",
|
|
398
|
+
"card.networkEnabledHint": "Une fois activée, démarre un proxy local qui intercepte les connexions sortantes des sous-processus et applique les règles allow/deny. Désactivée : aucun changement de comportement.",
|
|
399
|
+
"card.watch": "Rechargement à chaud des règles (watch)",
|
|
400
|
+
"card.watchHint": "Une fois activé, surveille automatiquement les fichiers de règles et applique les changements instantanément, sans rechargement manuel.",
|
|
401
|
+
"card.networkRebindNote": "Effet immédiat — le proxy se relie automatiquement, sans rechargement du plugin.",
|
|
402
|
+
"card.networkInjectEnv": "Injection des variables de proxy (networkInjectEnv)",
|
|
403
|
+
"card.networkInjectEnvHint": "Écrit HTTP(S)_PROXY / ALL_PROXY pour les sous-processus (et efface NO_PROXY). Désactivée : l’écouteur tourne mais aucun environnement de processus ne change.",
|
|
404
|
+
"card.healthStale": "Route de l’hôte indisponible (404) — la moitié node est encore un ancien build ; redémarrez complètement dsh (pas seulement la page du navigateur) puis réessayez.",
|
|
405
|
+
"card.healthTest": "Test de santé",
|
|
406
|
+
"card.healthRunning": "Test en cours…",
|
|
407
|
+
"card.healthOk": "OK (%ms ms)",
|
|
408
|
+
"card.healthFail": "Échec : ",
|
|
409
|
+
"history.tag.learned": "Appris",
|
|
410
|
+
"history.tag.manualApproved": "Approuvé",
|
|
411
|
+
"history.tag.manualRejected": "Rejeté",
|
|
412
|
+
"history.tag.manualCancelled": "Annulé",
|
|
413
|
+
"history.tag.standDown": "Porte désactivée",
|
|
414
|
+
"history.learnedProgress": "appris %n/%t",
|
|
415
|
+
"history.snapshots": "instantanés diff",
|
|
416
|
+
"history.clearSession": "Effacer cette session",
|
|
417
|
+
"history.clearAll": "Tout effacer",
|
|
418
|
+
"history.clearSessionTitle": "Effacer uniquement les instantanés diff de cette session (les autres sessions restent intactes)",
|
|
419
|
+
"history.clearAllTitle": "Effacer les instantanés diff de toutes les sessions, y compris celles jamais consultées — demande une seconde confirmation",
|
|
420
|
+
"history.clearSessionConfirm": "Effacer les instantanés diff de cette session ? Seules les données de comparaison produites par les approbations de cette session sont supprimées ; les registres d’approbation restent.",
|
|
421
|
+
"history.clearAllConfirm": "Effacer les instantanés diff de TOUTES les sessions ? Cela peut supprimer des comparaisons que d’autres sessions n’ont pas encore consultées, sans retour arrière.",
|
|
422
|
+
"history.diffTitle": "Comparaison des modifications de fichiers",
|
|
423
|
+
"history.diffClose": "Fermer",
|
|
424
|
+
"history.diffLoading": "Chargement…",
|
|
425
|
+
"history.diffEmpty": "Aucun changement de contenu (ou fichier illisible)",
|
|
426
|
+
"history.diffLoadFail": "Échec du chargement du diff : ",
|
|
427
|
+
"history.diffRevert": "Annuler cette modification",
|
|
428
|
+
"history.diffReverting": "Envoi…",
|
|
429
|
+
"history.diffRevertDone": "Instruction d’annulation envoyée",
|
|
430
|
+
"history.diffRevertSent": "Instruction d’annulation envoyée à la conversation ; l’IA restaurera le fichier en conséquence",
|
|
431
|
+
"history.diffRevertFail": "Échec de l’envoi : ",
|
|
432
|
+
"history.diffNoSnapshot": "Cet événement n’a pas d’instantané pour ce fichier",
|
|
433
|
+
"history.diffChipTitle": "Voir la comparaison des modifications de ce fichier",
|
|
434
|
+
"history.diffStats": "+%a / -%r lignes modifiées · %c inchangées",
|
|
435
|
+
"history.diffGone": " (le fichier n’existe plus)",
|
|
436
|
+
"history.diffHidden": "%n lignes non modifiées",
|
|
437
|
+
"card.dryRun": "Test de règles",
|
|
438
|
+
"card.dryRunHint": "Juge un appel selon les règles en vigueur. N’exécute aucun outil et n’écrit aucune règle — vérifiez une règle ici avant de la modifier.",
|
|
439
|
+
"card.dryRunTool": "Outil",
|
|
440
|
+
"card.dryRunCommand": "Commande / arguments",
|
|
441
|
+
"card.dryRunCommandPlaceholder": "git push --force origin main",
|
|
442
|
+
"card.dryRunTest": "Tester",
|
|
443
|
+
"card.dryRunRunning": "Évaluation…",
|
|
444
|
+
"card.dryRunEmpty": "Rien de testé pour l’instant. Saisissez un outil et une commande, puis appuyez sur Tester pour voir le verdict.",
|
|
445
|
+
"card.dryRunVerdict": "Verdict",
|
|
446
|
+
"card.dryRunAllow": "autoriser",
|
|
447
|
+
"card.dryRunAsk": "demander",
|
|
448
|
+
"card.dryRunDeny": "refuser",
|
|
449
|
+
"card.dryRunRule": "Règle correspondante",
|
|
450
|
+
"card.dryRunRuleNone": "aucune règle correspondante ; defaultAction : %d",
|
|
451
|
+
"card.dryRunDimensions": "Dimensions",
|
|
452
|
+
"card.dryRunReason": "Motif",
|
|
453
|
+
"card.dryRunNote": "« Règle correspondante » vient de la couche de règles. Quand le verdict provient d’un refus dur antérieur ou de la liste noire de mots-clés, il n’y a pas d’index de règle — les dimensions listées sont alors purement indicatives.",
|
|
454
|
+
"card.dryRunNoRules": "(0 règle chargée — vérifiez le chemin du rulesFile)",
|
|
455
|
+
"card.dryRunFail": "Échec du test : ",
|
|
456
|
+
"card.dryRunStale": "route absente (plugin non redémarré ?)",
|
|
457
|
+
"card.rules": "Règles intégrées de Settings",
|
|
458
|
+
"card.rulesHint": "Les règles que la porte charge en ce moment (du champ de config `rules` de l’entrée de ce plugin ; retombe sur le fichier de règles si non défini). Lecture seule — rien ici ne peut les changer. Pour changer les règles, utilisez la liste blanche ci-dessous ou la page des réglages.",
|
|
459
|
+
"card.rulesRefresh": "Actualiser",
|
|
460
|
+
"card.rulesLoading": "Lecture…",
|
|
461
|
+
"card.rulesPath": "Source",
|
|
462
|
+
"card.rulesNone": "aucune règle configurée",
|
|
463
|
+
"card.rulesCounts": "Règles",
|
|
464
|
+
"card.rulesDefault": "defaultAction",
|
|
465
|
+
"card.rulesStats": "%b octets · %l lignes",
|
|
466
|
+
"card.rulesMissing": "Règles introuvables. La porte retombe sur ses valeurs par défaut intégrées.",
|
|
467
|
+
"card.rulesTruncated": "Règles volumineuses ; seuls les premiers 512 Ko sont affichés.",
|
|
468
|
+
"card.rulesError": "Échec du chargement : ",
|
|
469
|
+
"card.rulesStale": "route absente (plugin non redémarré ?)",
|
|
470
|
+
"card.rulesNote": "Lecture seule : ce panneau ne peut pas modifier les règles. La section liste blanche et « toujours autoriser » sont réécrites dans la config d’entrée de ce plugin."
|
|
471
|
+
};
|
|
472
|
+
/** German dictionary (keys mirror zh). */
|
|
473
|
+
const de = {
|
|
474
|
+
"card.title": "自动审查 (Automatische Prüfung)",
|
|
475
|
+
"section.title": "Auto-Prüf-Gate",
|
|
476
|
+
"card.description": "Unabhängige Genehmigungsstufe neben read-only / full-access / whitelist, angezeigt als 自动审查 in der Sitzungsrechte-Auswahl. Das Frontend bietet nur einen einzigen Schalter; die vier Backend-Genehmigungsstrategien sind über dieses Panel kombinierbar und bleiben gegenüber P0-Hartablehnung fail-closed.",
|
|
477
|
+
"card.permissive": "Stufe 自动审查 aktivieren",
|
|
478
|
+
"card.permissiveHint": "Ausgeschaltet verhält sich das Gate exakt wie bisher.",
|
|
479
|
+
"card.scopeNote": "Voreingestellter Geltungsbereich: Dieses Gate wirkt nur, während der Sitzungsrechte-Preset %scope ist. Unter jedem anderen Preset steht das gesamte Gate still — P0-Hartablehnung eingeschlossen — und die eigene Politik des gewählten Presets übernimmt. Ein Stillstand schreibt ein Ereignis und hinterlässt einen dauerhaften Hinweisstreifen über der Eingabe.",
|
|
480
|
+
"card.strategies": "Backend-Genehmigungsstrategien (mindestens eine wirksam; kombinierbar)",
|
|
481
|
+
"card.strategy.trustAutoAllow": "trustAutoAllow — sichere Operationen im Umfang werden automatisch erlaubt; gefährliche/unbekannte fragen nach (Baseline der mittleren Stufe)",
|
|
482
|
+
"card.strategy.alwaysConfirm": "alwaysConfirm — jeder Durchgang fragt; die „Erlaubnis-Steuerungen“ des Genehmigungspanels erhalten zwei erweiterte Schaltflächen: „diesen Typ in dieser Sitzung wiederholt erlauben“ (sitzungsbegrenzte Genehmigung) und „jedes Vorkommen erlauben“ (das Befehlswort wird dauerhaft in die Whitelist der rulesFile aufgenommen)",
|
|
483
|
+
"card.strategy.llmAssist": "llmAssist — ein benutzerdefiniertes LLM stuft das Risiko ein: safe wird automatisch erlaubt; harte Risiken (deletion/credential/remote/system/bulk) behalten die menschliche Nachfrage (der Klassifikator lehnt nie ab — er eskaliert nur); neutral geht ins Bestätigungslernen; Fehler/Timeout fällt auf den Menschen zurück",
|
|
484
|
+
"card.strategy.trustEscalation": "trustEscalation — Sandbox-Ausweitung ohne Rückfrage: Bei einem von diesem Gate bereits erlaubten Aufruf wird die Ausweitung, die ein shell-/pwsh-/edit-Werkzeug von innen anfordert, hier genehmigt, statt Sie zu fragen",
|
|
485
|
+
"card.strategy.trustEscalationHint": "Eine Sandbox-Ausweitungsanfrage stellt das Werkzeug selbst, nach tools/pre-execute, daher sah das Gate sie nie — ein vom LLM als safe eingestuftes, automatisch erlaubtes Aufrufen fragte Sie dennoch, die Ausweitung zu genehmigen. Eingeschaltet überspringt nur der exakte Aufruf die Rückfrage, den das Gate erlaubt hat (exakt per callId gematcht); alles andere geht wie bisher an den Menschen, ebenso bei unbekanntem Grund oder einem Ziel außer workspace-write / danger-full-access. Ausgeschaltet bleibt jede Ausweitung manuell genehmigungspflichtig.",
|
|
486
|
+
"card.readonly": "Nur Lesen",
|
|
487
|
+
"card.unavailable": "Settings-Namespace nicht verfügbar: Stellen Sie sicher, dass dsh-perm-gate in dieses Profil eingebaut ist.",
|
|
488
|
+
"card.llmReceiver": "llmAssist-Empfangs-LLM (OpenAI-kompatibel; jede eigene API)",
|
|
489
|
+
"card.llmEndpoint": "Endpoint (BaseURL, z. B. https://api.openai.com/v1)",
|
|
490
|
+
"card.llmModel": "Model (Modell-ID, z. B. deepseek-chat)",
|
|
491
|
+
"card.llmKey": "API-Key (geheim)",
|
|
492
|
+
"card.llmKeyHidden": "Nicht gesetzt · nach der ersten Eingabe als * angezeigt",
|
|
493
|
+
"card.llmKeyMasked": "Gesetzt · neuen Wert eingeben zum Überschreiben",
|
|
494
|
+
"card.llmKeyOverwrite": "Ein Geheimwert ist gespeichert; geben Sie einen neuen Wert ein und verlassen Sie das Feld, um ihn zu überschreiben.",
|
|
495
|
+
"card.llmKeyClear": "Löschen",
|
|
496
|
+
"card.allowlist": "Whitelist (allow, mit rulesFile synchronisiert)",
|
|
497
|
+
"card.allowlistHint": "Muster im allow-Abschnitt erlauben direkt; Einträge einzeln hinzufügen oder entfernen — wird in die rulesFile geschrieben und live neu geladen.",
|
|
498
|
+
"card.allowlistPresetNote": "Das Pendant zur voreingestellten Whitelist ist die Strategie trustAutoAllow (sichere Operationen im Umfang automatisch erlauben), aktivierbar im Strategiebereich oben; diese Liste spiegelt den allow-Abschnitt Ihrer rulesFile und darf leer beginnen.",
|
|
499
|
+
"card.allowlistEmpty": "Keine Whitelist-Regeln",
|
|
500
|
+
"card.allowlistPlaceholder": "Neues Befehlsmuster, z. B. npm test*",
|
|
501
|
+
"card.allowlistAdd": "Hinzufügen",
|
|
502
|
+
"card.allowlistRemove": "Dieses Muster entfernen",
|
|
503
|
+
"card.allowlistBulk": "Massenbearbeitung",
|
|
504
|
+
"card.allowlistBulkHide": "Massenbearbeitung einklappen",
|
|
505
|
+
"card.allowlistSave": "Whitelist speichern",
|
|
506
|
+
"card.riskLearning": "riskLearning — Urteilslernen: neutral-Risiko-Anfragen, die der Mensch genehmigt und die ausgeführt werden, zählen hoch; dieselbe Operation wird bei Erreichen des Schwellwerts mit passendem Fingerabdruck automatisch erlaubt",
|
|
507
|
+
"card.riskLearningHint": "Der Lernzustand gehört zum Plugin ($DSH_HOME/perm-gate/learning.json) und wird nie in Ihre YAML-Regeln geschrieben; ein anderes Ziel nutzt eine Erlaubnis nie wieder. Standardmäßig aus.",
|
|
508
|
+
"card.riskThreshold": "Menschliche Bestätigungen vor automatischer Erlaubnis (1–10)",
|
|
509
|
+
"notice.label": "Aktivität des Rechte-Gates",
|
|
510
|
+
"history.label": "Genehmigungen",
|
|
511
|
+
"history.title": "Genehmigungsprotokoll der Rechte",
|
|
512
|
+
"history.subtitle": "Jede Gate-Entscheidung dieser Konversation, neueste zuerst",
|
|
513
|
+
"history.loading": "Wird geladen…",
|
|
514
|
+
"history.empty": "Noch keine Genehmigungen in dieser Sitzung",
|
|
515
|
+
"history.error": "Laden fehlgeschlagen: ",
|
|
516
|
+
"history.tag.auto": "Automatisch erlaubt",
|
|
517
|
+
"history.tag.ask": "Nachgefragt",
|
|
518
|
+
"history.tag.deny": "Abgelehnt",
|
|
519
|
+
"card.denylistRestore": "Voreingestellte Blacklist wiederherstellen",
|
|
520
|
+
"card.denylist": "Blacklist (deny-Schlüsselwörter, Plugin-Voreinstellung)",
|
|
521
|
+
"card.denylistHint": "Ein Aufruf, dessen Text ein Schlüsselwort enthält (Teilstring, Groß-/Kleinschreibung egal), wird rundum abgelehnt — vor Whitelist / Genehmigungen / LLM. Die Voreinstellung stammt von dsh-approval-gate und ist ab Installation aktiv; frei editierbar — leer oder geleert fällt auf die Voreinstellung zurück (Ein-Klick-Wiederherstellung), die Blacklist schaltet sich also nie still ab.",
|
|
522
|
+
"card.denylistEmpty": "Blacklist leer (kein Aufruf wird von der Schlüsselwortschicht abgelehnt)",
|
|
523
|
+
"card.denylistPlaceholder": "Neues Schlüsselwort, z. B. drop database",
|
|
524
|
+
"card.denylistAdd": "Hinzufügen",
|
|
525
|
+
"card.denylistRemove": "Dieses Schlüsselwort entfernen",
|
|
526
|
+
"card.denylistTagPreset": "Voreingestellt",
|
|
527
|
+
"card.denylistTagCustom": "Benutzerdefiniert",
|
|
528
|
+
"card.riskSediment": "riskSediment — Lernsedimentierung: Stichproben am Schwellwert werden deterministische Auto-Erlaubnisse",
|
|
529
|
+
"card.riskSedimentHint": "Eingeschaltet sedimentieren die Stichproben-Fingerabdrücke eines tool|category-Schlüssels bei Erreichen des Schwellwerts zu Erlaubnisregeln — ein exakter Treffer gleiches Werkzeug/gleiches Ziel erlaubt ohne weiteren LLM-Aufruf (wirkt auch bei ausgeschaltetem llmAssist).",
|
|
530
|
+
"card.sediment": "Lernsediment (deterministische Erlaubnisregeln)",
|
|
531
|
+
"card.sedimentHint": "Aus menschlichen Bestätigungen sedimentierte Regeln: Nur ein exakter Fingerabdruck-Treffer erlaubt, nie ein anderes Ziel. Ein Lernen beenden oder eine Stichprobe entfernen.",
|
|
532
|
+
"card.sedimentEmpty": "Noch keine sedimentierten Regeln (Stichproben am Schwellwert erscheinen hier)",
|
|
533
|
+
"card.sedimentCount": "bestätigt %n/%t",
|
|
534
|
+
"card.sedimentStop": "Beenden",
|
|
535
|
+
"card.sedimentStopTitle": "Dieses Lernen beenden (Zähler und Stichproben werden gelöscht)",
|
|
536
|
+
"card.sedimentStopConfirm": "Lernen für „%k“ beenden? Zähler und alle Stichproben werden gelöscht.",
|
|
537
|
+
"card.sedimentSampleRemove": "Diese sedimentierte Stichprobe entfernen",
|
|
538
|
+
"card.llmSource": "Empfangsquelle",
|
|
539
|
+
"card.llmSourceCustom": "Eigene API (OpenAI-kompatibel)",
|
|
540
|
+
"card.llmSourceHost": "Aktuelles Sitzungsstandardmodell verwenden (DSH-llm-Dienst)",
|
|
541
|
+
"card.llmSourceHostHint": "Standardmäßig läuft die Genehmigungsbewertung auf der Modellgruppe, die die DSH-Sitzung aktuell nutzt (der effektive Wert steht unten); lassen Sie Provider / Model leer, um der Sitzung zu folgen, oder wählen Sie aus der Liste bzw. tippen Sie einen festen Wert — eigene Gruppen aus Ihrer DSH-Konfiguration (z. B. local-35b) erscheinen automatisch.",
|
|
542
|
+
"card.llmProvider": "Provider (leer = der Sitzungsauswahl folgen)",
|
|
543
|
+
"card.llmProviderPlaceholder": "Der Sitzungsauswahl folgen",
|
|
544
|
+
"card.llmModelHostPlaceholder": "Leer = der Sitzungsauswahl folgen",
|
|
545
|
+
"card.llmResolved": "Derzeit wirksam: %p / %m",
|
|
546
|
+
"card.llmPreset": "Endpoint-Voreinstellungen (füllt die Felder; weiter editierbar)",
|
|
547
|
+
"card.llmPresetChoose": "Voreinstellung wählen…",
|
|
548
|
+
"card.llmPresetPublic": "Voreinstellungen für öffentliche APIs",
|
|
549
|
+
"card.llmPresetHost": "DSH-Modellgruppen (Auswahl wechselt zum Sitzungsempfänger)",
|
|
550
|
+
"card.networkEnabled": "Netzwerkabfangen (networkEnabled)",
|
|
551
|
+
"card.networkEnabledHint": "Eingeschaltet startet ein lokaler Proxy, der ausgehende Verbindungen von Unterprozessen abfängt und allow/deny-Regeln anwendet. Aus = kein Verhaltensunterschied.",
|
|
552
|
+
"card.watch": "Heißes Nachladen der Regeln (watch)",
|
|
553
|
+
"card.watchHint": "Eingeschaltet werden Regeldateien automatisch überwacht und Änderungen sofort angewendet — ohne manuelles Nachladen.",
|
|
554
|
+
"card.networkRebindNote": "Wirkt sofort — der Proxy bindet automatisch neu, ein Plugin-Neuladen ist nicht nötig.",
|
|
555
|
+
"card.networkInjectEnv": "Proxy-Umgebungsvariablen injizieren (networkInjectEnv)",
|
|
556
|
+
"card.networkInjectEnvHint": "Schreibt HTTP(S)_PROXY / ALL_PROXY für Unterprozesse (und leert NO_PROXY). Aus = der Lauscher läuft, aber keine Prozessumgebung ändert sich.",
|
|
557
|
+
"card.healthStale": "Host-Route nicht verfügbar (404) — die node-Hälfte ist noch ein alter Build; starten Sie dsh vollständig neu (nicht nur die Browserseite) und versuchen Sie es erneut.",
|
|
558
|
+
"card.healthTest": "Gesundheitstest",
|
|
559
|
+
"card.healthRunning": "Teste…",
|
|
560
|
+
"card.healthOk": "OK (%ms ms)",
|
|
561
|
+
"card.healthFail": "Fehlgeschlagen: ",
|
|
562
|
+
"history.tag.learned": "Gelernt",
|
|
563
|
+
"history.tag.manualApproved": "Genehmigt",
|
|
564
|
+
"history.tag.manualRejected": "Abgelehnt",
|
|
565
|
+
"history.tag.manualCancelled": "Abgebrochen",
|
|
566
|
+
"history.tag.standDown": "Gate aus",
|
|
567
|
+
"history.learnedProgress": "gelernt %n/%t",
|
|
568
|
+
"history.snapshots": "diff-Snapshots",
|
|
569
|
+
"history.clearSession": "Nur diese Sitzung leeren",
|
|
570
|
+
"history.clearAll": "Alles leeren",
|
|
571
|
+
"history.clearSessionTitle": "Nur die diff-Snapshots dieser Sitzung löschen (andere Sitzungen unberührt)",
|
|
572
|
+
"history.clearAllTitle": "diff-Snapshots aller Sitzungen löschen, auch nie angesehener — fragt nochmals nach",
|
|
573
|
+
"history.clearSessionConfirm": "diff-Snapshots dieser Sitzung löschen? Nur die von den Genehmigungen dieser Sitzung erzeugten Vergleichsdaten werden entfernt; die Genehmigungsprotokolle bleiben.",
|
|
574
|
+
"history.clearAllConfirm": "diff-Snapshots ALLER Sitzungen löschen? Das kann Vergleiche löschen, die andere Sitzungen noch nicht angesehen haben, und ist nicht rückgängig zu machen.",
|
|
575
|
+
"history.diffTitle": "Dateiänderungsvergleich",
|
|
576
|
+
"history.diffClose": "Schließen",
|
|
577
|
+
"history.diffLoading": "Wird geladen…",
|
|
578
|
+
"history.diffEmpty": "Keine Inhaltsänderung (oder Datei nicht lesbar)",
|
|
579
|
+
"history.diffLoadFail": "diff konnte nicht geladen werden: ",
|
|
580
|
+
"history.diffRevert": "Diese Änderung zurücknehmen",
|
|
581
|
+
"history.diffReverting": "Wird gesendet…",
|
|
582
|
+
"history.diffRevertDone": "Rücknahmeanweisung gesendet",
|
|
583
|
+
"history.diffRevertSent": "Rücknahmeanweisung an die Konversation gesendet; die KI stellt die Datei entsprechend wieder her",
|
|
584
|
+
"history.diffRevertFail": "Senden fehlgeschlagen: ",
|
|
585
|
+
"history.diffNoSnapshot": "Dieses Ereignis hat keinen Snapshot für diese Datei",
|
|
586
|
+
"history.diffChipTitle": "Änderungsvergleich dieser Datei ansehen",
|
|
587
|
+
"history.diffStats": "+%a / -%r Zeilen geändert · %c unverändert",
|
|
588
|
+
"history.diffGone": " (Datei existiert nicht mehr)",
|
|
589
|
+
"history.diffHidden": "%n unveränderte Zeilen",
|
|
590
|
+
"card.dryRun": "Regeltest",
|
|
591
|
+
"card.dryRunHint": "Beurteilt einen Aufruf gegen die geltenden Regeln. Führt kein Werkzeug aus und schreibt keine Regel — prüfen Sie eine Regel hier, bevor Sie sie ändern.",
|
|
592
|
+
"card.dryRunTool": "Werkzeug",
|
|
593
|
+
"card.dryRunCommand": "Befehl / Argumente",
|
|
594
|
+
"card.dryRunCommandPlaceholder": "git push --force origin main",
|
|
595
|
+
"card.dryRunTest": "Testen",
|
|
596
|
+
"card.dryRunRunning": "Wird beurteilt…",
|
|
597
|
+
"card.dryRunEmpty": "Noch nichts getestet. Werkzeug und Befehl eingeben, dann auf Testen drücken, um das Urteil zu sehen.",
|
|
598
|
+
"card.dryRunVerdict": "Urteil",
|
|
599
|
+
"card.dryRunAllow": "erlauben",
|
|
600
|
+
"card.dryRunAsk": "nachfragen",
|
|
601
|
+
"card.dryRunDeny": "ablehnen",
|
|
602
|
+
"card.dryRunRule": "Passende Regel",
|
|
603
|
+
"card.dryRunRuleNone": "keine Regel passt; defaultAction: %d",
|
|
604
|
+
"card.dryRunDimensions": "Dimensionen",
|
|
605
|
+
"card.dryRunReason": "Grund",
|
|
606
|
+
"card.dryRunNote": "„Passende Regel“ stammt aus der Regelebene. Stammt das Urteil aus einer früheren Hartablehnung oder der Schlüsselwort-Blacklist, gibt es keine Regelnummer — die gelisteten Dimensionen sind dann rein informativ.",
|
|
607
|
+
"card.dryRunNoRules": "(0 Regeln geladen — rulesFile-Pfad prüfen)",
|
|
608
|
+
"card.dryRunFail": "Test fehlgeschlagen: ",
|
|
609
|
+
"card.dryRunStale": "Route fehlt (Plugin nicht neu gestartet?)",
|
|
610
|
+
"card.rules": "Eingebaute Regeln aus Settings",
|
|
611
|
+
"card.rulesHint": "Die Regeln, die das Gate gerade lädt (aus dem `rules`-Konfigurationsfeld dieses Plugin-Eintrags; ohne Angabe fällt es auf die Regeldatei zurück). Nur Lesen — hier lässt sich nichts ändern. Regeln ändern Sie über die Whitelist unten oder auf der Einstellungsseite.",
|
|
612
|
+
"card.rulesRefresh": "Aktualisieren",
|
|
613
|
+
"card.rulesLoading": "Wird gelesen…",
|
|
614
|
+
"card.rulesPath": "Quelle",
|
|
615
|
+
"card.rulesNone": "keine Regeln konfiguriert",
|
|
616
|
+
"card.rulesCounts": "Regeln",
|
|
617
|
+
"card.rulesDefault": "defaultAction",
|
|
618
|
+
"card.rulesStats": "%b Bytes · %l Zeilen",
|
|
619
|
+
"card.rulesMissing": "Regeln nicht gefunden. Das Gate fällt auf seine eingebauten Standardwerte zurück.",
|
|
620
|
+
"card.rulesTruncated": "Regeln sind groß; nur die ersten 512 KB werden angezeigt.",
|
|
621
|
+
"card.rulesError": "Laden fehlgeschlagen: ",
|
|
622
|
+
"card.rulesStale": "Route fehlt (Plugin nicht neu gestartet?)",
|
|
623
|
+
"card.rulesNote": "Nur Lesen: Dieses Panel kann die Regeln nicht ändern. Der Whitelist-Abschnitt und „immer erlauben“ schreiben in die Eintragskonfiguration dieses Plugins zurück."
|
|
624
|
+
};
|
|
625
|
+
/** Italian dictionary (keys mirror zh). */
|
|
626
|
+
const it = {
|
|
627
|
+
"card.title": "自动审查 (Revisione automatica)",
|
|
628
|
+
"section.title": "Gate di revisione automatica",
|
|
629
|
+
"card.description": "Livello di approvazione indipendente, parallelo a read-only / full-access / whitelist, mostrato come 自动审查 nel selettore dei permessi di sessione. Il front-end espone un solo interruttore; le quattro strategie di approvazione del backend sono combinabili da questo pannello e restano fail-closed contro il diniego rigido P0.",
|
|
630
|
+
"card.permissive": "Attiva il livello 自动审查",
|
|
631
|
+
"card.permissiveHint": "Spento, il gate si comporta esattamente come prima.",
|
|
632
|
+
"card.scopeNote": "Ambito preimpostato: questo gate agisce solo quando il preset dei permessi di sessione è %scope. Con qualsiasi altro preset l’intero gate si disattiva — diniego rigido P0 compreso — e prende il comando la politica del preset scelto. Una disattivazione registra un evento e lascia una striscia persistente sopra la casella di input.",
|
|
633
|
+
"card.strategies": "Strategie di approvazione del backend (almeno una efficace; combinabili)",
|
|
634
|
+
"card.strategy.trustAutoAllow": "trustAutoAllow — le operazioni sicure nell’ambito sono consentite automaticamente; quelle pericolose/sconosciute chiedono conferma (baseline del livello intermedio)",
|
|
635
|
+
"card.strategy.alwaysConfirm": "alwaysConfirm — ogni passaggio chiede conferma; i «controlli di consenso» del pannello di approvazione ricevono due pulsanti estesi: «ri-consenti questo tipo per questa sessione» (concessione limitata alla sessione) e «consenti ogni occorrenza» (la parola di comando viene resa persistente nella whitelist del rulesFile)",
|
|
636
|
+
"card.strategy.llmAssist": "llmAssist — un LLM personalizzato gradua il rischio: safe consente automaticamente; i rischi rigidi deletion/credential/remote/system/bulk mantengono la conferma umana (il classificatore non nega mai — si limita a escalare); neutral entra nell’apprendimento per conferma; fallimento/timeout ricade sull’umano",
|
|
637
|
+
"card.strategy.trustEscalation": "trustEscalation — ampliamento sandbox senza prompt: per una chiamata già consentita da questo gate, l’ampliamento di sandbox che uno strumento shell / pwsh / edit richiede dal proprio interno viene approvato qui invece di chiedere a te",
|
|
638
|
+
"card.strategy.trustEscalationHint": "Una richiesta di ampliamento sandbox parte dall’interno del corpo dello strumento, dopo tools/pre-execute, quindi il gate non l’ha mai vista — una chiamata valutata safe dal LLM e consentita automaticamente chiedeva comunque l’approvazione dell’ampliamento. Attiva, solo la chiamata esatta che il gate ha consentito (corrispondenza esatta per callId) salta il prompt; tutto il resto va all’umano come prima, così come una ragione non riconosciuta o una destinazione diversa da workspace-write / danger-full-access. Disattiva per tenere l’ampliamento sotto controllo umano.",
|
|
639
|
+
"card.readonly": "Sola lettura",
|
|
640
|
+
"card.unavailable": "Namespace delle impostazioni non disponibile: verifica che dsh-perm-gate sia assemblato in questo profilo.",
|
|
641
|
+
"card.llmReceiver": "LLM ricevente di llmAssist (compatibile OpenAI; qualsiasi API personalizzata)",
|
|
642
|
+
"card.llmEndpoint": "Endpoint (BaseURL, es. https://api.openai.com/v1)",
|
|
643
|
+
"card.llmModel": "Model (id del modello, es. deepseek-chat)",
|
|
644
|
+
"card.llmKey": "API Key (segreta)",
|
|
645
|
+
"card.llmKeyHidden": "Non impostata · mostrata come * dopo il primo inserimento",
|
|
646
|
+
"card.llmKeyMasked": "Impostata · digita un nuovo valore per sostituirla",
|
|
647
|
+
"card.llmKeyOverwrite": "Un segreto è memorizzato; digita un nuovo valore e togli il focus per sostituirlo.",
|
|
648
|
+
"card.llmKeyClear": "Cancella",
|
|
649
|
+
"card.allowlist": "Whitelist (allow, sincronizzata con il rulesFile)",
|
|
650
|
+
"card.allowlistHint": "I pattern nella sezione allow consentono direttamente; aggiungi o rimuovi voci una a una, scritte nel rulesFile e ricaricate in diretta.",
|
|
651
|
+
"card.allowlistPresetNote": "L’equivalente della whitelist preimpostata è la strategia trustAutoAllow (operazioni sicure nell’ambito consentite automaticamente), da attivare nella sezione strategie sopra; questo elenco rispecchia la sezione allow del tuo rulesFile ed è normale che parta vuoto.",
|
|
652
|
+
"card.allowlistEmpty": "Nessuna regola di whitelist",
|
|
653
|
+
"card.allowlistPlaceholder": "Nuovo pattern di comando, es. npm test*",
|
|
654
|
+
"card.allowlistAdd": "Aggiungi",
|
|
655
|
+
"card.allowlistRemove": "Rimuovi questo pattern",
|
|
656
|
+
"card.allowlistBulk": "Modifica in blocco",
|
|
657
|
+
"card.allowlistBulkHide": "Nascondi la modifica in blocco",
|
|
658
|
+
"card.allowlistSave": "Salva la whitelist",
|
|
659
|
+
"card.riskLearning": "riskLearning — apprendimento dei verdetti: le richieste a rischio neutral approvate ed eseguite dall’umano contano; la stessa operazione si auto-consente alla soglia con impronta corrispondente",
|
|
660
|
+
"card.riskLearningHint": "Lo stato di apprendimento è dati del plugin ($DSH_HOME/perm-gate/learning.json) e non viene mai scritto nelle tue regole YAML; una destinazione diversa non riusa mai un’autorità. Disattivato per impostazione predefinita.",
|
|
661
|
+
"card.riskThreshold": "Conferme umane richieste prima del consenso automatico (1–10)",
|
|
662
|
+
"notice.label": "Attività del gate dei permessi",
|
|
663
|
+
"history.label": "Approvazioni",
|
|
664
|
+
"history.title": "Registri di approvazione dei permessi",
|
|
665
|
+
"history.subtitle": "Ogni decisione del gate in questa conversazione, dalla più recente",
|
|
666
|
+
"history.loading": "Caricamento…",
|
|
667
|
+
"history.empty": "Nessun registro di approvazione in questa sessione",
|
|
668
|
+
"history.error": "Caricamento non riuscito: ",
|
|
669
|
+
"history.tag.auto": "Auto-consentito",
|
|
670
|
+
"history.tag.ask": "Chiesto",
|
|
671
|
+
"history.tag.deny": "Negato",
|
|
672
|
+
"card.denylistRestore": "Ripristina la blacklist preimpostata",
|
|
673
|
+
"card.denylist": "Blacklist (parole chiave deny, preimpostazione del plugin)",
|
|
674
|
+
"card.denylistHint": "Una chiamata il cui testo contiene una parola chiave (sottostringa senza distinzione tra maiuscole e minuscole) viene negata outright — prima di whitelist / concessioni / LLM. L’elenco preimpostato è ereditato da dsh-approval-gate e attivo dall’installazione; modifica liberamente — vuoto o svuotato ricade sulla preimpostazione (ripristino con un clic disponibile), così la blacklist non si spegne mai in silenzio.",
|
|
675
|
+
"card.denylistEmpty": "Blacklist vuota (nessuna chiamata è bloccata dal livello delle parole chiave)",
|
|
676
|
+
"card.denylistPlaceholder": "Nuova parola chiave, es. drop database",
|
|
677
|
+
"card.denylistAdd": "Aggiungi",
|
|
678
|
+
"card.denylistRemove": "Rimuovi questa parola chiave",
|
|
679
|
+
"card.denylistTagPreset": "Preimpostato",
|
|
680
|
+
"card.denylistTagCustom": "Personalizzato",
|
|
681
|
+
"card.riskSediment": "riskSediment — sedimentazione dell’apprendimento: i campioni arrivati alla soglia diventano consensi deterministici",
|
|
682
|
+
"card.riskSedimentHint": "Attiva, quando una chiave tool|category raggiunge la soglia le impronte dei suoi campioni si sedimentano in regole di consenso — una corrispondenza esatta stesso strumento/stessa destinazione consente senza un’altra chiamata LLM (resta attivo anche con llmAssist spento).",
|
|
683
|
+
"card.sediment": "Sedimento di apprendimento (regole di consenso deterministiche)",
|
|
684
|
+
"card.sedimentHint": "Regole sedimentate dalle conferme umane: solo una corrispondenza esatta di impronta consente, mai una destinazione diversa. Termina un apprendimento o rimuovi un campione.",
|
|
685
|
+
"card.sedimentEmpty": "Ancora nessuna regola sedimentata (i campioni arrivati alla soglia compaiono qui)",
|
|
686
|
+
"card.sedimentCount": "confermati %n/%t",
|
|
687
|
+
"card.sedimentStop": "Termina",
|
|
688
|
+
"card.sedimentStopTitle": "Termina questo apprendimento (elimina il conteggio e i campioni)",
|
|
689
|
+
"card.sedimentStopConfirm": "Terminare l’apprendimento di «%k»? Il conteggio e tutti i campioni saranno eliminati.",
|
|
690
|
+
"card.sedimentSampleRemove": "Rimuovi questo campione sedimentato",
|
|
691
|
+
"card.llmSource": "Sorgente del ricevente",
|
|
692
|
+
"card.llmSourceCustom": "API personalizzata (compatibile OpenAI)",
|
|
693
|
+
"card.llmSourceHost": "Usa il modello predefinito corrente della sessione (servizio llm DSH)",
|
|
694
|
+
"card.llmSourceHostHint": "Per impostazione predefinita la graduazione dell’approvazione gira sul gruppo di modelli che la sessione DSH usa attualmente (il valore effettivo è mostrato sotto); lascia Provider / Model vuoti per seguire la sessione, oppure scegli dal menu a tendina o digita per fissarne uno — i gruppi personalizzati configurati in DSH (es. local-35b) compaiono automaticamente.",
|
|
695
|
+
"card.llmProvider": "Provider (vuoto = segue la selezione della sessione)",
|
|
696
|
+
"card.llmProviderPlaceholder": "Segue la selezione della sessione",
|
|
697
|
+
"card.llmModelHostPlaceholder": "Vuoto = segue la selezione della sessione",
|
|
698
|
+
"card.llmResolved": "Effettivo ora: %p / %m",
|
|
699
|
+
"card.llmPreset": "Preimpostazioni di endpoint (compila i campi; resta modificabile)",
|
|
700
|
+
"card.llmPresetChoose": "Scegli una preimpostazione…",
|
|
701
|
+
"card.llmPresetPublic": "Preimpostazioni di API pubbliche",
|
|
702
|
+
"card.llmPresetHost": "Gruppi di modelli DSH (la selezione passa al ricevente di sessione)",
|
|
703
|
+
"card.networkEnabled": "Intercettazione di rete (networkEnabled)",
|
|
704
|
+
"card.networkEnabledHint": "Attiva, avvia un proxy locale che intercetta le connessioni in uscita dei sottoprocessi e applica regole allow/deny. Spenta = nessun cambiamento di comportamento.",
|
|
705
|
+
"card.watch": "Ricarica a caldo delle regole (watch)",
|
|
706
|
+
"card.watchHint": "Attivo, osserva automaticamente i file di regole e applica i cambiamenti all’istante, senza ricarica manuale.",
|
|
707
|
+
"card.networkRebindNote": "Effetto immediato — il proxy si ricollega da solo, nessun ricaricamento del plugin.",
|
|
708
|
+
"card.networkInjectEnv": "Iniezione delle variabili d’ambiente del proxy (networkInjectEnv)",
|
|
709
|
+
"card.networkInjectEnvHint": "Scrive HTTP(S)_PROXY / ALL_PROXY per i sottoprocessi (e cancella NO_PROXY). Spenta = il listener gira ma nessun ambiente di processo cambia.",
|
|
710
|
+
"card.healthStale": "Rotta dell’host non disponibile (404) — la metà node è ancora una build vecchia; riavvia completamente dsh (non solo la pagina del browser) e riprova.",
|
|
711
|
+
"card.healthTest": "Test di salute",
|
|
712
|
+
"card.healthRunning": "Test in corso…",
|
|
713
|
+
"card.healthOk": "OK (%ms ms)",
|
|
714
|
+
"card.healthFail": "Non riuscito: ",
|
|
715
|
+
"history.tag.learned": "Appreso",
|
|
716
|
+
"history.tag.manualApproved": "Approvato",
|
|
717
|
+
"history.tag.manualRejected": "Rifiutato",
|
|
718
|
+
"history.tag.manualCancelled": "Annullato",
|
|
719
|
+
"history.tag.standDown": "Gate disattivato",
|
|
720
|
+
"history.learnedProgress": "appreso %n/%t",
|
|
721
|
+
"history.snapshots": "snapshot diff",
|
|
722
|
+
"history.clearSession": "Svuota questa sessione",
|
|
723
|
+
"history.clearAll": "Svuota tutto",
|
|
724
|
+
"history.clearSessionTitle": "Svuota solo gli snapshot diff di questa sessione (le altre sessioni restano intatte)",
|
|
725
|
+
"history.clearAllTitle": "Svuota gli snapshot diff di ogni sessione, comprese quelle mai riviste — chiede una seconda conferma",
|
|
726
|
+
"history.clearSessionConfirm": "Svuotare gli snapshot diff di questa sessione? Vengono rimossi solo i dati di confronto prodotti dalle approvazioni di questa sessione; i registri di approvazione restano.",
|
|
727
|
+
"history.clearAllConfirm": "Svuotare gli snapshot diff di TUTTE le sessioni? Questo può eliminare confronti che altre sessioni non hanno ancora visto, e non si può annullare.",
|
|
728
|
+
"history.diffTitle": "Confronto delle modifiche ai file",
|
|
729
|
+
"history.diffClose": "Chiudi",
|
|
730
|
+
"history.diffLoading": "Caricamento…",
|
|
731
|
+
"history.diffEmpty": "Nessun cambiamento di contenuto (o file non leggibile)",
|
|
732
|
+
"history.diffLoadFail": "Caricamento del diff non riuscito: ",
|
|
733
|
+
"history.diffRevert": "Annulla questa modifica",
|
|
734
|
+
"history.diffReverting": "Invio…",
|
|
735
|
+
"history.diffRevertDone": "Istruzione di annullamento inviata",
|
|
736
|
+
"history.diffRevertSent": "Istruzione di annullamento inviata alla conversazione; l’AI ripristinerà il file di conseguenza",
|
|
737
|
+
"history.diffRevertFail": "Invio non riuscito: ",
|
|
738
|
+
"history.diffNoSnapshot": "Questo evento non ha uno snapshot per quel file",
|
|
739
|
+
"history.diffChipTitle": "Vedi il confronto delle modifiche di questo file",
|
|
740
|
+
"history.diffStats": "+%a / -%r righe modificate · %c invariate",
|
|
741
|
+
"history.diffGone": " (il file non esiste più)",
|
|
742
|
+
"history.diffHidden": "%n righe non modificate",
|
|
743
|
+
"card.dryRun": "Test delle regole",
|
|
744
|
+
"card.dryRunHint": "Giudica una chiamata secondo le regole in vigore. Non esegue alcuno strumento e non scrive alcuna regola — verifica una regola qui prima di modificarla.",
|
|
745
|
+
"card.dryRunTool": "Strumento",
|
|
746
|
+
"card.dryRunCommand": "Comando / argomenti",
|
|
747
|
+
"card.dryRunCommandPlaceholder": "git push --force origin main",
|
|
748
|
+
"card.dryRunTest": "Testa",
|
|
749
|
+
"card.dryRunRunning": "Giudizio in corso…",
|
|
750
|
+
"card.dryRunEmpty": "Niente ancora testato. Inserisci strumento e comando, poi premi Testa per vedere come sarebbe giudicato.",
|
|
751
|
+
"card.dryRunVerdict": "Verdetto",
|
|
752
|
+
"card.dryRunAllow": "consenti",
|
|
753
|
+
"card.dryRunAsk": "chiedi",
|
|
754
|
+
"card.dryRunDeny": "nega",
|
|
755
|
+
"card.dryRunRule": "Regola corrisposta",
|
|
756
|
+
"card.dryRunRuleNone": "nessuna regola corrisposta; defaultAction: %d",
|
|
757
|
+
"card.dryRunDimensions": "Dimensioni",
|
|
758
|
+
"card.dryRunReason": "Motivo",
|
|
759
|
+
"card.dryRunNote": "«Regola corrisposta» viene dal livello delle regole. Quando il verdetto proviene da un diniego rigido precedente o dalla blacklist di parole chiave non c’è un indice di regola — le dimensioni elencate sono allora solo indicative.",
|
|
760
|
+
"card.dryRunNoRules": "(0 regole caricate — controlla il percorso del rulesFile)",
|
|
761
|
+
"card.dryRunFail": "Test non riuscito: ",
|
|
762
|
+
"card.dryRunStale": "rotta assente (plugin non riavviato?)",
|
|
763
|
+
"card.rules": "Regole incorporate di Settings",
|
|
764
|
+
"card.rulesHint": "Le regole che il gate sta caricando adesso (dal campo di configurazione `rules` della voce di questo plugin; senza configurazione ricade sul file di regole). Sola lettura — qui non si può cambiare nulla. Per cambiare le regole usa la whitelist sotto o la pagina delle impostazioni.",
|
|
765
|
+
"card.rulesRefresh": "Aggiorna",
|
|
766
|
+
"card.rulesLoading": "Lettura…",
|
|
767
|
+
"card.rulesPath": "Sorgente",
|
|
768
|
+
"card.rulesNone": "nessuna regola configurata",
|
|
769
|
+
"card.rulesCounts": "Regole",
|
|
770
|
+
"card.rulesDefault": "defaultAction",
|
|
771
|
+
"card.rulesStats": "%b byte · %l righe",
|
|
772
|
+
"card.rulesMissing": "Regole non trovate. Il gate ricade sui suoi valori predefiniti incorporati.",
|
|
773
|
+
"card.rulesTruncated": "Regole grandi; mostro solo i primi 512 KB.",
|
|
774
|
+
"card.rulesError": "Caricamento non riuscito: ",
|
|
775
|
+
"card.rulesStale": "rotta assente (plugin non riavviato?)",
|
|
776
|
+
"card.rulesNote": "Sola lettura: questo pannello non può modificare le regole. La sezione whitelist e «consenti sempre» riscrivono nella configurazione della voce di questo plugin."
|
|
777
|
+
};
|
|
778
|
+
/** Russian dictionary (keys mirror zh). */
|
|
779
|
+
const ru = {
|
|
780
|
+
"card.title": "自动审查 (Автопроверка)",
|
|
781
|
+
"section.title": "Шлюз автопроверки",
|
|
782
|
+
"card.description": "Отдельный уровень одобрения наряду с read-only / full-access / whitelist, в выборе прав сессии показывается как 自动审查. Фронтенд показывает один переключатель; четыре серверные стратегии одобрения комбинируются на этой панели и по-прежнему fail-closed против жёсткого отказа P0.",
|
|
783
|
+
"card.permissive": "Включить уровень 自动审查",
|
|
784
|
+
"card.permissiveHint": "При выключении шлюз ведёт себя ровно как раньше.",
|
|
785
|
+
"card.scopeNote": "Область пресета: шлюз действует, только когда пресет прав сессии — %scope. При любом другом пресете весь шлюз стоит (включая жёсткий отказ P0), и действует политика выбранного пресета. Остановка записывает одно событие и оставляет постоянную полосу над полем ввода.",
|
|
786
|
+
"card.strategies": "Серверные стратегии одобрения (хотя бы одна действует; сочетаются)",
|
|
787
|
+
"card.strategy.trustAutoAllow": "trustAutoAllow — безопасные операции в области пропускаются автоматически; опасные/неизвестные спрашивают (базовый средний уровень)",
|
|
788
|
+
"card.strategy.alwaysConfirm": "alwaysConfirm — каждый проход спрашивает; у «элементов разрешения» панели одобрения появляются две расширенные кнопки: «повторно разрешать этот тип в этой сессии» (сессионная ограниченная выдача) и «разрешать каждое вхождение» (слово команды переносится на постоянной основе в белый список rulesFile)",
|
|
789
|
+
"card.strategy.llmAssist": "llmAssist — пользовательская LLM оценивает риск: safe пропускается автоматически; жёсткие риски deletion/credential/remote/system/bulk остаются на подтверждении человеком (классификатор никогда не отказывает — только эскалирует); neutral уходит в обучение по подтверждениям; сбой/тайм-аут возвращается человеку",
|
|
790
|
+
"card.strategy.trustEscalation": "trustEscalation — расширение песочницы без запроса: для вызова, который шлюз уже пропустил, расширение песочницы, запрашиваемое инструментом shell / pwsh / edit изнутри, одобряется здесь, а не вопросом вам",
|
|
791
|
+
"card.strategy.trustEscalationHint": "Запрос расширения песочницы возникает внутри тела инструмента, после tools/pre-execute, поэтому шлюз его не видел — вызов, оценённый LLM как safe и пропущенный автоматически, всё равно спрашивал у вас одобрения расширения. При включении запрос пропускает только тот точный вызов, который шлюз пропустил (точное совпадение по callId); всё остальное идёт человеку как раньше — как и нераспознанная причина или цель, отличная от workspace-write / danger-full-access. Выключите, чтобы оставить расширение под контролем человека.",
|
|
792
|
+
"card.readonly": "Только чтение",
|
|
793
|
+
"card.unavailable": "Пространство имён настроек недоступно: убедитесь, что dsh-perm-gate собран в этот профиль.",
|
|
794
|
+
"card.llmReceiver": "Принимающая LLM для llmAssist (совместимая с OpenAI; любой свой API)",
|
|
795
|
+
"card.llmEndpoint": "Endpoint (BaseURL, напр. https://api.openai.com/v1)",
|
|
796
|
+
"card.llmModel": "Model (id модели, напр. deepseek-chat)",
|
|
797
|
+
"card.llmKey": "API-ключ (секрет)",
|
|
798
|
+
"card.llmKeyHidden": "Не задан · после первого ввода отображается как *",
|
|
799
|
+
"card.llmKeyMasked": "Задан · введите новое значение, чтобы перезаписать",
|
|
800
|
+
"card.llmKeyOverwrite": "Секрет сохранён; введите новое значение и уберите фокус, чтобы перезаписать.",
|
|
801
|
+
"card.llmKeyClear": "Очистить",
|
|
802
|
+
"card.allowlist": "Белый список (allow, синхронизируется с rulesFile)",
|
|
803
|
+
"card.allowlistHint": "Шаблоны из секции allow пропускают напрямую; добавляйте и удаляйте записи по одной — запись идёт в rulesFile и перезагружается на лету.",
|
|
804
|
+
"card.allowlistPresetNote": "Эквивалент предустановленного белого списка — стратегия trustAutoAllow (безопасные операции в области пропускаются автоматически), включается в блоке стратегий выше; этот список отражает секцию allow вашего rulesFile и поначалу пуст — это нормально.",
|
|
805
|
+
"card.allowlistEmpty": "Нет правил белого списка",
|
|
806
|
+
"card.allowlistPlaceholder": "Новый шаблон команды, напр. npm test*",
|
|
807
|
+
"card.allowlistAdd": "Добавить",
|
|
808
|
+
"card.allowlistRemove": "Удалить этот шаблон",
|
|
809
|
+
"card.allowlistBulk": "Массовое редактирование",
|
|
810
|
+
"card.allowlistBulkHide": "Свернуть массовое редактирование",
|
|
811
|
+
"card.allowlistSave": "Сохранить белый список",
|
|
812
|
+
"card.riskLearning": "riskLearning — обучение вердиктам: запросы риска neutral, подтверждённые и исполненные человеком, считаются; та же операция при достижении порога с совпадающим отпечатком пропускается автоматически",
|
|
813
|
+
"card.riskLearningHint": "Состояние обучения принадлежит плагину ($DSH_HOME/perm-gate/learning.json) и никогда не пишется в ваши YAML-правила; другая цель никогда не переиспользует разрешение. По умолчанию выключено.",
|
|
814
|
+
"card.riskThreshold": "Подтверждений человека до автопропуска (1–10)",
|
|
815
|
+
"notice.label": "Активность шлюза прав",
|
|
816
|
+
"history.label": "Одобрения",
|
|
817
|
+
"history.title": "Журнал одобрений прав",
|
|
818
|
+
"history.subtitle": "Каждое решение шлюза в этом разговоре, новые сверху",
|
|
819
|
+
"history.loading": "Загрузка…",
|
|
820
|
+
"history.empty": "В этой сессии пока нет одобрений",
|
|
821
|
+
"history.error": "Не удалось загрузить: ",
|
|
822
|
+
"history.tag.auto": "Автопропуск",
|
|
823
|
+
"history.tag.ask": "Спрошено",
|
|
824
|
+
"history.tag.deny": "Отказано",
|
|
825
|
+
"card.denylistRestore": "Вернуть предустановленный чёрный список",
|
|
826
|
+
"card.denylist": "Чёрный список (ключевые слова deny, предустановка плагина)",
|
|
827
|
+
"card.denylistHint": "Вызов, чей текст содержит ключевое слово (подстрока без учёта регистра), отклоняется сразу — до белого списка / выдач / LLM. Предустановка унаследована от dsh-approval-gate и активна с установки; правьте свободно — пустой или очищенный список возвращается к предустановке (есть восстановление в один клик), поэтому чёрный список никогда не выключается молча.",
|
|
828
|
+
"card.denylistEmpty": "Чёрный список пуст (ни один вызов не отклоняется слоем ключевых слов)",
|
|
829
|
+
"card.denylistPlaceholder": "Новое ключевое слово, напр. drop database",
|
|
830
|
+
"card.denylistAdd": "Добавить",
|
|
831
|
+
"card.denylistRemove": "Удалить это ключевое слово",
|
|
832
|
+
"card.denylistTagPreset": "Предустановка",
|
|
833
|
+
"card.denylistTagCustom": "Своё",
|
|
834
|
+
"card.riskSediment": "riskSediment — осаждение обучения: образцы, достигшие порога, становятся детерминированными автопропусками",
|
|
835
|
+
"card.riskSedimentHint": "При включении, когда ключ tool|category достигает порога, отпечатки его образцов оседают в правила пропуска — точное совпадение тот же инструмент/та же цель пропускает без нового вызова LLM (работает и при выключенном llmAssist).",
|
|
836
|
+
"card.sediment": "Осадок обучения (детерминированные правила пропуска)",
|
|
837
|
+
"card.sedimentHint": "Правила, осевшие из человеческих подтверждений: пропускает только точное совпадение отпечатка, другая цель — никогда. Можно завершить одно обучение или удалить один образец.",
|
|
838
|
+
"card.sedimentEmpty": "Осевших правил пока нет (образцы, достигшие порога, появятся здесь)",
|
|
839
|
+
"card.sedimentCount": "подтверждено %n/%t",
|
|
840
|
+
"card.sedimentStop": "Завершить",
|
|
841
|
+
"card.sedimentStopTitle": "Завершить это обучение (счётчик и образцы будут удалены)",
|
|
842
|
+
"card.sedimentStopConfirm": "Завершить обучение для «%k»? Счётчик и все образцы будут удалены.",
|
|
843
|
+
"card.sedimentSampleRemove": "Удалить этот осевший образец",
|
|
844
|
+
"card.llmSource": "Источник принимающей LLM",
|
|
845
|
+
"card.llmSourceCustom": "Свой API (совместимый с OpenAI)",
|
|
846
|
+
"card.llmSourceHost": "Использовать текущую модель по умолчанию сессии (сервис llm DSH)",
|
|
847
|
+
"card.llmSourceHostHint": "По умолчанию оценка одобрения идёт на группе моделей, которую сессия DSH использует сейчас (действующее значение показано ниже); оставьте Provider / Model пустыми, чтобы следовать за сессией, или выберите из списка либо введите своё — настроенные в DSH свои группы (напр. local-35b) появляются автоматически.",
|
|
848
|
+
"card.llmProvider": "Provider (пусто = следовать выбору сессии)",
|
|
849
|
+
"card.llmProviderPlaceholder": "Следовать выбору сессии",
|
|
850
|
+
"card.llmModelHostPlaceholder": "Пусто = следовать выбору сессии",
|
|
851
|
+
"card.llmResolved": "Действует сейчас: %p / %m",
|
|
852
|
+
"card.llmPreset": "Предустановки endpoint (заполняют поля; можно править)",
|
|
853
|
+
"card.llmPresetChoose": "Выбрать предустановку…",
|
|
854
|
+
"card.llmPresetPublic": "Предустановки публичных API",
|
|
855
|
+
"card.llmPresetHost": "Группы моделей DSH (выбор переключает на сессионный приёмник)",
|
|
856
|
+
"card.networkEnabled": "Перехват сети (networkEnabled)",
|
|
857
|
+
"card.networkEnabledHint": "При включении запускается локальный прокси, перехватывающий исходящие соединения подпроцессов и применяющий правила allow/deny. Выключено — поведение не меняется.",
|
|
858
|
+
"card.watch": "Горячая перезагрузка правил (watch)",
|
|
859
|
+
"card.watchHint": "При включении файлы правил отслеживаются автоматически, изменения применяются мгновенно, без ручной перезагрузки.",
|
|
860
|
+
"card.networkRebindNote": "Вступает в силу сразу — прокси перепривязывается сам, перезагрузка плагина не нужна.",
|
|
861
|
+
"card.networkInjectEnv": "Ввод переменных окружения прокси (networkInjectEnv)",
|
|
862
|
+
"card.networkInjectEnvHint": "Записывает подпроцессам HTTP(S)_PROXY / ALL_PROXY (и очищает NO_PROXY). Выключено — слушатель работает, но окружение процессов не меняется.",
|
|
863
|
+
"card.healthStale": "Маршрут хоста недоступен (404) — node-половина всё ещё старой сборки; полностью перезапустите dsh (а не только страницу браузера) и повторите.",
|
|
864
|
+
"card.healthTest": "Проверка здоровья",
|
|
865
|
+
"card.healthRunning": "Проверка…",
|
|
866
|
+
"card.healthOk": "OK (%ms ms)",
|
|
867
|
+
"card.healthFail": "Не удалось: ",
|
|
868
|
+
"history.tag.learned": "Выучено",
|
|
869
|
+
"history.tag.manualApproved": "Одобрено",
|
|
870
|
+
"history.tag.manualRejected": "Отклонено",
|
|
871
|
+
"history.tag.manualCancelled": "Отменено",
|
|
872
|
+
"history.tag.standDown": "Шлюз отключён",
|
|
873
|
+
"history.learnedProgress": "выучено %n/%t",
|
|
874
|
+
"history.snapshots": "diff-снимки",
|
|
875
|
+
"history.clearSession": "Очистить эту сессию",
|
|
876
|
+
"history.clearAll": "Очистить всё",
|
|
877
|
+
"history.clearSessionTitle": "Очистить diff-снимки только этой сессии (другие сессии не затронуты)",
|
|
878
|
+
"history.clearAllTitle": "Очистить diff-снимки всех сессий, включая непросмотренные — потребуется повторное подтверждение",
|
|
879
|
+
"history.clearSessionConfirm": "Очистить diff-снимки этой сессии? Удаляются только данные сравнения, порождённые одобрениями этой сессии; сами записи одобрений остаются.",
|
|
880
|
+
"history.clearAllConfirm": "Очистить diff-снимки ВСЕХ сессий? Это может удалить сравнения, которые другие сессии ещё не просмотрели, и отменить это нельзя.",
|
|
881
|
+
"history.diffTitle": "Сравнение изменений файлов",
|
|
882
|
+
"history.diffClose": "Закрыть",
|
|
883
|
+
"history.diffLoading": "Загрузка…",
|
|
884
|
+
"history.diffEmpty": "Изменений содержимого нет (или файл не читается)",
|
|
885
|
+
"history.diffLoadFail": "Не удалось загрузить diff: ",
|
|
886
|
+
"history.diffRevert": "Отменить это изменение",
|
|
887
|
+
"history.diffReverting": "Отправка…",
|
|
888
|
+
"history.diffRevertDone": "Инструкция отмены отправлена",
|
|
889
|
+
"history.diffRevertSent": "Инструкция отмены отправлена в разговор; ИИ восстановит файл по инструкции",
|
|
890
|
+
"history.diffRevertFail": "Не удалось отправить: ",
|
|
891
|
+
"history.diffNoSnapshot": "У этого события нет снимка для этого файла",
|
|
892
|
+
"history.diffChipTitle": "Посмотреть сравнение изменений этого файла",
|
|
893
|
+
"history.diffStats": "+%a / -%r строк изменено · %c без изменений",
|
|
894
|
+
"history.diffGone": " (файла больше нет)",
|
|
895
|
+
"history.diffHidden": "%n неизменённых строк",
|
|
896
|
+
"card.dryRun": "Тест правил",
|
|
897
|
+
"card.dryRunHint": "Оценивает один вызов по действующим правилам. Инструмент не запускает и правил не пишет — проверьте правило здесь, прежде чем менять.",
|
|
898
|
+
"card.dryRunTool": "Инструмент",
|
|
899
|
+
"card.dryRunCommand": "Команда / аргументы",
|
|
900
|
+
"card.dryRunCommandPlaceholder": "git push --force origin main",
|
|
901
|
+
"card.dryRunTest": "Тест",
|
|
902
|
+
"card.dryRunRunning": "Оценка…",
|
|
903
|
+
"card.dryRunEmpty": "Пока ничего не тестировалось. Введите инструмент и команду и нажмите «Тест», чтобы увидеть вердикт.",
|
|
904
|
+
"card.dryRunVerdict": "Вердикт",
|
|
905
|
+
"card.dryRunAllow": "пропустить",
|
|
906
|
+
"card.dryRunAsk": "спросить",
|
|
907
|
+
"card.dryRunDeny": "отказать",
|
|
908
|
+
"card.dryRunRule": "Сработавшее правило",
|
|
909
|
+
"card.dryRunRuleNone": "правило не сработало; defaultAction: %d",
|
|
910
|
+
"card.dryRunDimensions": "Измерения",
|
|
911
|
+
"card.dryRunReason": "Причина",
|
|
912
|
+
"card.dryRunNote": "«Сработавшее правило» приходит из слоя правил. Если вердикт вынесен более ранним жёстким отказом или чёрным списком ключевых слов, номера правила нет — перечисленные измерения тогда носят справочный характер.",
|
|
913
|
+
"card.dryRunNoRules": "(загружено 0 правил — проверьте путь rulesFile)",
|
|
914
|
+
"card.dryRunFail": "Тест не удался: ",
|
|
915
|
+
"card.dryRunStale": "маршрута нет (плагин не перезапущен?)",
|
|
916
|
+
"card.rules": "Встроенные правила Settings",
|
|
917
|
+
"card.rulesHint": "Правила, которые шлюз загружает прямо сейчас (из поля конфигурации `rules` этого плагина; без настройки берётся файл правил). Только чтение — здесь ничего не изменить. Меняйте правила через белый список ниже или на странице настроек.",
|
|
918
|
+
"card.rulesRefresh": "Обновить",
|
|
919
|
+
"card.rulesLoading": "Чтение…",
|
|
920
|
+
"card.rulesPath": "Источник",
|
|
921
|
+
"card.rulesNone": "правила не настроены",
|
|
922
|
+
"card.rulesCounts": "Правил",
|
|
923
|
+
"card.rulesDefault": "defaultAction",
|
|
924
|
+
"card.rulesStats": "%b байт · %l строк",
|
|
925
|
+
"card.rulesMissing": "Правила не найдены. Шлюз вернётся к встроенным значениям по умолчанию.",
|
|
926
|
+
"card.rulesTruncated": "Правила велики; показаны первые 512 КБ.",
|
|
927
|
+
"card.rulesError": "Не удалось загрузить: ",
|
|
928
|
+
"card.rulesStale": "маршрута нет (плагин не перезапущен?)",
|
|
929
|
+
"card.rulesNote": "Только чтение: эта панель не может менять правила. Секция белого списка и «всегда разрешать» записываются обратно в конфигурацию входа этого плагина."
|
|
930
|
+
};
|
|
931
|
+
/** Spanish dictionary (keys mirror zh). */
|
|
932
|
+
const es = {
|
|
933
|
+
"card.title": "自动审查 (Revisión automática)",
|
|
934
|
+
"section.title": "Compuerta de revisión automática",
|
|
935
|
+
"card.description": "Nivel de aprobación independiente, paralelo a read-only / full-access / whitelist, mostrado como 自动审查 en el selector de permisos de sesión. El frontal expone un único interruptor; las cuatro estrategias de aprobación del backend son combinables desde este panel y siguen siendo fail-closed frente al rechazo duro P0.",
|
|
936
|
+
"card.permissive": "Activar el nivel 自动审查",
|
|
937
|
+
"card.permissiveHint": "Apagada, la compuerta se comporta exactamente igual que antes.",
|
|
938
|
+
"card.scopeNote": "Ámbito del preajuste: esta compuerta solo actúa cuando el preajuste de permisos de sesión es %scope. Con cualquier otro preajuste toda la compuerta se retira — rechazo duro P0 incluido — y toma el mando la política del preajuste elegido. Un retiro registra un evento y deja una franja permanente sobre el campo de entrada.",
|
|
939
|
+
"card.strategies": "Estrategias de aprobación del backend (al menos una vigente; combinables)",
|
|
940
|
+
"card.strategy.trustAutoAllow": "trustAutoAllow — las operaciones seguras dentro del ámbito se permiten automáticamente; las peligrosas/desconocidas preguntan (línea base del nivel intermedio)",
|
|
941
|
+
"card.strategy.alwaysConfirm": "alwaysConfirm — cada paso pregunta; los «controles de permiso» del panel de aprobación ganan dos botones ampliados: «volver a permitir este tipo en esta sesión» (concesión limitada a la sesión) y «permitir cada aparición» (la palabra del comando se persiste en la whitelist del rulesFile)",
|
|
942
|
+
"card.strategy.llmAssist": "llmAssist — un LLM personalizado gradúa el riesgo: safe se permite automáticamente; los riesgos duros deletion/credential/remote/system/bulk mantienen la confirmación humana (el clasificador nunca niega — solo escala); neutral entra en aprendizaje por confirmación; fallo/timeout vuelve al humano",
|
|
943
|
+
"card.strategy.trustEscalation": "trustEscalation — ampliación de sandbox sin prompt: para una llamada que esta compuerta ya permitió, la ampliación de sandbox que una herramienta shell / pwsh / edit pide desde su interior se aprueba aquí en lugar de preguntarte",
|
|
944
|
+
"card.strategy.trustEscalationHint": "Una petición de ampliación de sandbox se emite desde dentro del cuerpo de la herramienta, tras tools/pre-execute, así que la compuerta nunca la vio — una llamada que el LLM gradúo como safe y se permitió automáticamente igual te pedía aprobar la ampliación. Activada, solo la llamada exacta que la compuerta permitió (coincidencia exacta por callId) se salta el prompt; todo lo demás pasa por el humano como antes, igual que una razón no reconocida o un destino distinto de workspace-write / danger-full-access. Desactívala para dejar la ampliación bajo control humano.",
|
|
945
|
+
"card.readonly": "Solo lectura",
|
|
946
|
+
"card.unavailable": "Namespace de ajustes no disponible: asegúrate de que dsh-perm-gate está ensamblado en este perfil.",
|
|
947
|
+
"card.llmReceiver": "LLM receptor de llmAssist (compatible con OpenAI; cualquier API propia)",
|
|
948
|
+
"card.llmEndpoint": "Endpoint (BaseURL, p. ej. https://api.openai.com/v1)",
|
|
949
|
+
"card.llmModel": "Model (id del modelo, p. ej. deepseek-chat)",
|
|
950
|
+
"card.llmKey": "API Key (secreta)",
|
|
951
|
+
"card.llmKeyHidden": "Sin definir · se muestra como * tras la primera entrada",
|
|
952
|
+
"card.llmKeyMasked": "Definida · escribe un valor nuevo para sobrescribirla",
|
|
953
|
+
"card.llmKeyOverwrite": "Hay un secreto guardado; escribe un valor nuevo y pierde el foco para sobrescribirlo.",
|
|
954
|
+
"card.llmKeyClear": "Borrar",
|
|
955
|
+
"card.allowlist": "Whitelist (allow, sincronizada con rulesFile)",
|
|
956
|
+
"card.allowlistHint": "Los patrones de la sección allow permiten directamente; añade o elimina entradas una a una, se escriben en el rulesFile y se recargan en vivo.",
|
|
957
|
+
"card.allowlistPresetNote": "El equivalente de la whitelist preajustada es la estrategia trustAutoAllow (operaciones seguras del ámbito se permiten automáticamente), activable en la sección de estrategias de arriba; esta lista refleja la sección allow de tu rulesFile y es normal que empiece vacía.",
|
|
958
|
+
"card.allowlistEmpty": "Sin reglas de whitelist",
|
|
959
|
+
"card.allowlistPlaceholder": "Nuevo patrón de comando, p. ej. npm test*",
|
|
960
|
+
"card.allowlistAdd": "Añadir",
|
|
961
|
+
"card.allowlistRemove": "Eliminar este patrón",
|
|
962
|
+
"card.allowlistBulk": "Edición en bloque",
|
|
963
|
+
"card.allowlistBulkHide": "Ocultar la edición en bloque",
|
|
964
|
+
"card.allowlistSave": "Guardar la whitelist",
|
|
965
|
+
"card.riskLearning": "riskLearning — aprendizaje de veredictos: las peticiones de riesgo neutral aprobadas y ejecutadas por el humano cuentan; la misma operación se auto-permite al umbral con huella coincidente",
|
|
966
|
+
"card.riskLearningHint": "El estado de aprendizaje son datos del plugin ($DSH_HOME/perm-gate/learning.json) y nunca se escribe en tus reglas YAML; un destino distinto nunca reutiliza una autoridad. Desactivado por defecto.",
|
|
967
|
+
"card.riskThreshold": "Confirmaciones humanas necesarias antes del permiso automático (1–10)",
|
|
968
|
+
"notice.label": "Actividad de la compuerta de permisos",
|
|
969
|
+
"history.label": "Aprobaciones",
|
|
970
|
+
"history.title": "Registros de aprobación de permisos",
|
|
971
|
+
"history.subtitle": "Cada decisión de la compuerta en esta conversación, la más reciente primero",
|
|
972
|
+
"history.loading": "Cargando…",
|
|
973
|
+
"history.empty": "Aún no hay aprobaciones en esta sesión",
|
|
974
|
+
"history.error": "Error al cargar: ",
|
|
975
|
+
"history.tag.auto": "Auto-permitido",
|
|
976
|
+
"history.tag.ask": "Preguntado",
|
|
977
|
+
"history.tag.deny": "Denegado",
|
|
978
|
+
"card.denylistRestore": "Restaurar la blacklist preajustada",
|
|
979
|
+
"card.denylist": "Blacklist (palabras clave deny, preajuste del plugin)",
|
|
980
|
+
"card.denylistHint": "Una llamada cuyo texto contiene una palabra clave (subcadena sin distinguir mayúsculas) se deniega de plano, antes de whitelist / concesiones / LLM. La lista preajustada se hereda de dsh-approval-gate y está activa desde la instalación; edítala con libertad — vacía o vaciada vuelve al preajuste (restauración de un clic disponible), así la blacklist nunca se apaga en silencio.",
|
|
981
|
+
"card.denylistEmpty": "Blacklist vacía (ninguna llamada es vetada por la capa de palabras clave)",
|
|
982
|
+
"card.denylistPlaceholder": "Nueva palabra clave, p. ej. drop database",
|
|
983
|
+
"card.denylistAdd": "Añadir",
|
|
984
|
+
"card.denylistRemove": "Eliminar esta palabra clave",
|
|
985
|
+
"card.denylistTagPreset": "Preajuste",
|
|
986
|
+
"card.denylistTagCustom": "Personalizado",
|
|
987
|
+
"card.riskSediment": "riskSediment — sedimentación del aprendizaje: las muestras que llegan al umbral se vuelven permisos deterministas",
|
|
988
|
+
"card.riskSedimentHint": "Activada, cuando una clave tool|category alcanza el umbral las huellas de sus muestras se sedimentan en reglas de permiso — una coincidencia exacta misma herramienta/mismo destino permite sin otra llamada al LLM (sigue funcionando con llmAssist apagado).",
|
|
989
|
+
"card.sediment": "Sedimento de aprendizaje (reglas de permiso deterministas)",
|
|
990
|
+
"card.sedimentHint": "Reglas sedimentadas de confirmaciones humanas: solo una coincidencia exacta de huella permite, jamás un destino distinto. Puedes terminar un aprendizaje o eliminar una muestra.",
|
|
991
|
+
"card.sedimentEmpty": "Aún no hay reglas sedimentadas (las muestras que llegan al umbral aparecen aquí)",
|
|
992
|
+
"card.sedimentCount": "confirmadas %n/%t",
|
|
993
|
+
"card.sedimentStop": "Terminar",
|
|
994
|
+
"card.sedimentStopTitle": "Terminar este aprendizaje (borra el conteo y las muestras)",
|
|
995
|
+
"card.sedimentStopConfirm": "¿Terminar el aprendizaje de «%k»? Se borrarán su conteo y todas sus muestras.",
|
|
996
|
+
"card.sedimentSampleRemove": "Eliminar esta muestra sedimentada",
|
|
997
|
+
"card.llmSource": "Fuente del receptor",
|
|
998
|
+
"card.llmSourceCustom": "API propia (compatible con OpenAI)",
|
|
999
|
+
"card.llmSourceHost": "Usar el modelo por defecto actual de la sesión (servicio llm de DSH)",
|
|
1000
|
+
"card.llmSourceHostHint": "Por defecto la graduación de aprobación corre sobre el grupo de modelos que la sesión DSH usa ahora (el valor efectivo se muestra abajo); deja Provider / Model vacíos para seguir la sesión, o elige del desplegable o escribe para fijar uno — tus grupos personalizados configurados en DSH (p. ej. local-35b) aparecen automáticamente.",
|
|
1001
|
+
"card.llmProvider": "Provider (vacío = seguir la selección de la sesión)",
|
|
1002
|
+
"card.llmProviderPlaceholder": "Seguir la selección de la sesión",
|
|
1003
|
+
"card.llmModelHostPlaceholder": "Vacío = seguir la selección de la sesión",
|
|
1004
|
+
"card.llmResolved": "Vigente ahora: %p / %m",
|
|
1005
|
+
"card.llmPreset": "Preajustes de endpoint (rellena los campos; sigue siendo editable)",
|
|
1006
|
+
"card.llmPresetChoose": "Elegir un preajuste…",
|
|
1007
|
+
"card.llmPresetPublic": "Preajustes de API públicas",
|
|
1008
|
+
"card.llmPresetHost": "Grupos de modelos DSH (seleccionar uno cambia al receptor de sesión)",
|
|
1009
|
+
"card.networkEnabled": "Intercepción de red (networkEnabled)",
|
|
1010
|
+
"card.networkEnabledHint": "Activada, arranca un proxy local que intercepta las conexiones salientes de los subprocesos y aplica reglas allow/deny. Apagada = cero cambio de comportamiento.",
|
|
1011
|
+
"card.watch": "Recarga en caliente de reglas (watch)",
|
|
1012
|
+
"card.watchHint": "Activada, vigila automáticamente los archivos de reglas y aplica los cambios al instante, sin recarga manual.",
|
|
1013
|
+
"card.networkRebindNote": "Surte efecto al instante — el proxy se reconecta solo, sin recargar el plugin.",
|
|
1014
|
+
"card.networkInjectEnv": "Inyectar variables de entorno del proxy (networkInjectEnv)",
|
|
1015
|
+
"card.networkInjectEnvHint": "Escribe HTTP(S)_PROXY / ALL_PROXY para los subprocesos (y limpia NO_PROXY). Apagada = el listener corre pero no cambia ningún entorno de proceso.",
|
|
1016
|
+
"card.healthStale": "Ruta del host no disponible (404) — la mitad node sigue siendo una build antigua; reinicia dsh por completo (no solo la página del navegador) y reintenta.",
|
|
1017
|
+
"card.healthTest": "Prueba de salud",
|
|
1018
|
+
"card.healthRunning": "Probando…",
|
|
1019
|
+
"card.healthOk": "OK (%ms ms)",
|
|
1020
|
+
"card.healthFail": "Falló: ",
|
|
1021
|
+
"history.tag.learned": "Aprendido",
|
|
1022
|
+
"history.tag.manualApproved": "Aprobado",
|
|
1023
|
+
"history.tag.manualRejected": "Rechazado",
|
|
1024
|
+
"history.tag.manualCancelled": "Cancelado",
|
|
1025
|
+
"history.tag.standDown": "Compuerta desactivada",
|
|
1026
|
+
"history.learnedProgress": "aprendido %n/%t",
|
|
1027
|
+
"history.snapshots": "instantáneas diff",
|
|
1028
|
+
"history.clearSession": "Vaciar esta sesión",
|
|
1029
|
+
"history.clearAll": "Vaciar todo",
|
|
1030
|
+
"history.clearSessionTitle": "Vaciar solo las instantáneas diff de esta sesión (las demás sesiones quedan intactas)",
|
|
1031
|
+
"history.clearAllTitle": "Vaciar las instantáneas diff de todas las sesiones, incluidas las nunca revisadas — pide una segunda confirmación",
|
|
1032
|
+
"history.clearSessionConfirm": "¿Vaciar las instantáneas diff de esta sesión? Solo se eliminan los datos de comparación producidos por las aprobaciones de esta sesión; los registros de aprobación quedan.",
|
|
1033
|
+
"history.clearAllConfirm": "¿Vaciar las instantáneas diff de TODAS las sesiones? Esto puede borrar comparaciones que otras sesiones aún no han visto, y no se puede deshacer.",
|
|
1034
|
+
"history.diffTitle": "Comparación de cambios de archivos",
|
|
1035
|
+
"history.diffClose": "Cerrar",
|
|
1036
|
+
"history.diffLoading": "Cargando…",
|
|
1037
|
+
"history.diffEmpty": "Sin cambios de contenido (o el archivo no se puede leer)",
|
|
1038
|
+
"history.diffLoadFail": "Error al cargar el diff: ",
|
|
1039
|
+
"history.diffRevert": "Deshacer este cambio",
|
|
1040
|
+
"history.diffReverting": "Enviando…",
|
|
1041
|
+
"history.diffRevertDone": "Instrucción de reversión enviada",
|
|
1042
|
+
"history.diffRevertSent": "Instrucción de reversión enviada a la conversación; la IA restaurará el archivo según la instrucción",
|
|
1043
|
+
"history.diffRevertFail": "Error al enviar: ",
|
|
1044
|
+
"history.diffNoSnapshot": "Este evento no tiene instantánea para ese archivo",
|
|
1045
|
+
"history.diffChipTitle": "Ver la comparación de cambios de este archivo",
|
|
1046
|
+
"history.diffStats": "+%a / -%r líneas cambiadas · %c sin cambios",
|
|
1047
|
+
"history.diffGone": " (el archivo ya no existe)",
|
|
1048
|
+
"history.diffHidden": "%n líneas sin modificar",
|
|
1049
|
+
"card.dryRun": "Prueba de reglas",
|
|
1050
|
+
"card.dryRunHint": "Juzga una llamada contra las reglas vigentes. No ejecuta ninguna herramienta ni escribe ninguna regla — comprueba una regla aquí antes de cambiarla.",
|
|
1051
|
+
"card.dryRunTool": "Herramienta",
|
|
1052
|
+
"card.dryRunCommand": "Comando / argumentos",
|
|
1053
|
+
"card.dryRunCommandPlaceholder": "git push --force origin main",
|
|
1054
|
+
"card.dryRunTest": "Probar",
|
|
1055
|
+
"card.dryRunRunning": "Juzgando…",
|
|
1056
|
+
"card.dryRunEmpty": "Nada probado todavía. Rellena herramienta y comando y pulsa Probar para ver cómo se juzgaría.",
|
|
1057
|
+
"card.dryRunVerdict": "Veredicto",
|
|
1058
|
+
"card.dryRunAllow": "permitir",
|
|
1059
|
+
"card.dryRunAsk": "preguntar",
|
|
1060
|
+
"card.dryRunDeny": "denegar",
|
|
1061
|
+
"card.dryRunRule": "Regla coincidente",
|
|
1062
|
+
"card.dryRunRuleNone": "ninguna regla coincidió; defaultAction: %d",
|
|
1063
|
+
"card.dryRunDimensions": "Dimensiones",
|
|
1064
|
+
"card.dryRunReason": "Motivo",
|
|
1065
|
+
"card.dryRunNote": "«Regla coincidente» viene de la capa de reglas. Cuando el veredicto lo produce un rechazo duro anterior o la blacklist de palabras clave no hay índice de regla — las dimensiones listadas son entonces solo orientativas.",
|
|
1066
|
+
"card.dryRunNoRules": "(0 reglas cargadas — revisa la ruta del rulesFile)",
|
|
1067
|
+
"card.dryRunFail": "La prueba falló: ",
|
|
1068
|
+
"card.dryRunStale": "ruta inexistente (¿plugin sin reiniciar?)",
|
|
1069
|
+
"card.rules": "Reglas integradas de Settings",
|
|
1070
|
+
"card.rulesHint": "Las reglas que la compuerta carga ahora mismo (del campo de configuración `rules` de la entrada de este plugin; sin configurar recurre al archivo de reglas). Solo lectura — aquí no se puede cambiar nada. Para cambiar reglas usa la whitelist de abajo o la página de ajustes.",
|
|
1071
|
+
"card.rulesRefresh": "Actualizar",
|
|
1072
|
+
"card.rulesLoading": "Leyendo…",
|
|
1073
|
+
"card.rulesPath": "Origen",
|
|
1074
|
+
"card.rulesNone": "sin reglas configuradas",
|
|
1075
|
+
"card.rulesCounts": "Reglas",
|
|
1076
|
+
"card.rulesDefault": "defaultAction",
|
|
1077
|
+
"card.rulesStats": "%b bytes · %l líneas",
|
|
1078
|
+
"card.rulesMissing": "Reglas no encontradas. La compuerta vuelve a sus valores integrados por defecto.",
|
|
1079
|
+
"card.rulesTruncated": "Reglas grandes; se muestran solo los primeros 512 KB.",
|
|
1080
|
+
"card.rulesError": "Error al cargar: ",
|
|
1081
|
+
"card.rulesStale": "ruta inexistente (¿plugin sin reiniciar?)",
|
|
1082
|
+
"card.rulesNote": "Solo lectura: este panel no puede modificar las reglas. La sección whitelist y «permitir siempre» se escriben de vuelta en la configuración de entrada de este plugin."
|
|
1083
|
+
};
|
|
319
1084
|
//#endregion
|
|
320
1085
|
//#region src/deny-defaults.ts
|
|
321
1086
|
/**
|
|
@@ -3165,10 +3930,20 @@ window.__ModuleLoader__.load({
|
|
|
3165
3930
|
* @param ctx - client root context.
|
|
3166
3931
|
*/
|
|
3167
3932
|
function apply(ctx) {
|
|
3168
|
-
ctx.effect(() =>
|
|
3169
|
-
|
|
3170
|
-
|
|
3171
|
-
|
|
3933
|
+
ctx.effect(() => {
|
|
3934
|
+
const disposers = [
|
|
3935
|
+
ctx.locale.register(NS, {
|
|
3936
|
+
zh,
|
|
3937
|
+
en
|
|
3938
|
+
}),
|
|
3939
|
+
ctx.locale.register(NS, "fr", fr),
|
|
3940
|
+
ctx.locale.register(NS, "de", de),
|
|
3941
|
+
ctx.locale.register(NS, "it", it),
|
|
3942
|
+
ctx.locale.register(NS, "ru", ru),
|
|
3943
|
+
ctx.locale.register(NS, "es", es)
|
|
3944
|
+
];
|
|
3945
|
+
return () => disposers.forEach((dispose) => dispose());
|
|
3946
|
+
}, "dsh-perm-gate: dictionaries");
|
|
3172
3947
|
ctx.slots.inject("conversation.input.dock", function* () {
|
|
3173
3948
|
yield ctx.slots.register({
|
|
3174
3949
|
name: "conversation.input.dock",
|
|
@@ -3201,6 +3976,14 @@ window.__ModuleLoader__.load({
|
|
|
3201
3976
|
}
|
|
3202
3977
|
}, PermissiveCard);
|
|
3203
3978
|
});
|
|
3979
|
+
ctx.slots.inject("plugins.bundle.config", () => ctx.slots.register({
|
|
3980
|
+
name: "plugins.bundle.config",
|
|
3981
|
+
key: "dsh-perm-gate",
|
|
3982
|
+
locale: NS,
|
|
3983
|
+
inject: () => {
|
|
3984
|
+
return { scope: ctx.configForms.get(PERMISSIVE_NS) };
|
|
3985
|
+
}
|
|
3986
|
+
}, PermissiveCard));
|
|
3204
3987
|
}
|
|
3205
3988
|
//#endregion
|
|
3206
3989
|
exports.apply = apply;
|