@tunnelbox/core 0.1.20 → 0.1.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -428,7 +428,75 @@ var zh_CN_default = {
428
428
  "adapter.logQuestionNative": "\u9009\u62E9\u8BF7\u6C42 \u2192 \u624B\u673A\u9009\u62E9\u5361 questionID={id} (session={session})",
429
429
  "adapter.logPermissionNative": "\u5BA1\u6279\u8BF7\u6C42 \u2192 \u624B\u673A\u6743\u9650\u5361 permissionID={id} (session={session})",
430
430
  "adapter.checkAppServerOk": "codex app-server \u53EF\u7528",
431
- "adapter.checkAppServerMissing": "\u5F53\u524D Codex CLI \u4E0D\u652F\u6301 `codex app-server`\uFF08\u8BF7\u5347\u7EA7 Codex CLI\uFF09"
431
+ "adapter.checkAppServerMissing": "\u5F53\u524D Codex CLI \u4E0D\u652F\u6301 `codex app-server`\uFF08\u8BF7\u5347\u7EA7 Codex CLI\uFF09",
432
+ "adapter.warnCursorCliMissing": '\u672A\u627E\u5230 Cursor CLI \u53EF\u6267\u884C\u6587\u4EF6 "{bin}"\uFF1A\u8BF7\u5B89\u88C5\uFF08https://cursor.com/docs/cli\uFF09\uFF0C\u6216\u7528 TUNNELBOX_CURSOR_BIN \u6307\u5B9A\u8DEF\u5F84',
433
+ "adapter.checkCursorCliMissing": "\u672A\u627E\u5230 Cursor CLI \u53EF\u6267\u884C\u6587\u4EF6\uFF08{bin}\uFF09\uFF1A\u8BF7\u4ECE https://cursor.com/docs/cli \u5B89\u88C5",
434
+ "adapter.checkCursorAcpHint": "\u5DF2\u68C0\u6D4B\u5230 Cursor CLI\uFF1B\u5C06\u4F7F\u7528 ACP \u6A21\u5F0F\uFF08`agent acp`\uFF09\u63D0\u4F9B\u6D41\u5F0F/\u5BA1\u6279/\u9009\u62E9",
435
+ "adapter.errAcpSpawn": "\u542F\u52A8 cursor `agent acp` \u5931\u8D25\uFF1A{message}\uFF08\u8BF7\u786E\u8BA4 Cursor CLI \u652F\u6301 `agent acp`\uFF09",
436
+ "adapter.errAcpNoSession": "Cursor ACP \u672A\u8FD4\u56DE\u4F1A\u8BDD id",
437
+ "adapter.logResumeFailed": "\u4F1A\u8BDD\u6062\u590D\u5931\u8D25\uFF0C\u6539\u4E3A\u65B0\u5EFA\u4F1A\u8BDD\uFF1A{message}",
438
+ "adapter.logPlanNative": "\u8BA1\u5212\u5BA1\u6279 \u2192 \u624B\u673A\u5BA1\u6279\u5361 permissionID={id} (session={session})",
439
+ "adapter.errTimeout": "\u7B49\u5F85\u8D85\u65F6\uFF0C\u81EA\u52A8\u62D2\u7EDD\uFF08fail-closed\uFF09",
440
+ "adapter.planApprovalPrompt": "Cursor \u8BF7\u6C42\u6279\u51C6\u4E00\u9879\u8BA1\u5212",
441
+ "adapter.checkCursorHeader": "tunnelbox-cursor \u73AF\u5883\u81EA\u68C0",
442
+ "adapter.errAskBridge": "\u542F\u52A8 ask \u6865\u5931\u8D25\uFF1A{message}",
443
+ "adapter.logAskBridge": "MCP ask \u6865\u5DF2\u76D1\u542C {url}",
444
+ "cursor.mcpAskDesc": "\u8BA9\u7528\u6237\u5728\u624B\u673A\u4E0A\uFF08tunnelbox\uFF09\u505A\u9009\u62E9\uFF0C\u5E76\u963B\u585E\u7B49\u5F85\u5176\u4F5C\u7B54\u3002\u53EA\u8981\u9700\u8981\u7528\u6237\u5728\u7EE7\u7EED\u524D\u4E8E\u82E5\u5E72\u9009\u9879\u4E2D\u505A\u51FA\u9009\u62E9\uFF08\u5982\u9009\u83DC\u3001\u9009\u6A21\u5F0F\u3001\u9009\u65B9\u6848\uFF09\u5C31\u8C03\u7528\u5B83\u3002\u8FD4\u56DE\u7528\u6237\u6240\u9009\u7684\u9009\u9879\u6587\u672C\u3002",
445
+ "cursor.mcpAskTitleDesc": "\u624B\u673A\u5361\u7247\u4E0A\u663E\u793A\u7684\u6807\u9898\uFF08\u53EF\u9009\uFF09",
446
+ "cursor.mcpAskQuestionsDesc": "\u4E00\u4E2A\u6216\u591A\u4E2A\u95EE\u9898\uFF1B\u6BCF\u4E2A\u95EE\u9898\u5E26\u53EF\u9009\u9879",
447
+ "cursor.mcpPlanDesc": "\u8BA9\u7528\u6237\u5728\u624B\u673A\u4E0A\uFF08tunnelbox\uFF09\u6279\u51C6\u4E00\u9879\u8BA1\u5212\uFF0C\u5E76\u963B\u585E\u7B49\u5F85\u5176\u5E94\u7B54\u3002\u8FD4\u56DE\u8BA1\u5212\u662F\u5426\u88AB\u63A5\u53D7\u3002",
448
+ "cursor.mcpNoBridge": "tunnelbox ask \u6865\u4E0D\u53EF\u7528",
449
+ "cursor.mcpUnanswered": "\u7528\u6237\u672A\u5728\u624B\u673A\u4E0A\u4F5C\u7B54\uFF08\u79BB\u7EBF\u6216\u8D85\u65F6\uFF09\u3002\u8BF7\u7EE7\u7EED\uFF0C\u6216\u7528\u5BF9\u8BDD\u65B9\u5F0F\u8BE2\u95EE\u3002",
450
+ "cursor.mcpRejected": "\u7528\u6237\u5728\u624B\u673A\u4E0A\u62D2\u7EDD\u4E86\u8FD9\u4E2A\u63D0\u95EE\u3002",
451
+ "cursor.mcpAnswersHeader": "\u7528\u6237\uFF08\u624B\u673A\uFF09\u7684\u9009\u62E9\uFF1A",
452
+ "cursor.mcpAccepted": "\u7528\u6237\u5DF2\u63A5\u53D7\u8BE5\u8BA1\u5212\u3002",
453
+ "cursor.mcpDenied": "\u7528\u6237\u62D2\u7EDD\u4E86\u8BE5\u8BA1\u5212\u3002",
454
+ "cursor.mcpPlanUnanswered": "\u7528\u6237\u672A\u5728\u624B\u673A\u4E0A\u56DE\u5E94\u8BA1\u5212\uFF08\u79BB\u7EBF\u6216\u8D85\u65F6\uFF09\u3002",
455
+ "cursor.mcpAskNoQuestions": "\u672A\u63D0\u4F9B\u4EFB\u4F55\u95EE\u9898\u3002",
456
+ "cursor.mcpFailed": "tunnelbox ask \u8C03\u7528\u5931\u8D25",
457
+ "adapter.errCursorExitCode": "Cursor CLI \u9000\u51FA\u7801 {code}",
458
+ "adapter.errCursorExit": "Cursor CLI \u9000\u51FA({code}): {err}",
459
+ "adapter.errCursorSpawn": "\u65E0\u6CD5\u542F\u52A8 Cursor CLI\uFF08agent\uFF09\uFF1A\u8BF7\u786E\u8BA4\u5DF2\u5B89\u88C5\u5E76\u767B\u5F55\uFF08{message}\uFF09",
460
+ "adapter.errCursorStart": "Cursor CLI \u542F\u52A8\u5931\u8D25: {message}",
461
+ "adapter.errCursorGeneric": "Cursor \u51FA\u9519",
462
+ "qr.downloadApp": "\u4E0B\u8F7D tunnelbox App\uFF08Android / iOS\uFF09\uFF1A{url}",
463
+ "adapter.logLegacyHookRemoved": "\u5DF2\u79FB\u9664\u65E7\u7684 PermissionRequest hook\uFF08hooks.json\uFF09",
464
+ "adapter.errAppServerNotRunning": "codex app-server \u672A\u8FD0\u884C",
465
+ "adapter.errAppServerTimeout": "app-server \u8BF7\u6C42\u8D85\u65F6\uFF1A{method}",
466
+ "adapter.errAppServerStopped": "app-server \u5BA2\u6237\u7AEF\u5DF2\u505C\u6B62",
467
+ "adapter.errAppServerExited": "codex app-server \u9000\u51FA\uFF08code={code} signal={signal}\uFF09",
468
+ "adapter.errAppServerError": "app-server \u9519\u8BEF\uFF1A{message}",
469
+ "adapter.logAppServerStderr": "app-server\uFF1A{line}",
470
+ "adapter.logAppServerExited": "app-server \u9000\u51FA\uFF08code={code} signal={signal}\uFF09",
471
+ "adapter.errDshGenerate": "dsh \u751F\u6210\u51FA\u9519",
472
+ "adapter.unknown": "\u672A\u77E5",
473
+ "adapter.errGatewayClientMissing": "gateway client \u672A\u521B\u5EFA",
474
+ "adapter.errGatewayNotConnected": "gateway \u672A\u8FDE\u63A5",
475
+ "adapter.sessionTitleWithId": "{name} \u4F1A\u8BDD {id}",
476
+ "adapter.promptApproveTool": "{name} \u8BF7\u6C42\u6279\u51C6\u8FD0\u884C {tool}",
477
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
478
+ "agent.err.http": "HTTP {status}\uFF1A{text}",
479
+ "claude.promptUrl": "URL\uFF1A{url}",
480
+ "hermes.errBridgeNotRunning": "bridge loop \u672A\u8FD0\u884C",
481
+ "hermes.errAskNoQuestion": "\u672A\u63D0\u4F9B\u95EE\u9898\u3002\u8BF7\u4F20\u5165 questions=[{question, choices?, multi_select?}, ...]\u3002",
482
+ "hermes.toolPairDesc": "\u5411 tunnelbox \u4E2D\u7EE7\u7533\u8BF7\u4E00\u6B21\u6027\u624B\u673A\u914D\u5BF9\u7801\uFF08\u4F9B\u624B\u673A tunnelbox App \u626B\u7801/\u8F93\u7801\u914D\u5BF9\uFF09\u3002\u5F53\u7528\u6237\u8BE2\u95EE\u5982\u4F55\u7528\u624B\u673A\u8FDE\u63A5/\u914D\u5BF9/\u626B\u7801/\u8FDC\u7A0B\u63A7\u5236\u672C\u673A\u65F6\u4F7F\u7528\u3002",
483
+ "hermes.toolPairRefreshDesc": "\u662F\u5426\u5F3A\u5236\u7533\u8BF7\u65B0\u914D\u5BF9\u7801\uFF08\u9ED8\u8BA4\u590D\u7528/\u5FFD\u7565\uFF09",
484
+ "hermes.toolStatusDesc": "\u8FD4\u56DE tunnelbox \u63D2\u4EF6\u72B6\u6001\uFF1A\u4E2D\u7EE7\u5730\u5740\u3001agent \u6807\u8BC6\u3001\u662F\u5426\u5DF2\u7ED1\u5B9A\u624B\u673A\u8D26\u53F7\u3001\u6570\u636E\u76EE\u5F55\u4E0E\u6700\u8FD1\u914D\u5BF9\u4FE1\u606F\u3002\u5F53\u7528\u6237\u8BE2\u95EE\u4E0E\u624B\u673A\u7684 tunnelbox \u8FDE\u63A5\u72B6\u6001/\u662F\u5426\u7ED1\u5B9A/\u4E2D\u7EE7\u5730\u5740\u65F6\u4F7F\u7528\u3002",
485
+ "hermes.toolAskDesc": "\u628A\u4E00\u4E2A\u95EE\u9898/\u9009\u62E9\u53D1\u5230\u7528\u6237\u7684 tunnelbox \u624B\u673A\uFF08\u8FDC\u7A0B UI\uFF09\u5E76\u7B49\u5F85\u5176\u9009\u62E9\u6216\u8F93\u5165\u3002\u8FD4\u56DE JSON\uFF1A{answered: bool, user_response: string|string[]|null}\u3002\u624B\u673A\u79BB\u7EBF\u6216\u8D85\u65F6\u4F1A answered=false\u3002",
486
+ "hermes.toolAskQuestionDesc": "\u8981\u95EE\u7684\u95EE\u9898\u6587\u672C",
487
+ "hermes.toolAskChoicesDesc": "\u9884\u7F6E\u9009\u9879\uFF08\u53EF\u9009\uFF1B\u6700\u591A 4 \u4E2A\uFF09",
488
+ "hermes.toolAskMultipleDesc": "\u662F\u5426\u591A\u9009\uFF08\u9700\u63D0\u4F9B choices\uFF09",
489
+ "hermes.cmdDesc": "tunnelbox\uFF1A\u624B\u673A\u914D\u5BF9 / \u8FDE\u63A5\u72B6\u6001",
490
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8BFB\u53D6\u914D\u7F6E\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C: {err}",
491
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u6CE8\u518C\u5DE5\u5177\u5931\u8D25: {err}",
492
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u6CE8\u518C\u547D\u4EE4\u5931\u8D25: {err}",
493
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u6CE8\u518C\u6280\u80FD\u5931\u8D25: {err}",
494
+ "hermes.logRegisterHooksFailed": "tunnelbox: \u6CE8\u518C hooks \u5931\u8D25: {err}",
495
+ "hermes.logRegisterApprovalFailed": "tunnelbox: \u6CE8\u518C approval transport \u5931\u8D25: {err}",
496
+ "hermes.logRegisterAskFailed": "tunnelbox: \u6CE8\u518C tunnelbox_ask \u5931\u8D25: {err}",
497
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: \u6CE8\u518C system prompt \u6BB5\u5931\u8D25: {err}",
498
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u540E\u53F0\u6865\u542F\u52A8\u5931\u8D25: {err}",
499
+ "hermes.systemPromptAsk": "\u5F53\u4F60\u9700\u8981\u7528\u6237\u505A\u51B3\u5B9A/\u6F84\u6E05/\u9009\u62E9\uFF0C\u4E14\u5DF2\u8FDE\u63A5 tunnelbox \u624B\u673A\u65F6\uFF0C\u8BF7\u7528 `tunnelbox_ask` \u5DE5\u5177\u5728\u624B\u673A\u4E0A\u63D0\u95EE\uFF0C\u800C\u4E0D\u662F\u81EA\u884C\u731C\u6D4B\uFF1B\u7B49\u5230\u7528\u6237\u4F5C\u7B54\u540E\u518D\u7EE7\u7EED\u3002"
432
500
  };
