@tunnelbox/core 0.1.26 → 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.
@@ -369,5 +369,38 @@
369
369
  "hermes.logRegisterAskFailed": "tunnelbox: Registrierung von tunnelbox_ask fehlgeschlagen: {err}",
370
370
  "hermes.logRegisterSystemPromptFailed": "tunnelbox: Registrierung des System-Prompt-Abschnitts fehlgeschlagen: {err}",
371
371
  "hermes.logBackgroundBridgeFailed": "tunnelbox: Start der Hintergrund-Bridge fehlgeschlagen: {err}",
372
- "hermes.systemPromptAsk": "Wenn Sie eine Entscheidung, Klärung oder Auswahl vom Nutzer benötigen 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."
372
+ "hermes.systemPromptAsk": "Wenn Sie eine Entscheidung, Klärung oder Auswahl vom Nutzer benötigen 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.",
373
+ "adapter.warnCodebuddyCliMissing": "CodeBuddy-CLI-Programm \"{bin}\" nicht gefunden; installieren (npm i -g @tencent-ai/codebuddy-code) oder TUNNELBOX_CODEBUDDY_BIN auf den Pfad setzen",
374
+ "adapter.checkCodebuddyHeader": "tunnelbox-codebuddy Umgebungsprüfung",
375
+ "adapter.checkCodebuddyCliMissing": "CodeBuddy-CLI-Programm nicht gefunden ({bin}); installieren mit: npm i -g @tencent-ai/codebuddy-code",
376
+ "adapter.checkCodebuddyAcpHint": "CodeBuddy CLI erkannt; der ACP-Modus (`codebuddy --acp`) bietet Streaming/Freigabe/Auswahl",
377
+ "adapter.errCodebuddyAcpSpawn": "Start von CodeBuddy `--acp` fehlgeschlagen: {message} (sicherstellen, dass die CodeBuddy CLI `--acp` unterstützt)",
378
+ "adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP hat keine Sitzungs-ID zurückgegeben",
379
+ "adapter.codebuddySessionTitle": "CodeBuddy-Sitzung",
380
+ "adapter.logElicitationNative": "Auswahl-/Bestätigungsanfrage -> Telefonkarte id={id} (Sitzung={session})",
381
+ "adapter.logCodebuddyAuthSkipped": "CodeBuddy ist nicht über ACP authentifiziert; melden Sie sich einmal mit `codebuddy` an (oder setzen Sie CODEBUDDY_API_KEY), oder setzen Sie TUNNELBOX_CODEBUDDY_AUTH=<methodId>, um über ACP zu authentifizieren",
382
+ "adapter.warnKimiCliMissing": "Kimi-CLI-Programm \"{bin}\" nicht gefunden; installieren (https://moonshotai.github.io/kimi-code/) oder TUNNELBOX_KIMI_BIN auf den Pfad setzen",
383
+ "adapter.checkKimiHeader": "tunnelbox-kimi Umgebungsprüfung",
384
+ "adapter.checkKimiCliMissing": "Kimi-CLI-Programm nicht gefunden ({bin}); installieren von https://moonshotai.github.io/kimi-code/",
385
+ "adapter.checkKimiAcpHint": "Kimi CLI erkannt; der ACP-Modus (`kimi acp`) bietet Streaming/Freigabe/Auswahl",
386
+ "adapter.errKimiAcpSpawn": "Start von Kimi `acp` fehlgeschlagen: {message} (sicherstellen, dass die Kimi CLI `kimi acp` unterstützt)",
387
+ "adapter.errKimiAcpNoSession": "Kimi ACP hat keine Sitzungs-ID zurückgegeben",
388
+ "adapter.kimiSessionTitle": "Kimi-Sitzung",
389
+ "adapter.logKimiAuthRequired": "Kimi ist nicht angemeldet: `kimi` einmal ausführen und /login senden (oder einen API-Schlüssel konfigurieren) — {message}",
390
+ "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",
391
+ "adapter.checkTraeHeader": "tunnelbox-trae Umgebungsprüfung",
392
+ "adapter.checkTraeCliMissing": "TraeCode-CLI-Programm nicht gefunden ({bin}); installieren von https://docs.trae.cn/cli_what-is-trae-cli",
393
+ "adapter.checkTraeAcpHint": "TraeCode CLI erkannt; der ACP-Modus (`traecli acp serve`) bietet Streaming/Freigabe/Auswahl",
394
+ "adapter.errTraeAcpSpawn": "Start von TraeCode `acp serve` fehlgeschlagen: {message} (sicherstellen, dass die TraeCode CLI ACP unterstützt)",
395
+ "adapter.errTraeAcpNoSession": "TraeCode ACP hat keine Sitzungs-ID zurückgegeben",
396
+ "adapter.traeSessionTitle": "Trae-Sitzung",
397
+ "adapter.logTraeAuthSkipped": "TraeCode ACP-Authentifizierung übersprungen; melden Sie sich mit `traecli login` an (TraeCode CLI erfordert einen TRAE Enterprise Flagship-Plan)",
398
+ "adapter.warnQoderCliMissing": "Qoder-CLI-Programm \"{bin}\" nicht gefunden; installieren (npm i -g @qoder-ai/qodercli) oder TUNNELBOX_QODER_BIN auf den Pfad setzen",
399
+ "adapter.checkQoderHeader": "tunnelbox-qoder Umgebungsprüfung",
400
+ "adapter.checkQoderCliMissing": "Qoder-CLI-Programm nicht gefunden ({bin}); installieren mit: npm i -g @qoder-ai/qodercli",
401
+ "adapter.checkQoderAcpHint": "Qoder CLI erkannt; der ACP-Modus (`qoder --acp`) bietet Streaming/Freigabe/Auswahl",
402
+ "adapter.errQoderAcpSpawn": "Start von Qoder `--acp` fehlgeschlagen: {message} (sicherstellen, dass die Qoder CLI `--acp` unterstützt)",
403
+ "adapter.errQoderAcpNoSession": "Qoder ACP hat keine Sitzungs-ID zurückgegeben",
404
+ "adapter.qoderSessionTitle": "Qoder-Sitzung",
405
+ "adapter.logQoderAuthSkipped": "Qoder ACP-Authentifizierung übersprungen; melden Sie sich mit `qoder login` an oder setzen Sie QODER_PERSONAL_ACCESS_TOKEN"
373
406
  }
@@ -369,5 +369,38 @@
369
369
  "hermes.logRegisterAskFailed": "tunnelbox: failed to register tunnelbox_ask: {err}",
370
370
  "hermes.logRegisterSystemPromptFailed": "tunnelbox: failed to register system prompt section: {err}",
371
371
  "hermes.logBackgroundBridgeFailed": "tunnelbox: background bridge failed to start: {err}",
