@vibeapi/cli 0.0.81 → 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.
|
@@ -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/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}}};
|
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",
|