433
501
 
434
502
  // locales/zh-TW.json
@@ -707,7 +775,75 @@ var zh_TW_default = {
707
775
  "adapter.logQuestionNative": "\u9078\u64C7\u8ACB\u6C42 \u2192 \u624B\u6A5F\u9078\u64C7\u5361 questionID={id} (session={session})",
708
776
  "adapter.logPermissionNative": "\u5BE9\u6279\u8ACB\u6C42 \u2192 \u624B\u6A5F\u6B0A\u9650\u5361 permissionID={id} (session={session})",
709
777
  "adapter.checkAppServerOk": "codex app-server \u53EF\u7528",
710
- "adapter.checkAppServerMissing": "\u76EE\u524D Codex CLI \u4E0D\u652F\u63F4 `codex app-server`\uFF08\u8ACB\u5347\u7D1A Codex CLI\uFF09"
778
+ "adapter.checkAppServerMissing": "\u76EE\u524D Codex CLI \u4E0D\u652F\u63F4 `codex app-server`\uFF08\u8ACB\u5347\u7D1A Codex CLI\uFF09",
779
+ "adapter.warnCursorCliMissing": '\u672A\u627E\u5230 Cursor CLI \u57F7\u884C\u6A94 "{bin}"\uFF1A\u8ACB\u5B89\u88DD\uFF08https://cursor.com/docs/cli\uFF09\uFF0C\u6216\u7528 TUNNELBOX_CURSOR_BIN \u6307\u5B9A\u8DEF\u5F91',
780
+ "adapter.checkCursorCliMissing": "\u672A\u627E\u5230 Cursor CLI \u57F7\u884C\u6A94\uFF08{bin}\uFF09\uFF1A\u8ACB\u5F9E https://cursor.com/docs/cli \u5B89\u88DD",
781
+ "adapter.checkCursorAcpHint": "\u5DF2\u5075\u6E2C\u5230 Cursor CLI\uFF1B\u5C07\u4F7F\u7528 ACP \u6A21\u5F0F\uFF08`agent acp`\uFF09\u63D0\u4F9B\u4E32\u6D41/\u5BE9\u6279/\u9078\u64C7",
782
+ "adapter.errAcpSpawn": "\u555F\u52D5 cursor `agent acp` \u5931\u6557\uFF1A{message}\uFF08\u8ACB\u78BA\u8A8D Cursor CLI \u652F\u63F4 `agent acp`\uFF09",
783
+ "adapter.errAcpNoSession": "Cursor ACP \u672A\u8FD4\u56DE\u5DE5\u4F5C\u968E\u6BB5 id",
784
+ "adapter.logResumeFailed": "\u5DE5\u4F5C\u968E\u6BB5\u6062\u5FA9\u5931\u6557\uFF0C\u6539\u70BA\u5EFA\u7ACB\u65B0\u5DE5\u4F5C\u968E\u6BB5\uFF1A{message}",
785
+ "adapter.logPlanNative": "\u8A08\u756B\u5BE9\u6279 \u2192 \u624B\u6A5F\u5BE9\u6279\u5361 permissionID={id} (session={session})",
786
+ "adapter.errTimeout": "\u7B49\u5F85\u903E\u6642\uFF0C\u81EA\u52D5\u62D2\u7D55\uFF08fail-closed\uFF09",
787
+ "adapter.planApprovalPrompt": "Cursor \u8ACB\u6C42\u6279\u51C6\u4E00\u9805\u8A08\u756B",
788
+ "adapter.checkCursorHeader": "tunnelbox-cursor \u74B0\u5883\u81EA\u6AA2",
789
+ "adapter.errAskBridge": "\u555F\u52D5 ask \u6A4B\u5931\u6557\uFF1A{message}",
790
+ "adapter.logAskBridge": "MCP ask \u6A4B\u5DF2\u76E3\u807D {url}",
791
+ "cursor.mcpAskDesc": "\u8B93\u4F7F\u7528\u8005\u5728\u624B\u6A5F\u4E0A\uFF08tunnelbox\uFF09\u505A\u9078\u64C7\uFF0C\u4E26\u963B\u585E\u7B49\u5F85\u5176\u4F5C\u7B54\u3002\u53EA\u8981\u9700\u8981\u4F7F\u7528\u8005\u5728\u7E7C\u7E8C\u524D\u65BC\u82E5\u5E72\u9078\u9805\u4E2D\u505A\u51FA\u9078\u64C7\uFF08\u5982\u9078\u9910\u3001\u9078\u6A21\u5F0F\u3001\u9078\u65B9\u6848\uFF09\u5C31\u547C\u53EB\u5B83\u3002\u56DE\u50B3\u4F7F\u7528\u8005\u6240\u9078\u7684\u9078\u9805\u6587\u5B57\u3002",
792
+ "cursor.mcpAskTitleDesc": "\u624B\u6A5F\u5361\u7247\u4E0A\u986F\u793A\u7684\u6A19\u984C\uFF08\u53EF\u9078\uFF09",
793
+ "cursor.mcpAskQuestionsDesc": "\u4E00\u500B\u6216\u591A\u500B\u554F\u984C\uFF1B\u6BCF\u500B\u554F\u984C\u5E36\u53EF\u9078\u9805",
794
+ "cursor.mcpPlanDesc": "\u8B93\u4F7F\u7528\u8005\u5728\u624B\u6A5F\u4E0A\uFF08tunnelbox\uFF09\u6279\u51C6\u4E00\u9805\u8A08\u756B\uFF0C\u4E26\u963B\u585E\u7B49\u5F85\u5176\u61C9\u7B54\u3002\u56DE\u50B3\u8A08\u756B\u662F\u5426\u88AB\u63A5\u53D7\u3002",
795
+ "cursor.mcpNoBridge": "tunnelbox ask \u6A4B\u4E0D\u53EF\u7528",
796
+ "cursor.mcpUnanswered": "\u4F7F\u7528\u8005\u672A\u5728\u624B\u6A5F\u4E0A\u4F5C\u7B54\uFF08\u96E2\u7DDA\u6216\u903E\u6642\uFF09\u3002\u8ACB\u7E7C\u7E8C\uFF0C\u6216\u7528\u5C0D\u8A71\u65B9\u5F0F\u8A62\u554F\u3002",
797
+ "cursor.mcpRejected": "\u4F7F\u7528\u8005\u5728\u624B\u6A5F\u4E0A\u62D2\u7D55\u4E86\u9019\u500B\u63D0\u554F\u3002",
798
+ "cursor.mcpAnswersHeader": "\u4F7F\u7528\u8005\uFF08\u624B\u6A5F\uFF09\u7684\u9078\u64C7\uFF1A",
799
+ "cursor.mcpAccepted": "\u4F7F\u7528\u8005\u5DF2\u63A5\u53D7\u8A72\u8A08\u756B\u3002",
800
+ "cursor.mcpDenied": "\u4F7F\u7528\u8005\u62D2\u7D55\u4E86\u8A72\u8A08\u756B\u3002",
801
+ "cursor.mcpPlanUnanswered": "\u4F7F\u7528\u8005\u672A\u5728\u624B\u6A5F\u4E0A\u56DE\u61C9\u8A08\u756B\uFF08\u96E2\u7DDA\u6216\u903E\u6642\uFF09\u3002",
802
+ "cursor.mcpAskNoQuestions": "\u672A\u63D0\u4F9B\u4EFB\u4F55\u554F\u984C\u3002",
803
+ "cursor.mcpFailed": "tunnelbox ask \u547C\u53EB\u5931\u6557",
804
+ "adapter.errCursorExitCode": "Cursor CLI \u9000\u51FA\u78BC {code}",
805
+ "adapter.errCursorExit": "Cursor CLI \u9000\u51FA({code}): {err}",
806
+ "adapter.errCursorSpawn": "\u7121\u6CD5\u555F\u52D5 Cursor CLI\uFF08agent\uFF09\uFF1A\u8ACB\u78BA\u8A8D\u5DF2\u5B89\u88DD\u4E26\u767B\u5165\uFF08{message}\uFF09",
807
+ "adapter.errCursorStart": "Cursor CLI \u555F\u52D5\u5931\u6557: {message}",
808
+ "adapter.errCursorGeneric": "Cursor \u51FA\u932F",
809
+ "qr.downloadApp": "\u4E0B\u8F09 tunnelbox App\uFF08Android / iOS\uFF09\uFF1A{url}",
810
+ "adapter.logLegacyHookRemoved": "\u5DF2\u79FB\u9664\u820A\u7684 PermissionRequest hook\uFF08hooks.json\uFF09",
811
+ "adapter.errAppServerNotRunning": "codex app-server \u672A\u57F7\u884C",
812
+ "adapter.errAppServerTimeout": "app-server \u8ACB\u6C42\u903E\u6642\uFF1A{method}",
813
+ "adapter.errAppServerStopped": "app-server \u7528\u6236\u7AEF\u5DF2\u505C\u6B62",
814
+ "adapter.errAppServerExited": "codex app-server \u7D50\u675F\uFF08code={code} signal={signal}\uFF09",
815
+ "adapter.errAppServerError": "app-server \u932F\u8AA4\uFF1A{message}",
816
+ "adapter.logAppServerStderr": "app-server\uFF1A{line}",
817
+ "adapter.logAppServerExited": "app-server \u7D50\u675F\uFF08code={code} signal={signal}\uFF09",
818
+ "adapter.errDshGenerate": "dsh \u7522\u751F\u932F\u8AA4",
819
+ "adapter.unknown": "\u672A\u77E5",
820
+ "adapter.errGatewayClientMissing": "gateway client \u672A\u5EFA\u7ACB",
821
+ "adapter.errGatewayNotConnected": "gateway \u672A\u9023\u7DDA",
822
+ "adapter.sessionTitleWithId": "{name} \u5DE5\u4F5C\u968E\u6BB5 {id}",
823
+ "adapter.promptApproveTool": "{name} \u8ACB\u6C42\u6279\u51C6\u57F7\u884C {tool}",
824
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
825
+ "agent.err.http": "HTTP {status}\uFF1A{text}",
826
+ "claude.promptUrl": "URL\uFF1A{url}",
827
+ "hermes.errBridgeNotRunning": "bridge loop \u672A\u57F7\u884C",
828
+ "hermes.errAskNoQuestion": "\u672A\u63D0\u4F9B\u554F\u984C\u3002\u8ACB\u50B3\u5165 questions=[{question, choices?, multi_select?}, ...]\u3002",
829
+ "hermes.toolPairDesc": "\u5411 tunnelbox \u4E2D\u7E7C\u7533\u8ACB\u4E00\u6B21\u6027\u624B\u6A5F\u914D\u5C0D\u78BC\uFF08\u4F9B\u624B\u6A5F tunnelbox App \u6383\u78BC/\u8F38\u78BC\u914D\u5C0D\uFF09\u3002\u7576\u4F7F\u7528\u8005\u8A62\u554F\u5982\u4F55\u7528\u624B\u6A5F\u9023\u7DDA/\u914D\u5C0D/\u6383\u78BC/\u9060\u7AEF\u63A7\u5236\u672C\u6A5F\u6642\u4F7F\u7528\u3002",
830
+ "hermes.toolPairRefreshDesc": "\u662F\u5426\u5F37\u5236\u7533\u8ACB\u65B0\u914D\u5C0D\u78BC\uFF08\u9810\u8A2D\u91CD\u7528/\u5FFD\u7565\uFF09",
831
+ "hermes.toolStatusDesc": "\u8FD4\u56DE tunnelbox \u5916\u639B\u72C0\u614B\uFF1A\u4E2D\u7E7C\u4F4D\u5740\u3001agent \u6A19\u8B58\u3001\u662F\u5426\u5DF2\u7D81\u5B9A\u624B\u6A5F\u5E33\u865F\u3001\u8CC7\u6599\u76EE\u9304\u8207\u6700\u8FD1\u914D\u5C0D\u8CC7\u8A0A\u3002\u7576\u4F7F\u7528\u8005\u8A62\u554F\u8207\u624B\u6A5F\u7684 tunnelbox \u9023\u7DDA\u72C0\u614B/\u662F\u5426\u7D81\u5B9A/\u4E2D\u7E7C\u4F4D\u5740\u6642\u4F7F\u7528\u3002",
832
+ "hermes.toolAskDesc": "\u628A\u4E00\u500B\u554F\u984C/\u9078\u64C7\u767C\u5230\u4F7F\u7528\u8005\u7684 tunnelbox \u624B\u6A5F\uFF08\u9060\u7AEF UI\uFF09\u4E26\u7B49\u5F85\u5176\u9078\u64C7\u6216\u8F38\u5165\u3002\u8FD4\u56DE JSON\uFF1A{answered: bool, user_response: string|string[]|null}\u3002\u624B\u6A5F\u96E2\u7DDA\u6216\u903E\u6642\u6703 answered=false\u3002",
833
+ "hermes.toolAskQuestionDesc": "\u8981\u554F\u7684\u554F\u984C\u6587\u5B57",
834
+ "hermes.toolAskChoicesDesc": "\u9810\u7F6E\u9078\u9805\uFF08\u53EF\u9078\uFF1B\u6700\u591A 4 \u500B\uFF09",
835
+ "hermes.toolAskMultipleDesc": "\u662F\u5426\u591A\u9078\uFF08\u9700\u63D0\u4F9B choices\uFF09",
836
+ "hermes.cmdDesc": "tunnelbox\uFF1A\u624B\u6A5F\u914D\u5C0D / \u9023\u7DDA\u72C0\u614B",
837
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8B80\u53D6\u8A2D\u5B9A\u5931\u6557\uFF0C\u4F7F\u7528\u9810\u8A2D\u503C: {err}",
838
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u8A3B\u518A\u5DE5\u5177\u5931\u6557: {err}",
839
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u8A3B\u518A\u547D\u4EE4\u5931\u6557: {err}",
840
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u8A3B\u518A\u6280\u80FD\u5931\u6557: {err}",
841
+ "hermes.logRegisterHooksFailed": "tunnelbox: \u8A3B\u518A hooks \u5931\u6557: {err}",
842
+ "hermes.logRegisterApprovalFailed": "tunnelbox: \u8A3B\u518A approval transport \u5931\u6557: {err}",
843
+ "hermes.logRegisterAskFailed": "tunnelbox: \u8A3B\u518A tunnelbox_ask \u5931\u6557: {err}",
844
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: \u8A3B\u518A system prompt \u6BB5\u5931\u6557: {err}",
845
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u80CC\u666F\u6A4B\u555F\u52D5\u5931\u6557: {err}",
846
+ "hermes.systemPromptAsk": "\u7576\u4F60\u9700\u8981\u4F7F\u7528\u8005\u505A\u6C7A\u5B9A/\u6F84\u6E05/\u9078\u64C7\uFF0C\u4E14\u5DF2\u9023\u63A5 tunnelbox \u624B\u6A5F\u6642\uFF0C\u8ACB\u7528 `tunnelbox_ask` \u5DE5\u5177\u5728\u624B\u6A5F\u4E0A\u63D0\u554F\uFF0C\u800C\u4E0D\u662F\u81EA\u884C\u731C\u6E2C\uFF1B\u7B49\u5230\u4F7F\u7528\u8005\u4F5C\u7B54\u5F8C\u518D\u7E7C\u7E8C\u3002"
711
847
  };
