termux-dev 1.8.2 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +15 -5
  2. package/assets/banner.svg +1 -1
  3. package/assets/preview.svg +1 -1
  4. package/dist/cli/background-ui.js +8 -8
  5. package/dist/cli/files.js +2 -12
  6. package/dist/cli/finder.js +4 -0
  7. package/dist/cli/headless.js +3 -2
  8. package/dist/cli/index.js +128 -59
  9. package/dist/cli/keys.js +12 -3
  10. package/dist/cli/liveblock.js +38 -9
  11. package/dist/cli/mcp-panel.js +2 -0
  12. package/dist/cli/picker.js +2 -0
  13. package/dist/cli/prompt.js +54 -7
  14. package/dist/cli/provider-manager.js +197 -0
  15. package/dist/cli/providers.js +0 -5
  16. package/dist/cli/settings.js +38 -17
  17. package/dist/cli/typeahead.js +10 -17
  18. package/dist/cli/ui.js +33 -13
  19. package/dist/cli/usage-panel.js +17 -4
  20. package/dist/cli/width.js +18 -0
  21. package/dist/core/background.js +14 -0
  22. package/dist/core/context-stats.js +1 -0
  23. package/dist/core/cost.js +25 -11
  24. package/dist/core/custom-providers.js +161 -0
  25. package/dist/core/images.js +46 -0
  26. package/dist/core/local-config.js +3 -1
  27. package/dist/core/locales/de.js +36 -7
  28. package/dist/core/locales/en.js +36 -7
  29. package/dist/core/locales/es.js +36 -7
  30. package/dist/core/locales/fr.js +36 -7
  31. package/dist/core/locales/ja.js +36 -7
  32. package/dist/core/locales/pt.js +36 -7
  33. package/dist/core/locales/ru.js +36 -7
  34. package/dist/core/locales/uk.js +36 -7
  35. package/dist/core/locales/zh.js +36 -7
  36. package/dist/core/loop.js +32 -1
  37. package/dist/core/prices.js +8 -4
  38. package/dist/core/session-media.js +115 -0
  39. package/dist/core/session.js +17 -2
  40. package/dist/core/title.js +19 -2
  41. package/dist/core/types.js +1 -1
  42. package/dist/core/usage.js +41 -4
  43. package/dist/permissions/guard.js +3 -0
  44. package/dist/providers/anthropic.js +67 -13
  45. package/dist/providers/index.js +16 -3
  46. package/dist/providers/openai.js +99 -41
  47. package/dist/providers/shared.js +83 -0
  48. package/dist/tools/fs.js +32 -2
  49. package/package.json +1 -1
