@marsapi/cli 0.0.161 → 0.0.166
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/client-config.snapshot.json +1912 -141
- package/dist/client-config.snapshot.json +1912 -141
- package/dist/commands/setup.js +1 -1
- package/dist/lib/tools/antigravity.js +1 -1
- package/dist/lib/tools/codebuddy.js +1 -1
- package/dist/lib/tools/dsh.js +1 -0
- package/dist/lib/tools/registry.js +1 -1
- package/dist/locales/en_US.json +12 -2
- package/dist/locales/zh_CN.json +12 -2
- package/dist/models.json +5 -2
- package/models.json +5 -2
- package/package.json +1 -1
package/dist/commands/setup.js
CHANGED
|
@@ -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 l}from"../lib/i18n.js";import{configManager as s}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 f,CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING as m}from"../lib/tools/claude-desktop.js";import{operationError as g,authenticationError as y,networkError as k,EXIT_CODES as _}from"../lib/errors.js";import{canPrompt as h,emitJson as b,isColorEnabled as w,isDryRun as v,isJsonMode as x,isNonInteractive as C,shouldAutoConfirm as j}from"../lib/runtime-options.js";import{appsForTools as K,appUpgradeCommand as T,getApp as $}from"../lib/app-update.js";import{join as G}from"path";import{asksBeforeWriting as M,confirmWritePlan as I,printWritePlan as O,toolWritePlan as S}from"../lib/write-plan.js";import N from"inquirer";import{logger as E}from"../utils/logger.js";import{forgetInstalls as A}from"../lib/tools/tool-installs.js";import{CLI_NAME as B,brandEnv as D}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},{option:"codebuddykey",tool:"codebuddy",need:"any"},{option:"workbuddykey",tool:"workbuddy",need:"any"}];async function F(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 L(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 R(e){console.log(o.green(e))}function q(e){console.log(o.yellow(e))}function P(e){console.error(o.red(e))}let Y=null;function z(o){const e={operation:1,authentication:2,network:3};(!Y||e[o]>e[Y])&&(Y=o)}async function H(e,t){x()||console.log(o.gray(l.t("setup.validating",{label:e})));const i=await r(t);if(i.valid)return!0;const a=l.t("errors.key_placeholder"),n="--key"===e?`${B} setup --key ${a}`:`${B} setup ${e} ${a}`;let p;if("network_error"===i.error?(z("network"),p=k(l.t("setup.unreachable",{url:s.getBaseUrl(),reason:i.message||"network error"}),`${B} base auto`,"network_error")):"invalid_api_key"===i.error?(z("authentication"),p=y(l.t("setup.invalid_key",{label:e,reason:i.message||"invalid"}),n,"invalid_api_key")):(z("operation"),p=g(l.t("setup.validate_failed",{label:e,reason:i.message||i.error||"unknown"}),n,i.error)),x())throw p;return P(p.message),console.log(o.gray(l.t("errors.next_step",{command:p.hint}))),!1}async function W(t,i,r={}){const{oneMillion:p,officialLogin:c,desktopRegistry:u,force:y,takeOver:k}=r,_=n[t];try{"claude-desktop"===t&&void 0!==u&&s.setToolSetting("claude-desktop",f,u),"codex"===t&&void 0!==p&&s.setToolSetting("codex",d,p),"claude-desktop"===t&&void 0!==c&&s.setToolSetting("claude-desktop",m,!c),await a.applyPrivateConfig(t,i,s.getModelsForTool(t),{force:y,takeOver:k})}catch(o){if(x())throw g(o instanceof Error?o.message:String(o),`${B} setup --key ${l.t("errors.key_placeholder")}`,"config_write_failed");const e=(o instanceof Error?o.message:String(o)).replace(/\s+/g," ").trim();return P("× "+l.t("setup.apply_failed",{tool:_.displayName,reason:e})),!1}return a.printApplied(t),y&&console.log(o.gray(" "+l.t("config.force_done",{tool:_.displayName,name:t}))),"codex"===t&&void 0!==p&&console.log(o.gray(" "+l.t(p?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))),e(t)?.isInstalled&&!a.isToolInstalled(t)&&console.log(o.yellow(" ! "+l.t("setup.gui_preconfigured",{tool:_.displayName,install:_.installCommand}))),!0}function U(o){return!e(o)?.isInstalled&&!a.isToolInstalled(o)}export async function installMissingApps(e,t){const i=K(e).filter(o=>{const e=$(o)?.appInstaller;try{return Boolean(e&&!e.blocker()&&!e.installedPath())}catch(e){return E.logError(`setup: app installed? ${o}`,e),!1}});if(0===i.length)return!1;const s=o=>$(o)?.displayName??o;let a=t;if(void 0===a&&!x())if(j())a=!C();else if(h()){const o=i.map(s).join(l.t("setup.list_separator")),e=i.reduce((o,e)=>o+($(e)?.appInstaller.sizeMb()??0),0);console.log(""),a=(await N.prompt([{type:"confirm",name:"go",message:l.t("setup.install_app_confirm",{tools:o,size:String(e)}),default:!0}])).go}if(!a&&!x())for(const e of i)console.log(o.gray(l.t("setup.install_app_hint",{tool:s(e),command:T(e)})));return Boolean(a)}function J(o){q(l.t("setup.still_missing",{tools:o.map(o=>n[o].displayName).join(l.t("setup.list_separator")),commands:o.map(o=>`${B} config ${o} --yes`).join(l.t("setup.list_separator"))}))}function Q(e,t,i=[]){const a=S(e),n=G(s.getConfigDir(),"config.yaml");if(x())b({dry_run:!0,tools:a,install_first:i,key_file:t?n:null});else{if(0===a.length&&0===i.length){const e=(w()?o.cyan:o=>o)(l.t("runtime.dry_run_label"));return void console.log(`${e} ${l.t("setup.dry_run_none")}`)}O(a,{label:l.t("runtime.dry_run_label"),keyFile:t?n:void 0,installFirst:i})}}function V(){return"darwin"===process.platform||"win32"===process.platform||a.isToolInstalled("claude-desktop")}export async function setupCommand(r){Y=null;const p=r.key?.trim(),f=DEDICATED_KEYS.map(o=>({...o,apiKey:r[o.option]?.trim()})).filter(o=>Boolean(o.apiKey)),m=void 0!==r.oneMillion,g=void 0!==r.claudeOfficial;let y;if(g&&(y=parseOnOff(r.claudeOfficial),void 0===y))return P(l.t("setup.claude_official_invalid",{value:String(r.claudeOfficial)})),void(process.exitCode=1);const k=void 0!==r.desktopRegistry;let h;if(k&&(h=parseOnOff(r.desktopRegistry),void 0===h))return P(l.t("setup.desktop_registry_invalid",{value:String(r.desktopRegistry)})),void(process.exitCode=1);const b=g||k,w=Boolean(p||f.length>0),K={oneMillion:r.oneMillion,officialLogin:y,desktopRegistry:h,force:r.force};if(!w&&(m||b)&&v())return void Q([...m?["codex"]:[],...b?["claude-desktop"]:[]],!1);if(!w&&(m||b)){if(m){const o=s.getApiKeyForTool("codex");if(o)try{const e=!0===r.oneMillion;s.setToolSetting("codex",d,e);const t=await u(o);c(e,t??void 0),R(l.t(e?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))}catch(o){P(l.t("setup.apply_failed",{tool:n.codex.displayName,reason:o instanceof Error?o.message:String(o)})),process.exitCode=1}else P(l.t("setup.codex_1m_missing_key")),process.exitCode=1}if(b){const o=s.getApiKeyForTool("claude-desktop");o?await W("claude-desktop",o,{...K,oneMillion:void 0,takeOver:!0})?await t(["claude-desktop"],{apps:{install:!1}}):process.exitCode=1:(P(l.t("setup.desktop_official_login_missing_key")),process.exitCode=1)}return}if(!w)return P(l.t("setup.usage")),void(process.exitCode=1);const T=v();T||await i(p||f[0].apiKey);const $=[],O=[];let S,z=0,X=0;const Z=new Set,oo=f.map(o=>({tool:o.tool,label:`--${o.option}`,apiKey:o.apiKey,need:o.need}));for(const o of oo){if(!await H(o.label,o.apiKey)){X+=1;continue}const e=await F(o.apiKey);!e.probed||L(e,o.need)?(e.probed||q(l.t("setup.probe_failed",{label:o.label})),$.push({tool:o.tool,apiKey:o.apiKey,dedicated:!0}),Z.add(o.tool)):(P(l.t(`setup.key_no_${o.need}`,{label:o.label,tool:n[o.tool].displayName})),X+=1)}const eo=!!p&&await H("--key",p);p&&!eo&&(S=_[Y??"operation"]);const to=p&&eo?await F(p):void 0;if(p&&to&&!to.probed&&q(l.t("setup.probe_failed",{label:"--key"})),!(p&&to&&to.probed)||to.hasClaude||to.hasGpt||to.hasGrok||to.hasGemini||(P(l.t("setup.key_no_family")),S=1),p&&to&&void 0===S){const o=to.hasClaude||to.hasGpt||to.hasGrok||to.hasGemini,e=[{tool:"claude-code",capable:to.hasClaude,skipMsg:l.t(V()?"setup.skip_no_claude_desktop":"setup.skip_no_claude")},{tool:"codex",capable:to.hasGpt,skipMsg:l.t("setup.skip_no_gpt")},{tool:"grok",capable:to.hasGrok,skipMsg:l.t("setup.skip_no_grok")},{tool:"claude-desktop",capable:to.hasClaude&&V(),skipMsg:"",quiet:!0},{tool:"agy",capable:to.hasGemini,skipMsg:l.t("setup.skip_no_gemini")},{tool:"codebuddy",capable:o&&a.isToolInstalled("codebuddy"),skipMsg:"",quiet:!0},{tool:"workbuddy",capable:o&&a.isToolInstalled("workbuddy"),skipMsg:"",quiet:!0}];for(const o of e)Z.has(o.tool)||(o.capable?($.push({tool:o.tool,apiKey:p,dedicated:!1}),Z.add(o.tool)):o.quiet||q(o.skipMsg))}const io=Boolean(p&&eo&&void 0===S);if(T)return Q($.filter(o=>!U(o.tool)).map(o=>o.tool),$.length>0,$.filter(o=>U(o.tool)).map(o=>o.tool)),void((X>0||void 0!==S)&&(process.exitCode=S??_[Y??"operation"]));const lo=$.filter(o=>!U(o.tool)),so=io||$.some(o=>o.dedicated),ao=!r.fromInstaller&&M();if(($.length>0||so)&&!r.fromInstaller&&!await I(lo.map(o=>o.tool),{keyFile:so?G(s.getConfigDir(),"config.yaml"):void 0,installFirst:$.filter(o=>U(o.tool)).map(o=>o.tool)}))return void(process.exitCode=_.cancelled);io&&p&&s.setApiKey(p);for(const o of $)o.dedicated&&s.setToolApiKey(o.tool,o.apiKey),U(o.tool)?O.push({tool:o.tool,apiKey:o.apiKey}):await W(o.tool,o.apiKey,{...K,takeOver:o.dedicated||ao})?z+=1:(X+=1,Z.delete(o.tool));if(void 0!==S)return O.length>0&&J(O.map(o=>o.tool)),void(process.exitCode=S);let no=[];if(O.length>0){const e=await async function(e,t,i){const s=e.map(o=>o.tool);if(0===s.length)return{still:[],applied:[],failed:[]};const r=s.map(o=>n[o].displayName).join(l.t("setup.list_separator"));let p=t;if(void 0!==p||x()||(j()?p=!C():process.stdin.isTTY&&(console.log(""),p=(await N.prompt([{type:"confirm",name:"go",message:l.t("setup.install_confirm",{tools:r}),default:!0}])).go)),!p){console.log("");for(const e of s)console.log(o.yellow("! "+l.t("setup.install_hint",{tool:n[e].displayName,install:n[e].installCommand})));return x()||console.log(o.gray(l.t("setup.install_all_hint",{cli:B}))),{still:s,applied:[],failed:[]}}const d=[];for(const e of s){console.log(o.bold(`\n${n[e].displayName}`));try{await a.installTool(e)}catch(o){E.logError(`setup: install ${e}`,o)}A(),a.isToolInstalled(e)||d.push(e)}const c=s.filter(o=>!d.includes(o));c.length>0&&console.log("");const u=[],f=[];for(const{tool:o,apiKey:t}of e.filter(o=>c.includes(o.tool)))await W(o,t,i)?u.push(o):f.push(o);return{still:d,applied:u,failed:f}}(O,r.install,K);no=e.still,z+=e.applied.length,X+=e.failed.length;for(const o of[...no,...e.failed])Z.delete(o)}if(z>0){const t=[...Z].filter(o=>!e(o)?.isInstalled&&!no.includes(o)),i=t.map(o=>n[o]?.command).filter(Boolean).join(" / "),s=l.t("setup.done",{count:String(z)});R("\n"+(i?`${s}${l.t("setup.done_commands",{commands:i})}`:s)),no.length>0&&J(no);for(const o of t){const e=a.ensureNativeOnPath(o);e&&R(l.t("setup.path_added",{tool:n[o].displayName,dir:e}))}const r=t.filter(o=>!a.isOnPath(o));if(r.length>0&&!x()&&"1"!==D("PATH_HINT_BY_CALLER")){const e=r.map(o=>n[o].command).join(" / ");console.log(o.yellow(" ! "+l.t("win32"===process.platform?"setup.path_reload_windows":"setup.path_reload",{commands:e})))}}0===z&&no.length>0&&J(no),X>0&&(P(l.t("setup.failed_summary",{count:String(X)})),x()||console.error(`${B} setup --key ${l.t("errors.key_placeholder")}`)),await t([...Z],{apps:{install:await installMissingApps([...Z],r.install)}}),(X>0||0===z&&0===no.length)&&(process.exitCode=_[Y??"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 l}from"./base.js";import{i18n as i}from"../lib/i18n.js";import{configManager as s}from"../lib/config.js";import{toolManager as a,SUPPORTED_TOOLS as n}from"../lib/tool-manager.js";import{validateApiKey as r,fetchModels as d}from"../lib/api-validator.js";import{CODEX_ONE_MILLION_CONTEXT_SETTING as p,setCodexOneMillionContext as c}from"../lib/tools/codex.js";import{resolveModelCatalog as u}from"../lib/model-catalog.js";import{CLAUDE_DESKTOP_FORCE_REGISTRY_SETTING as f,CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING as m}from"../lib/tools/claude-desktop.js";import{operationError as g,authenticationError as y,networkError as k,EXIT_CODES as _}from"../lib/errors.js";import{canPrompt as h,emitJson as b,hasExplicitYes as w,isColorEnabled as v,isDryRun as x,isJsonMode as C,isNonInteractive as j,shouldAutoConfirm as T}from"../lib/runtime-options.js";import{appsForTools as K,appUpgradeCommand as $,getApp as M}from"../lib/app-update.js";import{join as G}from"path";import{confirmAction as I}from"../lib/confirm.js";import{asksBeforeWriting as O,confirmWritePlan as S,printWritePlan as N,toolWritePlan as E}from"../lib/write-plan.js";import A from"inquirer";import{logger as B}from"../utils/logger.js";import{forgetInstalls as D}from"../lib/tools/tool-installs.js";import{CLI_NAME as F,brandEnv as q}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},{option:"codebuddykey",tool:"codebuddy",need:"any"},{option:"workbuddykey",tool:"workbuddy",need:"any"},{option:"dshkey",tool:"dsh",need:"any"}];async function L(o){const e=await d(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 R(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 P(e){console.log(o.green(e))}function Y(e){console.log(o.yellow(e))}function z(e){console.error(o.red(e))}let H=null;function W(o){const e={operation:1,authentication:2,network:3};(!H||e[o]>e[H])&&(H=o)}async function U(e,t){C()||console.log(o.gray(i.t("setup.validating",{label:e})));const l=await r(t);if(l.valid)return!0;const a=i.t("errors.key_placeholder"),n="--key"===e?`${F} setup --key ${a}`:`${F} setup ${e} ${a}`;let d;if("network_error"===l.error?(W("network"),d=k(i.t("setup.unreachable",{url:s.getBaseUrl(),reason:l.message||"network error"}),`${F} base auto`,"network_error")):"invalid_api_key"===l.error?(W("authentication"),d=y(i.t("setup.invalid_key",{label:e,reason:l.message||"invalid"}),n,"invalid_api_key")):(W("operation"),d=g(i.t("setup.validate_failed",{label:e,reason:l.message||l.error||"unknown"}),n,l.error)),C())throw d;return z(d.message),console.log(o.gray(i.t("errors.next_step",{command:d.hint}))),!1}async function V(t,l,r={}){const{oneMillion:d,officialLogin:c,desktopRegistry:u,force:y,takeOver:k}=r,_=n[t];try{"claude-desktop"===t&&void 0!==u&&s.setToolSetting("claude-desktop",f,u),"codex"===t&&void 0!==d&&s.setToolSetting("codex",p,d),"claude-desktop"===t&&void 0!==c&&s.setToolSetting("claude-desktop",m,!c),await a.applyPrivateConfig(t,l,s.getModelsForTool(t),{force:y,takeOver:k})}catch(o){if(C())throw g(o instanceof Error?o.message:String(o),`${F} setup --key ${i.t("errors.key_placeholder")}`,"config_write_failed");const e=(o instanceof Error?o.message:String(o)).replace(/\s+/g," ").trim();return z("× "+i.t("setup.apply_failed",{tool:_.displayName,reason:e})),!1}return a.printApplied(t),y&&console.log(o.gray(" "+i.t("config.force_done",{tool:_.displayName,name:t}))),"codex"===t&&void 0!==d&&console.log(o.gray(" "+i.t(d?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))),e(t)?.isInstalled&&!a.isToolInstalled(t)&&console.log(o.yellow(" ! "+i.t("setup.gui_preconfigured",{tool:_.displayName,install:_.installCommand}))),!0}function J(o){return!e(o)?.isInstalled&&!a.isToolInstalled(o)}async function Q(o){if(w())return!0;const e=n[o]?.displayName??o;return h()?I({message:i.t("setup.ask_detected_tool",{tool:e}),defaultValue:!0}):(Y(i.t("setup.detected_tool_hint",{tool:e,name:o})),!1)}export async function installMissingApps(e,t){const l=K(e).filter(o=>{const e=M(o)?.appInstaller;try{return Boolean(e&&!e.blocker()&&!e.installedPath())}catch(e){return B.logError(`setup: app installed? ${o}`,e),!1}});if(0===l.length)return!1;const s=o=>M(o)?.displayName??o;let a=t;if(void 0===a&&!C())if(T())a=!j();else if(h()){const o=l.map(s).join(i.t("setup.list_separator")),e=l.reduce((o,e)=>o+(M(e)?.appInstaller.sizeMb()??0),0);console.log(""),a=(await A.prompt([{type:"confirm",name:"go",message:i.t("setup.install_app_confirm",{tools:o,size:String(e)}),default:!0}])).go}if(!a&&!C())for(const e of l)console.log(o.gray(i.t("setup.install_app_hint",{tool:s(e),command:$(e)})));return Boolean(a)}function X(o){Y(i.t("setup.still_missing",{tools:o.map(o=>n[o].displayName).join(i.t("setup.list_separator")),commands:o.map(o=>`${F} config ${o} --yes`).join(i.t("setup.list_separator"))}))}function Z(e,t,l=[]){const a=E(e),n=G(s.getConfigDir(),"config.yaml");if(C())b({dry_run:!0,tools:a,install_first:l,key_file:t?n:null});else{if(0===a.length&&0===l.length){const e=(v()?o.cyan:o=>o)(i.t("runtime.dry_run_label"));return void console.log(`${e} ${i.t("setup.dry_run_none")}`)}N(a,{label:i.t("runtime.dry_run_label"),keyFile:t?n:void 0,installFirst:l})}}function oo(){return"darwin"===process.platform||"win32"===process.platform||a.isToolInstalled("claude-desktop")}export async function setupCommand(r){H=null;const d=r.key?.trim(),f=DEDICATED_KEYS.map(o=>({...o,apiKey:r[o.option]?.trim()})).filter(o=>Boolean(o.apiKey)),m=void 0!==r.oneMillion,g=void 0!==r.claudeOfficial;let y;if(g&&(y=parseOnOff(r.claudeOfficial),void 0===y))return z(i.t("setup.claude_official_invalid",{value:String(r.claudeOfficial)})),void(process.exitCode=1);const k=void 0!==r.desktopRegistry;let h;if(k&&(h=parseOnOff(r.desktopRegistry),void 0===h))return z(i.t("setup.desktop_registry_invalid",{value:String(r.desktopRegistry)})),void(process.exitCode=1);const b=g||k,w=Boolean(d||f.length>0),v={oneMillion:r.oneMillion,officialLogin:y,desktopRegistry:h,force:r.force};if(!w&&(m||b)&&x())return void Z([...m?["codex"]:[],...b?["claude-desktop"]:[]],!1);if(!w&&(m||b)){if(m){const o=s.getApiKeyForTool("codex");if(o)try{const e=!0===r.oneMillion;s.setToolSetting("codex",p,e);const t=await u(o);c(e,t??void 0),P(i.t(e?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))}catch(o){z(i.t("setup.apply_failed",{tool:n.codex.displayName,reason:o instanceof Error?o.message:String(o)})),process.exitCode=1}else z(i.t("setup.codex_1m_missing_key")),process.exitCode=1}if(b){const o=s.getApiKeyForTool("claude-desktop");o?await V("claude-desktop",o,{...v,oneMillion:void 0,takeOver:!0})?await t(["claude-desktop"],{apps:{install:!1}}):process.exitCode=1:(z(i.t("setup.desktop_official_login_missing_key")),process.exitCode=1)}return}if(!w)return z(i.t("setup.usage")),void(process.exitCode=1);const K=x();K||await l(d||f[0].apiKey);const $=[],M=[];let I,N=0,E=0;const W=new Set,eo=f.map(o=>({tool:o.tool,label:`--${o.option}`,apiKey:o.apiKey,need:o.need}));for(const o of eo){if(!await U(o.label,o.apiKey)){E+=1;continue}const e=await L(o.apiKey);!e.probed||R(e,o.need)?(e.probed||Y(i.t("setup.probe_failed",{label:o.label})),$.push({tool:o.tool,apiKey:o.apiKey,dedicated:!0}),W.add(o.tool)):(z(i.t(`setup.key_no_${o.need}`,{label:o.label,tool:n[o.tool].displayName})),E+=1)}const to=!!d&&await U("--key",d);d&&!to&&(I=_[H??"operation"]);const lo=d&&to?await L(d):void 0;if(d&&lo&&!lo.probed&&Y(i.t("setup.probe_failed",{label:"--key"})),!(d&&lo&&lo.probed)||lo.hasClaude||lo.hasGpt||lo.hasGrok||lo.hasGemini||(z(i.t("setup.key_no_family")),I=1),d&&lo&&void 0===I){const o=lo.hasClaude||lo.hasGpt||lo.hasGrok||lo.hasGemini,e=[{tool:"claude-code",capable:lo.hasClaude,skipMsg:i.t(oo()?"setup.skip_no_claude_desktop":"setup.skip_no_claude")},{tool:"codex",capable:lo.hasGpt,skipMsg:i.t("setup.skip_no_gpt")},{tool:"grok",capable:lo.hasGrok,skipMsg:i.t("setup.skip_no_grok")},{tool:"claude-desktop",capable:lo.hasClaude&&oo(),skipMsg:"",quiet:!0},{tool:"agy",capable:lo.hasGemini,skipMsg:i.t("setup.skip_no_gemini")},{tool:"codebuddy",capable:o&&a.isToolInstalled("codebuddy"),skipMsg:"",quiet:!0},{tool:"workbuddy",capable:o&&a.isToolInstalled("workbuddy"),skipMsg:"",quiet:!0},{tool:"dsh",capable:o&&a.isToolInstalled("dsh"),skipMsg:"",quiet:!0,ask:!0}];for(const o of e)W.has(o.tool)||(o.capable?(!o.ask||K||await Q(o.tool))&&($.push({tool:o.tool,apiKey:d,dedicated:!1}),W.add(o.tool)):o.quiet||Y(o.skipMsg))}const io=Boolean(d&&to&&void 0===I);if(K)return Z($.filter(o=>!J(o.tool)).map(o=>o.tool),$.length>0,$.filter(o=>J(o.tool)).map(o=>o.tool)),void((E>0||void 0!==I)&&(process.exitCode=I??_[H??"operation"]));const so=$.filter(o=>!J(o.tool)),ao=io||$.some(o=>o.dedicated),no=!r.fromInstaller&&O();if(($.length>0||ao)&&!r.fromInstaller&&!await S(so.map(o=>o.tool),{keyFile:ao?G(s.getConfigDir(),"config.yaml"):void 0,installFirst:$.filter(o=>J(o.tool)).map(o=>o.tool)}))return void(process.exitCode=_.cancelled);io&&d&&s.setApiKey(d);for(const o of $)o.dedicated&&s.setToolApiKey(o.tool,o.apiKey),J(o.tool)?M.push({tool:o.tool,apiKey:o.apiKey}):await V(o.tool,o.apiKey,{...v,takeOver:o.dedicated||no})?N+=1:(E+=1,W.delete(o.tool));if(void 0!==I)return M.length>0&&X(M.map(o=>o.tool)),void(process.exitCode=I);let ro=[];if(M.length>0){const e=await async function(e,t,l){const s=e.map(o=>o.tool);if(0===s.length)return{still:[],applied:[],failed:[]};const r=s.map(o=>n[o].displayName).join(i.t("setup.list_separator"));let d=t;if(void 0!==d||C()||(T()?d=!j():process.stdin.isTTY&&(console.log(""),d=(await A.prompt([{type:"confirm",name:"go",message:i.t("setup.install_confirm",{tools:r}),default:!0}])).go)),!d){console.log("");for(const e of s)console.log(o.yellow("! "+i.t("setup.install_hint",{tool:n[e].displayName,install:n[e].installCommand})));return C()||console.log(o.gray(i.t("setup.install_all_hint",{cli:F}))),{still:s,applied:[],failed:[]}}const p=[];for(const e of s){console.log(o.bold(`\n${n[e].displayName}`));try{await a.installTool(e)}catch(o){B.logError(`setup: install ${e}`,o)}D(),a.isToolInstalled(e)||p.push(e)}const c=s.filter(o=>!p.includes(o));c.length>0&&console.log("");const u=[],f=[];for(const{tool:o,apiKey:t}of e.filter(o=>c.includes(o.tool)))await V(o,t,l)?u.push(o):f.push(o);return{still:p,applied:u,failed:f}}(M,r.install,v);ro=e.still,N+=e.applied.length,E+=e.failed.length;for(const o of[...ro,...e.failed])W.delete(o)}if(N>0){const t=[...W].filter(o=>!e(o)?.isInstalled&&!ro.includes(o)),l=t.map(o=>n[o]?.command).filter(Boolean).join(" / "),s=i.t("setup.done",{count:String(N)});P("\n"+(l?`${s}${i.t("setup.done_commands",{commands:l})}`:s)),ro.length>0&&X(ro);for(const o of t){const e=a.ensureNativeOnPath(o);e&&P(i.t("setup.path_added",{tool:n[o].displayName,dir:e}))}const r=t.filter(o=>!a.isOnPath(o));if(r.length>0&&!C()&&"1"!==q("PATH_HINT_BY_CALLER")){const e=r.map(o=>n[o].command).join(" / ");console.log(o.yellow(" ! "+i.t("win32"===process.platform?"setup.path_reload_windows":"setup.path_reload",{commands:e})))}}0===N&&ro.length>0&&X(ro),E>0&&(z(i.t("setup.failed_summary",{count:String(E)})),C()||console.error(`${F} setup --key ${i.t("errors.key_placeholder")}`)),await t([...W],{apps:{install:await installMissingApps([...W],r.install)}}),(E>0||0===N&&0===ro.length)&&(process.exitCode=_[H??"operation"])}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{chmodSync as t,existsSync as r,readFileSync as e}from"fs";import{join as n}from"path";import{i18n as o}from"../i18n.js";import{prettyModelName as i}from"../gateway-models.js";import{getAgyRules as a}from"../model-registry.js";import{logger as l}from"../../utils/logger.js";import{readPersistentEnvFile as s,removePersistentEnv as c,writePersistentEnv as u}from"../persistent-env.js";import{backupBeforeWrite as p,atomicWriteFile as g}from"./backup.js";import{findInstalls as d,mirrorInstallCommand as m}from"./tool-installs.js";import{toolHome as y}from"./types.js";import{brand as f,PROVIDER_KEY as v}from"../brand.js";const A="agy",_="
|
|
1
|
+
import{chmodSync as t,existsSync as r,readFileSync as e}from"fs";import{join as n}from"path";import{i18n as o}from"../i18n.js";import{prettyModelName as i}from"../gateway-models.js";import{getAgyRules as a}from"../model-registry.js";import{logger as l}from"../../utils/logger.js";import{readPersistentEnvFile as s,removePersistentEnv as c,writePersistentEnv as u}from"../persistent-env.js";import{backupBeforeWrite as p,atomicWriteFile as g}from"./backup.js";import{findInstalls as d,mirrorInstallCommand as m}from"./tool-installs.js";import{toolHome as y}from"./types.js";import{brand as f,PROVIDER_KEY as v}from"../brand.js";const A="agy",_="AGY_LLM_GATEWAY_URL",h="AGY_LLM_GATEWAY_API_KEY",E="AGY_LLM_GATEWAY_MODELS",j=["GEMINI_API_KEY","GOOGLE_GEMINI_BASE_URL"],w="gemini",K=()=>n(y(),".gemini","antigravity-cli"),b=()=>n(K(),"settings.json"),I=()=>n(K(),`${v}.env`),P=()=>n(y(),".antigravity","settings.json"),M=f().installMirror?.agy,G={command:"agy",native:{binDir:"win32"===process.platform?["AppData","Local","agy","bin"]:[".local","bin"],updateArgs:["update"],dataDirs:[]},...M?{mirrorScript:{sh:`${M}/install.sh`,ps1:`${M}/install.ps1`}}:{}};function L(t){return!!t&&"object"==typeof t&&!Array.isArray(t)}function C(t,n){if(!r(t))return{};const o=e(t,"utf-8");if(!o.trim())return{};try{const t=JSON.parse(o);if(!L(t))throw new Error(`${n} root must be an object`);return t}catch(t){throw new Error(`Existing ${n} cannot be parsed; back it up and fix it first: ${t instanceof Error?t.message:String(t)}`)}}const N=()=>C(b(),"~/.gemini/antigravity-cli/settings.json"),S=()=>C(P(),"~/.antigravity/settings.json");function Y(r,e,n){p(r),g(r,JSON.stringify(e,null,2)+"\n",n),void 0!==n&&t(r,n)}function $(t){return(t||"").replace(/\/+$/,"").replace(/\/v1(beta)?$/,"")}function k(t){const r=a().gatewayModels,e=t?r.filter(r=>t.models.includes(r)):[];return e.length>0?e:r}const O=t=>i(t.replace(/-preview$/,""));function x(t){const r=t.gateway;return L(r)&&!0===r.enabled&&"string"==typeof r.apiKey&&r.apiKey.trim()&&"string"==typeof r.url?{url:r.url,apiKey:r.apiKey}:null}function U(t){const r=t.models;return L(r)&&Array.isArray(r.list)?r.list.map(t=>L(t)&&"string"==typeof t.modelId?t.modelId:"").filter(Boolean):[]}function D(){try{if(N().modelProvider!==w)return null}catch{return null}const t=s(I()),r=t.GEMINI_API_KEY;return r&&r.trim()?{apiKey:r,url:t.GOOGLE_GEMINI_BASE_URL??""}:null}function R(t){const r=s(I());return r[_]===t.url&&r[h]===t.apiKey}function T(t,r,e){const n=N(),o=S();o.gateway={...L(o.gateway)?o.gateway:{},enabled:!0,url:r,apiKey:t,wireProtocol:"genai"},o.models={...L(o.models)?o.models:{},defaultModelId:e[0],list:e.map(t=>({modelId:t,displayName:O(t),supportsThinking:!0}))},Y(P(),o,384),j.some(t=>void 0!==s(I())[t])&&c(A,I(),j);const i=u(A,I(),{[_]:r,[h]:t,[E]:e.join(",")}).rcFiles;for(const t of j)delete process.env[t];return n.modelProvider===w&&(delete n.modelProvider,Y(b(),n)),i}let B=null,W=null;export const antigravityAdapter={name:"agy",displayName:"Antigravity CLI",command:"agy",installCommand:m(G),installSpec:G,configPath:P(),wantsModelCatalog:!0,loadPrivateConfig(t){N(),S();const r=k(t.catalog);B=T(t.apiKey,$(t.baseUrl),r),W=r},unloadPrivateConfig(){try{const t=S();x(t)&&(delete t.gateway,delete t.models,Y(P(),t,384))}catch(t){l.logError("antigravityAdapter.unloadPrivateConfig",t)}try{const t=N();t.modelProvider===w&&(delete t.modelProvider,Y(b(),t))}catch(t){l.logError("antigravityAdapter.unloadPrivateConfig",t)}c(A,I(),[_,h,E,...j])},detectCurrentConfig(){try{const t=x(S());if(t)return{apiKey:t.apiKey}}catch{return{apiKey:null}}return{apiKey:D()?.apiKey??null}},listedModels(){try{const t=S(),r=x(t);if(r)return R(r)?U(t):[]}catch{return null}return D()?[]:null},refreshModelMenu(t){const r=S(),e=x(r)??D();if(!e)return;const n=k(t.catalog),o=e.url||$(t.baseUrl),i=x(r);null!==i&&R(i)&&U(r).join(",")===n.join(",")&&s(I())[E]===n.join(",")&&null===D()||T(e.apiKey,o,n)},getConfig(){try{return S()}catch(t){return l.logError("antigravityAdapter.getConfig",t),null}},applyNotes(){const t=[];if(W&&W.length>0){const r=W.map(O);t.push({kind:"summary",text:o.t("tools.agy.menu_written",{count:String(r.length),list:r.join(o.t("tools.grok.list_separator")),default:r[0]})})}return null===B||0===d(G).length||t.push({kind:"action",text:o.t("tools.agy.open_new_terminal")}),t},backupPaths:()=>[P(),b(),I()],forceResetPaths:()=>[I()]};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as e,readFileSync as t}from"fs";import{join as o}from"path";import{logger as r}from"../../utils/logger.js";import{i18n as d}from"../i18n.js";import{getToolDefaultModel as n}from"../model-registry.js";import{prettyModelName as
|
|
1
|
+
import{existsSync as e,readFileSync as t}from"fs";import{join as o}from"path";import{logger as r}from"../../utils/logger.js";import{i18n as d}from"../i18n.js";import{getToolDefaultModel as n,getToolMenuModels as i}from"../model-registry.js";import{prettyModelName as s,vendorNames as a}from"../gateway-models.js";import{backupBeforeWrite as l,atomicWriteFile as c}from"./backup.js";import{CUSTOM_MODEL_PREFIX as u,bareModelId as m,foreignIdsReplaced as p,isOurEntry as g,menuSpecs as y,mergeEntries as f,ourApiKey as b,ourEntries as h,readModelsFile as j,writeModelsFile as C}from"./codebuddy-models.js";import{pickModel as v,toolHome as S}from"./types.js";const w=()=>process.env.CODEBUDDY_CONFIG_DIR?.trim()||o(S(),".codebuddy"),E=()=>o(w(),"models.json"),N=()=>o(w(),"settings.json"),P={command:"codebuddy",npmPackage:"@tencent-ai/codebuddy-code",brew:"codebuddy-code"};function $(){if(!e(N()))return{};const o=t(N(),"utf-8");if(!o.trim())return{};let r;try{r=JSON.parse(o)}catch(e){throw new Error(`Existing ${N()} cannot be parsed; back it up and fix it first: ${e instanceof Error?e.message:String(e)}`)}if(!(d=r)||"object"!=typeof d||Array.isArray(d))throw new Error(`Existing ${N()} must hold a JSON object`);var d;return r}function _(e){l(N()),c(N(),`${JSON.stringify(e,null,2)}\n`,384)}function k(e,t){return"string"==typeof e&&e.startsWith(u)&&t.has(e.slice(u.length))}const x=e=>m(v(e.models,n("codebuddy")));function A(e,t){return e.find(e=>e.id===t)??e[0]}const O=(e,t)=>y(e,t,i("codebuddy"));let D=null;function M(e,t){const o=j(E()),{entries:r,replaced:d}=f(o.entries,t,e.baseUrl,e.apiKey);return C(E(),o,r),d}export const codebuddyAdapter={name:"codebuddy",displayName:"CodeBuddy Code",command:"codebuddy",installCommand:`npm install -g ${P.npmPackage}`,installSpec:P,get configPath(){return E()},wantsModelCatalog:!0,loadPrivateConfig(e){const t=x(e),o=O(e.catalog,t),r=$(),d=M(e,o),n=A(o,t);n&&(r.model=`${u}${n.id}`,_(r));const i=e=>e.name??s(e.id);D={names:o.map(i),vendors:a(o.map(e=>e.id)),defaultName:n?i(n):"",replaced:d}},unloadPrivateConfig(){let e;try{e=j(E())}catch(e){return void r.logError("codebuddyAdapter.unloadPrivateConfig",e)}const t=new Set(h(e.entries).map(e=>String(e.id)));t.size>0&&C(E(),e,e.entries.filter(e=>!g(e)));try{const e=$();k(e.model,t)&&(delete e.model,_(e))}catch(e){r.logError("codebuddyAdapter.unloadPrivateConfig",e)}},detectCurrentConfig(){try{return{apiKey:b(j(E()).entries)}}catch{return{apiKey:null}}},listedModels(){try{const e=h(j(E()).entries);return e.length>0?e.map(e=>String(e.id)):null}catch{return null}},refreshModelMenu(e){const t=j(E()),o=new Set(h(t.entries).map(e=>String(e.id))),r=$(),d=k(r.model,o)?String(r.model).slice(u.length):void 0,n=d&&e.catalog.models.includes(d)?d:x(e),i=O(e.catalog,n);M(e,i);const s=A(i,n);if(s&&(void 0===r.model||k(r.model,o))){const e=`${u}${s.id}`;r.model!==e&&(r.model=e,_(r))}},planNotes(){try{const e=j(E()),t=p(e.entries,O(void 0,n("codebuddy")));return t.length>0?[d.t("tools.codebuddy.replaces_models",{path:E(),list:t.join(d.t("tools.codebuddy.list_separator"))})]:[]}catch{return[]}},applyNotes(){if(!D)return[];const e=[{kind:"summary",text:d.t("tools.codebuddy.menu_written",{count:String(D.names.length),list:D.vendors.join(d.t("tools.codebuddy.list_separator")),default:D.defaultName})}];return D.replaced.length>0&&e.push({kind:"detail",text:d.t("tools.codebuddy.replaced_models",{tool:"codebuddy",list:D.replaced.join(d.t("tools.codebuddy.list_separator"))})}),e},backupPaths:()=>[E(),N()],forceResetPaths:()=>[E()],getConfig(){try{return{models:j(E()).entries,settings:$()}}catch(e){return r.logError("codebuddyAdapter.getConfig",e),null}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{existsSync as e,readFileSync as t}from"fs";import{join as r}from"path";import*as n from"js-yaml";import{logger as o}from"../../utils/logger.js";import{API_KEY_ENV as s,BRAND_NAME as i,PROVIDER_KEY as a}from"../brand.js";import{i18n as d}from"../i18n.js";import{modelFamily as l,prettyModelName as c,vendorNames as f}from"../gateway-models.js";import{getToolDefaultModel as p,getToolMenuModels as m}from"../model-registry.js";import{atomicWriteFile as u,backupBeforeWrite as h}from"./backup.js";import{bareModelId as g,menuSpecs as y,usesResponses as v}from"./codebuddy-models.js";import{pickModel as b,toolHome as w,withV1 as k}from"./types.js";const x=()=>process.env.DSH_HOME?.trim()||r(w(),".dsh"),A=e=>r(x(),"profiles",e,"cordis.patch.yml"),j=()=>r(x(),".credentials.yaml"),E=["web","desktop"],C="llm-pi-ai",O="agent-default-model",P=a,$=`${a}-gpt`,_=`${a}-claude`,M=["off","minimal","low","medium","high","xhigh","max"],S=e=>!!e&&"object"==typeof e&&!Array.isArray(e),D=e=>e===P||e.startsWith(`${a}-`);class L{source;constructor(e){this.source=e}}const H=n.DEFAULT_SCHEMA.extend(new n.Type("tag:yaml.org,2002:js",{kind:"scalar",construct:e=>new L(e??""),instanceOf:L,represent:e=>e.source}));function T(r){if(!e(r))return{entries:[],header:""};const o=t(r,"utf-8"),s=o.match(/^(?:#.*\r?\n)*/)?.[0]??"",i=n.load(o,{schema:H});if(null==i)return{entries:[],header:s};if(!Array.isArray(i))throw new Error(`Existing ${r} must hold a YAML list`);return{entries:i,header:s}}function W(r,o){const s=o.header+n.dump(o.entries,{schema:H,lineWidth:-1,noRefs:!0,sortKeys:!1});e(r)&&t(r,"utf-8")===s||(h(r),u(r,s))}function K(e,t){let r=e.find(e=>e.id===t);return r||(r={id:t},e.push(r)),S(r.config)||(r.config={}),r.config}function N(e){const t=e.find(e=>e.id===C&&S(e.config))?.config;return S(t?.providers)?t.providers:{}}function R(){if(!e(j()))return{version:1,refs:{}};const r=n.load(t(j(),"utf-8"));if(null==r)return{version:1,refs:{}};if(!S(r))throw new Error(`Existing ${j()} must hold a YAML mapping`);return"version"in r?S(r.refs)?r:{...r,refs:{}}:{version:1,refs:r}}function U(e){h(j()),u(j(),n.dump(e,{lineWidth:-1,sortKeys:!1}),384)}function F(e){const t=e.capabilities??{},r={id:e.id,name:e.name??c(e.id)},n=t.contextWindow??e.contextWindow;n&&(r.contextWindow=n);const o=t.maxOutput??e.maxOutputTokens;if(o&&(r.maxTokens=o),t.vision&&(r.input=["text","image"]),e.id.startsWith("deepseek-"))r.compat={thinkingFormat:"deepseek"},r.reasoningEfforts={off:null,high:"high",max:"max"};else if(t.reasoning&&t.reasoningEfforts){const e=t.reasoningEfforts.filter(e=>M.includes(e)&&"off"!==e);e.length>0&&(r.reasoningEfforts=Object.fromEntries(e.map(e=>[e,e])))}return r}function Y(e){return"claude"===l(e.id)?_:v(e)?$:P}function G(e,t){const r=k(t),n={apiKeyEnv:s},o={[P]:{displayName:i,...n,api:"openai-completions",baseURL:r,compat:{supportsDeveloperRole:!1,maxTokensField:"max_tokens"}},[$]:{displayName:`${i} GPT`,...n,api:"openai-responses",baseURL:r},[_]:{displayName:`${i} Claude`,...n,api:"anthropic-messages",baseURL:r.replace(/\/v\d+$/,"")}},a={};for(const[t,r]of Object.entries(o)){const n=e.filter(e=>Y(e)===t).map(F);n.length>0&&(a[t]={...r,models:n})}return a}const I=e=>g(b(e.models,p("dsh"))),q=(e,t)=>y(e,t,m("dsh"));function z(e,t,r,n=T(e)){const o=K(n.entries,C),s=Object.entries(S(o.providers)?o.providers:{}).filter(([e])=>!D(e));o.providers={...Object.fromEntries(s),...G(t,r)},W(e,n)}const B=e=>{const t=e.find(e=>e.id===O)?.config;return!S(t)||"string"!=typeof t.provider||D(t.provider)?null:`${t.provider}/${String(t.model)}`};let J=null;export const dshAdapter={name:"dsh",displayName:"DeepSeek Harness",command:"dsh",installCommand:"npx @deepseek-ai/dsh web",get configPath(){return A("web")},wantsModelCatalog:!0,isInstalled(){if(e(x()))return!0;if("darwin"===process.platform)return["/Applications/DeepSeek Harness.app",r(w(),"Applications","DeepSeek Harness.app")].some(t=>e(t));const t="win32"===process.platform?process.env.LOCALAPPDATA:void 0;return!!t&&e(r(t,"Programs","DeepSeek Harness"))},loadPrivateConfig(e){const t=q(e.catalog,I(e));if(0===t.length)throw new Error(d.t("tools.dsh.no_models"));const r=t.find(t=>t.id===I(e))??t[0],n=[];for(const o of E){const s=A(o),i=T(s),a=B(i.entries);a&&!n.includes(a)&&n.push(a);const d=K(i.entries,O);d.provider=Y(r),d.model=r.id,delete d.reasoningEffort,z(s,t,e.baseUrl,i)}const o=R();o.refs={...o.refs,[s]:e.apiKey},U(o),J={count:t.length,vendors:f(t.map(e=>e.id)),replaced:n}},unloadPrivateConfig(){try{for(const t of E){const r=A(t);if(!e(r))continue;const n=T(r),o=N(n.entries);for(const e of Object.keys(o))D(e)&&delete o[e];const s=n.entries.find(e=>e.id===O)?.config;S(s)&&"string"==typeof s.provider&&D(s.provider)&&(n.entries=n.entries.filter(e=>e.id!==O)),W(r,n)}const t=R(),r=t.refs;s in r&&(delete r[s],U(t))}catch(e){o.logError("dshAdapter.unloadPrivateConfig",e)}},detectCurrentConfig(){try{const e=R().refs[s];return{apiKey:"string"==typeof e&&e?e:null}}catch{return{apiKey:null}}},listedModels(){try{const e=Object.entries(N(T(A("web")).entries)).filter(([e])=>D(e));return 0===e.length?null:e.flatMap(([,e])=>S(e)&&Array.isArray(e.models)?e.models:[]).map(e=>String(e.id))}catch{return null}},refreshModelMenu(e){const t=q(e.catalog,I(e));if(0!==t.length)for(const r of E)z(A(r),t,e.baseUrl)},planNotes(){try{const e=B(T(A("web")).entries);return e?[d.t("tools.dsh.replaces_default",{model:e})]:[]}catch{return[]}},applyNotes(){if(!J)return[];const e=[{kind:"summary",text:d.t("tools.dsh.menu_written",{count:String(J.count),list:J.vendors.join(d.t("tools.codebuddy.list_separator"))})},{kind:"action",text:d.t("tools.dsh.pick_in_app")}];for(const t of J.replaced)e.push({kind:"detail",text:d.t("tools.dsh.replaced_default",{model:t})});return e},backupPaths:()=>[...E.map(A),j()],forceResetPaths:()=>E.map(A),getConfig(){try{return T(A("web")).entries}catch(e){return o.logError("dshAdapter.getConfig",e),null}}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{claudeCodeAdapter as o}from"./claude-code.js";import{opencodeAdapter as r}from"./opencode.js";import{codexAdapter as t}from"./codex.js";import{openclawAdapter as m}from"./openclaw.js";import{hermesAdapter as e}from"./hermes.js";import{atomcodeAdapter as p}from"./atomcode.js";import{grokAdapter as s}from"./grok.js";import{claudeDesktopAdapter as i}from"./claude-desktop.js";import{antigravityAdapter as d}from"./antigravity.js";import{codebuddyAdapter as f}from"./codebuddy.js";import{workbuddyAdapter as c}from"./workbuddy.js";const n=[o,r,t,m,e,p,s,i,d,f,c];export const TOOL_ADAPTERS=Object.fromEntries(n.map(o=>[o.name,o]));export function getAdapter(o){return TOOL_ADAPTERS[o]}export function listAdapters(){return[...n]}
|
|
1
|
+
import{claudeCodeAdapter as o}from"./claude-code.js";import{opencodeAdapter as r}from"./opencode.js";import{codexAdapter as t}from"./codex.js";import{openclawAdapter as m}from"./openclaw.js";import{hermesAdapter as e}from"./hermes.js";import{atomcodeAdapter as p}from"./atomcode.js";import{grokAdapter as s}from"./grok.js";import{claudeDesktopAdapter as i}from"./claude-desktop.js";import{antigravityAdapter as d}from"./antigravity.js";import{codebuddyAdapter as f}from"./codebuddy.js";import{workbuddyAdapter as c}from"./workbuddy.js";import{dshAdapter as j}from"./dsh.js";const n=[o,r,t,m,e,p,s,i,d,f,c,j];export const TOOL_ADAPTERS=Object.fromEntries(n.map(o=>[o.name,o]));export function getAdapter(o){return TOOL_ADAPTERS[o]}export function listAdapters(){return[...n]}
|
package/dist/locales/en_US.json
CHANGED
|
@@ -364,6 +364,8 @@
|
|
|
364
364
|
"path_added": "{{tool}} is installed in {{dir}}, which was not on PATH; added it to your user PATH",
|
|
365
365
|
"path_reload_windows": "Open a new terminal to use {{commands}}",
|
|
366
366
|
"list_separator": ", ",
|
|
367
|
+
"ask_detected_tool": "Found {{tool}}. Configure it?",
|
|
368
|
+
"detected_tool_hint": "Found {{tool}}. To configure it, run `{{cli}} config {{name}} --yes`",
|
|
367
369
|
"gui_preconfigured": "{{tool}} is not installed yet; its config is written already, so it works once you install and open it (download: {{install}})",
|
|
368
370
|
"validate_failed": "Couldn't validate the API key for {{label}}: {{reason}}",
|
|
369
371
|
"skip_no_claude_desktop": "This API key has no Claude model group; skipped Claude Code and Claude Desktop",
|
|
@@ -374,7 +376,7 @@
|
|
|
374
376
|
"version_outdated": "version {{current}} is too old (needs {{min}} or later); upgrade with {{upgrade}}",
|
|
375
377
|
"agy": {
|
|
376
378
|
"menu_written": "{{count}} models in the menu ({{list}}), default {{default}}",
|
|
377
|
-
"
|
|
379
|
+
"open_new_terminal": "Run agy in a new terminal: terminals already open do not see the new settings"
|
|
378
380
|
},
|
|
379
381
|
"grok": {
|
|
380
382
|
"menu_written": "{{count}} models in the menu ({{list}}), default {{default}}",
|
|
@@ -457,6 +459,13 @@
|
|
|
457
459
|
"replaces_models": "Models with the same id in {{path}} will be replaced: {{list}}",
|
|
458
460
|
"replaced_models": "Replaced models with the same id in models.json: {{list}} (undo with `{{cli}} config {{tool}} restore`)"
|
|
459
461
|
},
|
|
462
|
+
"dsh": {
|
|
463
|
+
"menu_written": "Wrote {{count}} models ({{list}})",
|
|
464
|
+
"pick_in_app": "Open DeepSeek Harness and pick a model from the menu under the input box; no restart needed",
|
|
465
|
+
"replaces_default": "Replaces the default model {{model}}",
|
|
466
|
+
"replaced_default": "Replaced the default model {{model}} (to undo, run `{{cli}} config dsh restore`)",
|
|
467
|
+
"no_models": "Cannot configure DeepSeek Harness: this API key has no usable models"
|
|
468
|
+
},
|
|
460
469
|
"workbuddy": {
|
|
461
470
|
"menu_written": "Wrote {{count}} models ({{list}})",
|
|
462
471
|
"pick_in_app": "Sign in to WorkBuddy, then pick a model from the Custom group of the chat model menu; an enterprise admin may have turned custom models off"
|
|
@@ -747,7 +756,8 @@
|
|
|
747
756
|
"install": "Install missing tools from the China mirrors without asking",
|
|
748
757
|
"no_install": "Only print install commands for missing tools",
|
|
749
758
|
"codebuddykey": "API key just for CodeBuddy Code",
|
|
750
|
-
"workbuddykey": "API key just for WorkBuddy"
|
|
759
|
+
"workbuddykey": "API key just for WorkBuddy",
|
|
760
|
+
"dshkey": "API key just for DeepSeek Harness"
|
|
751
761
|
},
|
|
752
762
|
"autodetect_title": "Models the --key can use and the tools configured:",
|
|
753
763
|
"autodetect": {
|
package/dist/locales/zh_CN.json
CHANGED
|
@@ -364,6 +364,8 @@
|
|
|
364
364
|
"path_added": "{{tool}} 安装在 {{dir}},这个目录不在 PATH 里,已加入用户 PATH",
|
|
365
365
|
"path_reload_windows": "新开一个终端后即可使用 {{commands}}",
|
|
366
366
|
"list_separator": "、",
|
|
367
|
+
"ask_detected_tool": "检测到 {{tool}},要配置它吗?",
|
|
368
|
+
"detected_tool_hint": "检测到 {{tool}},配置它运行 `{{cli}} config {{name}} --yes`",
|
|
367
369
|
"gui_preconfigured": "{{tool}} 还没有安装,已提前写好配置,安装后打开即可使用(下载:{{install}})",
|
|
368
370
|
"validate_failed": "无法验证 {{label}} 的令牌:{{reason}}",
|
|
369
371
|
"skip_no_claude_desktop": "这个令牌没有开通 Claude 模型分组,已跳过 Claude Code 和 Claude Desktop",
|
|
@@ -374,7 +376,7 @@
|
|
|
374
376
|
"version_outdated": "版本 {{current}} 过旧,需要 {{min}} 或更高版本,运行 {{upgrade}} 升级",
|
|
375
377
|
"agy": {
|
|
376
378
|
"menu_written": "模型菜单共 {{count}} 个({{list}}),默认 {{default}}",
|
|
377
|
-
"
|
|
379
|
+
"open_new_terminal": "在新开的终端里运行 agy;已打开的终端读不到新配置"
|
|
378
380
|
},
|
|
379
381
|
"grok": {
|
|
380
382
|
"menu_written": "模型菜单共 {{count}} 个({{list}}),默认 {{default}}",
|
|
@@ -457,6 +459,13 @@
|
|
|
457
459
|
"replaces_models": "{{path}} 里同名的模型会换成本站的:{{list}}",
|
|
458
460
|
"replaced_models": "已替换 models.json 里同名的模型:{{list}}(恢复运行 `{{cli}} config {{tool}} restore`)"
|
|
459
461
|
},
|
|
462
|
+
"dsh": {
|
|
463
|
+
"menu_written": "已写入 {{count}} 个模型({{list}})",
|
|
464
|
+
"pick_in_app": "打开 DeepSeek Harness,在输入框下方的模型菜单里选择;已打开的不用重启",
|
|
465
|
+
"replaces_default": "将替换默认模型 {{model}}",
|
|
466
|
+
"replaced_default": "已替换默认模型 {{model}}(恢复运行 `{{cli}} config dsh restore`)",
|
|
467
|
+
"no_models": "无法配置 DeepSeek Harness:这个令牌没有可用的模型"
|
|
468
|
+
},
|
|
460
469
|
"workbuddy": {
|
|
461
470
|
"menu_written": "已写入 {{count}} 个模型({{list}})",
|
|
462
471
|
"pick_in_app": "在 WorkBuddy 登录后,到对话框的模型菜单「自定义模型」分组里选择;企业账号的管理员可能关闭了自定义模型"
|
|
@@ -747,7 +756,8 @@
|
|
|
747
756
|
"install": "未安装的工具直接从国内镜像安装,不再询问",
|
|
748
757
|
"no_install": "未安装的工具只给出安装命令,不安装",
|
|
749
758
|
"codebuddykey": "CodeBuddy Code 专属令牌",
|
|
750
|
-
"workbuddykey": "WorkBuddy 专属令牌"
|
|
759
|
+
"workbuddykey": "WorkBuddy 专属令牌",
|
|
760
|
+
"dshkey": "DeepSeek Harness 专属令牌"
|
|
751
761
|
},
|
|
752
762
|
"autodetect_title": "--key 能用的模型和自动配置的工具:",
|
|
753
763
|
"autodetect": {
|
package/dist/models.json
CHANGED
|
@@ -20,10 +20,13 @@
|
|
|
20
20
|
"atomcode": "gpt-5.5",
|
|
21
21
|
"grok": "grok-4.6",
|
|
22
22
|
"codebuddy": "gpt-6-astra",
|
|
23
|
-
"workbuddy": "gpt-6-astra"
|
|
23
|
+
"workbuddy": "gpt-6-astra",
|
|
24
|
+
"dsh": "deepseek-v4-pro"
|
|
24
25
|
},
|
|
25
26
|
"toolMenuModels": {
|
|
26
|
-
"workbuddy": ["gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"]
|
|
27
|
+
"workbuddy": ["gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"],
|
|
28
|
+
"codebuddy": ["gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"],
|
|
29
|
+
"dsh": ["deepseek-v4.1-flash-1017", "gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"]
|
|
27
30
|
},
|
|
28
31
|
"presets": [
|
|
29
32
|
{
|
package/models.json
CHANGED
|
@@ -20,10 +20,13 @@
|
|
|
20
20
|
"atomcode": "gpt-5.5",
|
|
21
21
|
"grok": "grok-4.6",
|
|
22
22
|
"codebuddy": "gpt-6-astra",
|
|
23
|
-
"workbuddy": "gpt-6-astra"
|
|
23
|
+
"workbuddy": "gpt-6-astra",
|
|
24
|
+
"dsh": "deepseek-v4-pro"
|
|
24
25
|
},
|
|
25
26
|
"toolMenuModels": {
|
|
26
|
-
"workbuddy": ["gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"]
|
|
27
|
+
"workbuddy": ["gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"],
|
|
28
|
+
"codebuddy": ["gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"],
|
|
29
|
+
"dsh": ["deepseek-v4.1-flash-1017", "gpt-6.1-sol", "gpt-6.1-terra", "claude-sonnet-5-5"]
|
|
27
30
|
},
|
|
28
31
|
"presets": [
|
|
29
32
|
{
|