termux-dev 1.6.0 → 1.8.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.
Files changed (99) hide show
  1. package/README.md +214 -166
  2. package/assets/banner.svg +23 -28
  3. package/assets/preview.png +0 -0
  4. package/assets/preview.svg +101 -10
  5. package/dist/cli/banner.js +3 -4
  6. package/dist/cli/clipboard-write.js +55 -0
  7. package/dist/cli/clipboard.js +182 -106
  8. package/dist/cli/colors.js +67 -0
  9. package/dist/cli/confirm.js +50 -0
  10. package/dist/cli/doctor.js +4 -4
  11. package/dist/cli/effort.js +80 -0
  12. package/dist/cli/export.js +3 -3
  13. package/dist/cli/files.js +19 -5
  14. package/dist/cli/finder.js +241 -0
  15. package/dist/cli/headless.js +23 -11
  16. package/dist/cli/index.js +1557 -744
  17. package/dist/cli/keys.js +69 -0
  18. package/dist/cli/liveblock.js +45 -0
  19. package/dist/cli/log.js +19 -0
  20. package/dist/cli/logo.js +30 -0
  21. package/dist/cli/markdown.js +174 -37
  22. package/dist/cli/mcp-panel.js +432 -0
  23. package/dist/cli/permission.js +84 -0
  24. package/dist/cli/picker.js +143 -0
  25. package/dist/cli/prompt.js +256 -56
  26. package/dist/cli/resume.js +15 -0
  27. package/dist/cli/rewind.js +51 -0
  28. package/dist/cli/runtime_errors.js +6 -0
  29. package/dist/cli/server.js +85 -24
  30. package/dist/cli/settings.js +307 -0
  31. package/dist/cli/statusline.js +1 -1
  32. package/dist/cli/theme.js +126 -108
  33. package/dist/cli/transcript.js +134 -0
  34. package/dist/cli/typeahead.js +371 -0
  35. package/dist/cli/ui.js +1022 -0
  36. package/dist/cli/updater.js +23 -21
  37. package/dist/cli/usage-panel.js +242 -0
  38. package/dist/cli/welcome.js +56 -0
  39. package/dist/cli/width.js +178 -0
  40. package/dist/core/capabilities.js +433 -0
  41. package/dist/core/catalog-util.js +27 -0
  42. package/dist/core/checkpoint.js +90 -0
  43. package/dist/core/context-stats.js +29 -0
  44. package/dist/core/cost.js +191 -0
  45. package/dist/core/formats.js +199 -0
  46. package/dist/core/history.js +51 -1
  47. package/dist/core/hooks.js +79 -0
  48. package/dist/core/i18n.js +42 -0
  49. package/dist/core/local-config.js +69 -0
  50. package/dist/core/locales/de.js +265 -0
  51. package/dist/core/locales/en.js +276 -0
  52. package/dist/core/locales/es.js +265 -0
  53. package/dist/core/locales/fr.js +265 -0
  54. package/dist/core/locales/ja.js +265 -0
  55. package/dist/core/locales/pt.js +265 -0
  56. package/dist/core/locales/ru.js +265 -0
  57. package/dist/core/locales/uk.js +265 -0
  58. package/dist/core/locales/zh.js +265 -0
  59. package/dist/core/loop.js +125 -49
  60. package/dist/core/memory.js +39 -12
  61. package/dist/core/models.js +33 -20
  62. package/dist/core/network.js +12 -11
  63. package/dist/core/notify.js +54 -0
  64. package/dist/core/planfile.js +43 -0
  65. package/dist/core/price-catalog.json +1 -0
  66. package/dist/core/prices.js +249 -0
  67. package/dist/core/reasoning-catalog.json +1 -0
  68. package/dist/core/reasoning.js +393 -0
  69. package/dist/core/redact.js +41 -0
  70. package/dist/core/secure-file.js +22 -0
  71. package/dist/core/session.js +16 -5
  72. package/dist/core/snapshot.js +14 -2
  73. package/dist/core/title.js +61 -0
  74. package/dist/core/types.js +1 -1
  75. package/dist/core/usage.js +43 -7
  76. package/dist/core/vision-catalog.json +1 -0
  77. package/dist/core/vision.js +123 -0
  78. package/dist/mcp/client.js +36 -5
  79. package/dist/mcp/http-client.js +174 -0
  80. package/dist/mcp/manager.js +330 -93
  81. package/dist/permissions/guard.js +385 -117
  82. package/dist/prompts/builder.js +46 -38
  83. package/dist/providers/anthropic.js +517 -0
  84. package/dist/providers/index.js +18 -1
  85. package/dist/providers/openai.js +138 -125
  86. package/dist/providers/shared.js +116 -0
  87. package/dist/providers/toolguard.js +101 -0
  88. package/dist/tools/bash.js +141 -51
  89. package/dist/tools/diagnostics.js +76 -48
  90. package/dist/tools/fs.js +77 -5
  91. package/dist/tools/index.js +2 -1
  92. package/dist/tools/mcp.js +72 -0
  93. package/dist/tools/packages.js +16 -1
  94. package/dist/tools/plan.js +8 -8
  95. package/dist/tools/questions.js +50 -54
  96. package/dist/tools/server.js +6 -0
  97. package/dist/tools/todo.js +20 -18
  98. package/dist/tools/web.js +143 -8
  99. package/package.json +1 -1
