@lmctl-ai/lmctl 0.1.15 → 0.1.16
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/cli/index.js +1 -1
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1906,7 +1906,7 @@ Show provider session details, team rollups, or managed run state/token totals.`
|
|
|
1906
1906
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
1907
1907
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
1908
1908
|
|
|
1909
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,l1=50,ab=500});import{existsSync as db,readFileSync as fb}from"node:fs";import{homedir as m1}from"node:os";import{dirname as p1,resolve as mb}from"node:path";import{fileURLToPath as h1}from"node:url";function pb(t,e={}){let r=[],n=w1(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model)continue;let a=T1(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl.
|
|
1909
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,l1=50,ab=500});import{existsSync as db,readFileSync as fb}from"node:fs";import{homedir as m1}from"node:os";import{dirname as p1,resolve as mb}from"node:path";import{fileURLToPath as h1}from"node:url";function pb(t,e={}){let r=[],n=w1(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model)continue;let a=T1(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.github-copilot.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${ub(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(aa??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${ub(i)}`)}return r}function w1(t){if(!t&&bs)return bs;let e=new Map,r,n=t??y1();if(!db(n))return r=`${n} not found`,t||cd(e),t||(bs=e),t||(aa=r),e;let s;try{s=fb(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||cd(e),t||(bs=e),t||(aa=r),e}for(let[o,i]of Object.entries(_1)){let a=E1(s,i),l=b1(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&cd(e),t||(bs=e),t||(aa=r),e}function y1(){let t=p1(h1(import.meta.url));return mb(t,"..","..","..","durable-memory","model_selection.md")}function cd(t){for(let[e,r]of Object.entries(g1))t.set(e,r)}function E1(t,e){let n=new RegExp(`^## ${k1(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function b1(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function T1(t){let e=t??mb(m1(),".config","opencode","opencode.json"),r=zf();if(!db(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(fb(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...S1(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function S1(t){if(!ud(t))return[];let e=ia(t.provider)??ia(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!ud(s))continue;let o=ia(s.models)??ia(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function ia(t){return ud(t)?t:null}function ud(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function ub(t){return t.length>0?t.join(", "):"(none)"}function k1(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var _1,g1,bs,aa,hb=b(()=>{"use strict";Ha();_1={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},g1={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},bs=null});var Is={};ie(Is,{GEMINI_PROVIDER_NOTICE:()=>bb,_setSkillFileOpsForTests:()=>M1,_setTeamfileSeedForTests:()=>L1,buildRootTeamRegistrationRow:()=>vb,persistTeamConnections:()=>$b,registerRootTeam:()=>Ib,runHire:()=>P1,runLint:()=>D1,runRefresh:()=>F1,runSeed:()=>Sb,sha256Text:()=>kb,skillNameFromSource:()=>_d,skillNameFromUrl:()=>eF});import{createHash as v1,randomUUID as I1}from"node:crypto";import{existsSync as $1,mkdirSync as N1,readFileSync as ks,realpathSync as fd,renameSync as x1,unlinkSync as j1,writeFileSync as jr}from"node:fs";import{basename as A1,dirname as da,isAbsolute as _b,join as ua,resolve as vs}from"node:path";function L1(t){Tb=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(It(),kl)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function M1(t){Ss=t===null?md:{...md,...t}}async function D1(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(O1),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
1910
1910
|
`),2;let r=t[0],n;try{n=Ne(r)}catch(i){return Le(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=qu(n,da(vs(r))),o=pb(n.members);for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
|
|
1911
1911
|
`);if(s.length===0)try{Ir(r)}catch(i){return e.stderr.write(`error: connect: ${i instanceof Error?i.message:String(i)}
|
|
1912
1912
|
`),1}for(let i of n.members)hd([i],e),i.session!==void 0&&i.session.length<Ts&&o.push(`${i.alias}: sessionid is shorter than ${Ts} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
|