372
- "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."
372
+ "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.",
373
+ "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",
374
+ "adapter.checkCodebuddyHeader": "tunnelbox-codebuddy environment check",
375
+ "adapter.checkCodebuddyCliMissing": "CodeBuddy CLI executable not found ({bin}); install it with: npm i -g @tencent-ai/codebuddy-code",
376
+ "adapter.checkCodebuddyAcpHint": "CodeBuddy CLI detected; ACP mode (`codebuddy --acp`) will provide streaming/approval/selection",
377
+ "adapter.errCodebuddyAcpSpawn": "Failed to start CodeBuddy `--acp`: {message} (make sure CodeBuddy CLI supports `--acp`)",
378
+ "adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP did not return a session id",
379
+ "adapter.codebuddySessionTitle": "CodeBuddy session",
380
+ "adapter.logElicitationNative": "elicitation request -> phone card id={id} (session={session})",
381
+ "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",
382
+ "adapter.warnKimiCliMissing": "Kimi CLI executable \"{bin}\" not found; install it (https://moonshotai.github.io/kimi-code/) or set TUNNELBOX_KIMI_BIN to its path",
383
+ "adapter.checkKimiHeader": "tunnelbox-kimi environment check",
384
+ "adapter.checkKimiCliMissing": "Kimi CLI executable not found ({bin}); install it from https://moonshotai.github.io/kimi-code/",
385
+ "adapter.checkKimiAcpHint": "Kimi CLI detected; ACP mode (`kimi acp`) will provide streaming/approval/selection",
386
+ "adapter.errKimiAcpSpawn": "Failed to start Kimi `acp`: {message} (make sure the Kimi CLI supports `kimi acp`)",
387
+ "adapter.errKimiAcpNoSession": "Kimi ACP did not return a session id",
388
+ "adapter.kimiSessionTitle": "Kimi session",
389
+ "adapter.logKimiAuthRequired": "Kimi is not logged in: run `kimi` once and send /login (or configure an API key) — {message}",
390
+ "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",
391
+ "adapter.checkTraeHeader": "tunnelbox-trae environment check",
392
+ "adapter.checkTraeCliMissing": "TraeCode CLI executable not found ({bin}); install it from https://docs.trae.cn/cli_what-is-trae-cli",
393
+ "adapter.checkTraeAcpHint": "TraeCode CLI detected; ACP mode (`traecli acp serve`) will provide streaming/approval/selection",
394
+ "adapter.errTraeAcpSpawn": "Failed to start TraeCode `acp serve`: {message} (make sure the TraeCode CLI supports ACP)",
395
+ "adapter.errTraeAcpNoSession": "TraeCode ACP did not return a session id",
396
+ "adapter.traeSessionTitle": "Trae session",
397
+ "adapter.logTraeAuthSkipped": "TraeCode ACP authenticate skipped; log in with `traecli login` (TraeCode CLI requires a TRAE Enterprise Flagship plan)",
398
+ "adapter.warnQoderCliMissing": "Qoder CLI executable \"{bin}\" not found; install it (npm i -g @qoder-ai/qodercli) or set TUNNELBOX_QODER_BIN to its path",
399
+ "adapter.checkQoderHeader": "tunnelbox-qoder environment check",
400
+ "adapter.checkQoderCliMissing": "Qoder CLI executable not found ({bin}); install it with: npm i -g @qoder-ai/qodercli",
401
+ "adapter.checkQoderAcpHint": "Qoder CLI detected; ACP mode (`qoder --acp`) will provide streaming/approval/selection",
402
+ "adapter.errQoderAcpSpawn": "Failed to start Qoder `--acp`: {message} (make sure the Qoder CLI supports `--acp`)",
403
+ "adapter.errQoderAcpNoSession": "Qoder ACP did not return a session id",
404
+ "adapter.qoderSessionTitle": "Qoder session",
405
+ "adapter.logQoderAuthSkipped": "Qoder ACP authenticate skipped; log in with `qoder login` or set QODER_PERSONAL_ACCESS_TOKEN"
373
406
  }
@@ -369,5 +369,38 @@
369
369
  "hermes.logRegisterAskFailed": "tunnelbox: falló el registro de tunnelbox_ask: {err}",
370
370
  "hermes.logRegisterSystemPromptFailed": "tunnelbox: falló el registro de la sección del prompt del sistema: {err}",
371
371
  "hermes.logBackgroundBridgeFailed": "tunnelbox: falló el inicio del puente en segundo plano: {err}",
372
- "hermes.systemPromptAsk": "Cuando necesites una decisión, aclaración o elección del usuario y haya un teléfono tunnelbox vinculado, usa la herramienta `tunnelbox_ask` para preguntar en su teléfono en lugar de adivinar. Espera su respuesta antes de continuar."
372
+ "hermes.systemPromptAsk": "Cuando necesites una decisión, aclaración o elección del usuario y haya un teléfono tunnelbox vinculado, usa la herramienta `tunnelbox_ask` para preguntar en su teléfono en lugar de adivinar. Espera su respuesta antes de continuar.",
373
+ "adapter.warnCodebuddyCliMissing": "No se encontró el ejecutable de CodeBuddy CLI \"{bin}\"; instálalo (npm i -g @tencent-ai/codebuddy-code) o define TUNNELBOX_CODEBUDDY_BIN con su ruta",
374
+ "adapter.checkCodebuddyHeader": "Comprobación de entorno de tunnelbox-codebuddy",
375
+ "adapter.checkCodebuddyCliMissing": "No se encontró el ejecutable de CodeBuddy CLI ({bin}); instálalo con: npm i -g @tencent-ai/codebuddy-code",
376
+ "adapter.checkCodebuddyAcpHint": "CodeBuddy CLI detectado; el modo ACP (`codebuddy --acp`) proporcionará streaming/aprobación/selección",
377
+ "adapter.errCodebuddyAcpSpawn": "No se pudo iniciar CodeBuddy `--acp`: {message} (asegúrate de que CodeBuddy CLI admite `--acp`)",
378
+ "adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP no devolvió un id de sesión",
379
+ "adapter.codebuddySessionTitle": "Sesión de CodeBuddy",
380
+ "adapter.logElicitationNative": "Solicitud de selección/confirmación -> tarjeta del teléfono id={id} (sesión={session})",
381
+ "adapter.logCodebuddyAuthSkipped": "CodeBuddy no está autenticado por ACP; inicia sesión una vez con `codebuddy` (o define CODEBUDDY_API_KEY), o define TUNNELBOX_CODEBUDDY_AUTH=<methodId> para autenticarte por ACP",
382
+ "adapter.warnKimiCliMissing": "No se encontró el ejecutable de Kimi CLI \"{bin}\"; instálalo (https://moonshotai.github.io/kimi-code/) o define TUNNELBOX_KIMI_BIN con su ruta",
383
+ "adapter.checkKimiHeader": "Comprobación de entorno de tunnelbox-kimi",
384
+ "adapter.checkKimiCliMissing": "No se encontró el ejecutable de Kimi CLI ({bin}); instálalo desde https://moonshotai.github.io/kimi-code/",
385
+ "adapter.checkKimiAcpHint": "Kimi CLI detectado; el modo ACP (`kimi acp`) proporcionará streaming/aprobación/selección",
386
+ "adapter.errKimiAcpSpawn": "No se pudo iniciar Kimi `acp`: {message} (asegúrate de que Kimi CLI admite `kimi acp`)",
387
+ "adapter.errKimiAcpNoSession": "Kimi ACP no devolvió un id de sesión",
388
+ "adapter.kimiSessionTitle": "Sesión de Kimi",
389
+ "adapter.logKimiAuthRequired": "Kimi no ha iniciado sesión: ejecuta `kimi` una vez y envía /login (o configura una clave API) — {message}",
390
+ "adapter.warnTraeCliMissing": "No se encontró el ejecutable de TraeCode CLI \"{bin}\"; instálalo (https://docs.trae.cn/cli_what-is-trae-cli) o define TUNNELBOX_TRAE_BIN con su ruta",
391
+ "adapter.checkTraeHeader": "Comprobación de entorno de tunnelbox-trae",
392
+ "adapter.checkTraeCliMissing": "No se encontró el ejecutable de TraeCode CLI ({bin}); instálalo desde https://docs.trae.cn/cli_what-is-trae-cli",
393
+ "adapter.checkTraeAcpHint": "TraeCode CLI detectado; el modo ACP (`traecli acp serve`) proporcionará streaming/aprobación/selección",
394
+ "adapter.errTraeAcpSpawn": "No se pudo iniciar TraeCode `acp serve`: {message} (asegúrate de que TraeCode CLI admite ACP)",
395
+ "adapter.errTraeAcpNoSession": "TraeCode ACP no devolvió un id de sesión",
396
+ "adapter.traeSessionTitle": "Sesión de Trae",
397
+ "adapter.logTraeAuthSkipped": "Se omitió la autenticación ACP de TraeCode; inicia sesión con `traecli login` (TraeCode CLI requiere un plan TRAE Enterprise Flagship)",
398
+ "adapter.warnQoderCliMissing": "No se encontró el ejecutable de Qoder CLI \"{bin}\"; instálalo (npm i -g @qoder-ai/qodercli) o define TUNNELBOX_QODER_BIN con su ruta",
399
+ "adapter.checkQoderHeader": "Comprobación de entorno de tunnelbox-qoder",
400
+ "adapter.checkQoderCliMissing": "No se encontró el ejecutable de Qoder CLI ({bin}); instálalo con: npm i -g @qoder-ai/qodercli",
401
+ "adapter.checkQoderAcpHint": "Qoder CLI detectado; el modo ACP (`qoder --acp`) proporcionará streaming/aprobación/selección",
402
+ "adapter.errQoderAcpSpawn": "No se pudo iniciar Qoder `--acp`: {message} (asegúrate de que Qoder CLI admite `--acp`)",
403
+ "adapter.errQoderAcpNoSession": "Qoder ACP no devolvió un id de sesión",
404
+ "adapter.qoderSessionTitle": "Sesión de Qoder",
405
+ "adapter.logQoderAuthSkipped": "Se omitió la autenticación ACP de Qoder; inicia sesión con `qoder login` o define QODER_PERSONAL_ACCESS_TOKEN"
373
406
  }