712
848
 
713
849
  // locales/en-US.json
@@ -986,7 +1122,75 @@ var en_US_default = {
986
1122
  "adapter.logQuestionNative": "choice request -> phone choice card questionID={id} (session={session})",
987
1123
  "adapter.logPermissionNative": "approval request -> phone approval card permissionID={id} (session={session})",
988
1124
  "adapter.checkAppServerOk": "codex app-server available",
989
- "adapter.checkAppServerMissing": "this Codex CLI does not support `codex app-server` (please upgrade Codex CLI)"
1125
+ "adapter.checkAppServerMissing": "this Codex CLI does not support `codex app-server` (please upgrade Codex CLI)",
1126
+ "adapter.warnCursorCliMissing": 'Cursor CLI executable "{bin}" not found; install it (https://cursor.com/docs/cli) or set TUNNELBOX_CURSOR_BIN to its path',
1127
+ "adapter.checkCursorCliMissing": "Cursor CLI executable not found ({bin}); install it from https://cursor.com/docs/cli",
1128
+ "adapter.checkCursorAcpHint": "Cursor CLI detected; ACP mode (`agent acp`) will provide streaming/approval/selection",
1129
+ "adapter.errAcpSpawn": "Failed to start cursor `agent acp`: {message} (make sure your Cursor CLI supports `agent acp`)",
1130
+ "adapter.errAcpNoSession": "Cursor ACP did not return a session id",
1131
+ "adapter.logResumeFailed": "Session resume failed, starting a new session: {message}",
1132
+ "adapter.logPlanNative": "plan approval -> phone approval card permissionID={id} (session={session})",
1133
+ "adapter.errTimeout": "Timed out, auto-rejected (fail-closed)",
1134
+ "adapter.planApprovalPrompt": "Cursor requests approval for a plan",
1135
+ "adapter.checkCursorHeader": "tunnelbox-cursor environment check",
1136
+ "adapter.errAskBridge": "Failed to start the ask bridge: {message}",
1137
+ "adapter.logAskBridge": "MCP ask bridge listening at {url}",
1138
+ "cursor.mcpAskDesc": "Ask the user to choose on their phone (tunnelbox) and block until they answer. Use this whenever you need the user to pick between options before continuing (e.g. choosing a dish, a mode, or a plan option). Returns the selected option label(s).",
1139
+ "cursor.mcpAskTitleDesc": "Optional title shown on the phone card",
1140
+ "cursor.mcpAskQuestionsDesc": "One or more questions; each has options for the user to pick",
1141
+ "cursor.mcpPlanDesc": "Ask the user to approve a plan on their phone (tunnelbox) and block until they respond. Returns whether the plan was accepted.",
1142
+ "cursor.mcpNoBridge": "tunnelbox ask bridge is not available",
1143
+ "cursor.mcpUnanswered": "The user did not answer on their phone (offline or timed out). Proceed or ask conversationally.",
1144
+ "cursor.mcpRejected": "The user rejected the question on their phone.",
1145
+ "cursor.mcpAnswersHeader": "User's answers (from their phone):",
1146
+ "cursor.mcpAccepted": "The user accepted the plan.",
1147
+ "cursor.mcpDenied": "The user rejected the plan.",
1148
+ "cursor.mcpPlanUnanswered": "The user did not respond to the plan on their phone (offline or timed out).",
1149
+ "cursor.mcpAskNoQuestions": "No questions were provided.",
1150
+ "cursor.mcpFailed": "tunnelbox ask failed",
1151
+ "adapter.errCursorExitCode": "Cursor CLI exited with code {code}",
1152
+ "adapter.errCursorExit": "Cursor CLI exited ({code}): {err}",
1153
+ "adapter.errCursorSpawn": "Cannot start Cursor CLI (agent): make sure it is installed and logged in ({message})",
1154
+ "adapter.errCursorStart": "Cursor CLI failed to start: {message}",
1155
+ "adapter.errCursorGeneric": "Cursor error",
1156
+ "qr.downloadApp": "Download the tunnelbox App (Android / iOS): {url}",
1157
+ "adapter.logLegacyHookRemoved": "Removed the legacy PermissionRequest hook (hooks.json)",
1158
+ "adapter.errAppServerNotRunning": "codex app-server is not running",
1159
+ "adapter.errAppServerTimeout": "app-server request timed out: {method}",
1160
+ "adapter.errAppServerStopped": "app-server client stopped",
1161
+ "adapter.errAppServerExited": "codex app-server exited (code={code} signal={signal})",
1162
+ "adapter.errAppServerError": "app-server error: {message}",
1163
+ "adapter.logAppServerStderr": "app-server: {line}",
1164
+ "adapter.logAppServerExited": "app-server exited (code={code} signal={signal})",
1165
+ "adapter.errDshGenerate": "dsh generation error",
1166
+ "adapter.unknown": "unknown",
1167
+ "adapter.errGatewayClientMissing": "gateway client not created",
1168
+ "adapter.errGatewayNotConnected": "gateway not connected",
1169
+ "adapter.sessionTitleWithId": "{name} session {id}",
1170
+ "adapter.promptApproveTool": "{name} requests approval to run {tool}",
1171
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1172
+ "agent.err.http": "HTTP {status}: {text}",
1173
+ "claude.promptUrl": "URL: {url}",
1174
+ "hermes.errBridgeNotRunning": "bridge loop is not running",
1175
+ "hermes.errAskNoQuestion": "No question provided. Pass questions=[{question, choices?, multi_select?}, ...].",
1176
+ "hermes.toolPairDesc": "Request a one-time phone pairing code from the tunnelbox relay (for scanning/entering in the tunnelbox app). Use when the user asks how to connect/pair/scan or remotely control this machine from their phone.",
1177
+ "hermes.toolPairRefreshDesc": "Force requesting a new pairing code (default: reuse/ignore)",
1178
+ "hermes.toolStatusDesc": "Return tunnelbox plugin status: relay address, agent id, whether bound to a phone account, data directory, and latest pairing info. Use when the user asks about the phone connection status/binding/relay address.",
1179
+ "hermes.toolAskDesc": "Send a question/choice to the user's tunnelbox phone (remote UI) and wait for their selection or input. Returns JSON: {answered: bool, user_response: string|string[]|null}. If the phone is offline or times out, answered=false.",
1180
+ "hermes.toolAskQuestionDesc": "The question text to ask",
1181
+ "hermes.toolAskChoicesDesc": "Preset options (optional; up to 4)",
1182
+ "hermes.toolAskMultipleDesc": "Allow multiple selection (requires choices)",
1183
+ "hermes.cmdDesc": "tunnelbox: phone pairing / connection status",
1184
+ "hermes.logConfigLoadFailed": "tunnelbox: failed to read config, using defaults: {err}",
1185
+ "hermes.logRegisterToolsFailed": "tunnelbox: failed to register tools: {err}",
1186
+ "hermes.logRegisterCommandFailed": "tunnelbox: failed to register command: {err}",
1187
+ "hermes.logRegisterSkillFailed": "tunnelbox: failed to register skill: {err}",
1188
+ "hermes.logRegisterHooksFailed": "tunnelbox: failed to register hooks: {err}",
1189
+ "hermes.logRegisterApprovalFailed": "tunnelbox: failed to register approval transport: {err}",
1190
+ "hermes.logRegisterAskFailed": "tunnelbox: failed to register tunnelbox_ask: {err}",
1191
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: failed to register system prompt section: {err}",
1192
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: background bridge failed to start: {err}",
1193
+ "hermes.systemPromptAsk": "When you need a decision, clarification, or choice from the user and a tunnelbox phone is attached, use the `tunnelbox_ask` tool to ask on their phone instead of guessing. Wait for their answer before proceeding."
990
1194
  };
991
1195
 
992
1196
  // locales/ja-JP.json
