@parallel-cli/parallel 0.3.3 → 0.4.1

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/dist/i18n.js CHANGED
@@ -119,11 +119,32 @@ const en = {
119
119
  'help.states': 'States: 🔨 working · 👂 listening to other agents (double border) · 🧠 thinking · ✋ waiting for your approval · ⏹ stop. Sounds: 1 beep = agent launched/finished, 2 beeps = approval required (/sound off to mute).',
120
120
  'help.keys': 'Esc: back to agents view · Tab: completion · ↑/↓: history · Ctrl+V: paste image',
121
121
  // commands (descriptions)
122
- 'cmd.spawn': 'Launch agent N+1 (same as: type the task + Enter)',
122
+ 'cmd.ask': 'Ask-only agent: answers and advises without editing',
123
+ 'cmd.task': 'Task agent: executes, edits, validates, summarizes',
123
124
  'cmd.agents': 'Agents panel view (real time)',
124
125
  'cmd.board': 'Coordination view: who works where, notes',
125
126
  'cmd.notes': 'Inter-agent notes history',
126
127
  'cmd.diff': 'Live file diffs',
128
+ 'cmd.status': 'Show session status: model, agents, changes, cost',
129
+ 'cmd.raw': 'Toggle raw activity detail in focus view',
130
+ 'cmd.copy': 'Copy the latest completed agent result',
131
+ 'timeline.activity': 'Activity',
132
+ 'timeline.raw': 'Raw activity',
133
+ 'timeline.empty': 'No activity yet.',
134
+ 'timeline.ran': 'Ran',
135
+ 'timeline.readFiles': 'Read {count} file(s)',
136
+ 'timeline.editedFiles': 'Edited {count} file(s)',
137
+ 'timeline.wroteFiles': 'Wrote {count} file(s)',
138
+ 'timeline.searched': 'Searched {count} target(s)',
139
+ 'timeline.listed': 'Listed {count} target(s)',
140
+ 'timeline.hiddenLines': '+{count} hidden line(s)',
141
+ 'timeline.section.inspect': 'Inspecting context',
142
+ 'timeline.section.change': 'Changing files',
143
+ 'timeline.section.validate': 'Validating',
144
+ 'timeline.section.publish': 'Publishing',
145
+ 'timeline.section.coordinate': 'Coordinating',
146
+ 'timeline.section.result': 'Result',
147
+ 'timeline.section.other': 'Activity',
127
148
  'cmd.send': 'Instruction to an agent (same as: @Agent message)',
128
149
  'cmd.pause': 'Pause',
129
150
  'cmd.resume': 'Resume',
@@ -134,7 +155,7 @@ const en = {
134
155
  'cmd.doctor': 'Check provider/model/API key configuration and repair hints',
135
156
  'cmd.settings': 'Global settings — providers, API keys, language, defaults (persisted)',
136
157
  'cmd.ssettings': 'Session settings — model, approvals, sound (this session only)',
137
- 'cmd.approvals': 'Shell command confirmation (this session)',
158
+ 'cmd.approvals': 'Shell approvals: ask, auto-safe, or yolo (this session)',
138
159
  'cmd.sound': 'Sound cues (this session)',
139
160
  'cmd.save': 'Save the session now (optionally with a name)',
140
161
  'cmd.focus': 'Focus one agent: plain text goes to it, full-width panel',
@@ -145,7 +166,8 @@ const en = {
145
166
  'cmd.quit': 'Quit (saves session, stops agents)',
146
167
  // command messages
147
168
  'm.spawned': '⚡ Agent {name} launched in parallel{model}.',
148
- 'm.usageSpawn': 'Usage: /spawn [Name:] <task> [--model=m]',
169
+ 'm.usageAsk': 'Usage: /ask [Name:] <question> [--model=m] — advisory only, no edits.',
170
+ 'm.usageSpawn': 'Usage: /task [Name:] <task> [--model=m]',
149
171
  'm.usageAt': 'Usage: @Agent <message> (or @all <message>)',
150
172
  'm.broadcast': '✉ Instruction broadcast to all agents.',
151
173
  'm.sent': '✉ Instruction sent to {target}.',
@@ -164,9 +186,10 @@ const en = {
164
186
  'm.model': 'Session model: {pm} (change: /model [provider:]model · global defaults: /settings)',
165
187
  'm.modelSet': 'Session model: {pm} (agents already running keep theirs)',
166
188
  'm.noProvider': 'Unknown provider: {name} (configured: {list})',
167
- 'm.usageApprovals': 'Usage: /approvals <ask|auto>',
168
- 'm.approvals': 'Approval mode (session): {mode}',
169
- 'm.approvalsWarn': ' ⚠ shell commands now run without confirmation',
189
+ 'm.usageApprovals': 'Usage: /approvals <ask|auto|auto-safe|yolo>',
190
+ 'm.approvals': 'Shell approvals (session): {mode}',
191
+ 'm.approvalsWarn': ' ⚠ safe shell commands now run without confirmation; risky commands still ask',
192
+ 'm.approvalsYoloWarn': ' ⚠ YOLO mode: all shell commands are auto-approved',
170
193
  'm.sound': 'Sound cues (session): {state}',
171
194
  'm.usageSound': 'Sound: {state} — usage: /sound <on|off>',
172
195
  'm.saved': '💾 Session saved.',
@@ -180,7 +203,7 @@ const en = {
180
203
  'm.noConversation': 'No saved conversation for "{name}" in the restored session.',
181
204
  'm.conflict': '⚠ {path}: repeated collisions between agents — consider arbitrating (@agent or /focus).',
182
205
  'status.bar': '⚡ {agents} agent(s) · {active} active · {cost}',
183
- 'cmd.plan': 'plan-first agent: presents its plan, edits only after your approval',
206
+ 'cmd.plan': 'Plan agent: presents its plan, edits only after your approval',
184
207
  'cmd.issue': 'spawn an agent on a GitHub issue (needs the gh CLI)',
185
208
  'cmd.undo': "revert the agent's last file change",
186
209
  'cmd.commit': 'git-commit the files touched by an agent (or all)',
@@ -209,13 +232,20 @@ const en = {
209
232
  'attach.placeholder': 'Message to {agent} (Enter to send, /quit to detach)…',
210
233
  'attach.waiting': 'Waiting for agent {agent}… (is the main Parallel session running?)',
211
234
  'attach.gone': 'Session ended — this terminal is detached.',
212
- 'attach.hint': ' /spawn <task> = NEW agent (own terminal) · plain text steers this agent · /quit detaches',
235
+ 'attach.hint': 'plain text steers this agent · /task creates a new agent · /ask asks · /plan plans · /quit detaches',
213
236
  'grid.above': '▲ {n} agent(s) above — PgUp',
214
237
  'grid.below': '▼ {n} agent(s) below — PgDn',
215
238
  'm.nothing': 'Nothing to save yet.',
216
239
  'm.usageKey': 'Usage: /key <API key>',
217
240
  'm.keySaved': 'API key saved for provider {name} (~/.parallel/config.json)',
218
241
  'm.cleared': 'Finished agents removed from display.',
242
+ 'm.clearedN': 'Removed {n} finished agent(s) from display.',
243
+ 'm.clearedNone': 'No finished agents to clear.',
244
+ 'm.status': 'Status\n Model {pm}\n Approvals {approval}\n Agents {total} total / {active} active\n Changed files {changed}\n Session cost ${cost}',
245
+ 'm.rawOn': 'Raw activity detail ON — raw agent logs visible in focus view.',
246
+ 'm.rawOff': 'Raw activity detail OFF.',
247
+ 'm.copyNone': 'No completed agent output to copy.',
248
+ 'm.copyDone': 'Copied latest result from {name}.',
219
249
  'm.unknown': 'Unknown command: {cmd} — type /help',
220
250
  'm.imagesIgnored': 'Note: attached images are only supported when launching a new agent.',
221
251
  'm.sessionRestored': '📂 Session from {date} restored.',
@@ -237,15 +267,17 @@ const en = {
237
267
  'set.modelsFor': 'Models for {name} — select one to make it the global default, or type a new model name',
238
268
  'set.makeDefault': 'make default',
239
269
  'set.addModelName': 'model name exactly as written in the provider docs',
240
- 'set.approvals': 'Default approval mode: {mode}',
270
+ 'set.approvals': 'Default shell approvals: {mode}',
241
271
  'set.sound': 'Default sound: {state}',
242
272
  'set.back': '← Back',
243
273
  'set.saved': '✓ Saved to ~/.parallel/config.json',
244
274
  'set.chooseProvider': 'Choose a provider',
245
275
  'set.chooseModel': 'Model ({name}) — pick or type a name from the provider docs',
246
276
  'sset.model': 'Session model: {pm}',
247
- 'sset.approvals': 'Approvals (session): {mode}',
277
+ 'sset.approvals': 'Shell approvals (session): {mode}',
248
278
  'sset.sound': 'Sound (session): {state}',
279
+ 'sset.providers.title': 'Change provider & model',
280
+ 'sset.providers.back': 'Back',
249
281
  'set.esc': 'Esc: close',
250
282
  // agent questions (auto-run)
251
283
  'q.title': '❓ AGENT QUESTION',
@@ -297,6 +329,40 @@ const en = {
297
329
  'set.priceBad': 'Invalid format — expected: input, output (e.g. 0.27, 1.10)',
298
330
  'set.newSkillName': 'Skill name (a .md template will be created in ~/.parallel/skills)',
299
331
  'set.newSpecialistName': 'Specialist name (a .md template will be created in ~/.parallel/specialists)',
332
+ // provider-pick section headers
333
+ 'wiz.provider.section.configured': 'Configured',
334
+ 'wiz.provider.section.cloud': 'Cloud Providers',
335
+ 'wiz.provider.section.local': 'Local',
336
+ 'wiz.provider.customDetail': 'Configure manually',
337
+ 'wiz.provider.ollamaDetail': 'Local — no API key needed',
338
+ 'wiz.provider.ollama.checking': 'Checking Ollama at localhost:11434...',
339
+ 'wiz.provider.ollama.found': 'Found {n} models',
340
+ 'wiz.provider.ollama.notFound': 'Could not reach Ollama at localhost:11434. Is it running?',
341
+ 'wiz.provider.ollama.continueDefaults': 'Continue with defaults',
342
+ 'wiz.provider.ollama.goBack': 'Go back',
343
+ // provider settings (future use)
344
+ 'set.providers': 'Providers',
345
+ 'set.providers.title': 'Providers',
346
+ 'set.providers.add': 'Add Provider...',
347
+ 'set.providers.back': 'Back',
348
+ 'set.providerDetail.title': '{name}',
349
+ 'set.providerDetail.key': 'Set API Key',
350
+ 'set.providerDetail.models': 'Manage Models',
351
+ 'set.providerDetail.pricing': 'Pricing',
352
+ 'set.providerDetail.setDefault': 'Set as Default',
353
+ 'set.providerDetail.remove': 'Remove Provider',
354
+ 'set.providerDetail.back': 'Back',
355
+ 'set.defaultProvider': 'Default Provider',
356
+ 'set.defaultProvider.title': 'Default Provider',
357
+ 'set.removeProvider.title': 'Remove {name}?',
358
+ 'set.removeProvider.confirm': 'This cannot be undone.',
359
+ 'set.removeProvider.yes': 'Yes, remove',
360
+ 'set.removeProvider.no': 'Cancel',
361
+ 'set.status.configured': 'configured',
362
+ 'set.status.noKey': 'no key',
363
+ 'set.status.local': 'local',
364
+ 'set.status.default': 'default',
365
+ 'set.key.masked': '{masked}',
300
366
  };
301
367
  const fr = {
302
368
  tagline: 'Des agents de code en parallèle, en temps réel — sans verrous, sans attente.',
@@ -389,11 +455,32 @@ const fr = {
389
455
  'help.l3': 'Les agents voient mutuellement leurs statuts et leurs diffs avant chaque action : ils co-éditent les mêmes fichiers sans se bloquer et sans casser le travail des autres.',
390
456
  'help.states': "États : 🔨 travaille · 👂 écoute les autres agents (double bordure) · 🧠 réfléchit · ✋ attend ton approbation · ⏹ stop. Sons : 1 bip = agent lancé/terminé, 2 bips = approbation requise (/sound off pour couper).",
391
457
  'help.keys': 'Esc : revenir à la vue agents · Tab : complétion · ↑/↓ : historique · Ctrl+V : coller une image',
392
- 'cmd.spawn': "Lancer l'agent N+1 (équivalent : taper la tâche + Entrée)",
458
+ 'cmd.ask': 'Agent ask : répond et conseille sans modifier',
459
+ 'cmd.task': 'Agent task : exécute, modifie, valide, résume',
393
460
  'cmd.agents': 'Vue panneaux agents (temps réel)',
394
461
  'cmd.board': 'Vue coordination : qui travaille où, notes',
395
462
  'cmd.notes': 'Historique des notes inter-agents',
396
463
  'cmd.diff': 'Modifications de fichiers (diffs en direct)',
464
+ 'cmd.status': 'Afficher le statut de la session : modèle, agents, changements, coût',
465
+ 'cmd.raw': 'Basculer le détail brut de l\'activité dans la vue focus',
466
+ 'cmd.copy': 'Copier le dernier résultat d\'agent terminé',
467
+ 'timeline.activity': 'Activité',
468
+ 'timeline.raw': 'Activité brute',
469
+ 'timeline.empty': 'Aucune activité pour le moment.',
470
+ 'timeline.ran': 'Ran',
471
+ 'timeline.readFiles': '{count} fichier(s) lu(s)',
472
+ 'timeline.editedFiles': '{count} fichier(s) modifié(s)',
473
+ 'timeline.wroteFiles': '{count} fichier(s) écrit(s)',
474
+ 'timeline.searched': '{count} cible(s) recherchée(s)',
475
+ 'timeline.listed': '{count} cible(s) listée(s)',
476
+ 'timeline.hiddenLines': '+{count} ligne(s) masquée(s)',
477
+ 'timeline.section.inspect': 'Inspection du contexte',
478
+ 'timeline.section.change': 'Modification des fichiers',
479
+ 'timeline.section.validate': 'Validation',
480
+ 'timeline.section.publish': 'Publication',
481
+ 'timeline.section.coordinate': 'Coordination',
482
+ 'timeline.section.result': 'Résultat',
483
+ 'timeline.section.other': 'Activité',
397
484
  'cmd.send': 'Instruction à un agent (équivalent : @Agent message)',
398
485
  'cmd.pause': 'Mettre en pause',
399
486
  'cmd.resume': 'Reprendre',
@@ -404,7 +491,7 @@ const fr = {
404
491
  'cmd.doctor': 'Vérifier provider/modèle/clef API et afficher les corrections',
405
492
  'cmd.settings': 'Réglages globaux — providers, clefs API, langue, défauts (persistés)',
406
493
  'cmd.ssettings': 'Réglages de session — modèle, approbations, son (cette session)',
407
- 'cmd.approvals': 'Confirmation des commandes shell (cette session)',
494
+ 'cmd.approvals': 'Approbations shell : ask, auto-safe ou yolo (cette session)',
408
495
  'cmd.sound': 'Repères sonores (cette session)',
409
496
  'cmd.save': 'Sauvegarder la session maintenant (avec un nom optionnel)',
410
497
  'cmd.focus': 'Met le focus sur un agent : le texte simple lui est envoyé, panneau pleine largeur',
@@ -414,7 +501,8 @@ const fr = {
414
501
  'cmd.help': "Afficher l'aide",
415
502
  'cmd.quit': 'Quitter (sauvegarde la session, arrête les agents)',
416
503
  'm.spawned': '⚡ Agent {name} lancé en parallèle{model}.',
417
- 'm.usageSpawn': 'Usage : /spawn [Nom:] <tâche> [--model=m]',
504
+ 'm.usageAsk': 'Usage : /ask [Nom:] <question> [--model=m] — conseil uniquement, aucune modification.',
505
+ 'm.usageSpawn': 'Usage : /task [Nom:] <tâche> [--model=m]',
418
506
  'm.usageAt': 'Usage : @Agent <message> (ou @all <message>)',
419
507
  'm.broadcast': '✉ Instruction diffusée à tous les agents.',
420
508
  'm.sent': '✉ Instruction envoyée à {target}.',
@@ -433,9 +521,10 @@ const fr = {
433
521
  'm.model': 'Modèle de session : {pm} (changer : /model [provider:]modèle · défauts globaux : /settings)',
434
522
  'm.modelSet': 'Modèle de session : {pm} (les agents déjà lancés gardent le leur)',
435
523
  'm.noProvider': 'Provider inconnu : {name} (configurés : {list})',
436
- 'm.usageApprovals': 'Usage : /approvals <ask|auto>',
437
- 'm.approvals': 'Mode approbation (session) : {mode}',
438
- 'm.approvalsWarn': ' ⚠ les commandes shell s’exécutent désormais sans confirmation',
524
+ 'm.usageApprovals': 'Usage : /approvals <ask|auto|auto-safe|yolo>',
525
+ 'm.approvals': 'Approbations shell (session) : {mode}',
526
+ 'm.approvalsWarn': ' ⚠ les commandes shell sûres s’exécutent sans confirmation ; les commandes risquées demandent encore',
527
+ 'm.approvalsYoloWarn': ' ⚠ mode YOLO : toutes les commandes shell sont auto-approuvées',
439
528
  'm.sound': 'Repères sonores (session) : {state}',
440
529
  'm.usageSound': 'Son : {state} — usage : /sound <on|off>',
441
530
  'm.saved': '💾 Session sauvegardée.',
@@ -449,7 +538,7 @@ const fr = {
449
538
  'm.noConversation': 'Aucune conversation sauvegardée pour « {name} » dans la session restaurée.',
450
539
  'm.conflict': '⚠ {path} : collisions répétées entre agents — pensez à arbitrer (@agent ou /focus).',
451
540
  'status.bar': '⚡ {agents} agent(s) · {active} actif(s) · {cost}',
452
- 'cmd.plan': "agent plan-d'abord : présente son plan, ne modifie qu'après votre accord",
541
+ 'cmd.plan': "Agent plan : présente son plan, ne modifie qu'après votre accord",
453
542
  'cmd.issue': 'lance un agent sur une issue GitHub (CLI gh requise)',
454
543
  'cmd.undo': "annule la dernière modification de fichier de l'agent",
455
544
  'cmd.commit': 'git-commit des fichiers touchés par un agent (ou tous)',
@@ -478,13 +567,20 @@ const fr = {
478
567
  'attach.placeholder': 'Message à {agent} (Entrée pour envoyer, /quit pour détacher)…',
479
568
  'attach.waiting': 'En attente de l’agent {agent}… (la session Parallel principale tourne-t-elle ?)',
480
569
  'attach.gone': 'Session terminée — ce terminal est détaché.',
481
- 'attach.hint': ' /spawn <tâche> = NOUVEL agent (son propre terminal) · texte libre pilote cet agent · /quit détache',
570
+ 'attach.hint': 'texte libre pilote cet agent · /task crée un nouvel agent · /ask questionne · /plan planifie · /quit détache',
482
571
  'grid.above': '▲ {n} agent(s) au-dessus — PgUp',
483
572
  'grid.below': '▼ {n} agent(s) en dessous — PgDn',
484
573
  'm.nothing': 'Rien à sauvegarder pour le moment.',
485
574
  'm.usageKey': 'Usage : /key <clef API>',
486
575
  'm.keySaved': 'Clef API enregistrée pour le provider {name} (~/.parallel/config.json)',
487
576
  'm.cleared': "Agents terminés retirés de l'affichage.",
577
+ 'm.clearedN': "{n} agent(s) terminé(s) retiré(s) de l'affichage.",
578
+ 'm.clearedNone': "Aucun agent terminé à retirer.",
579
+ 'm.status': "Statut\n Modèle {pm}\n Approbations {approval}\n Agents {total} total / {active} actif(s)\n Fichiers modifiés {changed}\n Coût session ${cost}",
580
+ 'm.rawOn': 'Détail brut activé — logs agents visibles dans la vue focus.',
581
+ 'm.rawOff': 'Détail brut désactivé.',
582
+ 'm.copyNone': "Aucun résultat d'agent à copier.",
583
+ 'm.copyDone': 'Dernier résultat de {name} copié.',
488
584
  'm.unknown': 'Commande inconnue : {cmd} — tape /help',
489
585
  'm.imagesIgnored': "Note : les images jointes ne sont prises en compte qu'au lancement d'un nouvel agent.",
490
586
  'm.sessionRestored': '📂 Session du {date} restaurée.',
@@ -505,15 +601,17 @@ const fr = {
505
601
  'set.modelsFor': 'Modèles de {name} — sélectionne pour mettre en défaut global, ou tape un nouveau nom',
506
602
  'set.makeDefault': 'mettre par défaut',
507
603
  'set.addModelName': 'nom du modèle exactement comme dans la doc du provider',
508
- 'set.approvals': 'Mode approbation par défaut : {mode}',
604
+ 'set.approvals': 'Approbations shell par défaut : {mode}',
509
605
  'set.sound': 'Son par défaut : {state}',
510
606
  'set.back': '← Retour',
511
607
  'set.saved': '✓ Enregistré dans ~/.parallel/config.json',
512
608
  'set.chooseProvider': 'Choisis un provider',
513
609
  'set.chooseModel': 'Modèle ({name}) — choisis ou tape un nom selon la doc du provider',
514
610
  'sset.model': 'Modèle de session : {pm}',
515
- 'sset.approvals': 'Approbations (session) : {mode}',
611
+ 'sset.approvals': 'Approbations shell (session) : {mode}',
516
612
  'sset.sound': 'Son (session) : {state}',
613
+ 'sset.providers.title': 'Changer de fournisseur et de modèle',
614
+ 'sset.providers.back': 'Retour',
517
615
  'set.esc': 'Esc : fermer',
518
616
  'q.title': '❓ QUESTION D’UN AGENT',
519
617
  'q.pending': ' ({n} en attente)',
@@ -559,6 +657,40 @@ const fr = {
559
657
  'set.priceBad': 'Format invalide — attendu : input, output (ex : 0.27, 1.10)',
560
658
  'set.newSkillName': 'Nom du skill (un modèle .md sera créé dans ~/.parallel/skills)',
561
659
  'set.newSpecialistName': 'Nom du spécialiste (un modèle .md sera créé dans ~/.parallel/specialists)',
660
+ // provider-pick section headers
661
+ 'wiz.provider.section.configured': 'Configurés',
662
+ 'wiz.provider.section.cloud': 'Fournisseurs cloud',
663
+ 'wiz.provider.section.local': 'Local',
664
+ 'wiz.provider.customDetail': 'Configurer manuellement',
665
+ 'wiz.provider.ollamaDetail': 'Local — pas de clef API requise',
666
+ 'wiz.provider.ollama.checking': 'Vérification de Ollama sur localhost:11434…',
667
+ 'wiz.provider.ollama.found': '{n} modèles trouvés',
668
+ 'wiz.provider.ollama.notFound': 'Ollama est injoignable sur localhost:11434. Est-il lancé ?',
669
+ 'wiz.provider.ollama.continueDefaults': 'Continuer avec les valeurs par défaut',
670
+ 'wiz.provider.ollama.goBack': 'Retour',
671
+ // provider settings (future use)
672
+ 'set.providers': 'Fournisseurs',
673
+ 'set.providers.title': 'Fournisseurs',
674
+ 'set.providers.add': 'Ajouter un fournisseur…',
675
+ 'set.providers.back': 'Retour',
676
+ 'set.providerDetail.title': '{name}',
677
+ 'set.providerDetail.key': 'Définir la clef API',
678
+ 'set.providerDetail.models': 'Gérer les modèles',
679
+ 'set.providerDetail.pricing': 'Tarifs',
680
+ 'set.providerDetail.setDefault': 'Définir par défaut',
681
+ 'set.providerDetail.remove': 'Supprimer le fournisseur',
682
+ 'set.providerDetail.back': 'Retour',
683
+ 'set.defaultProvider': 'Fournisseur par défaut',
684
+ 'set.defaultProvider.title': 'Fournisseur par défaut',
685
+ 'set.removeProvider.title': 'Supprimer {name} ?',
686
+ 'set.removeProvider.confirm': 'Cette action est irréversible.',
687
+ 'set.removeProvider.yes': 'Oui, supprimer',
688
+ 'set.removeProvider.no': 'Annuler',
689
+ 'set.status.configured': 'configuré',
690
+ 'set.status.noKey': 'pas de clef',
691
+ 'set.status.local': 'local',
692
+ 'set.status.default': 'défaut',
693
+ 'set.key.masked': '{masked}',
562
694
  };
563
695
  const es = {
564
696
  tagline: 'Agentes de código en paralelo, en tiempo real — sin bloqueos, sin esperas.',
@@ -651,11 +783,32 @@ const es = {
651
783
  'help.l3': 'Los agentes ven los estados y diffs de los demás antes de cada acción: co-editan los mismos archivos sin bloquearse y sin romper el trabajo ajeno.',
652
784
  'help.states': 'Estados: 🔨 trabajando · 👂 escuchando a otros agentes (borde doble) · 🧠 pensando · ✋ esperando tu aprobación · ⏹ stop. Sonidos: 1 bip = agente lanzado/terminado, 2 bips = aprobación requerida (/sound off para silenciar).',
653
785
  'help.keys': 'Esc: volver a la vista de agentes · Tab: autocompletar · ↑/↓: historial · Ctrl+V: pegar imagen',
654
- 'cmd.spawn': 'Lanzar el agente N+1 (igual que: escribir la tarea + Enter)',
786
+ 'cmd.ask': 'Agente ask: responde y aconseja sin editar',
787
+ 'cmd.task': 'Agente task: ejecuta, edita, valida y resume',
655
788
  'cmd.agents': 'Vista de paneles de agentes (tiempo real)',
656
789
  'cmd.board': 'Vista de coordinación: quién trabaja dónde, notas',
657
790
  'cmd.notes': 'Historial de notas entre agentes',
658
791
  'cmd.diff': 'Diffs de archivos en vivo',
792
+ 'cmd.status': 'Mostrar estado de la sesión: modelo, agentes, cambios, coste',
793
+ 'cmd.raw': 'Alternar detalle de actividad sin procesar en la vista focus',
794
+ 'cmd.copy': 'Copiar el último resultado de agente completado',
795
+ 'timeline.activity': 'Actividad',
796
+ 'timeline.raw': 'Actividad sin procesar',
797
+ 'timeline.empty': 'Aún no hay actividad.',
798
+ 'timeline.ran': 'Ran',
799
+ 'timeline.readFiles': '{count} archivo(s) leído(s)',
800
+ 'timeline.editedFiles': '{count} archivo(s) editado(s)',
801
+ 'timeline.wroteFiles': '{count} archivo(s) escrito(s)',
802
+ 'timeline.searched': '{count} objetivo(s) buscado(s)',
803
+ 'timeline.listed': '{count} objetivo(s) listado(s)',
804
+ 'timeline.hiddenLines': '+{count} línea(s) oculta(s)',
805
+ 'timeline.section.inspect': 'Inspeccionando contexto',
806
+ 'timeline.section.change': 'Cambiando archivos',
807
+ 'timeline.section.validate': 'Validando',
808
+ 'timeline.section.publish': 'Publicando',
809
+ 'timeline.section.coordinate': 'Coordinando',
810
+ 'timeline.section.result': 'Resultado',
811
+ 'timeline.section.other': 'Actividad',
659
812
  'cmd.send': 'Instrucción a un agente (igual que: @Agente mensaje)',
660
813
  'cmd.pause': 'Pausar',
661
814
  'cmd.resume': 'Reanudar',
@@ -666,7 +819,7 @@ const es = {
666
819
  'cmd.doctor': 'Comprobar proveedor/modelo/clave API y mostrar correcciones',
667
820
  'cmd.settings': 'Ajustes globales — proveedores, claves API, idioma, valores por defecto (persistentes)',
668
821
  'cmd.ssettings': 'Ajustes de sesión — modelo, aprobaciones, sonido (solo esta sesión)',
669
- 'cmd.approvals': 'Confirmación de comandos shell (esta sesión)',
822
+ 'cmd.approvals': 'Aprobaciones shell: ask, auto-safe o yolo (esta sesión)',
670
823
  'cmd.sound': 'Señales sonoras (esta sesión)',
671
824
  'cmd.save': 'Guardar la sesión ahora (con un nombre opcional)',
672
825
  'cmd.focus': 'Enfoca un agente: el texto simple se le envía, panel a ancho completo',
@@ -676,7 +829,8 @@ const es = {
676
829
  'cmd.help': 'Mostrar la ayuda',
677
830
  'cmd.quit': 'Salir (guarda la sesión, detiene los agentes)',
678
831
  'm.spawned': '⚡ Agente {name} lanzado en paralelo{model}.',
679
- 'm.usageSpawn': 'Uso: /spawn [Nombre:] <tarea> [--model=m]',
832
+ 'm.usageAsk': 'Uso: /ask [Nombre:] <pregunta> [--model=m] — solo asesoría, sin ediciones.',
833
+ 'm.usageSpawn': 'Uso: /task [Nombre:] <tarea> [--model=m]',
680
834
  'm.usageAt': 'Uso: @Agente <mensaje> (o @all <mensaje>)',
681
835
  'm.broadcast': '✉ Instrucción difundida a todos los agentes.',
682
836
  'm.sent': '✉ Instrucción enviada a {target}.',
@@ -695,9 +849,10 @@ const es = {
695
849
  'm.model': 'Modelo de sesión: {pm} (cambiar: /model [proveedor:]modelo · valores globales: /settings)',
696
850
  'm.modelSet': 'Modelo de sesión: {pm} (los agentes ya lanzados conservan el suyo)',
697
851
  'm.noProvider': 'Proveedor desconocido: {name} (configurados: {list})',
698
- 'm.usageApprovals': 'Uso: /approvals <ask|auto>',
699
- 'm.approvals': 'Modo de aprobación (sesión): {mode}',
700
- 'm.approvalsWarn': ' ⚠ los comandos shell se ejecutan ahora sin confirmación',
852
+ 'm.usageApprovals': 'Uso: /approvals <ask|auto|auto-safe|yolo>',
853
+ 'm.approvals': 'Aprobaciones shell (sesión): {mode}',
854
+ 'm.approvalsWarn': ' ⚠ los comandos shell seguros se ejecutan sin confirmación; los riesgosos aún preguntan',
855
+ 'm.approvalsYoloWarn': ' ⚠ modo YOLO: todos los comandos shell se autoaprueban',
701
856
  'm.sound': 'Señales sonoras (sesión): {state}',
702
857
  'm.usageSound': 'Sonido: {state} — uso: /sound <on|off>',
703
858
  'm.saved': '💾 Sesión guardada.',
@@ -711,7 +866,7 @@ const es = {
711
866
  'm.noConversation': 'No hay conversación guardada para "{name}" en la sesión restaurada.',
712
867
  'm.conflict': '⚠ {path}: colisiones repetidas entre agentes — considera arbitrar (@agente o /focus).',
713
868
  'status.bar': '⚡ {agents} agente(s) · {active} activo(s) · {cost}',
714
- 'cmd.plan': 'agente plan-primero: presenta su plan, solo edita tras tu aprobación',
869
+ 'cmd.plan': 'Agente plan: presenta su plan, solo edita tras tu aprobación',
715
870
  'cmd.issue': 'lanza un agente sobre una issue de GitHub (requiere la CLI gh)',
716
871
  'cmd.undo': 'revierte el último cambio de archivo del agente',
717
872
  'cmd.commit': 'git-commit de los archivos tocados por un agente (o todos)',
@@ -740,13 +895,20 @@ const es = {
740
895
  'attach.placeholder': 'Mensaje a {agent} (Enter para enviar, /quit para desconectar)…',
741
896
  'attach.waiting': 'Esperando al agente {agent}… (¿está corriendo la sesión principal de Parallel?)',
742
897
  'attach.gone': 'Sesión terminada — esta terminal está desconectada.',
743
- 'attach.hint': ' /spawn <tarea> = agente NUEVO (su propia terminal) · texto libre dirige a este agente · /quit desconecta',
898
+ 'attach.hint': 'texto libre dirige a este agente · /task crea un agente nuevo · /ask pregunta · /plan planifica · /quit desconecta',
744
899
  'grid.above': '▲ {n} agente(s) arriba — PgUp',
745
900
  'grid.below': '▼ {n} agente(s) abajo — PgDn',
746
901
  'm.nothing': 'Nada que guardar por ahora.',
747
902
  'm.usageKey': 'Uso: /key <clave API>',
748
903
  'm.keySaved': 'Clave API guardada para el proveedor {name} (~/.parallel/config.json)',
749
904
  'm.cleared': 'Agentes terminados quitados de la pantalla.',
905
+ 'm.clearedN': '{n} agente(s) terminado(s) quitado(s) de la pantalla.',
906
+ 'm.clearedNone': 'No hay agentes terminados que quitar.',
907
+ 'm.status': 'Estado\n Modelo {pm}\n Aprobaciones {approval}\n Agentes {total} total / {active} activo(s)\n Archivos cambiados {changed}\n Coste sesión ${cost}',
908
+ 'm.rawOn': 'Detalle de actividad activado — logs visibles en vista focus.',
909
+ 'm.rawOff': 'Detalle de actividad desactivado.',
910
+ 'm.copyNone': 'No hay resultado de agente que copiar.',
911
+ 'm.copyDone': 'Último resultado de {name} copiado.',
750
912
  'm.unknown': 'Comando desconocido: {cmd} — escribe /help',
751
913
  'm.imagesIgnored': 'Nota: las imágenes adjuntas solo se tienen en cuenta al lanzar un agente nuevo.',
752
914
  'm.sessionRestored': '📂 Sesión del {date} restaurada.',
@@ -767,15 +929,17 @@ const es = {
767
929
  'set.modelsFor': 'Modelos de {name} — selecciona uno como defecto global, o escribe un nombre nuevo',
768
930
  'set.makeDefault': 'hacer predeterminado',
769
931
  'set.addModelName': 'nombre del modelo exactamente como en la doc del proveedor',
770
- 'set.approvals': 'Modo de aprobación por defecto: {mode}',
932
+ 'set.approvals': 'Aprobaciones shell por defecto: {mode}',
771
933
  'set.sound': 'Sonido por defecto: {state}',
772
934
  'set.back': '← Volver',
773
935
  'set.saved': '✓ Guardado en ~/.parallel/config.json',
774
936
  'set.chooseProvider': 'Elige un proveedor',
775
937
  'set.chooseModel': 'Modelo ({name}) — elige o escribe un nombre según la doc del proveedor',
776
938
  'sset.model': 'Modelo de sesión: {pm}',
777
- 'sset.approvals': 'Aprobaciones (sesión): {mode}',
939
+ 'sset.approvals': 'Aprobaciones shell (sesión): {mode}',
778
940
  'sset.sound': 'Sonido (sesión): {state}',
941
+ 'sset.providers.title': 'Cambiar proveedor y modelo',
942
+ 'sset.providers.back': 'Volver',
779
943
  'set.esc': 'Esc: cerrar',
780
944
  'q.title': '❓ PREGUNTA DE UN AGENTE',
781
945
  'q.pending': ' ({n} pendientes)',
@@ -821,6 +985,40 @@ const es = {
821
985
  'set.priceBad': 'Formato inválido — esperado: input, output (ej.: 0.27, 1.10)',
822
986
  'set.newSkillName': 'Nombre del skill (se creará una plantilla .md en ~/.parallel/skills)',
823
987
  'set.newSpecialistName': 'Nombre del especialista (se creará una plantilla .md en ~/.parallel/specialists)',
988
+ // provider-pick section headers
989
+ 'wiz.provider.section.configured': 'Configurados',
990
+ 'wiz.provider.section.cloud': 'Proveedores en la nube',
991
+ 'wiz.provider.section.local': 'Local',
992
+ 'wiz.provider.customDetail': 'Configurar manualmente',
993
+ 'wiz.provider.ollamaDetail': 'Local — no requiere clave API',
994
+ 'wiz.provider.ollama.checking': 'Comprobando Ollama en localhost:11434…',
995
+ 'wiz.provider.ollama.found': '{n} modelos encontrados',
996
+ 'wiz.provider.ollama.notFound': 'No se pudo contactar con Ollama en localhost:11434. ¿Está en ejecución?',
997
+ 'wiz.provider.ollama.continueDefaults': 'Continuar con valores predeterminados',
998
+ 'wiz.provider.ollama.goBack': 'Volver',
999
+ // provider settings (future use)
1000
+ 'set.providers': 'Proveedores',
1001
+ 'set.providers.title': 'Proveedores',
1002
+ 'set.providers.add': 'Añadir proveedor…',
1003
+ 'set.providers.back': 'Volver',
1004
+ 'set.providerDetail.title': '{name}',
1005
+ 'set.providerDetail.key': 'Establecer clave API',
1006
+ 'set.providerDetail.models': 'Gestionar modelos',
1007
+ 'set.providerDetail.pricing': 'Precios',
1008
+ 'set.providerDetail.setDefault': 'Establecer como predeterminado',
1009
+ 'set.providerDetail.remove': 'Eliminar proveedor',
1010
+ 'set.providerDetail.back': 'Volver',
1011
+ 'set.defaultProvider': 'Proveedor predeterminado',
1012
+ 'set.defaultProvider.title': 'Proveedor predeterminado',
1013
+ 'set.removeProvider.title': '¿Eliminar {name}?',
1014
+ 'set.removeProvider.confirm': 'Esta acción no se puede deshacer.',
1015
+ 'set.removeProvider.yes': 'Sí, eliminar',
1016
+ 'set.removeProvider.no': 'Cancelar',
1017
+ 'set.status.configured': 'configurado',
1018
+ 'set.status.noKey': 'sin clave',
1019
+ 'set.status.local': 'local',
1020
+ 'set.status.default': 'predeterminado',
1021
+ 'set.key.masked': '{masked}',
824
1022
  };
825
1023
  const zh = {
826
1024
  tagline: '并行实时代码智能体 — 无锁定,无等待。',
@@ -913,11 +1111,32 @@ const zh = {
913
1111
  'help.l3': '每次行动前,智能体都能看到彼此的状态和差异:它们共同编辑同一批文件,互不阻塞,也不破坏彼此的工作。',
914
1112
  'help.states': '状态:🔨 工作中 · 👂 倾听其他智能体(双边框)· 🧠 思考中 · ✋ 等待你的批准 · ⏹ 停止。声音:1 声 = 智能体启动/完成,2 声 = 需要批准(/sound off 静音)。',
915
1113
  'help.keys': 'Esc:返回智能体视图 · Tab:补全 · ↑/↓:历史 · Ctrl+V:粘贴图片',
916
- 'cmd.spawn': '启动智能体 N+1(等同于:输入任务 + 回车)',
1114
+ 'cmd.ask': 'Ask 智能体:只回答和建议,不编辑',
1115
+ 'cmd.task': 'Task 智能体:执行、编辑、验证并总结',
917
1116
  'cmd.agents': '智能体面板视图(实时)',
918
1117
  'cmd.board': '协调视图:谁在哪里工作、便签',
919
1118
  'cmd.notes': '智能体间便签历史',
920
1119
  'cmd.diff': '实时文件差异',
1120
+ 'cmd.status': '显示会话状态:模型、智能体、更改、费用',
1121
+ 'cmd.raw': '在焦点视图中切换原始活动详情',
1122
+ 'cmd.copy': '复制最新完成的智能体结果',
1123
+ 'timeline.activity': '活动',
1124
+ 'timeline.raw': '原始活动',
1125
+ 'timeline.empty': '暂无活动。',
1126
+ 'timeline.ran': 'Ran',
1127
+ 'timeline.readFiles': '读取 {count} 个文件',
1128
+ 'timeline.editedFiles': '编辑 {count} 个文件',
1129
+ 'timeline.wroteFiles': '写入 {count} 个文件',
1130
+ 'timeline.searched': '搜索 {count} 个目标',
1131
+ 'timeline.listed': '列出 {count} 个目标',
1132
+ 'timeline.hiddenLines': '+{count} 行已隐藏',
1133
+ 'timeline.section.inspect': '检查上下文',
1134
+ 'timeline.section.change': '修改文件',
1135
+ 'timeline.section.validate': '验证',
1136
+ 'timeline.section.publish': '发布',
1137
+ 'timeline.section.coordinate': '协调',
1138
+ 'timeline.section.result': '结果',
1139
+ 'timeline.section.other': '活动',
921
1140
  'cmd.send': '向某个智能体发指令(等同于:@智能体 消息)',
922
1141
  'cmd.pause': '暂停',
923
1142
  'cmd.resume': '恢复',
@@ -928,7 +1147,7 @@ const zh = {
928
1147
  'cmd.doctor': '检查提供商/模型/API 密钥配置并显示修复提示',
929
1148
  'cmd.settings': '全局设置 — 提供商、API 密钥、语言、默认值(持久化)',
930
1149
  'cmd.ssettings': '会话设置 — 模型、批准、声音(仅本会话)',
931
- 'cmd.approvals': 'Shell 命令确认(本会话)',
1150
+ 'cmd.approvals': 'Shell 批准:ask、auto-safe 或 yolo(本会话)',
932
1151
  'cmd.sound': '声音提示(本会话)',
933
1152
  'cmd.save': '立即保存会话(可附加名称)',
934
1153
  'cmd.focus': '聚焦某个代理:普通文本直接发给它,面板全宽显示',
@@ -938,7 +1157,8 @@ const zh = {
938
1157
  'cmd.help': '显示帮助',
939
1158
  'cmd.quit': '退出(保存会话,停止智能体)',
940
1159
  'm.spawned': '⚡ 智能体 {name} 已并行启动{model}。',
941
- 'm.usageSpawn': '用法:/spawn [名称:] <任务> [--model=m]',
1160
+ 'm.usageAsk': '用法:/ask [名称:] <问题> [--model=m] — 仅建议,不修改。',
1161
+ 'm.usageSpawn': '用法:/task [名称:] <任务> [--model=m]',
942
1162
  'm.usageAt': '用法:@智能体 <消息>(或 @all <消息>)',
943
1163
  'm.broadcast': '✉ 指令已广播给所有智能体。',
944
1164
  'm.sent': '✉ 指令已发送给 {target}。',
@@ -957,9 +1177,10 @@ const zh = {
957
1177
  'm.model': '会话模型:{pm}(更改:/model [提供商:]模型 · 全局默认:/settings)',
958
1178
  'm.modelSet': '会话模型:{pm}(已启动的智能体保持原模型)',
959
1179
  'm.noProvider': '未知提供商:{name}(已配置:{list})',
960
- 'm.usageApprovals': '用法:/approvals <ask|auto>',
961
- 'm.approvals': '批准模式(会话):{mode}',
962
- 'm.approvalsWarn': ' ⚠ Shell 命令现在无需确认即可执行',
1180
+ 'm.usageApprovals': '用法:/approvals <ask|auto|auto-safe|yolo>',
1181
+ 'm.approvals': 'Shell 批准(会话):{mode}',
1182
+ 'm.approvalsWarn': ' ⚠ 安全 Shell 命令无需确认;高风险命令仍会询问',
1183
+ 'm.approvalsYoloWarn': ' ⚠ YOLO 模式:所有 Shell 命令都会自动批准',
963
1184
  'm.sound': '声音提示(会话):{state}',
964
1185
  'm.usageSound': '声音:{state} — 用法:/sound <on|off>',
965
1186
  'm.saved': '💾 会话已保存。',
@@ -973,7 +1194,7 @@ const zh = {
973
1194
  'm.noConversation': '恢复的会话中没有「{name}」的已保存对话。',
974
1195
  'm.conflict': '⚠ {path}:代理之间反复冲突 — 建议你介入仲裁(@代理 或 /focus)。',
975
1196
  'status.bar': '⚡ {agents} 个代理 · {active} 个活跃 · {cost}',
976
- 'cmd.plan': '先计划模式:代理先给出计划,你批准后才开始修改',
1197
+ 'cmd.plan': 'Plan 智能体:先给出计划,你批准后才开始修改',
977
1198
  'cmd.issue': '基于 GitHub issue 启动代理(需要 gh CLI)',
978
1199
  'cmd.undo': '撤销该代理最近一次文件修改',
979
1200
  'cmd.commit': '把某个代理(或全部)改动的文件做 git 提交',
@@ -1002,13 +1223,20 @@ const zh = {
1002
1223
  'attach.placeholder': '发给 {agent} 的消息(回车发送,/quit 断开)…',
1003
1224
  'attach.waiting': '等待代理 {agent}…(Parallel 主会话在运行吗?)',
1004
1225
  'attach.gone': '会话已结束 — 此终端已断开。',
1005
- 'attach.hint': ' /spawn <任务> = 新代理(独立终端) · 直接输入文字可指挥此代理 · /quit 断开',
1226
+ 'attach.hint': '直接输入文字可指挥此代理 · /task 创建新代理 · /ask 提问 · /plan 规划 · /quit 断开',
1006
1227
  'grid.above': '▲ 上方还有 {n} 个代理 — PgUp',
1007
1228
  'grid.below': '▼ 下方还有 {n} 个代理 — PgDn',
1008
1229
  'm.nothing': '暂无可保存的内容。',
1009
1230
  'm.usageKey': '用法:/key <API 密钥>',
1010
1231
  'm.keySaved': '已为提供商 {name} 保存 API 密钥(~/.parallel/config.json)',
1011
1232
  'm.cleared': '已从显示中移除完成的智能体。',
1233
+ 'm.clearedN': '已从显示中移除 {n} 个完成的智能体。',
1234
+ 'm.clearedNone': '没有可移除的已完成智能体。',
1235
+ 'm.status': '状态\n 模型 {pm}\n 批准 {approval}\n 智能体 {total} 个总计 / {active} 个活跃\n 已更改文件 {changed}\n 会话费用 ${cost}',
1236
+ 'm.rawOn': '原始活动详情已开启 — 焦点视图中可查看原始智能体日志。',
1237
+ 'm.rawOff': '原始活动详情已关闭。',
1238
+ 'm.copyNone': '没有可复制的已完成智能体输出。',
1239
+ 'm.copyDone': '已复制 {name} 的最新结果。',
1012
1240
  'm.unknown': '未知命令:{cmd} — 输入 /help',
1013
1241
  'm.imagesIgnored': '注意:附加的图片仅在启动新智能体时生效。',
1014
1242
  'm.sessionRestored': '📂 已恢复 {date} 的会话。',
@@ -1029,15 +1257,17 @@ const zh = {
1029
1257
  'set.modelsFor': '{name} 的模型 — 选择一个作为全局默认,或输入新模型名称',
1030
1258
  'set.makeDefault': '设为默认',
1031
1259
  'set.addModelName': '模型名称,需与提供商文档完全一致',
1032
- 'set.approvals': '默认批准模式:{mode}',
1260
+ 'set.approvals': '默认 Shell 批准:{mode}',
1033
1261
  'set.sound': '默认声音:{state}',
1034
1262
  'set.back': '← 返回',
1035
1263
  'set.saved': '✓ 已保存到 ~/.parallel/config.json',
1036
1264
  'set.chooseProvider': '选择提供商',
1037
1265
  'set.chooseModel': '模型({name})— 选择或按提供商文档输入名称',
1038
1266
  'sset.model': '会话模型:{pm}',
1039
- 'sset.approvals': '批准(会话):{mode}',
1267
+ 'sset.approvals': 'Shell 批准(会话):{mode}',
1040
1268
  'sset.sound': '声音(会话):{state}',
1269
+ 'sset.providers.title': '更改提供商和模型',
1270
+ 'sset.providers.back': '返回',
1041
1271
  'set.esc': 'Esc:关闭',
1042
1272
  'q.title': '❓ 智能体提问',
1043
1273
  'q.pending': '({n} 个待处理)',
@@ -1083,5 +1313,39 @@ const zh = {
1083
1313
  'set.priceBad': '格式无效 — 应为:input, output(例:0.27, 1.10)',
1084
1314
  'set.newSkillName': '技能名称(将在 ~/.parallel/skills 创建 .md 模板)',
1085
1315
  'set.newSpecialistName': '专家名称(将在 ~/.parallel/specialists 创建 .md 模板)',
1316
+ // provider-pick section headers
1317
+ 'wiz.provider.section.configured': '已配置',
1318
+ 'wiz.provider.section.cloud': '云提供商',
1319
+ 'wiz.provider.section.local': '本地',
1320
+ 'wiz.provider.customDetail': '手动配置',
1321
+ 'wiz.provider.ollamaDetail': '本地 — 无需 API 密钥',
1322
+ 'wiz.provider.ollama.checking': '正在检查 Ollama(localhost:11434)…',
1323
+ 'wiz.provider.ollama.found': '找到 {n} 个模型',
1324
+ 'wiz.provider.ollama.notFound': '无法连接到 localhost:11434 的 Ollama。它在运行吗?',
1325
+ 'wiz.provider.ollama.continueDefaults': '继续使用默认值',
1326
+ 'wiz.provider.ollama.goBack': '返回',
1327
+ // provider settings (future use)
1328
+ 'set.providers': '提供商',
1329
+ 'set.providers.title': '提供商',
1330
+ 'set.providers.add': '添加提供商…',
1331
+ 'set.providers.back': '返回',
1332
+ 'set.providerDetail.title': '{name}',
1333
+ 'set.providerDetail.key': '设置 API 密钥',
1334
+ 'set.providerDetail.models': '管理模型',
1335
+ 'set.providerDetail.pricing': '定价',
1336
+ 'set.providerDetail.setDefault': '设为默认',
1337
+ 'set.providerDetail.remove': '移除提供商',
1338
+ 'set.providerDetail.back': '返回',
1339
+ 'set.defaultProvider': '默认提供商',
1340
+ 'set.defaultProvider.title': '默认提供商',
1341
+ 'set.removeProvider.title': '移除 {name}?',
1342
+ 'set.removeProvider.confirm': '此操作无法撤销。',
1343
+ 'set.removeProvider.yes': '是,移除',
1344
+ 'set.removeProvider.no': '取消',
1345
+ 'set.status.configured': '已配置',
1346
+ 'set.status.noKey': '无密钥',
1347
+ 'set.status.local': '本地',
1348
+ 'set.status.default': '默认',
1349
+ 'set.key.masked': '{masked}',
1086
1350
  };
1087
1351
  const STRINGS = { en, fr, es, zh };