@vibeapi/api-helper 0.0.99 → 0.0.101

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/README.md CHANGED
@@ -46,7 +46,7 @@ npx --yes --registry https://npm.cnb.cool/vibeapi/npm/-/packages/ @vibeapi/cli@l
46
46
  vibecli setup --key sk-xxx
47
47
  ```
48
48
 
49
- `--key` 会按令牌能访问的模型分组自动配置:有 Claude 模型配 Claude Code(机器上装了 Claude Desktop 也一并配好)、有 GPT 模型配 Codex、有 Grok 模型配 Grok Build、有 Gemini 模型配 Antigravity CLI(`agy`)。没装的工具也会先写好配置,并给出安装命令(Claude Desktop 除外,要先装好)。拿到的是多个分组的令牌(如 Claude 分组 + GPT 分组 + Grok 分组),就各配各的:
49
+ `--key` 会按令牌能访问的模型分组自动配置:有 Claude 模型配 Claude Code 和 Claude Desktop(macOS / Windows;桌面端没装也先写好,装好打开就能用)、有 GPT 模型配 Codex、有 Grok 模型配 Grok Build、有 Gemini 模型配 Antigravity CLI(`agy`)。没装的命令行工具也会先写好配置,再问要不要从国内镜像装上(`--install` 直接装)。拿到的是多个分组的令牌(如 Claude 分组 + GPT 分组 + Grok 分组),就各配各的:
50
50
 
51
51
  ```bash
52
52
  vibecli setup --claudekey sk-a --codexkey sk-b --grokkey sk-c --desktopkey sk-d
@@ -9,8 +9,8 @@
9
9
  * vibecli setup --claudekey sk-a --codexkey sk-b --grokkey sk-c --desktopkey sk-d
10
10
  * 多令牌各配各的(如 Claude 分组 + GPT 分组 + Grok 分组),各自校验 + 能力核对,
11
11
  * 明文存入 config.yaml 的工具专属 Key。只给其中一个旗标就只配对应工具。
12
- * `--desktopkey` 配 Claude Desktop(桌面端 3p 模式);`--key` 只在检测到已安装
13
- * Claude Desktop 时才顺带配置它,不给没装桌面端的机器留下无主文件。
12
+ * `--desktopkey` 配 Claude Desktop(桌面端 3p 模式);`--key` 在 macOS / Windows 上一律顺带配置它,
13
+ * 没装也先写好(用户 2026-10-18 定),Linux 没有 Claude Desktop 不配。
14
14
  *
15
15
  * vibecli setup --1m
16
16
  * 复用当前 profile 已保存的 Codex Key,开启 1M 上下文并重新应用配置。
