@tunnelbox/cursor 0.1.4 → 0.1.6

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
@@ -140,30 +140,28 @@ var zh_CN_default = {
140
140
  "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",
141
141
  "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",
142
142
  "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",
143
- "install.linkLine": "\u914D\u5BF9\u94FE\u63A5: {link}",
144
143
  "install.pluginInstalled": "\u5DF2\u5B89\u88C5\u63D2\u4EF6: {path}",
145
- "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",
144
+ "install.qrUnavailable": "\uFF08\u4E8C\u7EF4\u7801\u6E32\u67D3\u4E0D\u53EF\u7528\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u914D\u5BF9\u7801\uFF09",
146
145
  "install.qrcodeEnsure": "\u5B89\u88C5 qrcode \u5230 opencode \u914D\u7F6E\u76EE\u5F55\u2026",
147
- "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}",
146
+ "install.qrcodeFail": "qrcode \u5B89\u88C5\u5931\u8D25\uFF08\u4E0D\u5F71\u54CD\u4F7F\u7528\uFF0C\u4EC5\u663E\u793A\u914D\u5BF9\u7801\uFF09: {err}",
148
147
  "install.relayError": "\u4E2D\u7EE7\u8FD4\u56DE\u9519\u8BEF: {msg}",
149
- "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",
148
+ "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",
150
149
  "pair.heading": "tunnelbox \u624B\u673A\u914D\u5BF9",
151
- "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",
150
+ "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",
152
151
  "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",
153
- "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",
154
- "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",
155
- "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",
152
+ "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",
153
+ "pair.promptDescription": "\u663E\u793A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u7684\u914D\u5BF9\u7801\u4E0E\u626B\u7801\u4E8C\u7EF4\u7801",
154
+ "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",
156
155
  "perm.promptAuthorize": "opencode \u8BF7\u6C42\u6388\u6743",
157
156
  "perm.promptPatterns": "opencode \u8BF7\u6C42\u8BBF\u95EE\uFF1A{list}",
158
157
  "perm.promptResource": "opencode \u8BF7\u6C42\u8BBF\u95EE\u8D44\u6E90\uFF1A{list}",
159
158
  "perm.promptTool": "opencode \u8BF7\u6C42\u6267\u884C {tool}",
160
159
  "qr.codeLabel": "\u914D\u5BF9\u7801",
161
160
  "qr.fileWritten": "\u914D\u5BF9\u4FE1\u606F\u5DF2\u5199\u5165: {path}",
162
- "qr.linkLabel": "\u94FE\u63A5",
163
- "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",
161
+ "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",
164
162
  "qr.titleNoType": "tunnelbox \u624B\u673A\u914D\u5BF9",
165
163
  "qr.titleWithType": "tunnelbox {type} \u624B\u673A\u914D\u5BF9",
166
- "qr.unavailable": "\uFF08\u672A\u5B89\u88C5 qrcode\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u94FE\u63A5\u6216\u914D\u5BF9\u7801\uFF09",
164
+ "qr.unavailable": "\uFF08\u672A\u5B89\u88C5 qrcode\uFF0C\u8BF7\u4F7F\u7528\u4E0A\u65B9\u914D\u5BF9\u7801\uFF09",
167
165
  "claude.errBusy": "\u8BE5\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
168
166
  "claude.errTurn": "\u751F\u6210\u51FA\u9519",
169
167
  "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",
@@ -231,7 +229,41 @@ var zh_CN_default = {
231
229
  "claude.errReadHistory": "\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\u5931\u8D25({id})",
232
230
  "setup.langSet": "\u5DF2\u8BBE\u7F6E\u8FD0\u884C\u8BED\u8A00",
233
231
  "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",
234
- "setup.langCurrent": "\u5F53\u524D\u8FD0\u884C\u8BED\u8A00"
232
+ "setup.langCurrent": "\u5F53\u524D\u8FD0\u884C\u8BED\u8A00",
233
+ "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",
234
+ "hermes.logConnected": "\u5DF2\u8FDE\u63A5\u4E2D\u7EE7 {url}",
235
+ "hermes.logMsgUncaught": "\u6D88\u606F\u5904\u7406\u672A\u6355\u83B7\u5F02\u5E38: {message}",
236
+ "hermes.logDisconnected": "\u4E0E\u4E2D\u7EE7\u65AD\u5F00\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE\u2026",
237
+ "hermes.logPairCode": "\u751F\u6210\u914D\u5BF9\u7801: {code}",
238
+ "hermes.logUnhandledType": "\u672A\u5904\u7406\u7684\u6D88\u606F\u7C7B\u578B: {type}",
239
+ "hermes.logHandleFailed": "\u5904\u7406 {type} \u5931\u8D25: {message}",
240
+ "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",
241
+ "hermes.logResetIdentity": "\u88AB\u8D26\u53F7\u89E3\u7ED1\uFF0C\u6B63\u5728\u91CD\u7F6E\u8EAB\u4EFD\u5E76\u91CD\u65B0\u751F\u6210\u914D\u5BF9\u7801\u2026",
242
+ "hermes.cmdNew": "\u65B0\u5EFA\u4F1A\u8BDD",
243
+ "hermes.cmdHelp": "\u663E\u793A\u5E2E\u52A9",
244
+ "hermes.newSessionTitle": "\u65B0\u4F1A\u8BDD",
245
+ "hermes.helpText": "\u652F\u6301\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u5EFA\u4F1A\u8BDD\n- /help \u663E\u793A\u5E2E\u52A9",
246
+ "hermes.errBusy": "\u8BE5\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
247
+ "hermes.errBadWorkspace": "\u8BE5\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528",
248
+ "hermes.logWorkspaceSwitched": "\u5207\u6362\u5DE5\u4F5C\u533A: {path}",
249
+ "hermes.errWorkspaceMissing": "\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728: {dir}",
250
+ "hermes.errStartFailed": "\u542F\u52A8\u5931\u8D25: {message}",
251
+ "hermes.msgStarted": "Hermes \u9002\u914D\u5668\u5DF2\u542F\u52A8\uFF08Ctrl+C \u9000\u51FA\uFF09",
252
+ "hermes.logAbortSent": "\u5DF2\u53D1\u9001\u4E2D\u6B62 (session={session})",
253
+ "hermes.logPromptFailed": "session.prompt \u5931\u8D25: {message}",
254
+ "hermes.logTurnError": "\u56DE\u5408\u51FA\u9519 (session={session}): {message}",
255
+ "hermes.logPairForced": "--pair\uFF1A\u5DF2\u5F3A\u5236\u7533\u8BF7\u914D\u5BF9\u7801\uFF08\u4EC5\u672C\u6B21\uFF09",
256
+ "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",
257
+ "hermes.logPairNoRelay": "\u672A\u914D\u7F6E\u4E2D\u7EE7\u5730\u5740\uFF0C\u65E0\u6CD5\u7533\u8BF7\u914D\u5BF9\u7801",
258
+ "hermes.errSpawnHermes": "\u65E0\u6CD5\u542F\u52A8 Hermes\uFF08{bin}\uFF09\uFF1A\u8BF7\u786E\u8BA4\u5DF2\u5B89\u88C5\uFF08{err}\uFF09",
259
+ "hermes.errHermesExit": "hermes \u9000\u51FA({code}): {err}",
260
+ "hermes.logSessionUpdated": "\u4F1A\u8BDD\u5DF2\u66F4\u65B0 (session={session})",
261
+ "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",
262
+ "hermes.pairNoRelay": "\u65E0\u6CD5\u8FDE\u63A5\u4E2D\u7EE7\uFF08relay \u4E0D\u53EF\u8FBE\u6216 websockets \u7F3A\u5931\uFF09",
263
+ "hermes.pairTimeout": "\u7533\u8BF7\u914D\u5BF9\u7801\u8D85\u65F6\uFF08\u4E2D\u7EE7\u672A\u54CD\u5E94\uFF09",
264
+ "hermes.errToolPair": "tunnelbox_pair \u5931\u8D25: {err}",
265
+ "hermes.errToolStatus": "tunnelbox_status \u5931\u8D25: {err}",
266
+ "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"
235
267
  };
236
268
 
237
269
  // ../core/locales/zh-TW.json
@@ -269,30 +301,28 @@ var zh_TW_default = {
269
301
  "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",
270
302
  "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",
271
303
  "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",
272
- "install.linkLine": "\u914D\u5C0D\u9023\u7D50: {link}",
273
304
  "install.pluginInstalled": "\u5DF2\u5B89\u88DD\u5916\u639B: {path}",
274
- "install.qrUnavailable": "\uFF08QR Code \u7121\u6CD5\u986F\u793A\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u914D\u5C0D\u9023\u7D50\u6216\u914D\u5C0D\u78BC\uFF09",
305
+ "install.qrUnavailable": "\uFF08QR Code \u7121\u6CD5\u986F\u793A\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u914D\u5C0D\u78BC\uFF09",
275
306
  "install.qrcodeEnsure": "\u6B63\u5728\u5C07 qrcode \u5B89\u88DD\u5230 opencode \u8A2D\u5B9A\u76EE\u9304\u2026",
276
- "install.qrcodeFail": "qrcode \u5B89\u88DD\u5931\u6557\uFF08\u4E0D\u5F71\u97FF\u4F7F\u7528\uFF0CQR Code \u6703\u964D\u7D1A\u70BA\u9023\u7D50\uFF09: {err}",
307
+ "install.qrcodeFail": "qrcode \u5B89\u88DD\u5931\u6557\uFF08\u4E0D\u5F71\u97FF\u4F7F\u7528\uFF0C\u50C5\u986F\u793A\u914D\u5C0D\u78BC\uFF09: {err}",
277
308
  "install.relayError": "\u4E2D\u7E7C\u50B3\u56DE\u932F\u8AA4: {msg}",
278
- "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",
309
+ "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",
279
310
  "pair.heading": "tunnelbox \u624B\u6A5F\u914D\u5C0D",
280
- "pair.howTo": "\u5728\u624B\u6A5F\u700F\u89BD\u5668\u958B\u555F\u9023\u7D50\uFF0C\u6216\u958B\u555F tunnelbox App \u8F38\u5165\u914D\u5C0D\u78BC\u3002",
311
+ "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",
281
312
  "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",
282
- "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",
283
- "pair.promptDescription": "\u986F\u793A\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u7684\u914D\u5C0D\u78BC\u3001\u914D\u5C0D\u9023\u7D50\u8207\u6383\u78BC QR Code",
284
- "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",
313
+ "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",
314
+ "pair.promptDescription": "\u986F\u793A\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u7684\u914D\u5C0D\u78BC\u8207\u6383\u78BC QR Code",
315
+ "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",
285
316
  "perm.promptAuthorize": "opencode \u8ACB\u6C42\u6388\u6B0A",
286
317
  "perm.promptPatterns": "opencode \u8ACB\u6C42\u5B58\u53D6\uFF1A{list}",
287
318
  "perm.promptResource": "opencode \u8ACB\u6C42\u5B58\u53D6\u8CC7\u6E90\uFF1A{list}",
288
319
  "perm.promptTool": "opencode \u8ACB\u6C42\u57F7\u884C {tool}",
289
320
  "qr.codeLabel": "\u914D\u5C0D\u78BC",
290
321
  "qr.fileWritten": "\u914D\u5C0D\u8CC7\u8A0A\u5DF2\u5BEB\u5165: {path}",
291
- "qr.linkLabel": "\u9023\u7D50",
292
- "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",
322
+ "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",
293
323
  "qr.titleNoType": "tunnelbox \u624B\u6A5F\u914D\u5C0D",
294
324
  "qr.titleWithType": "tunnelbox {type} \u624B\u6A5F\u914D\u5C0D",
295
- "qr.unavailable": "\uFF08\u672A\u5B89\u88DD qrcode\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u9023\u7D50\u6216\u914D\u5C0D\u78BC\uFF09",
325
+ "qr.unavailable": "\uFF08\u672A\u5B89\u88DD qrcode\uFF0C\u8ACB\u4F7F\u7528\u4E0A\u65B9\u914D\u5C0D\u78BC\uFF09",
296
326
  "claude.errBusy": "\u8A72\u6703\u8A71\u6B63\u5728\u7522\u751F\u4E2D\uFF0C\u8ACB\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
297
327
  "claude.errTurn": "\u7522\u751F\u51FA\u932F",
298
328
  "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",
@@ -360,7 +390,41 @@ var zh_TW_default = {
360
390
  "claude.errReadHistory": "\u8B80\u53D6\u6703\u8A71\u6B77\u53F2\u5931\u6557({id})",
361
391
  "setup.langSet": "\u5DF2\u8A2D\u5B9A\u57F7\u884C\u8A9E\u8A00",
362
392
  "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",
363
- "setup.langCurrent": "\u76EE\u524D\u57F7\u884C\u8A9E\u8A00"
393
+ "setup.langCurrent": "\u76EE\u524D\u57F7\u884C\u8A9E\u8A00",
394
+ "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",
395
+ "hermes.logConnected": "\u5DF2\u9023\u7DDA\u4E2D\u7E7C {url}",
396
+ "hermes.logMsgUncaught": "\u8A0A\u606F\u8655\u7406\u672A\u6355\u7372\u4F8B\u5916: {message}",
397
+ "hermes.logDisconnected": "\u8207\u4E2D\u7E7C\u65B7\u7DDA\uFF0C\u6B63\u5728\u81EA\u52D5\u91CD\u65B0\u9023\u7DDA\u2026",
398
+ "hermes.logPairCode": "\u7522\u751F\u914D\u5C0D\u78BC: {code}",
399
+ "hermes.logUnhandledType": "\u672A\u8655\u7406\u7684\u8A0A\u606F\u985E\u578B: {type}",
400
+ "hermes.logHandleFailed": "\u8655\u7406 {type} \u5931\u6557: {message}",
401
+ "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",
402
+ "hermes.logResetIdentity": "\u88AB\u5E33\u865F\u89E3\u7D81\uFF0C\u6B63\u5728\u91CD\u8A2D\u8EAB\u5206\u4E26\u91CD\u65B0\u7522\u751F\u914D\u5C0D\u78BC\u2026",
403
+ "hermes.cmdNew": "\u65B0\u589E\u6703\u8A71",
404
+ "hermes.cmdHelp": "\u986F\u793A\u8AAA\u660E",
405
+ "hermes.newSessionTitle": "\u65B0\u6703\u8A71",
406
+ "hermes.helpText": "\u652F\u63F4\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u589E\u6703\u8A71\n- /help \u986F\u793A\u8AAA\u660E",
407
+ "hermes.errBusy": "\u6B64\u6703\u8A71\u6B63\u5728\u7522\u751F\u4E2D\uFF0C\u8ACB\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
408
+ "hermes.errBadWorkspace": "\u6B64\u76EE\u9304\u4E0D\u5B58\u5728\u6216\u7121\u6CD5\u4F7F\u7528",
409
+ "hermes.logWorkspaceSwitched": "\u5207\u63DB\u5DE5\u4F5C\u5340: {path}",
410
+ "hermes.errWorkspaceMissing": "\u5DE5\u4F5C\u5340\u4E0D\u5B58\u5728: {dir}",
411
+ "hermes.errStartFailed": "\u555F\u52D5\u5931\u6557: {message}",
412
+ "hermes.msgStarted": "Hermes \u4ECB\u63A5\u5668\u5DF2\u555F\u52D5\uFF08Ctrl+C \u9000\u51FA\uFF09",
413
+ "hermes.logAbortSent": "\u5DF2\u50B3\u9001\u4E2D\u6B62 (session={session})",
414
+ "hermes.logPromptFailed": "session.prompt \u5931\u6557: {message}",
415
+ "hermes.logTurnError": "\u56DE\u5408\u51FA\u932F (session={session}): {message}",
416
+ "hermes.logPairForced": "--pair\uFF1A\u5DF2\u5F37\u5236\u7533\u8ACB\u914D\u5C0D\u78BC\uFF08\u50C5\u672C\u6B21\uFF09",
417
+ "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",
418
+ "hermes.logPairNoRelay": "\u672A\u8A2D\u5B9A\u4E2D\u7E7C\u4F4D\u5740\uFF0C\u7121\u6CD5\u7533\u8ACB\u914D\u5C0D\u78BC",
419
+ "hermes.errSpawnHermes": "\u7121\u6CD5\u555F\u52D5 Hermes\uFF08{bin}\uFF09\uFF1A\u8ACB\u78BA\u8A8D\u5DF2\u5B89\u88DD\uFF08{err}\uFF09",
420
+ "hermes.errHermesExit": "hermes \u9000\u51FA({code}): {err}",
421
+ "hermes.logSessionUpdated": "\u6703\u8A71\u5DF2\u66F4\u65B0 (session={session})",
422
+ "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",
423
+ "hermes.pairNoRelay": "\u7121\u6CD5\u9023\u7DDA\u4E2D\u7E7C\uFF08relay \u4E0D\u53EF\u9054\u6216 websockets \u7F3A\u5931\uFF09",
424
+ "hermes.pairTimeout": "\u7533\u8ACB\u914D\u5C0D\u78BC\u903E\u6642\uFF08\u4E2D\u7E7C\u672A\u56DE\u61C9\uFF09",
425
+ "hermes.errToolPair": "tunnelbox_pair \u5931\u6557: {err}",
426
+ "hermes.errToolStatus": "tunnelbox_status \u5931\u6557: {err}",
427
+ "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"
364
428
  };
365
429
 
366
430
  // ../core/locales/en-US.json
@@ -398,30 +462,28 @@ var en_US_default = {
398
462
  "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.",
399
463
  "install.failConnectHint": "After restarting opencode, check the terminal QR code with --print-logs, or type \u201Cshow phone pairing code\u201D / /pair inside opencode.)",
400
464
  "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.",
401
- "install.linkLine": "Pairing link: {link}",
402
465
  "install.pluginInstalled": "Installed plugin: {path}",
403
- "install.qrUnavailable": "(QR rendering unavailable \u2014 use the pairing link or code above)",
466
+ "install.qrUnavailable": "(QR rendering unavailable \u2014 use the pairing code above)",
404
467
  "install.qrcodeEnsure": "Installing qrcode into the opencode config directory\u2026",
405
- "install.qrcodeFail": "qrcode installation failed (not critical \u2014 the QR code degrades to a link): {err}",
468
+ "install.qrcodeFail": "qrcode installation failed (not critical \u2014 only the pairing code is shown): {err}",
406
469
  "install.relayError": "Relay returned an error: {msg}",
407
- "install.scanHint": "Open tunnelbox on your phone, tap \u201CScan to pair\u201D, or point your camera at the QR code below to connect:",
470
+ "install.scanHint": "Open tunnelbox on your phone, tap \u201CScan to pair\u201D, and scan the QR code above to connect:",
408
471
  "pair.heading": "tunnelbox phone pairing",
409
- "pair.howTo": "Open the link in your phone browser, or enter the pairing code in the tunnelbox app.",
472
+ "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.",
410
473
  "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.",
411
- "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.",
412
- "pair.promptDescription": "Show the phone pairing code, pairing link and scan-able QR code",
413
- "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.",
474
+ "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.",
475
+ "pair.promptDescription": "Show the phone pairing code and scan-able QR code",
476
+ "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.",
414
477
  "perm.promptAuthorize": "opencode requests authorization",
415
478
  "perm.promptPatterns": "opencode requests access to: {list}",
416
479
  "perm.promptResource": "opencode requests access to resources: {list}",
417
480
  "perm.promptTool": "opencode requests to run {tool}",
418
481
  "qr.codeLabel": "Pairing code",
419
482
  "qr.fileWritten": "Pairing info written to: {path}",
420
- "qr.linkLabel": "Link",
421
- "qr.openHint": "Open the link in your phone browser, or enter the pairing code manually in the app.",
483
+ "qr.openHint": "Open the tunnelbox app on your phone and scan the QR code above, or enter the pairing code manually in the app.",
422
484
  "qr.titleNoType": "tunnelbox phone pairing",
423
485
  "qr.titleWithType": "tunnelbox {type} phone pairing",
424
- "qr.unavailable": "(qrcode not installed \u2014 use the link or pairing code above)",
486
+ "qr.unavailable": "(qrcode not installed \u2014 use the pairing code above)",
425
487
  "claude.errBusy": "This session is still running; wait for it to finish or stop it first",
426
488
  "claude.errTurn": "generation error",
427
489
  "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",
@@ -489,7 +551,41 @@ var en_US_default = {
489
551
  "claude.errReadHistory": "Failed to read session history ({id})",
490
552
  "setup.langSet": "Runtime language set to",
491
553
  "setup.langHint": "The adapter will output in this language after restart (runtime TUNNELBOX_LANG can override). State file:",
492
- "setup.langCurrent": "Current runtime language"
554
+ "setup.langCurrent": "Current runtime language",
555
+ "hermes.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
556
+ "hermes.logConnected": "Connected to relay {url}",
557
+ "hermes.logMsgUncaught": "Uncaught exception while handling message: {message}",
558
+ "hermes.logDisconnected": "Disconnected from relay, reconnecting automatically\u2026",
559
+ "hermes.logPairCode": "Generated pairing code: {code}",
560
+ "hermes.logUnhandledType": "Unhandled message type: {type}",
561
+ "hermes.logHandleFailed": "Failed to handle {type}: {message}",
562
+ "hermes.logClaimed": "Bound to your phone account. From now on the phone connects directly from My Computers",
563
+ "hermes.logResetIdentity": "Unbound from the account; resetting identity and generating a new pairing code\u2026",
564
+ "hermes.cmdNew": "New session",
565
+ "hermes.cmdHelp": "Show help",
566
+ "hermes.newSessionTitle": "New session",
567
+ "hermes.helpText": "Supported commands:\n- /new new session\n- /help show help",
568
+ "hermes.errBusy": "This session is still running; wait for it to finish or stop it first",
569
+ "hermes.errBadWorkspace": "Directory does not exist or is unusable",
570
+ "hermes.logWorkspaceSwitched": "Switched workspace: {path}",
571
+ "hermes.errWorkspaceMissing": "Workspace does not exist: {dir}",
572
+ "hermes.errStartFailed": "Failed to start: {message}",
573
+ "hermes.msgStarted": "Hermes adapter started (Ctrl+C to quit)",
574
+ "hermes.logAbortSent": "Abort sent (session={session})",
575
+ "hermes.logPromptFailed": "session.prompt failed: {message}",
576
+ "hermes.logTurnError": "Turn error (session={session}): {message}",
577
+ "hermes.logPairForced": "--pair: forcing a pairing code request (this run only)",
578
+ "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",
579
+ "hermes.logPairNoRelay": "Cannot request a pairing code: no relay URL configured",
580
+ "hermes.errSpawnHermes": "Cannot start Hermes ({bin}): please confirm it is installed ({err})",
581
+ "hermes.errHermesExit": "hermes exited ({code}): {err}",
582
+ "hermes.logSessionUpdated": "Session updated (session={session})",
583
+ "hermes.errNoInject": "Phone message injection unavailable (session not interactive or process not ready)",
584
+ "hermes.pairNoRelay": "Cannot reach the relay (relay unreachable or websockets missing)",
585
+ "hermes.pairTimeout": "Timed out requesting a pairing code (relay did not respond)",
586
+ "hermes.errToolPair": "tunnelbox_pair failed: {err}",
587
+ "hermes.errToolStatus": "tunnelbox_status failed: {err}",
588
+ "hermes.cliUsage": "Usage: /tunnelbox <pair|status>\n pair request and print a phone pairing code\n status show relay/binding/connection status"
493
589
  };
494
590
 
495
591
  // ../core/locales/ja-JP.json
@@ -527,30 +623,28 @@ var ja_JP_default = {
527
623
  "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",
528
624
  "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",
529
625
  "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",
530
- "install.linkLine": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30EA\u30F3\u30AF: {link}",
531
626
  "install.pluginInstalled": "\u30D7\u30E9\u30B0\u30A4\u30F3\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB: {path}",
532
- "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",
627
+ "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",
533
628
  "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",
534
- "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}",
629
+ "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}",
535
630
  "install.relayError": "\u30EA\u30EC\u30FC\u304C\u30A8\u30E9\u30FC\u3092\u8FD4\u3057\u307E\u3057\u305F: {msg}",
536
- "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",
631
+ "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",
537
632
  "pair.heading": "tunnelbox \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
538
- "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",
633
+ "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",
539
634
  "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",
540
- "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",
541
- "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",
542
- "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",
635
+ "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",
636
+ "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",
637
+ "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",
543
638
  "perm.promptAuthorize": "opencode \u304C\u8A8D\u53EF\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
544
639
  "perm.promptPatterns": "opencode \u304C\u30A2\u30AF\u30BB\u30B9\u3092\u8981\u6C42: {list}",
545
640
  "perm.promptResource": "opencode \u304C\u30EA\u30BD\u30FC\u30B9\u3078\u306E\u30A2\u30AF\u30BB\u30B9\u3092\u8981\u6C42: {list}",
546
641
  "perm.promptTool": "opencode \u304C {tool} \u306E\u5B9F\u884C\u3092\u8981\u6C42",
547
642
  "qr.codeLabel": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9",
548
643
  "qr.fileWritten": "\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u66F8\u304D\u8FBC\u307F\u307E\u3057\u305F: {path}",
549
- "qr.linkLabel": "\u30EA\u30F3\u30AF",
550
- "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",
644
+ "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",
551
645
  "qr.titleNoType": "tunnelbox \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
552
646
  "qr.titleWithType": "tunnelbox {type} \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
553
- "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",
647
+ "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",
554
648
  "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",
555
649
  "claude.errTurn": "\u751F\u6210\u30A8\u30E9\u30FC",
556
650
  "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",
@@ -618,7 +712,41 @@ var ja_JP_default = {
618
712
  "claude.errReadHistory": "\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557\uFF08{id}\uFF09",
619
713
  "setup.langSet": "\u5B9F\u884C\u8A00\u8A9E\u3092\u8A2D\u5B9A\u3057\u307E\u3057\u305F",
620
714
  "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",
621
- "setup.langCurrent": "\u73FE\u5728\u306E\u5B9F\u884C\u8A00\u8A9E"
715
+ "setup.langCurrent": "\u73FE\u5728\u306E\u5B9F\u884C\u8A00\u8A9E",
716
+ "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",
717
+ "hermes.logConnected": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F {url}",
718
+ "hermes.logMsgUncaught": "\u30E1\u30C3\u30BB\u30FC\u30B8\u51E6\u7406\u4E2D\u306E\u672A\u6355\u6349\u4F8B\u5916: {message}",
719
+ "hermes.logDisconnected": "\u30EA\u30EC\u30FC\u304B\u3089\u5207\u65AD\u3001\u81EA\u52D5\u518D\u63A5\u7D9A\u4E2D\u2026",
720
+ "hermes.logPairCode": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210: {code}",
721
+ "hermes.logUnhandledType": "\u672A\u51E6\u7406\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7: {type}",
722
+ "hermes.logHandleFailed": "{type} \u306E\u51E6\u7406\u306B\u5931\u6557: {message}",
723
+ "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",
724
+ "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",
725
+ "hermes.cmdNew": "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3",
726
+ "hermes.cmdHelp": "\u30D8\u30EB\u30D7\u3092\u8868\u793A",
727
+ "hermes.newSessionTitle": "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3",
728
+ "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",
729
+ "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",
730
+ "hermes.errBadWorkspace": "\u3053\u306E\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u306F\u5B58\u5728\u3057\u306A\u3044\u304B\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093",
731
+ "hermes.logWorkspaceSwitched": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u5207\u66FF: {path}",
732
+ "hermes.errWorkspaceMissing": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093: {dir}",
733
+ "hermes.errStartFailed": "\u8D77\u52D5\u306B\u5931\u6557: {message}",
734
+ "hermes.msgStarted": "Hermes \u30A2\u30C0\u30D7\u30BF\u3092\u8D77\u52D5\u3057\u307E\u3057\u305F\uFF08Ctrl+C \u3067\u7D42\u4E86\uFF09",
735
+ "hermes.logAbortSent": "\u4E2D\u6B62\u3092\u9001\u4FE1 (session={session})",
736
+ "hermes.logPromptFailed": "session.prompt \u306B\u5931\u6557: {message}",
737
+ "hermes.logTurnError": "\u30BF\u30FC\u30F3\u30A8\u30E9\u30FC (session={session}): {message}",
738
+ "hermes.logPairForced": "--pair\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u5F37\u5236\u53D6\u5F97\uFF08\u4ECA\u56DE\u306E\u307F\uFF09",
739
+ "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",
740
+ "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",
741
+ "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",
742
+ "hermes.errHermesExit": "hermes \u7D42\u4E86({code}): {err}",
743
+ "hermes.logSessionUpdated": "\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u66F4\u65B0 (session={session})",
744
+ "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",
745
+ "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",
746
+ "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",
747
+ "hermes.errToolPair": "tunnelbox_pair \u5931\u6557: {err}",
748
+ "hermes.errToolStatus": "tunnelbox_status \u5931\u6557: {err}",
749
+ "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"
622
750
  };
623
751
 
624
752
  // ../core/locales/ko-KR.json
@@ -656,30 +784,28 @@ var ko_KR_default = {
656
784
  "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.",
657
785
  "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.)",
658
786
  "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.",
659
- "install.linkLine": "\uD398\uC5B4\uB9C1 \uB9C1\uD06C: {link}",
660
787
  "install.pluginInstalled": "\uD50C\uB7EC\uADF8\uC778 \uC124\uCE58\uB428: {path}",
661
- "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)",
788
+ "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)",
662
789
  "install.qrcodeEnsure": "qrcode\uB97C opencode \uC124\uC815 \uB514\uB809\uD130\uB9AC\uC5D0 \uC124\uCE58\uD558\uB294 \uC911\u2026",
663
- "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}",
790
+ "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}",
664
791
  "install.relayError": "\uB9B4\uB808\uC774 \uC624\uB958 \uC751\uB2F5: {msg}",
665
- "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:",
792
+ "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:",
666
793
  "pair.heading": "tunnelbox \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
667
- "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.",
794
+ "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.",
668
795
  "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.",
669
- "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.",
670
- "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",
671
- "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.",
796
+ "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.",
797
+ "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",
798
+ "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.",
672
799
  "perm.promptAuthorize": "opencode\uAC00 \uAD8C\uD55C\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
673
800
  "perm.promptPatterns": "opencode\uAC00 \uC811\uADFC\uC744 \uC694\uCCAD: {list}",
674
801
  "perm.promptResource": "opencode\uAC00 \uB9AC\uC18C\uC2A4 \uC811\uADFC\uC744 \uC694\uCCAD: {list}",
675
802
  "perm.promptTool": "opencode\uAC00 {tool} \uC2E4\uD589\uC744 \uC694\uCCAD",
676
803
  "qr.codeLabel": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC",
677
804
  "qr.fileWritten": "\uD398\uC5B4\uB9C1 \uC815\uBCF4\uAC00 \uAE30\uB85D\uB428: {path}",
678
- "qr.linkLabel": "\uB9C1\uD06C",
679
- "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.",
805
+ "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.",
680
806
  "qr.titleNoType": "tunnelbox \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
681
807
  "qr.titleWithType": "tunnelbox {type} \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
682
- "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)",
808
+ "qr.unavailable": "(qrcode\uAC00 \uC124\uCE58\uB418\uC9C0 \uC54A\uC74C \u2014 \uC704\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0AC\uC6A9\uD558\uC138\uC694)",
683
809
  "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",
684
810
  "claude.errTurn": "\uC0DD\uC131 \uC624\uB958",
685
811
  "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",
@@ -747,7 +873,41 @@ var ko_KR_default = {
747
873
  "claude.errReadHistory": "\uC138\uC158 \uAE30\uB85D\uC744 \uC77D\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4({id})",
748
874
  "setup.langSet": "\uC2E4\uD589 \uC5B8\uC5B4\uB97C \uC124\uC815\uD588\uC2B5\uB2C8\uB2E4",
749
875
  "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:",
750
- "setup.langCurrent": "\uD604\uC7AC \uC2E4\uD589 \uC5B8\uC5B4"
876
+ "setup.langCurrent": "\uD604\uC7AC \uC2E4\uD589 \uC5B8\uC5B4",
877
+ "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",
878
+ "hermes.logConnected": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uB428 {url}",
879
+ "hermes.logMsgUncaught": "\uBA54\uC2DC\uC9C0 \uCC98\uB9AC \uC911 \uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uC608\uC678: {message}",
880
+ "hermes.logDisconnected": "\uB9B4\uB808\uC774\uC640 \uC5F0\uACB0 \uB04A\uAE40, \uC790\uB3D9 \uC7AC\uC5F0\uACB0 \uC911\u2026",
881
+ "hermes.logPairCode": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131: {code}",
882
+ "hermes.logUnhandledType": "\uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0 \uC720\uD615: {type}",
883
+ "hermes.logHandleFailed": "{type} \uCC98\uB9AC \uC2E4\uD328: {message}",
884
+ "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",
885
+ "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",
886
+ "hermes.cmdNew": "\uC0C8 \uC138\uC158",
887
+ "hermes.cmdHelp": "\uB3C4\uC6C0\uB9D0 \uD45C\uC2DC",
888
+ "hermes.newSessionTitle": "\uC0C8 \uC138\uC158",
889
+ "hermes.helpText": "\uC9C0\uC6D0 \uBA85\uB839:\n- /new \uC0C8 \uC138\uC158\n- /help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC",
890
+ "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",
891
+ "hermes.errBadWorkspace": "\uC774 \uB514\uB809\uD1A0\uB9AC\uB294 \uC874\uC7AC\uD558\uC9C0 \uC54A\uAC70\uB098 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
892
+ "hermes.logWorkspaceSwitched": "\uC791\uC5C5\uACF5\uAC04 \uC804\uD658: {path}",
893
+ "hermes.errWorkspaceMissing": "\uC791\uC5C5\uACF5\uAC04\uC774 \uC5C6\uC2B5\uB2C8\uB2E4: {dir}",
894
+ "hermes.errStartFailed": "\uC2DC\uC791 \uC2E4\uD328: {message}",
895
+ "hermes.msgStarted": "Hermes \uC5B4\uB311\uD130 \uC2DC\uC791\uB428 (Ctrl+C\uB85C \uC885\uB8CC)",
896
+ "hermes.logAbortSent": "\uC911\uC9C0 \uC804\uC1A1\uB428 (session={session})",
897
+ "hermes.logPromptFailed": "session.prompt \uC2E4\uD328: {message}",
898
+ "hermes.logTurnError": "\uD134 \uC624\uB958 (session={session}): {message}",
899
+ "hermes.logPairForced": "--pair: \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uAC15\uC81C \uC694\uCCAD (\uC774\uBC88\uC5D0\uB9CC)",
900
+ "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",
901
+ "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",
902
+ "hermes.errSpawnHermes": "Hermes({bin})\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: \uC124\uCE58 \uC5EC\uBD80\uB97C \uD655\uC778\uD558\uC138\uC694 ({err})",
903
+ "hermes.errHermesExit": "hermes \uC885\uB8CC({code}): {err}",
904
+ "hermes.logSessionUpdated": "\uC138\uC158 \uC5C5\uB370\uC774\uD2B8\uB428 (session={session})",
905
+ "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)",
906
+ "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)",
907
+ "hermes.pairTimeout": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD \uC2DC\uAC04 \uCD08\uACFC(\uB9B4\uB808\uC774 \uBBF8\uC751\uB2F5)",
908
+ "hermes.errToolPair": "tunnelbox_pair \uC2E4\uD328: {err}",
909
+ "hermes.errToolStatus": "tunnelbox_status \uC2E4\uD328: {err}",
910
+ "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"
751
911
  };
752
912
 
753
913
  // ../core/locales/fr-FR.json
@@ -785,30 +945,28 @@ var fr_FR_default = {
785
945
  "install.failConnect": "(Impossible de se connecter au relais pour afficher l'appairage \u2014 relais injoignable ou version de Node trop ancienne.",
786
946
  "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.)",
787
947
  "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.",
788
- "install.linkLine": "Lien d'appairage : {link}",
789
948
  "install.pluginInstalled": "Plugin install\xE9 : {path}",
790
- "install.qrUnavailable": "(Rendu du QR indisponible \u2014 utilisez le lien ou le code ci-dessus)",
949
+ "install.qrUnavailable": "(Rendu du QR indisponible \u2014 utilisez le code ci-dessus)",
791
950
  "install.qrcodeEnsure": "Installation de qrcode dans le r\xE9pertoire de configuration d'opencode\u2026",
792
- "install.qrcodeFail": "\xC9chec de l'installation de qrcode (sans cons\xE9quence \u2014 le QR est remplac\xE9 par un lien) : {err}",
951
+ "install.qrcodeFail": "\xC9chec de l'installation de qrcode (sans cons\xE9quence \u2014 seul le code d'appairage est affich\xE9) : {err}",
793
952
  "install.relayError": "Le relais a renvoy\xE9 une erreur : {msg}",
794
- "install.scanHint": "Ouvrez tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, ou scannez le QR ci-dessous avec la cam\xE9ra :",
953
+ "install.scanHint": "Ouvrez tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, puis scannez le QR ci-dessus pour connecter :",
795
954
  "pair.heading": "Appairage t\xE9l\xE9phone tunnelbox",
796
- "pair.howTo": "Ouvrez le lien dans le navigateur du t\xE9l\xE9phone, ou saisissez le code d'appairage dans l'application tunnelbox.",
955
+ "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.",
797
956
  "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.",
798
- "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.",
799
- "pair.promptDescription": "Afficher le code d'appairage, le lien et le QR code scannable",
800
- "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.",
957
+ "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.",
958
+ "pair.promptDescription": "Afficher le code d'appairage et le QR code scannable",
959
+ "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.",
801
960
  "perm.promptAuthorize": "opencode demande une autorisation",
802
961
  "perm.promptPatterns": "opencode demande l'acc\xE8s \xE0 : {list}",
803
962
  "perm.promptResource": "opencode demande l'acc\xE8s aux ressources : {list}",
804
963
  "perm.promptTool": "opencode demande d'ex\xE9cuter {tool}",
805
964
  "qr.codeLabel": "Code d'appairage",
806
965
  "qr.fileWritten": "Informations d'appairage \xE9crites dans : {path}",
807
- "qr.linkLabel": "Lien",
808
- "qr.openHint": "Ouvrez le lien dans le navigateur du t\xE9l\xE9phone, ou saisissez le code d'appairage dans l'application.",
966
+ "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.",
809
967
  "qr.titleNoType": "appairage t\xE9l\xE9phone tunnelbox",
810
968
  "qr.titleWithType": "appairage t\xE9l\xE9phone tunnelbox {type}",
811
- "qr.unavailable": "(qrcode non install\xE9 \u2014 utilisez le lien ou le code d'appairage ci-dessus)",
969
+ "qr.unavailable": "(qrcode non install\xE9 \u2014 utilisez le code d'appairage ci-dessus)",
812
970
  "claude.errBusy": "Cette session est en cours d'ex\xE9cution ; attendez la fin ou arr\xEAtez-la d'abord",
813
971
  "claude.errTurn": "erreur de g\xE9n\xE9ration",
814
972
  "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",
@@ -876,7 +1034,41 @@ var fr_FR_default = {
876
1034
  "claude.errReadHistory": "\xC9chec de la lecture de l'historique de session ({id})",
877
1035
  "setup.langSet": "Langue d'ex\xE9cution d\xE9finie sur",
878
1036
  "setup.langHint": "L'adaptateur utilisera cette langue au prochain d\xE9marrage (TUNNELBOX_LANG peut la remplacer). Fichier d'\xE9tat :",
879
- "setup.langCurrent": "Langue d'ex\xE9cution actuelle"
1037
+ "setup.langCurrent": "Langue d'ex\xE9cution actuelle",
1038
+ "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",
1039
+ "hermes.logConnected": "Connect\xE9 au relais {url}",
1040
+ "hermes.logMsgUncaught": "Exception non intercept\xE9e lors du traitement du message : {message}",
1041
+ "hermes.logDisconnected": "D\xE9connect\xE9 du relais, reconnexion automatique\u2026",
1042
+ "hermes.logPairCode": "Code d'appairage g\xE9n\xE9r\xE9 : {code}",
1043
+ "hermes.logUnhandledType": "Type de message non trait\xE9 : {type}",
1044
+ "hermes.logHandleFailed": "\xC9chec du traitement de {type} : {message}",
1045
+ "hermes.logClaimed": "Li\xE9 \xE0 votre compte t\xE9l\xE9phone. Le t\xE9l\xE9phone se connecte d\xE9sormais directement depuis Mes ordinateurs",
1046
+ "hermes.logResetIdentity": "Dissoci\xE9 du compte ; r\xE9initialisation de l'identit\xE9 et g\xE9n\xE9ration d'un nouveau code d'appairage\u2026",
1047
+ "hermes.cmdNew": "Nouvelle session",
1048
+ "hermes.cmdHelp": "Afficher l'aide",
1049
+ "hermes.newSessionTitle": "Nouvelle session",
1050
+ "hermes.helpText": "Commandes prises en charge :\n- /new nouvelle session\n- /help afficher l'aide",
1051
+ "hermes.errBusy": "Cette session est en cours de g\xE9n\xE9ration ; attendez la fin ou arr\xEAtez-la d'abord",
1052
+ "hermes.errBadWorkspace": "Ce r\xE9pertoire n'existe pas ou est inutilisable",
1053
+ "hermes.logWorkspaceSwitched": "Espace de travail chang\xE9 : {path}",
1054
+ "hermes.errWorkspaceMissing": "L'espace de travail n'existe pas : {dir}",
1055
+ "hermes.errStartFailed": "\xC9chec du d\xE9marrage : {message}",
1056
+ "hermes.msgStarted": "Adaptateur Hermes d\xE9marr\xE9 (Ctrl+C pour quitter)",
1057
+ "hermes.logAbortSent": "Interruption envoy\xE9e (session={session})",
1058
+ "hermes.logPromptFailed": "session.prompt a \xE9chou\xE9 : {message}",
1059
+ "hermes.logTurnError": "Erreur de tour (session={session}) : {message}",
1060
+ "hermes.logPairForced": "--pair : demande forc\xE9e du code d'appairage (cet ex\xE9cution uniquement)",
1061
+ "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",
1062
+ "hermes.logPairNoRelay": "Impossible de demander un code d'appairage : URL du relais non configur\xE9e",
1063
+ "hermes.errSpawnHermes": "Impossible de d\xE9marrer Hermes ({bin}) : v\xE9rifiez qu'il est install\xE9 ({err})",
1064
+ "hermes.errHermesExit": "hermes a quitt\xE9 ({code}) : {err}",
1065
+ "hermes.logSessionUpdated": "Session mise \xE0 jour (session={session})",
1066
+ "hermes.errNoInject": "Injection du message t\xE9l\xE9phone indisponible (session non interactive ou processus non pr\xEAt)",
1067
+ "hermes.pairNoRelay": "Impossible de joindre le relais (relais injoignable ou websockets manquant)",
1068
+ "hermes.pairTimeout": "D\xE9lai d\xE9pass\xE9 pour le code d'appairage (relais sans r\xE9ponse)",
1069
+ "hermes.errToolPair": "\xE9chec de tunnelbox_pair : {err}",
1070
+ "hermes.errToolStatus": "\xE9chec de tunnelbox_status : {err}",
1071
+ "hermes.cliUsage": "Utilisation : /tunnelbox <pair|status>\n pair demander et afficher un code d'appairage\n status afficher l'\xE9tat relais/liaison/connexion"
880
1072
  };
881
1073
 
882
1074
  // ../core/locales/de-DE.json
@@ -914,30 +1106,28 @@ var de_DE_default = {
914
1106
  "install.failConnect": "(Keine sofortige Verbindung zum Relay zum Drucken der Pairing-Informationen m\xF6glich \u2014 Relay nicht erreichbar oder Node zu alt.",
915
1107
  "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.)",
916
1108
  "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.",
917
- "install.linkLine": "Pairing-Link: {link}",
918
1109
  "install.pluginInstalled": "Plugin installiert: {path}",
919
- "install.qrUnavailable": "(QR-Darstellung nicht verf\xFCgbar \u2014 nutzen Sie den Link oder Code oben)",
1110
+ "install.qrUnavailable": "(QR-Darstellung nicht verf\xFCgbar \u2014 nutzen Sie den Code oben)",
920
1111
  "install.qrcodeEnsure": "Installiere qrcode in das opencode-Konfigurationsverzeichnis\u2026",
921
- "install.qrcodeFail": "qrcode-Installation fehlgeschlagen (nicht kritisch \u2014 QR wird durch einen Link ersetzt): {err}",
1112
+ "install.qrcodeFail": "qrcode-Installation fehlgeschlagen (nicht kritisch \u2014 nur der Pairing-Code wird angezeigt): {err}",
922
1113
  "install.relayError": "Relay hat einen Fehler zur\xFCckgegeben: {msg}",
923
- "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:",
1114
+ "install.scanHint": "\xD6ffnen Sie tunnelbox auf dem Telefon, tippen Sie auf \u201CZum Pairing scannen\u201D und scannen Sie den QR-Code oben zum Verbinden:",
924
1115
  "pair.heading": "tunnelbox Telefon-Pairing",
925
- "pair.howTo": "\xD6ffnen Sie den Link im Telefon-Browser oder geben Sie den Pairing-Code in der tunnelbox-App ein.",
1116
+ "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.",
926
1117
  "pair.oneTime": "Der Pairing-Code ist einmalig und verf\xE4llt nach der Nutzung; f\xFCr einen neuen Code \u201CPairing-Code aktualisieren\u201D anfordern.",
927
- "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.",
928
- "pair.promptDescription": "Pairing-Code, Pairing-Link und scannbaren QR-Code anzeigen",
929
- "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.",
1118
+ "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.",
1119
+ "pair.promptDescription": "Pairing-Code und scannbaren QR-Code anzeigen",
1120
+ "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.",
930
1121
  "perm.promptAuthorize": "opencode fordert eine Genehmigung an",
931
1122
  "perm.promptPatterns": "opencode fordert Zugriff auf: {list}",
932
1123
  "perm.promptResource": "opencode fordert Zugriff auf Ressourcen: {list}",
933
1124
  "perm.promptTool": "opencode fordert die Ausf\xFChrung von {tool} an",
934
1125
  "qr.codeLabel": "Pairing-Code",
935
1126
  "qr.fileWritten": "Pairing-Informationen geschrieben in: {path}",
936
- "qr.linkLabel": "Link",
937
- "qr.openHint": "\xD6ffnen Sie den Link im Telefon-Browser oder geben Sie den Pairing-Code manuell in der App ein.",
1127
+ "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.",
938
1128
  "qr.titleNoType": "tunnelbox Telefon-Pairing",
939
1129
  "qr.titleWithType": "tunnelbox {type} Telefon-Pairing",
940
- "qr.unavailable": "(qrcode nicht installiert \u2014 nutzen Sie den Link oder Pairing-Code oben)",
1130
+ "qr.unavailable": "(qrcode nicht installiert \u2014 nutzen Sie den Pairing-Code oben)",
941
1131
  "claude.errBusy": "Diese Sitzung l\xE4uft noch; warten Sie auf das Ende oder stoppen Sie sie zuerst",
942
1132
  "claude.errTurn": "Generierungsfehler",
943
1133
  "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",
@@ -1005,7 +1195,41 @@ var de_DE_default = {
1005
1195
  "claude.errReadHistory": "Sitzungsverlauf konnte nicht gelesen werden ({id})",
1006
1196
  "setup.langSet": "Laufzeitsprache gesetzt auf",
1007
1197
  "setup.langHint": "Der Adapter gibt nach dem Neustart in dieser Sprache aus (TUNNELBOX_LANG kann zur Laufzeit \xFCberschreiben). Statusdatei:",
1008
- "setup.langCurrent": "Aktuelle Laufzeitsprache"
1198
+ "setup.langCurrent": "Aktuelle Laufzeitsprache",
1199
+ "hermes.errNoRelay": "Keine Relay-URL konfiguriert: mit --env einen Standardwert einf\xFCgen oder zur Laufzeit mit TUNNELBOX_RELAY_URL \xFCberschreiben",
1200
+ "hermes.logConnected": "Mit Relay verbunden {url}",
1201
+ "hermes.logMsgUncaught": "Nicht abgefangene Ausnahme bei der Nachrichtenverarbeitung: {message}",
1202
+ "hermes.logDisconnected": "Vom Relay getrennt, automatische Neuverbindung\u2026",
1203
+ "hermes.logPairCode": "Pairing-Code generiert: {code}",
1204
+ "hermes.logUnhandledType": "Nicht behandelter Nachrichtentyp: {type}",
1205
+ "hermes.logHandleFailed": "Fehler beim Verarbeiten von {type}: {message}",
1206
+ "hermes.logClaimed": "An Ihr Telefonkonto gebunden. Das Telefon verbindet sich k\xFCnftig direkt \xFCber Meine Computer",
1207
+ "hermes.logResetIdentity": "Vom Konto entbunden; Identit\xE4t wird zur\xFCckgesetzt und ein neuer Pairing-Code generiert\u2026",
1208
+ "hermes.cmdNew": "Neue Sitzung",
1209
+ "hermes.cmdHelp": "Hilfe anzeigen",
1210
+ "hermes.newSessionTitle": "Neue Sitzung",
1211
+ "hermes.helpText": "Unterst\xFCtzte Befehle:\n- /new neue Sitzung\n- /help Hilfe anzeigen",
1212
+ "hermes.errBusy": "Diese Sitzung wird gerade generiert; warten Sie auf den Abschluss oder stoppen Sie sie zuerst",
1213
+ "hermes.errBadWorkspace": "Dieses Verzeichnis existiert nicht oder ist unbrauchbar",
1214
+ "hermes.logWorkspaceSwitched": "Arbeitsbereich gewechselt: {path}",
1215
+ "hermes.errWorkspaceMissing": "Arbeitsbereich existiert nicht: {dir}",
1216
+ "hermes.errStartFailed": "Start fehlgeschlagen: {message}",
1217
+ "hermes.msgStarted": "Hermes-Adapter gestartet (Strg+C zum Beenden)",
1218
+ "hermes.logAbortSent": "Abbruch gesendet (session={session})",
1219
+ "hermes.logPromptFailed": "session.prompt fehlgeschlagen: {message}",
1220
+ "hermes.logTurnError": "Fehler bei Runde (session={session}): {message}",
1221
+ "hermes.logPairForced": "--pair: Pairing-Code erzwungen (nur dieser Lauf)",
1222
+ "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",
1223
+ "hermes.logPairNoRelay": "Kein Pairing-Code anforderbar: keine Relay-URL konfiguriert",
1224
+ "hermes.errSpawnHermes": "Hermes ({bin}) kann nicht gestartet werden: bitte Installation pr\xFCfen ({err})",
1225
+ "hermes.errHermesExit": "hermes beendet ({code}): {err}",
1226
+ "hermes.logSessionUpdated": "Sitzung aktualisiert (session={session})",
1227
+ "hermes.errNoInject": "Telefon-Nachrichteneinspeisung nicht verf\xFCgbar (Sitzung nicht interaktiv oder Prozess nicht bereit)",
1228
+ "hermes.pairNoRelay": "Relay nicht erreichbar (Relay nicht erreichbar oder websockets fehlt)",
1229
+ "hermes.pairTimeout": "Zeit\xFCberschreitung bei der Pairing-Code-Anfrage (Relay antwortete nicht)",
1230
+ "hermes.errToolPair": "tunnelbox_pair fehlgeschlagen: {err}",
1231
+ "hermes.errToolStatus": "tunnelbox_status fehlgeschlagen: {err}",
1232
+ "hermes.cliUsage": "Verwendung: /tunnelbox <pair|status>\n pair Pairing-Code anfordern und anzeigen\n status Relay/Bindung/Verbindung anzeigen"
1009
1233
  };
1010
1234
 
1011
1235
  // ../core/locales/es-ES.json
@@ -1043,30 +1267,28 @@ var es_ES_default = {
1043
1267
  "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.",
1044
1268
  "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.)",
1045
1269
  "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.",
1046
- "install.linkLine": "Enlace de emparejamiento: {link}",
1047
1270
  "install.pluginInstalled": "Complemento instalado: {path}",
1048
- "install.qrUnavailable": "(Representaci\xF3n del QR no disponible: use el enlace o el c\xF3digo anteriores)",
1271
+ "install.qrUnavailable": "(Representaci\xF3n del QR no disponible: use el c\xF3digo anterior)",
1049
1272
  "install.qrcodeEnsure": "Instalando qrcode en el directorio de configuraci\xF3n de opencode\u2026",
1050
- "install.qrcodeFail": "Error al instalar qrcode (no es cr\xEDtico; el QR pasa a ser un enlace): {err}",
1273
+ "install.qrcodeFail": "Error al instalar qrcode (no es cr\xEDtico; solo se muestra el c\xF3digo de emparejamiento): {err}",
1051
1274
  "install.relayError": "El relay devolvi\xF3 un error: {msg}",
1052
- "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:",
1275
+ "install.scanHint": "Abra tunnelbox en el tel\xE9fono, pulse \u201CEscanear para emparejar\u201D y escanee el c\xF3digo QR superior para conectar:",
1053
1276
  "pair.heading": "Emparejamiento de tel\xE9fono tunnelbox",
1054
- "pair.howTo": "Abra el enlace en el navegador del tel\xE9fono o introduzca el c\xF3digo de emparejamiento en la aplicaci\xF3n tunnelbox.",
1277
+ "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.",
1055
1278
  "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.",
1056
- "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.",
1057
- "pair.promptDescription": "Mostrar el c\xF3digo de emparejamiento, el enlace y el QR escaneable",
1058
- "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.",
1279
+ "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.",
1280
+ "pair.promptDescription": "Mostrar el c\xF3digo de emparejamiento y el QR escaneable",
1281
+ "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.",
1059
1282
  "perm.promptAuthorize": "opencode solicita autorizaci\xF3n",
1060
1283
  "perm.promptPatterns": "opencode solicita acceso a: {list}",
1061
1284
  "perm.promptResource": "opencode solicita acceso a los recursos: {list}",
1062
1285
  "perm.promptTool": "opencode solicita ejecutar {tool}",
1063
1286
  "qr.codeLabel": "C\xF3digo de emparejamiento",
1064
1287
  "qr.fileWritten": "Informaci\xF3n de emparejamiento escrita en: {path}",
1065
- "qr.linkLabel": "Enlace",
1066
- "qr.openHint": "Abra el enlace en el navegador del tel\xE9fono o introduzca el c\xF3digo de emparejamiento manualmente en la aplicaci\xF3n.",
1288
+ "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.",
1067
1289
  "qr.titleNoType": "emparejamiento de tel\xE9fono tunnelbox",
1068
1290
  "qr.titleWithType": "emparejamiento de tel\xE9fono tunnelbox {type}",
1069
- "qr.unavailable": "(qrcode no instalado: use el enlace o el c\xF3digo de emparejamiento anteriores)",
1291
+ "qr.unavailable": "(qrcode no instalado: use el c\xF3digo de emparejamiento anterior)",
1070
1292
  "claude.errBusy": "Esta sesi\xF3n est\xE1 en ejecuci\xF3n; espere a que termine o det\xE9ngala primero",
1071
1293
  "claude.errTurn": "error de generaci\xF3n",
1072
1294
  "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",
@@ -1134,7 +1356,41 @@ var es_ES_default = {
1134
1356
  "claude.errReadHistory": "No se pudo leer el historial de la sesi\xF3n ({id})",
1135
1357
  "setup.langSet": "Idioma de ejecuci\xF3n establecido en",
1136
1358
  "setup.langHint": "El adaptador emitir\xE1 en este idioma tras reiniciar (TUNNELBOX_LANG puede sobrescribirlo en tiempo de ejecuci\xF3n). Archivo de estado:",
1137
- "setup.langCurrent": "Idioma de ejecuci\xF3n actual"
1359
+ "setup.langCurrent": "Idioma de ejecuci\xF3n actual",
1360
+ "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",
1361
+ "hermes.logConnected": "Conectado al rel\xE9 {url}",
1362
+ "hermes.logMsgUncaught": "Excepci\xF3n no capturada al procesar el mensaje: {message}",
1363
+ "hermes.logDisconnected": "Desconectado del rel\xE9, reconectando autom\xE1ticamente\u2026",
1364
+ "hermes.logPairCode": "C\xF3digo de emparejamiento generado: {code}",
1365
+ "hermes.logUnhandledType": "Tipo de mensaje no procesado: {type}",
1366
+ "hermes.logHandleFailed": "Error al procesar {type}: {message}",
1367
+ "hermes.logClaimed": "Vinculado a su cuenta de tel\xE9fono. El tel\xE9fono se conecta ahora directamente desde Mis computadoras",
1368
+ "hermes.logResetIdentity": "Desvinculado de la cuenta; restableciendo identidad y generando un nuevo c\xF3digo de emparejamiento\u2026",
1369
+ "hermes.cmdNew": "Nueva sesi\xF3n",
1370
+ "hermes.cmdHelp": "Mostrar ayuda",
1371
+ "hermes.newSessionTitle": "Nueva sesi\xF3n",
1372
+ "hermes.helpText": "Comandos admitidos:\n- /new nueva sesi\xF3n\n- /help mostrar ayuda",
1373
+ "hermes.errBusy": "Esta sesi\xF3n se est\xE1 generando; espere a que termine o det\xE9ngala primero",
1374
+ "hermes.errBadWorkspace": "Este directorio no existe o no se puede usar",
1375
+ "hermes.logWorkspaceSwitched": "Espacio de trabajo cambiado: {path}",
1376
+ "hermes.errWorkspaceMissing": "El espacio de trabajo no existe: {dir}",
1377
+ "hermes.errStartFailed": "Error al iniciar: {message}",
1378
+ "hermes.msgStarted": "Adaptador de Hermes iniciado (Ctrl+C para salir)",
1379
+ "hermes.logAbortSent": "Interrupci\xF3n enviada (session={session})",
1380
+ "hermes.logPromptFailed": "session.prompt fall\xF3: {message}",
1381
+ "hermes.logTurnError": "Error de turno (session={session}): {message}",
1382
+ "hermes.logPairForced": "--pair: solicitud forzada del c\xF3digo de emparejamiento (solo esta ejecuci\xF3n)",
1383
+ "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",
1384
+ "hermes.logPairNoRelay": "No se puede solicitar un c\xF3digo de emparejamiento: no hay URL de rel\xE9 configurada",
1385
+ "hermes.errSpawnHermes": "No se puede iniciar Hermes ({bin}): confirme que est\xE1 instalado ({err})",
1386
+ "hermes.errHermesExit": "hermes sali\xF3 ({code}): {err}",
1387
+ "hermes.logSessionUpdated": "Sesi\xF3n actualizada (session={session})",
1388
+ "hermes.errNoInject": "Inyecci\xF3n de mensaje del tel\xE9fono no disponible (sesi\xF3n no interactiva o proceso no listo)",
1389
+ "hermes.pairNoRelay": "No se puede alcanzar el rel\xE9 (rel\xE9 inaccesible o websockets ausente)",
1390
+ "hermes.pairTimeout": "Tiempo de espera agotado al solicitar el c\xF3digo de emparejamiento (rel\xE9 sin respuesta)",
1391
+ "hermes.errToolPair": "fallo de tunnelbox_pair: {err}",
1392
+ "hermes.errToolStatus": "fallo de tunnelbox_status: {err}",
1393
+ "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"
1138
1394
  };
1139
1395
 
1140
1396
  // ../core/src/i18n.ts
@@ -1237,12 +1493,11 @@ function loadState(type) {
1237
1493
  return fallback;
1238
1494
  }
1239
1495
  }
1240
- function writePairingFile(link, code, type) {
1496
+ function writePairingFile(code, type) {
1241
1497
  const p = join(baseName(), `remote-pairing${suffix(type)}.txt`);
1242
1498
  try {
1243
1499
  mkdirSync(dirname(p), { recursive: true });
1244
1500
  writeFileSync(p, `\u914D\u5BF9\u7801: ${code}
1245
- \u914D\u5BF9\u94FE\u63A5: ${link}
1246
1501
  `, "utf8");
1247
1502
  } catch {
1248
1503
  }
@@ -1279,19 +1534,14 @@ function padVisual(s, width, align = "left") {
1279
1534
  }
1280
1535
  return s + " ".repeat(pad);
1281
1536
  }
1282
- async function printPairing(relayHttpBase, code, type, name, lang) {
1537
+ async function printPairing(code, type, name, lang) {
1283
1538
  const resolved = lang ? normalizeLang(lang) : resolveLang();
1284
- const p = new URLSearchParams({ code });
1285
- if (type) p.set("type", type);
1286
- if (name) p.set("name", name);
1287
- const link = `${relayHttpBase}/app/#/pages/index/index?${p.toString()}`;
1288
- const file = writePairingFile(link, code, type);
1539
+ const file = writePairingFile(code, type);
1289
1540
  const tt = (key, vars) => t(resolved, key, vars);
1290
1541
  const title = type ? tt("qr.titleWithType", { type }) : tt("qr.titleNoType");
1291
1542
  const codeLine = `${tt("qr.codeLabel")}: ${code}`;
1292
- const linkLine = `${tt("qr.linkLabel")}: ${link}`;
1293
1543
  const hint = tt("qr.openHint");
1294
- const inner = Math.max(40, dispWidth(codeLine), dispWidth(linkLine), dispWidth(title));
1544
+ const inner = Math.max(40, dispWidth(codeLine), dispWidth(title));
1295
1545
  const W = Math.min(76, inner + 4);
1296
1546
  const bar = "\u2500".repeat(W);
1297
1547
  console.log("");
@@ -1299,7 +1549,6 @@ async function printPairing(relayHttpBase, code, type, name, lang) {
1299
1549
  console.log("\u2502 " + padVisual(title, W - 2, "center") + " \u2502");
1300
1550
  console.log("\u251C" + bar + "\u2524");
1301
1551
  console.log("\u2502 " + padVisual(codeLine, W - 2) + " \u2502");
1302
- console.log("\u2502 " + padVisual(linkLine, W - 2) + " \u2502");
1303
1552
  console.log("\u2514" + bar + "\u2518");
1304
1553
  console.log(" " + hint);
1305
1554
  try {
@@ -1307,7 +1556,7 @@ async function printPairing(relayHttpBase, code, type, name, lang) {
1307
1556
  const render = mod.default ?? mod;
1308
1557
  const toString = render.toString;
1309
1558
  if (toString) {
1310
- const qr = await toString(link, { type: "terminal", small: true });
1559
+ const qr = await toString(code, { type: "terminal", small: true });
1311
1560
  if (qr) console.log(qr);
1312
1561
  }
1313
1562
  } catch {
@@ -1688,9 +1937,6 @@ var CursorBridge = class {
1688
1937
  pendingWorkspaces = /* @__PURE__ */ new Map();
1689
1938
  sessionCwd = /* @__PURE__ */ new Map();
1690
1939
  activeRuns = /* @__PURE__ */ new Map();
1691
- get relayHttpBase() {
1692
- return this.relayBase.replace(/^ws/, "http").replace(/\/+$/, "");
1693
- }
1694
1940
  async start() {
1695
1941
  const url = (this.cfg.relayUrl || injectedRelayUrl() || "").replace(/\/+$/, "");
1696
1942
  this.relayBase = url;
@@ -1716,10 +1962,6 @@ var CursorBridge = class {
1716
1962
  msg.clientID = src.clientID;
1717
1963
  this.send(msg);
1718
1964
  }
1719
- pairingLink(code) {
1720
- const p = new URLSearchParams({ code, type: AGENT_TYPE, name: hostname() });
1721
- return `${this.relayHttpBase}/app/#/pages/index/index?${p.toString()}`;
1722
- }
1723
1965
  connect(url) {
1724
1966
  const agentID = this.state.agentId;
1725
1967
  const wsUrl = `${url}/ws/agent?token=${encodeURIComponent(agentID)}`;
@@ -1774,10 +2016,9 @@ var CursorBridge = class {
1774
2016
  switch (env.type) {
1775
2017
  case "pair.created": {
1776
2018
  const code = env.payload.code;
1777
- const link = this.pairingLink(code);
1778
- writePairingJson({ code, link, relayUrl: this.relayBase, at: Date.now() }, AGENT_TYPE);
2019
+ writePairingJson({ code, relayUrl: this.relayBase, at: Date.now() }, AGENT_TYPE);
1779
2020
  this.log("\u751F\u6210\u914D\u5BF9\u7801: " + code);
1780
- void printPairing(this.relayHttpBase, code, AGENT_TYPE, hostname());
2021
+ void printPairing(code, AGENT_TYPE, hostname());
1781
2022
  return;
1782
2023
  }
1783
2024
  case "agent.claimed":
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tunnelbox/cursor",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "description": "tunnelbox 的 Cursor 适配器(C 类/B2 头less):手机远程驱动本机 Cursor CLI(agent -p stream-json,会话/流式/中止/删除)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",