@tunnelbox/core 0.1.0 → 0.1.8

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.
@@ -0,0 +1,162 @@
1
+ {
2
+ "agent.err.createSession": "Sitzung konnte nicht erstellt werden",
3
+ "agent.err.httpClient": "Auf den opencode-HTTP-Client kann nicht zugegriffen werden",
4
+ "agent.err.unknownPerm": "Unbekannte Berechtigungsanfrage: {id}",
5
+ "agent.err.unknownQuestion": "Unbekannte Frageanfrage: {id}",
6
+ "agent.log.fallback404": "Bevorzugter Endpunkt lieferte 404, Fallback auf den anderen: {message}",
7
+ "agent.log.gotPermReply": "Berechtigungsantwort vom Telefon erhalten (id={id} {reply} {version})",
8
+ "agent.log.gotQuestionReply": "Frageantwort vom Telefon erhalten (id={id} {status} {version})",
9
+ "agent.log.handleFailed": "Fehler beim Verarbeiten von {type}: {message}",
10
+ "agent.log.httpOk": "opencode HTTP {status} {path}",
11
+ "agent.log.pendingResent": "session.pending: {count} ausstehende Anfrage(n) für {session} erneut gesendet",
12
+ "agent.log.unhandledType": "Nicht behandelter Nachrichtentyp: {type}",
13
+ "events.log.fwdPermission": "Berechtigungsanfrage an Telefon weitergeleitet (id={id} tool={tool} {version})",
14
+ "events.log.permissionReplied": "opencode quittierte permission.replied (id={id} {response})",
15
+ "events.log.questionRejected": "opencode quittierte question.rejected (id={id})",
16
+ "events.log.questionReplied": "opencode quittierte question.replied (id={id})",
17
+ "index.error.connectRelay": "Verbindung zum Relay nicht möglich; prüfen Sie die Relay-Adresse und versuchen Sie es erneut",
18
+ "index.error.pairTimeout": "Zeitüberschreitung beim Warten auf einen Pairing-Code (Relay antwortet nicht)",
19
+ "index.log.claimed": "An Ihr Telefonkonto gebunden. Das Telefon verbindet sich nun direkt über “Meine PCs”; kein erneutes Scannen nötig",
20
+ "index.log.connectedRelay": "Mit Relay verbunden {url}",
21
+ "index.log.loaded": "tunnelbox-opencode-Plugin gestartet (v{version})",
22
+ "index.log.disconnected": "Vom Relay getrennt, verbinde automatisch neu…",
23
+ "index.log.exit": "Beendet",
24
+ "index.log.pairCode": "Pairing-Code erzeugt: {code}",
25
+ "index.log.pairingStillClaimed": "Dieser Pairing-Code dient nur zum erneuten Pairing eines neuen Telefons im selben Konto. Dieser Computer ist bereits verknüpft und bleibt über „Meine Computer“ auf Ihrem Telefon erreichbar.",
26
+ "index.log.pairingPreparing": "Verbindung zum Relay wird hergestellt und Pairing-Code generiert…",
27
+ "index.log.permissionToPhone": "Berechtigungsanfrage → Genehmigung am Telefon (id={id} tool={tool})",
28
+ "index.log.permissionTuiFallback": "App offline; Berechtigungsanfrage wird vom opencode-TUI übernommen (id={id} tool={tool})",
29
+ "index.log.relayError": "Relay-Fehler: {msg}",
30
+ "index.log.resetIdentity": "Vom Konto gelöst; Identität wird zurückgesetzt und ein neuer Pairing-Code erzeugt…",
31
+ "index.log.unknown": "Unbekannt",
32
+ "install.codeLine": "Pairing-Code: {code}",
33
+ "install.commandInstalled": "Befehl installiert: {path}",
34
+ "install.done": "Fertig. Versuche, eine Verbindung zum Relay herzustellen und Pairing-Informationen auszugeben:",
35
+ "install.failConnect": "(Keine sofortige Verbindung zum Relay zum Drucken der Pairing-Informationen möglich — Relay nicht erreichbar oder Node zu alt.",
36
+ "install.failConnectHint": "Nach dem Neustart von opencode den Terminal-QR-Code mit --print-logs anzeigen oder im opencode “Telefon-Pairing-Code anzeigen” bzw. /pair eingeben.)",
37
+ "install.hintFresh": "Hinweis: Der Pairing-Code ist einmalig und etwa 10 Minuten gültig. Wenn Sie opencode später starten, nutzen Sie die beim Start gedruckten oder per /pair abgerufenen aktuellen Informationen.",
38
+ "install.pluginInstalled": "Plugin installiert: {path}",
39
+ "install.qrUnavailable": "(QR-Darstellung nicht verfügbar — nutzen Sie den Code oben)",
40
+ "install.qrcodeEnsure": "Installiere qrcode in das opencode-Konfigurationsverzeichnis…",
41
+ "install.qrcodeFail": "qrcode-Installation fehlgeschlagen (nicht kritisch — nur der Pairing-Code wird angezeigt): {err}",
42
+ "install.relayError": "Relay hat einen Fehler zurückgegeben: {msg}",
43
+ "install.scanHint": "Öffnen Sie tunnelbox auf dem Telefon, tippen Sie auf “Zum Pairing scannen” und scannen Sie den QR-Code oben zum Verbinden:",
44
+ "pair.heading": "tunnelbox Telefon-Pairing",
45
+ "pair.howTo": "Öffnen Sie die tunnelbox-App auf dem Telefon und scannen Sie den QR-Code oben mit “Zum Pairing scannen”, oder geben Sie den Pairing-Code manuell ein.",
46
+ "pair.oneTime": "Der Pairing-Code ist einmalig und verfällt nach der Nutzung; für einen neuen Code “Pairing-Code aktualisieren” anfordern.",
47
+ "pair.promptBody": "Zeigen Sie bitte die Telefon-Pairing-Informationen dieses Computers an: den Pairing-Code und einen scannbaren QR-Code. Behalten Sie den QR-Code in einem Codeblock mit fester Breite und geben Sie ihn zeichengenau wieder, damit mein Telefon ihn scannen kann.",
48
+ "pair.promptDescription": "Pairing-Code und scannbaren QR-Code anzeigen",
49
+ "pair.scanIntro": "**Per Scan pairen**: Öffnen Sie die tunnelbox-App auf dem Telefon, tippen Sie auf “Zum Pairing scannen” und scannen Sie den QR-Code unten, um sich automatisch zu verbinden.",
50
+ "perm.promptAuthorize": "opencode fordert eine Genehmigung an",
51
+ "perm.promptPatterns": "opencode fordert Zugriff auf: {list}",
52
+ "perm.promptResource": "opencode fordert Zugriff auf Ressourcen: {list}",
53
+ "perm.promptTool": "opencode fordert die Ausführung von {tool} an",
54
+ "qr.codeLabel": "Pairing-Code",
55
+ "qr.fileWritten": "Pairing-Informationen geschrieben in: {path}",
56
+ "qr.openHint": "Öffnen Sie die tunnelbox-App auf dem Telefon und scannen Sie den QR-Code oben, oder geben Sie den Pairing-Code manuell in der App ein.",
57
+ "qr.titleNoType": "tunnelbox Telefon-Pairing",
58
+ "qr.titleWithType": "tunnelbox {type} Telefon-Pairing",
59
+ "qr.unavailable": "(qrcode nicht installiert — nutzen Sie den Pairing-Code oben)",
60
+ "claude.errBusy": "Diese Sitzung läuft noch; warten Sie auf das Ende oder stoppen Sie sie zuerst",
61
+ "claude.errTurn": "Generierungsfehler",
62
+ "claude.pairingStillClaimed": "Bereits an ein Telefonkonto gebunden: Dieser Code dient nur zum Koppeln eines neuen Geräts auf demselben Konto; das aktuelle Gerät verbindet sich direkt über „Meine Computer“",
63
+ "claude.pairForced": "--pair: Pairing-Code erzwungen (nur dieser Lauf)",
64
+ "claude.pairUnclaimed": "Kein gebundenes Konto erkannt; Start der Pairing-Anleitung:",
65
+ "claude.claimedHint": "An ein Telefonkonto gebunden: direkt über „Meine Computer“ auf dem Telefon verbinden",
66
+ "claude.errStartFailed": "Start fehlgeschlagen:",
67
+ "claude.msgStarted": "Claude-Code-Adapter gestartet (Strg+C zum Beenden)",
68
+ "claude.warnInvalidMode": "Ungültiges TUNNELBOX_CLAUDE_MODE ignoriert: {raw} (erlaubt {list})",
69
+ "claude.warnInvalidThinking": "Ungültiges TUNNELBOX_CLAUDE_THINKING ignoriert: {raw} (off|adaptive|enabled[:budget])",
70
+ "claude.cmdNew": "Neue Sitzung",
71
+ "claude.cmdHelp": "Hilfe anzeigen",
72
+ "claude.errNoRelay": "Keine Relay-URL konfiguriert: Standard mit --env injizieren oder zur Laufzeit per TUNNELBOX_RELAY_URL überschreiben",
73
+ "claude.logConnected": "Mit Relay {url} verbunden",
74
+ "claude.logMsgUncaught": "Unbehandelte Ausnahme bei der Nachrichtenverarbeitung: {message}",
75
+ "claude.reasonDisconnect": "Relay getrennt (fail-closed automatische Ablehnung)",
76
+ "claude.reasonUnbind": "Konto entbunden (fail-closed automatische Ablehnung)",
77
+ "claude.logDisconnected": "Vom Relay getrennt, verbinde automatisch neu…",
78
+ "claude.logPairCode": "Pairing-Code generiert: {code}",
79
+ "claude.logUnhandledType": "Unbehandelter Nachrichtentyp: {type}",
80
+ "claude.logHandleFailed": "{type} konnte nicht verarbeitet werden: {message}",
81
+ "claude.newSessionTitle": "Neue Sitzung",
82
+ "claude.helpText": "Unterstützte Befehle:\n- /new neue Sitzung\n- /help Hilfe anzeigen",
83
+ "claude.logPromptFailed": "session.prompt fehlgeschlagen: {message}",
84
+ "claude.logAbortSent": "Abbruch gesendet (session={session})",
85
+ "claude.logAbortFailed": "Abbruch fehlgeschlagen (session={session}): {message}",
86
+ "claude.errBadWorkspaceEmpty": "Pfad zum Arbeitsbereich fehlt",
87
+ "claude.errBadWorkspaceNotDir": "Verzeichnis existiert nicht oder ist unbrauchbar",
88
+ "claude.logWorkspaceSwitched": "Arbeitsbereich gewechselt: {path}",
89
+ "claude.logUnknownQuestionReply": "Keine Übereinstimmung für strukturierte Frage-Antwort (id={id})",
90
+ "claude.logFlushedQuestions": "{count} ausstehende Frage(n) abgebrochen: {reason}",
91
+ "claude.logFlushedApprovals": "{count} ausstehende Anfrage(n) abgelehnt: {reason}",
92
+ "claude.logPendingResent": "session.pending: {count} ausstehende(r) Eintrag/Einträge für {session} erneut gesendet",
93
+ "claude.logSetModeFailed": "setPermissionMode fehlgeschlagen (session={session}): {message}",
94
+ "claude.errWorkspaceMissing": "Arbeitsbereich existiert nicht: {dir}",
95
+ "claude.logSessionError": "Sitzungsfehler (session={session}): {message}",
96
+ "claude.logOfflineDenyTool": "Relay offline, Tool {tool} automatisch abgelehnt",
97
+ "claude.errOfflineDeny": "Relay offline, automatisch abgelehnt (fail-closed)",
98
+ "claude.logAuqDisabled": "AskUserQuestion deaktiviert (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), automatisch abgelehnt",
99
+ "claude.errAuqDisabled": "AskUserQuestion ist nicht aktiviert",
100
+ "claude.logAuqParseFailed": "AskUserQuestion-Eingabe konnte nicht geparst werden, automatisch abgelehnt (fail-closed)",
101
+ "claude.errAuqParse": "Fragen konnten nicht geparst werden",
102
+ "claude.logAuqSkipped": "AskUserQuestion unbeantwortet/abgebrochen (session={session})",
103
+ "claude.errAuqCancelled": "Keine Auswahl durch Benutzer (abgebrochen)",
104
+ "claude.logAuqDone": "AskUserQuestion beantwortet (session={session})",
105
+ "claude.promptRunTool": "Claude Code fordert Ausführung von {tool}",
106
+ "claude.errApprovalTimeout": "Genehmigung abgelaufen, automatisch abgelehnt (fail-closed)",
107
+ "claude.errUserDenied": "Vom Benutzer abgelehnt",
108
+ "claude.errAborted": "Anfrage abgebrochen",
109
+ "claude.logPermToPhone": "Berechtigungsanfrage (tool={tool}) → an Telefon gesendet permissionID={id}",
110
+ "claude.errRelayUnreachable": "Relay nicht erreichbar, automatisch abgelehnt (fail-closed)",
111
+ "claude.logQuestionOffline": "Relay offline, strukturierte Frage automatisch abgebrochen",
112
+ "claude.logQuestionToPhone": "Strukturierte Frage ({count}) → an Telefon gesendet questionID={id}",
113
+ "claude.logDialogOffline": "Relay offline, Dialog automatisch abgebrochen ({tool})",
114
+ "claude.logDialogToPhone": "Dialoganfrage (kind={kind} tool={tool}) → an Telefon gesendet permissionID={id}",
115
+ "claude.logAuqDialogParse": "AskUserQuestion-Payload konnte nicht geparst werden, Standardverhalten beibehalten (session={session})",
116
+ "claude.logDialogUnmapped": "request_user_dialog(kind={kind}) ohne Zuordnung, Standardverhalten beibehalten (session={session})",
117
+ "claude.promptMcpAuth": "MCP „{server}“ fordert Autorisierung",
118
+ "claude.logElicitUnmapped": "MCP-Elicitation (server={server}, mode={mode}) nicht behandelt, automatisch abgelehnt (session={session})",
119
+ "claude.logResetIdentity": "Konto entbunden; Identität wird zurückgesetzt und ein neuer Pairing-Code erzeugt…",
120
+ "claude.dialogConfirm": "Claude Code fordert Bestätigung an ({kind})",
121
+ "claude.resultTruncated": "… (Ergebnis gekürzt)",
122
+ "claude.streamError": "claude-Streaming-Fehler",
123
+ "claude.errListSessions": "Claude-Sitzungsliste konnte nicht gelesen werden",
124
+ "claude.errReadHistory": "Sitzungsverlauf konnte nicht gelesen werden ({id})",
125
+ "setup.langSet": "Laufzeitsprache gesetzt auf",
126
+ "setup.langHint": "Der Adapter gibt nach dem Neustart in dieser Sprache aus (TUNNELBOX_LANG kann zur Laufzeit überschreiben). Statusdatei:",
127
+ "setup.langCurrent": "Aktuelle Laufzeitsprache",
128
+ "hermes.errNoRelay": "Keine Relay-URL konfiguriert: mit --env einen Standardwert einfügen oder zur Laufzeit mit TUNNELBOX_RELAY_URL überschreiben",
129
+ "hermes.logConnected": "Mit Relay verbunden {url}",
130
+ "hermes.logMsgUncaught": "Nicht abgefangene Ausnahme bei der Nachrichtenverarbeitung: {message}",
131
+ "hermes.logDisconnected": "Vom Relay getrennt, automatische Neuverbindung…",
132
+ "hermes.logPairCode": "Pairing-Code generiert: {code}",
133
+ "hermes.logUnhandledType": "Nicht behandelter Nachrichtentyp: {type}",
134
+ "hermes.logHandleFailed": "Fehler beim Verarbeiten von {type}: {message}",
135
+ "hermes.logClaimed": "An Ihr Telefonkonto gebunden. Das Telefon verbindet sich künftig direkt über Meine Computer",
136
+ "hermes.logResetIdentity": "Vom Konto entbunden; Identität wird zurückgesetzt und ein neuer Pairing-Code generiert…",
137
+ "hermes.cmdNew": "Neue Sitzung",
138
+ "hermes.cmdHelp": "Hilfe anzeigen",
139
+ "hermes.newSessionTitle": "Neue Sitzung",
140
+ "hermes.helpText": "Unterstützte Befehle:\n- /new neue Sitzung\n- /help Hilfe anzeigen",
141
+ "hermes.errBusy": "Diese Sitzung wird gerade generiert; warten Sie auf den Abschluss oder stoppen Sie sie zuerst",
142
+ "hermes.errBadWorkspace": "Dieses Verzeichnis existiert nicht oder ist unbrauchbar",
143
+ "hermes.logWorkspaceSwitched": "Arbeitsbereich gewechselt: {path}",
144
+ "hermes.errWorkspaceMissing": "Arbeitsbereich existiert nicht: {dir}",
145
+ "hermes.errStartFailed": "Start fehlgeschlagen: {message}",
146
+ "hermes.msgStarted": "Hermes-Adapter gestartet (Strg+C zum Beenden)",
147
+ "hermes.logAbortSent": "Abbruch gesendet (session={session})",
148
+ "hermes.logPromptFailed": "session.prompt fehlgeschlagen: {message}",
149
+ "hermes.logTurnError": "Fehler bei Runde (session={session}): {message}",
150
+ "hermes.logPairForced": "--pair: Pairing-Code erzwungen (nur dieser Lauf)",
151
+ "hermes.pairingStillClaimed": "Bereits an ein Telefonkonto gebunden: Dieser Code dient nur zum erneuten Pairing eines neuen Geräts desselben Kontos; das aktuelle Gerät verbindet sich direkt über Meine Computer",
152
+ "hermes.logPairNoRelay": "Kein Pairing-Code anforderbar: keine Relay-URL konfiguriert",
153
+ "hermes.errSpawnHermes": "Hermes ({bin}) kann nicht gestartet werden: bitte Installation prüfen ({err})",
154
+ "hermes.errHermesExit": "hermes beendet ({code}): {err}",
155
+ "hermes.logSessionUpdated": "Sitzung aktualisiert (session={session})",
156
+ "hermes.errNoInject": "Telefon-Nachrichteneinspeisung nicht verfügbar (Sitzung nicht interaktiv oder Prozess nicht bereit)",
157
+ "hermes.pairNoRelay": "Relay nicht erreichbar (Relay nicht erreichbar oder websockets fehlt)",
158
+ "hermes.pairTimeout": "Zeitüberschreitung bei der Pairing-Code-Anfrage (Relay antwortete nicht)",
159
+ "hermes.errToolPair": "tunnelbox_pair fehlgeschlagen: {err}",
160
+ "hermes.errToolStatus": "tunnelbox_status fehlgeschlagen: {err}",
161
+ "hermes.cliUsage": "Verwendung: /tunnelbox <pair|status>\n pair Pairing-Code anfordern und anzeigen\n status Relay/Bindung/Verbindung anzeigen"
162
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "agent.err.createSession": "Failed to create session",
3
+ "agent.err.httpClient": "Cannot access the opencode HTTP client",
4
+ "agent.err.unknownPerm": "Unknown permission request: {id}",
5
+ "agent.err.unknownQuestion": "Unknown question request: {id}",
6
+ "agent.log.fallback404": "Preferred endpoint returned 404, falling back to the other one: {message}",
7
+ "agent.log.gotPermReply": "Received permission reply from phone (id={id} {reply} {version})",
8
+ "agent.log.gotQuestionReply": "Received question reply from phone (id={id} {status} {version})",
9
+ "agent.log.handleFailed": "Failed to handle {type}: {message}",
10
+ "agent.log.httpOk": "opencode HTTP {status} {path}",
11
+ "agent.log.pendingResent": "session.pending: resent {count} pending request(s) for {session}",
12
+ "agent.log.unhandledType": "Unhandled message type: {type}",
13
+ "events.log.fwdPermission": "Forwarded permission request to phone (id={id} tool={tool} {version})",
14
+ "events.log.permissionReplied": "opencode acked permission.replied (id={id} {response})",
15
+ "events.log.questionRejected": "opencode acked question.rejected (id={id})",
16
+ "events.log.questionReplied": "opencode acked question.replied (id={id})",
17
+ "index.error.connectRelay": "Cannot connect to the relay; check the relay address and try again",
18
+ "index.error.pairTimeout": "Timed out waiting for a pairing code (the relay did not respond)",
19
+ "index.log.claimed": "Bound to your phone account. From now on the phone connects directly from My Computers; no need to scan again",
20
+ "index.log.connectedRelay": "Connected to relay {url}",
21
+ "index.log.loaded": "tunnelbox opencode plugin started (v{version})",
22
+ "index.log.disconnected": "Disconnected from relay, reconnecting automatically…",
23
+ "index.log.exit": "Exited",
24
+ "index.log.pairCode": "Generated pairing code: {code}",
25
+ "index.log.pairingStillClaimed": "This pairing code is for re-pairing a new phone under the same account. This computer is already linked and stays reachable from “My Computers” on your phone.",
26
+ "index.log.pairingPreparing": "Connecting to the relay and generating a pairing code…",
27
+ "index.log.permissionToPhone": "Permission request → phone approval (id={id} tool={tool})",
28
+ "index.log.permissionTuiFallback": "App offline; permission request handled by the opencode TUI (id={id} tool={tool})",
29
+ "index.log.relayError": "Relay error: {msg}",
30
+ "index.log.resetIdentity": "Unbound from the account; resetting identity and generating a new pairing code…",
31
+ "index.log.unknown": "Unknown",
32
+ "install.codeLine": "Pairing code: {code}",
33
+ "install.commandInstalled": "Installed command: {path}",
34
+ "install.done": "Done. Attempted to connect to the relay and output pairing info:",
35
+ "install.failConnect": "(Could not connect to the relay to print pairing info — the relay may be unreachable or the Node version is too old.",
36
+ "install.failConnectHint": "After restarting opencode, check the terminal QR code with --print-logs, or type “show phone pairing code” / /pair inside opencode.)",
37
+ "install.hintFresh": "Note: the pairing code is single-use and valid for about 10 minutes. If you start opencode later, use the latest pairing info printed at startup or obtained via /pair.",
38
+ "install.pluginInstalled": "Installed plugin: {path}",
39
+ "install.qrUnavailable": "(QR rendering unavailable — use the pairing code above)",
40
+ "install.qrcodeEnsure": "Installing qrcode into the opencode config directory…",
41
+ "install.qrcodeFail": "qrcode installation failed (not critical — only the pairing code is shown): {err}",
42
+ "install.relayError": "Relay returned an error: {msg}",
43
+ "install.scanHint": "Open tunnelbox on your phone, tap “Scan to pair”, and scan the QR code above to connect:",
44
+ "pair.heading": "tunnelbox phone pairing",
45
+ "pair.howTo": "Open the tunnelbox app on your phone and scan the QR code above with “Scan to pair”, or enter the pairing code manually.",
46
+ "pair.oneTime": "The pairing code is single-use and invalidates after it is claimed; ask to “refresh the pairing code” for a new one.",
47
+ "pair.promptBody": "Please show this computer's phone pairing info: the pairing code and a QR code I can scan. Keep the QR code inside a monospaced code block and reproduce it character-for-character so my phone can scan it.",
48
+ "pair.promptDescription": "Show the phone pairing code and scan-able QR code",
49
+ "pair.scanIntro": "**Pair by scanning**: open the tunnelbox app on your phone, tap “Scan to pair”, and scan the QR code below to connect automatically.",
50
+ "perm.promptAuthorize": "opencode requests authorization",
51
+ "perm.promptPatterns": "opencode requests access to: {list}",
52
+ "perm.promptResource": "opencode requests access to resources: {list}",
53
+ "perm.promptTool": "opencode requests to run {tool}",
54
+ "qr.codeLabel": "Pairing code",
55
+ "qr.fileWritten": "Pairing info written to: {path}",
56
+ "qr.openHint": "Open the tunnelbox app on your phone and scan the QR code above, or enter the pairing code manually in the app.",
57
+ "qr.titleNoType": "tunnelbox phone pairing",
58
+ "qr.titleWithType": "tunnelbox {type} phone pairing",
59
+ "qr.unavailable": "(qrcode not installed — use the pairing code above)",
60
+ "claude.errBusy": "This session is still running; wait for it to finish or stop it first",
61
+ "claude.errTurn": "generation error",
62
+ "claude.pairingStillClaimed": "Already bound to a phone account: this code is only for pairing a new device on the same account; the current device connects directly from My Computers",
63
+ "claude.pairForced": "--pair: forcing a pairing code request (this run only)",
64
+ "claude.pairUnclaimed": "No bound account detected; starting pairing guide:",
65
+ "claude.claimedHint": "Bound to a phone account: connect directly from My Computers on the phone",
66
+ "claude.errStartFailed": "Failed to start:",
67
+ "claude.msgStarted": "Claude Code adapter started (Ctrl+C to quit)",
68
+ "claude.warnInvalidMode": "Ignoring invalid TUNNELBOX_CLAUDE_MODE: {raw} (allowed {list})",
69
+ "claude.warnInvalidThinking": "Ignoring invalid TUNNELBOX_CLAUDE_THINKING: {raw} (off|adaptive|enabled[:budget])",
70
+ "claude.cmdNew": "New session",
71
+ "claude.cmdHelp": "Show help",
72
+ "claude.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
73
+ "claude.logConnected": "Connected to relay {url}",
74
+ "claude.logMsgUncaught": "Uncaught exception while handling message: {message}",
75
+ "claude.reasonDisconnect": "Relay disconnected (fail-closed auto-reject)",
76
+ "claude.reasonUnbind": "Account unbound (fail-closed auto-reject)",
77
+ "claude.logDisconnected": "Disconnected from relay, reconnecting automatically…",
78
+ "claude.logPairCode": "Generated pairing code: {code}",
79
+ "claude.logUnhandledType": "Unhandled message type: {type}",
80
+ "claude.logHandleFailed": "Failed to handle {type}: {message}",
81
+ "claude.newSessionTitle": "New session",
82
+ "claude.helpText": "Supported commands:\n- /new new session\n- /help show help",
83
+ "claude.logPromptFailed": "session.prompt failed: {message}",
84
+ "claude.logAbortSent": "Abort sent (session={session})",
85
+ "claude.logAbortFailed": "Abort failed (session={session}): {message}",
86
+ "claude.errBadWorkspaceEmpty": "Missing workspace path",
87
+ "claude.errBadWorkspaceNotDir": "Directory does not exist or is unusable",
88
+ "claude.logWorkspaceSwitched": "Switched workspace: {path}",
89
+ "claude.logUnknownQuestionReply": "Unmatched structured question reply (id={id})",
90
+ "claude.logFlushedQuestions": "Cancelled {count} pending question(s): {reason}",
91
+ "claude.logFlushedApprovals": "Rejected {count} pending request(s): {reason}",
92
+ "claude.logPendingResent": "session.pending: resent {count} pending item(s) for {session}",
93
+ "claude.logSetModeFailed": "setPermissionMode failed (session={session}): {message}",
94
+ "claude.errWorkspaceMissing": "Workspace does not exist: {dir}",
95
+ "claude.logSessionError": "Session error (session={session}): {message}",
96
+ "claude.logOfflineDenyTool": "Relay offline, auto-rejecting tool {tool}",
97
+ "claude.errOfflineDeny": "Relay offline, auto-rejected (fail-closed)",
98
+ "claude.logAuqDisabled": "AskUserQuestion disabled (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), auto-rejected",
99
+ "claude.errAuqDisabled": "AskUserQuestion is not enabled",
100
+ "claude.logAuqParseFailed": "Failed to parse AskUserQuestion input, auto-rejected (fail-closed)",
101
+ "claude.errAuqParse": "Could not parse the questions",
102
+ "claude.logAuqSkipped": "AskUserQuestion unanswered/cancelled (session={session})",
103
+ "claude.errAuqCancelled": "User did not select (cancelled)",
104
+ "claude.logAuqDone": "AskUserQuestion answered (session={session})",
105
+ "claude.promptRunTool": "Claude Code requests to run {tool}",
106
+ "claude.errApprovalTimeout": "Approval timed out, auto-rejected (fail-closed)",
107
+ "claude.errUserDenied": "Rejected by user",
108
+ "claude.errAborted": "Request aborted",
109
+ "claude.logPermToPhone": "Permission request (tool={tool}) → sent to phone as permissionID={id}",
110
+ "claude.errRelayUnreachable": "Relay unreachable, auto-rejected (fail-closed)",
111
+ "claude.logQuestionOffline": "Relay offline, structured question auto-cancelled",
112
+ "claude.logQuestionToPhone": "Structured question ({count} item(s)) → sent to phone questionID={id}",
113
+ "claude.logDialogOffline": "Relay offline, dialog auto-cancelled ({tool})",
114
+ "claude.logDialogToPhone": "Dialog request (kind={kind} tool={tool}) → sent to phone as permissionID={id}",
115
+ "claude.logAuqDialogParse": "Failed to parse AskUserQuestion payload, keeping default behavior (session={session})",
116
+ "claude.logDialogUnmapped": "request_user_dialog(kind={kind}) has no mapping, keeping default behavior (session={session})",
117
+ "claude.promptMcpAuth": "MCP “{server}” requests authorization",
118
+ "claude.logElicitUnmapped": "MCP elicitation (server={server}, mode={mode}) not handled, auto-rejected (session={session})",
119
+ "claude.logResetIdentity": "Unbound from account; resetting identity and generating a new pairing code…",
120
+ "claude.dialogConfirm": "Claude Code requests confirmation ({kind})",
121
+ "claude.resultTruncated": "… (result truncated)",
122
+ "claude.streamError": "claude streaming error",
123
+ "claude.errListSessions": "Failed to read Claude session list",
124
+ "claude.errReadHistory": "Failed to read session history ({id})",
125
+ "setup.langSet": "Runtime language set to",
126
+ "setup.langHint": "The adapter will output in this language after restart (runtime TUNNELBOX_LANG can override). State file:",
127
+ "setup.langCurrent": "Current runtime language",
128
+ "hermes.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
129
+ "hermes.logConnected": "Connected to relay {url}",
130
+ "hermes.logMsgUncaught": "Uncaught exception while handling message: {message}",
131
+ "hermes.logDisconnected": "Disconnected from relay, reconnecting automatically…",
132
+ "hermes.logPairCode": "Generated pairing code: {code}",
133
+ "hermes.logUnhandledType": "Unhandled message type: {type}",
134
+ "hermes.logHandleFailed": "Failed to handle {type}: {message}",
135
+ "hermes.logClaimed": "Bound to your phone account. From now on the phone connects directly from My Computers",
136
+ "hermes.logResetIdentity": "Unbound from the account; resetting identity and generating a new pairing code…",
137
+ "hermes.cmdNew": "New session",
138
+ "hermes.cmdHelp": "Show help",
139
+ "hermes.newSessionTitle": "New session",
140
+ "hermes.helpText": "Supported commands:\n- /new new session\n- /help show help",
141
+ "hermes.errBusy": "This session is still running; wait for it to finish or stop it first",
142
+ "hermes.errBadWorkspace": "Directory does not exist or is unusable",
143
+ "hermes.logWorkspaceSwitched": "Switched workspace: {path}",
144
+ "hermes.errWorkspaceMissing": "Workspace does not exist: {dir}",
145
+ "hermes.errStartFailed": "Failed to start: {message}",
146
+ "hermes.msgStarted": "Hermes adapter started (Ctrl+C to quit)",
147
+ "hermes.logAbortSent": "Abort sent (session={session})",
148
+ "hermes.logPromptFailed": "session.prompt failed: {message}",
149
+ "hermes.logTurnError": "Turn error (session={session}): {message}",
150
+ "hermes.logPairForced": "--pair: forcing a pairing code request (this run only)",
151
+ "hermes.pairingStillClaimed": "Already bound to a phone account: this code is only for pairing a new device on the same account; the current device connects directly from My Computers",
152
+ "hermes.logPairNoRelay": "Cannot request a pairing code: no relay URL configured",
153
+ "hermes.errSpawnHermes": "Cannot start Hermes ({bin}): please confirm it is installed ({err})",
154
+ "hermes.errHermesExit": "hermes exited ({code}): {err}",
155
+ "hermes.logSessionUpdated": "Session updated (session={session})",
156
+ "hermes.errNoInject": "Phone message injection unavailable (session not interactive or process not ready)",
157
+ "hermes.pairNoRelay": "Cannot reach the relay (relay unreachable or websockets missing)",
158
+ "hermes.pairTimeout": "Timed out requesting a pairing code (relay did not respond)",
159
+ "hermes.errToolPair": "tunnelbox_pair failed: {err}",
160
+ "hermes.errToolStatus": "tunnelbox_status failed: {err}",
161
+ "hermes.cliUsage": "Usage: /tunnelbox <pair|status>\n pair request and print a phone pairing code\n status show relay/binding/connection status"
162
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "agent.err.createSession": "No se pudo crear la sesión",
3
+ "agent.err.httpClient": "No se puede acceder al cliente HTTP de opencode",
4
+ "agent.err.unknownPerm": "Solicitud de permiso desconocida: {id}",
5
+ "agent.err.unknownQuestion": "Solicitud de pregunta desconocida: {id}",
6
+ "agent.log.fallback404": "El punto de acceso preferido devolvió 404; se recurre al otro: {message}",
7
+ "agent.log.gotPermReply": "Respuesta de permiso recibida del teléfono (id={id} {reply} {version})",
8
+ "agent.log.gotQuestionReply": "Respuesta de pregunta recibida del teléfono (id={id} {status} {version})",
9
+ "agent.log.handleFailed": "Error al procesar {type}: {message}",
10
+ "agent.log.httpOk": "opencode HTTP {status} {path}",
11
+ "agent.log.pendingResent": "session.pending: reenviadas {count} solicitud(es) pendientes para {session}",
12
+ "agent.log.unhandledType": "Tipo de mensaje no gestionado: {type}",
13
+ "events.log.fwdPermission": "Solicitud de permiso reenviada al teléfono (id={id} tool={tool} {version})",
14
+ "events.log.permissionReplied": "opencode confirmó permission.replied (id={id} {response})",
15
+ "events.log.questionRejected": "opencode confirmó question.rejected (id={id})",
16
+ "events.log.questionReplied": "opencode confirmó question.replied (id={id})",
17
+ "index.error.connectRelay": "No se pudo conectar con el relay; compruebe su dirección e inténtelo de nuevo",
18
+ "index.error.pairTimeout": "Tiempo de espera agotado al obtener el código de emparejamiento (el relay no responde)",
19
+ "index.log.claimed": "Vinculado a su cuenta de teléfono. El teléfono se conecta ahora directamente desde «Mis PC»; no hace falta volver a escanear",
20
+ "index.log.connectedRelay": "Conectado al relay {url}",
21
+ "index.log.loaded": "Plugin tunnelbox opencode iniciado (v{version})",
22
+ "index.log.disconnected": "Desconectado del relay, reconectando automáticamente…",
23
+ "index.log.exit": "Salido",
24
+ "index.log.pairCode": "Código de emparejamiento generado: {code}",
25
+ "index.log.pairingStillClaimed": "Este código de emparejamiento es solo para volver a emparejar un teléfono nuevo con la misma cuenta; este equipo ya está vinculado y sigue accesible desde «Mis computadoras» en el teléfono.",
26
+ "index.log.pairingPreparing": "Conectando al relay y generando el código de emparejamiento…",
27
+ "index.log.permissionToPhone": "Solicitud de permiso → aprobación en el teléfono (id={id} tool={tool})",
28
+ "index.log.permissionTuiFallback": "App sin conexión; la solicitud la gestiona el TUI de opencode (id={id} tool={tool})",
29
+ "index.log.relayError": "Error del relay: {msg}",
30
+ "index.log.resetIdentity": "Desvinculado de la cuenta; se restablece la identidad y se genera un nuevo código de emparejamiento…",
31
+ "index.log.unknown": "Desconocido",
32
+ "install.codeLine": "Código de emparejamiento: {code}",
33
+ "install.commandInstalled": "Comando instalado: {path}",
34
+ "install.done": "Hecho. Se intentó conectar con el relay para mostrar la información de emparejamiento:",
35
+ "install.failConnect": "(No se pudo conectar de inmediato con el relay para imprimir el emparejamiento — relay inaccesible o versión de Node demasiado antigua.",
36
+ "install.failConnectHint": "Tras reiniciar opencode, consulte el código QR del terminal con --print-logs, o escriba “mostrar código de emparejamiento del teléfono” o /pair en opencode.)",
37
+ "install.hintFresh": "Nota: el código de emparejamiento es de un solo uso y válido durante unos 10 minutos. Si inicia opencode más tarde, use la información más reciente impresa al iniciar u obtenida con /pair.",
38
+ "install.pluginInstalled": "Complemento instalado: {path}",
39
+ "install.qrUnavailable": "(Representación del QR no disponible: use el código anterior)",
40
+ "install.qrcodeEnsure": "Instalando qrcode en el directorio de configuración de opencode…",
41
+ "install.qrcodeFail": "Error al instalar qrcode (no es crítico; solo se muestra el código de emparejamiento): {err}",
42
+ "install.relayError": "El relay devolvió un error: {msg}",
43
+ "install.scanHint": "Abra tunnelbox en el teléfono, pulse “Escanear para emparejar” y escanee el código QR superior para conectar:",
44
+ "pair.heading": "Emparejamiento de teléfono tunnelbox",
45
+ "pair.howTo": "Abra la aplicación tunnelbox en el teléfono y escanee el código QR superior con “Escanear para emparejar”, o introduzca el código de emparejamiento manualmente.",
46
+ "pair.oneTime": "El código de emparejamiento es de un solo uso y caduca al utilizarse; pida “actualizar el código de emparejamiento” para obtener uno nuevo.",
47
+ "pair.promptBody": "Muéstrame la información de emparejamiento con el teléfono de este ordenador: el código de emparejamiento y un código QR escaneable. Mantén el código QR dentro de un bloque de código de ancho fijo y reprodúcelo carácter por carácter para que mi teléfono pueda escanearlo.",
48
+ "pair.promptDescription": "Mostrar el código de emparejamiento y el QR escaneable",
49
+ "pair.scanIntro": "**Emparejar escaneando**: abra la aplicación tunnelbox en el teléfono, pulse “Escanear para emparejar” y escanee el código QR inferior para conectar automáticamente.",
50
+ "perm.promptAuthorize": "opencode solicita autorización",
51
+ "perm.promptPatterns": "opencode solicita acceso a: {list}",
52
+ "perm.promptResource": "opencode solicita acceso a los recursos: {list}",
53
+ "perm.promptTool": "opencode solicita ejecutar {tool}",
54
+ "qr.codeLabel": "Código de emparejamiento",
55
+ "qr.fileWritten": "Información de emparejamiento escrita en: {path}",
56
+ "qr.openHint": "Abra la aplicación tunnelbox en el teléfono y escanee el código QR superior, o introduzca el código de emparejamiento manualmente en la aplicación.",
57
+ "qr.titleNoType": "emparejamiento de teléfono tunnelbox",
58
+ "qr.titleWithType": "emparejamiento de teléfono tunnelbox {type}",
59
+ "qr.unavailable": "(qrcode no instalado: use el código de emparejamiento anterior)",
60
+ "claude.errBusy": "Esta sesión está en ejecución; espere a que termine o deténgala primero",
61
+ "claude.errTurn": "error de generación",
62
+ "claude.pairingStillClaimed": "Ya vinculado a una cuenta de teléfono: este código solo sirve para emparejar un nuevo dispositivo en la misma cuenta; el dispositivo actual se conecta directamente desde Mis computadoras",
63
+ "claude.pairForced": "--pair: solicitud forzada de código de emparejamiento (solo esta ejecución)",
64
+ "claude.pairUnclaimed": "No se detectó una cuenta vinculada; iniciando la guía de emparejamiento:",
65
+ "claude.claimedHint": "Vinculado a una cuenta de teléfono: conéctese directamente desde Mis computadoras en el teléfono",
66
+ "claude.errStartFailed": "Error al iniciar:",
67
+ "claude.msgStarted": "Adaptador de Claude Code iniciado (Ctrl+C para salir)",
68
+ "claude.warnInvalidMode": "Se ignora TUNNELBOX_CLAUDE_MODE no válido: {raw} (permitido {list})",
69
+ "claude.warnInvalidThinking": "Se ignora TUNNELBOX_CLAUDE_THINKING no válido: {raw} (off|adaptive|enabled[:budget])",
70
+ "claude.cmdNew": "Nueva sesión",
71
+ "claude.cmdHelp": "Mostrar ayuda",
72
+ "claude.errNoRelay": "No hay URL de relay configurada: inyecte un valor con --env o sobrescríbalo con TUNNELBOX_RELAY_URL",
73
+ "claude.logConnected": "Conectado al relay {url}",
74
+ "claude.logMsgUncaught": "Excepción no capturada al procesar el mensaje: {message}",
75
+ "claude.reasonDisconnect": "Relay desconectado (rechazo automático fail-closed)",
76
+ "claude.reasonUnbind": "Cuenta desvinculada (rechazo automático fail-closed)",
77
+ "claude.logDisconnected": "Desconectado del relay, reconectando automáticamente…",
78
+ "claude.logPairCode": "Código de emparejamiento generado: {code}",
79
+ "claude.logUnhandledType": "Tipo de mensaje no manejado: {type}",
80
+ "claude.logHandleFailed": "No se pudo procesar {type}: {message}",
81
+ "claude.newSessionTitle": "Nueva sesión",
82
+ "claude.helpText": "Comandos compatibles:\n- /new nueva sesión\n- /help mostrar ayuda",
83
+ "claude.logPromptFailed": "session.prompt falló: {message}",
84
+ "claude.logAbortSent": "Se envió la interrupción (session={session})",
85
+ "claude.logAbortFailed": "Error al interrumpir (session={session}): {message}",
86
+ "claude.errBadWorkspaceEmpty": "Falta la ruta del espacio de trabajo",
87
+ "claude.errBadWorkspaceNotDir": "El directorio no existe o no se puede usar",
88
+ "claude.logWorkspaceSwitched": "Espacio de trabajo cambiado: {path}",
89
+ "claude.logUnknownQuestionReply": "Respuesta de pregunta estructurada sin coincidencia (id={id})",
90
+ "claude.logFlushedQuestions": "{count} pregunta(s) pendiente(s) cancelada(s): {reason}",
91
+ "claude.logFlushedApprovals": "{count} solicitud(es) pendiente(s) rechazada(s): {reason}",
92
+ "claude.logPendingResent": "session.pending: se reenviaron {count} elemento(s) pendiente(s) de {session}",
93
+ "claude.logSetModeFailed": "setPermissionMode falló (session={session}): {message}",
94
+ "claude.errWorkspaceMissing": "El espacio de trabajo no existe: {dir}",
95
+ "claude.logSessionError": "Error de sesión (session={session}): {message}",
96
+ "claude.logOfflineDenyTool": "Relay sin conexión, rechazo automático de la herramienta {tool}",
97
+ "claude.errOfflineDeny": "Relay sin conexión, rechazo automático (fail-closed)",
98
+ "claude.logAuqDisabled": "AskUserQuestion deshabilitado (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), rechazo automático",
99
+ "claude.errAuqDisabled": "AskUserQuestion no está habilitado",
100
+ "claude.logAuqParseFailed": "No se pudo analizar la entrada de AskUserQuestion, rechazo automático (fail-closed)",
101
+ "claude.errAuqParse": "No se pudieron analizar las preguntas",
102
+ "claude.logAuqSkipped": "AskUserQuestion sin respuesta/cancelada (session={session})",
103
+ "claude.errAuqCancelled": "El usuario no seleccionó (cancelado)",
104
+ "claude.logAuqDone": "AskUserQuestion respondida (session={session})",
105
+ "claude.promptRunTool": "Claude Code solicita ejecutar {tool}",
106
+ "claude.errApprovalTimeout": "Tiempo de aprobación agotado, rechazo automático (fail-closed)",
107
+ "claude.errUserDenied": "Rechazado por el usuario",
108
+ "claude.errAborted": "Solicitud interrumpida",
109
+ "claude.logPermToPhone": "Solicitud de permiso (tool={tool}) → enviada al teléfono permissionID={id}",
110
+ "claude.errRelayUnreachable": "Relay inaccesible, rechazo automático (fail-closed)",
111
+ "claude.logQuestionOffline": "Relay sin conexión, pregunta estructurada cancelada automáticamente",
112
+ "claude.logQuestionToPhone": "Pregunta estructurada ({count}) → enviada al teléfono questionID={id}",
113
+ "claude.logDialogOffline": "Relay sin conexión, diálogo cancelado automáticamente ({tool})",
114
+ "claude.logDialogToPhone": "Solicitud de diálogo (kind={kind} tool={tool}) → enviada al teléfono permissionID={id}",
115
+ "claude.logAuqDialogParse": "No se pudo analizar el payload de AskUserQuestion; se mantiene el comportamiento predeterminado (session={session})",
116
+ "claude.logDialogUnmapped": "request_user_dialog(kind={kind}) sin correspondencia, se mantiene el comportamiento predeterminado (session={session})",
117
+ "claude.promptMcpAuth": "MCP «{server}» solicita autorización",
118
+ "claude.logElicitUnmapped": "Elicitación MCP (server={server}, mode={mode}) no manejada, rechazo automático (session={session})",
119
+ "claude.logResetIdentity": "Cuenta desvinculada; restableciendo identidad y generando un nuevo código de emparejamiento…",
120
+ "claude.dialogConfirm": "Claude Code solicita confirmación ({kind})",
121
+ "claude.resultTruncated": "… (resultado truncado)",
122
+ "claude.streamError": "error de streaming de claude",
123
+ "claude.errListSessions": "No se pudo leer la lista de sesiones de Claude",
124
+ "claude.errReadHistory": "No se pudo leer el historial de la sesión ({id})",
125
+ "setup.langSet": "Idioma de ejecución establecido en",
126
+ "setup.langHint": "El adaptador emitirá en este idioma tras reiniciar (TUNNELBOX_LANG puede sobrescribirlo en tiempo de ejecución). Archivo de estado:",
127
+ "setup.langCurrent": "Idioma de ejecución actual",
128
+ "hermes.errNoRelay": "URL del relé no configurada: use --env para inyectar un valor predeterminado o sobrescríbalo en tiempo de ejecución con TUNNELBOX_RELAY_URL",
129
+ "hermes.logConnected": "Conectado al relé {url}",
130
+ "hermes.logMsgUncaught": "Excepción no capturada al procesar el mensaje: {message}",
131
+ "hermes.logDisconnected": "Desconectado del relé, reconectando automáticamente…",
132
+ "hermes.logPairCode": "Código de emparejamiento generado: {code}",
133
+ "hermes.logUnhandledType": "Tipo de mensaje no procesado: {type}",
134
+ "hermes.logHandleFailed": "Error al procesar {type}: {message}",
135
+ "hermes.logClaimed": "Vinculado a su cuenta de teléfono. El teléfono se conecta ahora directamente desde Mis computadoras",
136
+ "hermes.logResetIdentity": "Desvinculado de la cuenta; restableciendo identidad y generando un nuevo código de emparejamiento…",
137
+ "hermes.cmdNew": "Nueva sesión",
138
+ "hermes.cmdHelp": "Mostrar ayuda",
139
+ "hermes.newSessionTitle": "Nueva sesión",
140
+ "hermes.helpText": "Comandos admitidos:\n- /new nueva sesión\n- /help mostrar ayuda",
141
+ "hermes.errBusy": "Esta sesión se está generando; espere a que termine o deténgala primero",
142
+ "hermes.errBadWorkspace": "Este directorio no existe o no se puede usar",
143
+ "hermes.logWorkspaceSwitched": "Espacio de trabajo cambiado: {path}",
144
+ "hermes.errWorkspaceMissing": "El espacio de trabajo no existe: {dir}",
145
+ "hermes.errStartFailed": "Error al iniciar: {message}",
146
+ "hermes.msgStarted": "Adaptador de Hermes iniciado (Ctrl+C para salir)",
147
+ "hermes.logAbortSent": "Interrupción enviada (session={session})",
148
+ "hermes.logPromptFailed": "session.prompt falló: {message}",
149
+ "hermes.logTurnError": "Error de turno (session={session}): {message}",
150
+ "hermes.logPairForced": "--pair: solicitud forzada del código de emparejamiento (solo esta ejecución)",
151
+ "hermes.pairingStillClaimed": "Ya vinculado a una cuenta de teléfono: este código solo sirve para reemparejar un nuevo dispositivo en la misma cuenta; el dispositivo actual se conecta directamente desde Mis computadoras",
152
+ "hermes.logPairNoRelay": "No se puede solicitar un código de emparejamiento: no hay URL de relé configurada",
153
+ "hermes.errSpawnHermes": "No se puede iniciar Hermes ({bin}): confirme que está instalado ({err})",
154
+ "hermes.errHermesExit": "hermes salió ({code}): {err}",
155
+ "hermes.logSessionUpdated": "Sesión actualizada (session={session})",
156
+ "hermes.errNoInject": "Inyección de mensaje del teléfono no disponible (sesión no interactiva o proceso no listo)",
157
+ "hermes.pairNoRelay": "No se puede alcanzar el relé (relé inaccesible o websockets ausente)",
158
+ "hermes.pairTimeout": "Tiempo de espera agotado al solicitar el código de emparejamiento (relé sin respuesta)",
159
+ "hermes.errToolPair": "fallo de tunnelbox_pair: {err}",
160
+ "hermes.errToolStatus": "fallo de tunnelbox_status: {err}",
161
+ "hermes.cliUsage": "Uso: /tunnelbox <pair|status>\n pair solicitar e imprimir un código de emparejamiento\n status mostrar estado de relé/enlace/conexión"
162
+ }