@@ -369,5 +369,38 @@
369
369
  "hermes.logRegisterAskFailed": "tunnelbox : échec d'enregistrement de tunnelbox_ask : {err}",
370
370
  "hermes.logRegisterSystemPromptFailed": "tunnelbox : échec d'enregistrement de la section du prompt système : {err}",
371
371
  "hermes.logBackgroundBridgeFailed": "tunnelbox : échec du démarrage du pont en arrière-plan : {err}",
372
- "hermes.systemPromptAsk": "Lorsque vous avez besoin d'une décision, d'une clarification ou d'un choix de l'utilisateur et qu'un téléphone tunnelbox est associé, utilisez l'outil `tunnelbox_ask` pour poser la question sur son téléphone au lieu de deviner. Attendez sa réponse avant de continuer."
372
+ "hermes.systemPromptAsk": "Lorsque vous avez besoin d'une décision, d'une clarification ou d'un choix de l'utilisateur et qu'un téléphone tunnelbox est associé, utilisez l'outil `tunnelbox_ask` pour poser la question sur son téléphone au lieu de deviner. Attendez sa réponse avant de continuer.",
373
+ "adapter.warnCodebuddyCliMissing": "Exécutable CodeBuddy CLI \"{bin}\" introuvable ; installez-le (npm i -g @tencent-ai/codebuddy-code) ou définissez TUNNELBOX_CODEBUDDY_BIN sur son chemin",
374
+ "adapter.checkCodebuddyHeader": "Vérification de l'environnement tunnelbox-codebuddy",
375
+ "adapter.checkCodebuddyCliMissing": "Exécutable CodeBuddy CLI introuvable ({bin}) ; installez-le avec : npm i -g @tencent-ai/codebuddy-code",
376
+ "adapter.checkCodebuddyAcpHint": "CodeBuddy CLI détecté ; le mode ACP (`codebuddy --acp`) fournira le streaming/l'approbation/la sélection",
377
+ "adapter.errCodebuddyAcpSpawn": "Échec du démarrage de CodeBuddy `--acp` : {message} (vérifiez que le CodeBuddy CLI prend en charge `--acp`)",
378
+ "adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP n'a pas renvoyé d'id de session",
379
+ "adapter.codebuddySessionTitle": "Session CodeBuddy",
380
+ "adapter.logElicitationNative": "Demande de sélection/confirmation -> carte téléphone id={id} (session={session})",
381
+ "adapter.logCodebuddyAuthSkipped": "CodeBuddy n'est pas authentifié via ACP ; connectez-vous une fois avec `codebuddy` (ou définissez CODEBUDDY_API_KEY), ou définissez TUNNELBOX_CODEBUDDY_AUTH=<methodId> pour vous authentifier via ACP",
382
+ "adapter.warnKimiCliMissing": "Exécutable Kimi CLI \"{bin}\" introuvable ; installez-le (https://moonshotai.github.io/kimi-code/) ou définissez TUNNELBOX_KIMI_BIN sur son chemin",
383
+ "adapter.checkKimiHeader": "Vérification de l'environnement tunnelbox-kimi",
384
+ "adapter.checkKimiCliMissing": "Exécutable Kimi CLI introuvable ({bin}) ; installez-le depuis https://moonshotai.github.io/kimi-code/",
385
+ "adapter.checkKimiAcpHint": "Kimi CLI détecté ; le mode ACP (`kimi acp`) fournira le streaming/l'approbation/la sélection",
386
+ "adapter.errKimiAcpSpawn": "Échec du démarrage de Kimi `acp` : {message} (vérifiez que le Kimi CLI prend en charge `kimi acp`)",
387
+ "adapter.errKimiAcpNoSession": "Kimi ACP n'a pas renvoyé d'id de session",
388
+ "adapter.kimiSessionTitle": "Session Kimi",
389
+ "adapter.logKimiAuthRequired": "Kimi n'est pas connecté : exécutez `kimi` une fois et envoyez /login (ou configurez une clé API) — {message}",
390
+ "adapter.warnTraeCliMissing": "Exécutable TraeCode CLI \"{bin}\" introuvable ; installez-le (https://docs.trae.cn/cli_what-is-trae-cli) ou définissez TUNNELBOX_TRAE_BIN sur son chemin",
391
+ "adapter.checkTraeHeader": "Vérification de l'environnement tunnelbox-trae",
392
+ "adapter.checkTraeCliMissing": "Exécutable TraeCode CLI introuvable ({bin}) ; installez-le depuis https://docs.trae.cn/cli_what-is-trae-cli",
393
+ "adapter.checkTraeAcpHint": "TraeCode CLI détecté ; le mode ACP (`traecli acp serve`) fournira le streaming/l'approbation/la sélection",
394
+ "adapter.errTraeAcpSpawn": "Échec du démarrage de TraeCode `acp serve` : {message} (vérifiez que le TraeCode CLI prend en charge ACP)",
395
+ "adapter.errTraeAcpNoSession": "TraeCode ACP n'a pas renvoyé d'id de session",
396
+ "adapter.traeSessionTitle": "Session Trae",
397
+ "adapter.logTraeAuthSkipped": "Authentification ACP TraeCode ignorée ; connectez-vous avec `traecli login` (TraeCode CLI nécessite un forfait TRAE Enterprise Flagship)",
398
+ "adapter.warnQoderCliMissing": "Exécutable Qoder CLI \"{bin}\" introuvable ; installez-le (npm i -g @qoder-ai/qodercli) ou définissez TUNNELBOX_QODER_BIN sur son chemin",
399
+ "adapter.checkQoderHeader": "Vérification de l'environnement tunnelbox-qoder",
400
+ "adapter.checkQoderCliMissing": "Exécutable Qoder CLI introuvable ({bin}) ; installez-le avec : npm i -g @qoder-ai/qodercli",
401
+ "adapter.checkQoderAcpHint": "Qoder CLI détecté ; le mode ACP (`qoder --acp`) fournira le streaming/l'approbation/la sélection",
402
+ "adapter.errQoderAcpSpawn": "Échec du démarrage de Qoder `--acp` : {message} (vérifiez que le Qoder CLI prend en charge `--acp`)",
403
+ "adapter.errQoderAcpNoSession": "Qoder ACP n'a pas renvoyé d'id de session",
404
+ "adapter.qoderSessionTitle": "Session Qoder",
405
+ "adapter.logQoderAuthSkipped": "Authentification ACP Qoder ignorée ; connectez-vous avec `qoder login` ou définissez QODER_PERSONAL_ACCESS_TOKEN"
373
406
  }
