@vibeapi/cli 0.0.84 → 0.0.85

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.
@@ -1 +1 @@
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 s,atomicWriteFile as l}from"./backup.js";import{pickModel as d,toolHome as a,withV1 as f}from"./types.js";import{getToolDefaultModel as m}from"../model-registry.js";import{gatewayModelSpecs as c,modelBlurb as g,modelFamily as u,prettyModelName as p}from"../gateway-models.js";const y=()=>o(o(a(),".grok"),"config.toml"),h=i,k=`${i}-`,b=["low","medium","high","xhigh"],w=e=>`${k}${e}`,_=e=>e===h||e.startsWith(k),j="win32"===process.platform?'powershell -c "irm https://x.ai/cli/install.ps1 | iex"':"curl -fsSL https://x.ai/cli/install.sh | bash";function x(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function C(e,t){return x(e[t])||(e[t]={}),e[t]}function v(){if(!e(y()))return{};const o=t(y(),"utf-8");if(!o.trim())return{};try{const e=r.parse(o);if(!x(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 M(e){return x(e.model)?Object.entries(e.model).filter(e=>_(e[0])&&x(e[1])):[]}function E(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 A(e,t,o){C(e,"endpoints").models_base_url=f(t.baseUrl);const r=C(e,"model"),n=new Map(M(e));for(const e of n.keys())delete r[e];for(const e of o){const o=w(e.id),i={...n.get(o)??{},name:e.name??p(e.id),model:e.id,base_url:f(t.baseUrl),api_key:t.apiKey,context_window:e.contextWindow??5e5,api_backend:"responses",reasoning_summary:"concise"};"grok"===u(e.id)&&(i.supports_reasoning_effort=!0,i.reasoning_efforts=b);const s=g(e.description);s?i.description=s:delete i.description,r[o]=i}}export const grokAdapter={name:"grok",displayName:"Grok Build",command:"grok",installCommand:j,configPath:y(),wantsModelCatalog:!0,loadPrivateConfig(e){const t=v(),o=d(e.models,m("grok"));A(t,e,E(e,o)),C(t,"models").default=w(o),s(y()),l(y(),r.stringify(t))},unloadPrivateConfig(){if(!e(y()))return;let t;try{t=v()}catch(e){return void n.logError("grokAdapter.unloadPrivateConfig",e)}if(x(t.model)){for(const[e]of M(t))delete t.model[e];0===Object.keys(t.model).length&&delete t.model}x(t.models)&&"string"==typeof t.models.default&&_(t.models.default)&&(delete t.models.default,0===Object.keys(t.models).length&&delete t.models),x(t.endpoints)&&(delete t.endpoints.models_base_url,0===Object.keys(t.endpoints).length&&delete t.endpoints),s(y()),l(y(),r.stringify(t))},detectCurrentConfig(){try{const e=v(),t=M(e),o=x(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=M(v());return e.length>0?e.map(([,e])=>String(e.model)):null}catch{return null}},refreshModelMenu(e){const t=v(),o=C(t,"models"),n="string"==typeof o.default?o.default:void 0,i=n?M(t).find(([e])=>e===n)?.[1].model:void 0,a="string"==typeof i&&n!==h&&e.catalog.models.includes(i)?i:d(e.models,m("grok")),f=r.stringify(t);A(t,e,E(e,a)),(void 0===n||_(n))&&(o.default=w(a)),r.stringify(t)!==f&&(s(y()),l(y(),r.stringify(t)))},getConfig(){try{return v()}catch(e){return n.logError("grokAdapter.getConfig",e),null}}};
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 s,atomicWriteFile as l}from"./backup.js";import{pickModel as a,toolHome as d,withV1 as m}from"./types.js";import{i18n as f}from"../i18n.js";import{getToolDefaultModel as c}from"../model-registry.js";import{gatewayModelSpecs as g,modelBlurb as u,modelFamily as p,prettyModelName as y}from"../gateway-models.js";const h=()=>o(o(d(),".grok"),"config.toml"),k=i,b=`${i}-`,w=["low","medium","high","xhigh"];let _=null;const j=e=>`${b}${e}`,x=e=>e===k||e.startsWith(b),C="win32"===process.platform?'powershell -c "irm https://x.ai/cli/install.ps1 | iex"':"curl -fsSL https://x.ai/cli/install.sh | bash";function v(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}function M(e,t){return v(e[t])||(e[t]={}),e[t]}function E(){if(!e(h()))return{};const o=t(h(),"utf-8");if(!o.trim())return{};try{const e=r.parse(o);if(!v(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 A(e){return v(e.model)?Object.entries(e.model).filter(e=>x(e[0])&&v(e[1])):[]}function O(e,t){let o=g("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 S(e,t,o){M(e,"endpoints").models_base_url=m(t.baseUrl);const r=M(e,"model"),n=new Map(A(e));for(const e of n.keys())delete r[e];for(const e of o){const o=j(e.id),i={...n.get(o)??{},name:e.name??y(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"};"grok"===p(e.id)&&(i.supports_reasoning_effort=!0,i.reasoning_efforts=w);const s=u(e.description);s?i.description=s:delete i.description,r[o]=i}}export const grokAdapter={name:"grok",displayName:"Grok Build",command:"grok",installCommand:C,configPath:h(),wantsModelCatalog:!0,loadPrivateConfig(e){const t=E(),o=a(e.models,c("grok")),n=O(e,o);S(t,e,n);const i=e=>e.name??y(e.id);_={names:n.map(i),defaultName:i(n.find(e=>e.id===o))},M(t,"models").default=j(o),s(h()),l(h(),r.stringify(t))},unloadPrivateConfig(){if(!e(h()))return;let t;try{t=E()}catch(e){return void n.logError("grokAdapter.unloadPrivateConfig",e)}if(v(t.model)){for(const[e]of A(t))delete t.model[e];0===Object.keys(t.model).length&&delete t.model}v(t.models)&&"string"==typeof t.models.default&&x(t.models.default)&&(delete t.models.default,0===Object.keys(t.models).length&&delete t.models),v(t.endpoints)&&(delete t.endpoints.models_base_url,0===Object.keys(t.endpoints).length&&delete t.endpoints),s(h()),l(h(),r.stringify(t))},detectCurrentConfig(){try{const e=E(),t=A(e),o=v(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=A(E());return e.length>0?e.map(([,e])=>String(e.model)):null}catch{return null}},refreshModelMenu(e){const t=E(),o=M(t,"models"),n="string"==typeof o.default?o.default:void 0,i=n?A(t).find(([e])=>e===n)?.[1].model:void 0,d="string"==typeof i&&n!==k&&e.catalog.models.includes(i)?i:a(e.models,c("grok")),m=r.stringify(t);S(t,e,O(e,d)),(void 0===n||x(n))&&(o.default=j(d)),r.stringify(t)!==m&&(s(h()),l(h(),r.stringify(t)))},applyNotes:()=>_?[{kind:"summary",text:f.t("tools.grok.menu_written",{count:String(_.names.length),list:_.names.join(f.t("tools.grok.list_separator")),default:_.defaultName})}]:[],getConfig(){try{return E()}catch(e){return n.logError("grokAdapter.getConfig",e),null}}};
@@ -381,6 +381,10 @@
381
381
  "reopen_terminal": "Key and address were added to {{rc}}; open a new terminal before running agy",
382
382
  "reopen_terminal_windows": "Key and address were saved as user environment variables; reopen the terminal before running agy"
383
383
  },
384
+ "grok": {
385
+ "menu_written": "{{count}} models in the menu ({{list}}), default {{default}}",
386
+ "list_separator": ", "
387
+ },
384
388
  "codex": {
385
389
  "catalog_written": "{{count}} models in the menu ({{breakdown}}); reopen the Codex desktop app to see them",
386
390
  "catalog_skipped": "Couldn't read Codex's built-in model list (not installed, or older than 0.122), so the menu has GPT models only; install or upgrade Codex and run this again"
@@ -381,6 +381,10 @@
381
381
  "reopen_terminal": "Key 与地址已写入 {{rc}},新开一个终端再运行 agy",
382
382
  "reopen_terminal_windows": "Key 与地址已写入用户环境变量,重新打开终端再运行 agy"
383
383
  },
384
+ "grok": {
385
+ "menu_written": "模型菜单 {{count}} 个({{list}}),默认 {{default}}",
386
+ "list_separator": "、"
387
+ },
384
388
  "codex": {
385
389
  "catalog_written": "模型菜单 {{count}} 个({{breakdown}}),Codex 桌面版重开后生效",
386
390
  "catalog_skipped": "没读到 Codex 自带的模型列表(未安装或版本低于 0.122),模型菜单只有 GPT;安装或升级 Codex 后再运行一次"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeapi/cli",
3
- "version": "0.0.84",
3
+ "version": "0.0.85",
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",