@tunnelbox/dsh-tunnelbox 0.1.18 → 0.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +1217 -76
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -3,10 +3,6 @@
|
|
|
3
3
|
// src/index.ts
|
|
4
4
|
import Schema from "@deepseek-ai/schemastery";
|
|
5
5
|
|
|
6
|
-
// src/bridge.ts
|
|
7
|
-
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
8
|
-
import { hostname } from "node:os";
|
|
9
|
-
|
|
10
6
|
// ../core/dist/index.js
|
|
11
7
|
import { randomBytes } from "crypto";
|
|
12
8
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
@@ -203,7 +199,7 @@ var zh_CN_default = {
|
|
|
203
199
|
"install.scanHint": "\u624B\u673A\u6253\u5F00 tunnelbox App\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\uFF0C\u626B\u63CF\u4E0A\u65B9\u4E8C\u7EF4\u7801\u5373\u53EF\u8FDE\u63A5\uFF1A",
|
|
204
200
|
"pair.heading": "tunnelbox \u624B\u673A\u914D\u5BF9",
|
|
205
201
|
"pair.howTo": "\u5728\u624B\u673A\u4E0A\u6253\u5F00 tunnelbox App\uFF0C\u7528\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\u626B\u63CF\u4E0A\u65B9\u4E8C\u7EF4\u7801\uFF0C\u6216\u624B\u52A8\u8F93\u5165\u914D\u5BF9\u7801\u3002",
|
|
206
|
-
"pair.oneTime": "\u914D\u5BF9\u7801\u4E3A\u4E00\u6B21\u6027\uFF0C\u4F7F\u7528\u540E\u5373\u5931\u6548\
|
|
202
|
+
"pair.oneTime": "\u914D\u5BF9\u7801\u4E3A\u4E00\u6B21\u6027\uFF0C\u7EA6 10 \u5206\u949F\u5185\u6709\u6548\uFF1B\u4F7F\u7528\u6216\u8FC7\u671F\u540E\u5373\u5931\u6548\uFF0C\u5982\u9700\u65B0\u7801\u53EF\u8981\u6C42\u201C\u5237\u65B0\u914D\u5BF9\u7801\u201D\u3002",
|
|
207
203
|
"pair.promptBody": "\u8BF7\u5E2E\u6211\u67E5\u770B\u672C\u673A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u4FE1\u606F\uFF1A\u663E\u793A\u914D\u5BF9\u7801\u4E0E\u53EF\u4F9B\u626B\u7801\u7684\u4E8C\u7EF4\u7801\u3002\u4E8C\u7EF4\u7801\u8BF7\u653E\u5728\u7B49\u5BBD\u4EE3\u7801\u5757\u91CC\u5E76\u9010\u5B57\u539F\u6837\u4FDD\u7559\uFF0C\u65B9\u4FBF\u6211\u7528\u624B\u673A\u626B\u7801\u3002",
|
|
208
204
|
"pair.promptDescription": "\u663E\u793A\u624B\u673A\u8FDC\u7A0B\u914D\u5BF9\u7684\u914D\u5BF9\u7801\u4E0E\u626B\u7801\u4E8C\u7EF4\u7801",
|
|
209
205
|
"pair.scanIntro": "**\u626B\u4E00\u626B\u914D\u5BF9**\uFF1A\u624B\u673A\u6253\u5F00 tunnelbox App\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\uFF0C\u626B\u63CF\u4E0B\u65B9\u4E8C\u7EF4\u7801\u5373\u53EF\u81EA\u52A8\u8FDE\u63A5\u3002",
|
|
@@ -318,7 +314,148 @@ var zh_CN_default = {
|
|
|
318
314
|
"hermes.pairTimeout": "\u7533\u8BF7\u914D\u5BF9\u7801\u8D85\u65F6\uFF08\u4E2D\u7EE7\u672A\u54CD\u5E94\uFF09",
|
|
319
315
|
"hermes.errToolPair": "tunnelbox_pair \u5931\u8D25: {err}",
|
|
320
316
|
"hermes.errToolStatus": "tunnelbox_status \u5931\u8D25: {err}",
|
|
321
|
-
"hermes.cliUsage": "\u7528\u6CD5: /tunnelbox <pair|status>\n pair \u5411\u4E2D\u7EE7\u7533\u8BF7\u624B\u673A\u914D\u5BF9\u7801\u5E76\u6253\u5370\n status \u663E\u793A\u4E2D\u7EE7/\u7ED1\u5B9A/\u8FDE\u63A5\u72B6\u6001"
|
|
317
|
+
"hermes.cliUsage": "\u7528\u6CD5: /tunnelbox <pair|status>\n pair \u5411\u4E2D\u7EE7\u7533\u8BF7\u624B\u673A\u914D\u5BF9\u7801\u5E76\u6253\u5370\n status \u663E\u793A\u4E2D\u7EE7/\u7ED1\u5B9A/\u8FDE\u63A5\u72B6\u6001",
|
|
318
|
+
"qr.validFor": "\u914D\u5BF9\u7801\u7EA6 10 \u5206\u949F\u5185\u6709\u6548\uFF0C\u8FC7\u671F\u8BF7\u5728\u7535\u8111\u7AEF\u91CD\u65B0\u83B7\u53D6\u3002",
|
|
319
|
+
"pair.toolDesc": "\u663E\u793A\u672C\u673A\u7684\u624B\u673A\u914D\u5BF9\u4FE1\u606F\uFF08\u914D\u5BF9\u7801\u4E0E\u53EF\u626B\u63CF\u4E8C\u7EF4\u7801\uFF09\u3002\u5F53\u7528\u6237\u8BE2\u95EE\u914D\u5BF9\u3001\u626B\u63CF\u4E8C\u7EF4\u7801\u6216\u7528\u624B\u673A\u63A7\u5236\u672C\u673A\u65F6\u8C03\u7528\u3002",
|
|
320
|
+
"pair.toolRefreshDesc": "\u662F\u5426\u5411\u4E2D\u7EE7\u7533\u8BF7\u65B0\u7684\u914D\u5BF9\u7801",
|
|
321
|
+
"state.errSaveState": "\u4FDD\u5B58\u72B6\u6001\u5931\u8D25",
|
|
322
|
+
"adapter.logConnected": "\u5DF2\u8FDE\u63A5\u4E2D\u7EE7 {url}",
|
|
323
|
+
"adapter.logDisconnected": "\u4E0E\u4E2D\u7EE7\u65AD\u5F00\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE\u2026",
|
|
324
|
+
"adapter.logPairCode": "\u751F\u6210\u914D\u5BF9\u7801: {code}",
|
|
325
|
+
"adapter.logClaimed": "\u5DF2\u7ED1\u5B9A\u5230\u624B\u673A\u8D26\u53F7\uFF0C\u4E4B\u540E\u624B\u673A\u4ECE\u300C\u6211\u7684\u7535\u8111\u300D\u76F4\u63A5\u8FDE\u63A5",
|
|
326
|
+
"adapter.logResetIdentity": "\u88AB\u8D26\u53F7\u89E3\u7ED1\uFF0C\u6B63\u5728\u91CD\u7F6E\u8EAB\u4EFD\u5E76\u91CD\u65B0\u751F\u6210\u914D\u5BF9\u7801\u2026",
|
|
327
|
+
"adapter.logUnhandledType": "\u672A\u5904\u7406\u7684\u6D88\u606F\u7C7B\u578B: {type}",
|
|
328
|
+
"adapter.errNoRelay": "\u672A\u914D\u7F6E\u4E2D\u7EE7\u5730\u5740\uFF1A\u6784\u5EFA\u65F6\u7528 --env \u6CE8\u5165\u9ED8\u8BA4\u503C\uFF0C\u6216\u8FD0\u884C\u65F6\u7528 TUNNELBOX_RELAY_URL \u8986\u76D6",
|
|
329
|
+
"adapter.errBusy": "\u8BE5\u4F1A\u8BDD\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
|
|
330
|
+
"adapter.errBadWorkspaceEmpty": "\u7F3A\u5C11\u5DE5\u4F5C\u533A\u8DEF\u5F84",
|
|
331
|
+
"adapter.errBadWorkspaceNotDir": "\u8BE5\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528",
|
|
332
|
+
"adapter.errWorkspaceMissing": "\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728: {dir}",
|
|
333
|
+
"adapter.cmdNew": "\u65B0\u5EFA\u4F1A\u8BDD",
|
|
334
|
+
"adapter.cmdHelp": "\u663E\u793A\u5E2E\u52A9",
|
|
335
|
+
"adapter.helpText": "\u652F\u6301\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u5EFA\u4F1A\u8BDD\n- /help \u663E\u793A\u5E2E\u52A9",
|
|
336
|
+
"adapter.newSessionTitle": "\u65B0\u4F1A\u8BDD",
|
|
337
|
+
"install.langHelpTitle": "install-local \u652F\u6301\u8BED\u8A00\uFF08--lang <tag>\uFF09\uFF1A",
|
|
338
|
+
"install.langHelpExample": "\u793A\u4F8B: npm run install-local -- --lang de-DE",
|
|
339
|
+
"install.unknownLang": '\u672A\u77E5\u8BED\u8A00 "{raw}"\uFF0C\u5DF2\u56DE\u9000 en-US\u3002\u652F\u6301\uFF1A{list}',
|
|
340
|
+
"hermes.errAskRequired": "question \u5FC5\u586B",
|
|
341
|
+
"hermes.msgPhoneUnavailable": "\u624B\u673A\u4E0D\u53EF\u7528\u6216\u672A\u5E94\u7B54\uFF1A\u8BF7\u6539\u7528\u5185\u7F6E clarify \u5728\u672C\u673A\u63D0\u95EE\uFF0C\u6216\u81EA\u884C\u5224\u65AD\u7EE7\u7EED\u3002",
|
|
342
|
+
"hermes.errClarifyUnavailable": "clarify \u652F\u6301\u4E0D\u53EF\u7528",
|
|
343
|
+
"hermes.errAskFailed": "tunnelbox_ask \u5931\u8D25: {err}",
|
|
344
|
+
"hermes.errClarifyFailed": "clarify \u5931\u8D25: {err}",
|
|
345
|
+
"bin.denied": "\u624B\u673A\u5DF2\u62D2\u7EDD",
|
|
346
|
+
"bin.timeout": "\u5BA1\u6279\u8D85\u65F6\uFF08fail-closed\uFF09",
|
|
347
|
+
"bin.reqRun": "Claude Code \u8BF7\u6C42\u6267\u884C {tool}",
|
|
348
|
+
"bin.pairTitle": "tunnelbox \u624B\u673A\u914D\u5BF9",
|
|
349
|
+
"bin.pairCodeLine": " \u914D\u5BF9\u7801: {code}",
|
|
350
|
+
"bin.pairHint": "\u6253\u5F00 tunnelbox App\uFF0C\u7528\u300C\u626B\u4E00\u626B\u914D\u5BF9\u300D\u626B\u63CF\u4E8C\u7EF4\u7801\uFF0C\u6216\u624B\u52A8\u8F93\u5165\u914D\u5BF9\u7801\uFF08\u4E00\u6B21\u6027\uFF09\u3002",
|
|
351
|
+
"bin.pairWritten": " \u914D\u5BF9\u4FE1\u606F\u5DF2\u5199\u5165: {path}",
|
|
352
|
+
"bin.pairRequestFailed": "\u5411\u4E2D\u7EE7\u7533\u8BF7\u914D\u5BF9\u7801\u5931\u8D25\u3002",
|
|
353
|
+
"bin.alreadyClaimed": "\u672C\u673A\u5DF2\u7ED1\u5B9A\u624B\u673A\u8D26\u53F7\uFF0C\u53EF\u76F4\u63A5\u5728\u624B\u673A\u300C\u6211\u7684\u7535\u8111\u300D\u91CC\u8FDE\u63A5\uFF1B\u5982\u9700\u91CD\u65B0\u914D\u5BF9\uFF0C\u8BF7\u5148\u5728\u624B\u673A\u7AEF\u89E3\u7ED1\u3002",
|
|
354
|
+
"bin.noRelay": "\u672A\u914D\u7F6E\u4E2D\u7EE7\u5730\u5740\uFF1A\u8BF7\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF TUNNELBOX_RELAY_URL \u540E\u91CD\u8BD5\u3002",
|
|
355
|
+
"bin.connectFailed": "\u65E0\u6CD5\u8FDE\u63A5\u4E2D\u7EE7\uFF1A{relay}\n\u8BF7\u8BBE\u7F6E TUNNELBOX_RELAY_URL \u6216\u5728\u5B98\u65B9-plugin \u72B6\u6001\u6587\u4EF6\u4E2D\u914D\u7F6E\u3002",
|
|
356
|
+
"bin.statusRelay": "\u4E2D\u7EE7: {value}",
|
|
357
|
+
"bin.statusAgent": "agent \u6807\u8BC6: {value}",
|
|
358
|
+
"bin.statusClaimed": "\u5DF2\u7ED1\u5B9A\u624B\u673A: {value}",
|
|
359
|
+
"bin.statusStateFile": "\u72B6\u6001\u6587\u4EF6: {value}",
|
|
360
|
+
"bin.statusLatest": "\u6700\u65B0\u914D\u5BF9\u4FE1\u606F\uFF1A",
|
|
361
|
+
"bin.usage": "\u7528\u6CD5: tunnelbox <pair|status|ask>",
|
|
362
|
+
"bin.usagePair": " pair \u53D6\u624B\u673A\u914D\u5BF9\u7801\u5E76\u6253\u5370",
|
|
363
|
+
"bin.usageStatus": " status \u663E\u793A\u4E2D\u7EE7/\u7ED1\u5B9A\u72B6\u6001",
|
|
364
|
+
"bin.usageAsk": " ask \u628A\u5DE5\u5177\u5BA1\u6279\u8F6C\u53D1\u5230\u624B\u673A",
|
|
365
|
+
"adapter.logMsgUncaught": "\u6D88\u606F\u5904\u7406\u672A\u6355\u83B7\u5F02\u5E38: {message}",
|
|
366
|
+
"adapter.logHandleFailed": "\u5904\u7406 {type} \u5931\u8D25: {message}",
|
|
367
|
+
"adapter.logPromptFailed": "session.prompt \u5931\u8D25: {message}",
|
|
368
|
+
"adapter.logAbortSent": "\u5DF2\u53D1\u9001\u4E2D\u6B62 (session={session})",
|
|
369
|
+
"adapter.errUserDenied": "\u7528\u6237\u62D2\u7EDD",
|
|
370
|
+
"adapter.logPendingResent": "session.pending \u8865\u53D1\u5F85\u5BA1\u6279 {count} \u6761",
|
|
371
|
+
"adapter.logWorkspaceSwitched": "\u5207\u6362\u5DE5\u4F5C\u533A: {path}",
|
|
372
|
+
"adapter.logNewSession": "\u65B0\u4F1A\u8BDD\u843D\u76D8 codexId={codexId} (alias={session})",
|
|
373
|
+
"adapter.logSessionError": "\u56DE\u5408\u51FA\u9519 (session={session}): {message}",
|
|
374
|
+
"adapter.logDshSent": "\u5DF2\u53D1\u9001\u5230 dsh (session={session})",
|
|
375
|
+
"adapter.logReadHistoryFailed": "\u8BFB\u53D6\u4F1A\u8BDD\u5386\u53F2\u5931\u8D25({session}): {message}",
|
|
376
|
+
"adapter.logAnswererInitFailed": "\u5E94\u7B54\u5668\u521D\u59CB\u5316\u5931\u8D25: {message}",
|
|
377
|
+
"adapter.logRemoteMode": "\u53CC\u7AEF\u540C\u663E\u6A21\u5F0F\uFF1A\u9009\u62E9/\u5BA1\u6279\u8D70 typert \u591A\u7AEF\u5E7F\u64AD\uFF0C\u624B\u673A\u4E0E dsh web \u540C\u663E\u3001\u8C01\u7B54\u8C01\u5F97",
|
|
378
|
+
"adapter.logRemoteProbeFailed": "typert \u8FDC\u7A0B\u4E8B\u4EF6\u6E90\u63A2\u6D4B\u5931\u8D25\uFF0C\u56DE\u9000\u672C\u5730\u5E94\u7B54\u6A21\u5F0F: {message}",
|
|
379
|
+
"adapter.logLocalMode": "\u672C\u5730\u5E94\u7B54\u6A21\u5F0F\uFF1A\u9009\u62E9/\u5BA1\u6279\u7531\u624B\u673A\u4F5C\u7B54\uFF08headless\uFF0C\u65E0 dsh web \u5E7F\u64AD\uFF09",
|
|
380
|
+
"adapter.logRemoteStreamInterrupted": "remote events \u6D41\u4E2D\u65AD: {message}",
|
|
381
|
+
"adapter.logResultRejected": "$events/result \u672A\u63A5\u53D7({eventId}): {message}",
|
|
382
|
+
"adapter.logResultBackfillFailed": "$events/result \u56DE\u586B\u5931\u8D25({eventId}): {message}",
|
|
383
|
+
"adapter.logRemoteQuestion": "remote \u63D0\u95EE\u5E7F\u64AD \u2192 \u624B\u673A\u63D0\u95EE\u5361 questionID={id} (session={session})",
|
|
384
|
+
"adapter.errRemoteReadyFrame": "remote events \u9996\u5E27\u5F02\u5E38",
|
|
385
|
+
"adapter.logRemoteApproval": "remote \u5BA1\u6279\u5E7F\u64AD \u2192 \u624B\u673A\u6743\u9650\u5361 permissionID={id} (session={session})",
|
|
386
|
+
"adapter.logUserQuestionRoute": "user-questions \u9009\u62E9 \u2192 \u8DEF\u7531 session={session}",
|
|
387
|
+
"adapter.errDshQuestionEmpty": "dsh \u63D0\u95EE\u5185\u5BB9\u4E3A\u7A7A",
|
|
388
|
+
"adapter.errQuestionTimeout": "\u63D0\u95EE\u8D85\u65F6({seconds}s)\uFF0C\u5DF2\u53D6\u6D88",
|
|
389
|
+
"adapter.errQuestionCancelledAbort": "\u63D0\u95EE\u5DF2\u53D6\u6D88\uFF08agent \u4E2D\u6B62\uFF09",
|
|
390
|
+
"adapter.errQuestionCancelledRelay": "\u4E2D\u7EE7\u4E0D\u53EF\u8FBE\uFF0C\u63D0\u95EE\u5DF2\u53D6\u6D88",
|
|
391
|
+
"adapter.logQuestionToPhone": "user-questions \u9009\u62E9 \u2192 \u53D1\u9001\u5230\u624B\u673A\u63D0\u95EE\u5361 questionID={id} (session={session})",
|
|
392
|
+
"adapter.errQuestionUserCancelled": "\u7528\u6237\u5728\u624B\u673A\u7AEF\u53D6\u6D88/\u62D2\u7EDD\u4E86\u63D0\u95EE",
|
|
393
|
+
"adapter.logApprovalRequest": "\u5BA1\u6279\u8BF7\u6C42(tool={tool}) \u2192 \u53D1\u9001\u5230\u624B\u673A\u6743\u9650\u5361 permissionID={id}",
|
|
394
|
+
"adapter.logAgentPresetFailed": "agentPreset \u89E3\u6790\u5931\u8D25({preset})\uFF0C\u964D\u7EA7\u4E3A\u65E0 preset: {message}",
|
|
395
|
+
"adapter.logSessionLiveAdopted": "\u4F1A\u8BDD {session} \u5DF2\u7531\u672C\u8FDB\u7A0B\u5176\u5B83 agent \u6301\u6709\uFF08live\uFF09\uFF0C\u91C7\u7EB3\u73B0\u6709 agent \u7EE7\u7EED\u9A71\u52A8: {message}",
|
|
396
|
+
"adapter.logDisposeSkipped": "\u5DF2\u91C7\u7EB3\u7684\u5916\u90E8 live agent \u4E0D\u6267\u884C dispose\uFF08\u4F1A\u8BDD {session} \u7531\u539F\u6301\u6709\u8005\u7BA1\u7406\uFF09",
|
|
397
|
+
"adapter.logAgentCreateFailed": "\u521B\u5EFA/\u6062\u590D agent \u5931\u8D25({session}): {message}",
|
|
398
|
+
"adapter.errSessionBusyLive": "\u4F1A\u8BDD {session} \u6B63\u88AB\u5360\u7528\uFF08live\uFF09\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5",
|
|
399
|
+
"adapter.errAgentsUnavailable": "agents \u670D\u52A1\u4E0D\u53EF\u7528",
|
|
400
|
+
"adapter.logToolReason": "dsh \u8BF7\u6C42\u6267\u884C\u5DE5\u5177 {tool}",
|
|
401
|
+
"adapter.logGatewayConnected": "\u5DF2\u8FDE\u63A5\u672C\u673A OpenClaw Gateway\uFF08{version}\uFF09",
|
|
402
|
+
"adapter.logGatewayDisconnected": "\u4E0E OpenClaw Gateway \u65AD\u5F00\uFF0C\u6B63\u5728\u7531\u5B98\u65B9\u5BA2\u6237\u7AEF\u91CD\u8FDE\u2026",
|
|
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.errGatewayNoSessionKey": "Gateway \u672A\u8FD4\u56DE\u4F1A\u8BDD key",
|
|
405
|
+
"adapter.logDeleteSessionFailed": "\u5220\u9664\u4F1A\u8BDD\u5931\u8D25({session}): {message}\uFF08\u4ECD\u6309\u5DF2\u5220\u9664\u56DE\u6267\uFF09",
|
|
406
|
+
"adapter.logApprovalReplyFailed": "\u5BA1\u6279\u5E94\u7B54\u5931\u8D25({id}): {message}",
|
|
407
|
+
"adapter.logPendingApproval": "session.pending \u8865\u53D1\u5F85\u5BA1\u6279 {count} \u6761 (session={session})",
|
|
408
|
+
"adapter.workspaceDefault": "\u9ED8\u8BA4",
|
|
409
|
+
"adapter.cursorSessionTitle": "Cursor \u4F1A\u8BDD",
|
|
410
|
+
"adapter.reasonDisconnect": "\u4E2D\u7EE7\u65AD\u5F00\uFF0C\u81EA\u52A8\u62D2\u7EDD\uFF08fail-closed\uFF09",
|
|
411
|
+
"adapter.warnInvalidEnv": "\u5FFD\u7565\u65E0\u6548 {name}: {raw}\uFF08{list}\uFF09",
|
|
412
|
+
"adapter.errStartFailed": "\u542F\u52A8\u5931\u8D25:",
|
|
413
|
+
"adapter.msgStarted": "{name} \u9002\u914D\u5668\u5DF2\u542F\u52A8\uFF08Ctrl+C \u9000\u51FA\uFF09",
|
|
414
|
+
"adapter.warnCliMissing": "\u672A\u627E\u5230\u53EF\u6267\u884C\u6587\u4EF6\u300C{bin}\u300D\uFF1B\u8BF7\u5148\u5B89\u88C5\uFF08\u5982 npm i -g @openai/codex\uFF09\uFF0C\u6216\u7528 TUNNELBOX_CODEX_BIN \u6307\u5B9A\u53EF\u6267\u884C\u6587\u4EF6\u8DEF\u5F84",
|
|
415
|
+
"adapter.errCliNotFound": "\u672A\u627E\u5230 {name} \u53EF\u6267\u884C\u6587\u4EF6\u300C{bin}\u300D\uFF1A\u8BF7\u5B89\u88C5 Codex CLI\uFF08npm i -g @openai/codex\uFF09\u6216\u8BBE\u7F6E TUNNELBOX_CODEX_BIN",
|
|
416
|
+
"adapter.errSessionNotFound": "\u4F1A\u8BDD\u4E0D\u5B58\u5728\u6216\u5DF2\u88AB\u5220\u9664",
|
|
417
|
+
"adapter.checkHeader": "tunnelbox-codex \u73AF\u5883\u81EA\u68C0",
|
|
418
|
+
"adapter.checkCliOk": "{name} \u53EF\u6267\u884C\u6587\u4EF6: {path}",
|
|
419
|
+
"adapter.checkCliMissing": "\u672A\u627E\u5230 {name} \u53EF\u6267\u884C\u6587\u4EF6\uFF08{bin}\uFF09",
|
|
420
|
+
"bin.yes": "\u662F",
|
|
421
|
+
"bin.no": "\u5426",
|
|
422
|
+
"adapter.errAppServerSpawn": "\u65E0\u6CD5\u542F\u52A8 codex app-server\uFF1A{message}\uFF08\u8BF7\u786E\u8BA4 Codex CLI \u652F\u6301 `codex app-server`\uFF09",
|
|
423
|
+
"adapter.errAppServerExit": "codex app-server \u5DF2\u9000\u51FA\uFF0C\u8FDB\u884C\u4E2D\u7684\u5BA1\u6279/\u9009\u62E9\u5DF2\u81EA\u52A8\u62D2\u7EDD",
|
|
424
|
+
"adapter.logUnsupportedServerRequest": "\u6682\u4E0D\u652F\u6301\u7684 app-server \u8BF7\u6C42: {method}",
|
|
425
|
+
"adapter.logQuestionNative": "\u9009\u62E9\u8BF7\u6C42 \u2192 \u624B\u673A\u9009\u62E9\u5361 questionID={id} (session={session})",
|
|
426
|
+
"adapter.logPermissionNative": "\u5BA1\u6279\u8BF7\u6C42 \u2192 \u624B\u673A\u6743\u9650\u5361 permissionID={id} (session={session})",
|
|
427
|
+
"adapter.checkAppServerOk": "codex app-server \u53EF\u7528",
|
|
428
|
+
"adapter.checkAppServerMissing": "\u5F53\u524D Codex CLI \u4E0D\u652F\u6301 `codex app-server`\uFF08\u8BF7\u5347\u7EA7 Codex CLI\uFF09",
|
|
429
|
+
"adapter.warnCursorCliMissing": '\u672A\u627E\u5230 Cursor CLI \u53EF\u6267\u884C\u6587\u4EF6 "{bin}"\uFF1A\u8BF7\u5B89\u88C5\uFF08https://cursor.com/docs/cli\uFF09\uFF0C\u6216\u7528 TUNNELBOX_CURSOR_BIN \u6307\u5B9A\u8DEF\u5F84',
|
|
430
|
+
"adapter.checkCursorCliMissing": "\u672A\u627E\u5230 Cursor CLI \u53EF\u6267\u884C\u6587\u4EF6\uFF08{bin}\uFF09\uFF1A\u8BF7\u4ECE https://cursor.com/docs/cli \u5B89\u88C5",
|
|
431
|
+
"adapter.checkCursorAcpHint": "\u5DF2\u68C0\u6D4B\u5230 Cursor CLI\uFF1B\u5C06\u4F7F\u7528 ACP \u6A21\u5F0F\uFF08`agent acp`\uFF09\u63D0\u4F9B\u6D41\u5F0F/\u5BA1\u6279/\u9009\u62E9",
|
|
432
|
+
"adapter.errAcpSpawn": "\u542F\u52A8 cursor `agent acp` \u5931\u8D25\uFF1A{message}\uFF08\u8BF7\u786E\u8BA4 Cursor CLI \u652F\u6301 `agent acp`\uFF09",
|
|
433
|
+
"adapter.errAcpNoSession": "Cursor ACP \u672A\u8FD4\u56DE\u4F1A\u8BDD id",
|
|
434
|
+
"adapter.logResumeFailed": "\u4F1A\u8BDD\u6062\u590D\u5931\u8D25\uFF0C\u6539\u4E3A\u65B0\u5EFA\u4F1A\u8BDD\uFF1A{message}",
|
|
435
|
+
"adapter.logPlanNative": "\u8BA1\u5212\u5BA1\u6279 \u2192 \u624B\u673A\u5BA1\u6279\u5361 permissionID={id} (session={session})",
|
|
436
|
+
"adapter.errTimeout": "\u7B49\u5F85\u8D85\u65F6\uFF0C\u81EA\u52A8\u62D2\u7EDD\uFF08fail-closed\uFF09",
|
|
437
|
+
"adapter.planApprovalPrompt": "Cursor \u8BF7\u6C42\u6279\u51C6\u4E00\u9879\u8BA1\u5212",
|
|
438
|
+
"adapter.checkCursorHeader": "tunnelbox-cursor \u73AF\u5883\u81EA\u68C0",
|
|
439
|
+
"adapter.errAskBridge": "\u542F\u52A8 ask \u6865\u5931\u8D25\uFF1A{message}",
|
|
440
|
+
"adapter.logAskBridge": "MCP ask \u6865\u5DF2\u76D1\u542C {url}",
|
|
441
|
+
"cursor.mcpAskDesc": "\u8BA9\u7528\u6237\u5728\u624B\u673A\u4E0A\uFF08tunnelbox\uFF09\u505A\u9009\u62E9\uFF0C\u5E76\u963B\u585E\u7B49\u5F85\u5176\u4F5C\u7B54\u3002\u53EA\u8981\u9700\u8981\u7528\u6237\u5728\u7EE7\u7EED\u524D\u4E8E\u82E5\u5E72\u9009\u9879\u4E2D\u505A\u51FA\u9009\u62E9\uFF08\u5982\u9009\u83DC\u3001\u9009\u6A21\u5F0F\u3001\u9009\u65B9\u6848\uFF09\u5C31\u8C03\u7528\u5B83\u3002\u8FD4\u56DE\u7528\u6237\u6240\u9009\u7684\u9009\u9879\u6587\u672C\u3002",
|
|
442
|
+
"cursor.mcpAskTitleDesc": "\u624B\u673A\u5361\u7247\u4E0A\u663E\u793A\u7684\u6807\u9898\uFF08\u53EF\u9009\uFF09",
|
|
443
|
+
"cursor.mcpAskQuestionsDesc": "\u4E00\u4E2A\u6216\u591A\u4E2A\u95EE\u9898\uFF1B\u6BCF\u4E2A\u95EE\u9898\u5E26\u53EF\u9009\u9879",
|
|
444
|
+
"cursor.mcpPlanDesc": "\u8BA9\u7528\u6237\u5728\u624B\u673A\u4E0A\uFF08tunnelbox\uFF09\u6279\u51C6\u4E00\u9879\u8BA1\u5212\uFF0C\u5E76\u963B\u585E\u7B49\u5F85\u5176\u5E94\u7B54\u3002\u8FD4\u56DE\u8BA1\u5212\u662F\u5426\u88AB\u63A5\u53D7\u3002",
|
|
445
|
+
"cursor.mcpNoBridge": "tunnelbox ask \u6865\u4E0D\u53EF\u7528",
|
|
446
|
+
"cursor.mcpUnanswered": "\u7528\u6237\u672A\u5728\u624B\u673A\u4E0A\u4F5C\u7B54\uFF08\u79BB\u7EBF\u6216\u8D85\u65F6\uFF09\u3002\u8BF7\u7EE7\u7EED\uFF0C\u6216\u7528\u5BF9\u8BDD\u65B9\u5F0F\u8BE2\u95EE\u3002",
|
|
447
|
+
"cursor.mcpRejected": "\u7528\u6237\u5728\u624B\u673A\u4E0A\u62D2\u7EDD\u4E86\u8FD9\u4E2A\u63D0\u95EE\u3002",
|
|
448
|
+
"cursor.mcpAnswersHeader": "\u7528\u6237\uFF08\u624B\u673A\uFF09\u7684\u9009\u62E9\uFF1A",
|
|
449
|
+
"cursor.mcpAccepted": "\u7528\u6237\u5DF2\u63A5\u53D7\u8BE5\u8BA1\u5212\u3002",
|
|
450
|
+
"cursor.mcpDenied": "\u7528\u6237\u62D2\u7EDD\u4E86\u8BE5\u8BA1\u5212\u3002",
|
|
451
|
+
"cursor.mcpPlanUnanswered": "\u7528\u6237\u672A\u5728\u624B\u673A\u4E0A\u56DE\u5E94\u8BA1\u5212\uFF08\u79BB\u7EBF\u6216\u8D85\u65F6\uFF09\u3002",
|
|
452
|
+
"cursor.mcpAskNoQuestions": "\u672A\u63D0\u4F9B\u4EFB\u4F55\u95EE\u9898\u3002",
|
|
453
|
+
"cursor.mcpFailed": "tunnelbox ask \u8C03\u7528\u5931\u8D25",
|
|
454
|
+
"adapter.errCursorExitCode": "Cursor CLI \u9000\u51FA\u7801 {code}",
|
|
455
|
+
"adapter.errCursorExit": "Cursor CLI \u9000\u51FA({code}): {err}",
|
|
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
|
+
"adapter.errCursorStart": "Cursor CLI \u542F\u52A8\u5931\u8D25: {message}",
|
|
458
|
+
"adapter.errCursorGeneric": "Cursor \u51FA\u9519"
|
|
322
459
|
};
|
|
323
460
|
var zh_TW_default = {
|
|
324
461
|
"agent.err.createSession": "\u5EFA\u7ACB\u6703\u8A71\u5931\u6557",
|
|
@@ -369,7 +506,7 @@ var zh_TW_default = {
|
|
|
369
506
|
"install.scanHint": "\u624B\u6A5F\u958B\u555F tunnelbox App\u300C\u6383\u63CF\u914D\u5C0D\u300D\uFF0C\u6383\u63CF\u4E0A\u65B9 QR Code \u5373\u53EF\u9023\u63A5\uFF1A",
|
|
370
507
|
"pair.heading": "tunnelbox \u624B\u6A5F\u914D\u5C0D",
|
|
371
508
|
"pair.howTo": "\u5728\u624B\u6A5F\u4E0A\u958B\u555F tunnelbox App\uFF0C\u7528\u300C\u6383\u63CF\u914D\u5C0D\u300D\u6383\u63CF\u4E0A\u65B9 QR Code\uFF0C\u6216\u624B\u52D5\u8F38\u5165\u914D\u5C0D\u78BC\u3002",
|
|
372
|
-
"pair.oneTime": "\u914D\u5C0D\u78BC\u70BA\u4E00\u6B21\u6027\uFF0C\u4F7F\u7528\u5F8C\u5373\u5931\u6548\
|
|
509
|
+
"pair.oneTime": "\u914D\u5C0D\u78BC\u70BA\u4E00\u6B21\u6027\uFF0C\u7D04 10 \u5206\u9418\u5167\u6709\u6548\uFF1B\u4F7F\u7528\u6216\u904E\u671F\u5F8C\u5373\u5931\u6548\uFF0C\u5982\u9700\u65B0\u78BC\u53EF\u8981\u6C42\u300C\u91CD\u65B0\u6574\u7406\u914D\u5C0D\u78BC\u300D\u3002",
|
|
373
510
|
"pair.promptBody": "\u8ACB\u5E6B\u6211\u67E5\u770B\u672C\u6A5F\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u8CC7\u8A0A\uFF1A\u986F\u793A\u914D\u5C0D\u78BC\u8207\u53EF\u4F9B\u6383\u78BC\u7684 QR Code\u3002QR Code \u8ACB\u653E\u5728\u7B49\u5BEC\u7A0B\u5F0F\u78BC\u5340\u584A\u5167\u4E26\u9010\u5B57\u539F\u6A23\u4FDD\u7559\uFF0C\u65B9\u4FBF\u6211\u7528\u624B\u6A5F\u6383\u63CF\u3002",
|
|
374
511
|
"pair.promptDescription": "\u986F\u793A\u624B\u6A5F\u9060\u7AEF\u914D\u5C0D\u7684\u914D\u5C0D\u78BC\u8207\u6383\u78BC QR Code",
|
|
375
512
|
"pair.scanIntro": "**\u6383\u78BC\u914D\u5C0D**\uFF1A\u624B\u6A5F\u958B\u555F tunnelbox App\u300C\u6383\u63CF\u914D\u5C0D\u300D\uFF0C\u6383\u63CF\u4E0B\u65B9 QR Code \u5373\u53EF\u81EA\u52D5\u9023\u63A5\u3002",
|
|
@@ -484,7 +621,148 @@ var zh_TW_default = {
|
|
|
484
621
|
"hermes.pairTimeout": "\u7533\u8ACB\u914D\u5C0D\u78BC\u903E\u6642\uFF08\u4E2D\u7E7C\u672A\u56DE\u61C9\uFF09",
|
|
485
622
|
"hermes.errToolPair": "tunnelbox_pair \u5931\u6557: {err}",
|
|
486
623
|
"hermes.errToolStatus": "tunnelbox_status \u5931\u6557: {err}",
|
|
487
|
-
"hermes.cliUsage": "\u7528\u6CD5: /tunnelbox <pair|status>\n pair \u5411\u4E2D\u7E7C\u7533\u8ACB\u624B\u6A5F\u914D\u5C0D\u78BC\u4E26\u5217\u5370\n status \u986F\u793A\u4E2D\u7E7C/\u7D81\u5B9A/\u9023\u7DDA\u72C0\u614B"
|
|
624
|
+
"hermes.cliUsage": "\u7528\u6CD5: /tunnelbox <pair|status>\n pair \u5411\u4E2D\u7E7C\u7533\u8ACB\u624B\u6A5F\u914D\u5C0D\u78BC\u4E26\u5217\u5370\n status \u986F\u793A\u4E2D\u7E7C/\u7D81\u5B9A/\u9023\u7DDA\u72C0\u614B",
|
|
625
|
+
"qr.validFor": "\u914D\u5C0D\u78BC\u7D04 10 \u5206\u9418\u5167\u6709\u6548\uFF0C\u904E\u671F\u8ACB\u5728\u96FB\u8166\u7AEF\u91CD\u65B0\u53D6\u5F97\u3002",
|
|
626
|
+
"pair.toolDesc": "\u986F\u793A\u672C\u6A5F\u7684\u624B\u6A5F\u914D\u5C0D\u8CC7\u8A0A\uFF08\u914D\u5C0D\u78BC\u8207\u53EF\u6383\u63CF QR code\uFF09\u3002\u7576\u4F7F\u7528\u8005\u8A62\u554F\u914D\u5C0D\u3001\u6383\u63CF QR code \u6216\u7528\u624B\u6A5F\u63A7\u5236\u672C\u6A5F\u6642\u547C\u53EB\u3002",
|
|
627
|
+
"pair.toolRefreshDesc": "\u662F\u5426\u5411\u4E2D\u7E7C\u7533\u8ACB\u65B0\u7684\u914D\u5C0D\u78BC",
|
|
628
|
+
"state.errSaveState": "\u5132\u5B58\u72C0\u614B\u5931\u6557",
|
|
629
|
+
"adapter.logConnected": "\u5DF2\u9023\u63A5\u4E2D\u7E7C {url}",
|
|
630
|
+
"adapter.logDisconnected": "\u8207\u4E2D\u7E7C\u65B7\u958B\uFF0C\u6B63\u5728\u81EA\u52D5\u91CD\u9023\u2026",
|
|
631
|
+
"adapter.logPairCode": "\u7522\u751F\u914D\u5C0D\u78BC: {code}",
|
|
632
|
+
"adapter.logClaimed": "\u5DF2\u7D81\u5B9A\u5230\u624B\u6A5F\u5E33\u865F\uFF0C\u4E4B\u5F8C\u624B\u6A5F\u5F9E\u300C\u6211\u7684\u96FB\u8166\u300D\u76F4\u63A5\u9023\u63A5",
|
|
633
|
+
"adapter.logResetIdentity": "\u88AB\u5E33\u865F\u89E3\u7D81\uFF0C\u6B63\u5728\u91CD\u8A2D\u8EAB\u5206\u4E26\u91CD\u65B0\u7522\u751F\u914D\u5C0D\u78BC\u2026",
|
|
634
|
+
"adapter.logUnhandledType": "\u672A\u8655\u7406\u7684\u8A0A\u606F\u985E\u578B: {type}",
|
|
635
|
+
"adapter.errNoRelay": "\u672A\u8A2D\u5B9A\u4E2D\u7E7C\u4F4D\u5740\uFF1A\u5EFA\u7F6E\u6642\u7528 --env \u6CE8\u5165\u9810\u8A2D\u503C\uFF0C\u6216\u57F7\u884C\u6642\u7528 TUNNELBOX_RELAY_URL \u8986\u5BEB",
|
|
636
|
+
"adapter.errBusy": "\u8A72\u5DE5\u4F5C\u968E\u6BB5\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u8ACB\u7B49\u5F85\u5B8C\u6210\u6216\u5148\u505C\u6B62",
|
|
637
|
+
"adapter.errBadWorkspaceEmpty": "\u7F3A\u5C11\u5DE5\u4F5C\u5340\u8DEF\u5F91",
|
|
638
|
+
"adapter.errBadWorkspaceNotDir": "\u8A72\u76EE\u9304\u4E0D\u5B58\u5728\u6216\u4E0D\u53EF\u7528",
|
|
639
|
+
"adapter.errWorkspaceMissing": "\u5DE5\u4F5C\u5340\u4E0D\u5B58\u5728: {dir}",
|
|
640
|
+
"adapter.cmdNew": "\u65B0\u5EFA\u5DE5\u4F5C\u968E\u6BB5",
|
|
641
|
+
"adapter.cmdHelp": "\u986F\u793A\u8AAA\u660E",
|
|
642
|
+
"adapter.helpText": "\u652F\u63F4\u7684\u547D\u4EE4\uFF1A\n- /new \u65B0\u5EFA\u5DE5\u4F5C\u968E\u6BB5\n- /help \u986F\u793A\u8AAA\u660E",
|
|
643
|
+
"adapter.newSessionTitle": "\u65B0\u5DE5\u4F5C\u968E\u6BB5",
|
|
644
|
+
"install.langHelpTitle": "install-local \u652F\u63F4\u8A9E\u8A00\uFF08--lang <tag>\uFF09\uFF1A",
|
|
645
|
+
"install.langHelpExample": "\u7BC4\u4F8B: npm run install-local -- --lang de-DE",
|
|
646
|
+
"install.unknownLang": '\u672A\u77E5\u8A9E\u8A00 "{raw}"\uFF0C\u5DF2\u56DE\u9000 en-US\u3002\u652F\u63F4\uFF1A{list}',
|
|
647
|
+
"hermes.errAskRequired": "question \u5FC5\u586B",
|
|
648
|
+
"hermes.msgPhoneUnavailable": "\u624B\u6A5F\u4E0D\u53EF\u7528\u6216\u672A\u56DE\u61C9\uFF1A\u8ACB\u6539\u7528\u5167\u5EFA clarify \u5728\u672C\u6A5F\u63D0\u554F\uFF0C\u6216\u81EA\u884C\u5224\u65B7\u7E7C\u7E8C\u3002",
|
|
649
|
+
"hermes.errClarifyUnavailable": "clarify \u652F\u63F4\u4E0D\u53EF\u7528",
|
|
650
|
+
"hermes.errAskFailed": "tunnelbox_ask \u5931\u6557: {err}",
|
|
651
|
+
"hermes.errClarifyFailed": "clarify \u5931\u6557: {err}",
|
|
652
|
+
"bin.denied": "\u624B\u6A5F\u5DF2\u62D2\u7D55",
|
|
653
|
+
"bin.timeout": "\u5BE9\u6279\u903E\u6642\uFF08fail-closed\uFF09",
|
|
654
|
+
"bin.reqRun": "Claude Code \u8ACB\u6C42\u57F7\u884C {tool}",
|
|
655
|
+
"bin.pairTitle": "tunnelbox \u624B\u6A5F\u914D\u5C0D",
|
|
656
|
+
"bin.pairCodeLine": " \u914D\u5C0D\u78BC: {code}",
|
|
657
|
+
"bin.pairHint": "\u6253\u958B tunnelbox App\uFF0C\u7528\u300C\u6383\u4E00\u6383\u914D\u5C0D\u300D\u6383\u63CF QR code\uFF0C\u6216\u624B\u52D5\u8F38\u5165\u914D\u5C0D\u78BC\uFF08\u4E00\u6B21\u6027\uFF09\u3002",
|
|
658
|
+
"bin.pairWritten": " \u914D\u5C0D\u8CC7\u8A0A\u5DF2\u5BEB\u5165: {path}",
|
|
659
|
+
"bin.pairRequestFailed": "\u5411\u4E2D\u7E7C\u7533\u8ACB\u914D\u5C0D\u78BC\u5931\u6557\u3002",
|
|
660
|
+
"bin.alreadyClaimed": "\u672C\u6A5F\u5DF2\u7D81\u5B9A\u624B\u6A5F\u5E33\u865F\uFF0C\u53EF\u76F4\u63A5\u5728\u624B\u6A5F\u300C\u6211\u7684\u96FB\u8166\u300D\u88E1\u9023\u63A5\uFF1B\u5982\u9700\u91CD\u65B0\u914D\u5C0D\uFF0C\u8ACB\u5148\u5728\u624B\u6A5F\u7AEF\u89E3\u7D81\u3002",
|
|
661
|
+
"bin.noRelay": "\u672A\u8A2D\u5B9A\u4E2D\u7E7C\u4F4D\u5740\uFF1A\u8ACB\u8A2D\u5B9A\u74B0\u5883\u8B8A\u6578 TUNNELBOX_RELAY_URL \u5F8C\u91CD\u8A66\u3002",
|
|
662
|
+
"bin.connectFailed": "\u7121\u6CD5\u9023\u63A5\u4E2D\u7E7C\uFF1A{relay}\n\u8ACB\u8A2D\u5B9A TUNNELBOX_RELAY_URL \u6216\u5728\u5B98\u65B9-plugin \u72C0\u614B\u6A94\u6848\u4E2D\u8A2D\u5B9A\u3002",
|
|
663
|
+
"bin.statusRelay": "\u4E2D\u7E7C: {value}",
|
|
664
|
+
"bin.statusAgent": "agent \u8B58\u5225\u78BC: {value}",
|
|
665
|
+
"bin.statusClaimed": "\u5DF2\u7D81\u5B9A\u624B\u6A5F: {value}",
|
|
666
|
+
"bin.statusStateFile": "\u72C0\u614B\u6A94\u6848: {value}",
|
|
667
|
+
"bin.statusLatest": "\u6700\u65B0\u914D\u5C0D\u8CC7\u8A0A\uFF1A",
|
|
668
|
+
"bin.usage": "\u7528\u6CD5: tunnelbox <pair|status|ask>",
|
|
669
|
+
"bin.usagePair": " pair \u53D6\u624B\u6A5F\u914D\u5C0D\u78BC\u4E26\u5217\u5370",
|
|
670
|
+
"bin.usageStatus": " status \u986F\u793A\u4E2D\u7E7C/\u7D81\u5B9A\u72C0\u614B",
|
|
671
|
+
"bin.usageAsk": " ask \u628A\u5DE5\u5177\u5BE9\u6279\u8F49\u767C\u5230\u624B\u6A5F",
|
|
672
|
+
"adapter.logMsgUncaught": "\u8A0A\u606F\u8655\u7406\u672A\u6355\u6349\u4F8B\u5916: {message}",
|
|
673
|
+
"adapter.logHandleFailed": "\u8655\u7406 {type} \u5931\u6557: {message}",
|
|
674
|
+
"adapter.logPromptFailed": "session.prompt \u5931\u6557: {message}",
|
|
675
|
+
"adapter.logAbortSent": "\u5DF2\u767C\u9001\u4E2D\u6B62 (session={session})",
|
|
676
|
+
"adapter.errUserDenied": "\u4F7F\u7528\u8005\u62D2\u7D55",
|
|
677
|
+
"adapter.logPendingResent": "session.pending \u88DC\u767C\u5F85\u5BE9\u6279 {count} \u689D",
|
|
678
|
+
"adapter.logWorkspaceSwitched": "\u5207\u63DB\u5DE5\u4F5C\u5340: {path}",
|
|
679
|
+
"adapter.logNewSession": "\u65B0\u5DE5\u4F5C\u968E\u6BB5\u843D\u76E4 codexId={codexId} (alias={session})",
|
|
680
|
+
"adapter.logSessionError": "\u56DE\u5408\u51FA\u932F (session={session}): {message}",
|
|
681
|
+
"adapter.logDshSent": "\u5DF2\u767C\u9001\u5230 dsh (session={session})",
|
|
682
|
+
"adapter.logReadHistoryFailed": "\u8B80\u53D6\u5DE5\u4F5C\u968E\u6BB5\u6B77\u53F2\u5931\u6557({session}): {message}",
|
|
683
|
+
"adapter.logAnswererInitFailed": "\u61C9\u7B54\u5668\u521D\u59CB\u5316\u5931\u6557: {message}",
|
|
684
|
+
"adapter.logRemoteMode": "\u96D9\u7AEF\u540C\u986F\u6A21\u5F0F\uFF1A\u9078\u64C7/\u5BE9\u6279\u8D70 typert \u591A\u7AEF\u5EE3\u64AD\uFF0C\u624B\u6A5F\u8207 dsh web \u540C\u986F\u3001\u8AB0\u7B54\u8AB0\u5F97",
|
|
685
|
+
"adapter.logRemoteProbeFailed": "typert \u9060\u7AEF\u4E8B\u4EF6\u6E90\u63A2\u6E2C\u5931\u6557\uFF0C\u56DE\u9000\u672C\u5730\u61C9\u7B54\u6A21\u5F0F: {message}",
|
|
686
|
+
"adapter.logLocalMode": "\u672C\u5730\u61C9\u7B54\u6A21\u5F0F\uFF1A\u9078\u64C7/\u5BE9\u6279\u7531\u624B\u6A5F\u4F5C\u7B54\uFF08headless\uFF0C\u7121 dsh web \u5EE3\u64AD\uFF09",
|
|
687
|
+
"adapter.logRemoteStreamInterrupted": "remote events \u4E32\u6D41\u4E2D\u65B7: {message}",
|
|
688
|
+
"adapter.logResultRejected": "$events/result \u672A\u63A5\u53D7({eventId}): {message}",
|
|
689
|
+
"adapter.logResultBackfillFailed": "$events/result \u56DE\u586B\u5931\u6557({eventId}): {message}",
|
|
690
|
+
"adapter.logRemoteQuestion": "remote \u63D0\u554F\u5EE3\u64AD \u2192 \u624B\u6A5F\u63D0\u554F\u5361 questionID={id} (session={session})",
|
|
691
|
+
"adapter.errRemoteReadyFrame": "remote events \u9996\u5E40\u7570\u5E38",
|
|
692
|
+
"adapter.logRemoteApproval": "remote \u5BE9\u6279\u5EE3\u64AD \u2192 \u624B\u6A5F\u6B0A\u9650\u5361 permissionID={id} (session={session})",
|
|
693
|
+
"adapter.logUserQuestionRoute": "user-questions \u9078\u64C7 \u2192 \u8DEF\u7531 session={session}",
|
|
694
|
+
"adapter.errDshQuestionEmpty": "dsh \u63D0\u554F\u5167\u5BB9\u70BA\u7A7A",
|
|
695
|
+
"adapter.errQuestionTimeout": "\u63D0\u554F\u903E\u6642({seconds}s)\uFF0C\u5DF2\u53D6\u6D88",
|
|
696
|
+
"adapter.errQuestionCancelledAbort": "\u63D0\u554F\u5DF2\u53D6\u6D88\uFF08agent \u4E2D\u6B62\uFF09",
|
|
697
|
+
"adapter.errQuestionCancelledRelay": "\u4E2D\u7E7C\u4E0D\u53EF\u9054\uFF0C\u63D0\u554F\u5DF2\u53D6\u6D88",
|
|
698
|
+
"adapter.logQuestionToPhone": "user-questions \u9078\u64C7 \u2192 \u767C\u9001\u5230\u624B\u6A5F\u63D0\u554F\u5361 questionID={id} (session={session})",
|
|
699
|
+
"adapter.errQuestionUserCancelled": "\u4F7F\u7528\u8005\u5728\u624B\u6A5F\u7AEF\u53D6\u6D88/\u62D2\u7D55\u4E86\u63D0\u554F",
|
|
700
|
+
"adapter.logApprovalRequest": "\u5BE9\u6279\u8ACB\u6C42(tool={tool}) \u2192 \u767C\u9001\u5230\u624B\u6A5F\u6B0A\u9650\u5361 permissionID={id}",
|
|
701
|
+
"adapter.logAgentPresetFailed": "agentPreset \u89E3\u6790\u5931\u6557({preset})\uFF0C\u964D\u7D1A\u70BA\u7121 preset: {message}",
|
|
702
|
+
"adapter.logSessionLiveAdopted": "\u5DE5\u4F5C\u968E\u6BB5 {session} \u5DF2\u7531\u672C\u884C\u7A0B\u5176\u5B83 agent \u6301\u6709\uFF08live\uFF09\uFF0C\u63A1\u7D0D\u73FE\u6709 agent \u7E7C\u7E8C\u9A45\u52D5: {message}",
|
|
703
|
+
"adapter.logDisposeSkipped": "\u5DF2\u63A1\u7D0D\u7684\u5916\u90E8 live agent \u4E0D\u57F7\u884C dispose\uFF08\u5DE5\u4F5C\u968E\u6BB5 {session} \u7531\u539F\u6301\u6709\u8005\u7BA1\u7406\uFF09",
|
|
704
|
+
"adapter.logAgentCreateFailed": "\u5EFA\u7ACB/\u6062\u5FA9 agent \u5931\u6557({session}): {message}",
|
|
705
|
+
"adapter.errSessionBusyLive": "\u5DE5\u4F5C\u968E\u6BB5 {session} \u6B63\u88AB\u4F54\u7528\uFF08live\uFF09\uFF0C\u8ACB\u7A0D\u5F8C\u91CD\u8A66",
|
|
706
|
+
"adapter.errAgentsUnavailable": "agents \u670D\u52D9\u4E0D\u53EF\u7528",
|
|
707
|
+
"adapter.logToolReason": "dsh \u8ACB\u6C42\u57F7\u884C\u5DE5\u5177 {tool}",
|
|
708
|
+
"adapter.logGatewayConnected": "\u5DF2\u9023\u63A5\u672C\u6A5F OpenClaw Gateway\uFF08{version}\uFF09",
|
|
709
|
+
"adapter.logGatewayDisconnected": "\u8207 OpenClaw Gateway \u65B7\u958B\uFF0C\u6B63\u5728\u7531\u5B98\u65B9\u5BA2\u6236\u7AEF\u91CD\u9023\u2026",
|
|
710
|
+
"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",
|
|
711
|
+
"adapter.errGatewayNoSessionKey": "Gateway \u672A\u8FD4\u56DE\u5DE5\u4F5C\u968E\u6BB5 key",
|
|
712
|
+
"adapter.logDeleteSessionFailed": "\u522A\u9664\u5DE5\u4F5C\u968E\u6BB5\u5931\u6557({session}): {message}\uFF08\u4ECD\u6309\u5DF2\u522A\u9664\u56DE\u57F7\uFF09",
|
|
713
|
+
"adapter.logApprovalReplyFailed": "\u5BE9\u6279\u61C9\u7B54\u5931\u6557({id}): {message}",
|
|
714
|
+
"adapter.logPendingApproval": "session.pending \u88DC\u767C\u5F85\u5BE9\u6279 {count} \u689D (session={session})",
|
|
715
|
+
"adapter.workspaceDefault": "\u9810\u8A2D",
|
|
716
|
+
"adapter.cursorSessionTitle": "Cursor \u5DE5\u4F5C\u968E\u6BB5",
|
|
717
|
+
"adapter.reasonDisconnect": "\u4E2D\u7E7C\u65B7\u958B\uFF0C\u81EA\u52D5\u62D2\u7D55\uFF08fail-closed\uFF09",
|
|
718
|
+
"adapter.warnInvalidEnv": "\u5FFD\u7565\u7121\u6548 {name}: {raw}\uFF08{list}\uFF09",
|
|
719
|
+
"adapter.errStartFailed": "\u555F\u52D5\u5931\u6557:",
|
|
720
|
+
"adapter.msgStarted": "{name} \u9069\u914D\u5668\u5DF2\u555F\u52D5\uFF08Ctrl+C \u9000\u51FA\uFF09",
|
|
721
|
+
"adapter.warnCliMissing": "\u672A\u627E\u5230\u57F7\u884C\u6A94\u300C{bin}\u300D\uFF1B\u8ACB\u5148\u5B89\u88DD\uFF08\u5982 npm i -g @openai/codex\uFF09\uFF0C\u6216\u7528 TUNNELBOX_CODEX_BIN \u6307\u5B9A\u57F7\u884C\u6A94\u8DEF\u5F91",
|
|
722
|
+
"adapter.errCliNotFound": "\u672A\u627E\u5230 {name} \u57F7\u884C\u6A94\u300C{bin}\u300D\uFF1A\u8ACB\u5B89\u88DD Codex CLI\uFF08npm i -g @openai/codex\uFF09\u6216\u8A2D\u5B9A TUNNELBOX_CODEX_BIN",
|
|
723
|
+
"adapter.errSessionNotFound": "\u6703\u8A71\u4E0D\u5B58\u5728\u6216\u5DF2\u88AB\u522A\u9664",
|
|
724
|
+
"adapter.checkHeader": "tunnelbox-codex \u74B0\u5883\u81EA\u6AA2",
|
|
725
|
+
"adapter.checkCliOk": "{name} \u57F7\u884C\u6A94: {path}",
|
|
726
|
+
"adapter.checkCliMissing": "\u672A\u627E\u5230 {name} \u57F7\u884C\u6A94\uFF08{bin}\uFF09",
|
|
727
|
+
"bin.yes": "\u662F",
|
|
728
|
+
"bin.no": "\u5426",
|
|
729
|
+
"adapter.errAppServerSpawn": "\u7121\u6CD5\u555F\u52D5 codex app-server\uFF1A{message}\uFF08\u8ACB\u78BA\u8A8D Codex CLI \u652F\u63F4 `codex app-server`\uFF09",
|
|
730
|
+
"adapter.errAppServerExit": "codex app-server \u5DF2\u7D50\u675F\uFF0C\u9032\u884C\u4E2D\u7684\u5BE9\u6279/\u9078\u64C7\u5DF2\u81EA\u52D5\u62D2\u7D55",
|
|
731
|
+
"adapter.logUnsupportedServerRequest": "\u66AB\u4E0D\u652F\u63F4\u7684 app-server \u8ACB\u6C42: {method}",
|
|
732
|
+
"adapter.logQuestionNative": "\u9078\u64C7\u8ACB\u6C42 \u2192 \u624B\u6A5F\u9078\u64C7\u5361 questionID={id} (session={session})",
|
|
733
|
+
"adapter.logPermissionNative": "\u5BE9\u6279\u8ACB\u6C42 \u2192 \u624B\u6A5F\u6B0A\u9650\u5361 permissionID={id} (session={session})",
|
|
734
|
+
"adapter.checkAppServerOk": "codex app-server \u53EF\u7528",
|
|
735
|
+
"adapter.checkAppServerMissing": "\u76EE\u524D Codex CLI \u4E0D\u652F\u63F4 `codex app-server`\uFF08\u8ACB\u5347\u7D1A Codex CLI\uFF09",
|
|
736
|
+
"adapter.warnCursorCliMissing": '\u672A\u627E\u5230 Cursor CLI \u57F7\u884C\u6A94 "{bin}"\uFF1A\u8ACB\u5B89\u88DD\uFF08https://cursor.com/docs/cli\uFF09\uFF0C\u6216\u7528 TUNNELBOX_CURSOR_BIN \u6307\u5B9A\u8DEF\u5F91',
|
|
737
|
+
"adapter.checkCursorCliMissing": "\u672A\u627E\u5230 Cursor CLI \u57F7\u884C\u6A94\uFF08{bin}\uFF09\uFF1A\u8ACB\u5F9E https://cursor.com/docs/cli \u5B89\u88DD",
|
|
738
|
+
"adapter.checkCursorAcpHint": "\u5DF2\u5075\u6E2C\u5230 Cursor CLI\uFF1B\u5C07\u4F7F\u7528 ACP \u6A21\u5F0F\uFF08`agent acp`\uFF09\u63D0\u4F9B\u4E32\u6D41/\u5BE9\u6279/\u9078\u64C7",
|
|
739
|
+
"adapter.errAcpSpawn": "\u555F\u52D5 cursor `agent acp` \u5931\u6557\uFF1A{message}\uFF08\u8ACB\u78BA\u8A8D Cursor CLI \u652F\u63F4 `agent acp`\uFF09",
|
|
740
|
+
"adapter.errAcpNoSession": "Cursor ACP \u672A\u8FD4\u56DE\u5DE5\u4F5C\u968E\u6BB5 id",
|
|
741
|
+
"adapter.logResumeFailed": "\u5DE5\u4F5C\u968E\u6BB5\u6062\u5FA9\u5931\u6557\uFF0C\u6539\u70BA\u5EFA\u7ACB\u65B0\u5DE5\u4F5C\u968E\u6BB5\uFF1A{message}",
|
|
742
|
+
"adapter.logPlanNative": "\u8A08\u756B\u5BE9\u6279 \u2192 \u624B\u6A5F\u5BE9\u6279\u5361 permissionID={id} (session={session})",
|
|
743
|
+
"adapter.errTimeout": "\u7B49\u5F85\u903E\u6642\uFF0C\u81EA\u52D5\u62D2\u7D55\uFF08fail-closed\uFF09",
|
|
744
|
+
"adapter.planApprovalPrompt": "Cursor \u8ACB\u6C42\u6279\u51C6\u4E00\u9805\u8A08\u756B",
|
|
745
|
+
"adapter.checkCursorHeader": "tunnelbox-cursor \u74B0\u5883\u81EA\u6AA2",
|
|
746
|
+
"adapter.errAskBridge": "\u555F\u52D5 ask \u6A4B\u5931\u6557\uFF1A{message}",
|
|
747
|
+
"adapter.logAskBridge": "MCP ask \u6A4B\u5DF2\u76E3\u807D {url}",
|
|
748
|
+
"cursor.mcpAskDesc": "\u8B93\u4F7F\u7528\u8005\u5728\u624B\u6A5F\u4E0A\uFF08tunnelbox\uFF09\u505A\u9078\u64C7\uFF0C\u4E26\u963B\u585E\u7B49\u5F85\u5176\u4F5C\u7B54\u3002\u53EA\u8981\u9700\u8981\u4F7F\u7528\u8005\u5728\u7E7C\u7E8C\u524D\u65BC\u82E5\u5E72\u9078\u9805\u4E2D\u505A\u51FA\u9078\u64C7\uFF08\u5982\u9078\u9910\u3001\u9078\u6A21\u5F0F\u3001\u9078\u65B9\u6848\uFF09\u5C31\u547C\u53EB\u5B83\u3002\u56DE\u50B3\u4F7F\u7528\u8005\u6240\u9078\u7684\u9078\u9805\u6587\u5B57\u3002",
|
|
749
|
+
"cursor.mcpAskTitleDesc": "\u624B\u6A5F\u5361\u7247\u4E0A\u986F\u793A\u7684\u6A19\u984C\uFF08\u53EF\u9078\uFF09",
|
|
750
|
+
"cursor.mcpAskQuestionsDesc": "\u4E00\u500B\u6216\u591A\u500B\u554F\u984C\uFF1B\u6BCF\u500B\u554F\u984C\u5E36\u53EF\u9078\u9805",
|
|
751
|
+
"cursor.mcpPlanDesc": "\u8B93\u4F7F\u7528\u8005\u5728\u624B\u6A5F\u4E0A\uFF08tunnelbox\uFF09\u6279\u51C6\u4E00\u9805\u8A08\u756B\uFF0C\u4E26\u963B\u585E\u7B49\u5F85\u5176\u61C9\u7B54\u3002\u56DE\u50B3\u8A08\u756B\u662F\u5426\u88AB\u63A5\u53D7\u3002",
|
|
752
|
+
"cursor.mcpNoBridge": "tunnelbox ask \u6A4B\u4E0D\u53EF\u7528",
|
|
753
|
+
"cursor.mcpUnanswered": "\u4F7F\u7528\u8005\u672A\u5728\u624B\u6A5F\u4E0A\u4F5C\u7B54\uFF08\u96E2\u7DDA\u6216\u903E\u6642\uFF09\u3002\u8ACB\u7E7C\u7E8C\uFF0C\u6216\u7528\u5C0D\u8A71\u65B9\u5F0F\u8A62\u554F\u3002",
|
|
754
|
+
"cursor.mcpRejected": "\u4F7F\u7528\u8005\u5728\u624B\u6A5F\u4E0A\u62D2\u7D55\u4E86\u9019\u500B\u63D0\u554F\u3002",
|
|
755
|
+
"cursor.mcpAnswersHeader": "\u4F7F\u7528\u8005\uFF08\u624B\u6A5F\uFF09\u7684\u9078\u64C7\uFF1A",
|
|
756
|
+
"cursor.mcpAccepted": "\u4F7F\u7528\u8005\u5DF2\u63A5\u53D7\u8A72\u8A08\u756B\u3002",
|
|
757
|
+
"cursor.mcpDenied": "\u4F7F\u7528\u8005\u62D2\u7D55\u4E86\u8A72\u8A08\u756B\u3002",
|
|
758
|
+
"cursor.mcpPlanUnanswered": "\u4F7F\u7528\u8005\u672A\u5728\u624B\u6A5F\u4E0A\u56DE\u61C9\u8A08\u756B\uFF08\u96E2\u7DDA\u6216\u903E\u6642\uFF09\u3002",
|
|
759
|
+
"cursor.mcpAskNoQuestions": "\u672A\u63D0\u4F9B\u4EFB\u4F55\u554F\u984C\u3002",
|
|
760
|
+
"cursor.mcpFailed": "tunnelbox ask \u547C\u53EB\u5931\u6557",
|
|
761
|
+
"adapter.errCursorExitCode": "Cursor CLI \u9000\u51FA\u78BC {code}",
|
|
762
|
+
"adapter.errCursorExit": "Cursor CLI \u9000\u51FA({code}): {err}",
|
|
763
|
+
"adapter.errCursorSpawn": "\u7121\u6CD5\u555F\u52D5 Cursor CLI\uFF08agent\uFF09\uFF1A\u8ACB\u78BA\u8A8D\u5DF2\u5B89\u88DD\u4E26\u767B\u5165\uFF08{message}\uFF09",
|
|
764
|
+
"adapter.errCursorStart": "Cursor CLI \u555F\u52D5\u5931\u6557: {message}",
|
|
765
|
+
"adapter.errCursorGeneric": "Cursor \u51FA\u932F"
|
|
488
766
|
};
|
|
489
767
|
var en_US_default = {
|
|
490
768
|
"agent.err.createSession": "Failed to create session",
|
|
@@ -535,7 +813,7 @@ var en_US_default = {
|
|
|
535
813
|
"install.scanHint": "Open tunnelbox on your phone, tap \u201CScan to pair\u201D, and scan the QR code above to connect:",
|
|
536
814
|
"pair.heading": "tunnelbox phone pairing",
|
|
537
815
|
"pair.howTo": "Open the tunnelbox app on your phone and scan the QR code above with \u201CScan to pair\u201D, or enter the pairing code manually.",
|
|
538
|
-
"pair.oneTime": "The pairing code is single-use and
|
|
816
|
+
"pair.oneTime": "The pairing code is single-use and valid for about 10 minutes; it stops working once claimed or expired. Ask to \u201Crefresh the pairing code\u201D for a new one.",
|
|
539
817
|
"pair.promptBody": "Please show this computer's phone pairing info: the pairing code and a QR code I can scan. Keep the QR code inside a monospaced code block and reproduce it character-for-character so my phone can scan it.",
|
|
540
818
|
"pair.promptDescription": "Show the phone pairing code and scan-able QR code",
|
|
541
819
|
"pair.scanIntro": "**Pair by scanning**: open the tunnelbox app on your phone, tap \u201CScan to pair\u201D, and scan the QR code below to connect automatically.",
|
|
@@ -650,7 +928,148 @@ var en_US_default = {
|
|
|
650
928
|
"hermes.pairTimeout": "Timed out requesting a pairing code (relay did not respond)",
|
|
651
929
|
"hermes.errToolPair": "tunnelbox_pair failed: {err}",
|
|
652
930
|
"hermes.errToolStatus": "tunnelbox_status failed: {err}",
|
|
653
|
-
"hermes.cliUsage": "Usage: /tunnelbox <pair|status>\n pair request and print a phone pairing code\n status show relay/binding/connection status"
|
|
931
|
+
"hermes.cliUsage": "Usage: /tunnelbox <pair|status>\n pair request and print a phone pairing code\n status show relay/binding/connection status",
|
|
932
|
+
"qr.validFor": "The pairing code is valid for about 10 minutes; get a new one on your computer if it expires.",
|
|
933
|
+
"pair.toolDesc": "Show this computer's opencode phone pairing info (pairing code and a scan-able QR code). Call when the user asks about pairing, scanning a QR code, or controlling this computer from their phone.",
|
|
934
|
+
"pair.toolRefreshDesc": "Whether to request a new pairing code from the relay",
|
|
935
|
+
"state.errSaveState": "Failed to save state",
|
|
936
|
+
"adapter.logConnected": "Connected to relay {url}",
|
|
937
|
+
"adapter.logDisconnected": "Disconnected from relay, reconnecting automatically\u2026",
|
|
938
|
+
"adapter.logPairCode": "Generated pairing code: {code}",
|
|
939
|
+
"adapter.logClaimed": "Bound to your phone account. From now on the phone connects directly from My Computers",
|
|
940
|
+
"adapter.logResetIdentity": "Unbound from the account; resetting identity and generating a new pairing code\u2026",
|
|
941
|
+
"adapter.logUnhandledType": "Unhandled message type: {type}",
|
|
942
|
+
"adapter.errNoRelay": "No relay URL configured: build with --env to inject a default, or override at runtime with TUNNELBOX_RELAY_URL",
|
|
943
|
+
"adapter.errBusy": "This session is still running; wait for it to finish or stop it first",
|
|
944
|
+
"adapter.errBadWorkspaceEmpty": "Missing workspace path",
|
|
945
|
+
"adapter.errBadWorkspaceNotDir": "Directory does not exist or is unusable",
|
|
946
|
+
"adapter.errWorkspaceMissing": "Workspace does not exist: {dir}",
|
|
947
|
+
"adapter.cmdNew": "New session",
|
|
948
|
+
"adapter.cmdHelp": "Show help",
|
|
949
|
+
"adapter.helpText": "Supported commands:\n- /new new session\n- /help show help",
|
|
950
|
+
"adapter.newSessionTitle": "New session",
|
|
951
|
+
"install.langHelpTitle": "install-local supported languages (--lang <tag>):",
|
|
952
|
+
"install.langHelpExample": "Example: npm run install-local -- --lang de-DE",
|
|
953
|
+
"install.unknownLang": 'Unknown language "{raw}", falling back to en-US. Supported: {list}',
|
|
954
|
+
"hermes.errAskRequired": "question is required",
|
|
955
|
+
"hermes.msgPhoneUnavailable": "Phone unavailable or no response: use the built-in clarify to ask locally, or decide on your own.",
|
|
956
|
+
"hermes.errClarifyUnavailable": "clarify support unavailable",
|
|
957
|
+
"hermes.errAskFailed": "tunnelbox_ask failed: {err}",
|
|
958
|
+
"hermes.errClarifyFailed": "clarify failed: {err}",
|
|
959
|
+
"bin.denied": "Rejected from your phone",
|
|
960
|
+
"bin.timeout": "Approval timed out (fail-closed)",
|
|
961
|
+
"bin.reqRun": "Claude Code requests to run {tool}",
|
|
962
|
+
"bin.pairTitle": "tunnelbox phone pairing",
|
|
963
|
+
"bin.pairCodeLine": " Pairing code: {code}",
|
|
964
|
+
"bin.pairHint": "Open the tunnelbox app, tap \u201CScan to pair\u201D and scan the QR code, or enter the pairing code manually (single-use).",
|
|
965
|
+
"bin.pairWritten": " Pairing info written to: {path}",
|
|
966
|
+
"bin.pairRequestFailed": "Failed to request a pairing code from the relay.",
|
|
967
|
+
"bin.alreadyClaimed": "This computer is already bound to a phone account; connect directly from \u201CMy Computers\u201D. To re-pair, unbind it on your phone first.",
|
|
968
|
+
"bin.noRelay": "No relay URL configured: set TUNNELBOX_RELAY_URL and try again.",
|
|
969
|
+
"bin.connectFailed": "Cannot connect to the relay: {relay}\nSet TUNNELBOX_RELAY_URL or configure it in the official-plugin state file.",
|
|
970
|
+
"bin.statusRelay": "Relay: {value}",
|
|
971
|
+
"bin.statusAgent": "Agent ID: {value}",
|
|
972
|
+
"bin.statusClaimed": "Phone bound: {value}",
|
|
973
|
+
"bin.statusStateFile": "State file: {value}",
|
|
974
|
+
"bin.statusLatest": "Latest pairing info:",
|
|
975
|
+
"bin.usage": "Usage: tunnelbox <pair|status|ask>",
|
|
976
|
+
"bin.usagePair": " pair request and print a phone pairing code",
|
|
977
|
+
"bin.usageStatus": " status show relay/binding status",
|
|
978
|
+
"bin.usageAsk": " ask forward a tool approval to the phone",
|
|
979
|
+
"adapter.logMsgUncaught": "Uncaught exception while handling message: {message}",
|
|
980
|
+
"adapter.logHandleFailed": "Failed to handle {type}: {message}",
|
|
981
|
+
"adapter.logPromptFailed": "session.prompt failed: {message}",
|
|
982
|
+
"adapter.logAbortSent": "Abort sent (session={session})",
|
|
983
|
+
"adapter.errUserDenied": "Rejected by user",
|
|
984
|
+
"adapter.logPendingResent": "session.pending: resent {count} pending request(s)",
|
|
985
|
+
"adapter.logWorkspaceSwitched": "Switched workspace: {path}",
|
|
986
|
+
"adapter.logNewSession": "New session persisted codexId={codexId} (alias={session})",
|
|
987
|
+
"adapter.logSessionError": "Turn error (session={session}): {message}",
|
|
988
|
+
"adapter.logDshSent": "Sent to dsh (session={session})",
|
|
989
|
+
"adapter.logReadHistoryFailed": "Failed to read session history ({session}): {message}",
|
|
990
|
+
"adapter.logAnswererInitFailed": "Answerer initialization failed: {message}",
|
|
991
|
+
"adapter.logRemoteMode": "Dual-display mode: selections/approvals use typert multi-client broadcast; phone and dsh web share the view, first answer wins",
|
|
992
|
+
"adapter.logRemoteProbeFailed": "typert remote event source probe failed; falling back to local answering mode: {message}",
|
|
993
|
+
"adapter.logLocalMode": "Local answering mode: selections/approvals answered by the phone (headless, no dsh web broadcast)",
|
|
994
|
+
"adapter.logRemoteStreamInterrupted": "remote events stream interrupted: {message}",
|
|
995
|
+
"adapter.logResultRejected": "$events/result not accepted ({eventId}): {message}",
|
|
996
|
+
"adapter.logResultBackfillFailed": "$events/result backfill failed ({eventId}): {message}",
|
|
997
|
+
"adapter.logRemoteQuestion": "remote question broadcast \u2192 phone question card questionID={id} (session={session})",
|
|
998
|
+
"adapter.errRemoteReadyFrame": "Unexpected remote events first frame",
|
|
999
|
+
"adapter.logRemoteApproval": "remote approval broadcast \u2192 phone permission card permissionID={id} (session={session})",
|
|
1000
|
+
"adapter.logUserQuestionRoute": "user-questions selection \u2192 routed to session={session}",
|
|
1001
|
+
"adapter.errDshQuestionEmpty": "dsh question content is empty",
|
|
1002
|
+
"adapter.errQuestionTimeout": "Question timed out ({seconds}s), cancelled",
|
|
1003
|
+
"adapter.errQuestionCancelledAbort": "Question cancelled (agent aborted)",
|
|
1004
|
+
"adapter.errQuestionCancelledRelay": "Relay unreachable, question cancelled",
|
|
1005
|
+
"adapter.logQuestionToPhone": "user-questions selection \u2192 sent to phone question card questionID={id} (session={session})",
|
|
1006
|
+
"adapter.errQuestionUserCancelled": "User cancelled/rejected the question on the phone",
|
|
1007
|
+
"adapter.logApprovalRequest": "Approval request (tool={tool}) \u2192 sent to phone permission card permissionID={id}",
|
|
1008
|
+
"adapter.logAgentPresetFailed": "agentPreset resolution failed ({preset}); falling back to no preset: {message}",
|
|
1009
|
+
"adapter.logSessionLiveAdopted": "Session {session} is already held by another agent in this process (live); adopting the existing agent to continue: {message}",
|
|
1010
|
+
"adapter.logDisposeSkipped": "Adopted external live agent does not run dispose (session {session} is managed by its original holder)",
|
|
1011
|
+
"adapter.logAgentCreateFailed": "Failed to create/resume agent ({session}): {message}",
|
|
1012
|
+
"adapter.errSessionBusyLive": "Session {session} is busy (live); try again later",
|
|
1013
|
+
"adapter.errAgentsUnavailable": "agents service unavailable",
|
|
1014
|
+
"adapter.logToolReason": "dsh requests to run tool {tool}",
|
|
1015
|
+
"adapter.logGatewayConnected": "Connected to local OpenClaw Gateway ({version})",
|
|
1016
|
+
"adapter.logGatewayDisconnected": "Disconnected from OpenClaw Gateway; the official client is reconnecting\u2026",
|
|
1017
|
+
"adapter.logGatewayConnectFailed": "Cannot connect to local OpenClaw Gateway (first time, approve the device locally: `openclaw devices list` + `openclaw devices approve <requestId>`)",
|
|
1018
|
+
"adapter.errGatewayNoSessionKey": "Gateway did not return a session key",
|
|
1019
|
+
"adapter.logDeleteSessionFailed": "Failed to delete session ({session}): {message} (still acking as deleted)",
|
|
1020
|
+
"adapter.logApprovalReplyFailed": "Approval reply failed ({id}): {message}",
|
|
1021
|
+
"adapter.logPendingApproval": "session.pending: resent {count} pending approval(s) (session={session})",
|
|
1022
|
+
"adapter.workspaceDefault": "Default",
|
|
1023
|
+
"adapter.cursorSessionTitle": "Cursor session",
|
|
1024
|
+
"adapter.reasonDisconnect": "Relay disconnected, auto-rejecting (fail-closed)",
|
|
1025
|
+
"adapter.warnInvalidEnv": "Ignoring invalid {name}: {raw} ({list})",
|
|
1026
|
+
"adapter.errStartFailed": "Failed to start:",
|
|
1027
|
+
"adapter.msgStarted": "{name} adapter started (Ctrl+C to quit)",
|
|
1028
|
+
"adapter.warnCliMissing": 'Executable "{bin}" not found; install it (e.g. npm i -g @openai/codex) or set TUNNELBOX_CODEX_BIN to its path',
|
|
1029
|
+
"adapter.errCliNotFound": '{name} executable "{bin}" not found: install the Codex CLI (npm i -g @openai/codex) or set TUNNELBOX_CODEX_BIN',
|
|
1030
|
+
"adapter.errSessionNotFound": "Session not found or already deleted",
|
|
1031
|
+
"adapter.checkHeader": "tunnelbox-codex environment check",
|
|
1032
|
+
"adapter.checkCliOk": "{name} executable: {path}",
|
|
1033
|
+
"adapter.checkCliMissing": "{name} executable not found ({bin})",
|
|
1034
|
+
"bin.yes": "yes",
|
|
1035
|
+
"bin.no": "no",
|
|
1036
|
+
"adapter.errAppServerSpawn": "Failed to start codex app-server: {message} (make sure your Codex CLI supports `codex app-server`)",
|
|
1037
|
+
"adapter.errAppServerExit": "codex app-server exited; pending approvals/choices were auto-declined",
|
|
1038
|
+
"adapter.logUnsupportedServerRequest": "unsupported app-server request: {method}",
|
|
1039
|
+
"adapter.logQuestionNative": "choice request -> phone choice card questionID={id} (session={session})",
|
|
1040
|
+
"adapter.logPermissionNative": "approval request -> phone approval card permissionID={id} (session={session})",
|
|
1041
|
+
"adapter.checkAppServerOk": "codex app-server available",
|
|
1042
|
+
"adapter.checkAppServerMissing": "this Codex CLI does not support `codex app-server` (please upgrade Codex CLI)",
|
|
1043
|
+
"adapter.warnCursorCliMissing": 'Cursor CLI executable "{bin}" not found; install it (https://cursor.com/docs/cli) or set TUNNELBOX_CURSOR_BIN to its path',
|
|
1044
|
+
"adapter.checkCursorCliMissing": "Cursor CLI executable not found ({bin}); install it from https://cursor.com/docs/cli",
|
|
1045
|
+
"adapter.checkCursorAcpHint": "Cursor CLI detected; ACP mode (`agent acp`) will provide streaming/approval/selection",
|
|
1046
|
+
"adapter.errAcpSpawn": "Failed to start cursor `agent acp`: {message} (make sure your Cursor CLI supports `agent acp`)",
|
|
1047
|
+
"adapter.errAcpNoSession": "Cursor ACP did not return a session id",
|
|
1048
|
+
"adapter.logResumeFailed": "Session resume failed, starting a new session: {message}",
|
|
1049
|
+
"adapter.logPlanNative": "plan approval -> phone approval card permissionID={id} (session={session})",
|
|
1050
|
+
"adapter.errTimeout": "Timed out, auto-rejected (fail-closed)",
|
|
1051
|
+
"adapter.planApprovalPrompt": "Cursor requests approval for a plan",
|
|
1052
|
+
"adapter.checkCursorHeader": "tunnelbox-cursor environment check",
|
|
1053
|
+
"adapter.errAskBridge": "Failed to start the ask bridge: {message}",
|
|
1054
|
+
"adapter.logAskBridge": "MCP ask bridge listening at {url}",
|
|
1055
|
+
"cursor.mcpAskDesc": "Ask the user to choose on their phone (tunnelbox) and block until they answer. Use this whenever you need the user to pick between options before continuing (e.g. choosing a dish, a mode, or a plan option). Returns the selected option label(s).",
|
|
1056
|
+
"cursor.mcpAskTitleDesc": "Optional title shown on the phone card",
|
|
1057
|
+
"cursor.mcpAskQuestionsDesc": "One or more questions; each has options for the user to pick",
|
|
1058
|
+
"cursor.mcpPlanDesc": "Ask the user to approve a plan on their phone (tunnelbox) and block until they respond. Returns whether the plan was accepted.",
|
|
1059
|
+
"cursor.mcpNoBridge": "tunnelbox ask bridge is not available",
|
|
1060
|
+
"cursor.mcpUnanswered": "The user did not answer on their phone (offline or timed out). Proceed or ask conversationally.",
|
|
1061
|
+
"cursor.mcpRejected": "The user rejected the question on their phone.",
|
|
1062
|
+
"cursor.mcpAnswersHeader": "User's answers (from their phone):",
|
|
1063
|
+
"cursor.mcpAccepted": "The user accepted the plan.",
|
|
1064
|
+
"cursor.mcpDenied": "The user rejected the plan.",
|
|
1065
|
+
"cursor.mcpPlanUnanswered": "The user did not respond to the plan on their phone (offline or timed out).",
|
|
1066
|
+
"cursor.mcpAskNoQuestions": "No questions were provided.",
|
|
1067
|
+
"cursor.mcpFailed": "tunnelbox ask failed",
|
|
1068
|
+
"adapter.errCursorExitCode": "Cursor CLI exited with code {code}",
|
|
1069
|
+
"adapter.errCursorExit": "Cursor CLI exited ({code}): {err}",
|
|
1070
|
+
"adapter.errCursorSpawn": "Cannot start Cursor CLI (agent): make sure it is installed and logged in ({message})",
|
|
1071
|
+
"adapter.errCursorStart": "Cursor CLI failed to start: {message}",
|
|
1072
|
+
"adapter.errCursorGeneric": "Cursor error"
|
|
654
1073
|
};
|
|
655
1074
|
var ja_JP_default = {
|
|
656
1075
|
"agent.err.createSession": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u4F5C\u6210\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
@@ -701,7 +1120,7 @@ var ja_JP_default = {
|
|
|
701
1120
|
"install.scanHint": "\u30B9\u30DE\u30DB\u3067 tunnelbox App\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3092\u958B\u304D\u3001\u4E0A\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u63A5\u7D9A\uFF1A",
|
|
702
1121
|
"pair.heading": "tunnelbox \u30B9\u30DE\u30DB\u30DA\u30A2\u30EA\u30F3\u30B0",
|
|
703
1122
|
"pair.howTo": "\u30B9\u30DE\u30DB\u3067 tunnelbox App \u3092\u958B\u304D\u3001\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3067\u4E0A\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u304B\u3001\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u624B\u52D5\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
704
|
-
"pair.oneTime": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\
|
|
1123
|
+
"pair.oneTime": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306F1\u56DE\u9650\u308A\u3067\u3001\u6709\u52B9\u671F\u9650\u306F\u7D0410\u5206\u3067\u3059\u3002\u4F7F\u7528\u307E\u305F\u306F\u671F\u9650\u5207\u308C\u3067\u7121\u52B9\u306B\u306A\u308A\u307E\u3059\u3002\u65B0\u3057\u3044\u30B3\u30FC\u30C9\u304C\u5FC5\u8981\u306A\u5834\u5408\u306F\u300C\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u66F4\u65B0\u300D\u3068\u4F9D\u983C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
705
1124
|
"pair.promptBody": "\u3053\u306E PC \u306E\u30B9\u30DE\u30DB\u9060\u9694\u30DA\u30A2\u30EA\u30F3\u30B0\u60C5\u5831\u3092\u8868\u793A\u3057\u3066\u304F\u3060\u3055\u3044\uFF1A\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3068\u3001\u30B9\u30AD\u30E3\u30F3\u3067\u304D\u308B QR \u30B3\u30FC\u30C9\u3002QR \u30B3\u30FC\u30C9\u306F\u7B49\u5E45\u30B3\u30FC\u30C9\u30D6\u30ED\u30C3\u30AF\u306B\u5165\u308C\u30011 \u6587\u5B57\u3082\u5909\u3048\u305A\u305D\u306E\u307E\u307E\u51FA\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u30B9\u30DE\u30DB\u3067\u30B9\u30AD\u30E3\u30F3\u3067\u304D\u308B\u3088\u3046\u306B\u3059\u308B\u305F\u3081\u3067\u3059\u3002",
|
|
706
1125
|
"pair.promptDescription": "\u30B9\u30DE\u30DB\u9060\u9694\u30DA\u30A2\u30EA\u30F3\u30B0\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u30FB\u30B9\u30AD\u30E3\u30F3\u7528 QR \u30B3\u30FC\u30C9\u3092\u8868\u793A",
|
|
707
1126
|
"pair.scanIntro": "**\u30B9\u30AD\u30E3\u30F3\u3067\u30DA\u30A2\u30EA\u30F3\u30B0**\uFF1A\u30B9\u30DE\u30DB\u3067 tunnelbox App\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3092\u958B\u304D\u3001\u4E0B\u306E QR \u30B3\u30FC\u30C9\u3092\u30B9\u30AD\u30E3\u30F3\u3059\u308B\u3068\u81EA\u52D5\u7684\u306B\u63A5\u7D9A\u3055\u308C\u307E\u3059\u3002",
|
|
@@ -816,7 +1235,148 @@ var ja_JP_default = {
|
|
|
816
1235
|
"hermes.pairTimeout": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u8981\u6C42\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF08\u30EA\u30EC\u30FC\u672A\u5FDC\u7B54\uFF09",
|
|
817
1236
|
"hermes.errToolPair": "tunnelbox_pair \u5931\u6557: {err}",
|
|
818
1237
|
"hermes.errToolStatus": "tunnelbox_status \u5931\u6557: {err}",
|
|
819
|
-
"hermes.cliUsage": "\u4F7F\u7528\u65B9\u6CD5: /tunnelbox <pair|status>\n pair \u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u53D6\u5F97\u3057\u3066\u8868\u793A\n status \u30EA\u30EC\u30FC/\u30D0\u30A4\u30F3\u30C9/\u63A5\u7D9A\u72B6\u614B\u3092\u8868\u793A"
|
|
1238
|
+
"hermes.cliUsage": "\u4F7F\u7528\u65B9\u6CD5: /tunnelbox <pair|status>\n pair \u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u53D6\u5F97\u3057\u3066\u8868\u793A\n status \u30EA\u30EC\u30FC/\u30D0\u30A4\u30F3\u30C9/\u63A5\u7D9A\u72B6\u614B\u3092\u8868\u793A",
|
|
1239
|
+
"qr.validFor": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u306E\u6709\u52B9\u671F\u9650\u306F\u7D0410\u5206\u3067\u3059\u3002\u671F\u9650\u5207\u308C\u306E\u5834\u5408\u306F\u30D1\u30BD\u30B3\u30F3\u5074\u3067\u518D\u53D6\u5F97\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1240
|
+
"pair.toolDesc": "\u3053\u306E\u30D1\u30BD\u30B3\u30F3\u306E\u30B9\u30DE\u30DB\u9023\u643A\u60C5\u5831\uFF08\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3068\u30B9\u30AD\u30E3\u30F3\u53EF\u80FD\u306AQR\u30B3\u30FC\u30C9\uFF09\u3092\u8868\u793A\u3057\u307E\u3059\u3002\u30DA\u30A2\u30EA\u30F3\u30B0\u3084QR\u30B3\u30FC\u30C9\u306E\u30B9\u30AD\u30E3\u30F3\u3001\u30B9\u30DE\u30DB\u304B\u3089\u306E\u64CD\u4F5C\u306B\u3064\u3044\u3066\u8CEA\u554F\u3055\u308C\u305F\u3068\u304D\u306B\u547C\u3073\u51FA\u3057\u307E\u3059\u3002",
|
|
1241
|
+
"pair.toolRefreshDesc": "\u30EA\u30EC\u30FC\u306B\u65B0\u3057\u3044\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u8981\u6C42\u3059\u308B\u304B\u3069\u3046\u304B",
|
|
1242
|
+
"state.errSaveState": "\u72B6\u614B\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
1243
|
+
"adapter.logConnected": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F {url}",
|
|
1244
|
+
"adapter.logDisconnected": "\u30EA\u30EC\u30FC\u304B\u3089\u5207\u65AD\u3055\u308C\u307E\u3057\u305F\u3002\u81EA\u52D5\u7684\u306B\u518D\u63A5\u7D9A\u3057\u3066\u3044\u307E\u3059\u2026",
|
|
1245
|
+
"adapter.logPairCode": "\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210\u3057\u307E\u3057\u305F: {code}",
|
|
1246
|
+
"adapter.logClaimed": "\u30B9\u30DE\u30DB\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u4ED8\u3051\u307E\u3057\u305F\u3002\u4EE5\u964D\u306F\u30B9\u30DE\u30DB\u306E\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u30FC\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3057\u307E\u3059",
|
|
1247
|
+
"adapter.logResetIdentity": "\u30A2\u30AB\u30A6\u30F3\u30C8\u304B\u3089\u89E3\u9664\u3055\u308C\u307E\u3057\u305F\u3002ID\u3092\u30EA\u30BB\u30C3\u30C8\u3057\u3001\u65B0\u3057\u3044\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u751F\u6210\u3057\u3066\u3044\u307E\u3059\u2026",
|
|
1248
|
+
"adapter.logUnhandledType": "\u672A\u51E6\u7406\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u30BF\u30A4\u30D7: {type}",
|
|
1249
|
+
"adapter.errNoRelay": "\u30EA\u30EC\u30FCURL\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u30D3\u30EB\u30C9\u6642\u306B --env \u3067\u65E2\u5B9A\u5024\u3092\u6CE8\u5165\u3059\u308B\u304B\u3001\u5B9F\u884C\u6642\u306B TUNNELBOX_RELAY_URL \u3067\u4E0A\u66F8\u304D\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
1250
|
+
"adapter.errBusy": "\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u5B9F\u884C\u4E2D\u3067\u3059\u3002\u5B8C\u4E86\u3092\u5F85\u3064\u304B\u3001\u5148\u306B\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
1251
|
+
"adapter.errBadWorkspaceEmpty": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u30D1\u30B9\u304C\u3042\u308A\u307E\u305B\u3093",
|
|
1252
|
+
"adapter.errBadWorkspaceNotDir": "\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u5B58\u5728\u3057\u306A\u3044\u304B\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093",
|
|
1253
|
+
"adapter.errWorkspaceMissing": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093: {dir}",
|
|
1254
|
+
"adapter.cmdNew": "\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
1255
|
+
"adapter.cmdHelp": "\u30D8\u30EB\u30D7\u3092\u8868\u793A",
|
|
1256
|
+
"adapter.helpText": "\u4F7F\u7528\u53EF\u80FD\u306A\u30B3\u30DE\u30F3\u30C9\uFF1A\n- /new \u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\n- /help \u30D8\u30EB\u30D7\u3092\u8868\u793A",
|
|
1257
|
+
"adapter.newSessionTitle": "\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
1258
|
+
"install.langHelpTitle": "install-local \u304C\u5BFE\u5FDC\u3059\u308B\u8A00\u8A9E\uFF08--lang <tag>\uFF09\uFF1A",
|
|
1259
|
+
"install.langHelpExample": "\u4F8B: npm run install-local -- --lang de-DE",
|
|
1260
|
+
"install.unknownLang": '\u4E0D\u660E\u306A\u8A00\u8A9E "{raw}" \u306E\u305F\u3081 en-US \u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3057\u307E\u3059\u3002\u5BFE\u5FDC: {list}',
|
|
1261
|
+
"hermes.errAskRequired": "question \u306F\u5FC5\u9808\u3067\u3059",
|
|
1262
|
+
"hermes.msgPhoneUnavailable": "\u30B9\u30DE\u30DB\u304C\u5229\u7528\u3067\u304D\u306A\u3044\u304B\u5FDC\u7B54\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u7D44\u307F\u8FBC\u307F\u306E clarify \u3067\u30ED\u30FC\u30AB\u30EB\u306B\u8CEA\u554F\u3059\u308B\u304B\u3001\u3054\u81EA\u8EAB\u3067\u5224\u65AD\u3057\u3066\u7D9A\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1263
|
+
"hermes.errClarifyUnavailable": "clarify \u30B5\u30DD\u30FC\u30C8\u306F\u5229\u7528\u3067\u304D\u307E\u305B\u3093",
|
|
1264
|
+
"hermes.errAskFailed": "tunnelbox_ask \u306B\u5931\u6557\u3057\u307E\u3057\u305F: {err}",
|
|
1265
|
+
"hermes.errClarifyFailed": "clarify \u306B\u5931\u6557\u3057\u307E\u3057\u305F: {err}",
|
|
1266
|
+
"bin.denied": "\u30B9\u30DE\u30DB\u3067\u62D2\u5426\u3055\u308C\u307E\u3057\u305F",
|
|
1267
|
+
"bin.timeout": "\u627F\u8A8D\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F\uFF08fail-closed\uFF09",
|
|
1268
|
+
"bin.reqRun": "Claude Code \u304C {tool} \u306E\u5B9F\u884C\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
|
|
1269
|
+
"bin.pairTitle": "tunnelbox \u30B9\u30DE\u30DB\u9023\u643A",
|
|
1270
|
+
"bin.pairCodeLine": " \u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9: {code}",
|
|
1271
|
+
"bin.pairHint": "tunnelbox \u30A2\u30D7\u30EA\u3092\u958B\u304D\u300C\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u30DA\u30A2\u30EA\u30F3\u30B0\u300D\u3067QR\u30B3\u30FC\u30C9\u3092\u8AAD\u307F\u53D6\u308B\u304B\u3001\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u3092\u624B\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\uFF081\u56DE\u9650\u308A\uFF09\u3002",
|
|
1272
|
+
"bin.pairWritten": " \u9023\u643A\u60C5\u5831\u3092\u66F8\u304D\u8FBC\u307F\u307E\u3057\u305F: {path}",
|
|
1273
|
+
"bin.pairRequestFailed": "\u30EA\u30EC\u30FC\u3078\u306E\u30DA\u30A2\u30EA\u30F3\u30B0\u30B3\u30FC\u30C9\u8981\u6C42\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002",
|
|
1274
|
+
"bin.alreadyClaimed": "\u3053\u306E\u30D1\u30BD\u30B3\u30F3\u306F\u65E2\u306B\u30B9\u30DE\u30DB\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u7D10\u4ED8\u3051\u3089\u308C\u3066\u3044\u307E\u3059\u3002\u30B9\u30DE\u30DB\u306E\u300C\u30DE\u30A4\u30B3\u30F3\u30D4\u30E5\u30FC\u30BF\u30FC\u300D\u304B\u3089\u76F4\u63A5\u63A5\u7D9A\u3067\u304D\u307E\u3059\u3002\u518D\u30DA\u30A2\u30EA\u30F3\u30B0\u3059\u308B\u306B\u306F\u3001\u5148\u306B\u30B9\u30DE\u30DB\u5074\u3067\u89E3\u9664\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1275
|
+
"bin.noRelay": "\u30EA\u30EC\u30FCURL\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u74B0\u5883\u5909\u6570 TUNNELBOX_RELAY_URL \u3092\u8A2D\u5B9A\u3057\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1276
|
+
"bin.connectFailed": "\u30EA\u30EC\u30FC\u306B\u63A5\u7D9A\u3067\u304D\u307E\u305B\u3093: {relay}\nTUNNELBOX_RELAY_URL \u3092\u8A2D\u5B9A\u3059\u308B\u304B\u3001official-plugin \u306E\u72B6\u614B\u30D5\u30A1\u30A4\u30EB\u3067\u69CB\u6210\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1277
|
+
"bin.statusRelay": "\u30EA\u30EC\u30FC: {value}",
|
|
1278
|
+
"bin.statusAgent": "\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8ID: {value}",
|
|
1279
|
+
"bin.statusClaimed": "\u30B9\u30DE\u30DB\u9023\u643A: {value}",
|
|
1280
|
+
"bin.statusStateFile": "\u72B6\u614B\u30D5\u30A1\u30A4\u30EB: {value}",
|
|
1281
|
+
"bin.statusLatest": "\u6700\u65B0\u306E\u9023\u643A\u60C5\u5831:",
|
|
1282
|
+
"bin.usage": "\u4F7F\u7528\u6CD5: tunnelbox <pair|status|ask>",
|
|
1283
|
+
"bin.usagePair": " pair \u30B9\u30DE\u30DB\u9023\u643A\u30B3\u30FC\u30C9\u3092\u53D6\u5F97\u3057\u3066\u8868\u793A",
|
|
1284
|
+
"bin.usageStatus": " status \u30EA\u30EC\u30FC/\u9023\u643A\u72B6\u614B\u3092\u8868\u793A",
|
|
1285
|
+
"bin.usageAsk": " ask \u30C4\u30FC\u30EB\u627F\u8A8D\u3092\u30B9\u30DE\u30DB\u306B\u8EE2\u9001",
|
|
1286
|
+
"adapter.logMsgUncaught": "\u30E1\u30C3\u30BB\u30FC\u30B8\u51E6\u7406\u3067\u672A\u6355\u6349\u306E\u4F8B\u5916: {message}",
|
|
1287
|
+
"adapter.logHandleFailed": "{type} \u306E\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
|
|
1288
|
+
"adapter.logPromptFailed": "session.prompt \u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
|
|
1289
|
+
"adapter.logAbortSent": "\u4E2D\u6B62\u3092\u9001\u4FE1\u3057\u307E\u3057\u305F (session={session})",
|
|
1290
|
+
"adapter.errUserDenied": "\u30E6\u30FC\u30B6\u30FC\u304C\u62D2\u5426\u3057\u307E\u3057\u305F",
|
|
1291
|
+
"adapter.logPendingResent": "session.pending: \u672A\u51E6\u7406\u30EA\u30AF\u30A8\u30B9\u30C8\u3092 {count} \u4EF6\u518D\u9001\u3057\u307E\u3057\u305F",
|
|
1292
|
+
"adapter.logWorkspaceSwitched": "\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u5207\u308A\u66FF\u3048\u307E\u3057\u305F: {path}",
|
|
1293
|
+
"adapter.logNewSession": "\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u4FDD\u5B58 codexId={codexId} (alias={session})",
|
|
1294
|
+
"adapter.logSessionError": "\u30BF\u30FC\u30F3\u30A8\u30E9\u30FC (session={session}): {message}",
|
|
1295
|
+
"adapter.logDshSent": "dsh \u306B\u9001\u4FE1\u3057\u307E\u3057\u305F (session={session})",
|
|
1296
|
+
"adapter.logReadHistoryFailed": "\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557\u3057\u307E\u3057\u305F ({session}): {message}",
|
|
1297
|
+
"adapter.logAnswererInitFailed": "\u5FDC\u7B54\u8005\u306E\u521D\u671F\u5316\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
|
|
1298
|
+
"adapter.logRemoteMode": "\u4E21\u5074\u540C\u6642\u8868\u793A\u30E2\u30FC\u30C9: \u9078\u629E/\u627F\u8A8D\u306F typert \u30DE\u30EB\u30C1\u30AF\u30E9\u30A4\u30A2\u30F3\u30C8\u653E\u9001\u3092\u4F7F\u7528\u3002\u30B9\u30DE\u30DB\u3068 dsh web \u304C\u540C\u3058\u753B\u9762\u3092\u5171\u6709\u3057\u3001\u5148\u306B\u56DE\u7B54\u3057\u305F\u65B9\u304C\u6709\u52B9",
|
|
1299
|
+
"adapter.logRemoteProbeFailed": "typert \u30EA\u30E2\u30FC\u30C8\u30A4\u30D9\u30F3\u30C8\u30BD\u30FC\u30B9\u306E\u691C\u51FA\u306B\u5931\u6557\u3002\u30ED\u30FC\u30AB\u30EB\u5FDC\u7B54\u30E2\u30FC\u30C9\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF\u3057\u307E\u3059: {message}",
|
|
1300
|
+
"adapter.logLocalMode": "\u30ED\u30FC\u30AB\u30EB\u5FDC\u7B54\u30E2\u30FC\u30C9: \u9078\u629E/\u627F\u8A8D\u306F\u30B9\u30DE\u30DB\u304C\u56DE\u7B54\uFF08headless\u3001dsh web \u653E\u9001\u306A\u3057\uFF09",
|
|
1301
|
+
"adapter.logRemoteStreamInterrupted": "remote events \u30B9\u30C8\u30EA\u30FC\u30E0\u304C\u4E2D\u65AD\u3057\u307E\u3057\u305F: {message}",
|
|
1302
|
+
"adapter.logResultRejected": "$events/result \u304C\u53D7\u7406\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F ({eventId}): {message}",
|
|
1303
|
+
"adapter.logResultBackfillFailed": "$events/result \u306E\u66F8\u304D\u623B\u3057\u306B\u5931\u6557\u3057\u307E\u3057\u305F ({eventId}): {message}",
|
|
1304
|
+
"adapter.logRemoteQuestion": "remote \u8CEA\u554F\u653E\u9001 \u2192 \u30B9\u30DE\u30DB\u8CEA\u554F\u30AB\u30FC\u30C9 questionID={id} (session={session})",
|
|
1305
|
+
"adapter.errRemoteReadyFrame": "remote events \u306E\u6700\u521D\u306E\u30D5\u30EC\u30FC\u30E0\u304C\u7570\u5E38\u3067\u3059",
|
|
1306
|
+
"adapter.logRemoteApproval": "remote \u627F\u8A8D\u653E\u9001 \u2192 \u30B9\u30DE\u30DB\u6A29\u9650\u30AB\u30FC\u30C9 permissionID={id} (session={session})",
|
|
1307
|
+
"adapter.logUserQuestionRoute": "user-questions \u9078\u629E \u2192 session={session} \u306B\u30EB\u30FC\u30C6\u30A3\u30F3\u30B0",
|
|
1308
|
+
"adapter.errDshQuestionEmpty": "dsh \u306E\u8CEA\u554F\u5185\u5BB9\u304C\u7A7A\u3067\u3059",
|
|
1309
|
+
"adapter.errQuestionTimeout": "\u8CEA\u554F\u304C\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3057\u307E\u3057\u305F ({seconds}s)\u3001\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F",
|
|
1310
|
+
"adapter.errQuestionCancelledAbort": "\u8CEA\u554F\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F\uFF08\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u4E2D\u6B62\uFF09",
|
|
1311
|
+
"adapter.errQuestionCancelledRelay": "\u30EA\u30EC\u30FC\u306B\u5230\u9054\u3067\u304D\u305A\u3001\u8CEA\u554F\u304C\u30AD\u30E3\u30F3\u30BB\u30EB\u3055\u308C\u307E\u3057\u305F",
|
|
1312
|
+
"adapter.logQuestionToPhone": "user-questions \u9078\u629E \u2192 \u30B9\u30DE\u30DB\u8CEA\u554F\u30AB\u30FC\u30C9\u306B\u9001\u4FE1 questionID={id} (session={session})",
|
|
1313
|
+
"adapter.errQuestionUserCancelled": "\u30E6\u30FC\u30B6\u30FC\u304C\u30B9\u30DE\u30DB\u3067\u8CEA\u554F\u3092\u30AD\u30E3\u30F3\u30BB\u30EB/\u62D2\u5426\u3057\u307E\u3057\u305F",
|
|
1314
|
+
"adapter.logApprovalRequest": "\u627F\u8A8D\u30EA\u30AF\u30A8\u30B9\u30C8 (tool={tool}) \u2192 \u30B9\u30DE\u30DB\u6A29\u9650\u30AB\u30FC\u30C9\u306B\u9001\u4FE1 permissionID={id}",
|
|
1315
|
+
"adapter.logAgentPresetFailed": "agentPreset \u306E\u89E3\u6C7A\u306B\u5931\u6557\u3057\u307E\u3057\u305F ({preset})\u3002preset \u306A\u3057\u306B\u30D5\u30A9\u30FC\u30EB\u30D0\u30C3\u30AF: {message}",
|
|
1316
|
+
"adapter.logSessionLiveAdopted": "\u30BB\u30C3\u30B7\u30E7\u30F3 {session} \u306F\u3053\u306E\u30D7\u30ED\u30BB\u30B9\u306E\u5225\u306E\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u304C\u4FDD\u6301\u4E2D\uFF08live\uFF09\u3002\u65E2\u5B58\u306E\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u3092\u63A1\u7528\u3057\u3066\u7D99\u7D9A\u3057\u307E\u3059: {message}",
|
|
1317
|
+
"adapter.logDisposeSkipped": "\u63A1\u7528\u3057\u305F\u5916\u90E8 live \u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306F dispose \u3092\u5B9F\u884C\u3057\u307E\u305B\u3093\uFF08\u30BB\u30C3\u30B7\u30E7\u30F3 {session} \u306F\u5143\u306E\u4FDD\u6301\u8005\u304C\u7BA1\u7406\uFF09",
|
|
1318
|
+
"adapter.logAgentCreateFailed": "\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u4F5C\u6210/\u518D\u958B\u306B\u5931\u6557\u3057\u307E\u3057\u305F ({session}): {message}",
|
|
1319
|
+
"adapter.errSessionBusyLive": "\u30BB\u30C3\u30B7\u30E7\u30F3 {session} \u306F\u4F7F\u7528\u4E2D\u3067\u3059\uFF08live\uFF09\u3002\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044",
|
|
1320
|
+
"adapter.errAgentsUnavailable": "agents \u30B5\u30FC\u30D3\u30B9\u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093",
|
|
1321
|
+
"adapter.logToolReason": "dsh \u304C\u30C4\u30FC\u30EB {tool} \u306E\u5B9F\u884C\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
|
|
1322
|
+
"adapter.logGatewayConnected": "\u30ED\u30FC\u30AB\u30EB OpenClaw Gateway \u306B\u63A5\u7D9A\u3057\u307E\u3057\u305F\uFF08{version}\uFF09",
|
|
1323
|
+
"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
|
+
"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",
|
|
1325
|
+
"adapter.errGatewayNoSessionKey": "Gateway \u304C\u30BB\u30C3\u30B7\u30E7\u30F3 key \u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F",
|
|
1326
|
+
"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
|
+
"adapter.logApprovalReplyFailed": "\u627F\u8A8D\u5FDC\u7B54\u306B\u5931\u6557\u3057\u307E\u3057\u305F ({id}): {message}",
|
|
1328
|
+
"adapter.logPendingApproval": "session.pending: \u672A\u51E6\u7406\u306E\u627F\u8A8D\u3092 {count} \u4EF6\u518D\u9001\u3057\u307E\u3057\u305F (session={session})",
|
|
1329
|
+
"adapter.workspaceDefault": "\u30C7\u30D5\u30A9\u30EB\u30C8",
|
|
1330
|
+
"adapter.cursorSessionTitle": "Cursor \u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
1331
|
+
"adapter.reasonDisconnect": "\u30EA\u30EC\u30FC\u5207\u65AD\u3001\u81EA\u52D5\u62D2\u5426\uFF08fail-closed\uFF09",
|
|
1332
|
+
"adapter.warnInvalidEnv": "\u7121\u52B9\u306A {name} \u3092\u7121\u8996\u3057\u307E\u3059: {raw}\uFF08{list}\uFF09",
|
|
1333
|
+
"adapter.errStartFailed": "\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F:",
|
|
1334
|
+
"adapter.msgStarted": "{name} \u30A2\u30C0\u30D7\u30BF\u30FC\u3092\u8D77\u52D5\u3057\u307E\u3057\u305F\uFF08Ctrl+C \u3067\u7D42\u4E86\uFF09",
|
|
1335
|
+
"adapter.warnCliMissing": "\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u300C{bin}\u300D\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\uFF08\u4F8B: npm i -g @openai/codex\uFF09\u304B\u3001TUNNELBOX_CODEX_BIN \u3067\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
1336
|
+
"adapter.errCliNotFound": "{name} \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u300C{bin}\u300D\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF1ACodex CLI \u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\uFF08npm i -g @openai/codex\uFF09\u3059\u308B\u304B TUNNELBOX_CODEX_BIN \u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
1337
|
+
"adapter.errSessionNotFound": "\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u5B58\u5728\u3057\u306A\u3044\u304B\u3001\u3059\u3067\u306B\u524A\u9664\u3055\u308C\u3066\u3044\u307E\u3059",
|
|
1338
|
+
"adapter.checkHeader": "tunnelbox-codex \u74B0\u5883\u30C1\u30A7\u30C3\u30AF",
|
|
1339
|
+
"adapter.checkCliOk": "{name} \u5B9F\u884C\u30D5\u30A1\u30A4\u30EB: {path}",
|
|
1340
|
+
"adapter.checkCliMissing": "{name} \u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08{bin}\uFF09",
|
|
1341
|
+
"bin.yes": "\u306F\u3044",
|
|
1342
|
+
"bin.no": "\u3044\u3044\u3048",
|
|
1343
|
+
"adapter.errAppServerSpawn": "codex app-server \u3092\u8D77\u52D5\u3067\u304D\u307E\u305B\u3093: {message}\uFF08Codex CLI \u304C `codex app-server` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
1344
|
+
"adapter.errAppServerExit": "codex app-server \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\u3002\u4FDD\u7559\u4E2D\u306E\u627F\u8A8D/\u9078\u629E\u306F\u81EA\u52D5\u7684\u306B\u62D2\u5426\u3055\u308C\u307E\u3057\u305F",
|
|
1345
|
+
"adapter.logUnsupportedServerRequest": "\u672A\u5BFE\u5FDC\u306E app-server \u30EA\u30AF\u30A8\u30B9\u30C8: {method}",
|
|
1346
|
+
"adapter.logQuestionNative": "\u9078\u629E\u30EA\u30AF\u30A8\u30B9\u30C8 -> \u30B9\u30DE\u30DB\u9078\u629E\u30AB\u30FC\u30C9 questionID={id} (session={session})",
|
|
1347
|
+
"adapter.logPermissionNative": "\u627F\u8A8D\u30EA\u30AF\u30A8\u30B9\u30C8 -> \u30B9\u30DE\u30DB\u627F\u8A8D\u30AB\u30FC\u30C9 permissionID={id} (session={session})",
|
|
1348
|
+
"adapter.checkAppServerOk": "codex app-server \u5229\u7528\u53EF\u80FD",
|
|
1349
|
+
"adapter.checkAppServerMissing": "\u3053\u306E Codex CLI \u306F `codex app-server` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u307E\u305B\u3093\uFF08Codex CLI \u3092\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
1350
|
+
"adapter.warnCursorCliMissing": 'Cursor CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB "{bin}" \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\uFF08https://cursor.com/docs/cli\uFF09\u3059\u308B\u304B\u3001TUNNELBOX_CURSOR_BIN \u306B\u30D1\u30B9\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044',
|
|
1351
|
+
"adapter.checkCursorCliMissing": "Cursor CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08{bin}\uFF09\u3002https://cursor.com/docs/cli \u304B\u3089\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
1352
|
+
"adapter.checkCursorAcpHint": "Cursor CLI \u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002ACP \u30E2\u30FC\u30C9\uFF08`agent acp`\uFF09\u3067\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0/\u627F\u8A8D/\u9078\u629E\u3092\u63D0\u4F9B\u3057\u307E\u3059",
|
|
1353
|
+
"adapter.errAcpSpawn": "cursor `agent acp` \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}\uFF08Cursor CLI \u304C `agent acp` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
1354
|
+
"adapter.errAcpNoSession": "Cursor ACP \u304C\u30BB\u30C3\u30B7\u30E7\u30F3 id \u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F",
|
|
1355
|
+
"adapter.logResumeFailed": "\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u518D\u958B\u306B\u5931\u6557\u3057\u305F\u305F\u3081\u3001\u65B0\u898F\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u958B\u59CB\u3057\u307E\u3059: {message}",
|
|
1356
|
+
"adapter.logPlanNative": "\u30D7\u30E9\u30F3\u627F\u8A8D -> \u30B9\u30DE\u30DB\u306E\u627F\u8A8D\u30AB\u30FC\u30C9 permissionID={id} (session={session})",
|
|
1357
|
+
"adapter.errTimeout": "\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u306E\u305F\u3081\u81EA\u52D5\u62D2\u5426\u3057\u307E\u3057\u305F\uFF08fail-closed\uFF09",
|
|
1358
|
+
"adapter.planApprovalPrompt": "Cursor \u304C\u30D7\u30E9\u30F3\u306E\u627F\u8A8D\u3092\u8981\u6C42\u3057\u3066\u3044\u307E\u3059",
|
|
1359
|
+
"adapter.checkCursorHeader": "tunnelbox-cursor \u74B0\u5883\u30C1\u30A7\u30C3\u30AF",
|
|
1360
|
+
"adapter.errAskBridge": "ask \u30D6\u30EA\u30C3\u30B8\u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
|
|
1361
|
+
"adapter.logAskBridge": "MCP ask \u30D6\u30EA\u30C3\u30B8\u304C {url} \u3067\u5F85\u3061\u53D7\u3051\u4E2D",
|
|
1362
|
+
"cursor.mcpAskDesc": "\u30E6\u30FC\u30B6\u30FC\u306B\u30B9\u30DE\u30DB\uFF08tunnelbox\uFF09\u3067\u9078\u629E\u3055\u305B\u3001\u56DE\u7B54\u304C\u3042\u308B\u307E\u3067\u30D6\u30ED\u30C3\u30AF\u3057\u307E\u3059\u3002\u7D9A\u884C\u524D\u306B\u30E6\u30FC\u30B6\u30FC\u304C\u9078\u629E\u80A2\u304B\u3089\u9078\u3076\u5FC5\u8981\u304C\u3042\u308B\u5834\u5408\uFF08\u6599\u7406\u30FB\u30E2\u30FC\u30C9\u30FB\u30D7\u30E9\u30F3\u6848\u306E\u9078\u629E\u306A\u3069\uFF09\u306B\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u9078\u629E\u3055\u308C\u305F\u9078\u629E\u80A2\u306E\u30E9\u30D9\u30EB\u3092\u8FD4\u3057\u307E\u3059\u3002",
|
|
1363
|
+
"cursor.mcpAskTitleDesc": "\u30B9\u30DE\u30DB\u306E\u30AB\u30FC\u30C9\u306B\u8868\u793A\u3059\u308B\u30BF\u30A4\u30C8\u30EB\uFF08\u4EFB\u610F\uFF09",
|
|
1364
|
+
"cursor.mcpAskQuestionsDesc": "1 \u3064\u4EE5\u4E0A\u306E\u8CEA\u554F\u3002\u5404\u8CEA\u554F\u306B\u306F\u9078\u629E\u80A2\u304C\u3042\u308A\u307E\u3059",
|
|
1365
|
+
"cursor.mcpPlanDesc": "\u30E6\u30FC\u30B6\u30FC\u306B\u30B9\u30DE\u30DB\uFF08tunnelbox\uFF09\u3067\u30D7\u30E9\u30F3\u306E\u627F\u8A8D\u3092\u6C42\u3081\u3001\u5FDC\u7B54\u304C\u3042\u308B\u307E\u3067\u30D6\u30ED\u30C3\u30AF\u3057\u307E\u3059\u3002\u627F\u8A8D\u3055\u308C\u305F\u304B\u3069\u3046\u304B\u3092\u8FD4\u3057\u307E\u3059\u3002",
|
|
1366
|
+
"cursor.mcpNoBridge": "tunnelbox ask \u30D6\u30EA\u30C3\u30B8\u304C\u5229\u7528\u3067\u304D\u307E\u305B\u3093",
|
|
1367
|
+
"cursor.mcpUnanswered": "\u30E6\u30FC\u30B6\u30FC\u306F\u30B9\u30DE\u30DB\u3067\u56DE\u7B54\u3057\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u307E\u305F\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF09\u3002\u7D9A\u884C\u3059\u308B\u304B\u3001\u4F1A\u8A71\u3067\u5C0B\u306D\u3066\u304F\u3060\u3055\u3044\u3002",
|
|
1368
|
+
"cursor.mcpRejected": "\u30E6\u30FC\u30B6\u30FC\u306F\u30B9\u30DE\u30DB\u3067\u8CEA\u554F\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002",
|
|
1369
|
+
"cursor.mcpAnswersHeader": "\u30E6\u30FC\u30B6\u30FC\uFF08\u30B9\u30DE\u30DB\uFF09\u306E\u56DE\u7B54:",
|
|
1370
|
+
"cursor.mcpAccepted": "\u30E6\u30FC\u30B6\u30FC\u306F\u30D7\u30E9\u30F3\u3092\u627F\u8A8D\u3057\u307E\u3057\u305F\u3002",
|
|
1371
|
+
"cursor.mcpDenied": "\u30E6\u30FC\u30B6\u30FC\u306F\u30D7\u30E9\u30F3\u3092\u62D2\u5426\u3057\u307E\u3057\u305F\u3002",
|
|
1372
|
+
"cursor.mcpPlanUnanswered": "\u30E6\u30FC\u30B6\u30FC\u306F\u30B9\u30DE\u30DB\u3067\u30D7\u30E9\u30F3\u306B\u5FDC\u7B54\u3057\u307E\u305B\u3093\u3067\u3057\u305F\uFF08\u30AA\u30D5\u30E9\u30A4\u30F3\u307E\u305F\u306F\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF09\u3002",
|
|
1373
|
+
"cursor.mcpAskNoQuestions": "\u8CEA\u554F\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002",
|
|
1374
|
+
"cursor.mcpFailed": "tunnelbox ask \u304C\u5931\u6557\u3057\u307E\u3057\u305F",
|
|
1375
|
+
"adapter.errCursorExitCode": "Cursor CLI \u304C\u30B3\u30FC\u30C9 {code} \u3067\u7D42\u4E86\u3057\u307E\u3057\u305F",
|
|
1376
|
+
"adapter.errCursorExit": "Cursor CLI \u304C\u7D42\u4E86\u3057\u307E\u3057\u305F\uFF08{code}\uFF09: {err}",
|
|
1377
|
+
"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
|
+
"adapter.errCursorStart": "Cursor CLI \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}",
|
|
1379
|
+
"adapter.errCursorGeneric": "Cursor \u30A8\u30E9\u30FC"
|
|
820
1380
|
};
|
|
821
1381
|
var ko_KR_default = {
|
|
822
1382
|
"agent.err.createSession": "\uC138\uC158 \uC0DD\uC131 \uC2E4\uD328",
|
|
@@ -867,7 +1427,7 @@ var ko_KR_default = {
|
|
|
867
1427
|
"install.scanHint": "\uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uC744 \uC5F4\uACE0 \uC704 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\uD558\uC138\uC694:",
|
|
868
1428
|
"pair.heading": "tunnelbox \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1",
|
|
869
1429
|
"pair.howTo": "\uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571\uC744 \uC5F4\uACE0 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uB85C \uC704 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uAC70\uB098 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC785\uB825\uD558\uC138\uC694.",
|
|
870
|
-
"pair.oneTime":
|
|
1430
|
+
"pair.oneTime": '\uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB294 1\uD68C\uC6A9\uC774\uBA70 \uC57D 10\uBD84\uAC04 \uC720\uD6A8\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uD558\uAC70\uB098 \uB9CC\uB8CC\uB418\uBA74 \uBB34\uD6A8\uAC00 \uB429\uB2C8\uB2E4. \uC0C8 \uCF54\uB4DC\uAC00 \uD544\uC694\uD558\uBA74 "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0C8\uB85C \uACE0\uCE68"\uC744 \uC694\uCCAD\uD558\uC138\uC694.',
|
|
871
1431
|
"pair.promptBody": "\uC774 PC\uC758 \uD734\uB300\uD3F0 \uC6D0\uACA9 \uD398\uC5B4\uB9C1 \uC815\uBCF4\uB97C \uBCF4\uC5EC\uC8FC\uC138\uC694: \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uC640 \uC2A4\uCE94\uD560 \uC218 \uC788\uB294 QR \uCF54\uB4DC. QR \uCF54\uB4DC\uB294 \uACE0\uC815\uD3ED \uCF54\uB4DC \uBE14\uB85D\uC5D0 \uB123\uACE0 \uD55C \uAE00\uC790\uB3C4 \uBC14\uAFB8\uC9C0 \uB9D0\uACE0 \uADF8\uB300\uB85C \uD45C\uC2DC\uD574 \uC8FC\uC138\uC694. \uD734\uB300\uD3F0\uC73C\uB85C \uC2A4\uCE94\uD560 \uC218 \uC788\uB3C4\uB85D \uD558\uAE30 \uC704\uD568\uC785\uB2C8\uB2E4.",
|
|
872
1432
|
"pair.promptDescription": "\uD734\uB300\uD3F0 \uC6D0\uACA9 \uD398\uC5B4\uB9C1\uC758 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\xB7\uC2A4\uCE94\uC6A9 QR \uCF54\uB4DC \uD45C\uC2DC",
|
|
873
1433
|
"pair.scanIntro": "**\uC2A4\uCE94\uC73C\uB85C \uC5F0\uACB0**: \uD734\uB300\uD3F0\uC5D0\uC11C tunnelbox \uC571 \u201C\uC2A4\uCE94\uD558\uC5EC \uC5F0\uACB0\u201D\uC744 \uC5F4\uACE0 \uC544\uB798 QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uBA74 \uC790\uB3D9\uC73C\uB85C \uC5F0\uACB0\uB429\uB2C8\uB2E4.",
|
|
@@ -982,7 +1542,148 @@ var ko_KR_default = {
|
|
|
982
1542
|
"hermes.pairTimeout": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD \uC2DC\uAC04 \uCD08\uACFC(\uB9B4\uB808\uC774 \uBBF8\uC751\uB2F5)",
|
|
983
1543
|
"hermes.errToolPair": "tunnelbox_pair \uC2E4\uD328: {err}",
|
|
984
1544
|
"hermes.errToolStatus": "tunnelbox_status \uC2E4\uD328: {err}",
|
|
985
|
-
"hermes.cliUsage": "\uC0AC\uC6A9\uBC95: /tunnelbox <pair|status>\n pair \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD/\uCD9C\uB825\n status \uB9B4\uB808\uC774/\uBC14\uC778\uB529/\uC5F0\uACB0 \uC0C1\uD0DC \uD45C\uC2DC"
|
|
1545
|
+
"hermes.cliUsage": "\uC0AC\uC6A9\uBC95: /tunnelbox <pair|status>\n pair \uD734\uB300\uD3F0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD/\uCD9C\uB825\n status \uB9B4\uB808\uC774/\uBC14\uC778\uB529/\uC5F0\uACB0 \uC0C1\uD0DC \uD45C\uC2DC",
|
|
1546
|
+
"qr.validFor": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB294 \uC57D 10\uBD84\uAC04 \uC720\uD6A8\uD569\uB2C8\uB2E4. \uB9CC\uB8CC\uB418\uBA74 \uCEF4\uD4E8\uD130\uC5D0\uC11C \uC0C8\uB85C \uBC1B\uC73C\uC138\uC694.",
|
|
1547
|
+
"pair.toolDesc": "\uC774 \uCEF4\uD4E8\uD130\uC758 \uC2A4\uB9C8\uD2B8\uD3F0 \uD398\uC5B4\uB9C1 \uC815\uBCF4(\uD398\uC5B4\uB9C1 \uCF54\uB4DC\uC640 \uC2A4\uCE94 \uAC00\uB2A5\uD55C QR \uCF54\uB4DC)\uB97C \uD45C\uC2DC\uD569\uB2C8\uB2E4. \uD398\uC5B4\uB9C1, QR \uCF54\uB4DC \uC2A4\uCE94, \uC2A4\uB9C8\uD2B8\uD3F0\uC73C\uB85C \uC774 \uCEF4\uD4E8\uD130 \uC81C\uC5B4\uC5D0 \uB300\uD574 \uBB3C\uC5B4\uBCFC \uB54C \uD638\uCD9C\uD558\uC138\uC694.",
|
|
1548
|
+
"pair.toolRefreshDesc": "\uB9B4\uB808\uC774\uC5D0 \uC0C8 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC694\uCCAD\uD560\uC9C0 \uC5EC\uBD80",
|
|
1549
|
+
"state.errSaveState": "\uC0C1\uD0DC \uC800\uC7A5 \uC2E4\uD328",
|
|
1550
|
+
"adapter.logConnected": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uB428 {url}",
|
|
1551
|
+
"adapter.logDisconnected": "\uB9B4\uB808\uC774\uC640 \uC5F0\uACB0\uC774 \uB04A\uC5B4\uC84C\uC2B5\uB2C8\uB2E4. \uC790\uB3D9\uC73C\uB85C \uC7AC\uC5F0\uACB0 \uC911\u2026",
|
|
1552
|
+
"adapter.logPairCode": "\uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC0DD\uC131\uB428: {code}",
|
|
1553
|
+
"adapter.logClaimed": "\uC2A4\uB9C8\uD2B8\uD3F0 \uACC4\uC815\uC5D0 \uC5F0\uACB0\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC774\uC81C\uBD80\uD130 \uC2A4\uB9C8\uD2B8\uD3F0\uC758 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD569\uB2C8\uB2E4",
|
|
1554
|
+
"adapter.logResetIdentity": "\uACC4\uC815\uC5D0\uC11C \uD574\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4. ID\uB97C \uC7AC\uC124\uC815\uD558\uACE0 \uC0C8 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC0DD\uC131 \uC911\u2026",
|
|
1555
|
+
"adapter.logUnhandledType": "\uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uBA54\uC2DC\uC9C0 \uC720\uD615: {type}",
|
|
1556
|
+
"adapter.errNoRelay": "\uB9B4\uB808\uC774 URL\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uBE4C\uB4DC \uC2DC --env\uB85C \uAE30\uBCF8\uAC12\uC744 \uC8FC\uC785\uD558\uAC70\uB098 \uB7F0\uD0C0\uC784\uC5D0 TUNNELBOX_RELAY_URL\uB85C \uC7AC\uC815\uC758\uD558\uC138\uC694",
|
|
1557
|
+
"adapter.errBusy": "\uC774 \uC138\uC158\uC774 \uC544\uC9C1 \uC2E4\uD589 \uC911\uC785\uB2C8\uB2E4. \uC644\uB8CC\uB97C \uAE30\uB2E4\uB9AC\uAC70\uB098 \uBA3C\uC800 \uC911\uC9C0\uD558\uC138\uC694",
|
|
1558
|
+
"adapter.errBadWorkspaceEmpty": "\uC791\uC5C5 \uACF5\uAC04 \uACBD\uB85C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
1559
|
+
"adapter.errBadWorkspaceNotDir": "\uB514\uB809\uD130\uB9AC\uAC00 \uC5C6\uAC70\uB098 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
1560
|
+
"adapter.errWorkspaceMissing": "\uC791\uC5C5 \uACF5\uAC04\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4: {dir}",
|
|
1561
|
+
"adapter.cmdNew": "\uC0C8 \uC138\uC158",
|
|
1562
|
+
"adapter.cmdHelp": "\uB3C4\uC6C0\uB9D0 \uD45C\uC2DC",
|
|
1563
|
+
"adapter.helpText": "\uC9C0\uC6D0\uB418\uB294 \uBA85\uB839:\n- /new \uC0C8 \uC138\uC158\n- /help \uB3C4\uC6C0\uB9D0 \uD45C\uC2DC",
|
|
1564
|
+
"adapter.newSessionTitle": "\uC0C8 \uC138\uC158",
|
|
1565
|
+
"install.langHelpTitle": "install-local \uC9C0\uC6D0 \uC5B8\uC5B4(--lang <tag>):",
|
|
1566
|
+
"install.langHelpExample": "\uC608: npm run install-local -- --lang de-DE",
|
|
1567
|
+
"install.unknownLang": '\uC54C \uC218 \uC5C6\uB294 \uC5B8\uC5B4 "{raw}"\uC774\uBBC0\uB85C en-US\uB85C \uB300\uCCB4\uD569\uB2C8\uB2E4. \uC9C0\uC6D0: {list}',
|
|
1568
|
+
"hermes.errAskRequired": "question\uC740 \uD544\uC218\uC785\uB2C8\uB2E4",
|
|
1569
|
+
"hermes.msgPhoneUnavailable": "\uC2A4\uB9C8\uD2B8\uD3F0\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uAC70\uB098 \uC751\uB2F5\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. \uB0B4\uC7A5 clarify\uB85C \uB85C\uCEEC\uC5D0\uC11C \uC9C8\uBB38\uD558\uAC70\uB098 \uC9C1\uC811 \uD310\uB2E8\uD558\uC5EC \uACC4\uC18D\uD558\uC138\uC694.",
|
|
1570
|
+
"hermes.errClarifyUnavailable": "clarify \uC9C0\uC6D0\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
1571
|
+
"hermes.errAskFailed": "tunnelbox_ask \uC2E4\uD328: {err}",
|
|
1572
|
+
"hermes.errClarifyFailed": "clarify \uC2E4\uD328: {err}",
|
|
1573
|
+
"bin.denied": "\uC2A4\uB9C8\uD2B8\uD3F0\uC5D0\uC11C \uAC70\uBD80\uB428",
|
|
1574
|
+
"bin.timeout": "\uC2B9\uC778 \uC2DC\uAC04 \uCD08\uACFC(fail-closed)",
|
|
1575
|
+
"bin.reqRun": "Claude Code\uAC00 {tool} \uC2E4\uD589\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
|
|
1576
|
+
"bin.pairTitle": "tunnelbox \uC2A4\uB9C8\uD2B8\uD3F0 \uD398\uC5B4\uB9C1",
|
|
1577
|
+
"bin.pairCodeLine": " \uD398\uC5B4\uB9C1 \uCF54\uB4DC: {code}",
|
|
1578
|
+
"bin.pairHint": "tunnelbox \uC571\uC744 \uC5F4\uACE0 '\uC2A4\uCE94\uD558\uC5EC \uD398\uC5B4\uB9C1'\uC73C\uB85C QR \uCF54\uB4DC\uB97C \uC2A4\uCE94\uD558\uAC70\uB098 \uD398\uC5B4\uB9C1 \uCF54\uB4DC\uB97C \uC9C1\uC811 \uC785\uB825\uD558\uC138\uC694(1\uD68C\uC6A9).",
|
|
1579
|
+
"bin.pairWritten": " \uD398\uC5B4\uB9C1 \uC815\uBCF4 \uC800\uC7A5\uB428: {path}",
|
|
1580
|
+
"bin.pairRequestFailed": "\uB9B4\uB808\uC774\uC5D0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD \uC2E4\uD328.",
|
|
1581
|
+
"bin.alreadyClaimed": "\uC774 \uCEF4\uD4E8\uD130\uB294 \uC774\uBBF8 \uC2A4\uB9C8\uD2B8\uD3F0 \uACC4\uC815\uC5D0 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uC2A4\uB9C8\uD2B8\uD3F0\uC758 '\uB0B4 \uCEF4\uD4E8\uD130'\uC5D0\uC11C \uC9C1\uC811 \uC5F0\uACB0\uD558\uC138\uC694. \uB2E4\uC2DC \uD398\uC5B4\uB9C1\uD558\uB824\uBA74 \uBA3C\uC800 \uC2A4\uB9C8\uD2B8\uD3F0\uC5D0\uC11C \uD574\uC81C\uD558\uC138\uC694.",
|
|
1582
|
+
"bin.noRelay": "\uB9B4\uB808\uC774 URL\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. \uD658\uACBD \uBCC0\uC218 TUNNELBOX_RELAY_URL\uC744 \uC124\uC815\uD55C \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694.",
|
|
1583
|
+
"bin.connectFailed": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: {relay}\nTUNNELBOX_RELAY_URL\uC744 \uC124\uC815\uD558\uAC70\uB098 official-plugin \uC0C1\uD0DC \uD30C\uC77C\uC5D0\uC11C \uAD6C\uC131\uD558\uC138\uC694.",
|
|
1584
|
+
"bin.statusRelay": "\uB9B4\uB808\uC774: {value}",
|
|
1585
|
+
"bin.statusAgent": "\uC5D0\uC774\uC804\uD2B8 ID: {value}",
|
|
1586
|
+
"bin.statusClaimed": "\uC2A4\uB9C8\uD2B8\uD3F0 \uC5F0\uACB0: {value}",
|
|
1587
|
+
"bin.statusStateFile": "\uC0C1\uD0DC \uD30C\uC77C: {value}",
|
|
1588
|
+
"bin.statusLatest": "\uCD5C\uC2E0 \uD398\uC5B4\uB9C1 \uC815\uBCF4:",
|
|
1589
|
+
"bin.usage": "\uC0AC\uC6A9\uBC95: tunnelbox <pair|status|ask>",
|
|
1590
|
+
"bin.usagePair": " pair \uC2A4\uB9C8\uD2B8\uD3F0 \uD398\uC5B4\uB9C1 \uCF54\uB4DC \uC694\uCCAD \uBC0F \uCD9C\uB825",
|
|
1591
|
+
"bin.usageStatus": " status \uB9B4\uB808\uC774/\uC5F0\uACB0 \uC0C1\uD0DC \uD45C\uC2DC",
|
|
1592
|
+
"bin.usageAsk": " ask \uB3C4\uAD6C \uC2B9\uC778\uC744 \uC2A4\uB9C8\uD2B8\uD3F0\uC73C\uB85C \uC804\uB2EC",
|
|
1593
|
+
"adapter.logMsgUncaught": "\uBA54\uC2DC\uC9C0 \uCC98\uB9AC \uC911 \uCC98\uB9AC\uB418\uC9C0 \uC54A\uC740 \uC608\uC678: {message}",
|
|
1594
|
+
"adapter.logHandleFailed": "{type} \uCC98\uB9AC \uC2E4\uD328: {message}",
|
|
1595
|
+
"adapter.logPromptFailed": "session.prompt \uC2E4\uD328: {message}",
|
|
1596
|
+
"adapter.logAbortSent": "\uC911\uB2E8 \uC804\uC1A1\uB428 (session={session})",
|
|
1597
|
+
"adapter.errUserDenied": "\uC0AC\uC6A9\uC790\uAC00 \uAC70\uBD80\uD568",
|
|
1598
|
+
"adapter.logPendingResent": "session.pending: \uBCF4\uB958 \uC911\uC778 \uC694\uCCAD {count}\uAC74 \uC7AC\uC804\uC1A1",
|
|
1599
|
+
"adapter.logWorkspaceSwitched": "\uC791\uC5C5 \uACF5\uAC04 \uC804\uD658: {path}",
|
|
1600
|
+
"adapter.logNewSession": "\uC0C8 \uC138\uC158 \uC800\uC7A5\uB428 codexId={codexId} (alias={session})",
|
|
1601
|
+
"adapter.logSessionError": "\uD134 \uC624\uB958 (session={session}): {message}",
|
|
1602
|
+
"adapter.logDshSent": "dsh\uB85C \uC804\uC1A1\uB428 (session={session})",
|
|
1603
|
+
"adapter.logReadHistoryFailed": "\uC138\uC158 \uAE30\uB85D \uC77D\uAE30 \uC2E4\uD328({session}): {message}",
|
|
1604
|
+
"adapter.logAnswererInitFailed": "\uC751\uB2F5\uC790 \uCD08\uAE30\uD654 \uC2E4\uD328: {message}",
|
|
1605
|
+
"adapter.logRemoteMode": "\uC591\uB2E8 \uB3D9\uC2DC \uD45C\uC2DC \uBAA8\uB4DC: \uC120\uD0DD/\uC2B9\uC778\uC740 typert \uB2E4\uC911 \uD074\uB77C\uC774\uC5B8\uD2B8 \uBE0C\uB85C\uB4DC\uCE90\uC2A4\uD2B8\uB97C \uC0AC\uC6A9\uD558\uBA70 \uC2A4\uB9C8\uD2B8\uD3F0\uACFC dsh web\uC774 \uAC19\uC740 \uD654\uBA74\uC744 \uACF5\uC720\uD558\uACE0 \uBA3C\uC800 \uB2F5\uD55C \uCABD\uC774 \uC801\uC6A9\uB429\uB2C8\uB2E4",
|
|
1606
|
+
"adapter.logRemoteProbeFailed": "typert \uC6D0\uACA9 \uC774\uBCA4\uD2B8 \uC18C\uC2A4 \uD0D0\uC0C9 \uC2E4\uD328. \uB85C\uCEEC \uC751\uB2F5 \uBAA8\uB4DC\uB85C \uB300\uCCB4\uD569\uB2C8\uB2E4: {message}",
|
|
1607
|
+
"adapter.logLocalMode": "\uB85C\uCEEC \uC751\uB2F5 \uBAA8\uB4DC: \uC120\uD0DD/\uC2B9\uC778\uC740 \uC2A4\uB9C8\uD2B8\uD3F0\uC774 \uC751\uB2F5(headless, dsh web \uBE0C\uB85C\uB4DC\uCE90\uC2A4\uD2B8 \uC5C6\uC74C)",
|
|
1608
|
+
"adapter.logRemoteStreamInterrupted": "remote events \uC2A4\uD2B8\uB9BC \uC911\uB2E8: {message}",
|
|
1609
|
+
"adapter.logResultRejected": "$events/result \uC218\uB77D\uB418\uC9C0 \uC54A\uC74C({eventId}): {message}",
|
|
1610
|
+
"adapter.logResultBackfillFailed": "$events/result \uC7AC\uAE30\uC785 \uC2E4\uD328({eventId}): {message}",
|
|
1611
|
+
"adapter.logRemoteQuestion": "remote \uC9C8\uBB38 \uBE0C\uB85C\uB4DC\uCE90\uC2A4\uD2B8 \u2192 \uC2A4\uB9C8\uD2B8\uD3F0 \uC9C8\uBB38 \uCE74\uB4DC questionID={id} (session={session})",
|
|
1612
|
+
"adapter.errRemoteReadyFrame": "remote events \uCCAB \uD504\uB808\uC784 \uC774\uC0C1",
|
|
1613
|
+
"adapter.logRemoteApproval": "remote \uC2B9\uC778 \uBE0C\uB85C\uB4DC\uCE90\uC2A4\uD2B8 \u2192 \uC2A4\uB9C8\uD2B8\uD3F0 \uAD8C\uD55C \uCE74\uB4DC permissionID={id} (session={session})",
|
|
1614
|
+
"adapter.logUserQuestionRoute": "user-questions \uC120\uD0DD \u2192 session={session}\uC73C\uB85C \uB77C\uC6B0\uD305",
|
|
1615
|
+
"adapter.errDshQuestionEmpty": "dsh \uC9C8\uBB38 \uB0B4\uC6A9\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4",
|
|
1616
|
+
"adapter.errQuestionTimeout": "\uC9C8\uBB38 \uC2DC\uAC04 \uCD08\uACFC({seconds}s), \uCDE8\uC18C\uB428",
|
|
1617
|
+
"adapter.errQuestionCancelledAbort": "\uC9C8\uBB38 \uCDE8\uC18C\uB428(\uC5D0\uC774\uC804\uD2B8 \uC911\uB2E8)",
|
|
1618
|
+
"adapter.errQuestionCancelledRelay": "\uB9B4\uB808\uC774\uC5D0 \uC5F0\uACB0\uD560 \uC218 \uC5C6\uC5B4 \uC9C8\uBB38\uC774 \uCDE8\uC18C\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
|
|
1619
|
+
"adapter.logQuestionToPhone": "user-questions \uC120\uD0DD \u2192 \uC2A4\uB9C8\uD2B8\uD3F0 \uC9C8\uBB38 \uCE74\uB4DC\uB85C \uC804\uC1A1 questionID={id} (session={session})",
|
|
1620
|
+
"adapter.errQuestionUserCancelled": "\uC0AC\uC6A9\uC790\uAC00 \uC2A4\uB9C8\uD2B8\uD3F0\uC5D0\uC11C \uC9C8\uBB38\uC744 \uCDE8\uC18C/\uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4",
|
|
1621
|
+
"adapter.logApprovalRequest": "\uC2B9\uC778 \uC694\uCCAD(tool={tool}) \u2192 \uC2A4\uB9C8\uD2B8\uD3F0 \uAD8C\uD55C \uCE74\uB4DC\uB85C \uC804\uC1A1 permissionID={id}",
|
|
1622
|
+
"adapter.logAgentPresetFailed": "agentPreset \uD574\uC11D \uC2E4\uD328({preset}), preset \uC5C6\uC774 \uB300\uCCB4: {message}",
|
|
1623
|
+
"adapter.logSessionLiveAdopted": "\uC138\uC158 {session}\uC740 \uC774 \uD504\uB85C\uC138\uC2A4\uC758 \uB2E4\uB978 \uC5D0\uC774\uC804\uD2B8\uAC00 \uBCF4\uC720 \uC911(live)\uC785\uB2C8\uB2E4. \uAE30\uC874 \uC5D0\uC774\uC804\uD2B8\uB97C \uCC44\uD0DD\uD558\uC5EC \uACC4\uC18D\uD569\uB2C8\uB2E4: {message}",
|
|
1624
|
+
"adapter.logDisposeSkipped": "\uCC44\uD0DD\uD55C \uC678\uBD80 live \uC5D0\uC774\uC804\uD2B8\uB294 dispose\uB97C \uC2E4\uD589\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4(\uC138\uC158 {session}\uC740 \uC6D0\uB798 \uBCF4\uC720\uC790\uAC00 \uAD00\uB9AC)",
|
|
1625
|
+
"adapter.logAgentCreateFailed": "\uC5D0\uC774\uC804\uD2B8 \uC0DD\uC131/\uBCF5\uC6D0 \uC2E4\uD328({session}): {message}",
|
|
1626
|
+
"adapter.errSessionBusyLive": "\uC138\uC158 {session}\uC774 \uC0AC\uC6A9 \uC911(live)\uC785\uB2C8\uB2E4. \uB098\uC911\uC5D0 \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC138\uC694",
|
|
1627
|
+
"adapter.errAgentsUnavailable": "agents \uC11C\uBE44\uC2A4\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
1628
|
+
"adapter.logToolReason": "dsh\uAC00 \uB3C4\uAD6C {tool} \uC2E4\uD589\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
|
|
1629
|
+
"adapter.logGatewayConnected": "\uB85C\uCEEC OpenClaw Gateway\uC5D0 \uC5F0\uACB0\uB428({version})",
|
|
1630
|
+
"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
|
+
"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>`)",
|
|
1632
|
+
"adapter.errGatewayNoSessionKey": "Gateway\uAC00 \uC138\uC158 key\uB97C \uBC18\uD658\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
|
|
1633
|
+
"adapter.logDeleteSessionFailed": "\uC138\uC158 \uC0AD\uC81C \uC2E4\uD328({session}): {message}(\uC0AD\uC81C\uB428\uC73C\uB85C \uC751\uB2F5)",
|
|
1634
|
+
"adapter.logApprovalReplyFailed": "\uC2B9\uC778 \uC751\uB2F5 \uC2E4\uD328({id}): {message}",
|
|
1635
|
+
"adapter.logPendingApproval": "session.pending: \uBCF4\uB958 \uC911\uC778 \uC2B9\uC778 {count}\uAC74 \uC7AC\uC804\uC1A1 (session={session})",
|
|
1636
|
+
"adapter.workspaceDefault": "\uAE30\uBCF8",
|
|
1637
|
+
"adapter.cursorSessionTitle": "Cursor \uC138\uC158",
|
|
1638
|
+
"adapter.reasonDisconnect": "\uB9B4\uB808\uC774 \uC5F0\uACB0 \uB04A\uAE40, \uC790\uB3D9 \uAC70\uBD80(fail-closed)",
|
|
1639
|
+
"adapter.warnInvalidEnv": "\uC798\uBABB\uB41C {name} \uBB34\uC2DC: {raw}({list})",
|
|
1640
|
+
"adapter.errStartFailed": "\uC2DC\uC791 \uC2E4\uD328:",
|
|
1641
|
+
"adapter.msgStarted": "{name} \uC5B4\uB311\uD130 \uC2DC\uC791\uB428(Ctrl+C\uB85C \uC885\uB8CC)",
|
|
1642
|
+
"adapter.warnCliMissing": "\uC2E4\uD589 \uD30C\uC77C '{bin}'\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uCE58\uD558\uAC70\uB098(\uC608: npm i -g @openai/codex) TUNNELBOX_CODEX_BIN\uC73C\uB85C \uACBD\uB85C\uB97C \uC9C0\uC815\uD558\uC138\uC694",
|
|
1643
|
+
"adapter.errCliNotFound": "{name} \uC2E4\uD589 \uD30C\uC77C '{bin}'\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: Codex CLI\uB97C \uC124\uCE58(npm i -g @openai/codex)\uD558\uAC70\uB098 TUNNELBOX_CODEX_BIN\uC744 \uC124\uC815\uD558\uC138\uC694",
|
|
1644
|
+
"adapter.errSessionNotFound": "\uC138\uC158\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uAC70\uB098 \uC774\uBBF8 \uC0AD\uC81C\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
|
|
1645
|
+
"adapter.checkHeader": "tunnelbox-codex \uD658\uACBD \uC810\uAC80",
|
|
1646
|
+
"adapter.checkCliOk": "{name} \uC2E4\uD589 \uD30C\uC77C: {path}",
|
|
1647
|
+
"adapter.checkCliMissing": "{name} \uC2E4\uD589 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4({bin})",
|
|
1648
|
+
"bin.yes": "\uC608",
|
|
1649
|
+
"bin.no": "\uC544\uB2C8\uC694",
|
|
1650
|
+
"adapter.errAppServerSpawn": "codex app-server \uB97C \uC2DC\uC791\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4: {message} (Codex CLI \uAC00 `codex app-server` \uB97C \uC9C0\uC6D0\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694)",
|
|
1651
|
+
"adapter.errAppServerExit": "codex app-server \uAC00 \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uB300\uAE30 \uC911\uC778 \uC2B9\uC778/\uC120\uD0DD\uC740 \uC790\uB3D9\uC73C\uB85C \uAC70\uBD80\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
|
|
1652
|
+
"adapter.logUnsupportedServerRequest": "\uC9C0\uC6D0\uB418\uC9C0 \uC54A\uB294 app-server \uC694\uCCAD: {method}",
|
|
1653
|
+
"adapter.logQuestionNative": "\uC120\uD0DD \uC694\uCCAD -> \uD734\uB300\uD3F0 \uC120\uD0DD \uCE74\uB4DC questionID={id} (session={session})",
|
|
1654
|
+
"adapter.logPermissionNative": "\uC2B9\uC778 \uC694\uCCAD -> \uD734\uB300\uD3F0 \uC2B9\uC778 \uCE74\uB4DC permissionID={id} (session={session})",
|
|
1655
|
+
"adapter.checkAppServerOk": "codex app-server \uC0AC\uC6A9 \uAC00\uB2A5",
|
|
1656
|
+
"adapter.checkAppServerMissing": "\uC774 Codex CLI \uB294 `codex app-server` \uB97C \uC9C0\uC6D0\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4 (Codex CLI \uB97C \uC5C5\uADF8\uB808\uC774\uB4DC\uD558\uC138\uC694)",
|
|
1657
|
+
"adapter.warnCursorCliMissing": 'Cursor CLI \uC2E4\uD589 \uD30C\uC77C "{bin}"\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uCE58\uD558\uAC70\uB098(https://cursor.com/docs/cli) TUNNELBOX_CURSOR_BIN\uC5D0 \uACBD\uB85C\uB97C \uC9C0\uC815\uD558\uC138\uC694',
|
|
1658
|
+
"adapter.checkCursorCliMissing": "Cursor CLI \uC2E4\uD589 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4({bin}). https://cursor.com/docs/cli \uC5D0\uC11C \uC124\uCE58\uD558\uC138\uC694",
|
|
1659
|
+
"adapter.checkCursorAcpHint": "Cursor CLI\uB97C \uAC10\uC9C0\uD588\uC2B5\uB2C8\uB2E4. ACP \uBAA8\uB4DC(`agent acp`)\uB85C \uC2A4\uD2B8\uB9AC\uBC0D/\uC2B9\uC778/\uC120\uD0DD\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4",
|
|
1660
|
+
"adapter.errAcpSpawn": "cursor `agent acp` \uC2DC\uC791 \uC2E4\uD328: {message} (Cursor CLI\uAC00 `agent acp`\uB97C \uC9C0\uC6D0\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694)",
|
|
1661
|
+
"adapter.errAcpNoSession": "Cursor ACP\uAC00 \uC138\uC158 id\uB97C \uBC18\uD658\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
|
|
1662
|
+
"adapter.logResumeFailed": "\uC138\uC158 \uC7AC\uAC1C \uC2E4\uD328, \uC0C8 \uC138\uC158\uC744 \uC2DC\uC791\uD569\uB2C8\uB2E4: {message}",
|
|
1663
|
+
"adapter.logPlanNative": "\uACC4\uD68D \uC2B9\uC778 -> \uD734\uB300\uD3F0 \uC2B9\uC778 \uCE74\uB4DC permissionID={id} (session={session})",
|
|
1664
|
+
"adapter.errTimeout": "\uC2DC\uAC04 \uCD08\uACFC\uB85C \uC790\uB3D9 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4(fail-closed)",
|
|
1665
|
+
"adapter.planApprovalPrompt": "Cursor\uAC00 \uACC4\uD68D \uC2B9\uC778\uC744 \uC694\uCCAD\uD569\uB2C8\uB2E4",
|
|
1666
|
+
"adapter.checkCursorHeader": "tunnelbox-cursor \uD658\uACBD \uC810\uAC80",
|
|
1667
|
+
"adapter.errAskBridge": "ask \uBE0C\uB9AC\uC9C0 \uC2DC\uC791 \uC2E4\uD328: {message}",
|
|
1668
|
+
"adapter.logAskBridge": "MCP ask \uBE0C\uB9AC\uC9C0\uAC00 {url} \uC5D0\uC11C \uB300\uAE30 \uC911",
|
|
1669
|
+
"cursor.mcpAskDesc": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0(tunnelbox)\uC5D0\uC11C \uC120\uD0DD\uD558\uB3C4\uB85D \uC694\uCCAD\uD558\uACE0 \uC751\uB2F5\uD560 \uB54C\uAE4C\uC9C0 \uCC28\uB2E8\uD569\uB2C8\uB2E4. \uACC4\uC18D\uD558\uAE30 \uC804\uC5D0 \uC0AC\uC6A9\uC790\uAC00 \uC635\uC158 \uC911 \uD558\uB098\uB97C \uACE8\uB77C\uC57C \uD560 \uB54C(\uC74C\uC2DD, \uBAA8\uB4DC, \uACC4\uD68D\uC548 \uC120\uD0DD \uB4F1) \uC0AC\uC6A9\uD558\uC138\uC694. \uC120\uD0DD\uD55C \uC635\uC158 \uB77C\uBCA8\uC744 \uBC18\uD658\uD569\uB2C8\uB2E4.",
|
|
1670
|
+
"cursor.mcpAskTitleDesc": "\uD734\uB300\uD3F0 \uCE74\uB4DC\uC5D0 \uD45C\uC2DC\uD560 \uC81C\uBAA9(\uC120\uD0DD)",
|
|
1671
|
+
"cursor.mcpAskQuestionsDesc": "\uD558\uB098 \uC774\uC0C1\uC758 \uC9C8\uBB38. \uAC01 \uC9C8\uBB38\uC5D0\uB294 \uC120\uD0DD\uC9C0\uAC00 \uC788\uC2B5\uB2C8\uB2E4",
|
|
1672
|
+
"cursor.mcpPlanDesc": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0(tunnelbox)\uC5D0\uC11C \uACC4\uD68D\uC744 \uC2B9\uC778\uD558\uB3C4\uB85D \uC694\uCCAD\uD558\uACE0 \uC751\uB2F5\uD560 \uB54C\uAE4C\uC9C0 \uCC28\uB2E8\uD569\uB2C8\uB2E4. \uC2B9\uC778 \uC5EC\uBD80\uB97C \uBC18\uD658\uD569\uB2C8\uB2E4.",
|
|
1673
|
+
"cursor.mcpNoBridge": "tunnelbox ask \uBE0C\uB9AC\uC9C0\uB97C \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4",
|
|
1674
|
+
"cursor.mcpUnanswered": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0\uC5D0\uC11C \uC751\uB2F5\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4(\uC624\uD504\uB77C\uC778 \uB610\uB294 \uC2DC\uAC04 \uCD08\uACFC). \uACC4\uC18D \uC9C4\uD589\uD558\uAC70\uB098 \uB300\uD654\uB85C \uBB3C\uC5B4\uBCF4\uC138\uC694.",
|
|
1675
|
+
"cursor.mcpRejected": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0\uC5D0\uC11C \uC9C8\uBB38\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4.",
|
|
1676
|
+
"cursor.mcpAnswersHeader": "\uC0AC\uC6A9\uC790(\uD734\uB300\uD3F0)\uC758 \uC751\uB2F5:",
|
|
1677
|
+
"cursor.mcpAccepted": "\uC0AC\uC6A9\uC790\uAC00 \uACC4\uD68D\uC744 \uC2B9\uC778\uD588\uC2B5\uB2C8\uB2E4.",
|
|
1678
|
+
"cursor.mcpDenied": "\uC0AC\uC6A9\uC790\uAC00 \uACC4\uD68D\uC744 \uAC70\uBD80\uD588\uC2B5\uB2C8\uB2E4.",
|
|
1679
|
+
"cursor.mcpPlanUnanswered": "\uC0AC\uC6A9\uC790\uAC00 \uD734\uB300\uD3F0\uC5D0\uC11C \uACC4\uD68D\uC5D0 \uC751\uB2F5\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4(\uC624\uD504\uB77C\uC778 \uB610\uB294 \uC2DC\uAC04 \uCD08\uACFC).",
|
|
1680
|
+
"cursor.mcpAskNoQuestions": "\uC9C8\uBB38\uC774 \uC81C\uACF5\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.",
|
|
1681
|
+
"cursor.mcpFailed": "tunnelbox ask \uC2E4\uD328",
|
|
1682
|
+
"adapter.errCursorExitCode": "Cursor CLI\uAC00 \uCF54\uB4DC {code}(\uC73C)\uB85C \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4",
|
|
1683
|
+
"adapter.errCursorExit": "Cursor CLI \uC885\uB8CC({code}): {err}",
|
|
1684
|
+
"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
|
+
"adapter.errCursorStart": "Cursor CLI \uC2DC\uC791 \uC2E4\uD328: {message}",
|
|
1686
|
+
"adapter.errCursorGeneric": "Cursor \uC624\uB958"
|
|
986
1687
|
};
|
|
987
1688
|
var fr_FR_default = {
|
|
988
1689
|
"agent.err.createSession": "\xC9chec de la cr\xE9ation de la session",
|
|
@@ -1033,7 +1734,7 @@ var fr_FR_default = {
|
|
|
1033
1734
|
"install.scanHint": "Ouvrez tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, puis scannez le QR ci-dessus pour connecter :",
|
|
1034
1735
|
"pair.heading": "Appairage t\xE9l\xE9phone tunnelbox",
|
|
1035
1736
|
"pair.howTo": "Ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone, scannez le QR ci-dessus avec \u201CScanner pour appairer\u201D, ou saisissez le code d'appairage manuellement.",
|
|
1036
|
-
"pair.oneTime": "Le code d'appairage est \xE0 usage unique et
|
|
1737
|
+
"pair.oneTime": "Le code d'appairage est \xE0 usage unique et valable environ 10 minutes ; il devient inutilisable une fois utilis\xE9 ou expir\xE9. Demandez \xAB rafra\xEEchir le code d'appairage \xBB pour en obtenir un nouveau.",
|
|
1037
1738
|
"pair.promptBody": "Veuillez afficher les informations d'appairage t\xE9l\xE9phone de cet ordinateur : le code d'appairage et un QR code scannable. Gardez le QR code dans un bloc de code \xE0 largeur fixe et reproduisez-le caract\xE8re par caract\xE8re pour que mon t\xE9l\xE9phone puisse le scanner.",
|
|
1038
1739
|
"pair.promptDescription": "Afficher le code d'appairage et le QR code scannable",
|
|
1039
1740
|
"pair.scanIntro": "**Appairer par scan** : ouvrez l'application tunnelbox sur votre t\xE9l\xE9phone, touchez \u201CScanner pour appairer\u201D, puis scannez le QR ci-dessous pour vous connecter automatiquement.",
|
|
@@ -1148,7 +1849,148 @@ var fr_FR_default = {
|
|
|
1148
1849
|
"hermes.pairTimeout": "D\xE9lai d\xE9pass\xE9 pour le code d'appairage (relais sans r\xE9ponse)",
|
|
1149
1850
|
"hermes.errToolPair": "\xE9chec de tunnelbox_pair : {err}",
|
|
1150
1851
|
"hermes.errToolStatus": "\xE9chec de tunnelbox_status : {err}",
|
|
1151
|
-
"hermes.cliUsage": "Utilisation : /tunnelbox <pair|status>\n pair demander et afficher un code d'appairage\n status afficher l'\xE9tat relais/liaison/connexion"
|
|
1852
|
+
"hermes.cliUsage": "Utilisation : /tunnelbox <pair|status>\n pair demander et afficher un code d'appairage\n status afficher l'\xE9tat relais/liaison/connexion",
|
|
1853
|
+
"qr.validFor": "Le code d'appairage est valable environ 10 minutes ; s'il expire, r\xE9cup\xE9rez-en un nouveau sur votre ordinateur.",
|
|
1854
|
+
"pair.toolDesc": "Affiche les informations d'appairage t\xE9l\xE9phone de cet ordinateur (code d'appairage et QR code scannable). \xC0 appeler lorsque l'utilisateur parle d'appairage, de scan de QR code ou de contr\xF4le de cet ordinateur depuis son t\xE9l\xE9phone.",
|
|
1855
|
+
"pair.toolRefreshDesc": "Demander ou non un nouveau code d'appairage au relais",
|
|
1856
|
+
"state.errSaveState": "\xC9chec de l'enregistrement de l'\xE9tat",
|
|
1857
|
+
"adapter.logConnected": "Connect\xE9 au relais {url}",
|
|
1858
|
+
"adapter.logDisconnected": "D\xE9connect\xE9 du relais, reconnexion automatique\u2026",
|
|
1859
|
+
"adapter.logPairCode": "Code d'appairage g\xE9n\xE9r\xE9 : {code}",
|
|
1860
|
+
"adapter.logClaimed": "Associ\xE9 \xE0 votre compte t\xE9l\xE9phone. D\xE9sormais, le t\xE9l\xE9phone se connecte directement depuis \xAB Mes ordinateurs \xBB",
|
|
1861
|
+
"adapter.logResetIdentity": "Dissoci\xE9 du compte ; r\xE9initialisation de l'identit\xE9 et g\xE9n\xE9ration d'un nouveau code d'appairage\u2026",
|
|
1862
|
+
"adapter.logUnhandledType": "Type de message non g\xE9r\xE9 : {type}",
|
|
1863
|
+
"adapter.errNoRelay": "Aucune URL de relais configur\xE9e : compilez avec --env pour injecter une valeur par d\xE9faut, ou remplacez-la \xE0 l'ex\xE9cution avec TUNNELBOX_RELAY_URL",
|
|
1864
|
+
"adapter.errBusy": "Cette session est toujours en cours ; attendez la fin ou arr\xEAtez-la d'abord",
|
|
1865
|
+
"adapter.errBadWorkspaceEmpty": "Chemin d'espace de travail manquant",
|
|
1866
|
+
"adapter.errBadWorkspaceNotDir": "Le r\xE9pertoire n'existe pas ou est inutilisable",
|
|
1867
|
+
"adapter.errWorkspaceMissing": "L'espace de travail n'existe pas : {dir}",
|
|
1868
|
+
"adapter.cmdNew": "Nouvelle session",
|
|
1869
|
+
"adapter.cmdHelp": "Afficher l'aide",
|
|
1870
|
+
"adapter.helpText": "Commandes prises en charge :\n- /new nouvelle session\n- /help afficher l'aide",
|
|
1871
|
+
"adapter.newSessionTitle": "Nouvelle session",
|
|
1872
|
+
"install.langHelpTitle": "Langues prises en charge par install-local (--lang <tag>) :",
|
|
1873
|
+
"install.langHelpExample": "Exemple : npm run install-local -- --lang de-DE",
|
|
1874
|
+
"install.unknownLang": "Langue inconnue \xAB {raw} \xBB, retour \xE0 en-US. Prises en charge : {list}",
|
|
1875
|
+
"hermes.errAskRequired": "question est obligatoire",
|
|
1876
|
+
"hermes.msgPhoneUnavailable": "T\xE9l\xE9phone indisponible ou sans r\xE9ponse : utilisez le clarify int\xE9gr\xE9 pour poser la question localement, ou d\xE9cidez par vous-m\xEAme.",
|
|
1877
|
+
"hermes.errClarifyUnavailable": "Prise en charge de clarify indisponible",
|
|
1878
|
+
"hermes.errAskFailed": "\xC9chec de tunnelbox_ask : {err}",
|
|
1879
|
+
"hermes.errClarifyFailed": "\xC9chec de clarify : {err}",
|
|
1880
|
+
"bin.denied": "Refus\xE9 depuis votre t\xE9l\xE9phone",
|
|
1881
|
+
"bin.timeout": "D\xE9lai d'approbation d\xE9pass\xE9 (fail-closed)",
|
|
1882
|
+
"bin.reqRun": "Claude Code demande d'ex\xE9cuter {tool}",
|
|
1883
|
+
"bin.pairTitle": "Appairage t\xE9l\xE9phone tunnelbox",
|
|
1884
|
+
"bin.pairCodeLine": " Code d'appairage : {code}",
|
|
1885
|
+
"bin.pairHint": "Ouvrez l'app tunnelbox, touchez \xAB Scanner pour appairer \xBB et scannez le QR code, ou saisissez le code d'appairage manuellement (usage unique).",
|
|
1886
|
+
"bin.pairWritten": " Infos d'appairage \xE9crites dans : {path}",
|
|
1887
|
+
"bin.pairRequestFailed": "\xC9chec de la demande de code d'appairage au relais.",
|
|
1888
|
+
"bin.alreadyClaimed": "Cet ordinateur est d\xE9j\xE0 associ\xE9 \xE0 un compte t\xE9l\xE9phone ; connectez-vous directement depuis \xAB Mes ordinateurs \xBB. Pour r\xE9appairer, dissociez-le d'abord sur votre t\xE9l\xE9phone.",
|
|
1889
|
+
"bin.noRelay": "Aucune URL de relais configur\xE9e : d\xE9finissez TUNNELBOX_RELAY_URL puis r\xE9essayez.",
|
|
1890
|
+
"bin.connectFailed": "Impossible de se connecter au relais : {relay}\nD\xE9finissez TUNNELBOX_RELAY_URL ou configurez-le dans le fichier d'\xE9tat official-plugin.",
|
|
1891
|
+
"bin.statusRelay": "Relais : {value}",
|
|
1892
|
+
"bin.statusAgent": "ID de l'agent : {value}",
|
|
1893
|
+
"bin.statusClaimed": "T\xE9l\xE9phone associ\xE9 : {value}",
|
|
1894
|
+
"bin.statusStateFile": "Fichier d'\xE9tat : {value}",
|
|
1895
|
+
"bin.statusLatest": "Derni\xE8res infos d'appairage :",
|
|
1896
|
+
"bin.usage": "Utilisation : tunnelbox <pair|status|ask>",
|
|
1897
|
+
"bin.usagePair": " pair demander et afficher un code d'appairage t\xE9l\xE9phone",
|
|
1898
|
+
"bin.usageStatus": " status afficher l'\xE9tat du relais/de l'association",
|
|
1899
|
+
"bin.usageAsk": " ask transf\xE9rer une approbation d'outil au t\xE9l\xE9phone",
|
|
1900
|
+
"adapter.logMsgUncaught": "Exception non intercept\xE9e lors du traitement du message : {message}",
|
|
1901
|
+
"adapter.logHandleFailed": "\xC9chec du traitement de {type} : {message}",
|
|
1902
|
+
"adapter.logPromptFailed": "\xC9chec de session.prompt : {message}",
|
|
1903
|
+
"adapter.logAbortSent": "Interruption envoy\xE9e (session={session})",
|
|
1904
|
+
"adapter.errUserDenied": "Refus\xE9 par l'utilisateur",
|
|
1905
|
+
"adapter.logPendingResent": "session.pending : {count} demande(s) en attente renvoy\xE9e(s)",
|
|
1906
|
+
"adapter.logWorkspaceSwitched": "Espace de travail chang\xE9 : {path}",
|
|
1907
|
+
"adapter.logNewSession": "Nouvelle session enregistr\xE9e codexId={codexId} (alias={session})",
|
|
1908
|
+
"adapter.logSessionError": "Erreur de tour (session={session}) : {message}",
|
|
1909
|
+
"adapter.logDshSent": "Envoy\xE9 \xE0 dsh (session={session})",
|
|
1910
|
+
"adapter.logReadHistoryFailed": "\xC9chec de lecture de l'historique de session ({session}) : {message}",
|
|
1911
|
+
"adapter.logAnswererInitFailed": "\xC9chec d'initialisation du r\xE9pondeur : {message}",
|
|
1912
|
+
"adapter.logRemoteMode": "Mode double affichage : les s\xE9lections/approbations passent par la diffusion multi-clients typert ; t\xE9l\xE9phone et dsh web partagent la vue, la premi\xE8re r\xE9ponse l'emporte",
|
|
1913
|
+
"adapter.logRemoteProbeFailed": "\xC9chec de d\xE9tection de la source d'\xE9v\xE9nements distante typert ; retour au mode de r\xE9ponse local : {message}",
|
|
1914
|
+
"adapter.logLocalMode": "Mode de r\xE9ponse local : s\xE9lections/approbations trait\xE9es par le t\xE9l\xE9phone (headless, sans diffusion dsh web)",
|
|
1915
|
+
"adapter.logRemoteStreamInterrupted": "Flux remote events interrompu : {message}",
|
|
1916
|
+
"adapter.logResultRejected": "$events/result non accept\xE9 ({eventId}) : {message}",
|
|
1917
|
+
"adapter.logResultBackfillFailed": "\xC9chec du renvoi de $events/result ({eventId}) : {message}",
|
|
1918
|
+
"adapter.logRemoteQuestion": "Diffusion de question remote \u2192 carte de question t\xE9l\xE9phone questionID={id} (session={session})",
|
|
1919
|
+
"adapter.errRemoteReadyFrame": "Premi\xE8re trame remote events inattendue",
|
|
1920
|
+
"adapter.logRemoteApproval": "Diffusion d'approbation remote \u2192 carte d'autorisation t\xE9l\xE9phone permissionID={id} (session={session})",
|
|
1921
|
+
"adapter.logUserQuestionRoute": "S\xE9lection user-questions \u2192 rout\xE9e vers session={session}",
|
|
1922
|
+
"adapter.errDshQuestionEmpty": "Le contenu de la question dsh est vide",
|
|
1923
|
+
"adapter.errQuestionTimeout": "D\xE9lai de question d\xE9pass\xE9 ({seconds}s), annul\xE9e",
|
|
1924
|
+
"adapter.errQuestionCancelledAbort": "Question annul\xE9e (agent interrompu)",
|
|
1925
|
+
"adapter.errQuestionCancelledRelay": "Relais injoignable, question annul\xE9e",
|
|
1926
|
+
"adapter.logQuestionToPhone": "S\xE9lection user-questions \u2192 envoy\xE9e \xE0 la carte de question du t\xE9l\xE9phone questionID={id} (session={session})",
|
|
1927
|
+
"adapter.errQuestionUserCancelled": "L'utilisateur a annul\xE9/refus\xE9 la question sur le t\xE9l\xE9phone",
|
|
1928
|
+
"adapter.logApprovalRequest": "Demande d'approbation (tool={tool}) \u2192 envoy\xE9e \xE0 la carte d'autorisation du t\xE9l\xE9phone permissionID={id}",
|
|
1929
|
+
"adapter.logAgentPresetFailed": "\xC9chec de r\xE9solution d'agentPreset ({preset}) ; retour sans preset : {message}",
|
|
1930
|
+
"adapter.logSessionLiveAdopted": "La session {session} est d\xE9j\xE0 d\xE9tenue par un autre agent de ce processus (live) ; adoption de l'agent existant pour continuer : {message}",
|
|
1931
|
+
"adapter.logDisposeSkipped": "L'agent live externe adopt\xE9 n'ex\xE9cute pas dispose (la session {session} est g\xE9r\xE9e par son d\xE9tenteur d'origine)",
|
|
1932
|
+
"adapter.logAgentCreateFailed": "\xC9chec de cr\xE9ation/reprise de l'agent ({session}) : {message}",
|
|
1933
|
+
"adapter.errSessionBusyLive": "La session {session} est occup\xE9e (live) ; r\xE9essayez plus tard",
|
|
1934
|
+
"adapter.errAgentsUnavailable": "Service agents indisponible",
|
|
1935
|
+
"adapter.logToolReason": "dsh demande d'ex\xE9cuter l'outil {tool}",
|
|
1936
|
+
"adapter.logGatewayConnected": "Connect\xE9 au Gateway OpenClaw local ({version})",
|
|
1937
|
+
"adapter.logGatewayDisconnected": "D\xE9connect\xE9 du Gateway OpenClaw ; le client officiel se reconnecte\u2026",
|
|
1938
|
+
"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>`)",
|
|
1939
|
+
"adapter.errGatewayNoSessionKey": "Le Gateway n'a pas renvoy\xE9 de cl\xE9 de session",
|
|
1940
|
+
"adapter.logDeleteSessionFailed": "\xC9chec de suppression de session ({session}) : {message} (accus\xE9 de suppression tout de m\xEAme)",
|
|
1941
|
+
"adapter.logApprovalReplyFailed": "\xC9chec de la r\xE9ponse d'approbation ({id}) : {message}",
|
|
1942
|
+
"adapter.logPendingApproval": "session.pending : {count} approbation(s) en attente renvoy\xE9e(s) (session={session})",
|
|
1943
|
+
"adapter.workspaceDefault": "Par d\xE9faut",
|
|
1944
|
+
"adapter.cursorSessionTitle": "Session Cursor",
|
|
1945
|
+
"adapter.reasonDisconnect": "Relais d\xE9connect\xE9, refus automatique (fail-closed)",
|
|
1946
|
+
"adapter.warnInvalidEnv": "Valeur {name} invalide ignor\xE9e : {raw} ({list})",
|
|
1947
|
+
"adapter.errStartFailed": "\xC9chec du d\xE9marrage :",
|
|
1948
|
+
"adapter.msgStarted": "Adaptateur {name} d\xE9marr\xE9 (Ctrl+C pour quitter)",
|
|
1949
|
+
"adapter.warnCliMissing": "Ex\xE9cutable \xAB {bin} \xBB introuvable ; installez-le (ex. npm i -g @openai/codex) ou d\xE9finissez TUNNELBOX_CODEX_BIN avec son chemin",
|
|
1950
|
+
"adapter.errCliNotFound": "Ex\xE9cutable {name} \xAB {bin} \xBB introuvable : installez le Codex CLI (npm i -g @openai/codex) ou d\xE9finissez TUNNELBOX_CODEX_BIN",
|
|
1951
|
+
"adapter.errSessionNotFound": "Session introuvable ou d\xE9j\xE0 supprim\xE9e",
|
|
1952
|
+
"adapter.checkHeader": "V\xE9rification de l'environnement tunnelbox-codex",
|
|
1953
|
+
"adapter.checkCliOk": "Ex\xE9cutable {name} : {path}",
|
|
1954
|
+
"adapter.checkCliMissing": "Ex\xE9cutable {name} introuvable ({bin})",
|
|
1955
|
+
"bin.yes": "oui",
|
|
1956
|
+
"bin.no": "non",
|
|
1957
|
+
"adapter.errAppServerSpawn": "Impossible de d\xE9marrer codex app-server : {message} (v\xE9rifiez que votre Codex CLI prend en charge `codex app-server`)",
|
|
1958
|
+
"adapter.errAppServerExit": "codex app-server s'est arr\xEAt\xE9 ; les approbations/choix en attente ont \xE9t\xE9 refus\xE9s automatiquement",
|
|
1959
|
+
"adapter.logUnsupportedServerRequest": "requ\xEAte app-server non prise en charge : {method}",
|
|
1960
|
+
"adapter.logQuestionNative": "demande de choix -> carte de choix du t\xE9l\xE9phone questionID={id} (session={session})",
|
|
1961
|
+
"adapter.logPermissionNative": "demande d'approbation -> carte d'approbation du t\xE9l\xE9phone permissionID={id} (session={session})",
|
|
1962
|
+
"adapter.checkAppServerOk": "codex app-server disponible",
|
|
1963
|
+
"adapter.checkAppServerMissing": "ce Codex CLI ne prend pas en charge `codex app-server` (veuillez mettre \xE0 jour Codex CLI)",
|
|
1964
|
+
"adapter.warnCursorCliMissing": "Ex\xE9cutable Cursor CLI \xAB {bin} \xBB introuvable ; installez-le (https://cursor.com/docs/cli) ou d\xE9finissez TUNNELBOX_CURSOR_BIN",
|
|
1965
|
+
"adapter.checkCursorCliMissing": "Ex\xE9cutable Cursor CLI introuvable ({bin}) ; installez-le depuis https://cursor.com/docs/cli",
|
|
1966
|
+
"adapter.checkCursorAcpHint": "Cursor CLI d\xE9tect\xE9 ; le mode ACP (`agent acp`) sera utilis\xE9 pour le streaming/l'approbation/la s\xE9lection",
|
|
1967
|
+
"adapter.errAcpSpawn": "\xC9chec du d\xE9marrage de cursor `agent acp` : {message} (v\xE9rifiez que votre Cursor CLI prend en charge `agent acp`)",
|
|
1968
|
+
"adapter.errAcpNoSession": "Cursor ACP n'a pas renvoy\xE9 d'id de session",
|
|
1969
|
+
"adapter.logResumeFailed": "\xC9chec de la reprise de session, d\xE9marrage d'une nouvelle session : {message}",
|
|
1970
|
+
"adapter.logPlanNative": "approbation de plan -> carte d'approbation du t\xE9l\xE9phone permissionID={id} (session={session})",
|
|
1971
|
+
"adapter.errTimeout": "D\xE9lai d\xE9pass\xE9, rejet automatique (fail-closed)",
|
|
1972
|
+
"adapter.planApprovalPrompt": "Cursor demande l'approbation d'un plan",
|
|
1973
|
+
"adapter.checkCursorHeader": "v\xE9rification de l'environnement tunnelbox-cursor",
|
|
1974
|
+
"adapter.errAskBridge": "\xC9chec du d\xE9marrage du pont ask : {message}",
|
|
1975
|
+
"adapter.logAskBridge": "Pont MCP ask \xE0 l'\xE9coute sur {url}",
|
|
1976
|
+
"cursor.mcpAskDesc": "Demande \xE0 l'utilisateur de choisir sur son t\xE9l\xE9phone (tunnelbox) et bloque jusqu'\xE0 sa r\xE9ponse. \xC0 utiliser chaque fois que l'utilisateur doit choisir entre des options avant de continuer (plat, mode, option de plan\u2026). Renvoie le(s) libell\xE9(s) choisi(s).",
|
|
1977
|
+
"cursor.mcpAskTitleDesc": "Titre facultatif affich\xE9 sur la carte du t\xE9l\xE9phone",
|
|
1978
|
+
"cursor.mcpAskQuestionsDesc": "Une ou plusieurs questions ; chacune propose des options",
|
|
1979
|
+
"cursor.mcpPlanDesc": "Demande \xE0 l'utilisateur d'approuver un plan sur son t\xE9l\xE9phone (tunnelbox) et bloque jusqu'\xE0 sa r\xE9ponse. Indique si le plan a \xE9t\xE9 accept\xE9.",
|
|
1980
|
+
"cursor.mcpNoBridge": "le pont ask tunnelbox n'est pas disponible",
|
|
1981
|
+
"cursor.mcpUnanswered": "L'utilisateur n'a pas r\xE9pondu sur son t\xE9l\xE9phone (hors ligne ou d\xE9lai d\xE9pass\xE9). Continuez ou posez la question en conversation.",
|
|
1982
|
+
"cursor.mcpRejected": "L'utilisateur a rejet\xE9 la question sur son t\xE9l\xE9phone.",
|
|
1983
|
+
"cursor.mcpAnswersHeader": "R\xE9ponses de l'utilisateur (depuis son t\xE9l\xE9phone) :",
|
|
1984
|
+
"cursor.mcpAccepted": "L'utilisateur a accept\xE9 le plan.",
|
|
1985
|
+
"cursor.mcpDenied": "L'utilisateur a rejet\xE9 le plan.",
|
|
1986
|
+
"cursor.mcpPlanUnanswered": "L'utilisateur n'a pas r\xE9pondu au plan sur son t\xE9l\xE9phone (hors ligne ou d\xE9lai d\xE9pass\xE9).",
|
|
1987
|
+
"cursor.mcpAskNoQuestions": "Aucune question fournie.",
|
|
1988
|
+
"cursor.mcpFailed": "\xE9chec de tunnelbox ask",
|
|
1989
|
+
"adapter.errCursorExitCode": "Cursor CLI s'est arr\xEAt\xE9 avec le code {code}",
|
|
1990
|
+
"adapter.errCursorExit": "Cursor CLI arr\xEAt\xE9 ({code}) : {err}",
|
|
1991
|
+
"adapter.errCursorSpawn": "Impossible de d\xE9marrer Cursor CLI (agent) : v\xE9rifiez qu'il est install\xE9 et connect\xE9 ({message})",
|
|
1992
|
+
"adapter.errCursorStart": "\xC9chec du d\xE9marrage de Cursor CLI : {message}",
|
|
1993
|
+
"adapter.errCursorGeneric": "Erreur Cursor"
|
|
1152
1994
|
};
|
|
1153
1995
|
var de_DE_default = {
|
|
1154
1996
|
"agent.err.createSession": "Sitzung konnte nicht erstellt werden",
|
|
@@ -1199,7 +2041,7 @@ var de_DE_default = {
|
|
|
1199
2041
|
"install.scanHint": "\xD6ffnen Sie tunnelbox auf dem Telefon, tippen Sie auf \u201CZum Pairing scannen\u201D und scannen Sie den QR-Code oben zum Verbinden:",
|
|
1200
2042
|
"pair.heading": "tunnelbox Telefon-Pairing",
|
|
1201
2043
|
"pair.howTo": "\xD6ffnen Sie die tunnelbox-App auf dem Telefon und scannen Sie den QR-Code oben mit \u201CZum Pairing scannen\u201D, oder geben Sie den Pairing-Code manuell ein.",
|
|
1202
|
-
"pair.oneTime": "Der
|
|
2044
|
+
"pair.oneTime": "Der Kopplungscode ist einmalig und etwa 10 Minuten g\xFCltig; nach Nutzung oder Ablauf wird er ung\xFCltig. Fordern Sie zum Erneuern \u201EKopplungscode aktualisieren\u201C an.",
|
|
1203
2045
|
"pair.promptBody": "Zeigen Sie bitte die Telefon-Pairing-Informationen dieses Computers an: den Pairing-Code und einen scannbaren QR-Code. Behalten Sie den QR-Code in einem Codeblock mit fester Breite und geben Sie ihn zeichengenau wieder, damit mein Telefon ihn scannen kann.",
|
|
1204
2046
|
"pair.promptDescription": "Pairing-Code und scannbaren QR-Code anzeigen",
|
|
1205
2047
|
"pair.scanIntro": "**Per Scan pairen**: \xD6ffnen Sie die tunnelbox-App auf dem Telefon, tippen Sie auf \u201CZum Pairing scannen\u201D und scannen Sie den QR-Code unten, um sich automatisch zu verbinden.",
|
|
@@ -1314,7 +2156,148 @@ var de_DE_default = {
|
|
|
1314
2156
|
"hermes.pairTimeout": "Zeit\xFCberschreitung bei der Pairing-Code-Anfrage (Relay antwortete nicht)",
|
|
1315
2157
|
"hermes.errToolPair": "tunnelbox_pair fehlgeschlagen: {err}",
|
|
1316
2158
|
"hermes.errToolStatus": "tunnelbox_status fehlgeschlagen: {err}",
|
|
1317
|
-
"hermes.cliUsage": "Verwendung: /tunnelbox <pair|status>\n pair Pairing-Code anfordern und anzeigen\n status Relay/Bindung/Verbindung anzeigen"
|
|
2159
|
+
"hermes.cliUsage": "Verwendung: /tunnelbox <pair|status>\n pair Pairing-Code anfordern und anzeigen\n status Relay/Bindung/Verbindung anzeigen",
|
|
2160
|
+
"qr.validFor": "Der Kopplungscode ist etwa 10 Minuten g\xFCltig; holen Sie bei Ablauf einen neuen auf Ihrem Computer.",
|
|
2161
|
+
"pair.toolDesc": "Zeigt die Telefon-Kopplungsinfo dieses Computers (Kopplungscode und scannbarer QR-Code). Aufrufen, wenn der Nutzer nach Kopplung, QR-Code-Scan oder Steuerung dieses Computers vom Telefon fragt.",
|
|
2162
|
+
"pair.toolRefreshDesc": "Ob ein neuer Kopplungscode vom Relay angefordert werden soll",
|
|
2163
|
+
"state.errSaveState": "Status konnte nicht gespeichert werden",
|
|
2164
|
+
"adapter.logConnected": "Mit Relay verbunden {url}",
|
|
2165
|
+
"adapter.logDisconnected": "Vom Relay getrennt, automatische Wiederverbindung\u2026",
|
|
2166
|
+
"adapter.logPairCode": "Kopplungscode erzeugt: {code}",
|
|
2167
|
+
"adapter.logClaimed": "Mit Ihrem Telefonkonto verkn\xFCpft. Ab jetzt verbindet sich das Telefon direkt \xFCber \u201EMeine Computer\u201C",
|
|
2168
|
+
"adapter.logResetIdentity": "Vom Konto getrennt; Identit\xE4t wird zur\xFCckgesetzt und neuer Kopplungscode erzeugt\u2026",
|
|
2169
|
+
"adapter.logUnhandledType": "Unbehandelter Nachrichtentyp: {type}",
|
|
2170
|
+
"adapter.errNoRelay": "Keine Relay-URL konfiguriert: mit --env einen Standardwert einbauen oder zur Laufzeit mit TUNNELBOX_RELAY_URL \xFCberschreiben",
|
|
2171
|
+
"adapter.errBusy": "Diese Sitzung l\xE4uft noch; warten Sie auf den Abschluss oder stoppen Sie sie zuerst",
|
|
2172
|
+
"adapter.errBadWorkspaceEmpty": "Arbeitsbereich-Pfad fehlt",
|
|
2173
|
+
"adapter.errBadWorkspaceNotDir": "Verzeichnis existiert nicht oder ist unbrauchbar",
|
|
2174
|
+
"adapter.errWorkspaceMissing": "Arbeitsbereich existiert nicht: {dir}",
|
|
2175
|
+
"adapter.cmdNew": "Neue Sitzung",
|
|
2176
|
+
"adapter.cmdHelp": "Hilfe anzeigen",
|
|
2177
|
+
"adapter.helpText": "Unterst\xFCtzte Befehle:\n- /new neue Sitzung\n- /help Hilfe anzeigen",
|
|
2178
|
+
"adapter.newSessionTitle": "Neue Sitzung",
|
|
2179
|
+
"install.langHelpTitle": "Von install-local unterst\xFCtzte Sprachen (--lang <tag>):",
|
|
2180
|
+
"install.langHelpExample": "Beispiel: npm run install-local -- --lang de-DE",
|
|
2181
|
+
"install.unknownLang": 'Unbekannte Sprache "{raw}", R\xFCckfall auf en-US. Unterst\xFCtzt: {list}',
|
|
2182
|
+
"hermes.errAskRequired": "question ist erforderlich",
|
|
2183
|
+
"hermes.msgPhoneUnavailable": "Telefon nicht verf\xFCgbar oder keine Antwort: Nutzen Sie das integrierte clarify f\xFCr eine lokale Frage oder entscheiden Sie selbst.",
|
|
2184
|
+
"hermes.errClarifyUnavailable": "clarify-Unterst\xFCtzung nicht verf\xFCgbar",
|
|
2185
|
+
"hermes.errAskFailed": "tunnelbox_ask fehlgeschlagen: {err}",
|
|
2186
|
+
"hermes.errClarifyFailed": "clarify fehlgeschlagen: {err}",
|
|
2187
|
+
"bin.denied": "Vom Telefon abgelehnt",
|
|
2188
|
+
"bin.timeout": "Genehmigung Zeit\xFCberschreitung (fail-closed)",
|
|
2189
|
+
"bin.reqRun": "Claude Code fordert die Ausf\xFChrung von {tool} an",
|
|
2190
|
+
"bin.pairTitle": "tunnelbox Telefon-Kopplung",
|
|
2191
|
+
"bin.pairCodeLine": " Kopplungscode: {code}",
|
|
2192
|
+
"bin.pairHint": "\xD6ffnen Sie die tunnelbox-App, tippen Sie auf \u201EZum Koppeln scannen\u201C und scannen Sie den QR-Code, oder geben Sie den Kopplungscode manuell ein (einmalig).",
|
|
2193
|
+
"bin.pairWritten": " Kopplungsinfo geschrieben nach: {path}",
|
|
2194
|
+
"bin.pairRequestFailed": "Anforderung eines Kopplungscodes vom Relay fehlgeschlagen.",
|
|
2195
|
+
"bin.alreadyClaimed": "Dieser Computer ist bereits mit einem Telefonkonto verkn\xFCpft; verbinden Sie sich direkt \xFCber \u201EMeine Computer\u201C. Zum erneuten Koppeln zuerst am Telefon trennen.",
|
|
2196
|
+
"bin.noRelay": "Keine Relay-URL konfiguriert: setzen Sie TUNNELBOX_RELAY_URL und versuchen Sie es erneut.",
|
|
2197
|
+
"bin.connectFailed": "Verbindung zum Relay nicht m\xF6glich: {relay}\nSetzen Sie TUNNELBOX_RELAY_URL oder konfigurieren Sie es in der official-plugin-Statusdatei.",
|
|
2198
|
+
"bin.statusRelay": "Relay: {value}",
|
|
2199
|
+
"bin.statusAgent": "Agent-ID: {value}",
|
|
2200
|
+
"bin.statusClaimed": "Telefon verkn\xFCpft: {value}",
|
|
2201
|
+
"bin.statusStateFile": "Statusdatei: {value}",
|
|
2202
|
+
"bin.statusLatest": "Neueste Kopplungsinfo:",
|
|
2203
|
+
"bin.usage": "Verwendung: tunnelbox <pair|status|ask>",
|
|
2204
|
+
"bin.usagePair": " pair Telefon-Kopplungscode anfordern und ausgeben",
|
|
2205
|
+
"bin.usageStatus": " status Relay-/Verkn\xFCpfungsstatus anzeigen",
|
|
2206
|
+
"bin.usageAsk": " ask eine Tool-Genehmigung ans Telefon weiterleiten",
|
|
2207
|
+
"adapter.logMsgUncaught": "Unabgefangene Ausnahme bei der Nachrichtenverarbeitung: {message}",
|
|
2208
|
+
"adapter.logHandleFailed": "Verarbeitung von {type} fehlgeschlagen: {message}",
|
|
2209
|
+
"adapter.logPromptFailed": "session.prompt fehlgeschlagen: {message}",
|
|
2210
|
+
"adapter.logAbortSent": "Abbruch gesendet (session={session})",
|
|
2211
|
+
"adapter.errUserDenied": "Vom Nutzer abgelehnt",
|
|
2212
|
+
"adapter.logPendingResent": "session.pending: {count} ausstehende Anfrage(n) erneut gesendet",
|
|
2213
|
+
"adapter.logWorkspaceSwitched": "Arbeitsbereich gewechselt: {path}",
|
|
2214
|
+
"adapter.logNewSession": "Neue Sitzung gespeichert codexId={codexId} (alias={session})",
|
|
2215
|
+
"adapter.logSessionError": "Turn-Fehler (session={session}): {message}",
|
|
2216
|
+
"adapter.logDshSent": "An dsh gesendet (session={session})",
|
|
2217
|
+
"adapter.logReadHistoryFailed": "Sitzungsverlauf lesen fehlgeschlagen ({session}): {message}",
|
|
2218
|
+
"adapter.logAnswererInitFailed": "Initialisierung des Antwortgebers fehlgeschlagen: {message}",
|
|
2219
|
+
"adapter.logRemoteMode": "Dualanzeige-Modus: Auswahl/Genehmigung \xFCber typert-Multi-Client-Broadcast; Telefon und dsh web teilen die Ansicht, die erste Antwort gewinnt",
|
|
2220
|
+
"adapter.logRemoteProbeFailed": "typert-Remote-Ereignisquellen-Pr\xFCfung fehlgeschlagen; R\xFCckfall auf lokalen Antwortmodus: {message}",
|
|
2221
|
+
"adapter.logLocalMode": "Lokaler Antwortmodus: Auswahl/Genehmigung erfolgt durch das Telefon (headless, ohne dsh web-Broadcast)",
|
|
2222
|
+
"adapter.logRemoteStreamInterrupted": "remote events-Stream unterbrochen: {message}",
|
|
2223
|
+
"adapter.logResultRejected": "$events/result nicht akzeptiert ({eventId}): {message}",
|
|
2224
|
+
"adapter.logResultBackfillFailed": "$events/result-R\xFCckschreiben fehlgeschlagen ({eventId}): {message}",
|
|
2225
|
+
"adapter.logRemoteQuestion": "remote-Frage-Broadcast \u2192 Telefon-Fragekarte questionID={id} (session={session})",
|
|
2226
|
+
"adapter.errRemoteReadyFrame": "Unerwarteter erster Frame von remote events",
|
|
2227
|
+
"adapter.logRemoteApproval": "remote-Genehmigungs-Broadcast \u2192 Telefon-Berechtigungskarte permissionID={id} (session={session})",
|
|
2228
|
+
"adapter.logUserQuestionRoute": "user-questions-Auswahl \u2192 weitergeleitet an session={session}",
|
|
2229
|
+
"adapter.errDshQuestionEmpty": "dsh-Frageinhalt ist leer",
|
|
2230
|
+
"adapter.errQuestionTimeout": "Frage-Zeit\xFCberschreitung ({seconds}s), abgebrochen",
|
|
2231
|
+
"adapter.errQuestionCancelledAbort": "Frage abgebrochen (Agent abgebrochen)",
|
|
2232
|
+
"adapter.errQuestionCancelledRelay": "Relay nicht erreichbar, Frage abgebrochen",
|
|
2233
|
+
"adapter.logQuestionToPhone": "user-questions-Auswahl \u2192 an Telefon-Fragekarte gesendet questionID={id} (session={session})",
|
|
2234
|
+
"adapter.errQuestionUserCancelled": "Nutzer hat die Frage am Telefon abgebrochen/abgelehnt",
|
|
2235
|
+
"adapter.logApprovalRequest": "Genehmigungsanfrage (tool={tool}) \u2192 an Telefon-Berechtigungskarte gesendet permissionID={id}",
|
|
2236
|
+
"adapter.logAgentPresetFailed": "agentPreset-Aufl\xF6sung fehlgeschlagen ({preset}); R\xFCckfall ohne Preset: {message}",
|
|
2237
|
+
"adapter.logSessionLiveAdopted": "Sitzung {session} wird bereits von einem anderen Agent in diesem Prozess gehalten (live); vorhandener Agent wird \xFCbernommen: {message}",
|
|
2238
|
+
"adapter.logDisposeSkipped": "\xDCbernommener externer Live-Agent f\xFChrt dispose nicht aus (Sitzung {session} wird vom urspr\xFCnglichen Halter verwaltet)",
|
|
2239
|
+
"adapter.logAgentCreateFailed": "Agent erstellen/fortsetzen fehlgeschlagen ({session}): {message}",
|
|
2240
|
+
"adapter.errSessionBusyLive": "Sitzung {session} ist belegt (live); versuchen Sie es sp\xE4ter erneut",
|
|
2241
|
+
"adapter.errAgentsUnavailable": "agents-Dienst nicht verf\xFCgbar",
|
|
2242
|
+
"adapter.logToolReason": "dsh fordert die Ausf\xFChrung des Tools {tool} an",
|
|
2243
|
+
"adapter.logGatewayConnected": "Mit lokalem OpenClaw Gateway verbunden ({version})",
|
|
2244
|
+
"adapter.logGatewayDisconnected": "Vom OpenClaw Gateway getrennt; der offizielle Client verbindet sich neu\u2026",
|
|
2245
|
+
"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>`)",
|
|
2246
|
+
"adapter.errGatewayNoSessionKey": "Gateway hat keinen Sitzungsschl\xFCssel zur\xFCckgegeben",
|
|
2247
|
+
"adapter.logDeleteSessionFailed": "Sitzung l\xF6schen fehlgeschlagen ({session}): {message} (wird dennoch als gel\xF6scht best\xE4tigt)",
|
|
2248
|
+
"adapter.logApprovalReplyFailed": "Genehmigungsantwort fehlgeschlagen ({id}): {message}",
|
|
2249
|
+
"adapter.logPendingApproval": "session.pending: {count} ausstehende Genehmigung(en) erneut gesendet (session={session})",
|
|
2250
|
+
"adapter.workspaceDefault": "Standard",
|
|
2251
|
+
"adapter.cursorSessionTitle": "Cursor-Sitzung",
|
|
2252
|
+
"adapter.reasonDisconnect": "Relay getrennt, automatische Ablehnung (fail-closed)",
|
|
2253
|
+
"adapter.warnInvalidEnv": "Ung\xFCltiges {name} ignoriert: {raw} ({list})",
|
|
2254
|
+
"adapter.errStartFailed": "Start fehlgeschlagen:",
|
|
2255
|
+
"adapter.msgStarted": "{name}-Adapter gestartet (Ctrl+C zum Beenden)",
|
|
2256
|
+
"adapter.warnCliMissing": "Ausf\xFChrbare Datei \u201E{bin}\u201C nicht gefunden; installieren Sie sie (z. B. npm i -g @openai/codex) oder setzen Sie TUNNELBOX_CODEX_BIN auf ihren Pfad",
|
|
2257
|
+
"adapter.errCliNotFound": "Ausf\xFChrbare Datei {name} \u201E{bin}\u201C nicht gefunden: Installieren Sie die Codex CLI (npm i -g @openai/codex) oder setzen Sie TUNNELBOX_CODEX_BIN",
|
|
2258
|
+
"adapter.errSessionNotFound": "Sitzung nicht gefunden oder bereits gel\xF6scht",
|
|
2259
|
+
"adapter.checkHeader": "tunnelbox-codex-Umgebungspr\xFCfung",
|
|
2260
|
+
"adapter.checkCliOk": "Ausf\xFChrbare Datei {name}: {path}",
|
|
2261
|
+
"adapter.checkCliMissing": "Ausf\xFChrbare Datei {name} nicht gefunden ({bin})",
|
|
2262
|
+
"bin.yes": "ja",
|
|
2263
|
+
"bin.no": "nein",
|
|
2264
|
+
"adapter.errAppServerSpawn": "codex app-server konnte nicht gestartet werden: {message} (pr\xFCfen Sie, ob Ihre Codex CLI `codex app-server` unterst\xFCtzt)",
|
|
2265
|
+
"adapter.errAppServerExit": "codex app-server wurde beendet; ausstehende Genehmigungen/Auswahlen wurden automatisch abgelehnt",
|
|
2266
|
+
"adapter.logUnsupportedServerRequest": "nicht unterst\xFCtzte app-server-Anfrage: {method}",
|
|
2267
|
+
"adapter.logQuestionNative": "Auswahlanfrage -> Auswahlkarte am Handy questionID={id} (session={session})",
|
|
2268
|
+
"adapter.logPermissionNative": "Genehmigungsanfrage -> Genehmigungskarte am Handy permissionID={id} (session={session})",
|
|
2269
|
+
"adapter.checkAppServerOk": "codex app-server verf\xFCgbar",
|
|
2270
|
+
"adapter.checkAppServerMissing": "diese Codex CLI unterst\xFCtzt `codex app-server` nicht (bitte Codex CLI aktualisieren)",
|
|
2271
|
+
"adapter.warnCursorCliMissing": 'Cursor-CLI-Programm "{bin}" nicht gefunden; installieren Sie es (https://cursor.com/docs/cli) oder setzen Sie TUNNELBOX_CURSOR_BIN',
|
|
2272
|
+
"adapter.checkCursorCliMissing": "Cursor-CLI-Programm nicht gefunden ({bin}); installieren Sie es von https://cursor.com/docs/cli",
|
|
2273
|
+
"adapter.checkCursorAcpHint": "Cursor CLI erkannt; der ACP-Modus (`agent acp`) wird f\xFCr Streaming/Genehmigung/Auswahl verwendet",
|
|
2274
|
+
"adapter.errAcpSpawn": "Start von cursor `agent acp` fehlgeschlagen: {message} (stellen Sie sicher, dass Ihre Cursor CLI `agent acp` unterst\xFCtzt)",
|
|
2275
|
+
"adapter.errAcpNoSession": "Cursor ACP hat keine Sitzungs-ID zur\xFCckgegeben",
|
|
2276
|
+
"adapter.logResumeFailed": "Sitzungswiederaufnahme fehlgeschlagen, neue Sitzung wird gestartet: {message}",
|
|
2277
|
+
"adapter.logPlanNative": "Plan-Genehmigung -> Genehmigungskarte am Handy permissionID={id} (session={session})",
|
|
2278
|
+
"adapter.errTimeout": "Zeit\xFCberschreitung, automatisch abgelehnt (fail-closed)",
|
|
2279
|
+
"adapter.planApprovalPrompt": "Cursor fordert die Genehmigung eines Plans an",
|
|
2280
|
+
"adapter.checkCursorHeader": "tunnelbox-cursor Umgebungspr\xFCfung",
|
|
2281
|
+
"adapter.errAskBridge": "Start der ask-Bridge fehlgeschlagen: {message}",
|
|
2282
|
+
"adapter.logAskBridge": "MCP ask-Bridge lauscht auf {url}",
|
|
2283
|
+
"cursor.mcpAskDesc": "Fordert den Nutzer auf, auf dem Handy (tunnelbox) zu w\xE4hlen, und blockiert bis zur Antwort. Verwende dies, wann immer der Nutzer vor dem Fortfahren zwischen Optionen w\xE4hlen muss (Gericht, Modus, Planoption \u2026). Gibt die gew\xE4hlten Optionsbezeichnungen zur\xFCck.",
|
|
2284
|
+
"cursor.mcpAskTitleDesc": "Optionaler Titel auf der Handy-Karte",
|
|
2285
|
+
"cursor.mcpAskQuestionsDesc": "Eine oder mehrere Fragen; jede bietet Optionen",
|
|
2286
|
+
"cursor.mcpPlanDesc": "Fordert den Nutzer auf, einen Plan auf dem Handy (tunnelbox) zu genehmigen, und blockiert bis zur Antwort. Gibt zur\xFCck, ob der Plan akzeptiert wurde.",
|
|
2287
|
+
"cursor.mcpNoBridge": "die tunnelbox ask-Bridge ist nicht verf\xFCgbar",
|
|
2288
|
+
"cursor.mcpUnanswered": "Der Nutzer hat auf dem Handy nicht geantwortet (offline oder Zeit\xFCberschreitung). Fahre fort oder frage im Chat.",
|
|
2289
|
+
"cursor.mcpRejected": "Der Nutzer hat die Frage auf dem Handy abgelehnt.",
|
|
2290
|
+
"cursor.mcpAnswersHeader": "Antworten des Nutzers (vom Handy):",
|
|
2291
|
+
"cursor.mcpAccepted": "Der Nutzer hat den Plan akzeptiert.",
|
|
2292
|
+
"cursor.mcpDenied": "Der Nutzer hat den Plan abgelehnt.",
|
|
2293
|
+
"cursor.mcpPlanUnanswered": "Der Nutzer hat auf dem Handy nicht auf den Plan geantwortet (offline oder Zeit\xFCberschreitung).",
|
|
2294
|
+
"cursor.mcpAskNoQuestions": "Keine Fragen angegeben.",
|
|
2295
|
+
"cursor.mcpFailed": "tunnelbox ask fehlgeschlagen",
|
|
2296
|
+
"adapter.errCursorExitCode": "Cursor CLI beendet mit Code {code}",
|
|
2297
|
+
"adapter.errCursorExit": "Cursor CLI beendet ({code}): {err}",
|
|
2298
|
+
"adapter.errCursorSpawn": "Cursor CLI (agent) kann nicht gestartet werden: Stellen Sie sicher, dass es installiert und angemeldet ist ({message})",
|
|
2299
|
+
"adapter.errCursorStart": "Start von Cursor CLI fehlgeschlagen: {message}",
|
|
2300
|
+
"adapter.errCursorGeneric": "Cursor-Fehler"
|
|
1318
2301
|
};
|
|
1319
2302
|
var es_ES_default = {
|
|
1320
2303
|
"agent.err.createSession": "No se pudo crear la sesi\xF3n",
|
|
@@ -1365,7 +2348,7 @@ var es_ES_default = {
|
|
|
1365
2348
|
"install.scanHint": "Abra tunnelbox en el tel\xE9fono, pulse \u201CEscanear para emparejar\u201D y escanee el c\xF3digo QR superior para conectar:",
|
|
1366
2349
|
"pair.heading": "Emparejamiento de tel\xE9fono tunnelbox",
|
|
1367
2350
|
"pair.howTo": "Abra la aplicaci\xF3n tunnelbox en el tel\xE9fono y escanee el c\xF3digo QR superior con \u201CEscanear para emparejar\u201D, o introduzca el c\xF3digo de emparejamiento manualmente.",
|
|
1368
|
-
"pair.oneTime": "El c\xF3digo de emparejamiento es de un solo uso y
|
|
2351
|
+
"pair.oneTime": "El c\xF3digo de emparejamiento es de un solo uso y v\xE1lido unos 10 minutos; deja de funcionar al usarse o caducar. Pida \xABactualizar el c\xF3digo de emparejamiento\xBB para obtener uno nuevo.",
|
|
1369
2352
|
"pair.promptBody": "Mu\xE9strame la informaci\xF3n de emparejamiento con el tel\xE9fono de este ordenador: el c\xF3digo de emparejamiento y un c\xF3digo QR escaneable. Mant\xE9n el c\xF3digo QR dentro de un bloque de c\xF3digo de ancho fijo y reprod\xFAcelo car\xE1cter por car\xE1cter para que mi tel\xE9fono pueda escanearlo.",
|
|
1370
2353
|
"pair.promptDescription": "Mostrar el c\xF3digo de emparejamiento y el QR escaneable",
|
|
1371
2354
|
"pair.scanIntro": "**Emparejar escaneando**: abra la aplicaci\xF3n tunnelbox en el tel\xE9fono, pulse \u201CEscanear para emparejar\u201D y escanee el c\xF3digo QR inferior para conectar autom\xE1ticamente.",
|
|
@@ -1480,7 +2463,148 @@ var es_ES_default = {
|
|
|
1480
2463
|
"hermes.pairTimeout": "Tiempo de espera agotado al solicitar el c\xF3digo de emparejamiento (rel\xE9 sin respuesta)",
|
|
1481
2464
|
"hermes.errToolPair": "fallo de tunnelbox_pair: {err}",
|
|
1482
2465
|
"hermes.errToolStatus": "fallo de tunnelbox_status: {err}",
|
|
1483
|
-
"hermes.cliUsage": "Uso: /tunnelbox <pair|status>\n pair solicitar e imprimir un c\xF3digo de emparejamiento\n status mostrar estado de rel\xE9/enlace/conexi\xF3n"
|
|
2466
|
+
"hermes.cliUsage": "Uso: /tunnelbox <pair|status>\n pair solicitar e imprimir un c\xF3digo de emparejamiento\n status mostrar estado de rel\xE9/enlace/conexi\xF3n",
|
|
2467
|
+
"qr.validFor": "El c\xF3digo de emparejamiento es v\xE1lido durante unos 10 minutos; si caduca, obtenga uno nuevo en su computadora.",
|
|
2468
|
+
"pair.toolDesc": "Muestra la informaci\xF3n de emparejamiento telef\xF3nico de esta computadora (c\xF3digo de emparejamiento y c\xF3digo QR escaneable). Llamar cuando el usuario pregunte sobre emparejamiento, escaneo de QR o controlar esta computadora desde el tel\xE9fono.",
|
|
2469
|
+
"pair.toolRefreshDesc": "Si se debe solicitar un nuevo c\xF3digo de emparejamiento al rel\xE9",
|
|
2470
|
+
"state.errSaveState": "No se pudo guardar el estado",
|
|
2471
|
+
"adapter.logConnected": "Conectado al rel\xE9 {url}",
|
|
2472
|
+
"adapter.logDisconnected": "Desconectado del rel\xE9, reconectando autom\xE1ticamente\u2026",
|
|
2473
|
+
"adapter.logPairCode": "C\xF3digo de emparejamiento generado: {code}",
|
|
2474
|
+
"adapter.logClaimed": "Vinculado a su cuenta de tel\xE9fono. A partir de ahora el tel\xE9fono se conecta directamente desde \xABMis computadoras\xBB",
|
|
2475
|
+
"adapter.logResetIdentity": "Desvinculado de la cuenta; restableciendo identidad y generando un nuevo c\xF3digo de emparejamiento\u2026",
|
|
2476
|
+
"adapter.logUnhandledType": "Tipo de mensaje no gestionado: {type}",
|
|
2477
|
+
"adapter.errNoRelay": "No hay URL de rel\xE9 configurada: compile con --env para inyectar un valor predeterminado, o sobrescr\xEDbala en tiempo de ejecuci\xF3n con TUNNELBOX_RELAY_URL",
|
|
2478
|
+
"adapter.errBusy": "Esta sesi\xF3n sigue en ejecuci\xF3n; espere a que termine o det\xE9ngala primero",
|
|
2479
|
+
"adapter.errBadWorkspaceEmpty": "Falta la ruta del espacio de trabajo",
|
|
2480
|
+
"adapter.errBadWorkspaceNotDir": "El directorio no existe o no es utilizable",
|
|
2481
|
+
"adapter.errWorkspaceMissing": "El espacio de trabajo no existe: {dir}",
|
|
2482
|
+
"adapter.cmdNew": "Nueva sesi\xF3n",
|
|
2483
|
+
"adapter.cmdHelp": "Mostrar ayuda",
|
|
2484
|
+
"adapter.helpText": "Comandos admitidos:\n- /new nueva sesi\xF3n\n- /help mostrar ayuda",
|
|
2485
|
+
"adapter.newSessionTitle": "Nueva sesi\xF3n",
|
|
2486
|
+
"install.langHelpTitle": "Idiomas admitidos por install-local (--lang <tag>):",
|
|
2487
|
+
"install.langHelpExample": "Ejemplo: npm run install-local -- --lang de-DE",
|
|
2488
|
+
"install.unknownLang": "Idioma desconocido \xAB{raw}\xBB, se usar\xE1 en-US. Admitidos: {list}",
|
|
2489
|
+
"hermes.errAskRequired": "question es obligatorio",
|
|
2490
|
+
"hermes.msgPhoneUnavailable": "Tel\xE9fono no disponible o sin respuesta: use el clarify integrado para preguntar localmente, o decida por su cuenta.",
|
|
2491
|
+
"hermes.errClarifyUnavailable": "Compatibilidad con clarify no disponible",
|
|
2492
|
+
"hermes.errAskFailed": "tunnelbox_ask fall\xF3: {err}",
|
|
2493
|
+
"hermes.errClarifyFailed": "clarify fall\xF3: {err}",
|
|
2494
|
+
"bin.denied": "Rechazado desde su tel\xE9fono",
|
|
2495
|
+
"bin.timeout": "Aprobaci\xF3n agotada (fail-closed)",
|
|
2496
|
+
"bin.reqRun": "Claude Code solicita ejecutar {tool}",
|
|
2497
|
+
"bin.pairTitle": "Emparejamiento telef\xF3nico tunnelbox",
|
|
2498
|
+
"bin.pairCodeLine": " C\xF3digo de emparejamiento: {code}",
|
|
2499
|
+
"bin.pairHint": "Abra la app tunnelbox, toque \xABEscanear para emparejar\xBB y escanee el c\xF3digo QR, o introduzca el c\xF3digo de emparejamiento manualmente (un solo uso).",
|
|
2500
|
+
"bin.pairWritten": " Informaci\xF3n de emparejamiento escrita en: {path}",
|
|
2501
|
+
"bin.pairRequestFailed": "No se pudo solicitar un c\xF3digo de emparejamiento al rel\xE9.",
|
|
2502
|
+
"bin.alreadyClaimed": "Esta computadora ya est\xE1 vinculada a una cuenta de tel\xE9fono; con\xE9ctese directamente desde \xABMis computadoras\xBB. Para volver a emparejar, desvinc\xFAlela primero en el tel\xE9fono.",
|
|
2503
|
+
"bin.noRelay": "No hay URL de rel\xE9 configurada: defina TUNNELBOX_RELAY_URL e int\xE9ntelo de nuevo.",
|
|
2504
|
+
"bin.connectFailed": "No se puede conectar al rel\xE9: {relay}\nDefina TUNNELBOX_RELAY_URL o config\xFArelo en el archivo de estado de official-plugin.",
|
|
2505
|
+
"bin.statusRelay": "Rel\xE9: {value}",
|
|
2506
|
+
"bin.statusAgent": "ID del agente: {value}",
|
|
2507
|
+
"bin.statusClaimed": "Tel\xE9fono vinculado: {value}",
|
|
2508
|
+
"bin.statusStateFile": "Archivo de estado: {value}",
|
|
2509
|
+
"bin.statusLatest": "\xDAltima informaci\xF3n de emparejamiento:",
|
|
2510
|
+
"bin.usage": "Uso: tunnelbox <pair|status|ask>",
|
|
2511
|
+
"bin.usagePair": " pair solicitar e imprimir un c\xF3digo de emparejamiento",
|
|
2512
|
+
"bin.usageStatus": " status mostrar estado del rel\xE9/vinculaci\xF3n",
|
|
2513
|
+
"bin.usageAsk": " ask reenviar una aprobaci\xF3n de herramienta al tel\xE9fono",
|
|
2514
|
+
"adapter.logMsgUncaught": "Excepci\xF3n no capturada al procesar el mensaje: {message}",
|
|
2515
|
+
"adapter.logHandleFailed": "Error al procesar {type}: {message}",
|
|
2516
|
+
"adapter.logPromptFailed": "session.prompt fall\xF3: {message}",
|
|
2517
|
+
"adapter.logAbortSent": "Cancelaci\xF3n enviada (session={session})",
|
|
2518
|
+
"adapter.errUserDenied": "Rechazado por el usuario",
|
|
2519
|
+
"adapter.logPendingResent": "session.pending: {count} solicitud(es) pendiente(s) reenviada(s)",
|
|
2520
|
+
"adapter.logWorkspaceSwitched": "Espacio de trabajo cambiado: {path}",
|
|
2521
|
+
"adapter.logNewSession": "Nueva sesi\xF3n guardada codexId={codexId} (alias={session})",
|
|
2522
|
+
"adapter.logSessionError": "Error de turno (session={session}): {message}",
|
|
2523
|
+
"adapter.logDshSent": "Enviado a dsh (session={session})",
|
|
2524
|
+
"adapter.logReadHistoryFailed": "Error al leer el historial de sesi\xF3n ({session}): {message}",
|
|
2525
|
+
"adapter.logAnswererInitFailed": "Error al inicializar el respondedor: {message}",
|
|
2526
|
+
"adapter.logRemoteMode": "Modo de visualizaci\xF3n dual: selecciones/aprobaciones usan difusi\xF3n multicliente typert; tel\xE9fono y dsh web comparten la vista, gana la primera respuesta",
|
|
2527
|
+
"adapter.logRemoteProbeFailed": "Fall\xF3 la detecci\xF3n de la fuente de eventos remota typert; se usar\xE1 el modo de respuesta local: {message}",
|
|
2528
|
+
"adapter.logLocalMode": "Modo de respuesta local: selecciones/aprobaciones respondidas por el tel\xE9fono (headless, sin difusi\xF3n de dsh web)",
|
|
2529
|
+
"adapter.logRemoteStreamInterrupted": "Flujo remote events interrumpido: {message}",
|
|
2530
|
+
"adapter.logResultRejected": "$events/result no aceptado ({eventId}): {message}",
|
|
2531
|
+
"adapter.logResultBackfillFailed": "Error al rellenar $events/result ({eventId}): {message}",
|
|
2532
|
+
"adapter.logRemoteQuestion": "Difusi\xF3n de pregunta remote \u2192 tarjeta de pregunta del tel\xE9fono questionID={id} (session={session})",
|
|
2533
|
+
"adapter.errRemoteReadyFrame": "Primer fotograma de remote events inesperado",
|
|
2534
|
+
"adapter.logRemoteApproval": "Difusi\xF3n de aprobaci\xF3n remote \u2192 tarjeta de permiso del tel\xE9fono permissionID={id} (session={session})",
|
|
2535
|
+
"adapter.logUserQuestionRoute": "Selecci\xF3n de user-questions \u2192 enrutada a session={session}",
|
|
2536
|
+
"adapter.errDshQuestionEmpty": "El contenido de la pregunta de dsh est\xE1 vac\xEDo",
|
|
2537
|
+
"adapter.errQuestionTimeout": "Pregunta agotada ({seconds}s), cancelada",
|
|
2538
|
+
"adapter.errQuestionCancelledAbort": "Pregunta cancelada (agente abortado)",
|
|
2539
|
+
"adapter.errQuestionCancelledRelay": "Rel\xE9 inaccesible, pregunta cancelada",
|
|
2540
|
+
"adapter.logQuestionToPhone": "Selecci\xF3n de user-questions \u2192 enviada a la tarjeta de pregunta del tel\xE9fono questionID={id} (session={session})",
|
|
2541
|
+
"adapter.errQuestionUserCancelled": "El usuario cancel\xF3/rechaz\xF3 la pregunta en el tel\xE9fono",
|
|
2542
|
+
"adapter.logApprovalRequest": "Solicitud de aprobaci\xF3n (tool={tool}) \u2192 enviada a la tarjeta de permiso del tel\xE9fono permissionID={id}",
|
|
2543
|
+
"adapter.logAgentPresetFailed": "Error al resolver agentPreset ({preset}); se usar\xE1 sin preset: {message}",
|
|
2544
|
+
"adapter.logSessionLiveAdopted": "La sesi\xF3n {session} ya est\xE1 retenida por otro agente de este proceso (live); se adopta el agente existente para continuar: {message}",
|
|
2545
|
+
"adapter.logDisposeSkipped": "El agente live externo adoptado no ejecuta dispose (la sesi\xF3n {session} la gestiona su titular original)",
|
|
2546
|
+
"adapter.logAgentCreateFailed": "Error al crear/reanudar el agente ({session}): {message}",
|
|
2547
|
+
"adapter.errSessionBusyLive": "La sesi\xF3n {session} est\xE1 ocupada (live); int\xE9ntelo m\xE1s tarde",
|
|
2548
|
+
"adapter.errAgentsUnavailable": "Servicio agents no disponible",
|
|
2549
|
+
"adapter.logToolReason": "dsh solicita ejecutar la herramienta {tool}",
|
|
2550
|
+
"adapter.logGatewayConnected": "Conectado al Gateway OpenClaw local ({version})",
|
|
2551
|
+
"adapter.logGatewayDisconnected": "Desconectado del Gateway OpenClaw; el cliente oficial se est\xE1 reconectando\u2026",
|
|
2552
|
+
"adapter.logGatewayConnectFailed": "No se puede conectar al Gateway OpenClaw local (la primera vez, apruebe el dispositivo localmente: `openclaw devices list` + `openclaw devices approve <requestId>`)",
|
|
2553
|
+
"adapter.errGatewayNoSessionKey": "El Gateway no devolvi\xF3 una clave de sesi\xF3n",
|
|
2554
|
+
"adapter.logDeleteSessionFailed": "Error al eliminar la sesi\xF3n ({session}): {message} (se confirma como eliminada igualmente)",
|
|
2555
|
+
"adapter.logApprovalReplyFailed": "Error en la respuesta de aprobaci\xF3n ({id}): {message}",
|
|
2556
|
+
"adapter.logPendingApproval": "session.pending: {count} aprobaci\xF3n(es) pendiente(s) reenviada(s) (session={session})",
|
|
2557
|
+
"adapter.workspaceDefault": "Predeterminado",
|
|
2558
|
+
"adapter.cursorSessionTitle": "Sesi\xF3n de Cursor",
|
|
2559
|
+
"adapter.reasonDisconnect": "Rel\xE9 desconectado, rechazo autom\xE1tico (fail-closed)",
|
|
2560
|
+
"adapter.warnInvalidEnv": "Se ignora {name} no v\xE1lido: {raw} ({list})",
|
|
2561
|
+
"adapter.errStartFailed": "Error al iniciar:",
|
|
2562
|
+
"adapter.msgStarted": "Adaptador {name} iniciado (Ctrl+C para salir)",
|
|
2563
|
+
"adapter.warnCliMissing": "Ejecutable \xAB{bin}\xBB no encontrado; inst\xE1lelo (p. ej. npm i -g @openai/codex) o defina TUNNELBOX_CODEX_BIN con su ruta",
|
|
2564
|
+
"adapter.errCliNotFound": "Ejecutable {name} \xAB{bin}\xBB no encontrado: instale el Codex CLI (npm i -g @openai/codex) o defina TUNNELBOX_CODEX_BIN",
|
|
2565
|
+
"adapter.errSessionNotFound": "Sesi\xF3n no encontrada o ya eliminada",
|
|
2566
|
+
"adapter.checkHeader": "Comprobaci\xF3n del entorno de tunnelbox-codex",
|
|
2567
|
+
"adapter.checkCliOk": "Ejecutable {name}: {path}",
|
|
2568
|
+
"adapter.checkCliMissing": "Ejecutable {name} no encontrado ({bin})",
|
|
2569
|
+
"bin.yes": "s\xED",
|
|
2570
|
+
"bin.no": "no",
|
|
2571
|
+
"adapter.errAppServerSpawn": "No se pudo iniciar codex app-server: {message} (comprueba que tu Codex CLI admita `codex app-server`)",
|
|
2572
|
+
"adapter.errAppServerExit": "codex app-server se cerr\xF3; las aprobaciones/elecciones pendientes se rechazaron autom\xE1ticamente",
|
|
2573
|
+
"adapter.logUnsupportedServerRequest": "solicitud de app-server no admitida: {method}",
|
|
2574
|
+
"adapter.logQuestionNative": "solicitud de elecci\xF3n -> tarjeta de elecci\xF3n del tel\xE9fono questionID={id} (session={session})",
|
|
2575
|
+
"adapter.logPermissionNative": "solicitud de aprobaci\xF3n -> tarjeta de aprobaci\xF3n del tel\xE9fono permissionID={id} (session={session})",
|
|
2576
|
+
"adapter.checkAppServerOk": "codex app-server disponible",
|
|
2577
|
+
"adapter.checkAppServerMissing": "este Codex CLI no admite `codex app-server` (actualiza Codex CLI)",
|
|
2578
|
+
"adapter.warnCursorCliMissing": 'No se encontr\xF3 el ejecutable de Cursor CLI "{bin}"; inst\xE1lalo (https://cursor.com/docs/cli) o define TUNNELBOX_CURSOR_BIN',
|
|
2579
|
+
"adapter.checkCursorCliMissing": "No se encontr\xF3 el ejecutable de Cursor CLI ({bin}); inst\xE1lalo desde https://cursor.com/docs/cli",
|
|
2580
|
+
"adapter.checkCursorAcpHint": "Cursor CLI detectado; se usar\xE1 el modo ACP (`agent acp`) para streaming/aprobaci\xF3n/selecci\xF3n",
|
|
2581
|
+
"adapter.errAcpSpawn": "No se pudo iniciar cursor `agent acp`: {message} (comprueba que tu Cursor CLI admita `agent acp`)",
|
|
2582
|
+
"adapter.errAcpNoSession": "Cursor ACP no devolvi\xF3 un id de sesi\xF3n",
|
|
2583
|
+
"adapter.logResumeFailed": "Fall\xF3 la reanudaci\xF3n de la sesi\xF3n; se inicia una nueva sesi\xF3n: {message}",
|
|
2584
|
+
"adapter.logPlanNative": "aprobaci\xF3n de plan -> tarjeta de aprobaci\xF3n del tel\xE9fono permissionID={id} (session={session})",
|
|
2585
|
+
"adapter.errTimeout": "Tiempo de espera agotado, rechazo autom\xE1tico (fail-closed)",
|
|
2586
|
+
"adapter.planApprovalPrompt": "Cursor solicita aprobaci\xF3n de un plan",
|
|
2587
|
+
"adapter.checkCursorHeader": "comprobaci\xF3n de entorno de tunnelbox-cursor",
|
|
2588
|
+
"adapter.errAskBridge": "No se pudo iniciar el puente ask: {message}",
|
|
2589
|
+
"adapter.logAskBridge": "Puente MCP ask escuchando en {url}",
|
|
2590
|
+
"cursor.mcpAskDesc": "Pide al usuario que elija en su tel\xE9fono (tunnelbox) y bloquea hasta que responda. \xDAsalo siempre que el usuario deba elegir entre opciones antes de continuar (plato, modo, opci\xF3n de plan\u2026). Devuelve la(s) etiqueta(s) elegida(s).",
|
|
2591
|
+
"cursor.mcpAskTitleDesc": "T\xEDtulo opcional mostrado en la tarjeta del tel\xE9fono",
|
|
2592
|
+
"cursor.mcpAskQuestionsDesc": "Una o m\xE1s preguntas; cada una tiene opciones",
|
|
2593
|
+
"cursor.mcpPlanDesc": "Pide al usuario que apruebe un plan en su tel\xE9fono (tunnelbox) y bloquea hasta que responda. Indica si el plan fue aceptado.",
|
|
2594
|
+
"cursor.mcpNoBridge": "el puente ask de tunnelbox no est\xE1 disponible",
|
|
2595
|
+
"cursor.mcpUnanswered": "El usuario no respondi\xF3 en su tel\xE9fono (sin conexi\xF3n o tiempo agotado). Contin\xFAa o pregunta en el chat.",
|
|
2596
|
+
"cursor.mcpRejected": "El usuario rechaz\xF3 la pregunta en su tel\xE9fono.",
|
|
2597
|
+
"cursor.mcpAnswersHeader": "Respuestas del usuario (desde su tel\xE9fono):",
|
|
2598
|
+
"cursor.mcpAccepted": "El usuario acept\xF3 el plan.",
|
|
2599
|
+
"cursor.mcpDenied": "El usuario rechaz\xF3 el plan.",
|
|
2600
|
+
"cursor.mcpPlanUnanswered": "El usuario no respondi\xF3 al plan en su tel\xE9fono (sin conexi\xF3n o tiempo agotado).",
|
|
2601
|
+
"cursor.mcpAskNoQuestions": "No se proporcionaron preguntas.",
|
|
2602
|
+
"cursor.mcpFailed": "fall\xF3 tunnelbox ask",
|
|
2603
|
+
"adapter.errCursorExitCode": "Cursor CLI finaliz\xF3 con el c\xF3digo {code}",
|
|
2604
|
+
"adapter.errCursorExit": "Cursor CLI finaliz\xF3 ({code}): {err}",
|
|
2605
|
+
"adapter.errCursorSpawn": "No se puede iniciar Cursor CLI (agent): comprueba que est\xE9 instalado y con sesi\xF3n iniciada ({message})",
|
|
2606
|
+
"adapter.errCursorStart": "Fall\xF3 el inicio de Cursor CLI: {message}",
|
|
2607
|
+
"adapter.errCursorGeneric": "Error de Cursor"
|
|
1484
2608
|
};
|
|
1485
2609
|
var DEFAULT_LANG = "en-US";
|
|
1486
2610
|
var dicts = {
|
|
@@ -1536,6 +2660,9 @@ function t(lang, key, vars) {
|
|
|
1536
2660
|
}
|
|
1537
2661
|
return text;
|
|
1538
2662
|
}
|
|
2663
|
+
function makeT(lang) {
|
|
2664
|
+
return (key, vars) => t(lang, key, vars);
|
|
2665
|
+
}
|
|
1539
2666
|
function baseName() {
|
|
1540
2667
|
return join(homedir(), ".tunnelbox");
|
|
1541
2668
|
}
|
|
@@ -1551,7 +2678,7 @@ function saveState(st, type) {
|
|
|
1551
2678
|
mkdirSync(dirname(p), { recursive: true });
|
|
1552
2679
|
writeFileSync(p, JSON.stringify(st, null, 2), "utf8");
|
|
1553
2680
|
} catch (e) {
|
|
1554
|
-
console.error(
|
|
2681
|
+
console.error(`[tunnelbox] ${t(st.lang ?? resolveLang(), "state.errSaveState")}`, e);
|
|
1555
2682
|
}
|
|
1556
2683
|
}
|
|
1557
2684
|
function loadState(type) {
|
|
@@ -1579,11 +2706,12 @@ function loadState(type) {
|
|
|
1579
2706
|
return fallback;
|
|
1580
2707
|
}
|
|
1581
2708
|
}
|
|
1582
|
-
function writePairingFile(code, type) {
|
|
2709
|
+
function writePairingFile(code, type, lang) {
|
|
1583
2710
|
const p = join(baseName(), `remote-pairing${suffix(type)}.txt`);
|
|
1584
2711
|
try {
|
|
1585
2712
|
mkdirSync(dirname(p), { recursive: true });
|
|
1586
|
-
|
|
2713
|
+
const label = t(lang ?? resolveLang(), "qr.codeLabel");
|
|
2714
|
+
writeFileSync(p, `${label}: ${code}
|
|
1587
2715
|
`, "utf8");
|
|
1588
2716
|
} catch {
|
|
1589
2717
|
}
|
|
@@ -1618,7 +2746,7 @@ function padVisual(s, width, align = "left") {
|
|
|
1618
2746
|
}
|
|
1619
2747
|
async function printPairing(code, type, name2, lang) {
|
|
1620
2748
|
const resolved = lang ? normalizeLang(lang) : resolveLang();
|
|
1621
|
-
const file = writePairingFile(code, type);
|
|
2749
|
+
const file = writePairingFile(code, type, resolved);
|
|
1622
2750
|
const tt = (key, vars) => t(resolved, key, vars);
|
|
1623
2751
|
const title = type ? tt("qr.titleWithType", { type }) : tt("qr.titleNoType");
|
|
1624
2752
|
const codeLine = `${tt("qr.codeLabel")}: ${code}`;
|
|
@@ -1633,6 +2761,7 @@ async function printPairing(code, type, name2, lang) {
|
|
|
1633
2761
|
console.log("\u2502 " + padVisual(codeLine, W - 2) + " \u2502");
|
|
1634
2762
|
console.log("\u2514" + bar + "\u2518");
|
|
1635
2763
|
console.log(" " + hint);
|
|
2764
|
+
console.log(" " + tt("qr.validFor"));
|
|
1636
2765
|
try {
|
|
1637
2766
|
const mod = await import("qrcode");
|
|
1638
2767
|
const render = mod.default ?? mod;
|
|
@@ -1745,6 +2874,8 @@ var MessagesCache = class {
|
|
|
1745
2874
|
var messagesCache = new MessagesCache();
|
|
1746
2875
|
|
|
1747
2876
|
// src/bridge.ts
|
|
2877
|
+
import { randomBytes as randomBytes2 } from "node:crypto";
|
|
2878
|
+
import { hostname } from "node:os";
|
|
1748
2879
|
import { installModelSelection } from "@deepseek-ai/dsh-agent";
|
|
1749
2880
|
import { createUserMessage } from "@deepseek-ai/dsh-llm";
|
|
1750
2881
|
import { SessionId } from "@deepseek-ai/dsh-session";
|
|
@@ -2114,18 +3245,20 @@ function findDir(dir, name2) {
|
|
|
2114
3245
|
}
|
|
2115
3246
|
|
|
2116
3247
|
// src/bridge.ts
|
|
2117
|
-
var VERSION = true ? "0.1.
|
|
3248
|
+
var VERSION = true ? "0.1.21" : "0.0.0-dev";
|
|
2118
3249
|
var AGENT_TYPE = "dsh";
|
|
2119
3250
|
var APPROVAL_TIMEOUT_MS = 12e4;
|
|
2120
3251
|
var ADAPTER_COMMANDS = [
|
|
2121
|
-
{ name: "new",
|
|
2122
|
-
{ name: "help",
|
|
3252
|
+
{ name: "new", descriptionKey: "adapter.cmdNew" },
|
|
3253
|
+
{ name: "help", descriptionKey: "adapter.cmdHelp" }
|
|
2123
3254
|
];
|
|
2124
3255
|
var TunnelboxBridge = class {
|
|
2125
3256
|
constructor(ctx, cfg) {
|
|
2126
3257
|
this.ctx = ctx;
|
|
2127
3258
|
this.cfg = cfg;
|
|
2128
3259
|
this.currentWorkspace = cfg.cwd || process.cwd();
|
|
3260
|
+
this.lang = resolveLang({ config: cfg.lang, saved: this.state.lang });
|
|
3261
|
+
this.t = makeT(this.lang);
|
|
2129
3262
|
this.ctx.on("session/event", (session, event) => this.onSessionEvent(session.id, event));
|
|
2130
3263
|
}
|
|
2131
3264
|
ws = new RelayClient();
|
|
@@ -2157,16 +3290,18 @@ var TunnelboxBridge = class {
|
|
|
2157
3290
|
currentWorkspace = "";
|
|
2158
3291
|
/** session.create 指定工作区但尚未建 agent 的暂存(sessionID → workspace)。 */
|
|
2159
3292
|
pendingWorkspaces = /* @__PURE__ */ new Map();
|
|
3293
|
+
t;
|
|
3294
|
+
lang;
|
|
2160
3295
|
get home() {
|
|
2161
3296
|
return dshHome();
|
|
2162
3297
|
}
|
|
2163
3298
|
async start() {
|
|
2164
3299
|
await this.ctx.get("loader")?.await();
|
|
2165
|
-
void this.setupAnswerer().catch((e) => this.log(
|
|
3300
|
+
void this.setupAnswerer().catch((e) => this.log(this.t("adapter.logAnswererInitFailed", { message: e.message })));
|
|
2166
3301
|
const url = (process.env.TUNNELBOX_RELAY_URL || this.cfg.relayUrl || injectedRelayUrl() || "").replace(/\/+$/, "");
|
|
2167
3302
|
this.relayBase = url;
|
|
2168
3303
|
if (!url) {
|
|
2169
|
-
this.log("
|
|
3304
|
+
this.log(this.t("adapter.errNoRelay"));
|
|
2170
3305
|
return;
|
|
2171
3306
|
}
|
|
2172
3307
|
this.connect(url);
|
|
@@ -2206,20 +3341,20 @@ var TunnelboxBridge = class {
|
|
|
2206
3341
|
{
|
|
2207
3342
|
onOpen: () => {
|
|
2208
3343
|
this.everConnected = true;
|
|
2209
|
-
this.log("
|
|
3344
|
+
this.log(this.t("adapter.logConnected", { url }));
|
|
2210
3345
|
this.announce();
|
|
2211
3346
|
},
|
|
2212
3347
|
onMessage: (env) => {
|
|
2213
3348
|
void this.onMessage(env).catch((e) => {
|
|
2214
3349
|
const err = e;
|
|
2215
|
-
this.log(
|
|
2216
|
-
${err.stack
|
|
3350
|
+
this.log(this.t("adapter.logMsgUncaught", { message: err.message }) + (err.stack ? `
|
|
3351
|
+
${err.stack}` : ""));
|
|
2217
3352
|
});
|
|
2218
3353
|
},
|
|
2219
3354
|
onClose: () => {
|
|
2220
3355
|
if (this.everConnected) {
|
|
2221
3356
|
this.everConnected = false;
|
|
2222
|
-
this.log("
|
|
3357
|
+
this.log(this.t("adapter.logDisconnected"));
|
|
2223
3358
|
}
|
|
2224
3359
|
},
|
|
2225
3360
|
onError: () => {
|
|
@@ -2257,15 +3392,15 @@ ${err.stack ?? ""}`);
|
|
|
2257
3392
|
case "pair.created": {
|
|
2258
3393
|
const code = env.payload.code;
|
|
2259
3394
|
writePairingJson({ code, relayUrl: this.relayBase, at: Date.now() }, AGENT_TYPE);
|
|
2260
|
-
this.log("
|
|
2261
|
-
void printPairing(code, AGENT_TYPE, hostname());
|
|
3395
|
+
this.log(this.t("adapter.logPairCode", { code }));
|
|
3396
|
+
void printPairing(code, AGENT_TYPE, hostname(), this.lang);
|
|
2262
3397
|
return;
|
|
2263
3398
|
}
|
|
2264
3399
|
case "agent.claimed":
|
|
2265
3400
|
this.claimed = true;
|
|
2266
3401
|
this.state.claimed = true;
|
|
2267
3402
|
saveState(this.state, AGENT_TYPE);
|
|
2268
|
-
this.log("
|
|
3403
|
+
this.log(this.t("adapter.logClaimed"));
|
|
2269
3404
|
return;
|
|
2270
3405
|
case "agent.revoked":
|
|
2271
3406
|
this.resetIdentity();
|
|
@@ -2297,10 +3432,10 @@ ${err.stack ?? ""}`);
|
|
|
2297
3432
|
case "error":
|
|
2298
3433
|
return;
|
|
2299
3434
|
default:
|
|
2300
|
-
this.log("
|
|
3435
|
+
this.log(this.t("adapter.logUnhandledType", { type: env.type }));
|
|
2301
3436
|
}
|
|
2302
3437
|
} catch (e) {
|
|
2303
|
-
this.log(
|
|
3438
|
+
this.log(this.t("adapter.logHandleFailed", { type: env.type, message: e.message }));
|
|
2304
3439
|
this.reply(env, "error", { code: "HANDLER_ERROR", message: e.message, id: env.id });
|
|
2305
3440
|
}
|
|
2306
3441
|
}
|
|
@@ -2319,7 +3454,7 @@ ${err.stack ?? ""}`);
|
|
|
2319
3454
|
const last = events[events.length - 1];
|
|
2320
3455
|
sessions.set(id, {
|
|
2321
3456
|
id,
|
|
2322
|
-
title: text ? text.length > 30 ? text.slice(0, 30) + "\u2026" : text : "
|
|
3457
|
+
title: text ? text.length > 30 ? text.slice(0, 30) + "\u2026" : text : this.t("adapter.newSessionTitle"),
|
|
2323
3458
|
created: events[0]?.time ?? Date.now(),
|
|
2324
3459
|
updated: last?.time ?? Date.now(),
|
|
2325
3460
|
status: "idle",
|
|
@@ -2336,7 +3471,7 @@ ${err.stack ?? ""}`);
|
|
|
2336
3471
|
const now = Date.now();
|
|
2337
3472
|
this.pendingWorkspaces.set(id, workspace);
|
|
2338
3473
|
this.reply(env, "session.created", {
|
|
2339
|
-
session: { id, title: "
|
|
3474
|
+
session: { id, title: this.t("adapter.newSessionTitle"), created: now, updated: now, status: "idle", workspace }
|
|
2340
3475
|
});
|
|
2341
3476
|
}
|
|
2342
3477
|
async sessionMessages(env) {
|
|
@@ -2361,7 +3496,7 @@ ${err.stack ?? ""}`);
|
|
|
2361
3496
|
return await readSessionEvents(sp, sessionID);
|
|
2362
3497
|
} catch (e) {
|
|
2363
3498
|
const m = e.message;
|
|
2364
|
-
if (!/not found|not exist/i.test(m)) this.log(
|
|
3499
|
+
if (!/not found|not exist/i.test(m)) this.log(this.t("adapter.logReadHistoryFailed", { session: sessionID, message: m }));
|
|
2365
3500
|
}
|
|
2366
3501
|
}
|
|
2367
3502
|
return [];
|
|
@@ -2375,7 +3510,7 @@ ${err.stack ?? ""}`);
|
|
|
2375
3510
|
this.reply(env, "message.part", {
|
|
2376
3511
|
sessionID: payload.sessionID,
|
|
2377
3512
|
messageID: `m-${Date.now()}`,
|
|
2378
|
-
part: { id: "t", type: "text", text: "
|
|
3513
|
+
part: { id: "t", type: "text", text: this.t("adapter.helpText"), complete: true }
|
|
2379
3514
|
});
|
|
2380
3515
|
return;
|
|
2381
3516
|
}
|
|
@@ -2383,7 +3518,7 @@ ${err.stack ?? ""}`);
|
|
|
2383
3518
|
handle.agent.followup(
|
|
2384
3519
|
createUserMessage({ content: [{ type: "text", text }], source: { kind: "user" } })
|
|
2385
3520
|
);
|
|
2386
|
-
this.log(
|
|
3521
|
+
this.log(this.t("adapter.logDshSent", { session: payload.sessionID }));
|
|
2387
3522
|
}
|
|
2388
3523
|
async sessionDelete(env) {
|
|
2389
3524
|
const { sessionID } = env.payload;
|
|
@@ -2404,7 +3539,11 @@ ${err.stack ?? ""}`);
|
|
|
2404
3539
|
this.send(envelope("session.status", { sessionID, status: "idle" }));
|
|
2405
3540
|
}
|
|
2406
3541
|
async commandList(env) {
|
|
2407
|
-
|
|
3542
|
+
const commands = ADAPTER_COMMANDS.map((c) => ({
|
|
3543
|
+
name: c.name,
|
|
3544
|
+
description: this.t(c.descriptionKey)
|
|
3545
|
+
}));
|
|
3546
|
+
this.reply(env, "commands", { commands });
|
|
2408
3547
|
}
|
|
2409
3548
|
// ---- 工作区 ----
|
|
2410
3549
|
async workspaceList(env) {
|
|
@@ -2421,7 +3560,7 @@ ${err.stack ?? ""}`);
|
|
|
2421
3560
|
const path = (env.payload?.path || "").trim();
|
|
2422
3561
|
const sp = this.getSessionPersistence();
|
|
2423
3562
|
if (!path) {
|
|
2424
|
-
this.reply(env, "error", { code: "BAD_WORKSPACE", message: "
|
|
3563
|
+
this.reply(env, "error", { code: "BAD_WORKSPACE", message: this.t("adapter.errBadWorkspaceEmpty"), id: env.id });
|
|
2425
3564
|
return;
|
|
2426
3565
|
}
|
|
2427
3566
|
let workspaces = [];
|
|
@@ -2429,11 +3568,11 @@ ${err.stack ?? ""}`);
|
|
|
2429
3568
|
workspaces = await listWorkspaces(sp, this.currentWorkspace);
|
|
2430
3569
|
}
|
|
2431
3570
|
if (workspaces.length && !workspaces.some((w) => w.path === path)) {
|
|
2432
|
-
this.reply(env, "error", { code: "BAD_WORKSPACE", message: "
|
|
3571
|
+
this.reply(env, "error", { code: "BAD_WORKSPACE", message: this.t("adapter.errBadWorkspaceNotDir"), id: env.id });
|
|
2433
3572
|
return;
|
|
2434
3573
|
}
|
|
2435
3574
|
this.currentWorkspace = path;
|
|
2436
|
-
this.log("
|
|
3575
|
+
this.log(this.t("adapter.logWorkspaceSwitched", { path }));
|
|
2437
3576
|
this.announce();
|
|
2438
3577
|
this.reply(env, "workspaces", { workspaces, current: this.currentWorkspace });
|
|
2439
3578
|
}
|
|
@@ -2481,7 +3620,7 @@ ${err.stack ?? ""}`);
|
|
|
2481
3620
|
if (Date.now() - q.at >= APPROVAL_TIMEOUT_MS) continue;
|
|
2482
3621
|
if (this.send(envelope("question.request", q.req))) n++;
|
|
2483
3622
|
}
|
|
2484
|
-
if (n) this.log(
|
|
3623
|
+
if (n) this.log(this.t("adapter.logPendingApproval", { count: n, session: sessionID }));
|
|
2485
3624
|
}
|
|
2486
3625
|
/** 记录未决审批请求(供 session.pending 补发);审批解决/超时/中止时用 clearPendingRequest 移除。 */
|
|
2487
3626
|
addPendingRequest(req) {
|
|
@@ -2518,17 +3657,17 @@ ${err.stack ?? ""}`);
|
|
|
2518
3657
|
const gen = gw.openRemoteEvents({ args: {} }, ac.signal);
|
|
2519
3658
|
const first = await gen.next();
|
|
2520
3659
|
const ready = first.done ? void 0 : first.value;
|
|
2521
|
-
if (ready?.type !== "ready" || !ready.clientId) throw new Error("
|
|
3660
|
+
if (ready?.type !== "ready" || !ready.clientId) throw new Error(this.t("adapter.errRemoteReadyFrame"));
|
|
2522
3661
|
this.remoteClientId = ready.clientId;
|
|
2523
3662
|
this.remoteAc = ac;
|
|
2524
3663
|
this.answerMode = "remote";
|
|
2525
|
-
this.log("
|
|
3664
|
+
this.log(this.t("adapter.logRemoteMode"));
|
|
2526
3665
|
void this.drainRemoteEvents(gen, ac);
|
|
2527
3666
|
} catch (e) {
|
|
2528
3667
|
ac.abort();
|
|
2529
3668
|
const err = e;
|
|
2530
3669
|
const expected = err.code === "gateway/service-unavailable" || /service-unavailable|unavailable/i.test(err.message);
|
|
2531
|
-
if (!expected) this.log(
|
|
3670
|
+
if (!expected) this.log(this.t("adapter.logRemoteProbeFailed", { message: err.message }));
|
|
2532
3671
|
this.activateLocalAnswerers();
|
|
2533
3672
|
}
|
|
2534
3673
|
}
|
|
@@ -2539,13 +3678,13 @@ ${err.stack ?? ""}`);
|
|
|
2539
3678
|
this.answerMode = "local";
|
|
2540
3679
|
this.ctx.on("approval/request", (req, next) => this.onApproval(req, next), { prepend: true });
|
|
2541
3680
|
this.ctx.on("user-questions/request", (request, next) => this.onUserQuestion(request, next), { prepend: true });
|
|
2542
|
-
this.log("
|
|
3681
|
+
this.log(this.t("adapter.logLocalMode"));
|
|
2543
3682
|
}
|
|
2544
3683
|
async drainRemoteEvents(gen, ac) {
|
|
2545
3684
|
try {
|
|
2546
3685
|
for await (const raw of gen) this.onRemoteFrame(raw);
|
|
2547
3686
|
} catch (e) {
|
|
2548
|
-
if (!ac.signal.aborted) this.log(
|
|
3687
|
+
if (!ac.signal.aborted) this.log(this.t("adapter.logRemoteStreamInterrupted", { message: e.message }));
|
|
2549
3688
|
} finally {
|
|
2550
3689
|
if (this.remoteAc === ac) {
|
|
2551
3690
|
this.remoteAc = null;
|
|
@@ -2588,9 +3727,9 @@ ${err.stack ?? ""}`);
|
|
|
2588
3727
|
if (!gw || !this.remoteClientId) return;
|
|
2589
3728
|
void gw.dispatchRpc("$events/result", { args: { clientId: this.remoteClientId, eventId, outcome } }).then(
|
|
2590
3729
|
(res) => {
|
|
2591
|
-
if (res && res.ok === false) this.log(
|
|
3730
|
+
if (res && res.ok === false) this.log(this.t("adapter.logResultRejected", { eventId, message: res.error?.message ?? "unknown" }));
|
|
2592
3731
|
},
|
|
2593
|
-
(e) => this.log(
|
|
3732
|
+
(e) => this.log(this.t("adapter.logResultBackfillFailed", { eventId, message: e.message }))
|
|
2594
3733
|
);
|
|
2595
3734
|
}
|
|
2596
3735
|
/** remote 提问广播:手机在线即推卡;作答/让位经网关与浏览器竞答。 */
|
|
@@ -2608,7 +3747,7 @@ ${err.stack ?? ""}`);
|
|
|
2608
3747
|
const timer = setTimeout(() => this.remoteQuestionTimeout(eventId), APPROVAL_TIMEOUT_MS);
|
|
2609
3748
|
this.remoteQuestions.set(eventId, { agentId, at: Date.now(), req: payload, items: meta, timer });
|
|
2610
3749
|
this.send(envelope("question.request", payload));
|
|
2611
|
-
this.log(
|
|
3750
|
+
this.log(this.t("adapter.logRemoteQuestion", { id: eventId, session: agentId }));
|
|
2612
3751
|
}
|
|
2613
3752
|
/** 手机超时未答:让位(next),不干扰其它端继续作答,并关掉本端卡。 */
|
|
2614
3753
|
remoteQuestionTimeout(eventId) {
|
|
@@ -2634,12 +3773,12 @@ ${err.stack ?? ""}`);
|
|
|
2634
3773
|
args = call.args || {};
|
|
2635
3774
|
}
|
|
2636
3775
|
}
|
|
2637
|
-
const reason = body.reason || (Object.keys(args).length ? JSON.stringify(args, null, 2) :
|
|
3776
|
+
const reason = body.reason || (Object.keys(args).length ? JSON.stringify(args, null, 2) : this.t("adapter.logToolReason", { tool }));
|
|
2638
3777
|
const payload = { id: eventId, sessionID: agentId, tool, args, prompt: reason, createdAt: Date.now() };
|
|
2639
3778
|
const timer = setTimeout(() => this.remoteApprovalTimeout(eventId), APPROVAL_TIMEOUT_MS);
|
|
2640
3779
|
this.remoteApprovals.set(eventId, { agentId, at: Date.now(), req: payload, timer });
|
|
2641
3780
|
this.send(envelope("permission.request", payload));
|
|
2642
|
-
this.log(
|
|
3781
|
+
this.log(this.t("adapter.logRemoteApproval", { id: eventId, session: agentId }));
|
|
2643
3782
|
}
|
|
2644
3783
|
/** 手机超时未审批:让位(next),浏览器仍可允许/拒绝。 */
|
|
2645
3784
|
remoteApprovalTimeout(eventId) {
|
|
@@ -2751,17 +3890,17 @@ ${err.stack ?? ""}`);
|
|
|
2751
3890
|
* 返回该 Promise 即代表本应答者认领(不再调用 next);手机取消/超时/发起方中止时拒绝。
|
|
2752
3891
|
*/
|
|
2753
3892
|
async askPhoneQuestion(sessionID, request) {
|
|
2754
|
-
this.log(
|
|
3893
|
+
this.log(this.t("adapter.logUserQuestionRoute", { session: sessionID }));
|
|
2755
3894
|
const rawItems = request.questions ?? [];
|
|
2756
3895
|
const items = this.buildQuestionItems(rawItems);
|
|
2757
|
-
if (!items.length) throw new Error("
|
|
3896
|
+
if (!items.length) throw new Error(this.t("adapter.errDshQuestionEmpty"));
|
|
2758
3897
|
const id = `q-${++this.questionSeq}-${Date.now()}`;
|
|
2759
3898
|
const req = this.questionCardPayload(id, sessionID, items, this.findAskAnchor(this.liveSessionOf(sessionID)));
|
|
2760
3899
|
const meta = items.map((x) => ({ id: x.id, options: new Set(x.options) }));
|
|
2761
3900
|
return new Promise((resolve, reject) => {
|
|
2762
3901
|
const timer = setTimeout(() => {
|
|
2763
3902
|
this.pendingQuestions.delete(id);
|
|
2764
|
-
reject(new Error(
|
|
3903
|
+
reject(new Error(this.t("adapter.errQuestionTimeout", { seconds: APPROVAL_TIMEOUT_MS / 1e3 })));
|
|
2765
3904
|
}, APPROVAL_TIMEOUT_MS);
|
|
2766
3905
|
this.pendingQuestions.set(id, { sessionID, at: Date.now(), req, items: meta, timer, resolve, reject });
|
|
2767
3906
|
request.signal?.addEventListener(
|
|
@@ -2769,7 +3908,7 @@ ${err.stack ?? ""}`);
|
|
|
2769
3908
|
() => {
|
|
2770
3909
|
clearTimeout(timer);
|
|
2771
3910
|
this.pendingQuestions.delete(id);
|
|
2772
|
-
reject(new Error("
|
|
3911
|
+
reject(new Error(this.t("adapter.errQuestionCancelledAbort")));
|
|
2773
3912
|
},
|
|
2774
3913
|
{ once: true }
|
|
2775
3914
|
);
|
|
@@ -2777,9 +3916,9 @@ ${err.stack ?? ""}`);
|
|
|
2777
3916
|
if (!ok) {
|
|
2778
3917
|
clearTimeout(timer);
|
|
2779
3918
|
this.pendingQuestions.delete(id);
|
|
2780
|
-
reject(new Error("
|
|
3919
|
+
reject(new Error(this.t("adapter.errQuestionCancelledRelay")));
|
|
2781
3920
|
}
|
|
2782
|
-
this.log(
|
|
3921
|
+
this.log(this.t("adapter.logQuestionToPhone", { id, session: sessionID }));
|
|
2783
3922
|
});
|
|
2784
3923
|
}
|
|
2785
3924
|
async questionReply(env) {
|
|
@@ -2802,7 +3941,7 @@ ${err.stack ?? ""}`);
|
|
|
2802
3941
|
clearTimeout(q.timer);
|
|
2803
3942
|
this.pendingQuestions.delete(p.questionID);
|
|
2804
3943
|
if (p.reject) {
|
|
2805
|
-
q.reject(new Error("
|
|
3944
|
+
q.reject(new Error(this.t("adapter.errQuestionUserCancelled")));
|
|
2806
3945
|
} else {
|
|
2807
3946
|
q.resolve({ answers: this.buildAnswerRows(q.items, Array.isArray(p.answers) ? p.answers : []) });
|
|
2808
3947
|
}
|
|
@@ -2838,8 +3977,8 @@ ${err.stack ?? ""}`);
|
|
|
2838
3977
|
const call = req.callId ? findToolCall([...liveSessionEvents(agent?.session)], String(req.callId)) : null;
|
|
2839
3978
|
const tool = call?.name || req.toolName;
|
|
2840
3979
|
const args = call?.args || {};
|
|
2841
|
-
const reason = req.reason || (Object.keys(args).length ? JSON.stringify(args, null, 2) :
|
|
2842
|
-
this.log(
|
|
3980
|
+
const reason = req.reason || (Object.keys(args).length ? JSON.stringify(args, null, 2) : this.t("adapter.logToolReason", { tool }));
|
|
3981
|
+
this.log(this.t("adapter.logApprovalRequest", { tool, id }));
|
|
2843
3982
|
const payload = { id, sessionID, tool, args, prompt: reason, createdAt: Date.now() };
|
|
2844
3983
|
return new Promise((resolve) => {
|
|
2845
3984
|
const timer = setTimeout(() => {
|
|
@@ -2892,7 +4031,7 @@ ${err.stack ?? ""}`);
|
|
|
2892
4031
|
}
|
|
2893
4032
|
async ensureAgentNow(sessionID) {
|
|
2894
4033
|
const agents = this.ctx.get("agents");
|
|
2895
|
-
if (!agents) throw new Error("
|
|
4034
|
+
if (!agents) throw new Error(this.t("adapter.errAgentsUnavailable"));
|
|
2896
4035
|
const dm = this.ctx.get("agentDefaultModel");
|
|
2897
4036
|
const selection = dm?.currentSelection();
|
|
2898
4037
|
const provider = this.cfg.provider || selection?.provider || "deepseek-official";
|
|
@@ -2905,7 +4044,7 @@ ${err.stack ?? ""}`);
|
|
|
2905
4044
|
try {
|
|
2906
4045
|
resolvedId = (await presets.resolve(presetId)).id;
|
|
2907
4046
|
} catch (e) {
|
|
2908
|
-
this.log(
|
|
4047
|
+
this.log(this.t("adapter.logAgentPresetFailed", { preset: presetId, message: e.message }));
|
|
2909
4048
|
}
|
|
2910
4049
|
}
|
|
2911
4050
|
const setup = async (agentCtx) => {
|
|
@@ -2934,21 +4073,21 @@ ${err.stack ?? ""}`);
|
|
|
2934
4073
|
const err = e;
|
|
2935
4074
|
const live = agents.get(sessionID);
|
|
2936
4075
|
if (live && typeof live === "object") {
|
|
2937
|
-
this.log(
|
|
2938
|
-
const adopted = { agent: live, dispose: async () => this.log(
|
|
4076
|
+
this.log(this.t("adapter.logSessionLiveAdopted", { session: sessionID, message: err.message }));
|
|
4077
|
+
const adopted = { agent: live, dispose: async () => this.log(this.t("adapter.logDisposeSkipped", { session: sessionID })) };
|
|
2939
4078
|
this.pendingWorkspaces.delete(sessionID);
|
|
2940
4079
|
this.handles.set(sessionID, adopted);
|
|
2941
4080
|
return adopted;
|
|
2942
4081
|
}
|
|
2943
|
-
this.log(
|
|
2944
|
-
throw new Error(
|
|
4082
|
+
this.log(this.t("adapter.logAgentCreateFailed", { session: sessionID, message: err.message }));
|
|
4083
|
+
throw new Error(this.t("adapter.errSessionBusyLive", { session: sessionID }));
|
|
2945
4084
|
}
|
|
2946
4085
|
this.pendingWorkspaces.delete(sessionID);
|
|
2947
4086
|
this.handles.set(sessionID, handle);
|
|
2948
4087
|
return handle;
|
|
2949
4088
|
}
|
|
2950
4089
|
resetIdentity() {
|
|
2951
|
-
this.log("
|
|
4090
|
+
this.log(this.t("adapter.logResetIdentity"));
|
|
2952
4091
|
this.claimed = false;
|
|
2953
4092
|
this.state.agentId = randomBytes2(16).toString("hex");
|
|
2954
4093
|
this.state.claimed = false;
|
|
@@ -2997,12 +4136,14 @@ var Config = Schema.object({
|
|
|
2997
4136
|
provider: Schema.string().default("deepseek-official"),
|
|
2998
4137
|
model: Schema.string().default("deepseek-v4-flash"),
|
|
2999
4138
|
cwd: Schema.string().default(process.cwd()),
|
|
3000
|
-
agentPreset: Schema.string().default("")
|
|
4139
|
+
agentPreset: Schema.string().default(""),
|
|
4140
|
+
lang: Schema.string().default("")
|
|
3001
4141
|
});
|
|
3002
4142
|
function apply(ctx, config) {
|
|
3003
4143
|
const bridge = new TunnelboxBridge(ctx, config);
|
|
3004
4144
|
void bridge.start().catch((e) => {
|
|
3005
|
-
|
|
4145
|
+
const lang = resolveLang({ config: config.lang, saved: loadState("dsh").lang });
|
|
4146
|
+
console.error(`[tunnelbox:dsh] ${t(lang, "adapter.errStartFailed")}`, e);
|
|
3006
4147
|
});
|
|
3007
4148
|
ctx.effect(() => {
|
|
3008
4149
|
return () => bridge.dispose();
|