@tunnelbox/dsh-tunnelbox 0.1.21 → 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.
Files changed (2) hide show
  1. package/dist/index.mjs +361 -22
  2. package/package.json +2 -2
package/dist/index.mjs CHANGED
@@ -455,7 +455,45 @@ var zh_CN_default = {
455
455
  "adapter.errCursorExit": "Cursor CLI \u9000\u51FA({code}): {err}",
456
456
  "adapter.errCursorSpawn": "\u65E0\u6CD5\u542F\u52A8 Cursor CLI\uFF08agent\uFF09\uFF1A\u8BF7\u786E\u8BA4\u5DF2\u5B89\u88C5\u5E76\u767B\u5F55\uFF08{message}\uFF09",
457
457
  "adapter.errCursorStart": "Cursor CLI \u542F\u52A8\u5931\u8D25: {message}",
458
- "adapter.errCursorGeneric": "Cursor \u51FA\u9519"
458
+ "adapter.errCursorGeneric": "Cursor \u51FA\u9519",
459
+ "qr.downloadApp": "\u4E0B\u8F7D tunnelbox App\uFF08Android / iOS\uFF09\uFF1A{url}",
460
+ "adapter.logLegacyHookRemoved": "\u5DF2\u79FB\u9664\u65E7\u7684 PermissionRequest hook\uFF08hooks.json\uFF09",
461
+ "adapter.errAppServerNotRunning": "codex app-server \u672A\u8FD0\u884C",
462
+ "adapter.errAppServerTimeout": "app-server \u8BF7\u6C42\u8D85\u65F6\uFF1A{method}",
463
+ "adapter.errAppServerStopped": "app-server \u5BA2\u6237\u7AEF\u5DF2\u505C\u6B62",
464
+ "adapter.errAppServerExited": "codex app-server \u9000\u51FA\uFF08code={code} signal={signal}\uFF09",
465
+ "adapter.errAppServerError": "app-server \u9519\u8BEF\uFF1A{message}",
466
+ "adapter.logAppServerStderr": "app-server\uFF1A{line}",
467
+ "adapter.logAppServerExited": "app-server \u9000\u51FA\uFF08code={code} signal={signal}\uFF09",
468
+ "adapter.errDshGenerate": "dsh \u751F\u6210\u51FA\u9519",
469
+ "adapter.unknown": "\u672A\u77E5",
470
+ "adapter.errGatewayClientMissing": "gateway client \u672A\u521B\u5EFA",
471
+ "adapter.errGatewayNotConnected": "gateway \u672A\u8FDE\u63A5",
472
+ "adapter.sessionTitleWithId": "{name} \u4F1A\u8BDD {id}",
473
+ "adapter.promptApproveTool": "{name} \u8BF7\u6C42\u6279\u51C6\u8FD0\u884C {tool}",
474
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
475
+ "agent.err.http": "HTTP {status}\uFF1A{text}",
476
+ "claude.promptUrl": "URL\uFF1A{url}",
477
+ "hermes.errBridgeNotRunning": "bridge loop \u672A\u8FD0\u884C",
478
+ "hermes.errAskNoQuestion": "\u672A\u63D0\u4F9B\u95EE\u9898\u3002\u8BF7\u4F20\u5165 questions=[{question, choices?, multi_select?}, ...]\u3002",
479
+ "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",
480
+ "hermes.toolPairRefreshDesc": "\u662F\u5426\u5F3A\u5236\u7533\u8BF7\u65B0\u914D\u5BF9\u7801\uFF08\u9ED8\u8BA4\u590D\u7528/\u5FFD\u7565\uFF09",
481
+ "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",
482
+ "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",
483
+ "hermes.toolAskQuestionDesc": "\u8981\u95EE\u7684\u95EE\u9898\u6587\u672C",
484
+ "hermes.toolAskChoicesDesc": "\u9884\u7F6E\u9009\u9879\uFF08\u53EF\u9009\uFF1B\u6700\u591A 4 \u4E2A\uFF09",
485
+ "hermes.toolAskMultipleDesc": "\u662F\u5426\u591A\u9009\uFF08\u9700\u63D0\u4F9B choices\uFF09",
486
+ "hermes.cmdDesc": "tunnelbox\uFF1A\u624B\u673A\u914D\u5BF9 / \u8FDE\u63A5\u72B6\u6001",
487
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8BFB\u53D6\u914D\u7F6E\u5931\u8D25\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u503C: {err}",
488
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u6CE8\u518C\u5DE5\u5177\u5931\u8D25: {err}",
489
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u6CE8\u518C\u547D\u4EE4\u5931\u8D25: {err}",
490
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u6CE8\u518C\u6280\u80FD\u5931\u8D25: {err}",
491
+ "hermes.logRegisterHooksFailed": "tunnelbox: \u6CE8\u518C hooks \u5931\u8D25: {err}",
492
+ "hermes.logRegisterApprovalFailed": "tunnelbox: \u6CE8\u518C approval transport \u5931\u8D25: {err}",
493
+ "hermes.logRegisterAskFailed": "tunnelbox: \u6CE8\u518C tunnelbox_ask \u5931\u8D25: {err}",
494
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: \u6CE8\u518C system prompt \u6BB5\u5931\u8D25: {err}",
495
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u540E\u53F0\u6865\u542F\u52A8\u5931\u8D25: {err}",
496
+ "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
497
  };