@@ -1 +1 @@
1
- import o from"chalk";import{getAdapter as e}from"../lib/tools/registry.js";import{postApplyPrompts as t}from"../lib/post-apply.js";import{ensureReachableGatewayAddress as i}from"./base.js";import{i18n as s}from"../lib/i18n.js";import{configManager as l}from"../lib/config.js";import{toolManager as a,SUPPORTED_TOOLS as n}from"../lib/tool-manager.js";import{validateApiKey as r,fetchModels as p}from"../lib/api-validator.js";import{CODEX_ONE_MILLION_CONTEXT_SETTING as d,setCodexOneMillionContext as c}from"../lib/tools/codex.js";import{resolveModelCatalog as u}from"../lib/model-catalog.js";import{CLAUDE_DESKTOP_FORCE_REGISTRY_SETTING as m,CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING as f}from"../lib/tools/claude-desktop.js";import{operationError as g,authenticationError as y,networkError as k,EXIT_CODES as _}from"../lib/errors.js";import{isJsonMode as h,isNonInteractive as b,shouldAutoConfirm as w}from"../lib/runtime-options.js";import v from"inquirer";import{logger as x}from"../utils/logger.js";import{forgetInstalls as C}from"../lib/tools/tool-installs.js";import{CLI_NAME as T,brandEnv as j}from"../lib/brand.js";export const DEDICATED_KEYS=[{option:"claudekey",tool:"claude-code",need:"claude"},{option:"codexkey",tool:"codex",need:"gpt"},{option:"grokkey",tool:"grok",need:"grok"},{option:"desktopkey",tool:"claude-desktop",need:"claude"},{option:"agykey",tool:"agy",need:"gemini"},{option:"openclawkey",tool:"openclaw",need:"any",hidden:!0},{option:"hermeskey",tool:"hermes",need:"any",hidden:!0},{option:"atomcodekey",tool:"atomcode",need:"any",hidden:!0}];async function K(o){const e=await p(o);if(!e.ok)return{hasClaude:!0,hasGpt:!0,hasGrok:!0,hasGemini:!0,probed:!1};const t=e.models.map(o=>o.toLowerCase());return{hasClaude:t.some(o=>o.includes("claude")),hasGpt:t.some(o=>o.startsWith("gpt")||o.includes("gpt-")||/^o\d/.test(o)),hasGrok:t.some(o=>o.includes("grok")),hasGemini:t.some(o=>o.startsWith("gemini")),probed:!0}}function $(o,e){switch(e){case"claude":return o.hasClaude;case"gpt":return o.hasGpt;case"grok":return o.hasGrok;case"gemini":return o.hasGemini;default:return!0}}export function parseOnOff(o){const e=(o??"").trim().toLowerCase();return!!["on","true","show","1","yes","y"].includes(e)||!["off","false","hide","0","no","n"].includes(e)&&void 0}function G(e){console.log(o.green(e))}function M(e){console.log(o.yellow(e))}function S(e){console.error(o.red(e))}let N=null;function E(o){const e={operation:1,authentication:2,network:3};(!N||e[o]>e[N])&&(N=o)}async function A(e,t){h()||console.log(o.gray(s.t("setup.validating",{label:e})));const i=await r(t);if(i.valid)return!0;const a="zh_CN"===s.getLocale()?"<你的 Key>":"<your key>",n="--key"===e?`${T} setup --key ${a}`:`${T} setup ${e} ${a}`;let p;if("network_error"===i.error?(E("network"),p=k(s.t("setup.unreachable",{url:l.getBaseUrl(),reason:i.message||"network error"}),`${T} base auto`,"network_error")):"invalid_api_key"===i.error?(E("authentication"),p=y(s.t("setup.invalid_key",{label:e,reason:i.message||"invalid"}),n,"invalid_api_key")):(E("operation"),p=g(s.t("setup.invalid_key",{label:e,reason:i.message||i.error||"unknown"}),n,i.error)),h())throw p;return S(p.message),console.log(o.gray(s.t("errors.next_step",{command:p.hint}))),!1}async function I(t,i,r={}){const{oneMillion:p,officialLogin:c,desktopRegistry:u,force:y}=r,k=n[t];try{"claude-desktop"===t&&void 0!==u&&l.setToolSetting("claude-desktop",m,u),"codex"===t&&void 0!==p&&l.setToolSetting("codex",d,p),"claude-desktop"===t&&void 0!==c&&l.setToolSetting("claude-desktop",f,!c),await a.applyPrivateConfig(t,i,l.getModelsForTool(t),{force:y})}catch(o){if(h())throw g(o instanceof Error?o.message:String(o),`${T} setup --key ${"zh_CN"===s.getLocale()?"<你的 Key>":"<your key>"}`,"config_write_failed");const e=(o instanceof Error?o.message:String(o)).replace(/\s+/g," ").trim();return S("× "+s.t("setup.apply_failed",{tool:k.displayName,reason:e})),!1}return a.printApplied(t),y&&console.log(o.gray(" "+s.t("config.force_done",{tool:k.displayName}))),"codex"===t&&void 0!==p&&console.log(o.gray(" "+s.t(p?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))),e(t)?.isInstalled&&!a.isToolInstalled(t)&&console.log(o.yellow(" ! "+s.t("setup.install_hint",{tool:k.displayName,install:k.installCommand}))),!0}export async function setupCommand(r){N=null;const p=r.key?.trim(),m=DEDICATED_KEYS.map(o=>({...o,apiKey:r[o.option]?.trim()})).filter(o=>Boolean(o.apiKey)),f=void 0!==r.oneMillion,g=void 0!==r.claudeOfficial;let y;if(g&&(y=parseOnOff(r.claudeOfficial),void 0===y))return S(s.t("setup.claude_official_invalid",{value:String(r.claudeOfficial)})),void(process.exitCode=1);const k=void 0!==r.desktopRegistry;let E;if(k&&(E=parseOnOff(r.desktopRegistry),void 0===E))return S(s.t("setup.desktop_registry_invalid",{value:String(r.desktopRegistry)})),void(process.exitCode=1);const O=g||k,L=Boolean(p||m.length>0),D={oneMillion:r.oneMillion,officialLogin:y,desktopRegistry:E,force:r.force};if(!L&&(f||O)){if(f){const o=l.getApiKeyForTool("codex");if(o)try{const e=!0===r.oneMillion;l.setToolSetting("codex",d,e);const t=await u(o);c(e,t??void 0),G(s.t(e?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))}catch(o){S(s.t("setup.apply_failed",{tool:n.codex.displayName,reason:o instanceof Error?o.message:String(o)})),process.exitCode=1}else S(s.t("setup.codex_1m_missing_key")),process.exitCode=1}if(O){const o=l.getApiKeyForTool("claude-desktop");o?await I("claude-desktop",o,{...D,oneMillion:void 0})?await t(["claude-desktop"]):process.exitCode=1:(S(s.t("setup.desktop_official_login_missing_key")),process.exitCode=1)}return}if(!L)return S(s.t("setup.usage")),void(process.exitCode=1);await i(p||m[0].apiKey);let R=0,B=0;const F=new Set,Y=m.map(o=>({tool:o.tool,label:`--${o.option}`,apiKey:o.apiKey,need:o.need}));for(const o of Y){if(!await A(o.label,o.apiKey)){B+=1;continue}const e=await K(o.apiKey);!e.probed||$(e,o.need)?(e.probed||M(s.t("setup.probe_failed",{label:o.label})),l.setToolApiKey(o.tool,o.apiKey),await I(o.tool,o.apiKey,D)?(R+=1,F.add(o.tool)):B+=1):(S(s.t(`setup.key_no_${o.need}`,{label:o.label,tool:n[o.tool].displayName})),B+=1)}if(p){if(!await A("--key",p))return void(process.exitCode=_[N??"operation"]);l.setApiKey(p);const o=await K(p);if(o.probed||M(s.t("setup.probe_failed",{label:"--key"})),o.probed&&!o.hasClaude&&!o.hasGpt&&!o.hasGrok&&!o.hasGemini)return S(s.t("setup.key_no_family")),void(process.exitCode=1);const e=[{tool:"claude-code",capable:o.hasClaude,skipMsg:s.t("setup.skip_no_claude")},{tool:"codex",capable:o.hasGpt,skipMsg:s.t("setup.skip_no_gpt")},{tool:"grok",capable:o.hasGrok,skipMsg:s.t("setup.skip_no_grok")},{tool:"claude-desktop",capable:o.hasClaude&&a.isToolInstalled("claude-desktop"),skipMsg:s.t("setup.skip_desktop_not_installed"),quiet:!o.hasClaude},{tool:"agy",capable:o.hasGemini,skipMsg:s.t("setup.skip_no_gemini")}];for(const o of e)F.has(o.tool)||(o.capable?await I(o.tool,p,D)?(R+=1,F.add(o.tool)):B+=1:o.quiet||M(o.skipMsg))}if(R>0){const t=await async function(t,i,r){const p=t.filter(o=>!e(o)?.isInstalled&&!a.isToolInstalled(o));if(0===p.length)return[];const d=p.map(o=>n[o].displayName).join(s.t("setup.list_separator"));let c=i;if(void 0!==c||h()||(w()?c=!b():process.stdin.isTTY&&(console.log(""),c=(await v.prompt([{type:"confirm",name:"go",message:s.t("setup.install_confirm",{tools:d}),default:!0}])).go)),!c){console.log("");for(const e of p)console.log(o.yellow("! "+s.t("setup.install_hint",{tool:n[e].displayName,install:n[e].installCommand})));return h()||console.log(o.gray(s.t("setup.install_all_hint",{cli:T}))),p}const u=[];for(const e of p){console.log(o.bold(`\n${n[e].displayName}`));try{await a.installTool(e)}catch(o){x.logError(`setup: install ${e}`,o)}C(),a.isToolInstalled(e)||u.push(e)}const m=p.filter(o=>!u.includes(o));m.length>0&&console.log("");for(const o of m){const e=l.getApiKeyForTool(o);e&&await I(o,e,{...r,oneMillion:void 0,force:void 0})}return u}([...F],r.install,D),i=[...F].filter(o=>!e(o)?.isInstalled&&!t.includes(o)),p=i.map(o=>n[o]?.command).filter(Boolean).join(" / "),d=s.t("setup.done",{count:String(R)});G("\n"+(p?`${d}${s.t("setup.done_commands",{commands:p})}`:d)),t.length>0&&M(s.t("setup.still_missing",{tools:t.map(o=>n[o].displayName).join(s.t("setup.list_separator"))}));const c=i.filter(o=>!a.isOnPath(o));if(c.length>0&&!h()&&"1"!==j("PATH_HINT_BY_CALLER")){const e=c.map(o=>n[o].command).join(" / ");console.log(o.yellow(" ! "+s.t("win32"===process.platform?"setup.path_reload_windows":"setup.path_reload",{commands:e})))}}B>0&&(S(s.t("setup.failed_summary",{count:String(B)})),h()||console.error(`${T} setup --key ${"zh_CN"===s.getLocale()?"<你的 Key>":"<your key>"}`)),await t([...F]),(B>0||0===R)&&(process.exitCode=_[N??"operation"])}
1
+ import o from"chalk";import{getAdapter as e}from"../lib/tools/registry.js";import{postApplyPrompts as t}from"../lib/post-apply.js";import{ensureReachableGatewayAddress as i}from"./base.js";import{i18n as s}from"../lib/i18n.js";import{configManager as l}from"../lib/config.js";import{toolManager as a,SUPPORTED_TOOLS as n}from"../lib/tool-manager.js";import{validateApiKey as r,fetchModels as p}from"../lib/api-validator.js";import{CODEX_ONE_MILLION_CONTEXT_SETTING as d,setCodexOneMillionContext as c}from"../lib/tools/codex.js";import{resolveModelCatalog as u}from"../lib/model-catalog.js";import{CLAUDE_DESKTOP_FORCE_REGISTRY_SETTING as m,CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING as f}from"../lib/tools/claude-desktop.js";import{operationError as g,authenticationError as y,networkError as k,EXIT_CODES as _}from"../lib/errors.js";import{isJsonMode as h,isNonInteractive as b,shouldAutoConfirm as w}from"../lib/runtime-options.js";import v from"inquirer";import{logger as x}from"../utils/logger.js";import{forgetInstalls as C}from"../lib/tools/tool-installs.js";import{CLI_NAME as j,brandEnv as K}from"../lib/brand.js";export const DEDICATED_KEYS=[{option:"claudekey",tool:"claude-code",need:"claude"},{option:"codexkey",tool:"codex",need:"gpt"},{option:"grokkey",tool:"grok",need:"grok"},{option:"desktopkey",tool:"claude-desktop",need:"claude"},{option:"agykey",tool:"agy",need:"gemini"},{option:"openclawkey",tool:"openclaw",need:"any",hidden:!0},{option:"hermeskey",tool:"hermes",need:"any",hidden:!0},{option:"atomcodekey",tool:"atomcode",need:"any",hidden:!0}];async function T(o){const e=await p(o);if(!e.ok)return{hasClaude:!0,hasGpt:!0,hasGrok:!0,hasGemini:!0,probed:!1};const t=e.models.map(o=>o.toLowerCase());return{hasClaude:t.some(o=>o.includes("claude")),hasGpt:t.some(o=>o.startsWith("gpt")||o.includes("gpt-")||/^o\d/.test(o)),hasGrok:t.some(o=>o.includes("grok")),hasGemini:t.some(o=>o.startsWith("gemini")),probed:!0}}function $(o,e){switch(e){case"claude":return o.hasClaude;case"gpt":return o.hasGpt;case"grok":return o.hasGrok;case"gemini":return o.hasGemini;default:return!0}}export function parseOnOff(o){const e=(o??"").trim().toLowerCase();return!!["on","true","show","1","yes","y"].includes(e)||!["off","false","hide","0","no","n"].includes(e)&&void 0}function G(e){console.log(o.green(e))}function M(e){console.log(o.yellow(e))}function S(e){console.error(o.red(e))}let N=null;function E(o){const e={operation:1,authentication:2,network:3};(!N||e[o]>e[N])&&(N=o)}async function A(e,t){h()||console.log(o.gray(s.t("setup.validating",{label:e})));const i=await r(t);if(i.valid)return!0;const a="zh_CN"===s.getLocale()?"<你的 Key>":"<your key>",n="--key"===e?`${j} setup --key ${a}`:`${j} setup ${e} ${a}`;let p;if("network_error"===i.error?(E("network"),p=k(s.t("setup.unreachable",{url:l.getBaseUrl(),reason:i.message||"network error"}),`${j} base auto`,"network_error")):"invalid_api_key"===i.error?(E("authentication"),p=y(s.t("setup.invalid_key",{label:e,reason:i.message||"invalid"}),n,"invalid_api_key")):(E("operation"),p=g(s.t("setup.invalid_key",{label:e,reason:i.message||i.error||"unknown"}),n,i.error)),h())throw p;return S(p.message),console.log(o.gray(s.t("errors.next_step",{command:p.hint}))),!1}async function O(t,i,r={}){const{oneMillion:p,officialLogin:c,desktopRegistry:u,force:y}=r,k=n[t];try{"claude-desktop"===t&&void 0!==u&&l.setToolSetting("claude-desktop",m,u),"codex"===t&&void 0!==p&&l.setToolSetting("codex",d,p),"claude-desktop"===t&&void 0!==c&&l.setToolSetting("claude-desktop",f,!c),await a.applyPrivateConfig(t,i,l.getModelsForTool(t),{force:y})}catch(o){if(h())throw g(o instanceof Error?o.message:String(o),`${j} setup --key ${"zh_CN"===s.getLocale()?"<你的 Key>":"<your key>"}`,"config_write_failed");const e=(o instanceof Error?o.message:String(o)).replace(/\s+/g," ").trim();return S("× "+s.t("setup.apply_failed",{tool:k.displayName,reason:e})),!1}return a.printApplied(t),y&&console.log(o.gray(" "+s.t("config.force_done",{tool:k.displayName}))),"codex"===t&&void 0!==p&&console.log(o.gray(" "+s.t(p?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))),e(t)?.isInstalled&&!a.isToolInstalled(t)&&console.log(o.yellow(" ! "+s.t("setup.gui_preconfigured",{tool:k.displayName,install:k.installCommand}))),!0}export async function setupCommand(r){N=null;const p=r.key?.trim(),m=DEDICATED_KEYS.map(o=>({...o,apiKey:r[o.option]?.trim()})).filter(o=>Boolean(o.apiKey)),f=void 0!==r.oneMillion,g=void 0!==r.claudeOfficial;let y;if(g&&(y=parseOnOff(r.claudeOfficial),void 0===y))return S(s.t("setup.claude_official_invalid",{value:String(r.claudeOfficial)})),void(process.exitCode=1);const k=void 0!==r.desktopRegistry;let E;if(k&&(E=parseOnOff(r.desktopRegistry),void 0===E))return S(s.t("setup.desktop_registry_invalid",{value:String(r.desktopRegistry)})),void(process.exitCode=1);const I=g||k,L=Boolean(p||m.length>0),D={oneMillion:r.oneMillion,officialLogin:y,desktopRegistry:E,force:r.force};if(!L&&(f||I)){if(f){const o=l.getApiKeyForTool("codex");if(o)try{const e=!0===r.oneMillion;l.setToolSetting("codex",d,e);const t=await u(o);c(e,t??void 0),G(s.t(e?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))}catch(o){S(s.t("setup.apply_failed",{tool:n.codex.displayName,reason:o instanceof Error?o.message:String(o)})),process.exitCode=1}else S(s.t("setup.codex_1m_missing_key")),process.exitCode=1}if(I){const o=l.getApiKeyForTool("claude-desktop");o?await O("claude-desktop",o,{...D,oneMillion:void 0})?await t(["claude-desktop"]):process.exitCode=1:(S(s.t("setup.desktop_official_login_missing_key")),process.exitCode=1)}return}if(!L)return S(s.t("setup.usage")),void(process.exitCode=1);await i(p||m[0].apiKey);let R=0,B=0;const F=new Set,Y=m.map(o=>({tool:o.tool,label:`--${o.option}`,apiKey:o.apiKey,need:o.need}));for(const o of Y){if(!await A(o.label,o.apiKey)){B+=1;continue}const e=await T(o.apiKey);!e.probed||$(e,o.need)?(e.probed||M(s.t("setup.probe_failed",{label:o.label})),l.setToolApiKey(o.tool,o.apiKey),await O(o.tool,o.apiKey,D)?(R+=1,F.add(o.tool)):B+=1):(S(s.t(`setup.key_no_${o.need}`,{label:o.label,tool:n[o.tool].displayName})),B+=1)}if(p){if(!await A("--key",p))return void(process.exitCode=_[N??"operation"]);l.setApiKey(p);const o=await T(p);if(o.probed||M(s.t("setup.probe_failed",{label:"--key"})),o.probed&&!o.hasClaude&&!o.hasGpt&&!o.hasGrok&&!o.hasGemini)return S(s.t("setup.key_no_family")),void(process.exitCode=1);const e=[{tool:"claude-code",capable:o.hasClaude,skipMsg:s.t("setup.skip_no_claude")},{tool:"codex",capable:o.hasGpt,skipMsg:s.t("setup.skip_no_gpt")},{tool:"grok",capable:o.hasGrok,skipMsg:s.t("setup.skip_no_grok")},{tool:"claude-desktop",capable:o.hasClaude&&("darwin"===process.platform||"win32"===process.platform),skipMsg:"",quiet:!0},{tool:"agy",capable:o.hasGemini,skipMsg:s.t("setup.skip_no_gemini")}];for(const o of e)F.has(o.tool)||(o.capable?await O(o.tool,p,D)?(R+=1,F.add(o.tool)):B+=1:o.quiet||M(o.skipMsg))}if(R>0){const t=await async function(t,i,r){const p=t.filter(o=>!e(o)?.isInstalled&&!a.isToolInstalled(o));if(0===p.length)return[];const d=p.map(o=>n[o].displayName).join(s.t("setup.list_separator"));let c=i;if(void 0!==c||h()||(w()?c=!b():process.stdin.isTTY&&(console.log(""),c=(await v.prompt([{type:"confirm",name:"go",message:s.t("setup.install_confirm",{tools:d}),default:!0}])).go)),!c){console.log("");for(const e of p)console.log(o.yellow("! "+s.t("setup.install_hint",{tool:n[e].displayName,install:n[e].installCommand})));return h()||console.log(o.gray(s.t("setup.install_all_hint",{cli:j}))),p}const u=[];for(const e of p){console.log(o.bold(`\n${n[e].displayName}`));try{await a.installTool(e)}catch(o){x.logError(`setup: install ${e}`,o)}C(),a.isToolInstalled(e)||u.push(e)}const m=p.filter(o=>!u.includes(o));m.length>0&&console.log("");for(const o of m){const e=l.getApiKeyForTool(o);e&&await O(o,e,{...r,oneMillion:void 0,force:void 0})}return u}([...F],r.install,D),i=[...F].filter(o=>!e(o)?.isInstalled&&!t.includes(o)),p=i.map(o=>n[o]?.command).filter(Boolean).join(" / "),d=s.t("setup.done",{count:String(R)});G("\n"+(p?`${d}${s.t("setup.done_commands",{commands:p})}`:d)),t.length>0&&M(s.t("setup.still_missing",{tools:t.map(o=>n[o].displayName).join(s.t("setup.list_separator"))}));const c=i.filter(o=>!a.isOnPath(o));if(c.length>0&&!h()&&"1"!==K("PATH_HINT_BY_CALLER")){const e=c.map(o=>n[o].command).join(" / ");console.log(o.yellow(" ! "+s.t("win32"===process.platform?"setup.path_reload_windows":"setup.path_reload",{commands:e})))}}B>0&&(S(s.t("setup.failed_summary",{count:String(B)})),h()||console.error(`${j} setup --key ${"zh_CN"===s.getLocale()?"<你的 Key>":"<your key>"}`)),await t([...F]),(B>0||0===R)&&(process.exitCode=_[N??"operation"])}
@@ -1 +1 @@
1
- import{join as e}from"path";import{applyGatewayModels as t,claudeCodeManager as o}from"../claude-code-manager.js";import{backupBeforeWrite as a}from"./backup.js";import{i18n as n}from"../i18n.js";import{baseModelId as s}from"../model-catalog.js";import{gatewayModelSpecs as i,prettyModelName as r,vendorNames as d}from"../gateway-models.js";import{toolHome as l}from"./types.js";import{spawnSync as c}from"child_process";import{existsSync as u,readFileSync as p}from"fs";import{detectManagedOverrides as m}from"./claude-managed.js";import{installOfficialPlugins as g}from"./claude-plugins.js";import{findInstalls as f,mirrorInstallCommand as h,brandInstallScripts as C}from"./tool-installs.js";import{updateNativeFromMirror as _}from"./claude-native-mirror.js";import{brandEnv as j}from"../brand.js";const k=e(l(),".claude","settings.json"),y=e(l(),".claude.json");let P,S=null,v=()=>0===c("security",["find-generic-password","-s","Claude Code-credentials"],{stdio:"ignore"}).status;export function setClaudeKeychainProbeForTests(e){v=e}export function claudeAccountLoginPresent(){const t=process.env.CLAUDE_CONFIG_DIR?.trim()||e(l(),".claude");if(u(e(t,".credentials.json")))return!0;if("darwin"!==process.platform||j("TEST_HOME"))return!1;try{return v()}catch{return!1}}function b(){try{const t=JSON.parse(p(e(l(),".claude","settings.json"),"utf-8"));return"string"==typeof t.autoUpdatesChannel?t.autoUpdatesChannel:"latest"}catch{return"latest"}}function x(e){if(!e)return;const t=new Set(e.models);return i("claude-code",e.clientModels).filter(e=>t.has(e.id))}const w={command:"claude",npmPackage:"@anthropic-ai/claude-code",native:{binDir:[".local","bin"],updateArgs:["update"],dataDirs:[[".local","share","claude"]],mirrorUpdate:()=>_(b())},mirrorScript:C("claude-code"),brew:"claude-code"};export const claudeCodeAdapter={name:"claude-code",displayName:"Claude Code",command:"claude",installCommand:h(w),upgradeCommand:"claude update",installSpec:w,upgradeHints:e=>"stable"===b()?[n.t("tools.claude_code.stable_channel",{min:e})]:[],configPath:k,wantsModelCatalog:!0,loadPrivateConfig(e){a(k),a(y),P=x(e.catalog),o.loadPrivateConfig(e.apiKey,e.models,e.catalog?.models,P);const t=f(claudeCodeAdapter.installSpec)[0];S=t?g(t.path):null},unloadPrivateConfig(){a(k),o.unloadPrivateConfig()},detectCurrentConfig:()=>o.detectCurrentConfig(),getConfig:()=>({settings:o.getSettings(),mcp:o.getMCPConfig()}),updateConfig(e){const t=e||{};t.settings&&o.saveSettings(t.settings),t.mcp&&o.saveMCPConfig(t.mcp)},clearPinnedModels:e=>(a(k),o.clearPinnedModels(e?.models)),listedModels(){const e=o.getSettings().modelPicker;return Array.isArray(e?.options)?e.options.map(e=>s(String(e.model))):null},refreshModelMenu(e){const n=o.getSettings(),s=t(n,x(e.catalog));JSON.stringify(s)!==JSON.stringify(n)&&(a(k),o.saveSettings(s))},applyNotes(){const e=[];S?.installed.length&&(e.push({kind:"summary",text:n.t("tools.claude_code.plugins_installed",{count:String(S.installed.length)})}),e.push({kind:"detail",text:S.installed.join(", ")})),("marketplace"===S?.skipped||S?.failed.length)&&e.push({kind:"action",text:n.t("tools.claude_code.plugins_failed")}),P&&P.length>0&&(e.push({kind:"summary",text:n.t("tools.claude_code.gateway_models",{count:String(P.length),vendors:d(P.map(e=>e.id)).join(" / ")})}),e.push({kind:"detail",text:P.map(e=>e.name||r(e.id)).join(", ")})),"win32"!==process.platform||process.env.CLAUDE_CODE_GIT_BASH_PATH||0===c("where",["git"],{windowsHide:!0,stdio:"ignore"}).status||e.push({kind:"action",text:n.t("tools.claude_code.no_git_bash")}),claudeAccountLoginPresent()&&e.push({kind:"detail",text:n.t("tools.claude_code.account_login_overridden")});for(const t of m())e.push({kind:"action",text:n.t("tools.claude_code.managed_override",{source:t.source,keys:t.keys.join(", ")})});for(const t of o.getLastTierFallbacks())e.push({kind:"detail",text:n.t("tools.claude_code.tier_fallback",{tier:t.tier,from:t.from,to:t.to})});return e},backupPaths:()=>[k,y],forceResetPaths:()=>[k]};
1
+ import{join as e}from"path";import{applyGatewayModels as t,claudeCodeManager as o}from"../claude-code-manager.js";import{backupBeforeWrite as n}from"./backup.js";import{i18n as a}from"../i18n.js";import{baseModelId as s}from"../model-catalog.js";import{gatewayModelSpecs as i,prettyModelName as r,vendorNames as l}from"../gateway-models.js";import{toolHome as d}from"./types.js";import{spawnSync as c}from"child_process";import{existsSync as u,readFileSync as p}from"fs";import{detectManagedOverrides as m}from"./claude-managed.js";import{installOfficialPlugins as g}from"./claude-plugins.js";import{findInstalls as f,mirrorInstallCommand as h,brandInstallScripts as C}from"./tool-installs.js";import{updateNativeFromMirror as _}from"./claude-native-mirror.js";import{brandEnv as k}from"../brand.js";const j=e(d(),".claude","settings.json"),y=e(d(),".claude.json");let P,S=null,v=()=>0===c("security",["find-generic-password","-s","Claude Code-credentials"],{stdio:"ignore"}).status;export function setClaudeKeychainProbeForTests(e){v=e}export function claudeAccountLoginPresent(){const t=process.env.CLAUDE_CONFIG_DIR?.trim()||e(d(),".claude");if(u(e(t,".credentials.json")))return!0;if("darwin"!==process.platform||k("TEST_HOME"))return!1;try{return v()}catch{return!1}}function x(){try{const t=JSON.parse(p(e(d(),".claude","settings.json"),"utf-8"));return"string"==typeof t.autoUpdatesChannel?t.autoUpdatesChannel:"latest"}catch{return"latest"}}function b(e){if(!e)return;const t=new Set(e.models);return i("claude-code",e.clientModels).filter(e=>t.has(e.id))}const w={command:"claude",npmPackage:"@anthropic-ai/claude-code",native:{binDir:[".local","bin"],updateArgs:["update"],dataDirs:[[".local","share","claude"]],mirrorUpdate:()=>_(x())},mirrorScript:C("claude-code"),brew:"claude-code"};export const claudeCodeAdapter={name:"claude-code",displayName:"Claude Code",command:"claude",installCommand:h(w),upgradeCommand:"claude update",installSpec:w,upgradeHints:e=>"stable"===x()?[a.t("tools.claude_code.stable_channel",{min:e})]:[],configPath:j,wantsModelCatalog:!0,loadPrivateConfig(t){n(j),n(y),P=b(t.catalog),o.loadPrivateConfig(t.apiKey,t.models,t.catalog?.models,P);const a=e(d(),".local","bin","win32"===process.platform?"claude.exe":"claude"),s=f(claudeCodeAdapter.installSpec)[0]?.path??(u(a)?a:null);S=s?g(s):null},unloadPrivateConfig(){n(j),o.unloadPrivateConfig()},detectCurrentConfig:()=>o.detectCurrentConfig(),getConfig:()=>({settings:o.getSettings(),mcp:o.getMCPConfig()}),updateConfig(e){const t=e||{};t.settings&&o.saveSettings(t.settings),t.mcp&&o.saveMCPConfig(t.mcp)},clearPinnedModels:e=>(n(j),o.clearPinnedModels(e?.models)),listedModels(){const e=o.getSettings().modelPicker;return Array.isArray(e?.options)?e.options.map(e=>s(String(e.model))):null},refreshModelMenu(e){const a=o.getSettings(),s=t(a,b(e.catalog));JSON.stringify(s)!==JSON.stringify(a)&&(n(j),o.saveSettings(s))},applyNotes(){const e=[];S?.installed.length&&(e.push({kind:"summary",text:a.t("tools.claude_code.plugins_installed",{count:String(S.installed.length)})}),e.push({kind:"detail",text:S.installed.join(", ")})),"git"===S?.skipped?e.push({kind:"action",text:a.t("tools.claude_code.plugins_need_git")}):("marketplace"===S?.skipped||S?.failed.length)&&e.push({kind:"action",text:a.t("tools.claude_code.plugins_failed")}),P&&P.length>0&&(e.push({kind:"summary",text:a.t("tools.claude_code.gateway_models",{count:String(P.length),vendors:l(P.map(e=>e.id)).join(" / ")})}),e.push({kind:"detail",text:P.map(e=>e.name||r(e.id)).join(", ")})),"win32"!==process.platform||process.env.CLAUDE_CODE_GIT_BASH_PATH||0===c("where",["git"],{windowsHide:!0,stdio:"ignore"}).status||e.push({kind:"action",text:a.t("tools.claude_code.no_git_bash")}),claudeAccountLoginPresent()&&e.push({kind:"detail",text:a.t("tools.claude_code.account_login_overridden")});for(const t of m())e.push({kind:"action",text:a.t("tools.claude_code.managed_override",{source:t.source,keys:t.keys.join(", ")})});for(const t of o.getLastTierFallbacks())e.push({kind:"detail",text:a.t("tools.claude_code.tier_fallback",{tier:t.tier,from:t.from,to:t.to})});return e},backupPaths:()=>[j,y],forceResetPaths:()=>[j]};
@@ -1 +1 @@
1
- import{spawnSync as e}from"child_process";import{readFileSync as t}from"fs";import{join as i}from"path";import{logger as o}from"../../utils/logger.js";import{configManager as s}from"../config.js";import{toolHome as n}from"./types.js";import{brandEnv as r,brand as l}from"../brand.js";export const PLUGIN_SOURCES=[...l().pluginMarketplaces,{name:"claude-plugins-official",add:"anthropics/claude-plugins-official",probe:"https://github.com/anthropics/claude-plugins-official.git"}];export const OFFICIAL_PLUGINS=["code-review","feature-dev","frontend-design","pr-review-toolkit","commit-commands","security-guidance","code-simplifier","skill-creator","claude-md-management","claude-code-setup"];const a="official_plugins_offered";let d=(t,s)=>{const l=e(t,s,{env:r("TEST_HOME")?{...process.env,CLAUDE_CONFIG_DIR:i(n(),".claude")}:process.env,encoding:"utf-8",timeout:12e4,windowsHide:!0,stdio:["ignore","pipe","pipe"],shell:"win32"===process.platform&&/\.cmd$/i.test(t)});return 0!==l.status&&o.logError(`claude ${s.join(" ")}`,new Error(`${l.stderr??""}${l.stdout??""}`.trim())),0===l.status},c=t=>0===e("git",["ls-remote","--heads",t],{timeout:8e3,windowsHide:!0,stdio:"ignore"}).status;export function setClaudePluginRunnerForTests(e){d=e}export function setPluginSourceProbeForTests(e){c=e}export function installOfficialPlugins(e){if("1"===r("SKIP_CLAUDE_PLUGINS"))return{installed:[],failed:[],skipped:"disabled"};const o=s.getToolSetting("claude-code",a),l=new Set("string"==typeof o?o.split(",").filter(Boolean):[]),p=function(){try{const e=JSON.parse(t(i(n(),".claude","plugins","installed_plugins.json"),"utf-8"));return new Set(Object.keys(e.plugins??{}).map(e=>e.replace(/@[^@]*$/,"")))}catch{return new Set}}(),u=e=>p.has(e),f=OFFICIAL_PLUGINS.filter(e=>!l.has(e)&&!u(e));if(0===f.length)return{installed:[],failed:[],skipped:null};const m=PLUGIN_SOURCES.find(e=>c(e.probe));if(!m)return{installed:[],failed:[],skipped:"marketplace"};d(e,["plugin","marketplace","add",m.add]);const g={installed:[],failed:[],skipped:null,source:m.name};for(const t of f)d(e,["plugin","install",`${t}@${m.name}`])?(g.installed.push(t),l.add(t)):g.failed.push(t);for(const e of OFFICIAL_PLUGINS)u(e)&&l.add(e);return s.setToolSetting("claude-code",a,[...l].join(",")),g}
1
+ import{spawnSync as e}from"child_process";import{existsSync as t,readFileSync as i}from"fs";import{join as o}from"path";import{logger as s}from"../../utils/logger.js";import{configManager as n}from"../config.js";import{toolHome as r}from"./types.js";import{brandEnv as l,brand as a}from"../brand.js";export const PLUGIN_SOURCES=[...a().pluginMarketplaces,{name:"claude-plugins-official",add:"anthropics/claude-plugins-official",probe:"https://github.com/anthropics/claude-plugins-official.git"}];export const OFFICIAL_PLUGINS=["code-review","feature-dev","frontend-design","pr-review-toolkit","commit-commands","security-guidance","code-simplifier","skill-creator","claude-md-management","claude-code-setup"];const d="official_plugins_offered";let p=(t,i)=>{const n=e(t,i,{env:l("TEST_HOME")?{...process.env,CLAUDE_CONFIG_DIR:o(r(),".claude")}:process.env,encoding:"utf-8",timeout:12e4,windowsHide:!0,stdio:["ignore","pipe","pipe"],shell:"win32"===process.platform&&/\.cmd$/i.test(t)});return 0!==n.status&&s.logError(`claude ${i.join(" ")}`,new Error(`${n.stderr??""}${n.stdout??""}`.trim())),0===n.status},c=t=>0===e("git",["ls-remote","--heads",t],{timeout:8e3,windowsHide:!0,stdio:"ignore"}).status;export function setClaudePluginRunnerForTests(e){p=e}export function setPluginSourceProbeForTests(e){c=e}export function installOfficialPlugins(s){if("1"===l("SKIP_CLAUDE_PLUGINS"))return{installed:[],failed:[],skipped:"disabled"};const a=n.getToolSetting("claude-code",d),u=new Set("string"==typeof a?a.split(",").filter(Boolean):[]),f=function(){try{const e=JSON.parse(i(o(r(),".claude","plugins","installed_plugins.json"),"utf-8"));return new Set(Object.keys(e.plugins??{}).map(e=>e.replace(/@[^@]*$/,"")))}catch{return new Set}}(),m=e=>f.has(e),g=OFFICIAL_PLUGINS.filter(e=>!u.has(e)&&!m(e));if(0===g.length)return{installed:[],failed:[],skipped:null};if("darwin"===process.platform&&0!==e("xcode-select",["-p"],{stdio:"ignore"}).status&&!["/opt/homebrew/bin/git","/usr/local/bin/git"].some(e=>t(e))||0!==e("git",["--version"],{timeout:8e3,windowsHide:!0,stdio:"ignore"}).status)return{installed:[],failed:[],skipped:"git"};const S=PLUGIN_SOURCES.find(e=>c(e.probe));if(!S)return{installed:[],failed:[],skipped:"marketplace"};p(s,["plugin","marketplace","add",S.add]);const h={installed:[],failed:[],skipped:null,source:S.name};for(const e of g)p(s,["plugin","install",`${e}@${S.name}`])?(h.installed.push(e),u.add(e)):h.failed.push(e);for(const e of OFFICIAL_PLUGINS)m(e)&&u.add(e);return n.setToolSetting("claude-code",d,[...u].join(",")),h}
@@ -1 +1 @@
1
- import{spawnSync as t}from"child_process";import{existsSync as e,readFileSync as o}from"fs";import{dirname as n,join as i}from"path";import{fileURLToPath as s}from"url";import{logger as r}from"../../utils/logger.js";import{getCodexRules as l,compareVersions as u}from"../model-registry.js";import{autoCompactTokens as a,modelBlurb as d,prettyModelName as c}from"../gateway-models.js";import{toolHome as p}from"./types.js";import{brandEnv as _,PROVIDER_KEY as m}from"../brand.js";const f=n(s(import.meta.url));export const CODEX_CATALOG_FILE=`${m}-model-catalog.json`;export const codexCatalogPath=()=>i(p(),".codex",CODEX_CATALOG_FILE);function x(t){return!!t&&"object"==typeof t&&!Array.isArray(t)}function w(t){try{const e=JSON.parse(t),o=x(e)&&Array.isArray(e.models)?e.models.filter(x):[];return o.length>0?o:null}catch{return null}}export function loadBundledCodexModels(){for(const o of function(){const t=_("CODEX_BIN");if(void 0!==t)return t.trim()?[t.trim()]:[];const e=["codex"];if("darwin"===process.platform)for(const t of["/Applications",i(p(),"Applications")])e.push(i(t,"ChatGPT.app/Contents/Resources/codex-cli/bin/codex")),e.push(i(t,"Codex.app/Contents/Resources/codex"));return e}()){if("codex"!==o&&!e(o))continue;const n={encoding:"utf-8",timeout:2e4,maxBuffer:67108864,windowsHide:!0,stdio:["ignore","pipe","pipe"]},i="win32"===process.platform&&"codex"===o?t("codex debug models --bundled",{...n,shell:!0}):t(o,["debug","models","--bundled"],n);if(0===i.status&&i.stdout){const t=w(i.stdout);if(t)return t}(i.error||0!==i.status)&&r.logError("loadBundledCodexModels",i.error??new Error(`${o} exited ${i.status}`))}return null}export function loadPreviousCodexModels(){const t=g()?.filter(t=>!h(t));return t&&t.length>0?t:null}export function previousGatewayModelIds(){return(g()??[]).filter(h).map(t=>String(t.slug))}function g(){return e(codexCatalogPath())?w(o(codexCatalogPath(),"utf-8")):null}function h(t){return"number"==typeof t.priority&&t.priority>=1e3}let y=null;function b(){if(null!==y)return y;const t=[i(f,"..","..","..","codex-base-instructions.md"),i(f,"..","..","codex-base-instructions.md"),i(f,"codex-base-instructions.md")],n=t.find(t=>e(t));if(!n)throw new Error(`codex-base-instructions.md not found, searched: ${t.join(", ")}`);return y=o(n,"utf-8"),y}function C(t){return"number"==typeof t&&Number.isFinite(t)&&t>0?t:void 0}function v(t,e,o,n){const i=o?t:Math.min(t,e);return{window:i,compact:a(i,n)}}function M(t,e,o,n){const{standardContextWindow:i}=l();let s=C(t.contextWindow)??i;n&&t.id.startsWith("claude-")&&(s=n.has(t.id)?Math.max(s,1e6):Math.min(s,2e5));const{window:r,compact:u}=v(s,i,o,C(t.autoCompactTokens));return{slug:t.id,display_name:t.name||c(t.id),description:d(t.description,{millionContext:r>=1e6})??null,supported_reasoning_levels:[],shell_type:"unified_exec",visibility:"list",supported_in_api:!0,priority:e,additional_speed_tiers:[],service_tiers:[],availability_nux:null,upgrade:null,model_messages:{instructions_template:b()},base_instructions:b(),supports_reasoning_summaries:!0,supports_parallel_tool_calls:!1,prefer_websockets:!1,include_skills_usage_instructions:!1,include_plugin_usage_instructions:!1,include_apps_usage_instructions:!1,default_reasoning_summary:"auto",support_verbosity:!1,default_verbosity:null,apply_patch_tool_type:null,web_search_tool_type:"text",truncation_policy:{mode:"bytes",limit:1e4},supports_image_detail_original:!1,context_window:r,max_context_window:r,auto_compact_token_limit:u,effective_context_window_percent:95,experimental_supported_tools:[],input_modalities:["text","image"],supports_search_tool:!1,supports_experimental_context:!1,use_responses_lite:!1,supports_reasoning_effort_updates:!1,node_repl_auto_review_required:!1,node_repl_disabled:!1}}function A(t,e,o){if("list"!==t.visibility)return t;const n=C(t.context_window);if(!n)return t;const i=C(t.max_context_window)??n,s=o?Math.min(C(e?.contextWindow)??i,i):n,{window:r,compact:l}=v(s,n,!0,C(e?.autoCompactTokens));return{...t,context_window:r,auto_compact_token_limit:l}}export function buildCodexCatalog(t){const{bundled:e,specs:o,oneMillion:n,selectedModel:i}=t,s=t.claudeOneMillion?new Set(t.claudeOneMillion):void 0,r=t.keyModels?new Set(t.keyModels):null,l=new Set(t.gatewayAvailable),a=t=>!r||r.has(t)||t===i,d=t=>l.has(t)||t===i,c=new Map(o.map(t=>[t.id,t])),p=[],_=new Set;for(const t of e){const e="string"==typeof t.slug?t.slug:"";e&&!_.has(e)&&("list"!==t.visibility||a(e))&&(_.add(e),p.push(A(t,c.get(e),n)))}const m=[...o];i&&!c.has(i)&&m.push({id:i});const f=function(t){const e=new Map;for(const o of t){const t=/^claude-([a-z]+)-(.+)$/.exec(o);if(!t)continue;const n=t[2].split("-").filter(t=>/^\d{1,2}$/.test(t)).join("."),i=e.get(t[1]);(!i||u(n,i.version)>0)&&e.set(t[1],{id:o,version:n})}return new Set([...e.values()].map(t=>t.id))}(m.map(t=>t.id).filter(d));for(const t of m)!_.has(t.id)&&d(t.id)&&(t.id.startsWith("claude-")&&!f.has(t.id)&&t.id!==i||(_.add(t.id),p.push(M(t,1e3+p.length,n,s))));return{models:p}}
1
+ import{spawnSync as t}from"child_process";import{existsSync as e,readFileSync as o}from"fs";import{dirname as n,join as i}from"path";import{fileURLToPath as s}from"url";import{logger as r}from"../../utils/logger.js";import{getCodexRules as l,compareVersions as a}from"../model-registry.js";import{autoCompactTokens as d,modelBlurb as u,prettyModelName as c}from"../gateway-models.js";import{toolHome as p}from"./types.js";import{brandEnv as _,PROVIDER_KEY as m}from"../brand.js";const f=n(s(import.meta.url));export const CODEX_CATALOG_FILE=`${m}-model-catalog.json`;export const codexCatalogPath=()=>i(p(),".codex",CODEX_CATALOG_FILE);function x(t){return!!t&&"object"==typeof t&&!Array.isArray(t)}function w(t){try{const e=JSON.parse(t),o=x(e)&&Array.isArray(e.models)?e.models.filter(x):[];return o.length>0?o:null}catch{return null}}export function loadBundledCodexModels(){for(const o of function(){const t=_("CODEX_BIN");if(void 0!==t)return t.trim()?[t.trim()]:[];const e=["codex"];if("win32"===process.platform){const t=process.env.LOCALAPPDATA||i(p(),"AppData","Local");e.push(i(t,"Programs","OpenAI","Codex","bin","codex.exe"))}else e.push(i(p(),".local","bin","codex"));if("darwin"===process.platform)for(const t of["/Applications",i(p(),"Applications")])e.push(i(t,"ChatGPT.app/Contents/Resources/codex-cli/bin/codex")),e.push(i(t,"Codex.app/Contents/Resources/codex"));return e}()){if("codex"!==o&&!e(o))continue;const n={encoding:"utf-8",timeout:2e4,maxBuffer:67108864,windowsHide:!0,stdio:["ignore","pipe","pipe"]},i="win32"===process.platform&&"codex"===o?t("codex debug models --bundled",{...n,shell:!0}):t(o,["debug","models","--bundled"],n);if(0===i.status&&i.stdout){const t=w(i.stdout);if(t)return t}(i.error||0!==i.status)&&r.logError("loadBundledCodexModels",i.error??new Error(`${o} exited ${i.status}`))}return null}export function loadPreviousCodexModels(){const t=g()?.filter(t=>!h(t));return t&&t.length>0?t:null}export function previousGatewayModelIds(){return(g()??[]).filter(h).map(t=>String(t.slug))}function g(){return e(codexCatalogPath())?w(o(codexCatalogPath(),"utf-8")):null}function h(t){return"number"==typeof t.priority&&t.priority>=1e3}let y=null;function b(){if(null!==y)return y;const t=[i(f,"..","..","..","codex-base-instructions.md"),i(f,"..","..","codex-base-instructions.md"),i(f,"codex-base-instructions.md")],n=t.find(t=>e(t));if(!n)throw new Error(`codex-base-instructions.md not found, searched: ${t.join(", ")}`);return y=o(n,"utf-8"),y}function C(t){return"number"==typeof t&&Number.isFinite(t)&&t>0?t:void 0}function v(t,e,o,n){const i=o?t:Math.min(t,e);return{window:i,compact:d(i,n)}}function A(t,e,o,n){const{standardContextWindow:i}=l();let s=C(t.contextWindow)??i;n&&t.id.startsWith("claude-")&&(s=n.has(t.id)?Math.max(s,1e6):Math.min(s,2e5));const{window:r,compact:a}=v(s,i,o,C(t.autoCompactTokens));return{slug:t.id,display_name:t.name||c(t.id),description:u(t.description,{millionContext:r>=1e6})??null,supported_reasoning_levels:[],shell_type:"unified_exec",visibility:"list",supported_in_api:!0,priority:e,additional_speed_tiers:[],service_tiers:[],availability_nux:null,upgrade:null,model_messages:{instructions_template:b()},base_instructions:b(),supports_reasoning_summaries:!0,supports_parallel_tool_calls:!1,prefer_websockets:!1,include_skills_usage_instructions:!1,include_plugin_usage_instructions:!1,include_apps_usage_instructions:!1,default_reasoning_summary:"auto",support_verbosity:!1,default_verbosity:null,apply_patch_tool_type:null,web_search_tool_type:"text",truncation_policy:{mode:"bytes",limit:1e4},supports_image_detail_original:!1,context_window:r,max_context_window:r,auto_compact_token_limit:a,effective_context_window_percent:95,experimental_supported_tools:[],input_modalities:["text","image"],supports_search_tool:!1,supports_experimental_context:!1,use_responses_lite:!1,supports_reasoning_effort_updates:!1,node_repl_auto_review_required:!1,node_repl_disabled:!1}}function M(t,e,o){if("list"!==t.visibility)return t;const n=C(t.context_window);if(!n)return t;const i=C(t.max_context_window)??n,s=o?Math.min(C(e?.contextWindow)??i,i):n,{window:r,compact:l}=v(s,n,!0,C(e?.autoCompactTokens));return{...t,context_window:r,auto_compact_token_limit:l}}export function buildCodexCatalog(t){const{bundled:e,specs:o,oneMillion:n,selectedModel:i}=t,s=t.claudeOneMillion?new Set(t.claudeOneMillion):void 0,r=t.keyModels?new Set(t.keyModels):null,l=new Set(t.gatewayAvailable),d=t=>!r||r.has(t)||t===i,u=t=>l.has(t)||t===i,c=new Map(o.map(t=>[t.id,t])),p=[],_=new Set;for(const t of e){const e="string"==typeof t.slug?t.slug:"";e&&!_.has(e)&&("list"!==t.visibility||d(e))&&(_.add(e),p.push(M(t,c.get(e),n)))}const m=[...o];i&&!c.has(i)&&m.push({id:i});const f=function(t){const e=new Map;for(const o of t){const t=/^claude-([a-z]+)-(.+)$/.exec(o);if(!t)continue;const n=t[2].split("-").filter(t=>/^\d{1,2}$/.test(t)).join("."),i=e.get(t[1]);(!i||a(n,i.version)>0)&&e.set(t[1],{id:o,version:n})}return new Set([...e.values()].map(t=>t.id))}(m.map(t=>t.id).filter(u));for(const t of m)!_.has(t.id)&&u(t.id)&&(t.id.startsWith("claude-")&&!f.has(t.id)&&t.id!==i||(_.add(t.id),p.push(A(t,1e3+p.length,n,s))));return{models:p}}
@@ -352,7 +352,6 @@
352
352
  "apply_failed": "Failed to write {{tool}} config: {{reason}}",
