@tunnelbox/dsh-tunnelbox 0.1.21 → 0.1.23

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 +369 -22
  2. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -401,6 +401,7 @@ var zh_CN_default = {
401
401
  "adapter.logGatewayConnected": "\u5DF2\u8FDE\u63A5\u672C\u673A OpenClaw Gateway\uFF08{version}\uFF09",
402
402
  "adapter.logGatewayDisconnected": "\u4E0E OpenClaw Gateway \u65AD\u5F00\uFF0C\u6B63\u5728\u7531\u5B98\u65B9\u5BA2\u6237\u7AEF\u91CD\u8FDE\u2026",
403
403
  "adapter.logGatewayConnectFailed": "\u65E0\u6CD5\u8FDE\u63A5\u672C\u673A OpenClaw Gateway\uFF08\u9996\u6B21\u9700\u5728\u672C\u673A\u653E\u884C\u8BBE\u5907\uFF1A`openclaw devices list` + `openclaw devices approve <requestId>`\uFF09",
404
+ "adapter.errGatewayUnreachable": "\u65E0\u6CD5\u8FDE\u63A5\u672C\u673A OpenClaw Gateway\uFF08{url}\uFF09\uFF1A{message}\u3002\u8BF7\u786E\u8BA4 Gateway \u5DF2\u542F\u52A8\uFF08`openclaw gateway`\uFF09",
404
405
  "adapter.errGatewayNoSessionKey": "Gateway \u672A\u8FD4\u56DE\u4F1A\u8BDD key",
405
406
  "adapter.logDeleteSessionFailed": "\u5220\u9664\u4F1A\u8BDD\u5931\u8D25({session}): {message}\uFF08\u4ECD\u6309\u5DF2\u5220\u9664\u56DE\u6267\uFF09",
406
407
  "adapter.logApprovalReplyFailed": "\u5BA1\u6279\u5E94\u7B54\u5931\u8D25({id}): {message}",
@@ -455,7 +456,45 @@ var zh_CN_default = {
455
456
  "adapter.errCursorExit": "Cursor CLI \u9000\u51FA({code}): {err}",
456
457
  "adapter.errCursorSpawn": "\u65E0\u6CD5\u542F\u52A8 Cursor CLI\uFF08agent\uFF09\uFF1A\u8BF7\u786E\u8BA4\u5DF2\u5B89\u88C5\u5E76\u767B\u5F55\uFF08{message}\uFF09",
457
458
  "adapter.errCursorStart": "Cursor CLI \u542F\u52A8\u5931\u8D25: {message}",
458
- "adapter.errCursorGeneric": "Cursor \u51FA\u9519"
459
+ "adapter.errCursorGeneric": "Cursor \u51FA\u9519",
460
+ "qr.downloadApp": "\u4E0B\u8F7D tunnelbox App\uFF08Android / iOS\uFF09\uFF1A{url}",
461
+ "adapter.logLegacyHookRemoved": "\u5DF2\u79FB\u9664\u65E7\u7684 PermissionRequest hook\uFF08hooks.json\uFF09",
462
+ "adapter.errAppServerNotRunning": "codex app-server \u672A\u8FD0\u884C",
463
+ "adapter.errAppServerTimeout": "app-server \u8BF7\u6C42\u8D85\u65F6\uFF1A{method}",
464
+ "adapter.errAppServerStopped": "app-server \u5BA2\u6237\u7AEF\u5DF2\u505C\u6B62",
465
+ "adapter.errAppServerExited": "codex app-server \u9000\u51FA\uFF08code={code} signal={signal}\uFF09",
466
+ "adapter.errAppServerError": "app-server \u9519\u8BEF\uFF1A{message}",
467
+ "adapter.logAppServerStderr": "app-server\uFF1A{line}",
468
+ "adapter.logAppServerExited": "app-server \u9000\u51FA\uFF08code={code} signal={signal}\uFF09",
469
+ "adapter.errDshGenerate": "dsh \u751F\u6210\u51FA\u9519",
470
+ "adapter.unknown": "\u672A\u77E5",
471
+ "adapter.errGatewayClientMissing": "gateway client \u672A\u521B\u5EFA",
472
+ "adapter.errGatewayNotConnected": "gateway \u672A\u8FDE\u63A5",
473
+ "adapter.sessionTitleWithId": "{name} \u4F1A\u8BDD {id}",
474
+ "adapter.promptApproveTool": "{name} \u8BF7\u6C42\u6279\u51C6\u8FD0\u884C {tool}",
475
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
476
+ "agent.err.http": "HTTP {status}\uFF1A{text}",
477
+ "claude.promptUrl": "URL\uFF1A{url}",
478
+ "hermes.errBridgeNotRunning": "bridge loop \u672A\u8FD0\u884C",
479
+ "hermes.errAskNoQuestion": "\u672A\u63D0\u4F9B\u95EE\u9898\u3002\u8BF7\u4F20\u5165 questions=[{question, choices?, multi_select?}, ...]\u3002",
480
+ "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",
481
+ "hermes.toolPairRefreshDesc": "\u662F\u5426\u5F3A\u5236\u7533\u8BF7\u65B0\u914D\u5BF9\u7801\uFF08\u9ED8\u8BA4\u590D\u7528/\u5FFD\u7565\uFF09",
482
+ "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",
483
+ "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",
484
+ "hermes.toolAskQuestionDesc": "\u8981\u95EE\u7684\u95EE\u9898\u6587\u672C",
485
+ "hermes.toolAskChoicesDesc": "\u9884\u7F6E\u9009\u9879\uFF08\u53EF\u9009\uFF1B\u6700\u591A 4 \u4E2A\uFF09",
486
+ "hermes.toolAskMultipleDesc": "\u662F\u5426\u591A\u9009\uFF08\u9700\u63D0\u4F9B choices\uFF09",
487
+ "hermes.cmdDesc": "tunnelbox\uFF1A\u624B\u673A\u914D\u5BF9 / \u8FDE\u63A5\u72B6\u6001",
488
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8BFB\u53D6\u914D\u7F6E\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C: {err}",
489
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u6CE8\u518C\u5DE5\u5177\u5931\u8D25: {err}",
490
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u6CE8\u518C\u547D\u4EE4\u5931\u8D25: {err}",
491
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u6CE8\u518C\u6280\u80FD\u5931\u8D25: {err}",
492
+ "hermes.logRegisterHooksFailed": "tunnelbox: \u6CE8\u518C hooks \u5931\u8D25: {err}",
493
+ "hermes.logRegisterApprovalFailed": "tunnelbox: \u6CE8\u518C approval transport \u5931\u8D25: {err}",
494
+ "hermes.logRegisterAskFailed": "tunnelbox: \u6CE8\u518C tunnelbox_ask \u5931\u8D25: {err}",
495
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: \u6CE8\u518C system prompt \u6BB5\u5931\u8D25: {err}",
496
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u540E\u53F0\u6865\u542F\u52A8\u5931\u8D25: {err}",
497
+ "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"
459
498
  };
460
499
  var zh_TW_default = {
461
500
  "agent.err.createSession": "\u5EFA\u7ACB\u6703\u8A71\u5931\u6557",
@@ -708,6 +747,7 @@ var zh_TW_default = {
708
747
  "adapter.logGatewayConnected": "\u5DF2\u9023\u63A5\u672C\u6A5F OpenClaw Gateway\uFF08{version}\uFF09",
709
748
  "adapter.logGatewayDisconnected": "\u8207 OpenClaw Gateway \u65B7\u958B\uFF0C\u6B63\u5728\u7531\u5B98\u65B9\u5BA2\u6236\u7AEF\u91CD\u9023\u2026",
710
749
  "adapter.logGatewayConnectFailed": "\u7121\u6CD5\u9023\u63A5\u672C\u6A5F OpenClaw Gateway\uFF08\u9996\u6B21\u9700\u5728\u672C\u6A5F\u653E\u884C\u88DD\u7F6E\uFF1A`openclaw devices list` + `openclaw devices approve <requestId>`\uFF09",
750
+ "adapter.errGatewayUnreachable": "\u7121\u6CD5\u9023\u63A5\u672C\u6A5F OpenClaw Gateway\uFF08{url}\uFF09\uFF1A{message}\u3002\u8ACB\u78BA\u8A8D Gateway \u5DF2\u555F\u52D5\uFF08`openclaw gateway`\uFF09",
711
751
  "adapter.errGatewayNoSessionKey": "Gateway \u672A\u8FD4\u56DE\u5DE5\u4F5C\u968E\u6BB5 key",
712
752
  "adapter.logDeleteSessionFailed": "\u522A\u9664\u5DE5\u4F5C\u968E\u6BB5\u5931\u6557({session}): {message}\uFF08\u4ECD\u6309\u5DF2\u522A\u9664\u56DE\u57F7\uFF09",
713
753
  "adapter.logApprovalReplyFailed": "\u5BE9\u6279\u61C9\u7B54\u5931\u6557({id}): {message}",
@@ -762,7 +802,45 @@ var zh_TW_default = {
762
802
  "adapter.errCursorExit": "Cursor CLI \u9000\u51FA({code}): {err}",
763
803
  "adapter.errCursorSpawn": "\u7121\u6CD5\u555F\u52D5 Cursor CLI\uFF08agent\uFF09\uFF1A\u8ACB\u78BA\u8A8D\u5DF2\u5B89\u88DD\u4E26\u767B\u5165\uFF08{message}\uFF09",
764
804
  "adapter.errCursorStart": "Cursor CLI \u555F\u52D5\u5931\u6557: {message}",
765
- "adapter.errCursorGeneric": "Cursor \u51FA\u932F"
805
+ "adapter.errCursorGeneric": "Cursor \u51FA\u932F",
806
+ "qr.downloadApp": "\u4E0B\u8F09 tunnelbox App\uFF08Android / iOS\uFF09\uFF1A{url}",
807
+ "adapter.logLegacyHookRemoved": "\u5DF2\u79FB\u9664\u820A\u7684 PermissionRequest hook\uFF08hooks.json\uFF09",
808
+ "adapter.errAppServerNotRunning": "codex app-server \u672A\u57F7\u884C",
809
+ "adapter.errAppServerTimeout": "app-server \u8ACB\u6C42\u903E\u6642\uFF1A{method}",
810
+ "adapter.errAppServerStopped": "app-server \u7528\u6236\u7AEF\u5DF2\u505C\u6B62",
811
+ "adapter.errAppServerExited": "codex app-server \u7D50\u675F\uFF08code={code} signal={signal}\uFF09",
812
+ "adapter.errAppServerError": "app-server \u932F\u8AA4\uFF1A{message}",
813
+ "adapter.logAppServerStderr": "app-server\uFF1A{line}",
814
+ "adapter.logAppServerExited": "app-server \u7D50\u675F\uFF08code={code} signal={signal}\uFF09",
815
+ "adapter.errDshGenerate": "dsh \u7522\u751F\u932F\u8AA4",
816
+ "adapter.unknown": "\u672A\u77E5",
817
+ "adapter.errGatewayClientMissing": "gateway client \u672A\u5EFA\u7ACB",
818
+ "adapter.errGatewayNotConnected": "gateway \u672A\u9023\u7DDA",
819
+ "adapter.sessionTitleWithId": "{name} \u5DE5\u4F5C\u968E\u6BB5 {id}",
820
+ "adapter.promptApproveTool": "{name} \u8ACB\u6C42\u6279\u51C6\u57F7\u884C {tool}",
821
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
822
+ "agent.err.http": "HTTP {status}\uFF1A{text}",
823
+ "claude.promptUrl": "URL\uFF1A{url}",
824
+ "hermes.errBridgeNotRunning": "bridge loop \u672A\u57F7\u884C",
825
+ "hermes.errAskNoQuestion": "\u672A\u63D0\u4F9B\u554F\u984C\u3002\u8ACB\u50B3\u5165 questions=[{question, choices?, multi_select?}, ...]\u3002",
826
+ "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",
827
+ "hermes.toolPairRefreshDesc": "\u662F\u5426\u5F37\u5236\u7533\u8ACB\u65B0\u914D\u5C0D\u78BC\uFF08\u9810\u8A2D\u91CD\u7528/\u5FFD\u7565\uFF09",
828
+ "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",
829
+ "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",
830
+ "hermes.toolAskQuestionDesc": "\u8981\u554F\u7684\u554F\u984C\u6587\u5B57",
831
+ "hermes.toolAskChoicesDesc": "\u9810\u7F6E\u9078\u9805\uFF08\u53EF\u9078\uFF1B\u6700\u591A 4 \u500B\uFF09",
832
+ "hermes.toolAskMultipleDesc": "\u662F\u5426\u591A\u9078\uFF08\u9700\u63D0\u4F9B choices\uFF09",
833
+ "hermes.cmdDesc": "tunnelbox\uFF1A\u624B\u6A5F\u914D\u5C0D / \u9023\u7DDA\u72C0\u614B",
834
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8B80\u53D6\u8A2D\u5B9A\u5931\u6557\uFF0C\u4F7F\u7528\u9810\u8A2D\u503C: {err}",
835
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u8A3B\u518A\u5DE5\u5177\u5931\u6557: {err}",
836
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u8A3B\u518A\u547D\u4EE4\u5931\u6557: {err}",
837
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u8A3B\u518A\u6280\u80FD\u5931\u6557: {err}",
838
+ "hermes.logRegisterHooksFailed": "tunnelbox: \u8A3B\u518A hooks \u5931\u6557: {err}",
839
+ "hermes.logRegisterApprovalFailed": "tunnelbox: \u8A3B\u518A approval transport \u5931\u6557: {err}",
840
+ "hermes.logRegisterAskFailed": "tunnelbox: \u8A3B\u518A tunnelbox_ask \u5931\u6557: {err}",
841
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: \u8A3B\u518A system prompt \u6BB5\u5931\u6557: {err}",
842
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u80CC\u666F\u6A4B\u555F\u52D5\u5931\u6557: {err}",
843
+ "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"
766
844
  };
767
845
  var en_US_default = {
768
846
  "agent.err.createSession": "Failed to create session",
@@ -1015,6 +1093,7 @@ var en_US_default = {
1015
1093
  "adapter.logGatewayConnected": "Connected to local OpenClaw Gateway ({version})",
1016
1094
  "adapter.logGatewayDisconnected": "Disconnected from OpenClaw Gateway; the official client is reconnecting\u2026",
1017
1095
  "adapter.logGatewayConnectFailed": "Cannot connect to local OpenClaw Gateway (first time, approve the device locally: `openclaw devices list` + `openclaw devices approve <requestId>`)",
1096
+ "adapter.errGatewayUnreachable": "Cannot reach the local OpenClaw Gateway ({url}): {message}. Make sure it is running (`openclaw gateway`)",
1018
1097
  "adapter.errGatewayNoSessionKey": "Gateway did not return a session key",
1019
1098
  "adapter.logDeleteSessionFailed": "Failed to delete session ({session}): {message} (still acking as deleted)",
1020
1099
  "adapter.logApprovalReplyFailed": "Approval reply failed ({id}): {message}",
@@ -1069,7 +1148,45 @@ var en_US_default = {
1069
1148
  "adapter.errCursorExit": "Cursor CLI exited ({code}): {err}",
1070
1149
  "adapter.errCursorSpawn": "Cannot start Cursor CLI (agent): make sure it is installed and logged in ({message})",
1071
1150
  "adapter.errCursorStart": "Cursor CLI failed to start: {message}",
1072
- "adapter.errCursorGeneric": "Cursor error"
1151
+ "adapter.errCursorGeneric": "Cursor error",
1152
+ "qr.downloadApp": "Download the tunnelbox App (Android / iOS): {url}",
1153
+ "adapter.logLegacyHookRemoved": "Removed the legacy PermissionRequest hook (hooks.json)",
1154
+ "adapter.errAppServerNotRunning": "codex app-server is not running",
1155
+ "adapter.errAppServerTimeout": "app-server request timed out: {method}",
1156
+ "adapter.errAppServerStopped": "app-server client stopped",
1157
+ "adapter.errAppServerExited": "codex app-server exited (code={code} signal={signal})",
1158
+ "adapter.errAppServerError": "app-server error: {message}",
1159
+ "adapter.logAppServerStderr": "app-server: {line}",
1160
+ "adapter.logAppServerExited": "app-server exited (code={code} signal={signal})",
1161
+ "adapter.errDshGenerate": "dsh generation error",
1162
+ "adapter.unknown": "unknown",
1163
+ "adapter.errGatewayClientMissing": "gateway client not created",
1164
+ "adapter.errGatewayNotConnected": "gateway not connected",
1165
+ "adapter.sessionTitleWithId": "{name} session {id}",
1166
+ "adapter.promptApproveTool": "{name} requests approval to run {tool}",
1167
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1168
+ "agent.err.http": "HTTP {status}: {text}",
1169
+ "claude.promptUrl": "URL: {url}",
1170
+ "hermes.errBridgeNotRunning": "bridge loop is not running",
1171
+ "hermes.errAskNoQuestion": "No question provided. Pass questions=[{question, choices?, multi_select?}, ...].",
1172
+ "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.",
1173
+ "hermes.toolPairRefreshDesc": "Force requesting a new pairing code (default: reuse/ignore)",
1174
+ "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.",
1175
+ "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.",
1176
+ "hermes.toolAskQuestionDesc": "The question text to ask",
1177
+ "hermes.toolAskChoicesDesc": "Preset options (optional; up to 4)",
1178
+ "hermes.toolAskMultipleDesc": "Allow multiple selection (requires choices)",
1179
+ "hermes.cmdDesc": "tunnelbox: phone pairing / connection status",
1180
+ "hermes.logConfigLoadFailed": "tunnelbox: failed to read config, using defaults: {err}",
1181
+ "hermes.logRegisterToolsFailed": "tunnelbox: failed to register tools: {err}",
1182
+ "hermes.logRegisterCommandFailed": "tunnelbox: failed to register command: {err}",
1183
+ "hermes.logRegisterSkillFailed": "tunnelbox: failed to register skill: {err}",
1184
+ "hermes.logRegisterHooksFailed": "tunnelbox: failed to register hooks: {err}",
1185
+ "hermes.logRegisterApprovalFailed": "tunnelbox: failed to register approval transport: {err}",
1186
+ "hermes.logRegisterAskFailed": "tunnelbox: failed to register tunnelbox_ask: {err}",
1187
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: failed to register system prompt section: {err}",
1188
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: background bridge failed to start: {err}",
1189
+ "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."
1073
1190
  };
1074
1191
  var ja_JP_default = {
1075
1192
  "agent.err.createSession": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
@@ -1322,6 +1439,7 @@ var ja_JP_default = {
1322
1439
  "adapter.logGatewayConnected": "\u30ED\u30FC\u30AB\u30EB OpenClaw Gateway \u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F\uFF08{version}\uFF09",
1323
1440
  "adapter.logGatewayDisconnected": "OpenClaw Gateway \u304B\u3089\u5207\u65AD\u3055\u308C\u307E\u3057\u305F\u3002\u516C\u5F0F\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304C\u518D\u63A5\u7D9A\u3057\u3066\u3044\u307E\u3059\u2026",
1324
1441
  "adapter.logGatewayConnectFailed": "\u30ED\u30FC\u30AB\u30EB OpenClaw Gateway \u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093\uFF08\u521D\u56DE\u306F\u672C\u6A5F\u3067\u30C7\u30D0\u30A4\u30B9\u3092\u627F\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044: `openclaw devices list` + `openclaw devices approve <requestId>`\uFF09",
1442
+ "adapter.errGatewayUnreachable": "\u30ED\u30FC\u30AB\u30EB\u306E OpenClaw Gateway\uFF08{url}\uFF09\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093: {message}\u3002Gateway \u304C\u8D77\u52D5\u3057\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF08`openclaw gateway`\uFF09",
1325
1443
  "adapter.errGatewayNoSessionKey": "Gateway \u304C\u30BB\u30C3\u30B7\u30E7\u30F3 key \u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F",
1326
1444
  "adapter.logDeleteSessionFailed": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u524A\u9664\u306B\u5931\u6557\u3057\u307E\u3057\u305F ({session}): {message}\uFF08\u524A\u9664\u6E08\u307F\u3068\u3057\u3066\u5FDC\u7B54\uFF09",
1327
1445
  "adapter.logApprovalReplyFailed": "\u627F\u8A8D\u5FDC\u7B54\u306B\u5931\u6557\u3057\u307E\u3057\u305F ({id}): {message}",
@@ -1376,7 +1494,45 @@ var ja_JP_default = {
1376
1494
  "adapter.errCursorExit": "Cursor CLI \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08{code}\uFF09: {err}",
1377
1495
  "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",
1378
1496
  "adapter.errCursorStart": "Cursor CLI \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
1379
- "adapter.errCursorGeneric": "Cursor \u30A8\u30E9\u30FC"
1497
+ "adapter.errCursorGeneric": "Cursor \u30A8\u30E9\u30FC",
1498
+ "qr.downloadApp": "tunnelbox App\uFF08Android / iOS\uFF09\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9: {url}",
1499
+ "adapter.logLegacyHookRemoved": "\u65E7 PermissionRequest hook\uFF08hooks.json\uFF09\u3092\u524A\u9664\u3057\u307E\u3057\u305F",
1500
+ "adapter.errAppServerNotRunning": "codex app-server \u304C\u5B9F\u884C\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1501
+ "adapter.errAppServerTimeout": "app-server \u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F: {method}",
1502
+ "adapter.errAppServerStopped": "app-server \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304C\u505C\u6B62\u3057\u307E\u3057\u305F",
1503
+ "adapter.errAppServerExited": "codex app-server \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08code={code} signal={signal}\uFF09",
1504
+ "adapter.errAppServerError": "app-server \u30A8\u30E9\u30FC: {message}",
1505
+ "adapter.logAppServerStderr": "app-server: {line}",
1506
+ "adapter.logAppServerExited": "app-server \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08code={code} signal={signal}\uFF09",
1507
+ "adapter.errDshGenerate": "dsh \u306E\u751F\u6210\u30A8\u30E9\u30FC",
1508
+ "adapter.unknown": "\u4E0D\u660E",
1509
+ "adapter.errGatewayClientMissing": "gateway \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304C\u4F5C\u6210\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1510
+ "adapter.errGatewayNotConnected": "gateway \u306B\u63A5\u7D9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1511
+ "adapter.sessionTitleWithId": "{name} \u30BB\u30C3\u30B7\u30E7\u30F3 {id}",
1512
+ "adapter.promptApproveTool": "{name} \u304C {tool} \u306E\u5B9F\u884C\u627F\u8A8D\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
1513
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1514
+ "agent.err.http": "HTTP {status}: {text}",
1515
+ "claude.promptUrl": "URL: {url}",
1516
+ "hermes.errBridgeNotRunning": "bridge \u30EB\u30FC\u30D7\u304C\u5B9F\u884C\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1517
+ "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",
1518
+ "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",
1519
+ "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",
1520
+ "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",
1521
+ "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",
1522
+ "hermes.toolAskQuestionDesc": "\u5C0B\u306D\u308B\u8CEA\u554F\u30C6\u30AD\u30B9\u30C8",
1523
+ "hermes.toolAskChoicesDesc": "\u30D7\u30EA\u30BB\u30C3\u30C8\u9078\u629E\u80A2\uFF08\u4EFB\u610F\u3001\u6700\u5927 4 \u3064\uFF09",
1524
+ "hermes.toolAskMultipleDesc": "\u8907\u6570\u9078\u629E\u3092\u8A31\u53EF\uFF08choices \u304C\u5FC5\u8981\uFF09",
1525
+ "hermes.cmdDesc": "tunnelbox: \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0 / \u63A5\u7D9A\u72B6\u614B",
1526
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8A2D\u5B9A\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3001\u65E2\u5B9A\u5024\u3092\u4F7F\u7528: {err}",
1527
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u30C4\u30FC\u30EB\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1528
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u30B3\u30DE\u30F3\u30C9\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1529
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u30B9\u30AD\u30EB\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1530
+ "hermes.logRegisterHooksFailed": "tunnelbox: hooks \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1531
+ "hermes.logRegisterApprovalFailed": "tunnelbox: approval transport \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1532
+ "hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1533
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt \u30BB\u30AF\u30B7\u30E7\u30F3\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1534
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u30D6\u30EA\u30C3\u30B8\u306E\u8D77\u52D5\u306B\u5931\u6557: {err}",
1535
+ "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"
1380
1536
  };
1381
1537
  var ko_KR_default = {
1382
1538
  "agent.err.createSession": "\uC138\uC158 \uC0DD\uC131 \uC2E4\uD328",
@@ -1629,6 +1785,7 @@ var ko_KR_default = {
1629
1785
  "adapter.logGatewayConnected": "\uB85C\uCEEC OpenClaw Gateway\uC5D0 \uC5F0\uACB0\uB428({version})",
1630
1786
  "adapter.logGatewayDisconnected": "OpenClaw Gateway\uC640 \uC5F0\uACB0\uC774 \uB04A\uC5B4\uC84C\uC2B5\uB2C8\uB2E4. \uACF5\uC2DD \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC7AC\uC5F0\uACB0 \uC911\u2026",
1631
1787
  "adapter.logGatewayConnectFailed": "\uB85C\uCEEC OpenClaw Gateway\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4(\uCD5C\uCD08\uC5D0\uB294 \uB85C\uCEEC\uC5D0\uC11C \uC7A5\uCE58\uB97C \uC2B9\uC778\uD558\uC138\uC694: `openclaw devices list` + `openclaw devices approve <requestId>`)",
1788
+ "adapter.errGatewayUnreachable": "\uB85C\uCEEC OpenClaw Gateway({url})\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: {message}. Gateway\uAC00 \uC2E4\uD589 \uC911\uC778\uC9C0 \uD655\uC778\uD558\uC138\uC694(`openclaw gateway`)",
1632
1789
  "adapter.errGatewayNoSessionKey": "Gateway\uAC00 \uC138\uC158 key\uB97C \uBC18\uD658\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
1633
1790
  "adapter.logDeleteSessionFailed": "\uC138\uC158 \uC0AD\uC81C \uC2E4\uD328({session}): {message}(\uC0AD\uC81C\uB428\uC73C\uB85C \uC751\uB2F5)",
1634
1791
  "adapter.logApprovalReplyFailed": "\uC2B9\uC778 \uC751\uB2F5 \uC2E4\uD328({id}): {message}",
@@ -1683,7 +1840,45 @@ var ko_KR_default = {
1683
1840
  "adapter.errCursorExit": "Cursor CLI \uC885\uB8CC({code}): {err}",
1684
1841
  "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})",
1685
1842
  "adapter.errCursorStart": "Cursor CLI \uC2DC\uC791 \uC2E4\uD328: {message}",
1686
- "adapter.errCursorGeneric": "Cursor \uC624\uB958"
1843
+ "adapter.errCursorGeneric": "Cursor \uC624\uB958",
1844
+ "qr.downloadApp": "tunnelbox \uC571(Android / iOS) \uB2E4\uC6B4\uB85C\uB4DC: {url}",
1845
+ "adapter.logLegacyHookRemoved": "\uC774\uC804 PermissionRequest hook(hooks.json)\uC744 \uC81C\uAC70\uD588\uC2B5\uB2C8\uB2E4",
1846
+ "adapter.errAppServerNotRunning": "codex app-server\uAC00 \uC2E4\uD589 \uC911\uC774 \uC544\uB2D9\uB2C8\uB2E4",
1847
+ "adapter.errAppServerTimeout": "app-server \uC694\uCCAD \uC2DC\uAC04 \uCD08\uACFC: {method}",
1848
+ "adapter.errAppServerStopped": "app-server \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
1849
+ "adapter.errAppServerExited": "codex app-server \uC885\uB8CC(code={code} signal={signal})",
1850
+ "adapter.errAppServerError": "app-server \uC624\uB958: {message}",
1851
+ "adapter.logAppServerStderr": "app-server: {line}",
1852
+ "adapter.logAppServerExited": "app-server \uC885\uB8CC(code={code} signal={signal})",
1853
+ "adapter.errDshGenerate": "dsh \uC0DD\uC131 \uC624\uB958",
1854
+ "adapter.unknown": "\uC54C \uC218 \uC5C6\uC74C",
1855
+ "adapter.errGatewayClientMissing": "gateway \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
1856
+ "adapter.errGatewayNotConnected": "gateway\uC5D0 \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
1857
+ "adapter.sessionTitleWithId": "{name} \uC138\uC158 {id}",
1858
+ "adapter.promptApproveTool": "{name}\uC774(\uAC00) {tool} \uC2E4\uD589 \uC2B9\uC778\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
1859
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1860
+ "agent.err.http": "HTTP {status}: {text}",
1861
+ "claude.promptUrl": "URL: {url}",
1862
+ "hermes.errBridgeNotRunning": "bridge \uB8E8\uD504\uAC00 \uC2E4\uD589 \uC911\uC774 \uC544\uB2D9\uB2C8\uB2E4",
1863
+ "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.",
1864
+ "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.",
1865
+ "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)",
1866
+ "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.",
1867
+ "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.",
1868
+ "hermes.toolAskQuestionDesc": "\uC9C8\uBB38 \uD14D\uC2A4\uD2B8",
1869
+ "hermes.toolAskChoicesDesc": "\uC0AC\uC804 \uC124\uC815 \uC120\uD0DD\uC9C0(\uC120\uD0DD, \uCD5C\uB300 4\uAC1C)",
1870
+ "hermes.toolAskMultipleDesc": "\uB2E4\uC911 \uC120\uD0DD \uD5C8\uC6A9(choices \uD544\uC694)",
1871
+ "hermes.cmdDesc": "tunnelbox: \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 / \uC5F0\uACB0 \uC0C1\uD0DC",
1872
+ "hermes.logConfigLoadFailed": "tunnelbox: \uC124\uC815 \uC77D\uAE30 \uC2E4\uD328, \uAE30\uBCF8\uAC12 \uC0AC\uC6A9: {err}",
1873
+ "hermes.logRegisterToolsFailed": "tunnelbox: \uB3C4\uAD6C \uB4F1\uB85D \uC2E4\uD328: {err}",
1874
+ "hermes.logRegisterCommandFailed": "tunnelbox: \uBA85\uB839 \uB4F1\uB85D \uC2E4\uD328: {err}",
1875
+ "hermes.logRegisterSkillFailed": "tunnelbox: \uC2A4\uD0AC \uB4F1\uB85D \uC2E4\uD328: {err}",
1876
+ "hermes.logRegisterHooksFailed": "tunnelbox: hooks \uB4F1\uB85D \uC2E4\uD328: {err}",
1877
+ "hermes.logRegisterApprovalFailed": "tunnelbox: approval transport \uB4F1\uB85D \uC2E4\uD328: {err}",
1878
+ "hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask \uB4F1\uB85D \uC2E4\uD328: {err}",
1879
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt \uC139\uC158 \uB4F1\uB85D \uC2E4\uD328: {err}",
1880
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \uBC31\uADF8\uB77C\uC6B4\uB4DC \uBE0C\uB9AC\uC9C0 \uC2DC\uC791 \uC2E4\uD328: {err}",
1881
+ "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."
1687
1882
  };
1688
1883
  var fr_FR_default = {
1689
1884
  "agent.err.createSession": "\xC9chec de la cr\xE9ation de la session",
@@ -1936,6 +2131,7 @@ var fr_FR_default = {
1936
2131
  "adapter.logGatewayConnected": "Connect\xE9 au Gateway OpenClaw local ({version})",
1937
2132
  "adapter.logGatewayDisconnected": "D\xE9connect\xE9 du Gateway OpenClaw ; le client officiel se reconnecte\u2026",
1938
2133
  "adapter.logGatewayConnectFailed": "Impossible de se connecter au Gateway OpenClaw local (la premi\xE8re fois, approuvez l'appareil en local : `openclaw devices list` + `openclaw devices approve <requestId>`)",
2134
+ "adapter.errGatewayUnreachable": "Impossible de joindre le Gateway OpenClaw local ({url}) : {message}. V\xE9rifiez qu'il est d\xE9marr\xE9 (`openclaw gateway`)",
1939
2135
  "adapter.errGatewayNoSessionKey": "Le Gateway n'a pas renvoy\xE9 de cl\xE9 de session",
1940
2136
  "adapter.logDeleteSessionFailed": "\xC9chec de suppression de session ({session}) : {message} (accus\xE9 de suppression tout de m\xEAme)",
1941
2137
  "adapter.logApprovalReplyFailed": "\xC9chec de la r\xE9ponse d'approbation ({id}) : {message}",
@@ -1990,7 +2186,45 @@ var fr_FR_default = {
1990
2186
  "adapter.errCursorExit": "Cursor CLI arr\xEAt\xE9 ({code}) : {err}",
1991
2187
  "adapter.errCursorSpawn": "Impossible de d\xE9marrer Cursor CLI (agent) : v\xE9rifiez qu'il est install\xE9 et connect\xE9 ({message})",
1992
2188
  "adapter.errCursorStart": "\xC9chec du d\xE9marrage de Cursor CLI : {message}",
1993
- "adapter.errCursorGeneric": "Erreur Cursor"
2189
+ "adapter.errCursorGeneric": "Erreur Cursor",
2190
+ "qr.downloadApp": "T\xE9l\xE9charger l'application tunnelbox (Android / iOS) : {url}",
2191
+ "adapter.logLegacyHookRemoved": "Ancien hook PermissionRequest supprim\xE9 (hooks.json)",
2192
+ "adapter.errAppServerNotRunning": "codex app-server n'est pas en cours d'ex\xE9cution",
2193
+ "adapter.errAppServerTimeout": "D\xE9lai d\xE9pass\xE9 pour la requ\xEAte app-server : {method}",
2194
+ "adapter.errAppServerStopped": "Client app-server arr\xEAt\xE9",
2195
+ "adapter.errAppServerExited": "codex app-server arr\xEAt\xE9 (code={code} signal={signal})",
2196
+ "adapter.errAppServerError": "Erreur app-server : {message}",
2197
+ "adapter.logAppServerStderr": "app-server : {line}",
2198
+ "adapter.logAppServerExited": "app-server arr\xEAt\xE9 (code={code} signal={signal})",
2199
+ "adapter.errDshGenerate": "Erreur de g\xE9n\xE9ration dsh",
2200
+ "adapter.unknown": "inconnu",
2201
+ "adapter.errGatewayClientMissing": "Client gateway non cr\xE9\xE9",
2202
+ "adapter.errGatewayNotConnected": "Gateway non connect\xE9",
2203
+ "adapter.sessionTitleWithId": "session {name} {id}",
2204
+ "adapter.promptApproveTool": "{name} demande l'approbation d'ex\xE9cuter {tool}",
2205
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2206
+ "agent.err.http": "HTTP {status} : {text}",
2207
+ "claude.promptUrl": "URL : {url}",
2208
+ "hermes.errBridgeNotRunning": "La boucle bridge n'est pas en cours d'ex\xE9cution",
2209
+ "hermes.errAskNoQuestion": "Aucune question fournie. Passez questions=[{question, choices?, multi_select?}, ...].",
2210
+ "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.",
2211
+ "hermes.toolPairRefreshDesc": "Forcer la demande d'un nouveau code d'appairage (par d\xE9faut : r\xE9utiliser/ignorer)",
2212
+ "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.",
2213
+ "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.",
2214
+ "hermes.toolAskQuestionDesc": "Le texte de la question \xE0 poser",
2215
+ "hermes.toolAskChoicesDesc": "Options pr\xE9d\xE9finies (facultatif ; jusqu'\xE0 4)",
2216
+ "hermes.toolAskMultipleDesc": "Autoriser la s\xE9lection multiple (n\xE9cessite choices)",
2217
+ "hermes.cmdDesc": "tunnelbox : appairage t\xE9l\xE9phone / \xE9tat de connexion",
2218
+ "hermes.logConfigLoadFailed": "tunnelbox : \xE9chec de lecture de la config, valeurs par d\xE9faut : {err}",
2219
+ "hermes.logRegisterToolsFailed": "tunnelbox : \xE9chec d'enregistrement des outils : {err}",
2220
+ "hermes.logRegisterCommandFailed": "tunnelbox : \xE9chec d'enregistrement de la commande : {err}",
2221
+ "hermes.logRegisterSkillFailed": "tunnelbox : \xE9chec d'enregistrement de la comp\xE9tence : {err}",
2222
+ "hermes.logRegisterHooksFailed": "tunnelbox : \xE9chec d'enregistrement des hooks : {err}",
2223
+ "hermes.logRegisterApprovalFailed": "tunnelbox : \xE9chec d'enregistrement du transport d'approbation : {err}",
2224
+ "hermes.logRegisterAskFailed": "tunnelbox : \xE9chec d'enregistrement de tunnelbox_ask : {err}",
2225
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox : \xE9chec d'enregistrement de la section du prompt syst\xE8me : {err}",
2226
+ "hermes.logBackgroundBridgeFailed": "tunnelbox : \xE9chec du d\xE9marrage du pont en arri\xE8re-plan : {err}",
2227
+ "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."
1994
2228
  };
1995
2229
  var de_DE_default = {
1996
2230
  "agent.err.createSession": "Sitzung konnte nicht erstellt werden",
@@ -2243,6 +2477,7 @@ var de_DE_default = {
2243
2477
  "adapter.logGatewayConnected": "Mit lokalem OpenClaw Gateway verbunden ({version})",
2244
2478
  "adapter.logGatewayDisconnected": "Vom OpenClaw Gateway getrennt; der offizielle Client verbindet sich neu\u2026",
2245
2479
  "adapter.logGatewayConnectFailed": "Verbindung zum lokalen OpenClaw Gateway nicht m\xF6glich (beim ersten Mal das Ger\xE4t lokal freigeben: `openclaw devices list` + `openclaw devices approve <requestId>`)",
2480
+ "adapter.errGatewayUnreachable": "Lokales OpenClaw Gateway ({url}) nicht erreichbar: {message}. Stelle sicher, dass es l\xE4uft (`openclaw gateway`)",
2246
2481
  "adapter.errGatewayNoSessionKey": "Gateway hat keinen Sitzungsschl\xFCssel zur\xFCckgegeben",
2247
2482
  "adapter.logDeleteSessionFailed": "Sitzung l\xF6schen fehlgeschlagen ({session}): {message} (wird dennoch als gel\xF6scht best\xE4tigt)",
2248
2483
  "adapter.logApprovalReplyFailed": "Genehmigungsantwort fehlgeschlagen ({id}): {message}",
@@ -2297,7 +2532,45 @@ var de_DE_default = {
2297
2532
  "adapter.errCursorExit": "Cursor CLI beendet ({code}): {err}",
2298
2533
  "adapter.errCursorSpawn": "Cursor CLI (agent) kann nicht gestartet werden: Stellen Sie sicher, dass es installiert und angemeldet ist ({message})",
2299
2534
  "adapter.errCursorStart": "Start von Cursor CLI fehlgeschlagen: {message}",
2300
- "adapter.errCursorGeneric": "Cursor-Fehler"
2535
+ "adapter.errCursorGeneric": "Cursor-Fehler",
2536
+ "qr.downloadApp": "tunnelbox-App herunterladen (Android / iOS): {url}",
2537
+ "adapter.logLegacyHookRemoved": "Alter PermissionRequest-Hook entfernt (hooks.json)",
2538
+ "adapter.errAppServerNotRunning": "codex app-server l\xE4uft nicht",
2539
+ "adapter.errAppServerTimeout": "Zeit\xFCberschreitung bei app-server-Anfrage: {method}",
2540
+ "adapter.errAppServerStopped": "app-server-Client gestoppt",
2541
+ "adapter.errAppServerExited": "codex app-server beendet (code={code} signal={signal})",
2542
+ "adapter.errAppServerError": "app-server-Fehler: {message}",
2543
+ "adapter.logAppServerStderr": "app-server: {line}",
2544
+ "adapter.logAppServerExited": "app-server beendet (code={code} signal={signal})",
2545
+ "adapter.errDshGenerate": "dsh-Generierungsfehler",
2546
+ "adapter.unknown": "unbekannt",
2547
+ "adapter.errGatewayClientMissing": "Gateway-Client nicht erstellt",
2548
+ "adapter.errGatewayNotConnected": "Gateway nicht verbunden",
2549
+ "adapter.sessionTitleWithId": "{name}-Sitzung {id}",
2550
+ "adapter.promptApproveTool": "{name} fordert die Genehmigung zur Ausf\xFChrung von {tool} an",
2551
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2552
+ "agent.err.http": "HTTP {status}: {text}",
2553
+ "claude.promptUrl": "URL: {url}",
2554
+ "hermes.errBridgeNotRunning": "Bridge-Schleife l\xE4uft nicht",
2555
+ "hermes.errAskNoQuestion": "Keine Frage angegeben. \xDCbergeben Sie questions=[{question, choices?, multi_select?}, ...].",
2556
+ "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.",
2557
+ "hermes.toolPairRefreshDesc": "Erzwingt die Anforderung eines neuen Kopplungscodes (Standard: wiederverwenden/ignorieren)",
2558
+ "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.",
2559
+ "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.",
2560
+ "hermes.toolAskQuestionDesc": "Der zu stellende Fragetext",
2561
+ "hermes.toolAskChoicesDesc": "Voreingestellte Optionen (optional; bis zu 4)",
2562
+ "hermes.toolAskMultipleDesc": "Mehrfachauswahl zulassen (erfordert choices)",
2563
+ "hermes.cmdDesc": "tunnelbox: Telefon-Kopplung / Verbindungsstatus",
2564
+ "hermes.logConfigLoadFailed": "tunnelbox: Konfiguration konnte nicht gelesen werden, Standardwerte werden verwendet: {err}",
2565
+ "hermes.logRegisterToolsFailed": "tunnelbox: Registrierung der Tools fehlgeschlagen: {err}",
2566
+ "hermes.logRegisterCommandFailed": "tunnelbox: Registrierung des Befehls fehlgeschlagen: {err}",
2567
+ "hermes.logRegisterSkillFailed": "tunnelbox: Registrierung der Skill fehlgeschlagen: {err}",
2568
+ "hermes.logRegisterHooksFailed": "tunnelbox: Registrierung der Hooks fehlgeschlagen: {err}",
2569
+ "hermes.logRegisterApprovalFailed": "tunnelbox: Registrierung des Approval-Transports fehlgeschlagen: {err}",
2570
+ "hermes.logRegisterAskFailed": "tunnelbox: Registrierung von tunnelbox_ask fehlgeschlagen: {err}",
2571
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: Registrierung des System-Prompt-Abschnitts fehlgeschlagen: {err}",
2572
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: Start der Hintergrund-Bridge fehlgeschlagen: {err}",
2573
+ "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."
2301
2574
  };
2302
2575
  var es_ES_default = {
2303
2576
  "agent.err.createSession": "No se pudo crear la sesi\xF3n",
@@ -2550,6 +2823,7 @@ var es_ES_default = {
2550
2823
  "adapter.logGatewayConnected": "Conectado al Gateway OpenClaw local ({version})",
2551
2824
  "adapter.logGatewayDisconnected": "Desconectado del Gateway OpenClaw; el cliente oficial se est\xE1 reconectando\u2026",
2552
2825
  "adapter.logGatewayConnectFailed": "No se puede conectar al Gateway OpenClaw local (la primera vez, apruebe el dispositivo localmente: `openclaw devices list` + `openclaw devices approve <requestId>`)",
2826
+ "adapter.errGatewayUnreachable": "No se puede conectar con el Gateway local de OpenClaw ({url}): {message}. Comprueba que est\xE9 en ejecuci\xF3n (`openclaw gateway`)",
2553
2827
  "adapter.errGatewayNoSessionKey": "El Gateway no devolvi\xF3 una clave de sesi\xF3n",
2554
2828
  "adapter.logDeleteSessionFailed": "Error al eliminar la sesi\xF3n ({session}): {message} (se confirma como eliminada igualmente)",
2555
2829
  "adapter.logApprovalReplyFailed": "Error en la respuesta de aprobaci\xF3n ({id}): {message}",
@@ -2604,7 +2878,45 @@ var es_ES_default = {
2604
2878
  "adapter.errCursorExit": "Cursor CLI finaliz\xF3 ({code}): {err}",
2605
2879
  "adapter.errCursorSpawn": "No se puede iniciar Cursor CLI (agent): comprueba que est\xE9 instalado y con sesi\xF3n iniciada ({message})",
2606
2880
  "adapter.errCursorStart": "Fall\xF3 el inicio de Cursor CLI: {message}",
2607
- "adapter.errCursorGeneric": "Error de Cursor"
2881
+ "adapter.errCursorGeneric": "Error de Cursor",
2882
+ "qr.downloadApp": "Descarga la app tunnelbox (Android / iOS): {url}",
2883
+ "adapter.logLegacyHookRemoved": "Se elimin\xF3 el hook PermissionRequest antiguo (hooks.json)",
2884
+ "adapter.errAppServerNotRunning": "codex app-server no est\xE1 en ejecuci\xF3n",
2885
+ "adapter.errAppServerTimeout": "Se agot\xF3 el tiempo de la solicitud a app-server: {method}",
2886
+ "adapter.errAppServerStopped": "Cliente app-server detenido",
2887
+ "adapter.errAppServerExited": "codex app-server finaliz\xF3 (code={code} signal={signal})",
2888
+ "adapter.errAppServerError": "Error de app-server: {message}",
2889
+ "adapter.logAppServerStderr": "app-server: {line}",
2890
+ "adapter.logAppServerExited": "app-server finaliz\xF3 (code={code} signal={signal})",
2891
+ "adapter.errDshGenerate": "Error de generaci\xF3n de dsh",
2892
+ "adapter.unknown": "desconocido",
2893
+ "adapter.errGatewayClientMissing": "Cliente de gateway no creado",
2894
+ "adapter.errGatewayNotConnected": "Gateway no conectado",
2895
+ "adapter.sessionTitleWithId": "sesi\xF3n de {name} {id}",
2896
+ "adapter.promptApproveTool": "{name} solicita aprobaci\xF3n para ejecutar {tool}",
2897
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2898
+ "agent.err.http": "HTTP {status}: {text}",
2899
+ "claude.promptUrl": "URL: {url}",
2900
+ "hermes.errBridgeNotRunning": "El bucle de bridge no est\xE1 en ejecuci\xF3n",
2901
+ "hermes.errAskNoQuestion": "No se proporcion\xF3 ninguna pregunta. Pasa questions=[{question, choices?, multi_select?}, ...].",
2902
+ "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.",
2903
+ "hermes.toolPairRefreshDesc": "Forzar la solicitud de un nuevo c\xF3digo de emparejamiento (por defecto: reutilizar/ignorar)",
2904
+ "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.",
2905
+ "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.",
2906
+ "hermes.toolAskQuestionDesc": "El texto de la pregunta a realizar",
2907
+ "hermes.toolAskChoicesDesc": "Opciones predefinidas (opcional; hasta 4)",
2908
+ "hermes.toolAskMultipleDesc": "Permitir selecci\xF3n m\xFAltiple (requiere choices)",
2909
+ "hermes.cmdDesc": "tunnelbox: emparejamiento telef\xF3nico / estado de conexi\xF3n",
2910
+ "hermes.logConfigLoadFailed": "tunnelbox: no se pudo leer la configuraci\xF3n, usando valores por defecto: {err}",
2911
+ "hermes.logRegisterToolsFailed": "tunnelbox: fall\xF3 el registro de herramientas: {err}",
2912
+ "hermes.logRegisterCommandFailed": "tunnelbox: fall\xF3 el registro del comando: {err}",
2913
+ "hermes.logRegisterSkillFailed": "tunnelbox: fall\xF3 el registro de la skill: {err}",
2914
+ "hermes.logRegisterHooksFailed": "tunnelbox: fall\xF3 el registro de los hooks: {err}",
2915
+ "hermes.logRegisterApprovalFailed": "tunnelbox: fall\xF3 el registro del transporte de aprobaci\xF3n: {err}",
2916
+ "hermes.logRegisterAskFailed": "tunnelbox: fall\xF3 el registro de tunnelbox_ask: {err}",
2917
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: fall\xF3 el registro de la secci\xF3n del prompt del sistema: {err}",
2918
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: fall\xF3 el inicio del puente en segundo plano: {err}",
2919
+ "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."
2608
2920
  };
2609
2921
  var DEFAULT_LANG = "en-US";
2610
2922
  var dicts = {
@@ -2641,6 +2953,11 @@ function detectSystemLang() {
2641
2953
  const v = process.env[k];
2642
2954
  if (v && v.trim()) return v.trim().split(".")[0];
2643
2955
  }
2956
+ try {
2957
+ const loc = Intl.DateTimeFormat().resolvedOptions().locale;
2958
+ if (loc && loc.trim()) return loc.trim();
2959
+ } catch {
2960
+ }
2644
2961
  return null;
2645
2962
  }
2646
2963
  function resolveLang(opts = {}) {
@@ -2729,6 +3046,35 @@ function writePairingJson(info, type) {
2729
3046
  function injectedRelayUrl() {
2730
3047
  return "wss://relay.tunnelbox.top" ? "wss://relay.tunnelbox.top".replace(/\/+$/, "") : "";
2731
3048
  }
3049
+ function websiteUrl() {
3050
+ return (process.env.TUNNELBOX_WEBSITE_URL || "https://www.tunnelbox.top").trim();
3051
+ }
3052
+ function envFlag(raw) {
3053
+ const s = (raw || "").trim().toLowerCase();
3054
+ if (["1", "true", "yes", "on"].includes(s)) return true;
3055
+ if (["0", "false", "no", "off"].includes(s)) return false;
3056
+ return null;
3057
+ }
3058
+ function supportsHyperlinks() {
3059
+ const override = envFlag(process.env.TUNNELBOX_HYPERLINK);
3060
+ if (override !== null) return override;
3061
+ if (!process.stdout || !process.stdout.isTTY) return false;
3062
+ const env = process.env;
3063
+ if (env.WT_SESSION) return true;
3064
+ if (env.WEZTERM_PANE) return true;
3065
+ if (env.KITTY_WINDOW_ID) return true;
3066
+ if (env.VTE_VERSION) return true;
3067
+ if (env.KONSOLE_VERSION) return true;
3068
+ const tp = env.TERM_PROGRAM || "";
3069
+ return /^(iTerm\.app|WezTerm|vscode|Hyper|Apple_Terminal|Tabby|WarpTerminal)$/i.test(tp);
3070
+ }
3071
+ function hyperlink(url, text) {
3072
+ const label = text ?? url;
3073
+ if (!supportsHyperlinks()) return label;
3074
+ const OSC = "\x1B]8;;";
3075
+ const ST = "\x1B\\";
3076
+ return `${OSC}${url}${ST}${label}${OSC}${ST}`;
3077
+ }
2732
3078
  function dispWidth(s) {
2733
3079
  let w = 0;
2734
3080
  for (const ch of s) w += ch.charCodeAt(0) > 255 ? 2 : 1;
@@ -2761,6 +3107,7 @@ async function printPairing(code, type, name2, lang) {
2761
3107
  console.log("\u2502 " + padVisual(codeLine, W - 2) + " \u2502");
2762
3108
  console.log("\u2514" + bar + "\u2518");
2763
3109
  console.log(" " + hint);
3110
+ console.log(" " + tt("qr.downloadApp", { url: hyperlink(websiteUrl()) }));
2764
3111
  console.log(" " + tt("qr.validFor"));
2765
3112
  try {
2766
3113
  const mod = await import("qrcode");
@@ -3048,7 +3395,7 @@ function sessionTitle(messages) {
3048
3395
  }
3049
3396
  return "";
3050
3397
  }
3051
- function streamEventTo(sessionID, event, emit, streamed) {
3398
+ function streamEventTo(sessionID, event, emit, streamed, t2) {
3052
3399
  const e = event ?? {};
3053
3400
  if (typeof e.type !== "string" || !e.data || typeof e.data !== "object") return;
3054
3401
  const data = e.data;
@@ -3058,21 +3405,21 @@ function streamEventTo(sessionID, event, emit, streamed) {
3058
3405
  switch (e.type) {
3059
3406
  case "assistant/chunk": {
3060
3407
  const chunk = data.chunk ?? {};
3061
- const t2 = chunk.type || "";
3062
- if (t2 === "finish") {
3408
+ const ct = chunk.type || "";
3409
+ if (ct === "finish") {
3063
3410
  if (chunk.reason?.kind === "error") {
3064
3411
  streamed.add(key);
3065
- const msg = chunk.reason.failure?.message || chunk.reason.error?.message || "dsh \u751F\u6210\u51FA\u9519";
3412
+ const msg = chunk.reason.failure?.message || chunk.reason.error?.message || t2("adapter.errDshGenerate");
3066
3413
  emit(sessionID, mid, { id: "err", type: "text", text: "[dsh] " + msg, complete: true });
3067
3414
  }
3068
3415
  return;
3069
3416
  }
3070
- if (t2 === "text-delta" && typeof chunk.text === "string") {
3417
+ if (ct === "text-delta" && typeof chunk.text === "string") {
3071
3418
  streamed.add(key);
3072
3419
  emit(sessionID, mid, { id: `t${chunk.index ?? 0}`, type: "text", delta: chunk.text });
3073
3420
  return;
3074
3421
  }
3075
- if (t2 === "reasoning-delta" && typeof chunk.text === "string") {
3422
+ if (ct === "reasoning-delta" && typeof chunk.text === "string") {
3076
3423
  streamed.add(key);
3077
3424
  emit(sessionID, mid, { id: `r${chunk.index ?? 0}`, type: "thinking", delta: chunk.text });
3078
3425
  return;
@@ -3164,7 +3511,7 @@ async function sessionExists(sp, sessionId) {
3164
3511
  const headers = await sp.list().catch(() => []);
3165
3512
  return headers.some((h) => h.id === sessionId);
3166
3513
  }
3167
- async function sessionInfo(sp, h) {
3514
+ async function sessionInfo(sp, h, t2) {
3168
3515
  let events = [];
3169
3516
  let updated = h.createdAt;
3170
3517
  try {
@@ -3175,19 +3522,19 @@ async function sessionInfo(sp, h) {
3175
3522
  }
3176
3523
  return {
3177
3524
  id: h.id,
3178
- title: titleOf(events) || "dsh \u4F1A\u8BDD",
3525
+ title: titleOf(events) || t2("adapter.newSessionTitle"),
3179
3526
  created: h.createdAt,
3180
3527
  updated,
3181
3528
  status: "idle",
3182
3529
  workspace: h.cwd
3183
3530
  };
3184
3531
  }
3185
- async function listSessions(sp, workspace) {
3532
+ async function listSessions(sp, workspace, t2) {
3186
3533
  const headers = await sp.list().catch(() => []);
3187
3534
  const out = [];
3188
3535
  for (const h of headers) {
3189
3536
  if (workspace && h.cwd !== workspace) continue;
3190
- const s = await sessionInfo(sp, h);
3537
+ const s = await sessionInfo(sp, h, t2);
3191
3538
  if (s) out.push(s);
3192
3539
  }
3193
3540
  return out.sort((a, b) => b.updated - a.updated);
@@ -3245,7 +3592,7 @@ function findDir(dir, name2) {
3245
3592
  }
3246
3593
 
3247
3594
  // src/bridge.ts
3248
- var VERSION = true ? "0.1.21" : "0.0.0-dev";
3595
+ var VERSION = true ? "0.1.23" : "0.0.0-dev";
3249
3596
  var AGENT_TYPE = "dsh";
3250
3597
  var APPROVAL_TIMEOUT_MS = 12e4;
3251
3598
  var ADAPTER_COMMANDS = [
@@ -3445,7 +3792,7 @@ ${err.stack}` : ""));
3445
3792
  const payload = env.payload;
3446
3793
  const sessions = /* @__PURE__ */ new Map();
3447
3794
  if (sp) {
3448
- for (const s of await listSessions(sp, payload?.workspace)) sessions.set(s.id, s);
3795
+ for (const s of await listSessions(sp, payload?.workspace, this.t)) sessions.set(s.id, s);
3449
3796
  }
3450
3797
  for (const [id, h] of this.handles) {
3451
3798
  const events = [...liveSessionEvents(h.agent.session)];
@@ -3727,7 +4074,7 @@ ${err.stack}` : ""));
3727
4074
  if (!gw || !this.remoteClientId) return;
3728
4075
  void gw.dispatchRpc("$events/result", { args: { clientId: this.remoteClientId, eventId, outcome } }).then(
3729
4076
  (res) => {
3730
- if (res && res.ok === false) this.log(this.t("adapter.logResultRejected", { eventId, message: res.error?.message ?? "unknown" }));
4077
+ if (res && res.ok === false) this.log(this.t("adapter.logResultRejected", { eventId, message: res.error?.message ?? this.t("adapter.unknown") }));
3731
4078
  },
3732
4079
  (e) => this.log(this.t("adapter.logResultBackfillFailed", { eventId, message: e.message }))
3733
4080
  );
@@ -4014,7 +4361,7 @@ ${err.stack}` : ""));
4014
4361
  onSessionEvent(sessionID, event) {
4015
4362
  const sid = String(sessionID);
4016
4363
  if (!this.handles.has(sid)) return;
4017
- streamEventTo(sid, event, (s, mid, part) => this.send(envelope("message.part", { sessionID: s, messageID: mid, part })), this.streamedTurns);
4364
+ streamEventTo(sid, event, (s, mid, part) => this.send(envelope("message.part", { sessionID: s, messageID: mid, part })), this.streamedTurns, this.t);
4018
4365
  const t2 = event.type;
4019
4366
  if (t2 === "turn/start") this.send(envelope("session.status", { sessionID: sid, status: "running" }));
4020
4367
  else if (t2 === "turn/end") this.send(envelope("session.status", { sessionID: sid, status: "idle" }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tunnelbox/dsh-tunnelbox",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "description": "tunnelbox 的 dsh 原生 Cordis 插件:手机远程驱动 DeepSeek Harness(agent/session/tools/审批/中止)",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -36,7 +36,7 @@
36
36
  "@deepseek-ai/schemastery": "^3.18.1"
37
37
  },
38
38
  "devDependencies": {
39
- "@tunnelbox/core": "0.1.21",
39
+ "@tunnelbox/core": "0.1.23",
40
40
  "@types/node": "^22.0.0",
41
41
  "esbuild": "^0.24.0",
42
42
  "typescript": "^5.4.5"