termux-dev 1.8.2 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -6
- package/assets/banner.svg +1 -1
- package/assets/preview.svg +1 -1
- package/dist/cli/background-ui.js +8 -8
- package/dist/cli/files.js +2 -12
- package/dist/cli/finder.js +10 -2
- package/dist/cli/headless.js +3 -2
- package/dist/cli/index.js +131 -75
- package/dist/cli/keys.js +12 -3
- package/dist/cli/liveblock.js +47 -9
- package/dist/cli/mcp-panel.js +2 -0
- package/dist/cli/picker.js +2 -0
- package/dist/cli/prompt.js +54 -7
- package/dist/cli/provider-manager.js +197 -0
- package/dist/cli/providers.js +0 -5
- package/dist/cli/settings.js +38 -17
- package/dist/cli/typeahead.js +10 -17
- package/dist/cli/ui.js +33 -13
- package/dist/cli/update-screen.js +383 -0
- package/dist/cli/updater.js +119 -145
- package/dist/cli/usage-panel.js +17 -4
- package/dist/cli/width.js +18 -0
- package/dist/core/background.js +14 -0
- package/dist/core/context-stats.js +1 -0
- package/dist/core/cost.js +25 -11
- package/dist/core/custom-providers.js +161 -0
- package/dist/core/images.js +46 -0
- package/dist/core/local-config.js +3 -1
- package/dist/core/locales/de.js +69 -7
- package/dist/core/locales/en.js +69 -7
- package/dist/core/locales/es.js +69 -7
- package/dist/core/locales/fr.js +69 -7
- package/dist/core/locales/ja.js +69 -7
- package/dist/core/locales/pt.js +69 -7
- package/dist/core/locales/ru.js +69 -7
- package/dist/core/locales/uk.js +69 -7
- package/dist/core/locales/zh.js +69 -7
- package/dist/core/loop.js +32 -1
- package/dist/core/prices.js +8 -4
- package/dist/core/session-media.js +115 -0
- package/dist/core/session.js +17 -2
- package/dist/core/title.js +19 -2
- package/dist/core/types.js +1 -1
- package/dist/core/usage.js +41 -4
- package/dist/permissions/guard.js +3 -0
- package/dist/providers/anthropic.js +67 -13
- package/dist/providers/index.js +16 -3
- package/dist/providers/openai.js +99 -41
- package/dist/providers/shared.js +83 -0
- package/dist/tools/fs.js +32 -2
- package/package.json +1 -1
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Images the model can be shown: which files count as images, how big they may be, and a check
|
|
3
|
+
* that the bytes really are an image. A file the API refuses (a text file named .png, an
|
|
4
|
+
* oversized photo) would stay in the history and make every following request fail, so it is
|
|
5
|
+
* checked before it is sent.
|
|
6
|
+
*/
|
|
7
|
+
// Formats the image APIs accept (SVG is text, not an image for a model).
|
|
8
|
+
export const IMAGE_EXTS = {
|
|
9
|
+
'.png': 'image/png',
|
|
10
|
+
'.jpg': 'image/jpeg',
|
|
11
|
+
'.jpeg': 'image/jpeg',
|
|
12
|
+
'.webp': 'image/webp',
|
|
13
|
+
'.gif': 'image/gif'
|
|
14
|
+
};
|
|
15
|
+
/** Above this an API usually refuses the image (Anthropic: 5 MB). */
|
|
16
|
+
export const IMAGE_WARN_BYTES = 5 * 1024 * 1024;
|
|
17
|
+
/** Above this the image is not sent at all. */
|
|
18
|
+
export const IMAGE_MAX_BYTES = 20 * 1024 * 1024;
|
|
19
|
+
/** The media type for a file name, when its extension is one of an image. */
|
|
20
|
+
export function imageMimeForPath(file) {
|
|
21
|
+
const dot = file.lastIndexOf('.');
|
|
22
|
+
if (dot === -1)
|
|
23
|
+
return undefined;
|
|
24
|
+
return IMAGE_EXTS[file.slice(dot).toLowerCase()];
|
|
25
|
+
}
|
|
26
|
+
/** The media type the first bytes say, or undefined when they are not PNG, JPEG, GIF or WebP. */
|
|
27
|
+
export function sniffImageMime(buf) {
|
|
28
|
+
const at = (i) => buf[i];
|
|
29
|
+
if (buf.length >= 8 && at(0) === 0x89 && at(1) === 0x50 && at(2) === 0x4e && at(3) === 0x47 && at(4) === 0x0d && at(5) === 0x0a && at(6) === 0x1a && at(7) === 0x0a) {
|
|
30
|
+
return 'image/png';
|
|
31
|
+
}
|
|
32
|
+
if (buf.length >= 3 && at(0) === 0xff && at(1) === 0xd8 && at(2) === 0xff)
|
|
33
|
+
return 'image/jpeg';
|
|
34
|
+
if (buf.length >= 6) {
|
|
35
|
+
const head = String.fromCharCode(at(0), at(1), at(2), at(3), at(4), at(5));
|
|
36
|
+
if (head === 'GIF87a' || head === 'GIF89a')
|
|
37
|
+
return 'image/gif';
|
|
38
|
+
}
|
|
39
|
+
if (buf.length >= 12) {
|
|
40
|
+
const riff = String.fromCharCode(at(0), at(1), at(2), at(3));
|
|
41
|
+
const webp = String.fromCharCode(at(8), at(9), at(10), at(11));
|
|
42
|
+
if (riff === 'RIFF' && webp === 'WEBP')
|
|
43
|
+
return 'image/webp';
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
@@ -51,9 +51,10 @@ export function applyLocalConfig(target, local, trusted) {
|
|
|
51
51
|
* Settings that last for one run only and are never written to ~/.devxrc.json.
|
|
52
52
|
* - `autoApprove` (YOLO): switched on in the settings or with `--yolo`, it is off again the
|
|
53
53
|
* next time devx starts. A mode that skips confirmations should not stay on by accident.
|
|
54
|
+
* - `autoApproveAll` (Extra): YOLO without the safety net, the same.
|
|
54
55
|
* - `projectMcpTrusted`, `effortOverride`: runtime flags.
|
|
55
56
|
*/
|
|
56
|
-
export const SESSION_ONLY_SETTINGS = ['autoApprove', 'projectMcpTrusted', 'effortOverride'];
|
|
57
|
+
export const SESSION_ONLY_SETTINGS = ['autoApprove', 'autoApproveAll', 'projectMcpTrusted', 'effortOverride'];
|
|
57
58
|
/** The config as it goes to disk: without the settings that last for one run only. */
|
|
58
59
|
export function persistedConfig(config) {
|
|
59
60
|
const out = { ...config };
|
|
@@ -65,5 +66,6 @@ export function persistedConfig(config) {
|
|
|
65
66
|
export function withoutSessionOnlySettings(config) {
|
|
66
67
|
const out = { ...config };
|
|
67
68
|
delete out.autoApprove;
|
|
69
|
+
delete out.autoApproveAll;
|
|
68
70
|
return out;
|
|
69
71
|
}
|
package/dist/core/locales/de.js
CHANGED
|
@@ -20,25 +20,23 @@ export const de = {
|
|
|
20
20
|
'conn.classicRestored': '✓ Verbindung wiederhergestellt! Die Generierung wird fortgesetzt...',
|
|
21
21
|
'stop.connection': 'Verbindung abgebrochen',
|
|
22
22
|
'stop.stopped': 'gestoppt',
|
|
23
|
-
'stop.interrupted': 'unterbrochen, deine Nachricht wird gesendet',
|
|
24
23
|
'stop.classicConnection': 'Verbindung abgebrochen (Strg+C).',
|
|
25
24
|
'stop.classicStopped': 'Generierung gestoppt (Strg+C).',
|
|
26
|
-
'stop.classicInterrupted': 'Unterbrochen: deine Nachricht wird gesendet.',
|
|
27
25
|
'status.waiting': 'Warte auf das Modell',
|
|
28
26
|
'status.thinking': 'Denkt nach',
|
|
29
27
|
'status.writing': 'Schreibt',
|
|
30
28
|
'status.running': 'Läuft',
|
|
31
29
|
'status.reconnecting': 'Neuverbindung',
|
|
32
|
-
'status.stop': '
|
|
30
|
+
'status.stop': 'esc zum Stoppen',
|
|
33
31
|
'status.thinkingLine': 'denkt nach',
|
|
34
32
|
'status.thoughtFor': 'nachgedacht: {sec} s',
|
|
35
33
|
'composer.placeholder': 'Aufgabe beschreiben oder etwas fragen…',
|
|
36
34
|
'composer.queued': 'in der Warteschlange',
|
|
37
35
|
'composer.queuedMany': '{n} in der Warteschlange',
|
|
38
|
-
'composer.queuedHint': '
|
|
39
|
-
'composer.hint1': 'enter reiht ein ·
|
|
36
|
+
'composer.queuedHint': '↓ bearbeiten',
|
|
37
|
+
'composer.hint1': 'enter reiht ein · esc stoppt',
|
|
40
38
|
'composer.hint2': 'enter reiht ein',
|
|
41
|
-
'composer.hint3': 'enter reiht ein ·
|
|
39
|
+
'composer.hint3': 'enter reiht ein · esc stoppt',
|
|
42
40
|
'composer.hint4': 'enter reiht ein',
|
|
43
41
|
'summary.toolOne': '{n} Werkzeug',
|
|
44
42
|
'summary.toolMany': '{n} Werkzeuge',
|
|
@@ -54,6 +52,7 @@ export const de = {
|
|
|
54
52
|
'settings.row.layout': 'Oberfläche',
|
|
55
53
|
'settings.row.pureBlack': 'Schwarzer Hintergrund',
|
|
56
54
|
'settings.row.autoApprove': 'Auto-Freigabe (YOLO)',
|
|
55
|
+
'settings.row.extra': 'Extra (fragt nichts)',
|
|
57
56
|
'settings.row.maxIterations': 'Max. Schritte',
|
|
58
57
|
'settings.row.memory': 'Projektgedächtnis',
|
|
59
58
|
'settings.row.updates': 'Updateprüfung',
|
|
@@ -63,6 +62,7 @@ export const de = {
|
|
|
63
62
|
'settings.short.layout': 'Oberfläche',
|
|
64
63
|
'settings.short.pureBlack': 'Schwarz',
|
|
65
64
|
'settings.short.autoApprove': 'YOLO',
|
|
65
|
+
'settings.short.extra': 'Extra',
|
|
66
66
|
'settings.short.maxIterations': 'Schritte',
|
|
67
67
|
'settings.short.memory': 'Gedächtnis',
|
|
68
68
|
'settings.short.updates': 'Updates',
|
|
@@ -78,12 +78,15 @@ export const de = {
|
|
|
78
78
|
'settings.hint.layout': 'Schlicht: Eingabe im Rahmen, Karten und ruhige Werkzeugzeilen. Klassisch: das ursprüngliche ASCII-Layout.',
|
|
79
79
|
'settings.hint.pureBlack': 'Setzt den Terminalhintergrund auf tiefes OLED-Schwarz (#0a0a0c). Aus behält deinen eigenen Hintergrund.',
|
|
80
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.extra': 'Führt JEDEN Befehl ohne Rückfrage aus: auch zerstörerische (rm -rf, sudo, git push --force), heruntergeladene Skripte, das Lesen von Schlüsseln und Geheimnissen, neue MCP-Server. Hier gibt es keine Sandbox. Gilt nur für diese Sitzung.',
|
|
81
82
|
'settings.hint.maxIterations': 'Wie viele Werkzeugschritte (Dateiänderungen, Befehle) der Agent pro Anfrage ausführen darf.',
|
|
82
83
|
'settings.hint.memory': 'Lädt die Regeln aus .devx/memory.md in jede Sitzung.',
|
|
83
84
|
'settings.hint.updates': 'Sucht beim Start auf GitHub nach einer neuen devx-Version. /update funktioniert in jedem Fall.',
|
|
84
85
|
'settings.hint.language': 'Sprache der Oberfläche: Meldungen, Einstellungen und Hinweise. Code und Werkzeugnamen bleiben englisch.',
|
|
85
86
|
'settings.hint.about': 'KI-Coding-Agent für das Terminal von ApvCode. MIT-Lizenz. github.com/apvcode/Termux-Dev',
|
|
86
87
|
'settings.warnYolo': 'An: Der Agent führt Befehle aus und ändert Dateien ohne Rückfrage.',
|
|
88
|
+
'settings.warnExtra': 'Achtung: nichts wird gefragt. Nur wo alles verloren sein darf.',
|
|
89
|
+
'settings.extraEnabled': 'Extra ist an: Der Agent führt jeden Befehl ohne Rückfrage aus, auch gefährliche. Beim nächsten Start von devx ist es wieder aus.',
|
|
87
90
|
'settings.keys.move': 'wählen',
|
|
88
91
|
'settings.keys.change': 'ändern',
|
|
89
92
|
'settings.keys.toggle': 'umschalten',
|
|
@@ -219,9 +222,68 @@ export const de = {
|
|
|
219
222
|
'onboard.language.note': 'Du kannst sie später in /settings ändern.',
|
|
220
223
|
'onboard.provider.title': 'anbieter',
|
|
221
224
|
'onboard.provider.placeholder': 'tippen, um einen Anbieter zu finden',
|
|
222
|
-
'onboard.provider.note': 'Der Dienst, der dir die Modelle
|
|
225
|
+
'onboard.provider.note': 'Der Dienst, der dir die Modelle gibt. Nicht in der Liste? Füge deinen eigenen mit „Anbieter hinzufügen“ hinzu.',
|
|
223
226
|
'onboard.custom': 'Eigene Adresse',
|
|
224
227
|
'onboard.customDetail': 'Jede OpenAI-kompatible Adresse',
|
|
228
|
+
'update.title': 'Update',
|
|
229
|
+
'update.titleBusy': 'aktualisiere',
|
|
230
|
+
'update.titleDone': 'aktualisiert',
|
|
231
|
+
'update.titleFailed': 'Update fehlgeschlagen',
|
|
232
|
+
'update.checking': 'Suche nach Updates',
|
|
233
|
+
'update.upToDate': 'devx ist aktuell ({version})',
|
|
234
|
+
'update.offline': 'Update-Prüfung nicht möglich ({reason})',
|
|
235
|
+
'update.available': 'devx {version} ist da',
|
|
236
|
+
'update.have': 'Du hast {version}',
|
|
237
|
+
'update.released': 'veröffentlicht am {date}',
|
|
238
|
+
'update.whatsNew': 'Neu in dieser Version',
|
|
239
|
+
'update.viaNpm': 'Mit npm installiert: Das Update führt npm install -g termux-dev aus.',
|
|
240
|
+
'update.viaGit': 'Aus einem Git-Klon installiert: Das Update holt, baut und verlinkt ihn.',
|
|
241
|
+
'update.now': 'Jetzt aktualisieren',
|
|
242
|
+
'update.nowDetail': '{version} installieren und devx neu starten',
|
|
243
|
+
'update.later': 'Später',
|
|
244
|
+
'update.laterDetail': 'Diese Version vorerst behalten',
|
|
245
|
+
'update.skip': 'Diese Version überspringen',
|
|
246
|
+
'update.skipDetail': 'Zu {version} nicht mehr fragen',
|
|
247
|
+
'update.step.registry': 'Prüfe die Registry',
|
|
248
|
+
'update.step.install': 'Installiere devx {version}',
|
|
249
|
+
'update.step.verify': 'Prüfe die neue Version',
|
|
250
|
+
'update.step.pull': 'Hole von GitHub',
|
|
251
|
+
'update.step.build': 'Installiere und baue',
|
|
252
|
+
'update.step.link': 'Verlinke den Befehl',
|
|
253
|
+
'update.keepOpen': 'Lass devx geöffnet, das dauert einen Moment.',
|
|
254
|
+
'update.installed': 'devx {version} ist installiert',
|
|
255
|
+
'update.restarting': 'Starte devx neu…',
|
|
256
|
+
'update.failedStep': 'Gestoppt bei: {step}',
|
|
257
|
+
'update.keepsRunning': 'devx läuft weiter auf {version}.',
|
|
258
|
+
'update.byHand': 'So aktualisierst du von Hand:',
|
|
259
|
+
'update.notPublished': 'npm hat {version} noch nicht. Versuche es in ein paar Minuten erneut.',
|
|
260
|
+
'update.skipped': 'Verstanden: keine Fragen mehr zu {version}.',
|
|
261
|
+
'provider.add': 'Anbieter hinzufügen',
|
|
262
|
+
'provider.addDetail': 'Jede OpenAI- oder Anthropic-kompatible Adresse',
|
|
263
|
+
'provider.customTag': 'eigen',
|
|
264
|
+
'provider.new': 'neuer Anbieter',
|
|
265
|
+
'provider.name.label': 'Name des Anbieters',
|
|
266
|
+
'provider.name.placeholder': 'Mein Gateway',
|
|
267
|
+
'provider.name.empty': 'Gib einen Namen ein.',
|
|
268
|
+
'provider.name.long': 'Der Name ist zu lang (höchstens 40 Zeichen).',
|
|
269
|
+
'provider.name.taken': 'Ein Anbieter mit diesem Namen gibt es schon.',
|
|
270
|
+
'provider.url.note': 'Die Adresse bis /chat/completions oder /messages, zum Beispiel https://api.example.com/v1.',
|
|
271
|
+
'provider.url.invalid': 'Das ist keine Adresse. Beispiel: https://api.example.com/v1',
|
|
272
|
+
'provider.url.scheme': 'Die Adresse muss mit http:// oder https:// beginnen.',
|
|
273
|
+
'provider.key.none': 'Kein Schlüssel nötig',
|
|
274
|
+
'provider.key.noneDetail': 'Ein Server auf diesem Rechner oder in diesem Netz',
|
|
275
|
+
'provider.key.enter': 'Schlüssel eingeben',
|
|
276
|
+
'provider.menu.use': 'Diesen Anbieter verwenden',
|
|
277
|
+
'provider.menu.rename': 'Namen ändern',
|
|
278
|
+
'provider.menu.url': 'Adresse ändern',
|
|
279
|
+
'provider.menu.key': 'Schlüssel ändern',
|
|
280
|
+
'provider.menu.delete': 'Löschen',
|
|
281
|
+
'provider.menu.deleteDetail': 'Entfernt ihn samt Schlüssel',
|
|
282
|
+
'provider.delete.question': 'Anbieter {name} und seinen Schlüssel löschen?',
|
|
283
|
+
'provider.delete.active': 'Das ist der aktuelle Anbieter: Er arbeitet weiter, bis du einen anderen wählst.',
|
|
284
|
+
'provider.saved': 'Anbieter {name} gespeichert',
|
|
285
|
+
'provider.updated': 'Anbieter {name} aktualisiert',
|
|
286
|
+
'provider.deleted': 'Anbieter {name} gelöscht',
|
|
225
287
|
'onboard.baseUrl.title': 'adresse',
|
|
226
288
|
'onboard.baseUrl.label': 'Basis-URL der API',
|
|
227
289
|
'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
|
package/dist/core/locales/en.js
CHANGED
|
@@ -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': '
|
|
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': '
|
|
48
|
-
'composer.hint1': 'enter queues ·
|
|
45
|
+
'composer.queuedHint': '↓ edit',
|
|
46
|
+
'composer.hint1': 'enter queues · esc stop',
|
|
49
47
|
'composer.hint2': 'enter queues',
|
|
50
|
-
'composer.hint3': 'enter queues ·
|
|
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,68 @@ 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?
|
|
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
|
+
'update.title': 'update',
|
|
240
|
+
'update.titleBusy': 'updating',
|
|
241
|
+
'update.titleDone': 'updated',
|
|
242
|
+
'update.titleFailed': 'update failed',
|
|
243
|
+
'update.checking': 'Checking for updates',
|
|
244
|
+
'update.upToDate': 'devx is up to date ({version})',
|
|
245
|
+
'update.offline': 'Could not check for updates ({reason})',
|
|
246
|
+
'update.available': 'devx {version} is out',
|
|
247
|
+
'update.have': 'You have {version}',
|
|
248
|
+
'update.released': 'released {date}',
|
|
249
|
+
'update.whatsNew': 'What\'s new',
|
|
250
|
+
'update.viaNpm': 'Installed with npm: the update runs npm install -g termux-dev.',
|
|
251
|
+
'update.viaGit': 'Installed from a git clone: the update pulls, builds and links it.',
|
|
252
|
+
'update.now': 'Update now',
|
|
253
|
+
'update.nowDetail': 'Install {version} and restart devx',
|
|
254
|
+
'update.later': 'Later',
|
|
255
|
+
'update.laterDetail': 'Keep this version for now',
|
|
256
|
+
'update.skip': 'Skip this version',
|
|
257
|
+
'update.skipDetail': 'Do not ask again about {version}',
|
|
258
|
+
'update.step.registry': 'Checking the registry',
|
|
259
|
+
'update.step.install': 'Installing devx {version}',
|
|
260
|
+
'update.step.verify': 'Checking the new version',
|
|
261
|
+
'update.step.pull': 'Pulling from GitHub',
|
|
262
|
+
'update.step.build': 'Installing and building',
|
|
263
|
+
'update.step.link': 'Linking the command',
|
|
264
|
+
'update.keepOpen': 'Keep devx open, this takes a moment.',
|
|
265
|
+
'update.installed': 'devx {version} is installed',
|
|
266
|
+
'update.restarting': 'Restarting devx…',
|
|
267
|
+
'update.failedStep': 'Stopped at: {step}',
|
|
268
|
+
'update.keepsRunning': 'devx keeps running on {version}.',
|
|
269
|
+
'update.byHand': 'To update by hand:',
|
|
270
|
+
'update.notPublished': 'npm does not have {version} yet. Try again in a few minutes.',
|
|
271
|
+
'update.skipped': 'Understood: no more questions about {version}.',
|
|
272
|
+
'provider.add': 'Add a provider',
|
|
273
|
+
'provider.addDetail': 'Any OpenAI or Anthropic compatible address',
|
|
274
|
+
'provider.customTag': 'custom',
|
|
275
|
+
'provider.new': 'new provider',
|
|
276
|
+
'provider.name.label': 'Name of the provider',
|
|
277
|
+
'provider.name.placeholder': 'My gateway',
|
|
278
|
+
'provider.name.empty': 'Type a name.',
|
|
279
|
+
'provider.name.long': 'The name is too long (40 characters at most).',
|
|
280
|
+
'provider.name.taken': 'A provider with this name already exists.',
|
|
281
|
+
'provider.url.note': 'The address up to /chat/completions or /messages, for example https://api.example.com/v1.',
|
|
282
|
+
'provider.url.invalid': 'This is not an address. Example: https://api.example.com/v1',
|
|
283
|
+
'provider.url.scheme': 'The address must start with http:// or https://.',
|
|
284
|
+
'provider.key.none': 'No key needed',
|
|
285
|
+
'provider.key.noneDetail': 'A server on this machine or network',
|
|
286
|
+
'provider.key.enter': 'Enter a key',
|
|
287
|
+
'provider.menu.use': 'Use this provider',
|
|
288
|
+
'provider.menu.rename': 'Change the name',
|
|
289
|
+
'provider.menu.url': 'Change the address',
|
|
290
|
+
'provider.menu.key': 'Change the key',
|
|
291
|
+
'provider.menu.delete': 'Delete',
|
|
292
|
+
'provider.menu.deleteDetail': 'Removes it and its key',
|
|
293
|
+
'provider.delete.question': 'Delete the provider {name} and its key?',
|
|
294
|
+
'provider.delete.active': 'It is the provider in use: it keeps working until you choose another one.',
|
|
295
|
+
'provider.saved': 'Provider {name} saved',
|
|
296
|
+
'provider.updated': 'Provider {name} updated',
|
|
297
|
+
'provider.deleted': 'Provider {name} deleted',
|
|
236
298
|
'onboard.baseUrl.title': 'address',
|
|
237
299
|
'onboard.baseUrl.label': 'Base URL of the API',
|
|
238
300
|
'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
|
package/dist/core/locales/es.js
CHANGED
|
@@ -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': '
|
|
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': '
|
|
39
|
-
'composer.hint1': 'enter en cola ·
|
|
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 ·
|
|
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,68 @@ 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?
|
|
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
|
+
'update.title': 'actualización',
|
|
229
|
+
'update.titleBusy': 'actualizando',
|
|
230
|
+
'update.titleDone': 'actualizado',
|
|
231
|
+
'update.titleFailed': 'la actualización falló',
|
|
232
|
+
'update.checking': 'Buscando actualizaciones',
|
|
233
|
+
'update.upToDate': 'devx está al día ({version})',
|
|
234
|
+
'update.offline': 'No se pudo buscar actualizaciones ({reason})',
|
|
235
|
+
'update.available': 'Ya está devx {version}',
|
|
236
|
+
'update.have': 'Tienes {version}',
|
|
237
|
+
'update.released': 'publicada el {date}',
|
|
238
|
+
'update.whatsNew': 'Novedades',
|
|
239
|
+
'update.viaNpm': 'Instalado con npm: la actualización ejecuta npm install -g termux-dev.',
|
|
240
|
+
'update.viaGit': 'Instalado desde un clon de git: la actualización lo descarga, compila y enlaza.',
|
|
241
|
+
'update.now': 'Actualizar ahora',
|
|
242
|
+
'update.nowDetail': 'Instalar {version} y reiniciar devx',
|
|
243
|
+
'update.later': 'Más tarde',
|
|
244
|
+
'update.laterDetail': 'Mantener esta versión por ahora',
|
|
245
|
+
'update.skip': 'Omitir esta versión',
|
|
246
|
+
'update.skipDetail': 'No volver a preguntar por {version}',
|
|
247
|
+
'update.step.registry': 'Comprobando el registro',
|
|
248
|
+
'update.step.install': 'Instalando devx {version}',
|
|
249
|
+
'update.step.verify': 'Comprobando la nueva versión',
|
|
250
|
+
'update.step.pull': 'Descargando de GitHub',
|
|
251
|
+
'update.step.build': 'Instalando y compilando',
|
|
252
|
+
'update.step.link': 'Enlazando el comando',
|
|
253
|
+
'update.keepOpen': 'Mantén devx abierto, tarda un momento.',
|
|
254
|
+
'update.installed': 'devx {version} está instalado',
|
|
255
|
+
'update.restarting': 'Reiniciando devx…',
|
|
256
|
+
'update.failedStep': 'Se detuvo en: {step}',
|
|
257
|
+
'update.keepsRunning': 'devx sigue funcionando en {version}.',
|
|
258
|
+
'update.byHand': 'Para actualizar a mano:',
|
|
259
|
+
'update.notPublished': 'npm aún no tiene {version}. Inténtalo de nuevo en unos minutos.',
|
|
260
|
+
'update.skipped': 'Entendido: no se preguntará más por {version}.',
|
|
261
|
+
'provider.add': 'Añadir proveedor',
|
|
262
|
+
'provider.addDetail': 'Cualquier dirección compatible con OpenAI o Anthropic',
|
|
263
|
+
'provider.customTag': 'propio',
|
|
264
|
+
'provider.new': 'nuevo proveedor',
|
|
265
|
+
'provider.name.label': 'Nombre del proveedor',
|
|
266
|
+
'provider.name.placeholder': 'Mi pasarela',
|
|
267
|
+
'provider.name.empty': 'Escribe un nombre.',
|
|
268
|
+
'provider.name.long': 'El nombre es demasiado largo (40 caracteres como máximo).',
|
|
269
|
+
'provider.name.taken': 'Ya existe un proveedor con ese nombre.',
|
|
270
|
+
'provider.url.note': 'La dirección hasta /chat/completions o /messages, por ejemplo https://api.example.com/v1.',
|
|
271
|
+
'provider.url.invalid': 'Eso no es una dirección. Ejemplo: https://api.example.com/v1',
|
|
272
|
+
'provider.url.scheme': 'La dirección debe empezar por http:// o https://.',
|
|
273
|
+
'provider.key.none': 'No hace falta clave',
|
|
274
|
+
'provider.key.noneDetail': 'Un servidor de este equipo o de esta red',
|
|
275
|
+
'provider.key.enter': 'Introducir una clave',
|
|
276
|
+
'provider.menu.use': 'Usar este proveedor',
|
|
277
|
+
'provider.menu.rename': 'Cambiar el nombre',
|
|
278
|
+
'provider.menu.url': 'Cambiar la dirección',
|
|
279
|
+
'provider.menu.key': 'Cambiar la clave',
|
|
280
|
+
'provider.menu.delete': 'Eliminar',
|
|
281
|
+
'provider.menu.deleteDetail': 'Lo elimina con su clave',
|
|
282
|
+
'provider.delete.question': '¿Eliminar el proveedor {name} y su clave?',
|
|
283
|
+
'provider.delete.active': 'Es el proveedor en uso: sigue funcionando hasta que elijas otro.',
|
|
284
|
+
'provider.saved': 'Proveedor {name} guardado',
|
|
285
|
+
'provider.updated': 'Proveedor {name} actualizado',
|
|
286
|
+
'provider.deleted': 'Proveedor {name} eliminado',
|
|
225
287
|
'onboard.baseUrl.title': 'dirección',
|
|
226
288
|
'onboard.baseUrl.label': 'URL base de la API',
|
|
227
289
|
'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
|
package/dist/core/locales/fr.js
CHANGED
|
@@ -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': '
|
|
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': '
|
|
39
|
-
'composer.hint1': 'entrée en file ·
|
|
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 ·
|
|
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,68 @@ 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
|
|
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
|
+
'update.title': 'mise à jour',
|
|
229
|
+
'update.titleBusy': 'mise à jour en cours',
|
|
230
|
+
'update.titleDone': 'mis à jour',
|
|
231
|
+
'update.titleFailed': 'échec de la mise à jour',
|
|
232
|
+
'update.checking': 'Recherche de mises à jour',
|
|
233
|
+
'update.upToDate': 'devx est à jour ({version})',
|
|
234
|
+
'update.offline': 'Impossible de vérifier les mises à jour ({reason})',
|
|
235
|
+
'update.available': 'devx {version} est sorti',
|
|
236
|
+
'update.have': 'Vous avez {version}',
|
|
237
|
+
'update.released': 'publiée le {date}',
|
|
238
|
+
'update.whatsNew': 'Nouveautés',
|
|
239
|
+
'update.viaNpm': 'Installé avec npm : la mise à jour lance npm install -g termux-dev.',
|
|
240
|
+
'update.viaGit': 'Installé depuis un clone git : la mise à jour le récupère, le compile et le lie.',
|
|
241
|
+
'update.now': 'Mettre à jour maintenant',
|
|
242
|
+
'update.nowDetail': 'Installer {version} et redémarrer devx',
|
|
243
|
+
'update.later': 'Plus tard',
|
|
244
|
+
'update.laterDetail': 'Garder cette version pour l’instant',
|
|
245
|
+
'update.skip': 'Ignorer cette version',
|
|
246
|
+
'update.skipDetail': 'Ne plus demander pour {version}',
|
|
247
|
+
'update.step.registry': 'Vérification du registre',
|
|
248
|
+
'update.step.install': 'Installation de devx {version}',
|
|
249
|
+
'update.step.verify': 'Vérification de la nouvelle version',
|
|
250
|
+
'update.step.pull': 'Récupération depuis GitHub',
|
|
251
|
+
'update.step.build': 'Installation et compilation',
|
|
252
|
+
'update.step.link': 'Liaison de la commande',
|
|
253
|
+
'update.keepOpen': 'Gardez devx ouvert, cela prend un instant.',
|
|
254
|
+
'update.installed': 'devx {version} est installé',
|
|
255
|
+
'update.restarting': 'Redémarrage de devx…',
|
|
256
|
+
'update.failedStep': 'Arrêté à l’étape : {step}',
|
|
257
|
+
'update.keepsRunning': 'devx continue de tourner en {version}.',
|
|
258
|
+
'update.byHand': 'Pour mettre à jour à la main :',
|
|
259
|
+
'update.notPublished': 'npm n’a pas encore {version}. Réessayez dans quelques minutes.',
|
|
260
|
+
'update.skipped': 'Compris : plus de questions sur {version}.',
|
|
261
|
+
'provider.add': 'Ajouter un fournisseur',
|
|
262
|
+
'provider.addDetail': 'Toute adresse compatible OpenAI ou Anthropic',
|
|
263
|
+
'provider.customTag': 'perso',
|
|
264
|
+
'provider.new': 'nouveau fournisseur',
|
|
265
|
+
'provider.name.label': 'Nom du fournisseur',
|
|
266
|
+
'provider.name.placeholder': 'Ma passerelle',
|
|
267
|
+
'provider.name.empty': 'Saisissez un nom.',
|
|
268
|
+
'provider.name.long': 'Le nom est trop long (40 caractères au maximum).',
|
|
269
|
+
'provider.name.taken': 'Un fournisseur porte déjà ce nom.',
|
|
270
|
+
'provider.url.note': 'L’adresse jusqu’à /chat/completions ou /messages, par exemple https://api.example.com/v1.',
|
|
271
|
+
'provider.url.invalid': 'Ce n’est pas une adresse. Exemple : https://api.example.com/v1',
|
|
272
|
+
'provider.url.scheme': 'L’adresse doit commencer par http:// ou https://.',
|
|
273
|
+
'provider.key.none': 'Aucune clé nécessaire',
|
|
274
|
+
'provider.key.noneDetail': 'Un serveur sur cette machine ou ce réseau',
|
|
275
|
+
'provider.key.enter': 'Saisir une clé',
|
|
276
|
+
'provider.menu.use': 'Utiliser ce fournisseur',
|
|
277
|
+
'provider.menu.rename': 'Changer le nom',
|
|
278
|
+
'provider.menu.url': 'Changer l’adresse',
|
|
279
|
+
'provider.menu.key': 'Changer la clé',
|
|
280
|
+
'provider.menu.delete': 'Supprimer',
|
|
281
|
+
'provider.menu.deleteDetail': 'Le supprime avec sa clé',
|
|
282
|
+
'provider.delete.question': 'Supprimer le fournisseur {name} et sa clé ?',
|
|
283
|
+
'provider.delete.active': 'C’est le fournisseur en cours : il continue de fonctionner jusqu’à ce que vous en choisissiez un autre.',
|
|
284
|
+
'provider.saved': 'Fournisseur {name} enregistré',
|
|
285
|
+
'provider.updated': 'Fournisseur {name} mis à jour',
|
|
286
|
+
'provider.deleted': 'Fournisseur {name} supprimé',
|
|
225
287
|
'onboard.baseUrl.title': 'adresse',
|
|
226
288
|
'onboard.baseUrl.label': 'URL de base de l’API',
|
|
227
289
|
'onboard.baseUrl.placeholder': 'https://api.example.com/v1',
|