353
353
  "install_hint": "{{tool}} not found; install it with {{install}}",
354
354
  "done": "Done: {{count}} tool(s) configured. ",
355
- "skip_desktop_not_installed": "Claude Desktop is not installed; skipped (after installing, run {{cli}} setup --desktopkey sk-xxx or use the wizard)",
356
355
  "desktop_official_login_missing_key": "No saved Claude Desktop API key found; run {{cli}} setup --desktopkey <your key> (or --key) first",
357
356
  "claude_official_invalid": "Invalid value for --claude-official: {{value}} (expected on or off)",
358
357
  "done_commands": "Type {{commands}} in your terminal to start",
@@ -370,7 +369,8 @@
370
369
  "still_missing": "{{tools}} still not installed; run the commands above to install",
371
370
  "path_reload": "Run exec \"$SHELL\" -l in this window (or open a new terminal) to use {{commands}}",
372
371
  "path_reload_windows": "Open a new terminal to use {{commands}}",
373
- "list_separator": ", "
372
+ "list_separator": ", ",
373
+ "gui_preconfigured": "{{tool}} is not installed yet; its config is written already, so it works once you install and open it (download: {{install}})"
374
374
  },
375
375
  "tools": {
376
376
  "version_outdated": "version {{current}} is too old (needs {{min}} or later); upgrade with {{upgrade}}",
@@ -411,7 +411,8 @@
411
411
  "no_git_bash": "Git for Windows not found: Claude Code falls back to PowerShell for commands, which works, but bash commands and scripts won't; install Git (winget install Git.Git, or download from https://registry.npmmirror.com/binary.html?path=git-for-windows/)",
412
412
  "plugins_installed": "{{count}} official plugins installed (code review, feature dev, frontend design, …); type / to see them",
413
413
  "plugins_failed": "Official plugins could not be installed (GitHub unreachable, most likely); everything else works. Run {{cli}} config claude-code --non-interactive again later",
414
- "account_login_overridden": "Claude Code on this computer is signed in to a Claude account; the {{brand}} token {{product}} writes takes precedence, so Claude Code uses {{brand}}. To go back to the account, remove the {{brand}} config with {{cli}} config claude-code"
414
+ "account_login_overridden": "Claude Code on this computer is signed in to a Claude account; the {{brand}} token {{product}} writes takes precedence, so Claude Code uses {{brand}}. To go back to the account, remove the {{brand}} config with {{cli}} config claude-code",
415
+ "plugins_need_git": "Official plugins are downloaded with Git, which this computer doesn't have yet (on a Mac, Apple's Command Line Tools); everything else works. Once Git is installed, run {{cli}} config claude-code --non-interactive"
415
416
  },
