@vibeapi/api-helper 0.0.125 → 0.0.126
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/commands/auth.js +1 -1
- package/dist/commands/base.js +1 -1
- package/dist/commands/bench.js +1 -1
- package/dist/commands/config.js +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/logs.js +1 -1
- package/dist/commands/refresh.js +1 -1
- package/dist/commands/setup.js +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/lib/command.js +1 -1
- package/dist/lib/model-refresh.d.ts +5 -0
- package/dist/lib/model-refresh.js +1 -1
- package/dist/lib/program.js +1 -1
- package/dist/lib/tools/claude-desktop.js +1 -1
- package/dist/lib/wizard.js +1 -1
- package/dist/locales/en_US.json +51 -111
- package/dist/locales/zh_CN.json +50 -110
- package/package.json +1 -1
package/dist/commands/auth.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import o from"chalk";import e from"inquirer";import t from"ora";import{configManager as r}from"../lib/config.js";import{i18n as i}from"../lib/i18n.js";import{validateApiKey as a}from"../lib/api-validator.js";import{toolManager as n}from"../lib/tool-manager.js";import{isJsonMode as d,isNonInteractive as l,shouldAutoConfirm as c,emitJson as s,isColorEnabled as u}from"../lib/runtime-options.js";const p=["claude","claude-code","opencode"];function m(o){return u()?o:o=>o}function f(o,e=o=>o){d()||console.log(m(e)(o))}async function k(e){if(d()){const o=await a(e);return o.valid?(r.setApiKey(e),void s({ok:!0,action:"auth"})):void s({ok:!1,action:"auth",error:o.error||"invalid_api_key"})}const n=t(i.t("wizard.validating_api_key")).start(),l=await a(e);l.valid?(r.setApiKey(e),n.succeed(m(o.green)(i.t("auth.saved")))):"invalid_api_key"===l.error?n.fail(m(o.red)(i.t("wizard.api_key_invalid"))):n.fail(m(o.red)(i.t("wizard.api_key_network_error")))}export async function authCommand(t){0!==t.length?"revoke"!==t[0]?"reload"!==t[0]?await k(t[0]):await async function(e){const t=e.toLowerCase();if(!p.includes(t))return d()?void s({ok:!1,action:"reload",error:"unsupported_tool",tool:e}):void f(i.t("auth.reload_tool_not_supported",{tool:e}),o.red);const a=r.getApiKey();if(!
|
|
1
|
+
import o from"chalk";import e from"inquirer";import t from"ora";import{configManager as r}from"../lib/config.js";import{i18n as i}from"../lib/i18n.js";import{validateApiKey as a}from"../lib/api-validator.js";import{toolManager as n}from"../lib/tool-manager.js";import{isJsonMode as d,isNonInteractive as l,shouldAutoConfirm as c,emitJson as s,isColorEnabled as u}from"../lib/runtime-options.js";const p=["claude","claude-code","opencode"];function m(o){return u()?o:o=>o}function f(o,e=o=>o){d()||console.log(m(e)(o))}async function k(e){if(d()){const o=await a(e);return o.valid?(r.setApiKey(e),void s({ok:!0,action:"auth"})):void s({ok:!1,action:"auth",error:o.error||"invalid_api_key"})}const n=t(i.t("wizard.validating_api_key")).start(),l=await a(e);l.valid?(r.setApiKey(e),n.succeed(m(o.green)(i.t("auth.saved")))):"invalid_api_key"===l.error?n.fail(m(o.red)(i.t("wizard.api_key_invalid"))):n.fail(m(o.red)(i.t("wizard.api_key_network_error")))}export async function authCommand(t){0!==t.length?"revoke"!==t[0]?"reload"!==t[0]?await k(t[0]):await async function(e){const t=e.toLowerCase();if(!p.includes(t))return d()?void s({ok:!1,action:"reload",error:"unsupported_tool",tool:e}):void f(i.t("auth.reload_tool_not_supported",{tool:e}),o.red);const a="opencode"===t?"opencode":"claude-code",l=r.getApiKeyForTool(a)||r.getApiKey();if(!l)return d()?void s({ok:!1,action:"reload",error:"missing_api_key",tool:e}):void f(i.t("auth.reload_missing_config"),o.red);const c="opencode"===t?"OpenCode":"Claude Code";d()||f(i.t("auth.reloading",{tool:c}),o.blue);try{await n.applyPrivateConfig(a,l,r.getModelsForTool(a)),d()?s({ok:!0,action:"reload",tool:a}):f(i.t("auth.reloaded",{tool:c}),o.green)}catch(e){if(d())return void s({ok:!1,action:"reload",error:"reload_failed",message:e instanceof Error?e.message:String(e)});f(i.t("auth.reload_failed"),o.red),e instanceof Error&&f(e.message,o.red)}}(t[1]||""):await async function(){if(!c()){const{confirm:t}=await e.prompt([{type:"confirm",name:"confirm",message:i.t("auth.revoke_confirm"),default:!1}]);if(!t)return d()?void s({ok:!1,action:"revoke",cancelled:!0}):void f(i.t("auth.not_revoked"),o.yellow)}r.revokeApiKey(),d()?s({ok:!0,action:"revoke"}):f(i.t("auth.revoked"),o.green)}():await async function(){if(l())return d()?void s({ok:!1,action:"auth",error:"token_required"}):void f(i.t("runtime.non_interactive_required_token"),o.red);const{token:t}=await e.prompt([{type:"password",name:"token",message:i.t("auth.token_prompt"),validate:o=>!(!o||0===o.trim().length)||i.t("auth.token_required")}]);await k(t.trim())}()}
|
package/dist/commands/base.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"chalk";import{configManager as r,DEFAULT_BASE_URL as
|
|
1
|
+
import e from"chalk";import{configManager as r,DEFAULT_BASE_URL as t}from"../lib/config.js";import{i18n as o}from"../lib/i18n.js";import{toolManager as s}from"../lib/tool-manager.js";import{listAdapters as a}from"../lib/tools/registry.js";import{postApplyPrompts as n}from"../lib/post-apply.js";import{emitJson as l,isJsonMode as i}from"../lib/runtime-options.js";import{logger as u}from"../utils/logger.js";import{reportCliError as c,usageError as p,authenticationError as d,networkError as f,operationError as m}from"../lib/errors.js";import{gatewayAddresses as b,normalizeBaseUrl as y,probeGatewayAddress as g}from"../lib/gateway-addresses.js";import{CLI_NAME as h}from"../lib/brand.js";export async function baseCommand(s){const a=r.getBaseUrl(),n=addressesWithCurrent(),u=s?.trim().toLowerCase();if(!u)return void await async function(r,t){const s=savedApiKey(),a=await probeAll(r,{apiKey:s,samples:3});i()?l({ok:!0,current:t,addresses:r.map((e,r)=>({...e,...a[r],current:e.url===t}))}):(console.log(e.bold(o.t("base.current",{url:t}))),console.log(e.gray(o.t(s?"base.probe_with_key":"base.probe_without_key"))+"\n"),w(r,a,t),console.log("\n"+e.gray(o.t("base.usage_hint"))))}(n,a);if("auto"===u){const e=await probeAll(n,{apiKey:savedApiKey()}),r=e.find(e=>e.ok);if(!r){const r=e.every(e=>"key_rejected"===e.error);return _(r?"key_rejected":"no_reachable",o.t(r?"base.key_rejected_everywhere":"base.none_reachable")),void w(n,e,a)}return void await switchGatewayAddress(r.url)}let c;if("default"===u||"reset"===u)c=t;else if(/^\d+$/.test(u)){if(c=n[Number(u)-1]?.url??null,!c)return void _("bad_index",o.t("base.bad_index",{index:u,count:String(n.length)}))}else if(c=y(s),!c)return void _("bad_url",o.t("base.bad_url",{value:s}));const p=await g(c,{apiKey:savedApiKey()});p.ok?await switchGatewayAddress(c):_("unreachable",o.t("base.unreachable",{url:c,reason:reasonText(p)}))}export async function ensureReachableGatewayAddress(s=savedApiKey()){if(r.hasRuntimeBaseUrl())return null;const a=r.getBaseUrl(),n=await g(a,{apiKey:s});if(n.ok||"key_rejected"===n.error)return null;const l=b().filter(e=>e.url!==a),u=(await probeAll(l,{apiKey:s})).find(e=>e.ok);if(!u)return null;if(u.url===t?r.resetBaseUrl():r.setBaseUrl(u.url,!0),!i()){const r=u.url===t?"base.setup_fallback_main":"base.setup_fallback";console.log(e.yellow(o.t(r,{from:a,reason:reasonText(n),url:u.url})))}return u.url}export function addressesWithCurrent(){const e=r.getBaseUrl(),t=b();return t.some(r=>r.url===e)||t.push({url:e,label:o.t("base.custom_label")}),t}export function savedApiKey(){return r.getApiKey()||a().map(e=>r.getApiKeyForTool(e.name)).find(Boolean)}export async function probeAll(e,r={}){return Promise.all(e.map(e=>g(e.url,r)))}export function probeSummary(r,t){if(!r.ok)return e.red(`× ${reasonText(r)}`);const s=[`${r.ms} ms`];return void 0!==r.models&&s.push(o.t("base.models_count",{count:String(r.models)})),t&&s.push(o.t("base.fastest")),e.green(`√ ${s.join(" · ")}`)}export function fastestIndex(e){let r=-1;return e.forEach((t,o)=>{t.ok&&(r<0||t.ms<e[r].ms)&&(r=o)}),r}export function reasonText(e){if(!e.error)return"";const r=o.t(`base.error_${e.error}`);return e.detail?`${r}(${e.detail})`:r}function _(e,r){const t="bad_index"===e||"bad_url"===e?p(r,o.t("errors.next_step",{command:`${h} base --help`}),e):"key_rejected"===e?d(r,o.t("errors.next_step",{command:`${h} setup --key ${o.t("errors.key_placeholder")}`}),e):f(r,o.t("base.next_addresses"),e);c(t)}function w(r,t,s){if(i())return;const a=t.length>1?fastestIndex(t):-1;r.forEach((r,n)=>{const l=r.url===s?e.cyan(` ← ${o.t("base.current_mark")}`):"";console.log(`${n+1}. ${r.url} ${e.gray(r.label)}\n ${probeSummary(t[n],n===a)}${l}`)})}export async function switchGatewayAddress(p){const d=r.getBaseUrl();p===t?r.resetBaseUrl():r.setBaseUrl(p,!0);const f=[],b=[];for(const e of function(){const e=[];for(const t of a()){const o=r.getApiKeyForTool(t.name);if(o)try{t.detectCurrentConfig().apiKey===o&&e.push(t.name)}catch(e){u.logError(`base.detectCurrentConfig(${t.name})`,e)}}return e}()){const t=r.getApiKeyForTool(e);try{await s.applyPrivateConfig(e,t,r.getModelsForTool(e)),f.push(e)}catch(r){b.push({tool:e,reason:r instanceof Error?r.message:String(r)})}}if(b.length>0&&c(m(b.map(({tool:e,reason:r})=>`${e}: ${r}`).join("; "),o.t("errors.next_step",{command:`${h} setup --key ${o.t("errors.key_placeholder")}`}),"config_write_failed")),i()&&0===b.length)l({ok:0===b.length,previous:d,base_url:p,applied:f,failed:b});else{console.log(e.green(o.t(p===d?"base.kept":"base.switched",{url:p}))),f.length>0&&console.log(o.t("base.tools_moved"));for(const e of f)s.printApplied(e);for(const{tool:r,reason:t}of b)console.error(e.red(`× ${o.t("setup.apply_failed",{tool:r,reason:t})}`));0===f.length&&0===b.length&&console.log(e.yellow(o.t("base.no_tools",{url:p}))),await n(f)}}
|
package/dist/commands/bench.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"chalk";import{configManager as o}from"../lib/config.js";import{
|
|
1
|
+
import e from"chalk";import{configManager as o}from"../lib/config.js";import{savedApiKey as n}from"./base.js";import{i18n as s}from"../lib/i18n.js";import{isJsonMode as r,emitJson as t,isColorEnabled as l}from"../lib/runtime-options.js";function m(e){return l()?e:e=>e}export async function benchCommand(l,a=function(e){let o=5;for(let n=0;n<e.length;n+=1)if("--samples"===e[n]&&e[n+1]){const s=Number.parseInt(e[n+1],10);Number.isFinite(s)&&s>0&&s<=50&&(o=s)}return{samples:o}}(l)){const i=n();if(!i)return r()?void t({ok:!1,error:"missing_api_key"}):void console.log(m(e.red)(s.t("bench.missing_api_key")));const c=a.fetchFn||fetch,h=o.getBaseUrl(),g=`${h}/v1/models`,p={samples:a.samples,errors:0,durations:[]};r()||console.log(m(e.gray)(s.t("bench.running")));for(let e=0;e<a.samples;e+=1){const e=Date.now();try{if(!(await c(g,{method:"GET",headers:{Authorization:`Bearer ${i}`,Accept:"application/json"}})).ok){p.errors+=1;continue}p.durations.push(Date.now()-e)}catch{p.errors+=1}}const u=function(e){const o=e.durations.slice().sort((e,o)=>e-o),n=o.reduce((e,o)=>e+o,0),s=0===o.length?0:o.length%2==0?(o[o.length/2-1]+o[o.length/2])/2:o[Math.floor(o.length/2)],r=0===o.length?0:n/o.length;return{samples:e.samples,completed:o.length,errors:e.errors,median_ms:Math.round(s),average_ms:Math.round(r),min_ms:o[0]||0,max_ms:o[o.length-1]||0}}(p),b=p.errors===a.samples;r()?t({ok:!b,base_url:h,...u}):(console.log("\n"+m(e.bold)(s.t("bench.result_title"))),console.log(` ${s.t("bench.samples")}: ${u.samples}`),console.log(` ${s.t("bench.median")}: ${u.median_ms}ms`),console.log(` ${s.t("bench.average")}: ${u.average_ms}ms`),console.log(` ${s.t("bench.min")}: ${u.min_ms}ms`),console.log(` ${s.t("bench.max")}: ${u.max_ms}ms`),console.log(` ${s.t("bench.errors")}: ${u.errors}`))}
|
package/dist/commands/config.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import o from"inquirer";import e from"chalk";import{wizard as t}from"../lib/wizard.js";import{toolManager as n,SUPPORTED_TOOLS as l}from"../lib/tool-manager.js";import{i18n as i}from"../lib/i18n.js";import{configManager as r,DEFAULT_PROFILE_NAME as a}from"../lib/config.js";import{confirmAction as s,applyOrDryRun as c}from"../lib/confirm.js";import{isDryRun as d,isNonInteractive as f,shouldAutoConfirm as p}from"../lib/runtime-options.js";const g=/^[a-zA-Z0-9._-]+$/;function m(o,e){const t=(o||"").trim();if(!t||!g.test(t))throw new Error(i.t(`config.${e}_invalid_name`,{name:t||"<empty>"}));return t}function _(o,t){console.log("\n"+e.bold(o)),0!==t.length?t.forEach(o=>console.log(" "+o)):console.log(e.gray(" ("+i.t("config.empty_list")+")"))}function u(o,t){if("backups"===t){const t=n.listToolBackups(o).flatMap(o=>{const t=o.file.replace(/^.*[/\\]/,"");return o.backups.length?o.backups.map(o=>`${e.cyan(t)} ${e.gray(o.name.split(".bak-")[1]||o.name)}`):[`${e.cyan(t)} ${e.gray("("+i.t("config.empty_list")+")")}`]});return void _(i.t("config.tool_backups_title",{tool:l[o].displayName}),t)}const r=n.restorePrivateConfig(o).filter(o=>o.result.restored);0!==r.length?(console.log(e.green(i.t("config.config_restored",{tool:l[o].displayName}))),r.forEach(o=>console.log(e.gray(` ${o.file} ← ${o.result.from}`))),console.log(e.yellow(" ! "+i.t("config.reopen_hint",{tool:l[o].displayName})))):console.log(e.yellow(i.t("config.restore_no_backup",{tool:l[o].displayName})))}async function y(a,f,p){if(!l[a])return void console.log(e.red(i.t("config.unknown_tool",{tool:a})));const g=(f[0]||"").toLowerCase();if("backups"!==g&&"list-backups"!==g)if("restore"!==g){if("remove"===g||"unload"===g){const o=l[a].displayName;return void await c({description:i.t("config.remove_dry_run",{tool:o}),json:{action:"remove",tool:a},apply:async()=>{if(!await s({message:i.t("config.confirm_remove",{tool:o,name:a}),defaultValue:!0}))return;const t=n.unloadPrivateConfig(a);console.log(e.green(i.t("config.remove_done",{tool:o}))),t.forEach(o=>console.log(e.yellow(" ! "+o.text)))}})}if("clear-model"===g||"clear-models"===g){const o=l[a].displayName;return n.supportsClearPinnedModels(a)?void await c({description:i.t("config.clear_model_dry_run",{tool:o}),json:{action:"clear_model",tool:a},apply:async()=>{const t=await n.clearPinnedModels(a);0!==t.length?(console.log(e.green(i.t("config.clear_model_done",{tool:o}))),t.forEach(o=>console.log(e.gray(` - ${o}`))),console.log(e.gray(i.t("config.clear_model_restart_hint",{tool:o})))):console.log(e.yellow(i.t("config.clear_model_none",{tool:o})))}}):void console.log(e.yellow(i.t("config.clear_model_unsupported",{tool:o})))}if(d())await c({description:i.t("config.tool_apply_dry_run",{tool:l[a].displayName}),json:{action:"apply",tool:a,force:Boolean(p.force)},apply:()=>{}});else{if(!n.isToolInstalled(a)){if(p.nonInteractive)return void console.log(e.yellow(i.t("wizard.tool_not_installed",{tool:l[a].displayName})));console.log(e.yellow(i.t("wizard.tool_not_installed",{tool:l[a].displayName})));const{shouldInstall:t}=await o.prompt([{type:"confirm",name:"shouldInstall",message:i.t("wizard.install_tool_confirm"),default:!0}]);if(!t)return void console.log(e.yellow(i.t("wizard.install_skipped")));try{await n.installTool(a)}catch(o){return console.error(e.red(i.t("install.install_failed_detail"))),void(o instanceof Error&&o.message&&console.error(e.gray(o.message)))}}if(p.nonInteractive||p.force){const o=r.getApiKeyForTool(a);if(!o)return void console.log(e.red(i.t("wizard.api_key_required")));if(p.force&&!p.nonInteractive&&!await s({message:i.t("config.confirm_force",{tool:l[a].displayName}),defaultValue:!1}))return;return await n.applyPrivateConfig(a,o,r.getModelsForTool(a),{force:p.force}),p.force&&console.log(e.yellow(i.t("config.force_done",{tool:l[a].displayName}))),void n.printApplied(a)}await t.showToolMenu(a)}}else await c({description:i.t("config.tool_restore_dry_run",{tool:l[a].displayName}),json:{action:"tool_restore",tool:a},apply:async()=>{await s({message:i.t("config.confirm_restore",{tool:l[a].displayName}),defaultValue:!1})&&u(a,"restore")}});else u(a,"backups")}export async function configCommand(t){const{positional:n,options:d}=function(o){const e=[],t={};(f()||p())&&(t.nonInteractive=!0);for(const n of o)"--non-interactive"===n||"-y"===n?t.nonInteractive=!0:"--force"===n||"-f"===n?t.force=!0:e.push(n);return{positional:e,options:t}}(t),u=n[0],v=n.slice(1);if(u){switch(u){case"profile":return void await async function(o){const t=o[0],n=o[1];if(!t||"list"===t){const o=r.getActiveProfileName(),t=r.listProfiles().map(t=>{const n=t===o;return`${n?e.green("●"):e.gray("○")} ${t}${n?e.gray(" ("+i.t("config.profile_active_label")+")"):""}`});return void _(i.t("config.profile_list_title"),t)}if("create"===t){const o=m(n,"profile");return r.listProfiles().includes(o)?void console.log(e.yellow(i.t("config.profile_exists",{name:o}))):void await c({description:i.t("config.profile_create_dry_run",{name:o}),json:{action:"profile_create",name:o},apply:()=>{r.createProfile(o),console.log(e.green(i.t("config.profile_created",{name:o})))}})}if("use"===t){const o=m(n,"profile");return void await c({description:i.t("config.profile_use_dry_run",{name:o}),json:{action:"profile_use",name:o},apply:()=>{r.setActiveProfile(o),console.log(e.green(i.t("config.profile_activated",{name:o})))}})}if("delete"===t||"remove"===t){const o=m(n,"profile");return o===a&&1===r.listProfiles().length?void console.log(e.yellow(i.t("config.profile_cannot_delete_last"))):void await c({description:i.t("config.profile_delete_dry_run",{name:o}),json:{action:"profile_delete",name:o},apply:async()=>{await s({message:i.t("config.profile_delete_confirm",{name:o}),defaultValue:!1})?(r.deleteProfile(o),console.log(e.green(i.t("config.profile_deleted",{name:o})))):console.log(e.yellow(i.t("config.profile_delete_aborted")))}})}console.log(e.red(i.t("config.unknown_action",{action:t})))}(v);case"preset":return void await async function(o){const t=o[0],n=o[1];if(!t||"list"===t){const o=Object.entries(r.getCustomPresets()).map(([o,t])=>`${e.cyan(o)} ${e.gray(`H:${t.models.haiku} S:${t.models.sonnet} O:${t.models.opus}`)}`);return void _(i.t("config.preset_list_title"),o)}if("save"===t){const o=m(n,"preset");return void await c({description:i.t("config.preset_save_dry_run",{name:o}),json:{action:"preset_save",name:o},apply:()=>{r.saveCustomPreset(o,r.getModels()),console.log(e.green(i.t("config.preset_saved",{name:o})))}})}if("use"===t||"apply"===t){const o=m(n,"preset"),t=r.getCustomPresets()[o];return t?void await c({description:i.t("config.preset_use_dry_run",{name:o}),json:{action:"preset_use",name:o},apply:()=>{r.setModels(t.models),console.log(e.green(i.t("config.preset_applied",{name:o})))}}):void console.log(e.red(i.t("config.preset_not_found",{name:o})))}if("delete"===t||"remove"===t){const o=m(n,"preset");return void await c({description:i.t("config.preset_delete_dry_run",{name:o}),json:{action:"preset_delete",name:o},apply:()=>{r.deleteCustomPreset(o),console.log(e.green(i.t("config.preset_deleted",{name:o})))}})}console.log(e.red(i.t("config.unknown_action",{action:t})))}(v);case"tool-model":return void await async function(o){const t=o[0];if(!t||"list"===t){const o=r.getProfile().tool_models||{},t=Object.entries(o).map(([o,t])=>{const n=Object.entries(t).map(([o,e])=>`${o}=${e}`).join(" ");return`${e.cyan(o)} ${e.gray(n)}`});return void _(i.t("config.tool_model_list_title"),t)}if("set"===t){const t=(o[1]||"").trim(),n=o.length>=4?(o[2]||"").trim():"opus",a=(o.length>=4?o[3]:o[2]||"").trim();return l[t]?a&&g.test(n)?void await c({description:i.t("config.tool_model_set_dry_run",{tool:t,slot:n,model:a}),json:{action:"tool_model_set",tool:t,slot:n,model:a},apply:()=>{r.setToolModel(t,{[n]:a}),console.log(e.green(i.t("config.tool_model_set",{tool:t,slot:n,model:a})))}}):void console.log(e.red(i.t("config.tool_model_usage"))):void console.log(e.red(i.t("config.unknown_tool",{tool:t})))}if("clear"===t||"remove"===t){const t=(o[1]||"").trim();return l[t]?void await c({description:i.t("config.tool_model_clear_dry_run",{tool:t}),json:{action:"tool_model_clear",tool:t},apply:()=>{r.setToolModel(t,null),console.log(e.green(i.t("config.tool_model_cleared",{tool:t})))}}):void console.log(e.red(i.t("config.unknown_tool",{tool:t})))}console.log(e.red(i.t("config.unknown_action",{action:t})))}(v);case"backup":return void await function(o){return async function(o){const t=o[0],n=o[1];if(!t||"list"===t){const o=r.listBackups().map(o=>{const t=new Date(o.mtimeMs).toISOString();return`${e.cyan(o.name)} ${e.gray(t)}`});return void _(i.t("config.backup_list_title"),o)}if("create"!==t&&"snapshot"!==t)return"restore"===t?n?void await c({description:i.t("config.backup_restore_dry_run",{name:n}),json:{action:"backup_restore",name:n},apply:async()=>{await s({message:i.t("config.backup_restore_confirm",{name:n}),defaultValue:!1})?(r.restoreBackup(n),console.log(e.green(i.t("config.backup_restored",{name:n})))):console.log(e.yellow(i.t("config.backup_restore_aborted")))}}):void console.log(e.red(i.t("config.backup_restore_missing_name"))):void console.log(e.red(i.t("config.unknown_action",{action:t})));await c({description:i.t("config.backup_create_dry_run"),json:{action:"backup_create",name:n??null},apply:()=>{const o=r.createBackup(n);console.log(e.green(i.t("config.backup_created",{path:o})))}})}(o)}(v)}"claude-code"!==u&&"claude-code"!==v[0]?l[u]?await y(u,v,d):(console.error(e.red(i.t("config.unknown_command",{command:u}))),console.log(e.gray(i.t("config.usage_hint"))),Object.values(l).filter(o=>!o.hidden).forEach(o=>{console.log(e.gray(` - ${o.name}: ${o.displayName}`))})):await y("claude-code",v,d)}else await async function(t){if(t.nonInteractive)return void console.log(e.red(i.t("config.requires_argument")));const{selectedTool:n}=await o.prompt([{type:"list",name:"selectedTool",message:i.t("wizard.select_tool"),choices:Object.values(l).filter(o=>!o.hidden).map(o=>({name:`${o.displayName} (${o.name})`,value:o.name}))}]);await y(n,[],t)}(d)}
|
|
1
|
+
import o from"inquirer";import e from"chalk";import{wizard as t}from"../lib/wizard.js";import{toolManager as n,SUPPORTED_TOOLS as l}from"../lib/tool-manager.js";import{i18n as i}from"../lib/i18n.js";import{configManager as r,DEFAULT_PROFILE_NAME as a}from"../lib/config.js";import{confirmAction as s,applyOrDryRun as c}from"../lib/confirm.js";import{isDryRun as d,isNonInteractive as f,shouldAutoConfirm as g}from"../lib/runtime-options.js";const p=/^[a-zA-Z0-9._-]+$/;function m(o,e){const t=(o||"").trim();if(!t||!p.test(t))throw new Error(i.t(`config.${e}_invalid_name`,{name:t||"<empty>"}));return t}function _(o,t){console.log("\n"+e.bold(o)),0!==t.length?t.forEach(o=>console.log(" "+o)):console.log(e.gray(" ("+i.t("config.empty_list")+")"))}function u(o,t){if("backups"===t){const t=n.listToolBackups(o).flatMap(o=>{const t=o.file.replace(/^.*[/\\]/,"");return o.backups.length?o.backups.map(o=>`${e.cyan(t)} ${e.gray(o.name.split(".bak-")[1]||o.name)}`):[`${e.cyan(t)} ${e.gray("("+i.t("config.empty_list")+")")}`]});return void _(i.t("config.tool_backups_title",{tool:l[o].displayName}),t)}const r=n.restorePrivateConfig(o).filter(o=>o.result.restored);0!==r.length?(console.log(e.green(i.t("config.config_restored",{tool:l[o].displayName}))),r.forEach(o=>console.log(e.gray(` ${o.file} ← ${o.result.from}`))),console.log(e.yellow(" ! "+i.t("config.reopen_hint",{tool:l[o].displayName})))):console.log(e.yellow(i.t("config.restore_no_backup",{tool:l[o].displayName})))}async function y(a,f,g){if(!l[a])return void console.log(e.red(i.t("config.unknown_tool",{tool:a})));const p=(f[0]||"").toLowerCase();if("backups"!==p&&"list-backups"!==p)if("restore"!==p){if("remove"===p||"unload"===p){const o=l[a].displayName;return void await c({description:i.t("config.remove_dry_run",{tool:o}),json:{action:"remove",tool:a},apply:async()=>{if(!await s({message:i.t("config.confirm_remove",{tool:o,name:a}),defaultValue:!0}))return;const t=Boolean(n.detectCurrentConfig(a).apiKey),l=n.unloadPrivateConfig(a);t?(console.log(e.green(i.t("config.remove_done",{tool:o}))),l.forEach(o=>console.log(e.yellow(" ! "+o.text)))):console.log(e.gray(i.t("config.remove_nothing",{tool:o})))}})}if("clear-model"===p||"clear-models"===p){const o=l[a].displayName;return n.supportsClearPinnedModels(a)?void await c({description:i.t("config.clear_model_dry_run",{tool:o}),json:{action:"clear_model",tool:a},apply:async()=>{const t=await n.clearPinnedModels(a);0!==t.length?(console.log(e.green(i.t("config.clear_model_done",{tool:o}))),t.forEach(o=>console.log(e.gray(` - ${o}`))),console.log(e.gray(i.t("config.clear_model_restart_hint",{tool:o})))):console.log(e.yellow(i.t("config.clear_model_none",{tool:o})))}}):void console.log(e.yellow(i.t("config.clear_model_unsupported",{tool:o})))}if(d())await c({description:i.t("config.tool_apply_dry_run",{tool:l[a].displayName}),json:{action:"apply",tool:a,force:Boolean(g.force)},apply:()=>{}});else{if(!n.isToolInstalled(a)){if(g.nonInteractive)return void console.log(e.yellow(i.t("wizard.tool_not_installed",{tool:l[a].displayName})));console.log(e.yellow(i.t("wizard.tool_not_installed",{tool:l[a].displayName})));const{shouldInstall:t}=await o.prompt([{type:"confirm",name:"shouldInstall",message:i.t("wizard.install_tool_confirm"),default:!0}]);if(!t)return void console.log(e.yellow(i.t("wizard.install_skipped")));try{await n.installTool(a)}catch(o){return console.error(e.red(i.t("install.install_failed_detail"))),void(o instanceof Error&&o.message&&console.error(e.gray(o.message)))}}if(g.nonInteractive||g.force){const o=r.getApiKeyForTool(a);if(!o)return void console.log(e.red(i.t("auth.reload_missing_config")));if(g.force&&!g.nonInteractive&&!await s({message:i.t("config.confirm_force",{tool:l[a].displayName}),defaultValue:!1}))return;return await n.applyPrivateConfig(a,o,r.getModelsForTool(a),{force:g.force}),g.force&&console.log(e.yellow(i.t("config.force_done",{tool:l[a].displayName,name:a}))),void n.printApplied(a)}await t.showToolMenu(a)}}else await c({description:i.t("config.tool_restore_dry_run",{tool:l[a].displayName}),json:{action:"tool_restore",tool:a},apply:async()=>{await s({message:i.t("config.confirm_restore",{tool:l[a].displayName}),defaultValue:!1})&&u(a,"restore")}});else u(a,"backups")}export async function configCommand(t){const{positional:n,options:d}=function(o){const e=[],t={};(f()||g())&&(t.nonInteractive=!0);for(const n of o)"--non-interactive"===n||"-y"===n?t.nonInteractive=!0:"--force"===n||"-f"===n?t.force=!0:e.push(n);return{positional:e,options:t}}(t),u=n[0],v=n.slice(1);if(u){switch(u){case"profile":return void await async function(o){const t=o[0],n=o[1];if(!t||"list"===t){const o=r.getActiveProfileName(),t=r.listProfiles().map(t=>{const n=t===o;return`${n?e.green("●"):e.gray("○")} ${t}${n?e.gray(" ("+i.t("config.profile_active_label")+")"):""}`});return void _(i.t("config.profile_list_title"),t)}if("create"===t){const o=m(n,"profile");return r.listProfiles().includes(o)?void console.log(e.yellow(i.t("config.profile_exists",{name:o}))):void await c({description:i.t("config.profile_create_dry_run",{name:o}),json:{action:"profile_create",name:o},apply:()=>{r.createProfile(o),console.log(e.green(i.t("config.profile_created",{name:o})))}})}if("use"===t){const o=m(n,"profile");return void await c({description:i.t("config.profile_use_dry_run",{name:o}),json:{action:"profile_use",name:o},apply:()=>{r.setActiveProfile(o),console.log(e.green(i.t("config.profile_activated",{name:o})))}})}if("delete"===t||"remove"===t){const o=m(n,"profile");return o===a&&1===r.listProfiles().length?void console.log(e.yellow(i.t("config.profile_cannot_delete_last"))):void await c({description:i.t("config.profile_delete_dry_run",{name:o}),json:{action:"profile_delete",name:o},apply:async()=>{await s({message:i.t("config.profile_delete_confirm",{name:o}),defaultValue:!1})?(r.deleteProfile(o),console.log(e.green(i.t("config.profile_deleted",{name:o})))):console.log(e.yellow(i.t("config.profile_delete_aborted")))}})}console.log(e.red(i.t("config.unknown_action",{action:t})))}(v);case"preset":return void await async function(o){const t=o[0],n=o[1];if(!t||"list"===t){const o=Object.entries(r.getCustomPresets()).map(([o,t])=>`${e.cyan(o)} ${e.gray(`H:${t.models.haiku} S:${t.models.sonnet} O:${t.models.opus}`)}`);return void _(i.t("config.preset_list_title"),o)}if("save"===t){const o=m(n,"preset");return void await c({description:i.t("config.preset_save_dry_run",{name:o}),json:{action:"preset_save",name:o},apply:()=>{r.saveCustomPreset(o,r.getModels()),console.log(e.green(i.t("config.preset_saved",{name:o})))}})}if("use"===t||"apply"===t){const o=m(n,"preset"),t=r.getCustomPresets()[o];return t?void await c({description:i.t("config.preset_use_dry_run",{name:o}),json:{action:"preset_use",name:o},apply:()=>{r.setModels(t.models),console.log(e.green(i.t("config.preset_applied",{name:o})))}}):void console.log(e.red(i.t("config.preset_not_found",{name:o})))}if("delete"===t||"remove"===t){const o=m(n,"preset");return void await c({description:i.t("config.preset_delete_dry_run",{name:o}),json:{action:"preset_delete",name:o},apply:()=>{r.deleteCustomPreset(o),console.log(e.green(i.t("config.preset_deleted",{name:o})))}})}console.log(e.red(i.t("config.unknown_action",{action:t})))}(v);case"tool-model":return void await async function(o){const t=o[0];if(!t||"list"===t){const o=r.getProfile().tool_models||{},t=Object.entries(o).map(([o,t])=>{const n=Object.entries(t).map(([o,e])=>`${o}=${e}`).join(" ");return`${e.cyan(o)} ${e.gray(n)}`});return void _(i.t("config.tool_model_list_title"),t)}if("set"===t){const t=(o[1]||"").trim(),n=o.length>=4?(o[2]||"").trim():"opus",a=(o.length>=4?o[3]:o[2]||"").trim();return l[t]?a&&p.test(n)?void await c({description:i.t("config.tool_model_set_dry_run",{tool:t,slot:n,model:a}),json:{action:"tool_model_set",tool:t,slot:n,model:a},apply:()=>{r.setToolModel(t,{[n]:a}),console.log(e.green(i.t("config.tool_model_set",{tool:t,slot:n,model:a})))}}):void console.log(e.red(i.t("config.tool_model_usage"))):void console.log(e.red(t?i.t("config.unknown_tool",{tool:t}):i.t("config.tool_model_usage")))}if("clear"===t||"remove"===t){const t=(o[1]||"").trim();return l[t]?void await c({description:i.t("config.tool_model_clear_dry_run",{tool:t}),json:{action:"tool_model_clear",tool:t},apply:()=>{r.setToolModel(t,null),console.log(e.green(i.t("config.tool_model_cleared",{tool:t})))}}):void console.log(e.red(t?i.t("config.unknown_tool",{tool:t}):i.t("config.tool_model_usage")))}console.log(e.red(i.t("config.unknown_action",{action:t})))}(v);case"backup":return void await function(o){return async function(o){const t=o[0],n=o[1];if(!t||"list"===t){const o=r.listBackups().map(o=>{const t=new Date(o.mtimeMs).toISOString();return`${e.cyan(o.name)} ${e.gray(t)}`});return void _(i.t("config.backup_list_title"),o)}if("create"!==t&&"snapshot"!==t)return"restore"===t?n?void await c({description:i.t("config.backup_restore_dry_run",{name:n}),json:{action:"backup_restore",name:n},apply:async()=>{await s({message:i.t("config.backup_restore_confirm",{name:n}),defaultValue:!1})?(r.restoreBackup(n),console.log(e.green(i.t("config.backup_restored",{name:n})))):console.log(e.yellow(i.t("config.backup_restore_aborted")))}}):void console.log(e.red(i.t("config.backup_restore_missing_name"))):void console.log(e.red(i.t("config.unknown_action",{action:t})));await c({description:i.t("config.backup_create_dry_run"),json:{action:"backup_create",name:n??null},apply:()=>{const o=r.createBackup(n);console.log(e.green(i.t("config.backup_created",{path:o})))}})}(o)}(v)}"claude-code"!==u&&"claude-code"!==v[0]?l[u]?await y(u,v,d):(console.error(e.red(i.t("config.unknown_command",{command:u}))),console.log(e.gray(i.t("config.usage_hint"))),Object.values(l).filter(o=>!o.hidden).forEach(o=>{console.log(e.gray(` - ${o.name}: ${o.displayName}`))})):await y("claude-code",v,d)}else await async function(t){if(t.nonInteractive)return void console.log(e.red(i.t("config.requires_argument")));const{selectedTool:n}=await o.prompt([{type:"list",name:"selectedTool",message:i.t("wizard.select_tool"),choices:Object.values(l).filter(o=>!o.hidden).map(o=>({name:`${o.displayName} (${o.name})`,value:o.name}))}]);await y(n,[],t)}(d)}
|
package/dist/commands/doctor.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{refreshClientConfig as o}from"../lib/client-config-sync.js";import
|
|
1
|
+
import{refreshClientConfig as o}from"../lib/client-config-sync.js";import t from"chalk";import e from"ora";import{spawnSync as s}from"child_process";import{existsSync as r,readdirSync as n,readFileSync as a}from"fs";import{connect as i}from"net";import{join as c}from"path";import{configManager as l}from"../lib/config.js";import{savedApiKey as d}from"./base.js";import{toolManager as p}from"../lib/tool-manager.js";import{i18n as u}from"../lib/i18n.js";import{validateApiKey as m}from"../lib/api-validator.js";import{getAdapter as f}from"../lib/tools/registry.js";import{findInstalls as _,installLabel as g}from"../lib/tools/tool-installs.js";import{detectManagedOverrides as h}from"../lib/tools/claude-managed.js";import{codexAuthProblem as y,codexCatalogRejection as v,codexConfigPath as w,codexWorkModeOn as j}from"../lib/tools/codex.js";import{claudeAccountLoginPresent as k}from"../lib/tools/claude-code.js";import{toolHome as b}from"../lib/tools/types.js";import{gatewayAddresses as x,probeGatewayAddress as $}from"../lib/gateway-addresses.js";import{listAdapters as T}from"../lib/tools/registry.js";import{logger as A}from"../utils/logger.js";import{maskHome as P,maskSecrets as R,uploadReport as O}from"../lib/telemetry.js";import{CLI_NAME as N}from"../lib/brand.js";const C=["HTTPS_PROXY","https_proxy","HTTP_PROXY","http_proxy","ALL_PROXY","all_proxy"];function I(o,t,e=3e3){return new Promise(s=>{const r=i({host:o,port:t}),n=o=>{r.destroy(),s(o)};r.setTimeout(e,()=>n(!1)),r.once("connect",()=>n(!0)),r.once("error",()=>n(!1))})}function H(){const o=A.getLogDir();if(!r(o))return"";const t=n(o).filter(o=>/^\d{4}-\d{2}-\d{2}\.log$/.test(o)).sort().slice(-2).map(t=>`== ${t}\n`+a(c(o,t),"utf-8")).join("\n");return R(t.slice(-15e4))}function L(){const o={};for(const t of C){const e=process.env[t]?.trim();if(e)try{const s=new URL(e.includes("://")?e:`http://${e}`);o[t]=`${s.protocol}//${s.host}`}catch{o[t]="(unparsable)"}}return o}export async function doctorCommand(r={}){const n=e(u.t("doctor.checking")).start(),i=[],A=Number(process.versions.node.split(".")[0]);i.push({name:"Node.js",status:A>=20?"pass":"fail",message:`v${process.versions.node}`}),n.text=u.t("doctor.check_proxy"),i.push(await async function(){const o=u.t("doctor.proxy"),t=new Map;for(const o of C){const e=process.env[o]?.trim();e&&!t.has(e)&&t.set(e,o)}if(0===t.size)return{name:o,status:"pass",message:u.t("doctor.proxy_none")};const e=[];for(const[o,s]of t){let t;try{t=new URL(o.includes("://")?o:`http://${o}`)}catch{e.push(`${s}=${o}`);continue}const r=Number(t.port)||("https:"===t.protocol?443:t.protocol.startsWith("socks")?1080:80);await I(t.hostname,r)||e.push(`${s}=${o}`)}return 0===e.length?{name:o,status:"pass",message:[...t.keys()].join(", ")}:{name:o,status:"fail",message:u.t("doctor.proxy_dead",{proxies:e.join(", ")})}}()),n.text=u.t("doctor.check_api_key_network");const R=d(),S=u.t("doctor.api_key_network");if(R){const o=await m(R);o.valid?i.push({name:S,status:"pass"}):"invalid_api_key"===o.error?i.push({name:S,status:"fail",message:u.t("doctor.api_key_invalid")}):(i.push({name:S,status:"fail",message:`${u.t("doctor.network_error")}: ${o.message??o.error}`}),n.text=u.t("doctor.check_other_addresses"),i.push(await async function(){const o=u.t("doctor.other_addresses"),t=l.getBaseUrl(),e=x().filter(o=>o.url!==t),s=d(),r=await Promise.all(e.map(o=>$(o.url,{apiKey:s}))),n=e.filter((o,t)=>r[t].ok).map(o=>o.url);return 0===n.length?{name:o,status:"fail",message:u.t("doctor.other_addresses_none")}:{name:o,status:"warn",message:u.t("doctor.other_addresses_found",{urls:n.join(", ")})}}()))}else i.push({name:S,status:"fail",message:u.t("doctor.api_key_missing")});n.text=u.t("doctor.check_client_config");const U=await o();i.push({name:u.t("doctor.client_config"),status:"cloud"===U.source||"cache"===U.source&&!U.problem?"pass":"warn",message:[U.source?u.t(`refresh.source.${U.source}`):u.t("refresh.source.none"),U.revision?u.t("doctor.client_config_revision",{revision:U.revision}):"",U.problem??""].filter(Boolean).join(" · ")}),n.text=u.t("doctor.check_tools");const E=p.getInstalledTools();i.push({name:u.t("doctor.installed_tools"),status:E.length>0?"pass":"warn",message:E.length>0?E.map(o=>f(o)?.displayName??o).join(", "):u.t("doctor.no_tools_installed")}),i.push(...function(){const o=[];for(const t of p.getInstalledTools()){const e=f(t);if(!e?.installSpec)continue;const s=_(e.installSpec);if(0===s.length)continue;const r=[],n=p.outdatedVersion(t);n&&r.push(u.t("doctor.tool_outdated",{min:n.min})),s.length>1&&r.push(u.t("doctor.tool_duplicates",{others:s.slice(1).map(g).join("、")})),o.push({name:e.displayName,status:r.length>0?"warn":"pass",message:[g(s[0]),...r,...r.length>0?[u.t("doctor.run_upgrade",{tool:t})]:[]].join("\n ")})}return o}());const B=function(){if(!p.isToolInstalled("claude-code"))return null;const o=u.t("doctor.claude_config"),t=h();if(t.length>0){const e=t.map(o=>`${o.source}: ${o.keys.join(", ")}`).join("; ");return{name:o,status:"fail",message:u.t("doctor.claude_managed",{detail:e})}}let e={};try{e=JSON.parse(a(c(process.env.CLAUDE_CONFIG_DIR?.trim()||c(b(),".claude"),"settings.json"),"utf-8")).env??{}}catch{}const s=l.getApiKeyForTool("claude-code");return e.ANTHROPIC_AUTH_TOKEN&&e.ANTHROPIC_BASE_URL?e.ANTHROPIC_BASE_URL!==l.getBaseUrl()||s&&e.ANTHROPIC_AUTH_TOKEN!==s?{name:o,status:"warn",message:u.t("doctor.claude_config_changed")}:{name:o,status:"pass"}:{name:o,status:"warn",message:u.t("doctor.claude_not_configured")}}();B&&i.push(B),E.includes("claude-code")&&k()&&i.push({name:u.t("doctor.claude_login"),status:"pass",message:u.t("tools.claude_code.account_login_overridden")});const K=E.includes("codex")?y():null;if(E.includes("codex")&&i.push({name:u.t("doctor.codex_auth"),status:K?"fail":"pass",message:K?u.t(`doctor.codex_${K}`,{path:P(w())}):void 0}),E.includes("codex")){const o=v();i.push({name:u.t("doctor.codex_catalog"),status:o?"fail":"pass",message:o?u.t("doctor.codex_catalog_rejected",{path:o.bin,version:o.version??"?",error:o.error}):void 0})}E.includes("codex")&&j()&&i.push({name:u.t("doctor.codex_work_mode"),status:"warn",message:u.t("tools.codex.work_mode_on")}),"win32"===process.platform&&E.includes("claude-code")&&!process.env.CLAUDE_CODE_GIT_BASH_PATH&&i.push({name:"Git for Windows",status:p.isGitInstalled()?"pass":"warn",message:p.isGitInstalled()?void 0:u.t("tools.claude_code.no_git_bash")}),r.deep&&E.includes("claude-code")&&(n.text=u.t("doctor.check_claude_request"),i.push(function(){const o=u.t("doctor.claude_request"),t=_(f("claude-code").installSpec)[0];if(!t)return{name:o,status:"warn",message:u.t("doctor.claude_request_skipped")};const e={encoding:"utf-8",timeout:12e4,windowsHide:!0,stdio:["ignore","pipe","pipe"]},r=["-p","Reply with the single word OK."],n=/\.cmd$/i.test(t.path)?s(`"${t.path}" ${r.map(o=>`"${o}"`).join(" ")}`,{...e,shell:!0}):s(t.path,r,e),a=`${n.stdout??""}`.trim();if(0===n.status&&a)return{name:o,status:"pass",message:a.slice(0,80)};const i=(`${n.stderr??""}`.trim()||a||n.error?.message||`exit ${n.status}`).slice(0,300);return{name:o,status:"fail",message:u.t("doctor.claude_request_failed",{reason:i})}}())),n.stop(),console.log("\n"+t.bold(u.t("doctor.results_title"))+"\n");const G={pass:t.green("√"),warn:t.yellow("!"),fail:t.red("×")};for(const o of i)console.log(`${G[o.status]} ${o.name}`),o.message&&console.log(t.gray(` ${o.message}`));if(i.every(o=>"pass"===o.status)&&console.log("\n"+t.green.bold(u.t("doctor.all_good"))),!r.deep&&E.includes("claude-code")&&console.log(t.gray("\n"+u.t("doctor.deep_hint"))),r.report){const o=e(u.t("doctor.report_uploading")).start(),t=await O(function(o,t){const e={};for(const o of T()){if(o.hidden)continue;let t=null;try{t=p.detectCurrentConfig(o.name).apiKey?"has_key":"no_key"}catch{t="unreadable"}e[o.name]={installed:p.isToolInstalled(o.name),version:p.installedVersion(o.name),copies:o.installSpec?_(o.installSpec).map(o=>({kind:o.kind,version:o.version,path:o.path})):void 0,config:t}}const s=l.getProfile();return{checks:o,tools:e,settings:{base_url:l.getBaseUrl(),profile:l.getActiveProfileName(),profiles:l.listProfiles().length,key_fingerprint:l.getApiKeyFingerprint()||null,tool_keys:Object.keys(s.tool_api_keys??{}),models:s.models,tool_models:s.tool_models??{},tool_settings:s.tool_settings??{},lang:l.getLang()},client_config:t,env:{shell:process.env.SHELL??process.env.ComSpec??null,term:process.env.TERM_PROGRAM??null,proxies:L()},log:H()}}(i,{source:U.source??void 0,revision:U.revision,problem:U.problem}));t?o.succeed(u.t("doctor.report_done",{code:t})):o.fail(u.t("doctor.report_failed",{cli:N}))}else i.some(o=>"fail"===o.status)&&console.log(t.gray("\n"+u.t("doctor.report_hint",{cli:N})));i.some(o=>"fail"===o.status)&&(process.exitCode=1)}
|
package/dist/commands/logs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import o from"chalk";import{readdirSync as t,statSync as i,readFileSync as n,existsSync as r}from"fs";import{join as e}from"path";import{logger as s}from"../utils/logger.js";import{i18n as l}from"../lib/i18n.js";import{isJsonMode as f,emitJson as c,isColorEnabled as g}from"../lib/runtime-options.js";const m=/^\d{4}-\d{2}-\d{2}\.log$/;function a(o){return g()?o:o=>o}export async function logsCommand(g){const u=g[0]||"list",d=s.getLogDir();if("path"===u)return f()?void c({log_dir:d}):void console.log(l.t("logs.directory",{dir:d}));const p=function(){const o=s.getLogDir();return r(o)?t(o).filter(o=>m.test(o)).map(t=>{const n=e(o,t),r=i(n);return{name:t,path:n,size:r.size,mtimeMs:r.mtimeMs}}).sort((o,t)=>t.mtimeMs-o.mtimeMs):[]}();if("list"!==u){if("tail"===u){const t=g[1],e=t?p.find(o=>o.name===t):p[0];if(!e)return f()?void c({ok:!1,error:"no_log_file"}):void console.log(a(o.gray)(l.t("logs.no_files")));const s=function(o,t=16384){if(!r(o))return"";const e=i(o),s=n(o);if(e.size<=t)return s.toString("utf-8");let l=e.size-t;for(;l<e.size&&128==(192&s[l]);)l+=1;return s.subarray(l).toString("utf-8")}(e.path);return f()?void c({file:e.name,path:e.path,content:s}):void console.log(s)}f()?c({ok:!1,error:"unknown_action",action:u}):console.log(a(o.red)(l.t("config.unknown_action",{action:u})))}else{if(f())return void c({log_dir:d,files:p});if(console.log("\n"+a(o.bold)(l.t("logs.files_title"))),0===p.length)return void console.log(" "+a(o.gray)(l.t("logs.no_files")));for(const t of p){const i=new Date(t.mtimeMs).toISOString();console.log(` ${a(o.cyan)(t.name)} ${a(o.gray)(`${t.size}B`)} ${a(o.gray)(i)}`)}}}
|
|
1
|
+
import o from"chalk";import{readdirSync as t,statSync as i,readFileSync as n,existsSync as r}from"fs";import{join as e}from"path";import{logger as s}from"../utils/logger.js";import{i18n as l}from"../lib/i18n.js";import{isJsonMode as f,emitJson as c,isColorEnabled as g}from"../lib/runtime-options.js";const m=/^\d{4}-\d{2}-\d{2}\.log$/;function a(o){return g()?o:o=>o}export async function logsCommand(g){const u=g[0]||"list",d=s.getLogDir();if("path"===u)return f()?void c({log_dir:d}):void console.log(l.t("logs.directory",{dir:d}));const p=function(){const o=s.getLogDir();return r(o)?t(o).filter(o=>m.test(o)).map(t=>{const n=e(o,t),r=i(n);return{name:t,path:n,size:r.size,mtimeMs:r.mtimeMs}}).sort((o,t)=>t.mtimeMs-o.mtimeMs):[]}();if("list"!==u){if("tail"===u){const t=g[1],e=t?p.find(o=>o.name===t):p[0];if(!e)return f()?void c({ok:!1,error:"no_log_file"}):void console.log(a(o.gray)(t?l.t("logs.no_such_file",{file:t}):l.t("logs.no_files")));const s=function(o,t=16384){if(!r(o))return"";const e=i(o),s=n(o);if(e.size<=t)return s.toString("utf-8");let l=e.size-t;for(;l<e.size&&128==(192&s[l]);)l+=1;return s.subarray(l).toString("utf-8")}(e.path);return f()?void c({file:e.name,path:e.path,content:s}):void console.log(s)}f()?c({ok:!1,error:"unknown_action",action:u}):console.log(a(o.red)(l.t("config.unknown_action",{action:u})))}else{if(f())return void c({log_dir:d,files:p});if(console.log("\n"+a(o.bold)(l.t("logs.files_title"))),0===p.length)return void console.log(" "+a(o.gray)(l.t("logs.no_files")));for(const t of p){const i=new Date(t.mtimeMs).toISOString();console.log(` ${a(o.cyan)(t.name)} ${a(o.gray)(`${t.size}B`)} ${a(o.gray)(i)}`)}}}
|
package/dist/commands/refresh.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import e from"chalk";import{refreshClientConfig as o}from"../lib/client-config-sync.js";import{i18n as r}from"../lib/i18n.js";import{runModelRefresh as
|
|
1
|
+
import e from"chalk";import{refreshClientConfig as o}from"../lib/client-config-sync.js";import{i18n as r}from"../lib/i18n.js";import{lastModelRefreshOutcome as s,runModelRefresh as c}from"../lib/model-refresh.js";export async function refreshCommand(){const n=await o({force:!0}),t=n.source?r.t(`refresh.source.${n.source}`):r.t("refresh.source.none");if(console.log(e.gray(r.t("refresh.config",{source:t,revision:n.revision||"-"}))+(n.problem?e.yellow(` ${r.t("refresh.problem",{problem:n.problem})}`):"")),(await c(["refresh"],{force:!0,output:e=>console.log(e)})).length>0)return;const{checked:l,failed:i}=s();0===l&&0===i?console.log(e.gray(r.t("refresh.nothing_checked"))):0===i&&console.log(e.green(r.t("refresh.up_to_date")))}
|
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 s}from"../lib/i18n.js";import{configManager as l}from"../lib/config.js";import{toolManager as n,SUPPORTED_TOOLS as a}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
|
|
1
|
+
import o from"chalk";import{getAdapter as e}from"../lib/tools/registry.js";import{postApplyPrompts as t}from"../lib/post-apply.js";import{ensureReachableGatewayAddress as i}from"./base.js";import{i18n as s}from"../lib/i18n.js";import{configManager as l}from"../lib/config.js";import{toolManager as n,SUPPORTED_TOOLS as a}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 _,EXIT_CODES as k}from"../lib/errors.js";import{emitJson as h,isColorEnabled as b,isDryRun as w,isJsonMode as v,isNonInteractive as x,shouldAutoConfirm as C}from"../lib/runtime-options.js";import{join as $}from"path";import T from"inquirer";import{logger as j}from"../utils/logger.js";import{forgetInstalls as K}from"../lib/tools/tool-installs.js";import{CLI_NAME as N,brandEnv as G}from"../lib/brand.js";export const DEDICATED_KEYS=[{option:"claudekey",tool:"claude-code",need:"claude"},{option:"codexkey",tool:"codex",need:"gpt"},{option:"grokkey",tool:"grok",need:"grok"},{option:"desktopkey",tool:"claude-desktop",need:"claude"},{option:"agykey",tool:"agy",need:"gemini"},{option:"openclawkey",tool:"openclaw",need:"any",hidden:!0},{option:"hermeskey",tool:"hermes",need:"any",hidden:!0},{option:"atomcodekey",tool:"atomcode",need:"any",hidden:!0}];async function M(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 S(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 E(e){console.log(o.green(e))}function O(e){console.log(o.yellow(e))}function A(e){console.error(o.red(e))}let I=null;function L(o){const e={operation:1,authentication:2,network:3};(!I||e[o]>e[I])&&(I=o)}async function D(e,t){v()||console.log(o.gray(s.t("setup.validating",{label:e})));const i=await r(t);if(i.valid)return!0;const n="zh_CN"===s.getLocale()?"<你的 Key>":"<your key>",a="--key"===e?`${N} setup --key ${n}`:`${N} setup ${e} ${n}`;let p;if("network_error"===i.error?(L("network"),p=_(s.t("setup.unreachable",{url:l.getBaseUrl(),reason:i.message||"network error"}),`${N} base auto`,"network_error")):"invalid_api_key"===i.error?(L("authentication"),p=y(s.t("setup.invalid_key",{label:e,reason:i.message||"invalid"}),a,"invalid_api_key")):(L("operation"),p=g(s.t("setup.validate_failed",{label:e,reason:i.message||i.error||"unknown"}),a,i.error)),v())throw p;return A(p.message),console.log(o.gray(s.t("errors.next_step",{command:p.hint}))),!1}async function P(t,i,r={}){const{oneMillion:p,officialLogin:c,desktopRegistry:u,force:y}=r,_=a[t];try{"claude-desktop"===t&&void 0!==u&&l.setToolSetting("claude-desktop",f,u),"codex"===t&&void 0!==p&&l.setToolSetting("codex",d,p),"claude-desktop"===t&&void 0!==c&&l.setToolSetting("claude-desktop",m,!c),await n.applyPrivateConfig(t,i,l.getModelsForTool(t),{force:y})}catch(o){if(v())throw g(o instanceof Error?o.message:String(o),`${N} setup --key ${"zh_CN"===s.getLocale()?"<你的 Key>":"<your key>"}`,"config_write_failed");const e=(o instanceof Error?o.message:String(o)).replace(/\s+/g," ").trim();return A("× "+s.t("setup.apply_failed",{tool:_.displayName,reason:e})),!1}return n.printApplied(t),y&&console.log(o.gray(" "+s.t("config.force_done",{tool:_.displayName,name:t}))),"codex"===t&&void 0!==p&&console.log(o.gray(" "+s.t(p?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))),e(t)?.isInstalled&&!n.isToolInstalled(t)&&console.log(o.yellow(" ! "+s.t("setup.gui_preconfigured",{tool:_.displayName,install:_.installCommand}))),!0}function R(t,i){const n=t.map(o=>{const t=e(o);return{tool:o,files:t?.backupPaths?.()??(t?[t.configPath]:[])}}),r=$(l.getConfigDir(),"config.yaml");if(v())return void h({dry_run:!0,tools:n,key_file:i?r:null});const p=(b()?o.cyan:o=>o)(s.t("runtime.dry_run_label"));if(0!==n.length){for(const{tool:e,files:t}of n)console.log(`${p} ${s.t("setup.dry_run_tool",{tool:a[e]?.displayName??e})}`),t.forEach(e=>console.log(o.gray(` ${e}`)));i&&console.log(`${p} ${s.t("setup.dry_run_key",{file:r})}`)}else console.log(`${p} ${s.t("setup.dry_run_none")}`)}function B(){return"darwin"===process.platform||"win32"===process.platform||n.isToolInstalled("claude-desktop")}export async function setupCommand(r){I=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 A(s.t("setup.claude_official_invalid",{value:String(r.claudeOfficial)})),void(process.exitCode=1);const _=void 0!==r.desktopRegistry;let h;if(_&&(h=parseOnOff(r.desktopRegistry),void 0===h))return A(s.t("setup.desktop_registry_invalid",{value:String(r.desktopRegistry)})),void(process.exitCode=1);const b=g||_,$=Boolean(p||f.length>0),L={oneMillion:r.oneMillion,officialLogin:y,desktopRegistry:h,force:r.force};if(!$&&(m||b)&&w())return void R([...m?["codex"]:[],...b?["claude-desktop"]:[]],!1);if(!$&&(m||b)){if(m){const o=l.getApiKeyForTool("codex");if(o)try{const e=!0===r.oneMillion;l.setToolSetting("codex",d,e);const t=await u(o);c(e,t??void 0),E(s.t(e?"setup.codex_1m_enabled":"setup.codex_1m_disabled"))}catch(o){A(s.t("setup.apply_failed",{tool:a.codex.displayName,reason:o instanceof Error?o.message:String(o)})),process.exitCode=1}else A(s.t("setup.codex_1m_missing_key")),process.exitCode=1}if(b){const o=l.getApiKeyForTool("claude-desktop");o?await P("claude-desktop",o,{...L,oneMillion:void 0})?await t(["claude-desktop"]):process.exitCode=1:(A(s.t("setup.desktop_official_login_missing_key")),process.exitCode=1)}return}if(!$)return A(s.t("setup.usage")),void(process.exitCode=1);const F=w();F||await i(p||f[0].apiKey);const Y=[];let q=0,z=0;const H=new Set,W=f.map(o=>({tool:o.tool,label:`--${o.option}`,apiKey:o.apiKey,need:o.need}));for(const o of W){if(!await D(o.label,o.apiKey)){z+=1;continue}const e=await M(o.apiKey);!e.probed||S(e,o.need)?(e.probed||O(s.t("setup.probe_failed",{label:o.label})),F?(Y.push(o.tool),H.add(o.tool)):(l.setToolApiKey(o.tool,o.apiKey),await P(o.tool,o.apiKey,L)?(q+=1,H.add(o.tool)):z+=1)):(A(s.t(`setup.key_no_${o.need}`,{label:o.label,tool:a[o.tool].displayName})),z+=1)}if(p){if(!await D("--key",p))return void(process.exitCode=k[I??"operation"]);F||l.setApiKey(p);const o=await M(p);if(o.probed||O(s.t("setup.probe_failed",{label:"--key"})),o.probed&&!o.hasClaude&&!o.hasGpt&&!o.hasGrok&&!o.hasGemini)return A(s.t("setup.key_no_family")),void(process.exitCode=1);const e=[{tool:"claude-code",capable:o.hasClaude,skipMsg:s.t(B()?"setup.skip_no_claude_desktop":"setup.skip_no_claude")},{tool:"codex",capable:o.hasGpt,skipMsg:s.t("setup.skip_no_gpt")},{tool:"grok",capable:o.hasGrok,skipMsg:s.t("setup.skip_no_grok")},{tool:"claude-desktop",capable:o.hasClaude&&B(),skipMsg:"",quiet:!0},{tool:"agy",capable:o.hasGemini,skipMsg:s.t("setup.skip_no_gemini")}];for(const o of e)H.has(o.tool)||(o.capable?F?(Y.push(o.tool),H.add(o.tool)):await P(o.tool,p,L)?(q+=1,H.add(o.tool)):z+=1:o.quiet||O(o.skipMsg))}if(F)return R(Y,Y.length>0),void(z>0&&(process.exitCode=k[I??"operation"]));if(q>0){const t=await async function(t,i,r){const p=t.filter(o=>!e(o)?.isInstalled&&!n.isToolInstalled(o));if(0===p.length)return[];const d=p.map(o=>a[o].displayName).join(s.t("setup.list_separator"));let c=i;if(void 0!==c||v()||(C()?c=!x():process.stdin.isTTY&&(console.log(""),c=(await T.prompt([{type:"confirm",name:"go",message:s.t("setup.install_confirm",{tools:d}),default:!0}])).go)),!c){console.log("");for(const e of p)console.log(o.yellow("! "+s.t("setup.install_hint",{tool:a[e].displayName,install:a[e].installCommand})));return v()||console.log(o.gray(s.t("setup.install_all_hint",{cli:N}))),p}const u=[];for(const e of p){console.log(o.bold(`\n${a[e].displayName}`));try{await n.installTool(e)}catch(o){j.logError(`setup: install ${e}`,o)}K(),n.isToolInstalled(e)||u.push(e)}const f=p.filter(o=>!u.includes(o));f.length>0&&console.log("");for(const o of f){const e=l.getApiKeyForTool(o);e&&await P(o,e,{...r,oneMillion:void 0,force:void 0})}return u}([...H],r.install,L),i=[...H].filter(o=>!e(o)?.isInstalled&&!t.includes(o)),p=i.map(o=>a[o]?.command).filter(Boolean).join(" / "),d=s.t("setup.done",{count:String(q)});E("\n"+(p?`${d}${s.t("setup.done_commands",{commands:p})}`:d)),t.length>0&&O(s.t("setup.still_missing",{tools:t.map(o=>a[o].displayName).join(s.t("setup.list_separator"))}));for(const o of i){const e=n.ensureNativeOnPath(o);e&&E(s.t("setup.path_added",{tool:a[o].displayName,dir:e}))}const c=i.filter(o=>!n.isOnPath(o));if(c.length>0&&!v()&&"1"!==G("PATH_HINT_BY_CALLER")){const e=c.map(o=>a[o].command).join(" / ");console.log(o.yellow(" ! "+s.t("win32"===process.platform?"setup.path_reload_windows":"setup.path_reload",{commands:e})))}}z>0&&(A(s.t("setup.failed_summary",{count:String(z)})),v()||console.error(`${N} setup --key ${"zh_CN"===s.getLocale()?"<你的 Key>":"<your key>"}`)),await t([...H]),(z>0||0===q)&&(process.exitCode=k[I??"operation"])}
|
package/dist/commands/status.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import o from"chalk";import{configManager as e,DEFAULT_BASE_URL as t}from"../lib/config.js";import{toolManager as l,SUPPORTED_TOOLS as s}from"../lib/tool-manager.js";import{claudeCodeManager as n}from"../lib/claude-code-manager.js";import{i18n as i}from"../lib/i18n.js";import{isJsonMode as a,emitJson as r,isColorEnabled as g}from"../lib/runtime-options.js";function c(o){return g()?o:o=>o}export async function statusCommand(){const g=e.getApiKey(),p=e.getBaseUrl(),u=e.getModels(),m=
|
|
1
|
+
import o from"chalk";import{configManager as e,DEFAULT_BASE_URL as t}from"../lib/config.js";import{toolManager as l,SUPPORTED_TOOLS as s}from"../lib/tool-manager.js";import{claudeCodeManager as n}from"../lib/claude-code-manager.js";import{i18n as i}from"../lib/i18n.js";import{isJsonMode as a,emitJson as r,isColorEnabled as g}from"../lib/runtime-options.js";function c(o){return g()?o:o=>o}export async function statusCommand(){const g=e.getApiKey(),p=e.getBaseUrl(),u=e.getModels(),m=i.getLocale(),d=l.getSupportedTools().map(o=>{const e=l.isToolInstalled(o.name);let t=null;return e&&"claude-code"===o.name&&(t=Boolean(n.detectCurrentConfig().apiKey)),{name:o.name,display_name:o.displayName,installed:e,config_loaded:t}}),f=e.getActiveProfileName(),$=e.listProfiles(),_=Object.keys(e.getCustomPresets()),y=e.listToolApiKeys();if(a())return void r({api_key_set:Boolean(g),api_key_fingerprint:e.getApiKeyFingerprint()||null,tool_key_fingerprints:Object.fromEntries(y.map(o=>[o,e.getToolApiKeyFingerprint(o)||null])),base_url:p,base_url_is_default:p===t,language:m,models:u,tools:d,active_profile:f,profiles:$,custom_presets:_});const b=c(o.cyan),k=c(o.green),j=c(o.yellow),A=c(o.gray),K=c(o.red);console.log("\n"+c(o.bold)(i.t("status.title"))+"\n");const C=e.getApiKeyFingerprint(),T=g?C?`sk-fp-${C}`:"sk-****":j(i.t("wizard.not_set"));console.log(` ${b(i.t("status.api_key"))}: ${g?k(T):T}`);for(const o of y){const t=e.getToolApiKeyFingerprint(o);if(!t)continue;const l=s[o]?.displayName||o;console.log(` ${b(i.t("status.tool_key_label",{tool:l}))}: ${k(`sk-fp-${t}`)}`)}const F=p===t;console.log(` ${b(i.t("status.base_url"))}: ${p}${F?A(" (default)"):""}`),console.log(` ${b(i.t("status.language"))}: ${m}`),console.log(` ${b("Profile")}: ${f} ${A("("+$.join(", ")+")")}`),console.log(` ${b(i.t("status.models"))}:`),console.log(` Haiku: ${u.haiku}`),console.log(` Sonnet: ${u.sonnet}`),console.log(` Opus: ${u.opus}`),console.log(` Reasoning: ${u.reasoning}`),_.length>0&&console.log(` ${b("Custom presets")}: ${_.join(", ")}`),console.log(` ${b(i.t("status.tools"))}:`);for(const o of d){const e=o.installed?k("✓"):K("✗");let t="";!0===o.config_loaded?t=k(" ("+i.t("status.config_loaded")+")"):!1===o.config_loaded&&(t=A(" ("+i.t("status.config_not_loaded")+")")),console.log(` ${e} ${o.display_name}${t}`)}console.log("")}
|
package/dist/lib/command.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i18n as n,detectSystemLang as r}from"./i18n.js";import{configManager as o}from"./config.js";import{runModelRefresh as e}from"./model-refresh.js";import{refreshClientConfig as t}from"./client-config-sync.js";import{normalizeBaseUrl as s}from"./gateway-addresses.js";import i from"chalk";import{setRuntimeOptions as m,detectColorPreferenceFromEnv as a,isColorEnabled as c,isDryRun as l,isJsonMode as d}from"./runtime-options.js";import{cleanupAnthropicEnvVars as u,envCleanupChangedProfile as g,machineEnvVarsLeft as p}from"./env-cleanup.js";import{runStartupUpdate as f}from"./auto-update.js";import{buildProgram as h}from"./program.js";import{firstCommandWord as _,isHelpRequest as y,renderHelpTopic as w}from"./cli-help.js";import{reportCliError as v,usageError as j,CliError as k}from"./errors.js";import{CLI_NAME as C}from"./brand.js";import{dryRunUnsupportedCommand as x}from"./dry-run.js";import{flushTelemetry as A,installClientHeaders as b,setTelemetryCommand as D,track as M}from"./telemetry.js";export{buildProgram}from"./program.js";const E=new Set(["setup","init","auth","enter","config"]);export class Command{program;configuring=!1;constructor(){const e=o.isLangChosen()?o.getLang():r();n.loadFromConfig(e),this.program=h()}cleanupLeakedEnvVars(){const r=u();if(0===r.length||d())return;const o=g()?"messages.env_vars_cleared":"messages.env_vars_ignored",
|
|
1
|
+
import{i18n as n,detectSystemLang as r}from"./i18n.js";import{configManager as o}from"./config.js";import{runModelRefresh as e}from"./model-refresh.js";import{refreshClientConfig as t}from"./client-config-sync.js";import{normalizeBaseUrl as s}from"./gateway-addresses.js";import i from"chalk";import{setRuntimeOptions as m,detectColorPreferenceFromEnv as a,isColorEnabled as c,isDryRun as l,isJsonMode as d}from"./runtime-options.js";import{cleanupAnthropicEnvVars as u,envCleanupChangedProfile as g,machineEnvVarsLeft as p}from"./env-cleanup.js";import{runStartupUpdate as f}from"./auto-update.js";import{buildProgram as h}from"./program.js";import{firstCommandWord as _,isHelpRequest as y,renderHelpTopic as w}from"./cli-help.js";import{reportCliError as v,usageError as j,CliError as k}from"./errors.js";import{CLI_NAME as C}from"./brand.js";import{dryRunUnsupportedCommand as x}from"./dry-run.js";import{flushTelemetry as A,installClientHeaders as b,setTelemetryCommand as D,track as M}from"./telemetry.js";export{buildProgram}from"./program.js";const E=new Set(["setup","init","auth","enter","config"]);export class Command{program;configuring=!1;constructor(){const e=o.isLangChosen()?o.getLang():r();n.loadFromConfig(e),this.program=h()}cleanupLeakedEnvVars(){const r=u();if(0===r.length||d())return;const o=p(),e=g();if(e||0===o.length){const o=n.t(e?"messages.env_vars_cleared":"messages.env_vars_ignored",{vars:r.join(", ")});console.log(c()?i.yellow(o):o)}if(o.length>0){const r=n.t("messages.env_vars_machine_left",{vars:o.join(", ")});console.log(c()?i.yellow(r):r)}}preflightArgs(n){const r=r=>n.includes(r),e=!r("--no-color")&&a();if(m({nonInteractive:r("--non-interactive"),json:r("--json"),yes:r("--yes")||r("-y"),dryRun:r("--dry-run"),color:e}),e||(i.level=0),this.configuring=!1,y(n))return;let t;for(let r=0;r<n.length;r+=1){const o=n[r];"--base"===o&&n[r+1]?(t=n[r+1],r+=1):o.startsWith("--base=")&&(t=o.slice(7))}const c=_(n),l=void 0===c&&!["--version","-v"].some(r);this.configuring=l||void 0!==c&&E.has(c),t&&o.setBaseUrl(s(t)??t,this.configuring&&!r("--dry-run"))}async execute(n){const r=Date.now();let o=!1;try{if(this.preflightArgs(n),b(),y(n)||["--version","-v"].some(r=>n.includes(r))||(D(_(n)??"wizard"),M("command","start",{detail:{args:n.filter(n=>n.startsWith("-")&&!/key/i.test(n))}}),o=!0),"help"===n[0]&&n[1]){const r=w(n[1]);if(r)return void process.stdout.write(r)}if(this.rejectUnknownCommand(n),!y(n)){if(l()&&this.rejectUnsupportedDryRun(n),this.configuring&&!l()&&this.cleanupLeakedEnvVars(),(await f(n)).handled)return;this.configuring&&await t({timeoutMs:5e3}),await e(n)}if(await this.program.parseAsync(n,{from:"user"}),o){const n=Boolean(process.exitCode)&&0!==process.exitCode;M("command",n?"fail":"ok",{duration_ms:Date.now()-r,...n?{detail:{exit_code:process.exitCode}}:{}})}}catch(e){if("commander.helpDisplayed"===e?.code||"commander.version"===e?.code)return;const t=this.normalizeCommanderError(e,n),s=v(t);if(o){const n=t instanceof k?`${t.type}${t.subtype?"/"+t.subtype:""}`:void 0;M("command",130===s?"cancel":"fail",{duration_ms:Date.now()-r,error:t,detail:{exit_code:s,...n?{type:n}:{}}})}}finally{o&&await A()}}rejectUnsupportedDryRun(r){const o=x(r);if(null!==o)throw j(n.t("runtime.dry_run_unsupported",{command:o,cli:C}),n.t("runtime.dry_run_unsupported_hint",{cli:C}),"dry_run_unsupported")}rejectUnknownCommand(r){const o=_(r);if(!o||"help"===o)return;if(this.program.commands.some(n=>n.name()===o))return;const e=this.suggestCommand(o),t=e?n.t("cli.unknown_hint_suggestion",{command:e}):n.t("cli.unknown_hint");throw j(n.t("cli.error_unknown",{command:o}),t,"unknown_command")}suggestCommand(n){const r=(n,r)=>{const o=Array.from({length:r.length+1},(n,r)=>r);for(let e=1;e<=n.length;e+=1){let t=o[0];o[0]=e;for(let s=1;s<=r.length;s+=1){const i=o[s];o[s]=Math.min(o[s]+1,o[s-1]+1,t+(n[e-1]===r[s-1]?0:1)),t=i}}return o[r.length]};return this.program.commands.map(n=>n.name()).map(o=>({name:o,score:r(n,o)})).filter(({score:r})=>r<=Math.max(2,Math.floor(n.length/2))).sort((n,r)=>n.score-r.score)[0]?.name}normalizeCommanderError(r,o){if(r instanceof k)return r;const e=r?.code,t=r instanceof Error?r.message:String(r);if("commander.unknownOption"===e||"commander.missingArgument"===e||"commander.missingMandatoryOption"===e||"commander.invalidArgument"===e){const r=_(o),s=/'([^']+)'/.exec(t)?.[1]??"",i="commander.unknownOption"===e?"cli.err_unknown_option":"commander.missingArgument"===e?"cli.err_missing_argument":"commander.missingMandatoryOption"===e?"cli.err_missing_option":null,m=i&&s?n.t(i,{name:s}):t.replace(/^error:\s*/,"");return j(m,r?n.t("cli.unknown_option_hint",{command:r}):n.t("cli.unknown_option_hint_root"),e)}return r}getProgram(){return this.program}}
|
|
@@ -11,6 +11,11 @@ export interface ModelMenuChange {
|
|
|
11
11
|
removed: string[];
|
|
12
12
|
}
|
|
13
13
|
export declare function shouldSkipModelRefresh(args: string[], env?: NodeJS.ProcessEnv): boolean;
|
|
14
|
+
/** How the last refresh went: menus actually checked against the gateway, and tools that failed. */
|
|
15
|
+
export declare function lastModelRefreshOutcome(): {
|
|
16
|
+
checked: number;
|
|
17
|
+
failed: number;
|
|
18
|
+
};
|
|
14
19
|
/** Rewrites the menus that differ from the gateway's current list; returns what changed per tool. */
|
|
15
20
|
export declare function refreshModelMenus(): Promise<ModelMenuChange[]>;
|
|
16
21
|
/** Startup hook: at most once an hour, never fails the command it rides along with. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as e,mkdirSync as o,readFileSync as r,writeFileSync as t}from"fs";import{dirname as n,join as s}from"path";import i from"chalk";import{configManager as l}from"./config.js";import{i18n as f}from"./i18n.js";import{resolveModelCatalog as d}from"./model-catalog.js";import{listAdapters as c}from"./tools/registry.js";import{UserActionNeeded as a}from"./tools/types.js";import{logger as
|
|
1
|
+
import{existsSync as e,mkdirSync as o,readFileSync as r,writeFileSync as t}from"fs";import{dirname as n,join as s}from"path";import i from"chalk";import{configManager as l}from"./config.js";import{i18n as f}from"./i18n.js";import{resolveModelCatalog as d}from"./model-catalog.js";import{listAdapters as c}from"./tools/registry.js";import{UserActionNeeded as a}from"./tools/types.js";import{logger as u}from"../utils/logger.js";import{resolveUpdateCachePath as m}from"./auto-update.js";import{isHelpRequest as h}from"./cli-help.js";import{brandEnvName as p}from"./brand.js";export const MODEL_REFRESH_INTERVAL_MS=36e5;const g=new Set(["setup","init","config","auth","enter","completion","update","lang","logs","refresh"]),M=["--json","--dry-run","--help","-h","--version","-v"],y=[];export function shouldSkipModelRefresh(e,o=process.env){if("1"===o[p("DISABLE_MODEL_REFRESH")])return!0;if(M.some(o=>e.includes(o))||h(e))return!0;const r=e.find(e=>!e.startsWith("-"));return void 0!==r&&g.has(r)}let j={checked:0,failed:0};export function lastModelRefreshOutcome(){return{...j}}export async function refreshModelMenus(){const e=new Map,o=[];y.length=0,j={checked:0,failed:0};for(const r of c())if(r.refreshModelMenu&&r.listedModels)try{const t=l.getApiKeyForTool(r.name);if(!t||r.detectCurrentConfig().apiKey!==t)continue;const n=r.listedModels();if(null===n)continue;e.has(t)||e.set(t,await d(t));const s=e.get(t);if(!s)continue;r.refreshModelMenu({apiKey:t,baseUrl:l.getBaseUrl(),models:l.getModelsForTool(r.name),settings:l.getToolSettings(r.name),catalog:s}),j.checked++;const i=r.listedModels()??[],f=i.filter(e=>!n.includes(e)),c=n.filter(e=>!i.includes(e));(f.length>0||c.length>0)&&o.push({tool:r.displayName,added:f,removed:c})}catch(e){j.failed++,u.logError(`modelRefresh(${r.name})`,e),e instanceof a&&y.push(e.message)}return o}export async function runModelRefresh(l,d={}){const c=d.env??process.env,a=d.now??Date.now(),h=function(e){return s(n(m(e)),"model-refresh.json")}(c);if(!d.force){if(shouldSkipModelRefresh(l,c))return[];if(a-function(e){try{const o=JSON.parse(r(e,"utf-8")).refreshed_at;return"number"==typeof o?o:0}catch{return 0}}(h)<36e5)return[]}let p=[];try{p=await refreshModelMenus(),e(n(h))||o(n(h),{recursive:!0}),t(h,JSON.stringify({refreshed_at:a})+"\n")}catch(e){u.logError("runModelRefresh",e)}const g=d.output??(e=>console.log(i.gray(e)));for(const e of y)g(e);for(const e of p){const o=[e.added.length>0?f.t("model_refresh.added",{models:e.added.join(", ")}):"",e.removed.length>0?f.t("model_refresh.removed",{models:e.removed.join(", ")}):""].filter(Boolean);g(f.t("model_refresh.changed",{tool:e.tool,changes:o.join(";")}))}return p}
|
package/dist/lib/program.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Command as e,Option as o}from"commander";import{readFileSync as t}from"fs";import{join as s,dirname as a}from"path";import{fileURLToPath as n}from"url";import{i18n as i}from"./i18n.js";import{wizard as r}from"./wizard.js";import{SUPPORTED_TOOLS as c}from"./tool-manager.js";import{DEFAULT_BASE_URL as l}from"./config.js";import{attachCommandHelp as p,helpConfiguration as m}from"./cli-help.js";import{langCommand as u,authCommand as d,doctorCommand as g,configCommand as f,statusCommand as x,refreshCommand as y}from"../commands/index.js";import{logsCommand as h}from"../commands/logs.js";import{completionCommand as b}from"../commands/completion.js";import{benchCommand as $}from"../commands/bench.js";import{updateCommand as k}from"../commands/update.js";import{upgradeCommand as _}from"../commands/upgrade.js";import{codexSessionsCommand as w}from"../commands/codex-sessions.js";import{setupCommand as v,DEDICATED_KEYS as j}from"../commands/setup.js";import{baseCommand as O}from"../commands/base.js";import{usageError as S}from"./errors.js";import{brand as z,brandEnv as A,CLI_NAME as C}from"./brand.js";const E=(z().gatewayAddresses[1]??z().gatewayAddresses[0]).url,G=(z().gatewayAddresses[2]??z().gatewayAddresses[0]).url;function R(e,o){return i.t(`help.${e}`,o)}function K(e,o){return{command:e,note:R(o)}}function L(e){const o=R(e);return o===`help.${e}`?"":o}function N(e,o=[]){return{when:L(`${e}.when`),prerequisites:L(`${e}.needs`).split("\n").filter(Boolean),alternatives:o.map(([e,o])=>K(e,o))}}function P(e){return e.helpCommand("help [command]",R("help_command"))}export function buildProgram(){const z=new e;z.name(`${C}`).summary(R("root.summary")).description(R("root.description")).configureHelp(m()).allowExcessArguments(!0).optionsGroup(R("group.global_options")).helpOption("-h, --help",R("global.help")).version(function(){try{const e=a(n(import.meta.url));return JSON.parse(t(s(e,"../../package.json"),"utf-8")).version}catch{return"1.0.0"}}(),"-v, --version",R("global.version")).option("--base <url>",R("global.base")).option("--non-interactive",R("global.non_interactive")).option("--json",R("global.json")).option("-y, --yes",R("global.yes")).option("--dry-run",R("global.dry_run")).option("--no-color",R("global.no_color")),z.configureOutput({writeErr:()=>{},outputError:()=>{}}),z.showSuggestionAfterError(),z.exitOverride(e=>{throw e}),z.commandsGroup(R("group.configure"));const L=z.command("setup").summary(R("setup.summary")).description(R("setup.description")).option("--key <key>",R("setup.opt.key"));for(const e of j){const t=new o(`--${e.option} <key>`,R(`setup.opt.${e.option}`));e.hidden&&t.hideHelp(),L.addOption(t)}L.option("--1m",R("setup.opt.one_m")).option("--no-1m",R("setup.opt.no_one_m")).option("--claude-official <on|off>",R("setup.opt.claude_official")).option("--desktop-registry <on|off>",R("setup.opt.desktop_registry")).option("--force",R("setup.opt.force")).option("--install",R("setup.opt.install")).option("--no-install",R("setup.opt.no_install")).option("--all",R("setup.opt.all")).action(async e=>{e.key||j.some(o=>e[o.option])||(e.key=A("SETUP_KEY")?.trim()||void 0);const o=Boolean(e.key||j.some(o=>e[o.option])),t=void 0!==e["1m"]||void 0!==e.claudeOfficial||void 0!==e.desktopRegistry,s="zh_CN"===i.getLocale()?"<你的 Key>":"<your key>";if(!o&&!t)throw S(i.t("setup.usage"),`${C} setup --key ${s}`,"missing_key");if(void 0!==e.claudeOfficial&&!["on","off"].includes(String(e.claudeOfficial).toLowerCase()))throw S(i.t("setup.claude_official_invalid",{value:String(e.claudeOfficial)}),`${C} setup --claude-official on|off`,"invalid_value");if(void 0!==e.desktopRegistry&&!["on","off"].includes(String(e.desktopRegistry).toLowerCase()))throw S(i.t("setup.desktop_registry_invalid",{value:String(e.desktopRegistry)}),`${C} setup --desktop-registry on|off`,"invalid_value");await v({key:e.key,...Object.fromEntries(j.map(o=>[o.option,e[o.option]])),all:e.all,oneMillion:e["1m"],claudeOfficial:e.claudeOfficial,desktopRegistry:e.desktopRegistry,force:e.force,install:e.install})}),p(L,{...N("setup",[[`${C} init`,"setup.alt.init"],[`${C} config <tool>`,"setup.alt.config"],[`${C} auth <key>`,"setup.alt.auth"]]),sections:[{title:R("setup.autodetect_title"),rows:[["Claude",R("setup.autodetect.claude")],["GPT",R("setup.autodetect.gpt")],["Grok",R("setup.autodetect.grok")],["Gemini",R("setup.autodetect.gemini")]]}],examples:[K(`${C} setup --key sk-xxx`,"setup.ex.key"),K(`${C} setup --install --key sk-xxx`,"setup.ex.install"),K(`${C} setup --claudekey sk-a --codexkey sk-b --agykey sk-g`,"setup.ex.split"),K(`${C} setup --force --key sk-xxx`,"setup.ex.force"),K(`${C} setup --base ${E} --key sk-xxx`,"setup.ex.base")]});const T=z.command("init").summary(R("init.summary")).description(R("init.description")).action(async()=>{await r.runFirstTimeSetup()});p(T,{...N("init",[[`${C} setup --key <key>`,"init.alt.setup"],[`${C}`,"init.alt.menu"]]),examples:[K(`${C} init`,"init.ex.run"),K(`${C} init --base ${E}`,"init.ex.base"),K(`${C}`,"init.ex.menu")]});const U=z.command("auth").summary(R("auth.summary")).description(R("auth.description")).argument("[token]",R("auth.arg.token")).action(async e=>{const o=[];e&&o.push(e),await d(o)});P(U);const B=U.command("revoke").description(R("auth.revoke")).action(async()=>{await d(["revoke"])});p(B,{examples:[K(`${C} auth revoke`,"auth.ex.revoke_ask"),K(`${C} auth revoke --yes`,"auth.ex.revoke")]});const H=U.command("reload <tool>").description(R("auth.reload")).action(async e=>{await d(["reload",e])});p(H,{examples:[K(`${C} auth reload claude-code`,"auth.ex.reload"),K(`${C} auth reload claude-code --json`,"auth.ex.reload_json")]}),p(U,{...N("auth",[[`${C} setup --key <key>`,"auth.alt.setup"]]),examples:[K(`${C} auth`,"auth.ex.prompt"),K(`${C} auth sk-xxx --non-interactive`,"auth.ex.save"),K(`${C} auth revoke --yes`,"auth.ex.revoke"),K(`${C} auth reload claude-code`,"auth.ex.reload")]});const M=z.command("config").summary(R("config.summary")).description(R("config.description")).argument("[args...]",R("config.arg.args")).option("-f, --force",R("config.opt.force")).allowUnknownOption(!0).action(async(e=[],o={})=>{await f(o.force?[...e,"--force"]:e)});p(M,{...N("config",[[`${C} setup --force --key <key>`,"config.alt.setup"],[`${C} status`,"config.alt.status"]]),sections:[{title:R("config.subcommands_title"),rows:[["<tool>",R("config.sub.tool")],["<tool> --force",R("config.sub.tool_force")],["<tool> --non-interactive",R("config.sub.tool_non_interactive")],["<tool> remove",R("config.sub.tool_remove")],["<tool> restore",R("config.sub.tool_restore")],["<tool> backups",R("config.sub.tool_backups")],["<tool> clear-model",R("config.sub.tool_clear_model")],["tool-model list",R("config.sub.tool_model_list")],["tool-model set <tool> [slot] <model>",R("config.sub.tool_model_set")],["tool-model clear <tool>",R("config.sub.tool_model_clear")],["profile list",R("config.sub.profile_list")],["profile create <name>",R("config.sub.profile_create")],["profile use <name>",R("config.sub.profile_use")],["profile delete <name>",R("config.sub.profile_delete")],["preset list",R("config.sub.preset_list")],["preset save <name>",R("config.sub.preset_save")],["preset use <name>",R("config.sub.preset_use")],["preset delete <name>",R("config.sub.preset_delete")],["backup list",R("config.sub.backup_list")],["backup create [label]",R("config.sub.backup_create")],["backup restore <name>",R("config.sub.backup_restore")]]},{title:R("config.tools_title"),rows:Object.values(c).filter(e=>!e.hidden).map(e=>[e.name,e.displayName])}],examples:[K(`${C} config codex`,"config.ex.menu"),K(`${C} config claude-code --force`,"config.ex.force"),K(`${C} config tool-model set codex gpt-6-astra`,"config.ex.tool_model"),K(`${C} config profile create work`,"config.ex.profile"),K(`${C} config codex remove`,"config.ex.remove")]});const q=z.command("base").summary(R("base.summary")).description(R("base.description")).argument("[target]",R("base.arg.target")).action(async e=>{await O(e)});p(q,{...N("base",[[`${C} doctor`,"base.alt.doctor"],[`${C} bench`,"base.alt.bench"]]),sections:[{title:R("base.targets_title"),rows:[[R("base.target.none_term"),R("base.target.none")],[R("base.target.index_term"),R("base.target.index")],[R("base.target.url_term"),R("base.target.url")],["auto",R("base.target.auto")],["default",R("base.target.default",{url:l})]]}],examples:[K(`${C} base`,"base.ex.list"),K(`${C} base auto`,"base.ex.auto"),K(`${C} base 2`,"base.ex.index"),K(`${C} base ${E}`,"base.ex.url"),K(`${C} base default`,"base.ex.default")]}),z.commandsGroup(R("group.diagnose"));const F=z.command("status").summary(R("status.summary")).description(R("status.description")).action(async()=>{await x()});p(F,{...N("status",[[`${C} doctor`,"status.alt.doctor"]]),examples:[K(`${C} status`,"status.ex.show"),K(`${C} status --json`,"status.ex.json")]});const J=z.command("doctor").summary(R("doctor.summary")).description(R("doctor.description")).option("--deep",R("doctor.opt.deep")).option("--report",R("doctor.opt.report")).action(async e=>{await g({deep:e.deep,report:e.report})});p(J,{...N("doctor",[[`${C} base auto`,"doctor.alt.base"],[`${C} logs tail`,"doctor.alt.logs"]]),examples:[K(`${C} doctor`,"doctor.ex.run"),K(`${C} doctor --deep`,"doctor.ex.deep"),K(`${C} doctor --report`,"doctor.ex.report")]});const Y=z.command("bench").summary(R("bench.summary")).description(R("bench.description")).option("--samples <n>",R("bench.opt.samples"),"5").action(async e=>{const o=[];e.samples&&o.push("--samples",e.samples),await $(o)});p(Y,{...N("bench",[[`${C} base`,"bench.alt.base"]]),examples:[K(`${C} bench`,"bench.ex.run"),K(`${C} bench --samples 3`,"bench.ex.samples"),K(`${C} bench --json`,"bench.ex.json")]});const D=z.command("logs").summary(R("logs.summary")).description(R("logs.description")).argument("[action]",R("logs.arg.action")).argument("[file]",R("logs.arg.file")).action(async(e,o)=>{const t=[];e&&t.push(e),o&&t.push(o),await h(t)});p(D,{...N("logs",[[`${C} doctor`,"logs.alt.doctor"]]),sections:[{title:R("logs.actions_title"),rows:[["list",R("logs.action.list")],["tail [file]",R("logs.action.tail")],["path",R("logs.action.path")]]}],examples:[K(`${C} logs`,"logs.ex.list"),K(`${C} logs tail`,"logs.ex.tail"),K(`${C} logs path`,"logs.ex.path")]}),z.commandsGroup(R("group.maintain"));const I=z.command("upgrade").summary(R("upgrade.summary")).description(R("upgrade.description")).argument("[tools...]",R("upgrade.arg.tools")).action(async(e=[])=>{await _(e)});p(I,{...N("upgrade",[[`${C} update`,"upgrade.alt.update"]]),examples:[K(`${C} upgrade`,"upgrade.ex.all"),K(`${C} upgrade claude-code`,"upgrade.ex.one"),K(`${C} upgrade codex agy`,"upgrade.ex.many")]});const Q=z.command("refresh").summary(R("refresh.summary")).description(R("refresh.description")).action(async()=>{await y()});p(Q,{...N("refresh",[[`${C} setup --key <你的 Key>`,"refresh.alt.setup"]]),examples:[K(`${C} refresh`,"refresh.ex.run"),K(`${C} refresh --base ${G}`,"refresh.ex.base")]});const V=z.command("update").summary(R("update.summary")).description(R("update.description")).action(async()=>{await k()});p(V,{...N("update",[[`${C} upgrade`,"update.alt.upgrade"]]),examples:[K(`${C} update`,"update.ex.check"),K(`${C} update --json`,"update.ex.json")]});const W=z.command("codex").summary(R("codex.summary")).description(R("codex.description"));P(W);const X=W.command("sessions").summary(R("codex_sessions.summary")).description(R("codex_sessions.description")).option("--to <provider>",R("codex_sessions.opt.to")).option("--undo <dir>",R("codex_sessions.opt.undo")).action(async e=>{await w(e)});p(W,{...N("codex"),examples:[K(`${C} codex sessions`,"codex_sessions.ex.move"),K(`${C} codex sessions --undo <dir>`,"codex_sessions.ex.undo")]}),p(X,{...N("codex_sessions",[[`${C} codex sessions --undo <dir>`,"codex_sessions.alt.undo"]]),examples:[K(`${C} codex sessions`,"codex_sessions.ex.move"),K(`${C} codex sessions --to custom`,"codex_sessions.ex.to"),K(`${C} codex sessions --undo <dir>`,"codex_sessions.ex.undo")]});const Z=z.command("lang").summary(R("lang.summary")).description(R("lang.description"));P(Z);const ee=Z.command("show").description(R("lang.show")).action(async()=>{await u(["show"])}),oe=Z.command("set <locale>").description(R("lang.set")).action(async e=>{await u(["set",e])}),te=[K(`${C} lang show`,"lang.ex.show"),K(`${C} lang set en_US`,"lang.ex.set_en"),K(`${C} lang set zh_CN`,"lang.ex.set_zh")];p(Z,{...N("lang",[[`${C} enter lang`,"lang.alt.enter"]]),examples:te}),p(ee,{examples:[te[0],K(`${C} lang show --json`,"lang.ex.show_json")]}),p(oe,{examples:te.slice(1)});const se=z.command("completion").summary(R("completion.summary")).description(R("completion.description")).argument("<shell>",R("completion.arg.shell")).action(async e=>{await b([e])});p(se,{...N("completion"),examples:[K(`${C} completion bash > ~/.${C}-completion.bash`,"completion.ex.bash"),K(`${C} completion zsh > ~/.${C}-completion.zsh`,"completion.ex.zsh"),K(`${C} completion fish > ~/.config/fish/completions/${C}.fish`,"completion.ex.fish")]});const ae=z.command("enter").summary(R("enter.summary")).description(R("enter.description")).argument("[option]",R("enter.arg.option")).action(async e=>{if(e)switch(e){case"lang":case"language":await r.configLanguage();break;case"apikey":case"api-key":await r.configApiKey();break;case"models":await r.configModels();break;default:await f([e])}else await r.run()});p(ae,{...N("enter",[[`${C}`,"enter.alt.menu"],[`${C} config <tool>`,"enter.alt.config"]]),sections:[{title:R("enter.options_title"),rows:[[R("enter.option.none_term"),R("enter.option.none")],["lang",R("enter.option.lang")],["apikey",R("enter.option.apikey")],["models",R("enter.option.models")],["<tool>",R("enter.option.tool")]]}],examples:[K(`${C} enter`,"enter.ex.menu"),K(`${C} enter models`,"enter.ex.models"),K(`${C} enter codex`,"enter.ex.tool")]}),P(z),z.action(async()=>{await r.run()}),p(z,{examples:[K(`${C}`,"root.ex.menu"),K(`${C} setup --key sk-xxx`,"root.ex.setup"),K(`${C} doctor`,"root.ex.doctor"),K(`${C} base auto`,"root.ex.base"),K(`${C} config codex`,"root.ex.config")]});const ne=e=>{for(const o of e.commands)o.helpOption("-h, --help",R("global.help")),ne(o)};return ne(z),z}
|
|
1
|
+
import{Command as e,Option as o}from"commander";import{readFileSync as t}from"fs";import{join as s,dirname as a}from"path";import{fileURLToPath as n}from"url";import{i18n as i}from"./i18n.js";import{wizard as r}from"./wizard.js";import{SUPPORTED_TOOLS as c}from"./tool-manager.js";import{DEFAULT_BASE_URL as l}from"./config.js";import{attachCommandHelp as p,helpConfiguration as m}from"./cli-help.js";import{langCommand as u,authCommand as d,doctorCommand as g,configCommand as f,statusCommand as x,refreshCommand as y}from"../commands/index.js";import{logsCommand as h}from"../commands/logs.js";import{completionCommand as b}from"../commands/completion.js";import{benchCommand as $}from"../commands/bench.js";import{updateCommand as k}from"../commands/update.js";import{upgradeCommand as _}from"../commands/upgrade.js";import{codexSessionsCommand as w}from"../commands/codex-sessions.js";import{setupCommand as v,DEDICATED_KEYS as j}from"../commands/setup.js";import{baseCommand as O}from"../commands/base.js";import{usageError as S}from"./errors.js";import{brand as A,brandEnv as E,CLI_NAME as G}from"./brand.js";const z=(A().gatewayAddresses[1]??A().gatewayAddresses[0]).url,C=(A().gatewayAddresses[2]??A().gatewayAddresses[0]).url;function R(e,o){return i.t(`help.${e}`,o)}function L(e,o){return{command:e,note:R(o)}}function N(e){const o=R(e);return o===`help.${e}`?"":o}function P(e,o=[]){return{when:N(`${e}.when`),prerequisites:N(`${e}.needs`).split("\n").filter(Boolean),alternatives:o.map(([e,o])=>L(e,o))}}function T(e){return e.helpCommand("help [command]",R("help_command"))}export function buildProgram(){const A=new e;A.name(`${G}`).summary(R("root.summary")).description(R("root.description")).configureHelp(m()).allowExcessArguments(!0).optionsGroup(R("group.global_options")).helpOption("-h, --help",R("global.help")).version(function(){try{const e=a(n(import.meta.url));return JSON.parse(t(s(e,"../../package.json"),"utf-8")).version}catch{return"1.0.0"}}(),"-v, --version",R("global.version")).option("--base <url>",R("global.base")).option("--non-interactive",R("global.non_interactive")).option("--json",R("global.json")).option("-y, --yes",R("global.yes")).option("--dry-run",R("global.dry_run")).option("--no-color",R("global.no_color")),A.configureOutput({writeErr:()=>{},outputError:()=>{}}),A.showSuggestionAfterError(),A.exitOverride(e=>{throw e}),A.commandsGroup(R("group.configure"));const N=A.command("setup").summary(R("setup.summary")).description(R("setup.description")).option("--key <key>",R("setup.opt.key"));for(const e of j){const t=new o(`--${e.option} <key>`,R(`setup.opt.${e.option}`));e.hidden&&t.hideHelp(),N.addOption(t)}N.option("--1m",R("setup.opt.one_m")).option("--no-1m",R("setup.opt.no_one_m")).option("--claude-official <on|off>",R("setup.opt.claude_official")).option("--desktop-registry <on|off>",R("setup.opt.desktop_registry")).option("--force",R("setup.opt.force")).option("--install",R("setup.opt.install")).option("--no-install",R("setup.opt.no_install")).option("--all",R("setup.opt.all")).action(async e=>{e.key||j.some(o=>e[o.option])||(e.key=E("SETUP_KEY")?.trim()||void 0);const o=Boolean(e.key||j.some(o=>e[o.option])),t=void 0!==e["1m"]||void 0!==e.claudeOfficial||void 0!==e.desktopRegistry,s=i.t("errors.key_placeholder");if(!o&&!t)throw S(i.t("setup.usage"),`${G} setup --key ${s}`,"missing_key");if(void 0!==e.claudeOfficial&&!["on","off"].includes(String(e.claudeOfficial).toLowerCase()))throw S(i.t("setup.claude_official_invalid",{value:String(e.claudeOfficial)}),`${G} setup --claude-official on|off`,"invalid_value");if(void 0!==e.desktopRegistry&&!["on","off"].includes(String(e.desktopRegistry).toLowerCase()))throw S(i.t("setup.desktop_registry_invalid",{value:String(e.desktopRegistry)}),`${G} setup --desktop-registry on|off`,"invalid_value");await v({key:e.key,...Object.fromEntries(j.map(o=>[o.option,e[o.option]])),all:e.all,oneMillion:e["1m"],claudeOfficial:e.claudeOfficial,desktopRegistry:e.desktopRegistry,force:e.force,install:e.install})}),p(N,{...P("setup",[[`${G} init`,"setup.alt.init"],[`${G} config <tool>`,"setup.alt.config"],[`${G} auth <key>`,"setup.alt.auth"]]),sections:[{title:R("setup.autodetect_title"),rows:[["Claude",R("setup.autodetect.claude")],["GPT",R("setup.autodetect.gpt")],["Grok",R("setup.autodetect.grok")],["Gemini",R("setup.autodetect.gemini")]]}],examples:[L(`${G} setup --key sk-xxx`,"setup.ex.key"),L(`${G} setup --install --key sk-xxx`,"setup.ex.install"),L(`${G} setup --claudekey sk-a --codexkey sk-b --agykey sk-g`,"setup.ex.split"),L(`${G} setup --force --key sk-xxx`,"setup.ex.force"),L(`${G} setup --base ${z} --key sk-xxx`,"setup.ex.base")]});const U=A.command("init").summary(R("init.summary")).description(R("init.description")).action(async()=>{await r.runFirstTimeSetup()});p(U,{...P("init",[[`${G} setup --key <key>`,"init.alt.setup"],[`${G}`,"init.alt.menu"]]),examples:[L(`${G} init`,"init.ex.run"),L(`${G} init --base ${z}`,"init.ex.base"),L(`${G}`,"init.ex.menu")]});const B=A.command("auth").summary(R("auth.summary")).description(R("auth.description")).argument("[token]",R("auth.arg.token")).action(async e=>{const o=[];e&&o.push(e),await d(o)});T(B);const H=B.command("revoke").description(R("auth.revoke")).action(async()=>{await d(["revoke"])});p(H,{examples:[L(`${G} auth revoke`,"auth.ex.revoke_ask"),L(`${G} auth revoke --yes`,"auth.ex.revoke")]});const K=B.command("reload <tool>").description(R("auth.reload")).action(async e=>{await d(["reload",e])});p(K,{examples:[L(`${G} auth reload claude-code`,"auth.ex.reload"),L(`${G} auth reload claude-code --json`,"auth.ex.reload_json")]}),p(B,{...P("auth",[[`${G} setup --key <key>`,"auth.alt.setup"]]),examples:[L(`${G} auth`,"auth.ex.prompt"),L(`${G} auth sk-xxx --non-interactive`,"auth.ex.save"),L(`${G} auth revoke --yes`,"auth.ex.revoke"),L(`${G} auth reload claude-code`,"auth.ex.reload")]});const M=A.command("config").summary(R("config.summary")).description(R("config.description")).argument("[args...]",R("config.arg.args")).option("-f, --force",R("config.opt.force")).allowUnknownOption(!0).action(async(e=[],o={})=>{await f(o.force?[...e,"--force"]:e)});p(M,{...P("config",[[`${G} setup --force --key <key>`,"config.alt.setup"],[`${G} status`,"config.alt.status"]]),sections:[{title:R("config.subcommands_title"),rows:[["<tool>",R("config.sub.tool")],["<tool> --force",R("config.sub.tool_force")],["<tool> --non-interactive",R("config.sub.tool_non_interactive")],["<tool> remove",R("config.sub.tool_remove")],["<tool> restore",R("config.sub.tool_restore")],["<tool> backups",R("config.sub.tool_backups")],["<tool> clear-model",R("config.sub.tool_clear_model")],["tool-model list",R("config.sub.tool_model_list")],["tool-model set <tool> [slot] <model>",R("config.sub.tool_model_set")],["tool-model clear <tool>",R("config.sub.tool_model_clear")],["profile list",R("config.sub.profile_list")],["profile create <name>",R("config.sub.profile_create")],["profile use <name>",R("config.sub.profile_use")],["profile delete <name>",R("config.sub.profile_delete")],["preset list",R("config.sub.preset_list")],["preset save <name>",R("config.sub.preset_save")],["preset use <name>",R("config.sub.preset_use")],["preset delete <name>",R("config.sub.preset_delete")],["backup list",R("config.sub.backup_list")],["backup create [label]",R("config.sub.backup_create")],["backup restore <name>",R("config.sub.backup_restore")]]},{title:R("config.tools_title"),rows:Object.values(c).filter(e=>!e.hidden).map(e=>[e.name,e.displayName])}],examples:[L(`${G} config codex`,"config.ex.menu"),L(`${G} config claude-code --force`,"config.ex.force"),L(`${G} config tool-model set codex gpt-6-astra`,"config.ex.tool_model"),L(`${G} config profile create work`,"config.ex.profile"),L(`${G} config codex remove`,"config.ex.remove")]});const q=A.command("base").summary(R("base.summary")).description(R("base.description")).argument("[target]",R("base.arg.target")).action(async e=>{await O(e)});p(q,{...P("base",[[`${G} doctor`,"base.alt.doctor"],[`${G} bench`,"base.alt.bench"]]),sections:[{title:R("base.targets_title"),rows:[[R("base.target.none_term"),R("base.target.none")],[R("base.target.index_term"),R("base.target.index")],[R("base.target.url_term"),R("base.target.url")],["auto",R("base.target.auto")],["default",R("base.target.default",{url:l})]]}],examples:[L(`${G} base`,"base.ex.list"),L(`${G} base auto`,"base.ex.auto"),L(`${G} base 2`,"base.ex.index"),L(`${G} base ${z}`,"base.ex.url"),L(`${G} base default`,"base.ex.default")]}),A.commandsGroup(R("group.diagnose"));const F=A.command("status").summary(R("status.summary")).description(R("status.description")).action(async()=>{await x()});p(F,{...P("status",[[`${G} doctor`,"status.alt.doctor"]]),examples:[L(`${G} status`,"status.ex.show"),L(`${G} status --json`,"status.ex.json")]});const J=A.command("doctor").summary(R("doctor.summary")).description(R("doctor.description")).option("--deep",R("doctor.opt.deep")).option("--report",R("doctor.opt.report")).action(async e=>{await g({deep:e.deep,report:e.report})});p(J,{...P("doctor",[[`${G} base auto`,"doctor.alt.base"],[`${G} logs tail`,"doctor.alt.logs"]]),examples:[L(`${G} doctor`,"doctor.ex.run"),L(`${G} doctor --deep`,"doctor.ex.deep"),L(`${G} doctor --report`,"doctor.ex.report")]});const Y=A.command("bench").summary(R("bench.summary")).description(R("bench.description")).option("--samples <n>",R("bench.opt.samples"),"5").action(async e=>{const o=[];e.samples&&o.push("--samples",e.samples),await $(o)});p(Y,{...P("bench",[[`${G} base`,"bench.alt.base"]]),examples:[L(`${G} bench`,"bench.ex.run"),L(`${G} bench --samples 3`,"bench.ex.samples"),L(`${G} bench --json`,"bench.ex.json")]});const D=A.command("logs").summary(R("logs.summary")).description(R("logs.description")).argument("[action]",R("logs.arg.action")).argument("[file]",R("logs.arg.file")).action(async(e,o)=>{const t=[];e&&t.push(e),o&&t.push(o),await h(t)});p(D,{...P("logs",[[`${G} doctor`,"logs.alt.doctor"]]),sections:[{title:R("logs.actions_title"),rows:[["list",R("logs.action.list")],["tail [file]",R("logs.action.tail")],["path",R("logs.action.path")]]}],examples:[L(`${G} logs`,"logs.ex.list"),L(`${G} logs tail`,"logs.ex.tail"),L(`${G} logs path`,"logs.ex.path")]}),A.commandsGroup(R("group.maintain"));const I=A.command("upgrade").summary(R("upgrade.summary")).description(R("upgrade.description")).argument("[tools...]",R("upgrade.arg.tools")).action(async(e=[])=>{await _(e)});p(I,{...P("upgrade",[[`${G} update`,"upgrade.alt.update"]]),examples:[L(`${G} upgrade`,"upgrade.ex.all"),L(`${G} upgrade claude-code`,"upgrade.ex.one"),L(`${G} upgrade codex agy`,"upgrade.ex.many")]});const Q=A.command("refresh").summary(R("refresh.summary")).description(R("refresh.description")).action(async()=>{await y()});p(Q,{...P("refresh",[[`${G} setup --key ${i.t("errors.key_placeholder")}`,"refresh.alt.setup"]]),examples:[L(`${G} refresh`,"refresh.ex.run"),L(`${G} refresh --base ${C}`,"refresh.ex.base")]});const V=A.command("update").summary(R("update.summary")).description(R("update.description")).action(async()=>{await k()});p(V,{...P("update",[[`${G} upgrade`,"update.alt.upgrade"]]),examples:[L(`${G} update`,"update.ex.check"),L(`${G} update --json`,"update.ex.json")]});const W=A.command("codex").summary(R("codex.summary")).description(R("codex.description"));T(W);const X=W.command("sessions").summary(R("codex_sessions.summary")).description(R("codex_sessions.description")).option("--to <provider>",R("codex_sessions.opt.to")).option("--undo <dir>",R("codex_sessions.opt.undo")).action(async e=>{await w(e)});p(W,{...P("codex"),examples:[L(`${G} codex sessions`,"codex_sessions.ex.move"),L(`${G} codex sessions --undo <dir>`,"codex_sessions.ex.undo")]}),p(X,{...P("codex_sessions",[[`${G} codex sessions --undo <dir>`,"codex_sessions.alt.undo"]]),examples:[L(`${G} codex sessions`,"codex_sessions.ex.move"),L(`${G} codex sessions --to custom`,"codex_sessions.ex.to"),L(`${G} codex sessions --undo <dir>`,"codex_sessions.ex.undo")]});const Z=A.command("lang").summary(R("lang.summary")).description(R("lang.description"));T(Z);const ee=Z.command("show").description(R("lang.show")).action(async()=>{await u(["show"])}),oe=Z.command("set <locale>").description(R("lang.set")).action(async e=>{await u(["set",e])}),te=[L(`${G} lang show`,"lang.ex.show"),L(`${G} lang set en_US`,"lang.ex.set_en"),L(`${G} lang set zh_CN`,"lang.ex.set_zh")];p(Z,{...P("lang",[[`${G} enter lang`,"lang.alt.enter"]]),examples:te}),p(ee,{examples:[te[0],L(`${G} lang show --json`,"lang.ex.show_json")]}),p(oe,{examples:te.slice(1)});const se=A.command("completion").summary(R("completion.summary")).description(R("completion.description")).argument("<shell>",R("completion.arg.shell")).action(async e=>{await b([e])});p(se,{...P("completion"),examples:[L(`${G} completion bash > ~/.${G}-completion.bash`,"completion.ex.bash"),L(`${G} completion zsh > ~/.${G}-completion.zsh`,"completion.ex.zsh"),L(`${G} completion fish > ~/.config/fish/completions/${G}.fish`,"completion.ex.fish")]});const ae=A.command("enter").summary(R("enter.summary")).description(R("enter.description")).argument("[option]",R("enter.arg.option")).action(async e=>{if(e)switch(e){case"lang":case"language":await r.configLanguage();break;case"apikey":case"api-key":await r.configApiKey();break;case"models":await r.configModels();break;default:await f([e])}else await r.run()});p(ae,{...P("enter",[[`${G}`,"enter.alt.menu"],[`${G} config <tool>`,"enter.alt.config"]]),sections:[{title:R("enter.options_title"),rows:[[R("enter.option.none_term"),R("enter.option.none")],["lang",R("enter.option.lang")],["apikey",R("enter.option.apikey")],["models",R("enter.option.models")],["<tool>",R("enter.option.tool")]]}],examples:[L(`${G} enter`,"enter.ex.menu"),L(`${G} enter models`,"enter.ex.models"),L(`${G} enter codex`,"enter.ex.tool")]}),T(A),A.action(async()=>{await r.run()}),p(A,{examples:[L(`${G}`,"root.ex.menu"),L(`${G} setup --key sk-xxx`,"root.ex.setup"),L(`${G} doctor`,"root.ex.doctor"),L(`${G} base auto`,"root.ex.base"),L(`${G} config codex`,"root.ex.config")]});const ne=e=>{for(const o of e.commands)o.helpOption("-h, --help",R("global.help")),ne(o)};return ne(A),A}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{chmodSync as e,existsSync as t,mkdirSync as o,readdirSync as n,readFileSync as r,rmSync as s}from"fs";import{dirname as i}from"path";import{join as a}from"path";import{randomUUID as l}from"crypto";import{execFileSync as c}from"child_process";import{userInfo as d}from"os";import p from"chalk";import{logger as u}from"../../utils/logger.js";import{track as f}from"../telemetry.js";import{ensureDesktopCli as m}from"./claude-desktop-cli.js";import{i18n as g}from"../i18n.js";import{BRAND_NAME as y,brand as h,brandEnv as k,CLI_NAME as _}from"../brand.js";import{backupBeforeWrite as b,atomicWriteFile as D}from"./backup.js";import{toolHome as A}from"./types.js";import{canRestartDesktop as C,isDesktopRunning as w,restartDesktop as E,WINDOWS_PACKAGE_FAMILIES as M}from"./desktop-process.js";import{setUserRegistryElevated as v}from"./elevated-reg.js";import{UserActionNeeded as O}from"./types.js";import{baseModelId as x,isClaudeModel as S}from"../model-catalog.js";import{getDefaultModels as P}from"../model-registry.js";const j=y;export const CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING="hide_official_login";export const CLAUDE_DESKTOP_FORCE_REGISTRY_SETTING="force_registry";const L=/^[a-f0-9-]{36}$/;function I(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}export function claudeDesktopUserDataDir(){const e=process.env.CLAUDE_USER_DATA_DIR?.trim();if(e)return e;const o=A(),n=Boolean(k("TEST_HOME")?.trim());switch(process.platform){case"darwin":return a(o,"Library","Application Support","Claude-3p");case"win32":{const e=!n&&process.env.LOCALAPPDATA?process.env.LOCALAPPDATA:a(o,"AppData","Local");return M.map(t=>a(e,"Packages",t,"LocalCache","Local","Claude-3p")).find(e=>t(e))??a(e,"Claude-3p")}default:{const e=!n&&process.env.XDG_CONFIG_HOME?process.env.XDG_CONFIG_HOME:a(o,".config");return a(e,"Claude-3p")}}}const T=()=>a(claudeDesktopUserDataDir(),"configLibrary"),$=()=>a(T(),"_meta.json"),R=e=>a(T(),`${e}.json`),G=()=>a(claudeDesktopUserDataDir(),"claude_desktop_config.json");function N(e){if(!t(e))return null;const o=r(e,"utf-8");if(!o.trim())return null;try{const e=JSON.parse(o);return I(e)?e:null}catch(t){throw new Error(`Existing ${e} cannot be parsed, back it up and fix it first: ${t instanceof Error?t.message:String(t)}`)}}function U(n,r){const s=i(n);t(s)||o(s,{recursive:!0,mode:448}),b(n),D(n,JSON.stringify(r,null,2)+"\n");try{e(n,384)}catch(e){u.logError("claude-desktop.writeJson.chmod",e)}}function K(){const e=N($());if(!e)return null;const t=Array.isArray(e.entries)?e.entries.filter(e=>I(e)&&"string"==typeof e.id&&"string"==typeof e.name):[];return{...e,appliedId:"string"==typeof e.appliedId?e.appliedId:"",entries:t}}function F(e){return e?.entries.find(e=>e.name===j&&L.test(e.id))}const H={opus:0,fable:1,sonnet:2,haiku:3};function B(e){let t=/^claude-(opus|sonnet|haiku|fable)-(\d+(?:-\d+)*)/i.exec(e);return t?{family:t[1].toLowerCase(),version:t[2].split("-").map(Number)}:(t=/^claude-(\d+(?:-\d+)*)-(opus|sonnet|haiku)/i.exec(e),t?{family:t[2].toLowerCase(),version:t[1].split("-").map(Number)}:null)}export function humanizeModelId(e){const t=B(e);return t?`${t.family[0].toUpperCase()+t.family.slice(1)} ${t.version.filter(e=>e<1e7).slice(0,2).join(".")}`:e}function V(e){return B(e)?.family}export function buildInferenceModels(e,t){const{primary:o,bySlot:n}=function(e){const t=["opus","sonnet","haiku","reasoning"].map(t=>x(e[t]||"")).filter(Boolean);return{primary:t[0]??"",bySlot:t}}(e),r=new Set,s=t?.labels??{};let i;if(t&&t.models.some(S)){i=[...new Set(t.models.filter(S).map(x))];for(const e of t.oneMillion)r.add(e)}else{i=[];for(const t of["opus","sonnet","haiku","reasoning"]){const o=(e[t]||"").trim(),n=x(o);n&&(i.includes(n)||i.push(n),/\[1m\]/i.test(o)&&r.add(n))}}const a=e=>H[V(e)??""]??9;i.sort((e,t)=>{if(e===o)return-1;if(t===o)return 1;const n=a(e)-a(t);if(0!==n)return n;const r=B(e),s=B(t);return r&&s?function(e,t){const o=Math.max(e.length,t.length);for(let n=0;n<o;n++){const o=(t[n]??0)-(e[n]??0);if(0!==o)return o}return 0}(r.version,s.version):e.localeCompare(t)});const l=new Set,c=new Map,d=new Set(Object.values(P()).map(e=>x(e||"")));for(const e of n){const t=V(e);t&&i.includes(e)&&!d.has(e)&&!c.has(t)&&c.set(t,e)}return i.map(e=>{const t=V(e),o={name:e,labelOverride:s[e]||humanizeModelId(e)};if(r.has(e)&&(o.supports1m=!0,o.prefer1m=!0),t){o.anthropicFamilyTier=t;const n=c.get(t);n&&n!==e||l.has(t)||(o.isFamilyDefault=!0,l.add(t))}return o})}let W=null,J=null,z=null,Z=null;function q(e){return{inferenceProvider:"gateway",inferenceCredentialKind:"static",inferenceGatewayBaseUrl:(e.baseUrl||"").trim().replace(/\/+$/,""),inferenceGatewayApiKey:e.apiKey,inferenceModels:buildInferenceModels(e.models,e.catalog),disableDeploymentModeChooser:!1!==e.settings?.hide_official_login,chatTabEnabled:!0,chatAdvancedFileAnalysisEnabled:!0,autoModeEnabled:!0,coworkEgressAllowedHosts:["*"],disableEssentialTelemetry:!0,disableNonessentialTelemetry:!0,disableNonessentialServices:!1}}const X={defaultModelEffort:"medium",modelPrefer1mContext:!0,skipWebFetchPreflight:!0,toolSearchEnabled:!0,builtinBrowserEnabled:!0,isDesktopExtensionEnabled:!0,sshHostAllowlist:["*"],claudeAiImport:{enabled:!0,automatic3pImport:!0,exportEnabled:!0},coworkVmIpv6Enabled:!0,mcpToolTimeoutSec:3600,updateViaUpdatesHost:!0,banner:{enabled:!1}};function Y(e){return Object.fromEntries(Object.entries(X).filter(([t])=>!e(t)))}const Q="SOFTWARE\\Policies\\Claude",ee=`HKCU\\${Q}`,te="HKLM\\SOFTWARE\\Policies\\Claude",oe=`${_}-claude-policy.reg`,ne=e=>c("reg",e,{stdio:["ignore","pipe","pipe"]}).toString();let re=ne;export function setRegRunnerForTests(e){re=e??ne}function se(){return"win32"===process.platform}function ie(e){let t;try{t=re(["query",e])}catch{return null}const o=new Map;for(const e of t.split(/\r?\n/)){const t=/^\s{2,}(\S+)\s+(REG_[A-Z_]+)\s*(.*)$/.exec(e);t&&o.set(t[1],t[3])}return o}function ae(){if(null===ie(ee))return;const e=a(claudeDesktopUserDataDir(),oe);try{t(i(e))||o(i(e),{recursive:!0,mode:448}),b(e),re(["export",ee,e,"/y"])}catch(e){u.logError("claude-desktop.snapshotPolicy",e)}}function le(e){ae();for(const[t,o]of Object.entries(e)){const[e,n]="boolean"==typeof o?["REG_DWORD",o?"1":"0"]:"number"==typeof o?["REG_DWORD",String(o)]:"string"==typeof o?["REG_SZ",o]:["REG_SZ",JSON.stringify(o)];re(["add",ee,"/v",t,"/t",e,"/d",n,"/f"])}}function ce(e){const t=ie(ee);if(!t)return;ae();let o=t.size;for(const n of e)t.has(n)&&(re(["delete",ee,"/v",n,"/f"]),o-=1);o<=0&&re(["delete",ee,"/f"])}const de=[...Object.keys(q({apiKey:"",baseUrl:"",models:{haiku:"",sonnet:"",opus:"",reasoning:""}})),...Object.keys(X)];export function detectManagedConfig(){try{if("darwin"===process.platform){let e="";try{e=d().username}catch{}return[e?`/Library/Managed Preferences/${e}/com.anthropic.claudefordesktop.plist`:"","/Library/Managed Preferences/com.anthropic.claudefordesktop.plist"].filter(Boolean).find(e=>t(e))??null}if("win32"===process.platform)return ie(te)?te:null;const e="/etc/claude-desktop/managed-settings.json";return t(e)?e:null}catch(e){return u.logError("claude-desktop.detectManagedConfig",e),null}}function pe(){const e=A();let o;switch(process.platform){case"darwin":o=["/Applications/Claude.app",a(e,"Applications","Claude.app")];break;case"win32":{const t=process.env.LOCALAPPDATA||a(e,"AppData","Local");o=[a(t,"AnthropicClaude"),a(t,"Programs","Claude"),...M.map(e=>a(t,"Packages",e))];break}default:o=["/usr/lib/claude-desktop","/opt/Claude","/usr/bin/claude-desktop",a(e,".local","bin","claude-desktop")]}return o.push(claudeDesktopUserDataDir(),a(claudeDesktopUserDataDir(),"..","Claude")),o.some(e=>t(e))}const ue=/\d+\.\d+\.\d+/;function fe(e){const t=e=>e.split(".").map(Number);return e.sort((e,o)=>{const[n,r]=[t(e),t(o)];for(let e=0;e<3;e++)if(n[e]!==r[e])return r[e]-n[e];return 0})[0]??null}function me(){if("darwin"===process.platform){for(const e of["/Applications/Claude.app",a(A(),"Applications","Claude.app")]){const o=a(e,"Contents","Info.plist");if(!t(o))continue;const n=/<key>CFBundleShortVersionString<\/key>\s*<string>([^<]+)<\/string>/.exec(r(o,"utf-8")),s=n?ue.exec(n[1])?.[0]:void 0;if(s)return s}return null}if("win32"===process.platform){const e=a(process.env.LOCALAPPDATA||a(A(),"AppData","Local"),"AnthropicClaude");if(t(e)){const t=n(e).map(e=>/^app-(\d+\.\d+\.\d+)$/.exec(e)?.[1]).filter(e=>!!e);if(t.length>0)return fe(t)}const o=M.map(e=>`'${e}'`).join(",");return fe(c("powershell.exe",["-NoProfile","-Command",`Get-AppxPackage | Where-Object { @(${o}) -contains $_.PackageFamilyName } | ForEach-Object { $_.Version.ToString() }`],{encoding:"utf-8",timeout:15e3,windowsHide:!0,stdio:["ignore","pipe","ignore"]}).split(/\r?\n/).flatMap(e=>ue.exec(e)?.[0]??[]))}if("linux"===process.platform)try{const e=c("dpkg-query",["-W","-f=${Version}","claude-desktop"],{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]});return ue.exec(e)?.[0]??null}catch{return null}return null}const ge="darwin"===process.platform?"open -a Claude":"win32"===process.platform?"Claude":"claude-desktop",ye="darwin"!==process.platform&&"win32"!==process.platform||!h().installMirror?.claudeDesktop?"https://claude.ai/download":h().installMirror.claudeDesktop,he="darwin"===process.platform?`open ${ye}`:"win32"===process.platform?`start ${ye}`:`xdg-open ${ye}`;export const claudeDesktopAdapter={name:"claude-desktop",displayName:"Claude Desktop",command:ge,installCommand:he,configPath:$(),isInstalled:pe,installedVersion:me,prepareRuntime:async function(){if(!["win32","darwin","linux"].includes(process.platform)||!pe())return[];const e=Date.now();try{const t=await m({userDataDir:claudeDesktopUserDataDir(),onDownload:e=>console.log(p.gray(" "+g.t("tools.claude_desktop.code_cli_downloading",{version:e}))),desktopVersion:"darwin"===process.platform?me():null,mirrorRepo:h().installMirror?.claudeDesktop?.replace(/\/-\/releases\/latest\/?$/,"")??null});return f("desktop-code-cli","skipped"===t.status?"skip":"ok",{duration_ms:Date.now()-e,detail:{...t}}),"installed"!==t.status?[]:[{kind:"summary",text:g.t("tools.claude_desktop.code_cli_installed",{version:t.version})}]}catch(t){return u.logError("claude-desktop.prepareCodeTabCli",t),f("desktop-code-cli","fail",{duration_ms:Date.now()-e,error:t}),[{kind:"action",text:g.t("tools.claude_desktop.code_cli_failed",{reason:t instanceof Error?t.message:String(t)})}]}},runningApp:C()?{isRunning:w,restart:E}:void 0,wantsModelCatalog:!0,loadPrivateConfig(e){const o=K()??{appliedId:"",entries:[]};let n=F(o);n||(n={id:l(),name:j},o.entries.push(n));const r=q(e);J=!0===r.disableDeploymentModeChooser,W={models:r.inferenceModels,source:e.catalog?e.catalog.oneMillionSource:"slots",groups:e.catalog?.matchedGroups??[]};const s=N(R(n.id))??{};U(R(n.id),{...Y(e=>e in s),...s,...r}),o.appliedId=n.id,U($(),o);const i=N(G())??{};if("3p"!==i.deploymentMode&&U(G(),{...i,deploymentMode:"3p"}),z=null,Z=null,se()){const o=ie(ee),n=de.filter(e=>o?.has(e)),s={...Y(e=>o?.has(e)??!1),...r},i=!0===e.settings?.force_registry,l=!i&&function(){const e=!Boolean(k("TEST_HOME")?.trim())&&process.env.LOCALAPPDATA?process.env.LOCALAPPDATA:a(A(),"AppData","Local");return!!t(a(e,"AnthropicClaude"))||M.some(o=>t(a(e,"Packages",o,"LocalCache","Local","Claude-3p")))}();try{l?ce(de):le(s)}catch(e){u.logError("claude-desktop.policy",e),z=e instanceof Error?e.message.trim():String(e),(n.length>0||i)&&(Z=l?{action:"remove",values:Object.fromEntries(n.map(e=>[e,null])),deleteKey:n.length===o.size}:{action:"write",values:s,deleteKey:!1})}}},pendingElevation(){const e=Z;return e?{prompt:g.t(`tools.claude_desktop.elevate_${e.action}`),run:()=>{if(!v(Q,e.values,e.deleteKey))return!1;const t=ie(ee),o="remove"===e.action?Object.keys(e.values).every(e=>!t?.has(e)):Object.keys(e.values).every(e=>t?.has(e));return o&&(Z=null,z=null),o}}:null},unloadPrivateConfig(){if(se())try{ce(de)}catch(e){u.logError("claude-desktop.removePolicy",e)}const e=K(),t=F(e);if(!e||!t)return;b(R(t.id)),s(R(t.id),{force:!0});const o=e.entries.filter(e=>e.id!==t.id);0===o.length?(b($()),s($(),{force:!0})):U($(),{...e,entries:o,appliedId:e.appliedId===t.id?o[0].id:e.appliedId})},listedModels(){const e=K(),t=F(e);if(!t||e?.appliedId!==t.id)return null;const o=N(R(t.id))?.inferenceModels;return Array.isArray(o)?o.map(e=>String(e.name)):null},refreshModelMenu(e){const t=K(),o=F(t);if(!o||t?.appliedId!==o.id)return;const n=N(R(o.id));if(!n)return;const r=buildInferenceModels(e.models,e.catalog);if(JSON.stringify(n.inferenceModels)!==JSON.stringify(r)){if(se()&&ie(ee)?.has("inferenceModels"))try{le({inferenceModels:r})}catch(e){throw u.logError("claude-desktop.refreshModelMenu registry",e),new O(g.t("tools.claude_desktop.refresh_needs_admin"))}U(R(o.id),{...n,inferenceModels:r})}},detectCurrentConfig(){try{if(se()){const e=ie(ee)?.get("inferenceGatewayApiKey");if(e)return{apiKey:e}}const e=F(K());if(!e)return{apiKey:null};const t=N(R(e.id)),o=t?.inferenceGatewayApiKey;return{apiKey:"string"==typeof o&&o?o:null}}catch(e){return u.logError("claude-desktop.detectCurrentConfig",e),{apiKey:null}}},getConfig(){try{const e=K(),t=F(e);return{meta:e,applied:t?N(R(t.id)):null,desktop:N(G()),...se()?{policy:Object.fromEntries(ie(ee)??[])}:{}}}catch(e){return u.logError("claude-desktop.getConfig",e),null}},clearPinnedModels(){let e=!1;se()&&ie(ee)?.has("inferenceModels")&&(ae(),re(["delete",ee,"/v","inferenceModels","/f"]),e=!0);const t=F(K()),o=t?N(R(t.id)):null;if(t&&o&&void 0!==o.inferenceModels){const{inferenceModels:n,...r}=o;U(R(t.id),r),e=!0}return e?["inferenceModels"]:[]},applyNotes(){const e=[];if(W&&W.models.length>0){const{models:t,source:o,groups:n}=W;e.push({kind:"summary",text:g.t("tools.claude_desktop.models_summary",{count:String(t.length),default:t[0].labelOverride??t[0].name})}),e.push({kind:"detail",text:g.t(`tools.claude_desktop.models_written_${o}`,{count:String(t.length),list:t.map(e=>`${e.labelOverride}${e.supports1m?" (1M)":""}`).join(", "),groups:n.join(" / ")})})}null!==J&&e.push({kind:"detail",text:g.t(J?"tools.claude_desktop.official_login_hidden":"tools.claude_desktop.official_login_shown")}),C()&&!w()||e.push({kind:"action",text:g.t("tools.claude_desktop.restart_hint")}),Z?(e.push({kind:"action",text:g.t(`tools.claude_desktop.policy_stale_${Z.action}`)}),e.push({kind:"detail",text:z??""})):z?(e.push({kind:"detail",text:g.t("tools.claude_desktop.registry_denied")}),e.push({kind:"detail",text:z})):se()&&e.push({kind:"detail",text:g.t("tools.claude_desktop.registry_written",{key:ee})});const t=detectManagedConfig();return t&&e.push({kind:"action",text:g.t("tools.claude_desktop.managed_conflict",{path:t})}),e},forceResetPaths(){const e=[$(),G()];try{const t=F(K());t&&e.push(R(t.id))}catch{}return e},backupPaths(){const e=[$(),G()];se()&&e.push(a(claudeDesktopUserDataDir(),oe));try{const t=F(K());t&&e.push(R(t.id))}catch{}return e}};
|
|
1
|
+
import{chmodSync as e,existsSync as t,mkdirSync as o,readdirSync as n,readFileSync as r,rmSync as s}from"fs";import{dirname as i}from"path";import{join as a}from"path";import{randomUUID as l}from"crypto";import{execFileSync as c}from"child_process";import{userInfo as d}from"os";import p from"chalk";import{logger as u}from"../../utils/logger.js";import{track as f}from"../telemetry.js";import{ensureDesktopCli as m}from"./claude-desktop-cli.js";import{i18n as g}from"../i18n.js";import{BRAND_NAME as y,brand as h,brandEnv as k,CLI_NAME as _}from"../brand.js";import{backupBeforeWrite as b,atomicWriteFile as D}from"./backup.js";import{toolHome as A}from"./types.js";import{canRestartDesktop as C,isDesktopRunning as w,restartDesktop as E,WINDOWS_PACKAGE_FAMILIES as M}from"./desktop-process.js";import{setUserRegistryElevated as v}from"./elevated-reg.js";import{UserActionNeeded as O}from"./types.js";import{baseModelId as x,isClaudeModel as S}from"../model-catalog.js";import{getDefaultModels as P}from"../model-registry.js";const j=y;export const CLAUDE_DESKTOP_HIDE_OFFICIAL_LOGIN_SETTING="hide_official_login";export const CLAUDE_DESKTOP_FORCE_REGISTRY_SETTING="force_registry";const L=/^[a-f0-9-]{36}$/;function I(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}export function claudeDesktopUserDataDir(){const e=process.env.CLAUDE_USER_DATA_DIR?.trim();if(e)return e;const o=A(),n=Boolean(k("TEST_HOME")?.trim());switch(process.platform){case"darwin":return a(o,"Library","Application Support","Claude-3p");case"win32":{const e=!n&&process.env.LOCALAPPDATA?process.env.LOCALAPPDATA:a(o,"AppData","Local");return M.map(t=>a(e,"Packages",t,"LocalCache","Local","Claude-3p")).find(e=>t(e))??a(e,"Claude-3p")}default:{const e=!n&&process.env.XDG_CONFIG_HOME?process.env.XDG_CONFIG_HOME:a(o,".config");return a(e,"Claude-3p")}}}const T=()=>a(claudeDesktopUserDataDir(),"configLibrary"),$=()=>a(T(),"_meta.json"),R=e=>a(T(),`${e}.json`),G=()=>a(claudeDesktopUserDataDir(),"claude_desktop_config.json");function N(e){if(!t(e))return null;const o=r(e,"utf-8");if(!o.trim())return null;try{const e=JSON.parse(o);return I(e)?e:null}catch(t){throw new Error(`Existing ${e} cannot be parsed, back it up and fix it first: ${t instanceof Error?t.message:String(t)}`)}}function U(n,r){const s=i(n);t(s)||o(s,{recursive:!0,mode:448}),b(n),D(n,JSON.stringify(r,null,2)+"\n");try{e(n,384)}catch(e){u.logError("claude-desktop.writeJson.chmod",e)}}function K(){const e=N($());if(!e)return null;const t=Array.isArray(e.entries)?e.entries.filter(e=>I(e)&&"string"==typeof e.id&&"string"==typeof e.name):[];return{...e,appliedId:"string"==typeof e.appliedId?e.appliedId:"",entries:t}}function F(e){return e?.entries.find(e=>e.name===j&&L.test(e.id))}const H={opus:0,fable:1,sonnet:2,haiku:3};function B(e){let t=/^claude-(opus|sonnet|haiku|fable)-(\d+(?:-\d+)*)/i.exec(e);return t?{family:t[1].toLowerCase(),version:t[2].split("-").map(Number)}:(t=/^claude-(\d+(?:-\d+)*)-(opus|sonnet|haiku)/i.exec(e),t?{family:t[2].toLowerCase(),version:t[1].split("-").map(Number)}:null)}export function humanizeModelId(e){const t=B(e);return t?`${t.family[0].toUpperCase()+t.family.slice(1)} ${t.version.filter(e=>e<1e7).slice(0,2).join(".")}`:e}function V(e){return B(e)?.family}export function buildInferenceModels(e,t){const{primary:o,bySlot:n}=function(e){const t=["opus","sonnet","haiku","reasoning"].map(t=>x(e[t]||"")).filter(Boolean);return{primary:t[0]??"",bySlot:t}}(e),r=new Set,s=t?.labels??{};let i;if(t&&t.models.some(S)){i=[...new Set(t.models.filter(S).map(x))];for(const e of t.oneMillion)r.add(e)}else{i=[];for(const t of["opus","sonnet","haiku","reasoning"]){const o=(e[t]||"").trim(),n=x(o);n&&(i.includes(n)||i.push(n),/\[1m\]/i.test(o)&&r.add(n))}}const a=e=>H[V(e)??""]??9;i.sort((e,t)=>{if(e===o)return-1;if(t===o)return 1;const n=a(e)-a(t);if(0!==n)return n;const r=B(e),s=B(t);return r&&s?function(e,t){const o=Math.max(e.length,t.length);for(let n=0;n<o;n++){const o=(t[n]??0)-(e[n]??0);if(0!==o)return o}return 0}(r.version,s.version):e.localeCompare(t)});const l=new Set,c=new Map,d=new Set(Object.values(P()).map(e=>x(e||"")));for(const e of n){const t=V(e);t&&i.includes(e)&&!d.has(e)&&!c.has(t)&&c.set(t,e)}return i.map(e=>{const t=V(e),o={name:e,labelOverride:s[e]||humanizeModelId(e)};if(r.has(e)&&(o.supports1m=!0,o.prefer1m=!0),t){o.anthropicFamilyTier=t;const n=c.get(t);n&&n!==e||l.has(t)||(o.isFamilyDefault=!0,l.add(t))}return o})}let W=null,J=null,z=null,Z=null,q=null;function X(e){return{inferenceProvider:"gateway",inferenceCredentialKind:"static",inferenceGatewayBaseUrl:(e.baseUrl||"").trim().replace(/\/+$/,""),inferenceGatewayApiKey:e.apiKey,inferenceModels:buildInferenceModels(e.models,e.catalog),disableDeploymentModeChooser:!1!==e.settings?.hide_official_login,chatTabEnabled:!0,chatAdvancedFileAnalysisEnabled:!0,autoModeEnabled:!0,coworkEgressAllowedHosts:["*"],disableEssentialTelemetry:!0,disableNonessentialTelemetry:!0,disableNonessentialServices:!1}}const Y={defaultModelEffort:"medium",modelPrefer1mContext:!0,skipWebFetchPreflight:!0,toolSearchEnabled:!0,builtinBrowserEnabled:!0,isDesktopExtensionEnabled:!0,sshHostAllowlist:["*"],claudeAiImport:{enabled:!0,automatic3pImport:!0,exportEnabled:!0},coworkVmIpv6Enabled:!0,mcpToolTimeoutSec:3600,updateViaUpdatesHost:!0,banner:{enabled:!1}};function Q(e){return Object.fromEntries(Object.entries(Y).filter(([t])=>!e(t)))}const ee="SOFTWARE\\Policies\\Claude",te=`HKCU\\${ee}`,oe="HKLM\\SOFTWARE\\Policies\\Claude",ne=`${_}-claude-policy.reg`,re=e=>c("reg",e,{stdio:["ignore","pipe","pipe"]}).toString();let se=re;export function setRegRunnerForTests(e){se=e??re}function ie(){return"win32"===process.platform}function ae(e){let t;try{t=se(["query",e])}catch{return null}const o=new Map;for(const e of t.split(/\r?\n/)){const t=/^\s{2,}(\S+)\s+(REG_[A-Z_]+)\s*(.*)$/.exec(e);t&&o.set(t[1],t[3])}return o}function le(){if(null===ae(te))return;const e=a(claudeDesktopUserDataDir(),ne);try{t(i(e))||o(i(e),{recursive:!0,mode:448}),b(e),se(["export",te,e,"/y"])}catch(e){u.logError("claude-desktop.snapshotPolicy",e)}}function ce(e){le();for(const[t,o]of Object.entries(e)){const[e,n]="boolean"==typeof o?["REG_DWORD",o?"1":"0"]:"number"==typeof o?["REG_DWORD",String(o)]:"string"==typeof o?["REG_SZ",o]:["REG_SZ",JSON.stringify(o)];se(["add",te,"/v",t,"/t",e,"/d",n,"/f"])}}function de(e){const t=ae(te);if(!t)return;le();let o=t.size;for(const n of e)t.has(n)&&(se(["delete",te,"/v",n,"/f"]),o-=1);o<=0&&se(["delete",te,"/f"])}const pe=[...Object.keys(X({apiKey:"",baseUrl:"",models:{haiku:"",sonnet:"",opus:"",reasoning:""}})),...Object.keys(Y)];export function detectManagedConfig(){try{if("darwin"===process.platform){let e="";try{e=d().username}catch{}return[e?`/Library/Managed Preferences/${e}/com.anthropic.claudefordesktop.plist`:"","/Library/Managed Preferences/com.anthropic.claudefordesktop.plist"].filter(Boolean).find(e=>t(e))??null}if("win32"===process.platform)return ae(oe)?oe:null;const e="/etc/claude-desktop/managed-settings.json";return t(e)?e:null}catch(e){return u.logError("claude-desktop.detectManagedConfig",e),null}}function ue(){const e=A();let o;switch(process.platform){case"darwin":o=["/Applications/Claude.app",a(e,"Applications","Claude.app")];break;case"win32":{const t=process.env.LOCALAPPDATA||a(e,"AppData","Local");o=[a(t,"AnthropicClaude"),a(t,"Programs","Claude"),...M.map(e=>a(t,"Packages",e))];break}default:o=["/usr/lib/claude-desktop","/opt/Claude","/usr/bin/claude-desktop",a(e,".local","bin","claude-desktop")]}return o.push(claudeDesktopUserDataDir(),a(claudeDesktopUserDataDir(),"..","Claude")),o.some(e=>t(e))}const fe=/\d+\.\d+\.\d+/;function me(e){const t=e=>e.split(".").map(Number);return e.sort((e,o)=>{const[n,r]=[t(e),t(o)];for(let e=0;e<3;e++)if(n[e]!==r[e])return r[e]-n[e];return 0})[0]??null}function ge(){if("darwin"===process.platform){for(const e of["/Applications/Claude.app",a(A(),"Applications","Claude.app")]){const o=a(e,"Contents","Info.plist");if(!t(o))continue;const n=/<key>CFBundleShortVersionString<\/key>\s*<string>([^<]+)<\/string>/.exec(r(o,"utf-8")),s=n?fe.exec(n[1])?.[0]:void 0;if(s)return s}return null}if("win32"===process.platform){const e=a(process.env.LOCALAPPDATA||a(A(),"AppData","Local"),"AnthropicClaude");if(t(e)){const t=n(e).map(e=>/^app-(\d+\.\d+\.\d+)$/.exec(e)?.[1]).filter(e=>!!e);if(t.length>0)return me(t)}const o=M.map(e=>`'${e}'`).join(",");return me(c("powershell.exe",["-NoProfile","-Command",`Get-AppxPackage | Where-Object { @(${o}) -contains $_.PackageFamilyName } | ForEach-Object { $_.Version.ToString() }`],{encoding:"utf-8",timeout:15e3,windowsHide:!0,stdio:["ignore","pipe","ignore"]}).split(/\r?\n/).flatMap(e=>fe.exec(e)?.[0]??[]))}if("linux"===process.platform)try{const e=c("dpkg-query",["-W","-f=${Version}","claude-desktop"],{encoding:"utf-8",timeout:5e3,stdio:["ignore","pipe","ignore"]});return fe.exec(e)?.[0]??null}catch{return null}return null}const ye="darwin"===process.platform?"open -a Claude":"win32"===process.platform?"Claude":"claude-desktop",he="darwin"!==process.platform&&"win32"!==process.platform||!h().installMirror?.claudeDesktop?"https://claude.ai/download":h().installMirror.claudeDesktop,ke="darwin"===process.platform?`open ${he}`:"win32"===process.platform?`start ${he}`:`xdg-open ${he}`;export const claudeDesktopAdapter={name:"claude-desktop",displayName:"Claude Desktop",command:ye,installCommand:ke,configPath:$(),isInstalled:ue,installedVersion:ge,prepareRuntime:async function(){if(!["win32","darwin","linux"].includes(process.platform)||!ue())return[];const e=Date.now();try{const t=await m({userDataDir:claudeDesktopUserDataDir(),onDownload:e=>console.log(p.gray(" "+g.t("tools.claude_desktop.code_cli_downloading",{version:e}))),desktopVersion:"darwin"===process.platform?ge():null,mirrorRepo:h().installMirror?.claudeDesktop?.replace(/\/-\/releases\/latest\/?$/,"")??null});return f("desktop-code-cli","skipped"===t.status?"skip":"ok",{duration_ms:Date.now()-e,detail:{...t}}),"installed"!==t.status?[]:[{kind:"summary",text:g.t("tools.claude_desktop.code_cli_installed",{version:t.version})}]}catch(t){return u.logError("claude-desktop.prepareCodeTabCli",t),f("desktop-code-cli","fail",{duration_ms:Date.now()-e,error:t}),[{kind:"action",text:g.t("tools.claude_desktop.code_cli_failed",{reason:t instanceof Error?t.message:String(t)})}]}},runningApp:C()?{isRunning:w,restart:E}:void 0,wantsModelCatalog:!0,loadPrivateConfig(e){const o=K()??{appliedId:"",entries:[]};let n=F(o);n||(n={id:l(),name:j},o.entries.push(n));const r=X(e);J=!0===r.disableDeploymentModeChooser,W={models:r.inferenceModels,source:e.catalog?e.catalog.oneMillionSource:"slots",groups:e.catalog?.matchedGroups??[]};const s=N(R(n.id))??{};U(R(n.id),{...Q(e=>e in s),...s,...r}),o.appliedId=n.id,U($(),o);const i=N(G())??{};if("3p"!==i.deploymentMode&&U(G(),{...i,deploymentMode:"3p"}),Z=null,q=null,z=null,ie()){const o=ae(te),n=pe.filter(e=>o?.has(e)),s={...Q(e=>o?.has(e)??!1),...r},i=!0===e.settings?.force_registry,l=!i&&function(){const e=!Boolean(k("TEST_HOME")?.trim())&&process.env.LOCALAPPDATA?process.env.LOCALAPPDATA:a(A(),"AppData","Local");return!!t(a(e,"AnthropicClaude"))||M.some(o=>t(a(e,"Packages",o,"LocalCache","Local","Claude-3p")))}();try{l?de(pe):ce(s),z=l?"removed":"written"}catch(e){u.logError("claude-desktop.policy",e),Z=e instanceof Error?e.message.trim():String(e),(n.length>0||i)&&(q=l?{action:"remove",values:Object.fromEntries(n.map(e=>[e,null])),deleteKey:n.length===o.size}:{action:"write",values:s,deleteKey:!1})}}},pendingElevation(){const e=q;return e?{prompt:g.t(`tools.claude_desktop.elevate_${e.action}`),run:()=>{if(!v(ee,e.values,e.deleteKey))return!1;const t=ae(te),o="remove"===e.action?Object.keys(e.values).every(e=>!t?.has(e)):Object.keys(e.values).every(e=>t?.has(e));return o&&(q=null,Z=null),o}}:null},unloadPrivateConfig(){if(ie())try{de(pe)}catch(e){u.logError("claude-desktop.removePolicy",e)}const e=K(),t=F(e);if(!e||!t)return;b(R(t.id)),s(R(t.id),{force:!0});const o=e.entries.filter(e=>e.id!==t.id);0===o.length?(b($()),s($(),{force:!0})):U($(),{...e,entries:o,appliedId:e.appliedId===t.id?o[0].id:e.appliedId})},listedModels(){const e=K(),t=F(e);if(!t||e?.appliedId!==t.id)return null;const o=N(R(t.id))?.inferenceModels;return Array.isArray(o)?o.map(e=>String(e.name)):null},refreshModelMenu(e){const t=K(),o=F(t);if(!o||t?.appliedId!==o.id)return;const n=N(R(o.id));if(!n)return;const r=buildInferenceModels(e.models,e.catalog);if(JSON.stringify(n.inferenceModels)!==JSON.stringify(r)){if(ie()&&ae(te)?.has("inferenceModels"))try{ce({inferenceModels:r})}catch(e){throw u.logError("claude-desktop.refreshModelMenu registry",e),new O(g.t("tools.claude_desktop.refresh_needs_admin"))}U(R(o.id),{...n,inferenceModels:r})}},detectCurrentConfig(){try{if(ie()){const e=ae(te)?.get("inferenceGatewayApiKey");if(e)return{apiKey:e}}const e=F(K());if(!e)return{apiKey:null};const t=N(R(e.id)),o=t?.inferenceGatewayApiKey;return{apiKey:"string"==typeof o&&o?o:null}}catch(e){return u.logError("claude-desktop.detectCurrentConfig",e),{apiKey:null}}},getConfig(){try{const e=K(),t=F(e);return{meta:e,applied:t?N(R(t.id)):null,desktop:N(G()),...ie()?{policy:Object.fromEntries(ae(te)??[])}:{}}}catch(e){return u.logError("claude-desktop.getConfig",e),null}},clearPinnedModels(){let e=!1;ie()&&ae(te)?.has("inferenceModels")&&(le(),se(["delete",te,"/v","inferenceModels","/f"]),e=!0);const t=F(K()),o=t?N(R(t.id)):null;if(t&&o&&void 0!==o.inferenceModels){const{inferenceModels:n,...r}=o;U(R(t.id),r),e=!0}return e?["inferenceModels"]:[]},applyNotes(){const e=[];if(W&&W.models.length>0){const{models:t,source:o,groups:n}=W;e.push({kind:"summary",text:g.t("tools.claude_desktop.models_summary",{count:String(t.length),default:t[0].labelOverride??t[0].name})}),e.push({kind:"detail",text:g.t(`tools.claude_desktop.models_written_${o}`,{count:String(t.length),list:t.map(e=>`${e.labelOverride}${e.supports1m?" (1M)":""}`).join(", "),groups:n.join(" / ")})})}null!==J&&e.push({kind:"detail",text:g.t(J?"tools.claude_desktop.official_login_hidden":"tools.claude_desktop.official_login_shown")}),C()&&!w()||e.push({kind:"action",text:g.t("tools.claude_desktop.restart_hint")}),q?(e.push({kind:"action",text:g.t(`tools.claude_desktop.policy_stale_${q.action}`)}),e.push({kind:"detail",text:Z??""})):Z?(e.push({kind:"detail",text:g.t("tools.claude_desktop.registry_denied")}),e.push({kind:"detail",text:Z})):ie()&&z&&e.push({kind:"detail",text:g.t(`tools.claude_desktop.registry_${z}`,{key:te})});const t=detectManagedConfig();return t&&e.push({kind:"action",text:g.t("tools.claude_desktop.managed_conflict",{path:t})}),e},forceResetPaths(){const e=[$(),G()];try{const t=F(K());t&&e.push(R(t.id))}catch{}return e},backupPaths(){const e=[$(),G()];ie()&&e.push(a(claudeDesktopUserDataDir(),ne));try{const t=F(K());t&&e.push(R(t.id))}catch{}return e}};
|