@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": "Échec de la création de la session",
3
+ "agent.err.httpClient": "Impossible d'accéder au client HTTP d'opencode",
4
+ "agent.err.unknownPerm": "Demande d'autorisation inconnue : {id}",
5
+ "agent.err.unknownQuestion": "Demande de question inconnue : {id}",
6
+ "agent.log.fallback404": "Le point d'accès préféré a renvoyé 404, bascule sur l'autre : {message}",
7
+ "agent.log.gotPermReply": "Réponse d'autorisation reçue du téléphone (id={id} {reply} {version})",
8
+ "agent.log.gotQuestionReply": "Réponse de question reçue du téléphone (id={id} {status} {version})",
9
+ "agent.log.handleFailed": "Échec du traitement de {type} : {message}",
10
+ "agent.log.httpOk": "opencode HTTP {status} {path}",
11
+ "agent.log.pendingResent": "session.pending : renvoi de {count} demande(s) en attente pour {session}",
12
+ "agent.log.unhandledType": "Type de message non géré : {type}",
13
+ "events.log.fwdPermission": "Demande d'autorisation transmise au téléphone (id={id} tool={tool} {version})",
14
+ "events.log.permissionReplied": "opencode a accusé permission.replied (id={id} {response})",
15
+ "events.log.questionRejected": "opencode a accusé question.rejected (id={id})",
16
+ "events.log.questionReplied": "opencode a accusé question.replied (id={id})",
17
+ "index.error.connectRelay": "Impossible de se connecter au relais ; vérifiez son adresse et réessayez",
18
+ "index.error.pairTimeout": "Délai d'attente du code d'appairage dépassé (le relais ne répond pas)",
19
+ "index.log.claimed": "Lié à votre compte téléphone. Le téléphone se connecte désormais directement depuis « Mes PC » ; plus besoin de scanner",
20
+ "index.log.connectedRelay": "Connecté au relais {url}",
21
+ "index.log.loaded": "Plugin tunnelbox opencode démarré (v{version})",
22
+ "index.log.disconnected": "Déconnecté du relais, reconnexion automatique…",
23
+ "index.log.exit": "Arrêté",
24
+ "index.log.pairCode": "Code d'appairage généré : {code}",
25
+ "index.log.pairingStillClaimed": "Ce code d'appairage sert uniquement à ré-appairer un nouveau téléphone du même compte ; cet ordinateur est déjà lié et reste accessible depuis « Mes ordinateurs » sur votre téléphone.",
26
+ "index.log.pairingPreparing": "Connexion au relais et génération du code d'appairage…",
27
+ "index.log.permissionToPhone": "Demande d'autorisation → approbation sur téléphone (id={id} tool={tool})",
28
+ "index.log.permissionTuiFallback": "App hors ligne ; la demande est gérée par le TUI opencode (id={id} tool={tool})",
29
+ "index.log.relayError": "Erreur du relais : {msg}",
30
+ "index.log.resetIdentity": "Délié du compte ; réinitialisation de l'identité et génération d'un nouveau code d'appairage…",
31
+ "index.log.unknown": "Inconnu",
32
+ "install.codeLine": "Code d'appairage : {code}",
33
+ "install.commandInstalled": "Commande installée : {path}",
34
+ "install.done": "Terminé. Tentative de connexion au relais pour afficher les informations d'appairage :",
35
+ "install.failConnect": "(Impossible de se connecter au relais pour afficher l'appairage — relais injoignable ou version de Node trop ancienne.",
36
+ "install.failConnectHint": "Après le redémarrage d'opencode, consultez le QR code du terminal avec --print-logs, ou tapez “afficher le code d'appairage” / /pair dans opencode.)",
37
+ "install.hintFresh": "Remarque : le code d'appairage est à usage unique et valide environ 10 minutes. Si vous démarrez opencode plus tard, utilisez les informations imprimées au démarrage ou obtenues via /pair.",
38
+ "install.pluginInstalled": "Plugin installé : {path}",
39
+ "install.qrUnavailable": "(Rendu du QR indisponible — utilisez le code ci-dessus)",
40
+ "install.qrcodeEnsure": "Installation de qrcode dans le répertoire de configuration d'opencode…",
41
+ "install.qrcodeFail": "Échec de l'installation de qrcode (sans conséquence — seul le code d'appairage est affiché) : {err}",
42
+ "install.relayError": "Le relais a renvoyé une erreur : {msg}",
43
+ "install.scanHint": "Ouvrez tunnelbox sur votre téléphone, touchez “Scanner pour appairer”, puis scannez le QR ci-dessus pour connecter :",
44
+ "pair.heading": "Appairage téléphone tunnelbox",
45
+ "pair.howTo": "Ouvrez l'application tunnelbox sur votre téléphone, scannez le QR ci-dessus avec “Scanner pour appairer”, ou saisissez le code d'appairage manuellement.",
46
+ "pair.oneTime": "Le code d'appairage est à usage unique et expire après utilisation ; demandez à “raffraîchir le code d'appairage” pour en obtenir un nouveau.",
47
+ "pair.promptBody": "Veuillez afficher les informations d'appairage téléphone de cet ordinateur : le code d'appairage et un QR code scannable. Gardez le QR code dans un bloc de code à largeur fixe et reproduisez-le caractère par caractère pour que mon téléphone puisse le scanner.",
48
+ "pair.promptDescription": "Afficher le code d'appairage et le QR code scannable",
49
+ "pair.scanIntro": "**Appairer par scan** : ouvrez l'application tunnelbox sur votre téléphone, touchez “Scanner pour appairer”, puis scannez le QR ci-dessous pour vous connecter automatiquement.",
50
+ "perm.promptAuthorize": "opencode demande une autorisation",
51
+ "perm.promptPatterns": "opencode demande l'accès à : {list}",
52
+ "perm.promptResource": "opencode demande l'accès aux ressources : {list}",
53
+ "perm.promptTool": "opencode demande d'exécuter {tool}",
54
+ "qr.codeLabel": "Code d'appairage",
55
+ "qr.fileWritten": "Informations d'appairage écrites dans : {path}",
56
+ "qr.openHint": "Ouvrez l'application tunnelbox sur votre téléphone et scannez le QR ci-dessus, ou saisissez le code d'appairage manuellement dans l'application.",
57
+ "qr.titleNoType": "appairage téléphone tunnelbox",
58
+ "qr.titleWithType": "appairage téléphone tunnelbox {type}",
59
+ "qr.unavailable": "(qrcode non installé — utilisez le code d'appairage ci-dessus)",
60
+ "claude.errBusy": "Cette session est en cours d'exécution ; attendez la fin ou arrêtez-la d'abord",
61
+ "claude.errTurn": "erreur de génération",
62
+ "claude.pairingStillClaimed": "Déjà lié à un compte téléphone : ce code sert uniquement à appairer un nouvel appareil sur le même compte ; l'appareil actuel se connecte directement depuis Mes ordinateurs",
63
+ "claude.pairForced": "--pair : demande forcée d'un code d'appairage (cette exécution uniquement)",
64
+ "claude.pairUnclaimed": "Aucun compte lié détecté ; lancement du guide d'appairage :",
65
+ "claude.claimedHint": "Lié à un compte téléphone : connectez-vous directement depuis Mes ordinateurs sur le téléphone",
66
+ "claude.errStartFailed": "Échec du démarrage :",
67
+ "claude.msgStarted": "Adaptateur Claude Code démarré (Ctrl+C pour quitter)",
68
+ "claude.warnInvalidMode": "TUNNELBOX_CLAUDE_MODE invalide ignoré : {raw} (autorisé {list})",
69
+ "claude.warnInvalidThinking": "TUNNELBOX_CLAUDE_THINKING invalide ignoré : {raw} (off|adaptive|enabled[:budget])",
70
+ "claude.cmdNew": "Nouvelle session",
71
+ "claude.cmdHelp": "Afficher l'aide",
72
+ "claude.errNoRelay": "Aucune URL de relais configurée : injectez une valeur par défaut avec --env, ou remplacez-la via TUNNELBOX_RELAY_URL",
73
+ "claude.logConnected": "Connecté au relais {url}",
74
+ "claude.logMsgUncaught": "Exception non interceptée lors du traitement du message : {message}",
75
+ "claude.reasonDisconnect": "Relais déconnecté (rejet automatique fail-closed)",
76
+ "claude.reasonUnbind": "Compte dissocié (rejet automatique fail-closed)",
77
+ "claude.logDisconnected": "Déconnecté du relais, reconnexion automatique…",
78
+ "claude.logPairCode": "Code d'appairage généré : {code}",
79
+ "claude.logUnhandledType": "Type de message non géré : {type}",
80
+ "claude.logHandleFailed": "Échec du traitement de {type} : {message}",
81
+ "claude.newSessionTitle": "Nouvelle session",
82
+ "claude.helpText": "Commandes prises en charge :\n- /new nouvelle session\n- /help afficher l'aide",
83
+ "claude.logPromptFailed": "Échec de session.prompt : {message}",
84
+ "claude.logAbortSent": "Interruption envoyée (session={session})",
85
+ "claude.logAbortFailed": "Échec de l'interruption (session={session}) : {message}",
86
+ "claude.errBadWorkspaceEmpty": "Chemin de l'espace de travail manquant",
87
+ "claude.errBadWorkspaceNotDir": "Le répertoire n'existe pas ou est inutilisable",
88
+ "claude.logWorkspaceSwitched": "Espace de travail changé : {path}",
89
+ "claude.logUnknownQuestionReply": "Réponse de question structurée sans correspondance (id={id})",
90
+ "claude.logFlushedQuestions": "{count} question(s) en attente annulée(s) : {reason}",
91
+ "claude.logFlushedApprovals": "{count} demande(s) en attente rejetée(s) : {reason}",
92
+ "claude.logPendingResent": "session.pending : {count} élément(s) en attente renvoyé(s) pour {session}",
93
+ "claude.logSetModeFailed": "Échec de setPermissionMode (session={session}) : {message}",
94
+ "claude.errWorkspaceMissing": "L'espace de travail n'existe pas : {dir}",
95
+ "claude.logSessionError": "Erreur de session (session={session}) : {message}",
96
+ "claude.logOfflineDenyTool": "Relais hors ligne, rejet automatique de l'outil {tool}",
97
+ "claude.errOfflineDeny": "Relais hors ligne, rejet automatique (fail-closed)",
98
+ "claude.logAuqDisabled": "AskUserQuestion désactivé (TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), rejet automatique",
99
+ "claude.errAuqDisabled": "AskUserQuestion n'est pas activé",
100
+ "claude.logAuqParseFailed": "Échec de l'analyse de l'entrée AskUserQuestion, rejet automatique (fail-closed)",
101
+ "claude.errAuqParse": "Impossible d'analyser les questions",
102
+ "claude.logAuqSkipped": "AskUserQuestion sans réponse/annulée (session={session})",
103
+ "claude.errAuqCancelled": "L'utilisateur n'a pas fait de choix (annulé)",
104
+ "claude.logAuqDone": "AskUserQuestion répondue (session={session})",
105
+ "claude.promptRunTool": "Claude Code demande à exécuter {tool}",
106
+ "claude.errApprovalTimeout": "Approbation expirée, rejet automatique (fail-closed)",
107
+ "claude.errUserDenied": "Rejeté par l'utilisateur",
108
+ "claude.errAborted": "Requête interrompue",
109
+ "claude.logPermToPhone": "Demande d'autorisation (tool={tool}) → envoyée au téléphone permissionID={id}",
110
+ "claude.errRelayUnreachable": "Relais injoignable, rejet automatique (fail-closed)",
111
+ "claude.logQuestionOffline": "Relais hors ligne, question structurée annulée automatiquement",
112
+ "claude.logQuestionToPhone": "Question structurée ({count} élément(s)) → envoyée au téléphone questionID={id}",
113
+ "claude.logDialogOffline": "Relais hors ligne, dialogue annulé automatiquement ({tool})",
114
+ "claude.logDialogToPhone": "Demande de dialogue (kind={kind} tool={tool}) → envoyée au téléphone permissionID={id}",
115
+ "claude.logAuqDialogParse": "Échec de l'analyse du payload AskUserQuestion, comportement par défaut conservé (session={session})",
116
+ "claude.logDialogUnmapped": "request_user_dialog(kind={kind}) sans correspondance, comportement par défaut conservé (session={session})",
117
+ "claude.promptMcpAuth": "MCP « {server} » demande une autorisation",
118
+ "claude.logElicitUnmapped": "Élicitation MCP (server={server}, mode={mode}) non traitée, rejet automatique (session={session})",
119
+ "claude.logResetIdentity": "Compte dissocié ; réinitialisation de l'identité et génération d'un nouveau code d'appairage…",
120
+ "claude.dialogConfirm": "Claude Code demande une confirmation ({kind})",
121
+ "claude.resultTruncated": "… (résultat tronqué)",
122
+ "claude.streamError": "erreur de streaming claude",
123
+ "claude.errListSessions": "Échec de la lecture de la liste des sessions Claude",
124
+ "claude.errReadHistory": "Échec de la lecture de l'historique de session ({id})",
125
+ "setup.langSet": "Langue d'exécution définie sur",
126
+ "setup.langHint": "L'adaptateur utilisera cette langue au prochain démarrage (TUNNELBOX_LANG peut la remplacer). Fichier d'état :",
127
+ "setup.langCurrent": "Langue d'exécution actuelle",
128
+ "hermes.errNoRelay": "URL du relais non configurée : utilisez --env pour injecter une valeur par défaut, ou remplacez à l'exécution avec TUNNELBOX_RELAY_URL",
129
+ "hermes.logConnected": "Connecté au relais {url}",
130
+ "hermes.logMsgUncaught": "Exception non interceptée lors du traitement du message : {message}",
131
+ "hermes.logDisconnected": "Déconnecté du relais, reconnexion automatique…",
132
+ "hermes.logPairCode": "Code d'appairage généré : {code}",
133
+ "hermes.logUnhandledType": "Type de message non traité : {type}",
134
+ "hermes.logHandleFailed": "Échec du traitement de {type} : {message}",
135
+ "hermes.logClaimed": "Lié à votre compte téléphone. Le téléphone se connecte désormais directement depuis Mes ordinateurs",
136
+ "hermes.logResetIdentity": "Dissocié du compte ; réinitialisation de l'identité et génération d'un nouveau code d'appairage…",
137
+ "hermes.cmdNew": "Nouvelle session",
138
+ "hermes.cmdHelp": "Afficher l'aide",
139
+ "hermes.newSessionTitle": "Nouvelle session",
140
+ "hermes.helpText": "Commandes prises en charge :\n- /new nouvelle session\n- /help afficher l'aide",
141
+ "hermes.errBusy": "Cette session est en cours de génération ; attendez la fin ou arrêtez-la d'abord",
142
+ "hermes.errBadWorkspace": "Ce répertoire n'existe pas ou est inutilisable",
143
+ "hermes.logWorkspaceSwitched": "Espace de travail changé : {path}",
144
+ "hermes.errWorkspaceMissing": "L'espace de travail n'existe pas : {dir}",
145
+ "hermes.errStartFailed": "Échec du démarrage : {message}",
146
+ "hermes.msgStarted": "Adaptateur Hermes démarré (Ctrl+C pour quitter)",
147
+ "hermes.logAbortSent": "Interruption envoyée (session={session})",
148
+ "hermes.logPromptFailed": "session.prompt a échoué : {message}",
149
+ "hermes.logTurnError": "Erreur de tour (session={session}) : {message}",
150
+ "hermes.logPairForced": "--pair : demande forcée du code d'appairage (cet exécution uniquement)",
151
+ "hermes.pairingStillClaimed": "Déjà lié à un compte téléphone : ce code ne sert qu'à réappairer un nouvel appareil sur le même compte ; l'appareil actuel se connecte directement depuis Mes ordinateurs",
152
+ "hermes.logPairNoRelay": "Impossible de demander un code d'appairage : URL du relais non configurée",
153
+ "hermes.errSpawnHermes": "Impossible de démarrer Hermes ({bin}) : vérifiez qu'il est installé ({err})",
154
+ "hermes.errHermesExit": "hermes a quitté ({code}) : {err}",
155
+ "hermes.logSessionUpdated": "Session mise à jour (session={session})",
156
+ "hermes.errNoInject": "Injection du message téléphone indisponible (session non interactive ou processus non prêt)",
157
+ "hermes.pairNoRelay": "Impossible de joindre le relais (relais injoignable ou websockets manquant)",
158
+ "hermes.pairTimeout": "Délai dépassé pour le code d'appairage (relais sans réponse)",
159
+ "hermes.errToolPair": "échec de tunnelbox_pair : {err}",
160
+ "hermes.errToolStatus": "échec de tunnelbox_status : {err}",
161
+ "hermes.cliUsage": "Utilisation : /tunnelbox <pair|status>\n pair demander et afficher un code d'appairage\n status afficher l'état relais/liaison/connexion"
162
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "agent.err.createSession": "セッションの作成に失敗しました",
3
+ "agent.err.httpClient": "opencode HTTP client にアクセスできません",
4
+ "agent.err.unknownPerm": "不明な権限リクエスト: {id}",
5
+ "agent.err.unknownQuestion": "不明な質問リクエスト: {id}",
6
+ "agent.log.fallback404": "優先エンドポイントが 404 を返したため、別のエンドポイントへフォールバック: {message}",
7
+ "agent.log.gotPermReply": "携帯から権限の返信を受信 (id={id} {reply} {version})",
8
+ "agent.log.gotQuestionReply": "携帯から質問の返信を受信 (id={id} {status} {version})",
9
+ "agent.log.handleFailed": "{type} の処理に失敗: {message}",
10
+ "agent.log.httpOk": "opencode HTTP {status} {path}",
11
+ "agent.log.pendingResent": "session.pending: {session} の保留リクエスト {count} 件を再送",
12
+ "agent.log.unhandledType": "未処理のメッセージタイプ: {type}",
13
+ "events.log.fwdPermission": "権限リクエストを携帯へ転送 (id={id} tool={tool} {version})",
14
+ "events.log.permissionReplied": "opencode 応答 permission.replied (id={id} {response})",
15
+ "events.log.questionRejected": "opencode 応答 question.rejected (id={id})",
16
+ "events.log.questionReplied": "opencode 応答 question.replied (id={id})",
17
+ "index.error.connectRelay": "リレーに接続できません。リレーアドレスを確認して再試行してください",
18
+ "index.error.pairTimeout": "ペアリングコードの取得がタイムアウトしました(リレーが応答しません)",
19
+ "index.log.claimed": "スマホのアカウントに紐付けました。以降は「マイ PC」から直接接続されるため、再スキャンは不要です",
20
+ "index.log.connectedRelay": "リレーに接続しました {url}",
21
+ "index.log.loaded": "tunnelbox opencode プラグインを起動しました(v{version})",
22
+ "index.log.disconnected": "リレーから切断、自動的に再接続しています…",
23
+ "index.log.exit": "終了しました",
24
+ "index.log.pairCode": "ペアリングコードを生成: {code}",
25
+ "index.log.pairingStillClaimed": "このペアリングコードは同一アカウントの新しいスマートフォンとの再ペアリング専用です。この PC は既に連携済みで、スマートフォンの「マイ コンピューター」から引き続き接続できます。",
26
+ "index.log.pairingPreparing": "リレーへ接続してペアリングコードを生成しています…",
27
+ "index.log.permissionToPhone": "権限リクエスト → スマホで承認 (id={id} tool={tool})",
28
+ "index.log.permissionTuiFallback": "App がオフラインのため、権限リクエストは opencode TUI で対応 (id={id} tool={tool})",
29
+ "index.log.relayError": "リレーエラー: {msg}",
30
+ "index.log.resetIdentity": "アカウントから解除されました。ID をリセットして新しいペアリングコードを生成します…",
31
+ "index.log.unknown": "不明",
32
+ "install.codeLine": "ペアリングコード: {code}",
33
+ "install.commandInstalled": "コマンドをインストール: {path}",
34
+ "install.done": "完了。リレーに接続して本機のペアリング情報を出力しました:",
35
+ "install.failConnect": "(ペアリング情報を出力するためリレーに接続できませんでした — リレーに到達できないか Node が古すぎる可能性があります。",
36
+ "install.failConnectHint": "opencode を再起動後、--print-logs でターミナルの QR コードを確認するか、opencode 内で「ペアリングコードを表示」または /pair と入力してください。)",
37
+ "install.hintFresh": "注意:ペアリングコードは一度きりで、約 10 分間有効です。後から opencode を起動する場合は、起動時に表示されるか /pair で取得した最新情報を使用してください。",
38
+ "install.pluginInstalled": "プラグインをインストール: {path}",
39
+ "install.qrUnavailable": "(QR コードを表示できません — 上記のペアリングコードを使用してください)",
40
+ "install.qrcodeEnsure": "qrcode を opencode 設定ディレクトリにインストールしています…",
41
+ "install.qrcodeFail": "qrcode のインストールに失敗しました(使用には影響せず、ペアリングコードのみ表示されます): {err}",
42
+ "install.relayError": "リレーがエラーを返しました: {msg}",
43
+ "install.scanHint": "スマホで tunnelbox App「スキャンしてペアリング」を開き、上の QR コードをスキャンして接続:",
44
+ "pair.heading": "tunnelbox スマホペアリング",
45
+ "pair.howTo": "スマホで tunnelbox App を開き、「スキャンしてペアリング」で上の QR コードをスキャンするか、ペアリングコードを手動入力してください。",
46
+ "pair.oneTime": "ペアリングコードは一度きりで、使用後は無効になります。新しいコードが必要な場合は「ペアリングコードを更新」と依頼してください。",
47
+ "pair.promptBody": "この PC のスマホ遠隔ペアリング情報を表示してください:ペアリングコードと、スキャンできる QR コード。QR コードは等幅コードブロックに入れ、1 文字も変えずそのまま出力してください。スマホでスキャンできるようにするためです。",
48
+ "pair.promptDescription": "スマホ遠隔ペアリングのペアリングコード・スキャン用 QR コードを表示",
49
+ "pair.scanIntro": "**スキャンでペアリング**:スマホで tunnelbox App「スキャンしてペアリング」を開き、下の QR コードをスキャンすると自動的に接続されます。",
50
+ "perm.promptAuthorize": "opencode が認可を要求しています",
51
+ "perm.promptPatterns": "opencode がアクセスを要求: {list}",
52
+ "perm.promptResource": "opencode がリソースへのアクセスを要求: {list}",
53
+ "perm.promptTool": "opencode が {tool} の実行を要求",
54
+ "qr.codeLabel": "ペアリングコード",
55
+ "qr.fileWritten": "ペアリング情報を書き込みました: {path}",
56
+ "qr.openHint": "tunnelbox App を開き、上の QR コードをスキャンするか、App でペアリングコードを手動入力してください。",
57
+ "qr.titleNoType": "tunnelbox スマホペアリング",
58
+ "qr.titleWithType": "tunnelbox {type} スマホペアリング",
59
+ "qr.unavailable": "(qrcode が未インストール — 上記のペアリングコードを使用してください)",
60
+ "claude.errBusy": "このセッションは実行中です。完了するまでお待ちいただくか、先に停止してください",
61
+ "claude.errTurn": "生成エラー",
62
+ "claude.pairingStillClaimed": "すでにアカウントに紐付け済みです。このコードは同じアカウントの新しい端末のペアリング専用です。現在の端末は「マイコンピュータ」から直接接続できます",
63
+ "claude.pairForced": "--pair:ペアリングコードを強制リクエストしました(今回のみ)",
64
+ "claude.pairUnclaimed": "紐付け済みアカウントを検出できませんでした。ペアリング案内を開始します:",
65
+ "claude.claimedHint": "携帯アカウントに紐付け済みです:携帯の「マイコンピュータ」から直接接続してください",
66
+ "claude.errStartFailed": "起動に失敗しました:",
67
+ "claude.msgStarted": "Claude Code アダプターを起動しました(Ctrl+C で終了)",
68
+ "claude.warnInvalidMode": "無効な TUNNELBOX_CLAUDE_MODE を無視: {raw}(許可 {list})",
69
+ "claude.warnInvalidThinking": "無効な TUNNELBOX_CLAUDE_THINKING を無視: {raw}(off|adaptive|enabled[:budget])",
70
+ "claude.cmdNew": "新しいセッション",
71
+ "claude.cmdHelp": "ヘルプを表示",
72
+ "claude.errNoRelay": "中継 URL が設定されていません: ビルド時は --env でデフォルトを注入し、実行時は TUNNELBOX_RELAY_URL で上書きできます",
73
+ "claude.logConnected": "中継 {url} に接続しました",
74
+ "claude.logMsgUncaught": "メッセージ処理中に未捕捉の例外: {message}",
75
+ "claude.reasonDisconnect": "中継が切断されました(fail-closed 自動拒否)",
76
+ "claude.reasonUnbind": "アカウント連携解除(fail-closed 自動拒否)",
77
+ "claude.logDisconnected": "中継から切断、自動で再接続中…",
78
+ "claude.logPairCode": "ペアリングコードを生成: {code}",
79
+ "claude.logUnhandledType": "未処理のメッセージタイプ: {type}",
80
+ "claude.logHandleFailed": "{type} の処理に失敗: {message}",
81
+ "claude.newSessionTitle": "新しいセッション",
82
+ "claude.helpText": "使用可能なコマンド:\n- /new 新しいセッション\n- /help ヘルプを表示",
83
+ "claude.logPromptFailed": "session.prompt に失敗: {message}",
84
+ "claude.logAbortSent": "中止を送信しました (session={session})",
85
+ "claude.logAbortFailed": "中止に失敗 (session={session}): {message}",
86
+ "claude.errBadWorkspaceEmpty": "ワークスペースのパスがありません",
87
+ "claude.errBadWorkspaceNotDir": "ディレクトリが存在しないか利用できません",
88
+ "claude.logWorkspaceSwitched": "ワークスペースを切替: {path}",
89
+ "claude.logUnknownQuestionReply": "一致しない構造化質問の応答 (id={id})",
90
+ "claude.logFlushedQuestions": "未回答の質問 {count} 件をキャンセル: {reason}",
91
+ "claude.logFlushedApprovals": "未回答のリクエスト {count} 件を拒否: {reason}",
92
+ "claude.logPendingResent": "session.pending: {session} の保留項目 {count} 件を再送信",
93
+ "claude.logSetModeFailed": "setPermissionMode に失敗 (session={session}): {message}",
94
+ "claude.errWorkspaceMissing": "ワークスペースが存在しません: {dir}",
95
+ "claude.logSessionError": "セッションエラー (session={session}): {message}",
96
+ "claude.logOfflineDenyTool": "中継オフライン、ツール {tool} を自動拒否",
97
+ "claude.errOfflineDeny": "中継オフライン、自動拒否(fail-closed)",
98
+ "claude.logAuqDisabled": "AskUserQuestion は無効です(TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0)、自動拒否",
99
+ "claude.errAuqDisabled": "AskUserQuestion は有効になっていません",
100
+ "claude.logAuqParseFailed": "AskUserQuestion 入力の解析に失敗、自動拒否(fail-closed)",
101
+ "claude.errAuqParse": "質問を解析できません",
102
+ "claude.logAuqSkipped": "AskUserQuestion 未回答/キャンセル (session={session})",
103
+ "claude.errAuqCancelled": "ユーザーが選択しませんでした(キャンセル)",
104
+ "claude.logAuqDone": "AskUserQuestion に回答しました (session={session})",
105
+ "claude.promptRunTool": "Claude Code が {tool} の実行を要求",
106
+ "claude.errApprovalTimeout": "承認がタイムアウト、自動拒否(fail-closed)",
107
+ "claude.errUserDenied": "ユーザーが拒否",
108
+ "claude.errAborted": "リクエストは中止されました",
109
+ "claude.logPermToPhone": "権限リクエスト(tool={tool}) → スマホへ送信 permissionID={id}",
110
+ "claude.errRelayUnreachable": "中継に到達できず、自動拒否(fail-closed)",
111
+ "claude.logQuestionOffline": "中継オフライン、構造化質問を自動キャンセル",
112
+ "claude.logQuestionToPhone": "構造化質問({count} 問)→ スマホへ送信 questionID={id}",
113
+ "claude.logDialogOffline": "中継オフライン、ダイアログを自動キャンセル({tool})",
114
+ "claude.logDialogToPhone": "ダイアログ要求(kind={kind} tool={tool}) → スマホへ送信 permissionID={id}",
115
+ "claude.logAuqDialogParse": "AskUserQuestion ペイロードの解析に失敗、既定の動作を維持(session={session})",
116
+ "claude.logDialogUnmapped": "request_user_dialog(kind={kind}) のマッピングがなく、既定の動作を維持(session={session})",
117
+ "claude.promptMcpAuth": "MCP「{server}」が認可を要求",
118
+ "claude.logElicitUnmapped": "MCP elicitation(server={server}, mode={mode})は未対応、自動拒否(session={session})",
119
+ "claude.logResetIdentity": "アカウント連携が解除されました。ID をリセットし、新しいペアリングコードを生成しています…",
120
+ "claude.dialogConfirm": "Claude Code が確認を要求({kind})",
121
+ "claude.resultTruncated": "…(結果が長すぎるため省略)",
122
+ "claude.streamError": "claude ストリーミングエラー",
123
+ "claude.errListSessions": "Claude セッション一覧の読み取りに失敗",
124
+ "claude.errReadHistory": "セッション履歴の読み取りに失敗({id})",
125
+ "setup.langSet": "実行言語を設定しました",
126
+ "setup.langHint": "再起動後にこの言語で出力します(実行時は TUNNELBOX_LANG で上書き可能)。状態ファイル:",
127
+ "setup.langCurrent": "現在の実行言語",
128
+ "hermes.errNoRelay": "リレーURLが設定されていません:--env でデフォルトを注入、実行時は TUNNELBOX_RELAY_URL で上書きしてください",
129
+ "hermes.logConnected": "リレーに接続しました {url}",
130
+ "hermes.logMsgUncaught": "メッセージ処理中の未捕捉例外: {message}",
131
+ "hermes.logDisconnected": "リレーから切断、自動再接続中…",
132
+ "hermes.logPairCode": "ペアリングコードを生成: {code}",
133
+ "hermes.logUnhandledType": "未処理のメッセージタイプ: {type}",
134
+ "hermes.logHandleFailed": "{type} の処理に失敗: {message}",
135
+ "hermes.logClaimed": "スマホのアカウントにバインドしました。以後はスマホの「マイコンピュータ」から直接接続します",
136
+ "hermes.logResetIdentity": "アカウントからバインド解除、IDをリセットして新しいペアリングコードを生成中…",
137
+ "hermes.cmdNew": "新規セッション",
138
+ "hermes.cmdHelp": "ヘルプを表示",
139
+ "hermes.newSessionTitle": "新規セッション",
140
+ "hermes.helpText": "サポートコマンド:\n- /new 新規セッション\n- /help ヘルプを表示",
141
+ "hermes.errBusy": "このセッションは生成中です。完了を待つか、先に停止してください",
142
+ "hermes.errBadWorkspace": "このディレクトリは存在しないか使用できません",
143
+ "hermes.logWorkspaceSwitched": "ワークスペースを切替: {path}",
144
+ "hermes.errWorkspaceMissing": "ワークスペースが存在しません: {dir}",
145
+ "hermes.errStartFailed": "起動に失敗: {message}",
146
+ "hermes.msgStarted": "Hermes アダプタを起動しました(Ctrl+C で終了)",
147
+ "hermes.logAbortSent": "中止を送信 (session={session})",
148
+ "hermes.logPromptFailed": "session.prompt に失敗: {message}",
149
+ "hermes.logTurnError": "ターンエラー (session={session}): {message}",
150
+ "hermes.logPairForced": "--pair:ペアリングコードを強制取得(今回のみ)",
151
+ "hermes.pairingStillClaimed": "スマホアカウントにバインド済み:このコードは同アカウントの新デバイス再ペアリング用です。現在のデバイスはスマホの「マイコンピュータ」から直接接続できます",
152
+ "hermes.logPairNoRelay": "リレーURLが未設定のためペアリングコードを取得できません",
153
+ "hermes.errSpawnHermes": "Hermes({bin})を起動できません:インストールを確認してください({err})",
154
+ "hermes.errHermesExit": "hermes 終了({code}): {err}",
155
+ "hermes.logSessionUpdated": "セッションを更新 (session={session})",
156
+ "hermes.errNoInject": "スマホからのメッセージ挿入が利用できません(非対話セッションまたはプロセス未準備)",
157
+ "hermes.pairNoRelay": "リレーに接続できません(リレー到達不能または websockets 欠落)",
158
+ "hermes.pairTimeout": "ペアリングコード要求がタイムアウト(リレー未応答)",
159
+ "hermes.errToolPair": "tunnelbox_pair 失敗: {err}",
160
+ "hermes.errToolStatus": "tunnelbox_status 失敗: {err}",
161
+ "hermes.cliUsage": "使用方法: /tunnelbox <pair|status>\n pair ペアリングコードを取得して表示\n status リレー/バインド/接続状態を表示"
162
+ }
@@ -0,0 +1,162 @@
1
+ {
2
+ "agent.err.createSession": "세션 생성 실패",
3
+ "agent.err.httpClient": "opencode HTTP client에 접근할 수 없습니다",
4
+ "agent.err.unknownPerm": "알 수 없는 권한 요청: {id}",
5
+ "agent.err.unknownQuestion": "알 수 없는 질문 요청: {id}",
6
+ "agent.log.fallback404": "선호 엔드포인트가 404를 반환해 다른 엔드포인트로 대체: {message}",
7
+ "agent.log.gotPermReply": "휴대폰에서 권한 응답 수신 (id={id} {reply} {version})",
8
+ "agent.log.gotQuestionReply": "휴대폰에서 질문 응답 수신 (id={id} {status} {version})",
9
+ "agent.log.handleFailed": "{type} 처리 실패: {message}",
10
+ "agent.log.httpOk": "opencode HTTP {status} {path}",
11
+ "agent.log.pendingResent": "session.pending: {session} 보류 요청 {count}건 재전송",
12
+ "agent.log.unhandledType": "처리되지 않은 메시지 유형: {type}",
13
+ "events.log.fwdPermission": "권한 요청을 휴대폰으로 전달 (id={id} tool={tool} {version})",
14
+ "events.log.permissionReplied": "opencode 응답 permission.replied (id={id} {response})",
15
+ "events.log.questionRejected": "opencode 응답 question.rejected (id={id})",
16
+ "events.log.questionReplied": "opencode 응답 question.replied (id={id})",
17
+ "index.error.connectRelay": "릴레이에 연결할 수 없습니다. 릴레이 주소를 확인한 후 다시 시도하세요",
18
+ "index.error.pairTimeout": "페어링 코드 대기 시간 초과(릴레이가 응답하지 않음)",
19
+ "index.log.claimed": "휴대폰 계정에 연결되었습니다. 이제 휴대폰은 「내 PC」에서 직접 연결하며 다시 스캔할 필요가 없습니다",
20
+ "index.log.connectedRelay": "릴레이에 연결됨 {url}",
21
+ "index.log.loaded": "tunnelbox opencode 플러그인을 시작했습니다(v{version})",
22
+ "index.log.disconnected": "릴레이 연결이 끊겨 자동으로 재연결 중…",
23
+ "index.log.exit": "종료됨",
24
+ "index.log.pairCode": "페어링 코드 생성: {code}",
25
+ "index.log.pairingStillClaimed": "이 페어링 코드는 같은 계정의 새 휴대폰 재연결 전용입니다. 이 PC는 이미 연결되어 휴대폰의 '내 컴퓨터'에서 계속 접속할 수 있습니다.",
26
+ "index.log.pairingPreparing": "릴레이에 연결하여 페어링 코드를 생성하는 중입니다…",
27
+ "index.log.permissionToPhone": "권한 요청 → 휴대폰 승인 (id={id} tool={tool})",
28
+ "index.log.permissionTuiFallback": "앱 오프라인, 권한 요청은 opencode TUI가 처리 (id={id} tool={tool})",
29
+ "index.log.relayError": "릴레이 오류: {msg}",
30
+ "index.log.resetIdentity": "계정에서 해제되어 ID를 재설정하고 새 페어링 코드를 생성합니다…",
31
+ "index.log.unknown": "알 수 없음",
32
+ "install.codeLine": "페어링 코드: {code}",
33
+ "install.commandInstalled": "명령 설치됨: {path}",
34
+ "install.done": "완료. 릴레이에 연결해 이 PC의 페어링 정보를 출력합니다:",
35
+ "install.failConnect": "(페어링 정보를 출력하려고 릴레이에 즉시 연결하지 못했습니다 — 릴레이에 연결할 수 없거나 Node 버전이 너무 오래됐습니다.",
36
+ "install.failConnectHint": "opencode를 다시 시작한 뒤 --print-logs로 터미널 QR 코드를 확인하거나, opencode 안에서 “휴대폰 페어링 코드 표시” 또는 /pair를 입력하세요.)",
37
+ "install.hintFresh": "참고: 페어링 코드는 일회용이며 약 10분간 유효합니다. 나중에 opencode를 시작한다면 시작 시 출력되거나 /pair로 받은 최신 정보를 사용하세요.",
38
+ "install.pluginInstalled": "플러그인 설치됨: {path}",
39
+ "install.qrUnavailable": "(QR 코드를 표시할 수 없습니다 — 위의 페어링 코드를 사용하세요)",
40
+ "install.qrcodeEnsure": "qrcode를 opencode 설정 디렉터리에 설치하는 중…",
41
+ "install.qrcodeFail": "qrcode 설치 실패(사용에는 영향이 없으며 페어링 코드만 표시됩니다): {err}",
42
+ "install.relayError": "릴레이 오류 응답: {msg}",
43
+ "install.scanHint": "휴대폰에서 tunnelbox 앱 “스캔하여 연결”을 열고 위 QR 코드를 스캔하여 연결하세요:",
44
+ "pair.heading": "tunnelbox 휴대폰 페어링",
45
+ "pair.howTo": "휴대폰에서 tunnelbox 앱을 열고 “스캔하여 연결”로 위 QR 코드를 스캔하거나 페어링 코드를 직접 입력하세요.",
46
+ "pair.oneTime": "페어링 코드는 일회용이며 사용 후에는 만료됩니다. 새 코드가 필요하면 “페어링 코드 새로고침”을 요청하세요.",
47
+ "pair.promptBody": "이 PC의 휴대폰 원격 페어링 정보를 보여주세요: 페어링 코드와 스캔할 수 있는 QR 코드. QR 코드는 고정폭 코드 블록에 넣고 한 글자도 바꾸지 말고 그대로 표시해 주세요. 휴대폰으로 스캔할 수 있도록 하기 위함입니다.",
48
+ "pair.promptDescription": "휴대폰 원격 페어링의 페어링 코드·스캔용 QR 코드 표시",
49
+ "pair.scanIntro": "**스캔으로 연결**: 휴대폰에서 tunnelbox 앱 “스캔하여 연결”을 열고 아래 QR 코드를 스캔하면 자동으로 연결됩니다.",
50
+ "perm.promptAuthorize": "opencode가 권한을 요청합니다",
51
+ "perm.promptPatterns": "opencode가 접근을 요청: {list}",
52
+ "perm.promptResource": "opencode가 리소스 접근을 요청: {list}",
53
+ "perm.promptTool": "opencode가 {tool} 실행을 요청",
54
+ "qr.codeLabel": "페어링 코드",
55
+ "qr.fileWritten": "페어링 정보가 기록됨: {path}",
56
+ "qr.openHint": "tunnelbox 앱을 열고 위 QR 코드를 스캔하거나, 앱에서 페어링 코드를 직접 입력하세요.",
57
+ "qr.titleNoType": "tunnelbox 휴대폰 페어링",
58
+ "qr.titleWithType": "tunnelbox {type} 휴대폰 페어링",
59
+ "qr.unavailable": "(qrcode가 설치되지 않음 — 위의 페어링 코드를 사용하세요)",
60
+ "claude.errBusy": "이 세션이 실행 중입니다. 완료될 때까지 기다리거나 먼저 중지하세요",
61
+ "claude.errTurn": "생성 오류",
62
+ "claude.pairingStillClaimed": "이미 계정에 연결되어 있습니다. 이 코드는 같은 계정의 새 기기 연결 전용이며, 현재 기기는 '내 컴퓨터'에서 직접 연결할 수 있습니다",
63
+ "claude.pairForced": "--pair: 페어링 코드를 강제 요청했습니다(이번 실행만)",
64
+ "claude.pairUnclaimed": "연결된 계정을 감지하지 못했습니다. 페어링 안내를 시작합니다:",
65
+ "claude.claimedHint": "휴대폰 계정에 연결됨: 휴대폰의 '내 컴퓨터'에서 직접 연결하세요",
66
+ "claude.errStartFailed": "시작 실패:",
67
+ "claude.msgStarted": "Claude Code 어댑터가 시작되었습니다(Ctrl+C로 종료)",
68
+ "claude.warnInvalidMode": "잘못된 TUNNELBOX_CLAUDE_MODE 무시: {raw}(허용 {list})",
69
+ "claude.warnInvalidThinking": "잘못된 TUNNELBOX_CLAUDE_THINKING 무시: {raw}(off|adaptive|enabled[:budget])",
70
+ "claude.cmdNew": "새 세션",
71
+ "claude.cmdHelp": "도움말 보기",
72
+ "claude.errNoRelay": "릴레이 URL이 설정되지 않았습니다: --env로 기본값을 주입하거나 실행 시 TUNNELBOX_RELAY_URL로 덮어쓰세요",
73
+ "claude.logConnected": "릴레이 {url}에 연결됨",
74
+ "claude.logMsgUncaught": "메시지 처리 중 처리되지 않은 예외: {message}",
75
+ "claude.reasonDisconnect": "릴레이 연결 끊김(fail-closed 자동 거부)",
76
+ "claude.reasonUnbind": "계정 연결 해제(fail-closed 자동 거부)",
77
+ "claude.logDisconnected": "릴레이 연결이 끊어져 자동 재연결 중…",
78
+ "claude.logPairCode": "페어링 코드 생성: {code}",
79
+ "claude.logUnhandledType": "처리되지 않은 메시지 유형: {type}",
80
+ "claude.logHandleFailed": "{type} 처리 실패: {message}",
81
+ "claude.newSessionTitle": "새 세션",
82
+ "claude.helpText": "지원 명령:\n- /new 새 세션\n- /help 도움말 보기",
83
+ "claude.logPromptFailed": "session.prompt 실패: {message}",
84
+ "claude.logAbortSent": "중지 전송됨 (session={session})",
85
+ "claude.logAbortFailed": "중지 실패 (session={session}): {message}",
86
+ "claude.errBadWorkspaceEmpty": "작업 영역 경로가 없습니다",
87
+ "claude.errBadWorkspaceNotDir": "디렉터리가 없거나 사용할 수 없습니다",
88
+ "claude.logWorkspaceSwitched": "작업 영역 전환: {path}",
89
+ "claude.logUnknownQuestionReply": "일치하지 않는 구조화 질문 응답 (id={id})",
90
+ "claude.logFlushedQuestions": "대기 중 질문 {count}개 취소: {reason}",
91
+ "claude.logFlushedApprovals": "대기 중 요청 {count}개 거부: {reason}",
92
+ "claude.logPendingResent": "session.pending: {session}의 대기 항목 {count}개 재전송",
93
+ "claude.logSetModeFailed": "setPermissionMode 실패 (session={session}): {message}",
94
+ "claude.errWorkspaceMissing": "작업 영역이 없습니다: {dir}",
95
+ "claude.logSessionError": "세션 오류 (session={session}): {message}",
96
+ "claude.logOfflineDenyTool": "릴레이 오프라인, 도구 {tool} 자동 거부",
97
+ "claude.errOfflineDeny": "릴레이 오프라인, 자동 거부(fail-closed)",
98
+ "claude.logAuqDisabled": "AskUserQuestion 비활성화됨(TUNNELBOX_CLAUDE_ASK_USER_QUESTION=0), 자동 거부",
99
+ "claude.errAuqDisabled": "AskUserQuestion이 활성화되지 않았습니다",
100
+ "claude.logAuqParseFailed": "AskUserQuestion 입력 구문 분석 실패, 자동 거부(fail-closed)",
101
+ "claude.errAuqParse": "질문을 구문 분석할 수 없습니다",
102
+ "claude.logAuqSkipped": "AskUserQuestion 무응답/취소됨 (session={session})",
103
+ "claude.errAuqCancelled": "사용자가 선택하지 않음(취소됨)",
104
+ "claude.logAuqDone": "AskUserQuestion 답변 완료 (session={session})",
105
+ "claude.promptRunTool": "Claude Code가 {tool} 실행을 요청",
106
+ "claude.errApprovalTimeout": "승인 시간 초과, 자동 거부(fail-closed)",
107
+ "claude.errUserDenied": "사용자가 거부",
108
+ "claude.errAborted": "요청이 중단되었습니다",
109
+ "claude.logPermToPhone": "권한 요청(tool={tool}) → 휴대폰으로 전송 permissionID={id}",
110
+ "claude.errRelayUnreachable": "릴레이에 연결할 수 없음, 자동 거부(fail-closed)",
111
+ "claude.logQuestionOffline": "릴레이 오프라인, 구조화 질문 자동 취소",
112
+ "claude.logQuestionToPhone": "구조화 질문({count}개) → 휴대폰으로 전송 questionID={id}",
113
+ "claude.logDialogOffline": "릴레이 오프라인, 대화 상자 자동 취소({tool})",
114
+ "claude.logDialogToPhone": "대화 상자 요청(kind={kind} tool={tool}) → 휴대폰으로 전송 permissionID={id}",
115
+ "claude.logAuqDialogParse": "AskUserQuestion 페이로드 구문 분석 실패, 기본 동작 유지(session={session})",
116
+ "claude.logDialogUnmapped": "request_user_dialog(kind={kind}) 매핑 없음, 기본 동작 유지(session={session})",
117
+ "claude.promptMcpAuth": "MCP \"{server}\" 인증 요청",
118
+ "claude.logElicitUnmapped": "MCP elicitation(server={server}, mode={mode}) 미처리, 자동 거부(session={session})",
119
+ "claude.logResetIdentity": "계정 연결이 해제되었습니다. ID를 재설정하고 새 페어링 코드를 생성하는 중…",
120
+ "claude.dialogConfirm": "Claude Code가 확인을 요청({kind})",
121
+ "claude.resultTruncated": "…(결과가 너무 길어 잘림)",
122
+ "claude.streamError": "claude 스트리밍 오류",
123
+ "claude.errListSessions": "Claude 세션 목록을 읽지 못했습니다",
124
+ "claude.errReadHistory": "세션 기록을 읽지 못했습니다({id})",
125
+ "setup.langSet": "실행 언어를 설정했습니다",
126
+ "setup.langHint": "다시 시작하면 이 언어로 출력됩니다(실행 시 TUNNELBOX_LANG으로 재정의 가능). 상태 파일:",
127
+ "setup.langCurrent": "현재 실행 언어",
128
+ "hermes.errNoRelay": "릴레이 URL이 설정되지 않았습니다: --env로 기본값을 주입하거나 실행 시 TUNNELBOX_RELAY_URL로 재정의하세요",
129
+ "hermes.logConnected": "릴레이에 연결됨 {url}",
130
+ "hermes.logMsgUncaught": "메시지 처리 중 처리되지 않은 예외: {message}",
131
+ "hermes.logDisconnected": "릴레이와 연결 끊김, 자동 재연결 중…",
132
+ "hermes.logPairCode": "페어링 코드 생성: {code}",
133
+ "hermes.logUnhandledType": "처리되지 않은 메시지 유형: {type}",
134
+ "hermes.logHandleFailed": "{type} 처리 실패: {message}",
135
+ "hermes.logClaimed": "휴대폰 계정에 바인딩됨. 이제 휴대폰의 '내 컴퓨터'에서 직접 연결합니다",
136
+ "hermes.logResetIdentity": "계정에서 바인딩 해제됨, ID 재설정 및 새 페어링 코드 생성 중…",
137
+ "hermes.cmdNew": "새 세션",
138
+ "hermes.cmdHelp": "도움말 표시",
139
+ "hermes.newSessionTitle": "새 세션",
140
+ "hermes.helpText": "지원 명령:\n- /new 새 세션\n- /help 도움말 표시",
141
+ "hermes.errBusy": "이 세션이 생성 중입니다. 완료를 기다리거나 먼저 중지하세요",
142
+ "hermes.errBadWorkspace": "이 디렉토리는 존재하지 않거나 사용할 수 없습니다",
143
+ "hermes.logWorkspaceSwitched": "작업공간 전환: {path}",
144
+ "hermes.errWorkspaceMissing": "작업공간이 없습니다: {dir}",
145
+ "hermes.errStartFailed": "시작 실패: {message}",
146
+ "hermes.msgStarted": "Hermes 어댑터 시작됨 (Ctrl+C로 종료)",
147
+ "hermes.logAbortSent": "중지 전송됨 (session={session})",
148
+ "hermes.logPromptFailed": "session.prompt 실패: {message}",
149
+ "hermes.logTurnError": "턴 오류 (session={session}): {message}",
150
+ "hermes.logPairForced": "--pair: 페어링 코드 강제 요청 (이번에만)",
151
+ "hermes.pairingStillClaimed": "휴대폰 계정에 이미 바인딩됨: 이 코드는 같은 계정의 새 기기 재페어링용입니다. 현재 기기는 휴대폰의 '내 컴퓨터'에서 직접 연결할 수 있습니다",
152
+ "hermes.logPairNoRelay": "릴레이 URL이 설정되지 않아 페어링 코드를 요청할 수 없습니다",
153
+ "hermes.errSpawnHermes": "Hermes({bin})를 시작할 수 없습니다: 설치 여부를 확인하세요 ({err})",
154
+ "hermes.errHermesExit": "hermes 종료({code}): {err}",
155
+ "hermes.logSessionUpdated": "세션 업데이트됨 (session={session})",
156
+ "hermes.errNoInject": "휴대폰 메시지 주입을 사용할 수 없습니다(비대화형 세션 또는 프로세스 미준비)",
157
+ "hermes.pairNoRelay": "릴레이에 연결할 수 없습니다(릴레이 도달 불가 또는 websockets 누락)",
158
+ "hermes.pairTimeout": "페어링 코드 요청 시간 초과(릴레이 미응답)",
159
+ "hermes.errToolPair": "tunnelbox_pair 실패: {err}",
160
+ "hermes.errToolStatus": "tunnelbox_status 실패: {err}",
161
+ "hermes.cliUsage": "사용법: /tunnelbox <pair|status>\n pair 휴대폰 페어링 코드 요청/출력\n status 릴레이/바인딩/연결 상태 표시"
162
+ }