@vibeapi/cli 0.0.80 → 0.0.82
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/lib/gateway-models.d.ts +2 -2
- package/dist/lib/gateway-models.js +1 -1
- package/dist/lib/tool-manager.js +1 -1
- package/dist/lib/tool-upgrade.js +1 -1
- package/dist/lib/tools/antigravity.js +1 -1
- package/dist/lib/tools/grok.js +1 -1
- package/dist/lib/tools/tool-installs.d.ts +12 -3
- package/dist/lib/tools/tool-installs.js +1 -1
- package/dist/locales/en_US.json +2 -2
- package/dist/locales/zh_CN.json +2 -2
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@ import type { GatewayClientModel } from './api-validator.js';
|
|
|
5
5
|
* model menus, and the shared context rules: each model compacts at
|
|
6
6
|
* `autoCompactRatio` (80%) of its window unless the gateway sets a point.
|
|
7
7
|
*/
|
|
8
|
-
export type GatewayModelTool = 'codex' | 'claude-code';
|
|
8
|
+
export type GatewayModelTool = 'codex' | 'claude-code' | 'grok';
|
|
9
9
|
/** Auto-compaction point for a window: the explicit value (capped at the window) or the ratio. */
|
|
10
10
|
export declare function autoCompactTokens(window: number, explicit?: number): number;
|
|
11
11
|
/**
|
|
@@ -13,7 +13,7 @@ export declare function autoCompactTokens(window: number, explicit?: number): nu
|
|
|
13
13
|
* (`/api/platform/vibecode/config`) its lists come first — fields it leaves out keep
|
|
14
14
|
* the built-in values, and Claude models only come from it when `models.json` lists
|
|
15
15
|
* them too (so a model removed there, like Haiku for Codex, stays out); Codex also
|
|
16
|
-
* gets the `gemini` list. Built-in entries the lists lack are added (see
|
|
16
|
+
* gets the `gemini` list, Grok Build only the `grok` list. Built-in entries the lists lack are added (see
|
|
17
17
|
* `withBuiltInExtras`); a `hidden` row on the gateway keeps one out. Without the
|
|
18
18
|
* config, the built-in list from `models.json` → `gatewayModels`.
|
|
19
19
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getGatewayModelRules as
|
|
1
|
+
import{getGatewayModelRules as e}from"./model-registry.js";export function autoCompactTokens(t,i){return i&&i>0?Math.min(i,t):Math.floor(t*e().autoCompactRatio)}export function gatewayModelSpecs(t,i){const o=e().models,n=o.filter(e=>function(e,t){return"codex"===e?!1!==t.codex:"grok"===e?"grok"===modelFamily(t.id):!t.id.startsWith("claude-")&&!1!==t.claudeCode}(t,e));if(!i)return n;const d=new Set(Object.values(i).flat().filter(e=>e.hidden).map(e=>e.id)),r=Object.fromEntries(Object.entries(i).map(([e,t])=>[e,t.filter(e=>!e.hidden)])),s=new Map(("claude-code"===t?o:n).map(e=>[e.id,e])),l=(r.gemini??[]).filter(e=>!1!==o.find(t=>t.id===e.id)?.codex),a="grok"===t?r.grok??[]:"codex"===t?[...r.codex??[],...l,...(r.claude??[]).filter(e=>e.id.startsWith("claude-")&&s.has(e.id))]:function(e,t){return[...(e.codex??[]).filter(e=>"gpt"===modelFamily(e.id)),...e.gemini??[],...e.grok??[],...(e.claude??[]).filter(e=>!e.id.startsWith("claude-"))].filter(e=>t.get(e.id)?.claudeCode??!0)}(r,s);if(0===a.length)return n.filter(e=>!d.has(e.id));const c=new Set,u=[];for(const e of a)c.has(e.id)||(c.add(e.id),u.push({...s.get(e.id),...e}));return function(e,t,i){const o=[...e];return t.forEach((e,n)=>{if(i.has(e.id)||o.some(t=>t.id===e.id))return;const d=modelFamily(e.id),r=new Set(t.slice(n+1).filter(e=>modelFamily(e.id)===d).map(e=>e.id));let s=o.findIndex(e=>r.has(e.id));if(s<0){s=o.length;for(let e=o.length-1;e>=0;e--)if(modelFamily(o[e].id)===d){s=e+1;break}}o.splice(s,0,e)}),o}(u,n,d)}const t={gpt:"GPT",gemini:"Gemini",glm:"GLM",deepseek:"DeepSeek",minimax:"MiniMax",qwen:"Qwen"};export function modelBlurb(e,t={}){const i=[];for(const o of(e??"").split("|")){const e=o.trim();e&&(/\d\s*万?\s*输出|output\D*\d|\d\D*output/i.test(e)||(/[\d百千]\s*万?\s*上下文|context\D*\d|\d\D*context/i.test(e)?t.millionContext&&!i.includes("百万上下文")&&i.unshift("百万上下文"):i.push(e)))}return t.millionContext&&!i.includes("百万上下文")&&i.unshift("百万上下文"),i.length>0?i.join(" | "):void 0}export function prettyModelName(e){const i=e.replace(/^([a-z]+)(\d)/i,"$1 $2").split(/[-_\s]+/).filter(Boolean),o=[];for(const e of i){const i=o[o.length-1];if(/^\d+$/.test(e)&&i&&/^\d+$/.test(i)&&e.length<=2&&!/^\d{8}$/.test(e)){o[o.length-1]=`${i}.${e}`;continue}const n=e.toLowerCase();o.push(t[n]??(/^[a-z]\d/i.test(e)?e.toUpperCase():e[0].toUpperCase()+e.slice(1)))}return o.join(" ")}export function vendorNames(e){return[...new Set(e.map(e=>prettyModelName(e).split(" ")[0]))]}export function modelFamily(e){const t=e.toLowerCase();return t.startsWith("claude-")?"claude":t.startsWith("gemini")?"gemini":t.startsWith("grok")?"grok":/^(gpt|o\d|codex)/.test(t)?"gpt":"other"}
|
package/dist/lib/tool-manager.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{execSync as o,spawnSync as t}from"child_process";import{i18n as n}from"./i18n.js";import e from"inquirer";import r from"chalk";import{logger as i}from"../utils/logger.js";import{configManager as l}from"./config.js";import{getAdapter as s,listAdapters as a,TOOL_ADAPTERS as c}from"./tools/registry.js";import{backupBeforeWrite as d,listBackups as p,restoreBackup as u}from"./tools/backup.js";import{existsSync as f,rmSync as m}from"fs";import{stringWidth as g}from"../utils/string-width.js";import{resolveModelCatalog as h}from"./model-catalog.js";import{compareVersions as w,getToolMinVersion as P}from"./model-registry.js";import{findInstalls as y,forgetInstalls as T,installLabel as C,
|
|
1
|
+
import{execSync as o,spawnSync as t}from"child_process";import{i18n as n}from"./i18n.js";import e from"inquirer";import r from"chalk";import{logger as i}from"../utils/logger.js";import{configManager as l}from"./config.js";import{getAdapter as s,listAdapters as a,TOOL_ADAPTERS as c}from"./tools/registry.js";import{backupBeforeWrite as d,listBackups as p,restoreBackup as u}from"./tools/backup.js";import{existsSync as f,rmSync as m}from"fs";import{stringWidth as g}from"../utils/string-width.js";import{resolveModelCatalog as h}from"./model-catalog.js";import{compareVersions as w,getToolMinVersion as P}from"./model-registry.js";import{findInstalls as y,forgetInstalls as T,installLabel as C,mirrorInstallCommand as k}from"./tools/tool-installs.js";export{w as compareVersions};function $(o){const t=c[o];return{name:t.name,command:t.command,installCommand:t.installCommand,configPath:t.configPath,displayName:t.displayName,...t.hidden?{hidden:!0}:{}}}export const SUPPORTED_TOOLS=Object.fromEntries(Object.keys(c).map(o=>[o,$(o)]));export class ToolManager{static instance;constructor(){}static getInstance(){return ToolManager.instance||(ToolManager.instance=new ToolManager),ToolManager.instance}isToolInstalled(t){const n=SUPPORTED_TOOLS[t];if(!n)return!1;const e=s(t);if(e?.isInstalled)try{return e.isInstalled()}catch{return!1}try{const t="win32"===process.platform?`where ${n.command}`:`which ${n.command}`;return o(t,{stdio:"pipe"}),!0}catch{return!1}}async installTool(t){const i=SUPPORTED_TOOLS[t];if(!i)throw new Error(`Unknown tool: ${t}`);const l=s(t)?.installSpec,a=l?k(l):i.installCommand;console.log(r.gray("$ ")+r.white(a));try{return o(a,{stdio:"inherit"}),T(),void console.log(r.green("√ "+n.t("wizard.tool_installed")))}catch(o){if(console.log(r.red("× "+n.t("wizard.install_failed"))),!/EACCES|EPERM|permission denied/i.test(`${o?.message??""}${o?.stderr??""}`)&&243!==o?.status&&!a.startsWith("npm "))throw new Error(`Failed to install ${i.displayName}: ${o}`);console.log(r.yellow(" ! "+("win32"===process.platform?n.t("install.permission_windows",{command:a}):n.t("install.permission_unix",{command:a}))))}const{action:c}=await e.prompt([{type:"list",name:"action",message:n.t("install.what_next"),choices:[{name:n.t("install.installed_continue"),value:"continue"},{name:n.t("install.cancel_install"),value:"cancel"}]}]);if("cancel"===c)throw new Error(n.t("install.user_cancelled"));if(T(),!this.isToolInstalled(t))throw console.log(r.red("× "+n.t("install.still_not_installed",{tool:i.displayName}))),new Error(`${i.displayName} is not installed`);console.log(r.green("√ "+n.t("install.verified_success",{tool:i.displayName})))}getToolConfig(o){const t=s(o);if(!t)throw new Error(`Unknown tool: ${o}`);try{return t.getConfig()}catch(t){return i.warn(`Failed to read config for ${o}:`,t),i.logError(`ToolManager.getToolConfig(${o})`,t),null}}updateToolConfig(o,t){const n=s(o);if(!n)throw new Error(`Unknown tool: ${o}`);if(!n.updateConfig)throw new Error(`Tool ${o} does not support raw config updates`);n.updateConfig(t)}forceResetConfig(o){const t=s(o);if(!t)throw new Error(`Unknown tool: ${o}`);const n=t.forceResetPaths?t.forceResetPaths():this.backupPathsFor(t),e=[];for(const o of n)f(o)&&(d(o),m(o,{force:!0}),e.push(o));return e}loadPrivateConfig(o,t,n,e,r={}){const i=s(o);if(!i)throw new Error(`Unknown tool: ${o}`);r.force&&this.forceResetConfig(o),i.loadPrivateConfig({apiKey:t,baseUrl:l.getBaseUrl(),models:n,settings:l.getToolSettings(o),...e?{catalog:e}:{}})}async applyPrivateConfig(o,t,n,e={}){const r=s(o);if(!r)throw new Error(`Unknown tool: ${o}`);const i=r.wantsModelCatalog?await h(t):null;e.force?this.loadPrivateConfig(o,t,n,i??void 0,{force:!0}):i?this.loadPrivateConfig(o,t,n,i):this.loadPrivateConfig(o,t,n)}applyNotes(o){const t=s(o);if(!t)return[];const e=[];try{t.applyNotes&&e.push(...t.applyNotes())}catch(t){i.logError(`ToolManager.applyNotes(${o})`,t)}const r=this.outdatedVersion(o);if(r){e.push({kind:"action",text:n.t("tools.version_outdated",{current:r.current,min:r.min,upgrade:t.installSpec?`vibecli upgrade ${o}`:t.upgradeCommand||t.installCommand})});for(const o of t.upgradeHints?.(r.min)??[])e.push({kind:"action",text:o})}const l=t.installSpec?y(t.installSpec):[];return l.length>1&&e.push({kind:"action",text:n.t("upgrade.duplicates_note",{count:String(l.length),active:C(l[0]),others:l.slice(1).map(C).join("、"),tool:o})}),e}printApplied(o,t=16){const n=SUPPORTED_TOOLS[o]?.displayName??o,e=this.applyNotes(o);for(const o of e.filter(o=>"detail"===o.kind))i.record(`${n}: ${o.text}`);const l=e.filter(o=>"summary"===o.kind).map(o=>o.text).join(";"),s=" ".repeat(Math.max(1,t-g(n)));console.log(r.green("√ "+n)+(l?s+l:""));for(const o of e.filter(o=>"action"===o.kind))console.log(r.yellow(" ! "+o.text))}installedVersion(o){const n=s(o);if(!n)return null;if(n.installSpec)return y(n.installSpec)[0]?.version??null;if(n.installedVersion)try{return n.installedVersion()}catch(t){return i.logError(`ToolManager.installedVersion(${o})`,t),null}if(n.isInstalled)return null;try{const o={encoding:"utf-8",timeout:1e4,windowsHide:!0,stdio:["ignore","pipe","pipe"]},e=`${("win32"===process.platform?t(`${n.command} --version`,{...o,shell:!0}):t(n.command,["--version"],o)).stdout??""}`.match(/(\d+)\.(\d+)\.(\d+)/);return e?e[0]:null}catch{return null}}outdatedVersion(o){const t=P(o);if(!t)return null;const n=this.installedVersion(o);return n&&w(n,t)<0?{current:n,min:t}:null}unloadPrivateConfig(o){const t=s(o);if(!t)throw new Error(`Unknown tool: ${o}`);t.unloadPrivateConfig()}async clearPinnedModels(o){const t=s(o);if(!t)throw new Error(`Unknown tool: ${o}`);if(l.setToolModel(o,null),!t.clearPinnedModels)return[];const n=l.getApiKeyForTool(o),e=t.wantsModelCatalog&&n?await h(n):null;return t.clearPinnedModels(e??void 0)}supportsClearPinnedModels(o){return Boolean(s(o)?.clearPinnedModels)}detectCurrentConfig(o){const t=s(o);if(!t)throw new Error(`Unknown tool: ${o}`);return t.detectCurrentConfig()}backupPathsFor(o){return o.backupPaths?o.backupPaths():[o.configPath]}listToolBackups(o){const t=s(o);if(!t)throw new Error(`Unknown tool: ${o}`);return this.backupPathsFor(t).map(o=>({file:o,backups:p(o)}))}restorePrivateConfig(o){const t=s(o);if(!t)throw new Error(`Unknown tool: ${o}`);return this.backupPathsFor(t).map(o=>({file:o,result:u(o)}))}getInstalledTools(){return Object.keys(SUPPORTED_TOOLS).filter(o=>this.isToolInstalled(o))}getSupportedTools(){return a().filter(o=>!o.hidden).map(o=>$(o.name))}isGitInstalled(){try{const t="win32"===process.platform?"where git":"which git";return o(t,{stdio:"pipe"}),!0}catch{return!1}}}export const toolManager=ToolManager.getInstance();
|
package/dist/lib/tool-upgrade.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{spawnSync as
|
|
1
|
+
import{spawnSync as r}from"child_process";import{rmSync as e}from"fs";import{join as o}from"path";import t from"chalk";import n from"inquirer";import{i18n as i}from"./i18n.js";import{logger as s}from"../utils/logger.js";import{compareVersions as a,getToolMinVersion as l}from"./model-registry.js";import{getAdapter as p}from"./tools/registry.js";import{findInstalls as c,forgetInstalls as u,installLabel as m,mirrorInstallCommand as g,npmUninstallCommand as d}from"./tools/tool-installs.js";import{toolHome as f}from"./tools/types.js";import{isNonInteractive as w,shouldAutoConfirm as h}from"./runtime-options.js";let v=(e,o)=>{console.log(t.gray("$ ")+[e,...o].join(" "));const n="win32"!==process.platform||/\.exe$/i.test(e)?r(e,o,{stdio:"inherit"}):r([e,...o].map(r=>/\s/.test(r)?`"${r}"`:r).join(" "),{stdio:"inherit",shell:!0});return n.error&&s.logError(`upgrade: ${e}`,n.error),0===n.status};export function setUpgradeRunnerForTests(r){v=r}function y(r){if(r.mirrorScript)return"win32"===process.platform?v("powershell.exe",["-NoProfile","-ExecutionPolicy","Bypass","-Command",`irm ${r.mirrorScript.ps1} | iex`]):v("sh",["-c",g(r)]);const[e,...o]=g(r).split(" "),n=v(e,o);return n||"win32"===process.platform||console.log(t.yellow(" ! "+i.t("upgrade.npm_permission",{command:g(r)}))),n}function _(r,t){switch(t.kind){case"npm":r.npmPackage&&v("npm",["uninstall","-g",r.npmPackage]);break;case"brew":r.brew&&v("brew",["uninstall",r.brew]);break;case"native":try{e(t.path,{force:!0});for(const t of r.native?.dataDirs??[])e(o(f(),...t),{recursive:!0,force:!0})}catch(r){s.logError("upgrade: remove native copy",r)}break;default:return!1}return u(),!c(r).some(r=>r.path===t.path)}function b(r,e){switch(e.kind){case"npm":return d(r);case"brew":return`brew uninstall ${r.brew}`;case"native":return i.t("upgrade.delete_paths",{paths:[e.path,...(r.native?.dataDirs??[]).map(r=>o(f(),...r))].join("、")});default:return i.t("upgrade.delete_paths",{paths:e.path})}}export async function upgradeTool(r){const e=p(r),o=e?.installSpec;if(!e||!o)throw new Error(i.t("upgrade.unsupported",{tool:r}));const g=e.displayName;u();const d=c(o);if(console.log(t.bold(`\n${g}`)),0===d.length)console.log(i.t("upgrade.not_installed_installing",{tool:g})),y(o);else{const r=d[0];console.log(t.gray(" "+i.t("upgrade.current",{copy:m(r)})));const e=function(r,e){switch(e.kind){case"native":return v(e.path,r.native?.updateArgs??["update"]);case"npm":return y(r);case"brew":return!!r.brew&&v("brew",["upgrade",r.brew]);default:return!1}}(o,r);e||"other"!==r.kind?e||"npm"===r.kind||"native"===r.kind&&await async function(r){const e=r.native?.mirrorUpdate;if(!e)return!1;console.log(t.yellow(" ! "+i.t("upgrade.native_mirror_trying")));try{const{version:r,manifestVerified:o}=await e();return console.log(t.green(" √ "+i.t(o?"upgrade.native_mirror_done_verified":"upgrade.native_mirror_done",{version:r}))),!0}catch(r){return s.logError("upgrade: native mirror",r),console.log(t.yellow(" ! "+i.t("upgrade.native_mirror_failed",{reason:r instanceof Error?r.message:String(r)}))),!1}}(o)||(console.log(t.yellow(" ! "+i.t("upgrade.fallback_mirror"))),y(o)):console.log(t.yellow(" ! "+i.t("upgrade.unknown_install",{path:r.path})))}u(),await async function(r,e){const o=c(r);if(o.length<2)return;const s=function(r){return r.reduce((r,e)=>e.version&&(!r.version||a(e.version,r.version)>0)?e:r)}(o),l=o.filter(r=>r!==s);console.log(t.yellow(" ! "+i.t("upgrade.duplicates",{tool:e,keep:m(s),others:l.map(m).join("、")})));let p=h();p||w()||!process.stdin.isTTY||(p=(await n.prompt([{type:"confirm",name:"remove",message:i.t("upgrade.confirm_remove"),default:!0}])).remove);for(const e of l)p&&_(r,e)?console.log(t.green(" √ "+i.t("upgrade.removed",{copy:m(e)}))):console.log(t.yellow(" ! "+i.t("upgrade.remove_by_hand",{how:b(r,e)})))}(o,g),u();const f=c(o)[0];if(!f)return console.log(t.red(" × "+i.t("upgrade.still_missing",{tool:g}))),!1;const k=l(r);if(k&&f.version&&a(f.version,k)<0){console.log(t.yellow(" ! "+i.t("upgrade.still_old",{copy:m(f),min:k})));for(const r of e.upgradeHints?.(k)??[])console.log(t.yellow(" ! "+r));return!1}return console.log(t.green(" √ "+i.t("upgrade.done",{copy:m(f)}))),!0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as t,readFileSync as r}from"fs";import{join as i}from"path";import{i18n as e}from"../i18n.js";import{logger as n}from"../../utils/logger.js";import{readPersistentEnvFile as o,removePersistentEnv as a,writePersistentEnv as s}from"../persistent-env.js";import{backupBeforeWrite as l,atomicWriteFile as
|
|
1
|
+
import{existsSync as t,readFileSync as r}from"fs";import{join as i}from"path";import{i18n as e}from"../i18n.js";import{logger as n}from"../../utils/logger.js";import{readPersistentEnvFile as o,removePersistentEnv as a,writePersistentEnv as s}from"../persistent-env.js";import{backupBeforeWrite as l,atomicWriteFile as p}from"./backup.js";import{mirrorInstallCommand as c}from"./tool-installs.js";import{toolHome as g}from"./types.js";const m="GEMINI_API_KEY",d="GOOGLE_GEMINI_BASE_URL",f="gemini",y=()=>i(g(),".gemini","antigravity-cli"),u=()=>i(y(),"settings.json"),v=()=>i(y(),"vibeapi.env"),b="https://cnb.cool/vibeapi/agy/-/releases/latest/download",h={command:"agy",native:{binDir:"win32"===process.platform?["AppData","Local","agy","bin"]:[".local","bin"],updateArgs:["update"],dataDirs:[]},mirrorScript:{sh:`${b}/install.sh`,ps1:`${b}/install.ps1`}};function j(){if(!t(u()))return{};const i=r(u(),"utf-8");if(!i.trim())return{};try{const t=JSON.parse(i);if(!(e=t)||"object"!=typeof e||Array.isArray(e))throw new Error("settings.json root must be an object");return t}catch(t){throw new Error(`Existing ~/.gemini/antigravity-cli/settings.json cannot be parsed, back it up and fix it first: ${t instanceof Error?t.message:String(t)}`)}var e}function P(t){l(u()),p(u(),JSON.stringify(t,null,2)+"\n")}let E=null;export const antigravityAdapter={name:"agy",displayName:"Antigravity CLI",command:"agy",installCommand:c(h),installSpec:h,configPath:u(),loadPrivateConfig(t){const r=j();var i;E=s("agy",v(),{[m]:t.apiKey,[d]:(i=t.baseUrl,(i||"").replace(/\/+$/,"").replace(/\/v1(beta)?$/,""))}).rcFiles,r.modelProvider!==f&&(r.modelProvider=f,P(r))},unloadPrivateConfig(){try{const t=j();t.modelProvider===f&&(delete t.modelProvider,P(t))}catch(t){n.logError("antigravityAdapter.unloadPrivateConfig",t)}a("agy",v(),[m,d])},detectCurrentConfig(){try{if(j().modelProvider!==f)return{apiKey:null}}catch{return{apiKey:null}}const t=o(v())[m];return{apiKey:t&&t.trim()?t:null}},getConfig(){try{return j()}catch(t){return n.logError("antigravityAdapter.getConfig",t),null}},applyNotes:()=>null===E?[]:0===E.length?[{kind:"action",text:e.t("tools.agy.reopen_terminal_windows")}]:[{kind:"action",text:e.t("tools.agy.reopen_terminal",{rc:E.join(", ")})}],backupPaths:()=>[u(),v()],forceResetPaths:()=>[v()]};
|
package/dist/lib/tools/grok.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as e,readFileSync as t}from"fs";import{join as
|
|
1
|
+
import{existsSync as e,readFileSync as t}from"fs";import{join as o}from"path";import*as r from"@iarna/toml";import{logger as n}from"../../utils/logger.js";import{PROVIDER_KEY as i}from"../brand.js";import{backupBeforeWrite as l,atomicWriteFile as s}from"./backup.js";import{pickModel as d,toolHome as a,withV1 as m}from"./types.js";import{getToolDefaultModel as f}from"../model-registry.js";import{gatewayModelSpecs as c,modelBlurb as g,prettyModelName as u}from"../gateway-models.js";const p=()=>o(o(a(),".grok"),"config.toml"),y=i,h=`${i}-`,k=e=>`${h}${e}`,b=e=>e===y||e.startsWith(h),w="win32"===process.platform?'powershell -c "irm https://x.ai/cli/install.ps1 | iex"':"curl -fsSL https://x.ai/cli/install.sh | bash";function j(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function _(e,t){return j(e[t])||(e[t]={}),e[t]}function C(){if(!e(p()))return{};const o=t(p(),"utf-8");if(!o.trim())return{};try{const e=r.parse(o);if(!j(e))throw new Error("config.toml root must be a TOML table");return e}catch(e){throw new Error(`Existing ~/.grok/config.toml cannot be parsed, back it up and fix it first: ${e instanceof Error?e.message:String(e)}`)}}function v(e){return j(e.model)?Object.entries(e.model).filter(e=>b(e[0])&&j(e[1])):[]}function x(e,t){let o=c("grok",e.catalog?.clientModels);if(e.catalog){const t=new Set(e.catalog.models);o=o.filter(e=>t.has(e.id))}return o.some(e=>e.id===t)?o:[{id:t},...o]}function M(e,t,o){_(e,"endpoints").models_base_url=m(t.baseUrl);const r=_(e,"model"),n=new Map(v(e));for(const e of n.keys())delete r[e];for(const e of o){const o=k(e.id),i={...n.get(o)??{},name:e.name??u(e.id),model:e.id,base_url:m(t.baseUrl),api_key:t.apiKey,context_window:e.contextWindow??5e5,api_backend:"responses",reasoning_summary:"concise"},l=g(e.description);l?i.description=l:delete i.description,r[o]=i}}export const grokAdapter={name:"grok",displayName:"Grok Build",command:"grok",installCommand:w,configPath:p(),wantsModelCatalog:!0,loadPrivateConfig(e){const t=C(),o=d(e.models,f("grok"));M(t,e,x(e,o)),_(t,"models").default=k(o),l(p()),s(p(),r.stringify(t))},unloadPrivateConfig(){if(!e(p()))return;let t;try{t=C()}catch(e){return void n.logError("grokAdapter.unloadPrivateConfig",e)}if(j(t.model)){for(const[e]of v(t))delete t.model[e];0===Object.keys(t.model).length&&delete t.model}j(t.models)&&"string"==typeof t.models.default&&b(t.models.default)&&(delete t.models.default,0===Object.keys(t.models).length&&delete t.models),j(t.endpoints)&&(delete t.endpoints.models_base_url,0===Object.keys(t.endpoints).length&&delete t.endpoints),l(p()),s(p(),r.stringify(t))},detectCurrentConfig(){try{const e=C(),t=v(e),o=j(e.models)?e.models.default:void 0,r=t.find(([e])=>e===o)?.[1]??t[0]?.[1],n=r?r.api_key:null;return{apiKey:"string"==typeof n&&n.trim()?n:null}}catch{return{apiKey:null}}},listedModels(){try{const e=v(C());return e.length>0?e.map(([,e])=>String(e.model)):null}catch{return null}},refreshModelMenu(e){const t=C(),o=_(t,"models"),n="string"==typeof o.default?o.default:void 0,i=n?v(t).find(([e])=>e===n)?.[1].model:void 0,a="string"==typeof i&&n!==y&&e.catalog.models.includes(i)?i:d(e.models,f("grok")),m=r.stringify(t);M(t,e,x(e,a)),(void 0===n||b(n))&&(o.default=k(a)),r.stringify(t)!==m&&(l(p()),s(p(),r.stringify(t)))},getConfig(){try{return C()}catch(e){return n.logError("grokAdapter.getConfig",e),null}}};
|
|
@@ -8,8 +8,16 @@
|
|
|
8
8
|
export interface ToolInstallSpec {
|
|
9
9
|
/** Executable name without extension (`claude`). */
|
|
10
10
|
command: string;
|
|
11
|
-
/** npm package of the global install (`@anthropic-ai/claude-code`). */
|
|
12
|
-
npmPackage
|
|
11
|
+
/** npm package of the global install (`@anthropic-ai/claude-code`); absent for tools not on npm. */
|
|
12
|
+
npmPackage?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Install scripts on our CNB download mirror, for tools not on npm (agy): they take the
|
|
15
|
+
* npm mirror's place when installing and when the vendor updater fails.
|
|
16
|
+
*/
|
|
17
|
+
mirrorScript?: {
|
|
18
|
+
sh: string;
|
|
19
|
+
ps1: string;
|
|
20
|
+
};
|
|
13
21
|
/** The vendor's self-updating install, when there is one. */
|
|
14
22
|
native?: {
|
|
15
23
|
/** Directory under the home directory holding the launcher (`.local/bin`). */
|
|
@@ -38,7 +46,8 @@ export interface ToolInstall {
|
|
|
38
46
|
}
|
|
39
47
|
/** npmmirror carries the same packages (including the per-platform native binaries) and is reachable from mainland China. */
|
|
40
48
|
export declare const NPM_MIRROR = "https://registry.npmmirror.com";
|
|
41
|
-
|
|
49
|
+
/** The China-reachable install command: the CNB mirror's script, or npm from npmmirror. */
|
|
50
|
+
export declare function mirrorInstallCommand(spec: ToolInstallSpec): string;
|
|
42
51
|
export declare function npmUninstallCommand(spec: ToolInstallSpec): string;
|
|
43
52
|
/** `原生安装 2.1.295 (C:\\Users\\me\\.local\\bin\\claude.exe)` */
|
|
44
53
|
export declare function installLabel(install: ToolInstall): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{spawnSync as t}from"child_process";import{existsSync as
|
|
1
|
+
import{spawnSync as t}from"child_process";import{existsSync as r,realpathSync as n,statSync as o}from"fs";import{delimiter as e,dirname as i,isAbsolute as s,join as c}from"path";import{i18n as m}from"../i18n.js";import{toolHome as a}from"./types.js";export const NPM_MIRROR="https://registry.npmmirror.com";export function mirrorInstallCommand(t){return t.mirrorScript?"win32"===process.platform?`powershell -NoProfile -ExecutionPolicy Bypass -Command "irm ${t.mirrorScript.ps1} | iex"`:`curl -fsSL ${t.mirrorScript.sh} | sh`:`npm install -g ${t.npmPackage}@latest --registry=${NPM_MIRROR}`}export function npmUninstallCommand(t){return`npm uninstall -g ${t.npmPackage}`}export function installLabel(t){return`${m.t(`upgrade.kind.${t.kind}`)} ${t.version??"?"} (${t.path})`}let p=r=>{const n={encoding:"utf-8",timeout:1e4,windowsHide:!0,stdio:["ignore","pipe","pipe"]};return`${(/\.cmd$/i.test(r)?t(`"${r}" --version`,{...n,shell:!0}):t(r,["--version"],n)).stdout??""}`};const l=new Map;export function setVersionRunnerForTests(t){p=t,l.clear()}export function forgetInstalls(){l.clear()}function u(t){try{return o(t).isFile()}catch{return!1}}function f(t,o){if(t.native&&(e=i(o),s=c(a(),...t.native.binDir),"win32"===process.platform?e.toLowerCase()===s.toLowerCase():e===s))return"native";var e,s;const m=t.npmPackage?c("node_modules",...t.npmPackage.split("/")):null;if(m&&r(c(i(o),m)))return"npm";let p=o;try{p=n(o)}catch{return"other"}return m&&p.includes(m)?"npm":/[\\/](Cellar|Caskroom)[\\/]/.test(p)?"brew":"other"}export function findInstalls(t){const r=l.get(t.command);if(r)return r;const o="win32"===process.platform?[`${t.command}.exe`,`${t.command}.cmd`]:[t.command],i=new Set,m=[];for(const r of(process.env.PATH??"").split(e))if(r&&s(r))for(const e of o){const o=c(r,e);if(!u(o))continue;let s=o;try{s=n(o)}catch{}const a="win32"===process.platform?s.toLowerCase():s;if(i.has(a))continue;i.add(a);const l=p(o).match(/(\d+)\.(\d+)\.(\d+)/);m.push({path:o,kind:f(t,o),version:l?l[0]:null})}return l.set(t.command,m),m}
|
package/dist/locales/en_US.json
CHANGED
|
@@ -431,8 +431,8 @@
|
|
|
431
431
|
"supported": "Supported tools: {{tools}}",
|
|
432
432
|
"nothing_installed": "None of {{tools}} is installed",
|
|
433
433
|
"current": "Current: {{copy}}",
|
|
434
|
-
"not_installed_installing": "{{tool}} not found; installing from the
|
|
435
|
-
"fallback_mirror": "The official upgrade failed; installing from the
|
|
434
|
+
"not_installed_installing": "{{tool}} not found; installing from the China mirror",
|
|
435
|
+
"fallback_mirror": "The official upgrade failed; installing from the China mirror instead",
|
|
436
436
|
"unknown_install": "Unknown install source ({{path}}); upgrade it the way it was installed",
|
|
437
437
|
"npm_permission": "npm cannot write the global directory: use sudo {{command}}, or run npm config set prefix ~/.npm-global, add ~/.npm-global/bin to PATH and retry",
|
|
438
438
|
"duplicates": "Several copies of {{tool}}: keeping {{keep}}; extra: {{others}}",
|
package/dist/locales/zh_CN.json
CHANGED
|
@@ -431,8 +431,8 @@
|
|
|
431
431
|
"supported": "支持的工具:{{tools}}",
|
|
432
432
|
"nothing_installed": "没有找到已安装的 {{tools}}",
|
|
433
433
|
"current": "当前:{{copy}}",
|
|
434
|
-
"not_installed_installing": "没有找到 {{tool}}
|
|
435
|
-
"fallback_mirror": "
|
|
434
|
+
"not_installed_installing": "没有找到 {{tool}},用国内镜像安装",
|
|
435
|
+
"fallback_mirror": "官方渠道升级失败,改用国内镜像安装",
|
|
436
436
|
"unknown_install": "不认识这份安装的来源({{path}}),没法自动升级,请按当初的安装方式升级",
|
|
437
437
|
"npm_permission": "npm 没有权限写全局目录:可以用 sudo {{command}},或运行 npm config set prefix ~/.npm-global 并把 ~/.npm-global/bin 加进 PATH 后重试",
|
|
438
438
|
"duplicates": "本机有多份 {{tool}},保留 {{keep}},多余的是 {{others}}",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeapi/cli",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.82",
|
|
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",
|