@@ -0,0 +1,265 @@
1
+ export const de = {
2
+ 'net.unknown': 'Unbekannter Netzwerkfehler',
3
+ 'net.rateLimit': 'API-Anfragelimit überschritten (429)',
4
+ 'net.badGateway': 'Gateway des Anbieters vorübergehend nicht erreichbar (502)',
5
+ 'net.unavailable': 'Server des Anbieters überlastet (503)',
6
+ 'net.gatewayTimeout': 'Zeitüberschreitung am Gateway des Anbieters (504)',
7
+ 'net.offline': 'Keine Netzwerkverbindung oder DNS-Fehler (offline)',
8
+ 'net.reset': 'Verbindung zum Server wurde zurückgesetzt',
9
+ 'net.timeout': 'Zeitüberschreitung der Netzwerkverbindung',
10
+ 'net.refused': 'Der Server hat die Verbindung abgelehnt',
11
+ 'net.fetchFailed': 'Netzwerkanfrage fehlgeschlagen (Verbindung abgebrochen)',
12
+ 'net.generic': 'Internetverbindung gestört',
13
+ 'net.failedAfter': 'Netzwerkfehler: Verbindung nach {n} Versuchen nicht wiederhergestellt ({reason}).',
14
+ 'conn.unstable': 'Verbindung instabil ({reason})',
15
+ 'conn.reconnecting': 'Neuverbindung {attempt}/{max} · neuer Versuch in {delay} s',
16
+ 'conn.restored': 'Verbindung wiederhergestellt',
17
+ 'conn.classicUnstable': 'Verbindung instabil ({reason})',
18
+ 'conn.classicRetry': 'Neuverbindung [{attempt}/{max}] (Pause {delay} s)...',
19
+ 'conn.classicWaiting': 'Warte auf das Netzwerk [{attempt}/{max}]...',
20
+ 'conn.classicRestored': '✓ Verbindung wiederhergestellt! Die Generierung wird fortgesetzt...',
21
+ 'stop.connection': 'Verbindung abgebrochen',
22
+ 'stop.stopped': 'gestoppt',
23
+ 'stop.interrupted': 'unterbrochen, deine Nachricht wird gesendet',
24
+ 'stop.classicConnection': 'Verbindung abgebrochen (Strg+C).',
25
+ 'stop.classicStopped': 'Generierung gestoppt (Strg+C).',
26
+ 'stop.classicInterrupted': 'Unterbrochen: deine Nachricht wird gesendet.',
27
+ 'status.waiting': 'Warte auf das Modell',
28
+ 'status.thinking': 'Denkt nach',
29
+ 'status.writing': 'Schreibt',
30
+ 'status.running': 'Läuft',
31
+ 'status.reconnecting': 'Neuverbindung',
32
+ 'status.stop': 'ctrl+c zum Stoppen',
33
+ 'status.thinkingLine': 'denkt nach',
34
+ 'status.thoughtFor': 'nachgedacht: {sec} s',
35
+ 'composer.placeholder': 'Aufgabe beschreiben oder etwas fragen…',
36
+ 'composer.queued': 'in der Warteschlange',
37
+ 'composer.queuedMany': '{n} in der Warteschlange',
38
+ 'composer.queuedHint': 'ctrl+enter sendet sofort · ↓ bearbeiten',
39
+ 'composer.hint1': 'enter reiht ein · ctrl+c stoppt',
40
+ 'composer.hint2': 'enter reiht ein',
41
+ 'composer.hint3': 'enter reiht ein · ctrl+c stoppt',
42
+ 'composer.hint4': 'enter reiht ein',
43
+ 'summary.toolOne': '{n} Werkzeug',
44
+ 'summary.toolMany': '{n} Werkzeuge',
45
+ 'summary.in': '{n} ein',
46
+ 'summary.out': '{n} aus',
47
+ 'summary.stopped': 'gestoppt',
48
+ 'settings.title': 'Einstellungen',
49
+ 'settings.section.appearance': 'Darstellung',
50
+ 'settings.section.agent': 'Agent',
51
+ 'settings.section.general': 'Allgemein',
52
+ 'settings.section.about': 'Info',
53
+ 'settings.row.theme': 'Farbschema',
54
+ 'settings.row.layout': 'Oberfläche',
55
+ 'settings.row.pureBlack': 'Schwarzer Hintergrund',
56
+ 'settings.row.autoApprove': 'Auto-Freigabe (YOLO)',
57
+ 'settings.row.maxIterations': 'Max. Schritte',
58
+ 'settings.row.memory': 'Projektgedächtnis',
59
+ 'settings.row.updates': 'Updateprüfung',
60
+ 'settings.row.language': 'Sprache',
61
+ 'settings.row.about': 'Über devx',
62
+ 'settings.short.theme': 'Farben',
63
+ 'settings.short.layout': 'Oberfläche',
64
+ 'settings.short.pureBlack': 'Schwarz',
65
+ 'settings.short.autoApprove': 'YOLO',
66
+ 'settings.short.maxIterations': 'Schritte',
67
+ 'settings.short.memory': 'Gedächtnis',
68
+ 'settings.short.updates': 'Updates',
69
+ 'settings.short.language': 'Sprache',
70
+ 'settings.short.about': 'Info',
71
+ 'settings.value.on': 'an',
72
+ 'settings.value.off': 'aus',
73
+ 'settings.value.clean': 'Schlicht',
74
+ 'settings.value.classic': 'Klassisch',
75
+ 'settings.value.unlimited': 'unbegrenzt',
76
+ 'settings.value.steps': '{n} Schritte',
77
+ 'settings.hint.theme': 'Farben der gesamten Oberfläche. Links und rechts blättern durch die Schemas, das Panel färbt sich sofort um.',
78
+ 'settings.hint.layout': 'Schlicht: Eingabe im Rahmen, Karten und ruhige Werkzeugzeilen. Klassisch: das ursprüngliche ASCII-Layout.',
79
+ 'settings.hint.pureBlack': 'Setzt den Terminalhintergrund auf tiefes OLED-Schwarz (#0a0a0c). Aus behält deinen eigenen Hintergrund.',
80
+ 'settings.hint.autoApprove': 'Überspringt übliche Rückfragen. Gefährliche Befehle und Dateien mit Zugangsdaten fragen weiterhin nach. Gilt nur für diese Sitzung: Beim nächsten Start von devx ist es wieder aus.',
81
+ 'settings.hint.maxIterations': 'Wie viele Werkzeugschritte (Dateiänderungen, Befehle) der Agent pro Anfrage ausführen darf.',
82
+ 'settings.hint.memory': 'Lädt die Regeln aus .devx/memory.md in jede Sitzung.',
83
+ 'settings.hint.updates': 'Sucht beim Start auf GitHub nach einer neuen devx-Version. /update funktioniert in jedem Fall.',
84
+ 'settings.hint.language': 'Sprache der Oberfläche: Meldungen, Einstellungen und Hinweise. Code und Werkzeugnamen bleiben englisch.',
85
+ 'settings.hint.about': 'KI-Coding-Agent für das Terminal von ApvCode. MIT-Lizenz. github.com/apvcode/Termux-Dev',
86
+ 'settings.warnYolo': 'An: Der Agent führt Befehle aus und ändert Dateien ohne Rückfrage.',
87
+ 'settings.keys.move': 'wählen',
88
+ 'settings.keys.change': 'ändern',
89
+ 'settings.keys.toggle': 'umschalten',
90
+ 'settings.keys.close': 'schließen',
91
+ // ── /mcp panel
92
+ 'mcp.title': 'MCP-Server',
93
+ 'mcp.count': 'Server: {n}',
94
+ 'mcp.scope.user': 'Eigene Server',
95
+ 'mcp.scope.project': 'Projekt-Server',
96
+ 'mcp.toolsCount': 'Werkzeuge: {n}',
97
+ 'mcp.status.connected': 'verbunden',
98
+ 'mcp.status.connecting': 'verbindet…',
99
+ 'mcp.status.failed': 'fehlgeschlagen',
100
+ 'mcp.status.disabled': 'deaktiviert',
101
+ 'mcp.empty': 'Keine MCP-Server konfiguriert.',
102
+ 'mcp.emptyHint': 'Mit /mcp import übernimmst du die Server von Claude Code, mit /mcp add <Name> <Befehl> [Argumente] fügst du einen hinzu.',
103
+ 'mcp.detail.status': 'Status',
104
+ 'mcp.detail.command': 'Befehl',
105
+ 'mcp.detail.config': 'Konfig',
106
+ 'mcp.detail.capabilities': 'Fähigkeiten',
107
+ 'mcp.detail.tools': 'Werkzeuge',
108
+ 'mcp.detail.error': 'Fehler',
109
+ 'mcp.action.tools': 'Werkzeuge anzeigen',
110
+ 'mcp.action.reconnect': 'Neu verbinden',
111
+ 'mcp.action.disable': 'Deaktivieren',
112
+ 'mcp.action.enable': 'Aktivieren',
113
+ 'mcp.toolsTitle': 'Werkzeuge von {name}',
114
+ 'mcp.noTools': 'Dieser Server bietet keine Werkzeuge.',
115
+ 'mcp.tag.readOnly': 'nur lesend',
116
+ 'mcp.tag.destructive': 'zerstörend',
117
+ 'mcp.tag.openWorld': 'offene Welt',
118
+ 'mcp.params': 'Parameter',
119
+ 'mcp.noParams': 'Keine Parameter.',
120
+ 'mcp.required': 'erforderlich',
121
+ 'mcp.more': '{n} weitere',
122
+ 'mcp.keys.open': 'öffnen',
123
+ 'mcp.keys.back': 'zurück',
124
+ 'mcp.keys.reload': 'alle neu laden',
125
+ 'mcp.keys.close': 'schließen',
126
+ // ── questions from the agent
127
+ 'questions.title': 'Frage',
128
+ 'questions.custom': 'Eigene Antwort eingeben…',
129
+ 'questions.skip': 'Überspringen',
130
+ 'questions.skipped': '(übersprungen)',
131
+ 'questions.yourAnswer': 'Deine Antwort:',
132
+ 'questions.empty': 'Die Antwort darf nicht leer sein',
133
+ // ── confirmations
134
+ 'confirm.yes': 'Ja',
135
+ 'confirm.no': 'Nein',
136
+ 'confirm.exitTitle': 'beenden',
137
+ 'confirm.exit': 'devx beenden?',
138
+ 'confirm.goodbye': 'Bis bald',
139
+ 'confirm.deleteAll': 'ALLE {n} gespeicherten Sitzungen löschen?',
140
+ 'confirm.update': 'devx jetzt auf v{version} aktualisieren?',
141
+ 'confirm.commit': 'Änderungen mit dieser Nachricht committen?',
142
+ 'trust.title': 'Vertrauen in den Ordner',
143
+ 'trust.question': 'Erstes Mal in diesem Ordner. Ihm vertrauen und den Agenten hier arbeiten lassen?',
144
+ 'trust.yes': 'Ja, diesem Ordner vertrauen',
145
+ 'trust.no': 'Nein, beenden',
146
+ 'trust.wantsYolo': 'Die Projektkonfiguration verlangt Auto-Freigabe (YOLO)',
147
+ 'trust.wantsAllowlist': 'Die Projektkonfiguration erlaubt diese Befehle: {list}',
148
+ 'trust.exiting': 'Ordner nicht vertraut, devx wird beendet',
149
+ 'trust.mcpQuestion': 'Dieses Projekt will MCP-Server starten (lokale Programme, oben aufgeführt). Erlauben?',
150
+ // ── view switches
151
+ 'view.expandThought': 'ctrl+p zum Aufklappen',
152
+ 'view.expandOutput': 'ctrl+o zum Aufklappen',
153
+ 'view.moreLines': '… +{n} Zeilen',
154
+ // ── plan approval
155
+ 'plan.cardTitle': 'Plan',
156
+ 'plan.files': 'Dateien',
157
+ 'plan.ready': 'Der Plan steht. Mit der Arbeit beginnen?',
158
+ 'plan.go': 'Go: in den AGENT-Modus wechseln und starten',
159
+ 'plan.edit': 'Plan ändern (im PLAN-Modus bleiben)',
160
+ 'plan.editHint': 'Sag, was geändert werden soll: Der Plan bleibt im PLAN-Modus und wird überarbeitet.',
161
+ 'plan.started': 'AGENT-Modus: Arbeit am freigegebenen Plan',
162
+ // ── undo
163
+ 'undo.question': '{n} Datei(en) auf den Stand vor dem letzten Durchgang zurücksetzen?',
164
+ 'undo.note': 'Auch das, was Shell-Befehle getan haben. Von git ignorierte Dateien bleiben unberührt.',
165
+ 'undo.done': '{n} Datei(en) wiederhergestellt',
166
+ // ── permissions
167
+ 'permissions.title': 'Ohne Rückfrage erlaubt',
168
+ 'permissions.none': 'Noch nichts ist ohne Rückfrage erlaubt: Antworte auf einer Freigabekarte mit „Session“ oder „Always“.',
169
+ 'permissions.hint': '/permissions clear entfernt alles (auch das für die Sitzung).',
170
+ 'permissions.cleared': 'Alles, was ohne Rückfrage erlaubt war, wurde entfernt',
171
+ // ── cost limit
172
+ 'settings.row.costLimit': 'Kostenlimit',
173
+ 'settings.short.costLimit': 'Limit $',
174
+ 'settings.hint.costLimit': 'Das Meiste, was eine Sitzung kosten darf. Bei 80 % warnt devx, am Limit stoppt es die Aufgabe und fragt, bevor es weiter Geld ausgibt.',
175
+ 'cost.title': 'Kostenlimit',
176
+ 'cost.warn': '{spent} ausgegeben: 80 % des Limits von {limit} dieser Sitzung',
177
+ 'cost.stopped': 'Kostenlimit von {limit} erreicht: Die Aufgabe wurde gestoppt',
178
+ 'cost.reached': 'Diese Sitzung hat {spent} von ihrem Limit {limit} ausgegeben. Weiter ausgeben?',
179
+ 'cost.raise': 'Wenn du weitermachst, steigt das Limit dieser Sitzung auf {limit}.',
180
+ 'cost.continue': 'Ja, weitermachen',
181
+ 'cost.cancel': 'Nein, jetzt nicht',
182
+ 'cost.cancelled': 'Nichts wurde gesendet. Deine Nachricht steht wieder in der Eingabezeile.',
183
+ // ── /copy and /rename
184
+ 'copy.none': 'Es gibt noch keine Antwort zum Kopieren.',
185
+ 'copy.done': 'Letzte Antwort kopiert ({n} Zeichen)',
186
+ 'copy.failed': 'Zwischenablage nicht erreichbar (kein wl-copy, xclip, xsel, und die Antwort ist zu lang für das Terminal).',
187
+ 'rename.done': 'Chat umbenannt: {name}',
188
+ 'rename.usage': 'Verwendung: /rename <Name>. Ohne Namen benennt die KI den Chat neu, sobald es eine erste Antwort gibt.',
189
+ 'rename.failed': 'Die KI hat keinen Namen gefunden. Versuche es erneut oder gib einen an: /rename <Name>.',
190
+ // ── memory
191
+ 'memory.capped': 'Das Gedächtnis ist lang: {n} der ältesten Fakten gehen nicht an das Modell (nur die neuesten passen). Entferne alte aus .devx/memory.md.',
192
+ 'mcp.removeUsage': 'Verwendung: /mcp remove <Name>',
193
+ 'mcp.removeNotFound': '„{name}“ steht nicht in ~/.devx/mcp.json. Ein Server aus einer anderen Datei (Projekt, ~/.devxrc.json) muss dort von Hand entfernt werden.',
194
+ 'mcp.removed': 'Server „{name}“ entfernt',
195
+ // ── /rewind
196
+ 'rewind.title': 'zurückspulen',
197
+ 'rewind.count': '{n} Nachrichten',
198
+ 'rewind.current': '(aktuell: hier bleiben)',
199
+ 'rewind.none': 'Es gibt noch keine Nachricht von dir, zu der man zurückkehren kann.',
200
+ 'rewind.later': '{n} danach',
201
+ 'rewind.ago.now': 'gerade eben',
202
+ 'rewind.ago.min': 'vor {n} Min.',
203
+ 'rewind.ago.hour': 'vor {n} Std.',
204
+ 'rewind.ago.day': 'vor {n} Tg.',
205
+ 'rewind.filesQuestion': 'Auch die Dateien ({n}) auf den damaligen Stand zurücksetzen?',
206
+ 'rewind.filesYes': 'Ja, auch die Dateien',
207
+ 'rewind.filesNo': 'Nein, nur das Gespräch',
208
+ 'rewind.done': 'Zurück bei deiner Nachricht. Was danach kam, ist weg, auch für das Modell. Ändere die Nachricht und sende sie.',
209
+ 'rewind.doneImages': 'Zurück bei deiner Nachricht (ihre Bilder blieben nicht erhalten, hänge sie erneut an). Was danach kam, ist weg, auch für das Modell.',
210
+ // ── first run and the prompts around it
211
+ 'welcome.tagline': 'Ein KI-Coding-Agent für das Terminal',
212
+ 'welcome.intro': 'Richten wir alles ein. Das dauert etwa eine Minute.',
213
+ 'welcome.step.language': 'Sprache',
214
+ 'welcome.step.provider': 'Anbieter',
215
+ 'welcome.step.key': 'API-Schlüssel',
216
+ 'welcome.step.model': 'Modell',
217
+ 'welcome.keyNote': 'Dein Schlüssel bleibt auf diesem Computer, in ~/.devxrc.json.',
218
+ 'onboard.language.title': 'sprache',
219
+ 'onboard.language.note': 'Du kannst sie später in /settings ändern.',
220
+ 'onboard.provider.title': 'anbieter',
221
+ 'onboard.provider.placeholder': 'tippen, um einen Anbieter zu finden',
222
+ 'onboard.provider.note': 'Der Dienst, der dir die Modelle liefert. Nicht in der Liste? Wähle eigene Adresse.',
223
+ 'onboard.custom': 'Eigene Adresse',
224
+ 'onboard.customDetail': 'Jede OpenAI-kompatible Adresse',
225
+ 'onboard.baseUrl.title': 'adresse',
226
+ 'onboard.baseUrl.label': 'Basis-URL der API',
227
+ 'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
228
+ 'onboard.key.title': 'api-schlüssel',
229
+ 'onboard.key.label': 'Füge deinen API-Schlüssel für {provider} ein',
230
+ 'onboard.key.note': 'Die Eingabe bleibt verborgen. Esc geht zurück.',
231
+ 'onboard.key.useSaved': 'Gespeicherten Schlüssel verwenden',
232
+ 'onboard.key.enterNew': 'Neuen Schlüssel eingeben',
233
+ 'onboard.key.savedTitle': 'für {provider} ist ein Schlüssel gespeichert',
234
+ 'onboard.model.title': 'modell',
235
+ 'onboard.model.placeholder': 'tippen, um ein Modell zu finden',
236
+ 'onboard.model.custom': 'Modellnamen eingeben',
237
+ 'onboard.model.customDetail': 'Jede Modell-ID',
238
+ 'onboard.model.label': 'Name des Modells (zum Beispiel gpt-4o)',
239
+ 'onboard.model.fetching': 'Modellliste wird geladen...',
240
+ 'onboard.model.manual': 'Die Modellliste konnte nicht geladen werden, gib den Modellnamen ein.',
241
+ 'onboard.model.context': '{n} Kontext',
242
+ 'onboard.model.anthropic': 'Anthropic-Format',
243
+ 'onboard.back': 'Zurück',
244
+ 'onboard.back.detail': 'Aktuelle Einstellung behalten',
245
+ 'onboard.done': 'Fertig. Deine Auswahl ist in ~/.devxrc.json gespeichert.',
246
+ 'finder.placeholder': 'tippen zum Filtern',
247
+ 'finder.empty': 'Keine Treffer',
248
+ 'finder.hint.filter': 'filtern',
249
+ 'picker.hint.move': 'bewegen',
250
+ 'picker.hint.select': 'wählen',
251
+ 'picker.hint.cancel': 'abbrechen',
252
+ 'picker.hint.confirm': 'bestätigen',
253
+ 'welcome.step.theme': 'Design',
254
+ 'onboard.theme.title': 'design',
255
+ 'onboard.theme.note': 'Die Farben der Oberfläche. Mit /theme jederzeit änderbar.',
256
+ 'resume.title': 'fortsetzen',
257
+ 'resume.placeholder': 'tippen, um Sitzungen zu filtern',
258
+ 'resume.msgs': '{n} Nachr.',
259
+ 'sessions.deleteTitle': 'Sitzungen löschen',
260
+ 'sessions.deleteAll': 'Alle {n} Sitzungen löschen',
261
+ 'commands.title': 'Befehle',
262
+ 'commands.placeholder': 'tippen, um einen Befehl zu finden',
263
+ 'compact.done': 'Kontext verdichtet, Zusammenfassung behalten',
264
+ 'compact.summary': 'was das Modell geschrieben hat',
265
+ };
@@ -0,0 +1,276 @@
1
+ /**
2
+ * English: the source of truth. Every other language has exactly these keys (the compiler
3
+ * checks it) and falls back to this text when a key is ever missing at run time.
4
+ * `{name}` marks a value that is filled in by `t()`.
5
+ */
6
+ export const en = {
7
+ // ── network errors
8
+ 'net.unknown': 'Unknown network error',
9
+ 'net.rateLimit': 'API rate limit exceeded (429)',
10
+ 'net.badGateway': 'Provider gateway is temporarily unavailable (502)',
11
+ 'net.unavailable': 'Provider server is overloaded (503)',
12
+ 'net.gatewayTimeout': 'Provider gateway timed out (504)',
13
+ 'net.offline': 'No network connection or DNS failure (offline)',
14
+ 'net.reset': 'Connection to the server was reset',
15
+ 'net.timeout': 'Network connection timed out',
16
+ 'net.refused': 'The server refused the connection',
17
+ 'net.fetchFailed': 'Network request failed (connection dropped)',
18
+ 'net.generic': 'Internet connection failure',
19
+ 'net.failedAfter': 'Network error: could not restore the connection after {n} attempts ({reason}).',
20
+ // ── connection and stopping
21
+ 'conn.unstable': 'connection unstable ({reason})',
22
+ 'conn.reconnecting': 'reconnecting {attempt}/{max} · retry in {delay}s',
23
+ 'conn.restored': 'connection restored',
24
+ 'conn.classicUnstable': 'Connection unstable ({reason})',
25
+ 'conn.classicRetry': 'Reconnecting [{attempt}/{max}] (pause {delay}s)...',
26
+ 'conn.classicWaiting': 'Waiting for the network [{attempt}/{max}]...',
27
+ 'conn.classicRestored': '✓ Connection restored! Resuming generation...',
28
+ 'stop.connection': 'connection cancelled',
29
+ 'stop.stopped': 'stopped',
30
+ 'stop.interrupted': 'interrupted, sending your message',
31
+ 'stop.classicConnection': 'Connection cancelled (Ctrl+C).',
32
+ 'stop.classicStopped': 'Generation stopped (Ctrl+C).',
33
+ 'stop.classicInterrupted': 'Interrupted: sending your message.',
34
+ // ── the working line
35
+ 'status.waiting': 'Waiting for the model',
36
+ 'status.thinking': 'Thinking',
37
+ 'status.writing': 'Writing',
38
+ 'status.running': 'Running',
39
+ 'status.reconnecting': 'Reconnecting',
40
+ 'status.stop': 'ctrl+c to stop',
41
+ 'status.thinkingLine': 'thinking',
42
+ 'status.thoughtFor': 'thought for {sec}s',
43
+ // ── typing while the agent works
44
+ 'composer.placeholder': 'Ask or describe a task…',
45
+ 'composer.queued': 'queued',
46
+ 'composer.queuedMany': '{n} queued',
47
+ 'composer.queuedHint': 'ctrl+enter sends now · ↓ edit',
48
+ 'composer.hint1': 'enter queues · ctrl+c stop',
49
+ 'composer.hint2': 'enter queues',
50
+ 'composer.hint3': 'enter queues · ctrl+c stop',
51
+ 'composer.hint4': 'enter queues',
52
+ // ── end of a turn
53
+ 'summary.toolOne': '{n} tool',
54
+ 'summary.toolMany': '{n} tools',
55
+ 'summary.in': '{n} in',
56
+ 'summary.out': '{n} out',
57
+ 'summary.stopped': 'stopped',
58
+ // ── settings
59
+ 'settings.title': 'settings',
60
+ 'settings.section.appearance': 'Appearance',
61
+ 'settings.section.agent': 'Agent',
62
+ 'settings.section.general': 'General',
63
+ 'settings.section.about': 'About',
64
+ 'settings.row.theme': 'Theme',
65
+ 'settings.row.layout': 'Interface',
66
+ 'settings.row.pureBlack': 'Black background',
67
+ 'settings.row.autoApprove': 'Auto-approve (YOLO)',
68
+ 'settings.row.maxIterations': 'Max iterations',
69
+ 'settings.row.memory': 'Project memory',
70
+ 'settings.row.updates': 'Update check',
71
+ 'settings.row.language': 'Language',
72
+ 'settings.row.about': 'About devx',
73
+ 'settings.short.theme': 'Theme',
74
+ 'settings.short.layout': 'Interface',
75
+ 'settings.short.pureBlack': 'Black bg',
76
+ 'settings.short.autoApprove': 'YOLO mode',
77
+ 'settings.short.maxIterations': 'Iterations',
78
+ 'settings.short.memory': 'Memory',
79
+ 'settings.short.updates': 'Updates',
80
+ 'settings.short.language': 'Language',
81
+ 'settings.short.about': 'About',
82
+ 'settings.value.on': 'on',
83
+ 'settings.value.off': 'off',
84
+ 'settings.value.clean': 'Clean',
85
+ 'settings.value.classic': 'Classic',
86
+ 'settings.value.unlimited': 'unlimited',
87
+ 'settings.value.steps': '{n} steps',
88
+ 'settings.hint.theme': 'Colours of the whole interface. Left and right browse the themes, the panel recolours as you go.',
89
+ 'settings.hint.layout': 'Clean: framed prompt, cards and quiet tool lines. Classic: the original ASCII layout.',
90
+ 'settings.hint.pureBlack': 'Sets the terminal background to deep OLED black (#0a0a0c). Off keeps your own background.',
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.maxIterations': 'How many tool steps (file edits, commands) the agent may take for one request.',
93
+ 'settings.hint.memory': 'Loads the rules from .devx/memory.md into every session.',
94
+ 'settings.hint.updates': 'Looks for a new devx version on GitHub at startup. /update works either way.',
95
+ 'settings.hint.language': 'Language of the interface: messages, settings and hints. Code and tool names stay in English.',
96
+ 'settings.hint.about': 'Terminal-native AI coding agent by ApvCode. MIT license. github.com/apvcode/Termux-Dev',
97
+ 'settings.warnYolo': 'On: the agent runs commands and edits files without asking.',
98
+ 'settings.keys.move': 'move',
99
+ 'settings.keys.change': 'change',
100
+ 'settings.keys.toggle': 'toggle',
101
+ 'settings.keys.close': 'close',
102
+ // ── /mcp panel
103
+ 'mcp.title': 'MCP servers',
104
+ 'mcp.count': 'servers: {n}',
105
+ 'mcp.scope.user': 'User servers',
106
+ 'mcp.scope.project': 'Project servers',
107
+ 'mcp.toolsCount': 'tools: {n}',
108
+ 'mcp.status.connected': 'connected',
109
+ 'mcp.status.connecting': 'connecting…',
110
+ 'mcp.status.failed': 'failed',
111
+ 'mcp.status.disabled': 'disabled',
112
+ 'mcp.empty': 'No MCP servers configured.',
113
+ 'mcp.emptyHint': 'Run /mcp import to take the servers of Claude Code, or /mcp add <name> <command> [args].',
114
+ 'mcp.detail.status': 'Status',
115
+ 'mcp.detail.command': 'Command',
116
+ 'mcp.detail.config': 'Config',
117
+ 'mcp.detail.capabilities': 'Capabilities',
118
+ 'mcp.detail.tools': 'Tools',
119
+ 'mcp.detail.error': 'Error',
120
+ 'mcp.action.tools': 'View tools',
121
+ 'mcp.action.reconnect': 'Reconnect',
122
+ 'mcp.action.disable': 'Disable',
123
+ 'mcp.action.enable': 'Enable',
124
+ 'mcp.toolsTitle': 'Tools of {name}',
125
+ 'mcp.noTools': 'This server offers no tools.',
126
+ 'mcp.tag.readOnly': 'read-only',
127
+ 'mcp.tag.destructive': 'destructive',
128
+ 'mcp.tag.openWorld': 'open-world',
129
+ 'mcp.params': 'Parameters',
130
+ 'mcp.noParams': 'No parameters.',
131
+ 'mcp.required': 'required',
132
+ 'mcp.more': '{n} more',
133
+ 'mcp.keys.open': 'open',
134
+ 'mcp.keys.back': 'back',
135
+ 'mcp.keys.reload': 'reload all',
136
+ 'mcp.keys.close': 'close',
137
+ // ── questions from the agent
138
+ 'questions.title': 'Question',
139
+ 'questions.custom': 'Type your own answer…',
140
+ 'questions.skip': 'Skip',
141
+ 'questions.skipped': '(skipped)',
142
+ 'questions.yourAnswer': 'Your answer:',
143
+ 'questions.empty': 'The answer cannot be empty',
144
+ // ── confirmations
145
+ 'confirm.yes': 'Yes',
146
+ 'confirm.no': 'No',
147
+ 'confirm.exitTitle': 'exit',
148
+ 'confirm.exit': 'Exit devx?',
149
+ 'confirm.goodbye': 'Goodbye',
150
+ 'confirm.deleteAll': 'Delete ALL {n} saved sessions?',
151
+ 'confirm.update': 'Update devx to v{version} now?',
152
+ 'confirm.commit': 'Commit the changes with this message?',
153
+ 'trust.title': 'workspace trust',
154
+ 'trust.question': 'First time in this folder. Trust it and let the agent work here?',
155
+ 'trust.yes': 'Yes, trust this folder',
156
+ 'trust.no': 'No, exit',
157
+ 'trust.wantsYolo': 'The project config asks for auto-approve (YOLO)',
158
+ 'trust.wantsAllowlist': 'The project config allows these commands: {list}',
159
+ 'trust.exiting': 'Folder not trusted, exiting devx',
160
+ 'trust.mcpQuestion': 'This project wants to start MCP servers (local programs, listed above). Allow?',
161
+ // ── view switches
162
+ 'view.expandThought': 'ctrl+p to expand',
163
+ 'view.expandOutput': 'ctrl+o to expand',
164
+ 'view.moreLines': '… +{n} lines',
165
+ // ── plan approval
166
+ 'plan.cardTitle': 'Plan',
167
+ 'plan.files': 'Files',
168
+ 'plan.ready': 'The plan is ready. Start working on it?',
169
+ 'plan.go': 'Go: switch to AGENT mode and start',
170
+ 'plan.edit': 'Change the plan (stay in PLAN mode)',
171
+ 'plan.editHint': 'Say what to change: the plan stays in PLAN mode and is redone.',
172
+ 'plan.started': 'AGENT mode: working on the approved plan',
173
+ // ── undo
174
+ 'undo.question': 'Put {n} file(s) back to how they were before the last turn?',
175
+ 'undo.note': 'Includes what shell commands did. Files ignored by git are not touched.',
176
+ 'undo.done': 'Restored {n} file(s)',
177
+ // ── permissions
178
+ 'permissions.title': 'Allowed without asking',
179
+ 'permissions.none': 'Nothing is allowed without asking yet: answer "Session" or "Always" on an approval card to add something.',
180
+ 'permissions.hint': '/permissions clear removes all of it (the session ones too).',
181
+ 'permissions.cleared': 'Everything allowed without asking was removed',
182
+ // ── cost limit
183
+ 'settings.row.costLimit': 'Cost limit',
184
+ 'settings.short.costLimit': 'Cost cap',
185
+ 'settings.hint.costLimit': 'The most one session may cost. At 80% devx warns you, at the limit it stops the task and asks before it spends more.',
186
+ 'cost.title': 'cost limit',
187
+ 'cost.warn': '{spent} spent: 80% of the {limit} limit of this session',
188
+ 'cost.stopped': 'Cost limit of {limit} reached: the task is stopped',
189
+ 'cost.reached': 'This session has spent {spent} of its {limit} limit. Spend more?',
190
+ 'cost.raise': 'Continuing raises the limit of this session to {limit}.',
191
+ 'cost.continue': 'Yes, continue',
192
+ 'cost.cancel': 'No, not now',
193
+ 'cost.cancelled': 'Nothing was sent. Your message is back in the input line.',
194
+ // ── /copy and /rename
195
+ 'copy.none': 'There is no answer to copy yet.',
196
+ 'copy.done': 'Copied the last answer ({n} characters)',
197
+ 'copy.failed': 'Could not reach the clipboard (no wl-copy, xclip, xsel, and the answer is too long for the terminal).',
198
+ 'rename.done': 'Chat renamed: {name}',
199
+ 'rename.usage': 'Usage: /rename <name>. Without a name the AI names the chat again, once there is a first answer.',
200
+ 'rename.failed': 'The AI did not come up with a name. Try again or give one: /rename <name>.',
201
+ // ── memory
202
+ 'memory.capped': 'The memory is long: {n} of the oldest facts are not sent to the model (only the newest fit). Remove old ones from .devx/memory.md.',
203
+ 'mcp.removeUsage': 'Usage: /mcp remove <name>',
204
+ 'mcp.removeNotFound': '"{name}" is not in ~/.devx/mcp.json. A server of another file (the project, ~/.devxrc.json) has to be removed from that file by hand.',
205
+ 'mcp.removed': 'Server "{name}" removed',
206
+ // ── /rewind
207
+ 'rewind.title': 'rewind',
208
+ 'rewind.count': '{n} messages',
209
+ 'rewind.current': '(current: stay here)',
210
+ 'rewind.none': 'There is no message of yours to go back to yet.',
211
+ 'rewind.later': '{n} after it',
212
+ 'rewind.ago.now': 'just now',
213
+ 'rewind.ago.min': '{n}m ago',
214
+ 'rewind.ago.hour': '{n}h ago',
215
+ 'rewind.ago.day': '{n}d ago',
216
+ 'rewind.filesQuestion': 'Put the files ({n}) back to how they were then, too?',
217
+ 'rewind.filesYes': 'Yes, files too',
218
+ 'rewind.filesNo': 'No, only the conversation',
219
+ 'rewind.done': 'Back at your message. What came after it is gone, for the model too. Edit the message and send it.',
220
+ 'rewind.doneImages': 'Back at your message (its images were not kept, attach them again). What came after it is gone, for the model too.',
221
+ // ── first run and the prompts around it
222
+ 'welcome.tagline': 'A terminal AI coding agent',
223
+ 'welcome.intro': 'Let us set things up. It takes about a minute.',
224
+ 'welcome.step.language': 'Language',
225
+ 'welcome.step.provider': 'Provider',
226
+ 'welcome.step.key': 'API key',
227
+ 'welcome.step.model': 'Model',
228
+ 'welcome.keyNote': 'Your key stays on this computer, in ~/.devxrc.json.',
229
+ 'onboard.language.title': 'language',
230
+ 'onboard.language.note': 'You can change it later in /settings.',
231
+ 'onboard.provider.title': 'provider',
232
+ '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.',
234
+ 'onboard.custom': 'Custom endpoint',
235
+ 'onboard.customDetail': 'Any OpenAI-compatible address',
236
+ 'onboard.baseUrl.title': 'address',
237
+ 'onboard.baseUrl.label': 'Base URL of the API',
238
+ 'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
239
+ 'onboard.key.title': 'api key',
240
+ 'onboard.key.label': 'Paste your API key for {provider}',
241
+ 'onboard.key.note': 'What you type is hidden. Esc goes back.',
242
+ 'onboard.key.useSaved': 'Use the saved key',
243
+ 'onboard.key.enterNew': 'Enter a new key',
244
+ 'onboard.key.savedTitle': 'a key is saved for {provider}',
245
+ 'onboard.model.title': 'model',
246
+ 'onboard.model.placeholder': 'type to find a model',
247
+ 'onboard.model.custom': 'Type a model name',
248
+ 'onboard.model.customDetail': 'Any model id',
249
+ 'onboard.model.label': 'Name of the model (for example gpt-4o)',
250
+ 'onboard.model.fetching': 'Fetching the list of models...',
251
+ 'onboard.model.manual': 'The list of models could not be fetched, so type the name of the model.',
252
+ 'onboard.model.context': '{n} context',
253
+ 'onboard.model.anthropic': 'Anthropic format',
254
+ 'onboard.back': 'Back',
255
+ 'onboard.back.detail': 'Keep what is set now',
256
+ 'onboard.done': 'All set. Your choices are saved in ~/.devxrc.json.',
257
+ 'finder.placeholder': 'type to filter',
258
+ 'finder.empty': 'Nothing matches',
259
+ 'finder.hint.filter': 'filter',
260
+ 'picker.hint.move': 'move',
261
+ 'picker.hint.select': 'select',
262
+ 'picker.hint.cancel': 'cancel',
263
+ 'picker.hint.confirm': 'confirm',
264
+ 'welcome.step.theme': 'Theme',
265
+ 'onboard.theme.title': 'theme',
266
+ 'onboard.theme.note': 'The colours of the interface. Change them any time with /theme.',
267
+ 'resume.title': 'resume',
268
+ 'resume.placeholder': 'type to filter sessions',
269
+ 'resume.msgs': '{n} msgs',
270
+ 'sessions.deleteTitle': 'delete sessions',
271
+ 'sessions.deleteAll': 'Delete all {n} sessions',
272
+ 'commands.title': 'commands',
273
+ 'commands.placeholder': 'type to find a command',
274
+ 'compact.done': 'Context compacted, summary kept',
275
+ 'compact.summary': 'what the model wrote',
276
+ };