416
417
  "model_family": {
417
418
  "gpt": "GPT",
@@ -578,7 +579,7 @@
578
579
  },
579
580
  "autodetect_title": "Models the --key can use → tools configured:",
580
581
  "autodetect": {
581
- "claude": "Claude Code (plus Claude Desktop if installed)",
582
+ "claude": "Claude Code, Claude Desktop (macOS / Windows, written ahead even when not installed)",
582
583
  "gpt": "Codex",
583
584
  "grok": "Grok Build",
584
585
  "gemini": "Antigravity CLI"
@@ -352,7 +352,6 @@
352
352
  "apply_failed": "{{tool}} 配置写入失败: {{reason}}",
353
353
  "install_hint": "没检测到 {{tool}},运行 {{install}} 安装",
354
354
  "done": "完成:已配置 {{count}} 个工具。",
355
- "skip_desktop_not_installed": "未检测到已安装的 Claude Desktop,已跳过(装好后运行 {{cli}} setup --desktopkey sk-xxx 或在向导里配置)",
356
355
  "desktop_official_login_missing_key": "未找到已保存的 Claude Desktop API Key;先运行 {{cli}} setup --desktopkey <你的 Key>(或 --key)",
357
356
  "claude_official_invalid": "--claude-official 的值无效: {{value}}(只接受 on / off)",
358
357
  "done_commands": "在终端输入 {{commands}} 开始使用",
@@ -370,7 +369,8 @@
370
369
  "still_missing": "{{tools}} 还没装好,按上方的命令安装后就能用",
371
370
  "path_reload": "在当前窗口运行 exec \"$SHELL\" -l(或新开一个终端)后就能用 {{commands}}",
372
371
  "path_reload_windows": "新开一个终端后就能用 {{commands}}",
373
- "list_separator": "、"
372
+ "list_separator": "、",
373
+ "gui_preconfigured": "{{tool}} 还没装,配置已先写好,装好后打开就能用(下载:{{install}})"
374
374
  },