@@ -369,5 +369,38 @@
369
369
  "hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask の登録に失敗: {err}",
370
370
  "hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt セクションの登録に失敗: {err}",
371
371
  "hermes.logBackgroundBridgeFailed": "tunnelbox: バックグラウンドブリッジの起動に失敗: {err}",
372
- "hermes.systemPromptAsk": "ユーザーに決定/確認/選択を求める必要があり、tunnelbox スマホが接続されている場合は、推測せず `tunnelbox_ask` ツールでスマホに質問してください。回答があるまで待ってから続行します。"
372
+ "hermes.systemPromptAsk": "ユーザーに決定/確認/選択を求める必要があり、tunnelbox スマホが接続されている場合は、推測せず `tunnelbox_ask` ツールでスマホに質問してください。回答があるまで待ってから続行します。",
373
+ "adapter.warnCodebuddyCliMissing": "CodeBuddy CLI の実行ファイル \"{bin}\" が見つかりません。インストールする(npm i -g @tencent-ai/codebuddy-code)か、TUNNELBOX_CODEBUDDY_BIN にパスを設定してください",
374
+ "adapter.checkCodebuddyHeader": "tunnelbox-codebuddy 環境チェック",
375
+ "adapter.checkCodebuddyCliMissing": "CodeBuddy CLI の実行ファイルが見つかりません({bin})。次でインストールしてください: npm i -g @tencent-ai/codebuddy-code",
376
+ "adapter.checkCodebuddyAcpHint": "CodeBuddy CLI を検出しました。ACP モード(`codebuddy --acp`)でストリーミング/承認/選択が利用できます",
377
+ "adapter.errCodebuddyAcpSpawn": "CodeBuddy `--acp` の起動に失敗しました: {message}(CodeBuddy CLI が `--acp` に対応しているか確認してください)",
378
+ "adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP がセッション id を返しませんでした",
379
+ "adapter.codebuddySessionTitle": "CodeBuddy セッション",
380
+ "adapter.logElicitationNative": "選択/確認リクエスト -> スマホのカード id={id}(セッション={session})",
381
+ "adapter.logCodebuddyAuthSkipped": "CodeBuddy は ACP で認証されていません。一度 `codebuddy` でログインする(または CODEBUDDY_API_KEY を設定する)か、TUNNELBOX_CODEBUDDY_AUTH=<methodId> で ACP 認証を行ってください",
382
+ "adapter.warnKimiCliMissing": "Kimi CLI の実行ファイル \"{bin}\" が見つかりません。インストールする(https://moonshotai.github.io/kimi-code/)か、TUNNELBOX_KIMI_BIN にパスを設定してください",
383
+ "adapter.checkKimiHeader": "tunnelbox-kimi 環境チェック",
384
+ "adapter.checkKimiCliMissing": "Kimi CLI の実行ファイルが見つかりません({bin})。https://moonshotai.github.io/kimi-code/ からインストールしてください",
385
+ "adapter.checkKimiAcpHint": "Kimi CLI を検出しました。ACP モード(`kimi acp`)でストリーミング/承認/選択が利用できます",
386
+ "adapter.errKimiAcpSpawn": "Kimi `acp` の起動に失敗しました: {message}(Kimi CLI が `kimi acp` に対応しているか確認してください)",
387
+ "adapter.errKimiAcpNoSession": "Kimi ACP がセッション id を返しませんでした",
388
+ "adapter.kimiSessionTitle": "Kimi セッション",
389
+ "adapter.logKimiAuthRequired": "Kimi がログインしていません。一度 `kimi` を実行して /login を送信する(または API キーを設定する)してください — {message}",
390
+ "adapter.warnTraeCliMissing": "TraeCode CLI の実行ファイル \"{bin}\" が見つかりません。インストールする(https://docs.trae.cn/cli_what-is-trae-cli)か、TUNNELBOX_TRAE_BIN にパスを設定してください",
391
+ "adapter.checkTraeHeader": "tunnelbox-trae 環境チェック",
392
+ "adapter.checkTraeCliMissing": "TraeCode CLI の実行ファイルが見つかりません({bin})。https://docs.trae.cn/cli_what-is-trae-cli からインストールしてください",
393
+ "adapter.checkTraeAcpHint": "TraeCode CLI を検出しました。ACP モード(`traecli acp serve`)でストリーミング/承認/選択が利用できます",
394
+ "adapter.errTraeAcpSpawn": "TraeCode `acp serve` の起動に失敗しました: {message}(TraeCode CLI が ACP に対応しているか確認してください)",
395
+ "adapter.errTraeAcpNoSession": "TraeCode ACP がセッション id を返しませんでした",
396
+ "adapter.traeSessionTitle": "Trae セッション",
397
+ "adapter.logTraeAuthSkipped": "TraeCode ACP 認証をスキップしました。`traecli login` でログインしてください(TraeCode CLI は TRAE エンタープライズ最上位プラン限定)",
398
+ "adapter.warnQoderCliMissing": "Qoder CLI の実行ファイル \"{bin}\" が見つかりません。インストールする(npm i -g @qoder-ai/qodercli)か、TUNNELBOX_QODER_BIN にパスを設定してください",
399
+ "adapter.checkQoderHeader": "tunnelbox-qoder 環境チェック",
400
+ "adapter.checkQoderCliMissing": "Qoder CLI の実行ファイルが見つかりません({bin})。次でインストールしてください: npm i -g @qoder-ai/qodercli",
401
+ "adapter.checkQoderAcpHint": "Qoder CLI を検出しました。ACP モード(`qoder --acp`)でストリーミング/承認/選択が利用できます",
402
+ "adapter.errQoderAcpSpawn": "Qoder `--acp` の起動に失敗しました: {message}(Qoder CLI が `--acp` に対応しているか確認してください)",
403
+ "adapter.errQoderAcpNoSession": "Qoder ACP がセッション id を返しませんでした",
404
+ "adapter.qoderSessionTitle": "Qoder セッション",
405
+ "adapter.logQoderAuthSkipped": "Qoder ACP 認証をスキップしました。`qoder login` でログインするか、QODER_PERSONAL_ACCESS_TOKEN を設定してください"
373
406
  }