@@ -1265,7 +1469,75 @@ var ja_JP_default = {
1265
1469
  "adapter.logQuestionNative": "\u9078\u629E\u30EA\u30AF\u30A8\u30B9\u30C8 -> \u30B9\u30DE\u30DB\u9078\u629E\u30AB\u30FC\u30C9 questionID={id} (session={session})",
1266
1470
  "adapter.logPermissionNative": "\u627F\u8A8D\u30EA\u30AF\u30A8\u30B9\u30C8 -> \u30B9\u30DE\u30DB\u627F\u8A8D\u30AB\u30FC\u30C9 permissionID={id} (session={session})",
1267
1471
  "adapter.checkAppServerOk": "codex app-server \u5229\u7528\u53EF\u80FD",
1268
- "adapter.checkAppServerMissing": "\u3053\u306E Codex CLI \u306F `codex app-server` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\uFF08Codex CLI \u3092\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\uFF09"
1472
+ "adapter.checkAppServerMissing": "\u3053\u306E Codex CLI \u306F `codex app-server` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\uFF08Codex CLI \u3092\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
1473
+ "adapter.warnCursorCliMissing": 'Cursor CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB "{bin}" \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\uFF08https://cursor.com/docs/cli\uFF09\u3059\u308B\u304B\u3001TUNNELBOX_CURSOR_BIN \u306B\u30D1\u30B9\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044',
1474
+ "adapter.checkCursorCliMissing": "Cursor CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08{bin}\uFF09\u3002https://cursor.com/docs/cli \u304B\u3089\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u304F\u3060\u3055\u3044",
1475
+ "adapter.checkCursorAcpHint": "Cursor CLI \u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002ACP \u30E2\u30FC\u30C9\uFF08`agent acp`\uFF09\u3067\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0/\u627F\u8A8D/\u9078\u629E\u3092\u63D0\u4F9B\u3057\u307E\u3059",
1476
+ "adapter.errAcpSpawn": "cursor `agent acp` \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}\uFF08Cursor CLI \u304C `agent acp` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
1477
+ "adapter.errAcpNoSession": "Cursor ACP \u304C\u30BB\u30C3\u30B7\u30E7\u30F3 id \u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F",
1478
+ "adapter.logResumeFailed": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u518D\u958B\u306B\u5931\u6557\u3057\u305F\u305F\u3081\u3001\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u958B\u59CB\u3057\u307E\u3059: {message}",
1479
+ "adapter.logPlanNative": "\u30D7\u30E9\u30F3\u627F\u8A8D -> \u30B9\u30DE\u30DB\u306E\u627F\u8A8D\u30AB\u30FC\u30C9 permissionID={id} (session={session})",
1480
+ "adapter.errTimeout": "\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u306E\u305F\u3081\u81EA\u52D5\u62D2\u5426\u3057\u307E\u3057\u305F\uFF08fail-closed\uFF09",
1481
+ "adapter.planApprovalPrompt": "Cursor \u304C\u30D7\u30E9\u30F3\u306E\u627F\u8A8D\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
1482
+ "adapter.checkCursorHeader": "tunnelbox-cursor \u74B0\u5883\u30C1\u30A7\u30C3\u30AF",
1483
+ "adapter.errAskBridge": "ask \u30D6\u30EA\u30C3\u30B8\u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
1484
+ "adapter.logAskBridge": "MCP ask \u30D6\u30EA\u30C3\u30B8\u304C {url} \u3067\u5F85\u3061\u53D7\u3051\u4E2D",
1485
+ "cursor.mcpAskDesc": "\u30E6\u30FC\u30B6\u30FC\u306B\u30B9\u30DE\u30DB\uFF08tunnelbox\uFF09\u3067\u9078\u629E\u3055\u305B\u3001\u56DE\u7B54\u304C\u3042\u308B\u307E\u3067\u30D6\u30ED\u30C3\u30AF\u3057\u307E\u3059\u3002\u7D9A\u884C\u524D\u306B\u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u80A2\u304B\u3089\u9078\u3076\u5FC5\u8981\u304C\u3042\u308B\u5834\u5408\uFF08\u6599\u7406\u30FB\u30E2\u30FC\u30C9\u30FB\u30D7\u30E9\u30F3\u6848\u306E\u9078\u629E\u306A\u3069\uFF09\u306B\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u9078\u629E\u3055\u308C\u305F\u9078\u629E\u80A2\u306E\u30E9\u30D9\u30EB\u3092\u8FD4\u3057\u307E\u3059\u3002",
1486
+ "cursor.mcpAskTitleDesc": "\u30B9\u30DE\u30DB\u306E\u30AB\u30FC\u30C9\u306B\u8868\u793A\u3059\u308B\u30BF\u30A4\u30C8\u30EB\uFF08\u4EFB\u610F\uFF09",
1487
+ "cursor.mcpAskQuestionsDesc": "1 \u3064\u4EE5\u4E0A\u306E\u8CEA\u554F\u3002\u5404\u8CEA\u554F\u306B\u306F\u9078\u629E\u80A2\u304C\u3042\u308A\u307E\u3059",
1488
+ "cursor.mcpPlanDesc": "\u30E6\u30FC\u30B6\u30FC\u306B\u30B9\u30DE\u30DB\uFF08tunnelbox\uFF09\u3067\u30D7\u30E9\u30F3\u306E\u627F\u8A8D\u3092\u6C42\u3081\u3001\u5FDC\u7B54\u304C\u3042\u308B\u307E\u3067\u30D6\u30ED\u30C3\u30AF\u3057\u307E\u3059\u3002\u627F\u8A8D\u3055\u308C\u305F\u304B\u3069\u3046\u304B\u3092\u8FD4\u3057\u307E\u3059\u3002",
1489
+ "cursor.mcpNoBridge": "tunnelbox ask \u30D6\u30EA\u30C3\u30B8\u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093",
1490
+ "cursor.mcpUnanswered": "\u30E6\u30FC\u30B6\u30FC\u306F\u30B9\u30DE\u30DB\u3067\u56DE\u7B54\u3057\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u307E\u305F\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF09\u3002\u7D9A\u884C\u3059\u308B\u304B\u3001\u4F1A\u8A71\u3067\u5C0B\u306D\u3066\u304F\u3060\u3055\u3044\u3002",
1491
+ "cursor.mcpRejected": "\u30E6\u30FC\u30B6\u30FC\u306F\u30B9\u30DE\u30DB\u3067\u8CEA\u554F\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002",
1492
+ "cursor.mcpAnswersHeader": "\u30E6\u30FC\u30B6\u30FC\uFF08\u30B9\u30DE\u30DB\uFF09\u306E\u56DE\u7B54:",
1493
+ "cursor.mcpAccepted": "\u30E6\u30FC\u30B6\u30FC\u306F\u30D7\u30E9\u30F3\u3092\u627F\u8A8D\u3057\u307E\u3057\u305F\u3002",
1494
+ "cursor.mcpDenied": "\u30E6\u30FC\u30B6\u30FC\u306F\u30D7\u30E9\u30F3\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002",
1495
+ "cursor.mcpPlanUnanswered": "\u30E6\u30FC\u30B6\u30FC\u306F\u30B9\u30DE\u30DB\u3067\u30D7\u30E9\u30F3\u306B\u5FDC\u7B54\u3057\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u307E\u305F\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF09\u3002",
1496
+ "cursor.mcpAskNoQuestions": "\u8CEA\u554F\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002",
1497
+ "cursor.mcpFailed": "tunnelbox ask \u304C\u5931\u6557\u3057\u307E\u3057\u305F",
1498
+ "adapter.errCursorExitCode": "Cursor CLI \u304C\u30B3\u30FC\u30C9 {code} \u3067\u7D42\u4E86\u3057\u307E\u3057\u305F",
1499
+ "adapter.errCursorExit": "Cursor CLI \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08{code}\uFF09: {err}",
1500
+ "adapter.errCursorSpawn": "Cursor CLI\uFF08agent\uFF09\u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3068\u30ED\u30B0\u30A4\u30F3\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08{message}\uFF09",
1501
+ "adapter.errCursorStart": "Cursor CLI \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
1502
+ "adapter.errCursorGeneric": "Cursor \u30A8\u30E9\u30FC",
1503
+ "qr.downloadApp": "tunnelbox App\uFF08Android / iOS\uFF09\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9: {url}",
1504
+ "adapter.logLegacyHookRemoved": "\u65E7 PermissionRequest hook\uFF08hooks.json\uFF09\u3092\u524A\u9664\u3057\u307E\u3057\u305F",
1505
+ "adapter.errAppServerNotRunning": "codex app-server \u304C\u5B9F\u884C\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1506
+ "adapter.errAppServerTimeout": "app-server \u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F: {method}",
1507
+ "adapter.errAppServerStopped": "app-server \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304C\u505C\u6B62\u3057\u307E\u3057\u305F",
1508
+ "adapter.errAppServerExited": "codex app-server \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08code={code} signal={signal}\uFF09",
1509
+ "adapter.errAppServerError": "app-server \u30A8\u30E9\u30FC: {message}",
1510
+ "adapter.logAppServerStderr": "app-server: {line}",
1511
+ "adapter.logAppServerExited": "app-server \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08code={code} signal={signal}\uFF09",
1512
+ "adapter.errDshGenerate": "dsh \u306E\u751F\u6210\u30A8\u30E9\u30FC",
1513
+ "adapter.unknown": "\u4E0D\u660E",
1514
+ "adapter.errGatewayClientMissing": "gateway \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304C\u4F5C\u6210\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1515
+ "adapter.errGatewayNotConnected": "gateway \u306B\u63A5\u7D9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1516
+ "adapter.sessionTitleWithId": "{name} \u30BB\u30C3\u30B7\u30E7\u30F3 {id}",
1517
+ "adapter.promptApproveTool": "{name} \u304C {tool} \u306E\u5B9F\u884C\u627F\u8A8D\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
1518
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1519
+ "agent.err.http": "HTTP {status}: {text}",
1520
+ "claude.promptUrl": "URL: {url}",
1521
+ "hermes.errBridgeNotRunning": "bridge \u30EB\u30FC\u30D7\u304C\u5B9F\u884C\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1522
+ "hermes.errAskNoQuestion": "\u8CEA\u554F\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002questions=[{question, choices?, multi_select?}, ...] \u3092\u6E21\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
1523
+ "hermes.toolPairDesc": "tunnelbox \u30EA\u30EC\u30FC\u304B\u3089\u4E00\u5EA6\u9650\u308A\u306E\u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u53D6\u5F97\u3057\u307E\u3059\uFF08tunnelbox App \u3067\u306E\u30B9\u30AD\u30E3\u30F3/\u5165\u529B\u7528\uFF09\u3002\u30B9\u30DE\u30DB\u304B\u3089\u306E\u63A5\u7D9A/\u30DA\u30A2\u30EA\u30F3\u30B0/\u30B9\u30AD\u30E3\u30F3\u65B9\u6CD5\u3084\u672C\u6A5F\u306E\u30EA\u30E2\u30FC\u30C8\u64CD\u4F5C\u306B\u3064\u3044\u3066\u5C0B\u306D\u3089\u308C\u305F\u3068\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002",
1524
+ "hermes.toolPairRefreshDesc": "\u65B0\u3057\u3044\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u5F37\u5236\u7684\u306B\u8981\u6C42\u3059\u308B\u304B\uFF08\u65E2\u5B9A: \u518D\u5229\u7528/\u7121\u8996\uFF09",
1525
+ "hermes.toolStatusDesc": "tunnelbox \u30D7\u30E9\u30B0\u30A4\u30F3\u306E\u72B6\u614B\u3092\u8FD4\u3057\u307E\u3059: \u30EA\u30EC\u30FC\u30A2\u30C9\u30EC\u30B9\u3001agent id\u3001\u30B9\u30DE\u30DB\u30A2\u30AB\u30A6\u30F3\u30C8\u3078\u306E\u30D0\u30A4\u30F3\u30C9\u6709\u7121\u3001\u30C7\u30FC\u30BF\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3001\u6700\u65B0\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3002\u30B9\u30DE\u30DB\u63A5\u7D9A\u72B6\u614B/\u30D0\u30A4\u30F3\u30C9/\u30EA\u30EC\u30FC\u30A2\u30C9\u30EC\u30B9\u306B\u3064\u3044\u3066\u5C0B\u306D\u3089\u308C\u305F\u3068\u304D\u306B\u4F7F\u7528\u3057\u307E\u3059\u3002",
1526
+ "hermes.toolAskDesc": "\u8CEA\u554F/\u9078\u629E\u3092\u30E6\u30FC\u30B6\u30FC\u306E tunnelbox \u30B9\u30DE\u30DB\uFF08\u30EA\u30E2\u30FC\u30C8 UI\uFF09\u306B\u9001\u308A\u3001\u9078\u629E\u307E\u305F\u306F\u5165\u529B\u304C\u3042\u308B\u307E\u3067\u5F85\u3061\u307E\u3059\u3002JSON \u3092\u8FD4\u3057\u307E\u3059: {answered: bool, user_response: string|string[]|null}\u3002\u30B9\u30DE\u30DB\u304C\u30AA\u30D5\u30E9\u30A4\u30F3\u307E\u305F\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u306E\u5834\u5408\u306F answered=false\u3002",
1527
+ "hermes.toolAskQuestionDesc": "\u5C0B\u306D\u308B\u8CEA\u554F\u30C6\u30AD\u30B9\u30C8",
1528
+ "hermes.toolAskChoicesDesc": "\u30D7\u30EA\u30BB\u30C3\u30C8\u9078\u629E\u80A2\uFF08\u4EFB\u610F\u3001\u6700\u5927 4 \u3064\uFF09",
1529
+ "hermes.toolAskMultipleDesc": "\u8907\u6570\u9078\u629E\u3092\u8A31\u53EF\uFF08choices \u304C\u5FC5\u8981\uFF09",
1530
+ "hermes.cmdDesc": "tunnelbox: \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0 / \u63A5\u7D9A\u72B6\u614B",
1531
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8A2D\u5B9A\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3001\u65E2\u5B9A\u5024\u3092\u4F7F\u7528: {err}",
1532
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u30C4\u30FC\u30EB\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1533
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u30B3\u30DE\u30F3\u30C9\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1534
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u30B9\u30AD\u30EB\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1535
+ "hermes.logRegisterHooksFailed": "tunnelbox: hooks \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1536
+ "hermes.logRegisterApprovalFailed": "tunnelbox: approval transport \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1537
+ "hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1538
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt \u30BB\u30AF\u30B7\u30E7\u30F3\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1539
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u30D6\u30EA\u30C3\u30B8\u306E\u8D77\u52D5\u306B\u5931\u6557: {err}",
1540
+ "hermes.systemPromptAsk": "\u30E6\u30FC\u30B6\u30FC\u306B\u6C7A\u5B9A/\u78BA\u8A8D/\u9078\u629E\u3092\u6C42\u3081\u308B\u5FC5\u8981\u304C\u3042\u308A\u3001tunnelbox \u30B9\u30DE\u30DB\u304C\u63A5\u7D9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u3001\u63A8\u6E2C\u305B\u305A `tunnelbox_ask` \u30C4\u30FC\u30EB\u3067\u30B9\u30DE\u30DB\u306B\u8CEA\u554F\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u56DE\u7B54\u304C\u3042\u308B\u307E\u3067\u5F85\u3063\u3066\u304B\u3089\u7D9A\u884C\u3057\u307E\u3059\u3002"
1269
1541
  };