@@ -27,27 +27,25 @@ export const en = {
27
27
  'conn.classicRestored': '✓ Connection restored! Resuming generation...',
28
28
  'stop.connection': 'connection cancelled',
29
29
  'stop.stopped': 'stopped',
30
- 'stop.interrupted': 'interrupted, sending your message',
31
30
  'stop.classicConnection': 'Connection cancelled (Ctrl+C).',
32
31
  'stop.classicStopped': 'Generation stopped (Ctrl+C).',
33
- 'stop.classicInterrupted': 'Interrupted: sending your message.',
34
32
  // ── the working line
35
33
  'status.waiting': 'Waiting for the model',
36
34
  'status.thinking': 'Thinking',
37
35
  'status.writing': 'Writing',
38
36
  'status.running': 'Running',
39
37
  'status.reconnecting': 'Reconnecting',
40
- 'status.stop': 'ctrl+c to stop',
38
+ 'status.stop': 'esc to stop',
41
39
  'status.thinkingLine': 'thinking',
42
40
  'status.thoughtFor': 'thought for {sec}s',
43
41
  // ── typing while the agent works
44
42
  'composer.placeholder': 'Ask or describe a task…',
45
43
  'composer.queued': 'queued',
46
44
  'composer.queuedMany': '{n} queued',
47
- 'composer.queuedHint': 'ctrl+enter sends now · ↓ edit',
48
- 'composer.hint1': 'enter queues · ctrl+c stop',
45
+ 'composer.queuedHint': '↓ edit',
46
+ 'composer.hint1': 'enter queues · esc stop',
49
47
  'composer.hint2': 'enter queues',
50
- 'composer.hint3': 'enter queues · ctrl+c stop',
48
+ 'composer.hint3': 'enter queues · esc stop',
51
49
  'composer.hint4': 'enter queues',
52
50
  // ── end of a turn
53
51
  'summary.toolOne': '{n} tool',
@@ -65,6 +63,7 @@ export const en = {
65
63
  'settings.row.layout': 'Interface',
66
64
  'settings.row.pureBlack': 'Black background',
67
65
  'settings.row.autoApprove': 'Auto-approve (YOLO)',
66
+ 'settings.row.extra': 'Extra (ask nothing)',
68
67
  'settings.row.maxIterations': 'Max iterations',
69
68
  'settings.row.memory': 'Project memory',
70
69
  'settings.row.updates': 'Update check',
@@ -74,6 +73,7 @@ export const en = {
74
73
  'settings.short.layout': 'Interface',
75
74
  'settings.short.pureBlack': 'Black bg',
76
75
  'settings.short.autoApprove': 'YOLO mode',
76
+ 'settings.short.extra': 'Extra',
77
77
  'settings.short.maxIterations': 'Iterations',
78
78
  'settings.short.memory': 'Memory',
79
79
  'settings.short.updates': 'Updates',
@@ -89,12 +89,15 @@ export const en = {
89
89
  'settings.hint.layout': 'Clean: framed prompt, cards and quiet tool lines. Classic: the original ASCII layout.',
90
90
  'settings.hint.pureBlack': 'Sets the terminal background to deep OLED black (#0a0a0c). Off keeps your own background.',
91
91
  'settings.hint.autoApprove': 'Skips routine permission prompts. Dangerous commands and credential files still ask first. Lasts for this session only: it is off again the next time devx starts.',
92
+ 'settings.hint.extra': 'Runs ANY command without asking: also destructive ones (rm -rf, sudo, git push --force), downloaded scripts, reads of keys and secrets, new MCP servers. Nothing here is a sandbox. Lasts for this session only.',
92
93
  'settings.hint.maxIterations': 'How many tool steps (file edits, commands) the agent may take for one request.',
93
94
  'settings.hint.memory': 'Loads the rules from .devx/memory.md into every session.',
94
95
  'settings.hint.updates': 'Looks for a new devx version on GitHub at startup. /update works either way.',
95
96
  'settings.hint.language': 'Language of the interface: messages, settings and hints. Code and tool names stay in English.',
96
97
  'settings.hint.about': 'Terminal-native AI coding agent by ApvCode. MIT license. github.com/apvcode/Termux-Dev',
97
98
  'settings.warnYolo': 'On: the agent runs commands and edits files without asking.',
99
+ 'settings.warnExtra': 'Warning: nothing is asked. Only where you can lose it all.',
100
+ 'settings.extraEnabled': 'Extra is on: the agent runs any command without asking, dangerous ones too. It is off again the next time devx starts.',
98
101
  'settings.keys.move': 'move',
99
102
  'settings.keys.change': 'change',
100
103
  'settings.keys.toggle': 'toggle',
@@ -230,9 +233,35 @@ export const en = {
230
233
  'onboard.language.note': 'You can change it later in /settings.',
231
234
  'onboard.provider.title': 'provider',
232
235
  'onboard.provider.placeholder': 'type to find a provider',
233
- 'onboard.provider.note': 'The service that gives you the models. Not in the list? Choose Custom endpoint.',
236
+ 'onboard.provider.note': 'The service that gives you the models. Not in the list? Add your own with “Add a provider”.',
234
237
  'onboard.custom': 'Custom endpoint',
235
238
  'onboard.customDetail': 'Any OpenAI-compatible address',
239
+ 'provider.add': 'Add a provider',
240
+ 'provider.addDetail': 'Any OpenAI or Anthropic compatible address',
241
+ 'provider.customTag': 'custom',
242
+ 'provider.new': 'new provider',
243
+ 'provider.name.label': 'Name of the provider',
244
+ 'provider.name.placeholder': 'My gateway',
245
+ 'provider.name.empty': 'Type a name.',
246
+ 'provider.name.long': 'The name is too long (40 characters at most).',
247
+ 'provider.name.taken': 'A provider with this name already exists.',
248
+ 'provider.url.note': 'The address up to /chat/completions or /messages, for example https://api.example.com/v1.',
249
+ 'provider.url.invalid': 'This is not an address. Example: https://api.example.com/v1',
250
+ 'provider.url.scheme': 'The address must start with http:// or https://.',
251
+ 'provider.key.none': 'No key needed',
252
+ 'provider.key.noneDetail': 'A server on this machine or network',
253
+ 'provider.key.enter': 'Enter a key',
254
+ 'provider.menu.use': 'Use this provider',
255
+ 'provider.menu.rename': 'Change the name',
256
+ 'provider.menu.url': 'Change the address',
257
+ 'provider.menu.key': 'Change the key',
258
+ 'provider.menu.delete': 'Delete',
259
+ 'provider.menu.deleteDetail': 'Removes it and its key',
260
+ 'provider.delete.question': 'Delete the provider {name} and its key?',
261
+ 'provider.delete.active': 'It is the provider in use: it keeps working until you choose another one.',
262
+ 'provider.saved': 'Provider {name} saved',
263
+ 'provider.updated': 'Provider {name} updated',
264
+ 'provider.deleted': 'Provider {name} deleted',
236
265
  'onboard.baseUrl.title': 'address',
237
266
  'onboard.baseUrl.label': 'Base URL of the API',
238
267
  'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
@@ -20,25 +20,23 @@ export const es = {
20
20
  'conn.classicRestored': '✓ ¡Conexión restablecida! Se reanuda la generación...',
21
21
  'stop.connection': 'conexión cancelada',
22
22
  'stop.stopped': 'detenido',
23
- 'stop.interrupted': 'interrumpido, enviando tu mensaje',
24
23
  'stop.classicConnection': 'Conexión cancelada (Ctrl+C).',
25
24
  'stop.classicStopped': 'Generación detenida (Ctrl+C).',
26
- 'stop.classicInterrupted': 'Interrumpido: enviando tu mensaje.',
27
25
  'status.waiting': 'Esperando al modelo',
28
26
  'status.thinking': 'Pensando',
29
27
  'status.writing': 'Escribiendo',
30
28
  'status.running': 'Ejecutando',
31
29
  'status.reconnecting': 'Reconectando',
32
- 'status.stop': 'ctrl+c para detener',
30
+ 'status.stop': 'esc para detener',
33
31
  'status.thinkingLine': 'pensando',
34
32
  'status.thoughtFor': 'pensó {sec} s',
35
33
  'composer.placeholder': 'Describe una tarea o haz una pregunta…',
36
34
  'composer.queued': 'en cola',
37
35
  'composer.queuedMany': '{n} en cola',
38
- 'composer.queuedHint': 'ctrl+enter envía ya · ↓ editar',
39
- 'composer.hint1': 'enter en cola · ctrl+c detiene',
36
+ 'composer.queuedHint': '↓ editar',
37
+ 'composer.hint1': 'enter en cola · esc detiene',
40
38
  'composer.hint2': 'enter en cola',
41
- 'composer.hint3': 'enter en cola · ctrl+c detiene',
39
+ 'composer.hint3': 'enter en cola · esc detiene',
42
40
  'composer.hint4': 'enter en cola',
43
41
  'summary.toolOne': '{n} herramienta',
44
42
  'summary.toolMany': '{n} herramientas',
@@ -54,6 +52,7 @@ export const es = {
54
52
  'settings.row.layout': 'Interfaz',
55
53
  'settings.row.pureBlack': 'Fondo negro',
56
54
  'settings.row.autoApprove': 'Autoaprobar (YOLO)',
55
+ 'settings.row.extra': 'Extra (sin preguntar)',
57
56
  'settings.row.maxIterations': 'Máx. pasos',
58
57
  'settings.row.memory': 'Memoria del proyecto',
59
58
  'settings.row.updates': 'Buscar actualizaciones',
@@ -63,6 +62,7 @@ export const es = {
63
62
  'settings.short.layout': 'Interfaz',
64
63
  'settings.short.pureBlack': 'Fondo negro',
65
64
  'settings.short.autoApprove': 'YOLO',
65
+ 'settings.short.extra': 'Extra',
66
66
  'settings.short.maxIterations': 'Pasos',
67
67
  'settings.short.memory': 'Memoria',
68
68
  'settings.short.updates': 'Actualiz.',
@@ -78,12 +78,15 @@ export const es = {
78
78
  'settings.hint.layout': 'Limpia: entrada enmarcada, tarjetas y líneas de herramientas discretas. Clásica: el diseño ASCII original.',
79
79
  'settings.hint.pureBlack': 'Pone el fondo del terminal en negro OLED profundo (#0a0a0c). Desactivado conserva tu propio fondo.',
80
80
  'settings.hint.autoApprove': 'Omite los permisos habituales. Los comandos peligrosos y los archivos de credenciales siguen preguntando. Solo dura esta sesión: al volver a iniciar devx vuelve a estar desactivado.',
81
+ 'settings.hint.extra': 'Ejecuta CUALQUIER comando sin preguntar: también los destructivos (rm -rf, sudo, git push --force), los scripts descargados, la lectura de claves y secretos y los servidores MCP nuevos. Aquí no hay sandbox. Solo dura esta sesión.',
81
82
  'settings.hint.maxIterations': 'Cuántos pasos con herramientas (ediciones, comandos) puede dar el agente por solicitud.',
82
83
  'settings.hint.memory': 'Carga las reglas de .devx/memory.md en cada sesión.',
83
84
  'settings.hint.updates': 'Busca una nueva versión de devx en GitHub al iniciar. /update funciona en cualquier caso.',
84
85
  'settings.hint.language': 'Idioma de la interfaz: mensajes, ajustes y consejos. El código y los nombres de herramientas siguen en inglés.',
85
86
  'settings.hint.about': 'Agente de programación con IA para la terminal, de ApvCode. Licencia MIT. github.com/apvcode/Termux-Dev',
86
87
  'settings.warnYolo': 'Activado: el agente ejecuta comandos y edita archivos sin preguntar.',
88
+ 'settings.warnExtra': 'Atención: no se pregunta nada. Solo donde puedas perderlo todo.',
89
+ 'settings.extraEnabled': 'Extra está activado: el agente ejecuta cualquier comando sin preguntar, también los peligrosos. Se desactiva de nuevo la próxima vez que se inicie devx.',
87
90
  'settings.keys.move': 'mover',
88
91
  'settings.keys.change': 'cambiar',
89
92
  'settings.keys.toggle': 'alternar',
@@ -219,9 +222,35 @@ export const es = {
219
222
  'onboard.language.note': 'Puedes cambiarlo más tarde en /settings.',
220
223
  'onboard.provider.title': 'proveedor',
221
224
  'onboard.provider.placeholder': 'escribe para buscar un proveedor',
222
- 'onboard.provider.note': 'El servicio que te da los modelos. ¿No está en la lista? Elige Dirección propia.',
225
+ 'onboard.provider.note': 'El servicio que te da los modelos. ¿No está en la lista? Añade el tuyo con «Añadir proveedor».',
223
226
  'onboard.custom': 'Dirección propia',
224
227
  'onboard.customDetail': 'Cualquier dirección compatible con OpenAI',
228
+ 'provider.add': 'Añadir proveedor',
229
+ 'provider.addDetail': 'Cualquier dirección compatible con OpenAI o Anthropic',
230
+ 'provider.customTag': 'propio',
231
+ 'provider.new': 'nuevo proveedor',
232
+ 'provider.name.label': 'Nombre del proveedor',
233
+ 'provider.name.placeholder': 'Mi pasarela',
234
+ 'provider.name.empty': 'Escribe un nombre.',
235
+ 'provider.name.long': 'El nombre es demasiado largo (40 caracteres como máximo).',
236
+ 'provider.name.taken': 'Ya existe un proveedor con ese nombre.',
237
+ 'provider.url.note': 'La dirección hasta /chat/completions o /messages, por ejemplo https://api.example.com/v1.',
238
+ 'provider.url.invalid': 'Eso no es una dirección. Ejemplo: https://api.example.com/v1',
239
+ 'provider.url.scheme': 'La dirección debe empezar por http:// o https://.',
240
+ 'provider.key.none': 'No hace falta clave',
241
+ 'provider.key.noneDetail': 'Un servidor de este equipo o de esta red',
242
+ 'provider.key.enter': 'Introducir una clave',
243
+ 'provider.menu.use': 'Usar este proveedor',
244
+ 'provider.menu.rename': 'Cambiar el nombre',
245
+ 'provider.menu.url': 'Cambiar la dirección',
246
+ 'provider.menu.key': 'Cambiar la clave',
247
+ 'provider.menu.delete': 'Eliminar',
248
+ 'provider.menu.deleteDetail': 'Lo elimina con su clave',
249
+ 'provider.delete.question': '¿Eliminar el proveedor {name} y su clave?',
250
+ 'provider.delete.active': 'Es el proveedor en uso: sigue funcionando hasta que elijas otro.',
251
+ 'provider.saved': 'Proveedor {name} guardado',
252
+ 'provider.updated': 'Proveedor {name} actualizado',
253
+ 'provider.deleted': 'Proveedor {name} eliminado',
225
254
  'onboard.baseUrl.title': 'dirección',
226
255
  'onboard.baseUrl.label': 'URL base de la API',
227
256
  'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
@@ -20,25 +20,23 @@ export const fr = {
20
20
  'conn.classicRestored': '✓ Connexion rétablie ! La génération reprend...',
21
21
  'stop.connection': 'connexion annulée',
22
22
  'stop.stopped': 'arrêté',
23
- 'stop.interrupted': 'interrompu, envoi de votre message',
24
23
  'stop.classicConnection': 'Connexion annulée (Ctrl+C).',
25
24
  'stop.classicStopped': 'Génération arrêtée (Ctrl+C).',
26
- 'stop.classicInterrupted': 'Interrompu : envoi de votre message.',
27
25
  'status.waiting': 'En attente du modèle',
28
26
  'status.thinking': 'Réflexion',
29
27
  'status.writing': 'Écriture',
30
28
  'status.running': 'Exécution',
31
29
  'status.reconnecting': 'Reconnexion',
32
- 'status.stop': 'ctrl+c pour arrêter',
30
+ 'status.stop': 'esc pour arrêter',
33
31
  'status.thinkingLine': 'réflexion',
34
32
  'status.thoughtFor': 'réfléchi {sec} s',
35
33
  'composer.placeholder': 'Décrivez une tâche ou posez une question…',
36
34
  'composer.queued': 'en file',
37
35
  'composer.queuedMany': '{n} en file',
38
- 'composer.queuedHint': 'ctrl+entrée envoie · ↓ modifier',
39
- 'composer.hint1': 'entrée en file · ctrl+c arrête',
36
+ 'composer.queuedHint': '↓ modifier',
37
+ 'composer.hint1': 'entrée en file · esc arrête',
40
38
  'composer.hint2': 'entrée en file',
41
- 'composer.hint3': 'entrée en file · ctrl+c arrête',
39
+ 'composer.hint3': 'entrée en file · esc arrête',
42
40
  'composer.hint4': 'entrée en file',
43
41
  'summary.toolOne': '{n} outil',
44
42
  'summary.toolMany': '{n} outils',
@@ -54,6 +52,7 @@ export const fr = {
54
52
  'settings.row.layout': 'Interface',
55
53
  'settings.row.pureBlack': 'Fond noir',
56
54
  'settings.row.autoApprove': 'Auto-approbation (YOLO)',
55
+ 'settings.row.extra': 'Extra (ne demande rien)',
57
56
  'settings.row.maxIterations': 'Étapes max.',
58
57
  'settings.row.memory': 'Mémoire du projet',
59
58
  'settings.row.updates': 'Mises à jour',
@@ -63,6 +62,7 @@ export const fr = {
63
62
  'settings.short.layout': 'Interface',
64
63
  'settings.short.pureBlack': 'Fond noir',
65
64
  'settings.short.autoApprove': 'YOLO',
65
+ 'settings.short.extra': 'Extra',
66
66
  'settings.short.maxIterations': 'Étapes',
67
67
  'settings.short.memory': 'Mémoire',
68
68
  'settings.short.updates': 'MAJ',
@@ -78,12 +78,15 @@ export const fr = {
78
78
  'settings.hint.layout': 'Épurée : saisie encadrée, cartes et lignes d’outils discrètes. Classique : la mise en page ASCII d’origine.',
79
79
  'settings.hint.pureBlack': 'Met le fond du terminal en noir OLED profond (#0a0a0c). Désactivé : votre propre fond est conservé.',
80
80
  'settings.hint.autoApprove': 'Saute les demandes d’autorisation courantes. Les commandes dangereuses et les fichiers d’identifiants demandent toujours. Valable pour cette session seulement : désactivé au prochain démarrage de devx.',
81
+ 'settings.hint.extra': 'Exécute N’IMPORTE QUELLE commande sans demander : y compris les destructrices (rm -rf, sudo, git push --force), les scripts téléchargés, la lecture de clés et de secrets, les nouveaux serveurs MCP. Il n’y a aucun bac à sable. Valable pour cette session seulement.',
81
82
  'settings.hint.maxIterations': 'Combien d’étapes avec outils (modifications, commandes) l’agent peut faire par demande.',
82
83
  'settings.hint.memory': 'Charge les règles de .devx/memory.md dans chaque session.',
83
84
  'settings.hint.updates': 'Cherche une nouvelle version de devx sur GitHub au démarrage. /update fonctionne dans tous les cas.',
84
85
  'settings.hint.language': 'Langue de l’interface : messages, réglages et conseils. Le code et les noms d’outils restent en anglais.',
85
86
  'settings.hint.about': 'Agent de programmation IA pour le terminal, par ApvCode. Licence MIT. github.com/apvcode/Termux-Dev',
86
87
  'settings.warnYolo': 'Activé : l’agent exécute des commandes et modifie des fichiers sans demander.',
88
+ 'settings.warnExtra': 'Attention : rien n’est demandé. Seulement où tout peut être perdu.',
89
+ 'settings.extraEnabled': 'Extra est activé : l’agent exécute n’importe quelle commande sans demander, même dangereuse. Il est de nouveau désactivé au prochain démarrage de devx.',
87
90
  'settings.keys.move': 'choisir',
88
91
  'settings.keys.change': 'modifier',
89
92
  'settings.keys.toggle': 'basculer',
@@ -219,9 +222,35 @@ export const fr = {
219
222
  'onboard.language.note': 'Tu pourras la changer plus tard dans /settings.',
220
223
  'onboard.provider.title': 'fournisseur',
221
224
  'onboard.provider.placeholder': 'tape pour trouver un fournisseur',
222
- 'onboard.provider.note': 'Le service qui te donne les modèles. Pas dans la liste ? Choisis Adresse personnalisée.',
225
+ 'onboard.provider.note': 'Le service qui vous donne les modèles. Pas dans la liste ? Ajoutez le vôtre avec « Ajouter un fournisseur ».',
223
226
  'onboard.custom': 'Adresse personnalisée',
224
227
  'onboard.customDetail': 'Toute adresse compatible OpenAI',
228
+ 'provider.add': 'Ajouter un fournisseur',
229
+ 'provider.addDetail': 'Toute adresse compatible OpenAI ou Anthropic',
230
+ 'provider.customTag': 'perso',
231
+ 'provider.new': 'nouveau fournisseur',
232
+ 'provider.name.label': 'Nom du fournisseur',
233
+ 'provider.name.placeholder': 'Ma passerelle',
234
+ 'provider.name.empty': 'Saisissez un nom.',
235
+ 'provider.name.long': 'Le nom est trop long (40 caractères au maximum).',
236
+ 'provider.name.taken': 'Un fournisseur porte déjà ce nom.',
237
+ 'provider.url.note': 'L’adresse jusqu’à /chat/completions ou /messages, par exemple https://api.example.com/v1.',
238
+ 'provider.url.invalid': 'Ce n’est pas une adresse. Exemple : https://api.example.com/v1',
239
+ 'provider.url.scheme': 'L’adresse doit commencer par http:// ou https://.',
240
+ 'provider.key.none': 'Aucune clé nécessaire',
241
+ 'provider.key.noneDetail': 'Un serveur sur cette machine ou ce réseau',
242
+ 'provider.key.enter': 'Saisir une clé',
243
+ 'provider.menu.use': 'Utiliser ce fournisseur',
244
+ 'provider.menu.rename': 'Changer le nom',
245
+ 'provider.menu.url': 'Changer l’adresse',
246
+ 'provider.menu.key': 'Changer la clé',
247
+ 'provider.menu.delete': 'Supprimer',
248
+ 'provider.menu.deleteDetail': 'Le supprime avec sa clé',
249
+ 'provider.delete.question': 'Supprimer le fournisseur {name} et sa clé ?',
250
+ 'provider.delete.active': 'C’est le fournisseur en cours : il continue de fonctionner jusqu’à ce que vous en choisissiez un autre.',
251
+ 'provider.saved': 'Fournisseur {name} enregistré',
252
+ 'provider.updated': 'Fournisseur {name} mis à jour',
253
+ 'provider.deleted': 'Fournisseur {name} supprimé',
225
254
  'onboard.baseUrl.title': 'adresse',
226
255
  'onboard.baseUrl.label': 'URL de base de l’API',
227
256
  'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
@@ -20,25 +20,23 @@ export const ja = {
20
20
  'conn.classicRestored': '✓ 接続が回復しました。生成を再開します...',
21
21
  'stop.connection': '接続をキャンセルしました',
22
22
  'stop.stopped': '停止しました',
23
- 'stop.interrupted': '中断しました。メッセージを送信します',
24
23
  'stop.classicConnection': '接続をキャンセルしました (Ctrl+C)。',
25
24
  'stop.classicStopped': '生成を停止しました (Ctrl+C)。',
26
- 'stop.classicInterrupted': '中断しました:メッセージを送信します。',
27
25
  'status.waiting': 'モデルを待機中',
28
26
  'status.thinking': '考え中',
29
27
  'status.writing': '執筆中',
30
28
  'status.running': '実行中',
31
29
  'status.reconnecting': '再接続中',
32
- 'status.stop': 'ctrl+c で停止',
30
+ 'status.stop': 'esc で停止',
33
31
  'status.thinkingLine': '思考',
34
32
  'status.thoughtFor': '{sec} 秒考えました',
35
33
  'composer.placeholder': 'タスクを説明するか質問してください…',
36
34
  'composer.queued': 'キュー済み',
37
35
  'composer.queuedMany': '{n} 件キュー済み',
38
- 'composer.queuedHint': 'ctrl+enter で今すぐ送信 · ↓ 編集',
39
- 'composer.hint1': 'enter でキュー · ctrl+c で停止',
36
+ 'composer.queuedHint': '↓ 編集',
37
+ 'composer.hint1': 'enter でキュー · esc で停止',
40
38
  'composer.hint2': 'enter でキュー',
41
- 'composer.hint3': 'enter でキュー · ctrl+c で停止',
39
+ 'composer.hint3': 'enter でキュー · esc で停止',
42
40
  'composer.hint4': 'enter でキュー',
43
41
  'summary.toolOne': 'ツール {n} 件',
44
42
  'summary.toolMany': 'ツール {n} 件',
@@ -54,6 +52,7 @@ export const ja = {
54
52
  'settings.row.layout': 'インターフェース',
55
53
  'settings.row.pureBlack': '黒い背景',
56
54
  'settings.row.autoApprove': '自動承認 (YOLO)',
55
+ 'settings.row.extra': 'Extra(確認なし)',
57
56
  'settings.row.maxIterations': '最大ステップ数',
58
57
  'settings.row.memory': 'プロジェクトメモリ',
59
58
  'settings.row.updates': '更新の確認',
@@ -63,6 +62,7 @@ export const ja = {
63
62
  'settings.short.layout': 'UI',
64
63
  'settings.short.pureBlack': '黒背景',
65
64
  'settings.short.autoApprove': 'YOLO',
65
+ 'settings.short.extra': 'Extra',
66
66
  'settings.short.maxIterations': '手数',
67
67
  'settings.short.memory': 'メモリ',
68
68
  'settings.short.updates': '更新',
@@ -78,12 +78,15 @@ export const ja = {
78
78
  'settings.hint.layout': 'シンプル:枠付きの入力欄、カード、控えめなツール行。クラシック:従来の ASCII レイアウト。',
79
79
  'settings.hint.pureBlack': 'ターミナルの背景を深い OLED ブラック (#0a0a0c) にします。オフなら元の背景のままです。',
80
80
  'settings.hint.autoApprove': '通常の許可確認を省略します。危険なコマンドや認証情報ファイルは引き続き確認します。このセッションだけ有効で、次回 devx を起動するとオフに戻ります。',
81
+ 'settings.hint.extra': 'どんなコマンドも確認なしで実行します。破壊的なもの(rm -rf、sudo、git push --force)、ダウンロードしたスクリプト、キーや機密の読み取り、新しい MCP サーバーも含みます。サンドボックスはありません。このセッションのみ有効です。',
81
82
  'settings.hint.maxIterations': '1 回のリクエストでエージェントが実行できるツールのステップ数(編集、コマンド)です。',
82
83
  'settings.hint.memory': '.devx/memory.md のルールを毎回のセッションに読み込みます。',
83
84
  'settings.hint.updates': '起動時に GitHub で devx の新バージョンを確認します。/update はどちらでも使えます。',
84
85
  'settings.hint.language': 'インターフェースの言語:メッセージ、設定、ヒント。コードとツール名は英語のままです。',
85
86
  'settings.hint.about': 'ApvCode 製のターミナル向け AI コーディングエージェント。MIT ライセンス。github.com/apvcode/Termux-Dev',
86
87
  'settings.warnYolo': 'オン:エージェントは確認なしにコマンドを実行しファイルを編集します。',
88
+ 'settings.warnExtra': '警告:確認は一切行われません。すべて失ってもよい環境でのみ。',
89
+ 'settings.extraEnabled': 'Extra がオンです:エージェントは危険なものを含めどんなコマンドも確認なしで実行します。次に devx を起動するとオフに戻ります。',
87
90
  'settings.keys.move': '移動',
88
91
  'settings.keys.change': '変更',
89
92
  'settings.keys.toggle': '切替',
@@ -219,9 +222,35 @@ export const ja = {
219
222
  'onboard.language.note': 'あとで /settings から変更できます。',
220
223
  'onboard.provider.title': 'プロバイダー',
221
224
  'onboard.provider.placeholder': '入力してプロバイダーを探す',
222
- 'onboard.provider.note': 'モデルを提供するサービスです。一覧にない場合は「独自のアドレス」を選んでください。',
225
+ 'onboard.provider.note': 'モデルを提供するサービスです。一覧にない場合は「プロバイダを追加」で自分のものを追加できます。',
223
226
  'onboard.custom': '独自のアドレス',
224
227
  'onboard.customDetail': 'OpenAI 互換の任意のアドレス',
228
+ 'provider.add': 'プロバイダを追加',
229
+ 'provider.addDetail': 'OpenAI または Anthropic 互換の任意のアドレス',
230
+ 'provider.customTag': 'カスタム',
231
+ 'provider.new': '新しいプロバイダ',
232
+ 'provider.name.label': 'プロバイダの名前',
233
+ 'provider.name.placeholder': 'マイゲートウェイ',
234
+ 'provider.name.empty': '名前を入力してください。',
235
+ 'provider.name.long': '名前が長すぎます(最大 40 文字)。',
236
+ 'provider.name.taken': '同じ名前のプロバイダがすでにあります。',
237
+ 'provider.url.note': '/chat/completions または /messages の手前までのアドレス。例: https://api.example.com/v1',
238
+ 'provider.url.invalid': 'アドレスではありません。例: https://api.example.com/v1',
239
+ 'provider.url.scheme': 'アドレスは http:// または https:// で始めてください。',
240
+ 'provider.key.none': 'キーは不要です',
241
+ 'provider.key.noneDetail': 'このコンピュータまたはネットワーク上のサーバー',
242
+ 'provider.key.enter': 'キーを入力',
243
+ 'provider.menu.use': 'このプロバイダを使う',
244
+ 'provider.menu.rename': '名前を変更',
245
+ 'provider.menu.url': 'アドレスを変更',
246
+ 'provider.menu.key': 'キーを変更',
247
+ 'provider.menu.delete': '削除',
248
+ 'provider.menu.deleteDetail': 'キーと一緒に削除します',
249
+ 'provider.delete.question': 'プロバイダ {name} とそのキーを削除しますか?',
250
+ 'provider.delete.active': '使用中のプロバイダです。別のものを選ぶまで引き続き動作します。',
251
+ 'provider.saved': 'プロバイダ {name} を保存しました',
252
+ 'provider.updated': 'プロバイダ {name} を更新しました',
253
+ 'provider.deleted': 'プロバイダ {name} を削除しました',
225
254
  'onboard.baseUrl.title': 'アドレス',
226
255
  'onboard.baseUrl.label': 'API のベース URL',
227
256
  'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
@@ -20,25 +20,23 @@ export const pt = {
20
20
  'conn.classicRestored': '✓ Conexão restabelecida! Retomando a geração...',
21
21
  'stop.connection': 'conexão cancelada',
22
22
  'stop.stopped': 'interrompido',
23
- 'stop.interrupted': 'interrompido, enviando sua mensagem',
24
23
  'stop.classicConnection': 'Conexão cancelada (Ctrl+C).',
25
24
  'stop.classicStopped': 'Geração interrompida (Ctrl+C).',
26
- 'stop.classicInterrupted': 'Interrompido: enviando sua mensagem.',
27
25
  'status.waiting': 'Aguardando o modelo',
28
26
  'status.thinking': 'Pensando',
29
27
  'status.writing': 'Escrevendo',
30
28
  'status.running': 'Executando',
31
29
  'status.reconnecting': 'Reconectando',
32
- 'status.stop': 'ctrl+c para parar',
30
+ 'status.stop': 'esc para parar',
33
31
  'status.thinkingLine': 'pensando',
34
32
  'status.thoughtFor': 'pensou {sec} s',
35
33
  'composer.placeholder': 'Descreva uma tarefa ou faça uma pergunta…',
36
34
  'composer.queued': 'na fila',
37
35
  'composer.queuedMany': '{n} na fila',
38
- 'composer.queuedHint': 'ctrl+enter envia agora · ↓ editar',
39
- 'composer.hint1': 'enter enfileira · ctrl+c para',
36
+ 'composer.queuedHint': '↓ editar',
37
+ 'composer.hint1': 'enter enfileira · esc para',
40
38
  'composer.hint2': 'enter enfileira',
41
- 'composer.hint3': 'enter enfileira · ctrl+c para',
39
+ 'composer.hint3': 'enter enfileira · esc para',
42
40
  'composer.hint4': 'enter enfileira',
43
41
  'summary.toolOne': '{n} ferramenta',
44
42
  'summary.toolMany': '{n} ferramentas',
@@ -54,6 +52,7 @@ export const pt = {
54
52
  'settings.row.layout': 'Interface',
55
53
  'settings.row.pureBlack': 'Fundo preto',
56
54
  'settings.row.autoApprove': 'Autoaprovar (YOLO)',
55
+ 'settings.row.extra': 'Extra (sem perguntar)',
57
56
  'settings.row.maxIterations': 'Máx. de passos',
58
57
  'settings.row.memory': 'Memória do projeto',
59
58
  'settings.row.updates': 'Buscar atualizações',
@@ -63,6 +62,7 @@ export const pt = {
63
62
  'settings.short.layout': 'Interface',
64
63
  'settings.short.pureBlack': 'Fundo preto',
65
64
  'settings.short.autoApprove': 'YOLO',
65
+ 'settings.short.extra': 'Extra',
66
66
  'settings.short.maxIterations': 'Passos',
67
67
  'settings.short.memory': 'Memória',
68
68
  'settings.short.updates': 'Atualiz.',
@@ -78,12 +78,15 @@ export const pt = {
78
78
  'settings.hint.layout': 'Limpa: entrada com moldura, cartões e linhas de ferramentas discretas. Clássica: o layout ASCII original.',
79
79
  'settings.hint.pureBlack': 'Deixa o fundo do terminal em preto OLED profundo (#0a0a0c). Desligado mantém o seu fundo.',
80
80
  'settings.hint.autoApprove': 'Pula as permissões de rotina. Comandos perigosos e arquivos de credenciais continuam perguntando. Vale só para esta sessão: na próxima vez que o devx iniciar, volta a ficar desligado.',
81
+ 'settings.hint.extra': 'Executa QUALQUER comando sem perguntar: também os destrutivos (rm -rf, sudo, git push --force), scripts baixados, leitura de chaves e segredos e novos servidores MCP. Aqui não há sandbox. Vale só para esta sessão.',
81
82
  'settings.hint.maxIterations': 'Quantos passos com ferramentas (edições, comandos) o agente pode dar por pedido.',
82
83
  'settings.hint.memory': 'Carrega as regras de .devx/memory.md em cada sessão.',
83
84
  'settings.hint.updates': 'Procura uma nova versão do devx no GitHub ao iniciar. O /update funciona de qualquer forma.',
84
85
  'settings.hint.language': 'Idioma da interface: mensagens, configurações e dicas. Código e nomes de ferramentas continuam em inglês.',
85
86
  'settings.hint.about': 'Agente de programação com IA para o terminal, da ApvCode. Licença MIT. github.com/apvcode/Termux-Dev',
86
87
  'settings.warnYolo': 'Ligado: o agente executa comandos e edita arquivos sem perguntar.',
88
+ 'settings.warnExtra': 'Atenção: nada é perguntado. Só onde puder perder tudo.',
89
+ 'settings.extraEnabled': 'Extra está ligado: o agente executa qualquer comando sem perguntar, inclusive os perigosos. Ele volta a ficar desligado na próxima vez que o devx iniciar.',
87
90
  'settings.keys.move': 'mover',
88
91
  'settings.keys.change': 'alterar',
89
92
  'settings.keys.toggle': 'alternar',
@@ -219,9 +222,35 @@ export const pt = {
219
222
  'onboard.language.note': 'Você pode mudar depois em /settings.',
220
223
  'onboard.provider.title': 'provedor',
221
224
  'onboard.provider.placeholder': 'digite para encontrar um provedor',
222
- 'onboard.provider.note': 'O serviço que fornece os modelos. Não está na lista? Escolha Endereço próprio.',
225
+ 'onboard.provider.note': 'O serviço que fornece os modelos. Não está na lista? Adicione o seu em «Adicionar provedor».',
223
226
  'onboard.custom': 'Endereço próprio',
224
227
  'onboard.customDetail': 'Qualquer endereço compatível com OpenAI',
228
+ 'provider.add': 'Adicionar provedor',
229
+ 'provider.addDetail': 'Qualquer endereço compatível com OpenAI ou Anthropic',
230
+ 'provider.customTag': 'próprio',
231
+ 'provider.new': 'novo provedor',
232
+ 'provider.name.label': 'Nome do provedor',
233
+ 'provider.name.placeholder': 'Meu gateway',
234
+ 'provider.name.empty': 'Digite um nome.',
235
+ 'provider.name.long': 'O nome é longo demais (no máximo 40 caracteres).',
236
+ 'provider.name.taken': 'Já existe um provedor com esse nome.',
237
+ 'provider.url.note': 'O endereço até /chat/completions ou /messages, por exemplo https://api.example.com/v1.',
238
+ 'provider.url.invalid': 'Isso não é um endereço. Exemplo: https://api.example.com/v1',
239
+ 'provider.url.scheme': 'O endereço deve começar com http:// ou https://.',
240
+ 'provider.key.none': 'Não precisa de chave',
241
+ 'provider.key.noneDetail': 'Um servidor neste computador ou nesta rede',
242
+ 'provider.key.enter': 'Digitar uma chave',
243
+ 'provider.menu.use': 'Usar este provedor',
244
+ 'provider.menu.rename': 'Mudar o nome',
245
+ 'provider.menu.url': 'Mudar o endereço',
246
+ 'provider.menu.key': 'Mudar a chave',
247
+ 'provider.menu.delete': 'Excluir',
248
+ 'provider.menu.deleteDetail': 'Remove-o junto com a chave',
249
+ 'provider.delete.question': 'Excluir o provedor {name} e a chave dele?',
250
+ 'provider.delete.active': 'É o provedor em uso: continua funcionando até você escolher outro.',
251
+ 'provider.saved': 'Provedor {name} salvo',
252
+ 'provider.updated': 'Provedor {name} atualizado',
253
+ 'provider.deleted': 'Provedor {name} excluído',
225
254
  'onboard.baseUrl.title': 'endereço',
226
255
  'onboard.baseUrl.label': 'URL base da API',
227
256
  'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
@@ -20,25 +20,23 @@ export const ru = {
20
20
  'conn.classicRestored': '✓ Соединение восстановлено! Возобновляем генерацию...',
21
21
  'stop.connection': 'подключение отменено',
22
22
  'stop.stopped': 'остановлено',
23
- 'stop.interrupted': 'прервано, отправляю ваше сообщение',
24
23
  'stop.classicConnection': 'Подключение отменено (Ctrl+C).',
25
24
  'stop.classicStopped': 'Ответ остановлен (Ctrl+C).',
26
- 'stop.classicInterrupted': 'Прервано: отправляю ваше сообщение.',
27
25
  'status.waiting': 'Ожидание модели',
28
26
  'status.thinking': 'Думает',
29
27
  'status.writing': 'Пишет',
30
28
  'status.running': 'Выполняется',
31
29
  'status.reconnecting': 'Переподключение',
32
- 'status.stop': 'ctrl+c — стоп',
30
+ 'status.stop': 'esc — стоп',
33
31
  'status.thinkingLine': 'размышление',
34
32
  'status.thoughtFor': 'думал {sec} с',
35
33
  'composer.placeholder': 'Опишите задачу или задайте вопрос…',
36
34
  'composer.queued': 'в очереди',
37
35
  'composer.queuedMany': 'в очереди: {n}',
38
- 'composer.queuedHint': 'ctrl+enter — отправить сразу · ↓ править',
39
- 'composer.hint1': 'enter — в очередь · ctrl+c — стоп',
36
+ 'composer.queuedHint': '↓ править',
37
+ 'composer.hint1': 'enter — в очередь · esc — стоп',
40
38
  'composer.hint2': 'enter — в очередь',
41
- 'composer.hint3': 'enter — в очередь · ctrl+c — стоп',
39
+ 'composer.hint3': 'enter — в очередь · esc — стоп',
42
40
  'composer.hint4': 'enter — в очередь',
43
41
  'summary.toolOne': 'инструментов: {n}',
44
42
  'summary.toolMany': 'инструментов: {n}',
@@ -54,6 +52,7 @@ export const ru = {
54
52
  'settings.row.layout': 'Интерфейс',
55
53
  'settings.row.pureBlack': 'Чёрный фон',
56
54
  'settings.row.autoApprove': 'Автоодобрение (YOLO)',
55
+ 'settings.row.extra': 'Extra (без вопросов)',
57
56
  'settings.row.maxIterations': 'Макс. шагов',
58
57
  'settings.row.memory': 'Память проекта',
59
58
  'settings.row.updates': 'Проверка обновлений',
@@ -63,6 +62,7 @@ export const ru = {
63
62
  'settings.short.layout': 'Интерфейс',
64
63
  'settings.short.pureBlack': 'Чёрный фон',
65
64
  'settings.short.autoApprove': 'YOLO',
65
+ 'settings.short.extra': 'Extra',
66
66
  'settings.short.maxIterations': 'Шагов',
67
67
  'settings.short.memory': 'Память',
68
68
  'settings.short.updates': 'Обновл.',
@@ -78,12 +78,15 @@ export const ru = {
78
78
  'settings.hint.layout': 'Чистый: рамка у ввода, карточки и спокойные строки инструментов. Классический: прежний ASCII-вид.',
79
79
  'settings.hint.pureBlack': 'Делает фон терминала глубоким чёрным для OLED (#0a0a0c). Выключено — остаётся ваш фон.',
80
80
  'settings.hint.autoApprove': 'Пропускает обычные запросы разрешений. Опасные команды и файлы с ключами всё равно спрашивают. Действует только в этой сессии: при следующем запуске devx выключено.',
81
+ 'settings.hint.extra': 'Выполняет ЛЮБЫЕ команды без вопросов: и разрушительные (rm -rf, sudo, git push --force), и скачанные скрипты, и чтение ключей и секретов, и новые MCP-серверы. Никакой песочницы нет. Действует только в этой сессии.',
81
82
  'settings.hint.maxIterations': 'Сколько шагов с инструментами (правки файлов, команды) агент может сделать на один запрос.',
82
83
  'settings.hint.memory': 'Загружает правила из .devx/memory.md в каждую сессию.',
83
84
  'settings.hint.updates': 'При запуске ищет новую версию devx на GitHub. Команда /update работает в любом случае.',
84
85
  'settings.hint.language': 'Язык интерфейса: сообщения, настройки и подсказки. Код и названия инструментов остаются английскими.',
85
86
  'settings.hint.about': 'Терминальный ИИ-агент для программирования от ApvCode. Лицензия MIT. github.com/apvcode/Termux-Dev',
86
87
  'settings.warnYolo': 'Включено: агент выполняет команды и правит файлы без вопросов.',
88
+ 'settings.warnExtra': 'Внимание: ничего не спрашивается. Только где не жалко всё.',
89
+ 'settings.extraEnabled': 'Extra включён: агент выполняет любые команды без вопросов, в том числе опасные. При следующем запуске devx он снова выключен.',
87
90
  'settings.keys.move': 'выбор',
88
91
  'settings.keys.change': 'изменить',
89
92
  'settings.keys.toggle': 'переключить',
@@ -219,9 +222,35 @@ export const ru = {
219
222
  'onboard.language.note': 'Позже его можно сменить в /settings.',
220
223
  'onboard.provider.title': 'провайдер',
221
224
  'onboard.provider.placeholder': 'начни вводить название',
222
- 'onboard.provider.note': 'Сервис, который даёт модели. Нет в списке? Выбери свой адрес.',
225
+ 'onboard.provider.note': 'Сервис, который даёт модели. Нет в списке? Добавьте свой через «Добавить провайдера».',
223
226
  'onboard.custom': 'Свой адрес',
224
227
  'onboard.customDetail': 'Любой адрес, совместимый с OpenAI',
228
+ 'provider.add': 'Добавить провайдера',
229
+ 'provider.addDetail': 'Любой адрес, совместимый с OpenAI или Anthropic',
230
+ 'provider.customTag': 'свой',
231
+ 'provider.new': 'новый провайдер',
232
+ 'provider.name.label': 'Название провайдера',
233
+ 'provider.name.placeholder': 'Мой шлюз',
234
+ 'provider.name.empty': 'Введите название.',
235
+ 'provider.name.long': 'Название слишком длинное (не больше 40 символов).',
236
+ 'provider.name.taken': 'Провайдер с таким названием уже есть.',
237
+ 'provider.url.note': 'Адрес до /chat/completions или /messages, например https://api.example.com/v1.',
238
+ 'provider.url.invalid': 'Это не адрес. Пример: https://api.example.com/v1',
239
+ 'provider.url.scheme': 'Адрес должен начинаться с http:// или https://.',
240
+ 'provider.key.none': 'Ключ не нужен',
241
+ 'provider.key.noneDetail': 'Сервер на этом компьютере или в этой сети',
242
+ 'provider.key.enter': 'Ввести ключ',
243
+ 'provider.menu.use': 'Использовать этого провайдера',
244
+ 'provider.menu.rename': 'Изменить название',
245
+ 'provider.menu.url': 'Изменить адрес',
246
+ 'provider.menu.key': 'Изменить ключ',
247
+ 'provider.menu.delete': 'Удалить',
248
+ 'provider.menu.deleteDetail': 'Удалит провайдера и его ключ',
249
+ 'provider.delete.question': 'Удалить провайдера {name} и его ключ?',
250
+ 'provider.delete.active': 'Это текущий провайдер: он продолжит работать, пока вы не выберете другой.',
251
+ 'provider.saved': 'Провайдер {name} сохранён',
252
+ 'provider.updated': 'Провайдер {name} обновлён',
253
+ 'provider.deleted': 'Провайдер {name} удалён',
225
254
  'onboard.baseUrl.title': 'адрес',
226
255
  'onboard.baseUrl.label': 'Базовый URL API',
227
256
  'onboard.baseUrl.placeholder': 'https://api.example.com/v1',