@@ -369,5 +369,38 @@
369
369
  "hermes.logRegisterAskFailed": "tunnelbox: tunnelbox_ask 등록 실패: {err}",
370
370
  "hermes.logRegisterSystemPromptFailed": "tunnelbox: system prompt 섹션 등록 실패: {err}",
371
371
  "hermes.logBackgroundBridgeFailed": "tunnelbox: 백그라운드 브리지 시작 실패: {err}",
372
- "hermes.systemPromptAsk": "사용자에게 결정/확인/선택이 필요하고 tunnelbox 휴대폰이 연결되어 있으면 추측하지 말고 `tunnelbox_ask` 도구로 휴대폰에서 질문하세요. 사용자가 답할 때까지 기다린 후 진행하세요."
372
+ "hermes.systemPromptAsk": "사용자에게 결정/확인/선택이 필요하고 tunnelbox 휴대폰이 연결되어 있으면 추측하지 말고 `tunnelbox_ask` 도구로 휴대폰에서 질문하세요. 사용자가 답할 때까지 기다린 후 진행하세요.",
373
+ "adapter.warnCodebuddyCliMissing": "CodeBuddy CLI 실행 파일 \"{bin}\"을(를) 찾을 수 없습니다. 설치하거나(npm i -g @tencent-ai/codebuddy-code) TUNNELBOX_CODEBUDDY_BIN에 경로를 설정하세요",
374
+ "adapter.checkCodebuddyHeader": "tunnelbox-codebuddy 환경 점검",
375
+ "adapter.checkCodebuddyCliMissing": "CodeBuddy CLI 실행 파일을 찾을 수 없습니다({bin}). 다음으로 설치하세요: npm i -g @tencent-ai/codebuddy-code",
376
+ "adapter.checkCodebuddyAcpHint": "CodeBuddy CLI를 감지했습니다. ACP 모드(`codebuddy --acp`)에서 스트리밍/승인/선택을 제공합니다",
377
+ "adapter.errCodebuddyAcpSpawn": "CodeBuddy `--acp` 시작 실패: {message} (CodeBuddy CLI가 `--acp`를 지원하는지 확인하세요)",
378
+ "adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP가 세션 id를 반환하지 않았습니다",
379
+ "adapter.codebuddySessionTitle": "CodeBuddy 세션",
380
+ "adapter.logElicitationNative": "선택/확인 요청 -> 휴대폰 카드 id={id} (세션={session})",
381
+ "adapter.logCodebuddyAuthSkipped": "CodeBuddy가 ACP로 인증되지 않았습니다. `codebuddy`로 한 번 로그인하거나 CODEBUDDY_API_KEY를 설정하세요. 또는 TUNNELBOX_CODEBUDDY_AUTH=<methodId>로 ACP 인증을 사용할 수 있습니다",
382
+ "adapter.warnKimiCliMissing": "Kimi CLI 실행 파일 \"{bin}\"을(를) 찾을 수 없습니다. 설치하거나(https://moonshotai.github.io/kimi-code/) TUNNELBOX_KIMI_BIN에 경로를 설정하세요",
383
+ "adapter.checkKimiHeader": "tunnelbox-kimi 환경 점검",
384
+ "adapter.checkKimiCliMissing": "Kimi CLI 실행 파일을 찾을 수 없습니다({bin}). https://moonshotai.github.io/kimi-code/ 에서 설치하세요",
385
+ "adapter.checkKimiAcpHint": "Kimi CLI를 감지했습니다. ACP 모드(`kimi acp`)에서 스트리밍/승인/선택을 제공합니다",
386
+ "adapter.errKimiAcpSpawn": "Kimi `acp` 시작 실패: {message} (Kimi CLI가 `kimi acp`를 지원하는지 확인하세요)",
387
+ "adapter.errKimiAcpNoSession": "Kimi ACP가 세션 id를 반환하지 않았습니다",
388
+ "adapter.kimiSessionTitle": "Kimi 세션",
389
+ "adapter.logKimiAuthRequired": "Kimi에 로그인되어 있지 않습니다. `kimi`를 한 번 실행해 /login을 보내거나 API 키를 설정하세요 — {message}",
390
+ "adapter.warnTraeCliMissing": "TraeCode CLI 실행 파일 \"{bin}\"을(를) 찾을 수 없습니다. 설치하거나(https://docs.trae.cn/cli_what-is-trae-cli) TUNNELBOX_TRAE_BIN에 경로를 설정하세요",
391
+ "adapter.checkTraeHeader": "tunnelbox-trae 환경 점검",
392
+ "adapter.checkTraeCliMissing": "TraeCode CLI 실행 파일을 찾을 수 없습니다({bin}). https://docs.trae.cn/cli_what-is-trae-cli 에서 설치하세요",
393
+ "adapter.checkTraeAcpHint": "TraeCode CLI를 감지했습니다. ACP 모드(`traecli acp serve`)에서 스트리밍/승인/선택을 제공합니다",
394
+ "adapter.errTraeAcpSpawn": "TraeCode `acp serve` 시작 실패: {message} (TraeCode CLI가 ACP를 지원하는지 확인하세요)",
395
+ "adapter.errTraeAcpNoSession": "TraeCode ACP가 세션 id를 반환하지 않았습니다",
396
+ "adapter.traeSessionTitle": "Trae 세션",
397
+ "adapter.logTraeAuthSkipped": "TraeCode ACP 인증을 건너뛰었습니다. `traecli login`으로 로그인하세요 (TraeCode CLI는 TRAE 엔터프라이즈 플래그십 플랜 전용)",
398
+ "adapter.warnQoderCliMissing": "Qoder CLI 실행 파일 \"{bin}\"을(를) 찾을 수 없습니다. 설치하거나(npm i -g @qoder-ai/qodercli) TUNNELBOX_QODER_BIN에 경로를 설정하세요",
399
+ "adapter.checkQoderHeader": "tunnelbox-qoder 환경 점검",
400
+ "adapter.checkQoderCliMissing": "Qoder CLI 실행 파일을 찾을 수 없습니다({bin}). 다음으로 설치하세요: npm i -g @qoder-ai/qodercli",
401
+ "adapter.checkQoderAcpHint": "Qoder CLI를 감지했습니다. ACP 모드(`qoder --acp`)에서 스트리밍/승인/선택을 제공합니다",
402
+ "adapter.errQoderAcpSpawn": "Qoder `--acp` 시작 실패: {message} (Qoder CLI가 `--acp`를 지원하는지 확인하세요)",
403
+ "adapter.errQoderAcpNoSession": "Qoder ACP가 세션 id를 반환하지 않았습니다",
404
+ "adapter.qoderSessionTitle": "Qoder 세션",
405
+ "adapter.logQoderAuthSkipped": "Qoder ACP 인증을 건너뛰었습니다. `qoder login`으로 로그인하거나 QODER_PERSONAL_ACCESS_TOKEN을 설정하세요"
373
406
  }
@@ -369,5 +369,38 @@
369
369
  "hermes.logRegisterAskFailed": "tunnelbox: 注册 tunnelbox_ask 失败: {err}",
370
370
  "hermes.logRegisterSystemPromptFailed": "tunnelbox: 注册 system prompt 段失败: {err}",