1270
1542
 
1271
1543
  // locales/ko-KR.json
@@ -1544,7 +1816,75 @@ var ko_KR_default = {
1544
1816
  "adapter.logQuestionNative": "\uC120\uD0DD \uC694\uCCAD -> \uD734\uB300\uD3F0 \uC120\uD0DD \uCE74\uB4DC questionID={id} (session={session})",
1545
1817
  "adapter.logPermissionNative": "\uC2B9\uC778 \uC694\uCCAD -> \uD734\uB300\uD3F0 \uC2B9\uC778 \uCE74\uB4DC permissionID={id} (session={session})",
1546
1818
  "adapter.checkAppServerOk": "codex app-server \uC0AC\uC6A9 \uAC00\uB2A5",
1547
- "adapter.checkAppServerMissing": "\uC774 Codex CLI \uB294 `codex app-server` \uB97C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (Codex CLI \uB97C \uC5C5\uADF8\uB808\uC774\uB4DC\uD558\uC138\uC694)"
1819
+ "adapter.checkAppServerMissing": "\uC774 Codex CLI \uB294 `codex app-server` \uB97C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (Codex CLI \uB97C \uC5C5\uADF8\uB808\uC774\uB4DC\uD558\uC138\uC694)",
1820
+ "adapter.warnCursorCliMissing": 'Cursor CLI \uC2E4\uD589 \uD30C\uC77C "{bin}"\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uCE58\uD558\uAC70\uB098(https://cursor.com/docs/cli) TUNNELBOX_CURSOR_BIN\uC5D0 \uACBD\uB85C\uB97C \uC9C0\uC815\uD558\uC138\uC694',
1821
+ "adapter.checkCursorCliMissing": "Cursor CLI \uC2E4\uD589 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4({bin}). https://cursor.com/docs/cli \uC5D0\uC11C \uC124\uCE58\uD558\uC138\uC694",
1822
+ "adapter.checkCursorAcpHint": "Cursor CLI\uB97C \uAC10\uC9C0\uD588\uC2B5\uB2C8\uB2E4. ACP \uBAA8\uB4DC(`agent acp`)\uB85C \uC2A4\uD2B8\uB9AC\uBC0D/\uC2B9\uC778/\uC120\uD0DD\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4",
1823
+ "adapter.errAcpSpawn": "cursor `agent acp` \uC2DC\uC791 \uC2E4\uD328: {message} (Cursor CLI\uAC00 `agent acp`\uB97C \uC9C0\uC6D0\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694)",
1824
+ "adapter.errAcpNoSession": "Cursor ACP\uAC00 \uC138\uC158 id\uB97C \uBC18\uD658\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
1825
+ "adapter.logResumeFailed": "\uC138\uC158 \uC7AC\uAC1C \uC2E4\uD328, \uC0C8 \uC138\uC158\uC744 \uC2DC\uC791\uD569\uB2C8\uB2E4: {message}",
1826
+ "adapter.logPlanNative": "\uACC4\uD68D \uC2B9\uC778 -> \uD734\uB300\uD3F0 \uC2B9\uC778 \uCE74\uB4DC permissionID={id} (session={session})",
1827
+ "adapter.errTimeout": "\uC2DC\uAC04 \uCD08\uACFC\uB85C \uC790\uB3D9 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4(fail-closed)",
1828
+ "adapter.planApprovalPrompt": "Cursor\uAC00 \uACC4\uD68D \uC2B9\uC778\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
1829
+ "adapter.checkCursorHeader": "tunnelbox-cursor \uD658\uACBD \uC810\uAC80",
1830
+ "adapter.errAskBridge": "ask \uBE0C\uB9AC\uC9C0 \uC2DC\uC791 \uC2E4\uD328: {message}",
1831
+ "adapter.logAskBridge": "MCP ask \uBE0C\uB9AC\uC9C0\uAC00 {url} \uC5D0\uC11C \uB300\uAE30 \uC911",
1832
+ "cursor.mcpAskDesc": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0(tunnelbox)\uC5D0\uC11C \uC120\uD0DD\uD558\uB3C4\uB85D \uC694\uCCAD\uD558\uACE0 \uC751\uB2F5\uD560 \uB54C\uAE4C\uC9C0 \uCC28\uB2E8\uD569\uB2C8\uB2E4. \uACC4\uC18D\uD558\uAE30 \uC804\uC5D0 \uC0AC\uC6A9\uC790\uAC00 \uC635\uC158 \uC911 \uD558\uB098\uB97C \uACE8\uB77C\uC57C \uD560 \uB54C(\uC74C\uC2DD, \uBAA8\uB4DC, \uACC4\uD68D\uC548 \uC120\uD0DD \uB4F1) \uC0AC\uC6A9\uD558\uC138\uC694. \uC120\uD0DD\uD55C \uC635\uC158 \uB77C\uBCA8\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4.",
1833
+ "cursor.mcpAskTitleDesc": "\uD734\uB300\uD3F0 \uCE74\uB4DC\uC5D0 \uD45C\uC2DC\uD560 \uC81C\uBAA9(\uC120\uD0DD)",
1834
+ "cursor.mcpAskQuestionsDesc": "\uD558\uB098 \uC774\uC0C1\uC758 \uC9C8\uBB38. \uAC01 \uC9C8\uBB38\uC5D0\uB294 \uC120\uD0DD\uC9C0\uAC00 \uC788\uC2B5\uB2C8\uB2E4",
1835
+ "cursor.mcpPlanDesc": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0(tunnelbox)\uC5D0\uC11C \uACC4\uD68D\uC744 \uC2B9\uC778\uD558\uB3C4\uB85D \uC694\uCCAD\uD558\uACE0 \uC751\uB2F5\uD560 \uB54C\uAE4C\uC9C0 \uCC28\uB2E8\uD569\uB2C8\uB2E4. \uC2B9\uC778 \uC5EC\uBD80\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.",
1836
+ "cursor.mcpNoBridge": "tunnelbox ask \uBE0C\uB9AC\uC9C0\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
1837
+ "cursor.mcpUnanswered": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0\uC5D0\uC11C \uC751\uB2F5\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4(\uC624\uD504\uB77C\uC778 \uB610\uB294 \uC2DC\uAC04 \uCD08\uACFC). \uACC4\uC18D \uC9C4\uD589\uD558\uAC70\uB098 \uB300\uD654\uB85C \uBB3C\uC5B4\uBCF4\uC138\uC694.",
1838
+ "cursor.mcpRejected": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0\uC5D0\uC11C \uC9C8\uBB38\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4.",
1839
+ "cursor.mcpAnswersHeader": "\uC0AC\uC6A9\uC790(\uD734\uB300\uD3F0)\uC758 \uC751\uB2F5:",
1840
+ "cursor.mcpAccepted": "\uC0AC\uC6A9\uC790\uAC00 \uACC4\uD68D\uC744 \uC2B9\uC778\uD588\uC2B5\uB2C8\uB2E4.",
1841
+ "cursor.mcpDenied": "\uC0AC\uC6A9\uC790\uAC00 \uACC4\uD68D\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4.",
1842
+ "cursor.mcpPlanUnanswered": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0\uC5D0\uC11C \uACC4\uD68D\uC5D0 \uC751\uB2F5\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4(\uC624\uD504\uB77C\uC778 \uB610\uB294 \uC2DC\uAC04 \uCD08\uACFC).",
1843
+ "cursor.mcpAskNoQuestions": "\uC9C8\uBB38\uC774 \uC81C\uACF5\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
1844
+ "cursor.mcpFailed": "tunnelbox ask \uC2E4\uD328",
1845
+ "adapter.errCursorExitCode": "Cursor CLI\uAC00 \uCF54\uB4DC {code}(\uC73C)\uB85C \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
1846
+ "adapter.errCursorExit": "Cursor CLI \uC885\uB8CC({code}): {err}",
1847
+ "adapter.errCursorSpawn": "Cursor CLI(agent)\uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uCE58 \uBC0F \uB85C\uADF8\uC778\uC744 \uD655\uC778\uD558\uC138\uC694({message})",
1848
+ "adapter.errCursorStart": "Cursor CLI \uC2DC\uC791 \uC2E4\uD328: {message}",
1849
+ "adapter.errCursorGeneric": "Cursor \uC624\uB958",
1850
+ "qr.downloadApp": "tunnelbox \uC571(Android / iOS) \uB2E4\uC6B4\uB85C\uB4DC: {url}",
1851
+ "adapter.logLegacyHookRemoved": "\uC774\uC804 PermissionRequest hook(hooks.json)\uC744 \uC81C\uAC70\uD588\uC2B5\uB2C8\uB2E4",
1852
+ "adapter.errAppServerNotRunning": "codex app-server\uAC00 \uC2E4\uD589 \uC911\uC774 \uC544\uB2D9\uB2C8\uB2E4",
1853
+ "adapter.errAppServerTimeout": "app-server \uC694\uCCAD \uC2DC\uAC04 \uCD08\uACFC: {method}",
1854
+ "adapter.errAppServerStopped": "app-server \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
1855
+ "adapter.errAppServerExited": "codex app-server \uC885\uB8CC(code={code} signal={signal})",
1856
+ "adapter.errAppServerError": "app-server \uC624\uB958: {message}",
1857
+ "adapter.logAppServerStderr": "app-server: {line}",
1858
+ "adapter.logAppServerExited": "app-server \uC885\uB8CC(code={code} signal={signal})",
1859
+ "adapter.errDshGenerate": "dsh \uC0DD\uC131 \uC624\uB958",
1860
+ "adapter.unknown": "\uC54C \uC218 \uC5C6\uC74C",
1861
+ "adapter.errGatewayClientMissing": "gateway \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
1862
+ "adapter.errGatewayNotConnected": "gateway\uC5D0 \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
1863
+ "adapter.sessionTitleWithId": "{name} \uC138\uC158 {id}",
1864
+ "adapter.promptApproveTool": "{name}\uC774(\uAC00) {tool} \uC2E4\uD589 \uC2B9\uC778\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
1865
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1866
+ "agent.err.http": "HTTP {status}: {text}",
1867
+ "claude.promptUrl": "URL: {url}",
1868
+ "hermes.errBridgeNotRunning": "bridge \uB8E8\uD504\uAC00 \uC2E4\uD589 \uC911\uC774 \uC544\uB2D9\uB2C8\uB2E4",
1869
+ "hermes.errAskNoQuestion": "\uC9C8\uBB38\uC774 \uC81C\uACF5\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. questions=[{question, choices?, multi_select?}, ...]\uB97C \uC804\uB2EC\uD558\uC138\uC694.",
1870
+ "hermes.toolPairDesc": "tunnelbox \uB9B4\uB808\uC774\uC5D0\uC11C \uC77C\uD68C\uC6A9 \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC694\uCCAD\uD569\uB2C8\uB2E4(tunnelbox \uC571\uC5D0\uC11C \uC2A4\uCE94/\uC785\uB825\uC6A9). \uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0\uC73C\uB85C \uC5F0\uACB0/\uD398\uC5B4\uB9C1/\uC2A4\uCE94 \uBC29\uBC95\uC774\uB098 \uC774 \uCEF4\uD4E8\uD130\uC758 \uC6D0\uACA9 \uC81C\uC5B4\uB97C \uBB3C\uC744 \uB54C \uC0AC\uC6A9\uD558\uC138\uC694.",
1871
+ "hermes.toolPairRefreshDesc": "\uC0C8 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uAC15\uC81C\uB85C \uC694\uCCAD\uD560\uC9C0 \uC5EC\uBD80(\uAE30\uBCF8: \uC7AC\uC0AC\uC6A9/\uBB34\uC2DC)",
1872
+ "hermes.toolStatusDesc": "tunnelbox \uD50C\uB7EC\uADF8\uC778 \uC0C1\uD0DC\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4: \uB9B4\uB808\uC774 \uC8FC\uC18C, agent id, \uD734\uB300\uD3F0 \uACC4\uC815 \uBC14\uC778\uB529 \uC5EC\uBD80, \uB370\uC774\uD130 \uB514\uB809\uD130\uB9AC, \uCD5C\uADFC \uD398\uC5B4\uB9C1 \uC815\uBCF4. \uD734\uB300\uD3F0 \uC5F0\uACB0 \uC0C1\uD0DC/\uBC14\uC778\uB529/\uB9B4\uB808\uC774 \uC8FC\uC18C\uB97C \uBB3C\uC744 \uB54C \uC0AC\uC6A9\uD558\uC138\uC694.",
1873
+ "hermes.toolAskDesc": "\uC9C8\uBB38/\uC120\uD0DD\uC744 \uC0AC\uC6A9\uC790\uC758 tunnelbox \uD734\uB300\uD3F0(\uC6D0\uACA9 UI)\uC73C\uB85C \uBCF4\uB0B4\uACE0 \uC120\uD0DD \uB610\uB294 \uC785\uB825\uC744 \uAE30\uB2E4\uB9BD\uB2C8\uB2E4. JSON \uBC18\uD658: {answered: bool, user_response: string|string[]|null}. \uD734\uB300\uD3F0\uC774 \uC624\uD504\uB77C\uC778\uC774\uAC70\uB098 \uC2DC\uAC04 \uCD08\uACFC\uBA74 answered=false.",
1874
+ "hermes.toolAskQuestionDesc": "\uC9C8\uBB38 \uD14D\uC2A4\uD2B8",
1875
+ "hermes.toolAskChoicesDesc": "\uC0AC\uC804 \uC124\uC815 \uC120\uD0DD\uC9C0(\uC120\uD0DD, \uCD5C\uB300 4\uAC1C)",
1876
+ "hermes.toolAskMultipleDesc": "\uB2E4\uC911 \uC120\uD0DD \uD5C8\uC6A9(choices \uD544\uC694)",
1877
+ "hermes.cmdDesc": "tunnelbox: \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 / \uC5F0\uACB0 \uC0C1\uD0DC",
1878
+ "hermes.logConfigLoadFailed": "tunnelbox: \uC124\uC815 \uC77D\uAE30 \uC2E4\uD328, \uAE30\uBCF8\uAC12 \uC0AC\uC6A9: {err}",
1879
+ "hermes.logRegisterToolsFailed": "tunnelbox: \uB3C4\uAD6C \uB4F1\uB85D \uC2E4\uD328: {err}",
1880
+ "hermes.logRegisterCommandFailed": "tunnelbox: \uBA85\uB839 \uB4F1\uB85D \uC2E4\uD328: {err}",
1881
+ "hermes.logRegisterSkillFailed": "tunnelbox: \uC2A4\uD0AC \uB4F1\uB85D \uC2E4\uD328: {err}",
1882
+ "hermes.logRegisterHooksFailed": "tunnelbox: hooks \uB4F1\uB85D \uC2E4\uD328: {err}",
1883
+ "hermes.logRegisterApprovalFailed": "tunnelbox: approval transport \uB4F1\uB85D \uC2E4\uD328: {err}",
1884
+ "hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask \uB4F1\uB85D \uC2E4\uD328: {err}",
1885
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt \uC139\uC158 \uB4F1\uB85D \uC2E4\uD328: {err}",
1886
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \uBC31\uADF8\uB77C\uC6B4\uB4DC \uBE0C\uB9AC\uC9C0 \uC2DC\uC791 \uC2E4\uD328: {err}",
1887
+ "hermes.systemPromptAsk": "\uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACB0\uC815/\uD655\uC778/\uC120\uD0DD\uC774 \uD544\uC694\uD558\uACE0 tunnelbox \uD734\uB300\uD3F0\uC774 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC73C\uBA74 \uCD94\uCE21\uD558\uC9C0 \uB9D0\uACE0 `tunnelbox_ask` \uB3C4\uAD6C\uB85C \uD734\uB300\uD3F0\uC5D0\uC11C \uC9C8\uBB38\uD558\uC138\uC694. \uC0AC\uC6A9\uC790\uAC00 \uB2F5\uD560 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9B0 \uD6C4 \uC9C4\uD589\uD558\uC138\uC694."
1548
1888
  };