460
498
  var zh_TW_default = {
461
499
  "agent.err.createSession": "\u5EFA\u7ACB\u6703\u8A71\u5931\u6557",
@@ -762,7 +800,45 @@ var zh_TW_default = {
762
800
  "adapter.errCursorExit": "Cursor CLI \u9000\u51FA({code}): {err}",
763
801
  "adapter.errCursorSpawn": "\u7121\u6CD5\u555F\u52D5 Cursor CLI\uFF08agent\uFF09\uFF1A\u8ACB\u78BA\u8A8D\u5DF2\u5B89\u88DD\u4E26\u767B\u5165\uFF08{message}\uFF09",
764
802
  "adapter.errCursorStart": "Cursor CLI \u555F\u52D5\u5931\u6557: {message}",
765
- "adapter.errCursorGeneric": "Cursor \u51FA\u932F"
803
+ "adapter.errCursorGeneric": "Cursor \u51FA\u932F",
804
+ "qr.downloadApp": "\u4E0B\u8F09 tunnelbox App\uFF08Android / iOS\uFF09\uFF1A{url}",
805
+ "adapter.logLegacyHookRemoved": "\u5DF2\u79FB\u9664\u820A\u7684 PermissionRequest hook\uFF08hooks.json\uFF09",
806
+ "adapter.errAppServerNotRunning": "codex app-server \u672A\u57F7\u884C",
807
+ "adapter.errAppServerTimeout": "app-server \u8ACB\u6C42\u903E\u6642\uFF1A{method}",
808
+ "adapter.errAppServerStopped": "app-server \u7528\u6236\u7AEF\u5DF2\u505C\u6B62",
809
+ "adapter.errAppServerExited": "codex app-server \u7D50\u675F\uFF08code={code} signal={signal}\uFF09",
810
+ "adapter.errAppServerError": "app-server \u932F\u8AA4\uFF1A{message}",
811
+ "adapter.logAppServerStderr": "app-server\uFF1A{line}",
812
+ "adapter.logAppServerExited": "app-server \u7D50\u675F\uFF08code={code} signal={signal}\uFF09",
813
+ "adapter.errDshGenerate": "dsh \u7522\u751F\u932F\u8AA4",
814
+ "adapter.unknown": "\u672A\u77E5",
815
+ "adapter.errGatewayClientMissing": "gateway client \u672A\u5EFA\u7ACB",
816
+ "adapter.errGatewayNotConnected": "gateway \u672A\u9023\u7DDA",
817
+ "adapter.sessionTitleWithId": "{name} \u5DE5\u4F5C\u968E\u6BB5 {id}",
818
+ "adapter.promptApproveTool": "{name} \u8ACB\u6C42\u6279\u51C6\u57F7\u884C {tool}",
819
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
820
+ "agent.err.http": "HTTP {status}\uFF1A{text}",
821
+ "claude.promptUrl": "URL\uFF1A{url}",
822
+ "hermes.errBridgeNotRunning": "bridge loop \u672A\u57F7\u884C",
823
+ "hermes.errAskNoQuestion": "\u672A\u63D0\u4F9B\u554F\u984C\u3002\u8ACB\u50B3\u5165 questions=[{question, choices?, multi_select?}, ...]\u3002",
824
+ "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",
825
+ "hermes.toolPairRefreshDesc": "\u662F\u5426\u5F37\u5236\u7533\u8ACB\u65B0\u914D\u5C0D\u78BC\uFF08\u9810\u8A2D\u91CD\u7528/\u5FFD\u7565\uFF09",
826
+ "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",
827
+ "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",
828
+ "hermes.toolAskQuestionDesc": "\u8981\u554F\u7684\u554F\u984C\u6587\u5B57",
829
+ "hermes.toolAskChoicesDesc": "\u9810\u7F6E\u9078\u9805\uFF08\u53EF\u9078\uFF1B\u6700\u591A 4 \u500B\uFF09",
830
+ "hermes.toolAskMultipleDesc": "\u662F\u5426\u591A\u9078\uFF08\u9700\u63D0\u4F9B choices\uFF09",
831
+ "hermes.cmdDesc": "tunnelbox\uFF1A\u624B\u6A5F\u914D\u5C0D / \u9023\u7DDA\u72C0\u614B",
832
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8B80\u53D6\u8A2D\u5B9A\u5931\u6557\uFF0C\u4F7F\u7528\u9810\u8A2D\u503C: {err}",
833
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u8A3B\u518A\u5DE5\u5177\u5931\u6557: {err}",
834
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u8A3B\u518A\u547D\u4EE4\u5931\u6557: {err}",
835
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u8A3B\u518A\u6280\u80FD\u5931\u6557: {err}",
836
+ "hermes.logRegisterHooksFailed": "tunnelbox: \u8A3B\u518A hooks \u5931\u6557: {err}",
837
+ "hermes.logRegisterApprovalFailed": "tunnelbox: \u8A3B\u518A approval transport \u5931\u6557: {err}",
838
+ "hermes.logRegisterAskFailed": "tunnelbox: \u8A3B\u518A tunnelbox_ask \u5931\u6557: {err}",
839
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: \u8A3B\u518A system prompt \u6BB5\u5931\u6557: {err}",
840
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u80CC\u666F\u6A4B\u555F\u52D5\u5931\u6557: {err}",
841
+ "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
842
  };
767
843
  var en_US_default = {
768
844
  "agent.err.createSession": "Failed to create session",
@@ -1069,7 +1145,45 @@ var en_US_default = {
1069
1145
  "adapter.errCursorExit": "Cursor CLI exited ({code}): {err}",
1070
1146
  "adapter.errCursorSpawn": "Cannot start Cursor CLI (agent): make sure it is installed and logged in ({message})",
1071
1147
  "adapter.errCursorStart": "Cursor CLI failed to start: {message}",
1072
- "adapter.errCursorGeneric": "Cursor error"
1148
+ "adapter.errCursorGeneric": "Cursor error",
1149
+ "qr.downloadApp": "Download the tunnelbox App (Android / iOS): {url}",
1150
+ "adapter.logLegacyHookRemoved": "Removed the legacy PermissionRequest hook (hooks.json)",
1151
+ "adapter.errAppServerNotRunning": "codex app-server is not running",
1152
+ "adapter.errAppServerTimeout": "app-server request timed out: {method}",
1153
+ "adapter.errAppServerStopped": "app-server client stopped",
1154
+ "adapter.errAppServerExited": "codex app-server exited (code={code} signal={signal})",
1155
+ "adapter.errAppServerError": "app-server error: {message}",
1156
+ "adapter.logAppServerStderr": "app-server: {line}",
1157
+ "adapter.logAppServerExited": "app-server exited (code={code} signal={signal})",
1158
+ "adapter.errDshGenerate": "dsh generation error",
1159
+ "adapter.unknown": "unknown",
1160
+ "adapter.errGatewayClientMissing": "gateway client not created",
1161
+ "adapter.errGatewayNotConnected": "gateway not connected",
1162
+ "adapter.sessionTitleWithId": "{name} session {id}",
1163
+ "adapter.promptApproveTool": "{name} requests approval to run {tool}",
1164
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1165
+ "agent.err.http": "HTTP {status}: {text}",
1166
+ "claude.promptUrl": "URL: {url}",
1167
+ "hermes.errBridgeNotRunning": "bridge loop is not running",
1168
+ "hermes.errAskNoQuestion": "No question provided. Pass questions=[{question, choices?, multi_select?}, ...].",
1169
+ "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.",
1170
+ "hermes.toolPairRefreshDesc": "Force requesting a new pairing code (default: reuse/ignore)",
1171
+ "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.",
1172
+ "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.",
1173
+ "hermes.toolAskQuestionDesc": "The question text to ask",
1174
+ "hermes.toolAskChoicesDesc": "Preset options (optional; up to 4)",
1175
+ "hermes.toolAskMultipleDesc": "Allow multiple selection (requires choices)",
1176
+ "hermes.cmdDesc": "tunnelbox: phone pairing / connection status",
1177
+ "hermes.logConfigLoadFailed": "tunnelbox: failed to read config, using defaults: {err}",
1178
+ "hermes.logRegisterToolsFailed": "tunnelbox: failed to register tools: {err}",
1179
+ "hermes.logRegisterCommandFailed": "tunnelbox: failed to register command: {err}",
1180
+ "hermes.logRegisterSkillFailed": "tunnelbox: failed to register skill: {err}",
1181
+ "hermes.logRegisterHooksFailed": "tunnelbox: failed to register hooks: {err}",
1182
+ "hermes.logRegisterApprovalFailed": "tunnelbox: failed to register approval transport: {err}",
1183
+ "hermes.logRegisterAskFailed": "tunnelbox: failed to register tunnelbox_ask: {err}",
1184
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: failed to register system prompt section: {err}",
1185
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: background bridge failed to start: {err}",
1186
+ "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
1187
  };
1074
1188
  var ja_JP_default = {
1075
1189
  "agent.err.createSession": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
@@ -1376,7 +1490,45 @@ var ja_JP_default = {
1376
1490
  "adapter.errCursorExit": "Cursor CLI \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08{code}\uFF09: {err}",
1377
1491
  "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
1492
  "adapter.errCursorStart": "Cursor CLI \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
1379
- "adapter.errCursorGeneric": "Cursor \u30A8\u30E9\u30FC"
1493
+ "adapter.errCursorGeneric": "Cursor \u30A8\u30E9\u30FC",
1494
+ "qr.downloadApp": "tunnelbox App\uFF08Android / iOS\uFF09\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9: {url}",
1495
+ "adapter.logLegacyHookRemoved": "\u65E7 PermissionRequest hook\uFF08hooks.json\uFF09\u3092\u524A\u9664\u3057\u307E\u3057\u305F",
1496
+ "adapter.errAppServerNotRunning": "codex app-server \u304C\u5B9F\u884C\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1497
+ "adapter.errAppServerTimeout": "app-server \u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F: {method}",
1498
+ "adapter.errAppServerStopped": "app-server \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304C\u505C\u6B62\u3057\u307E\u3057\u305F",
1499
+ "adapter.errAppServerExited": "codex app-server \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08code={code} signal={signal}\uFF09",
1500
+ "adapter.errAppServerError": "app-server \u30A8\u30E9\u30FC: {message}",
1501
+ "adapter.logAppServerStderr": "app-server: {line}",
1502
+ "adapter.logAppServerExited": "app-server \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08code={code} signal={signal}\uFF09",
1503
+ "adapter.errDshGenerate": "dsh \u306E\u751F\u6210\u30A8\u30E9\u30FC",
1504
+ "adapter.unknown": "\u4E0D\u660E",
1505
+ "adapter.errGatewayClientMissing": "gateway \u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u304C\u4F5C\u6210\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1506
+ "adapter.errGatewayNotConnected": "gateway \u306B\u63A5\u7D9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1507
+ "adapter.sessionTitleWithId": "{name} \u30BB\u30C3\u30B7\u30E7\u30F3 {id}",
1508
+ "adapter.promptApproveTool": "{name} \u304C {tool} \u306E\u5B9F\u884C\u627F\u8A8D\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
1509
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1510
+ "agent.err.http": "HTTP {status}: {text}",
1511
+ "claude.promptUrl": "URL: {url}",
1512
+ "hermes.errBridgeNotRunning": "bridge \u30EB\u30FC\u30D7\u304C\u5B9F\u884C\u3055\u308C\u3066\u3044\u307E\u305B\u3093",
1513
+ "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",
1514
+ "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",
1515
+ "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",
1516
+ "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",
1517
+ "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",
1518
+ "hermes.toolAskQuestionDesc": "\u5C0B\u306D\u308B\u8CEA\u554F\u30C6\u30AD\u30B9\u30C8",
1519
+ "hermes.toolAskChoicesDesc": "\u30D7\u30EA\u30BB\u30C3\u30C8\u9078\u629E\u80A2\uFF08\u4EFB\u610F\u3001\u6700\u5927 4 \u3064\uFF09",
1520
+ "hermes.toolAskMultipleDesc": "\u8907\u6570\u9078\u629E\u3092\u8A31\u53EF\uFF08choices \u304C\u5FC5\u8981\uFF09",
1521
+ "hermes.cmdDesc": "tunnelbox: \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0 / \u63A5\u7D9A\u72B6\u614B",
1522
+ "hermes.logConfigLoadFailed": "tunnelbox: \u8A2D\u5B9A\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3001\u65E2\u5B9A\u5024\u3092\u4F7F\u7528: {err}",
1523
+ "hermes.logRegisterToolsFailed": "tunnelbox: \u30C4\u30FC\u30EB\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1524
+ "hermes.logRegisterCommandFailed": "tunnelbox: \u30B3\u30DE\u30F3\u30C9\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1525
+ "hermes.logRegisterSkillFailed": "tunnelbox: \u30B9\u30AD\u30EB\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1526
+ "hermes.logRegisterHooksFailed": "tunnelbox: hooks \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1527
+ "hermes.logRegisterApprovalFailed": "tunnelbox: approval transport \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1528
+ "hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1529
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt \u30BB\u30AF\u30B7\u30E7\u30F3\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
1530
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u30D6\u30EA\u30C3\u30B8\u306E\u8D77\u52D5\u306B\u5931\u6557: {err}",
1531
+ "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
1532
  };
1381
1533
  var ko_KR_default = {
1382
1534
  "agent.err.createSession": "\uC138\uC158 \uC0DD\uC131 \uC2E4\uD328",
@@ -1683,7 +1835,45 @@ var ko_KR_default = {
1683
1835
  "adapter.errCursorExit": "Cursor CLI \uC885\uB8CC({code}): {err}",
1684
1836
  "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
1837
  "adapter.errCursorStart": "Cursor CLI \uC2DC\uC791 \uC2E4\uD328: {message}",
1686
- "adapter.errCursorGeneric": "Cursor \uC624\uB958"
1838
+ "adapter.errCursorGeneric": "Cursor \uC624\uB958",
1839
+ "qr.downloadApp": "tunnelbox \uC571(Android / iOS) \uB2E4\uC6B4\uB85C\uB4DC: {url}",
1840
+ "adapter.logLegacyHookRemoved": "\uC774\uC804 PermissionRequest hook(hooks.json)\uC744 \uC81C\uAC70\uD588\uC2B5\uB2C8\uB2E4",
1841
+ "adapter.errAppServerNotRunning": "codex app-server\uAC00 \uC2E4\uD589 \uC911\uC774 \uC544\uB2D9\uB2C8\uB2E4",
1842
+ "adapter.errAppServerTimeout": "app-server \uC694\uCCAD \uC2DC\uAC04 \uCD08\uACFC: {method}",
1843
+ "adapter.errAppServerStopped": "app-server \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC911\uC9C0\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
1844
+ "adapter.errAppServerExited": "codex app-server \uC885\uB8CC(code={code} signal={signal})",
1845
+ "adapter.errAppServerError": "app-server \uC624\uB958: {message}",
1846
+ "adapter.logAppServerStderr": "app-server: {line}",
1847
+ "adapter.logAppServerExited": "app-server \uC885\uB8CC(code={code} signal={signal})",
1848
+ "adapter.errDshGenerate": "dsh \uC0DD\uC131 \uC624\uB958",
1849
+ "adapter.unknown": "\uC54C \uC218 \uC5C6\uC74C",
1850
+ "adapter.errGatewayClientMissing": "gateway \uD074\uB77C\uC774\uC5B8\uD2B8\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
1851
+ "adapter.errGatewayNotConnected": "gateway\uC5D0 \uC5F0\uACB0\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
1852
+ "adapter.sessionTitleWithId": "{name} \uC138\uC158 {id}",
1853
+ "adapter.promptApproveTool": "{name}\uC774(\uAC00) {tool} \uC2E4\uD589 \uC2B9\uC778\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
1854
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
1855
+ "agent.err.http": "HTTP {status}: {text}",
1856
+ "claude.promptUrl": "URL: {url}",
1857
+ "hermes.errBridgeNotRunning": "bridge \uB8E8\uD504\uAC00 \uC2E4\uD589 \uC911\uC774 \uC544\uB2D9\uB2C8\uB2E4",
1858
+ "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.",
1859
+ "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.",
1860
+ "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)",
1861
+ "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.",
1862
+ "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.",
1863
+ "hermes.toolAskQuestionDesc": "\uC9C8\uBB38 \uD14D\uC2A4\uD2B8",
1864
+ "hermes.toolAskChoicesDesc": "\uC0AC\uC804 \uC124\uC815 \uC120\uD0DD\uC9C0(\uC120\uD0DD, \uCD5C\uB300 4\uAC1C)",
1865
+ "hermes.toolAskMultipleDesc": "\uB2E4\uC911 \uC120\uD0DD \uD5C8\uC6A9(choices \uD544\uC694)",
1866
+ "hermes.cmdDesc": "tunnelbox: \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 / \uC5F0\uACB0 \uC0C1\uD0DC",
1867
+ "hermes.logConfigLoadFailed": "tunnelbox: \uC124\uC815 \uC77D\uAE30 \uC2E4\uD328, \uAE30\uBCF8\uAC12 \uC0AC\uC6A9: {err}",
1868
+ "hermes.logRegisterToolsFailed": "tunnelbox: \uB3C4\uAD6C \uB4F1\uB85D \uC2E4\uD328: {err}",
1869
+ "hermes.logRegisterCommandFailed": "tunnelbox: \uBA85\uB839 \uB4F1\uB85D \uC2E4\uD328: {err}",
1870
+ "hermes.logRegisterSkillFailed": "tunnelbox: \uC2A4\uD0AC \uB4F1\uB85D \uC2E4\uD328: {err}",
1871
+ "hermes.logRegisterHooksFailed": "tunnelbox: hooks \uB4F1\uB85D \uC2E4\uD328: {err}",
1872
+ "hermes.logRegisterApprovalFailed": "tunnelbox: approval transport \uB4F1\uB85D \uC2E4\uD328: {err}",
1873
+ "hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask \uB4F1\uB85D \uC2E4\uD328: {err}",
1874
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt \uC139\uC158 \uB4F1\uB85D \uC2E4\uD328: {err}",
1875
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: \uBC31\uADF8\uB77C\uC6B4\uB4DC \uBE0C\uB9AC\uC9C0 \uC2DC\uC791 \uC2E4\uD328: {err}",
1876
+ "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
1877
  };
1688
1878
  var fr_FR_default = {
1689
1879
  "agent.err.createSession": "\xC9chec de la cr\xE9ation de la session",
@@ -1990,7 +2180,45 @@ var fr_FR_default = {
1990
2180
  "adapter.errCursorExit": "Cursor CLI arr\xEAt\xE9 ({code}) : {err}",
1991
2181
  "adapter.errCursorSpawn": "Impossible de d\xE9marrer Cursor CLI (agent) : v\xE9rifiez qu'il est install\xE9 et connect\xE9 ({message})",
1992
2182
  "adapter.errCursorStart": "\xC9chec du d\xE9marrage de Cursor CLI : {message}",
1993
- "adapter.errCursorGeneric": "Erreur Cursor"
2183
+ "adapter.errCursorGeneric": "Erreur Cursor",
2184
+ "qr.downloadApp": "T\xE9l\xE9charger l'application tunnelbox (Android / iOS) : {url}",
2185
+ "adapter.logLegacyHookRemoved": "Ancien hook PermissionRequest supprim\xE9 (hooks.json)",
2186
+ "adapter.errAppServerNotRunning": "codex app-server n'est pas en cours d'ex\xE9cution",
2187
+ "adapter.errAppServerTimeout": "D\xE9lai d\xE9pass\xE9 pour la requ\xEAte app-server : {method}",
2188
+ "adapter.errAppServerStopped": "Client app-server arr\xEAt\xE9",
2189
+ "adapter.errAppServerExited": "codex app-server arr\xEAt\xE9 (code={code} signal={signal})",
2190
+ "adapter.errAppServerError": "Erreur app-server : {message}",
2191
+ "adapter.logAppServerStderr": "app-server : {line}",
2192
+ "adapter.logAppServerExited": "app-server arr\xEAt\xE9 (code={code} signal={signal})",
2193
+ "adapter.errDshGenerate": "Erreur de g\xE9n\xE9ration dsh",
2194
+ "adapter.unknown": "inconnu",
2195
+ "adapter.errGatewayClientMissing": "Client gateway non cr\xE9\xE9",
2196
+ "adapter.errGatewayNotConnected": "Gateway non connect\xE9",
2197
+ "adapter.sessionTitleWithId": "session {name} {id}",
2198
+ "adapter.promptApproveTool": "{name} demande l'approbation d'ex\xE9cuter {tool}",
2199
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2200
+ "agent.err.http": "HTTP {status} : {text}",
2201
+ "claude.promptUrl": "URL : {url}",
2202
+ "hermes.errBridgeNotRunning": "La boucle bridge n'est pas en cours d'ex\xE9cution",
2203
+ "hermes.errAskNoQuestion": "Aucune question fournie. Passez questions=[{question, choices?, multi_select?}, ...].",
2204
+ "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.",
2205
+ "hermes.toolPairRefreshDesc": "Forcer la demande d'un nouveau code d'appairage (par d\xE9faut : r\xE9utiliser/ignorer)",
2206
+ "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.",
2207
+ "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.",
2208
+ "hermes.toolAskQuestionDesc": "Le texte de la question \xE0 poser",
2209
+ "hermes.toolAskChoicesDesc": "Options pr\xE9d\xE9finies (facultatif ; jusqu'\xE0 4)",
2210
+ "hermes.toolAskMultipleDesc": "Autoriser la s\xE9lection multiple (n\xE9cessite choices)",
2211
+ "hermes.cmdDesc": "tunnelbox : appairage t\xE9l\xE9phone / \xE9tat de connexion",
2212
+ "hermes.logConfigLoadFailed": "tunnelbox : \xE9chec de lecture de la config, valeurs par d\xE9faut : {err}",
2213
+ "hermes.logRegisterToolsFailed": "tunnelbox : \xE9chec d'enregistrement des outils : {err}",
2214
+ "hermes.logRegisterCommandFailed": "tunnelbox : \xE9chec d'enregistrement de la commande : {err}",
2215
+ "hermes.logRegisterSkillFailed": "tunnelbox : \xE9chec d'enregistrement de la comp\xE9tence : {err}",
2216
+ "hermes.logRegisterHooksFailed": "tunnelbox : \xE9chec d'enregistrement des hooks : {err}",
2217
+ "hermes.logRegisterApprovalFailed": "tunnelbox : \xE9chec d'enregistrement du transport d'approbation : {err}",
2218
+ "hermes.logRegisterAskFailed": "tunnelbox : \xE9chec d'enregistrement de tunnelbox_ask : {err}",
2219
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox : \xE9chec d'enregistrement de la section du prompt syst\xE8me : {err}",
2220
+ "hermes.logBackgroundBridgeFailed": "tunnelbox : \xE9chec du d\xE9marrage du pont en arri\xE8re-plan : {err}",
2221
+ "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
2222
  };
1995
2223
  var de_DE_default = {
1996
2224
  "agent.err.createSession": "Sitzung konnte nicht erstellt werden",
@@ -2297,7 +2525,45 @@ var de_DE_default = {
2297
2525
  "adapter.errCursorExit": "Cursor CLI beendet ({code}): {err}",
2298
2526
  "adapter.errCursorSpawn": "Cursor CLI (agent) kann nicht gestartet werden: Stellen Sie sicher, dass es installiert und angemeldet ist ({message})",
2299
2527
  "adapter.errCursorStart": "Start von Cursor CLI fehlgeschlagen: {message}",
2300
- "adapter.errCursorGeneric": "Cursor-Fehler"
2528
+ "adapter.errCursorGeneric": "Cursor-Fehler",
2529
+ "qr.downloadApp": "tunnelbox-App herunterladen (Android / iOS): {url}",
2530
+ "adapter.logLegacyHookRemoved": "Alter PermissionRequest-Hook entfernt (hooks.json)",
2531
+ "adapter.errAppServerNotRunning": "codex app-server l\xE4uft nicht",
2532
+ "adapter.errAppServerTimeout": "Zeit\xFCberschreitung bei app-server-Anfrage: {method}",
2533
+ "adapter.errAppServerStopped": "app-server-Client gestoppt",
2534
+ "adapter.errAppServerExited": "codex app-server beendet (code={code} signal={signal})",
2535
+ "adapter.errAppServerError": "app-server-Fehler: {message}",
2536
+ "adapter.logAppServerStderr": "app-server: {line}",
2537
+ "adapter.logAppServerExited": "app-server beendet (code={code} signal={signal})",
2538
+ "adapter.errDshGenerate": "dsh-Generierungsfehler",
2539
+ "adapter.unknown": "unbekannt",
2540
+ "adapter.errGatewayClientMissing": "Gateway-Client nicht erstellt",
2541
+ "adapter.errGatewayNotConnected": "Gateway nicht verbunden",
2542
+ "adapter.sessionTitleWithId": "{name}-Sitzung {id}",
2543
+ "adapter.promptApproveTool": "{name} fordert die Genehmigung zur Ausf\xFChrung von {tool} an",
2544
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2545
+ "agent.err.http": "HTTP {status}: {text}",
2546
+ "claude.promptUrl": "URL: {url}",
2547
+ "hermes.errBridgeNotRunning": "Bridge-Schleife l\xE4uft nicht",
2548
+ "hermes.errAskNoQuestion": "Keine Frage angegeben. \xDCbergeben Sie questions=[{question, choices?, multi_select?}, ...].",
2549
+ "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.",
2550
+ "hermes.toolPairRefreshDesc": "Erzwingt die Anforderung eines neuen Kopplungscodes (Standard: wiederverwenden/ignorieren)",
2551
+ "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.",
2552
+ "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.",
2553
+ "hermes.toolAskQuestionDesc": "Der zu stellende Fragetext",
2554
+ "hermes.toolAskChoicesDesc": "Voreingestellte Optionen (optional; bis zu 4)",
2555
+ "hermes.toolAskMultipleDesc": "Mehrfachauswahl zulassen (erfordert choices)",
2556
+ "hermes.cmdDesc": "tunnelbox: Telefon-Kopplung / Verbindungsstatus",
2557
+ "hermes.logConfigLoadFailed": "tunnelbox: Konfiguration konnte nicht gelesen werden, Standardwerte werden verwendet: {err}",
2558
+ "hermes.logRegisterToolsFailed": "tunnelbox: Registrierung der Tools fehlgeschlagen: {err}",
2559
+ "hermes.logRegisterCommandFailed": "tunnelbox: Registrierung des Befehls fehlgeschlagen: {err}",
2560
+ "hermes.logRegisterSkillFailed": "tunnelbox: Registrierung der Skill fehlgeschlagen: {err}",
2561
+ "hermes.logRegisterHooksFailed": "tunnelbox: Registrierung der Hooks fehlgeschlagen: {err}",
2562
+ "hermes.logRegisterApprovalFailed": "tunnelbox: Registrierung des Approval-Transports fehlgeschlagen: {err}",
2563
+ "hermes.logRegisterAskFailed": "tunnelbox: Registrierung von tunnelbox_ask fehlgeschlagen: {err}",
2564
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: Registrierung des System-Prompt-Abschnitts fehlgeschlagen: {err}",
2565
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: Start der Hintergrund-Bridge fehlgeschlagen: {err}",
2566
+ "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
2567
  };
2302
2568
  var es_ES_default = {
2303
2569
  "agent.err.createSession": "No se pudo crear la sesi\xF3n",
@@ -2604,7 +2870,45 @@ var es_ES_default = {
2604
2870
  "adapter.errCursorExit": "Cursor CLI finaliz\xF3 ({code}): {err}",
2605
2871
  "adapter.errCursorSpawn": "No se puede iniciar Cursor CLI (agent): comprueba que est\xE9 instalado y con sesi\xF3n iniciada ({message})",
2606
2872
  "adapter.errCursorStart": "Fall\xF3 el inicio de Cursor CLI: {message}",
2607
- "adapter.errCursorGeneric": "Error de Cursor"
2873
+ "adapter.errCursorGeneric": "Error de Cursor",
2874
+ "qr.downloadApp": "Descarga la app tunnelbox (Android / iOS): {url}",
2875
+ "adapter.logLegacyHookRemoved": "Se elimin\xF3 el hook PermissionRequest antiguo (hooks.json)",
2876
+ "adapter.errAppServerNotRunning": "codex app-server no est\xE1 en ejecuci\xF3n",
2877
+ "adapter.errAppServerTimeout": "Se agot\xF3 el tiempo de la solicitud a app-server: {method}",
2878
+ "adapter.errAppServerStopped": "Cliente app-server detenido",
2879
+ "adapter.errAppServerExited": "codex app-server finaliz\xF3 (code={code} signal={signal})",
2880
+ "adapter.errAppServerError": "Error de app-server: {message}",
2881
+ "adapter.logAppServerStderr": "app-server: {line}",
2882
+ "adapter.logAppServerExited": "app-server finaliz\xF3 (code={code} signal={signal})",
2883
+ "adapter.errDshGenerate": "Error de generaci\xF3n de dsh",
2884
+ "adapter.unknown": "desconocido",
2885
+ "adapter.errGatewayClientMissing": "Cliente de gateway no creado",
2886
+ "adapter.errGatewayNotConnected": "Gateway no conectado",
2887
+ "adapter.sessionTitleWithId": "sesi\xF3n de {name} {id}",
2888
+ "adapter.promptApproveTool": "{name} solicita aprobaci\xF3n para ejecutar {tool}",
2889
+ "index.log.serverStart": "opencode server={server} baseUrl={baseUrl} auth={auth} lang={lang}",
2890
+ "agent.err.http": "HTTP {status}: {text}",
2891
+ "claude.promptUrl": "URL: {url}",
2892
+ "hermes.errBridgeNotRunning": "El bucle de bridge no est\xE1 en ejecuci\xF3n",
2893
+ "hermes.errAskNoQuestion": "No se proporcion\xF3 ninguna pregunta. Pasa questions=[{question, choices?, multi_select?}, ...].",
2894
+ "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.",
2895
+ "hermes.toolPairRefreshDesc": "Forzar la solicitud de un nuevo c\xF3digo de emparejamiento (por defecto: reutilizar/ignorar)",
2896
+ "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.",
2897
+ "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.",
2898
+ "hermes.toolAskQuestionDesc": "El texto de la pregunta a realizar",
2899
+ "hermes.toolAskChoicesDesc": "Opciones predefinidas (opcional; hasta 4)",
2900
+ "hermes.toolAskMultipleDesc": "Permitir selecci\xF3n m\xFAltiple (requiere choices)",
2901
+ "hermes.cmdDesc": "tunnelbox: emparejamiento telef\xF3nico / estado de conexi\xF3n",
2902
+ "hermes.logConfigLoadFailed": "tunnelbox: no se pudo leer la configuraci\xF3n, usando valores por defecto: {err}",
2903
+ "hermes.logRegisterToolsFailed": "tunnelbox: fall\xF3 el registro de herramientas: {err}",
2904
+ "hermes.logRegisterCommandFailed": "tunnelbox: fall\xF3 el registro del comando: {err}",
2905
+ "hermes.logRegisterSkillFailed": "tunnelbox: fall\xF3 el registro de la skill: {err}",
2906
+ "hermes.logRegisterHooksFailed": "tunnelbox: fall\xF3 el registro de los hooks: {err}",
2907
+ "hermes.logRegisterApprovalFailed": "tunnelbox: fall\xF3 el registro del transporte de aprobaci\xF3n: {err}",
2908
+ "hermes.logRegisterAskFailed": "tunnelbox: fall\xF3 el registro de tunnelbox_ask: {err}",
2909
+ "hermes.logRegisterSystemPromptFailed": "tunnelbox: fall\xF3 el registro de la secci\xF3n del prompt del sistema: {err}",
2910
+ "hermes.logBackgroundBridgeFailed": "tunnelbox: fall\xF3 el inicio del puente en segundo plano: {err}",
2911
+ "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
2912
  };
2609
2913
  var DEFAULT_LANG = "en-US";
2610
2914
  var dicts = {
@@ -2641,6 +2945,11 @@ function detectSystemLang() {
2641
2945
  const v = process.env[k];
2642
2946
  if (v && v.trim()) return v.trim().split(".")[0];
2643
2947
  }
2948
+ try {
2949
+ const loc = Intl.DateTimeFormat().resolvedOptions().locale;
2950
+ if (loc && loc.trim()) return loc.trim();
2951
+ } catch {
2952
+ }
2644
2953
  return null;
2645
2954
  }
2646
2955
  function resolveLang(opts = {}) {
@@ -2729,6 +3038,35 @@ function writePairingJson(info, type) {
2729
3038
  function injectedRelayUrl() {
2730
3039
  return "wss://relay.tunnelbox.top" ? "wss://relay.tunnelbox.top".replace(/\/+$/, "") : "";
2731
3040
  }
3041
+ function websiteUrl() {
3042
+ return (process.env.TUNNELBOX_WEBSITE_URL || "https://www.tunnelbox.top").trim();
3043
+ }
3044
+ function envFlag(raw) {
3045
+ const s = (raw || "").trim().toLowerCase();
3046
+ if (["1", "true", "yes", "on"].includes(s)) return true;
3047
+ if (["0", "false", "no", "off"].includes(s)) return false;
3048
+ return null;
3049
+ }
3050
+ function supportsHyperlinks() {
3051
+ const override = envFlag(process.env.TUNNELBOX_HYPERLINK);
3052
+ if (override !== null) return override;
3053
+ if (!process.stdout || !process.stdout.isTTY) return false;
3054
+ const env = process.env;
3055
+ if (env.WT_SESSION) return true;
3056
+ if (env.WEZTERM_PANE) return true;
3057
+ if (env.KITTY_WINDOW_ID) return true;
3058
+ if (env.VTE_VERSION) return true;
3059
+ if (env.KONSOLE_VERSION) return true;
3060
+ const tp = env.TERM_PROGRAM || "";
3061
+ return /^(iTerm\.app|WezTerm|vscode|Hyper|Apple_Terminal|Tabby|WarpTerminal)$/i.test(tp);
3062
+ }
3063
+ function hyperlink(url, text) {
3064
+ const label = text ?? url;
3065
+ if (!supportsHyperlinks()) return label;
3066
+ const OSC = "\x1B]8;;";
3067
+ const ST = "\x1B\\";
3068
+ return `${OSC}${url}${ST}${label}${OSC}${ST}`;
3069
+ }
2732
3070
  function dispWidth(s) {
2733
3071
  let w = 0;
2734
3072
  for (const ch of s) w += ch.charCodeAt(0) > 255 ? 2 : 1;
@@ -2761,6 +3099,7 @@ async function printPairing(code, type, name2, lang) {
2761
3099
  console.log("\u2502 " + padVisual(codeLine, W - 2) + " \u2502");
2762
3100
  console.log("\u2514" + bar + "\u2518");
2763
3101
  console.log(" " + hint);
3102
+ console.log(" " + tt("qr.downloadApp", { url: hyperlink(websiteUrl()) }));
2764
3103
  console.log(" " + tt("qr.validFor"));
2765
3104
  try {
2766
3105
  const mod = await import("qrcode");
@@ -3048,7 +3387,7 @@ function sessionTitle(messages) {
3048
3387
  }
3049
3388
  return "";
3050
3389
  }
3051
- function streamEventTo(sessionID, event, emit, streamed) {
3390
+ function streamEventTo(sessionID, event, emit, streamed, t2) {
3052
3391
  const e = event ?? {};
3053
3392
  if (typeof e.type !== "string" || !e.data || typeof e.data !== "object") return;
3054
3393
  const data = e.data;
@@ -3058,21 +3397,21 @@ function streamEventTo(sessionID, event, emit, streamed) {
3058
3397
  switch (e.type) {
3059
3398
  case "assistant/chunk": {
3060
3399
  const chunk = data.chunk ?? {};
3061
- const t2 = chunk.type || "";
3062
- if (t2 === "finish") {
3400
+ const ct = chunk.type || "";
3401
+ if (ct === "finish") {
3063
3402
  if (chunk.reason?.kind === "error") {
3064
3403
  streamed.add(key);
3065
- const msg = chunk.reason.failure?.message || chunk.reason.error?.message || "dsh \u751F\u6210\u51FA\u9519";
3404
+ const msg = chunk.reason.failure?.message || chunk.reason.error?.message || t2("adapter.errDshGenerate");
3066
3405
  emit(sessionID, mid, { id: "err", type: "text", text: "[dsh] " + msg, complete: true });
3067
3406
  }
3068
3407
  return;
3069
3408
  }
3070
- if (t2 === "text-delta" && typeof chunk.text === "string") {
3409
+ if (ct === "text-delta" && typeof chunk.text === "string") {
3071
3410
  streamed.add(key);
3072
3411
  emit(sessionID, mid, { id: `t${chunk.index ?? 0}`, type: "text", delta: chunk.text });
3073
3412
  return;
3074
3413
  }
3075
- if (t2 === "reasoning-delta" && typeof chunk.text === "string") {
3414
+ if (ct === "reasoning-delta" && typeof chunk.text === "string") {
3076
3415
  streamed.add(key);
3077
3416
  emit(sessionID, mid, { id: `r${chunk.index ?? 0}`, type: "thinking", delta: chunk.text });
3078
3417
  return;
@@ -3164,7 +3503,7 @@ async function sessionExists(sp, sessionId) {
3164
3503
  const headers = await sp.list().catch(() => []);
3165
3504
  return headers.some((h) => h.id === sessionId);
3166
3505
  }
3167
- async function sessionInfo(sp, h) {
3506
+ async function sessionInfo(sp, h, t2) {
3168
3507
  let events = [];
3169
3508
  let updated = h.createdAt;
3170
3509
  try {
@@ -3175,19 +3514,19 @@ async function sessionInfo(sp, h) {
3175
3514
  }
3176
3515
  return {
3177
3516
  id: h.id,
3178
- title: titleOf(events) || "dsh \u4F1A\u8BDD",
3517
+ title: titleOf(events) || t2("adapter.newSessionTitle"),
3179
3518
  created: h.createdAt,
3180
3519
  updated,
3181
3520
  status: "idle",
3182
3521
  workspace: h.cwd
3183
3522
  };
3184
3523
  }
3185
- async function listSessions(sp, workspace) {
3524
+ async function listSessions(sp, workspace, t2) {
3186
3525
  const headers = await sp.list().catch(() => []);
3187
3526
  const out = [];
3188
3527
  for (const h of headers) {
3189
3528
  if (workspace && h.cwd !== workspace) continue;
3190
- const s = await sessionInfo(sp, h);
3529
+ const s = await sessionInfo(sp, h, t2);
3191
3530
  if (s) out.push(s);
3192
3531
  }
3193
3532
  return out.sort((a, b) => b.updated - a.updated);
@@ -3245,7 +3584,7 @@ function findDir(dir, name2) {
3245
3584
  }
3246
3585
 
3247
3586
  // src/bridge.ts
3248
- var VERSION = true ? "0.1.21" : "0.0.0-dev";
3587
+ var VERSION = true ? "0.1.22" : "0.0.0-dev";
3249
3588
  var AGENT_TYPE = "dsh";
3250
3589
  var APPROVAL_TIMEOUT_MS = 12e4;
3251
3590
  var ADAPTER_COMMANDS = [
@@ -3445,7 +3784,7 @@ ${err.stack}` : ""));
3445
3784
  const payload = env.payload;
3446
3785
  const sessions = /* @__PURE__ */ new Map();
3447
3786
  if (sp) {
3448
- for (const s of await listSessions(sp, payload?.workspace)) sessions.set(s.id, s);
3787
+ for (const s of await listSessions(sp, payload?.workspace, this.t)) sessions.set(s.id, s);
3449
3788
  }
3450
3789
  for (const [id, h] of this.handles) {
3451
3790
  const events = [...liveSessionEvents(h.agent.session)];
@@ -3727,7 +4066,7 @@ ${err.stack}` : ""));
3727
4066
  if (!gw || !this.remoteClientId) return;
3728
4067
  void gw.dispatchRpc("$events/result", { args: { clientId: this.remoteClientId, eventId, outcome } }).then(
3729
4068
  (res) => {
3730
- if (res && res.ok === false) this.log(this.t("adapter.logResultRejected", { eventId, message: res.error?.message ?? "unknown" }));
4069
+ if (res && res.ok === false) this.log(this.t("adapter.logResultRejected", { eventId, message: res.error?.message ?? this.t("adapter.unknown") }));
3731
4070
  },
3732
4071
  (e) => this.log(this.t("adapter.logResultBackfillFailed", { eventId, message: e.message }))
3733
4072
  );
@@ -4014,7 +4353,7 @@ ${err.stack}` : ""));
4014
4353
  onSessionEvent(sessionID, event) {
4015
4354
  const sid = String(sessionID);
4016
4355
  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);
4356
+ streamEventTo(sid, event, (s, mid, part) => this.send(envelope("message.part", { sessionID: s, messageID: mid, part })), this.streamedTurns, this.t);
4018
4357
  const t2 = event.type;
4019
4358
  if (t2 === "turn/start") this.send(envelope("session.status", { sessionID: sid, status: "running" }));
4020
4359
  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.22",
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.22",
40
40
  "@types/node": "^22.0.0",
41
41
  "esbuild": "^0.24.0",
42
42
  "typescript": "^5.4.5"