371
371
  "hermes.logBackgroundBridgeFailed": "tunnelbox: 后台桥启动失败: {err}",
372
- "hermes.systemPromptAsk": "当你需要用户做决定/澄清/选择,且已连接 tunnelbox 手机时,请用 `tunnelbox_ask` 工具在手机上提问,而不是自行猜测;等到用户作答后再继续。"
372
+ "hermes.systemPromptAsk": "当你需要用户做决定/澄清/选择,且已连接 tunnelbox 手机时,请用 `tunnelbox_ask` 工具在手机上提问,而不是自行猜测;等到用户作答后再继续。",
373
+ "adapter.warnCodebuddyCliMissing": "找不到 CodeBuddy CLI 可执行文件 \"{bin}\";请安装(npm i -g @tencent-ai/codebuddy-code),或将 TUNNELBOX_CODEBUDDY_BIN 设为其路径",
374
+ "adapter.checkCodebuddyHeader": "tunnelbox-codebuddy 环境自检",
375
+ "adapter.checkCodebuddyCliMissing": "找不到 CodeBuddy CLI 可执行文件({bin});请安装:npm i -g @tencent-ai/codebuddy-code",
376
+ "adapter.checkCodebuddyAcpHint": "已检测到 CodeBuddy CLI;ACP 模式(`codebuddy --acp`)将提供流式/审批/选择",
377
+ "adapter.errCodebuddyAcpSpawn": "无法启动 CodeBuddy `--acp`:{message}(请确认 CodeBuddy CLI 支持 `--acp`)",
378
+ "adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP 未返回会话 id",
379
+ "adapter.codebuddySessionTitle": "CodeBuddy 会话",
380
+ "adapter.logElicitationNative": "选择/确认请求 -> 手机卡片 id={id}(会话={session})",
381
+ "adapter.logCodebuddyAuthSkipped": "CodeBuddy 尚未通过 ACP 认证;请先运行一次 `codebuddy` 登录(或设置 CODEBUDDY_API_KEY),也可设置 TUNNELBOX_CODEBUDDY_AUTH=<methodId> 走 ACP 认证",
382
+ "adapter.warnKimiCliMissing": "找不到 Kimi CLI 可执行文件 \"{bin}\";请安装(https://moonshotai.github.io/kimi-code/),或将 TUNNELBOX_KIMI_BIN 设为其路径",
383
+ "adapter.checkKimiHeader": "tunnelbox-kimi 环境自检",
384
+ "adapter.checkKimiCliMissing": "找不到 Kimi CLI 可执行文件({bin});请从 https://moonshotai.github.io/kimi-code/ 安装",
385
+ "adapter.checkKimiAcpHint": "已检测到 Kimi CLI;ACP 模式(`kimi acp`)将提供流式/审批/选择",
386
+ "adapter.errKimiAcpSpawn": "无法启动 Kimi `acp`:{message}(请确认 Kimi CLI 支持 `kimi acp`)",
387
+ "adapter.errKimiAcpNoSession": "Kimi ACP 未返回会话 id",
388
+ "adapter.kimiSessionTitle": "Kimi 会话",
389
+ "adapter.logKimiAuthRequired": "Kimi 未登录:请先运行一次 `kimi` 并发送 /login(或配置 API Key)—— {message}",
390
+ "adapter.warnTraeCliMissing": "找不到 TraeCode CLI 可执行文件 \"{bin}\";请安装(https://docs.trae.cn/cli_what-is-trae-cli),或将 TUNNELBOX_TRAE_BIN 设为其路径",
391
+ "adapter.checkTraeHeader": "tunnelbox-trae 环境自检",
392
+ "adapter.checkTraeCliMissing": "找不到 TraeCode CLI 可执行文件({bin});请从 https://docs.trae.cn/cli_what-is-trae-cli 安装",
393
+ "adapter.checkTraeAcpHint": "已检测到 TraeCode CLI;ACP 模式(`traecli acp serve`)将提供流式/审批/选择",
394
+ "adapter.errTraeAcpSpawn": "无法启动 TraeCode `acp serve`:{message}(请确认 TraeCode CLI 支持 ACP)",
395
+ "adapter.errTraeAcpNoSession": "TraeCode ACP 未返回会话 id",
396
+ "adapter.traeSessionTitle": "Trae 会话",
397
+ "adapter.logTraeAuthSkipped": "已跳过 TraeCode ACP 认证;请用 `traecli login` 登录(TraeCode CLI 仅 TRAE 企业版旗舰版可用)",
398
+ "adapter.warnQoderCliMissing": "找不到 Qoder CLI 可执行文件 \"{bin}\";请安装(npm i -g @qoder-ai/qodercli),或将 TUNNELBOX_QODER_BIN 设为其路径",
399
+ "adapter.checkQoderHeader": "tunnelbox-qoder 环境自检",
400
+ "adapter.checkQoderCliMissing": "找不到 Qoder CLI 可执行文件({bin});请安装:npm i -g @qoder-ai/qodercli",
401
+ "adapter.checkQoderAcpHint": "已检测到 Qoder CLI;ACP 模式(`qoder --acp`)将提供流式/审批/选择",
402
+ "adapter.errQoderAcpSpawn": "无法启动 Qoder `--acp`:{message}(请确认 Qoder CLI 支持 `--acp`)",
403
+ "adapter.errQoderAcpNoSession": "Qoder ACP 未返回会话 id",
404
+ "adapter.qoderSessionTitle": "Qoder 会话",
405
+ "adapter.logQoderAuthSkipped": "已跳过 Qoder ACP 认证;请用 `qoder login` 登录,或设置 QODER_PERSONAL_ACCESS_TOKEN"
373
406
  }
@@ -369,5 +369,38 @@
369
369
  "hermes.logRegisterAskFailed": "tunnelbox: 註冊 tunnelbox_ask 失敗: {err}",
370
370
  "hermes.logRegisterSystemPromptFailed": "tunnelbox: 註冊 system prompt 段失敗: {err}",
371
371
  "hermes.logBackgroundBridgeFailed": "tunnelbox: 背景橋啟動失敗: {err}",