1549
1889
 
1550
1890
  // locales/fr-FR.json
@@ -1823,7 +2163,75 @@ var fr_FR_default = {
1823
2163
  "adapter.logQuestionNative": "demande de choix -> carte de choix du t\xE9l\xE9phone questionID={id} (session={session})",
1824
2164
  "adapter.logPermissionNative": "demande d'approbation -> carte d'approbation du t\xE9l\xE9phone permissionID={id} (session={session})",
1825
2165
  "adapter.checkAppServerOk": "codex app-server disponible",
1826
- "adapter.checkAppServerMissing": "ce Codex CLI ne prend pas en charge `codex app-server` (veuillez mettre \xE0 jour Codex CLI)"
2166
+ "adapter.checkAppServerMissing": "ce Codex CLI ne prend pas en charge `codex app-server` (veuillez mettre \xE0 jour Codex CLI)",
2167
+ "adapter.warnCursorCliMissing": "Ex\xE9cutable Cursor CLI \xAB {bin} \xBB introuvable ; installez-le (https://cursor.com/docs/cli) ou d\xE9finissez TUNNELBOX_CURSOR_BIN",
2168
+ "adapter.checkCursorCliMissing": "Ex\xE9cutable Cursor CLI introuvable ({bin}) ; installez-le depuis https://cursor.com/docs/cli",
2169
+ "adapter.checkCursorAcpHint": "Cursor CLI d\xE9tect\xE9 ; le mode ACP (`agent acp`) sera utilis\xE9 pour le streaming/l'approbation/la s\xE9lection",
2170
+ "adapter.errAcpSpawn": "\xC9chec du d\xE9marrage de cursor `agent acp` : {message} (v\xE9rifiez que votre Cursor CLI prend en charge `agent acp`)",
2171
+ "adapter.errAcpNoSession": "Cursor ACP n'a pas renvoy\xE9 d'id de session",
2172
+ "adapter.logResumeFailed": "\xC9chec de la reprise de session, d\xE9marrage d'une nouvelle session : {message}",
2173
+ "adapter.logPlanNative": "approbation de plan -> carte d'approbation du t\xE9l\xE9phone permissionID={id} (session={session})",
2174
+ "adapter.errTimeout": "D\xE9lai d\xE9pass\xE9, rejet automatique (fail-closed)",
2175
+ "adapter.planApprovalPrompt": "Cursor demande l'approbation d'un plan",
2176
+ "adapter.checkCursorHeader": "v\xE9rification de l'environnement tunnelbox-cursor",
2177
+ "adapter.errAskBridge": "\xC9chec du d\xE9marrage du pont ask : {message}",
2178
+ "adapter.logAskBridge": "Pont MCP ask \xE0 l'\xE9coute sur {url}",
2179
+ "cursor.mcpAskDesc": "Demande \xE0 l'utilisateur de choisir sur son t\xE9l\xE9phone (tunnelbox) et bloque jusqu'\xE0 sa r\xE9ponse. \xC0 utiliser chaque fois que l'utilisateur doit choisir entre des options avant de continuer (plat, mode, option de plan\u2026). Renvoie le(s) libell\xE9(s) choisi(s).",
2180
+ "cursor.mcpAskTitleDesc": "Titre facultatif affich\xE9 sur la carte du t\xE9l\xE9phone",
2181
+ "cursor.mcpAskQuestionsDesc": "Une ou plusieurs questions ; chacune propose des options",
2182
+ "cursor.mcpPlanDesc": "Demande \xE0 l'utilisateur d'approuver un plan sur son t\xE9l\xE9phone (tunnelbox) et bloque jusqu'\xE0 sa r\xE9ponse. Indique si le plan a \xE9t\xE9 accept\xE9.",
2183
+ "cursor.mcpNoBridge": "le pont ask tunnelbox n'est pas disponible",
2184
+ "cursor.mcpUnanswered": "L'utilisateur n'a pas r\xE9pondu sur son t\xE9l\xE9phone (hors ligne ou d\xE9lai d\xE9pass\xE9). Continuez ou posez la question en conversation.",
2185
+ "cursor.mcpRejected": "L'utilisateur a rejet\xE9 la question sur son t\xE9l\xE9phone.",
2186
+ "cursor.mcpAnswersHeader": "R\xE9ponses de l'utilisateur (depuis son t\xE9l\xE9phone) :",
2187
+ "cursor.mcpAccepted": "L'utilisateur a accept\xE9 le plan.",
2188
+ "cursor.mcpDenied": "L'utilisateur a rejet\xE9 le plan.",
2189
+ "cursor.mcpPlanUnanswered": "L'utilisateur n'a pas r\xE9pondu au plan sur son t\xE9l\xE9phone (hors ligne ou d\xE9lai d\xE9pass\xE9).",
2190
+ "cursor.mcpAskNoQuestions": "Aucune question fournie.",
2191
+ "cursor.mcpFailed": "\xE9chec de tunnelbox ask",
2192
+ "adapter.errCursorExitCode": "Cursor CLI s'est arr\xEAt\xE9 avec le code {code}",
2193
+ "adapter.errCursorExit": "Cursor CLI arr\xEAt\xE9 ({code}) : {err}",
2194
+ "adapter.errCursorSpawn": "Impossible de d\xE9marrer Cursor CLI (agent) : v\xE9rifiez qu'il est install\xE9 et connect\xE9 ({message})",
2195
+ "adapter.errCursorStart": "\xC9chec du d\xE9marrage de Cursor CLI : {message}",
2196
+ "adapter.errCursorGeneric": "Erreur Cursor",
2197
+ "qr.downloadApp": "T\xE9l\xE9charger l'application tunnelbox (Android / iOS) : {url}",
2198
+ "adapter.logLegacyHookRemoved": "Ancien hook PermissionRequest supprim\xE9 (hooks.json)",
2199
+ "adapter.errAppServerNotRunning": "codex app-server n'est pas en cours d'ex\xE9cution",
2200
+ "adapter.errAppServerTimeout": "D\xE9lai d\xE9pass\xE9 pour la requ\xEAte app-server : {method}",
2201
+ "adapter.errAppServerStopped": "Client app-server arr\xEAt\xE9",
2202
+ "adapter.errAppServerExited": "codex app-server arr\xEAt\xE9 (code={code} signal={signal})",
2203
+ "adapter.errAppServerError": "Erreur app-server : {message}",
2204
+ "adapter.logAppServerStderr": "app-server : {line}",
2205
+ "adapter.logAppServerExited": "app-server arr\xEAt\xE9 (code={code} signal={signal})",
2206
+ "adapter.errDshGenerate": "Erreur de g\xE9n\xE9ration dsh",
2207
+ "adapter.unknown": "inconnu",
2208
+ "adapter.errGatewayClientMissing": "Client gateway non cr\xE9\xE9",
2209
+ "adapter.errGatewayNotConnected": "Gateway non connect\xE9",
2210
+ "adapter.sessionTitleWithId": "session {name} {id}",
2211
+ "adapter.promptApproveTool": "{name} demande l'approbation d'ex\xE9cuter {tool}",
2212
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2213
+ "agent.err.http": "HTTP {status} : {text}",
2214
+ "claude.promptUrl": "URL : {url}",
2215
+ "hermes.errBridgeNotRunning": "La boucle bridge n'est pas en cours d'ex\xE9cution",
2216
+ "hermes.errAskNoQuestion": "Aucune question fournie. Passez questions=[{question, choices?, multi_select?}, ...].",
2217
+ "hermes.toolPairDesc": "Demande un code d'appairage t\xE9l\xE9phone \xE0 usage unique au relais tunnelbox (pour le scan/la saisie dans l'app tunnelbox). \xC0 utiliser quand l'utilisateur demande comment se connecter/s'appairer/scanner ou contr\xF4ler cet ordinateur depuis son t\xE9l\xE9phone.",
2218
+ "hermes.toolPairRefreshDesc": "Forcer la demande d'un nouveau code d'appairage (par d\xE9faut : r\xE9utiliser/ignorer)",
2219
+ "hermes.toolStatusDesc": "Renvoie l'\xE9tat du plugin tunnelbox : adresse du relais, id de l'agent, liaison \xE0 un compte t\xE9l\xE9phone, r\xE9pertoire de donn\xE9es et derni\xE8res infos d'appairage. \xC0 utiliser quand l'utilisateur demande l'\xE9tat de connexion/la liaison/l'adresse du relais.",
2220
+ "hermes.toolAskDesc": "Envoie une question/un choix au t\xE9l\xE9phone tunnelbox de l'utilisateur (UI distante) et attend sa s\xE9lection ou saisie. Renvoie un JSON : {answered: bool, user_response: string|string[]|null}. Si le t\xE9l\xE9phone est hors ligne ou d\xE9passe le d\xE9lai, answered=false.",
2221
+ "hermes.toolAskQuestionDesc": "Le texte de la question \xE0 poser",
2222
+ "hermes.toolAskChoicesDesc": "Options pr\xE9d\xE9finies (facultatif ; jusqu'\xE0 4)",
2223
+ "hermes.toolAskMultipleDesc": "Autoriser la s\xE9lection multiple (n\xE9cessite choices)",
2224
+ "hermes.cmdDesc": "tunnelbox : appairage t\xE9l\xE9phone / \xE9tat de connexion",
2225
+ "hermes.logConfigLoadFailed": "tunnelbox : \xE9chec de lecture de la config, valeurs par d\xE9faut : {err}",
2226
+ "hermes.logRegisterToolsFailed": "tunnelbox : \xE9chec d'enregistrement des outils : {err}",
2227
+ "hermes.logRegisterCommandFailed": "tunnelbox : \xE9chec d'enregistrement de la commande : {err}",
2228
+ "hermes.logRegisterSkillFailed": "tunnelbox : \xE9chec d'enregistrement de la comp\xE9tence : {err}",
2229
+ "hermes.logRegisterHooksFailed": "tunnelbox : \xE9chec d'enregistrement des hooks : {err}",
2230
+ "hermes.logRegisterApprovalFailed": "tunnelbox : \xE9chec d'enregistrement du transport d'approbation : {err}",
2231
+ "hermes.logRegisterAskFailed": "tunnelbox : \xE9chec d'enregistrement de tunnelbox_ask : {err}",
2232
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox : \xE9chec d'enregistrement de la section du prompt syst\xE8me : {err}",
2233
+ "hermes.logBackgroundBridgeFailed": "tunnelbox : \xE9chec du d\xE9marrage du pont en arri\xE8re-plan : {err}",
2234
+ "hermes.systemPromptAsk": "Lorsque vous avez besoin d'une d\xE9cision, d'une clarification ou d'un choix de l'utilisateur et qu'un t\xE9l\xE9phone tunnelbox est associ\xE9, utilisez l'outil `tunnelbox_ask` pour poser la question sur son t\xE9l\xE9phone au lieu de deviner. Attendez sa r\xE9ponse avant de continuer."
1827
2235
  };
