@parallel-cli/parallel 0.4.3 → 0.4.5
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.md +60 -2
- package/README.md +112 -99
- package/dist/agents/agent.js +2 -2
- package/dist/agents/tools.js +105 -7
- package/dist/commands.js +104 -18
- package/dist/config.js +31 -1
- package/dist/controller.js +68 -14
- package/dist/coordination/blackboard.js +75 -0
- package/dist/i18n.js +140 -32
- package/dist/index.js +3 -3
- package/dist/server.js +10 -0
- package/dist/ui/AgentPanel.js +22 -7
- package/dist/ui/App.js +86 -62
- package/dist/ui/AttachApp.js +13 -3
- package/dist/ui/CommandInput.js +60 -9
- package/dist/ui/SettingsPanel.js +86 -18
- package/dist/ui/Timeline.js +11 -9
- package/dist/ui/views.js +39 -15
- package/package.json +1 -1
package/dist/i18n.js
CHANGED
|
@@ -99,13 +99,14 @@ const en = {
|
|
|
99
99
|
'board.agents': 'Agents:',
|
|
100
100
|
'board.none': '(no agents)',
|
|
101
101
|
'board.activity': 'Who works where (file activity, no locks):',
|
|
102
|
+
'board.workMap': 'Work map warnings:',
|
|
102
103
|
'board.noActivity': '(no edits yet)',
|
|
103
104
|
'board.notes': 'Latest notes:',
|
|
104
105
|
'notes.title': '✉ INTER-AGENT NOTES (last 30)',
|
|
105
106
|
'notes.empty': 'No notes exchanged yet.',
|
|
106
107
|
'sessions.title': '📂 SAVED SESSIONS',
|
|
107
108
|
'sessions.empty': 'No saved sessions for this project yet.',
|
|
108
|
-
'sessions.item': '{date} · {agents} agent(s)',
|
|
109
|
+
'sessions.item': '{name}{date} · {agents} agent(s)',
|
|
109
110
|
'sessions.hint': 'Restore one with /session <n> or /session latest. New launches start fresh by default.',
|
|
110
111
|
'diff.title': '± LIVE DIFFS — {total} change(s) total (last 4 shown)',
|
|
111
112
|
'diff.empty': 'No file changes yet.',
|
|
@@ -121,7 +122,7 @@ const en = {
|
|
|
121
122
|
'help.l2d': ' for everyone).',
|
|
122
123
|
'help.l3': "Agents see each other's statuses and diffs before every action: they co-edit the same files without blocking and without breaking each other's work.",
|
|
123
124
|
'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).',
|
|
124
|
-
'help.keys': 'Esc: back to agents view · Tab: completion · ↑/↓: suggestions, history, or view scroll · Ctrl+V: paste image',
|
|
125
|
+
'help.keys': 'Esc: back to agents view · Tab: completion · PgUp/PgDn: hub/focus scroll · ↑/↓: suggestions, history, or view scroll · Ctrl+V: paste image',
|
|
125
126
|
// commands (descriptions)
|
|
126
127
|
'cmd.ask': 'Ask-only agent: answers and advises without editing',
|
|
127
128
|
'cmd.task': 'Task agent: executes, edits, validates, summarizes',
|
|
@@ -156,7 +157,7 @@ const en = {
|
|
|
156
157
|
'cmd.model': 'Show/change the session model ([provider:]model)',
|
|
157
158
|
'cmd.sessions': 'List saved sessions for this project',
|
|
158
159
|
'cmd.session': 'Restore a saved session by number, or latest',
|
|
159
|
-
'cmd.doctor': '
|
|
160
|
+
'cmd.doctor': 'Run local readiness diagnostics',
|
|
160
161
|
'cmd.settings': 'Global settings — providers, API keys, language, defaults (persisted)',
|
|
161
162
|
'cmd.ssettings': 'Session settings — model, approvals, sound (this session only)',
|
|
162
163
|
'cmd.project': 'Change project folder or reopen folder picker',
|
|
@@ -175,7 +176,7 @@ const en = {
|
|
|
175
176
|
'm.usageAsk': 'Usage: /ask [Name:] <question> [--model=m] — advisory only, no edits.',
|
|
176
177
|
'm.usageSpawn': 'Usage: /task [Name:] <task> [--model=m]',
|
|
177
178
|
'm.usageAt': 'Usage: @Agent <message> (or @all <message>)',
|
|
178
|
-
'm.broadcast': '✉ Instruction
|
|
179
|
+
'm.broadcast': '✉ Instruction sent to {n} active agent(s).',
|
|
179
180
|
'm.sent': '✉ Instruction sent to {target}.',
|
|
180
181
|
'm.notFound': 'Agent not found: {target} (agents: {list})',
|
|
181
182
|
'm.none': 'none',
|
|
@@ -206,14 +207,15 @@ const en = {
|
|
|
206
207
|
'm.focusHint': '🎯 focus {name} · type to talk to it · PgUp/PgDn scroll · Esc to exit',
|
|
207
208
|
'm.usageRestore': 'Usage: /restore <agent> (after loading a session via /session)',
|
|
208
209
|
'm.restored': '⏪ {name} relaunched with its previous conversation.',
|
|
210
|
+
'm.noRestoredAgent': 'No agent named "{name}" in the restored session.',
|
|
209
211
|
'm.noConversation': 'No saved conversation for "{name}" in the restored session.',
|
|
210
212
|
'm.conflict': '⚠ {path}: repeated collisions between agents — consider arbitrating (@agent or /focus).',
|
|
211
213
|
'status.bar': '⚡ {agents} agent(s) · {active} active · {cost}',
|
|
212
214
|
'cmd.plan': 'Plan agent: presents its plan, edits only after your approval',
|
|
213
|
-
'cmd.issue': 'spawn an agent on a GitHub issue (needs
|
|
215
|
+
'cmd.issue': 'spawn an agent on a GitHub issue (needs gh, a GitHub repo, and auth)',
|
|
214
216
|
'cmd.undo': "revert the agent's last file change",
|
|
215
|
-
'cmd.commit': 'git-commit
|
|
216
|
-
'cmd.autocommit': 'auto-commit each agent’s files when it finishes',
|
|
217
|
+
'cmd.commit': 'git-commit only files touched by an agent (or all)',
|
|
218
|
+
'cmd.autocommit': 'session-only auto-commit of each agent’s files when it finishes',
|
|
217
219
|
'm.usagePlan': 'Usage: /plan [Name:] <task> — the agent presents its plan and waits for your approval before editing.',
|
|
218
220
|
'm.usageIssue': 'Usage: /issue <number> — spawns an agent on this GitHub issue (gh CLI required).',
|
|
219
221
|
'm.ghMissing': '✗ gh CLI not found. Install it (https://cli.github.com) then `gh auth login`.',
|
|
@@ -238,7 +240,7 @@ const en = {
|
|
|
238
240
|
'attach.placeholder': 'Message to {agent} (Enter to send, /quit to detach)…',
|
|
239
241
|
'attach.waiting': 'Waiting for agent {agent}… (is the main Parallel session running?)',
|
|
240
242
|
'attach.gone': 'Session ended — this terminal is detached.',
|
|
241
|
-
'attach.hint': 'plain text steers this agent ·
|
|
243
|
+
'attach.hint': 'plain text steers this agent · @all broadcasts · /send routes · /task creates · /quit detaches',
|
|
242
244
|
'grid.above': '▲ {n} agent(s) above — PgUp',
|
|
243
245
|
'grid.below': '▼ {n} agent(s) below — PgDn',
|
|
244
246
|
'm.nothing': 'Nothing to save yet.',
|
|
@@ -253,14 +255,34 @@ const en = {
|
|
|
253
255
|
'm.copyNone': 'No completed agent output to copy.',
|
|
254
256
|
'm.copyDone': 'Copied latest result from {name}.',
|
|
255
257
|
'm.unknown': 'Unknown command: {cmd} — type /help',
|
|
258
|
+
'm.projectActive': 'Active agents are running. Save/stop them first, or rerun with /project [folder] --force.',
|
|
259
|
+
'm.wizardActive': 'Active agents are running. Save/stop them first, or rerun with /wizard --force.',
|
|
256
260
|
'm.imagesIgnored': 'Note: attached images are only supported when launching a new agent.',
|
|
257
261
|
'm.sessionRestored': '📂 Session from {date} restored.',
|
|
258
262
|
'm.usageSession': 'Usage: /sessions to list, then /session <n> or /session latest',
|
|
259
263
|
'm.sessionLoaded': '📂 Session from {date} loaded.',
|
|
264
|
+
'm.sessionActive': 'Active agents are running. Save/stop them first, or rerun with /session <n|latest> --force.',
|
|
265
|
+
'm.sessionRestoreHint': 'Run /restore <agent> to relaunch a saved agent conversation.',
|
|
260
266
|
'm.missingProvider': 'No provider configured. Open /settings → Add a provider, or restart with a first-run config.',
|
|
261
267
|
'm.missingKey': 'Provider {name} has no API key. Use /settings → Providers → API key.',
|
|
262
268
|
'm.missingModel': 'Provider {name} has no default model. Use /settings → Provider models.',
|
|
263
269
|
'm.doctorOk': '✓ Configuration ready: {pm}. Changes: /settings · temporary model: /model [provider:]model',
|
|
270
|
+
'm.doctorReport': 'Doctor\n{lines}',
|
|
271
|
+
'm.doctorNoProvider': '✗ No provider configured. Open /settings → Add a provider.',
|
|
272
|
+
'm.doctorProvider': '• Provider: {provider}:{model}',
|
|
273
|
+
'm.doctorKeyMissing': '✗ API key missing. Open /settings → Providers → API key.',
|
|
274
|
+
'm.doctorKeyOk': '✓ API key present.',
|
|
275
|
+
'm.doctorKeySkipped': '✓ API key not required for this local provider.',
|
|
276
|
+
'm.doctorModelMissing': '✗ Model missing or still set to placeholder. Choose a real model in /settings or /model.',
|
|
277
|
+
'm.doctorModelOk': '✓ Model ready: {model}',
|
|
278
|
+
'm.doctorEndpointOk': '✓ Local endpoint reachable: {url}',
|
|
279
|
+
'm.doctorEndpointFail': '⚠ Local endpoint not reachable: {url}',
|
|
280
|
+
'm.doctorAttachOk': '✓ Attach socket is available.',
|
|
281
|
+
'm.doctorAttachMissing': '⚠ Attach socket is not running yet.',
|
|
282
|
+
'm.doctorGitOk': '✓ git CLI found.',
|
|
283
|
+
'm.doctorGitMissing': '⚠ git CLI not found.',
|
|
284
|
+
'm.doctorGhOk': '✓ gh CLI found for /issue.',
|
|
285
|
+
'm.doctorGhMissing': '⚠ gh CLI not found; /issue needs gh and GitHub auth.',
|
|
264
286
|
'm.spawnFail': 'Cannot launch the agent: no usable provider/model. Configure one via /settings.',
|
|
265
287
|
// settings panels
|
|
266
288
|
'set.title': '⚙ SETTINGS — global (persisted in ~/.parallel/config.json)',
|
|
@@ -277,8 +299,13 @@ const en = {
|
|
|
277
299
|
'set.sound': 'Default sound: {state}',
|
|
278
300
|
'set.back': '← Back',
|
|
279
301
|
'set.saved': '✓ Saved to ~/.parallel/config.json',
|
|
302
|
+
'set.sessionProviderReady': '✓ {name} is ready for this session only.',
|
|
303
|
+
'set.setupScope.title': 'Use {name} only now, or save it globally?',
|
|
304
|
+
'set.setupScope.session': 'Use this session only',
|
|
305
|
+
'set.setupScope.global': 'Save globally',
|
|
280
306
|
'set.chooseProvider': 'Choose a provider',
|
|
281
307
|
'set.chooseModel': 'Model ({name}) — pick or type a name from the provider docs',
|
|
308
|
+
'set.modelPlaceholder': 'Choose or type a real model name first. `your-model-here` is only a placeholder.',
|
|
282
309
|
'sset.model': 'Session model: {pm}',
|
|
283
310
|
'sset.approvals': 'Shell approvals (session): {mode}',
|
|
284
311
|
'sset.sound': 'Sound (session): {state}',
|
|
@@ -447,13 +474,14 @@ const fr = {
|
|
|
447
474
|
'board.agents': 'Agents :',
|
|
448
475
|
'board.none': '(aucun agent)',
|
|
449
476
|
'board.activity': 'Qui travaille où (activité fichiers, sans verrou) :',
|
|
477
|
+
'board.workMap': 'Alertes work map :',
|
|
450
478
|
'board.noActivity': '(aucune modification pour le moment)',
|
|
451
479
|
'board.notes': 'Dernières notes :',
|
|
452
480
|
'notes.title': '✉ NOTES INTER-AGENTS (30 dernières)',
|
|
453
481
|
'notes.empty': 'Aucune note échangée pour le moment.',
|
|
454
482
|
'sessions.title': '📂 SESSIONS SAUVEGARDÉES',
|
|
455
483
|
'sessions.empty': 'Aucune session sauvegardée pour ce projet.',
|
|
456
|
-
'sessions.item': '{date} · {agents} agent(s)',
|
|
484
|
+
'sessions.item': '{name}{date} · {agents} agent(s)',
|
|
457
485
|
'sessions.hint': 'Restaure avec /session <n> ou /session latest. Les nouveaux lancements démarrent vierges par défaut.',
|
|
458
486
|
'diff.title': '± DIFFS EN DIRECT — {total} modification(s) au total (4 dernières affichées)',
|
|
459
487
|
'diff.empty': 'Aucune modification de fichier pour le moment.',
|
|
@@ -469,7 +497,7 @@ const fr = {
|
|
|
469
497
|
'help.l2d': ' pour tous).',
|
|
470
498
|
'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.',
|
|
471
499
|
'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).",
|
|
472
|
-
'help.keys': 'Esc : revenir à la vue agents · Tab : complétion · ↑/↓ : suggestions, historique ou scroll selon la vue · Ctrl+V : coller une image',
|
|
500
|
+
'help.keys': 'Esc : revenir à la vue agents · Tab : complétion · PgUp/PgDn : scroll hub/focus · ↑/↓ : suggestions, historique ou scroll selon la vue · Ctrl+V : coller une image',
|
|
473
501
|
'cmd.ask': 'Agent ask : répond et conseille sans modifier',
|
|
474
502
|
'cmd.task': 'Agent task : exécute, modifie, valide, résume',
|
|
475
503
|
'cmd.agents': 'Vue panneaux agents (temps réel)',
|
|
@@ -503,7 +531,7 @@ const fr = {
|
|
|
503
531
|
'cmd.model': 'Afficher/changer le modèle de la session ([provider:]modèle)',
|
|
504
532
|
'cmd.sessions': 'Lister les sessions sauvegardées de ce projet',
|
|
505
533
|
'cmd.session': 'Restaurer une session sauvegardée par numéro, ou latest',
|
|
506
|
-
'cmd.doctor': '
|
|
534
|
+
'cmd.doctor': 'Lancer les diagnostics locaux de readiness',
|
|
507
535
|
'cmd.settings': 'Réglages globaux — providers, clefs API, langue, défauts (persistés)',
|
|
508
536
|
'cmd.ssettings': 'Réglages de session — modèle, approbations, son (cette session)',
|
|
509
537
|
'cmd.project': 'Changer de dossier projet ou rouvrir le choix de dossier',
|
|
@@ -521,7 +549,7 @@ const fr = {
|
|
|
521
549
|
'm.usageAsk': 'Usage : /ask [Nom:] <question> [--model=m] — conseil uniquement, aucune modification.',
|
|
522
550
|
'm.usageSpawn': 'Usage : /task [Nom:] <tâche> [--model=m]',
|
|
523
551
|
'm.usageAt': 'Usage : @Agent <message> (ou @all <message>)',
|
|
524
|
-
'm.broadcast': '✉ Instruction
|
|
552
|
+
'm.broadcast': '✉ Instruction envoyée à {n} agent(s) actif(s).',
|
|
525
553
|
'm.sent': '✉ Instruction envoyée à {target}.',
|
|
526
554
|
'm.notFound': 'Agent introuvable : {target} (agents : {list})',
|
|
527
555
|
'm.none': 'aucun',
|
|
@@ -552,14 +580,15 @@ const fr = {
|
|
|
552
580
|
'm.focusHint': '🎯 focus {name} · tapez pour lui parler · PgUp/PgDn défilement · Échap pour sortir',
|
|
553
581
|
'm.usageRestore': 'Usage : /restore <agent> (après avoir chargé une session via /session)',
|
|
554
582
|
'm.restored': '⏪ {name} relancé avec sa conversation précédente.',
|
|
583
|
+
'm.noRestoredAgent': 'Aucun agent nommé « {name} » dans la session restaurée.',
|
|
555
584
|
'm.noConversation': 'Aucune conversation sauvegardée pour « {name} » dans la session restaurée.',
|
|
556
585
|
'm.conflict': '⚠ {path} : collisions répétées entre agents — pensez à arbitrer (@agent ou /focus).',
|
|
557
586
|
'status.bar': '⚡ {agents} agent(s) · {active} actif(s) · {cost}',
|
|
558
587
|
'cmd.plan': "Agent plan : présente son plan, ne modifie qu'après votre accord",
|
|
559
|
-
'cmd.issue': 'lance un agent sur une issue GitHub (
|
|
588
|
+
'cmd.issue': 'lance un agent sur une issue GitHub (gh, repo GitHub et auth requis)',
|
|
560
589
|
'cmd.undo': "annule la dernière modification de fichier de l'agent",
|
|
561
|
-
'cmd.commit': 'git-commit
|
|
562
|
-
'cmd.autocommit': 'commit auto des fichiers de chaque agent quand il termine',
|
|
590
|
+
'cmd.commit': 'git-commit seulement les fichiers touchés par un agent (ou tous)',
|
|
591
|
+
'cmd.autocommit': 'commit auto session-only des fichiers de chaque agent quand il termine',
|
|
563
592
|
'm.usagePlan': "Usage : /plan [Nom:] <tâche> — l'agent présente son plan et attend votre accord avant de modifier.",
|
|
564
593
|
'm.usageIssue': 'Usage : /issue <numéro> — lance un agent sur cette issue GitHub (CLI gh requise).',
|
|
565
594
|
'm.ghMissing': '✗ CLI gh introuvable. Installez-la (https://cli.github.com) puis `gh auth login`.',
|
|
@@ -584,7 +613,7 @@ const fr = {
|
|
|
584
613
|
'attach.placeholder': 'Message à {agent} (Entrée pour envoyer, /quit pour détacher)…',
|
|
585
614
|
'attach.waiting': 'En attente de l’agent {agent}… (la session Parallel principale tourne-t-elle ?)',
|
|
586
615
|
'attach.gone': 'Session terminée — ce terminal est détaché.',
|
|
587
|
-
'attach.hint': 'texte libre pilote cet agent ·
|
|
616
|
+
'attach.hint': 'texte libre pilote cet agent · @all diffuse · /send route · /task crée · /quit détache',
|
|
588
617
|
'grid.above': '▲ {n} agent(s) au-dessus — PgUp',
|
|
589
618
|
'grid.below': '▼ {n} agent(s) en dessous — PgDn',
|
|
590
619
|
'm.nothing': 'Rien à sauvegarder pour le moment.',
|
|
@@ -599,14 +628,34 @@ const fr = {
|
|
|
599
628
|
'm.copyNone': "Aucun résultat d'agent à copier.",
|
|
600
629
|
'm.copyDone': 'Dernier résultat de {name} copié.',
|
|
601
630
|
'm.unknown': 'Commande inconnue : {cmd} — tape /help',
|
|
631
|
+
'm.projectActive': 'Des agents sont actifs. Sauvegarde/arrête-les d’abord, ou relance avec /project [dossier] --force.',
|
|
632
|
+
'm.wizardActive': 'Des agents sont actifs. Sauvegarde/arrête-les d’abord, ou relance avec /wizard --force.',
|
|
602
633
|
'm.imagesIgnored': "Note : les images jointes ne sont prises en compte qu'au lancement d'un nouvel agent.",
|
|
603
634
|
'm.sessionRestored': '📂 Session du {date} restaurée.',
|
|
604
635
|
'm.usageSession': 'Usage : /sessions pour lister, puis /session <n> ou /session latest',
|
|
605
636
|
'm.sessionLoaded': '📂 Session du {date} chargée.',
|
|
637
|
+
'm.sessionActive': 'Des agents sont actifs. Sauvegarde/arrête-les d’abord, ou relance avec /session <n|latest> --force.',
|
|
638
|
+
'm.sessionRestoreHint': 'Lance /restore <agent> pour relancer une conversation agent sauvegardée.',
|
|
606
639
|
'm.missingProvider': 'Aucun provider configuré. Ouvre /settings → Ajouter un provider, ou relance une première config.',
|
|
607
640
|
'm.missingKey': 'Le provider {name} n’a pas de clef API. Utilise /settings → Providers → Clef API.',
|
|
608
641
|
'm.missingModel': 'Le provider {name} n’a pas de modèle par défaut. Utilise /settings → Modèles du provider.',
|
|
609
642
|
'm.doctorOk': '✓ Configuration prête : {pm}. Changements : /settings · modèle temporaire : /model [provider:]modèle',
|
|
643
|
+
'm.doctorReport': 'Doctor\n{lines}',
|
|
644
|
+
'm.doctorNoProvider': '✗ Aucun provider configuré. Ouvre /settings → Add a provider.',
|
|
645
|
+
'm.doctorProvider': '• Provider : {provider}:{model}',
|
|
646
|
+
'm.doctorKeyMissing': '✗ Clef API manquante. Ouvre /settings → Providers → Clef API.',
|
|
647
|
+
'm.doctorKeyOk': '✓ Clef API présente.',
|
|
648
|
+
'm.doctorKeySkipped': '✓ Clef API non requise pour ce provider local.',
|
|
649
|
+
'm.doctorModelMissing': '✗ Modèle manquant ou encore sur le placeholder. Choisis un vrai modèle dans /settings ou /model.',
|
|
650
|
+
'm.doctorModelOk': '✓ Modèle prêt : {model}',
|
|
651
|
+
'm.doctorEndpointOk': '✓ Endpoint local joignable : {url}',
|
|
652
|
+
'm.doctorEndpointFail': '⚠ Endpoint local non joignable : {url}',
|
|
653
|
+
'm.doctorAttachOk': '✓ Socket attach disponible.',
|
|
654
|
+
'm.doctorAttachMissing': '⚠ Socket attach pas encore lancé.',
|
|
655
|
+
'm.doctorGitOk': '✓ CLI git trouvé.',
|
|
656
|
+
'm.doctorGitMissing': '⚠ CLI git introuvable.',
|
|
657
|
+
'm.doctorGhOk': '✓ CLI gh trouvé pour /issue.',
|
|
658
|
+
'm.doctorGhMissing': '⚠ CLI gh introuvable ; /issue nécessite gh et une auth GitHub.',
|
|
610
659
|
'm.spawnFail': "Impossible de lancer l'agent : aucun provider/modèle utilisable. Configure-en un via /settings.",
|
|
611
660
|
'set.title': '⚙ RÉGLAGES — globaux (persistés dans ~/.parallel/config.json)',
|
|
612
661
|
'sset.title': '⚙ RÉGLAGES DE SESSION — cette session uniquement (globaux : /settings)',
|
|
@@ -622,8 +671,13 @@ const fr = {
|
|
|
622
671
|
'set.sound': 'Son par défaut : {state}',
|
|
623
672
|
'set.back': '← Retour',
|
|
624
673
|
'set.saved': '✓ Enregistré dans ~/.parallel/config.json',
|
|
674
|
+
'set.sessionProviderReady': '✓ {name} est prêt pour cette session seulement.',
|
|
675
|
+
'set.setupScope.title': 'Utiliser {name} seulement maintenant, ou le sauvegarder globalement ?',
|
|
676
|
+
'set.setupScope.session': 'Utiliser pour cette session seulement',
|
|
677
|
+
'set.setupScope.global': 'Sauvegarder globalement',
|
|
625
678
|
'set.chooseProvider': 'Choisis un provider',
|
|
626
679
|
'set.chooseModel': 'Modèle ({name}) — choisis ou tape un nom selon la doc du provider',
|
|
680
|
+
'set.modelPlaceholder': 'Choisis ou tape d’abord un vrai nom de modèle. `your-model-here` est seulement un placeholder.',
|
|
627
681
|
'sset.model': 'Modèle de session : {pm}',
|
|
628
682
|
'sset.approvals': 'Approbations shell (session) : {mode}',
|
|
629
683
|
'sset.sound': 'Son (session) : {state}',
|
|
@@ -786,13 +840,14 @@ const es = {
|
|
|
786
840
|
'board.agents': 'Agentes:',
|
|
787
841
|
'board.none': '(sin agentes)',
|
|
788
842
|
'board.activity': 'Quién trabaja dónde (actividad de archivos, sin bloqueos):',
|
|
843
|
+
'board.workMap': 'Avisos del mapa de trabajo:',
|
|
789
844
|
'board.noActivity': '(sin modificaciones por ahora)',
|
|
790
845
|
'board.notes': 'Últimas notas:',
|
|
791
846
|
'notes.title': '✉ NOTAS ENTRE AGENTES (últimas 30)',
|
|
792
847
|
'notes.empty': 'Aún no se han intercambiado notas.',
|
|
793
848
|
'sessions.title': '📂 SESIONES GUARDADAS',
|
|
794
849
|
'sessions.empty': 'Aún no hay sesiones guardadas para este proyecto.',
|
|
795
|
-
'sessions.item': '{date} · {agents} agente(s)',
|
|
850
|
+
'sessions.item': '{name}{date} · {agents} agente(s)',
|
|
796
851
|
'sessions.hint': 'Restaura una con /session <n> o /session latest. Los nuevos lanzamientos empiezan vacíos por defecto.',
|
|
797
852
|
'diff.title': '± DIFFS EN VIVO — {total} cambio(s) en total (últimos 4 mostrados)',
|
|
798
853
|
'diff.empty': 'Sin cambios de archivos por ahora.',
|
|
@@ -808,7 +863,7 @@ const es = {
|
|
|
808
863
|
'help.l2d': ' para todos).',
|
|
809
864
|
'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.',
|
|
810
865
|
'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).',
|
|
811
|
-
'help.keys': 'Esc: volver a la vista de agentes · Tab: autocompletar · ↑/↓: sugerencias, historial o scroll de vista · Ctrl+V: pegar imagen',
|
|
866
|
+
'help.keys': 'Esc: volver a la vista de agentes · Tab: autocompletar · PgUp/PgDn: scroll hub/focus · ↑/↓: sugerencias, historial o scroll de vista · Ctrl+V: pegar imagen',
|
|
812
867
|
'cmd.ask': 'Agente ask: responde y aconseja sin editar',
|
|
813
868
|
'cmd.task': 'Agente task: ejecuta, edita, valida y resume',
|
|
814
869
|
'cmd.agents': 'Vista de paneles de agentes (tiempo real)',
|
|
@@ -842,7 +897,7 @@ const es = {
|
|
|
842
897
|
'cmd.model': 'Mostrar/cambiar el modelo de la sesión ([proveedor:]modelo)',
|
|
843
898
|
'cmd.sessions': 'Listar las sesiones guardadas de este proyecto',
|
|
844
899
|
'cmd.session': 'Restaurar una sesión guardada por número, o latest',
|
|
845
|
-
'cmd.doctor': '
|
|
900
|
+
'cmd.doctor': 'Ejecutar diagnósticos locales de readiness',
|
|
846
901
|
'cmd.settings': 'Ajustes globales — proveedores, claves API, idioma, valores por defecto (persistentes)',
|
|
847
902
|
'cmd.ssettings': 'Ajustes de sesión — modelo, aprobaciones, sonido (solo esta sesión)',
|
|
848
903
|
'cmd.project': 'Cambiar carpeta del proyecto o reabrir selector de carpeta',
|
|
@@ -860,7 +915,7 @@ const es = {
|
|
|
860
915
|
'm.usageAsk': 'Uso: /ask [Nombre:] <pregunta> [--model=m] — solo asesoría, sin ediciones.',
|
|
861
916
|
'm.usageSpawn': 'Uso: /task [Nombre:] <tarea> [--model=m]',
|
|
862
917
|
'm.usageAt': 'Uso: @Agente <mensaje> (o @all <mensaje>)',
|
|
863
|
-
'm.broadcast': '✉ Instrucción
|
|
918
|
+
'm.broadcast': '✉ Instrucción enviada a {n} agente(s) activo(s).',
|
|
864
919
|
'm.sent': '✉ Instrucción enviada a {target}.',
|
|
865
920
|
'm.notFound': 'Agente no encontrado: {target} (agentes: {list})',
|
|
866
921
|
'm.none': 'ninguno',
|
|
@@ -891,14 +946,15 @@ const es = {
|
|
|
891
946
|
'm.focusHint': '🎯 foco {name} · escribe para hablarle · PgUp/PgDn desplazamiento · Esc para salir',
|
|
892
947
|
'm.usageRestore': 'Uso: /restore <agente> (tras cargar una sesión con /session)',
|
|
893
948
|
'm.restored': '⏪ {name} relanzado con su conversación anterior.',
|
|
949
|
+
'm.noRestoredAgent': 'No hay ningún agente llamado "{name}" en la sesión restaurada.',
|
|
894
950
|
'm.noConversation': 'No hay conversación guardada para "{name}" en la sesión restaurada.',
|
|
895
951
|
'm.conflict': '⚠ {path}: colisiones repetidas entre agentes — considera arbitrar (@agente o /focus).',
|
|
896
952
|
'status.bar': '⚡ {agents} agente(s) · {active} activo(s) · {cost}',
|
|
897
953
|
'cmd.plan': 'Agente plan: presenta su plan, solo edita tras tu aprobación',
|
|
898
|
-
'cmd.issue': 'lanza un agente sobre una issue de GitHub (requiere
|
|
954
|
+
'cmd.issue': 'lanza un agente sobre una issue de GitHub (requiere gh, repo GitHub y auth)',
|
|
899
955
|
'cmd.undo': 'revierte el último cambio de archivo del agente',
|
|
900
|
-
'cmd.commit': 'git-commit de
|
|
901
|
-
'cmd.autocommit': 'commit automático de
|
|
956
|
+
'cmd.commit': 'git-commit solo de archivos tocados por un agente (o todos)',
|
|
957
|
+
'cmd.autocommit': 'commit automático session-only de archivos de cada agente al terminar',
|
|
902
958
|
'm.usagePlan': 'Uso: /plan [Nombre:] <tarea> — el agente presenta su plan y espera tu aprobación antes de editar.',
|
|
903
959
|
'm.usageIssue': 'Uso: /issue <número> — lanza un agente sobre esa issue de GitHub (requiere la CLI gh).',
|
|
904
960
|
'm.ghMissing': '✗ CLI gh no encontrada. Instálala (https://cli.github.com) y ejecuta `gh auth login`.',
|
|
@@ -923,7 +979,7 @@ const es = {
|
|
|
923
979
|
'attach.placeholder': 'Mensaje a {agent} (Enter para enviar, /quit para desconectar)…',
|
|
924
980
|
'attach.waiting': 'Esperando al agente {agent}… (¿está corriendo la sesión principal de Parallel?)',
|
|
925
981
|
'attach.gone': 'Sesión terminada — esta terminal está desconectada.',
|
|
926
|
-
'attach.hint': 'texto libre dirige a este agente ·
|
|
982
|
+
'attach.hint': 'texto libre dirige a este agente · @all difunde · /send enruta · /task crea · /quit desconecta',
|
|
927
983
|
'grid.above': '▲ {n} agente(s) arriba — PgUp',
|
|
928
984
|
'grid.below': '▼ {n} agente(s) abajo — PgDn',
|
|
929
985
|
'm.nothing': 'Nada que guardar por ahora.',
|
|
@@ -938,14 +994,34 @@ const es = {
|
|
|
938
994
|
'm.copyNone': 'No hay resultado de agente que copiar.',
|
|
939
995
|
'm.copyDone': 'Último resultado de {name} copiado.',
|
|
940
996
|
'm.unknown': 'Comando desconocido: {cmd} — escribe /help',
|
|
997
|
+
'm.projectActive': 'Hay agentes activos. Guarda/deténlos primero, o vuelve a ejecutar con /project [carpeta] --force.',
|
|
998
|
+
'm.wizardActive': 'Hay agentes activos. Guarda/deténlos primero, o vuelve a ejecutar con /wizard --force.',
|
|
941
999
|
'm.imagesIgnored': 'Nota: las imágenes adjuntas solo se tienen en cuenta al lanzar un agente nuevo.',
|
|
942
1000
|
'm.sessionRestored': '📂 Sesión del {date} restaurada.',
|
|
943
1001
|
'm.usageSession': 'Uso: /sessions para listar, luego /session <n> o /session latest',
|
|
944
1002
|
'm.sessionLoaded': '📂 Sesión del {date} cargada.',
|
|
1003
|
+
'm.sessionActive': 'Hay agentes activos. Guárdalos/deténlos primero, o vuelve a ejecutar con /session <n|latest> --force.',
|
|
1004
|
+
'm.sessionRestoreHint': 'Ejecuta /restore <agente> para relanzar una conversación guardada.',
|
|
945
1005
|
'm.missingProvider': 'No hay proveedor configurado. Abre /settings → Añadir proveedor, o reinicia con configuración inicial.',
|
|
946
1006
|
'm.missingKey': 'El proveedor {name} no tiene clave API. Usa /settings → Providers → Clave API.',
|
|
947
1007
|
'm.missingModel': 'El proveedor {name} no tiene modelo por defecto. Usa /settings → Modelos del proveedor.',
|
|
948
1008
|
'm.doctorOk': '✓ Configuración lista: {pm}. Cambios: /settings · modelo temporal: /model [proveedor:]modelo',
|
|
1009
|
+
'm.doctorReport': 'Doctor\n{lines}',
|
|
1010
|
+
'm.doctorNoProvider': '✗ No hay proveedor configurado. Abre /settings → Add a provider.',
|
|
1011
|
+
'm.doctorProvider': '• Proveedor: {provider}:{model}',
|
|
1012
|
+
'm.doctorKeyMissing': '✗ Falta la clave API. Abre /settings → Providers → Clave API.',
|
|
1013
|
+
'm.doctorKeyOk': '✓ Clave API presente.',
|
|
1014
|
+
'm.doctorKeySkipped': '✓ Este proveedor local no requiere clave API.',
|
|
1015
|
+
'm.doctorModelMissing': '✗ Falta el modelo o sigue usando el placeholder. Elige un modelo real en /settings o /model.',
|
|
1016
|
+
'm.doctorModelOk': '✓ Modelo listo: {model}',
|
|
1017
|
+
'm.doctorEndpointOk': '✓ Endpoint local accesible: {url}',
|
|
1018
|
+
'm.doctorEndpointFail': '⚠ Endpoint local no accesible: {url}',
|
|
1019
|
+
'm.doctorAttachOk': '✓ Socket attach disponible.',
|
|
1020
|
+
'm.doctorAttachMissing': '⚠ Socket attach aún no está activo.',
|
|
1021
|
+
'm.doctorGitOk': '✓ CLI git encontrado.',
|
|
1022
|
+
'm.doctorGitMissing': '⚠ CLI git no encontrado.',
|
|
1023
|
+
'm.doctorGhOk': '✓ CLI gh encontrado para /issue.',
|
|
1024
|
+
'm.doctorGhMissing': '⚠ CLI gh no encontrado; /issue necesita gh y auth de GitHub.',
|
|
949
1025
|
'm.spawnFail': 'No se puede lanzar el agente: ningún provider/modelo utilizable. Configura uno con /settings.',
|
|
950
1026
|
'set.title': '⚙ AJUSTES — globales (persistentes en ~/.parallel/config.json)',
|
|
951
1027
|
'sset.title': '⚙ AJUSTES DE SESIÓN — solo esta sesión (globales: /settings)',
|
|
@@ -961,8 +1037,13 @@ const es = {
|
|
|
961
1037
|
'set.sound': 'Sonido por defecto: {state}',
|
|
962
1038
|
'set.back': '← Volver',
|
|
963
1039
|
'set.saved': '✓ Guardado en ~/.parallel/config.json',
|
|
1040
|
+
'set.sessionProviderReady': '✓ {name} está listo solo para esta sesión.',
|
|
1041
|
+
'set.setupScope.title': '¿Usar {name} solo ahora o guardarlo globalmente?',
|
|
1042
|
+
'set.setupScope.session': 'Usar solo en esta sesión',
|
|
1043
|
+
'set.setupScope.global': 'Guardar globalmente',
|
|
964
1044
|
'set.chooseProvider': 'Elige un proveedor',
|
|
965
1045
|
'set.chooseModel': 'Modelo ({name}) — elige o escribe un nombre según la doc del proveedor',
|
|
1046
|
+
'set.modelPlaceholder': 'Elige o escribe primero un modelo real. `your-model-here` es solo un placeholder.',
|
|
966
1047
|
'sset.model': 'Modelo de sesión: {pm}',
|
|
967
1048
|
'sset.approvals': 'Aprobaciones shell (sesión): {mode}',
|
|
968
1049
|
'sset.sound': 'Sonido (sesión): {state}',
|
|
@@ -1125,13 +1206,14 @@ const zh = {
|
|
|
1125
1206
|
'board.agents': '智能体:',
|
|
1126
1207
|
'board.none': '(无智能体)',
|
|
1127
1208
|
'board.activity': '谁在哪里工作(文件活动,无锁定):',
|
|
1209
|
+
'board.workMap': '工作地图提醒:',
|
|
1128
1210
|
'board.noActivity': '(暂无修改)',
|
|
1129
1211
|
'board.notes': '最新便签:',
|
|
1130
1212
|
'notes.title': '✉ 智能体间便签(最近 30 条)',
|
|
1131
1213
|
'notes.empty': '尚未交换任何便签。',
|
|
1132
1214
|
'sessions.title': '📂 已保存会话',
|
|
1133
1215
|
'sessions.empty': '此项目暂无已保存会话。',
|
|
1134
|
-
'sessions.item': '{date} · {agents} 个智能体',
|
|
1216
|
+
'sessions.item': '{name}{date} · {agents} 个智能体',
|
|
1135
1217
|
'sessions.hint': '用 /session <n> 或 /session latest 恢复。新的启动默认从空会话开始。',
|
|
1136
1218
|
'diff.title': '± 实时差异 — 共 {total} 处修改(显示最近 4 处)',
|
|
1137
1219
|
'diff.empty': '暂无文件修改。',
|
|
@@ -1147,7 +1229,7 @@ const zh = {
|
|
|
1147
1229
|
'help.l2d': ' 发给所有)。',
|
|
1148
1230
|
'help.l3': '每次行动前,智能体都能看到彼此的状态和差异:它们共同编辑同一批文件,互不阻塞,也不破坏彼此的工作。',
|
|
1149
1231
|
'help.states': '状态:🔨 工作中 · 👂 倾听其他智能体(双边框)· 🧠 思考中 · ✋ 等待你的批准 · ⏹ 停止。声音:1 声 = 智能体启动/完成,2 声 = 需要批准(/sound off 静音)。',
|
|
1150
|
-
'help.keys': 'Esc:返回智能体视图 · Tab:补全 · ↑/↓:建议、历史或视图滚动 · Ctrl+V:粘贴图片',
|
|
1232
|
+
'help.keys': 'Esc:返回智能体视图 · Tab:补全 · PgUp/PgDn:hub/focus 滚动 · ↑/↓:建议、历史或视图滚动 · Ctrl+V:粘贴图片',
|
|
1151
1233
|
'cmd.ask': 'Ask 智能体:只回答和建议,不编辑',
|
|
1152
1234
|
'cmd.task': 'Task 智能体:执行、编辑、验证并总结',
|
|
1153
1235
|
'cmd.agents': '智能体面板视图(实时)',
|
|
@@ -1181,7 +1263,7 @@ const zh = {
|
|
|
1181
1263
|
'cmd.model': '显示/更改会话模型([提供商:]模型)',
|
|
1182
1264
|
'cmd.sessions': '列出此项目的已保存会话',
|
|
1183
1265
|
'cmd.session': '按编号或 latest 恢复已保存会话',
|
|
1184
|
-
'cmd.doctor': '
|
|
1266
|
+
'cmd.doctor': '运行本地就绪诊断',
|
|
1185
1267
|
'cmd.settings': '全局设置 — 提供商、API 密钥、语言、默认值(持久化)',
|
|
1186
1268
|
'cmd.ssettings': '会话设置 — 模型、批准、声音(仅本会话)',
|
|
1187
1269
|
'cmd.project': '更改项目文件夹或重新打开文件夹选择器',
|
|
@@ -1199,7 +1281,7 @@ const zh = {
|
|
|
1199
1281
|
'm.usageAsk': '用法:/ask [名称:] <问题> [--model=m] — 仅建议,不修改。',
|
|
1200
1282
|
'm.usageSpawn': '用法:/task [名称:] <任务> [--model=m]',
|
|
1201
1283
|
'm.usageAt': '用法:@智能体 <消息>(或 @all <消息>)',
|
|
1202
|
-
'm.broadcast': '✉
|
|
1284
|
+
'm.broadcast': '✉ 指令已发送给 {n} 个活动智能体。',
|
|
1203
1285
|
'm.sent': '✉ 指令已发送给 {target}。',
|
|
1204
1286
|
'm.notFound': '找不到智能体:{target}(现有:{list})',
|
|
1205
1287
|
'm.none': '无',
|
|
@@ -1230,14 +1312,15 @@ const zh = {
|
|
|
1230
1312
|
'm.focusHint': '🎯 聚焦 {name} · 直接输入与它对话 · PgUp/PgDn 滚动 · Esc 退出',
|
|
1231
1313
|
'm.usageRestore': '用法:/restore <代理>(先用 /session 加载会话)',
|
|
1232
1314
|
'm.restored': '⏪ {name} 已带着之前的对话重新启动。',
|
|
1315
|
+
'm.noRestoredAgent': '恢复的会话中没有名为「{name}」的代理。',
|
|
1233
1316
|
'm.noConversation': '恢复的会话中没有「{name}」的已保存对话。',
|
|
1234
1317
|
'm.conflict': '⚠ {path}:代理之间反复冲突 — 建议你介入仲裁(@代理 或 /focus)。',
|
|
1235
1318
|
'status.bar': '⚡ {agents} 个代理 · {active} 个活跃 · {cost}',
|
|
1236
1319
|
'cmd.plan': 'Plan 智能体:先给出计划,你批准后才开始修改',
|
|
1237
|
-
'cmd.issue': '基于 GitHub issue 启动代理(需要 gh
|
|
1320
|
+
'cmd.issue': '基于 GitHub issue 启动代理(需要 gh、GitHub 仓库和登录)',
|
|
1238
1321
|
'cmd.undo': '撤销该代理最近一次文件修改',
|
|
1239
|
-
'cmd.commit': '
|
|
1240
|
-
'cmd.autocommit': '
|
|
1322
|
+
'cmd.commit': '仅提交某个代理(或全部)改动过的文件',
|
|
1323
|
+
'cmd.autocommit': '会话内自动提交每个代理完成时改动过的文件',
|
|
1241
1324
|
'm.usagePlan': '用法:/plan [名称:] <任务> — 代理先呈现计划,获得你的批准后才开始修改。',
|
|
1242
1325
|
'm.usageIssue': '用法:/issue <编号> — 基于该 GitHub issue 启动代理(需要 gh CLI)。',
|
|
1243
1326
|
'm.ghMissing': '✗ 未找到 gh CLI。请安装(https://cli.github.com)并执行 `gh auth login`。',
|
|
@@ -1262,7 +1345,7 @@ const zh = {
|
|
|
1262
1345
|
'attach.placeholder': '发给 {agent} 的消息(回车发送,/quit 断开)…',
|
|
1263
1346
|
'attach.waiting': '等待代理 {agent}…(Parallel 主会话在运行吗?)',
|
|
1264
1347
|
'attach.gone': '会话已结束 — 此终端已断开。',
|
|
1265
|
-
'attach.hint': '直接输入文字可指挥此代理 ·
|
|
1348
|
+
'attach.hint': '直接输入文字可指挥此代理 · @all 广播 · /send 路由 · /task 创建 · /quit 断开',
|
|
1266
1349
|
'grid.above': '▲ 上方还有 {n} 个代理 — PgUp',
|
|
1267
1350
|
'grid.below': '▼ 下方还有 {n} 个代理 — PgDn',
|
|
1268
1351
|
'm.nothing': '暂无可保存的内容。',
|
|
@@ -1277,14 +1360,34 @@ const zh = {
|
|
|
1277
1360
|
'm.copyNone': '没有可复制的已完成智能体输出。',
|
|
1278
1361
|
'm.copyDone': '已复制 {name} 的最新结果。',
|
|
1279
1362
|
'm.unknown': '未知命令:{cmd} — 输入 /help',
|
|
1363
|
+
'm.projectActive': '仍有活动智能体。请先保存/停止,或使用 /project [文件夹] --force。',
|
|
1364
|
+
'm.wizardActive': '仍有活动智能体。请先保存/停止,或使用 /wizard --force。',
|
|
1280
1365
|
'm.imagesIgnored': '注意:附加的图片仅在启动新智能体时生效。',
|
|
1281
1366
|
'm.sessionRestored': '📂 已恢复 {date} 的会话。',
|
|
1282
1367
|
'm.usageSession': '用法:先用 /sessions 列出,然后 /session <n> 或 /session latest',
|
|
1283
1368
|
'm.sessionLoaded': '📂 已加载 {date} 的会话。',
|
|
1369
|
+
'm.sessionActive': '仍有活动代理。请先保存/停止,或使用 /session <n|latest> --force。',
|
|
1370
|
+
'm.sessionRestoreHint': '运行 /restore <代理> 重新启动已保存的代理对话。',
|
|
1284
1371
|
'm.missingProvider': '未配置提供商。打开 /settings → 添加提供商,或重新进行首次配置。',
|
|
1285
1372
|
'm.missingKey': '提供商 {name} 没有 API 密钥。使用 /settings → Providers → API 密钥。',
|
|
1286
1373
|
'm.missingModel': '提供商 {name} 没有默认模型。使用 /settings → 提供商模型。',
|
|
1287
1374
|
'm.doctorOk': '✓ 配置就绪:{pm}。修改:/settings · 临时模型:/model [提供商:]模型',
|
|
1375
|
+
'm.doctorReport': 'Doctor\n{lines}',
|
|
1376
|
+
'm.doctorNoProvider': '✗ 未配置提供商。打开 /settings → Add a provider。',
|
|
1377
|
+
'm.doctorProvider': '• 提供商:{provider}:{model}',
|
|
1378
|
+
'm.doctorKeyMissing': '✗ 缺少 API 密钥。打开 /settings → Providers → API 密钥。',
|
|
1379
|
+
'm.doctorKeyOk': '✓ API 密钥已设置。',
|
|
1380
|
+
'm.doctorKeySkipped': '✓ 此本地提供商不需要 API 密钥。',
|
|
1381
|
+
'm.doctorModelMissing': '✗ 模型缺失或仍是占位符。请在 /settings 或 /model 选择真实模型。',
|
|
1382
|
+
'm.doctorModelOk': '✓ 模型就绪:{model}',
|
|
1383
|
+
'm.doctorEndpointOk': '✓ 本地端点可访问:{url}',
|
|
1384
|
+
'm.doctorEndpointFail': '⚠ 本地端点不可访问:{url}',
|
|
1385
|
+
'm.doctorAttachOk': '✓ attach socket 可用。',
|
|
1386
|
+
'm.doctorAttachMissing': '⚠ attach socket 尚未运行。',
|
|
1387
|
+
'm.doctorGitOk': '✓ 找到 git CLI。',
|
|
1388
|
+
'm.doctorGitMissing': '⚠ 未找到 git CLI。',
|
|
1389
|
+
'm.doctorGhOk': '✓ 找到 gh CLI,可用于 /issue。',
|
|
1390
|
+
'm.doctorGhMissing': '⚠ 未找到 gh CLI;/issue 需要 gh 和 GitHub 登录。',
|
|
1288
1391
|
'm.spawnFail': '无法启动智能体:没有可用的 provider/模型。请通过 /settings 配置。',
|
|
1289
1392
|
'set.title': '⚙ 设置 — 全局(持久化于 ~/.parallel/config.json)',
|
|
1290
1393
|
'sset.title': '⚙ 会话设置 — 仅本会话(全局设置:/settings)',
|
|
@@ -1300,8 +1403,13 @@ const zh = {
|
|
|
1300
1403
|
'set.sound': '默认声音:{state}',
|
|
1301
1404
|
'set.back': '← 返回',
|
|
1302
1405
|
'set.saved': '✓ 已保存到 ~/.parallel/config.json',
|
|
1406
|
+
'set.sessionProviderReady': '✓ {name} 仅在本会话中可用。',
|
|
1407
|
+
'set.setupScope.title': '仅现在使用 {name},还是全局保存?',
|
|
1408
|
+
'set.setupScope.session': '仅用于本会话',
|
|
1409
|
+
'set.setupScope.global': '全局保存',
|
|
1303
1410
|
'set.chooseProvider': '选择提供商',
|
|
1304
1411
|
'set.chooseModel': '模型({name})— 选择或按提供商文档输入名称',
|
|
1412
|
+
'set.modelPlaceholder': '请先选择或输入真实模型名。`your-model-here` 只是占位符。',
|
|
1305
1413
|
'sset.model': '会话模型:{pm}',
|
|
1306
1414
|
'sset.approvals': 'Shell 批准(会话):{mode}',
|
|
1307
1415
|
'sset.sound': '声音(会话):{state}',
|
package/dist/index.js
CHANGED
|
@@ -44,8 +44,8 @@ Usage:
|
|
|
44
44
|
auto-approved commands, summary (or JSON) on stdout — for CI
|
|
45
45
|
|
|
46
46
|
Environment variables:
|
|
47
|
-
PARALLEL_API_KEY
|
|
48
|
-
PARALLEL_MODEL Default model
|
|
47
|
+
PARALLEL_API_KEY API key for the default provider
|
|
48
|
+
PARALLEL_MODEL Default model
|
|
49
49
|
PARALLEL_BASE_URL OpenAI-compatible endpoint
|
|
50
50
|
PARALLEL_NO_ALT_SCREEN=1 Disable the alternate terminal screen.
|
|
51
51
|
|
|
@@ -108,7 +108,7 @@ if (headless) {
|
|
|
108
108
|
ctl.setSessionApprovalMode('yolo');
|
|
109
109
|
const provider = ctl.sessionProvider();
|
|
110
110
|
if (!provider || !providerReady(provider)) {
|
|
111
|
-
console.error('Headless mode needs a
|
|
111
|
+
console.error('Headless mode needs a ready provider and model. Run `parallel` interactively once, or set PARALLEL_API_KEY / PARALLEL_MODEL.');
|
|
112
112
|
process.exit(1);
|
|
113
113
|
}
|
|
114
114
|
// Agent questions cannot be asked: auto-answer with the recommended option.
|
package/dist/server.js
CHANGED
|
@@ -108,6 +108,16 @@ export function startSessionServer(ctl) {
|
|
|
108
108
|
else if (msg.type === 'answer' && typeof msg.id === 'number' && typeof msg.text === 'string') {
|
|
109
109
|
ctl.answerQuestion(msg.id, msg.text);
|
|
110
110
|
}
|
|
111
|
+
else if (msg.type === 'send' && typeof msg.target === 'string' && typeof msg.text === 'string') {
|
|
112
|
+
const text = msg.text.trim();
|
|
113
|
+
const target = msg.target.trim();
|
|
114
|
+
if (!text || !target)
|
|
115
|
+
continue;
|
|
116
|
+
if (target.toLowerCase() === 'all')
|
|
117
|
+
ctl.broadcast(text);
|
|
118
|
+
else
|
|
119
|
+
ctl.sendToAgent(target, text);
|
|
120
|
+
}
|
|
111
121
|
else if (msg.type === 'spawn' && typeof msg.text === 'string') {
|
|
112
122
|
// Agent N+1 can be launched from ANY terminal of the session —
|
|
113
123
|
// its own dedicated terminal then opens automatically.
|
package/dist/ui/AgentPanel.js
CHANGED
|
@@ -7,6 +7,7 @@ import { Md } from './Md.js';
|
|
|
7
7
|
import { Spinner } from './Spinner.js';
|
|
8
8
|
import { Timeline } from './Timeline.js';
|
|
9
9
|
import { MARK, MODE, STATE_META, UI, ANIM } from './tokens.js';
|
|
10
|
+
import { latestSignal, toUIEvents } from './events.js';
|
|
10
11
|
export const KIND_COLOR = {
|
|
11
12
|
tool: UI.accent,
|
|
12
13
|
llm: UI.muted,
|
|
@@ -26,7 +27,19 @@ export function cleanHubSummary(text) {
|
|
|
26
27
|
.trim();
|
|
27
28
|
}
|
|
28
29
|
export function formatAgentTelemetry(agent) {
|
|
29
|
-
|
|
30
|
+
const ctx = agent.ctxPct !== undefined ? ` · ${agent.ctxPct}% ctx` : '';
|
|
31
|
+
return `${elapsed(agent.startedAt)}${ctx} · ${agent.cost === null ? '$-' : fmtCost(agent.cost)}`;
|
|
32
|
+
}
|
|
33
|
+
function compactResultSummary(text, max) {
|
|
34
|
+
const clean = cleanHubSummary(text);
|
|
35
|
+
const validation = text.match(/validation[^:\n]*[:\n]\s*([^\n]+)/i)?.[1]?.trim();
|
|
36
|
+
const risk = text.match(/risks?[^:\n]*[:\n]\s*([^\n]+)/i)?.[1]?.trim() ?? text.match(/risques?[^:\n]*[:\n]\s*([^\n]+)/i)?.[1]?.trim();
|
|
37
|
+
const parts = [clean.slice(0, Math.max(40, Math.floor(max * 0.55)))];
|
|
38
|
+
if (validation)
|
|
39
|
+
parts.push(`V: ${validation}`);
|
|
40
|
+
if (risk)
|
|
41
|
+
parts.push(`R: ${risk}`);
|
|
42
|
+
return truncate(parts.join(' · '), max);
|
|
30
43
|
}
|
|
31
44
|
function ResultBlock({ agent, compact = false }) {
|
|
32
45
|
if (!agent.lastResult)
|
|
@@ -72,22 +85,24 @@ export function AgentRow({ agent, logs, cols, }) {
|
|
|
72
85
|
const taskMax = Math.max(10, cols - 18);
|
|
73
86
|
const line2Max = Math.max(10, cols - 2);
|
|
74
87
|
const telemetry = formatAgentTelemetry(agent);
|
|
88
|
+
const signal = latestSignal(agent, toUIEvents(logs));
|
|
89
|
+
const specialist = agent.specialist ? ` #${agent.specialist}` : '';
|
|
75
90
|
// Line 2 content
|
|
76
91
|
let line2 = null;
|
|
77
92
|
if (agent.lastResult) {
|
|
78
|
-
line2 = { text: `✓ ${
|
|
93
|
+
line2 = { text: `✓ ${compactResultSummary(agent.lastResult, line2Max)}`, color: UI.ok };
|
|
79
94
|
}
|
|
80
|
-
else if (
|
|
81
|
-
line2 = { text: `▸ ${truncate(
|
|
95
|
+
else if (signal) {
|
|
96
|
+
line2 = { text: `▸ ${truncate(signal, line2Max)}`, color: UI.accent };
|
|
82
97
|
}
|
|
83
98
|
else {
|
|
84
99
|
line2 = { text: meta.label, color: meta.color };
|
|
85
100
|
}
|
|
86
|
-
return (_jsxs(Box, { flexDirection: "column", marginBottom: 0, paddingLeft: 1, children: [_jsxs(Text, { wrap: "truncate-end", children: [SPINNER_STATES.has(agent.state) ? (_jsx(Spinner, { color: pulseColor ?? spinnerColor(agent.state) })) : (_jsx(Text, { color: pulseColor ?? meta.color, bold: true, children: meta.mark })), _jsx(Text, { children: " " }), _jsx(Text, { color: agent.color, bold: true, children: name }), mode ? (_jsxs(Text, { color: mode.color, children: [" ", mode.char] })) : null, _jsxs(Text, { color: UI.text, children: [" ", truncate(agent.task, taskMax)] })] }), _jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Text, { color: line2.color, wrap: "truncate-end", children: line2.text }), _jsx(Text, { color: UI.muted, children: telemetry })] })] }));
|
|
101
|
+
return (_jsxs(Box, { flexDirection: "column", marginBottom: 0, paddingLeft: 1, children: [_jsxs(Text, { wrap: "truncate-end", children: [SPINNER_STATES.has(agent.state) ? (_jsx(Spinner, { color: pulseColor ?? spinnerColor(agent.state) })) : (_jsx(Text, { color: pulseColor ?? meta.color, bold: true, children: meta.mark })), _jsx(Text, { children: " " }), _jsx(Text, { color: agent.color, bold: true, children: name }), mode ? (_jsxs(Text, { color: mode.color, children: [" ", mode.char] })) : null, specialist ? _jsx(Text, { color: UI.note, children: specialist }) : null, _jsxs(Text, { color: UI.text, children: [" ", truncate(agent.task, taskMax)] })] }), _jsxs(Box, { flexDirection: "row", justifyContent: "space-between", children: [_jsx(Text, { color: line2.color, wrap: "truncate-end", children: line2.text }), _jsx(Text, { color: UI.muted, children: telemetry })] })] }));
|
|
87
102
|
}
|
|
88
|
-
export function AgentTranscript({ agent, logs, raw = false, scrolled = 0, }) {
|
|
103
|
+
export function AgentTranscript({ agent, logs, raw = false, scrolled = 0, cols = 100, }) {
|
|
89
104
|
const meta = STATE_META[agent.state];
|
|
90
|
-
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Text, { children: [_jsx(Text, { color: agent.color, bold: true, children: agent.name }), agent.alias && agent.alias !== agent.name ? _jsxs(Text, { color: UI.muted, children: [" @", agent.alias] }) : null, _jsx(Text, { color: UI.muted, children: " " }), _jsxs(Text, { color: meta.color, bold: true, children: [meta.mark, " ", meta.label] })] }), _jsxs(Text, { color: UI.muted, wrap: "truncate-end", children: [agent.model, " \u00B7 ", formatAgentTelemetry(agent)] })] }), _jsxs(Text, { color: UI.muted, wrap: "wrap", children: ["Task ", _jsx(Text, { color: UI.text, children: agent.task })] }), agent.claims && agent.claims.length > 0 ? (_jsxs(Text, { color: UI.warn, wrap: "truncate-end", children: ["Claims ", agent.claims.join(' ')] })) : null, agent.currentAction ? (_jsxs(Text, { color: UI.accent, wrap: "truncate-end", children: ["Current ", truncate(agent.currentAction, 140)] })) : null, agent.state === 'done' || agent.lastResult ? _jsx(ResultBlock, { agent: agent }) : null, _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: UI.muted, bold: true, children: ["Activity", raw ? ' raw' : ''] }), _jsx(Timeline, { logs: logs, raw: raw })] }), _jsxs(Text, { color: UI.muted, wrap: "truncate-end", children: ["PgUp/PgDn scroll \u00B7 /raw toggles detail \u00B7 Esc returns", scrolled > 0 ? ` · ${scrolled} older` : ''] })] }));
|
|
105
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { justifyContent: "space-between", children: [_jsxs(Text, { children: [_jsx(Text, { color: agent.color, bold: true, children: agent.name }), agent.alias && agent.alias !== agent.name ? _jsxs(Text, { color: UI.muted, children: [" @", agent.alias] }) : null, _jsx(Text, { color: UI.muted, children: " " }), _jsxs(Text, { color: meta.color, bold: true, children: [meta.mark, " ", meta.label] })] }), _jsxs(Text, { color: UI.muted, wrap: "truncate-end", children: [agent.model, " \u00B7 ", formatAgentTelemetry(agent)] })] }), _jsxs(Text, { color: UI.muted, wrap: "wrap", children: ["Task ", _jsx(Text, { color: UI.text, children: agent.task })] }), agent.claims && agent.claims.length > 0 ? (_jsxs(Text, { color: UI.warn, wrap: "truncate-end", children: ["Claims ", agent.claims.join(' ')] })) : null, agent.currentAction ? (_jsxs(Text, { color: UI.accent, wrap: "truncate-end", children: ["Current ", truncate(agent.currentAction, 140)] })) : null, agent.state === 'done' || agent.lastResult ? _jsx(ResultBlock, { agent: agent }) : null, _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsxs(Text, { color: UI.muted, bold: true, children: ["Activity", raw ? ' raw' : ''] }), _jsx(Timeline, { logs: logs, raw: raw, cols: cols })] }), _jsxs(Text, { color: UI.muted, wrap: "truncate-end", children: ["PgUp/PgDn scroll \u00B7 /raw toggles detail \u00B7 Esc returns", scrolled > 0 ? ` · ${scrolled} older` : ''] })] }));
|
|
91
106
|
}
|
|
92
107
|
export function AgentPanel({ agent, logs, width, expanded = false, }) {
|
|
93
108
|
return (_jsx(Box, { width: width, flexDirection: "column", children: expanded ? _jsx(AgentTranscript, { agent: agent, logs: logs }) : _jsx(AgentRow, { agent: agent, logs: logs, cols: 100 }) }));
|