372
- "hermes.systemPromptAsk": "當你需要使用者做決定/澄清/選擇,且已連接 tunnelbox 手機時,請用 `tunnelbox_ask` 工具在手機上提問,而不是自行猜測;等到使用者作答後再繼續。"
372
+ "hermes.systemPromptAsk": "當你需要使用者做決定/澄清/選擇,且已連接 tunnelbox 手機時,請用 `tunnelbox_ask` 工具在手機上提問,而不是自行猜測;等到使用者作答後再繼續。",
373
+ "adapter.warnCodebuddyCliMissing": "找不到 CodeBuddy CLI 可執行檔 \"{bin}\";請安裝(npm i -g @tencent-ai/codebuddy-code),或將 TUNNELBOX_CODEBUDDY_BIN 設為其路徑",
374
+ "adapter.checkCodebuddyHeader": "tunnelbox-codebuddy 環境自檢",
375
+ "adapter.checkCodebuddyCliMissing": "找不到 CodeBuddy CLI 可執行檔({bin});請安裝:npm i -g @tencent-ai/codebuddy-code",
376
+ "adapter.checkCodebuddyAcpHint": "已偵測到 CodeBuddy CLI;ACP 模式(`codebuddy --acp`)將提供串流/審批/選擇",
377
+ "adapter.errCodebuddyAcpSpawn": "無法啟動 CodeBuddy `--acp`:{message}(請確認 CodeBuddy CLI 支援 `--acp`)",
378
+ "adapter.errCodebuddyAcpNoSession": "CodeBuddy ACP 未回傳工作階段 id",
379
+ "adapter.codebuddySessionTitle": "CodeBuddy 工作階段",
380
+ "adapter.logElicitationNative": "選擇/確認請求 -> 手機卡片 id={id}(工作階段={session})",
381
+ "adapter.logCodebuddyAuthSkipped": "CodeBuddy 尚未透過 ACP 認證;請先執行一次 `codebuddy` 登入(或設定 CODEBUDDY_API_KEY),也可設定 TUNNELBOX_CODEBUDDY_AUTH=<methodId> 走 ACP 認證",
382
+ "adapter.warnKimiCliMissing": "找不到 Kimi CLI 可執行檔 \"{bin}\";請安裝(https://moonshotai.github.io/kimi-code/),或將 TUNNELBOX_KIMI_BIN 設為其路徑",
383
+ "adapter.checkKimiHeader": "tunnelbox-kimi 環境自檢",
384
+ "adapter.checkKimiCliMissing": "找不到 Kimi CLI 可執行檔({bin});請從 https://moonshotai.github.io/kimi-code/ 安裝",
385
+ "adapter.checkKimiAcpHint": "已偵測到 Kimi CLI;ACP 模式(`kimi acp`)將提供串流/審批/選擇",
386
+ "adapter.errKimiAcpSpawn": "無法啟動 Kimi `acp`:{message}(請確認 Kimi CLI 支援 `kimi acp`)",
387
+ "adapter.errKimiAcpNoSession": "Kimi ACP 未回傳工作階段 id",
388
+ "adapter.kimiSessionTitle": "Kimi 工作階段",
389
+ "adapter.logKimiAuthRequired": "Kimi 未登入:請先執行一次 `kimi` 並傳送 /login(或設定 API Key)—— {message}",
390
+ "adapter.warnTraeCliMissing": "找不到 TraeCode CLI 可執行檔 \"{bin}\";請安裝(https://docs.trae.cn/cli_what-is-trae-cli),或將 TUNNELBOX_TRAE_BIN 設為其路徑",
391
+ "adapter.checkTraeHeader": "tunnelbox-trae 環境自檢",
392
+ "adapter.checkTraeCliMissing": "找不到 TraeCode CLI 可執行檔({bin});請從 https://docs.trae.cn/cli_what-is-trae-cli 安裝",
393
+ "adapter.checkTraeAcpHint": "已偵測到 TraeCode CLI;ACP 模式(`traecli acp serve`)將提供串流/審批/選擇",
394
+ "adapter.errTraeAcpSpawn": "無法啟動 TraeCode `acp serve`:{message}(請確認 TraeCode CLI 支援 ACP)",
395
+ "adapter.errTraeAcpNoSession": "TraeCode ACP 未回傳工作階段 id",
396
+ "adapter.traeSessionTitle": "Trae 工作階段",
397
+ "adapter.logTraeAuthSkipped": "已略過 TraeCode ACP 認證;請用 `traecli login` 登入(TraeCode CLI 僅 TRAE 企業版旗艦版可用)",
398
+ "adapter.warnQoderCliMissing": "找不到 Qoder CLI 可執行檔 \"{bin}\";請安裝(npm i -g @qoder-ai/qodercli),或將 TUNNELBOX_QODER_BIN 設為其路徑",
399
+ "adapter.checkQoderHeader": "tunnelbox-qoder 環境自檢",
400
+ "adapter.checkQoderCliMissing": "找不到 Qoder CLI 可執行檔({bin});請安裝:npm i -g @qoder-ai/qodercli",
401
+ "adapter.checkQoderAcpHint": "已偵測到 Qoder CLI;ACP 模式(`qoder --acp`)將提供串流/審批/選擇",
402
+ "adapter.errQoderAcpSpawn": "無法啟動 Qoder `--acp`:{message}(請確認 Qoder CLI 支援 `--acp`)",
403
+ "adapter.errQoderAcpNoSession": "Qoder ACP 未回傳工作階段 id",
404
+ "adapter.qoderSessionTitle": "Qoder 工作階段",
405
+ "adapter.logQoderAuthSkipped": "已略過 Qoder ACP 認證;請用 `qoder login` 登入,或設定 QODER_PERSONAL_ACCESS_TOKEN"
373
406
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tunnelbox/core",
3
- "version": "0.1.26",
3
+ "version": "0.1.28",
4
4
  "description": "tunnelbox 共享核心:协议类型、中继客户端、状态持久化、二维码配对",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,187 @@