375
375
  "tools": {
376
376
  "version_outdated": "版本 {{current}} 过旧,需要 {{min}} 及以上,运行 {{upgrade}} 升级",
@@ -411,7 +411,8 @@
411
411
  "no_git_bash": "没找到 Git for Windows:Claude Code 会改用 PowerShell 执行命令,可以用,但 bash 写法的命令和脚本跑不了;建议安装 Git(winget install Git.Git,或从国内镜像 https://registry.npmmirror.com/binary.html?path=git-for-windows/ 下载)",
412
412
  "plugins_installed": "装好 {{count}} 个官方插件(代码审查、功能开发、前端设计等),输入 / 可以看到",
413
413
  "plugins_failed": "官方插件没装上(多半是连不上 GitHub),不影响使用;网络好时再运行 {{cli}} config claude-code --non-interactive 即可",
414
- "account_login_overridden": "这台电脑的 Claude Code 登录过 Claude 官方账号;{{product}} 写入的 {{brand}} 令牌会优先生效,Claude Code 走 {{brand}}。要改回官方账号,用 {{cli}} config claude-code 移除 {{brand}} 配置"
414
+ "account_login_overridden": "这台电脑的 Claude Code 登录过 Claude 官方账号;{{product}} 写入的 {{brand}} 令牌会优先生效,Claude Code 走 {{brand}}。要改回官方账号,用 {{cli}} config claude-code 移除 {{brand}} 配置",
415
+ "plugins_need_git": "官方插件要用 Git 下载,这台电脑还没有 Git(Mac 上要先装好苹果命令行工具),不影响使用;装好 Git 后运行 {{cli}} config claude-code --non-interactive 补装"
415
416
  },
416
417
  "model_family": {
417
418
  "gpt": "GPT",
@@ -578,7 +579,7 @@
578
579
  },
579
580
  "autodetect_title": "--key 能用的模型 → 自动配置的工具:",
580
581
  "autodetect": {
581
- "claude": "Claude Code(装了 Claude Desktop 也一起配)",
582
+ "claude": "Claude Code、Claude Desktop(macOS / Windows,没装也先写好)",
582
583
  "gpt": "Codex",
583
584
  "grok": "Grok Build",
584
585
  "gemini": "Antigravity CLI"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeapi/api-helper",
3
- "version": "0.0.99",
3
+ "version": "0.0.101",
4
4
  "description": "CLI tool for managing AI coding assistants (Claude Code, Codex, OpenClaw, Hermes, AtomCode, Grok Build) with one unified config",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",