@tunnelbox/dsh-tunnelbox 0.1.4 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.mjs +359 -118
  2. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -137,30 +137,28 @@ var zh_CN_default = {
137
137
  "install.failConnect": "\uFF08\u672A\u80FD\u5373\u65F6\u8FDE\u63A5\u4E2D\u7EE7\u6253\u5370\u914D\u5BF9\u4FE1\u606F\u2014\u2014\u4E2D\u7EE7\u4E0D\u53EF\u8FBE\u6216\u5F53\u524D Node \u8FC7\u65E7\u3002",
138
138
  "install.failConnectHint": "\u91CD\u542F opencode \u540E\u53EF\u7528 --print-logs \u67E5\u770B\u7EC8\u7AEF\u4E8C\u7EF4\u7801\uFF0C\u6216\u5728 opencode \u5185\u8F93\u5165\u201C\u663E\u793A\u624B\u673A\u914D\u5BF9\u7801\u201D\u6216 /pair\u3002\uFF09",
139
139
  "install.hintFresh": "\u63D0\u793A\uFF1A\u914D\u5BF9\u7801\u4E3A\u4E00\u6B21\u6027\uFF0C\u7EA6 10 \u5206\u949F\u6709\u6548\uFF1B\u82E5\u7A0D\u540E\u624D\u542F\u52A8 opencode\uFF0C\u4EE5\u542F\u52A8\u65F6\u7EC8\u7AEF\u6253\u5370\u6216 /pair \u53D6\u5F97\u7684\u6700\u65B0\u914D\u5BF9\u4FE1\u606F\u4E3A\u51C6\u3002",
140
- "install.linkLine": "\u914D\u5BF9\u94FE\u63A5: {link}",
141
140
  "install.pluginInstalled": "\u5DF2\u5B89\u88C5\u63D2\u4EF6: {path}",
142
- "install.qrUnavailable": "\uFF08\u4E8C\u7EF4\u7801\u6E32\u67D3\u4E0D\u53EF\u7528\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u914D\u5BF9\u94FE\u63A5\u6216\u914D\u5BF9\u7801\uFF09",
141
+ "install.qrUnavailable": "\uFF08\u4E8C\u7EF4\u7801\u6E32\u67D3\u4E0D\u53EF\u7528\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u914D\u5BF9\u7801\uFF09",
143
142
  "install.qrcodeEnsure": "\u5B89\u88C5 qrcode \u5230 opencode \u914D\u7F6E\u76EE\u5F55\u2026",
144
- "install.qrcodeFail": "qrcode \u5B89\u88C5\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD\u4F7F\u7528\uFF0C\u4E8C\u7EF4\u7801\u4F1A\u964D\u7EA7\u4E3A\u94FE\u63A5\uFF09: {err}",
143
+ "install.qrcodeFail": "qrcode \u5B89\u88C5\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD\u4F7F\u7528\uFF0C\u4EC5\u663E\u793A\u914D\u5BF9\u7801\uFF09: {err}",
145
144
  "install.relayError": "\u4E2D\u7EE7\u8FD4\u56DE\u9519\u8BEF: {msg}",
146
- "install.scanHint": "\u624B\u673A\u6253\u5F00 tunnelbox App\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\u6216\u76F8\u673A\u626B\u63CF\u4E0B\u65B9\u4E8C\u7EF4\u7801\u5373\u53EF\u8FDE\u63A5\uFF1A",
145
+ "install.scanHint": "\u624B\u673A\u6253\u5F00 tunnelbox App\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\uFF0C\u626B\u63CF\u4E0A\u65B9\u4E8C\u7EF4\u7801\u5373\u53EF\u8FDE\u63A5\uFF1A",
147
146
  "pair.heading": "tunnelbox \u624B\u673A\u914D\u5BF9",
148
- "pair.howTo": "\u5728\u624B\u673A\u6D4F\u89C8\u5668\u6253\u5F00\u94FE\u63A5\uFF0C\u6216\u6253\u5F00 tunnelbox \u5E94\u7528\u8F93\u5165\u914D\u5BF9\u7801\u3002",
147
+ "pair.howTo": "\u5728\u624B\u673A\u4E0A\u6253\u5F00 tunnelbox App\uFF0C\u7528\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\u626B\u63CF\u4E0A\u65B9\u4E8C\u7EF4\u7801\uFF0C\u6216\u624B\u52A8\u8F93\u5165\u914D\u5BF9\u7801\u3002",
149
148
  "pair.oneTime": "\u914D\u5BF9\u7801\u4E3A\u4E00\u6B21\u6027\uFF0C\u4F7F\u7528\u540E\u5373\u5931\u6548\uFF1B\u5982\u9700\u65B0\u7801\uFF0C\u53EF\u8981\u6C42\u201C\u5237\u65B0\u914D\u5BF9\u7801\u201D\u3002",
150
- "pair.promptBody": "\u8BF7\u5E2E\u6211\u67E5\u770B\u672C\u673A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u4FE1\u606F\uFF1A\u663E\u793A\u914D\u5BF9\u7801\u3001\u914D\u5BF9\u94FE\u63A5\uFF0C\u4EE5\u53CA\u53EF\u4F9B\u626B\u7801\u7684\u4E8C\u7EF4\u7801\u3002\u4E8C\u7EF4\u7801\u8BF7\u653E\u5728\u7B49\u5BBD\u4EE3\u7801\u5757\u91CC\u5E76\u9010\u5B57\u539F\u6837\u4FDD\u7559\uFF0C\u65B9\u4FBF\u6211\u7528\u624B\u673A\u626B\u7801\u3002",
151
- "pair.promptDescription": "\u663E\u793A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u7684\u914D\u5BF9\u7801\u3001\u914D\u5BF9\u94FE\u63A5\u4E0E\u626B\u7801\u4E8C\u7EF4\u7801",
152
- "pair.scanIntro": "**\u626B\u4E00\u626B\u914D\u5BF9**\uFF1A\u624B\u673A\u6253\u5F00 tunnelbox App\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\u6216\u76F8\u673A\uFF0C\u626B\u63CF\u4E0B\u65B9\u4E8C\u7EF4\u7801\u5373\u53EF\u81EA\u52A8\u8FDE\u63A5\u3002",
149
+ "pair.promptBody": "\u8BF7\u5E2E\u6211\u67E5\u770B\u672C\u673A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u4FE1\u606F\uFF1A\u663E\u793A\u914D\u5BF9\u7801\u4E0E\u53EF\u4F9B\u626B\u7801\u7684\u4E8C\u7EF4\u7801\u3002\u4E8C\u7EF4\u7801\u8BF7\u653E\u5728\u7B49\u5BBD\u4EE3\u7801\u5757\u91CC\u5E76\u9010\u5B57\u539F\u6837\u4FDD\u7559\uFF0C\u65B9\u4FBF\u6211\u7528\u624B\u673A\u626B\u7801\u3002",
150
+ "pair.promptDescription": "\u663E\u793A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u7684\u914D\u5BF9\u7801\u4E0E\u626B\u7801\u4E8C\u7EF4\u7801",
151
+ "pair.scanIntro": "**\u626B\u4E00\u626B\u914D\u5BF9**\uFF1A\u624B\u673A\u6253\u5F00 tunnelbox App\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\uFF0C\u626B\u63CF\u4E0B\u65B9\u4E8C\u7EF4\u7801\u5373\u53EF\u81EA\u52A8\u8FDE\u63A5\u3002",
153
152
  "perm.promptAuthorize": "opencode \u8BF7\u6C42\u6388\u6743",
154
153
  "perm.promptPatterns": "opencode \u8BF7\u6C42\u8BBF\u95EE\uFF1A{list}",
155
154
  "perm.promptResource": "opencode \u8BF7\u6C42\u8BBF\u95EE\u8D44\u6E90\uFF1A{list}",
156
155
  "perm.promptTool": "opencode \u8BF7\u6C42\u6267\u884C {tool}",
157
156
  "qr.codeLabel": "\u914D\u5BF9\u7801",
158
157
  "qr.fileWritten": "\u914D\u5BF9\u4FE1\u606F\u5DF2\u5199\u5165: {path}",
159
- "qr.linkLabel": "\u94FE\u63A5",
160
- "qr.openHint": "\u624B\u673A\u6D4F\u89C8\u5668\u6253\u5F00\u94FE\u63A5\uFF0C\u6216\u6253\u5F00 App \u540E\u624B\u52A8\u8F93\u5165\u914D\u5BF9\u7801\u3002",
158
+ "qr.openHint": "\u6253\u5F00 tunnelbox App\uFF0C\u7528\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\u626B\u63CF\u4E0A\u65B9\u4E8C\u7EF4\u7801\uFF0C\u6216\u624B\u52A8\u8F93\u5165\u914D\u5BF9\u7801\u3002",
161
159
  "qr.titleNoType": "tunnelbox \u624B\u673A\u914D\u5BF9",
162
160
  "qr.titleWithType": "tunnelbox {type} \u624B\u673A\u914D\u5BF9",
163
- "qr.unavailable": "\uFF08\u672A\u5B89\u88C5 qrcode\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u94FE\u63A5\u6216\u914D\u5BF9\u7801\uFF09",
161
+ "qr.unavailable": "\uFF08\u672A\u5B89\u88C5 qrcode\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u914D\u5BF9\u7801\uFF09",
164
162
  "claude.errBusy": "\u8BE5\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
165
163
  "claude.errTurn": "\u751F\u6210\u51FA\u9519",
166
164
  "claude.pairingStillClaimed": "\u5DF2\u7ED1\u5B9A\u624B\u673A\u8D26\u53F7\uFF1A\u6B64\u914D\u5BF9\u7801\u4EC5\u7528\u4E8E\u540C\u8D26\u53F7\u65B0\u8BBE\u5907\u91CD\u65B0\u914D\u5BF9\uFF0C\u5F53\u524D\u8BBE\u5907\u53EF\u76F4\u63A5\u4ECE\u624B\u673A\u300C\u6211\u7684\u7535\u8111\u300D\u8FDE\u63A5",
@@ -228,7 +226,41 @@ var zh_CN_default = {
228
226
  "claude.errReadHistory": "\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\u5931\u8D25({id})",
229
227
  "setup.langSet": "\u5DF2\u8BBE\u7F6E\u8FD0\u884C\u8BED\u8A00",
230
228
  "setup.langHint": "\u91CD\u542F\u9002\u914D\u5668\u540E\u6309\u8BE5\u8BED\u8A00\u8F93\u51FA\uFF08\u8FD0\u884C\u65F6\u53EF\u88AB TUNNELBOX_LANG \u8986\u76D6\uFF09\u3002\u72B6\u6001\u6587\u4EF6\uFF1A",
231
- "setup.langCurrent": "\u5F53\u524D\u8FD0\u884C\u8BED\u8A00"
229
+ "setup.langCurrent": "\u5F53\u524D\u8FD0\u884C\u8BED\u8A00",
230
+ "hermes.errNoRelay": "\u672A\u914D\u7F6E\u4E2D\u7EE7\u5730\u5740\uFF1A\u6784\u5EFA\u8BF7\u7528 --env \u6CE8\u5165\u9ED8\u8BA4\uFF0C\u8FD0\u884C\u53EF\u7528 TUNNELBOX_RELAY_URL \u8986\u76D6",
231
+ "hermes.logConnected": "\u5DF2\u8FDE\u63A5\u4E2D\u7EE7 {url}",
232
+ "hermes.logMsgUncaught": "\u6D88\u606F\u5904\u7406\u672A\u6355\u83B7\u5F02\u5E38: {message}",
233
+ "hermes.logDisconnected": "\u4E0E\u4E2D\u7EE7\u65AD\u5F00\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE\u2026",
234
+ "hermes.logPairCode": "\u751F\u6210\u914D\u5BF9\u7801: {code}",
235
+ "hermes.logUnhandledType": "\u672A\u5904\u7406\u7684\u6D88\u606F\u7C7B\u578B: {type}",
236
+ "hermes.logHandleFailed": "\u5904\u7406 {type} \u5931\u8D25: {message}",
237
+ "hermes.logClaimed": "\u5DF2\u7ED1\u5B9A\u5230\u624B\u673A\u8D26\u53F7\uFF0C\u4E4B\u540E\u624B\u673A\u4ECE\u300C\u6211\u7684\u7535\u8111\u300D\u76F4\u63A5\u8FDE\u63A5",
238
+ "hermes.logResetIdentity": "\u88AB\u8D26\u53F7\u89E3\u7ED1\uFF0C\u6B63\u5728\u91CD\u7F6E\u8EAB\u4EFD\u5E76\u91CD\u65B0\u751F\u6210\u914D\u5BF9\u7801\u2026",
239
+ "hermes.cmdNew": "\u65B0\u5EFA\u4F1A\u8BDD",
240
+ "hermes.cmdHelp": "\u663E\u793A\u5E2E\u52A9",
241
+ "hermes.newSessionTitle": "\u65B0\u4F1A\u8BDD",
242
+ "hermes.helpText": "\u652F\u6301\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u5EFA\u4F1A\u8BDD\n- /help \u663E\u793A\u5E2E\u52A9",
243
+ "hermes.errBusy": "\u8BE5\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
244
+ "hermes.errBadWorkspace": "\u8BE5\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528",
245
+ "hermes.logWorkspaceSwitched": "\u5207\u6362\u5DE5\u4F5C\u533A: {path}",
246
+ "hermes.errWorkspaceMissing": "\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728: {dir}",
247
+ "hermes.errStartFailed": "\u542F\u52A8\u5931\u8D25: {message}",
248
+ "hermes.msgStarted": "Hermes \u9002\u914D\u5668\u5DF2\u542F\u52A8\uFF08Ctrl+C \u9000\u51FA\uFF09",
249
+ "hermes.logAbortSent": "\u5DF2\u53D1\u9001\u4E2D\u6B62 (session={session})",
250
+ "hermes.logPromptFailed": "session.prompt \u5931\u8D25: {message}",
251
+ "hermes.logTurnError": "\u56DE\u5408\u51FA\u9519 (session={session}): {message}",
252
+ "hermes.logPairForced": "--pair\uFF1A\u5DF2\u5F3A\u5236\u7533\u8BF7\u914D\u5BF9\u7801\uFF08\u4EC5\u672C\u6B21\uFF09",
253
+ "hermes.pairingStillClaimed": "\u5DF2\u7ED1\u5B9A\u624B\u673A\u8D26\u53F7\uFF1A\u6B64\u914D\u5BF9\u7801\u4EC5\u7528\u4E8E\u540C\u8D26\u53F7\u65B0\u8BBE\u5907\u91CD\u65B0\u914D\u5BF9\uFF0C\u5F53\u524D\u8BBE\u5907\u53EF\u76F4\u63A5\u4ECE\u624B\u673A\u300C\u6211\u7684\u7535\u8111\u300D\u8FDE\u63A5",
254
+ "hermes.logPairNoRelay": "\u672A\u914D\u7F6E\u4E2D\u7EE7\u5730\u5740\uFF0C\u65E0\u6CD5\u7533\u8BF7\u914D\u5BF9\u7801",
255
+ "hermes.errSpawnHermes": "\u65E0\u6CD5\u542F\u52A8 Hermes\uFF08{bin}\uFF09\uFF1A\u8BF7\u786E\u8BA4\u5DF2\u5B89\u88C5\uFF08{err}\uFF09",
256
+ "hermes.errHermesExit": "hermes \u9000\u51FA({code}): {err}",
257
+ "hermes.logSessionUpdated": "\u4F1A\u8BDD\u5DF2\u66F4\u65B0 (session={session})",
258
+ "hermes.errNoInject": "\u624B\u673A\u6D88\u606F\u6CE8\u5165\u4E0D\u53EF\u7528\uFF08\u5F53\u524D\u4F1A\u8BDD\u975E\u4EA4\u4E92\u5F0F\u6216\u8FDB\u7A0B\u672A\u5C31\u7EEA\uFF09",
259
+ "hermes.pairNoRelay": "\u65E0\u6CD5\u8FDE\u63A5\u4E2D\u7EE7\uFF08relay \u4E0D\u53EF\u8FBE\u6216 websockets \u7F3A\u5931\uFF09",
260
+ "hermes.pairTimeout": "\u7533\u8BF7\u914D\u5BF9\u7801\u8D85\u65F6\uFF08\u4E2D\u7EE7\u672A\u54CD\u5E94\uFF09",
261
+ "hermes.errToolPair": "tunnelbox_pair \u5931\u8D25: {err}",
262
+ "hermes.errToolStatus": "tunnelbox_status \u5931\u8D25: {err}",
263
+ "hermes.cliUsage": "\u7528\u6CD5: /tunnelbox <pair|status>\n pair \u5411\u4E2D\u7EE7\u7533\u8BF7\u624B\u673A\u914D\u5BF9\u7801\u5E76\u6253\u5370\n status \u663E\u793A\u4E2D\u7EE7/\u7ED1\u5B9A/\u8FDE\u63A5\u72B6\u6001"
232
264
  };
233
265
 
234
266
  // ../core/locales/zh-TW.json
@@ -266,30 +298,28 @@ var zh_TW_default = {
266
298
  "install.failConnect": "\uFF08\u672A\u80FD\u5373\u6642\u9023\u63A5\u4E2D\u7E7C\u5217\u5370\u914D\u5C0D\u8CC7\u8A0A\u2014\u2014\u4E2D\u7E7C\u7121\u6CD5\u9023\u7DDA\u6216\u76EE\u524D Node \u904E\u820A\u3002",
267
299
  "install.failConnectHint": "\u91CD\u555F opencode \u5F8C\u53EF\u7528 --print-logs \u67E5\u770B\u7D42\u7AEF QR Code\uFF0C\u6216\u662F\u5728 opencode \u5167\u8F38\u5165\u300C\u986F\u793A\u624B\u6A5F\u914D\u5C0D\u78BC\u300D\u6216 /pair\u3002\uFF09",
268
300
  "install.hintFresh": "\u63D0\u793A\uFF1A\u914D\u5C0D\u78BC\u70BA\u4E00\u6B21\u6027\uFF0C\u7D04 10 \u5206\u9418\u6709\u6548\uFF1B\u82E5\u7A0D\u5F8C\u624D\u555F\u52D5 opencode\uFF0C\u4EE5\u555F\u52D5\u6642\u7D42\u7AEF\u5217\u5370\u6216 /pair \u53D6\u5F97\u7684\u6700\u65B0\u914D\u5C0D\u8CC7\u8A0A\u70BA\u6E96\u3002",
269
- "install.linkLine": "\u914D\u5C0D\u9023\u7D50: {link}",
270
301
  "install.pluginInstalled": "\u5DF2\u5B89\u88DD\u5916\u639B: {path}",
271
- "install.qrUnavailable": "\uFF08QR Code \u7121\u6CD5\u986F\u793A\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u914D\u5C0D\u9023\u7D50\u6216\u914D\u5C0D\u78BC\uFF09",
302
+ "install.qrUnavailable": "\uFF08QR Code \u7121\u6CD5\u986F\u793A\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u914D\u5C0D\u78BC\uFF09",
272
303
  "install.qrcodeEnsure": "\u6B63\u5728\u5C07 qrcode \u5B89\u88DD\u5230 opencode \u8A2D\u5B9A\u76EE\u9304\u2026",
273
- "install.qrcodeFail": "qrcode \u5B89\u88DD\u5931\u6557\uFF08\u4E0D\u5F71\u97FF\u4F7F\u7528\uFF0CQR Code \u6703\u964D\u7D1A\u70BA\u9023\u7D50\uFF09: {err}",
304
+ "install.qrcodeFail": "qrcode \u5B89\u88DD\u5931\u6557\uFF08\u4E0D\u5F71\u97FF\u4F7F\u7528\uFF0C\u50C5\u986F\u793A\u914D\u5C0D\u78BC\uFF09: {err}",
274
305
  "install.relayError": "\u4E2D\u7E7C\u50B3\u56DE\u932F\u8AA4: {msg}",
275
- "install.scanHint": "\u624B\u6A5F\u958B\u555F tunnelbox App\u300C\u6383\u63CF\u914D\u5C0D\u300D\uFF0C\u6216\u4F7F\u7528\u76F8\u6A5F\u6383\u63CF\u4E0B\u65B9 QR Code \u5373\u53EF\u9023\u63A5\uFF1A",
306
+ "install.scanHint": "\u624B\u6A5F\u958B\u555F tunnelbox App\u300C\u6383\u63CF\u914D\u5C0D\u300D\uFF0C\u6383\u63CF\u4E0A\u65B9 QR Code \u5373\u53EF\u9023\u63A5\uFF1A",
276
307
  "pair.heading": "tunnelbox \u624B\u6A5F\u914D\u5C0D",
277
- "pair.howTo": "\u5728\u624B\u6A5F\u700F\u89BD\u5668\u958B\u555F\u9023\u7D50\uFF0C\u6216\u958B\u555F tunnelbox App \u8F38\u5165\u914D\u5C0D\u78BC\u3002",
308
+ "pair.howTo": "\u5728\u624B\u6A5F\u4E0A\u958B\u555F tunnelbox App\uFF0C\u7528\u300C\u6383\u63CF\u914D\u5C0D\u300D\u6383\u63CF\u4E0A\u65B9 QR Code\uFF0C\u6216\u624B\u52D5\u8F38\u5165\u914D\u5C0D\u78BC\u3002",
278
309
  "pair.oneTime": "\u914D\u5C0D\u78BC\u70BA\u4E00\u6B21\u6027\uFF0C\u4F7F\u7528\u5F8C\u5373\u5931\u6548\uFF1B\u5982\u9700\u65B0\u78BC\uFF0C\u53EF\u8981\u6C42\u300C\u91CD\u65B0\u6574\u7406\u914D\u5C0D\u78BC\u300D\u3002",
279
- "pair.promptBody": "\u8ACB\u5E6B\u6211\u67E5\u770B\u672C\u6A5F\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u8CC7\u8A0A\uFF1A\u986F\u793A\u914D\u5C0D\u78BC\u3001\u914D\u5C0D\u9023\u7D50\uFF0C\u4EE5\u53CA\u53EF\u4F9B\u6383\u78BC\u7684 QR Code\u3002QR Code \u8ACB\u653E\u5728\u7B49\u5BEC\u7A0B\u5F0F\u78BC\u5340\u584A\u5167\u4E26\u9010\u5B57\u539F\u6A23\u4FDD\u7559\uFF0C\u65B9\u4FBF\u6211\u7528\u624B\u6A5F\u6383\u63CF\u3002",
280
- "pair.promptDescription": "\u986F\u793A\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u7684\u914D\u5C0D\u78BC\u3001\u914D\u5C0D\u9023\u7D50\u8207\u6383\u78BC QR Code",
281
- "pair.scanIntro": "**\u6383\u78BC\u914D\u5C0D**\uFF1A\u624B\u6A5F\u958B\u555F tunnelbox App\u300C\u6383\u63CF\u914D\u5C0D\u300D\uFF0C\u6216\u4F7F\u7528\u76F8\u6A5F\u6383\u63CF\u4E0B\u65B9 QR Code \u5373\u53EF\u81EA\u52D5\u9023\u63A5\u3002",
310
+ "pair.promptBody": "\u8ACB\u5E6B\u6211\u67E5\u770B\u672C\u6A5F\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u8CC7\u8A0A\uFF1A\u986F\u793A\u914D\u5C0D\u78BC\u8207\u53EF\u4F9B\u6383\u78BC\u7684 QR Code\u3002QR Code \u8ACB\u653E\u5728\u7B49\u5BEC\u7A0B\u5F0F\u78BC\u5340\u584A\u5167\u4E26\u9010\u5B57\u539F\u6A23\u4FDD\u7559\uFF0C\u65B9\u4FBF\u6211\u7528\u624B\u6A5F\u6383\u63CF\u3002",
311
+ "pair.promptDescription": "\u986F\u793A\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u7684\u914D\u5C0D\u78BC\u8207\u6383\u78BC QR Code",
312
+ "pair.scanIntro": "**\u6383\u78BC\u914D\u5C0D**\uFF1A\u624B\u6A5F\u958B\u555F tunnelbox App\u300C\u6383\u63CF\u914D\u5C0D\u300D\uFF0C\u6383\u63CF\u4E0B\u65B9 QR Code \u5373\u53EF\u81EA\u52D5\u9023\u63A5\u3002",
282
313
  "perm.promptAuthorize": "opencode \u8ACB\u6C42\u6388\u6B0A",
283
314
  "perm.promptPatterns": "opencode \u8ACB\u6C42\u5B58\u53D6\uFF1A{list}",
284
315
  "perm.promptResource": "opencode \u8ACB\u6C42\u5B58\u53D6\u8CC7\u6E90\uFF1A{list}",
285
316
  "perm.promptTool": "opencode \u8ACB\u6C42\u57F7\u884C {tool}",
286
317
  "qr.codeLabel": "\u914D\u5C0D\u78BC",
287
318
  "qr.fileWritten": "\u914D\u5C0D\u8CC7\u8A0A\u5DF2\u5BEB\u5165: {path}",
288
- "qr.linkLabel": "\u9023\u7D50",
289
- "qr.openHint": "\u5728\u624B\u6A5F\u700F\u89BD\u5668\u958B\u555F\u9023\u7D50\uFF0C\u6216\u5728 App \u4E2D\u624B\u52D5\u8F38\u5165\u914D\u5C0D\u78BC\u3002",
319
+ "qr.openHint": "\u958B\u555F tunnelbox App\uFF0C\u7528\u300C\u6383\u63CF\u914D\u5C0D\u300D\u6383\u63CF\u4E0A\u65B9 QR Code\uFF0C\u6216\u624B\u52D5\u8F38\u5165\u914D\u5C0D\u78BC\u3002",
290
320
  "qr.titleNoType": "tunnelbox \u624B\u6A5F\u914D\u5C0D",
291
321
  "qr.titleWithType": "tunnelbox {type} \u624B\u6A5F\u914D\u5C0D",
292
- "qr.unavailable": "\uFF08\u672A\u5B89\u88DD qrcode\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u9023\u7D50\u6216\u914D\u5C0D\u78BC\uFF09",
322
+ "qr.unavailable": "\uFF08\u672A\u5B89\u88DD qrcode\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u914D\u5C0D\u78BC\uFF09",
293
323
  "claude.errBusy": "\u8A72\u6703\u8A71\u6B63\u5728\u7522\u751F\u4E2D\uFF0C\u8ACB\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
294
324
  "claude.errTurn": "\u7522\u751F\u51FA\u932F",
295
325
  "claude.pairingStillClaimed": "\u5DF2\u7D81\u5B9A\u624B\u6A5F\u5E33\u865F\uFF1A\u6B64\u914D\u5C0D\u78BC\u50C5\u4F9B\u540C\u5E33\u865F\u65B0\u88DD\u7F6E\u91CD\u65B0\u914D\u5C0D\uFF0C\u76EE\u524D\u88DD\u7F6E\u53EF\u76F4\u63A5\u5F9E\u624B\u6A5F\u300C\u6211\u7684\u96FB\u8166\u300D\u9023\u63A5",
@@ -357,7 +387,41 @@ var zh_TW_default = {
357
387
  "claude.errReadHistory": "\u8B80\u53D6\u6703\u8A71\u6B77\u53F2\u5931\u6557({id})",
358
388
  "setup.langSet": "\u5DF2\u8A2D\u5B9A\u57F7\u884C\u8A9E\u8A00",
359
389
  "setup.langHint": "\u91CD\u65B0\u555F\u52D5\u4ECB\u9762\u5361\u5F8C\u5C07\u4EE5\u8A72\u8A9E\u8A00\u8F38\u51FA\uFF08\u57F7\u884C\u6642\u53EF\u88AB TUNNELBOX_LANG \u8986\u5BEB\uFF09\u3002\u72C0\u614B\u6A94\uFF1A",
360
- "setup.langCurrent": "\u76EE\u524D\u57F7\u884C\u8A9E\u8A00"
390
+ "setup.langCurrent": "\u76EE\u524D\u57F7\u884C\u8A9E\u8A00",
391
+ "hermes.errNoRelay": "\u672A\u8A2D\u5B9A\u4E2D\u7E7C\u4F4D\u5740\uFF1A\u5EFA\u7F6E\u8ACB\u7528 --env \u6CE8\u5165\u9810\u8A2D\uFF0C\u57F7\u884C\u53EF\u7528 TUNNELBOX_RELAY_URL \u8986\u5BEB",
392
+ "hermes.logConnected": "\u5DF2\u9023\u7DDA\u4E2D\u7E7C {url}",
393
+ "hermes.logMsgUncaught": "\u8A0A\u606F\u8655\u7406\u672A\u6355\u7372\u4F8B\u5916: {message}",
394
+ "hermes.logDisconnected": "\u8207\u4E2D\u7E7C\u65B7\u7DDA\uFF0C\u6B63\u5728\u81EA\u52D5\u91CD\u65B0\u9023\u7DDA\u2026",
395
+ "hermes.logPairCode": "\u7522\u751F\u914D\u5C0D\u78BC: {code}",
396
+ "hermes.logUnhandledType": "\u672A\u8655\u7406\u7684\u8A0A\u606F\u985E\u578B: {type}",
397
+ "hermes.logHandleFailed": "\u8655\u7406 {type} \u5931\u6557: {message}",
398
+ "hermes.logClaimed": "\u5DF2\u7D81\u5B9A\u5230\u624B\u6A5F\u5E33\u865F\uFF0C\u4E4B\u5F8C\u624B\u6A5F\u5F9E\u300C\u6211\u7684\u96FB\u8166\u300D\u76F4\u63A5\u9023\u7DDA",
399
+ "hermes.logResetIdentity": "\u88AB\u5E33\u865F\u89E3\u7D81\uFF0C\u6B63\u5728\u91CD\u8A2D\u8EAB\u5206\u4E26\u91CD\u65B0\u7522\u751F\u914D\u5C0D\u78BC\u2026",
400
+ "hermes.cmdNew": "\u65B0\u589E\u6703\u8A71",
401
+ "hermes.cmdHelp": "\u986F\u793A\u8AAA\u660E",
402
+ "hermes.newSessionTitle": "\u65B0\u6703\u8A71",
403
+ "hermes.helpText": "\u652F\u63F4\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u589E\u6703\u8A71\n- /help \u986F\u793A\u8AAA\u660E",
404
+ "hermes.errBusy": "\u6B64\u6703\u8A71\u6B63\u5728\u7522\u751F\u4E2D\uFF0C\u8ACB\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
405
+ "hermes.errBadWorkspace": "\u6B64\u76EE\u9304\u4E0D\u5B58\u5728\u6216\u7121\u6CD5\u4F7F\u7528",
406
+ "hermes.logWorkspaceSwitched": "\u5207\u63DB\u5DE5\u4F5C\u5340: {path}",
407
+ "hermes.errWorkspaceMissing": "\u5DE5\u4F5C\u5340\u4E0D\u5B58\u5728: {dir}",
408
+ "hermes.errStartFailed": "\u555F\u52D5\u5931\u6557: {message}",
409
+ "hermes.msgStarted": "Hermes \u4ECB\u63A5\u5668\u5DF2\u555F\u52D5\uFF08Ctrl+C \u9000\u51FA\uFF09",
410
+ "hermes.logAbortSent": "\u5DF2\u50B3\u9001\u4E2D\u6B62 (session={session})",
411
+ "hermes.logPromptFailed": "session.prompt \u5931\u6557: {message}",
412
+ "hermes.logTurnError": "\u56DE\u5408\u51FA\u932F (session={session}): {message}",
413
+ "hermes.logPairForced": "--pair\uFF1A\u5DF2\u5F37\u5236\u7533\u8ACB\u914D\u5C0D\u78BC\uFF08\u50C5\u672C\u6B21\uFF09",
414
+ "hermes.pairingStillClaimed": "\u5DF2\u7D81\u5B9A\u624B\u6A5F\u5E33\u865F\uFF1A\u6B64\u914D\u5C0D\u78BC\u50C5\u4F9B\u540C\u5E33\u865F\u65B0\u88DD\u7F6E\u91CD\u65B0\u914D\u5C0D\uFF0C\u76EE\u524D\u88DD\u7F6E\u53EF\u76F4\u63A5\u5F9E\u624B\u6A5F\u300C\u6211\u7684\u96FB\u8166\u300D\u9023\u7DDA",
415
+ "hermes.logPairNoRelay": "\u672A\u8A2D\u5B9A\u4E2D\u7E7C\u4F4D\u5740\uFF0C\u7121\u6CD5\u7533\u8ACB\u914D\u5C0D\u78BC",
416
+ "hermes.errSpawnHermes": "\u7121\u6CD5\u555F\u52D5 Hermes\uFF08{bin}\uFF09\uFF1A\u8ACB\u78BA\u8A8D\u5DF2\u5B89\u88DD\uFF08{err}\uFF09",
417
+ "hermes.errHermesExit": "hermes \u9000\u51FA({code}): {err}",
418
+ "hermes.logSessionUpdated": "\u6703\u8A71\u5DF2\u66F4\u65B0 (session={session})",
419
+ "hermes.errNoInject": "\u624B\u6A5F\u8A0A\u606F\u6CE8\u5165\u4E0D\u53EF\u7528\uFF08\u76EE\u524D\u5DE5\u4F5C\u968E\u6BB5\u975E\u4E92\u52D5\u5F0F\u6216\u8655\u7406\u7A0B\u5E8F\u672A\u5C31\u7DD2\uFF09",
420
+ "hermes.pairNoRelay": "\u7121\u6CD5\u9023\u7DDA\u4E2D\u7E7C\uFF08relay \u4E0D\u53EF\u9054\u6216 websockets \u7F3A\u5931\uFF09",
421
+ "hermes.pairTimeout": "\u7533\u8ACB\u914D\u5C0D\u78BC\u903E\u6642\uFF08\u4E2D\u7E7C\u672A\u56DE\u61C9\uFF09",
422
+ "hermes.errToolPair": "tunnelbox_pair \u5931\u6557: {err}",
423
+ "hermes.errToolStatus": "tunnelbox_status \u5931\u6557: {err}",
424
+ "hermes.cliUsage": "\u7528\u6CD5: /tunnelbox <pair|status>\n pair \u5411\u4E2D\u7E7C\u7533\u8ACB\u624B\u6A5F\u914D\u5C0D\u78BC\u4E26\u5217\u5370\n status \u986F\u793A\u4E2D\u7E7C/\u7D81\u5B9A/\u9023\u7DDA\u72C0\u614B"
361
425
  };
362
426
 
363
427
  // ../core/locales/en-US.json
@@ -395,30 +459,28 @@ var en_US_default = {
395
459
  "install.failConnect": "(Could not connect to the relay to print pairing info \u2014 the relay may be unreachable or the Node version is too old.",
396
460
  "install.failConnectHint": "After restarting opencode, check the terminal QR code with --print-logs, or type \u201Cshow phone pairing code\u201D / /pair inside opencode.)",
397
461
  "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.",
398
- "install.linkLine": "Pairing link: {link}",
399
462
  "install.pluginInstalled": "Installed plugin: {path}",
400
- "install.qrUnavailable": "(QR rendering unavailable \u2014 use the pairing link or code above)",
463
+ "install.qrUnavailable": "(QR rendering unavailable \u2014 use the pairing code above)",
401
464
  "install.qrcodeEnsure": "Installing qrcode into the opencode config directory\u2026",
402
- "install.qrcodeFail": "qrcode installation failed (not critical \u2014 the QR code degrades to a link): {err}",
465
+ "install.qrcodeFail": "qrcode installation failed (not critical \u2014 only the pairing code is shown): {err}",
403
466
  "install.relayError": "Relay returned an error: {msg}",
404
- "install.scanHint": "Open tunnelbox on your phone, tap \u201CScan to pair\u201D, or point your camera at the QR code below to connect:",
467
+ "install.scanHint": "Open tunnelbox on your phone, tap \u201CScan to pair\u201D, and scan the QR code above to connect:",
405
468
  "pair.heading": "tunnelbox phone pairing",
406
- "pair.howTo": "Open the link in your phone browser, or enter the pairing code in the tunnelbox app.",
469
+ "pair.howTo": "Open the tunnelbox app on your phone and scan the QR code above with \u201CScan to pair\u201D, or enter the pairing code manually.",
407
470
  "pair.oneTime": "The pairing code is single-use and invalidates after it is claimed; ask to \u201Crefresh the pairing code\u201D for a new one.",
408
- "pair.promptBody": "Please show this computer's phone pairing info: the pairing code, the pairing link, 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.",
409
- "pair.promptDescription": "Show the phone pairing code, pairing link and scan-able QR code",
410
- "pair.scanIntro": "**Pair by scanning**: open the tunnelbox app on your phone (\u201CScan to pair\u201D) or use your camera to scan the QR code below and connect automatically.",
471
+ "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.",
472
+ "pair.promptDescription": "Show the phone pairing code and scan-able QR code",
473
+ "pair.scanIntro": "**Pair by scanning**: open the tunnelbox app on your phone, tap \u201CScan to pair\u201D, and scan the QR code below to connect automatically.",
411
474
  "perm.promptAuthorize": "opencode requests authorization",
412
475
  "perm.promptPatterns": "opencode requests access to: {list}",
413
476
  "perm.promptResource": "opencode requests access to resources: {list}",
414
477
  "perm.promptTool": "opencode requests to run {tool}",
415
478
  "qr.codeLabel": "Pairing code",
416
479
  "qr.fileWritten": "Pairing info written to: {path}",
417
- "qr.linkLabel": "Link",
418
- "qr.openHint": "Open the link in your phone browser, or enter the pairing code manually in the app.",
480
+ "qr.openHint": "Open the tunnelbox app on your phone and scan the QR code above, or enter the pairing code manually in the app.",
419
481
  "qr.titleNoType": "tunnelbox phone pairing",
420
482
  "qr.titleWithType": "tunnelbox {type} phone pairing",
421
- "qr.unavailable": "(qrcode not installed \u2014 use the link or pairing code above)",
483
+ "qr.unavailable": "(qrcode not installed \u2014 use the pairing code above)",
422
484
  "claude.errBusy": "This session is still running; wait for it to finish or stop it first",
423
485
  "claude.errTurn": "generation error",
424
486
  "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",
@@ -486,7 +548,41 @@ var en_US_default = {
486
548
  "claude.errReadHistory": "Failed to read session history ({id})",
487
549
  "setup.langSet": "Runtime language set to",
488
550
  "setup.langHint": "The adapter will output in this language after restart (runtime TUNNELBOX_LANG can override). State file:",
489
- "setup.langCurrent": "Current runtime language"
551
+ "setup.langCurrent": "Current runtime language",
552
+ "hermes.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
553
+ "hermes.logConnected": "Connected to relay {url}",
554
+ "hermes.logMsgUncaught": "Uncaught exception while handling message: {message}",
555
+ "hermes.logDisconnected": "Disconnected from relay, reconnecting automatically\u2026",
556
+ "hermes.logPairCode": "Generated pairing code: {code}",
557
+ "hermes.logUnhandledType": "Unhandled message type: {type}",
558
+ "hermes.logHandleFailed": "Failed to handle {type}: {message}",
559
+ "hermes.logClaimed": "Bound to your phone account. From now on the phone connects directly from My Computers",
560
+ "hermes.logResetIdentity": "Unbound from the account; resetting identity and generating a new pairing code\u2026",
561
+ "hermes.cmdNew": "New session",
562
+ "hermes.cmdHelp": "Show help",
563
+ "hermes.newSessionTitle": "New session",
564
+ "hermes.helpText": "Supported commands:\n- /new new session\n- /help show help",
565
+ "hermes.errBusy": "This session is still running; wait for it to finish or stop it first",
566
+ "hermes.errBadWorkspace": "Directory does not exist or is unusable",
567
+ "hermes.logWorkspaceSwitched": "Switched workspace: {path}",
568
+ "hermes.errWorkspaceMissing": "Workspace does not exist: {dir}",
569
+ "hermes.errStartFailed": "Failed to start: {message}",
570
+ "hermes.msgStarted": "Hermes adapter started (Ctrl+C to quit)",
571
+ "hermes.logAbortSent": "Abort sent (session={session})",
572
+ "hermes.logPromptFailed": "session.prompt failed: {message}",
573
+ "hermes.logTurnError": "Turn error (session={session}): {message}",
574
+ "hermes.logPairForced": "--pair: forcing a pairing code request (this run only)",
575
+ "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",
576
+ "hermes.logPairNoRelay": "Cannot request a pairing code: no relay URL configured",
577
+ "hermes.errSpawnHermes": "Cannot start Hermes ({bin}): please confirm it is installed ({err})",
578
+ "hermes.errHermesExit": "hermes exited ({code}): {err}",
579
+ "hermes.logSessionUpdated": "Session updated (session={session})",
580
+ "hermes.errNoInject": "Phone message injection unavailable (session not interactive or process not ready)",
581
+ "hermes.pairNoRelay": "Cannot reach the relay (relay unreachable or websockets missing)",
582
+ "hermes.pairTimeout": "Timed out requesting a pairing code (relay did not respond)",
583
+ "hermes.errToolPair": "tunnelbox_pair failed: {err}",
584
+ "hermes.errToolStatus": "tunnelbox_status failed: {err}",
585
+ "hermes.cliUsage": "Usage: /tunnelbox <pair|status>\n pair request and print a phone pairing code\n status show relay/binding/connection status"
490
586
  };
491
587
 
492
588
  // ../core/locales/ja-JP.json
@@ -524,30 +620,28 @@ var ja_JP_default = {
524
620
  "install.failConnect": "\uFF08\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u51FA\u529B\u3059\u308B\u305F\u3081\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F \u2014 \u30EA\u30EC\u30FC\u306B\u5230\u9054\u3067\u304D\u306A\u3044\u304B Node \u304C\u53E4\u3059\u304E\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002",
525
621
  "install.failConnectHint": "opencode \u3092\u518D\u8D77\u52D5\u5F8C\u3001--print-logs \u3067\u30BF\u30FC\u30DF\u30CA\u30EB\u306E QR \u30B3\u30FC\u30C9\u3092\u78BA\u8A8D\u3059\u308B\u304B\u3001opencode \u5185\u3067\u300C\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u8868\u793A\u300D\u307E\u305F\u306F /pair \u3068\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\uFF09",
526
622
  "install.hintFresh": "\u6CE8\u610F\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306F\u4E00\u5EA6\u304D\u308A\u3067\u3001\u7D04 10 \u5206\u9593\u6709\u52B9\u3067\u3059\u3002\u5F8C\u304B\u3089 opencode \u3092\u8D77\u52D5\u3059\u308B\u5834\u5408\u306F\u3001\u8D77\u52D5\u6642\u306B\u8868\u793A\u3055\u308C\u308B\u304B /pair \u3067\u53D6\u5F97\u3057\u305F\u6700\u65B0\u60C5\u5831\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
527
- "install.linkLine": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30EA\u30F3\u30AF: {link}",
528
623
  "install.pluginInstalled": "\u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB: {path}",
529
- "install.qrUnavailable": "\uFF08QR \u30B3\u30FC\u30C9\u3092\u8868\u793A\u3067\u304D\u307E\u305B\u3093 \u2014 \u4E0A\u8A18\u306E\u30EA\u30F3\u30AF\u307E\u305F\u306F\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
624
+ "install.qrUnavailable": "\uFF08QR \u30B3\u30FC\u30C9\u3092\u8868\u793A\u3067\u304D\u307E\u305B\u3093 \u2014 \u4E0A\u8A18\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
530
625
  "install.qrcodeEnsure": "qrcode \u3092 opencode \u8A2D\u5B9A\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u3044\u307E\u3059\u2026",
531
- "install.qrcodeFail": "qrcode \u306E\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u4F7F\u7528\u306B\u306F\u5F71\u97FF\u305B\u305A\u3001QR \u306F\u30EA\u30F3\u30AF\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3057\u307E\u3059\uFF09: {err}",
626
+ "install.qrcodeFail": "qrcode \u306E\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u4F7F\u7528\u306B\u306F\u5F71\u97FF\u305B\u305A\u3001\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306E\u307F\u8868\u793A\u3055\u308C\u307E\u3059\uFF09: {err}",
532
627
  "install.relayError": "\u30EA\u30EC\u30FC\u304C\u30A8\u30E9\u30FC\u3092\u8FD4\u3057\u307E\u3057\u305F: {msg}",
533
- "install.scanHint": "\u30B9\u30DE\u30DB\u3067 tunnelbox App\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3092\u958B\u304F\u304B\u3001\u30AB\u30E1\u30E9\u3067\u4E0B\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u63A5\u7D9A\uFF1A",
628
+ "install.scanHint": "\u30B9\u30DE\u30DB\u3067 tunnelbox App\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3092\u958B\u304D\u3001\u4E0A\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u63A5\u7D9A\uFF1A",
534
629
  "pair.heading": "tunnelbox \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
535
- "pair.howTo": "\u30B9\u30DE\u30DB\u306E\u30D6\u30E9\u30A6\u30B6\u3067\u30EA\u30F3\u30AF\u3092\u958B\u304F\u304B\u3001tunnelbox App \u306B\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
630
+ "pair.howTo": "\u30B9\u30DE\u30DB\u3067 tunnelbox App \u3092\u958B\u304D\u3001\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3067\u4E0A\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u304B\u3001\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u624B\u52D5\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
536
631
  "pair.oneTime": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306F\u4E00\u5EA6\u304D\u308A\u3067\u3001\u4F7F\u7528\u5F8C\u306F\u7121\u52B9\u306B\u306A\u308A\u307E\u3059\u3002\u65B0\u3057\u3044\u30B3\u30FC\u30C9\u304C\u5FC5\u8981\u306A\u5834\u5408\u306F\u300C\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u66F4\u65B0\u300D\u3068\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
537
- "pair.promptBody": "\u3053\u306E PC \u306E\u30B9\u30DE\u30DB\u9060\u9694\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u3066\u304F\u3060\u3055\u3044\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3001\u30DA\u30A2\u30EA\u30F3\u30B0\u30EA\u30F3\u30AF\u3001\u304A\u3088\u3073\u30B9\u30AD\u30E3\u30F3\u3067\u304D\u308B QR \u30B3\u30FC\u30C9\u3002QR \u30B3\u30FC\u30C9\u306F\u7B49\u5E45\u30B3\u30FC\u30C9\u30D6\u30ED\u30C3\u30AF\u306B\u5165\u308C\u30011 \u6587\u5B57\u3082\u5909\u3048\u305A\u305D\u306E\u307E\u307E\u51FA\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30B9\u30DE\u30DB\u3067\u30B9\u30AD\u30E3\u30F3\u3067\u304D\u308B\u3088\u3046\u306B\u3059\u308B\u305F\u3081\u3067\u3059\u3002",
538
- "pair.promptDescription": "\u30B9\u30DE\u30DB\u9060\u9694\u30DA\u30A2\u30EA\u30F3\u30B0\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u30FB\u30EA\u30F3\u30AF\u30FB\u30B9\u30AD\u30E3\u30F3\u7528 QR \u30B3\u30FC\u30C9\u3092\u8868\u793A",
539
- "pair.scanIntro": "**\u30B9\u30AD\u30E3\u30F3\u3067\u30DA\u30A2\u30EA\u30F3\u30B0**\uFF1A\u30B9\u30DE\u30DB\u3067 tunnelbox App\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3092\u958B\u304F\u304B\u3001\u30AB\u30E1\u30E9\u3067\u4E0B\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u3068\u81EA\u52D5\u7684\u306B\u63A5\u7D9A\u3055\u308C\u307E\u3059\u3002",
632
+ "pair.promptBody": "\u3053\u306E PC \u306E\u30B9\u30DE\u30DB\u9060\u9694\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u3066\u304F\u3060\u3055\u3044\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3068\u3001\u30B9\u30AD\u30E3\u30F3\u3067\u304D\u308B QR \u30B3\u30FC\u30C9\u3002QR \u30B3\u30FC\u30C9\u306F\u7B49\u5E45\u30B3\u30FC\u30C9\u30D6\u30ED\u30C3\u30AF\u306B\u5165\u308C\u30011 \u6587\u5B57\u3082\u5909\u3048\u305A\u305D\u306E\u307E\u307E\u51FA\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30B9\u30DE\u30DB\u3067\u30B9\u30AD\u30E3\u30F3\u3067\u304D\u308B\u3088\u3046\u306B\u3059\u308B\u305F\u3081\u3067\u3059\u3002",
633
+ "pair.promptDescription": "\u30B9\u30DE\u30DB\u9060\u9694\u30DA\u30A2\u30EA\u30F3\u30B0\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u30FB\u30B9\u30AD\u30E3\u30F3\u7528 QR \u30B3\u30FC\u30C9\u3092\u8868\u793A",
634
+ "pair.scanIntro": "**\u30B9\u30AD\u30E3\u30F3\u3067\u30DA\u30A2\u30EA\u30F3\u30B0**\uFF1A\u30B9\u30DE\u30DB\u3067 tunnelbox App\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3092\u958B\u304D\u3001\u4E0B\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u3068\u81EA\u52D5\u7684\u306B\u63A5\u7D9A\u3055\u308C\u307E\u3059\u3002",
540
635
  "perm.promptAuthorize": "opencode \u304C\u8A8D\u53EF\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
541
636
  "perm.promptPatterns": "opencode \u304C\u30A2\u30AF\u30BB\u30B9\u3092\u8981\u6C42: {list}",
542
637
  "perm.promptResource": "opencode \u304C\u30EA\u30BD\u30FC\u30B9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8981\u6C42: {list}",
543
638
  "perm.promptTool": "opencode \u304C {tool} \u306E\u5B9F\u884C\u3092\u8981\u6C42",
544
639
  "qr.codeLabel": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9",
545
640
  "qr.fileWritten": "\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u66F8\u304D\u8FBC\u307F\u307E\u3057\u305F: {path}",
546
- "qr.linkLabel": "\u30EA\u30F3\u30AF",
547
- "qr.openHint": "\u30B9\u30DE\u30DB\u306E\u30D6\u30E9\u30A6\u30B6\u3067\u30EA\u30F3\u30AF\u3092\u958B\u304F\u304B\u3001App \u3067\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u624B\u52D5\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
641
+ "qr.openHint": "tunnelbox App \u3092\u958B\u304D\u3001\u4E0A\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u304B\u3001App \u3067\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u624B\u52D5\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
548
642
  "qr.titleNoType": "tunnelbox \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
549
643
  "qr.titleWithType": "tunnelbox {type} \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
550
- "qr.unavailable": "\uFF08qrcode \u304C\u672A\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB \u2014 \u4E0A\u8A18\u306E\u30EA\u30F3\u30AF\u307E\u305F\u306F\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
644
+ "qr.unavailable": "\uFF08qrcode \u304C\u672A\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB \u2014 \u4E0A\u8A18\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
551
645
  "claude.errBusy": "\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u5B9F\u884C\u4E2D\u3067\u3059\u3002\u5B8C\u4E86\u3059\u308B\u307E\u3067\u304A\u5F85\u3061\u3044\u305F\u3060\u304F\u304B\u3001\u5148\u306B\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044",
552
646
  "claude.errTurn": "\u751F\u6210\u30A8\u30E9\u30FC",
553
647
  "claude.pairingStillClaimed": "\u3059\u3067\u306B\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u4ED8\u3051\u6E08\u307F\u3067\u3059\u3002\u3053\u306E\u30B3\u30FC\u30C9\u306F\u540C\u3058\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u65B0\u3057\u3044\u7AEF\u672B\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u5C02\u7528\u3067\u3059\u3002\u73FE\u5728\u306E\u7AEF\u672B\u306F\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3067\u304D\u307E\u3059",
@@ -615,7 +709,41 @@ var ja_JP_default = {
615
709
  "claude.errReadHistory": "\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557\uFF08{id}\uFF09",
616
710
  "setup.langSet": "\u5B9F\u884C\u8A00\u8A9E\u3092\u8A2D\u5B9A\u3057\u307E\u3057\u305F",
617
711
  "setup.langHint": "\u518D\u8D77\u52D5\u5F8C\u306B\u3053\u306E\u8A00\u8A9E\u3067\u51FA\u529B\u3057\u307E\u3059\uFF08\u5B9F\u884C\u6642\u306F TUNNELBOX_LANG \u3067\u4E0A\u66F8\u304D\u53EF\u80FD\uFF09\u3002\u72B6\u614B\u30D5\u30A1\u30A4\u30EB\uFF1A",
618
- "setup.langCurrent": "\u73FE\u5728\u306E\u5B9F\u884C\u8A00\u8A9E"
712
+ "setup.langCurrent": "\u73FE\u5728\u306E\u5B9F\u884C\u8A00\u8A9E",
713
+ "hermes.errNoRelay": "\u30EA\u30EC\u30FCURL\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF1A--env \u3067\u30C7\u30D5\u30A9\u30EB\u30C8\u3092\u6CE8\u5165\u3001\u5B9F\u884C\u6642\u306F TUNNELBOX_RELAY_URL \u3067\u4E0A\u66F8\u304D\u3057\u3066\u304F\u3060\u3055\u3044",
714
+ "hermes.logConnected": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F {url}",
715
+ "hermes.logMsgUncaught": "\u30E1\u30C3\u30BB\u30FC\u30B8\u51E6\u7406\u4E2D\u306E\u672A\u6355\u6349\u4F8B\u5916: {message}",
716
+ "hermes.logDisconnected": "\u30EA\u30EC\u30FC\u304B\u3089\u5207\u65AD\u3001\u81EA\u52D5\u518D\u63A5\u7D9A\u4E2D\u2026",
717
+ "hermes.logPairCode": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210: {code}",
718
+ "hermes.logUnhandledType": "\u672A\u51E6\u7406\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7: {type}",
719
+ "hermes.logHandleFailed": "{type} \u306E\u51E6\u7406\u306B\u5931\u6557: {message}",
720
+ "hermes.logClaimed": "\u30B9\u30DE\u30DB\u306E\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u30D0\u30A4\u30F3\u30C9\u3057\u307E\u3057\u305F\u3002\u4EE5\u5F8C\u306F\u30B9\u30DE\u30DB\u306E\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3057\u307E\u3059",
721
+ "hermes.logResetIdentity": "\u30A2\u30AB\u30A6\u30F3\u30C8\u304B\u3089\u30D0\u30A4\u30F3\u30C9\u89E3\u9664\u3001ID\u3092\u30EA\u30BB\u30C3\u30C8\u3057\u3066\u65B0\u3057\u3044\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210\u4E2D\u2026",
722
+ "hermes.cmdNew": "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3",
723
+ "hermes.cmdHelp": "\u30D8\u30EB\u30D7\u3092\u8868\u793A",
724
+ "hermes.newSessionTitle": "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3",
725
+ "hermes.helpText": "\u30B5\u30DD\u30FC\u30C8\u30B3\u30DE\u30F3\u30C9\uFF1A\n- /new \u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3\n- /help \u30D8\u30EB\u30D7\u3092\u8868\u793A",
726
+ "hermes.errBusy": "\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u751F\u6210\u4E2D\u3067\u3059\u3002\u5B8C\u4E86\u3092\u5F85\u3064\u304B\u3001\u5148\u306B\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044",
727
+ "hermes.errBadWorkspace": "\u3053\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306F\u5B58\u5728\u3057\u306A\u3044\u304B\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093",
728
+ "hermes.logWorkspaceSwitched": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u5207\u66FF: {path}",
729
+ "hermes.errWorkspaceMissing": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093: {dir}",
730
+ "hermes.errStartFailed": "\u8D77\u52D5\u306B\u5931\u6557: {message}",
731
+ "hermes.msgStarted": "Hermes \u30A2\u30C0\u30D7\u30BF\u3092\u8D77\u52D5\u3057\u307E\u3057\u305F\uFF08Ctrl+C \u3067\u7D42\u4E86\uFF09",
732
+ "hermes.logAbortSent": "\u4E2D\u6B62\u3092\u9001\u4FE1 (session={session})",
733
+ "hermes.logPromptFailed": "session.prompt \u306B\u5931\u6557: {message}",
734
+ "hermes.logTurnError": "\u30BF\u30FC\u30F3\u30A8\u30E9\u30FC (session={session}): {message}",
735
+ "hermes.logPairForced": "--pair\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u5F37\u5236\u53D6\u5F97\uFF08\u4ECA\u56DE\u306E\u307F\uFF09",
736
+ "hermes.pairingStillClaimed": "\u30B9\u30DE\u30DB\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u30D0\u30A4\u30F3\u30C9\u6E08\u307F\uFF1A\u3053\u306E\u30B3\u30FC\u30C9\u306F\u540C\u30A2\u30AB\u30A6\u30F3\u30C8\u306E\u65B0\u30C7\u30D0\u30A4\u30B9\u518D\u30DA\u30A2\u30EA\u30F3\u30B0\u7528\u3067\u3059\u3002\u73FE\u5728\u306E\u30C7\u30D0\u30A4\u30B9\u306F\u30B9\u30DE\u30DB\u306E\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3067\u304D\u307E\u3059",
737
+ "hermes.logPairNoRelay": "\u30EA\u30EC\u30FCURL\u304C\u672A\u8A2D\u5B9A\u306E\u305F\u3081\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093",
738
+ "hermes.errSpawnHermes": "Hermes\uFF08{bin}\uFF09\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\uFF1A\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08{err}\uFF09",
739
+ "hermes.errHermesExit": "hermes \u7D42\u4E86({code}): {err}",
740
+ "hermes.logSessionUpdated": "\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u66F4\u65B0 (session={session})",
741
+ "hermes.errNoInject": "\u30B9\u30DE\u30DB\u304B\u3089\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u633F\u5165\u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093\uFF08\u975E\u5BFE\u8A71\u30BB\u30C3\u30B7\u30E7\u30F3\u307E\u305F\u306F\u30D7\u30ED\u30BB\u30B9\u672A\u6E96\u5099\uFF09",
742
+ "hermes.pairNoRelay": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\uFF08\u30EA\u30EC\u30FC\u5230\u9054\u4E0D\u80FD\u307E\u305F\u306F websockets \u6B20\u843D\uFF09",
743
+ "hermes.pairTimeout": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u8981\u6C42\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF08\u30EA\u30EC\u30FC\u672A\u5FDC\u7B54\uFF09",
744
+ "hermes.errToolPair": "tunnelbox_pair \u5931\u6557: {err}",
745
+ "hermes.errToolStatus": "tunnelbox_status \u5931\u6557: {err}",
746
+ "hermes.cliUsage": "\u4F7F\u7528\u65B9\u6CD5: /tunnelbox <pair|status>\n pair \u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u53D6\u5F97\u3057\u3066\u8868\u793A\n status \u30EA\u30EC\u30FC/\u30D0\u30A4\u30F3\u30C9/\u63A5\u7D9A\u72B6\u614B\u3092\u8868\u793A"
619
747
  };
620
748
 
621
749
  // ../core/locales/ko-KR.json
@@ -653,30 +781,28 @@ var ko_KR_default = {
653
781
  "install.failConnect": "(\uD398\uC5B4\uB9C1 \uC815\uBCF4\uB97C \uCD9C\uB825\uD558\uB824\uACE0 \uB9B4\uB808\uC774\uC5D0 \uC989\uC2DC \uC5F0\uACB0\uD558\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uAC70\uB098 Node \uBC84\uC804\uC774 \uB108\uBB34 \uC624\uB798\uB410\uC2B5\uB2C8\uB2E4.",
654
782
  "install.failConnectHint": "opencode\uB97C \uB2E4\uC2DC \uC2DC\uC791\uD55C \uB4A4 --print-logs\uB85C \uD130\uBBF8\uB110 QR \uCF54\uB4DC\uB97C \uD655\uC778\uD558\uAC70\uB098, opencode \uC548\uC5D0\uC11C \u201C\uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uD45C\uC2DC\u201D \uB610\uB294 /pair\uB97C \uC785\uB825\uD558\uC138\uC694.)",
655
783
  "install.hintFresh": "\uCC38\uACE0: \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB294 \uC77C\uD68C\uC6A9\uC774\uBA70 \uC57D 10\uBD84\uAC04 \uC720\uD6A8\uD569\uB2C8\uB2E4. \uB098\uC911\uC5D0 opencode\uB97C \uC2DC\uC791\uD55C\uB2E4\uBA74 \uC2DC\uC791 \uC2DC \uCD9C\uB825\uB418\uAC70\uB098 /pair\uB85C \uBC1B\uC740 \uCD5C\uC2E0 \uC815\uBCF4\uB97C \uC0AC\uC6A9\uD558\uC138\uC694.",
656
- "install.linkLine": "\uD398\uC5B4\uB9C1 \uB9C1\uD06C: {link}",
657
784
  "install.pluginInstalled": "\uD50C\uB7EC\uADF8\uC778 \uC124\uCE58\uB428: {path}",
658
- "install.qrUnavailable": "(QR \uCF54\uB4DC\uB97C \uD45C\uC2DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC704\uC758 \uB9C1\uD06C \uB610\uB294 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694)",
785
+ "install.qrUnavailable": "(QR \uCF54\uB4DC\uB97C \uD45C\uC2DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC704\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694)",
659
786
  "install.qrcodeEnsure": "qrcode\uB97C opencode \uC124\uC815 \uB514\uB809\uD130\uB9AC\uC5D0 \uC124\uCE58\uD558\uB294 \uC911\u2026",
660
- "install.qrcodeFail": "qrcode \uC124\uCE58 \uC2E4\uD328(\uC0AC\uC6A9\uC5D0\uB294 \uC601\uD5A5\uC774 \uC5C6\uC73C\uBA70 QR\uC740 \uB9C1\uD06C\uB85C \uB300\uCCB4\uB429\uB2C8\uB2E4): {err}",
787
+ "install.qrcodeFail": "qrcode \uC124\uCE58 \uC2E4\uD328(\uC0AC\uC6A9\uC5D0\uB294 \uC601\uD5A5\uC774 \uC5C6\uC73C\uBA70 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB9CC \uD45C\uC2DC\uB429\uB2C8\uB2E4): {err}",
661
788
  "install.relayError": "\uB9B4\uB808\uC774 \uC624\uB958 \uC751\uB2F5: {msg}",
662
- "install.scanHint": "\uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uC744 \uC5F4\uAC70\uB098 \uCE74\uBA54\uB77C\uB85C \uC544\uB798 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\uD558\uC138\uC694:",
789
+ "install.scanHint": "\uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uC744 \uC5F4\uACE0 \uC704 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\uD558\uC138\uC694:",
663
790
  "pair.heading": "tunnelbox \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
664
- "pair.howTo": "\uD734\uB300\uD3F0 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB9C1\uD06C\uB97C \uC5F4\uAC70\uB098 tunnelbox \uC571\uC5D0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC785\uB825\uD558\uC138\uC694.",
791
+ "pair.howTo": "\uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571\uC744 \uC5F4\uACE0 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uB85C \uC704 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uAC70\uB098 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC785\uB825\uD558\uC138\uC694.",
665
792
  "pair.oneTime": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB294 \uC77C\uD68C\uC6A9\uC774\uBA70 \uC0AC\uC6A9 \uD6C4\uC5D0\uB294 \uB9CC\uB8CC\uB429\uB2C8\uB2E4. \uC0C8 \uCF54\uB4DC\uAC00 \uD544\uC694\uD558\uBA74 \u201C\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0C8\uB85C\uACE0\uCE68\u201D\uC744 \uC694\uCCAD\uD558\uC138\uC694.",
666
- "pair.promptBody": "\uC774 PC\uC758 \uD734\uB300\uD3F0 \uC6D0\uACA9 \uD398\uC5B4\uB9C1 \uC815\uBCF4\uB97C \uBCF4\uC5EC\uC8FC\uC138\uC694: \uD398\uC5B4\uB9C1 \uCF54\uB4DC, \uD398\uC5B4\uB9C1 \uB9C1\uD06C, \uADF8\uB9AC\uACE0 \uC2A4\uCE94\uD560 \uC218 \uC788\uB294 QR \uCF54\uB4DC. QR \uCF54\uB4DC\uB294 \uACE0\uC815\uD3ED \uCF54\uB4DC \uBE14\uB85D\uC5D0 \uB123\uACE0 \uD55C \uAE00\uC790\uB3C4 \uBC14\uAFB8\uC9C0 \uB9D0\uACE0 \uADF8\uB300\uB85C \uD45C\uC2DC\uD574 \uC8FC\uC138\uC694. \uD734\uB300\uD3F0\uC73C\uB85C \uC2A4\uCE94\uD560 \uC218 \uC788\uB3C4\uB85D \uD558\uAE30 \uC704\uD568\uC785\uB2C8\uB2E4.",
667
- "pair.promptDescription": "\uD734\uB300\uD3F0 \uC6D0\uACA9 \uD398\uC5B4\uB9C1\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\xB7\uB9C1\uD06C\xB7\uC2A4\uCE94\uC6A9 QR \uCF54\uB4DC \uD45C\uC2DC",
668
- "pair.scanIntro": "**\uC2A4\uCE94\uC73C\uB85C \uC5F0\uACB0**: \uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uC744 \uC5F4\uAC70\uB098 \uCE74\uBA54\uB77C\uB85C \uC544\uB798 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C \uC5F0\uACB0\uB429\uB2C8\uB2E4.",
793
+ "pair.promptBody": "\uC774 PC\uC758 \uD734\uB300\uD3F0 \uC6D0\uACA9 \uD398\uC5B4\uB9C1 \uC815\uBCF4\uB97C \uBCF4\uC5EC\uC8FC\uC138\uC694: \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uC640 \uC2A4\uCE94\uD560 \uC218 \uC788\uB294 QR \uCF54\uB4DC. QR \uCF54\uB4DC\uB294 \uACE0\uC815\uD3ED \uCF54\uB4DC \uBE14\uB85D\uC5D0 \uB123\uACE0 \uD55C \uAE00\uC790\uB3C4 \uBC14\uAFB8\uC9C0 \uB9D0\uACE0 \uADF8\uB300\uB85C \uD45C\uC2DC\uD574 \uC8FC\uC138\uC694. \uD734\uB300\uD3F0\uC73C\uB85C \uC2A4\uCE94\uD560 \uC218 \uC788\uB3C4\uB85D \uD558\uAE30 \uC704\uD568\uC785\uB2C8\uB2E4.",
794
+ "pair.promptDescription": "\uD734\uB300\uD3F0 \uC6D0\uACA9 \uD398\uC5B4\uB9C1\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\xB7\uC2A4\uCE94\uC6A9 QR \uCF54\uB4DC \uD45C\uC2DC",
795
+ "pair.scanIntro": "**\uC2A4\uCE94\uC73C\uB85C \uC5F0\uACB0**: \uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uC744 \uC5F4\uACE0 \uC544\uB798 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C \uC5F0\uACB0\uB429\uB2C8\uB2E4.",
669
796
  "perm.promptAuthorize": "opencode\uAC00 \uAD8C\uD55C\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
670
797
  "perm.promptPatterns": "opencode\uAC00 \uC811\uADFC\uC744 \uC694\uCCAD: {list}",
671
798
  "perm.promptResource": "opencode\uAC00 \uB9AC\uC18C\uC2A4 \uC811\uADFC\uC744 \uC694\uCCAD: {list}",
672
799
  "perm.promptTool": "opencode\uAC00 {tool} \uC2E4\uD589\uC744 \uC694\uCCAD",
673
800
  "qr.codeLabel": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC",
674
801
  "qr.fileWritten": "\uD398\uC5B4\uB9C1 \uC815\uBCF4\uAC00 \uAE30\uB85D\uB428: {path}",
675
- "qr.linkLabel": "\uB9C1\uD06C",
676
- "qr.openHint": "\uD734\uB300\uD3F0 \uBE0C\uB77C\uC6B0\uC800\uC5D0\uC11C \uB9C1\uD06C\uB97C \uC5F4\uAC70\uB098 \uC571\uC5D0\uC11C \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC785\uB825\uD558\uC138\uC694.",
802
+ "qr.openHint": "tunnelbox \uC571\uC744 \uC5F4\uACE0 \uC704 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uAC70\uB098, \uC571\uC5D0\uC11C \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC785\uB825\uD558\uC138\uC694.",
677
803
  "qr.titleNoType": "tunnelbox \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
678
804
  "qr.titleWithType": "tunnelbox {type} \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
679
- "qr.unavailable": "(qrcode\uAC00 \uC124\uCE58\uB418\uC9C0 \uC54A\uC74C \u2014 \uC704\uC758 \uB9C1\uD06C \uB610\uB294 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694)",
805
+ "qr.unavailable": "(qrcode\uAC00 \uC124\uCE58\uB418\uC9C0 \uC54A\uC74C \u2014 \uC704\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694)",
680
806
  "claude.errBusy": "\uC774 \uC138\uC158\uC774 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4. \uC644\uB8CC\uB420 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9AC\uAC70\uB098 \uBA3C\uC800 \uC911\uC9C0\uD558\uC138\uC694",
681
807
  "claude.errTurn": "\uC0DD\uC131 \uC624\uB958",
682
808
  "claude.pairingStillClaimed": "\uC774\uBBF8 \uACC4\uC815\uC5D0 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC774 \uCF54\uB4DC\uB294 \uAC19\uC740 \uACC4\uC815\uC758 \uC0C8 \uAE30\uAE30 \uC5F0\uACB0 \uC804\uC6A9\uC774\uBA70, \uD604\uC7AC \uAE30\uAE30\uB294 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
@@ -744,7 +870,41 @@ var ko_KR_default = {
744
870
  "claude.errReadHistory": "\uC138\uC158 \uAE30\uB85D\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4({id})",
745
871
  "setup.langSet": "\uC2E4\uD589 \uC5B8\uC5B4\uB97C \uC124\uC815\uD588\uC2B5\uB2C8\uB2E4",
746
872
  "setup.langHint": "\uB2E4\uC2DC \uC2DC\uC791\uD558\uBA74 \uC774 \uC5B8\uC5B4\uB85C \uCD9C\uB825\uB429\uB2C8\uB2E4(\uC2E4\uD589 \uC2DC TUNNELBOX_LANG\uC73C\uB85C \uC7AC\uC815\uC758 \uAC00\uB2A5). \uC0C1\uD0DC \uD30C\uC77C:",
747
- "setup.langCurrent": "\uD604\uC7AC \uC2E4\uD589 \uC5B8\uC5B4"
873
+ "setup.langCurrent": "\uD604\uC7AC \uC2E4\uD589 \uC5B8\uC5B4",
874
+ "hermes.errNoRelay": "\uB9B4\uB808\uC774 URL\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4: --env\uB85C \uAE30\uBCF8\uAC12\uC744 \uC8FC\uC785\uD558\uAC70\uB098 \uC2E4\uD589 \uC2DC TUNNELBOX_RELAY_URL\uB85C \uC7AC\uC815\uC758\uD558\uC138\uC694",
875
+ "hermes.logConnected": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uB428 {url}",
876
+ "hermes.logMsgUncaught": "\uBA54\uC2DC\uC9C0 \uCC98\uB9AC \uC911 \uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uC608\uC678: {message}",
877
+ "hermes.logDisconnected": "\uB9B4\uB808\uC774\uC640 \uC5F0\uACB0 \uB04A\uAE40, \uC790\uB3D9 \uC7AC\uC5F0\uACB0 \uC911\u2026",
878
+ "hermes.logPairCode": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131: {code}",
879
+ "hermes.logUnhandledType": "\uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0 \uC720\uD615: {type}",
880
+ "hermes.logHandleFailed": "{type} \uCC98\uB9AC \uC2E4\uD328: {message}",
881
+ "hermes.logClaimed": "\uD734\uB300\uD3F0 \uACC4\uC815\uC5D0 \uBC14\uC778\uB529\uB428. \uC774\uC81C \uD734\uB300\uD3F0\uC758 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD569\uB2C8\uB2E4",
882
+ "hermes.logResetIdentity": "\uACC4\uC815\uC5D0\uC11C \uBC14\uC778\uB529 \uD574\uC81C\uB428, ID \uC7AC\uC124\uC815 \uBC0F \uC0C8 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131 \uC911\u2026",
883
+ "hermes.cmdNew": "\uC0C8 \uC138\uC158",
884
+ "hermes.cmdHelp": "\uB3C4\uC6C0\uB9D0 \uD45C\uC2DC",
885
+ "hermes.newSessionTitle": "\uC0C8 \uC138\uC158",
886
+ "hermes.helpText": "\uC9C0\uC6D0 \uBA85\uB839:\n- /new \uC0C8 \uC138\uC158\n- /help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC",
887
+ "hermes.errBusy": "\uC774 \uC138\uC158\uC774 \uC0DD\uC131 \uC911\uC785\uB2C8\uB2E4. \uC644\uB8CC\uB97C \uAE30\uB2E4\uB9AC\uAC70\uB098 \uBA3C\uC800 \uC911\uC9C0\uD558\uC138\uC694",
888
+ "hermes.errBadWorkspace": "\uC774 \uB514\uB809\uD1A0\uB9AC\uB294 \uC874\uC7AC\uD558\uC9C0 \uC54A\uAC70\uB098 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
889
+ "hermes.logWorkspaceSwitched": "\uC791\uC5C5\uACF5\uAC04 \uC804\uD658: {path}",
890
+ "hermes.errWorkspaceMissing": "\uC791\uC5C5\uACF5\uAC04\uC774 \uC5C6\uC2B5\uB2C8\uB2E4: {dir}",
891
+ "hermes.errStartFailed": "\uC2DC\uC791 \uC2E4\uD328: {message}",
892
+ "hermes.msgStarted": "Hermes \uC5B4\uB311\uD130 \uC2DC\uC791\uB428 (Ctrl+C\uB85C \uC885\uB8CC)",
893
+ "hermes.logAbortSent": "\uC911\uC9C0 \uC804\uC1A1\uB428 (session={session})",
894
+ "hermes.logPromptFailed": "session.prompt \uC2E4\uD328: {message}",
895
+ "hermes.logTurnError": "\uD134 \uC624\uB958 (session={session}): {message}",
896
+ "hermes.logPairForced": "--pair: \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uAC15\uC81C \uC694\uCCAD (\uC774\uBC88\uC5D0\uB9CC)",
897
+ "hermes.pairingStillClaimed": "\uD734\uB300\uD3F0 \uACC4\uC815\uC5D0 \uC774\uBBF8 \uBC14\uC778\uB529\uB428: \uC774 \uCF54\uB4DC\uB294 \uAC19\uC740 \uACC4\uC815\uC758 \uC0C8 \uAE30\uAE30 \uC7AC\uD398\uC5B4\uB9C1\uC6A9\uC785\uB2C8\uB2E4. \uD604\uC7AC \uAE30\uAE30\uB294 \uD734\uB300\uD3F0\uC758 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
898
+ "hermes.logPairNoRelay": "\uB9B4\uB808\uC774 URL\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC544 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC694\uCCAD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
899
+ "hermes.errSpawnHermes": "Hermes({bin})\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: \uC124\uCE58 \uC5EC\uBD80\uB97C \uD655\uC778\uD558\uC138\uC694 ({err})",
900
+ "hermes.errHermesExit": "hermes \uC885\uB8CC({code}): {err}",
901
+ "hermes.logSessionUpdated": "\uC138\uC158 \uC5C5\uB370\uC774\uD2B8\uB428 (session={session})",
902
+ "hermes.errNoInject": "\uD734\uB300\uD3F0 \uBA54\uC2DC\uC9C0 \uC8FC\uC785\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4(\uBE44\uB300\uD654\uD615 \uC138\uC158 \uB610\uB294 \uD504\uB85C\uC138\uC2A4 \uBBF8\uC900\uBE44)",
903
+ "hermes.pairNoRelay": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4(\uB9B4\uB808\uC774 \uB3C4\uB2EC \uBD88\uAC00 \uB610\uB294 websockets \uB204\uB77D)",
904
+ "hermes.pairTimeout": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD \uC2DC\uAC04 \uCD08\uACFC(\uB9B4\uB808\uC774 \uBBF8\uC751\uB2F5)",
905
+ "hermes.errToolPair": "tunnelbox_pair \uC2E4\uD328: {err}",
906
+ "hermes.errToolStatus": "tunnelbox_status \uC2E4\uD328: {err}",
907
+ "hermes.cliUsage": "\uC0AC\uC6A9\uBC95: /tunnelbox <pair|status>\n pair \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD/\uCD9C\uB825\n status \uB9B4\uB808\uC774/\uBC14\uC778\uB529/\uC5F0\uACB0 \uC0C1\uD0DC \uD45C\uC2DC"
748
908
  };
749
909
 
750
910
  // ../core/locales/fr-FR.json
@@ -782,30 +942,28 @@ var fr_FR_default = {
782
942
  "install.failConnect": "(Impossible de se connecter au relais pour afficher l'appairage \u2014 relais injoignable ou version de Node trop ancienne.",
783
943
  "install.failConnectHint": "Apr\xE8s le red\xE9marrage d'opencode, consultez le QR code du terminal avec --print-logs, ou tapez \u201Cafficher le code d'appairage\u201D / /pair dans opencode.)",
784
944
  "install.hintFresh": "Remarque : le code d'appairage est \xE0 usage unique et valide environ 10 minutes. Si vous d\xE9marrez opencode plus tard, utilisez les informations imprim\xE9es au d\xE9marrage ou obtenues via /pair.",
785
- "install.linkLine": "Lien d'appairage : {link}",
786
945
  "install.pluginInstalled": "Plugin install\xE9 : {path}",
787
- "install.qrUnavailable": "(Rendu du QR indisponible \u2014 utilisez le lien ou le code ci-dessus)",
946
+ "install.qrUnavailable": "(Rendu du QR indisponible \u2014 utilisez le code ci-dessus)",
788
947
  "install.qrcodeEnsure": "Installation de qrcode dans le r\xE9pertoire de configuration d'opencode\u2026",
789
- "install.qrcodeFail": "\xC9chec de l'installation de qrcode (sans cons\xE9quence \u2014 le QR est remplac\xE9 par un lien) : {err}",
948
+ "install.qrcodeFail": "\xC9chec de l'installation de qrcode (sans cons\xE9quence \u2014 seul le code d'appairage est affich\xE9) : {err}",
790
949
  "install.relayError": "Le relais a renvoy\xE9 une erreur : {msg}",
791
- "install.scanHint": "Ouvrez tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, ou scannez le QR ci-dessous avec la cam\xE9ra :",
950
+ "install.scanHint": "Ouvrez tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, puis scannez le QR ci-dessus pour connecter :",
792
951
  "pair.heading": "Appairage t\xE9l\xE9phone tunnelbox",
793
- "pair.howTo": "Ouvrez le lien dans le navigateur du t\xE9l\xE9phone, ou saisissez le code d'appairage dans l'application tunnelbox.",
952
+ "pair.howTo": "Ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone, scannez le QR ci-dessus avec \u201CScanner pour appairer\u201D, ou saisissez le code d'appairage manuellement.",
794
953
  "pair.oneTime": "Le code d'appairage est \xE0 usage unique et expire apr\xE8s utilisation ; demandez \xE0 \u201Craffra\xEEchir le code d'appairage\u201D pour en obtenir un nouveau.",
795
- "pair.promptBody": "Veuillez afficher les informations d'appairage t\xE9l\xE9phone de cet ordinateur : le code d'appairage, le lien d'appairage et un QR code scannable. Gardez le QR code dans un bloc de code \xE0 largeur fixe et reproduisez-le caract\xE8re par caract\xE8re pour que mon t\xE9l\xE9phone puisse le scanner.",
796
- "pair.promptDescription": "Afficher le code d'appairage, le lien et le QR code scannable",
797
- "pair.scanIntro": "**Appairer par scan** : ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone (\u201CScanner pour appairer\u201D) ou utilisez la cam\xE9ra pour scanner le QR ci-dessous et vous connecter automatiquement.",
954
+ "pair.promptBody": "Veuillez afficher les informations d'appairage t\xE9l\xE9phone de cet ordinateur : le code d'appairage et un QR code scannable. Gardez le QR code dans un bloc de code \xE0 largeur fixe et reproduisez-le caract\xE8re par caract\xE8re pour que mon t\xE9l\xE9phone puisse le scanner.",
955
+ "pair.promptDescription": "Afficher le code d'appairage et le QR code scannable",
956
+ "pair.scanIntro": "**Appairer par scan** : ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, puis scannez le QR ci-dessous pour vous connecter automatiquement.",
798
957
  "perm.promptAuthorize": "opencode demande une autorisation",
799
958
  "perm.promptPatterns": "opencode demande l'acc\xE8s \xE0 : {list}",
800
959
  "perm.promptResource": "opencode demande l'acc\xE8s aux ressources : {list}",
801
960
  "perm.promptTool": "opencode demande d'ex\xE9cuter {tool}",
802
961
  "qr.codeLabel": "Code d'appairage",
803
962
  "qr.fileWritten": "Informations d'appairage \xE9crites dans : {path}",
804
- "qr.linkLabel": "Lien",
805
- "qr.openHint": "Ouvrez le lien dans le navigateur du t\xE9l\xE9phone, ou saisissez le code d'appairage dans l'application.",
963
+ "qr.openHint": "Ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone et scannez le QR ci-dessus, ou saisissez le code d'appairage manuellement dans l'application.",
806
964
  "qr.titleNoType": "appairage t\xE9l\xE9phone tunnelbox",
807
965
  "qr.titleWithType": "appairage t\xE9l\xE9phone tunnelbox {type}",
808
- "qr.unavailable": "(qrcode non install\xE9 \u2014 utilisez le lien ou le code d'appairage ci-dessus)",
966
+ "qr.unavailable": "(qrcode non install\xE9 \u2014 utilisez le code d'appairage ci-dessus)",
809
967
  "claude.errBusy": "Cette session est en cours d'ex\xE9cution ; attendez la fin ou arr\xEAtez-la d'abord",
810
968
  "claude.errTurn": "erreur de g\xE9n\xE9ration",
811
969
  "claude.pairingStillClaimed": "D\xE9j\xE0 li\xE9 \xE0 un compte t\xE9l\xE9phone : ce code sert uniquement \xE0 appairer un nouvel appareil sur le m\xEAme compte ; l'appareil actuel se connecte directement depuis Mes ordinateurs",
@@ -873,7 +1031,41 @@ var fr_FR_default = {
873
1031
  "claude.errReadHistory": "\xC9chec de la lecture de l'historique de session ({id})",
874
1032
  "setup.langSet": "Langue d'ex\xE9cution d\xE9finie sur",
875
1033
  "setup.langHint": "L'adaptateur utilisera cette langue au prochain d\xE9marrage (TUNNELBOX_LANG peut la remplacer). Fichier d'\xE9tat :",
876
- "setup.langCurrent": "Langue d'ex\xE9cution actuelle"
1034
+ "setup.langCurrent": "Langue d'ex\xE9cution actuelle",
1035
+ "hermes.errNoRelay": "URL du relais non configur\xE9e : utilisez --env pour injecter une valeur par d\xE9faut, ou remplacez \xE0 l'ex\xE9cution avec TUNNELBOX_RELAY_URL",
1036
+ "hermes.logConnected": "Connect\xE9 au relais {url}",
1037
+ "hermes.logMsgUncaught": "Exception non intercept\xE9e lors du traitement du message : {message}",
1038
+ "hermes.logDisconnected": "D\xE9connect\xE9 du relais, reconnexion automatique\u2026",
1039
+ "hermes.logPairCode": "Code d'appairage g\xE9n\xE9r\xE9 : {code}",
1040
+ "hermes.logUnhandledType": "Type de message non trait\xE9 : {type}",
1041
+ "hermes.logHandleFailed": "\xC9chec du traitement de {type} : {message}",
1042
+ "hermes.logClaimed": "Li\xE9 \xE0 votre compte t\xE9l\xE9phone. Le t\xE9l\xE9phone se connecte d\xE9sormais directement depuis Mes ordinateurs",
1043
+ "hermes.logResetIdentity": "Dissoci\xE9 du compte ; r\xE9initialisation de l'identit\xE9 et g\xE9n\xE9ration d'un nouveau code d'appairage\u2026",
1044
+ "hermes.cmdNew": "Nouvelle session",
1045
+ "hermes.cmdHelp": "Afficher l'aide",
1046
+ "hermes.newSessionTitle": "Nouvelle session",
1047
+ "hermes.helpText": "Commandes prises en charge :\n- /new nouvelle session\n- /help afficher l'aide",
1048
+ "hermes.errBusy": "Cette session est en cours de g\xE9n\xE9ration ; attendez la fin ou arr\xEAtez-la d'abord",
1049
+ "hermes.errBadWorkspace": "Ce r\xE9pertoire n'existe pas ou est inutilisable",
1050
+ "hermes.logWorkspaceSwitched": "Espace de travail chang\xE9 : {path}",
1051
+ "hermes.errWorkspaceMissing": "L'espace de travail n'existe pas : {dir}",
1052
+ "hermes.errStartFailed": "\xC9chec du d\xE9marrage : {message}",
1053
+ "hermes.msgStarted": "Adaptateur Hermes d\xE9marr\xE9 (Ctrl+C pour quitter)",
1054
+ "hermes.logAbortSent": "Interruption envoy\xE9e (session={session})",
1055
+ "hermes.logPromptFailed": "session.prompt a \xE9chou\xE9 : {message}",
1056
+ "hermes.logTurnError": "Erreur de tour (session={session}) : {message}",
1057
+ "hermes.logPairForced": "--pair : demande forc\xE9e du code d'appairage (cet ex\xE9cution uniquement)",
1058
+ "hermes.pairingStillClaimed": "D\xE9j\xE0 li\xE9 \xE0 un compte t\xE9l\xE9phone : ce code ne sert qu'\xE0 r\xE9appairer un nouvel appareil sur le m\xEAme compte ; l'appareil actuel se connecte directement depuis Mes ordinateurs",
1059
+ "hermes.logPairNoRelay": "Impossible de demander un code d'appairage : URL du relais non configur\xE9e",
1060
+ "hermes.errSpawnHermes": "Impossible de d\xE9marrer Hermes ({bin}) : v\xE9rifiez qu'il est install\xE9 ({err})",
1061
+ "hermes.errHermesExit": "hermes a quitt\xE9 ({code}) : {err}",
1062
+ "hermes.logSessionUpdated": "Session mise \xE0 jour (session={session})",
1063
+ "hermes.errNoInject": "Injection du message t\xE9l\xE9phone indisponible (session non interactive ou processus non pr\xEAt)",
1064
+ "hermes.pairNoRelay": "Impossible de joindre le relais (relais injoignable ou websockets manquant)",
1065
+ "hermes.pairTimeout": "D\xE9lai d\xE9pass\xE9 pour le code d'appairage (relais sans r\xE9ponse)",
1066
+ "hermes.errToolPair": "\xE9chec de tunnelbox_pair : {err}",
1067
+ "hermes.errToolStatus": "\xE9chec de tunnelbox_status : {err}",
1068
+ "hermes.cliUsage": "Utilisation : /tunnelbox <pair|status>\n pair demander et afficher un code d'appairage\n status afficher l'\xE9tat relais/liaison/connexion"
877
1069
  };
878
1070
 
879
1071
  // ../core/locales/de-DE.json
@@ -911,30 +1103,28 @@ var de_DE_default = {
911
1103
  "install.failConnect": "(Keine sofortige Verbindung zum Relay zum Drucken der Pairing-Informationen m\xF6glich \u2014 Relay nicht erreichbar oder Node zu alt.",
912
1104
  "install.failConnectHint": "Nach dem Neustart von opencode den Terminal-QR-Code mit --print-logs anzeigen oder im opencode \u201CTelefon-Pairing-Code anzeigen\u201D bzw. /pair eingeben.)",
913
1105
  "install.hintFresh": "Hinweis: Der Pairing-Code ist einmalig und etwa 10 Minuten g\xFCltig. Wenn Sie opencode sp\xE4ter starten, nutzen Sie die beim Start gedruckten oder per /pair abgerufenen aktuellen Informationen.",
914
- "install.linkLine": "Pairing-Link: {link}",
915
1106
  "install.pluginInstalled": "Plugin installiert: {path}",
916
- "install.qrUnavailable": "(QR-Darstellung nicht verf\xFCgbar \u2014 nutzen Sie den Link oder Code oben)",
1107
+ "install.qrUnavailable": "(QR-Darstellung nicht verf\xFCgbar \u2014 nutzen Sie den Code oben)",
917
1108
  "install.qrcodeEnsure": "Installiere qrcode in das opencode-Konfigurationsverzeichnis\u2026",
918
- "install.qrcodeFail": "qrcode-Installation fehlgeschlagen (nicht kritisch \u2014 QR wird durch einen Link ersetzt): {err}",
1109
+ "install.qrcodeFail": "qrcode-Installation fehlgeschlagen (nicht kritisch \u2014 nur der Pairing-Code wird angezeigt): {err}",
919
1110
  "install.relayError": "Relay hat einen Fehler zur\xFCckgegeben: {msg}",
920
- "install.scanHint": "\xD6ffnen Sie tunnelbox auf dem Telefon, tippen Sie auf \u201CZum Pairing scannen\u201D, oder scannen Sie den QR-Code unten mit der Kamera:",
1111
+ "install.scanHint": "\xD6ffnen Sie tunnelbox auf dem Telefon, tippen Sie auf \u201CZum Pairing scannen\u201D und scannen Sie den QR-Code oben zum Verbinden:",
921
1112
  "pair.heading": "tunnelbox Telefon-Pairing",
922
- "pair.howTo": "\xD6ffnen Sie den Link im Telefon-Browser oder geben Sie den Pairing-Code in der tunnelbox-App ein.",
1113
+ "pair.howTo": "\xD6ffnen Sie die tunnelbox-App auf dem Telefon und scannen Sie den QR-Code oben mit \u201CZum Pairing scannen\u201D, oder geben Sie den Pairing-Code manuell ein.",
923
1114
  "pair.oneTime": "Der Pairing-Code ist einmalig und verf\xE4llt nach der Nutzung; f\xFCr einen neuen Code \u201CPairing-Code aktualisieren\u201D anfordern.",
924
- "pair.promptBody": "Zeigen Sie bitte die Telefon-Pairing-Informationen dieses Computers an: den Pairing-Code, den Pairing-Link 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.",
925
- "pair.promptDescription": "Pairing-Code, Pairing-Link und scannbaren QR-Code anzeigen",
926
- "pair.scanIntro": "**Per Scan pairen**: \xD6ffnen Sie die tunnelbox-App auf dem Telefon (\u201CZum Pairing scannen\u201D) oder scannen Sie den QR-Code unten mit der Kamera, um sich automatisch zu verbinden.",
1115
+ "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.",
1116
+ "pair.promptDescription": "Pairing-Code und scannbaren QR-Code anzeigen",
1117
+ "pair.scanIntro": "**Per Scan pairen**: \xD6ffnen Sie die tunnelbox-App auf dem Telefon, tippen Sie auf \u201CZum Pairing scannen\u201D und scannen Sie den QR-Code unten, um sich automatisch zu verbinden.",
927
1118
  "perm.promptAuthorize": "opencode fordert eine Genehmigung an",
928
1119
  "perm.promptPatterns": "opencode fordert Zugriff auf: {list}",
929
1120
  "perm.promptResource": "opencode fordert Zugriff auf Ressourcen: {list}",
930
1121
  "perm.promptTool": "opencode fordert die Ausf\xFChrung von {tool} an",
931
1122
  "qr.codeLabel": "Pairing-Code",
932
1123
  "qr.fileWritten": "Pairing-Informationen geschrieben in: {path}",
933
- "qr.linkLabel": "Link",
934
- "qr.openHint": "\xD6ffnen Sie den Link im Telefon-Browser oder geben Sie den Pairing-Code manuell in der App ein.",
1124
+ "qr.openHint": "\xD6ffnen 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.",
935
1125
  "qr.titleNoType": "tunnelbox Telefon-Pairing",
936
1126
  "qr.titleWithType": "tunnelbox {type} Telefon-Pairing",
937
- "qr.unavailable": "(qrcode nicht installiert \u2014 nutzen Sie den Link oder Pairing-Code oben)",
1127
+ "qr.unavailable": "(qrcode nicht installiert \u2014 nutzen Sie den Pairing-Code oben)",
938
1128
  "claude.errBusy": "Diese Sitzung l\xE4uft noch; warten Sie auf das Ende oder stoppen Sie sie zuerst",
939
1129
  "claude.errTurn": "Generierungsfehler",
940
1130
  "claude.pairingStillClaimed": "Bereits an ein Telefonkonto gebunden: Dieser Code dient nur zum Koppeln eines neuen Ger\xE4ts auf demselben Konto; das aktuelle Ger\xE4t verbindet sich direkt \xFCber \u201EMeine Computer\u201C",
@@ -1002,7 +1192,41 @@ var de_DE_default = {
1002
1192
  "claude.errReadHistory": "Sitzungsverlauf konnte nicht gelesen werden ({id})",
1003
1193
  "setup.langSet": "Laufzeitsprache gesetzt auf",
1004
1194
  "setup.langHint": "Der Adapter gibt nach dem Neustart in dieser Sprache aus (TUNNELBOX_LANG kann zur Laufzeit \xFCberschreiben). Statusdatei:",
1005
- "setup.langCurrent": "Aktuelle Laufzeitsprache"
1195
+ "setup.langCurrent": "Aktuelle Laufzeitsprache",
1196
+ "hermes.errNoRelay": "Keine Relay-URL konfiguriert: mit --env einen Standardwert einf\xFCgen oder zur Laufzeit mit TUNNELBOX_RELAY_URL \xFCberschreiben",
1197
+ "hermes.logConnected": "Mit Relay verbunden {url}",
1198
+ "hermes.logMsgUncaught": "Nicht abgefangene Ausnahme bei der Nachrichtenverarbeitung: {message}",
1199
+ "hermes.logDisconnected": "Vom Relay getrennt, automatische Neuverbindung\u2026",
1200
+ "hermes.logPairCode": "Pairing-Code generiert: {code}",
1201
+ "hermes.logUnhandledType": "Nicht behandelter Nachrichtentyp: {type}",
1202
+ "hermes.logHandleFailed": "Fehler beim Verarbeiten von {type}: {message}",
1203
+ "hermes.logClaimed": "An Ihr Telefonkonto gebunden. Das Telefon verbindet sich k\xFCnftig direkt \xFCber Meine Computer",
1204
+ "hermes.logResetIdentity": "Vom Konto entbunden; Identit\xE4t wird zur\xFCckgesetzt und ein neuer Pairing-Code generiert\u2026",
1205
+ "hermes.cmdNew": "Neue Sitzung",
1206
+ "hermes.cmdHelp": "Hilfe anzeigen",
1207
+ "hermes.newSessionTitle": "Neue Sitzung",
1208
+ "hermes.helpText": "Unterst\xFCtzte Befehle:\n- /new neue Sitzung\n- /help Hilfe anzeigen",
1209
+ "hermes.errBusy": "Diese Sitzung wird gerade generiert; warten Sie auf den Abschluss oder stoppen Sie sie zuerst",
1210
+ "hermes.errBadWorkspace": "Dieses Verzeichnis existiert nicht oder ist unbrauchbar",
1211
+ "hermes.logWorkspaceSwitched": "Arbeitsbereich gewechselt: {path}",
1212
+ "hermes.errWorkspaceMissing": "Arbeitsbereich existiert nicht: {dir}",
1213
+ "hermes.errStartFailed": "Start fehlgeschlagen: {message}",
1214
+ "hermes.msgStarted": "Hermes-Adapter gestartet (Strg+C zum Beenden)",
1215
+ "hermes.logAbortSent": "Abbruch gesendet (session={session})",
1216
+ "hermes.logPromptFailed": "session.prompt fehlgeschlagen: {message}",
1217
+ "hermes.logTurnError": "Fehler bei Runde (session={session}): {message}",
1218
+ "hermes.logPairForced": "--pair: Pairing-Code erzwungen (nur dieser Lauf)",
1219
+ "hermes.pairingStillClaimed": "Bereits an ein Telefonkonto gebunden: Dieser Code dient nur zum erneuten Pairing eines neuen Ger\xE4ts desselben Kontos; das aktuelle Ger\xE4t verbindet sich direkt \xFCber Meine Computer",
1220
+ "hermes.logPairNoRelay": "Kein Pairing-Code anforderbar: keine Relay-URL konfiguriert",
1221
+ "hermes.errSpawnHermes": "Hermes ({bin}) kann nicht gestartet werden: bitte Installation pr\xFCfen ({err})",
1222
+ "hermes.errHermesExit": "hermes beendet ({code}): {err}",
1223
+ "hermes.logSessionUpdated": "Sitzung aktualisiert (session={session})",
1224
+ "hermes.errNoInject": "Telefon-Nachrichteneinspeisung nicht verf\xFCgbar (Sitzung nicht interaktiv oder Prozess nicht bereit)",
1225
+ "hermes.pairNoRelay": "Relay nicht erreichbar (Relay nicht erreichbar oder websockets fehlt)",
1226
+ "hermes.pairTimeout": "Zeit\xFCberschreitung bei der Pairing-Code-Anfrage (Relay antwortete nicht)",
1227
+ "hermes.errToolPair": "tunnelbox_pair fehlgeschlagen: {err}",
1228
+ "hermes.errToolStatus": "tunnelbox_status fehlgeschlagen: {err}",
1229
+ "hermes.cliUsage": "Verwendung: /tunnelbox <pair|status>\n pair Pairing-Code anfordern und anzeigen\n status Relay/Bindung/Verbindung anzeigen"
1006
1230
  };
1007
1231
 
1008
1232
  // ../core/locales/es-ES.json
@@ -1040,30 +1264,28 @@ var es_ES_default = {
1040
1264
  "install.failConnect": "(No se pudo conectar de inmediato con el relay para imprimir el emparejamiento \u2014 relay inaccesible o versi\xF3n de Node demasiado antigua.",
1041
1265
  "install.failConnectHint": "Tras reiniciar opencode, consulte el c\xF3digo QR del terminal con --print-logs, o escriba \u201Cmostrar c\xF3digo de emparejamiento del tel\xE9fono\u201D o /pair en opencode.)",
1042
1266
  "install.hintFresh": "Nota: el c\xF3digo de emparejamiento es de un solo uso y v\xE1lido durante unos 10 minutos. Si inicia opencode m\xE1s tarde, use la informaci\xF3n m\xE1s reciente impresa al iniciar u obtenida con /pair.",
1043
- "install.linkLine": "Enlace de emparejamiento: {link}",
1044
1267
  "install.pluginInstalled": "Complemento instalado: {path}",
1045
- "install.qrUnavailable": "(Representaci\xF3n del QR no disponible: use el enlace o el c\xF3digo anteriores)",
1268
+ "install.qrUnavailable": "(Representaci\xF3n del QR no disponible: use el c\xF3digo anterior)",
1046
1269
  "install.qrcodeEnsure": "Instalando qrcode en el directorio de configuraci\xF3n de opencode\u2026",
1047
- "install.qrcodeFail": "Error al instalar qrcode (no es cr\xEDtico; el QR pasa a ser un enlace): {err}",
1270
+ "install.qrcodeFail": "Error al instalar qrcode (no es cr\xEDtico; solo se muestra el c\xF3digo de emparejamiento): {err}",
1048
1271
  "install.relayError": "El relay devolvi\xF3 un error: {msg}",
1049
- "install.scanHint": "Abra tunnelbox en el tel\xE9fono, pulse \u201CEscanear para emparejar\u201D, o escanee el c\xF3digo QR de abajo con la c\xE1mara:",
1272
+ "install.scanHint": "Abra tunnelbox en el tel\xE9fono, pulse \u201CEscanear para emparejar\u201D y escanee el c\xF3digo QR superior para conectar:",
1050
1273
  "pair.heading": "Emparejamiento de tel\xE9fono tunnelbox",
1051
- "pair.howTo": "Abra el enlace en el navegador del tel\xE9fono o introduzca el c\xF3digo de emparejamiento en la aplicaci\xF3n tunnelbox.",
1274
+ "pair.howTo": "Abra la aplicaci\xF3n tunnelbox en el tel\xE9fono y escanee el c\xF3digo QR superior con \u201CEscanear para emparejar\u201D, o introduzca el c\xF3digo de emparejamiento manualmente.",
1052
1275
  "pair.oneTime": "El c\xF3digo de emparejamiento es de un solo uso y caduca al utilizarse; pida \u201Cactualizar el c\xF3digo de emparejamiento\u201D para obtener uno nuevo.",
1053
- "pair.promptBody": "Mu\xE9strame la informaci\xF3n de emparejamiento con el tel\xE9fono de este ordenador: el c\xF3digo de emparejamiento, el enlace de emparejamiento y un c\xF3digo QR escaneable. Mant\xE9n el c\xF3digo QR dentro de un bloque de c\xF3digo de ancho fijo y reprod\xFAcelo car\xE1cter por car\xE1cter para que mi tel\xE9fono pueda escanearlo.",
1054
- "pair.promptDescription": "Mostrar el c\xF3digo de emparejamiento, el enlace y el QR escaneable",
1055
- "pair.scanIntro": "**Emparejar escaneando**: abra la aplicaci\xF3n tunnelbox en el tel\xE9fono (\u201CEscanear para emparejar\u201D) o use la c\xE1mara para escanear el QR de abajo y conectar autom\xE1ticamente.",
1276
+ "pair.promptBody": "Mu\xE9strame la informaci\xF3n de emparejamiento con el tel\xE9fono de este ordenador: el c\xF3digo de emparejamiento y un c\xF3digo QR escaneable. Mant\xE9n el c\xF3digo QR dentro de un bloque de c\xF3digo de ancho fijo y reprod\xFAcelo car\xE1cter por car\xE1cter para que mi tel\xE9fono pueda escanearlo.",
1277
+ "pair.promptDescription": "Mostrar el c\xF3digo de emparejamiento y el QR escaneable",
1278
+ "pair.scanIntro": "**Emparejar escaneando**: abra la aplicaci\xF3n tunnelbox en el tel\xE9fono, pulse \u201CEscanear para emparejar\u201D y escanee el c\xF3digo QR inferior para conectar autom\xE1ticamente.",
1056
1279
  "perm.promptAuthorize": "opencode solicita autorizaci\xF3n",
1057
1280
  "perm.promptPatterns": "opencode solicita acceso a: {list}",
1058
1281
  "perm.promptResource": "opencode solicita acceso a los recursos: {list}",
1059
1282
  "perm.promptTool": "opencode solicita ejecutar {tool}",
1060
1283
  "qr.codeLabel": "C\xF3digo de emparejamiento",
1061
1284
  "qr.fileWritten": "Informaci\xF3n de emparejamiento escrita en: {path}",
1062
- "qr.linkLabel": "Enlace",
1063
- "qr.openHint": "Abra el enlace en el navegador del tel\xE9fono o introduzca el c\xF3digo de emparejamiento manualmente en la aplicaci\xF3n.",
1285
+ "qr.openHint": "Abra la aplicaci\xF3n tunnelbox en el tel\xE9fono y escanee el c\xF3digo QR superior, o introduzca el c\xF3digo de emparejamiento manualmente en la aplicaci\xF3n.",
1064
1286
  "qr.titleNoType": "emparejamiento de tel\xE9fono tunnelbox",
1065
1287
  "qr.titleWithType": "emparejamiento de tel\xE9fono tunnelbox {type}",
1066
- "qr.unavailable": "(qrcode no instalado: use el enlace o el c\xF3digo de emparejamiento anteriores)",
1288
+ "qr.unavailable": "(qrcode no instalado: use el c\xF3digo de emparejamiento anterior)",
1067
1289
  "claude.errBusy": "Esta sesi\xF3n est\xE1 en ejecuci\xF3n; espere a que termine o det\xE9ngala primero",
1068
1290
  "claude.errTurn": "error de generaci\xF3n",
1069
1291
  "claude.pairingStillClaimed": "Ya vinculado a una cuenta de tel\xE9fono: este c\xF3digo solo sirve para emparejar un nuevo dispositivo en la misma cuenta; el dispositivo actual se conecta directamente desde Mis computadoras",
@@ -1131,7 +1353,41 @@ var es_ES_default = {
1131
1353
  "claude.errReadHistory": "No se pudo leer el historial de la sesi\xF3n ({id})",
1132
1354
  "setup.langSet": "Idioma de ejecuci\xF3n establecido en",
1133
1355
  "setup.langHint": "El adaptador emitir\xE1 en este idioma tras reiniciar (TUNNELBOX_LANG puede sobrescribirlo en tiempo de ejecuci\xF3n). Archivo de estado:",
1134
- "setup.langCurrent": "Idioma de ejecuci\xF3n actual"
1356
+ "setup.langCurrent": "Idioma de ejecuci\xF3n actual",
1357
+ "hermes.errNoRelay": "URL del rel\xE9 no configurada: use --env para inyectar un valor predeterminado o sobrescr\xEDbalo en tiempo de ejecuci\xF3n con TUNNELBOX_RELAY_URL",
1358
+ "hermes.logConnected": "Conectado al rel\xE9 {url}",
1359
+ "hermes.logMsgUncaught": "Excepci\xF3n no capturada al procesar el mensaje: {message}",
1360
+ "hermes.logDisconnected": "Desconectado del rel\xE9, reconectando autom\xE1ticamente\u2026",
1361
+ "hermes.logPairCode": "C\xF3digo de emparejamiento generado: {code}",
1362
+ "hermes.logUnhandledType": "Tipo de mensaje no procesado: {type}",
1363
+ "hermes.logHandleFailed": "Error al procesar {type}: {message}",
1364
+ "hermes.logClaimed": "Vinculado a su cuenta de tel\xE9fono. El tel\xE9fono se conecta ahora directamente desde Mis computadoras",
1365
+ "hermes.logResetIdentity": "Desvinculado de la cuenta; restableciendo identidad y generando un nuevo c\xF3digo de emparejamiento\u2026",
1366
+ "hermes.cmdNew": "Nueva sesi\xF3n",
1367
+ "hermes.cmdHelp": "Mostrar ayuda",
1368
+ "hermes.newSessionTitle": "Nueva sesi\xF3n",
1369
+ "hermes.helpText": "Comandos admitidos:\n- /new nueva sesi\xF3n\n- /help mostrar ayuda",
1370
+ "hermes.errBusy": "Esta sesi\xF3n se est\xE1 generando; espere a que termine o det\xE9ngala primero",
1371
+ "hermes.errBadWorkspace": "Este directorio no existe o no se puede usar",
1372
+ "hermes.logWorkspaceSwitched": "Espacio de trabajo cambiado: {path}",
1373
+ "hermes.errWorkspaceMissing": "El espacio de trabajo no existe: {dir}",
1374
+ "hermes.errStartFailed": "Error al iniciar: {message}",
1375
+ "hermes.msgStarted": "Adaptador de Hermes iniciado (Ctrl+C para salir)",
1376
+ "hermes.logAbortSent": "Interrupci\xF3n enviada (session={session})",
1377
+ "hermes.logPromptFailed": "session.prompt fall\xF3: {message}",
1378
+ "hermes.logTurnError": "Error de turno (session={session}): {message}",
1379
+ "hermes.logPairForced": "--pair: solicitud forzada del c\xF3digo de emparejamiento (solo esta ejecuci\xF3n)",
1380
+ "hermes.pairingStillClaimed": "Ya vinculado a una cuenta de tel\xE9fono: este c\xF3digo solo sirve para reemparejar un nuevo dispositivo en la misma cuenta; el dispositivo actual se conecta directamente desde Mis computadoras",
1381
+ "hermes.logPairNoRelay": "No se puede solicitar un c\xF3digo de emparejamiento: no hay URL de rel\xE9 configurada",
1382
+ "hermes.errSpawnHermes": "No se puede iniciar Hermes ({bin}): confirme que est\xE1 instalado ({err})",
1383
+ "hermes.errHermesExit": "hermes sali\xF3 ({code}): {err}",
1384
+ "hermes.logSessionUpdated": "Sesi\xF3n actualizada (session={session})",
1385
+ "hermes.errNoInject": "Inyecci\xF3n de mensaje del tel\xE9fono no disponible (sesi\xF3n no interactiva o proceso no listo)",
1386
+ "hermes.pairNoRelay": "No se puede alcanzar el rel\xE9 (rel\xE9 inaccesible o websockets ausente)",
1387
+ "hermes.pairTimeout": "Tiempo de espera agotado al solicitar el c\xF3digo de emparejamiento (rel\xE9 sin respuesta)",
1388
+ "hermes.errToolPair": "fallo de tunnelbox_pair: {err}",
1389
+ "hermes.errToolStatus": "fallo de tunnelbox_status: {err}",
1390
+ "hermes.cliUsage": "Uso: /tunnelbox <pair|status>\n pair solicitar e imprimir un c\xF3digo de emparejamiento\n status mostrar estado de rel\xE9/enlace/conexi\xF3n"
1135
1391
  };
1136
1392
 
1137
1393
  // ../core/src/i18n.ts
@@ -1234,12 +1490,11 @@ function loadState(type) {
1234
1490
  return fallback;
1235
1491
  }
1236
1492
  }
1237
- function writePairingFile(link, code, type) {
1493
+ function writePairingFile(code, type) {
1238
1494
  const p = join(baseName(), `remote-pairing${suffix(type)}.txt`);
1239
1495
  try {
1240
1496
  mkdirSync(dirname(p), { recursive: true });
1241
1497
  writeFileSync(p, `\u914D\u5BF9\u7801: ${code}
1242
- \u914D\u5BF9\u94FE\u63A5: ${link}
1243
1498
  `, "utf8");
1244
1499
  } catch {
1245
1500
  }
@@ -1276,19 +1531,14 @@ function padVisual(s, width, align = "left") {
1276
1531
  }
1277
1532
  return s + " ".repeat(pad);
1278
1533
  }
1279
- async function printPairing(relayHttpBase, code, type, name2, lang) {
1534
+ async function printPairing(code, type, name2, lang) {
1280
1535
  const resolved = lang ? normalizeLang(lang) : resolveLang();
1281
- const p = new URLSearchParams({ code });
1282
- if (type) p.set("type", type);
1283
- if (name2) p.set("name", name2);
1284
- const link = `${relayHttpBase}/app/#/pages/index/index?${p.toString()}`;
1285
- const file = writePairingFile(link, code, type);
1536
+ const file = writePairingFile(code, type);
1286
1537
  const tt = (key, vars) => t(resolved, key, vars);
1287
1538
  const title = type ? tt("qr.titleWithType", { type }) : tt("qr.titleNoType");
1288
1539
  const codeLine = `${tt("qr.codeLabel")}: ${code}`;
1289
- const linkLine = `${tt("qr.linkLabel")}: ${link}`;
1290
1540
  const hint = tt("qr.openHint");
1291
- const inner = Math.max(40, dispWidth(codeLine), dispWidth(linkLine), dispWidth(title));
1541
+ const inner = Math.max(40, dispWidth(codeLine), dispWidth(title));
1292
1542
  const W = Math.min(76, inner + 4);
1293
1543
  const bar = "\u2500".repeat(W);
1294
1544
  console.log("");
@@ -1296,7 +1546,6 @@ async function printPairing(relayHttpBase, code, type, name2, lang) {
1296
1546
  console.log("\u2502 " + padVisual(title, W - 2, "center") + " \u2502");
1297
1547
  console.log("\u251C" + bar + "\u2524");
1298
1548
  console.log("\u2502 " + padVisual(codeLine, W - 2) + " \u2502");
1299
- console.log("\u2502 " + padVisual(linkLine, W - 2) + " \u2502");
1300
1549
  console.log("\u2514" + bar + "\u2518");
1301
1550
  console.log(" " + hint);
1302
1551
  try {
@@ -1304,7 +1553,7 @@ async function printPairing(relayHttpBase, code, type, name2, lang) {
1304
1553
  const render = mod.default ?? mod;
1305
1554
  const toString = render.toString;
1306
1555
  if (toString) {
1307
- const qr = await toString(link, { type: "terminal", small: true });
1556
+ const qr = await toString(code, { type: "terminal", small: true });
1308
1557
  if (qr) console.log(qr);
1309
1558
  }
1310
1559
  } catch {
@@ -1730,9 +1979,6 @@ var TunnelboxBridge = class {
1730
1979
  get home() {
1731
1980
  return dshHome();
1732
1981
  }
1733
- get relayHttpBase() {
1734
- return this.relayBase.replace(/^ws/, "http").replace(/\/+$/, "");
1735
- }
1736
1982
  async start() {
1737
1983
  await this.ctx.get("loader")?.await();
1738
1984
  void this.setupAnswerer().catch((e) => this.log(`\u5E94\u7B54\u5668\u521D\u59CB\u5316\u5931\u8D25: ${e.message}`));
@@ -1770,10 +2016,6 @@ var TunnelboxBridge = class {
1770
2016
  msg.clientID = src.clientID;
1771
2017
  this.send(msg);
1772
2018
  }
1773
- pairingLink(code) {
1774
- const p = new URLSearchParams({ code, type: AGENT_TYPE, name: hostname() });
1775
- return `${this.relayHttpBase}/app/#/pages/index/index?${p.toString()}`;
1776
- }
1777
2019
  connect(url) {
1778
2020
  const agentID = this.state.agentId;
1779
2021
  const wsUrl = `${url}/ws/agent?token=${encodeURIComponent(agentID)}`;
@@ -1833,10 +2075,9 @@ ${err.stack ?? ""}`);
1833
2075
  switch (env.type) {
1834
2076
  case "pair.created": {
1835
2077
  const code = env.payload.code;
1836
- const link = this.pairingLink(code);
1837
- writePairingJson({ code, link, relayUrl: this.relayBase, at: Date.now() }, AGENT_TYPE);
2078
+ writePairingJson({ code, relayUrl: this.relayBase, at: Date.now() }, AGENT_TYPE);
1838
2079
  this.log("\u751F\u6210\u914D\u5BF9\u7801: " + code);
1839
- void printPairing(this.relayHttpBase, code, AGENT_TYPE, hostname());
2080
+ void printPairing(code, AGENT_TYPE, hostname());
1840
2081
  return;
1841
2082
  }
1842
2083
  case "agent.claimed":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tunnelbox/dsh-tunnelbox",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "tunnelbox 的 dsh 原生 Cordis 插件:手机远程驱动 DeepSeek Harness(agent/session/tools/审批/中止)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",