1
+ /**
2
+ * ACP 子进程的 stdio 客户端:JSON-RPC 2.0(NDJSON,每行一条消息)。
3
+ *
4
+ * 分发:
5
+ * - `method` + `id` → 服务端请求(需应答,交 `onServerRequest`)
6
+ * - `method`(无 id) → 通知(交 `onNotification`)
7
+ * - `id` + result/error → 我方请求的响应
8
+ */
9
+ import { spawn, type ChildProcess, type SpawnOptions } from "node:child_process";
10
+ import { cmdLineFor, resolveCliBinary } from "../cli";
11
+ import type { JsonRpcError, RequestId } from "./protocol";
12
+
13
+ export interface AcpHandlers {
14
+ onNotification?: (method: string, params: unknown) => void;
15
+ onServerRequest?: (id: RequestId, method: string, params: unknown) => void;
16
+ onStderr?: (line: string) => void;
17
+ onExit?: (code: number | null, signal: string | null) => void;
18
+ }
19
+
20
+ interface Pending {
21
+ resolve: (v: unknown) => void;
22
+ reject: (e: Error) => void;
23
+ timer: NodeJS.Timeout | null;
24
+ }
25
+
26
+ const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
27
+
28
+ export class AcpClient {
29
+ private child: ChildProcess | null = null;
30
+ private buf = "";
31
+ private seq = 0;
32
+ private pending = new Map<RequestId, Pending>();
33
+ private exited = false;
34
+
35
+ constructor(
36
+ private bin: string,
37
+ private args: string[] = [],
38
+ private handlers: AcpHandlers = {},
39
+ private label = "acp",
40
+ ) {}
41
+
42
+ get alive(): boolean {
43
+ return !!this.child && !this.exited;
44
+ }
45
+
46
+ /** 启动 ACP 子进程(stdio 传输)。 */
47
+ start(cwd?: string): Promise<void> {
48
+ return new Promise<void>((resolve, reject) => {
49
+ const resolved = resolveCliBinary(this.bin);
50
+ const opts: SpawnOptions = { cwd, env: process.env, stdio: ["pipe", "pipe", "pipe"] };
51
+ let child: ChildProcess;
52
+ try {
53
+ child = resolved?.viaShell
54
+ ? spawn(cmdLineFor(resolved.path, this.args), [], { ...opts, shell: true })
55
+ : spawn(resolved?.path ?? this.bin, this.args, opts);
56
+ } catch (e) {
57
+ reject(e as Error);
58
+ return;
59
+ }
60
+ this.child = child;
61
+ this.exited = false;
62
+
63
+ child.stdout?.setEncoding("utf8");
64
+ child.stdout?.on("data", (chunk: string) => this.onChunk(chunk));
65
+ child.stderr?.setEncoding("utf8");
66
+ child.stderr?.on("data", (chunk: string) => {
67
+ for (const l of chunk.split("\n")) {
68
+ const s = l.trim();
69
+ if (s) this.handlers.onStderr?.(s);
70
+ }
71
+ });
72
+ child.on("error", (e) => {
73
+ this.failAll(e as Error);
74
+ reject(e as Error);
75
+ });
76
+ child.on("close", (code, signal) => {
77
+ this.exited = true;
78
+ this.child = null;
79
+ this.failAll(new Error(`${this.label} exited (code=${code ?? "null"} signal=${signal ?? "null"})`));
80
+ this.handlers.onExit?.(code, signal);
81
+ });
82
+ resolve();
83
+ });
84
+ }
85
+
86
+ /**
87
+ * 发送请求并等待响应。`timeoutMs <= 0` 表示不设超时(如 `session/prompt` 持续整轮)。
88
+ */
89
+ request<T = unknown>(method: string, params?: unknown, timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS): Promise<T> {
90
+ if (!this.alive) return Promise.reject(new Error(`${this.label} not running`));
91
+ const id = ++this.seq;
92
+ return new Promise<T>((resolve, reject) => {
93
+ const timer =
94
+ timeoutMs > 0
95
+ ? setTimeout(() => {
96
+ this.pending.delete(id);
97
+ reject(new Error(`${this.label} request timeout: ${method}`));
98
+ }, timeoutMs)
99
+ : null;
100
+ this.pending.set(id, { resolve: resolve as (v: unknown) => void, reject, timer });
101
+ this.write({ jsonrpc: "2.0", id, method, ...(params === undefined ? {} : { params }) });
102
+ });
103
+ }
104
+
105
+ /** 应答服务端请求(成功)。 */
106
+ respond(id: RequestId, result: unknown): void {
107
+ this.write({ jsonrpc: "2.0", id, result });
108
+ }
109
+
110
+ /** 应答服务端请求(失败)。 */
111
+ respondError(id: RequestId, code: number, message: string): void {
112
+ this.write({ jsonrpc: "2.0", id, error: { code, message } });
113
+ }
114
+
115
+ /** 发送通知。 */
116
+ notify(method: string, params?: unknown): void {
117
+ this.write({ jsonrpc: "2.0", method, ...(params === undefined ? {} : { params }) });
118
+ }
119
+
120
+ stop(): void {
121
+ this.exited = true;
122
+ this.failAll(new Error(`${this.label} client stopped`));
123
+ try {
124
+ this.child?.kill();
125
+ } catch {
126
+ /* ignore */
127
+ }
128
+ this.child = null;
129
+ }
130
+
131
+ private write(obj: unknown): void {
132
+ try {
133
+ this.child?.stdin?.write(JSON.stringify(obj) + "\n");
134
+ } catch {
135
+ /* ignore */
136
+ }
137
+ }
138
+
139
+ private onChunk(chunk: string): void {
140
+ this.buf += chunk;
141
+ let idx: number;
142
+ while ((idx = this.buf.indexOf("\n")) >= 0) {
143
+ const line = this.buf.slice(0, idx).trim();
144
+ this.buf = this.buf.slice(idx + 1);
145
+ if (line) this.onLine(line);
146
+ }
147
+ }
148
+
149
+ private onLine(line: string): void {
150
+ let msg: Record<string, unknown>;
151
+ try {
152
+ msg = JSON.parse(line) as Record<string, unknown>;
153
+ } catch {
154
+ this.handlers.onStderr?.(`non-json line: ${line.slice(0, 200)}`);
155
+ return;
156
+ }
157
+ const method = typeof msg.method === "string" ? msg.method : "";
158
+ const id = msg.id as RequestId | undefined;
159
+ if (method && id !== undefined) {
160
+ this.handlers.onServerRequest?.(id, method, msg.params);
161
+ return;
162
+ }
163
+ if (method) {
164
+ this.handlers.onNotification?.(method, msg.params);
165
+ return;
166
+ }
167
+ if (id === undefined) return;
168
+ const p = this.pending.get(id);
169
+ if (!p) return;
170
+ this.pending.delete(id);
171
+ if (p.timer) clearTimeout(p.timer);
172
+ if (msg.error) {
173
+ const err = msg.error as JsonRpcError["error"];
174
+ p.reject(new Error(`${err?.message || `${this.label} error`}${err?.code !== undefined ? ` (${err.code})` : ""}`));
175
+ } else {
176
+ p.resolve(msg.result);
177
+ }
178
+ }
179
+
180
+ private failAll(e: Error): void {
181
+ for (const p of this.pending.values()) {
182
+ if (p.timer) clearTimeout(p.timer);
183
+ p.reject(e);
184
+ }
185
+ this.pending.clear();
186
+ }
187
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @tunnelbox/core —— ACP(Agent Client Protocol)共享层。
3
+ * 供各 ACP 适配器(cursor/codebuddy/kimi/trae…)复用:协议类型、stdio 客户端、
4
+ * 常驻进程监督器、session/update 映射、权限选择辅助、会话镜像工厂。
5
+ */
6
+ export * from "./protocol";
7
+ export * from "./client";
8
+ export * from "./map";
9
+ export * from "./supervisor";
10
+ export * from "./permissions";
11
+ export * from "./mirror";
package/src/acp/map.ts ADDED
@@ -0,0 +1,45 @@
1
+ /**
2
+ * ACP `session/update` → tunnelbox 协议(`Part` / `ChatMessage`)的映射辅助。
3
+ */
4
+ import type { ChatMessage, Part } from "../types";
5
+ import type { ContentBlock, PlanEntry, ToolCall } from "./protocol";
6
+
7
+ /** 取 content block 的文本(仅 text 块)。 */
8
+ export function textOf(content: ContentBlock | undefined): string {
9
+ if (content && typeof content === "object" && (content as { type?: string }).type === "text") {
10
+ return String((content as { text?: unknown }).text ?? "");
11
+ }
12
+ return "";
13
+ }
14
+
15
+ export function safeJson(v: unknown): string {
16
+ if (v === undefined || v === null) return "";
17
+ try {
18
+ return typeof v === "string" ? v : JSON.stringify(v, null, 2);
19
+ } catch {
20
+ return String(v);
21
+ }
22
+ }
23
+
24
+ /** 工具调用 → `Part`(messageID/part.id 均用 toolCallId,保证同一工具卡的流式更新归并)。 */
25
+ export function toolPart(tc: ToolCall, complete: boolean): Part {
26
+ const name = tc.title || tc.kind || "tool";
27
+ return { id: tc.toolCallId, type: "tool", tool: name, args: safeJson(tc.rawInput), complete };
28
+ }
29
+
30
+ /** plan 条目 → 可读文本(用于 text 部件展示)。 */
31
+ export function planText(entries: PlanEntry[] | undefined): string {
32
+ if (!Array.isArray(entries)) return "";
33
+ return entries
34
+ .map((e) => {
35
+ const mark = e.status === "completed" ? "x" : e.status === "in_progress" ? "~" : " ";
36
+ return `- [${mark}] ${e.content ?? ""}`.trim();
37
+ })
38
+ .filter(Boolean)
39
+ .join("\n");
40
+ }
41
+
42
+ /** 由 ACP 会话事件拼出的历史消息(本地镜像兜底时用)。 */
43
+ export function partMessage(id: string, role: "user" | "assistant", part: Part, created = Date.now()): ChatMessage {
44
+ return { id, role, parts: [part], created };
45
+ }