@tunnelbox/core 0.1.27 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +733 -8
- package/locales/de-DE.json +34 -1
- package/locales/en-US.json +34 -1
- package/locales/es-ES.json +34 -1
- package/locales/fr-FR.json +34 -1
- package/locales/ja-JP.json +34 -1
- package/locales/ko-KR.json +34 -1
- package/locales/zh-CN.json +34 -1
- package/locales/zh-TW.json +34 -1
- package/package.json +1 -1
- package/src/acp/client.ts +187 -0
- package/src/acp/index.ts +11 -0
- package/src/acp/map.ts +45 -0
- package/src/acp/mirror.ts +210 -0
- package/src/acp/permissions.ts +47 -0
- package/src/acp/protocol.ts +282 -0
- package/src/acp/supervisor.ts +158 -0
- package/src/index.ts +2 -1
- package/src/types.ts +1 -1
package/dist/index.js
CHANGED
|
@@ -524,7 +524,40 @@ var zh_CN_default = {
|
|
|
524
524
|
"hermes.logRegisterAskFailed": "tunnelbox: \u6CE8\u518C tunnelbox_ask \u5931\u8D25: {err}",
|
|
525
525
|
"hermes.logRegisterSystemPromptFailed": "tunnelbox: \u6CE8\u518C system prompt \u6BB5\u5931\u8D25: {err}",
|
|
526
526
|
"hermes.logBackgroundBridgeFailed": "tunnelbox: \u540E\u53F0\u6865\u542F\u52A8\u5931\u8D25: {err}",
|
|
527
|
-
"hermes.systemPromptAsk": "\u5F53\u4F60\u9700\u8981\u7528\u6237\u505A\u51B3\u5B9A/\u6F84\u6E05/\u9009\u62E9\uFF0C\u4E14\u5DF2\u8FDE\u63A5 tunnelbox \u624B\u673A\u65F6\uFF0C\u8BF7\u7528 `tunnelbox_ask` \u5DE5\u5177\u5728\u624B\u673A\u4E0A\u63D0\u95EE\uFF0C\u800C\u4E0D\u662F\u81EA\u884C\u731C\u6D4B\uFF1B\u7B49\u5230\u7528\u6237\u4F5C\u7B54\u540E\u518D\u7EE7\u7EED\u3002"
|
|
527
|
+
"hermes.systemPromptAsk": "\u5F53\u4F60\u9700\u8981\u7528\u6237\u505A\u51B3\u5B9A/\u6F84\u6E05/\u9009\u62E9\uFF0C\u4E14\u5DF2\u8FDE\u63A5 tunnelbox \u624B\u673A\u65F6\uFF0C\u8BF7\u7528 `tunnelbox_ask` \u5DE5\u5177\u5728\u624B\u673A\u4E0A\u63D0\u95EE\uFF0C\u800C\u4E0D\u662F\u81EA\u884C\u731C\u6D4B\uFF1B\u7B49\u5230\u7528\u6237\u4F5C\u7B54\u540E\u518D\u7EE7\u7EED\u3002",
|
|
528
|
+
"adapter.warnCodebuddyCliMissing": '\u627E\u4E0D\u5230 CodeBuddy CLI \u53EF\u6267\u884C\u6587\u4EF6 "{bin}"\uFF1B\u8BF7\u5B89\u88C5\uFF08npm i -g @tencent-ai/codebuddy-code\uFF09\uFF0C\u6216\u5C06 TUNNELBOX_CODEBUDDY_BIN \u8BBE\u4E3A\u5176\u8DEF\u5F84',
|
|
529
|
+
"adapter.checkCodebuddyHeader": "tunnelbox-codebuddy \u73AF\u5883\u81EA\u68C0",
|
|
530
|
+
"adapter.checkCodebuddyCliMissing": "\u627E\u4E0D\u5230 CodeBuddy CLI \u53EF\u6267\u884C\u6587\u4EF6\uFF08{bin}\uFF09\uFF1B\u8BF7\u5B89\u88C5\uFF1Anpm i -g @tencent-ai/codebuddy-code",
|
|
531
|
+
"adapter.checkCodebuddyAcpHint": "\u5DF2\u68C0\u6D4B\u5230 CodeBuddy CLI\uFF1BACP \u6A21\u5F0F\uFF08`codebuddy --acp`\uFF09\u5C06\u63D0\u4F9B\u6D41\u5F0F/\u5BA1\u6279/\u9009\u62E9",
|
|
532
|
+
"adapter.errCodebuddyAcpSpawn": "\u65E0\u6CD5\u542F\u52A8 CodeBuddy `--acp`\uFF1A{message}\uFF08\u8BF7\u786E\u8BA4 CodeBuddy CLI \u652F\u6301 `--acp`\uFF09",
|
|
533
|
+
"adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP \u672A\u8FD4\u56DE\u4F1A\u8BDD id",
|
|
534
|
+
"adapter.codebuddySessionTitle": "CodeBuddy \u4F1A\u8BDD",
|
|
535
|
+
"adapter.logElicitationNative": "\u9009\u62E9/\u786E\u8BA4\u8BF7\u6C42 -> \u624B\u673A\u5361\u7247 id={id}\uFF08\u4F1A\u8BDD={session}\uFF09",
|
|
536
|
+
"adapter.logCodebuddyAuthSkipped": "CodeBuddy \u5C1A\u672A\u901A\u8FC7 ACP \u8BA4\u8BC1\uFF1B\u8BF7\u5148\u8FD0\u884C\u4E00\u6B21 `codebuddy` \u767B\u5F55\uFF08\u6216\u8BBE\u7F6E CODEBUDDY_API_KEY\uFF09\uFF0C\u4E5F\u53EF\u8BBE\u7F6E TUNNELBOX_CODEBUDDY_AUTH=<methodId> \u8D70 ACP \u8BA4\u8BC1",
|
|
537
|
+
"adapter.warnKimiCliMissing": '\u627E\u4E0D\u5230 Kimi CLI \u53EF\u6267\u884C\u6587\u4EF6 "{bin}"\uFF1B\u8BF7\u5B89\u88C5\uFF08https://moonshotai.github.io/kimi-code/\uFF09\uFF0C\u6216\u5C06 TUNNELBOX_KIMI_BIN \u8BBE\u4E3A\u5176\u8DEF\u5F84',
|
|
538
|
+
"adapter.checkKimiHeader": "tunnelbox-kimi \u73AF\u5883\u81EA\u68C0",
|
|
539
|
+
"adapter.checkKimiCliMissing": "\u627E\u4E0D\u5230 Kimi CLI \u53EF\u6267\u884C\u6587\u4EF6\uFF08{bin}\uFF09\uFF1B\u8BF7\u4ECE https://moonshotai.github.io/kimi-code/ \u5B89\u88C5",
|
|
540
|
+
"adapter.checkKimiAcpHint": "\u5DF2\u68C0\u6D4B\u5230 Kimi CLI\uFF1BACP \u6A21\u5F0F\uFF08`kimi acp`\uFF09\u5C06\u63D0\u4F9B\u6D41\u5F0F/\u5BA1\u6279/\u9009\u62E9",
|
|
541
|
+
"adapter.errKimiAcpSpawn": "\u65E0\u6CD5\u542F\u52A8 Kimi `acp`\uFF1A{message}\uFF08\u8BF7\u786E\u8BA4 Kimi CLI \u652F\u6301 `kimi acp`\uFF09",
|
|
542
|
+
"adapter.errKimiAcpNoSession": "Kimi ACP \u672A\u8FD4\u56DE\u4F1A\u8BDD id",
|
|
543
|
+
"adapter.kimiSessionTitle": "Kimi \u4F1A\u8BDD",
|
|
544
|
+
"adapter.logKimiAuthRequired": "Kimi \u672A\u767B\u5F55\uFF1A\u8BF7\u5148\u8FD0\u884C\u4E00\u6B21 `kimi` \u5E76\u53D1\u9001 /login\uFF08\u6216\u914D\u7F6E API Key\uFF09\u2014\u2014 {message}",
|
|
545
|
+
"adapter.warnTraeCliMissing": '\u627E\u4E0D\u5230 TraeCode CLI \u53EF\u6267\u884C\u6587\u4EF6 "{bin}"\uFF1B\u8BF7\u5B89\u88C5\uFF08https://docs.trae.cn/cli_what-is-trae-cli\uFF09\uFF0C\u6216\u5C06 TUNNELBOX_TRAE_BIN \u8BBE\u4E3A\u5176\u8DEF\u5F84',
|
|
546
|
+
"adapter.checkTraeHeader": "tunnelbox-trae \u73AF\u5883\u81EA\u68C0",
|
|
547
|
+
"adapter.checkTraeCliMissing": "\u627E\u4E0D\u5230 TraeCode CLI \u53EF\u6267\u884C\u6587\u4EF6\uFF08{bin}\uFF09\uFF1B\u8BF7\u4ECE https://docs.trae.cn/cli_what-is-trae-cli \u5B89\u88C5",
|
|
548
|
+
"adapter.checkTraeAcpHint": "\u5DF2\u68C0\u6D4B\u5230 TraeCode CLI\uFF1BACP \u6A21\u5F0F\uFF08`traecli acp serve`\uFF09\u5C06\u63D0\u4F9B\u6D41\u5F0F/\u5BA1\u6279/\u9009\u62E9",
|
|
549
|
+
"adapter.errTraeAcpSpawn": "\u65E0\u6CD5\u542F\u52A8 TraeCode `acp serve`\uFF1A{message}\uFF08\u8BF7\u786E\u8BA4 TraeCode CLI \u652F\u6301 ACP\uFF09",
|
|
550
|
+
"adapter.errTraeAcpNoSession": "TraeCode ACP \u672A\u8FD4\u56DE\u4F1A\u8BDD id",
|
|
551
|
+
"adapter.traeSessionTitle": "Trae \u4F1A\u8BDD",
|
|
552
|
+
"adapter.logTraeAuthSkipped": "\u5DF2\u8DF3\u8FC7 TraeCode ACP \u8BA4\u8BC1\uFF1B\u8BF7\u7528 `traecli login` \u767B\u5F55\uFF08TraeCode CLI \u4EC5 TRAE \u4F01\u4E1A\u7248\u65D7\u8230\u7248\u53EF\u7528\uFF09",
|
|
553
|
+
"adapter.warnQoderCliMissing": '\u627E\u4E0D\u5230 Qoder CLI \u53EF\u6267\u884C\u6587\u4EF6 "{bin}"\uFF1B\u8BF7\u5B89\u88C5\uFF08npm i -g @qoder-ai/qodercli\uFF09\uFF0C\u6216\u5C06 TUNNELBOX_QODER_BIN \u8BBE\u4E3A\u5176\u8DEF\u5F84',
|
|
554
|
+
"adapter.checkQoderHeader": "tunnelbox-qoder \u73AF\u5883\u81EA\u68C0",
|
|
555
|
+
"adapter.checkQoderCliMissing": "\u627E\u4E0D\u5230 Qoder CLI \u53EF\u6267\u884C\u6587\u4EF6\uFF08{bin}\uFF09\uFF1B\u8BF7\u5B89\u88C5\uFF1Anpm i -g @qoder-ai/qodercli",
|
|
556
|
+
"adapter.checkQoderAcpHint": "\u5DF2\u68C0\u6D4B\u5230 Qoder CLI\uFF1BACP \u6A21\u5F0F\uFF08`qoder --acp`\uFF09\u5C06\u63D0\u4F9B\u6D41\u5F0F/\u5BA1\u6279/\u9009\u62E9",
|
|
557
|
+
"adapter.errQoderAcpSpawn": "\u65E0\u6CD5\u542F\u52A8 Qoder `--acp`\uFF1A{message}\uFF08\u8BF7\u786E\u8BA4 Qoder CLI \u652F\u6301 `--acp`\uFF09",
|
|
558
|
+
"adapter.errQoderAcpNoSession": "Qoder ACP \u672A\u8FD4\u56DE\u4F1A\u8BDD id",
|
|
559
|
+
"adapter.qoderSessionTitle": "Qoder \u4F1A\u8BDD",
|
|
560
|
+
"adapter.logQoderAuthSkipped": "\u5DF2\u8DF3\u8FC7 Qoder ACP \u8BA4\u8BC1\uFF1B\u8BF7\u7528 `qoder login` \u767B\u5F55\uFF0C\u6216\u8BBE\u7F6E QODER_PERSONAL_ACCESS_TOKEN"
|
|
528
561
|
};
|
|
529
562
|
|
|
530
563
|
// locales/zh-TW.json
|
|
@@ -899,7 +932,40 @@ var zh_TW_default = {
|
|
|
899
932
|
"hermes.logRegisterAskFailed": "tunnelbox: \u8A3B\u518A tunnelbox_ask \u5931\u6557: {err}",
|
|
900
933
|
"hermes.logRegisterSystemPromptFailed": "tunnelbox: \u8A3B\u518A system prompt \u6BB5\u5931\u6557: {err}",
|
|
901
934
|
"hermes.logBackgroundBridgeFailed": "tunnelbox: \u80CC\u666F\u6A4B\u555F\u52D5\u5931\u6557: {err}",
|
|
902
|
-
"hermes.systemPromptAsk": "\u7576\u4F60\u9700\u8981\u4F7F\u7528\u8005\u505A\u6C7A\u5B9A/\u6F84\u6E05/\u9078\u64C7\uFF0C\u4E14\u5DF2\u9023\u63A5 tunnelbox \u624B\u6A5F\u6642\uFF0C\u8ACB\u7528 `tunnelbox_ask` \u5DE5\u5177\u5728\u624B\u6A5F\u4E0A\u63D0\u554F\uFF0C\u800C\u4E0D\u662F\u81EA\u884C\u731C\u6E2C\uFF1B\u7B49\u5230\u4F7F\u7528\u8005\u4F5C\u7B54\u5F8C\u518D\u7E7C\u7E8C\u3002"
|
|
935
|
+
"hermes.systemPromptAsk": "\u7576\u4F60\u9700\u8981\u4F7F\u7528\u8005\u505A\u6C7A\u5B9A/\u6F84\u6E05/\u9078\u64C7\uFF0C\u4E14\u5DF2\u9023\u63A5 tunnelbox \u624B\u6A5F\u6642\uFF0C\u8ACB\u7528 `tunnelbox_ask` \u5DE5\u5177\u5728\u624B\u6A5F\u4E0A\u63D0\u554F\uFF0C\u800C\u4E0D\u662F\u81EA\u884C\u731C\u6E2C\uFF1B\u7B49\u5230\u4F7F\u7528\u8005\u4F5C\u7B54\u5F8C\u518D\u7E7C\u7E8C\u3002",
|
|
936
|
+
"adapter.warnCodebuddyCliMissing": '\u627E\u4E0D\u5230 CodeBuddy CLI \u53EF\u57F7\u884C\u6A94 "{bin}"\uFF1B\u8ACB\u5B89\u88DD\uFF08npm i -g @tencent-ai/codebuddy-code\uFF09\uFF0C\u6216\u5C07 TUNNELBOX_CODEBUDDY_BIN \u8A2D\u70BA\u5176\u8DEF\u5F91',
|
|
937
|
+
"adapter.checkCodebuddyHeader": "tunnelbox-codebuddy \u74B0\u5883\u81EA\u6AA2",
|
|
938
|
+
"adapter.checkCodebuddyCliMissing": "\u627E\u4E0D\u5230 CodeBuddy CLI \u53EF\u57F7\u884C\u6A94\uFF08{bin}\uFF09\uFF1B\u8ACB\u5B89\u88DD\uFF1Anpm i -g @tencent-ai/codebuddy-code",
|
|
939
|
+
"adapter.checkCodebuddyAcpHint": "\u5DF2\u5075\u6E2C\u5230 CodeBuddy CLI\uFF1BACP \u6A21\u5F0F\uFF08`codebuddy --acp`\uFF09\u5C07\u63D0\u4F9B\u4E32\u6D41/\u5BE9\u6279/\u9078\u64C7",
|
|
940
|
+
"adapter.errCodebuddyAcpSpawn": "\u7121\u6CD5\u555F\u52D5 CodeBuddy `--acp`\uFF1A{message}\uFF08\u8ACB\u78BA\u8A8D CodeBuddy CLI \u652F\u63F4 `--acp`\uFF09",
|
|
941
|
+
"adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP \u672A\u56DE\u50B3\u5DE5\u4F5C\u968E\u6BB5 id",
|
|
942
|
+
"adapter.codebuddySessionTitle": "CodeBuddy \u5DE5\u4F5C\u968E\u6BB5",
|
|
943
|
+
"adapter.logElicitationNative": "\u9078\u64C7/\u78BA\u8A8D\u8ACB\u6C42 -> \u624B\u6A5F\u5361\u7247 id={id}\uFF08\u5DE5\u4F5C\u968E\u6BB5={session}\uFF09",
|
|
944
|
+
"adapter.logCodebuddyAuthSkipped": "CodeBuddy \u5C1A\u672A\u900F\u904E ACP \u8A8D\u8B49\uFF1B\u8ACB\u5148\u57F7\u884C\u4E00\u6B21 `codebuddy` \u767B\u5165\uFF08\u6216\u8A2D\u5B9A CODEBUDDY_API_KEY\uFF09\uFF0C\u4E5F\u53EF\u8A2D\u5B9A TUNNELBOX_CODEBUDDY_AUTH=<methodId> \u8D70 ACP \u8A8D\u8B49",
|
|
945
|
+
"adapter.warnKimiCliMissing": '\u627E\u4E0D\u5230 Kimi CLI \u53EF\u57F7\u884C\u6A94 "{bin}"\uFF1B\u8ACB\u5B89\u88DD\uFF08https://moonshotai.github.io/kimi-code/\uFF09\uFF0C\u6216\u5C07 TUNNELBOX_KIMI_BIN \u8A2D\u70BA\u5176\u8DEF\u5F91',
|
|
946
|
+
"adapter.checkKimiHeader": "tunnelbox-kimi \u74B0\u5883\u81EA\u6AA2",
|
|
947
|
+
"adapter.checkKimiCliMissing": "\u627E\u4E0D\u5230 Kimi CLI \u53EF\u57F7\u884C\u6A94\uFF08{bin}\uFF09\uFF1B\u8ACB\u5F9E https://moonshotai.github.io/kimi-code/ \u5B89\u88DD",
|
|
948
|
+
"adapter.checkKimiAcpHint": "\u5DF2\u5075\u6E2C\u5230 Kimi CLI\uFF1BACP \u6A21\u5F0F\uFF08`kimi acp`\uFF09\u5C07\u63D0\u4F9B\u4E32\u6D41/\u5BE9\u6279/\u9078\u64C7",
|
|
949
|
+
"adapter.errKimiAcpSpawn": "\u7121\u6CD5\u555F\u52D5 Kimi `acp`\uFF1A{message}\uFF08\u8ACB\u78BA\u8A8D Kimi CLI \u652F\u63F4 `kimi acp`\uFF09",
|
|
950
|
+
"adapter.errKimiAcpNoSession": "Kimi ACP \u672A\u56DE\u50B3\u5DE5\u4F5C\u968E\u6BB5 id",
|
|
951
|
+
"adapter.kimiSessionTitle": "Kimi \u5DE5\u4F5C\u968E\u6BB5",
|
|
952
|
+
"adapter.logKimiAuthRequired": "Kimi \u672A\u767B\u5165\uFF1A\u8ACB\u5148\u57F7\u884C\u4E00\u6B21 `kimi` \u4E26\u50B3\u9001 /login\uFF08\u6216\u8A2D\u5B9A API Key\uFF09\u2014\u2014 {message}",
|
|
953
|
+
"adapter.warnTraeCliMissing": '\u627E\u4E0D\u5230 TraeCode CLI \u53EF\u57F7\u884C\u6A94 "{bin}"\uFF1B\u8ACB\u5B89\u88DD\uFF08https://docs.trae.cn/cli_what-is-trae-cli\uFF09\uFF0C\u6216\u5C07 TUNNELBOX_TRAE_BIN \u8A2D\u70BA\u5176\u8DEF\u5F91',
|
|
954
|
+
"adapter.checkTraeHeader": "tunnelbox-trae \u74B0\u5883\u81EA\u6AA2",
|
|
955
|
+
"adapter.checkTraeCliMissing": "\u627E\u4E0D\u5230 TraeCode CLI \u53EF\u57F7\u884C\u6A94\uFF08{bin}\uFF09\uFF1B\u8ACB\u5F9E https://docs.trae.cn/cli_what-is-trae-cli \u5B89\u88DD",
|
|
956
|
+
"adapter.checkTraeAcpHint": "\u5DF2\u5075\u6E2C\u5230 TraeCode CLI\uFF1BACP \u6A21\u5F0F\uFF08`traecli acp serve`\uFF09\u5C07\u63D0\u4F9B\u4E32\u6D41/\u5BE9\u6279/\u9078\u64C7",
|
|
957
|
+
"adapter.errTraeAcpSpawn": "\u7121\u6CD5\u555F\u52D5 TraeCode `acp serve`\uFF1A{message}\uFF08\u8ACB\u78BA\u8A8D TraeCode CLI \u652F\u63F4 ACP\uFF09",
|
|
958
|
+
"adapter.errTraeAcpNoSession": "TraeCode ACP \u672A\u56DE\u50B3\u5DE5\u4F5C\u968E\u6BB5 id",
|
|
959
|
+
"adapter.traeSessionTitle": "Trae \u5DE5\u4F5C\u968E\u6BB5",
|
|
960
|
+
"adapter.logTraeAuthSkipped": "\u5DF2\u7565\u904E TraeCode ACP \u8A8D\u8B49\uFF1B\u8ACB\u7528 `traecli login` \u767B\u5165\uFF08TraeCode CLI \u50C5 TRAE \u4F01\u696D\u7248\u65D7\u8266\u7248\u53EF\u7528\uFF09",
|
|
961
|
+
"adapter.warnQoderCliMissing": '\u627E\u4E0D\u5230 Qoder CLI \u53EF\u57F7\u884C\u6A94 "{bin}"\uFF1B\u8ACB\u5B89\u88DD\uFF08npm i -g @qoder-ai/qodercli\uFF09\uFF0C\u6216\u5C07 TUNNELBOX_QODER_BIN \u8A2D\u70BA\u5176\u8DEF\u5F91',
|
|
962
|
+
"adapter.checkQoderHeader": "tunnelbox-qoder \u74B0\u5883\u81EA\u6AA2",
|
|
963
|
+
"adapter.checkQoderCliMissing": "\u627E\u4E0D\u5230 Qoder CLI \u53EF\u57F7\u884C\u6A94\uFF08{bin}\uFF09\uFF1B\u8ACB\u5B89\u88DD\uFF1Anpm i -g @qoder-ai/qodercli",
|
|
964
|
+
"adapter.checkQoderAcpHint": "\u5DF2\u5075\u6E2C\u5230 Qoder CLI\uFF1BACP \u6A21\u5F0F\uFF08`qoder --acp`\uFF09\u5C07\u63D0\u4F9B\u4E32\u6D41/\u5BE9\u6279/\u9078\u64C7",
|
|
965
|
+
"adapter.errQoderAcpSpawn": "\u7121\u6CD5\u555F\u52D5 Qoder `--acp`\uFF1A{message}\uFF08\u8ACB\u78BA\u8A8D Qoder CLI \u652F\u63F4 `--acp`\uFF09",
|
|
966
|
+
"adapter.errQoderAcpNoSession": "Qoder ACP \u672A\u56DE\u50B3\u5DE5\u4F5C\u968E\u6BB5 id",
|
|
967
|
+
"adapter.qoderSessionTitle": "Qoder \u5DE5\u4F5C\u968E\u6BB5",
|
|
968
|
+
"adapter.logQoderAuthSkipped": "\u5DF2\u7565\u904E Qoder ACP \u8A8D\u8B49\uFF1B\u8ACB\u7528 `qoder login` \u767B\u5165\uFF0C\u6216\u8A2D\u5B9A QODER_PERSONAL_ACCESS_TOKEN"
|
|
903
969
|
};
|
|
904
970
|
|
|
905
971
|
// locales/en-US.json
|
|
@@ -1274,7 +1340,40 @@ var en_US_default = {
|
|
|
1274
1340
|
"hermes.logRegisterAskFailed": "tunnelbox: failed to register tunnelbox_ask: {err}",
|
|
1275
1341
|
"hermes.logRegisterSystemPromptFailed": "tunnelbox: failed to register system prompt section: {err}",
|
|
1276
1342
|
"hermes.logBackgroundBridgeFailed": "tunnelbox: background bridge failed to start: {err}",
|
|
1277
|
-
"hermes.systemPromptAsk": "When you need a decision, clarification, or choice from the user and a tunnelbox phone is attached, use the `tunnelbox_ask` tool to ask on their phone instead of guessing. Wait for their answer before proceeding."
|
|
1343
|
+
"hermes.systemPromptAsk": "When you need a decision, clarification, or choice from the user and a tunnelbox phone is attached, use the `tunnelbox_ask` tool to ask on their phone instead of guessing. Wait for their answer before proceeding.",
|
|
1344
|
+
"adapter.warnCodebuddyCliMissing": 'CodeBuddy CLI executable "{bin}" not found; install it (npm i -g @tencent-ai/codebuddy-code) or set TUNNELBOX_CODEBUDDY_BIN to its path',
|
|
1345
|
+
"adapter.checkCodebuddyHeader": "tunnelbox-codebuddy environment check",
|
|
1346
|
+
"adapter.checkCodebuddyCliMissing": "CodeBuddy CLI executable not found ({bin}); install it with: npm i -g @tencent-ai/codebuddy-code",
|
|
1347
|
+
"adapter.checkCodebuddyAcpHint": "CodeBuddy CLI detected; ACP mode (`codebuddy --acp`) will provide streaming/approval/selection",
|
|
1348
|
+
"adapter.errCodebuddyAcpSpawn": "Failed to start CodeBuddy `--acp`: {message} (make sure CodeBuddy CLI supports `--acp`)",
|
|
1349
|
+
"adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP did not return a session id",
|
|
1350
|
+
"adapter.codebuddySessionTitle": "CodeBuddy session",
|
|
1351
|
+
"adapter.logElicitationNative": "elicitation request -> phone card id={id} (session={session})",
|
|
1352
|
+
"adapter.logCodebuddyAuthSkipped": "CodeBuddy ACP is not authenticated; log in once with `codebuddy` (or set CODEBUDDY_API_KEY), or set TUNNELBOX_CODEBUDDY_AUTH=<methodId> to authenticate over ACP",
|
|
1353
|
+
"adapter.warnKimiCliMissing": 'Kimi CLI executable "{bin}" not found; install it (https://moonshotai.github.io/kimi-code/) or set TUNNELBOX_KIMI_BIN to its path',
|
|
1354
|
+
"adapter.checkKimiHeader": "tunnelbox-kimi environment check",
|
|
1355
|
+
"adapter.checkKimiCliMissing": "Kimi CLI executable not found ({bin}); install it from https://moonshotai.github.io/kimi-code/",
|
|
1356
|
+
"adapter.checkKimiAcpHint": "Kimi CLI detected; ACP mode (`kimi acp`) will provide streaming/approval/selection",
|
|
1357
|
+
"adapter.errKimiAcpSpawn": "Failed to start Kimi `acp`: {message} (make sure the Kimi CLI supports `kimi acp`)",
|
|
1358
|
+
"adapter.errKimiAcpNoSession": "Kimi ACP did not return a session id",
|
|
1359
|
+
"adapter.kimiSessionTitle": "Kimi session",
|
|
1360
|
+
"adapter.logKimiAuthRequired": "Kimi is not logged in: run `kimi` once and send /login (or configure an API key) \u2014 {message}",
|
|
1361
|
+
"adapter.warnTraeCliMissing": 'TraeCode CLI executable "{bin}" not found; install it (https://docs.trae.cn/cli_what-is-trae-cli) or set TUNNELBOX_TRAE_BIN to its path',
|
|
1362
|
+
"adapter.checkTraeHeader": "tunnelbox-trae environment check",
|
|
1363
|
+
"adapter.checkTraeCliMissing": "TraeCode CLI executable not found ({bin}); install it from https://docs.trae.cn/cli_what-is-trae-cli",
|
|
1364
|
+
"adapter.checkTraeAcpHint": "TraeCode CLI detected; ACP mode (`traecli acp serve`) will provide streaming/approval/selection",
|
|
1365
|
+
"adapter.errTraeAcpSpawn": "Failed to start TraeCode `acp serve`: {message} (make sure the TraeCode CLI supports ACP)",
|
|
1366
|
+
"adapter.errTraeAcpNoSession": "TraeCode ACP did not return a session id",
|
|
1367
|
+
"adapter.traeSessionTitle": "Trae session",
|
|
1368
|
+
"adapter.logTraeAuthSkipped": "TraeCode ACP authenticate skipped; log in with `traecli login` (TraeCode CLI requires a TRAE Enterprise Flagship plan)",
|
|
1369
|
+
"adapter.warnQoderCliMissing": 'Qoder CLI executable "{bin}" not found; install it (npm i -g @qoder-ai/qodercli) or set TUNNELBOX_QODER_BIN to its path',
|
|
1370
|
+
"adapter.checkQoderHeader": "tunnelbox-qoder environment check",
|
|
1371
|
+
"adapter.checkQoderCliMissing": "Qoder CLI executable not found ({bin}); install it with: npm i -g @qoder-ai/qodercli",
|
|
1372
|
+
"adapter.checkQoderAcpHint": "Qoder CLI detected; ACP mode (`qoder --acp`) will provide streaming/approval/selection",
|
|
1373
|
+
"adapter.errQoderAcpSpawn": "Failed to start Qoder `--acp`: {message} (make sure the Qoder CLI supports `--acp`)",
|
|
1374
|
+
"adapter.errQoderAcpNoSession": "Qoder ACP did not return a session id",
|
|
1375
|
+
"adapter.qoderSessionTitle": "Qoder session",
|
|
1376
|
+
"adapter.logQoderAuthSkipped": "Qoder ACP authenticate skipped; log in with `qoder login` or set QODER_PERSONAL_ACCESS_TOKEN"
|
|
1278
1377
|
};
|
|
1279
1378
|
|
|
1280
1379
|
// locales/ja-JP.json
|
|
@@ -1649,7 +1748,40 @@ var ja_JP_default = {
|
|
|
1649
1748
|
"hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask \u306E\u767B\u9332\u306B\u5931\u6557: {err}",
|
|
1650
1749
|
"hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt \u30BB\u30AF\u30B7\u30E7\u30F3\u306E\u767B\u9332\u306B\u5931\u6557: {err}",
|
|
1651
1750
|
"hermes.logBackgroundBridgeFailed": "tunnelbox: \u30D0\u30C3\u30AF\u30B0\u30E9\u30A6\u30F3\u30C9\u30D6\u30EA\u30C3\u30B8\u306E\u8D77\u52D5\u306B\u5931\u6557: {err}",
|
|
1652
|
-
"hermes.systemPromptAsk": "\u30E6\u30FC\u30B6\u30FC\u306B\u6C7A\u5B9A/\u78BA\u8A8D/\u9078\u629E\u3092\u6C42\u3081\u308B\u5FC5\u8981\u304C\u3042\u308A\u3001tunnelbox \u30B9\u30DE\u30DB\u304C\u63A5\u7D9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u3001\u63A8\u6E2C\u305B\u305A `tunnelbox_ask` \u30C4\u30FC\u30EB\u3067\u30B9\u30DE\u30DB\u306B\u8CEA\u554F\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u56DE\u7B54\u304C\u3042\u308B\u307E\u3067\u5F85\u3063\u3066\u304B\u3089\u7D9A\u884C\u3057\u307E\u3059\u3002"
|
|
1751
|
+
"hermes.systemPromptAsk": "\u30E6\u30FC\u30B6\u30FC\u306B\u6C7A\u5B9A/\u78BA\u8A8D/\u9078\u629E\u3092\u6C42\u3081\u308B\u5FC5\u8981\u304C\u3042\u308A\u3001tunnelbox \u30B9\u30DE\u30DB\u304C\u63A5\u7D9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u306F\u3001\u63A8\u6E2C\u305B\u305A `tunnelbox_ask` \u30C4\u30FC\u30EB\u3067\u30B9\u30DE\u30DB\u306B\u8CEA\u554F\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u56DE\u7B54\u304C\u3042\u308B\u307E\u3067\u5F85\u3063\u3066\u304B\u3089\u7D9A\u884C\u3057\u307E\u3059\u3002",
|
|
1752
|
+
"adapter.warnCodebuddyCliMissing": 'CodeBuddy CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB "{bin}" \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\uFF08npm i -g @tencent-ai/codebuddy-code\uFF09\u304B\u3001TUNNELBOX_CODEBUDDY_BIN \u306B\u30D1\u30B9\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044',
|
|
1753
|
+
"adapter.checkCodebuddyHeader": "tunnelbox-codebuddy \u74B0\u5883\u30C1\u30A7\u30C3\u30AF",
|
|
1754
|
+
"adapter.checkCodebuddyCliMissing": "CodeBuddy CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08{bin}\uFF09\u3002\u6B21\u3067\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u304F\u3060\u3055\u3044: npm i -g @tencent-ai/codebuddy-code",
|
|
1755
|
+
"adapter.checkCodebuddyAcpHint": "CodeBuddy CLI \u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002ACP \u30E2\u30FC\u30C9\uFF08`codebuddy --acp`\uFF09\u3067\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0/\u627F\u8A8D/\u9078\u629E\u304C\u5229\u7528\u3067\u304D\u307E\u3059",
|
|
1756
|
+
"adapter.errCodebuddyAcpSpawn": "CodeBuddy `--acp` \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}\uFF08CodeBuddy CLI \u304C `--acp` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
1757
|
+
"adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP \u304C\u30BB\u30C3\u30B7\u30E7\u30F3 id \u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F",
|
|
1758
|
+
"adapter.codebuddySessionTitle": "CodeBuddy \u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
1759
|
+
"adapter.logElicitationNative": "\u9078\u629E/\u78BA\u8A8D\u30EA\u30AF\u30A8\u30B9\u30C8 -> \u30B9\u30DE\u30DB\u306E\u30AB\u30FC\u30C9 id={id}\uFF08\u30BB\u30C3\u30B7\u30E7\u30F3={session}\uFF09",
|
|
1760
|
+
"adapter.logCodebuddyAuthSkipped": "CodeBuddy \u306F ACP \u3067\u8A8D\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u4E00\u5EA6 `codebuddy` \u3067\u30ED\u30B0\u30A4\u30F3\u3059\u308B\uFF08\u307E\u305F\u306F CODEBUDDY_API_KEY \u3092\u8A2D\u5B9A\u3059\u308B\uFF09\u304B\u3001TUNNELBOX_CODEBUDDY_AUTH=<methodId> \u3067 ACP \u8A8D\u8A3C\u3092\u884C\u3063\u3066\u304F\u3060\u3055\u3044",
|
|
1761
|
+
"adapter.warnKimiCliMissing": 'Kimi CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB "{bin}" \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\uFF08https://moonshotai.github.io/kimi-code/\uFF09\u304B\u3001TUNNELBOX_KIMI_BIN \u306B\u30D1\u30B9\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044',
|
|
1762
|
+
"adapter.checkKimiHeader": "tunnelbox-kimi \u74B0\u5883\u30C1\u30A7\u30C3\u30AF",
|
|
1763
|
+
"adapter.checkKimiCliMissing": "Kimi CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08{bin}\uFF09\u3002https://moonshotai.github.io/kimi-code/ \u304B\u3089\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
1764
|
+
"adapter.checkKimiAcpHint": "Kimi CLI \u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002ACP \u30E2\u30FC\u30C9\uFF08`kimi acp`\uFF09\u3067\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0/\u627F\u8A8D/\u9078\u629E\u304C\u5229\u7528\u3067\u304D\u307E\u3059",
|
|
1765
|
+
"adapter.errKimiAcpSpawn": "Kimi `acp` \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}\uFF08Kimi CLI \u304C `kimi acp` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
1766
|
+
"adapter.errKimiAcpNoSession": "Kimi ACP \u304C\u30BB\u30C3\u30B7\u30E7\u30F3 id \u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F",
|
|
1767
|
+
"adapter.kimiSessionTitle": "Kimi \u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
1768
|
+
"adapter.logKimiAuthRequired": "Kimi \u304C\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u3044\u307E\u305B\u3093\u3002\u4E00\u5EA6 `kimi` \u3092\u5B9F\u884C\u3057\u3066 /login \u3092\u9001\u4FE1\u3059\u308B\uFF08\u307E\u305F\u306F API \u30AD\u30FC\u3092\u8A2D\u5B9A\u3059\u308B\uFF09\u3057\u3066\u304F\u3060\u3055\u3044 \u2014 {message}",
|
|
1769
|
+
"adapter.warnTraeCliMissing": 'TraeCode CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB "{bin}" \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\uFF08https://docs.trae.cn/cli_what-is-trae-cli\uFF09\u304B\u3001TUNNELBOX_TRAE_BIN \u306B\u30D1\u30B9\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044',
|
|
1770
|
+
"adapter.checkTraeHeader": "tunnelbox-trae \u74B0\u5883\u30C1\u30A7\u30C3\u30AF",
|
|
1771
|
+
"adapter.checkTraeCliMissing": "TraeCode CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08{bin}\uFF09\u3002https://docs.trae.cn/cli_what-is-trae-cli \u304B\u3089\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u304F\u3060\u3055\u3044",
|
|
1772
|
+
"adapter.checkTraeAcpHint": "TraeCode CLI \u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002ACP \u30E2\u30FC\u30C9\uFF08`traecli acp serve`\uFF09\u3067\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0/\u627F\u8A8D/\u9078\u629E\u304C\u5229\u7528\u3067\u304D\u307E\u3059",
|
|
1773
|
+
"adapter.errTraeAcpSpawn": "TraeCode `acp serve` \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}\uFF08TraeCode CLI \u304C ACP \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
1774
|
+
"adapter.errTraeAcpNoSession": "TraeCode ACP \u304C\u30BB\u30C3\u30B7\u30E7\u30F3 id \u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F",
|
|
1775
|
+
"adapter.traeSessionTitle": "Trae \u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
1776
|
+
"adapter.logTraeAuthSkipped": "TraeCode ACP \u8A8D\u8A3C\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002`traecli login` \u3067\u30ED\u30B0\u30A4\u30F3\u3057\u3066\u304F\u3060\u3055\u3044\uFF08TraeCode CLI \u306F TRAE \u30A8\u30F3\u30BF\u30FC\u30D7\u30E9\u30A4\u30BA\u6700\u4E0A\u4F4D\u30D7\u30E9\u30F3\u9650\u5B9A\uFF09",
|
|
1777
|
+
"adapter.warnQoderCliMissing": 'Qoder CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB "{bin}" \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\uFF08npm i -g @qoder-ai/qodercli\uFF09\u304B\u3001TUNNELBOX_QODER_BIN \u306B\u30D1\u30B9\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044',
|
|
1778
|
+
"adapter.checkQoderHeader": "tunnelbox-qoder \u74B0\u5883\u30C1\u30A7\u30C3\u30AF",
|
|
1779
|
+
"adapter.checkQoderCliMissing": "Qoder CLI \u306E\u5B9F\u884C\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08{bin}\uFF09\u3002\u6B21\u3067\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u304F\u3060\u3055\u3044: npm i -g @qoder-ai/qodercli",
|
|
1780
|
+
"adapter.checkQoderAcpHint": "Qoder CLI \u3092\u691C\u51FA\u3057\u307E\u3057\u305F\u3002ACP \u30E2\u30FC\u30C9\uFF08`qoder --acp`\uFF09\u3067\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0/\u627F\u8A8D/\u9078\u629E\u304C\u5229\u7528\u3067\u304D\u307E\u3059",
|
|
1781
|
+
"adapter.errQoderAcpSpawn": "Qoder `--acp` \u306E\u8D77\u52D5\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {message}\uFF08Qoder CLI \u304C `--acp` \u306B\u5BFE\u5FDC\u3057\u3066\u3044\u308B\u304B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\uFF09",
|
|
1782
|
+
"adapter.errQoderAcpNoSession": "Qoder ACP \u304C\u30BB\u30C3\u30B7\u30E7\u30F3 id \u3092\u8FD4\u3057\u307E\u305B\u3093\u3067\u3057\u305F",
|
|
1783
|
+
"adapter.qoderSessionTitle": "Qoder \u30BB\u30C3\u30B7\u30E7\u30F3",
|
|
1784
|
+
"adapter.logQoderAuthSkipped": "Qoder ACP \u8A8D\u8A3C\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002`qoder login` \u3067\u30ED\u30B0\u30A4\u30F3\u3059\u308B\u304B\u3001QODER_PERSONAL_ACCESS_TOKEN \u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"
|
|
1653
1785
|
};
|
|
1654
1786
|
|
|
1655
1787
|
// locales/ko-KR.json
|
|
@@ -2024,7 +2156,40 @@ var ko_KR_default = {
|
|
|
2024
2156
|
"hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask \uB4F1\uB85D \uC2E4\uD328: {err}",
|
|
2025
2157
|
"hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt \uC139\uC158 \uB4F1\uB85D \uC2E4\uD328: {err}",
|
|
2026
2158
|
"hermes.logBackgroundBridgeFailed": "tunnelbox: \uBC31\uADF8\uB77C\uC6B4\uB4DC \uBE0C\uB9AC\uC9C0 \uC2DC\uC791 \uC2E4\uD328: {err}",
|
|
2027
|
-
"hermes.systemPromptAsk": "\uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACB0\uC815/\uD655\uC778/\uC120\uD0DD\uC774 \uD544\uC694\uD558\uACE0 tunnelbox \uD734\uB300\uD3F0\uC774 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC73C\uBA74 \uCD94\uCE21\uD558\uC9C0 \uB9D0\uACE0 `tunnelbox_ask` \uB3C4\uAD6C\uB85C \uD734\uB300\uD3F0\uC5D0\uC11C \uC9C8\uBB38\uD558\uC138\uC694. \uC0AC\uC6A9\uC790\uAC00 \uB2F5\uD560 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9B0 \uD6C4 \uC9C4\uD589\uD558\uC138\uC694."
|
|
2159
|
+
"hermes.systemPromptAsk": "\uC0AC\uC6A9\uC790\uC5D0\uAC8C \uACB0\uC815/\uD655\uC778/\uC120\uD0DD\uC774 \uD544\uC694\uD558\uACE0 tunnelbox \uD734\uB300\uD3F0\uC774 \uC5F0\uACB0\uB418\uC5B4 \uC788\uC73C\uBA74 \uCD94\uCE21\uD558\uC9C0 \uB9D0\uACE0 `tunnelbox_ask` \uB3C4\uAD6C\uB85C \uD734\uB300\uD3F0\uC5D0\uC11C \uC9C8\uBB38\uD558\uC138\uC694. \uC0AC\uC6A9\uC790\uAC00 \uB2F5\uD560 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB9B0 \uD6C4 \uC9C4\uD589\uD558\uC138\uC694.",
|
|
2160
|
+
"adapter.warnCodebuddyCliMissing": 'CodeBuddy CLI \uC2E4\uD589 \uD30C\uC77C "{bin}"\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uCE58\uD558\uAC70\uB098(npm i -g @tencent-ai/codebuddy-code) TUNNELBOX_CODEBUDDY_BIN\uC5D0 \uACBD\uB85C\uB97C \uC124\uC815\uD558\uC138\uC694',
|
|
2161
|
+
"adapter.checkCodebuddyHeader": "tunnelbox-codebuddy \uD658\uACBD \uC810\uAC80",
|
|
2162
|
+
"adapter.checkCodebuddyCliMissing": "CodeBuddy CLI \uC2E4\uD589 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4({bin}). \uB2E4\uC74C\uC73C\uB85C \uC124\uCE58\uD558\uC138\uC694: npm i -g @tencent-ai/codebuddy-code",
|
|
2163
|
+
"adapter.checkCodebuddyAcpHint": "CodeBuddy CLI\uB97C \uAC10\uC9C0\uD588\uC2B5\uB2C8\uB2E4. ACP \uBAA8\uB4DC(`codebuddy --acp`)\uC5D0\uC11C \uC2A4\uD2B8\uB9AC\uBC0D/\uC2B9\uC778/\uC120\uD0DD\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4",
|
|
2164
|
+
"adapter.errCodebuddyAcpSpawn": "CodeBuddy `--acp` \uC2DC\uC791 \uC2E4\uD328: {message} (CodeBuddy CLI\uAC00 `--acp`\uB97C \uC9C0\uC6D0\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694)",
|
|
2165
|
+
"adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP\uAC00 \uC138\uC158 id\uB97C \uBC18\uD658\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
|
|
2166
|
+
"adapter.codebuddySessionTitle": "CodeBuddy \uC138\uC158",
|
|
2167
|
+
"adapter.logElicitationNative": "\uC120\uD0DD/\uD655\uC778 \uC694\uCCAD -> \uD734\uB300\uD3F0 \uCE74\uB4DC id={id} (\uC138\uC158={session})",
|
|
2168
|
+
"adapter.logCodebuddyAuthSkipped": "CodeBuddy\uAC00 ACP\uB85C \uC778\uC99D\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. `codebuddy`\uB85C \uD55C \uBC88 \uB85C\uADF8\uC778\uD558\uAC70\uB098 CODEBUDDY_API_KEY\uB97C \uC124\uC815\uD558\uC138\uC694. \uB610\uB294 TUNNELBOX_CODEBUDDY_AUTH=<methodId>\uB85C ACP \uC778\uC99D\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4",
|
|
2169
|
+
"adapter.warnKimiCliMissing": 'Kimi CLI \uC2E4\uD589 \uD30C\uC77C "{bin}"\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uCE58\uD558\uAC70\uB098(https://moonshotai.github.io/kimi-code/) TUNNELBOX_KIMI_BIN\uC5D0 \uACBD\uB85C\uB97C \uC124\uC815\uD558\uC138\uC694',
|
|
2170
|
+
"adapter.checkKimiHeader": "tunnelbox-kimi \uD658\uACBD \uC810\uAC80",
|
|
2171
|
+
"adapter.checkKimiCliMissing": "Kimi CLI \uC2E4\uD589 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4({bin}). https://moonshotai.github.io/kimi-code/ \uC5D0\uC11C \uC124\uCE58\uD558\uC138\uC694",
|
|
2172
|
+
"adapter.checkKimiAcpHint": "Kimi CLI\uB97C \uAC10\uC9C0\uD588\uC2B5\uB2C8\uB2E4. ACP \uBAA8\uB4DC(`kimi acp`)\uC5D0\uC11C \uC2A4\uD2B8\uB9AC\uBC0D/\uC2B9\uC778/\uC120\uD0DD\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4",
|
|
2173
|
+
"adapter.errKimiAcpSpawn": "Kimi `acp` \uC2DC\uC791 \uC2E4\uD328: {message} (Kimi CLI\uAC00 `kimi acp`\uB97C \uC9C0\uC6D0\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694)",
|
|
2174
|
+
"adapter.errKimiAcpNoSession": "Kimi ACP\uAC00 \uC138\uC158 id\uB97C \uBC18\uD658\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
|
|
2175
|
+
"adapter.kimiSessionTitle": "Kimi \uC138\uC158",
|
|
2176
|
+
"adapter.logKimiAuthRequired": "Kimi\uC5D0 \uB85C\uADF8\uC778\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. `kimi`\uB97C \uD55C \uBC88 \uC2E4\uD589\uD574 /login\uC744 \uBCF4\uB0B4\uAC70\uB098 API \uD0A4\uB97C \uC124\uC815\uD558\uC138\uC694 \u2014 {message}",
|
|
2177
|
+
"adapter.warnTraeCliMissing": 'TraeCode CLI \uC2E4\uD589 \uD30C\uC77C "{bin}"\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uCE58\uD558\uAC70\uB098(https://docs.trae.cn/cli_what-is-trae-cli) TUNNELBOX_TRAE_BIN\uC5D0 \uACBD\uB85C\uB97C \uC124\uC815\uD558\uC138\uC694',
|
|
2178
|
+
"adapter.checkTraeHeader": "tunnelbox-trae \uD658\uACBD \uC810\uAC80",
|
|
2179
|
+
"adapter.checkTraeCliMissing": "TraeCode CLI \uC2E4\uD589 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4({bin}). https://docs.trae.cn/cli_what-is-trae-cli \uC5D0\uC11C \uC124\uCE58\uD558\uC138\uC694",
|
|
2180
|
+
"adapter.checkTraeAcpHint": "TraeCode CLI\uB97C \uAC10\uC9C0\uD588\uC2B5\uB2C8\uB2E4. ACP \uBAA8\uB4DC(`traecli acp serve`)\uC5D0\uC11C \uC2A4\uD2B8\uB9AC\uBC0D/\uC2B9\uC778/\uC120\uD0DD\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4",
|
|
2181
|
+
"adapter.errTraeAcpSpawn": "TraeCode `acp serve` \uC2DC\uC791 \uC2E4\uD328: {message} (TraeCode CLI\uAC00 ACP\uB97C \uC9C0\uC6D0\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694)",
|
|
2182
|
+
"adapter.errTraeAcpNoSession": "TraeCode ACP\uAC00 \uC138\uC158 id\uB97C \uBC18\uD658\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
|
|
2183
|
+
"adapter.traeSessionTitle": "Trae \uC138\uC158",
|
|
2184
|
+
"adapter.logTraeAuthSkipped": "TraeCode ACP \uC778\uC99D\uC744 \uAC74\uB108\uB6F0\uC5C8\uC2B5\uB2C8\uB2E4. `traecli login`\uC73C\uB85C \uB85C\uADF8\uC778\uD558\uC138\uC694 (TraeCode CLI\uB294 TRAE \uC5D4\uD130\uD504\uB77C\uC774\uC988 \uD50C\uB798\uADF8\uC2ED \uD50C\uB79C \uC804\uC6A9)",
|
|
2185
|
+
"adapter.warnQoderCliMissing": 'Qoder CLI \uC2E4\uD589 \uD30C\uC77C "{bin}"\uC744(\uB97C) \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uCE58\uD558\uAC70\uB098(npm i -g @qoder-ai/qodercli) TUNNELBOX_QODER_BIN\uC5D0 \uACBD\uB85C\uB97C \uC124\uC815\uD558\uC138\uC694',
|
|
2186
|
+
"adapter.checkQoderHeader": "tunnelbox-qoder \uD658\uACBD \uC810\uAC80",
|
|
2187
|
+
"adapter.checkQoderCliMissing": "Qoder CLI \uC2E4\uD589 \uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4({bin}). \uB2E4\uC74C\uC73C\uB85C \uC124\uCE58\uD558\uC138\uC694: npm i -g @qoder-ai/qodercli",
|
|
2188
|
+
"adapter.checkQoderAcpHint": "Qoder CLI\uB97C \uAC10\uC9C0\uD588\uC2B5\uB2C8\uB2E4. ACP \uBAA8\uB4DC(`qoder --acp`)\uC5D0\uC11C \uC2A4\uD2B8\uB9AC\uBC0D/\uC2B9\uC778/\uC120\uD0DD\uC744 \uC81C\uACF5\uD569\uB2C8\uB2E4",
|
|
2189
|
+
"adapter.errQoderAcpSpawn": "Qoder `--acp` \uC2DC\uC791 \uC2E4\uD328: {message} (Qoder CLI\uAC00 `--acp`\uB97C \uC9C0\uC6D0\uD558\uB294\uC9C0 \uD655\uC778\uD558\uC138\uC694)",
|
|
2190
|
+
"adapter.errQoderAcpNoSession": "Qoder ACP\uAC00 \uC138\uC158 id\uB97C \uBC18\uD658\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4",
|
|
2191
|
+
"adapter.qoderSessionTitle": "Qoder \uC138\uC158",
|
|
2192
|
+
"adapter.logQoderAuthSkipped": "Qoder ACP \uC778\uC99D\uC744 \uAC74\uB108\uB6F0\uC5C8\uC2B5\uB2C8\uB2E4. `qoder login`\uC73C\uB85C \uB85C\uADF8\uC778\uD558\uAC70\uB098 QODER_PERSONAL_ACCESS_TOKEN\uC744 \uC124\uC815\uD558\uC138\uC694"
|
|
2028
2193
|
};
|
|
2029
2194
|
|
|
2030
2195
|
// locales/fr-FR.json
|
|
@@ -2399,7 +2564,40 @@ var fr_FR_default = {
|
|
|
2399
2564
|
"hermes.logRegisterAskFailed": "tunnelbox : \xE9chec d'enregistrement de tunnelbox_ask : {err}",
|
|
2400
2565
|
"hermes.logRegisterSystemPromptFailed": "tunnelbox : \xE9chec d'enregistrement de la section du prompt syst\xE8me : {err}",
|
|
2401
2566
|
"hermes.logBackgroundBridgeFailed": "tunnelbox : \xE9chec du d\xE9marrage du pont en arri\xE8re-plan : {err}",
|
|
2402
|
-
"hermes.systemPromptAsk": "Lorsque vous avez besoin d'une d\xE9cision, d'une clarification ou d'un choix de l'utilisateur et qu'un t\xE9l\xE9phone tunnelbox est associ\xE9, utilisez l'outil `tunnelbox_ask` pour poser la question sur son t\xE9l\xE9phone au lieu de deviner. Attendez sa r\xE9ponse avant de continuer."
|
|
2567
|
+
"hermes.systemPromptAsk": "Lorsque vous avez besoin d'une d\xE9cision, d'une clarification ou d'un choix de l'utilisateur et qu'un t\xE9l\xE9phone tunnelbox est associ\xE9, utilisez l'outil `tunnelbox_ask` pour poser la question sur son t\xE9l\xE9phone au lieu de deviner. Attendez sa r\xE9ponse avant de continuer.",
|
|
2568
|
+
"adapter.warnCodebuddyCliMissing": 'Ex\xE9cutable CodeBuddy CLI "{bin}" introuvable ; installez-le (npm i -g @tencent-ai/codebuddy-code) ou d\xE9finissez TUNNELBOX_CODEBUDDY_BIN sur son chemin',
|
|
2569
|
+
"adapter.checkCodebuddyHeader": "V\xE9rification de l'environnement tunnelbox-codebuddy",
|
|
2570
|
+
"adapter.checkCodebuddyCliMissing": "Ex\xE9cutable CodeBuddy CLI introuvable ({bin}) ; installez-le avec : npm i -g @tencent-ai/codebuddy-code",
|
|
2571
|
+
"adapter.checkCodebuddyAcpHint": "CodeBuddy CLI d\xE9tect\xE9 ; le mode ACP (`codebuddy --acp`) fournira le streaming/l'approbation/la s\xE9lection",
|
|
2572
|
+
"adapter.errCodebuddyAcpSpawn": "\xC9chec du d\xE9marrage de CodeBuddy `--acp` : {message} (v\xE9rifiez que le CodeBuddy CLI prend en charge `--acp`)",
|
|
2573
|
+
"adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP n'a pas renvoy\xE9 d'id de session",
|
|
2574
|
+
"adapter.codebuddySessionTitle": "Session CodeBuddy",
|
|
2575
|
+
"adapter.logElicitationNative": "Demande de s\xE9lection/confirmation -> carte t\xE9l\xE9phone id={id} (session={session})",
|
|
2576
|
+
"adapter.logCodebuddyAuthSkipped": "CodeBuddy n'est pas authentifi\xE9 via ACP ; connectez-vous une fois avec `codebuddy` (ou d\xE9finissez CODEBUDDY_API_KEY), ou d\xE9finissez TUNNELBOX_CODEBUDDY_AUTH=<methodId> pour vous authentifier via ACP",
|
|
2577
|
+
"adapter.warnKimiCliMissing": 'Ex\xE9cutable Kimi CLI "{bin}" introuvable ; installez-le (https://moonshotai.github.io/kimi-code/) ou d\xE9finissez TUNNELBOX_KIMI_BIN sur son chemin',
|
|
2578
|
+
"adapter.checkKimiHeader": "V\xE9rification de l'environnement tunnelbox-kimi",
|
|
2579
|
+
"adapter.checkKimiCliMissing": "Ex\xE9cutable Kimi CLI introuvable ({bin}) ; installez-le depuis https://moonshotai.github.io/kimi-code/",
|
|
2580
|
+
"adapter.checkKimiAcpHint": "Kimi CLI d\xE9tect\xE9 ; le mode ACP (`kimi acp`) fournira le streaming/l'approbation/la s\xE9lection",
|
|
2581
|
+
"adapter.errKimiAcpSpawn": "\xC9chec du d\xE9marrage de Kimi `acp` : {message} (v\xE9rifiez que le Kimi CLI prend en charge `kimi acp`)",
|
|
2582
|
+
"adapter.errKimiAcpNoSession": "Kimi ACP n'a pas renvoy\xE9 d'id de session",
|
|
2583
|
+
"adapter.kimiSessionTitle": "Session Kimi",
|
|
2584
|
+
"adapter.logKimiAuthRequired": "Kimi n'est pas connect\xE9 : ex\xE9cutez `kimi` une fois et envoyez /login (ou configurez une cl\xE9 API) \u2014 {message}",
|
|
2585
|
+
"adapter.warnTraeCliMissing": 'Ex\xE9cutable TraeCode CLI "{bin}" introuvable ; installez-le (https://docs.trae.cn/cli_what-is-trae-cli) ou d\xE9finissez TUNNELBOX_TRAE_BIN sur son chemin',
|
|
2586
|
+
"adapter.checkTraeHeader": "V\xE9rification de l'environnement tunnelbox-trae",
|
|
2587
|
+
"adapter.checkTraeCliMissing": "Ex\xE9cutable TraeCode CLI introuvable ({bin}) ; installez-le depuis https://docs.trae.cn/cli_what-is-trae-cli",
|
|
2588
|
+
"adapter.checkTraeAcpHint": "TraeCode CLI d\xE9tect\xE9 ; le mode ACP (`traecli acp serve`) fournira le streaming/l'approbation/la s\xE9lection",
|
|
2589
|
+
"adapter.errTraeAcpSpawn": "\xC9chec du d\xE9marrage de TraeCode `acp serve` : {message} (v\xE9rifiez que le TraeCode CLI prend en charge ACP)",
|
|
2590
|
+
"adapter.errTraeAcpNoSession": "TraeCode ACP n'a pas renvoy\xE9 d'id de session",
|
|
2591
|
+
"adapter.traeSessionTitle": "Session Trae",
|
|
2592
|
+
"adapter.logTraeAuthSkipped": "Authentification ACP TraeCode ignor\xE9e ; connectez-vous avec `traecli login` (TraeCode CLI n\xE9cessite un forfait TRAE Enterprise Flagship)",
|
|
2593
|
+
"adapter.warnQoderCliMissing": 'Ex\xE9cutable Qoder CLI "{bin}" introuvable ; installez-le (npm i -g @qoder-ai/qodercli) ou d\xE9finissez TUNNELBOX_QODER_BIN sur son chemin',
|
|
2594
|
+
"adapter.checkQoderHeader": "V\xE9rification de l'environnement tunnelbox-qoder",
|
|
2595
|
+
"adapter.checkQoderCliMissing": "Ex\xE9cutable Qoder CLI introuvable ({bin}) ; installez-le avec : npm i -g @qoder-ai/qodercli",
|
|
2596
|
+
"adapter.checkQoderAcpHint": "Qoder CLI d\xE9tect\xE9 ; le mode ACP (`qoder --acp`) fournira le streaming/l'approbation/la s\xE9lection",
|
|
2597
|
+
"adapter.errQoderAcpSpawn": "\xC9chec du d\xE9marrage de Qoder `--acp` : {message} (v\xE9rifiez que le Qoder CLI prend en charge `--acp`)",
|
|
2598
|
+
"adapter.errQoderAcpNoSession": "Qoder ACP n'a pas renvoy\xE9 d'id de session",
|
|
2599
|
+
"adapter.qoderSessionTitle": "Session Qoder",
|
|
2600
|
+
"adapter.logQoderAuthSkipped": "Authentification ACP Qoder ignor\xE9e ; connectez-vous avec `qoder login` ou d\xE9finissez QODER_PERSONAL_ACCESS_TOKEN"
|
|
2403
2601
|
};
|
|
2404
2602
|
|
|
2405
2603
|
// locales/de-DE.json
|
|
@@ -2774,7 +2972,40 @@ var de_DE_default = {
|
|
|
2774
2972
|
"hermes.logRegisterAskFailed": "tunnelbox: Registrierung von tunnelbox_ask fehlgeschlagen: {err}",
|
|
2775
2973
|
"hermes.logRegisterSystemPromptFailed": "tunnelbox: Registrierung des System-Prompt-Abschnitts fehlgeschlagen: {err}",
|
|
2776
2974
|
"hermes.logBackgroundBridgeFailed": "tunnelbox: Start der Hintergrund-Bridge fehlgeschlagen: {err}",
|
|
2777
|
-
"hermes.systemPromptAsk": "Wenn Sie eine Entscheidung, Kl\xE4rung oder Auswahl vom Nutzer ben\xF6tigen und ein tunnelbox-Telefon verbunden ist, verwenden Sie das Tool `tunnelbox_ask`, um auf dessen Telefon zu fragen, statt zu raten. Warten Sie auf die Antwort, bevor Sie fortfahren."
|
|
2975
|
+
"hermes.systemPromptAsk": "Wenn Sie eine Entscheidung, Kl\xE4rung oder Auswahl vom Nutzer ben\xF6tigen und ein tunnelbox-Telefon verbunden ist, verwenden Sie das Tool `tunnelbox_ask`, um auf dessen Telefon zu fragen, statt zu raten. Warten Sie auf die Antwort, bevor Sie fortfahren.",
|
|
2976
|
+
"adapter.warnCodebuddyCliMissing": 'CodeBuddy-CLI-Programm "{bin}" nicht gefunden; installieren (npm i -g @tencent-ai/codebuddy-code) oder TUNNELBOX_CODEBUDDY_BIN auf den Pfad setzen',
|
|
2977
|
+
"adapter.checkCodebuddyHeader": "tunnelbox-codebuddy Umgebungspr\xFCfung",
|
|
2978
|
+
"adapter.checkCodebuddyCliMissing": "CodeBuddy-CLI-Programm nicht gefunden ({bin}); installieren mit: npm i -g @tencent-ai/codebuddy-code",
|
|
2979
|
+
"adapter.checkCodebuddyAcpHint": "CodeBuddy CLI erkannt; der ACP-Modus (`codebuddy --acp`) bietet Streaming/Freigabe/Auswahl",
|
|
2980
|
+
"adapter.errCodebuddyAcpSpawn": "Start von CodeBuddy `--acp` fehlgeschlagen: {message} (sicherstellen, dass die CodeBuddy CLI `--acp` unterst\xFCtzt)",
|
|
2981
|
+
"adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP hat keine Sitzungs-ID zur\xFCckgegeben",
|
|
2982
|
+
"adapter.codebuddySessionTitle": "CodeBuddy-Sitzung",
|
|
2983
|
+
"adapter.logElicitationNative": "Auswahl-/Best\xE4tigungsanfrage -> Telefonkarte id={id} (Sitzung={session})",
|
|
2984
|
+
"adapter.logCodebuddyAuthSkipped": "CodeBuddy ist nicht \xFCber ACP authentifiziert; melden Sie sich einmal mit `codebuddy` an (oder setzen Sie CODEBUDDY_API_KEY), oder setzen Sie TUNNELBOX_CODEBUDDY_AUTH=<methodId>, um \xFCber ACP zu authentifizieren",
|
|
2985
|
+
"adapter.warnKimiCliMissing": 'Kimi-CLI-Programm "{bin}" nicht gefunden; installieren (https://moonshotai.github.io/kimi-code/) oder TUNNELBOX_KIMI_BIN auf den Pfad setzen',
|
|
2986
|
+
"adapter.checkKimiHeader": "tunnelbox-kimi Umgebungspr\xFCfung",
|
|
2987
|
+
"adapter.checkKimiCliMissing": "Kimi-CLI-Programm nicht gefunden ({bin}); installieren von https://moonshotai.github.io/kimi-code/",
|
|
2988
|
+
"adapter.checkKimiAcpHint": "Kimi CLI erkannt; der ACP-Modus (`kimi acp`) bietet Streaming/Freigabe/Auswahl",
|
|
2989
|
+
"adapter.errKimiAcpSpawn": "Start von Kimi `acp` fehlgeschlagen: {message} (sicherstellen, dass die Kimi CLI `kimi acp` unterst\xFCtzt)",
|
|
2990
|
+
"adapter.errKimiAcpNoSession": "Kimi ACP hat keine Sitzungs-ID zur\xFCckgegeben",
|
|
2991
|
+
"adapter.kimiSessionTitle": "Kimi-Sitzung",
|
|
2992
|
+
"adapter.logKimiAuthRequired": "Kimi ist nicht angemeldet: `kimi` einmal ausf\xFChren und /login senden (oder einen API-Schl\xFCssel konfigurieren) \u2014 {message}",
|
|
2993
|
+
"adapter.warnTraeCliMissing": 'TraeCode-CLI-Programm "{bin}" nicht gefunden; installieren (https://docs.trae.cn/cli_what-is-trae-cli) oder TUNNELBOX_TRAE_BIN auf den Pfad setzen',
|
|
2994
|
+
"adapter.checkTraeHeader": "tunnelbox-trae Umgebungspr\xFCfung",
|
|
2995
|
+
"adapter.checkTraeCliMissing": "TraeCode-CLI-Programm nicht gefunden ({bin}); installieren von https://docs.trae.cn/cli_what-is-trae-cli",
|
|
2996
|
+
"adapter.checkTraeAcpHint": "TraeCode CLI erkannt; der ACP-Modus (`traecli acp serve`) bietet Streaming/Freigabe/Auswahl",
|
|
2997
|
+
"adapter.errTraeAcpSpawn": "Start von TraeCode `acp serve` fehlgeschlagen: {message} (sicherstellen, dass die TraeCode CLI ACP unterst\xFCtzt)",
|
|
2998
|
+
"adapter.errTraeAcpNoSession": "TraeCode ACP hat keine Sitzungs-ID zur\xFCckgegeben",
|
|
2999
|
+
"adapter.traeSessionTitle": "Trae-Sitzung",
|
|
3000
|
+
"adapter.logTraeAuthSkipped": "TraeCode ACP-Authentifizierung \xFCbersprungen; melden Sie sich mit `traecli login` an (TraeCode CLI erfordert einen TRAE Enterprise Flagship-Plan)",
|
|
3001
|
+
"adapter.warnQoderCliMissing": 'Qoder-CLI-Programm "{bin}" nicht gefunden; installieren (npm i -g @qoder-ai/qodercli) oder TUNNELBOX_QODER_BIN auf den Pfad setzen',
|
|
3002
|
+
"adapter.checkQoderHeader": "tunnelbox-qoder Umgebungspr\xFCfung",
|
|
3003
|
+
"adapter.checkQoderCliMissing": "Qoder-CLI-Programm nicht gefunden ({bin}); installieren mit: npm i -g @qoder-ai/qodercli",
|
|
3004
|
+
"adapter.checkQoderAcpHint": "Qoder CLI erkannt; der ACP-Modus (`qoder --acp`) bietet Streaming/Freigabe/Auswahl",
|
|
3005
|
+
"adapter.errQoderAcpSpawn": "Start von Qoder `--acp` fehlgeschlagen: {message} (sicherstellen, dass die Qoder CLI `--acp` unterst\xFCtzt)",
|
|
3006
|
+
"adapter.errQoderAcpNoSession": "Qoder ACP hat keine Sitzungs-ID zur\xFCckgegeben",
|
|
3007
|
+
"adapter.qoderSessionTitle": "Qoder-Sitzung",
|
|
3008
|
+
"adapter.logQoderAuthSkipped": "Qoder ACP-Authentifizierung \xFCbersprungen; melden Sie sich mit `qoder login` an oder setzen Sie QODER_PERSONAL_ACCESS_TOKEN"
|
|
2778
3009
|
};
|
|
2779
3010
|
|
|
2780
3011
|
// locales/es-ES.json
|
|
@@ -3149,7 +3380,40 @@ var es_ES_default = {
|
|
|
3149
3380
|
"hermes.logRegisterAskFailed": "tunnelbox: fall\xF3 el registro de tunnelbox_ask: {err}",
|
|
3150
3381
|
"hermes.logRegisterSystemPromptFailed": "tunnelbox: fall\xF3 el registro de la secci\xF3n del prompt del sistema: {err}",
|
|
3151
3382
|
"hermes.logBackgroundBridgeFailed": "tunnelbox: fall\xF3 el inicio del puente en segundo plano: {err}",
|
|
3152
|
-
"hermes.systemPromptAsk": "Cuando necesites una decisi\xF3n, aclaraci\xF3n o elecci\xF3n del usuario y haya un tel\xE9fono tunnelbox vinculado, usa la herramienta `tunnelbox_ask` para preguntar en su tel\xE9fono en lugar de adivinar. Espera su respuesta antes de continuar."
|
|
3383
|
+
"hermes.systemPromptAsk": "Cuando necesites una decisi\xF3n, aclaraci\xF3n o elecci\xF3n del usuario y haya un tel\xE9fono tunnelbox vinculado, usa la herramienta `tunnelbox_ask` para preguntar en su tel\xE9fono en lugar de adivinar. Espera su respuesta antes de continuar.",
|
|
3384
|
+
"adapter.warnCodebuddyCliMissing": 'No se encontr\xF3 el ejecutable de CodeBuddy CLI "{bin}"; inst\xE1lalo (npm i -g @tencent-ai/codebuddy-code) o define TUNNELBOX_CODEBUDDY_BIN con su ruta',
|
|
3385
|
+
"adapter.checkCodebuddyHeader": "Comprobaci\xF3n de entorno de tunnelbox-codebuddy",
|
|
3386
|
+
"adapter.checkCodebuddyCliMissing": "No se encontr\xF3 el ejecutable de CodeBuddy CLI ({bin}); inst\xE1lalo con: npm i -g @tencent-ai/codebuddy-code",
|
|
3387
|
+
"adapter.checkCodebuddyAcpHint": "CodeBuddy CLI detectado; el modo ACP (`codebuddy --acp`) proporcionar\xE1 streaming/aprobaci\xF3n/selecci\xF3n",
|
|
3388
|
+
"adapter.errCodebuddyAcpSpawn": "No se pudo iniciar CodeBuddy `--acp`: {message} (aseg\xFArate de que CodeBuddy CLI admite `--acp`)",
|
|
3389
|
+
"adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP no devolvi\xF3 un id de sesi\xF3n",
|
|
3390
|
+
"adapter.codebuddySessionTitle": "Sesi\xF3n de CodeBuddy",
|
|
3391
|
+
"adapter.logElicitationNative": "Solicitud de selecci\xF3n/confirmaci\xF3n -> tarjeta del tel\xE9fono id={id} (sesi\xF3n={session})",
|
|
3392
|
+
"adapter.logCodebuddyAuthSkipped": "CodeBuddy no est\xE1 autenticado por ACP; inicia sesi\xF3n una vez con `codebuddy` (o define CODEBUDDY_API_KEY), o define TUNNELBOX_CODEBUDDY_AUTH=<methodId> para autenticarte por ACP",
|
|
3393
|
+
"adapter.warnKimiCliMissing": 'No se encontr\xF3 el ejecutable de Kimi CLI "{bin}"; inst\xE1lalo (https://moonshotai.github.io/kimi-code/) o define TUNNELBOX_KIMI_BIN con su ruta',
|
|
3394
|
+
"adapter.checkKimiHeader": "Comprobaci\xF3n de entorno de tunnelbox-kimi",
|
|
3395
|
+
"adapter.checkKimiCliMissing": "No se encontr\xF3 el ejecutable de Kimi CLI ({bin}); inst\xE1lalo desde https://moonshotai.github.io/kimi-code/",
|
|
3396
|
+
"adapter.checkKimiAcpHint": "Kimi CLI detectado; el modo ACP (`kimi acp`) proporcionar\xE1 streaming/aprobaci\xF3n/selecci\xF3n",
|
|
3397
|
+
"adapter.errKimiAcpSpawn": "No se pudo iniciar Kimi `acp`: {message} (aseg\xFArate de que Kimi CLI admite `kimi acp`)",
|
|
3398
|
+
"adapter.errKimiAcpNoSession": "Kimi ACP no devolvi\xF3 un id de sesi\xF3n",
|
|
3399
|
+
"adapter.kimiSessionTitle": "Sesi\xF3n de Kimi",
|
|
3400
|
+
"adapter.logKimiAuthRequired": "Kimi no ha iniciado sesi\xF3n: ejecuta `kimi` una vez y env\xEDa /login (o configura una clave API) \u2014 {message}",
|
|
3401
|
+
"adapter.warnTraeCliMissing": 'No se encontr\xF3 el ejecutable de TraeCode CLI "{bin}"; inst\xE1lalo (https://docs.trae.cn/cli_what-is-trae-cli) o define TUNNELBOX_TRAE_BIN con su ruta',
|
|
3402
|
+
"adapter.checkTraeHeader": "Comprobaci\xF3n de entorno de tunnelbox-trae",
|
|
3403
|
+
"adapter.checkTraeCliMissing": "No se encontr\xF3 el ejecutable de TraeCode CLI ({bin}); inst\xE1lalo desde https://docs.trae.cn/cli_what-is-trae-cli",
|
|
3404
|
+
"adapter.checkTraeAcpHint": "TraeCode CLI detectado; el modo ACP (`traecli acp serve`) proporcionar\xE1 streaming/aprobaci\xF3n/selecci\xF3n",
|
|
3405
|
+
"adapter.errTraeAcpSpawn": "No se pudo iniciar TraeCode `acp serve`: {message} (aseg\xFArate de que TraeCode CLI admite ACP)",
|
|
3406
|
+
"adapter.errTraeAcpNoSession": "TraeCode ACP no devolvi\xF3 un id de sesi\xF3n",
|
|
3407
|
+
"adapter.traeSessionTitle": "Sesi\xF3n de Trae",
|
|
3408
|
+
"adapter.logTraeAuthSkipped": "Se omiti\xF3 la autenticaci\xF3n ACP de TraeCode; inicia sesi\xF3n con `traecli login` (TraeCode CLI requiere un plan TRAE Enterprise Flagship)",
|
|
3409
|
+
"adapter.warnQoderCliMissing": 'No se encontr\xF3 el ejecutable de Qoder CLI "{bin}"; inst\xE1lalo (npm i -g @qoder-ai/qodercli) o define TUNNELBOX_QODER_BIN con su ruta',
|
|
3410
|
+
"adapter.checkQoderHeader": "Comprobaci\xF3n de entorno de tunnelbox-qoder",
|
|
3411
|
+
"adapter.checkQoderCliMissing": "No se encontr\xF3 el ejecutable de Qoder CLI ({bin}); inst\xE1lalo con: npm i -g @qoder-ai/qodercli",
|
|
3412
|
+
"adapter.checkQoderAcpHint": "Qoder CLI detectado; el modo ACP (`qoder --acp`) proporcionar\xE1 streaming/aprobaci\xF3n/selecci\xF3n",
|
|
3413
|
+
"adapter.errQoderAcpSpawn": "No se pudo iniciar Qoder `--acp`: {message} (aseg\xFArate de que Qoder CLI admite `--acp`)",
|
|
3414
|
+
"adapter.errQoderAcpNoSession": "Qoder ACP no devolvi\xF3 un id de sesi\xF3n",
|
|
3415
|
+
"adapter.qoderSessionTitle": "Sesi\xF3n de Qoder",
|
|
3416
|
+
"adapter.logQoderAuthSkipped": "Se omiti\xF3 la autenticaci\xF3n ACP de Qoder; inicia sesi\xF3n con `qoder login` o define QODER_PERSONAL_ACCESS_TOKEN"
|
|
3153
3417
|
};
|
|
3154
3418
|
|
|
3155
3419
|
// src/i18n.ts
|
|
@@ -3583,7 +3847,458 @@ function killCliTree(child) {
|
|
|
3583
3847
|
}
|
|
3584
3848
|
}, 1500);
|
|
3585
3849
|
}
|
|
3850
|
+
|
|
3851
|
+
// src/acp/client.ts
|
|
3852
|
+
import { spawn } from "child_process";
|
|
3853
|
+
var DEFAULT_REQUEST_TIMEOUT_MS = 3e4;
|
|
3854
|
+
var AcpClient = class {
|
|
3855
|
+
constructor(bin, args = [], handlers = {}, label = "acp") {
|
|
3856
|
+
this.bin = bin;
|
|
3857
|
+
this.args = args;
|
|
3858
|
+
this.handlers = handlers;
|
|
3859
|
+
this.label = label;
|
|
3860
|
+
}
|
|
3861
|
+
child = null;
|
|
3862
|
+
buf = "";
|
|
3863
|
+
seq = 0;
|
|
3864
|
+
pending = /* @__PURE__ */ new Map();
|
|
3865
|
+
exited = false;
|
|
3866
|
+
get alive() {
|
|
3867
|
+
return !!this.child && !this.exited;
|
|
3868
|
+
}
|
|
3869
|
+
/** 启动 ACP 子进程(stdio 传输)。 */
|
|
3870
|
+
start(cwd) {
|
|
3871
|
+
return new Promise((resolve2, reject) => {
|
|
3872
|
+
const resolved = resolveCliBinary(this.bin);
|
|
3873
|
+
const opts = { cwd, env: process.env, stdio: ["pipe", "pipe", "pipe"] };
|
|
3874
|
+
let child;
|
|
3875
|
+
try {
|
|
3876
|
+
child = resolved?.viaShell ? spawn(cmdLineFor(resolved.path, this.args), [], { ...opts, shell: true }) : spawn(resolved?.path ?? this.bin, this.args, opts);
|
|
3877
|
+
} catch (e) {
|
|
3878
|
+
reject(e);
|
|
3879
|
+
return;
|
|
3880
|
+
}
|
|
3881
|
+
this.child = child;
|
|
3882
|
+
this.exited = false;
|
|
3883
|
+
child.stdout?.setEncoding("utf8");
|
|
3884
|
+
child.stdout?.on("data", (chunk) => this.onChunk(chunk));
|
|
3885
|
+
child.stderr?.setEncoding("utf8");
|
|
3886
|
+
child.stderr?.on("data", (chunk) => {
|
|
3887
|
+
for (const l of chunk.split("\n")) {
|
|
3888
|
+
const s = l.trim();
|
|
3889
|
+
if (s) this.handlers.onStderr?.(s);
|
|
3890
|
+
}
|
|
3891
|
+
});
|
|
3892
|
+
child.on("error", (e) => {
|
|
3893
|
+
this.failAll(e);
|
|
3894
|
+
reject(e);
|
|
3895
|
+
});
|
|
3896
|
+
child.on("close", (code, signal) => {
|
|
3897
|
+
this.exited = true;
|
|
3898
|
+
this.child = null;
|
|
3899
|
+
this.failAll(new Error(`${this.label} exited (code=${code ?? "null"} signal=${signal ?? "null"})`));
|
|
3900
|
+
this.handlers.onExit?.(code, signal);
|
|
3901
|
+
});
|
|
3902
|
+
resolve2();
|
|
3903
|
+
});
|
|
3904
|
+
}
|
|
3905
|
+
/**
|
|
3906
|
+
* 发送请求并等待响应。`timeoutMs <= 0` 表示不设超时(如 `session/prompt` 持续整轮)。
|
|
3907
|
+
*/
|
|
3908
|
+
request(method, params, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS) {
|
|
3909
|
+
if (!this.alive) return Promise.reject(new Error(`${this.label} not running`));
|
|
3910
|
+
const id = ++this.seq;
|
|
3911
|
+
return new Promise((resolve2, reject) => {
|
|
3912
|
+
const timer = timeoutMs > 0 ? setTimeout(() => {
|
|
3913
|
+
this.pending.delete(id);
|
|
3914
|
+
reject(new Error(`${this.label} request timeout: ${method}`));
|
|
3915
|
+
}, timeoutMs) : null;
|
|
3916
|
+
this.pending.set(id, { resolve: resolve2, reject, timer });
|
|
3917
|
+
this.write({ jsonrpc: "2.0", id, method, ...params === void 0 ? {} : { params } });
|
|
3918
|
+
});
|
|
3919
|
+
}
|
|
3920
|
+
/** 应答服务端请求(成功)。 */
|
|
3921
|
+
respond(id, result) {
|
|
3922
|
+
this.write({ jsonrpc: "2.0", id, result });
|
|
3923
|
+
}
|
|
3924
|
+
/** 应答服务端请求(失败)。 */
|
|
3925
|
+
respondError(id, code, message) {
|
|
3926
|
+
this.write({ jsonrpc: "2.0", id, error: { code, message } });
|
|
3927
|
+
}
|
|
3928
|
+
/** 发送通知。 */
|
|
3929
|
+
notify(method, params) {
|
|
3930
|
+
this.write({ jsonrpc: "2.0", method, ...params === void 0 ? {} : { params } });
|
|
3931
|
+
}
|
|
3932
|
+
stop() {
|
|
3933
|
+
this.exited = true;
|
|
3934
|
+
this.failAll(new Error(`${this.label} client stopped`));
|
|
3935
|
+
try {
|
|
3936
|
+
this.child?.kill();
|
|
3937
|
+
} catch {
|
|
3938
|
+
}
|
|
3939
|
+
this.child = null;
|
|
3940
|
+
}
|
|
3941
|
+
write(obj) {
|
|
3942
|
+
try {
|
|
3943
|
+
this.child?.stdin?.write(JSON.stringify(obj) + "\n");
|
|
3944
|
+
} catch {
|
|
3945
|
+
}
|
|
3946
|
+
}
|
|
3947
|
+
onChunk(chunk) {
|
|
3948
|
+
this.buf += chunk;
|
|
3949
|
+
let idx;
|
|
3950
|
+
while ((idx = this.buf.indexOf("\n")) >= 0) {
|
|
3951
|
+
const line = this.buf.slice(0, idx).trim();
|
|
3952
|
+
this.buf = this.buf.slice(idx + 1);
|
|
3953
|
+
if (line) this.onLine(line);
|
|
3954
|
+
}
|
|
3955
|
+
}
|
|
3956
|
+
onLine(line) {
|
|
3957
|
+
let msg;
|
|
3958
|
+
try {
|
|
3959
|
+
msg = JSON.parse(line);
|
|
3960
|
+
} catch {
|
|
3961
|
+
this.handlers.onStderr?.(`non-json line: ${line.slice(0, 200)}`);
|
|
3962
|
+
return;
|
|
3963
|
+
}
|
|
3964
|
+
const method = typeof msg.method === "string" ? msg.method : "";
|
|
3965
|
+
const id = msg.id;
|
|
3966
|
+
if (method && id !== void 0) {
|
|
3967
|
+
this.handlers.onServerRequest?.(id, method, msg.params);
|
|
3968
|
+
return;
|
|
3969
|
+
}
|
|
3970
|
+
if (method) {
|
|
3971
|
+
this.handlers.onNotification?.(method, msg.params);
|
|
3972
|
+
return;
|
|
3973
|
+
}
|
|
3974
|
+
if (id === void 0) return;
|
|
3975
|
+
const p = this.pending.get(id);
|
|
3976
|
+
if (!p) return;
|
|
3977
|
+
this.pending.delete(id);
|
|
3978
|
+
if (p.timer) clearTimeout(p.timer);
|
|
3979
|
+
if (msg.error) {
|
|
3980
|
+
const err = msg.error;
|
|
3981
|
+
p.reject(new Error(`${err?.message || `${this.label} error`}${err?.code !== void 0 ? ` (${err.code})` : ""}`));
|
|
3982
|
+
} else {
|
|
3983
|
+
p.resolve(msg.result);
|
|
3984
|
+
}
|
|
3985
|
+
}
|
|
3986
|
+
failAll(e) {
|
|
3987
|
+
for (const p of this.pending.values()) {
|
|
3988
|
+
if (p.timer) clearTimeout(p.timer);
|
|
3989
|
+
p.reject(e);
|
|
3990
|
+
}
|
|
3991
|
+
this.pending.clear();
|
|
3992
|
+
}
|
|
3993
|
+
};
|
|
3994
|
+
|
|
3995
|
+
// src/acp/map.ts
|
|
3996
|
+
function textOf(content) {
|
|
3997
|
+
if (content && typeof content === "object" && content.type === "text") {
|
|
3998
|
+
return String(content.text ?? "");
|
|
3999
|
+
}
|
|
4000
|
+
return "";
|
|
4001
|
+
}
|
|
4002
|
+
function safeJson(v) {
|
|
4003
|
+
if (v === void 0 || v === null) return "";
|
|
4004
|
+
try {
|
|
4005
|
+
return typeof v === "string" ? v : JSON.stringify(v, null, 2);
|
|
4006
|
+
} catch {
|
|
4007
|
+
return String(v);
|
|
4008
|
+
}
|
|
4009
|
+
}
|
|
4010
|
+
function toolPart(tc, complete) {
|
|
4011
|
+
const name = tc.title || tc.kind || "tool";
|
|
4012
|
+
return { id: tc.toolCallId, type: "tool", tool: name, args: safeJson(tc.rawInput), complete };
|
|
4013
|
+
}
|
|
4014
|
+
function planText(entries) {
|
|
4015
|
+
if (!Array.isArray(entries)) return "";
|
|
4016
|
+
return entries.map((e) => {
|
|
4017
|
+
const mark = e.status === "completed" ? "x" : e.status === "in_progress" ? "~" : " ";
|
|
4018
|
+
return `- [${mark}] ${e.content ?? ""}`.trim();
|
|
4019
|
+
}).filter(Boolean).join("\n");
|
|
4020
|
+
}
|
|
4021
|
+
function partMessage(id, role, part, created = Date.now()) {
|
|
4022
|
+
return { id, role, parts: [part], created };
|
|
4023
|
+
}
|
|
4024
|
+
|
|
4025
|
+
// src/acp/supervisor.ts
|
|
4026
|
+
var PROTOCOL_VERSION = 1;
|
|
4027
|
+
var AcpSupervisor = class {
|
|
4028
|
+
constructor(cfg) {
|
|
4029
|
+
this.cfg = cfg;
|
|
4030
|
+
}
|
|
4031
|
+
client = null;
|
|
4032
|
+
starting = null;
|
|
4033
|
+
caps = {};
|
|
4034
|
+
auth = null;
|
|
4035
|
+
/** 由适配器注入:通知 / 服务端请求处理。 */
|
|
4036
|
+
onNotification = () => {
|
|
4037
|
+
};
|
|
4038
|
+
onServerRequest = () => {
|
|
4039
|
+
};
|
|
4040
|
+
get running() {
|
|
4041
|
+
return !!this.client?.alive;
|
|
4042
|
+
}
|
|
4043
|
+
/** 当前客户端(不触发启动);用于应答来自该连接的服务端请求。 */
|
|
4044
|
+
get current() {
|
|
4045
|
+
return this.client?.alive ? this.client : null;
|
|
4046
|
+
}
|
|
4047
|
+
/** initialize 协商得到的 agent 能力位(loadSession / sessionCapabilities 等)。 */
|
|
4048
|
+
get capabilities() {
|
|
4049
|
+
return this.caps;
|
|
4050
|
+
}
|
|
4051
|
+
/** `authenticate` 返回结果(未认证/未调用时为 null)。 */
|
|
4052
|
+
get authResult() {
|
|
4053
|
+
return this.auth;
|
|
4054
|
+
}
|
|
4055
|
+
/** 取得可用客户端(必要时启动并握手)。 */
|
|
4056
|
+
async ensure() {
|
|
4057
|
+
if (this.client?.alive) return this.client;
|
|
4058
|
+
if (!this.starting) {
|
|
4059
|
+
this.starting = this.launch().finally(() => {
|
|
4060
|
+
this.starting = null;
|
|
4061
|
+
});
|
|
4062
|
+
}
|
|
4063
|
+
return this.starting;
|
|
4064
|
+
}
|
|
4065
|
+
stop() {
|
|
4066
|
+
this.client?.stop();
|
|
4067
|
+
this.client = null;
|
|
4068
|
+
this.caps = {};
|
|
4069
|
+
this.auth = null;
|
|
4070
|
+
}
|
|
4071
|
+
async launch() {
|
|
4072
|
+
const handlers = {
|
|
4073
|
+
onNotification: (method, params2) => this.onNotification(method, params2),
|
|
4074
|
+
onServerRequest: (id, method, params2) => this.onServerRequest(id, method, params2),
|
|
4075
|
+
onStderr: (line) => {
|
|
4076
|
+
if (/\b(error|failed|panic|denied|unauthorized|auth|login|mcp|tunnelbox)\b/i.test(line)) {
|
|
4077
|
+
this.cfg.log(`acp: ${line.slice(0, 300)}`);
|
|
4078
|
+
}
|
|
4079
|
+
},
|
|
4080
|
+
onExit: (code, signal) => {
|
|
4081
|
+
this.client = null;
|
|
4082
|
+
this.caps = {};
|
|
4083
|
+
this.auth = null;
|
|
4084
|
+
this.cfg.log(`${this.cfg.label} exited (code=${code ?? "null"} signal=${signal ?? "null"})`);
|
|
4085
|
+
this.cfg.onExit?.(code, signal);
|
|
4086
|
+
}
|
|
4087
|
+
};
|
|
4088
|
+
const client = new AcpClient(this.cfg.bin, this.cfg.args, handlers, this.cfg.label);
|
|
4089
|
+
await client.start(this.cfg.cwd);
|
|
4090
|
+
const params = {
|
|
4091
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
4092
|
+
clientCapabilities: this.cfg.clientCapabilities ?? {
|
|
4093
|
+
// 不代理文件/终端工具(适配器只做远程 UI;工具在本机执行)
|
|
4094
|
+
fs: { readTextFile: false, writeTextFile: false },
|
|
4095
|
+
terminal: false,
|
|
4096
|
+
// 声明 form 后支持 elicitation 的 agent 才会下发 elicitation/create
|
|
4097
|
+
elicitation: { form: {} }
|
|
4098
|
+
},
|
|
4099
|
+
clientInfo: this.cfg.clientInfo
|
|
4100
|
+
};
|
|
4101
|
+
const res = await client.request("initialize", params, 2e4);
|
|
4102
|
+
this.caps = res?.agentCapabilities ?? {};
|
|
4103
|
+
await this.authenticate(client, res?.authMethods);
|
|
4104
|
+
this.client = client;
|
|
4105
|
+
return client;
|
|
4106
|
+
}
|
|
4107
|
+
/**
|
|
4108
|
+
* 完成登录握手。仅当配置了 `authMethod` 时调用(交互式登录的 agent 应缺省不调用,避免挂起/弹登录);
|
|
4109
|
+
* 非交互的 agent(如 Kimi `login`)可传入以探测登录态,失败不阻断启动。
|
|
4110
|
+
*/
|
|
4111
|
+
async authenticate(client, methods) {
|
|
4112
|
+
const wanted = (this.cfg.authMethod || "").trim();
|
|
4113
|
+
if (!wanted) {
|
|
4114
|
+
this.cfg.onAuthSkipped?.();
|
|
4115
|
+
return;
|
|
4116
|
+
}
|
|
4117
|
+
const list = Array.isArray(methods) ? methods : [];
|
|
4118
|
+
const preferred = list.find((m) => m.id === wanted) ?? list[0];
|
|
4119
|
+
if (!preferred) {
|
|
4120
|
+
this.cfg.onAuthResult?.({ ok: false, error: "no auth methods" });
|
|
4121
|
+
return;
|
|
4122
|
+
}
|
|
4123
|
+
try {
|
|
4124
|
+
const r = await client.request("authenticate", { methodId: preferred.id }, 12e4);
|
|
4125
|
+
this.auth = r ?? {};
|
|
4126
|
+
this.cfg.onAuthResult?.({ ok: true, result: r ?? {} });
|
|
4127
|
+
} catch (e) {
|
|
4128
|
+
this.cfg.onAuthResult?.({ ok: false, error: e.message });
|
|
4129
|
+
}
|
|
4130
|
+
}
|
|
4131
|
+
};
|
|
4132
|
+
|
|
4133
|
+
// src/acp/permissions.ts
|
|
4134
|
+
var STANDARD_PERMISSION_KINDS = /* @__PURE__ */ new Set([
|
|
4135
|
+
"allow_once",
|
|
4136
|
+
"allow_always",
|
|
4137
|
+
"allow_session",
|
|
4138
|
+
"reject_once",
|
|
4139
|
+
"reject_always"
|
|
4140
|
+
]);
|
|
4141
|
+
function isChoiceOptions(options) {
|
|
4142
|
+
if (!options.length) return false;
|
|
4143
|
+
const allowOnceCount = options.filter((o) => o.kind === "allow_once").length;
|
|
4144
|
+
return options.some((o) => !STANDARD_PERMISSION_KINDS.has(o.kind)) || allowOnceCount > 1;
|
|
4145
|
+
}
|
|
4146
|
+
function chooseOption(options, status, scope) {
|
|
4147
|
+
if (!options.length) return void 0;
|
|
4148
|
+
const prefer = status === "deny" ? scope === "always" ? "reject_always" : "reject_once" : scope === "once" ? "allow_once" : scope === "session" ? "allow_session" : "allow_always";
|
|
4149
|
+
const exact = options.find((o) => o.kind === prefer);
|
|
4150
|
+
if (exact) return exact;
|
|
4151
|
+
const prefix = status === "deny" ? "reject" : "allow";
|
|
4152
|
+
return options.find((o) => String(o.kind ?? "").startsWith(prefix)) ?? options[0];
|
|
4153
|
+
}
|
|
4154
|
+
|
|
4155
|
+
// src/acp/mirror.ts
|
|
4156
|
+
import {
|
|
4157
|
+
existsSync as existsSync3,
|
|
4158
|
+
mkdirSync as mkdirSync2,
|
|
4159
|
+
readFileSync as readFileSync2,
|
|
4160
|
+
readdirSync,
|
|
4161
|
+
rmSync,
|
|
4162
|
+
statSync as statSync2,
|
|
4163
|
+
writeFileSync as writeFileSync2
|
|
4164
|
+
} from "fs";
|
|
4165
|
+
import { join as join3 } from "path";
|
|
4166
|
+
var FILE = "session.jsonl";
|
|
4167
|
+
var META = "meta.json";
|
|
4168
|
+
function createSessionMirror(rootDir) {
|
|
4169
|
+
const dirOf = (sessionID) => join3(rootDir, sessionID);
|
|
4170
|
+
function readMeta(sessionID) {
|
|
4171
|
+
try {
|
|
4172
|
+
const p = join3(dirOf(sessionID), META);
|
|
4173
|
+
if (existsSync3(p)) return JSON.parse(readFileSync2(p, "utf8"));
|
|
4174
|
+
} catch {
|
|
4175
|
+
}
|
|
4176
|
+
return null;
|
|
4177
|
+
}
|
|
4178
|
+
function writeMeta(sessionID, meta) {
|
|
4179
|
+
try {
|
|
4180
|
+
mkdirSync2(dirOf(sessionID), { recursive: true });
|
|
4181
|
+
writeFileSync2(join3(dirOf(sessionID), META), JSON.stringify(meta, null, 2), "utf8");
|
|
4182
|
+
} catch {
|
|
4183
|
+
}
|
|
4184
|
+
}
|
|
4185
|
+
function saveMeta(sessionID, patch) {
|
|
4186
|
+
const prev = readMeta(sessionID) || { title: "", titleAuto: true, created: Date.now(), updated: Date.now() };
|
|
4187
|
+
const meta = { ...prev, ...patch, updated: Date.now() };
|
|
4188
|
+
writeMeta(sessionID, meta);
|
|
4189
|
+
return meta;
|
|
4190
|
+
}
|
|
4191
|
+
function appendPart(sessionID, msgId, role, part, created = Date.now()) {
|
|
4192
|
+
try {
|
|
4193
|
+
const d = dirOf(sessionID);
|
|
4194
|
+
mkdirSync2(d, { recursive: true });
|
|
4195
|
+
const line = JSON.stringify({ id: msgId, role, parts: [part], created });
|
|
4196
|
+
writeFileSync2(join3(d, FILE), line + "\n", { encoding: "utf8", flag: "a" });
|
|
4197
|
+
if (role === "user" && part.type === "text" && part.text) {
|
|
4198
|
+
const meta = readMeta(sessionID);
|
|
4199
|
+
if (!meta || meta.titleAuto) {
|
|
4200
|
+
const t2 = part.text.trim();
|
|
4201
|
+
saveMeta(sessionID, { title: t2.length > 30 ? `${t2.slice(0, 30)}\u2026` : t2, titleAuto: false });
|
|
4202
|
+
}
|
|
4203
|
+
}
|
|
4204
|
+
saveMeta(sessionID, {});
|
|
4205
|
+
} catch {
|
|
4206
|
+
}
|
|
4207
|
+
}
|
|
4208
|
+
function exists(sessionID) {
|
|
4209
|
+
return existsSync3(join3(dirOf(sessionID), FILE));
|
|
4210
|
+
}
|
|
4211
|
+
function walkDirs() {
|
|
4212
|
+
try {
|
|
4213
|
+
return readdirSync(rootDir).filter((n) => existsSync3(join3(rootDir, n, FILE)));
|
|
4214
|
+
} catch {
|
|
4215
|
+
return [];
|
|
4216
|
+
}
|
|
4217
|
+
}
|
|
4218
|
+
async function listSessions() {
|
|
4219
|
+
const out = [];
|
|
4220
|
+
for (const id of walkDirs()) {
|
|
4221
|
+
const meta = readMeta(id);
|
|
4222
|
+
if (!meta) continue;
|
|
4223
|
+
out.push({ id, title: meta.title, created: meta.created, updated: meta.updated, status: "idle", workspace: meta.cwd });
|
|
4224
|
+
}
|
|
4225
|
+
return out.sort((a, b) => b.updated - a.updated);
|
|
4226
|
+
}
|
|
4227
|
+
async function readHistory(sessionID) {
|
|
4228
|
+
let lines;
|
|
4229
|
+
try {
|
|
4230
|
+
lines = readFileSync2(join3(dirOf(sessionID), FILE), "utf8").split("\n");
|
|
4231
|
+
} catch {
|
|
4232
|
+
return [];
|
|
4233
|
+
}
|
|
4234
|
+
const byId = /* @__PURE__ */ new Map();
|
|
4235
|
+
const order = [];
|
|
4236
|
+
for (const line of lines) {
|
|
4237
|
+
const s = line.trim();
|
|
4238
|
+
if (!s) continue;
|
|
4239
|
+
try {
|
|
4240
|
+
const o = JSON.parse(s);
|
|
4241
|
+
if (!o.id || !Array.isArray(o.parts)) continue;
|
|
4242
|
+
const hit = byId.get(o.id);
|
|
4243
|
+
if (hit) {
|
|
4244
|
+
hit.parts.push(...o.parts);
|
|
4245
|
+
} else {
|
|
4246
|
+
order.push(o.id);
|
|
4247
|
+
byId.set(o.id, { id: o.id, role: o.role, parts: [...o.parts], created: o.created ?? Date.now() });
|
|
4248
|
+
}
|
|
4249
|
+
} catch {
|
|
4250
|
+
}
|
|
4251
|
+
}
|
|
4252
|
+
return order.map((id) => byId.get(id)).filter((m) => m.parts.length).map((m) => ({ ...m, parts: mergeParts(m.parts) }));
|
|
4253
|
+
}
|
|
4254
|
+
async function removeSession(sessionID) {
|
|
4255
|
+
try {
|
|
4256
|
+
rmSync(dirOf(sessionID), { recursive: true, force: true });
|
|
4257
|
+
} catch {
|
|
4258
|
+
}
|
|
4259
|
+
}
|
|
4260
|
+
function dirSize(sessionID) {
|
|
4261
|
+
try {
|
|
4262
|
+
const st = statSync2(join3(dirOf(sessionID), FILE));
|
|
4263
|
+
return st.size;
|
|
4264
|
+
} catch {
|
|
4265
|
+
return 0;
|
|
4266
|
+
}
|
|
4267
|
+
}
|
|
4268
|
+
return {
|
|
4269
|
+
getMeta: readMeta,
|
|
4270
|
+
newSessionId,
|
|
4271
|
+
saveMeta,
|
|
4272
|
+
appendPart,
|
|
4273
|
+
exists,
|
|
4274
|
+
listSessions,
|
|
4275
|
+
readHistory,
|
|
4276
|
+
removeSession,
|
|
4277
|
+
dirSize
|
|
4278
|
+
};
|
|
4279
|
+
}
|
|
4280
|
+
function newSessionId() {
|
|
4281
|
+
if (typeof globalThis.crypto?.randomUUID === "function") return globalThis.crypto.randomUUID();
|
|
4282
|
+
return `s-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
4283
|
+
}
|
|
4284
|
+
function mergeParts(parts) {
|
|
4285
|
+
const byId = /* @__PURE__ */ new Map();
|
|
4286
|
+
const order = [];
|
|
4287
|
+
for (const p of parts) {
|
|
4288
|
+
const cur = byId.get(p.id);
|
|
4289
|
+
if (!cur) {
|
|
4290
|
+
order.push(p.id);
|
|
4291
|
+
byId.set(p.id, { ...p });
|
|
4292
|
+
continue;
|
|
4293
|
+
}
|
|
4294
|
+
const text = p.delta != null ? (cur.text || "") + p.delta : p.text != null ? p.text : cur.text;
|
|
4295
|
+
byId.set(p.id, { ...cur, ...p, text });
|
|
4296
|
+
}
|
|
4297
|
+
return order.map((id) => byId.get(id));
|
|
4298
|
+
}
|
|
3586
4299
|
export {
|
|
4300
|
+
AcpClient,
|
|
4301
|
+
AcpSupervisor,
|
|
3587
4302
|
DEFAULT_LANG,
|
|
3588
4303
|
DEFAULT_PAGE_SIZE,
|
|
3589
4304
|
LANG_TAGS,
|
|
@@ -3592,29 +4307,39 @@ export {
|
|
|
3592
4307
|
MAX_PART_TEXT,
|
|
3593
4308
|
MessagesCache,
|
|
3594
4309
|
RelayClient,
|
|
4310
|
+
STANDARD_PERMISSION_KINDS,
|
|
3595
4311
|
capMessage,
|
|
3596
4312
|
capMessages,
|
|
4313
|
+
chooseOption,
|
|
3597
4314
|
cmdLineFor,
|
|
4315
|
+
createSessionMirror,
|
|
3598
4316
|
detectSystemLang,
|
|
3599
4317
|
envelope,
|
|
3600
4318
|
findWinShim,
|
|
3601
4319
|
hyperlink,
|
|
3602
4320
|
injectedRelayUrl,
|
|
4321
|
+
isChoiceOptions,
|
|
3603
4322
|
killCliTree,
|
|
3604
4323
|
loadState,
|
|
3605
4324
|
makeT,
|
|
3606
4325
|
messagesCache,
|
|
3607
4326
|
needsCmdQuote,
|
|
4327
|
+
newSessionId,
|
|
3608
4328
|
normalizeLang,
|
|
4329
|
+
partMessage,
|
|
4330
|
+
planText,
|
|
3609
4331
|
printPairing,
|
|
3610
4332
|
renderPairingQrText,
|
|
3611
4333
|
resolveCliBinary,
|
|
3612
4334
|
resolveLang,
|
|
4335
|
+
safeJson,
|
|
3613
4336
|
saveState,
|
|
3614
4337
|
sliceWindow,
|
|
3615
4338
|
statePath,
|
|
3616
4339
|
supportsHyperlinks,
|
|
3617
4340
|
t,
|
|
4341
|
+
textOf,
|
|
4342
|
+
toolPart,
|
|
3618
4343
|
websiteUrl,
|
|
3619
4344
|
writePairingFile,
|
|
3620
4345
|
writePairingJson
|