1828
2236
 
1829
2237
  // locales/de-DE.json
@@ -2102,7 +2510,75 @@ var de_DE_default = {
2102
2510
  "adapter.logQuestionNative": "Auswahlanfrage -> Auswahlkarte am Handy questionID={id} (session={session})",
2103
2511
  "adapter.logPermissionNative": "Genehmigungsanfrage -> Genehmigungskarte am Handy permissionID={id} (session={session})",
2104
2512
  "adapter.checkAppServerOk": "codex app-server verf\xFCgbar",
2105
- "adapter.checkAppServerMissing": "diese Codex CLI unterst\xFCtzt `codex app-server` nicht (bitte Codex CLI aktualisieren)"
2513
+ "adapter.checkAppServerMissing": "diese Codex CLI unterst\xFCtzt `codex app-server` nicht (bitte Codex CLI aktualisieren)",
2514
+ "adapter.warnCursorCliMissing": 'Cursor-CLI-Programm "{bin}" nicht gefunden; installieren Sie es (https://cursor.com/docs/cli) oder setzen Sie TUNNELBOX_CURSOR_BIN',
2515
+ "adapter.checkCursorCliMissing": "Cursor-CLI-Programm nicht gefunden ({bin}); installieren Sie es von https://cursor.com/docs/cli",
2516
+ "adapter.checkCursorAcpHint": "Cursor CLI erkannt; der ACP-Modus (`agent acp`) wird f\xFCr Streaming/Genehmigung/Auswahl verwendet",
2517
+ "adapter.errAcpSpawn": "Start von cursor `agent acp` fehlgeschlagen: {message} (stellen Sie sicher, dass Ihre Cursor CLI `agent acp` unterst\xFCtzt)",
2518
+ "adapter.errAcpNoSession": "Cursor ACP hat keine Sitzungs-ID zur\xFCckgegeben",
2519
+ "adapter.logResumeFailed": "Sitzungswiederaufnahme fehlgeschlagen, neue Sitzung wird gestartet: {message}",
2520
+ "adapter.logPlanNative": "Plan-Genehmigung -> Genehmigungskarte am Handy permissionID={id} (session={session})",
2521
+ "adapter.errTimeout": "Zeit\xFCberschreitung, automatisch abgelehnt (fail-closed)",
2522
+ "adapter.planApprovalPrompt": "Cursor fordert die Genehmigung eines Plans an",
2523
+ "adapter.checkCursorHeader": "tunnelbox-cursor Umgebungspr\xFCfung",
2524
+ "adapter.errAskBridge": "Start der ask-Bridge fehlgeschlagen: {message}",
2525
+ "adapter.logAskBridge": "MCP ask-Bridge lauscht auf {url}",
2526
+ "cursor.mcpAskDesc": "Fordert den Nutzer auf, auf dem Handy (tunnelbox) zu w\xE4hlen, und blockiert bis zur Antwort. Verwende dies, wann immer der Nutzer vor dem Fortfahren zwischen Optionen w\xE4hlen muss (Gericht, Modus, Planoption \u2026). Gibt die gew\xE4hlten Optionsbezeichnungen zur\xFCck.",
2527
+ "cursor.mcpAskTitleDesc": "Optionaler Titel auf der Handy-Karte",
2528
+ "cursor.mcpAskQuestionsDesc": "Eine oder mehrere Fragen; jede bietet Optionen",
2529
+ "cursor.mcpPlanDesc": "Fordert den Nutzer auf, einen Plan auf dem Handy (tunnelbox) zu genehmigen, und blockiert bis zur Antwort. Gibt zur\xFCck, ob der Plan akzeptiert wurde.",
2530
+ "cursor.mcpNoBridge": "die tunnelbox ask-Bridge ist nicht verf\xFCgbar",
2531
+ "cursor.mcpUnanswered": "Der Nutzer hat auf dem Handy nicht geantwortet (offline oder Zeit\xFCberschreitung). Fahre fort oder frage im Chat.",
2532
+ "cursor.mcpRejected": "Der Nutzer hat die Frage auf dem Handy abgelehnt.",
2533
+ "cursor.mcpAnswersHeader": "Antworten des Nutzers (vom Handy):",
2534
+ "cursor.mcpAccepted": "Der Nutzer hat den Plan akzeptiert.",
2535
+ "cursor.mcpDenied": "Der Nutzer hat den Plan abgelehnt.",
2536
+ "cursor.mcpPlanUnanswered": "Der Nutzer hat auf dem Handy nicht auf den Plan geantwortet (offline oder Zeit\xFCberschreitung).",
2537
+ "cursor.mcpAskNoQuestions": "Keine Fragen angegeben.",
2538
+ "cursor.mcpFailed": "tunnelbox ask fehlgeschlagen",
2539
+ "adapter.errCursorExitCode": "Cursor CLI beendet mit Code {code}",
2540
+ "adapter.errCursorExit": "Cursor CLI beendet ({code}): {err}",
2541
+ "adapter.errCursorSpawn": "Cursor CLI (agent) kann nicht gestartet werden: Stellen Sie sicher, dass es installiert und angemeldet ist ({message})",
2542
+ "adapter.errCursorStart": "Start von Cursor CLI fehlgeschlagen: {message}",
2543
+ "adapter.errCursorGeneric": "Cursor-Fehler",
2544
+ "qr.downloadApp": "tunnelbox-App herunterladen (Android / iOS): {url}",
2545
+ "adapter.logLegacyHookRemoved": "Alter PermissionRequest-Hook entfernt (hooks.json)",
2546
+ "adapter.errAppServerNotRunning": "codex app-server l\xE4uft nicht",
2547
+ "adapter.errAppServerTimeout": "Zeit\xFCberschreitung bei app-server-Anfrage: {method}",
2548
+ "adapter.errAppServerStopped": "app-server-Client gestoppt",
2549
+ "adapter.errAppServerExited": "codex app-server beendet (code={code} signal={signal})",
2550
+ "adapter.errAppServerError": "app-server-Fehler: {message}",
2551
+ "adapter.logAppServerStderr": "app-server: {line}",
2552
+ "adapter.logAppServerExited": "app-server beendet (code={code} signal={signal})",
2553
+ "adapter.errDshGenerate": "dsh-Generierungsfehler",
2554
+ "adapter.unknown": "unbekannt",
2555
+ "adapter.errGatewayClientMissing": "Gateway-Client nicht erstellt",
2556
+ "adapter.errGatewayNotConnected": "Gateway nicht verbunden",
2557
+ "adapter.sessionTitleWithId": "{name}-Sitzung {id}",
2558
+ "adapter.promptApproveTool": "{name} fordert die Genehmigung zur Ausf\xFChrung von {tool} an",
2559
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2560
+ "agent.err.http": "HTTP {status}: {text}",
2561
+ "claude.promptUrl": "URL: {url}",
2562
+ "hermes.errBridgeNotRunning": "Bridge-Schleife l\xE4uft nicht",
2563
+ "hermes.errAskNoQuestion": "Keine Frage angegeben. \xDCbergeben Sie questions=[{question, choices?, multi_select?}, ...].",
2564
+ "hermes.toolPairDesc": "Fordert einen einmaligen Telefon-Kopplungscode vom tunnelbox-Relay an (zum Scannen/Eingeben in der tunnelbox-App). Verwenden, wenn der Nutzer fragt, wie er sich verbindet/koppelt/scannt oder diesen Computer vom Telefon aus steuert.",
2565
+ "hermes.toolPairRefreshDesc": "Erzwingt die Anforderung eines neuen Kopplungscodes (Standard: wiederverwenden/ignorieren)",
2566
+ "hermes.toolStatusDesc": "Gibt den tunnelbox-Plugin-Status zur\xFCck: Relay-Adresse, Agent-ID, Bindung an ein Telefonkonto, Datenverzeichnis und letzte Kopplungsinfos. Verwenden, wenn der Nutzer nach Verbindungsstatus/Bindung/Relay-Adresse fragt.",
2567
+ "hermes.toolAskDesc": "Sendet eine Frage/Auswahl an das tunnelbox-Telefon des Nutzers (Remote-UI) und wartet auf Auswahl oder Eingabe. Gibt JSON zur\xFCck: {answered: bool, user_response: string|string[]|null}. Ist das Telefon offline oder tritt eine Zeit\xFCberschreitung auf, ist answered=false.",
2568
+ "hermes.toolAskQuestionDesc": "Der zu stellende Fragetext",
2569
+ "hermes.toolAskChoicesDesc": "Voreingestellte Optionen (optional; bis zu 4)",
2570
+ "hermes.toolAskMultipleDesc": "Mehrfachauswahl zulassen (erfordert choices)",
2571
+ "hermes.cmdDesc": "tunnelbox: Telefon-Kopplung / Verbindungsstatus",
2572
+ "hermes.logConfigLoadFailed": "tunnelbox: Konfiguration konnte nicht gelesen werden, Standardwerte werden verwendet: {err}",
2573
+ "hermes.logRegisterToolsFailed": "tunnelbox: Registrierung der Tools fehlgeschlagen: {err}",
2574
+ "hermes.logRegisterCommandFailed": "tunnelbox: Registrierung des Befehls fehlgeschlagen: {err}",
2575
+ "hermes.logRegisterSkillFailed": "tunnelbox: Registrierung der Skill fehlgeschlagen: {err}",
2576
+ "hermes.logRegisterHooksFailed": "tunnelbox: Registrierung der Hooks fehlgeschlagen: {err}",
2577
+ "hermes.logRegisterApprovalFailed": "tunnelbox: Registrierung des Approval-Transports fehlgeschlagen: {err}",
2578
+ "hermes.logRegisterAskFailed": "tunnelbox: Registrierung von tunnelbox_ask fehlgeschlagen: {err}",
2579
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: Registrierung des System-Prompt-Abschnitts fehlgeschlagen: {err}",
2580
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: Start der Hintergrund-Bridge fehlgeschlagen: {err}",
2581
+ "hermes.systemPromptAsk": "Wenn Sie eine Entscheidung, Kl\xE4rung oder Auswahl vom Nutzer ben\xF6tigen und ein tunnelbox-Telefon verbunden ist, verwenden Sie das Tool `tunnelbox_ask`, um auf dessen Telefon zu fragen, statt zu raten. Warten Sie auf die Antwort, bevor Sie fortfahren."
2106
2582
  };
2107
2583
 
2108
2584
  // locales/es-ES.json
@@ -2381,7 +2857,75 @@ var es_ES_default = {
2381
2857
  "adapter.logQuestionNative": "solicitud de elecci\xF3n -> tarjeta de elecci\xF3n del tel\xE9fono questionID={id} (session={session})",
2382
2858
  "adapter.logPermissionNative": "solicitud de aprobaci\xF3n -> tarjeta de aprobaci\xF3n del tel\xE9fono permissionID={id} (session={session})",
2383
2859
  "adapter.checkAppServerOk": "codex app-server disponible",
2384
- "adapter.checkAppServerMissing": "este Codex CLI no admite `codex app-server` (actualiza Codex CLI)"
2860
+ "adapter.checkAppServerMissing": "este Codex CLI no admite `codex app-server` (actualiza Codex CLI)",
2861
+ "adapter.warnCursorCliMissing": 'No se encontr\xF3 el ejecutable de Cursor CLI "{bin}"; inst\xE1lalo (https://cursor.com/docs/cli) o define TUNNELBOX_CURSOR_BIN',
2862
+ "adapter.checkCursorCliMissing": "No se encontr\xF3 el ejecutable de Cursor CLI ({bin}); inst\xE1lalo desde https://cursor.com/docs/cli",
2863
+ "adapter.checkCursorAcpHint": "Cursor CLI detectado; se usar\xE1 el modo ACP (`agent acp`) para streaming/aprobaci\xF3n/selecci\xF3n",
2864
+ "adapter.errAcpSpawn": "No se pudo iniciar cursor `agent acp`: {message} (comprueba que tu Cursor CLI admita `agent acp`)",
2865
+ "adapter.errAcpNoSession": "Cursor ACP no devolvi\xF3 un id de sesi\xF3n",
2866
+ "adapter.logResumeFailed": "Fall\xF3 la reanudaci\xF3n de la sesi\xF3n; se inicia una nueva sesi\xF3n: {message}",
2867
+ "adapter.logPlanNative": "aprobaci\xF3n de plan -> tarjeta de aprobaci\xF3n del tel\xE9fono permissionID={id} (session={session})",
2868
+ "adapter.errTimeout": "Tiempo de espera agotado, rechazo autom\xE1tico (fail-closed)",
2869
+ "adapter.planApprovalPrompt": "Cursor solicita aprobaci\xF3n de un plan",
2870
+ "adapter.checkCursorHeader": "comprobaci\xF3n de entorno de tunnelbox-cursor",
2871
+ "adapter.errAskBridge": "No se pudo iniciar el puente ask: {message}",
2872
+ "adapter.logAskBridge": "Puente MCP ask escuchando en {url}",
2873
+ "cursor.mcpAskDesc": "Pide al usuario que elija en su tel\xE9fono (tunnelbox) y bloquea hasta que responda. \xDAsalo siempre que el usuario deba elegir entre opciones antes de continuar (plato, modo, opci\xF3n de plan\u2026). Devuelve la(s) etiqueta(s) elegida(s).",
2874
+ "cursor.mcpAskTitleDesc": "T\xEDtulo opcional mostrado en la tarjeta del tel\xE9fono",
2875
+ "cursor.mcpAskQuestionsDesc": "Una o m\xE1s preguntas; cada una tiene opciones",
2876
+ "cursor.mcpPlanDesc": "Pide al usuario que apruebe un plan en su tel\xE9fono (tunnelbox) y bloquea hasta que responda. Indica si el plan fue aceptado.",
2877
+ "cursor.mcpNoBridge": "el puente ask de tunnelbox no est\xE1 disponible",
2878
+ "cursor.mcpUnanswered": "El usuario no respondi\xF3 en su tel\xE9fono (sin conexi\xF3n o tiempo agotado). Contin\xFAa o pregunta en el chat.",
2879
+ "cursor.mcpRejected": "El usuario rechaz\xF3 la pregunta en su tel\xE9fono.",
2880
+ "cursor.mcpAnswersHeader": "Respuestas del usuario (desde su tel\xE9fono):",
2881
+ "cursor.mcpAccepted": "El usuario acept\xF3 el plan.",
2882
+ "cursor.mcpDenied": "El usuario rechaz\xF3 el plan.",
2883
+ "cursor.mcpPlanUnanswered": "El usuario no respondi\xF3 al plan en su tel\xE9fono (sin conexi\xF3n o tiempo agotado).",
2884
+ "cursor.mcpAskNoQuestions": "No se proporcionaron preguntas.",
2885
+ "cursor.mcpFailed": "fall\xF3 tunnelbox ask",
2886
+ "adapter.errCursorExitCode": "Cursor CLI finaliz\xF3 con el c\xF3digo {code}",
2887
+ "adapter.errCursorExit": "Cursor CLI finaliz\xF3 ({code}): {err}",
2888
+ "adapter.errCursorSpawn": "No se puede iniciar Cursor CLI (agent): comprueba que est\xE9 instalado y con sesi\xF3n iniciada ({message})",
2889
+ "adapter.errCursorStart": "Fall\xF3 el inicio de Cursor CLI: {message}",
2890
+ "adapter.errCursorGeneric": "Error de Cursor",
2891
+ "qr.downloadApp": "Descarga la app tunnelbox (Android / iOS): {url}",
2892
+ "adapter.logLegacyHookRemoved": "Se elimin\xF3 el hook PermissionRequest antiguo (hooks.json)",
2893
+ "adapter.errAppServerNotRunning": "codex app-server no est\xE1 en ejecuci\xF3n",
2894
+ "adapter.errAppServerTimeout": "Se agot\xF3 el tiempo de la solicitud a app-server: {method}",
2895
+ "adapter.errAppServerStopped": "Cliente app-server detenido",
2896
+ "adapter.errAppServerExited": "codex app-server finaliz\xF3 (code={code} signal={signal})",
2897
+ "adapter.errAppServerError": "Error de app-server: {message}",
2898
+ "adapter.logAppServerStderr": "app-server: {line}",
2899
+ "adapter.logAppServerExited": "app-server finaliz\xF3 (code={code} signal={signal})",
2900
+ "adapter.errDshGenerate": "Error de generaci\xF3n de dsh",
2901
+ "adapter.unknown": "desconocido",
2902
+ "adapter.errGatewayClientMissing": "Cliente de gateway no creado",
2903
+ "adapter.errGatewayNotConnected": "Gateway no conectado",
2904
+ "adapter.sessionTitleWithId": "sesi\xF3n de {name} {id}",
2905
+ "adapter.promptApproveTool": "{name} solicita aprobaci\xF3n para ejecutar {tool}",
2906
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2907
+ "agent.err.http": "HTTP {status}: {text}",
2908
+ "claude.promptUrl": "URL: {url}",
2909
+ "hermes.errBridgeNotRunning": "El bucle de bridge no est\xE1 en ejecuci\xF3n",
2910
+ "hermes.errAskNoQuestion": "No se proporcion\xF3 ninguna pregunta. Pasa questions=[{question, choices?, multi_select?}, ...].",
2911
+ "hermes.toolPairDesc": "Solicita un c\xF3digo de emparejamiento telef\xF3nico de un solo uso al rel\xE9 tunnelbox (para escanear/introducir en la app tunnelbox). \xDAsalo cuando el usuario pregunte c\xF3mo conectar/emparejar/escanear o controlar este equipo desde el tel\xE9fono.",
2912
+ "hermes.toolPairRefreshDesc": "Forzar la solicitud de un nuevo c\xF3digo de emparejamiento (por defecto: reutilizar/ignorar)",
2913
+ "hermes.toolStatusDesc": "Devuelve el estado del plugin tunnelbox: direcci\xF3n del rel\xE9, id del agente, si est\xE1 vinculado a una cuenta de tel\xE9fono, directorio de datos e informaci\xF3n de emparejamiento reciente. \xDAsalo cuando el usuario pregunte por el estado de conexi\xF3n/vinculaci\xF3n/direcci\xF3n del rel\xE9.",
2914
+ "hermes.toolAskDesc": "Env\xEDa una pregunta/opci\xF3n al tel\xE9fono tunnelbox del usuario (UI remota) y espera su selecci\xF3n o entrada. Devuelve JSON: {answered: bool, user_response: string|string[]|null}. Si el tel\xE9fono est\xE1 desconectado o se agota el tiempo, answered=false.",
2915
+ "hermes.toolAskQuestionDesc": "El texto de la pregunta a realizar",
2916
+ "hermes.toolAskChoicesDesc": "Opciones predefinidas (opcional; hasta 4)",
2917
+ "hermes.toolAskMultipleDesc": "Permitir selecci\xF3n m\xFAltiple (requiere choices)",
2918
+ "hermes.cmdDesc": "tunnelbox: emparejamiento telef\xF3nico / estado de conexi\xF3n",
2919
+ "hermes.logConfigLoadFailed": "tunnelbox: no se pudo leer la configuraci\xF3n, usando valores por defecto: {err}",
2920
+ "hermes.logRegisterToolsFailed": "tunnelbox: fall\xF3 el registro de herramientas: {err}",
2921
+ "hermes.logRegisterCommandFailed": "tunnelbox: fall\xF3 el registro del comando: {err}",
2922
+ "hermes.logRegisterSkillFailed": "tunnelbox: fall\xF3 el registro de la skill: {err}",
2923
+ "hermes.logRegisterHooksFailed": "tunnelbox: fall\xF3 el registro de los hooks: {err}",
2924
+ "hermes.logRegisterApprovalFailed": "tunnelbox: fall\xF3 el registro del transporte de aprobaci\xF3n: {err}",
2925
+ "hermes.logRegisterAskFailed": "tunnelbox: fall\xF3 el registro de tunnelbox_ask: {err}",
2926
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: fall\xF3 el registro de la secci\xF3n del prompt del sistema: {err}",
2927
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: fall\xF3 el inicio del puente en segundo plano: {err}",
2928
+ "hermes.systemPromptAsk": "Cuando necesites una decisi\xF3n, aclaraci\xF3n o elecci\xF3n del usuario y haya un tel\xE9fono tunnelbox vinculado, usa la herramienta `tunnelbox_ask` para preguntar en su tel\xE9fono en lugar de adivinar. Espera su respuesta antes de continuar."
2385
2929
  };
2386
2930
 
2387
2931
  // src/i18n.ts
@@ -2430,6 +2974,11 @@ function detectSystemLang() {
2430
2974
  const v = process.env[k];
2431
2975
  if (v && v.trim()) return v.trim().split(".")[0];
2432
2976
  }
2977
+ try {
2978
+ const loc = Intl.DateTimeFormat().resolvedOptions().locale;
2979
+ if (loc && loc.trim()) return loc.trim();
2980
+ } catch {
2981
+ }
2433
2982
  return null;
2434
2983
  }
2435
2984
  function resolveLang(opts = {}) {
@@ -2523,6 +3072,37 @@ function injectedRelayUrl() {
2523
3072
  return typeof __TB_DEFAULT_RELAY__ === "string" && __TB_DEFAULT_RELAY__ ? __TB_DEFAULT_RELAY__.replace(/\/+$/, "") : "";
2524
3073
  }
2525
3074
 
3075
+ // src/terminal.ts
3076
+ function websiteUrl() {
3077
+ return (process.env.TUNNELBOX_WEBSITE_URL || "https://www.tunnelbox.top").trim();
3078
+ }
3079
+ function envFlag(raw) {
3080
+ const s = (raw || "").trim().toLowerCase();
3081
+ if (["1", "true", "yes", "on"].includes(s)) return true;
3082
+ if (["0", "false", "no", "off"].includes(s)) return false;
3083
+ return null;
3084
+ }
3085
+ function supportsHyperlinks() {
3086
+ const override = envFlag(process.env.TUNNELBOX_HYPERLINK);
3087
+ if (override !== null) return override;
3088
+ if (!process.stdout || !process.stdout.isTTY) return false;
3089
+ const env = process.env;
3090
+ if (env.WT_SESSION) return true;
3091
+ if (env.WEZTERM_PANE) return true;
3092
+ if (env.KITTY_WINDOW_ID) return true;
3093
+ if (env.VTE_VERSION) return true;
3094
+ if (env.KONSOLE_VERSION) return true;
3095
+ const tp = env.TERM_PROGRAM || "";
3096
+ return /^(iTerm\.app|WezTerm|vscode|Hyper|Apple_Terminal|Tabby|WarpTerminal)$/i.test(tp);
3097
+ }
3098
+ function hyperlink(url, text) {
3099
+ const label = text ?? url;
3100
+ if (!supportsHyperlinks()) return label;
3101
+ const OSC = "\x1B]8;;";
3102
+ const ST = "\x1B\\";
3103
+ return `${OSC}${url}${ST}${label}${OSC}${ST}`;
3104
+ }
3105
+
2526
3106
  // src/qr.ts
2527
3107
  async function loadQrcode() {
2528
3108
  try {
@@ -2581,6 +3161,7 @@ async function printPairing(code, type, name, lang) {
2581
3161
  console.log("\u2502 " + padVisual(codeLine, W - 2) + " \u2502");
2582
3162
  console.log("\u2514" + bar + "\u2518");
2583
3163
  console.log(" " + hint);
3164
+ console.log(" " + tt("qr.downloadApp", { url: hyperlink(websiteUrl()) }));
2584
3165
  console.log(" " + tt("qr.validFor"));
2585
3166
  try {
2586
3167
  const mod = await import("qrcode");
@@ -2793,6 +3374,7 @@ export {
2793
3374
  detectSystemLang,
2794
3375
  envelope,
2795
3376
  findWinShim,
3377
+ hyperlink,
2796
3378
  injectedRelayUrl,
2797
3379
  killCliTree,
2798
3380
  loadState,
@@ -2807,7 +3389,9 @@ export {
2807
3389
  saveState,
2808
3390
  sliceWindow,
2809
3391
  statePath,
3392
+ supportsHyperlinks,
2810
3393
  t,
3394
+ websiteUrl,
2811
3395
  writePairingFile,
2812
3396
  writePairingJson
2813
3397
  };