@lmctl-ai/lmctl 0.2.278 → 0.2.280
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/build-info.json +1 -1
- package/dist/cli/index.js +166 -163
- package/dist/cli/lmscript.js +115 -115
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1281,7 +1281,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1281
1281
|
status, started_at, last_heartbeat_at, last_seq)
|
|
1282
1282
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,o),Pu(e)&&pE(t,o,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function nl(t,e){let n=Gr(e.id),r=gE(t,n);return r===null?!1:(ft(t,{stream_id:n,event_type:FO,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
|
|
1283
1283
|
SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
|
|
1284
|
-
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Pu(e)&&_E(t,s,n)}),!0)}function EE(t,e,n,r){let s=Gr(e.id),o=gE(t,s);return o===null?!1:(ft(t,{stream_id:s,event_type:jO,observedLastSeq:o.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},i=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,i,s,o.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function TE(t,e,n){let r=Gr(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Pu(e)&&hE(t,r,n)}function wE(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Gr(e))}function vE(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Gr(e))}var UO,FO,jO,SE=x(()=>{"use strict";Ja();tl();UO="INVOCATION_START",FO="INVOCATION_FINISH",jO="INVOCATION_NOTIFY_CLAIM"});var WO,HO,
|
|
1284
|
+
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Pu(e)&&_E(t,s,n)}),!0)}function EE(t,e,n,r){let s=Gr(e.id),o=gE(t,s);return o===null?!1:(ft(t,{stream_id:s,event_type:jO,observedLastSeq:o.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},i=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,i,s,o.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function TE(t,e,n){let r=Gr(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Pu(e)&&hE(t,r,n)}function wE(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Gr(e))}function vE(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Gr(e))}var UO,FO,jO,SE=x(()=>{"use strict";Ja();tl();UO="INVOCATION_START",FO="INVOCATION_FINISH",jO="INVOCATION_NOTIFY_CLAIM"});var WO,HO,yK,IE,bE,kE,AE=x(()=>{"use strict";WO="other",HO=["not_enough_information","dont_know","other_work"],yK=new Set([WO,...HO]),IE="@abort",bE="invalid_decision",kE="workflow_escalation"});import{randomUUID as NE}from"node:crypto";import{existsSync as CE,mkdirSync as BO,renameSync as XO,rmdirSync as qO}from"node:fs";import{hostname as Fu}from"node:os";function ju(t){return t.provider_resolved??t.provider}function X(){return new Date().toISOString()}function GO(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!CE(t))return e;let n;try{n=new xr(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function VO(t){if(t===":memory:"||!CE(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{XO(r,`${e}${n}`)}catch{}}return e}function RE(t,e){let n=e instanceof Error?e.message:String(e);try{let r=GO(t),s=VO(t),o=new ni(zo({dbPath:t}));for(let i of r.rootTeams)o.upsertRootTeam(i);for(let{key:i,value:a}of r.config)o.setConfig(i,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${bn} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
|
|
1285
1285
|
`:`
|
|
1286
1286
|
`)),o}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function Uu(t,e){let n;try{return n=zo({dbPath:t,allowSchemaSkew:e}),{dal:new ni(n)}}catch(r){if(r instanceof jt)throw r;let s;if(n!==void 0)try{s=n.pragma("user_version",{simple:!0})}catch{}try{n?.close()}catch{}return{cause:r,dbVersion:s}}}function zO(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function QO(t){if(t===":memory:")return!0;try{return BO(`${t}${OE}`),!0}catch{return!1}}function ZO(t){if(t!==":memory:")try{qO(`${t}${OE}`)}catch{}}function $e(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(t.recover===!1){let s=Uu(t.path,e);if(s.dal)return s.dal;throw s.cause}let n={};for(let s=0;s<JO;s+=1)if(n=Uu(t.path,e),n.dal!==void 0)return n.dal;let r=n.cause?.code;if(typeof r=="string"&&/^SQLITE_(BUSY|LOCKED)/.test(r))throw new Error(t.path+": database is busy; retry this command after the other writer finishes.",{cause:n.cause});if(n.dbVersion!==void 0&&n.dbVersion>bn){let s=n.cause instanceof Error?n.cause.message:String(n.cause);throw new jt(t.path,n.dbVersion,bn,s)}for(let s=0;s<KO;s+=1){if(QO(t.path))try{return RE(t.path,n.cause)}finally{ZO(t.path)}zO(YO);let o=Uu(t.path,e);if(o.dal!==void 0)return o.dal}return RE(t.path,n.cause)}function LE(t,e,n){let r=xE(e);if(r.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return xE(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let d of i(l))a(d)}finally{o.pop()}s.add(l)}};a(t)}function xE(t){let e=eD(t),n=e===null?null:tD(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))rl(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function eD(t){try{let e=JSON.parse(t);return rl(e)?e:null}catch{return null}}function tD(t,e){let n=t[e];return rl(n)?n:null}function rl(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nD(t){try{let e=JSON.parse(t);return!rl(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function rD(t,e){return t===null?!0:t.holder_host===Fu()?!et(t.holder_pid):t.last_heartbeat<e}function sD(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
1287
1287
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
@@ -1724,10 +1724,10 @@ ${qD(t,FD,"provider output not saved")}
|
|
|
1724
1724
|
\u2026 ${s} characters of provider stderr dropped \u2026
|
|
1725
1725
|
${r}`}}}function Ps(t,e){return e===""?t:`${t}:${e.includes(`
|
|
1726
1726
|
`)?`
|
|
1727
|
-
`:" "}${e}`}var UD,FD,jD,WD,HD,BD,St=x(()=>{"use strict";il();UD=500,FD=1e6,jD=50,WD=20*1024*1024,HD=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,BD=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as lT,appendFileSync as zD,mkdirSync as QD,existsSync as
|
|
1727
|
+
`:" "}${e}`}var UD,FD,jD,WD,HD,BD,St=x(()=>{"use strict";il();UD=500,FD=1e6,jD=50,WD=20*1024*1024,HD=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,BD=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as lT,appendFileSync as zD,mkdirSync as QD,existsSync as t6,readdirSync as n6,unlinkSync as r6}from"node:fs";import{join as cl,dirname as ZD}from"node:path";import{homedir as eM}from"node:os";function Ju(){return cl(eM(),".lmctl")}function Ku(){Us=!0,process.env.LMCTL_DEBUG="1"}function cT(){return{cliDebug:Us,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function dT(t){Us=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ye(){if(Us||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-aT>=tM&&(iT=oM(),aT=t),iT}function ci(){return Us||process.env.LMCTL_DEBUG==="1"}function nM(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${n}${r}:${s}`)}function Vu(t,e="",n=new WeakSet){if(/(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|credential|token|secret)/i.test(e)&&typeof t=="string")return"[REDACTED]";if(typeof t=="string")return li(t);if(Array.isArray(t))return t.map(r=>Vu(r,"",n));if(t&&typeof t=="object"){if(n.has(t))return"[Circular]";n.add(t);let r={};for(let[s,o]of Object.entries(t))r[s]=Vu(o,s,n);return n.delete(t),r}return t}function rM(t){return Vu(t)}function He(t,e){if(e?.verbose){if(!Us)return}else if(!e?.always&&!ye())return;try{sM();let n={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...rM(t)};zD(ll,JSON.stringify(n)+`
|
|
1728
1728
|
`)}catch{}}function sM(){if(!ll){let e=nM().slice(0,13).replace("T","-");ll=cl(Ju(),`debug-${e}.log`)}QD(ZD(ll),{recursive:!0})}function Ke(...t){He({event:"legacy",msg:t.join(" ")})}function Ue(...t){He({event:"legacy",msg:t.join(" ")},{verbose:!0})}function U(t){He(t,{always:!0})}function oM(){return iM()||aM()}function iM(){try{let t=lT(cl(Ju(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
1729
1729
|
`)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function aM(){try{let t=lT(cl(Ju(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Us,iT,aT,tM,ll,re=x(()=>{"use strict";St();Us=!1,iT=!1,aT=0,tM=5e3;ll=null});import{openSync as kM,closeSync as AM,fstatSync as NM,readSync as RM,constants as hT}from"node:fs";import{dirname as LM,join as dl}from"node:path";import{createHash as xM}from"node:crypto";function Qu(t){if(!Ur(t.catalog)||!Fr(t.aliases)||!t.sha256||!/^[a-f0-9]{64}$/.test(t.sha256))throw Error("invalid or incomplete price snapshot (catalog, aliases and SHA-256 required)");if(!["network","cache","bundled","pinned"].includes(t.source)||t.generatedAt!==null&&typeof t.generatedAt!="string")throw Error("invalid price snapshot metadata");if(t.catalog.records.length>1e5||t.aliases.aliases.length>1e5||t.aliases.standards.length>1e5)throw Error("price snapshot exceeds the 100000-entry limit");let e=o=>{if(o.length>65536)throw Error("price identity exceeds the 65536-character limit")},n=new Set,r=new Set,s=new Set;for(let o of t.catalog.records){let i=ET(o);if(!i||n.has(i))throw Error("duplicate or missing price record id");n.add(i),e(i),e(o.source),e(o.source_model_id);for(let d of[o.source,o.source_model_id])if(typeof d!="string"||!d.trim())throw Error("invalid price record identity");let a=o;for(let d of[o.provider,o.mode,o.gateway_id,o.record_id,a.vendor_model_id,a.canonical_slug])if(d!=null&&typeof d!="string")throw Error("invalid price record metadata");for(let d of[o.pricing.input_per_1m_tokens,o.pricing.output_per_1m_tokens,o.pricing.input_cache_read_per_1m_tokens,o.pricing.input_cache_write_per_1m_tokens??null])if(!_T(d))throw Error("price rates must be finite nonnegative numbers or null");let l=o.pricing.source_cost_fields;if(l!=null&&(typeof l!="object"||Array.isArray(l)))throw Error("invalid source cost fields");for(let d of["cache_creation_input_token_cost","cache_creation_input_token_cost_above_1hr"])if(l?.[d]!==void 0&&!_T(l[d]))throw Error("source blend rates must be finite nonnegative numbers or null");let c=o.pricing.currency;if(c!=null&&c!=="USD")throw Error("price currency must be USD")}for(let o of t.aliases.standards){e(o.standard_slug),o.catalog_record_id!==null&&e(o.catalog_record_id);let i=o.standard_slug.toLowerCase();if(!i||r.has(i))throw Error("duplicate price standard");r.add(i)}for(let o of t.aliases.aliases){e(o.alias),o.standard_slug!==null&&e(o.standard_slug);let i=o.alias.toLowerCase();if(!i||s.has(i))throw Error("duplicate price alias");if(s.add(i),o.standard_slug!==null&&!r.has(o.standard_slug.toLowerCase()))throw Error("price alias references missing standard")}}function gT(t){let e=kM(t,hT.O_RDONLY|hT.O_NONBLOCK);try{let n=NM(e);if(!n.isFile()||n.size>CM)throw Error("price file must be a regular file within the 64 MiB size limit");let r=Buffer.alloc(n.size+1),s=0;for(;s<r.length;){let o=RM(e,r,s,r.length-s,null);if(o===0)break;s+=o}if(s!==n.size)throw Error("price file changed while reading; retry with a complete file");return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(r.subarray(0,s))}finally{AM(e)}}function Zu(t,e=dl(LM(t),"aliases.json")){let n=gT(t),r=gT(e),s;try{s=yT(n)}catch{s=null}if(!s||!("records"in Object(s))){let a=n.trim().split(/\r?\n/).filter(c=>c.trim()).map(c=>JSON.parse(c)),l=a[0]?.schema_version!==void 0&&a[0]?.pricing===void 0&&a[0]?.source_model_id===void 0?a.shift():{};s={schema_version:l.schema_version??1,generated_at:l.generated_at??"",records:a}}let o=yT(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:xM("sha256").update(n).update(r).digest("hex")};return Qu(i),i}function Fs(t){let e=t.pragma("busy_timeout",{simple:!0});try{return t.pragma("busy_timeout = 0"),t.prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name='price_snapshot'").get()?t.transaction(()=>{let n=t.prepare("SELECT * FROM price_snapshot").get();if(!n)return null;let r=t.prepare("SELECT * FROM price_record ORDER BY ordinal").all().map(i=>{if(typeof i.record_id!="string"||!i.record_id||i.currency!=="USD"||i.unit!=="per_1m_tokens")throw Error("invalid stored price identity, currency or unit");let a=JSON.parse(i.record_json);return{...a,record_id:i.record_id,pricing:{...a.pricing,input_per_1m_tokens:i.input_1m,output_per_1m_tokens:i.output_1m,input_cache_read_per_1m_tokens:i.cache_read_1m,input_cache_write_per_1m_tokens:i.cache_write_1m,source_cost_fields:JSON.parse(i.source_cost_fields??"{}")}}});if(r.length!==n.record_count)throw Error("incomplete stored price snapshot");let s=t.prepare("SELECT alias,standard_slug,evidence FROM price_alias ORDER BY alias").all(),o={catalog:{schema_version:1,generated_at:n.generated_at??"",records:r},aliases:{schema_version:1,standards:JSON.parse(n.standards_json),aliases:s},source:n.source,generatedAt:n.generated_at,sha256:n.sha256,fetchedAt:n.fetched_at,loadedAt:n.loaded_at,recordCount:n.record_count};return Qu(o),o})():null}finally{t.pragma("busy_timeout = "+e)}}function ef(t,e,n={}){Qu(e);let r=()=>t.prepare("SELECT sha256 FROM price_snapshot").get()?.sha256===e.sha256,s=t.pragma("busy_timeout",{simple:!0});try{return t.pragma("busy_timeout = 0"),r()?"unchanged":t.transaction(()=>{if(r())return"unchanged";t.exec("DELETE FROM price_alias; DELETE FROM price_record; DELETE FROM price_snapshot;");let o=t.prepare("INSERT INTO price_record(record_id,source,provider,source_model_id,vendor_model_id,canonical_slug,currency,unit,input_1m,output_1m,cache_read_1m,cache_write_1m,source_cost_fields,record_json,ordinal) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");e.catalog.records.forEach((c,d)=>{let u=c;o.run(ET(c),c.source,c.provider??null,c.source_model_id,u.vendor_model_id??null,u.canonical_slug??null,"USD","per_1m_tokens",c.pricing.input_per_1m_tokens,c.pricing.output_per_1m_tokens,c.pricing.input_cache_read_per_1m_tokens,c.pricing.input_cache_write_per_1m_tokens??null,JSON.stringify(c.pricing.source_cost_fields??{}),JSON.stringify(c),d)});let i=t.prepare("INSERT INTO price_alias(alias,standard_slug,evidence,catalog_record_id) VALUES(?,?,?,?)"),a=new Map(e.aliases.standards.map(c=>[c.standard_slug.toLowerCase(),c]));for(let c of e.aliases.aliases){let d=a.get(c.standard_slug?.toLowerCase()??"");i.run(c.alias.toLowerCase(),c.standard_slug,c.evidence,d?.catalog_record_id??null)}let l=new Date(n.now??Date.now()).toISOString();return t.prepare("INSERT INTO price_snapshot(sha256,generated_at,source,fetched_at,loaded_at,record_count,standards_json) VALUES(?,?,?,?,?,?,?)").run(e.sha256,e.generatedAt,e.source,l,l,e.catalog.records.length,JSON.stringify(e.aliases.standards)),"updated"}).immediate()}catch(o){if(/^SQLITE_(BUSY|LOCKED|READONLY)(_|$)/.test(String(o?.code)))return"deferred";throw o}finally{t.pragma("busy_timeout = "+s)}}async function tf(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=Fs(t),o=zu.get(t),i=o&&o.hash===s?.sha256?o.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=i&&n-i<Rs(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(Zu(dl(r.LMCTL_PRICE_DATA,"model_list.json"))):Tt({cacheDir:r.LMCTL_HOME?dl(r.LMCTL_HOME,"cache","lmprice"):r.HOME?dl(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:Rs(r)})),l,c;try{c=await(e.budgetMs===void 0?a():Promise.race([a(),new Promise(f=>{l=setTimeout(()=>f(null),e.budgetMs)})]))}finally{clearTimeout(l)}if(zu.set(t,{hash:s?.sha256??null,at:n}),!c?.catalog||!c.aliases||!c.sha256||c.refreshFailed&&(s||c.source!=="bundled"))return{status:"unavailable",snapshot:s};let d=ef(t,c,{now:n}),u=Fs(t);return zu.set(t,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function ul(t,e){try{return(await tf(t,{env:e,budgetMs:900})).snapshot??di}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return di;try{return Fs(t)??di}catch{return di}}}async function nf(t){if(t.dal)return ul(t.dal.db,t.env);let e;try{return e=$e({path:Pe(t),recover:!1}),await ul(e.db,t.env)}catch{return di}finally{try{e?.close()}catch{}}}var di,ET,_T,CM,yT,zu,fl=x(()=>{"use strict";zt();vt();le();di={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null},ET=t=>t.record_id??t.source+":"+t.source_model_id,_T=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;CM=64*1024*1024;yT=t=>JSON.parse(t.replace(/^\uFEFF/,""));zu=new WeakMap});function xn(t){return t!=="gemini"}function ml(t){if(!xn(t))throw new Error(sr)}var sr,js=x(()=>{"use strict";sr="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function TT(t){if(t.length===0||!t.startsWith("---"))throw new tn("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1730
|
-
`);if(e[0]!=="---")throw new tn("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){r=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new tn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!OM.has(c))throw new tn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${pl.join(", ")}`);n[c]=d}if(r===-1)throw new tn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of pl)if(n[i]===void 0)throw new tn(`missing required frontmatter key "${i}" \u2014 required: ${pl.join(", ")}`);let s=0;for(let i=0;i<=r;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=n.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:n.title,description:n.description,members:o,bodyOffset:s}}var pl,OM,tn,wT=x(()=>{"use strict";pl=["title","description","members"],OM=new Set(pl),tn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function ui(t){return rf.has(t)}var rf,hl=x(()=>{"use strict";rf=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as DM,writeFileSync as
|
|
1730
|
+
`);if(e[0]!=="---")throw new tn("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){r=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new tn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!OM.has(c))throw new tn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${pl.join(", ")}`);n[c]=d}if(r===-1)throw new tn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of pl)if(n[i]===void 0)throw new tn(`missing required frontmatter key "${i}" \u2014 required: ${pl.join(", ")}`);let s=0;for(let i=0;i<=r;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=n.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:n.title,description:n.description,members:o,bodyOffset:s}}var pl,OM,tn,wT=x(()=>{"use strict";pl=["title","description","members"],OM=new Set(pl),tn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function ui(t){return rf.has(t)}var rf,hl=x(()=>{"use strict";rf=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as DM,writeFileSync as A6,renameSync as N6,existsSync as ST}from"node:fs";import{basename as MM,resolve as Ws,dirname as sf}from"node:path";function $M(t){let e={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(t))!==null;){let s=r[1],o=r[2]!==void 0?r[2]:r[3];e[s]=o}return e}function PM(t){return/^\s*_MEMBER_\s+\S/.test(t)}function UM(t){return/^\s*_SESSION_\s+\S/.test(t)}function FM(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function xe(t){return/\.(?:lmctl|lmc)$/i.test(t)}function fi(t){return MM(t).replace(/\.(?:lmctl|lmc)$/i,"")}function be(t){let e=DM(t,"utf-8"),n=sf(Ws(t)),r=Cn(e,fi(t),{baseDir:n,sourcePath:Ws(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Ws(n,s.sessiondir));return r}function Cn(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
|
|
1731
1731
|
`);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=TT(o)}catch(l){if(l instanceof tn)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
1732
1732
|
`);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(UM(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(FM(c)||!PM(c))continue;let u=$M(c);for(let m of Object.keys(u))if(!vT.includes(m))throw new Error(`line ${d}: unknown key "${m}" on _MEMBER_ line: ${c.trim()}
|
|
1733
1733
|
allowed keys: ${vT.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}if(!u.alias){s.push(`line ${d}: member line missing required alias: ${c.trim()}`);continue}let f={alias:u.alias,provider:u.provider||"",extra:{}};u.sessionid&&(f.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(f.sessiondir=u.sessiondir),u.teamfile&&(f.teamfile=u.teamfile),u.model&&(f.model=u.model),u.effort&&(f.effort=u.effort),r.push(f)}return{name:e,members:r,rawText:t,parseErrors:s,frontmatter:i}}function mi(t,e){let n=[];for(let o of t.parseErrors)n.push({field:"session",message:o});let r=t.members.filter(o=>o.alias.toLowerCase()===of.toLowerCase());r.length>1&&n.push({field:of,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&n.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Ws(e,o.teamfile):Ws(o.teamfile);if(!ST(a))n.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=be(a),c=Hs(l);c?c.session||n.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else rf.has(o.provider)?xn(o.provider)||n.push({field:o.alias,message:sr}):n.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&n.push({field:o.alias,message:"sessiondir is empty"})}return n}function Hs(t){return t.members.find(e=>e.alias.toLowerCase()===of.toLowerCase())}function af(t,e,n,r={}){let s=r.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Ws(e,t.teamfile),i=n??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!ST(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=be(o),l=Hs(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return af(l,sf(o),i,r);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||sf(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _l(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var of,vT,Be=x(()=>{"use strict";js();wT();hl();of="Lead";vT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as jM}from"node:crypto";import{existsSync as IT,readFileSync as bT,realpathSync as WM}from"node:fs";import{dirname as HM,resolve as kT}from"node:path";function Ne(t,e){let n=kT(t);if(IT(n))return WM(n);if(e!==void 0){let r=XM(t,n,e);if(r!==null)return r}return n}function yl(t,e){let n=HM(e),r=Cn(t,fi(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=kT(n,s.sessiondir));return r}function nn(t,e,n=r=>{process.stderr.write(`warning: ${r}
|
|
@@ -1746,7 +1746,7 @@ ${r}`}}}function Ps(t,e){return e===""?t:`${t}:${e.includes(`
|
|
|
1746
1746
|
AND status = 'running'`,e,n),s=0;for(let o of r)_f(t,o)!==null&&(s+=1);return s}var kl=x(()=>{"use strict";nt();vt();Wt()});function Al(t,e,n){return xn(t)&&e.tools[t]?.agent===void 0&&n.includes(t)}async function Dn(t,e,n,r,s){if(t.provider!==e)throw new Error(`bundle session provider mismatch: session serves "${t.provider}", turn targets "${e}"`);if(t.sessionId!==n)throw new qs(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let o=await t.sendTurn(r,s);if(o.sessionId!==n)throw Object.assign(new qs(`session identity mismatch: expected "${n}", got "${o.sessionId}"`),{usage:o.usage,sessionId:o.sessionId});return{...o,...o.text===""&&o.sawActivity===!1?{status:"empty"}:{}}}async function Nl(t,e){ml(t.name);let n=e.requireResume??!0;if(n&&!e.sessionId.trim())throw new Error("conversation requires an existing session ID");let r=e.userConfig?.tools[t.name]?.agent!==void 0,s=e.execution!=="per-turn"&&t.openSession!==void 0&&!r;if(e.execution==="persistent"&&!s)throw new Error(`provider "${t.name}" does not support persistent sessions with this configuration`);let o=s?await t.openSession(e):void 0,i=!n&&e.sessionId==="";if(o&&(o.provider!==t.name||typeof o.sessionId!="string"||!o.sessionId.trim()||!i&&o.sessionId!==e.sessionId))throw await o.close(),new Error(`session identity mismatch opening ${t.name}: expected "${e.sessionId}", got "${o.sessionId}" (${o.provider})`);let a=o?.sessionId??e.sessionId,l=0,c=!1,d,u;return{provider:t.name,sessionId:a,execution:s?"persistent":"per-turn",transport:r?"custom":t.protocol?.transport??"unknown",cancellation:r?"unknown":s?t.protocol?.persistentCancellation??"unknown":t.protocol?.perTurnCancellation??"unknown",get completedTurns(){return l},async sendTurn(f,m={}){if(c)throw new Error("conversation is closed");if(d)throw new Error("conversation already has an active turn");if(m.signal?.aborted)throw new Error("Aborted");let p=new AbortController;d=p;let _=()=>p.abort();m.signal?.addEventListener("abort",_,{once:!0});try{let h=o?await Dn(o,t.name,a,f,{...m,signal:p.signal}):await t.sendTurn(f,{...e,...m,signal:p.signal,requireResume:n,timeoutMs:e.timeoutMs??0});if(p.signal.aborted)throw Object.assign(new Error("Aborted"),{usage:h.usage,sessionId:h.sessionId});if(n&&h.sessionId!==e.sessionId)throw c=!0,Object.assign(new qs(`session identity mismatch: expected "${e.sessionId}", got "${h.sessionId}"`),{usage:h.usage,sessionId:h.sessionId});return h.status!=="empty"&&h.status!=="stalled"&&l++,h}catch(h){throw p.signal.aborted&&o&&t.protocol?.persistentCancellation==="session"&&(c=!0),h instanceof qs&&(c=!0,await o?.close()),h}finally{m.signal?.removeEventListener("abort",_),d=void 0}},close(){return u||(c=!0,d?.abort(),u=o?o.close():Promise.resolve()),u}}}var qs,Gs=x(()=>{"use strict";js();qs=class extends Error{}});import{realpathSync as O$}from"node:fs";import{resolve as D$}from"node:path";function gf(t){let e=D$(t);try{return O$(e)}catch{return e}}var QT=x(()=>{"use strict"});import{platform as ZT}from"node:os";function Vs(t){let e=new gi;for(let n of t)e.registerAdapter(n);return e}var gi,yf=x(()=>{"use strict";QT();gi=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(r.map(i=>i.discoverSessions()));for(let i of s)n.push(...i);let o=n;if(e?.workspace){let i=gf(e.workspace);o=o.filter(a=>gf(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(o=>o.name===n):this.providers,s=[];for(let o of r){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=ZT()==="darwin"||ZT()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});function vf(){return new Tf}function Sf(t){let e=!1;for(let n of t.split(`
|
|
1747
1747
|
`)){let r;try{r=JSON.parse(n)}catch{continue}let s=r.type;typeof s=="string"&&(s.endsWith(".started")&&(e=!0),["turn.completed","turn.failed","turn.aborted","turn.cancelled","error"].includes(s)&&(e=!1))}return e}function If(t){let e=t.trimEnd().split(`
|
|
1748
1748
|
`).at(-1)?.trimStart()??"";if(!e.startsWith("{"))return!1;try{return JSON.parse(e),!1}catch{return!0}}function ew(t){let e,n=!1,r=!1,s;for(let o of t.split(`
|
|
1749
|
-
`)){let i;try{i=JSON.parse(o)}catch{continue}if(i.type==="thread.started"&&typeof i.thread_id=="string"&&(e=i.thread_id),i.type==="turn.started"&&(n=!0),i.type!=="turn.completed"||!n||r)continue;r=!0;let a=i.usage;if(!a)continue;let l=st(a.input_tokens),c=st(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||c===null||c>l?null:l-c,cacheRead:c,cacheWrite:0,output:st(a.output_tokens),reasoning:st(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:Yt([a.input_tokens,a.cached_input_tokens,a.output_tokens,a.reasoning_output_tokens])||l!==null&&c!==null&&c>l},[s.inputUncached,s.cacheRead,s.output].includes(null)&&(s.reason="counter_not_exposed")}return(If(t)||Sf(t))&&(s={source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"counter_not_exposed",invalidCounters:!0}),{sessionId:e,usage:s}}var st,M$,Ef,Tf,wf,bf=x(()=>{"use strict";Xo();st=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,M$=(t,e)=>t===null||e===null?null:st(t+e),Ef=(t,e)=>JSON.stringify([t,e]),Tf=class{finished=new Set;seen=new Set;models=new Map;reportModel(e,n){typeof n=="string"&&n&&n!=="<synthetic>"&&this.models.set(e,n)}remember(e,n){typeof n=="string"&&n&&this.finished.add(Ef(e,n))}turn(e,n=""){return new wf(this,e,n)}};wf=class{session;thread;id;value;ended=!1;reported=new Set;constructor(e,n,r){this.session=e,this.thread=n,this.id=r}bind(e){return typeof e!="string"||!e||this.ended||this.session.finished.has(Ef(this.thread,e))||this.id&&this.id!==e?!1:(this.id=e,!0)}event(e){let n=e.method,r=e.params,s=r?.turn,o=r?.turnId??s?.id,i=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&i!==this.thread||(this.thread||(this.thread=i),typeof o=="string"&&this.session.finished.has(Ef(i,o))))return!1;if(n==="turn/started")return this.bind(o);if(this.id&&o&&o!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(o);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(w=>w==null))return!0;let l=w=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(S=>w[S]??null),c=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(w=>st(a.total[w])!==null)?l(a.total):null,d=typeof e.id=="string"&&e.id.length>0||typeof e.id=="number"&&Number.isSafeInteger(e.id)?e.id:null,u=st(e.emittedAtMs)??d,f=st(e.ordinal)??st(r.ordinal),m=JSON.stringify([this.thread,this.id,c,l(a.last),u,d,f]),p=u!==null||f!==null;if(p&&this.session.seen.has(m))return!1;p&&this.session.seen.add(m);let _=a.last,h=st(_.inputTokens),g=st(_.cachedInputTokens),y={source:"wire",inputUncached:h===null||g===null||g>h?null:h-g,cacheRead:g,cacheWrite:st(_.cacheWriteInputTokens??0),output:st(_.outputTokens),reasoning:st(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Yt([_.inputTokens,_.cachedInputTokens,_.cacheWriteInputTokens,_.outputTokens,_.reasoningOutputTokens])||h!==null&&g!==null&&g>h};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let T=r.model??_.model;if(typeof T=="string"&&T&&T!=="<synthetic>"&&this.reported.add(T),!this.value)this.value=y;else{for(let w of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let S=this.value[w],I=y[w];S!==null&&I!==null&&st(S+I)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[w]=M$(this.value[w],y[w])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}}});import{readFileSync as $$,writeFileSync as
|
|
1749
|
+
`)){let i;try{i=JSON.parse(o)}catch{continue}if(i.type==="thread.started"&&typeof i.thread_id=="string"&&(e=i.thread_id),i.type==="turn.started"&&(n=!0),i.type!=="turn.completed"||!n||r)continue;r=!0;let a=i.usage;if(!a)continue;let l=st(a.input_tokens),c=st(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||c===null||c>l?null:l-c,cacheRead:c,cacheWrite:0,output:st(a.output_tokens),reasoning:st(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:Yt([a.input_tokens,a.cached_input_tokens,a.output_tokens,a.reasoning_output_tokens])||l!==null&&c!==null&&c>l},[s.inputUncached,s.cacheRead,s.output].includes(null)&&(s.reason="counter_not_exposed")}return(If(t)||Sf(t))&&(s={source:"wire",inputUncached:null,cacheRead:null,cacheWrite:null,output:null,reasoning:null,modelReported:null,providerCostUsd:null,reason:"counter_not_exposed",invalidCounters:!0}),{sessionId:e,usage:s}}var st,M$,Ef,Tf,wf,bf=x(()=>{"use strict";Xo();st=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,M$=(t,e)=>t===null||e===null?null:st(t+e),Ef=(t,e)=>JSON.stringify([t,e]),Tf=class{finished=new Set;seen=new Set;models=new Map;reportModel(e,n){typeof n=="string"&&n&&n!=="<synthetic>"&&this.models.set(e,n)}remember(e,n){typeof n=="string"&&n&&this.finished.add(Ef(e,n))}turn(e,n=""){return new wf(this,e,n)}};wf=class{session;thread;id;value;ended=!1;reported=new Set;constructor(e,n,r){this.session=e,this.thread=n,this.id=r}bind(e){return typeof e!="string"||!e||this.ended||this.session.finished.has(Ef(this.thread,e))||this.id&&this.id!==e?!1:(this.id=e,!0)}event(e){let n=e.method,r=e.params,s=r?.turn,o=r?.turnId??s?.id,i=typeof r?.threadId=="string"?r.threadId:this.thread;if(this.thread&&i!==this.thread||(this.thread||(this.thread=i),typeof o=="string"&&this.session.finished.has(Ef(i,o))))return!1;if(n==="turn/started")return this.bind(o);if(this.id&&o&&o!==this.id)return!1;if(n==="turn/completed")return this.id?!this.ended:this.bind(o);if(n!=="thread/tokenUsage/updated")return!0;if(this.ended||!this.id||r?.threadId!==this.thread||r?.turnId!==this.id)return!1;let a=r.tokenUsage;if(!a?.last||typeof a.last!="object"||Array.isArray(a.last)||[a.last.inputTokens,a.last.cachedInputTokens,a.last.outputTokens].every(w=>w==null))return!0;let l=w=>["inputTokens","cachedInputTokens","cacheWriteInputTokens","outputTokens","reasoningOutputTokens","totalTokens"].map(S=>w[S]??null),c=a.total&&["inputTokens","cachedInputTokens","outputTokens"].every(w=>st(a.total[w])!==null)?l(a.total):null,d=typeof e.id=="string"&&e.id.length>0||typeof e.id=="number"&&Number.isSafeInteger(e.id)?e.id:null,u=st(e.emittedAtMs)??d,f=st(e.ordinal)??st(r.ordinal),m=JSON.stringify([this.thread,this.id,c,l(a.last),u,d,f]),p=u!==null||f!==null;if(p&&this.session.seen.has(m))return!1;p&&this.session.seen.add(m);let _=a.last,h=st(_.inputTokens),g=st(_.cachedInputTokens),y={source:"wire",inputUncached:h===null||g===null||g>h?null:h-g,cacheRead:g,cacheWrite:st(_.cacheWriteInputTokens??0),output:st(_.outputTokens),reasoning:st(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:Yt([_.inputTokens,_.cachedInputTokens,_.cacheWriteInputTokens,_.outputTokens,_.reasoningOutputTokens])||h!==null&&g!==null&&g>h};[y.inputUncached,y.cacheRead,y.cacheWrite,y.output].includes(null)&&(y.reason="counter_not_exposed");let T=r.model??_.model;if(typeof T=="string"&&T&&T!=="<synthetic>"&&this.reported.add(T),!this.value)this.value=y;else{for(let w of["inputUncached","cacheRead","cacheWrite","output","reasoning"]){let S=this.value[w],I=y[w];S!==null&&I!==null&&st(S+I)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[w]=M$(this.value[w],y[w])}this.value.reason=this.value.reason||y.reason,this.value.invalidCounters||=y.invalidCounters}return!0}usage(){if(this.value)return{...this.value,modelReported:this.reported.size>1?null:[...this.reported][0]??this.session.models.get(this.thread)??null,mixedModels:this.reported.size>1}}finish(){this.ended=!0,this.id&&this.session.remember(this.thread,this.id)}}});import{readFileSync as $$,writeFileSync as _Y,mkdirSync as gY}from"node:fs";import{join as P$,dirname as EY}from"node:path";import{homedir as U$}from"node:os";function j$(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function W$(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=j$(t.slice(e+1).trim());return n?{key:n,value:r}:null}function H$(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Rl(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function B$(){return P$(U$(),".lmctl","config.toml")}function Ll(t){let e=t??B$(),n;try{n=$$(e,"utf-8")}catch{return{tools:{}}}return X$(n)}function tw(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function X$(t){let e={},n={},r=t.split(`
|
|
1750
1750
|
`),s={kind:"none"},o={},i=!1,a={};function l(){if(s.kind==="tool"){let u=e[s.tool]??{};if(s.profile){let f=u.profiles?.[s.profile]??{};o.description&&(f.description=o.description),o.flags!==void 0&&(f.flags=o.flags),u.profiles||(u.profiles={}),u.profiles[s.profile]=f}else o.start&&(u.start=o.start),o.resume&&(u.resume=o.resume),o.agent&&(u.agent=o.agent),o.profile_flag!==void 0&&(u.profile_flag=o.profile_flag);e[s.tool]=u}else if(s.kind==="compact"){let u=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(o.min!==void 0){let f=tw(o.min);f!==null&&(u.min=f)}if(o.max!==void 0){let f=tw(o.max);f!==null&&(u.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=u):n.global=u}o={}}for(let u of r){let f=u.trim();if(!f||f.startsWith("#"))continue;let m=H$(f);if(m!==null){if(i=!0,l(),m.startsWith("tool.")){let _=".profile.",h=m.indexOf(_);h!==-1?s={kind:"tool",tool:m.slice(5,h),profile:m.slice(h+_.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=W$(f);p&&s.kind!=="none"?o[p.key]=p.value:p&&!i&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;return d!==void 0&&d.length>0&&(c.site_name=d),c}function nw(t){return t.site_name??null}function q$(t,e,n){if(!n)return"";let r=t.tools[e]??kf[e],s=r?.profiles?.[n]?.flags??kf[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function rw(t,e){return!!t.tools[e]}function sw(t,e,n,r,s){let o=t.tools[e]??kf[e],i;if(o?.agent){let l=Rl(r);i=o.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=F$[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(Rl).join(" ");i=`printf '%s\\n' ${Rl(r)} | ${d}`}else i=c.map(Rl).join(" ")}let a=q$(t,e,s);return a&&(i+=" "+a),i}var kf,F$,xl=x(()=>{"use strict";kf={muse:{start:"muse",resume:"muse resume {{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}},hermes:{start:"hermes",resume:"hermes --yolo --resume {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}}},F$={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]},hermes:{mode:"argv",argv:["hermes","--yolo","-z","{{prompt}}","--resume","{{session_id}}"]}}});function ow(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var iw=x(()=>{"use strict"});function Ol(t){let e=t?.prompt??Z;if(t?.teamfile!==void 0){let n=t.teamfileContent??"";e=`${Z}${lw}${t.teamfile}:
|
|
1751
1751
|
${n}${Nf}${JSON.stringify(t.teamfile)}${Rf}`}return t?.flightToken&&(e=`${t.flightToken.startsWith("[lmctl-seed:")?t.flightToken:`[lmctl-seed:${t.flightToken}]`}
|
|
1752
1752
|
${e}`),e}function aw(t){let e=t.trim(),n=e.match(/^\[lmctl-seed:[0-9a-zA-Z_-]+\](?:\r?\n|\s+)/);if(n&&(e=e.slice(n[0].length).trim()),e===Z)return!0;let r=`${Z}${lw}`;if(!e.startsWith(r)||!e.endsWith(Rf))return!1;let s=e.slice(r.length),o=s.slice(0,-Rf.length),i=o.lastIndexOf(Nf);if(i===-1)return!1;let a=o.slice(i+Nf.length),l;try{if(l=JSON.parse(a),typeof l!="string")return!1}catch{return!1}let c=`${l}:
|
|
@@ -1856,7 +1856,7 @@ The session marker may be stale or the team may not be registered in this lmctl
|
|
|
1856
1856
|
Consulted ${ri(r,s)}
|
|
1857
1857
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function EI(t){return`unknown option --from
|
|
1858
1858
|
${rj(t)}`}function Nc(t,e){let n=Ap(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function Ap(t,e){let n=t[xf];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let o of e.listRootTeams()){let i;try{i=nn(o.teamfile_path,e)}catch{continue}for(let a of i.members)a.teamfile===void 0&&a.session===n&&r.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Gi=x(()=>{"use strict";vt();Ro();Ht();Nn();rn()});function rs(t){let e=On(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Rc=x(()=>{"use strict";nt()});function Np(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,o=()=>t.dal!==void 0?t.dal:(s===null&&(s=$e({path:Pe(t)})),s),i=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>o().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&et(a.holder_pid)),pollMs:sj,settleMs:oj,maxHoldMs:Cs(n),onHold:()=>U({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{i(),!(!a.held&&a.reason==="cleared")&&U({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function TI(t){let e=t.literalPrompt?t.newMessage:ij(t.newMessage,{newMessageFrom:t.newMessageFrom??aj(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=ye(),s=0,o=0,i=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,i=Buffer.byteLength(c,"utf8"),o+=i),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.registry&&(a.registry=t.registry),t.signal&&(a.signal=t.signal),t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),t.requireResume!==void 0&&(a.requireResume=t.requireResume),t.bundleSession!==void 0&&(a.bundleSession=t.bundleSession),a.holdOpen=Np(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await Hi(a);if(t.requireResume&&l.sessionId!==t.receiver.sessionId)throw Object.assign(new Error(`provider session changed: expected ${t.receiver.sessionId}, received ${l.sessionId??"(missing)"}`),{usage:l.usage,sessionId:l.sessionId});return r&&Ke(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:o,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:i,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:l.status==="empty"?{status:"empty",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:{status:"ok",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}}function ij(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
|
|
1859
|
-
`)}function aj(t){return`${t.teamfile}:${t.alias}`}var
|
|
1859
|
+
`)}function aj(t){return`${t.teamfile}:${t.alias}`}var jQ,sj,oj,Rp=x(()=>{"use strict";Un();re();le();vt();qr();Wt();jQ=60*60*1e3,sj=2e3,oj=5e3});async function Lc(t){let e=t.onEvent??(()=>{}),n=lj(t.io,e),r=null,s=null,o=null,i,a,l=null,c=!1,d=null,u=t.prompt,f,m=()=>{let p=t.signal?.reason;if(o===null||!["SIGINT","SIGTERM","SIGHUP"].includes(p))return;let _;try{_=n.dal??$e({path:Pe(n)}),_.finishTrackedInvocation(o,{status:"cancelled",signal:p,exit_code:p==="SIGINT"?130:p==="SIGTERM"?143:129,error:`prompt holder received ${p}`,team_chat_log_id:l}),s!==null&&_.releaseAgentInflight(s.row,s.leaseId)}catch(h){n.stderr.write(`error: failed to record holder ${p}: ${String(h)}
|
|
1860
1860
|
`)}finally{n.dal===void 0&&_?.close()}};t.signal?.addEventListener("abort",m,{once:!0});try{let p=t.resolvedNativeTarget,_=p!==void 0;if(_&&(t.heldLease===void 0||t.conversation===void 0))throw new ge("native session turns require a caller-held lease and conversation");let h=_?p:await W(n,C=>Xe(t.teamfile,t.alias,C));if(t.expectedSession!==void 0&&(h.provider!==t.expectedSession.provider||h.sessionid!==t.expectedSession.sessionid))throw new ge(`session changed for ${h.alias}; expected ${t.expectedSession.provider}:${t.expectedSession.sessionid}, found ${h.provider}:${h.sessionid}`);if(_&&(t.conversation.provider!==h.provider||t.conversation.sessionId!==h.sessionid))throw new ge("native session changed for "+h.alias+"; expected "+h.provider+":"+h.sessionid+", found "+t.conversation.provider+":"+t.conversation.sessionId);let g=h.teamfile,E=await W(n,C=>Ej(C,t.env??process.env)),y=E.sender,T=_?"native:"+h.provider+":"+h.sessionid:await Tj(n,{explicitRoot:t.rootFlag,sender:y,receiverTeamfile:g,operatorOrigin:E.origin==="operator"}),w=t.env??process.env;if(!_){let C=await W(n,$=>$.getRootTeam(T)?.name??null);C!==null&&(w.LMBEE_TEAM_NAME=C)}if(o=await fj(n,{receiverTeamfile:g,receiverAlias:h.alias,sender:y,rootTeamfile:T,provider:h.provider,model:h.model,sessionId:h.sessionid,cwd:h.sessiondir,prompt:t.prompt,origin:E.origin,parentInvocationId:$s(w.LMCTL_INVOCATION_ID)}),i=_j(n,o),t.signal?.aborted)throw m(),Error("Chat turn cancelled");o!==null&&(w.LMCTL_INVOCATION_ID=String(o));try{_||Xs(n,be(g),g)}catch{}r={root_teamfile:T,sender_teamfile:y?.teamfile??null,sender_alias:y?.alias??null,receiver_teamfile:g,receiver_alias:h.alias,receiver_provider:h.provider,receiver_session_id:h.sessionid,origin:E.origin,message_type:t.messageType??null};let S=await AI(n,g,h.alias);if(S!==null){let C=qi(S);return ss(o,r,t.prompt,C,"unavailable"),d=Lp(C,null),{status:"busy",message:C,teamChatLogId:null}}let I=!1;if(t.heldLease!==void 0){let C=t.heldLease;if(!await W(n,P=>{let q=P.getAgentInflight(g,h.alias);return q===null||q.sender_teamfile!==C.row.sender_teamfile||q.sender_alias!==C.row.sender_alias||q.started_at!==C.row.started_at||q.holder_pid!==process.pid?!1:P.heartbeatAgentInflight(C.row,C.leaseId,new Date().toISOString())})){let P=`bundle lease lost for ${h.alias}: this batch no longer holds the in-flight lease (reclaimed or taken over); aborting before this prompt instead of dispatching unsynchronized`;return ss(o,r,t.prompt,P,"unavailable"),d=Vi(P,null),{status:"error",errorKind:"provider",message:P,teamChatLogId:null,messageId:null}}}else{let C=await cj(n,g,h.alias);if(C.busy){let $=await dj(n,g,h.alias);return $+=await uj(n,g,h.alias),ss(o,r,t.prompt,$,"unavailable"),d=Lp($,null),{status:"busy",message:$,teamChatLogId:null}}I=C.idleReclaim}if(y!==null&&y.teamfile!==g){let C=await W(n,$=>JT($,{root:T,sender:y,receiverTeamfile:g,receiverAlias:h.alias,now:new Date}));if(C.stop){let $=YT(C.chain);return ss(o,r,t.prompt,$,"cycle"),d=Vi($,null),{status:"error",errorKind:"cycle",message:$,teamChatLogId:null,messageId:null}}}if(t.heldLease===void 0){let C=await wj(n,{receiver_teamfile:g,receiver_alias:h.alias,sender_teamfile:y?.teamfile??g,sender_alias:y?.alias??"operator",...I?{force:!0,reclaimReason:"session-idle"}:{}});if(!C.acquired){let $=NI(g,h.alias,C.current);return $+=` ${bp(Ip({holderPid:C.current.holder_pid,since:C.current.started_at}))}`,ss(o,r,t.prompt,$,"unavailable"),d=Lp($,null),{status:"busy",message:$,teamChatLogId:null}}s={row:C.lease,leaseId:C.leaseId},t.onInflightAcquired?.(s),a=Qa($=>W(n,P=>P.heartbeatAgentInflight(s.row,s.leaseId,$)),{intervalMs:bI,onError:$=>{ye()&&Ke(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:$ instanceof Error?$.message:String($)}))}})}if(t.signal?.aborted)throw Error("Chat turn cancelled");f=Va({provider:h.provider,modelRequested:h.model??null,cwd:h.sessiondir,sessionId:h.sessionid}),r&&(r.started_at=f.startedAt);let b=await TI({sender:y??{teamfile:g,alias:"operator"},receiver:{teamfile:g,alias:h.alias,provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.isLead!==void 0?{isLead:h.isLead}:{}},signal:t.signal,newMessage:t.prompt,newMessageFrom:y===null?"operator":`${y.teamfile}:${y.alias}`,..._?{literalPrompt:!0}:{},io:n,permissionMode:t.permissionMode,...t.expectedSession!==void 0?{requireResume:!0}:{},...t.bundleSession!==void 0?{bundleSession:t.bundleSession}:{},...t.conversation!==void 0?{bundleSession:t.conversation}:{},...t.registry!==void 0?{registry:t.registry}:{},env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:C=>e({kind:"delta",chunk:C}),onProgress:C=>e({kind:"progress",alias:h.alias,event:C}),onPromptBuilt:async C=>{u=C,l===null&&(l=await Sj(n,{...r,message:C,usage:f}),l!==null&&(t.onAccepted?.(kn(l)),o!==null&&await hj(n,o,l))),o!==null&&await pj(n,o,C)}});u=b.prompt;let L=b.status==="stalled",O=b.status==="empty",k=null,v=L?`provider stalled${b.stalledAfterMs!==void 0?` after ${b.stalledAfterMs}ms`:""}`:O?"provider returned no content and no observed activity for this turn -- often an upstream failure (rate limit, quota, auth) the provider did not report as an error":b.status==="error"?b.error??b.receipt:null,A=L||O||b.status==="error"?"error":"ok",N=await Jo(f,{status:b.status,sessionId:b.sessionId,usage:b.usage},()=>nf(n),{db:n.dal?.db,dbPath:Pe(n),env:n.env});l!==null?(await SI(n,l,{...r,message:u,response:b.receipt,status:A,error_detail:v,usage:N}),c=!0,k=l):k=await II(n,{...r,message:u,response:b.receipt,status:A,error_detail:v,usage:N});let R=b.status!=="error"?b.warnings:void 0;if(L||O){let C=v;ss(o,r,u,C,"error"),d=Vi(C,k,b.receipt,R)}else d=gj(b.receipt,k,R);return{status:L?"stalled":O?"empty":"ok",replyText:b.receipt,wroteDelta:b.wroteDelta,teamChatLogId:k,messageId:k===null?null:kn(k),durationMs:b.durationMs}}catch(p){let _=p instanceof Error?p.message:String(p),h=p,g=f?await Jo(f,{status:Ls(_,!!t.signal?.aborted),usage:h?.usage,sessionId:h?.sessionId},()=>nf(n),{db:n.dal?.db,dbPath:Pe(n),env:n.env}):void 0;return l!==null&&!c&&r!==null&&(await SI(n,l,{...r,message:u,response:null,status:"error",error_detail:_,usage:g}),c=!0),l===null&&r!==null&&g&&(l=await II(n,{...r,message:u,response:null,status:"error",error_detail:_,usage:g})),ss(o,r,u,_,"error"),d={...Vi(_,l),signal:p?.signal??null,exit_code:p?.exitCode??null},{status:"error",errorKind:p instanceof ge?"target":"provider",message:_,teamChatLogId:l,messageId:l===null?null:kn(l)}}finally{t.signal?.removeEventListener("abort",m),i!==void 0&&clearInterval(i),a!==void 0&&clearInterval(a),l!==null&&await Ij(n,r,kn(l)),s!==null&&await vj(n,s.row,s.leaseId)&&t.onInflightReleased?.(s.leaseId),o!==null&&await mj(n,o,d??Vi("chat turn exited without a terminal outcome",null))}}function lj(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function cj(t,e,n){let r=await W(t,o=>(bl(o,e,n),Zt(o,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await W(t,o=>uI(o,r,e,n));return{busy:!s,idleReclaim:s}}async function dj(t,e,n){let r=await AI(t,e,n);if(r!==null)return qi(r);let s=await W(t,o=>o.getAgentInflight(e,n));return s!==null?NI(e,n,s):`${n} is busy; wait and retry`}async function uj(t,e,n){let r=await W(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${bp(Ip({holderPid:r.holder_pid,since:r.started_at}))}`}async function fj(t,e){try{return(await W(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:yj(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ye()&&Ke(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function mj(t,e,n){try{await W(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ye()&&Ke(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function pj(t,e,n){try{await W(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ye()&&Ke(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function hj(t,e,n){try{await W(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ye()&&Ke(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function _j(t,e){if(e===null)return;let n=setInterval(()=>{W(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ye()&&Ke(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},bI);return n.unref?.(),n}function kI(t){return t!==void 0&&t.length>0?{config_warnings:JSON.stringify(t)}:{}}function gj(t,e,n){return{status:"done",result_summary:xc(t),error:null,team_chat_log_id:e,...kI(n)}}function Lp(t,e){return{status:"busy",result_summary:xc(t),error:t,team_chat_log_id:e}}function Vi(t,e,n,r){return{status:"error",result_summary:n===void 0?rT(t,500):xc(n),error:t,team_chat_log_id:e,...kI(r)}}function xc(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function yj(t,e,n){return`lmctl prompt ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function Ej(t,e){let n=Nc(e,t);if(n.ok)return{sender:rs(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(ns("chat",e,t))}async function Tj(t,e){if(e.explicitRoot!==void 0)return await W(t,r=>Ne(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await W(t,r=>KT(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function wj(t,e){return await W(t,n=>{let r=ye(),s=tr(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ar(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&Ke(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:vI(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&Ke(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:vI(s.current)})),{acquired:!1,current:s.current})})}async function AI(t,e,n){return await W(t,r=>{for(let o=0;o<2;o+=1){let i=r.getTerminalLock(e,n);if(i===null)return null;if(kp(i).live)return i;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,i.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:kp(s).live?s:null})}function vI(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function vj(t,e,n){try{return await W(t,r=>r.releaseAgentInflight(e,n))}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
|
|
1861
1861
|
`)}return!1}function NI(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function Sj(t,e){let n=Ji(e.message);try{return await W(t,r=>r.beginTeamChatLog({usage:e.usage,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,message_type:e.message_type??null,created_at:e.started_at??new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
|
|
1862
1862
|
`),null}}async function SI(t,e,n){let r=Ji(n.message),s=n.response===null?null:Ji(n.response);try{await W(t,o=>o.finishTeamChatLog(e,{usage:n.usage,root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(o){t.stderr.write(`warning: failed to finish chat log ${e}: ${o instanceof Error?o.message:String(o)}
|
|
@@ -1866,15 +1866,15 @@ ${rj(t)}`}function Nc(t,e){let n=Ap(t,e);return n.ok?{ok:!0,identity:n.identity,
|
|
|
1866
1866
|
${n.map((s,o)=>` ${o+1}) ${s}`).join(`
|
|
1867
1867
|
`)}
|
|
1868
1868
|
`);;){let s=await this.ask("Choose a number or exact value: "),o=n.filter(i=>i.toLowerCase()===s.toLowerCase());if(o.length===1)return o[0];if(/^[1-9]\d*$/.test(s)&&Number(s)<=n.length)return n[Number(s)-1];this.io.stderr.write(`Choose one of the listed values.
|
|
1869
|
-
`)}}close(){this.rl?.close()}}});function Oc(t){return/\S\s+\S/u.test(t)}function LI(t){let[e,...n]=t;if(!e||e.startsWith("-"))return null;if(/\.lms$/i.test(e))return{kind:"script",file:e,rest:n};if(n.some(o=>["--force","-f","--yes","-y"].includes(o)))throw new Error("Force/yes flags are not allowed in inferred mode; destructive changes require confirmation.");if(n.some(o=>o.startsWith("-")&&!Oc(o)))throw new Error("Use an explicit command for options; no inferred action was taken.");if(/\.lmb$/i.test(e))return{kind:"batch",file:e,rest:n};let r=On(e)??(e.endsWith(":")&&xe(e.slice(0,-1))?{teamfile:e.slice(0,-1),alias:""}:null);if(r||xe(e)){let o=r?.teamfile??e,i=r?.alias,a=[...n];return!i&&a.length&&!Oc(a[0])&&(i=a.shift()),{kind:"team",file:o,...i!==void 0?{alias:i}:{},...a.length?a.some(Oc)?{prompt:a.join(" ")}:{pendingPrompt:a.join(" ")}:{}}}let s=n.length?n.some(Oc)?{prompt:n.join(" ")}:{pendingPrompt:n.join(" ")}:{};return ff(e)?{kind:"session",id:e,...s}:{kind:"models",query:e,...s}}function Dc(t,e){let n=t.toLowerCase(),r=e.filter(s=>s.toLowerCase()===n);return[...new Set(r.length?r:e.filter(s=>s.toLowerCase().startsWith(n)))]}var xI=x(()=>{"use strict";Be();nt()});import{spawnSync as Pp}from"node:child_process";import{existsSync as OI,readFileSync as DI}from"node:fs";import{homedir as MI}from"node:os";import{resolve as Mp}from"node:path";function ao(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function Aj(){let t=Pp("agy",["models"],{encoding:"utf-8",timeout:kj});return{status:t.status,stdout:t.stdout??"",error:t.error}}function Nj(t){let e=[],n={};for(let r of t.split(/\r?\n/)){let s=r.trim(),o=s.indexOf(" ");if(o<0)continue;let i=s.slice(0,o).trim(),a=s.slice(o+1).trim();i&&(e.push(i),a&&(n[i]=a))}return{models:e,displayNames:n}}function os(t){if(!t&&Cp)return Cp;let e=o=>(t||(Cp=o),o),n;try{n=(t??Aj)()}catch(o){return e({available:!1,models:[],reason:o instanceof Error?ao("agy models",o):`agy models could not be run: ${String(o)}`})}if(n.error)return e({available:!1,models:[],reason:ao("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let{models:r,displayNames:s}=Nj(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r,displayNames:s})}function Lj(){let t=Pp("codex",["debug","models"],{encoding:"utf-8",timeout:Rj});return{status:t.status,stdout:t.stdout??"",error:t.error}}function xj(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:o,visibility:i}=s;typeof o=="string"&&i==="list"&&r.push(o)}return r}function is(t){if(!t&&Op)return Op;let e=s=>(t||(Op=s),s),n;try{n=(t??Lj)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?ao("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:ao("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=xj(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function Oj(t){let e=Pp("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:Cj});return{status:e.status,stdout:e.stdout??"",error:e.error}}function Up(t,e){if(!e&&Dp.has(t))return Dp.get(t);let n=i=>(e||Dp.set(t,i),i),r=t?`opencode models ${t}`:"opencode models",s;try{s=(e??Oj)(t)}catch(i){return n({available:!1,models:[],reason:i instanceof Error?ao(r,i):`${r} could not be run: ${String(i)}`})}if(s.error)return n({available:!1,models:[],reason:ao(r,s.error)});if(s.status!==0)return n({available:!1,models:[],reason:`${r} exited with status ${s.status??"unknown"}`});let o=s.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0);return o.length===0?n({available:!1,models:[],reason:`${r} returned no models`}):n({available:!0,models:o})}function Fp(t,e={}){let n=[];for(let r of t){let s=r.provider.trim().toLowerCase();if(r.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&s!=="muse"&&n.push(`[${r.alias}] effort="${r.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&r.effort&&n.push(`[${r.alias}] effort="${r.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),s==="copilot"){if(!r.model)continue;n.push(`[${r.alias}] model="${r.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(r.effort&&!r.model&&n.push(`[${r.alias}] effort="${r.effort}" has no effect without model= on an opencode member.`),!r.model)continue;let o=Mj(e.opencodeConfigPath);if(!o.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for opencode: ${o.reason}.`);continue}if(o.models.includes(r.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(r.model))continue;if(!r.model.includes("/")){let l=o.models.filter(c=>c.endsWith(`/${r.model}`));n.push(l.length>0?`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${r.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let i=r.model.slice(0,r.model.indexOf("/")),a=Up(i,e.opencodeModelsRunner);if(a.available&&a.models.includes(r.model))continue;if(a.available&&!a.models.includes(r.model)){n.push(`[${r.alias}] model="${r.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${i}" (checked \`opencode models ${i}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${i}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${r.alias}] model="${r.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(s==="kimi"){if(!r.model)continue;let o=as(e.kimiConfigPath);o.available?o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not declared in Kimi's [models] config. Valid configured models: ${Ki(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for kimi: ${o.reason}.`);continue}if(s==="agy"){if(!r.model)continue;let o=os(e.agyModelsRunner);o.available?o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${Ki(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for agy: ${o.reason}.`);continue}if(s==="dsh"){if(!r.model||io.includes(r.model))continue;oo.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in dsh's built-in catalog. Valid pinned models: ${Ki(oo)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${Ki(io)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(s==="hermes"){if(!r.model)continue;let o=r.model.indexOf(":");(o<=0||o===r.model.length-1)&&n.push(`[${r.alias}] model="${r.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(s!=="pi"){if(s==="codex"){if(!r.model)continue;r.model===CI&&n.push(`[${r.alias}] model="${CI}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let o=is(e.codexModelsRunner);if(!o.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for codex: ${o.reason}.`);continue}o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${Ki(o.models)}`);continue}r.model&&($I.has(s)||n.push(`[${r.alias}] model="${r.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return n}async function PI(t,e={}){let n=t.filter(i=>i.model!==void 0&&$I.has(i.provider.trim().toLowerCase()));if(n.length===0)return{warnings:[],errors:[]};let r=e.snapshot??await Tt();if(r.catalog===null)return{warnings:[],errors:[]};let s=[],o=[];for(let i of n){let a=i.provider.trim().toLowerCase(),l=i.model,c=Ga(a,l,r.catalog,r.aliases);if(c.kind==="unknown"){let d=jy(r.catalog,a)??0;s.push(`[${i.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${d} known) -- not necessarily wrong: may be a model too new for lmprice to have published yet, or a typo. A matching lmprice catalog/alias entry would resolve this; lint cannot otherwise confirm whether ${a} accepts it.`)}else c.kind==="wrong-provider"?o.push({field:i.alias,message:`model "${l}" is not offered by provider "${a}" -- it is a recognized model, but only under: ${c.otherProviders.join(", ")}. Declare provider="${c.otherProviders[0]}" (or another listed provider), or use a model "${a}" actually offers.`}):c.kind==="known-unpriced"&&s.push(`[${i.alias}] model "${l}" is recognized in the lmprice catalog but has no price information \u2014 cost will be unavailable`);if(a==="claude"&&(c.kind==="priced"||c.kind==="known-unpriced"||c.kind==="estimated")&&bj.test(l)){let d=l.replace(/(\d)\.(?=\d)/g,"$1-");s.push(`[${i.alias}] model="${l}" matches the lmprice catalog only through its OpenRouter-style spelling ("." between version numbers); claude's own CLI expects "-" there and does an exact match, so it may reject this string verbatim even though lint recognizes it. If seed/chat fails with "issue with the selected model," try model="${d}" instead.`)}}return{warnings:s,errors:o}}async function UI(t,e={}){return(await PI(t,e)).warnings}async function FI(t,e={}){return(await PI(t,e)).errors}function as(t){let e=process.env.KIMI_CODE_HOME||Mp(MI(),".kimi-code"),n=t??Mp(e,"config.toml");if(!OI(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=DI(n,"utf-8")}catch(o){return{available:!1,models:[],reason:`${n} could not be read: ${o instanceof Error?o.message:String(o)}`}}let s=new Set;for(let o of r.split(/\r?\n/)){if(/^\s*\[/.test(o)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(o))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let i=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(o);if(!i)continue;let a=Dj(i[1]);if(i[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s]}}function Dj(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function Mj(t){let e=t??Mp(MI(),".config","opencode","opencode.json");if(!OI(e))return{available:!0,models:[]};let n;try{n=JSON.parse(DI(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:$j(n)}}function $j(t){if(!$p(t))return[];let e=Mc(t.provider)??Mc(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!$p(s))continue;let o=Mc(s.models)??Mc(s.model);if(o)for(let i of Object.keys(o))n.add(i.startsWith(`${r}/`)?i:`${r}/${i}`)}return[...n].sort()}function Mc(t){return $p(t)?t:null}function $p(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ki(t){return t.length>0?t.join(", "):"(none)"}var $I,bj,oo,io,CI,kj,Cp,Rj,Op,Cj,Dp,lo=x(()=>{"use strict";zt();Hr();$I=new Set(Object.keys(Qt).filter(t=>t!=="codex"&&t!=="kimi")),bj=/\d\.(?=\d)/,oo=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],io=["deepseek-flash","deepseek-pro"],CI="gpt-5.3-codex-spark",kj=15e3;Cp=null;Rj=5e3;Op=null;Cj=5e3;Dp=new Map});function $c(t){return["agy","opencode","copilot","hermes","pi","lmplayer","miniplayer"].includes(t)}function jI(t){if(!/(?:^|[/:])(?:gpt-|o\d(?:-|$)|chatgpt-|claude[ -]|gemini[ -])/i.test(t))return!1;let e=/claude/i.test(t)?"claude":/gemini/i.test(t)?"gemini":"codex";return Qt[e].isChatModel({source:"",source_model_id:t,pricing:{input_per_1m_tokens:null,output_per_1m_tokens:null,input_cache_read_per_1m_tokens:null}})}function Pj(t,e){let n=[];for(let r of e.records){let s=r.source_model_id,o;if(t==="copilot")r.provider==="github_copilot"&&s.startsWith("github_copilot/")&&(o=s.slice(15));else if(["hermes","pi","lmplayer","miniplayer"].includes(t))r.source==="openrouter"&&/^(openai|anthropic|google)\//.test(s)&&(o=t==="hermes"?`openrouter:${s}`:t==="pi"?`openrouter/${s}`:s);else{let i={claude:"anthropic",gemini:"gemini",qwen:"dashscope"}[t],a=Qt[t];if(i&&r.source==="litellm"&&r.provider===i&&a?.coversRecord(r)){o=s.startsWith(`${i}/`)?s.slice(i.length+1):s;let l=t==="claude"?"claude-":t==="gemini"?"gemini-":"qwen";(o.includes("/")||!o.startsWith(l))&&(o=void 0)}}!o||r.mode!=null&&r.mode!=="chat"||o.includes(":batch")||o.includes(":free")||$c(t)&&!jI(o)||n.push(o)}return[...new Set(n)].sort()}async function Pc(t){let e;switch(t){case"dsh":e=[...io,...oo];break;case"codex":e=is().models;break;case"agy":e=os().models;break;case"kimi":e=as().models;break;case"opencode":e=Up("").models;break;default:{let{catalog:n}=await Tt();e=n?Pj(t,n):[]}}return[...new Set(e.filter(n=>!$c(t)||jI(n)))].sort()}var jp=x(()=>{"use strict";zt();Hr();lo()});var qI={};me(qI,{MODEL_PROVIDERS:()=>jn,knownModelNames:()=>co,runModels:()=>Uc});function BI(t,e){switch(t){case"codex":return is();case"agy":return os();case"kimi":return as();case"claude":{let n=e.catalog?.records??[],r=n.flatMap(o=>o.native?.claude_code&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(o.native.claude_code)?[o.native.claude_code]:[]),s=r.length?r:n.flatMap(o=>{let i=o.source_model_id.split("/").at(-1);return o.provider==="anthropic"&&o.mode==="chat"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(i)?[i]:[]});return s.length?{available:!0,models:[...new Set(s)]}:{available:!1,models:[],reason:"No Claude Code ids in the available catalog"}}default:return{available:!1,models:[]}}}async function co(t){if(!jn.includes(t))return Pc(t);let e=t==="claude"?await Tt():{catalog:null,aliases:null,source:"unavailable",generatedAt:null};return BI(t,e).models}function Wp(t,e){return t==="agy"?e.replace(/-(low|medium|high)$/i,""):e}function Hp(t,e,n){if(!jn.includes(t)||!n.catalog)return;let r=Fj[t],s=Wp(t,e);return n.catalog.records.find(o=>o.native?.[r]===s)}function Yi(t,e,n){let r=wt(t,e,n.catalog,n.aliases).state;return r.kind==="priced"||r.kind==="estimated"||r.kind==="known-unpriced"}function jj(t,e,n){if(Hp(t,e,n))return!0;let r=XI(t,e,n)?.state;return r?.kind==="priced"||r?.kind==="estimated"||r?.kind==="known-unpriced"}function Wj(t,e,n){let r=n.catalog?.records??[];if(t==="claude"||!n.catalog)return[];let s=new Set;if(t==="codex")for(let i of r)if(i.native?.codex)s.add(i.native.codex);else{let a=i.source_model_id.split("/").at(-1);/^(?:gpt-|o\d|chatgpt|ft:gpt)/i.test(a)&&Yi("codex",a,n)&&s.add(a)}else if(t==="agy"){let i=new Set;for(let a of r){if(a.native?.agy){i.add(Wp("agy",a.native.agy));continue}if(a.mode!=="chat")continue;let l=a.source_model_id.split("/").at(-1);(/^gemini-\d/.test(l)?Yi("gemini",l,n):a.provider==="anthropic"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(l)?Yi("claude",l,n):/^gpt-oss-\d/.test(l)?Yi("codex",l,n):!1)&&i.add(l)}for(let a of i)for(let l of["low","medium","high"])s.add(`${a}-${l}`)}else if(t==="kimi"){for(let i of r)i.native?.kimi&&s.add(i.native.kimi);for(let i of r){if(i.native?.kimi)continue;let a=i.source_model_id.split("/").at(-1),l=a.startsWith("kimi-")?`kimi-code/${a.slice(5)}`:a;/^kimi-code\/[a-z0-9][a-z0-9._-]*$/i.test(l)&&Yi("kimi",l,n)&&s.add(l)}}let o=new Set(e);return[...s].filter(i=>!o.has(i)&&jj(t,i,n))}function XI(t,e,n){if(!n.catalog)return null;if(Hp(t,e,n)||t!=="agy")return wt(t,e,n.catalog,n.aliases);let s=Wp("agy",e);if(!/^(?:gemini-\d|claude-[a-z]+-\d|gpt-oss-\d)/.test(s))return null;let o=n.catalog.records.map(i=>{let a=i.source_model_id.split("/").at(-1).toLowerCase();return i.mode!=="chat"||a!==s.toLowerCase()?i:{...i,native:{...i.native,agy:s}}});return wt("agy",s,{...n.catalog,records:o},n.aliases)}function HI(t,e,n,r,s){let o=Hp(t,e,r),i=XI(t,e,r),a=i?.offer??null,l=i?.state,c=l?.kind==="priced"||l?.kind==="estimated"?l.model.id:l?.kind==="known-unpriced"?l.id:null;return{id:e,display_name:n,status:s,catalog_model:o?.source_model_id??c,pricing:{input_per_1m_tokens:a?.pricing.input_per_1m_tokens??null,output_per_1m_tokens:a?.pricing.output_per_1m_tokens??null,input_cache_read_per_1m_tokens:a?.pricing.input_cache_read_per_1m_tokens??null},price_resolution:l?.kind??(r.catalog?"unknown":"no-catalog"),price_source_model_id:a?.sourceModelId??null,price_estimated:a?.estimated??!1}}async function Uc(t,e,n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(WI),0;let r=ae(t,[],["--old","--json"]),s=r.positionals.find(u=>u!=="all"&&!jn.includes(u)),o=r.error??(s===void 0?void 0:`unknown provider: ${s} (valid targets: all, ${jn.join(", ")})`);if(o!==void 0)return e.stderr.write(`error: ${o}
|
|
1869
|
+
`)}}close(){this.rl?.close()}}});function Oc(t){return/\S\s+\S/u.test(t)}function LI(t){let[e,...n]=t;if(!e||e.startsWith("-"))return null;if(/\.lms$/i.test(e))return{kind:"script",file:e,rest:n};if(n.some(o=>["--force","-f","--yes","-y"].includes(o)))throw new Error("Force/yes flags are not allowed in inferred mode; destructive changes require confirmation.");if(n.some(o=>o.startsWith("-")&&!Oc(o)))throw new Error("Use an explicit command for options; no inferred action was taken.");if(/\.lmb$/i.test(e))return{kind:"batch",file:e,rest:n};let r=On(e)??(e.endsWith(":")&&xe(e.slice(0,-1))?{teamfile:e.slice(0,-1),alias:""}:null);if(r||xe(e)){let o=r?.teamfile??e,i=r?.alias,a=[...n];return!i&&a.length&&!Oc(a[0])&&(i=a.shift()),{kind:"team",file:o,...i!==void 0?{alias:i}:{},...a.length?a.some(Oc)?{prompt:a.join(" ")}:{pendingPrompt:a.join(" ")}:{}}}let s=n.length?n.some(Oc)?{prompt:n.join(" ")}:{pendingPrompt:n.join(" ")}:{};return ff(e)?{kind:"session",id:e,...s}:{kind:"models",query:e,...s}}function Dc(t,e){let n=t.toLowerCase(),r=e.filter(s=>s.toLowerCase()===n);return[...new Set(r.length?r:e.filter(s=>s.toLowerCase().startsWith(n)))]}var xI=x(()=>{"use strict";Be();nt()});import{spawnSync as Pp}from"node:child_process";import{existsSync as OI,readFileSync as DI}from"node:fs";import{homedir as MI}from"node:os";import{resolve as Mp}from"node:path";function ao(t,e){return e.code==="ETIMEDOUT"?`${t} did not respond within lint's own spawn timeout (${e.message}) \u2014 this does not mean the provider itself is unreachable, only that this specific check didn't finish in time.`:`${t} could not be run: ${e.message}`}function Aj(){let t=Pp("agy",["models"],{encoding:"utf-8",timeout:kj});return{status:t.status,stdout:t.stdout??"",error:t.error}}function Rj(t){let e=[],n={};for(let r of t.split(/\r?\n/)){let s=r.trim(),o=s.indexOf(" ");if(o<0)continue;let i=s.slice(0,o).trim(),a=s.slice(o+1).trim();i&&(e.push(i),a&&(n[i]=a))}return{models:e,displayNames:n}}function os(t){if(!t&&Cp)return Cp;let e=o=>(t||(Cp=o),o),n;try{n=(t??Nj??Aj)()}catch(o){return e({available:!1,models:[],reason:o instanceof Error?ao("agy models",o):`agy models could not be run: ${String(o)}`})}if(n.error)return e({available:!1,models:[],reason:ao("agy models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let{models:r,displayNames:s}=Rj(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r,displayNames:s})}function xj(){let t=Pp("codex",["debug","models"],{encoding:"utf-8",timeout:Lj});return{status:t.status,stdout:t.stdout??"",error:t.error}}function Oj(t){let e;try{e=JSON.parse(t)}catch{return}let n=e.models;if(!Array.isArray(n))return;let r=[];for(let s of n){if(!s||typeof s!="object")continue;let{slug:o,visibility:i}=s;typeof o=="string"&&i==="list"&&r.push(o)}return r}function is(t){if(!t&&Op)return Op;let e=s=>(t||(Op=s),s),n;try{n=(t??Cj??xj)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?ao("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:ao("codex debug models",n.error)});if(n.status!==0)return e({available:!1,models:[],reason:`codex debug models exited with status ${n.status??"unknown"}`});let r=Oj(n.stdout);return r===void 0?e({available:!1,models:[],reason:"codex debug models did not return parseable JSON"}):r.length===0?e({available:!1,models:[],reason:"codex debug models returned no user-visible models"}):e({available:!0,models:r})}function Mj(t){let e=Pp("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:Dj});return{status:e.status,stdout:e.stdout??"",error:e.error}}function Up(t,e){if(!e&&Dp.has(t))return Dp.get(t);let n=i=>(e||Dp.set(t,i),i),r=t?`opencode models ${t}`:"opencode models",s;try{s=(e??Mj)(t)}catch(i){return n({available:!1,models:[],reason:i instanceof Error?ao(r,i):`${r} could not be run: ${String(i)}`})}if(s.error)return n({available:!1,models:[],reason:ao(r,s.error)});if(s.status!==0)return n({available:!1,models:[],reason:`${r} exited with status ${s.status??"unknown"}`});let o=s.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0);return o.length===0?n({available:!1,models:[],reason:`${r} returned no models`}):n({available:!0,models:o})}function Fp(t,e={}){let n=[];for(let r of t){let s=r.provider.trim().toLowerCase();if(r.effort&&s!=="opencode"&&s!=="lmplayer"&&s!=="qwen"&&s!=="muse"&&n.push(`[${r.alias}] effort="${r.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),s==="qwen"&&r.effort&&n.push(`[${r.alias}] effort="${r.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),s==="copilot"){if(!r.model)continue;n.push(`[${r.alias}] model="${r.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(s!=="lmplayer"){if(s==="opencode"){if(r.effort&&!r.model&&n.push(`[${r.alias}] effort="${r.effort}" has no effect without model= on an opencode member.`),!r.model)continue;let o=Pj(e.opencodeConfigPath);if(!o.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for opencode: ${o.reason}.`);continue}if(o.models.includes(r.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(r.model))continue;if(!r.model.includes("/")){let l=o.models.filter(c=>c.endsWith(`/${r.model}`));n.push(l.length>0?`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${r.alias}] model="${r.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${r.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}let i=r.model.slice(0,r.model.indexOf("/")),a=Up(i,e.opencodeModelsRunner);if(a.available&&a.models.includes(r.model))continue;if(a.available&&!a.models.includes(r.model)){n.push(`[${r.alias}] model="${r.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${i}" (checked \`opencode models ${i}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${i}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${r.alias}] model="${r.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(s==="kimi"){if(!r.model)continue;let o=as(e.kimiConfigPath);o.available?o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not declared in Kimi's [models] config. Valid configured models: ${Ki(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for kimi: ${o.reason}.`);continue}if(s==="agy"){if(!r.model)continue;let o=os(e.agyModelsRunner);o.available?o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${Ki(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for agy: ${o.reason}.`);continue}if(s==="dsh"){if(!r.model||io.includes(r.model))continue;oo.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in dsh's built-in catalog. Valid pinned models: ${Ki(oo)}. Valid server-resolved aliases (DeepSeek resolves these to its current model server-side -- pinning to a specific version instead is a DOWNGRADE, not a safer choice): ${Ki(io)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(s==="hermes"){if(!r.model)continue;let o=r.model.indexOf(":");(o<=0||o===r.model.length-1)&&n.push(`[${r.alias}] model="${r.model}" should use <provider>:<model> from Hermes's ACP catalog. lmctl checks the shape only; provider and model availability are resolved by Hermes.`);continue}if(s!=="pi"){if(s==="codex"){if(!r.model)continue;r.model===CI&&n.push(`[${r.alias}] model="${CI}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let o=is(e.codexModelsRunner);if(!o.available){n.push(`[${r.alias}] model="${r.model}" cannot be verified for codex: ${o.reason}.`);continue}o.models.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in codex's live model catalog (\`codex debug models\`). Valid models: ${Ki(o.models)}`);continue}r.model&&($I.has(s)||n.push(`[${r.alias}] model="${r.model}" cannot be verified for provider "${s}": no model validation path exists for this provider.`))}}}return n}async function PI(t,e={}){let n=t.filter(i=>i.model!==void 0&&$I.has(i.provider.trim().toLowerCase()));if(n.length===0)return{warnings:[],errors:[]};let r=e.snapshot??await Tt();if(r.catalog===null)return{warnings:[],errors:[]};let s=[],o=[];for(let i of n){let a=i.provider.trim().toLowerCase(),l=i.model,c=Ga(a,l,r.catalog,r.aliases);if(c.kind==="unknown"){let d=jy(r.catalog,a)??0;s.push(`[${i.alias}] model "${l}" is unknown to the lmprice catalog for provider "${a}" (${d} known) -- not necessarily wrong: may be a model too new for lmprice to have published yet, or a typo. A matching lmprice catalog/alias entry would resolve this; lint cannot otherwise confirm whether ${a} accepts it.`)}else c.kind==="wrong-provider"?o.push({field:i.alias,message:`model "${l}" is not offered by provider "${a}" -- it is a recognized model, but only under: ${c.otherProviders.join(", ")}. Declare provider="${c.otherProviders[0]}" (or another listed provider), or use a model "${a}" actually offers.`}):c.kind==="known-unpriced"&&s.push(`[${i.alias}] model "${l}" is recognized in the lmprice catalog but has no price information \u2014 cost will be unavailable`);if(a==="claude"&&(c.kind==="priced"||c.kind==="known-unpriced"||c.kind==="estimated")&&bj.test(l)){let d=l.replace(/(\d)\.(?=\d)/g,"$1-");s.push(`[${i.alias}] model="${l}" matches the lmprice catalog only through its OpenRouter-style spelling ("." between version numbers); claude's own CLI expects "-" there and does an exact match, so it may reject this string verbatim even though lint recognizes it. If seed/chat fails with "issue with the selected model," try model="${d}" instead.`)}}return{warnings:s,errors:o}}async function UI(t,e={}){return(await PI(t,e)).warnings}async function FI(t,e={}){return(await PI(t,e)).errors}function as(t){let e=process.env.KIMI_CODE_HOME||Mp(MI(),".kimi-code"),n=t??Mp(e,"config.toml");if(!OI(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=DI(n,"utf-8")}catch(o){return{available:!1,models:[],reason:`${n} could not be read: ${o instanceof Error?o.message:String(o)}`}}let s=new Set;for(let o of r.split(/\r?\n/)){if(/^\s*\[/.test(o)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(o))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let i=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(o);if(!i)continue;let a=$j(i[1]);if(i[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s]}}function $j(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function Pj(t){let e=t??Mp(MI(),".config","opencode","opencode.json");if(!OI(e))return{available:!0,models:[]};let n;try{n=JSON.parse(DI(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:Uj(n)}}function Uj(t){if(!$p(t))return[];let e=Mc(t.provider)??Mc(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!$p(s))continue;let o=Mc(s.models)??Mc(s.model);if(o)for(let i of Object.keys(o))n.add(i.startsWith(`${r}/`)?i:`${r}/${i}`)}return[...n].sort()}function Mc(t){return $p(t)?t:null}function $p(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ki(t){return t.length>0?t.join(", "):"(none)"}var $I,bj,oo,io,CI,kj,Cp,Nj,Lj,Op,Cj,Dj,Dp,lo=x(()=>{"use strict";zt();Hr();$I=new Set(Object.keys(Qt).filter(t=>t!=="codex"&&t!=="kimi")),bj=/\d\.(?=\d)/,oo=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],io=["deepseek-flash","deepseek-pro"],CI="gpt-5.3-codex-spark",kj=15e3;Cp=null;Lj=5e3;Op=null;Dj=5e3;Dp=new Map});function $c(t){return["agy","opencode","copilot","hermes","pi","lmplayer","miniplayer"].includes(t)}function jI(t){if(!/(?:^|[/:])(?:gpt-|o\d(?:-|$)|chatgpt-|claude[ -]|gemini[ -])/i.test(t))return!1;let e=/claude/i.test(t)?"claude":/gemini/i.test(t)?"gemini":"codex";return Qt[e].isChatModel({source:"",source_model_id:t,pricing:{input_per_1m_tokens:null,output_per_1m_tokens:null,input_cache_read_per_1m_tokens:null}})}function Fj(t,e){let n=[];for(let r of e.records){let s=r.source_model_id,o;if(t==="copilot")r.provider==="github_copilot"&&s.startsWith("github_copilot/")&&(o=s.slice(15));else if(["hermes","pi","lmplayer","miniplayer"].includes(t))r.source==="openrouter"&&/^(openai|anthropic|google)\//.test(s)&&(o=t==="hermes"?`openrouter:${s}`:t==="pi"?`openrouter/${s}`:s);else{let i={claude:"anthropic",gemini:"gemini",qwen:"dashscope"}[t],a=Qt[t];if(i&&r.source==="litellm"&&r.provider===i&&a?.coversRecord(r)){o=s.startsWith(`${i}/`)?s.slice(i.length+1):s;let l=t==="claude"?"claude-":t==="gemini"?"gemini-":"qwen";(o.includes("/")||!o.startsWith(l))&&(o=void 0)}}!o||r.mode!=null&&r.mode!=="chat"||o.includes(":batch")||o.includes(":free")||$c(t)&&!jI(o)||n.push(o)}return[...new Set(n)].sort()}async function Pc(t){let e;switch(t){case"dsh":e=[...io,...oo];break;case"codex":e=is().models;break;case"agy":e=os().models;break;case"kimi":e=as().models;break;case"opencode":e=Up("").models;break;default:{let{catalog:n}=await Tt();e=n?Fj(t,n):[]}}return[...new Set(e.filter(n=>!$c(t)||jI(n)))].sort()}var jp=x(()=>{"use strict";zt();Hr();lo()});var qI={};me(qI,{MODEL_PROVIDERS:()=>jn,knownModelNames:()=>co,runModels:()=>Uc});function BI(t,e){switch(t){case"codex":return is();case"agy":return os();case"kimi":return as();case"claude":{let n=e.catalog?.records??[],r=n.flatMap(o=>o.native?.claude_code&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(o.native.claude_code)?[o.native.claude_code]:[]),s=r.length?r:n.flatMap(o=>{let i=o.source_model_id.split("/").at(-1);return o.provider==="anthropic"&&o.mode==="chat"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(i)?[i]:[]});return s.length?{available:!0,models:[...new Set(s)]}:{available:!1,models:[],reason:"No Claude Code ids in the available catalog"}}default:return{available:!1,models:[]}}}async function co(t){if(!jn.includes(t))return Pc(t);let e=t==="claude"?await Tt():{catalog:null,aliases:null,source:"unavailable",generatedAt:null};return BI(t,e).models}function Wp(t,e){return t==="agy"?e.replace(/-(low|medium|high)$/i,""):e}function Hp(t,e,n){if(!jn.includes(t)||!n.catalog)return;let r=Wj[t],s=Wp(t,e);return n.catalog.records.find(o=>o.native?.[r]===s)}function Yi(t,e,n){let r=wt(t,e,n.catalog,n.aliases).state;return r.kind==="priced"||r.kind==="estimated"||r.kind==="known-unpriced"}function Hj(t,e,n){if(Hp(t,e,n))return!0;let r=XI(t,e,n)?.state;return r?.kind==="priced"||r?.kind==="estimated"||r?.kind==="known-unpriced"}function Bj(t,e,n){let r=n.catalog?.records??[];if(t==="claude"||!n.catalog)return[];let s=new Set;if(t==="codex")for(let i of r)if(i.native?.codex)s.add(i.native.codex);else{let a=i.source_model_id.split("/").at(-1);/^(?:gpt-|o\d|chatgpt|ft:gpt)/i.test(a)&&Yi("codex",a,n)&&s.add(a)}else if(t==="agy"){let i=new Set;for(let a of r){if(a.native?.agy){i.add(Wp("agy",a.native.agy));continue}if(a.mode!=="chat")continue;let l=a.source_model_id.split("/").at(-1);(/^gemini-\d/.test(l)?Yi("gemini",l,n):a.provider==="anthropic"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(l)?Yi("claude",l,n):/^gpt-oss-\d/.test(l)?Yi("codex",l,n):!1)&&i.add(l)}for(let a of i)for(let l of["low","medium","high"])s.add(`${a}-${l}`)}else if(t==="kimi"){for(let i of r)i.native?.kimi&&s.add(i.native.kimi);for(let i of r){if(i.native?.kimi)continue;let a=i.source_model_id.split("/").at(-1),l=a.startsWith("kimi-")?`kimi-code/${a.slice(5)}`:a;/^kimi-code\/[a-z0-9][a-z0-9._-]*$/i.test(l)&&Yi("kimi",l,n)&&s.add(l)}}let o=new Set(e);return[...s].filter(i=>!o.has(i)&&Hj(t,i,n))}function XI(t,e,n){if(!n.catalog)return null;if(Hp(t,e,n)||t!=="agy")return wt(t,e,n.catalog,n.aliases);let s=Wp("agy",e);if(!/^(?:gemini-\d|claude-[a-z]+-\d|gpt-oss-\d)/.test(s))return null;let o=n.catalog.records.map(i=>{let a=i.source_model_id.split("/").at(-1).toLowerCase();return i.mode!=="chat"||a!==s.toLowerCase()?i:{...i,native:{...i.native,agy:s}}});return wt("agy",s,{...n.catalog,records:o},n.aliases)}function HI(t,e,n,r,s){let o=Hp(t,e,r),i=XI(t,e,r),a=i?.offer??null,l=i?.state,c=l?.kind==="priced"||l?.kind==="estimated"?l.model.id:l?.kind==="known-unpriced"?l.id:null;return{id:e,display_name:n,status:s,catalog_model:o?.source_model_id??c,pricing:{input_per_1m_tokens:a?.pricing.input_per_1m_tokens??null,output_per_1m_tokens:a?.pricing.output_per_1m_tokens??null,input_cache_read_per_1m_tokens:a?.pricing.input_cache_read_per_1m_tokens??null},price_resolution:l?.kind??(r.catalog?"unknown":"no-catalog"),price_source_model_id:a?.sourceModelId??null,price_estimated:a?.estimated??!1}}async function Uc(t,e,n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(WI),0;let r=ae(t,[],["--old","--json"]),s=r.positionals.find(u=>u!=="all"&&!jn.includes(u)),o=r.error??(s===void 0?void 0:`unknown provider: ${s} (valid targets: all, ${jn.join(", ")})`);if(o!==void 0)return e.stderr.write(`error: ${o}
|
|
1870
1870
|
${WI}`),2;let i=n.selections?.map(u=>u.provider)??(r.positionals.length===0||r.positionals.includes("all")?[...jn]:jn.filter(u=>r.positionals.includes(u)));e.stderr.write(`querying models: ${i.join(", ")} ...
|
|
1871
|
-
`);let a=await(n.loadSnapshot??Tt)(),l=z(r,"--old"),c=[];for(let u of i){let f;try{let p=n.selections?.find(_=>_.provider===u);f=p?.models!==void 0?{available:!0,models:p.models}:n.loadModels?await n.loadModels(u,a):BI(u,a)}catch(p){f={available:!1,models:[],reason:p instanceof Error?p.message:String(p)}}let m=
|
|
1871
|
+
`);let a=await(n.loadSnapshot??Tt)(),l=z(r,"--old"),c=[];for(let u of i){let f;try{let p=n.selections?.find(_=>_.provider===u);f=p?.models!==void 0?{available:!0,models:p.models}:n.loadModels?await n.loadModels(u,a):BI(u,a)}catch(p){f={available:!1,models:[],reason:p instanceof Error?p.message:String(p)}}let m=jj[u]??"provider model list";c.push({provider:u,status:f.available?"ok":"unavailable",source:m,reason:f.reason??null,models:f.available?[...[...new Set(f.models)].map(p=>HI(u,p,f.displayNames?.[p]??null,a,u==="claude"?"unverified":"valid")),...l?Bj(u,f.models,a).map(p=>HI(u,p,null,a,"old")):[]]:[]})}if(z(r,"--json"))return te(e,{schema_version:2,currency:"USD",unit:"per_million_tokens",price_data_source:a.source,price_data_generated_at:a.generatedAt,providers:c}),0;e.stdout.write(`USD per million tokens (API reference rates, not subscription charges). n/a = unknown.
|
|
1872
1872
|
`),e.stdout.write(`Price catalog: ${a.source}${a.generatedAt?` (${a.generatedAt})`:""}
|
|
1873
1873
|
`);let d=u=>u===null?"n/a":`$${u}`;for(let u of c){let f=u.provider==="agy",m=f?["MODEL","DISPLAY","STATUS","INPUT","OUTPUT","CACHE READ"]:["MODEL","STATUS","INPUT","OUTPUT","CACHE READ"];if(e.stdout.write(`
|
|
1874
1874
|
${u.provider} (${u.source})
|
|
1875
1875
|
`),u.status==="unavailable"){e.stdout.write(` unavailable: ${(0,qt.escapeCell)(u.reason??"model list unavailable")}
|
|
1876
1876
|
`);continue}let p=u.models.map(y=>[(0,qt.escapeCell)(y.id),...f?[(0,qt.escapeCell)(y.display_name??"")]:[],(0,qt.escapeCell)(y.status),d(y.pricing.input_per_1m_tokens),d(y.pricing.output_per_1m_tokens),d(y.pricing.input_cache_read_per_1m_tokens)]),_=f?["left","left","left","decimal","decimal","decimal"]:["left","left","decimal","decimal","decimal"],h=(0,qt.measureDecimalPlaces)([p]),g={align:_,decimalPlaces:h},E=(0,qt.measureColumns)([{rows:p,headers:m}],g);e.stdout.write(`${(0,qt.renderGrid)(p,{headers:m,widths:E,margin:2,...g})}
|
|
1877
|
-
`)}return 0}var qt,jn,WI,
|
|
1877
|
+
`)}return 0}var qt,jn,WI,jj,Wj,Fc=x(()=>{"use strict";qt=Ft(Ct(),1);le();lo();jp();zt();Hr();jn=["codex","agy","claude","kimi"],WI=`usage: lmctl models [provider ...] [--old] [--json]
|
|
1878
1878
|
|
|
1879
1879
|
List model ids accepted by each provider, joined to the available price catalog.
|
|
1880
1880
|
Providers: all (default), codex, agy, claude, kimi. Multiple providers are allowed.
|
|
@@ -1884,7 +1884,7 @@ Old catalog-known ids are omitted unless --old is used. Claude catalog ids are u
|
|
|
1884
1884
|
--json Emit schema_version 2 with native ids, catalog matches and per-million pricing.
|
|
1885
1885
|
--old Include ids known to the catalog that the provider no longer reports.
|
|
1886
1886
|
-h Show this help.
|
|
1887
|
-
`,
|
|
1887
|
+
`,jj={codex:"codex debug models",agy:"agy models",claude:"lmprice native.claude_code",kimi:"Kimi [models] config"},Wj={codex:"codex",agy:"agy",claude:"claude_code",kimi:"kimi"}});function Tr(t){try{if(t instanceof Error){let e=t.message;if(typeof e=="string")return e}return String(t)}catch{return"Unprintable error"}}function pt(t,e,n){return{...n,status:"error",code:t,error:e}}var jc=x(()=>{"use strict"});function mn(t){try{return t?.usage}catch{return}}function Wc(t,e,n,r){let s,o,i,a=!1;try{i=Va(e),s=t.dal??$e({path:Pe(t),recover:!1}),o=s.insertDirectTurn(i,n,r)}catch{}return{async finish(l){if(!a){a=!0;try{s&&o!==void 0&&i&&s.finishDirectTurn(o,await Jo(i,l,()=>ul(s.db,t.env),{db:s.db,env:t.env}))}catch{}finally{if(s&&s!==t.dal)try{s.close()}catch{}}}}}}function Hc(t,e,n){let r=t,s,o;s=mn(r)??mn(n);try{o=r?.sessionId??n?.sessionId}catch{o=n?.sessionId}return{status:Ls(Tr(t),e.aborted),usage:s,sessionId:o}}var Bp=x(()=>{"use strict";vt();le();fl();Ko();jc()});var GI={};me(GI,{runFreshPrompt:()=>Gj});import{resolve as Xj}from"node:path";import{stat as qj}from"node:fs/promises";async function Gj(t,e){let n=Xj(e.cwd??process.cwd(),t.sessiondir??"."),r=new AbortController,s=()=>r.abort();process.once("SIGINT",s),process.once("SIGTERM",s);let o=!1,i,a={status:"error"};try{if(!(await qj(n)).isDirectory())throw new Error(`sessiondir is not a directory: ${n}`);i=Wc(e,{provider:t.provider,modelRequested:t.model,cwd:n,sessionId:""},"operator");let l=await Hi({provider:t.provider,model:t.model,cwd:n,sessionId:"",prompt:t.prompt,requireResume:!1,timeoutMs:0,permissionMode:t.permissionMode,signal:r.signal,onDelta:t.json?void 0:c=>{o=!0,e.stdout.write(c)},onProgress:t.verbose?c=>{(c.kind==="tool_use"||c.kind==="tool_result"||c.kind==="api_retry")&&e.stderr.write(`[${t.provider}] ${c.kind}${c.summary?`: ${c.summary}`:""}
|
|
1888
1888
|
`)}:void 0,env:e.env});a={status:r.signal.aborted?"cancelled":l.status??"ok",sessionId:l.sessionId,usage:mn(l)};for(let c of l.warnings??[])t.json||e.stderr.write(`warning: ${c}
|
|
1889
1889
|
`);return t.json?e.stdout.write(`${JSON.stringify({status:l.status??"ok",provider:t.provider,requestedModel:t.model,sessionId:l.sessionId,replyText:l.text,...l.warnings?{warnings:l.warnings}:{}})}
|
|
1890
1890
|
`):o?l.text.length>0&&!l.text.endsWith(`
|
|
@@ -1894,17 +1894,17 @@ Old catalog-known ids are omitted unless --old is used. Claude catalog ids are u
|
|
|
1894
1894
|
`}`),l.status==="empty"||l.status==="stalled"?1:(e.stderr.write(`note: fresh ${t.provider} session ${l.sessionId||"(provider did not report an id)"} completed
|
|
1895
1895
|
`),0)}catch(l){a=Hc(l,r.signal,a);let c=l instanceof Error?l.message:String(l);return t.json?e.stdout.write(`${JSON.stringify({status:"error",provider:t.provider,requestedModel:t.model,error:c})}
|
|
1896
1896
|
`):e.stderr.write(`error: ${c}
|
|
1897
|
-
`),1}finally{await i?.finish(a),process.removeListener("SIGINT",s),process.removeListener("SIGTERM",s)}}var VI=x(()=>{"use strict";Un();Bp()});function JI(t,e){return new Error("Invalid template reference "+JSON.stringify(t)+" at offset "+e+"; use a simple name, PROPS.path or ARGV[n]. Assign a temporary variable first and pass it in vars.")}function
|
|
1897
|
+
`),1}finally{await i?.finish(a),process.removeListener("SIGINT",s),process.removeListener("SIGTERM",s)}}var VI=x(()=>{"use strict";Un();Bp()});function JI(t,e){return new Error("Invalid template reference "+JSON.stringify(t)+" at offset "+e+"; use a simple name, PROPS.path or ARGV[n]. Assign a temporary variable first and pass it in vars.")}function Yj(t){if(typeof t!="string")throw new Error("expand: text must be a string");let e=[],n=0;for(;n<t.length;){let r=t.indexOf("${",n);if(r<0){e.push(t.slice(n));break}if(r>n&&t[r-1]==="$"){e.push(t.slice(n,r-1),"${"),n=r+2;continue}e.push(t.slice(n,r));let s=t.indexOf("}",r+2);if(s<0)throw JI(t.slice(r+2),r);let o=t.slice(r+2,s),i=Jj.exec(o),a=Kj.exec(o);if(i)e.push({kind:"property",name:o,key:i[1],offset:r});else if(a&&Number.isSafeInteger(Number(a[1])))e.push({kind:"argument",name:o,index:Number(a[1]),offset:r});else if(Vj.test(o)&&o!=="PROPS"&&o!=="ARGV")e.push({kind:"variable",name:o,offset:r});else throw JI(o,r);n=s+1}return e}function KI(t,e,n=r=>r!==null&&typeof r=="object"?JSON.stringify(r):String(r)){let r=[],s=new Map;for(let o of Yj(t)){if(typeof o=="string"){r.push(o);continue}let i;try{i=e(o)}catch(a){s.set(o.name,a instanceof Error?a.message:String(a));continue}if(i===void 0){s.set(o.name,"not defined");continue}r.push(n(i))}if(s.size)throw new Error("expand: missing references: "+[...s].map(([o,i])=>o+" ("+i+")").join("; "));return r.join("")}var Xp,Vj,Jj,Kj,YI=x(()=>{Xp="[_a-zA-Z][_a-zA-Z0-9]*",Vj=new RegExp("^"+Xp+"$"),Jj=new RegExp("^PROPS\\.("+Xp+"(?:\\."+Xp+")*)$"),Kj=/^ARGV\[(0|[1-9][0-9]*)\]$/});function zI(t){return{Provider1:t.provider1.provider,Provider2:t.provider2.provider,Provider3:t.provider3.provider,Model1:t.provider1.model1,Model2:t.provider2.model1,Model3:t.provider3.model1}}var QI=x(()=>{"use strict"});function zj(t,e){let n=t.slice(0,e).split(/\r?\n/);return[n.length,n.pop().length+1]}function Qj(t,e,n){let r=t.split(/\r?\n/),s="",o=(Math.log10(e+1)|0)+1;for(let i=e-1;i<=e+1;i++){let a=r[i-1];a&&(s+=i.toString().padEnd(o," "),s+=": ",s+=a,s+=`
|
|
1898
1898
|
`,i===e&&(s+=" ".repeat(o+n+2),s+=`^
|
|
1899
|
-
`))}return s}var J,ls=x(()=>{J=class t extends Error{line;column;codeblock;constructor(e,n){let[r,s]=
|
|
1899
|
+
`))}return s}var J,ls=x(()=>{J=class t extends Error{line;column;codeblock;constructor(e,n){let[r,s]=zj(n.toml,n.ptr),o=Qj(n.toml,r,s);super(`Invalid TOML document: ${e}
|
|
1900
1900
|
|
|
1901
1901
|
${o}`,n),this.line=r,this.column=s,this.codeblock=o}static x(e,n,r){throw new t(e,{toml:n.s,ptr:r??n.p})}}});function Bc(t){let e=t.p,n=t.s.charCodeAt(t.p++),r=n,s=n===39,o=n===t.s.charCodeAt(t.p)&&n===t.s.charCodeAt(t.p+1);o&&((n=t.s.charCodeAt(t.p+=2))===10?t.p++:n===13&&t.s.charCodeAt(t.p+1)===10&&(t.p+=2));let i="",a=t.p,l=0;for(;t.p<t.s.length;t.p++)if(n=t.s.charCodeAt(t.p),o&&(n===10||n===13&&t.s.charCodeAt(t.p+1)===10))l=l&&3;else if(n<32&&n!==9||n===127)J.x("control characters are not allowed in strings",t);else if((!l||l===3)&&n===r&&(!o||t.s.charCodeAt(t.p+1)===r&&t.s.charCodeAt(t.p+2)===r)){if(o&&(t.s.charCodeAt(t.p+3)===r&&t.p++,t.s.charCodeAt(t.p+3)===r&&t.p++),!l){let c=t.s.slice(a,t.p);i=i?i+c:c}return t.p+=o?3:1,i}else if(!l)!s&&n===92&&(i+=t.s.slice(a,a=t.p),l=1);else if(l===1)if(n===120||n===117||n===85){let c=t.p++-1,d=0,u=n===120?2:n===117?4:8;for(let f=0;f<u;f++,t.p++){let m=t.s.charCodeAt(t.p),p=m>=48&&m<=57?m-48:m>=65&&m<=70?m-65+10:m>=97&&m<=102?m-97+10:-1;p<0&&J.x("invalid non-hex character in unicode escape",t),d=d<<4|p}(d<0||d>1114111||d>=55296&&d<=57343)&&J.x("invalid unicode escape",t,c),i+=String.fromCodePoint(d),a=t.p--,l=0}else o&&(n===32||n===9)?l=2:(n===98?i+="\b":n===116?i+=" ":n===110?i+=`
|
|
1902
|
-
`:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":J.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&J.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);J.x("unfinished string",t,e)}var qp=x(()=>{ls();});var zj,zi,Gp=x(()=>{zj=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,zi=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,o=!0,i="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(i=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(i=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,o=n!==3}else{let l=e.match(zj);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),o=!!l[2],o&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(i=l[3]||null,!i&&o&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=o,this.#e=i)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function bt(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function Jp(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function Zi(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||J.x("document contains excessively nested structures. aborting.",t);let s=r===91?tb(t):eb(t);return t.d++,s}return r===34||r===39?Bc(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!1):r===43||r===45?Xc(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?Qj(t,r,e):t.s.charCodeAt(t.p+2)===58?Zj(t,r,e):Xc(t,t.p,r,0,e)}function Xc(t,e,n,r,s){let o=n,i=0,a=!1;if(o===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&J.x("invalid value",t,e),t.p++,(r||1)/0;if(o===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&J.x("invalid value",t,e),t.p++,NaN;if(o===48){if(++t.p>=t.s.length||Jp(o=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(o===120)return Vp(t,e,16,s);if(o===98)return Vp(t,e,2,s);if(o===111)return Vp(t,e,8,s)}o===46?i=2:o===101||o===69?i=4:J.x("illegal leading zero",t,e)}else bt(o)||J.x("invalid value",t,e);for(;++t.p<t.s.length&&(o=t.s.charCodeAt(t.p),!Jp(o,s));)i||(i=1),o===95?(i&1||J.x("illegal underscore",t),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(bt(o)?i>9?i-=11:i&1||i++:J.x("illegal character in numeric literal",t));if(!i){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}i&1||J.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),i>1?parseFloat(l):ZI(t,l,10,e)}function Vp(t,e,n,r){let s,o=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!Jp(s,r));)s===95?(o&1&&J.x("illegal underscore",t),o=3):bt(s,n)?o&1&&o--:J.x("illegal character in numeric literal",t);o&1&&J.x("unfinished numeric value",t);let i=t.s.slice(e+2,t.p);return o&&(i=i.replaceAll("_","")),ZI(t,i,n,e)}function ZI(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;J.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function Qj(t,e,n){let r=t.p++,s;if(!bt(e)||!bt(t.s.charCodeAt(t.p++))||!bt(t.s.charCodeAt(t.p++))||!bt(t.s.charCodeAt(t.p++)))return Xc(t,t.p=r,e,0,n);if(t.p+=5,bt(t.s.charCodeAt(t.p++))||J.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!bt(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let i=t.s.slice(r,t.p);return Qi(t,i,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&J.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;bt(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let i=t.s.slice(r,++t.p);return Qi(t,i,1,s,r,"[+00:00]")}if(e===43||e===45){let i=t.s.slice(r,t.p+=6);return Qi(t,i,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let o=t.s.slice(r,t.p);return Qi(t,o,2,s,r)}function Zj(t,e,n){let r=t.p;if(!bt(e)||!bt(t.s.charCodeAt(++t.p)))return Xc(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;bt(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return Qi(t,s,4,!1,r)}function Qi(t,e,n,r,s,o){if(t.ld){let i=new zi(e,n,r);return i.isValid()||J.x("invalid date",t,s),i}try{switch(o&&(e+=o),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(i){J.x(i instanceof Error?i.message:""+i,t,s)}}var Kp=x(()=>{qp();Yp();ls();Gp();});function eW(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&J.x("control characters are not allowed in comments",t)}}function Gt(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;eW(t)}}var zp=x(()=>{ls();});function qc(t,e=61){let n,r=0,s=[],o,i=t.s.charCodeAt(n=t.p);do{if(i===e)return r||J.x("unexpected end of key",t),r===1&&s.push(t.s.slice(o,t.p)),t.p++,s;i===46?(r||J.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(o,t.p)),r=0):!r&&(i===34||i===39)?(i===t.s.charCodeAt(t.p+1)&&i===t.s.charCodeAt(t.p+2)&&J.x("illegal quoted key: multiline strings are not allowed",t),s.push(Bc(t)),r=2,t.p--):i===32||i===9?r===1&&(s.push(t.s.slice(o,t.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?J.x("illegal character in key",t):r||(r=1,o=t.p)}while(i=t.s.charCodeAt(++t.p));J.x("incomplete key-value: cannot find end of key",t,n)}function eb(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(Gt(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let o,i=n,a=!1,l=t.p,c=qc(t);for(let u=0;u<c.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=c[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&J.x("trying to redefine an already defined value",t,l);let f=o==="__proto__";if(t.uk&&(f||o==="constructor")){i=t.uk!==1&&J.x("document contains an unsafe property",t,l);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&J.x("trying to redefine an already defined value",t,l),Gt(t,!0,!0);let d=Zi(t,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Gt(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished table",t,e)}function tb(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(Gt(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(Zi(t,93)),Gt(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished array",t,e)}var Yp=x(()=>{qp();Kp();zp();ls();});function nb(t,e,n,r,s){let o=n,i=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(o=l?o[a]:o[a]=Object.create(null),i=(c=i[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=e[d],(l=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=i[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)o=l?o[a]:o[a]=Object.create(null);else if(s===0&&l)return null;return[a,o,c.c]}function rb(t,e,n){(e===null||t.uk===2)&&J.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function uo(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,Gt(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;o=n.p+=+c,i=!1;let d=qc(n,93);c&&(t.charCodeAt(n.p)!==93&&J.x("expected end of table array declaration",n),n.p++);let u=nb(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(rb(n,u,o),i=!0)}else{o=n.p;let c=qc(n),d=nb(n,c,a,l,0);!d&&!i&&rb(n,d,o),Gt(n,!0,!0);let u=Zi(n,void 0);d&&!i&&(d[1][d[0]]=u)}Gt(n,!0),n.p<t.length&&(o=t.charCodeAt(n.p))!==10&&(o!==13||t.charCodeAt(n.p+1)!==10)&&J.x("each key-value declaration must be followed by an end-of-line",n),Gt(n)}return r}var sb=x(()=>{Yp();Kp();zp();ls();});var lZ,ob=x(()=>{lZ=!!"".isWellFormed});var Qp=x(()=>{sb();ob();Gp();ls();});import{readFileSync as tW}from"node:fs";import{homedir as nW}from"node:os";import{join as ib,resolve as rW}from"node:path";function Mt(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?rW(e):ib(n||ib(t.HOME||nW(),".lmctl"),"init.toml")}function sW(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function pn(t,e="<init.toml>"){let{document:n}=ab(t,e),r={};for(let o of cs){let i=n[o];if(i===void 0)continue;if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new qe(e,"schema","["+o+"] must be a table with provider and model1");let a={};for(let l of ea){let c=i[l];if(typeof c!="string"||!c.trim())throw new qe(e,"schema",o+"."+l+" must be a nonempty string");a[l]=c}r[o]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let o=cs.find(i=>!r[i]);if(o)throw new qe(e,"schema","["+o+"] is not in "+e+"; this needs the example slots ["+cs.join("], [")+"] -- add ["+o+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function ab(t,e="<init.toml>"){let n;try{n=uo(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new qe(e,"syntax",s.message,s.line??1,(s.column??1)+(t.startsWith("\uFEFF")&&s.line===1?1:0))}return{raw:t,document:n,path:e}}function oW(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(tW(t))}catch(n){let r=n;throw new qe(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function ta(t=Mt()){return pn(oW(t),t)}var cs,ea,qe,Gc=x(()=>{"use strict";Qp();cs=["Provider1","Provider2","Provider3"],ea=["provider","model1"];qe=class extends Error{path;kind;line;column;detail;constructor(e,n,r,s=1,o=1){let i=sW(e,n,r,s,o);super(n==="missing"?i+". Run lmctl init first.":i+". Fix the file or run lmctl init."),this.path=e,this.kind=n,this.line=s,this.column=o,this.detail=i}}});function iW(t){let e=[],n=0;for(;n<t.length;){let r=t[n];if(r==="\r"||r===`
|
|
1902
|
+
`:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":J.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&J.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);J.x("unfinished string",t,e)}var qp=x(()=>{ls();});var Zj,zi,Gp=x(()=>{Zj=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,zi=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,o=!0,i="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(i=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(i=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,o=n!==3}else{let l=e.match(Zj);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),o=!!l[2],o&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(i=l[3]||null,!i&&o&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=o,this.#e=i)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function bt(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function Jp(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function Zi(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||J.x("document contains excessively nested structures. aborting.",t);let s=r===91?tb(t):eb(t);return t.d++,s}return r===34||r===39?Bc(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&J.x("invalid value",t,n),t.p++,!1):r===43||r===45?Xc(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?eW(t,r,e):t.s.charCodeAt(t.p+2)===58?tW(t,r,e):Xc(t,t.p,r,0,e)}function Xc(t,e,n,r,s){let o=n,i=0,a=!1;if(o===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&J.x("invalid value",t,e),t.p++,(r||1)/0;if(o===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&J.x("invalid value",t,e),t.p++,NaN;if(o===48){if(++t.p>=t.s.length||Jp(o=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(o===120)return Vp(t,e,16,s);if(o===98)return Vp(t,e,2,s);if(o===111)return Vp(t,e,8,s)}o===46?i=2:o===101||o===69?i=4:J.x("illegal leading zero",t,e)}else bt(o)||J.x("invalid value",t,e);for(;++t.p<t.s.length&&(o=t.s.charCodeAt(t.p),!Jp(o,s));)i||(i=1),o===95?(i&1||J.x("illegal underscore",t),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(bt(o)?i>9?i-=11:i&1||i++:J.x("illegal character in numeric literal",t));if(!i){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}i&1||J.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),i>1?parseFloat(l):ZI(t,l,10,e)}function Vp(t,e,n,r){let s,o=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!Jp(s,r));)s===95?(o&1&&J.x("illegal underscore",t),o=3):bt(s,n)?o&1&&o--:J.x("illegal character in numeric literal",t);o&1&&J.x("unfinished numeric value",t);let i=t.s.slice(e+2,t.p);return o&&(i=i.replaceAll("_","")),ZI(t,i,n,e)}function ZI(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;J.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function eW(t,e,n){let r=t.p++,s;if(!bt(e)||!bt(t.s.charCodeAt(t.p++))||!bt(t.s.charCodeAt(t.p++))||!bt(t.s.charCodeAt(t.p++)))return Xc(t,t.p=r,e,0,n);if(t.p+=5,bt(t.s.charCodeAt(t.p++))||J.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!bt(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let i=t.s.slice(r,t.p);return Qi(t,i,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&J.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;bt(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let i=t.s.slice(r,++t.p);return Qi(t,i,1,s,r,"[+00:00]")}if(e===43||e===45){let i=t.s.slice(r,t.p+=6);return Qi(t,i,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let o=t.s.slice(r,t.p);return Qi(t,o,2,s,r)}function tW(t,e,n){let r=t.p;if(!bt(e)||!bt(t.s.charCodeAt(++t.p)))return Xc(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;bt(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return Qi(t,s,4,!1,r)}function Qi(t,e,n,r,s,o){if(t.ld){let i=new zi(e,n,r);return i.isValid()||J.x("invalid date",t,s),i}try{switch(o&&(e+=o),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(i){J.x(i instanceof Error?i.message:""+i,t,s)}}var Kp=x(()=>{qp();Yp();ls();Gp();});function nW(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&J.x("control characters are not allowed in comments",t)}}function Gt(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;nW(t)}}var zp=x(()=>{ls();});function qc(t,e=61){let n,r=0,s=[],o,i=t.s.charCodeAt(n=t.p);do{if(i===e)return r||J.x("unexpected end of key",t),r===1&&s.push(t.s.slice(o,t.p)),t.p++,s;i===46?(r||J.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(o,t.p)),r=0):!r&&(i===34||i===39)?(i===t.s.charCodeAt(t.p+1)&&i===t.s.charCodeAt(t.p+2)&&J.x("illegal quoted key: multiline strings are not allowed",t),s.push(Bc(t)),r=2,t.p--):i===32||i===9?r===1&&(s.push(t.s.slice(o,t.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?J.x("illegal character in key",t):r||(r=1,o=t.p)}while(i=t.s.charCodeAt(++t.p));J.x("incomplete key-value: cannot find end of key",t,n)}function eb(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(Gt(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let o,i=n,a=!1,l=t.p,c=qc(t);for(let u=0;u<c.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=c[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&J.x("trying to redefine an already defined value",t,l);let f=o==="__proto__";if(t.uk&&(f||o==="constructor")){i=t.uk!==1&&J.x("document contains an unsafe property",t,l);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&J.x("trying to redefine an already defined value",t,l),Gt(t,!0,!0);let d=Zi(t,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Gt(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished table",t,e)}function tb(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(Gt(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(Zi(t,93)),Gt(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&J.x("expected comma or end of structure",t,t.p-1)}J.x("unfinished array",t,e)}var Yp=x(()=>{qp();Kp();zp();ls();});function nb(t,e,n,r,s){let o=n,i=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(o=l?o[a]:o[a]=Object.create(null),i=(c=i[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=e[d],(l=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=i[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)o=l?o[a]:o[a]=Object.create(null);else if(s===0&&l)return null;return[a,o,c.c]}function rb(t,e,n){(e===null||t.uk===2)&&J.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function uo(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,Gt(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;o=n.p+=+c,i=!1;let d=qc(n,93);c&&(t.charCodeAt(n.p)!==93&&J.x("expected end of table array declaration",n),n.p++);let u=nb(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(rb(n,u,o),i=!0)}else{o=n.p;let c=qc(n),d=nb(n,c,a,l,0);!d&&!i&&rb(n,d,o),Gt(n,!0,!0);let u=Zi(n,void 0);d&&!i&&(d[1][d[0]]=u)}Gt(n,!0),n.p<t.length&&(o=t.charCodeAt(n.p))!==10&&(o!==13||t.charCodeAt(n.p+1)!==10)&&J.x("each key-value declaration must be followed by an end-of-line",n),Gt(n)}return r}var sb=x(()=>{Yp();Kp();zp();ls();});var dZ,ob=x(()=>{dZ=!!"".isWellFormed});var Qp=x(()=>{sb();ob();Gp();ls();});import{readFileSync as rW}from"node:fs";import{homedir as sW}from"node:os";import{join as ib,resolve as oW}from"node:path";function Mt(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?oW(e):ib(n||ib(t.HOME||sW(),".lmctl"),"init.toml")}function iW(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function pn(t,e="<init.toml>"){let{document:n}=ab(t,e),r={};for(let o of cs){let i=n[o];if(i===void 0)continue;if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new qe(e,"schema","["+o+"] must be a table with provider and model1");let a={};for(let l of ea){let c=i[l];if(typeof c!="string"||!c.trim())throw new qe(e,"schema",o+"."+l+" must be a nonempty string");a[l]=c}r[o]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let o=cs.find(i=>!r[i]);if(o)throw new qe(e,"schema","["+o+"] is not in "+e+"; this needs the example slots ["+cs.join("], [")+"] -- add ["+o+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function ab(t,e="<init.toml>"){let n;try{n=uo(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new qe(e,"syntax",s.message,s.line??1,(s.column??1)+(t.startsWith("\uFEFF")&&s.line===1?1:0))}return{raw:t,document:n,path:e}}function aW(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(rW(t))}catch(n){let r=n;throw new qe(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function ta(t=Mt()){return pn(aW(t),t)}var cs,ea,qe,Gc=x(()=>{"use strict";Qp();cs=["Provider1","Provider2","Provider3"],ea=["provider","model1"];qe=class extends Error{path;kind;line;column;detail;constructor(e,n,r,s=1,o=1){let i=iW(e,n,r,s,o);super(n==="missing"?i+". Run lmctl init first.":i+". Fix the file or run lmctl init."),this.path=e,this.kind=n,this.line=s,this.column=o,this.detail=i}}});function lW(t){let e=[],n=0;for(;n<t.length;){let r=t[n];if(r==="\r"||r===`
|
|
1903
1903
|
`){let o=n;n+=r==="\r"&&t[n+1]===`
|
|
1904
1904
|
`?2:1,e.push({start:o,end:n,text:`
|
|
1905
1905
|
`,kind:"newline"});continue}if(/\s/.test(r)){n++;continue}if(r==="#"){for(;n<t.length&&t[n]!=="\r"&&t[n]!==`
|
|
1906
|
-
`;)n++;continue}let s=n;if(r==='"'||r==="'"){let o=t.startsWith(r.repeat(3),n);n+=o?3:1;let i=!1;for(;n<t.length;){if(r==='"'&&t[n]==="\\"){n+=2;continue}if(t[n]===r){if(!o){n++,i=!0;break}if(t.startsWith(r.repeat(3),n)){for(;t[n]===r;)n++;i=!0;break}}n++}if(!i)throw new Error("cannot locate string boundary");e.push({start:s,end:n,text:t.slice(s,n),kind:"string",multiline:o});continue}if("[]=.{},".includes(r)){n++,e.push({start:s,end:n,text:r,kind:"symbol"});continue}for(;n<t.length&&!/\s/.test(t[n])&&!`"'#[]=.{},`.includes(t[n]);)n++;if(n===s)throw new Error("cannot locate token");e.push({start:s,end:n,text:t.slice(s,n),kind:"word"})}return e}function
|
|
1907
|
-
__init_edit_marker__ = 0`),n=[];for(;e&&typeof e=="object"&&!Array.isArray(e);){let r=Object.entries(e);if(r.length!==1)return[];if(r[0][0]==="__init_edit_marker__")return n;n.push(r[0][0]),e=r[0][1]}return[]}function Zp(t){return'"'+Array.from(t).map(e=>{let n=e.codePointAt(0);if(n>=55296&&n<=57343)throw new Error("managed string contains an invalid Unicode scalar");return e==='"'?'\\"':e==="\\"?"\\\\":n<32||n===127?"\\u"+n.toString(16).padStart(4,"0"):e}).join("")+'"'}function lb(t,e,n=[]){if(n.length===2&&cs.includes(n[0])&&ea.includes(n[1])||Object.is(t,e))return!0;if(t instanceof Date||e instanceof Date)return t instanceof Date&&e instanceof Date&&t.toISOString()===e.toISOString();if(!t||!e||typeof t!="object"||typeof e!="object"||Array.isArray(t)!==Array.isArray(e))return!1;let r=Object.keys(t),s=Object.keys(e);return r.length!==s.length||r.some(o=>!Object.hasOwn(e,o))?!1:r.every(o=>lb(t[o],e[o],[...n,o]))}function cb(t,e){try{let n=pn(t),r=cs.filter(m=>n.slots[m]),s=cs.filter(m=>!n.slots[m]),o=[];for(let m of r)for(let p of ea){let _=n.slots[m][p],h=e[m.toLowerCase()][p];_!==h&&o.push({section:m,key:p,oldValue:_,newValue:h,line:1})}if(!o.length)return{ok:!0,text:t,changes:o,absent:s};let i=new Map,a=
|
|
1906
|
+
`;)n++;continue}let s=n;if(r==='"'||r==="'"){let o=t.startsWith(r.repeat(3),n);n+=o?3:1;let i=!1;for(;n<t.length;){if(r==='"'&&t[n]==="\\"){n+=2;continue}if(t[n]===r){if(!o){n++,i=!0;break}if(t.startsWith(r.repeat(3),n)){for(;t[n]===r;)n++;i=!0;break}}n++}if(!i)throw new Error("cannot locate string boundary");e.push({start:s,end:n,text:t.slice(s,n),kind:"string",multiline:o});continue}if("[]=.{},".includes(r)){n++,e.push({start:s,end:n,text:r,kind:"symbol"});continue}for(;n<t.length&&!/\s/.test(t[n])&&!`"'#[]=.{},`.includes(t[n]);)n++;if(n===s)throw new Error("cannot locate token");e.push({start:s,end:n,text:t.slice(s,n),kind:"word"})}return e}function cW(t){let e=uo(t+" = 0"),n=[];for(;e&&typeof e=="object"&&!Array.isArray(e);){let r=Object.entries(e);if(r.length!==1)throw new Error("ambiguous key");n.push(r[0][0]),e=r[0][1]}return n}function dW(t){let e=uo(t+`
|
|
1907
|
+
__init_edit_marker__ = 0`),n=[];for(;e&&typeof e=="object"&&!Array.isArray(e);){let r=Object.entries(e);if(r.length!==1)return[];if(r[0][0]==="__init_edit_marker__")return n;n.push(r[0][0]),e=r[0][1]}return[]}function Zp(t){return'"'+Array.from(t).map(e=>{let n=e.codePointAt(0);if(n>=55296&&n<=57343)throw new Error("managed string contains an invalid Unicode scalar");return e==='"'?'\\"':e==="\\"?"\\\\":n<32||n===127?"\\u"+n.toString(16).padStart(4,"0"):e}).join("")+'"'}function lb(t,e,n=[]){if(n.length===2&&cs.includes(n[0])&&ea.includes(n[1])||Object.is(t,e))return!0;if(t instanceof Date||e instanceof Date)return t instanceof Date&&e instanceof Date&&t.toISOString()===e.toISOString();if(!t||!e||typeof t!="object"||typeof e!="object"||Array.isArray(t)!==Array.isArray(e))return!1;let r=Object.keys(t),s=Object.keys(e);return r.length!==s.length||r.some(o=>!Object.hasOwn(e,o))?!1:r.every(o=>lb(t[o],e[o],[...n,o]))}function cb(t,e){try{let n=pn(t),r=cs.filter(m=>n.slots[m]),s=cs.filter(m=>!n.slots[m]),o=[];for(let m of r)for(let p of ea){let _=n.slots[m][p],h=e[m.toLowerCase()][p];_!==h&&o.push({section:m,key:p,oldValue:_,newValue:h,line:1})}if(!o.length)return{ok:!0,text:t,changes:o,absent:s};let i=new Map,a=lW(t),l=0,c=[];for(;l<a.length;){if(a[l].kind==="newline"){l++;continue}let m=l;if(a[l].text==="["){for(;l<a.length&&a[l].kind!=="newline";)l++;c=dW(t.slice(a[m].start,a[l-1].end));continue}for(;l<a.length&&a[l].text!=="=";)l++;if(l===a.length)throw new Error("cannot locate assignment");let p=cW(t.slice(a[m].start,a[l-1].end));l++;let _=l,h=0;for(;l<a.length;){let g=a[l];if(g.kind==="newline"&&h===0)break;g.kind==="symbol"&&((g.text==="["||g.text==="{")&&h++,(g.text==="]"||g.text==="}")&&h--),l++}if(c.length===1&&p.length===1&&l-_===1){let g=a[_];g.kind==="string"&&!g.multiline&&i.set(c[0]+"."+p[0],g)}}let d=o.map(m=>{let p=i.get(m.section+"."+m.key);if(!p)throw new Error("cannot edit "+m.section+"."+m.key+" in place (multiline, dotted or inline managed layout); edit by hand");return m.line=t.slice(0,p.start).split(/\r\n|\r|\n/).length,{start:p.start,end:p.end,text:Zp(m.newValue)}}).sort((m,p)=>p.start-m.start),u=t;for(let m of d)u=u.slice(0,m.start)+m.text+u.slice(m.end);let f=pn(u);for(let m of r)for(let p of ea)if(f.slots[m]?.[p]!==e[m.toLowerCase()][p])throw new Error("managed-value verification failed");if(!lb(n.document,f.document))throw new Error("unmanaged semantic verification failed");return{ok:!0,text:u,changes:o,absent:s}}catch(n){return{ok:!1,error:n instanceof qe?n.detail:n.message,line:n.line}}}var db=x(()=>{"use strict";Qp();Gc()});import*as ub from"node:child_process";function uW(t,e){try{let n=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return n.status===0?{found:!0,version:(n.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:n.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function fb(t,e={}){let n=e.spawnSync===void 0&&process.env[fW]==="1",r=e.spawnSync??ub.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=ds[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(n){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=uW(a,r);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}var ds,fW,na=x(()=>{"use strict";ds={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy",kimi:"kimi",dsh:"dsh",hermes:"hermes",miniplayer:"miniplayer",muse:"muse",pi:"pi"};fW="LMCTL_SKIP_BINARY_CHECK"});import{spawnSync as mW}from"node:child_process";function pb(t){return fo.filter(e=>t.includes(e))}function pW(t,e){if(e.length===0)throw new Error(`No model ids are available for detected provider "${t}"`);if(t!=="claude")return e[0];let n=e.filter(s=>/^claude-[a-z]+-\d+(?:-\d+)?$/.test(s));if(n.length===0)throw new Error("No undated Claude Code model id is available in the catalog");let r=s=>s.match(/-(\d+)(?:-(\d+))?$/).slice(1).map(o=>Number(o??0));return n.reduce((s,o)=>{let i=r(s),a=r(o);return a[0]>i[0]||a[0]===i[0]&&a[1]>i[1]?o:s})}async function hb(t){switch(t){case"codex":{let e=is();if(!e.available)throw new Error(e.reason??"codex returned no models");return e.models}case"agy":{let e=os();if(!e.available)throw new Error(e.reason??"agy returned no models");return e.models}case"kimi":{let e=as();if(!e.available)throw new Error(e.reason??"Kimi config has no models");return e.models}case"claude":{let n=(await Tt()).catalog?.records??[],r=n.flatMap(s=>s.native?.claude_code?[s.native.claude_code]:[]);return r.length?[...new Set(r)]:[...new Set(n.flatMap(s=>{let o=s.source_model_id.split("/").at(-1);return s.provider==="anthropic"&&s.mode==="chat"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(o)?[o]:[]}))]}default:throw new Error(`Unsupported init provider "${t}"`)}}function _b(t,e){let n=t.filter((l,c)=>t.indexOf(l)===c),r=n.length>0?n:["claude"],[s,o=s,i=s]=r,a=l=>({provider:l,model1:pW(l,e[l]??[])});return{provider1:a(s),provider2:a(o),provider3:a(i)}}function gb(t=mW){return fb(fo,{spawnSync:t}).filter(e=>e.found).map(e=>e.provider)}function mb(t){return Zp(t)}function ra(t){let e=(n,r)=>[`[${n}]`,`provider = ${mb(r.provider)}`,`model1 = ${mb(r.model1)}`].join(`
|
|
1908
1908
|
`);return`# Generated by \`lmctl init\`. This is a STARTING POINT, not a fixed answer --
|
|
1909
1909
|
# lmctl properties: hierarchical keys such as Provider1.provider, Provider1.model1,
|
|
1910
1910
|
# and user-defined top-level Env1. edit any value below to change what \`lmctl plan\`/\`lmctl quickrun\` resolve to.
|
|
@@ -1927,17 +1927,17 @@ ${e("Provider1",t.provider1)}
|
|
|
1927
1927
|
${e("Provider2",t.provider2)}
|
|
1928
1928
|
|
|
1929
1929
|
${e("Provider3",t.provider3)}
|
|
1930
|
-
`}function wr(t){try{return ta(Mt(process.env,t)).config}catch(e){if(e instanceof qe&&e.kind==="missing")return null;throw e}}function yb(t,e){return cb(t,e)}function Eb(t,e,n={}){let r={...zI(e)},s=n.properties??Object.fromEntries([1,2,3].map(o=>{let i=e["provider"+o];return["Provider"+o,{Provider:i.provider,Model1:i.model1}]}));return KI(t,o=>{if(o.kind==="variable")return Object.hasOwn(r,o.name)?r[o.name]:void 0;if(o.kind==="argument")return n.argv?.[o.index];let i=o.key.split(".");/^Provider[123]$/.test(i[0])&&i.length===2&&["provider","model1"].includes(i[1])&&(i[1]=i[1][0].toUpperCase()+i[1].slice(1));let a=s;for(let d of i){if(!a||typeof a!="object"||!Object.hasOwn(a,d))throw Error("Property '"+o.key+"' is not defined in "+(n.path??"~/.lmctl/init.toml")+"; define it there or run lmctl init");a=a[d]}let l=new Set,c=(d,u)=>{if(d instanceof Date)return d.toISOString();if(d===null||typeof d=="string"||typeof d=="boolean"||typeof d=="number"&&Number.isFinite(d))return d;if(d&&typeof d=="object"&&(Array.isArray(d)||[Object.prototype,null].includes(Object.getPrototypeOf(d)))){if(l.has(d))throw Error("Property '"+u+"' contains a cycle in "+(n.path??"~/.lmctl/init.toml"));l.add(d);try{if(Array.isArray(d))return d.map((m,p)=>c(m,u+"."+p));let f=Object.create(null);for(let[m,p]of Object.entries(d))f[m]=c(p,u+"."+m);return f}finally{l.delete(d)}}throw Error("Property '"+u+"' has an unsupported value type: "+typeof d+" in "+(n.path??"~/.lmctl/init.toml"))};return c(a,o.key)})}var fo,us=x(()=>{"use strict";YI();QI();Gc();Gc();db();lo();zt();na();fo=["claude","codex","agy","kimi"]});import{homedir as
|
|
1931
|
-
`);let o=Fp(r.members,{agyModelsRunner:ih,codexModelsRunner:ah});o.push(...await Rb(r.members)),s.push(...await Lb(r.members));let i=nh(n,"utf8"),a=Tb(i,wb({workdir:ms(n),teamfile:n,date:new Date})).unknownNames;a.length>0&&o.push(`unknown template placeholder${a.length===1?"":"s"}: ${a.map(l=>`{{${l}}}`).join(", ")}`),o.push(...Jf(r.members,ms(n))),o.push(...
|
|
1932
|
-
`);for(let l of r.members)oh([l],e),l.session!==void 0&&l.session.length<mo&&o.push(`${l.alias}: sessionid is shorter than ${mo} chars; run lmctl seed to refresh it`);return{ok:!0,result:{config:r,absTeamfile:n,errors:s,warnings:o}}}async function vr(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(
|
|
1930
|
+
`}function wr(t){try{return ta(Mt(process.env,t)).config}catch(e){if(e instanceof qe&&e.kind==="missing")return null;throw e}}function yb(t,e){return cb(t,e)}function Eb(t,e,n={}){let r={...zI(e)},s=n.properties??Object.fromEntries([1,2,3].map(o=>{let i=e["provider"+o];return["Provider"+o,{Provider:i.provider,Model1:i.model1}]}));return KI(t,o=>{if(o.kind==="variable")return Object.hasOwn(r,o.name)?r[o.name]:void 0;if(o.kind==="argument")return n.argv?.[o.index];let i=o.key.split(".");/^Provider[123]$/.test(i[0])&&i.length===2&&["provider","model1"].includes(i[1])&&(i[1]=i[1][0].toUpperCase()+i[1].slice(1));let a=s;for(let d of i){if(!a||typeof a!="object"||!Object.hasOwn(a,d))throw Error("Property '"+o.key+"' is not defined in "+(n.path??"~/.lmctl/init.toml")+"; define it there or run lmctl init");a=a[d]}let l=new Set,c=(d,u)=>{if(d instanceof Date)return d.toISOString();if(d===null||typeof d=="string"||typeof d=="boolean"||typeof d=="number"&&Number.isFinite(d))return d;if(d&&typeof d=="object"&&(Array.isArray(d)||[Object.prototype,null].includes(Object.getPrototypeOf(d)))){if(l.has(d))throw Error("Property '"+u+"' contains a cycle in "+(n.path??"~/.lmctl/init.toml"));l.add(d);try{if(Array.isArray(d))return d.map((m,p)=>c(m,u+"."+p));let f=Object.create(null);for(let[m,p]of Object.entries(d))f[m]=c(p,u+"."+m);return f}finally{l.delete(d)}}throw Error("Property '"+u+"' has an unsupported value type: "+typeof d+" in "+(n.path??"~/.lmctl/init.toml"))};return c(a,o.key)})}var fo,us=x(()=>{"use strict";YI();QI();Gc();Gc();db();lo();zt();na();fo=["claude","codex","agy","kimi"]});import{homedir as hW}from"node:os";function Tb(t,e){let n=new Set;return{text:t.replace(gW,(s,o)=>{let i=o.trim(),a=_W[i];return a===void 0?(n.add(i),s):a(e)}),unknownNames:[...n].sort()}}function wb(t){return{workdir:t.workdir,teamfile:t.teamfile,date:yW(t.date)}}function yW(t){return t.toISOString().slice(0,10)}var _W,gW,vb=x(()=>{"use strict";Be();_W={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>fi(t.teamfile),home:()=>hW(),date:t=>t.date},gW=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var ch={};me(ch,{_setAgyModelsRunnerForTests:()=>bW,_setCatalogSnapshotForTests:()=>IW,_setCodexModelsRunnerForTests:()=>kW,_setLintOpenCodeConfigProbeForTests:()=>RW,_setLintSessiondirFsOpsForTests:()=>NW,_setTeamfileSeedForTests:()=>AW,buildRootTeamRegistrationRow:()=>Ob,lintTeamfileStructured:()=>lh,registerRootTeam:()=>Vc,runLint:()=>vr,runSeed:()=>oa,seedTeamfile:()=>po,sha256Text:()=>Cb,validateMemberSpec:()=>kt});import{createHash as EW}from"node:crypto";import{accessSync as TW,constants as Sb,existsSync as wW,readFileSync as nh,realpathSync as rh,statSync as vW,writeFileSync as Ib}from"node:fs";import{dirname as ms,resolve as kb}from"node:path";function IW(t){sa=t??void 0}function Rb(t){return UI(t,sa!==void 0?{snapshot:sa}:{})}function Lb(t){return FI(t,sa!==void 0?{snapshot:sa}:{})}function bW(t){ih=t??void 0}function kW(t){ah=t??void 0}function AW(t){Ab=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(Un(),wp)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings,usage:mn(r)}:{error:r.error??"provider seed failed",errorCode:r.errorCode,usage:mn(r),sessionId:r.sessionId}})}function NW(t){fs=t===null?sh:{...sh,...t}}function RW(t){Nb=t??Ni}async function LW(t,e,n){let r=t.filter(o=>o.teamfile===void 0&&o.provider.trim().toLowerCase()==="opencode"&&o.model!==void 0&&o.model.length>0);return(await Promise.all(r.map(async o=>({member:o,result:await Nb({cwd:o.sessiondir??e,model:o.model,...o.effort!==void 0?{effort:o.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:o,result:i})=>i.status==="rejected"?[`[${o.alias}] ${i.option}="${i.value}" rejected by opencode: ${i.error}`]:[])}function xW(t,e){let n=ms(e),r=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??n,a=kb(i);if(r.has(a))continue;let l=CW(a);l!==void 0&&(r.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function CW(t){try{if(fs.existsSync(t)){if(!fs.statSync(t).isDirectory())return"ENOTDIR";fs.accessSync(t,Sb.W_OK);return}let e=DW(t);if(e===void 0)return;if(!fs.statSync(e).isDirectory())return"ENOTDIR";fs.accessSync(e,Sb.W_OK);return}catch(e){return MW(e)??"permission check failed"}}function OW(t){let e=kb(t);try{return rh(e)}catch{return e}}function DW(t){let e=t;for(;;){try{if(fs.existsSync(e))return e}catch{return}let n=ms(e);if(n===e)return;e=n}}function MW(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function xb(t,e){let n;try{n=await W(e,l=>Ne(t,l))}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let r;try{r=be(n)}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let s=mi(r,ms(n));e.stderr.write(`notice: checking teamfile and models ...
|
|
1931
|
+
`);let o=Fp(r.members,{agyModelsRunner:ih,codexModelsRunner:ah});o.push(...await Rb(r.members)),s.push(...await Lb(r.members));let i=nh(n,"utf8"),a=Tb(i,wb({workdir:ms(n),teamfile:n,date:new Date})).unknownNames;a.length>0&&o.push(`unknown template placeholder${a.length===1?"":"s"}: ${a.map(l=>`{{${l}}}`).join(", ")}`),o.push(...Jf(r.members,ms(n))),o.push(...xW(r.members,n)),o.push(...await LW(r.members,ms(n),e.env));for(let l of s)e.stderr.write(`error: ${l.field}: ${l.message}
|
|
1932
|
+
`);for(let l of r.members)oh([l],e),l.session!==void 0&&l.session.length<mo&&o.push(`${l.alias}: sessionid is shorter than ${mo} chars; run lmctl seed to refresh it`);return{ok:!0,result:{config:r,absTeamfile:n,errors:s,warnings:o}}}async function vr(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(SW),0;let n=ae(t,[],[]);if(n.error!==void 0)return e.stderr.write(`error: ${n.error}
|
|
1933
1933
|
`),2;if(n.positionals.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
1934
1934
|
`),2;let r=n.positionals[0],s=await xb(r,e);if(!s.ok)return hn(e,s.message);let{errors:o,warnings:i}=s.result;for(let a of i)e.stderr.write(`warning: ${a}
|
|
1935
1935
|
`);return e.stderr.write(`notice: ${o.length} error${o.length===1?"":"s"}, ${i.length} warning${i.length===1?"":"s"}
|
|
1936
1936
|
`),o.length>0?1:(e.stdout.write(`ok
|
|
1937
|
-
`),0)}function
|
|
1937
|
+
`),0)}function UW(t,e){let n=$W.exec(t);if(n){let s=e.get(n[1].toLowerCase());if(s!==void 0)return{alias:s,message:n[2]}}let r=PW.exec(t);if(r){let s=e.get(r[1].toLowerCase());if(s!==void 0)return{alias:s,message:r[2]}}return{alias:"",message:t}}async function lh(t,e){let n=await xb(t,e);if(!n.ok)return{status:"error",errors:[{alias:"",message:n.message}],warnings:[],counts:{errors:1,warnings:0}};let{config:r,errors:s,warnings:o}=n.result,i=new Map(r.members.map(c=>[c.alias.toLowerCase(),c.alias])),a=s.map(c=>({alias:i.get(c.field.toLowerCase())??"",message:c.message})),l=o.map(c=>UW(c,i));for(let c of l)e.stderr.write(`warning: ${c.alias?`${c.alias}: `:""}${c.message}
|
|
1938
1938
|
`);return e.stderr.write(`notice: ${a.length} error${a.length===1?"":"s"}, ${l.length} warning${l.length===1?"":"s"}
|
|
1939
|
-
`),{status:a.length>0?"error":"ok",errors:a,warnings:l,counts:{errors:a.length,warnings:l.length}}}async function oa(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eh),0;let n=ae(t,[],[]);return n.error!==void 0?bb(e,n.error,eh):n.positionals.length!==1?bb(e,"expected <teamfile.lmctl>",eh):po(n.positionals[0],e)}function
|
|
1940
|
-
`),c=a,d=
|
|
1939
|
+
`),{status:a.length>0?"error":"ok",errors:a,warnings:l,counts:{errors:a.length,warnings:l.length}}}async function oa(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(eh),0;let n=ae(t,[],[]);return n.error!==void 0?bb(e,n.error,eh):n.positionals.length!==1?bb(e,"expected <teamfile.lmctl>",eh):po(n.positionals[0],e)}function FW(t,e,n,r){if(e.preamble===void 0)return t.toLowerCase()!=="lead"?void 0:Ol({teamfile:n,teamfileContent:r});if(typeof e.preamble=="string")return e.preamble;for(let[s,o]of Object.entries(e.preamble))if(s.toLowerCase()===t.toLowerCase())return o}async function po(t,e,n={}){let r;try{r=await W(e,y=>Ne(t,y))}catch(y){return hn(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let s;try{s=rh(r)}catch(y){return hn(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let o=ms(r),i;try{i=be(r)}catch(y){return hn(e,`${t}: ${y instanceof Error?y.message:String(y)}`)}let a=nh(r,"utf8"),l=a.split(`
|
|
1940
|
+
`),c=a,d=jW(l),u=mi(i,o);if(u.length>0){oh(i.members,e);for(let y of u)e.stderr.write(`error: ${y.field}: ${y.message}
|
|
1941
1941
|
`);return 1}try{Xs(e,i,r)}catch{}oh(i.members,e),e.stderr.write(`notice: checking teamfile and models ...
|
|
1942
1942
|
`);for(let y of Fp(i.members,{agyModelsRunner:ih,codexModelsRunner:ah}))e.stderr.write(`warning: ${y}
|
|
1943
1943
|
`);for(let y of await Rb(i.members))e.stderr.write(`warning: ${y}
|
|
@@ -1949,22 +1949,22 @@ ${e("Provider3",t.provider3)}
|
|
|
1949
1949
|
`);let w=si(e,L=>`${y.alias}: still launching (${L}s elapsed)
|
|
1950
1950
|
`),S=m?l.map((L,O)=>O===d.get(y.alias.toLowerCase())?L.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,""):L).join(`
|
|
1951
1951
|
`):l.join(`
|
|
1952
|
-
`),I=
|
|
1952
|
+
`),I=FW(y.alias,n,r,S),b;try{b=xT(r,y.alias)}catch(L){return w.stop(),hn(e,L instanceof Error?L.message:String(L))}try{let L,O;try{L=await Ab({env:e.env,signal:n.signal,onDispatch:()=>{O??=Wc(e,{provider:y.provider,cwd:T,modelRequested:y.model??null,sessionId:""},"operator",{teamfile:r,alias:y.alias})},provider:y.provider,cwd:T,...y.model!==void 0?{model:y.model}:{},...y.effort!==void 0?{effort:y.effort}:{},...I!==void 0?{prompt:I}:{}}),await O?.finish({status:n.signal?.aborted?"cancelled":L.error!==void 0||!L.sessionId||L.sessionId.length<mo?Ls(L.error??"",L.errorCode==="ABORT_ERR"):"ok",sessionId:L.sessionId,usage:mn(L)})}catch(R){throw await O?.finish(Hc(R,{aborted:n.signal?.aborted||R?.code==="ABORT_ERR"})),R}finally{w.stop()}if(n.signal?.aborted)return hn(e,"Seed cancelled during dispatch.");for(let R of L.warnings??[])e.stderr.write(`warning: ${y.alias}: ${R}
|
|
1953
1953
|
`);if(L.error!==void 0||L.sessionId===void 0||L.sessionId.length<mo){let R=`provider did not report a sessionid; no new session was found for ${T} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${y.alias}: seed failed${L.error!==void 0?`: ${L.error}`:`; ${R}`}
|
|
1954
1954
|
`),1}let k=d.get(y.alias.toLowerCase());if(k===void 0)return e.stderr.write(`error: ${y.alias}: could not find matching _MEMBER_ line to update
|
|
1955
|
-
`),1;let v=
|
|
1955
|
+
`),1;let v=OW(T),A=th(l[k],"sessionid",L.sessionId);A=th(A,"sessiondir",v);let N=y.model;if(y.model===void 0){let R;try{R=(await je(L.sessionId,y.provider))?.model}catch{R=void 0}R!==void 0&&R.length>0&&(A=th(A,"model",R),N=R)}if((m||n.guardFile)&&nh(r,"utf8")!==c)return hn(e,`Teamfile changed during seeding; new session ${L.sessionId} was not attached. Existing bindings preserved.`);l[k]=A,p+=1,c=l.join(`
|
|
1956
1956
|
`),Ib(r,c,"utf8"),n.onSeeded?.({alias:y.alias,provider:y.provider,sessionid:L.sessionId,sessiondir:v,...N!==void 0?{model:N}:{}}),e.stdout.write(`${y.alias}: seeded ${L.sessionId} provider=${y.provider} sessiondir=${v} model=${N?JSON.stringify(N):"default (not reported)"}
|
|
1957
1957
|
`)}finally{b()}}let h=l.join(`
|
|
1958
|
-
`),g=
|
|
1959
|
-
`);let E=new Date().toISOString();try{await W(e,y=>{Vc(y,{teamfilePath:s,name:i.name,rawText:g,now:E})})}catch(y){return hn(e,y instanceof Error?y.message:String(y))}return 0}function Cb(t){return
|
|
1958
|
+
`),g=XW(h,rh(r));g!==h&&Ib(r,g,"utf8"),p===0&&e.stdout.write(`no members needed seeding
|
|
1959
|
+
`);let E=new Date().toISOString();try{await W(e,y=>{Vc(y,{teamfilePath:s,name:i.name,rawText:g,now:E})})}catch(y){return hn(e,y instanceof Error?y.message:String(y))}return 0}function Cb(t){return EW("sha256").update(t).digest("hex")}function Ob(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:Cb(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function Vc(t,e){let n=yl(e.rawText,e.teamfilePath);pi(t,e.teamfilePath,n);let r=Ob(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function jW(t){let e=new Map;for(let n=0;n<t.length;n+=1){let r=t[n];if(!/^\s*_MEMBER_\s+\S/.test(r))continue;let s=HW(r,"alias");s!==void 0&&e.set(s.toLowerCase(),n)}return e}function WW(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function HW(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function th(t,e,n){let r=`${e}=${BW(n)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${r}`):`${t.trimEnd()} ${r}`}function BW(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function XW(t,e){let n=`#teamfile: ${e}`,r=t.indexOf(`
|
|
1960
1960
|
`),s=r>=0?t.slice(0,r):t,o=r>=0?t.slice(r+1):"";return s===n?t:s.startsWith("#teamfile:")?o.length>0?`${n}
|
|
1961
1961
|
${o}`:`${n}
|
|
1962
1962
|
`:t.length>0?`${n}
|
|
1963
1963
|
${t}`:`${n}
|
|
1964
|
-
`}function kt(t){if(!
|
|
1964
|
+
`}function kt(t){if(!WW(t.alias))return`invalid alias "${t.alias}"`;if(!ui(t.provider))return`invalid provider "${t.provider}"`}function hn(t,e){return t.stderr.write(`error: ${e}
|
|
1965
1965
|
`),1}function bb(t,e,n){return t.stderr.write(`error: ${e}
|
|
1966
1966
|
${n}`),2}function oh(t,e){for(let n of t)n.teamfile!==void 0&&e.stderr.write(`warning: member "${n.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
|
|
1967
|
-
`)}var mo,
|
|
1967
|
+
`)}var mo,SW,eh,sh,Ab,fs,Nb,ih,ah,sa,$W,PW,_n=x(()=>{"use strict";Ko();Bp();Be();lo();Kf();om();hl();fn();le();rn();vb();Sl();uf();Fe();mo=5,SW=`usage: lmctl lint <teamfile.lmctl>
|
|
1968
1968
|
|
|
1969
1969
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
1970
1970
|
For opencode members with model=, lint also asks the local ACP provider to
|
|
@@ -2024,7 +2024,7 @@ possibly work, seed reports it as an error and seeds nothing.
|
|
|
2024
2024
|
and save it to <file> (lmctl.com curates these, not lmctl itself).
|
|
2025
2025
|
Refuses to overwrite an existing <file> unless --force is given.
|
|
2026
2026
|
--script <name> With --save-script, fetch commands/<name>.lms instead of the default
|
|
2027
|
-
`,sh={existsSync:
|
|
2027
|
+
`,sh={existsSync:wW,statSync:vW,accessSync:TW},Ab=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Un(),wp)),n=await e(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings,usage:mn(n)}:{error:n.error??"provider seed failed",errorCode:n.errorCode,usage:mn(n),sessionId:n.sessionId}},fs=sh,Nb=Ni;$W=/^\[([^\]]+)\]\s+(.*)$/s,PW=/^([^:\s][^:]*):\s+(.*)$/s});function Mb(t){return uh[t.trim().toLowerCase()]}function $b(t){let e=t.split(":");if(e.length<2)return{error:`invalid member spec "${t}" \u2014 expected Alias:provider[:model]`};let[n,r]=e,s=e.length>2?e.slice(2).join(":"):void 0;if(n===""||r==="")return{error:`invalid member spec "${t}" \u2014 expected Alias:provider[:model]`};let o=kt({alias:n,provider:r});return o!==void 0?{error:o}:s!==void 0&&s===""?{error:`invalid member spec "${t}" \u2014 empty model`}:{spec:{alias:n,provider:r,...s!==void 0?{model:s}:{}}}}function Db(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function qW(t){return[`_MEMBER_ provider=${t.provider} alias=${Db(t.alias)}`,...t.model!==void 0?[`model=${Db(t.model)}`]:[]].join(" ")}function Sr(t){let{teamName:e,members:n}=t,r=n.map(qW).join(`
|
|
2028
2028
|
`);return`# ${e}
|
|
2029
2029
|
#
|
|
2030
2030
|
# This is a starting point, not a finished teamfile -- edit alias/provider/model
|
|
@@ -2036,10 +2036,10 @@ ${r}
|
|
|
2036
2036
|
`}function Ub(t){return t.split(`
|
|
2037
2037
|
`).map(e=>Pb.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 ").replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
|
|
2038
2038
|
`)}function dh(t,e){let r=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return r===null?void 0:r[1]??r[2]??""}function Kc(t){let e=[];for(let n of t.split(`
|
|
2039
|
-
`)){if(!Pb.test(n))continue;let r=dh(n,"alias"),s=dh(n,"provider");if(r===void 0||s===void 0)continue;let o=dh(n,"model");e.push({alias:r,provider:s,...o!==void 0&&o!==""?{model:o}:{}})}return e}var uh,Jc,Pb,Yc=x(()=>{"use strict";_n();uh={1:["Lead"],lead:["Lead"],2:["Lead","Reviewer"],"lead-reviewer":["Lead","Reviewer"],3:["Lead","Coder","Reviewer"],"lead-coder-reviewer":["Lead","Coder","Reviewer"]},Jc="1|2|3|lead|lead-reviewer|lead-coder-reviewer";Pb=/^\s*_MEMBER_\s+\S/});var gh={};me(gh,{PROVIDER_NAMES:()=>yo,adoptSession:()=>_h,chooseMember:()=>la,chooseTeamfile:()=>ph,completeTeamfile:()=>Fb,createPromptTeam:()=>hh,field:()=>ho,prepareTeam:()=>aa,setField:()=>Ir});import{existsSync as ia,mkdirSync as fh,readFileSync as zc,readdirSync as
|
|
2039
|
+
`)){if(!Pb.test(n))continue;let r=dh(n,"alias"),s=dh(n,"provider");if(r===void 0||s===void 0)continue;let o=dh(n,"model");e.push({alias:r,provider:s,...o!==void 0&&o!==""?{model:o}:{}})}return e}var uh,Jc,Pb,Yc=x(()=>{"use strict";_n();uh={1:["Lead"],lead:["Lead"],2:["Lead","Reviewer"],"lead-reviewer":["Lead","Reviewer"],3:["Lead","Coder","Reviewer"],"lead-coder-reviewer":["Lead","Coder","Reviewer"]},Jc="1|2|3|lead|lead-reviewer|lead-coder-reviewer";Pb=/^\s*_MEMBER_\s+\S/});var gh={};me(gh,{PROVIDER_NAMES:()=>yo,adoptSession:()=>_h,chooseMember:()=>la,chooseTeamfile:()=>ph,completeTeamfile:()=>Fb,createPromptTeam:()=>hh,field:()=>ho,prepareTeam:()=>aa,setField:()=>Ir});import{existsSync as ia,mkdirSync as fh,readFileSync as zc,readdirSync as GW,statSync as VW,writeFileSync as mh}from"node:fs";import{basename as _o,dirname as Qc,extname as Zc,resolve as go}from"node:path";function ho(t,e){return new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t)?.slice(1).find(n=>n!==void 0)}function Ir(t,e,n){if(/["\r\n]/.test(n))throw new Error(`${e} cannot contain quotes or newlines in a teamfile.`);let r=`${e}=${/\s/.test(n)?`"${n}"`:n}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${r}`):`${t.trimEnd()} ${r}`}async function JW(t,e){let n=wr(),r=[...new Set(n?Object.values(n).map(s=>s.provider):[])];for(e.stderr.write(`Providers from lmctl init: ${r.join(", ")||"(none saved)"}; another supported provider may be typed.
|
|
2040
2040
|
`);;){let s=await t.ask("Provider: ");if(yo.includes(s))return s;e.stderr.write(`Known providers: ${yo.join(", ")}
|
|
2041
2041
|
`)}}async function Fb(t,e,n,r={},s){let o=ia(t),i=o?zc(t,"utf8"):"",a=i.split(`
|
|
2042
|
-
`),l=a.map((m,p)=>/^\s*_MEMBER_(?:\s|$)/.test(m)?p:-1).filter(m=>m>=0);if(!l.length){let m=s?[s]:(await e.ask("Member aliases [Lead] (comma separated): ")||"Lead").split(",").map(p=>p.trim());for(let p of m)l.push(a.length),a.push(Ir("_MEMBER_","alias",p))}let c=new Set;for(let m of l){let p=a[m],_=ho(p,"alias");if(_||(_=await e.ask(`Alias for member on line ${m+1}: `)),!/^[A-Za-z][A-Za-z0-9_-]*$/.test(_)||c.has(_.toLowerCase()))throw new Error(`Invalid or duplicate alias: ${_}`);if(c.add(_.toLowerCase()),p=Ir(p,"alias",_),!ho(p,"teamfile")){let h=ho(p,"provider");h||(h=await
|
|
2042
|
+
`),l=a.map((m,p)=>/^\s*_MEMBER_(?:\s|$)/.test(m)?p:-1).filter(m=>m>=0);if(!l.length){let m=s?[s]:(await e.ask("Member aliases [Lead] (comma separated): ")||"Lead").split(",").map(p=>p.trim());for(let p of m)l.push(a.length),a.push(Ir("_MEMBER_","alias",p))}let c=new Set;for(let m of l){let p=a[m],_=ho(p,"alias");if(_||(_=await e.ask(`Alias for member on line ${m+1}: `)),!/^[A-Za-z][A-Za-z0-9_-]*$/.test(_)||c.has(_.toLowerCase()))throw new Error(`Invalid or duplicate alias: ${_}`);if(c.add(_.toLowerCase()),p=Ir(p,"alias",_),!ho(p,"teamfile")){let h=ho(p,"provider");h||(h=await JW(e,n));let g=kt({alias:_,provider:h});if(g)throw new Error(g);if(p=Ir(p,"provider",h),!ho(p,"model")&&!ho(p,"sessionid")){let E=await(r.models??co)(h).catch(()=>[]);E.length&&n.stderr.write(`Models for ${h}:
|
|
2043
2043
|
${E.map(T=>` ${T}`).join(`
|
|
2044
2044
|
`)}
|
|
2045
2045
|
`);let y=await e.ask(`Model for ${_} (blank for provider default): `);y&&(p=Ir(p,"model",y))}}a[m]=p}let d=a.join(`
|
|
@@ -2047,25 +2047,25 @@ ${E.map(T=>` ${T}`).join(`
|
|
|
2047
2047
|
`));if(o||(d=Sr({teamName:_o(t,Zc(t)),members:u.members})),d!==i){if(o&&zc(t,"utf8")!==i)throw new Error("Teamfile changed while completing it; nothing was written.");fh(Qc(t),{recursive:!0}),mh(t,d.endsWith(`
|
|
2048
2048
|
`)?d:`${d}
|
|
2049
2049
|
`,o?{encoding:"utf8"}:{encoding:"utf8",flag:"wx"}),n.stderr.write(`Wrote ${t}
|
|
2050
|
-
`)}}async function aa(t,e,n,r={},s){if(!xe(t))throw new Error("Expected a .lmctl or .lmc teamfile.");let o=ia(t)?await(r.lint??vr)([t],n):0,i=ia(t)?be(t):null,a=!i||!i.members.length||i.parseErrors.length>0||i.members.some(d=>!d.teamfile&&!d.model&&!d.session);a&&await Fb(t,e,n,r,s);let l=a?await(r.lint??vr)([t],n):o;return l!==0?l:be(t).members.some(d=>!d.teamfile&&!d.session)?r.seed?r.seed([t],n):po(t,n,{guardFile:!0}):0}async function ph(t,e){let n=
|
|
2050
|
+
`)}}async function aa(t,e,n,r={},s){if(!xe(t))throw new Error("Expected a .lmctl or .lmc teamfile.");let o=ia(t)?await(r.lint??vr)([t],n):0,i=ia(t)?be(t):null,a=!i||!i.members.length||i.parseErrors.length>0||i.members.some(d=>!d.teamfile&&!d.model&&!d.session);a&&await Fb(t,e,n,r,s);let l=a?await(r.lint??vr)([t],n):o;return l!==0?l:be(t).members.some(d=>!d.teamfile&&!d.session)?r.seed?r.seed([t],n):po(t,n,{guardFile:!0}):0}async function ph(t,e){let n=GW(e).filter(r=>xe(r)&&VW(go(e,r)).isFile()).sort().map(r=>go(e,r));return n.length===1?n[0]:n.length>1?t.choose("Teamfile:",n):go(e,await t.ask("Teamfile path: "))}async function la(t,e,n){let r=be(t).members.map(s=>s.alias);if(e){let s=r.filter(i=>i.toLowerCase()===e.toLowerCase()),o=s.length?s:r.filter(i=>i.toLowerCase().startsWith(e.toLowerCase()));return o.length?n.choose(`Member matching ${e}:`,o):n.choose(`No member matches ${e}. Choose a member:`,r,!0)}return n.choose("Member:",r)}async function hh(t,e,n,r){let s=go(n,await r.ask(`Teamfile [${t}.lmc]: `)||`${t}.lmc`);if(!xe(s))throw new Error("Choose a .lmc or .lmctl teamfile.");if(ia(s))throw new Error(`Teamfile already exists: ${s}. Use its alias to prompt the existing member.`);let o=await r.ask("Alias [Lead]: ")||"Lead",i=kt({alias:o,provider:t});if(i)throw new Error(i);Ir("_MEMBER_","model",e);let a=Sr({teamName:_o(s,Zc(s)),members:[{alias:o,provider:t,model:e}]});return fh(Qc(s),{recursive:!0}),mh(s,a,{encoding:"utf8",flag:"wx"}),{file:s,alias:o}}async function _h(t,e,n,r,s,o,i){if(!s.interactive)return o.stdout.write(`Session is not registered. Run interactively to create a teamfile for it.
|
|
2051
2051
|
`),null;if(!await s.confirm("Create a teamfile and alias for this existing session?"))return null;let a=await s.ask(`Teamfile [${e}.lmc]: `)||`${e}.lmc`,l=go(r,a);if(!xe(l))throw new Error("Choose a .lmc or .lmctl teamfile.");let c=ia(l)?zc(l,"utf8"):void 0,d=await s.ask("Alias [Lead]: ")||"Lead",u=kt({alias:d,provider:e});if(u)throw new Error(u);if(c!==void 0&&!await s.confirm(`Overwrite ${l}?`))return null;let f=Sr({teamName:_o(l,Zc(l)),members:[{alias:d,provider:e,...n?{model:n}:{}}]});if(f=f.split(`
|
|
2052
2052
|
`).map(m=>m.startsWith("_MEMBER_")?Ir(m,"sessionid",t):m).join(`
|
|
2053
2053
|
`),i||(i=go(r,await s.ask(`Session directory [${r}]: `)||r)),i&&(f=f.split(`
|
|
2054
2054
|
`).map(m=>m.startsWith("_MEMBER_")?Ir(m,"sessiondir",i):m).join(`
|
|
2055
2055
|
`)),await W(o,m=>pi(m,l,Cn(f,_o(l)))),c!==void 0&&zc(l,"utf8")!==c)throw new Error("Teamfile changed; adoption cancelled.");return fh(Qc(l),{recursive:!0}),mh(l,f,c===void 0?{encoding:"utf8",flag:"wx"}:{encoding:"utf8"}),await W(o,m=>Vc(m,{teamfilePath:Ne(l),name:_o(l,Zc(l)),rawText:f,now:new Date().toISOString()})),o.stdout.write(`Registered ${l}:${d} -> ${t}
|
|
2056
|
-
`),{file:l,alias:d}}var yo,ed=x(()=>{"use strict";rn();Be();us();na();Fc();_n();Yc();le();yo=Object.keys(ds)});var Th={};me(Th,{resolvePromptInput:()=>yh,runChat:()=>Eh});import{readFileSync as
|
|
2056
|
+
`),{file:l,alias:d}}var yo,ed=x(()=>{"use strict";rn();Be();us();na();Fc();_n();Yc();le();yo=Object.keys(ds)});var Th={};me(Th,{resolvePromptInput:()=>yh,runChat:()=>Eh});import{readFileSync as KW,openSync as YW}from"node:fs";import{homedir as zW}from"node:os";import{join as QW}from"node:path";import{spawn as ZW}from"node:child_process";function tH(t){let[e,n]=t;if(!e)return t;if(!On(e)){let r=e.indexOf(":");if(r>0&&hi(e.slice(0,r))&&xe(e.slice(r+1)))return[`${e.slice(r+1)}:${e.slice(0,r)}`,...t.slice(1)]}return hi(e)&&n&&xe(n)?[n,e,...t.slice(2)]:t}function nH(t){return QW(zW(),".lmctl",`daemonize-${t}.log`)}function rH(t){let e=process.stdout.isTTY===!0,n=process.stderr.isTTY===!0;if(!e&&!n)return{stdio:["ignore","inherit","inherit"],logPath:null};let r=nH(t),s=YW(r,"a");return{stdio:["ignore",e?s:"inherit",n?s:"inherit"],logPath:r}}function sH(t,e){let{stdio:n,logPath:r}=rH(process.pid),s=ZW(process.argv[0],[process.argv[1],"chat",...t],{detached:!0,stdio:n,env:{...process.env,[td]:"1"}});return s.on("error",o=>{e.stderr.write(`error: --daemonize failed to spawn the detached child: ${o.message}
|
|
2057
2057
|
`)}),s.unref(),e.stdout.write(`${JSON.stringify({status:"detached",pid:s.pid??null,logPath:r})}
|
|
2058
2058
|
`),0}async function Eh(t,e={stdout:process.stdout,stderr:process.stderr}){t.includes("--json")&&(e=sl(e));let n=e.env??process.env;if(t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${jb}
|
|
2059
|
-
`),0;if(t.includes("--daemonize")&&n[td]!=="1")return
|
|
2059
|
+
`),0;if(t.includes("--daemonize")&&n[td]!=="1")return sH(t.filter(i=>i!=="--daemonize"),e);n[td]==="1"&&(ol(e),delete process.env[td]);let r=oH(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2060
2060
|
${jb}
|
|
2061
2061
|
`),2;if(r.provider!==void 0){if(r.promptFile!==void 0){let a=await yh(r.promptFile,e);if(typeof a!="string")return e.stderr.write(`error: ${a.error}
|
|
2062
2062
|
`),2;r.prompt=a}if(!r.prompt)return e.stderr.write(`error: prompt text is required with --provider (or provide --prompt-file)
|
|
2063
2063
|
`),2;let{runFreshPrompt:i}=await Promise.resolve().then(()=>(VI(),GI));return i({provider:r.provider,model:r.model,...r.sessiondir!==void 0?{sessiondir:r.sessiondir}:{},prompt:r.prompt,permissionMode:r.permissionMode,...r.json===!0?{json:!0}:{},...r.verbose===!0?{verbose:!0}:{}},e)}let s=new Fn(e);try{let i=On(r.target??"");if(i){if(r.alias&&r.alias!==i.alias)throw new Error("Specify one teamfile and alias.");r.target=i.teamfile,r.alias=i.alias}if(r.target&&!xe(r.target))throw new Error("prompt is teamfile-only: a teamfile and alias are required.");if((!r.target||!r.alias)&&!s.interactive)throw new Error('A teamfile and alias are required. Use: lmctl prompt <teamfile> <alias> "<prompt>"');if(!r.target){let{chooseTeamfile:a}=await Promise.resolve().then(()=>(ed(),gh));r.target=await a(s,e.cwd??process.cwd())}if(!xe(r.target))throw new Error("Choose a .lmctl or .lmc teamfile.");if(!r.alias){let{chooseMember:a}=await Promise.resolve().then(()=>(ed(),gh));r.alias=await a(r.target,void 0,s)}if(!r.promptFile&&!r.prompt){if(!s.interactive)throw new Error(`prompt text is required. Use: lmctl prompt ${r.target} ${r.alias} "<prompt>"`);if(r.prompt=await s.ask(`Prompt for ${r.target} ${r.alias}: `),!r.prompt)throw new Error("prompt text is required")}}catch(i){return e.stderr.write(`error: ${i instanceof Error?i.message:String(i)}
|
|
2064
2064
|
`),2}finally{s.close()}if(r.promptFile!==void 0){let i=await yh(r.promptFile,e);if(typeof i!="string")return e.stderr.write(`error: ${i.error}
|
|
2065
|
-
`),2;r.prompt=i}let o=sn(
|
|
2065
|
+
`),2;r.prompt=i}let o=sn(eH,{target:r.target,alias:r.alias,flags:{}});if(o.mode==="error")return e.stderr.write(`error: ${o.message}
|
|
2066
2066
|
`),2;if(o.mode==="managed")return 2;if(o.mode==="ai-team"){if(o.alias===void 0)return e.stderr.write(`error: prompt: alias required (internal)
|
|
2067
2067
|
`),2;e.stderr.write(`${o.alias}: turn running; this can take minutes
|
|
2068
|
-
`);let i=eT(e,{teamfile:o.teamfile,alias:o.alias}),a=new AbortController,l,c,d=_=>{l===void 0&&(l=_==="SIGINT"?130:_==="SIGTERM"?143:129,a.abort(_),c=setTimeout(()=>process.exit(l),1e3),c.unref())},u=()=>d("SIGINT"),f=()=>d("SIGTERM"),m=()=>d("SIGHUP");process.on("SIGINT",u),process.on("SIGTERM",f),process.on("SIGHUP",m);let p;try{p=await Lc({signal:a.signal,teamfile:o.teamfile,alias:o.alias,prompt:r.prompt,permissionMode:r.permissionMode,idleTimeoutMs:0,...r.rootFlag!==void 0?{rootFlag:r.rootFlag}:{},env:n,io:e,onEvent:_=>{i.poke(_),!(r.json===!0&&_.kind==="delta")&&
|
|
2068
|
+
`);let i=eT(e,{teamfile:o.teamfile,alias:o.alias}),a=new AbortController,l,c,d=_=>{l===void 0&&(l=_==="SIGINT"?130:_==="SIGTERM"?143:129,a.abort(_),c=setTimeout(()=>process.exit(l),1e3),c.unref())},u=()=>d("SIGINT"),f=()=>d("SIGTERM"),m=()=>d("SIGHUP");process.on("SIGINT",u),process.on("SIGTERM",f),process.on("SIGHUP",m);let p;try{p=await Lc({signal:a.signal,teamfile:o.teamfile,alias:o.alias,prompt:r.prompt,permissionMode:r.permissionMode,idleTimeoutMs:0,...r.rootFlag!==void 0?{rootFlag:r.rootFlag}:{},env:n,io:e,onEvent:_=>{i.poke(_),!(r.json===!0&&_.kind==="delta")&&lH(e,_,r.verbose===!0)},...r.json===!0?{onAccepted:_=>{i.poke(),e.stdout.write(`${JSON.stringify({status:"accepted",message_id:_})}
|
|
2069
2069
|
`)}}:{}})}finally{i.stop(),c!==void 0&&clearTimeout(c),process.removeListener("SIGINT",u),process.removeListener("SIGTERM",f),process.removeListener("SIGHUP",m)}return l!==void 0?l:r.json===!0?p.status==="busy"?(e.stdout.write(`${JSON.stringify({status:"busy",message:p.message,teamChatLogId:p.teamChatLogId})}
|
|
2070
2070
|
`),1):p.status==="error"?(e.stdout.write(`${JSON.stringify({status:"error",errorKind:p.errorKind,message:p.message,teamChatLogId:p.teamChatLogId,...p.messageId===null?{}:{message_id:p.messageId}})}
|
|
2071
2071
|
`),1):(e.stdout.write(`${JSON.stringify({status:p.status,replyText:p.replyText,teamChatLogId:p.teamChatLogId,...p.messageId===null?{}:{message_id:p.messageId},turn_finished:!0,note:Wb(o.alias)})}
|
|
@@ -2078,33 +2078,33 @@ ${jb}
|
|
|
2078
2078
|
`):e.stdout.write(`${p.replyText}${p.replyText.endsWith(`
|
|
2079
2079
|
`)?"":`
|
|
2080
2080
|
`}`),e.stderr.write(`note: ${Wb(o.alias)}
|
|
2081
|
-
`),p.status==="stalled"?1:0)}return 2}function Wb(t){return`${t}'s turn has finished and exited; resubmit \`lmctl prompt\` to continue (no persistent session is left running)`}function
|
|
2081
|
+
`),p.status==="stalled"?1:0)}return 2}function Wb(t){return`${t}'s turn has finished and exited; resubmit \`lmctl prompt\` to continue (no persistent session is left running)`}function oH(t){let e=[],n="yolo",r,s,o,i,a,l=!1,c=!1;for(let p=0;p<t.length;p+=1){let _=t[p];if(_==="--permission-mode"){let h=t[++p];if(h===void 0||h.startsWith("--"))return"missing value for --permission-mode";if(h!=="plan"&&h!=="yolo")return`--permission-mode must be one of plan|yolo (got "${h}")`;n=h;continue}if(_==="--from"||_.startsWith("--from="))return EI("prompt");if(_.startsWith("I_am="))return`unknown argument: ${_}`;if(_==="--root"){let h=t[++p];if(h===void 0||h.startsWith("--"))return"missing value for --root";r=h;continue}if(_==="--prompt-file"){let h=t[++p];if(h===void 0||h!=="-"&&h.startsWith("--"))return"missing value for --prompt-file";s=h;continue}if(_==="--provider"||_==="--model"||_==="--sessiondir"){let h=t[++p];if(h===void 0||h.startsWith("--"))return`missing value for ${_}`;_==="--provider"?o=h:_==="--model"?i=h:a=h;continue}if(_==="--force"||_.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl prompt)";if(_==="--json"){l=!0;continue}if(_==="--verbose"){c=!0;continue}if(_.startsWith("--"))return`unknown flag: ${_}`;e.push(_)}if(o===void 0&&(e=tH(e)),o!==void 0){if(e.length>(s===void 0?1:0))return"--provider fresh mode cannot be combined with a teamfile or alias; provide one prompt or --prompt-file";if(i===void 0)return"--model is required with --provider"}else if(i!==void 0||a!==void 0)return"--model and --sessiondir require --provider";if(o!==void 0){let p={prompt:s===void 0?e[0]??"":"",permissionMode:n};return s!==void 0&&(p.promptFile=s),l&&(p.json=!0),c&&(p.verbose=!0),p.provider=o,p.model=i,a!==void 0&&(p.sessiondir=a),p}let d,u,f="";if(s!==void 0){if(e.length!==0)if(e.length===1)d=e[0];else if(e.length===2)d=e[0],u=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";f=""}else if(e.length!==0)if(e.length===1)d=e[0];else if(e.length===2)d=e[0],xe(d)?u=e[1]:f=e[1];else if(e.length===3)d=e[0],u=e[1],f=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;let m={prompt:f,permissionMode:n};return d!==void 0&&(m.target=d),u!==void 0&&(m.alias=u),r!==void 0&&(m.rootFlag=r),s!==void 0&&(m.promptFile=s),l&&(m.json=l),c&&(m.verbose=c),o!==void 0&&(m.provider=o),i!==void 0&&(m.model=i),a!==void 0&&(m.sessiondir=a),m}async function yh(t,e,n=process.stdin){let r;try{r=t==="-"?await iH(n):KW(t,"utf8")}catch(o){let i=o instanceof Error?o.message:String(o);return{error:`--prompt-file ${t}: ${i}`}}let s=r.endsWith(`\r
|
|
2082
2082
|
`)?r.slice(0,-2):r.endsWith(`
|
|
2083
|
-
`)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function
|
|
2084
|
-
`)}function
|
|
2083
|
+
`)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function iH(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function aH(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;U({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
|
|
2084
|
+
`)}function lH(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?aH(t,e.alias,e.event,n):t.stderr.write(e.message)}var eH,jb,td,nd=x(()=>{"use strict";Cc();nt();Be();nt();le();nt();xp();Gi();re();le();eH={name:"prompt",allowsBareTeamfile:!1,supportsRaw:!1},jb=`usage: lmctl prompt <teamfile> <alias> "<prompt>" [--json] [--verbose]
|
|
2085
2085
|
lmctl prompt <teamfile> <alias> --prompt-file <file-path> [--json] [--verbose]
|
|
2086
2086
|
|
|
2087
2087
|
lmctl prompt --provider <name> --model <model> "<prompt>" [--sessiondir <dir>] [--json] [--verbose]
|
|
2088
2088
|
lmctl prompt --provider <name> --model <model> --prompt-file <file-path> [--sessiondir <dir>] [--json] [--verbose]
|
|
2089
2089
|
|
|
2090
2090
|
--json Emit JSON results.
|
|
2091
|
-
--verbose Show provider progress on stderr.`;td="LMCTL_CHAT_DAEMONIZED"});import{spawn as
|
|
2092
|
-
`),1}return new Promise(o=>{let i=!e.stdin||e.stdin===process.stdin,a=e.stdout===process.stdout,l=e.stderr===process.stderr,c=
|
|
2091
|
+
--verbose Show provider progress on stderr.`;td="LMCTL_CHAT_DAEMONIZED"});import{spawn as cH}from"node:child_process";import{accessSync as Xb,closeSync as dH,constants as qb,lstatSync as uH,openSync as fH,readFileSync as mH,readSync as pH,realpathSync as hH,statSync as Gb}from"node:fs";import{basename as wh,dirname as ps,delimiter as _H,resolve as rd,join as Eo}from"node:path";import{fileURLToPath as gH}from"node:url";import{constants as Hb}from"node:os";import*as Vb from"node:path";function vh(t){if(Xb(t,qb.X_OK),!Gb(t).isFile())throw Error("not a file");return hH(t)}function Jb(t){try{let e=fH(t,"r");try{let n=Buffer.alloc(2048);return n.subarray(0,pH(e,n,0,n.length,0)).toString("utf8").match(/lmscript-shim-protocol\s+(\d+)/)?.[1]}finally{dH(e)}}catch{return}}function Bb(t){return Jb(t)===EH.split(" ").at(-1)}function TH(t,e=rd(ps(gH(import.meta.url)),"../../bin"),n=process.cwd(),r=process.argv[1]){if(t.LMSCRIPT_BIN){let _=rd(n,t.LMSCRIPT_BIN),h;try{h=vh(_)}catch{throw Error(`LMSCRIPT_BIN is set to ${_}, which is not an executable file; correct it, or unset it to use the sibling binary`)}let g=Jb(h);if(g!==void 0&&g!=="2")throw Error(`LMSCRIPT_BIN ${_} declares protocol ${g}; this shim requires protocol 2`);return h}let s=[],o=ps(e),i=ps(o),a;try{let _=JSON.parse(mH(Eo(i,"package.json"),"utf8"));a=Array.isArray(_.workspaces)?_.workspaces:_.workspaces?.packages}catch{}let l=_=>Array.isArray(a)&&a.some(h=>typeof h=="string"&&yH(_,h.replace(/^\.\//,"").replace(/\/$/,""))),c=l(wh(o))&&l("lmscript"),d=_=>{try{return uH(_),!0}catch(h){if(h.code==="ENOENT")return!1;throw h}},u=_=>{let h;try{h=vh(_)}catch{throw Error(`Standalone lmscript sibling ${_} is not an executable file; repair the sibling instead of falling through to another copy`)}if(!Bb(h))throw Error(`Standalone lmscript sibling ${_} is not a compatible lmscript (requires protocol 2)`);return h};if(c){let _=Eo(i,"lmscript","bin","lmscript"),h=`npm run build --prefix ${i}`;if(!d(_))throw Error(`Standalone lmscript workspace sibling ${_} is missing; run ${h}`);let g;try{g=u(_)}catch(y){throw Error(`${y instanceof Error?y.message:String(y)}; run ${h}`)}let E=Eo(i,"lmscript","dist","runner.js");try{if(Xb(E,qb.R_OK),!Gb(E).isFile())throw Error("not a file")}catch{throw Error(`Standalone lmscript sibling found but ${E} is missing or not a readable file; run ${h}`)}return g}let f=ps(o),m=wh(f)==="node_modules"?f:wh(ps(f))==="node_modules"?ps(f):void 0,p=[Eo(e,"lmscript"),...m?[Eo(m,"lmscript","bin","lmscript")]:[],...r?[Eo(ps(rd(n,r)),"lmscript")]:[]];for(let _ of new Set(p)){if(d(_))return u(_);s.push(_)}for(let _ of new Set((t.PATH??"").split(_H).filter(Boolean).map(h=>rd(n,h,"lmscript")))){let h;try{h=vh(_)}catch{s.push(_);continue}if(Bb(h))return h;s.push(_+" (not a compatible lmscript)")}throw Error("Standalone lmscript not found; set LMSCRIPT_BIN or install the sibling binary. Tried: "+s.join(", "))}async function hs(t,e){let n={...process.env,...e.env},r=e.cwd??process.cwd(),s;try{s=TH(n,void 0,r)}catch(o){return e.stderr.write("error: "+String(o.message)+`
|
|
2092
|
+
`),1}return new Promise(o=>{let i=!e.stdin||e.stdin===process.stdin,a=e.stdout===process.stdout,l=e.stderr===process.stderr,c=cH(process.execPath,[s,...t],{cwd:r,env:{...n,LMSCRIPT_LIFELINE_FD:"3"},detached:process.platform!=="win32",stdio:[i?"inherit":"pipe",a?"inherit":"pipe",l?"inherit":"pipe","pipe"]});c.stdio[3]?.on("error",()=>{});let d=!1,u=g=>{d||(d=!0,process.removeListener("SIGINT",m),process.removeListener("SIGTERM",p),process.removeListener("SIGHUP",_),process.removeListener("SIGWINCH",h),o(g))},f=g=>{try{c.pid&&process.platform!=="win32"?process.kill(-c.pid,g):c.kill(g)}catch(E){E.code!=="ESRCH"&&e.stderr.write("error: signal forwarding failed: "+String(E)+`
|
|
2093
2093
|
`)}},m=()=>f("SIGINT"),p=()=>f("SIGTERM"),_=()=>f("SIGHUP");process.on("SIGINT",m),process.on("SIGTERM",p),process.on("SIGHUP",_);let h=()=>f("SIGWINCH");process.on("SIGWINCH",h),c.stdout?.on("data",g=>e.stdout.write(String(g))),c.stderr?.on("data",g=>e.stderr.write(String(g))),i||(e.stdin.pipe(c.stdin),c.stdin.on("error",E=>{E.code!=="EPIPE"&&e.stderr.write("error: child stdin: "+E.message+`
|
|
2094
2094
|
`)})),c.once("error",g=>{e.stderr.write(`error: could not start ${s}: ${g.message}
|
|
2095
|
-
`),u(1)}),c.once("close",(g,E)=>u(g??(E&&Hb.signals[E]?128+Hb.signals[E]:1)))})}var
|
|
2095
|
+
`),u(1)}),c.once("close",(g,E)=>u(g??(E&&Hb.signals[E]?128+Hb.signals[E]:1)))})}var yH,EH,sd=x(()=>{"use strict";yH=Vb.matchesGlob,EH="lmscript-shim-protocol 2"});var Yb={};me(Yb,{runScript:()=>Sh});async function Sh(t,e={stdout:process.stdout,stderr:process.stderr}){if(ol(e),!t.length)return D(e,Kb);if(["help","--help","-h"].includes(t[0])){let n="",r=!0,o=await hs(t,{...e,stdout:{write:i=>{if(!r){e.stdout.write(i);return}n+=i;let a=n.indexOf(`
|
|
2096
2096
|
`);a<0||(e.stdout.write(n.slice(0,a+1).startsWith("Usage: lmscript ")?"Usage: "+Kb.slice(7)+`
|
|
2097
|
-
`:n.slice(0,a+1)),e.stdout.write(n.slice(a+1)),n="",r=!1)}}});return n&&e.stdout.write(n),o}return hs(t,e)}var Kb,Ih=x(()=>{"use strict";sd();le();Kb="usage: lmctl script [--check|--dry-run|--lint] [--no-preflight] [--dry-loop-limit N] [--dryrun-timeout MS] [--plan-format text|json] [--resumepoint PATH] [--pref FILE] [--module SPEC=FILE]... <file>|-| -e <code> [args...]"});import{execFileSync as bh}from"node:child_process";import{dirname as zb,resolve as
|
|
2097
|
+
`:n.slice(0,a+1)),e.stdout.write(n.slice(a+1)),n="",r=!1)}}});return n&&e.stdout.write(n),o}return hs(t,e)}var Kb,Ih=x(()=>{"use strict";sd();le();Kb="usage: lmctl script [--check|--dry-run|--lint] [--no-preflight] [--dry-loop-limit N] [--dryrun-timeout MS] [--plan-format text|json] [--resumepoint PATH] [--pref FILE] [--module SPEC=FILE]... <file>|-| -e <code> [args...]"});import{execFileSync as bh}from"node:child_process";import{dirname as zb,resolve as wH}from"node:path";function Qb(t){return(0,kh.formatCount)(t)}async function Ah(t,e){return W(t,n=>{let r=n.query(`SELECT config_warnings FROM tracked_invocation
|
|
2098
2098
|
WHERE target_teamfile = ? AND target_alias = ? AND config_warnings IS NOT NULL
|
|
2099
|
-
ORDER BY started_at DESC LIMIT 1`,e.teamfile,e.alias);if(r.length!==0)try{let s=JSON.parse(r[0].config_warnings);if(!Array.isArray(s))return;let o=s.filter(i=>typeof i=="string"&&i.length>0);return o.length>0?o:void 0}catch{return}})}function ca(t,e,n,r){let s=Ne(t,e);if(n.has(s))return[];n.add(s);let o=nn(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...ca(
|
|
2099
|
+
ORDER BY started_at DESC LIMIT 1`,e.teamfile,e.alias);if(r.length!==0)try{let s=JSON.parse(r[0].config_warnings);if(!Array.isArray(s))return;let o=s.filter(i=>typeof i=="string"&&i.length>0);return o.length>0?o:void 0}catch{return}})}function ca(t,e,n,r){let s=Ne(t,e);if(n.has(s))return[];n.add(s);let o=nn(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...ca(wH(zb(s),a.teamfile),e,n,[...r,a.alias]));continue}i.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session!==void 0&&a.session.length>0?a.session:null,model:a.model??null})}return i}async function da(t,e){try{let n=await W(t,r=>e.map(s=>{let o=Zt(r,s.teamfile,s.alias);return[To(s.teamfile,s.alias),vH(o)]}));return new Map(n)}catch{return new Map}}function To(t,e){return`${t}\0${e.toLowerCase()}`}function vH(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:od(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function od(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function id(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale"})`}return"idle"}function Nh(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function $t(t){return t==null?"unknown":(0,kh.formatCount)(t)}function Zb(t){return t==="n/a"?t:$t(t)}function ek(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function Rh(t){let e=zb(t),n;try{bh("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=bh("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:SH(e)}}function SH(t){let e;try{e=bh("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function Lh(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function xh(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var kh,Ch=x(()=>{"use strict";kh=Ft(Ct(),1);Wt();le();rn()});async function tk(t,e){return W(e,n=>{let r=[];for(let s of n.listRootTeams())try{for(let o of be(s.teamfile_path).members)!o.teamfile&&o.session===t&&r.push({file:s.teamfile_path,member:o})}catch{}return r})}async function ad(t,e){let n=await je(e,t).catch(()=>null),r=n?.createdAt?.getTime();return{provider:t,sessiondir:n?.cwd,sessionid:e,model:n?.model??null,running:n?.turnStatus==="in_progress"?"busy":"unregistered",ageMs:r!==void 0&&Number.isFinite(r)?Math.max(0,Date.now()-r):null,context:n?.lastInputTokens??null}}async function Oh(t,e,n){let r=await W(e,i=>ca(t,i,new Set,[])),s=n?r.filter(i=>i.alias.toLowerCase()===n.toLowerCase()||i.reportPath.toLowerCase()===n.toLowerCase()):r;if(n&&!s.length)throw new Error(`No member "${n}" in ${t}`);let o=await da(e,s);return Promise.all(s.map(async i=>{let a=i.sessionid?await ad(i.provider,i.sessionid):{provider:i.provider,sessionid:null,model:null,running:"not seeded",ageMs:null,context:null};return{...a,file:i.teamfile,alias:i.alias,model:i.model??a.model,running:i.sessionid?a.running==="busy"?"busy":o.get(To(i.teamfile,i.alias))?.state??"unknown":"not seeded"}}))}function ld(t,e){let n=t.map(r=>[r.alias??"-",r.provider,r.model??"n/a",r.running,r.ageMs===null?"n/a":(0,br.formatDuration)(r.ageMs),r.context===null?"n/a":(0,br.formatCount)(r.context),r.sessionid??"-"].map(br.escapeCell));e.stdout.write(`${(0,br.formatTable)(n,{headers:["ALIAS","PROVIDER","MODEL","RUNNING","AGE","CONTEXT","SESSION"],margin:2})}
|
|
2100
2100
|
`),e.stdout.write(`Context is the last completed turn; unavailable values are n/a.
|
|
2101
|
-
`)}function nk(t){return t.running==="idle"&&t.ageMs!==null&&t.ageMs>=7*864e5&&t.context!==null&&t.context>=1e5}async function rk(t,e,n,r){return W(r,async s=>{if(Zt(s,t,e).busy)throw new Error(`${e} is busy; its session was not replaced.`);let o=tr(s,{receiver_teamfile:t,receiver_alias:e,sender_teamfile:t,sender_alias:e,ttlMs:8*60*60*1e3});if(!o.acquired)throw new Error(`${e} is busy; its session was not replaced.`);try{let i=be(t).members.find(a=>a.alias.toLowerCase()===e.toLowerCase());if(!i||i.session!==n)throw new Error("Session binding changed; refresh cancelled.");if((await ad(i.provider,n)).running==="busy")throw new Error(`${e} is running; its session was not replaced.`);return await po(t,{...r,dal:s},{replaceSession:{alias:e,sessionid:n}})}finally{s.releaseAgentInflight(o.lease,o.leaseId)}})}var br,sk=x(()=>{"use strict";Be();fn();Ch();le();br=Ft(Ct(),1);Wt();_n()});var Dh={};me(Dh,{runInferred:()=>
|
|
2102
|
-
`,{encoding:"utf8",mode:384}),await(r.chat??Eh)([...t,"--prompt-file",o],n)}finally{
|
|
2103
|
-
`),n.interactive&&await n.confirm(`Replace ${i.file}:${i.alias}'s session ${i.sessionid}?`))){let a=await(s.refresh??rk)(i.file,i.alias,i.sessionid,r);if(a)return a;ld(await(s.rows??Oh)(t,r,e),r)}return 0}async function lk(t,e){if(t.startsWith("-"))throw new Error("Use an explicit command for options; no inferred action was taken.");return await e.confirm(`Is ${JSON.stringify(t)} the prompt to send?`)?t:null}async function
|
|
2104
|
-
`),2}finally{s.close()}}async function
|
|
2105
|
-
`),2}finally{r.close()}}var Mh=x(()=>{"use strict";Be();Cc();xI();Fc();nd();Ih();Ph();fn();ed();sk()});var fk={};me(fk,{runBatch:()=>$h});import{readFileSync as
|
|
2106
|
-
`);if(l=a?[E.trim()].filter(y=>y.length>0):E.split(/\n\s*\n/u).map(y=>y.trim()).filter(Boolean),l.length===0)return D(e,`batch: ${o}: no prompts found`);c=Xe(r,s,e.dal)}catch(E){return D(e,`batch: ${E instanceof Error?E.message:String(E)}`)}let d=!i&&l.length>1&&await
|
|
2107
|
-
`);try{return d?await
|
|
2101
|
+
`)}function nk(t){return t.running==="idle"&&t.ageMs!==null&&t.ageMs>=7*864e5&&t.context!==null&&t.context>=1e5}async function rk(t,e,n,r){return W(r,async s=>{if(Zt(s,t,e).busy)throw new Error(`${e} is busy; its session was not replaced.`);let o=tr(s,{receiver_teamfile:t,receiver_alias:e,sender_teamfile:t,sender_alias:e,ttlMs:8*60*60*1e3});if(!o.acquired)throw new Error(`${e} is busy; its session was not replaced.`);try{let i=be(t).members.find(a=>a.alias.toLowerCase()===e.toLowerCase());if(!i||i.session!==n)throw new Error("Session binding changed; refresh cancelled.");if((await ad(i.provider,n)).running==="busy")throw new Error(`${e} is running; its session was not replaced.`);return await po(t,{...r,dal:s},{replaceSession:{alias:e,sessionid:n}})}finally{s.releaseAgentInflight(o.lease,o.leaseId)}})}var br,sk=x(()=>{"use strict";Be();fn();Ch();le();br=Ft(Ct(),1);Wt();_n()});var Dh={};me(Dh,{runInferred:()=>LH,runInferredBatch:()=>ck,sendInferredPrompt:()=>wo});import{existsSync as ak,mkdtempSync as IH,readFileSync as bH,rmSync as kH,writeFileSync as AH}from"node:fs";import{tmpdir as NH}from"node:os";import{resolve as cd,join as ok}from"node:path";async function wo(t,e,n,r={}){let s=IH(ok(NH(),"lmctl-intent-prompt-")),o=ok(s,"prompt.txt");try{return AH(o,`${e}\r
|
|
2102
|
+
`,{encoding:"utf8",mode:384}),await(r.chat??Eh)([...t,"--prompt-file",o],n)}finally{kH(s,{recursive:!0,force:!0})}}async function ik(t,e,n,r,s){let o=await(s.rows??Oh)(t,r,e);ld(o,r);for(let i of o)if(!(!i.file||!i.alias||!i.sessionid||!nk(i))&&(r.stdout.write(`${i.alias}: old and large (at least 7 days and 100,000 context tokens). A refresh starts a new context; the old transcript remains.
|
|
2103
|
+
`),n.interactive&&await n.confirm(`Replace ${i.file}:${i.alias}'s session ${i.sessionid}?`))){let a=await(s.refresh??rk)(i.file,i.alias,i.sessionid,r);if(a)return a;ld(await(s.rows??Oh)(t,r,e),r)}return 0}async function lk(t,e){if(t.startsWith("-"))throw new Error("Use an explicit command for options; no inferred action was taken.");return await e.confirm(`Is ${JSON.stringify(t)} the prompt to send?`)?t:null}async function RH(t,e,n,r,s,o){let i=t.indexOf("/"),a=i>0?t.slice(0,i):t,l=Dc(a,yo),c=[];if(l.length){let p=await n.choose("Provider:",l);if(i<0&&e===void 0&&o===void 0)return(s.model??Uc)([],r,{selections:[{provider:p}]});let _=await(s.models??co)(p).catch(()=>[]),h;if(i>0){let g=t.slice(i+1);if(!g)throw new Error("A model name is required after provider/.");let E=Dc(g,_);E.length?c.push(...E.map(y=>({provider:p,model:y}))):c.push({provider:p,model:g})}else{if(_.length?h=await n.choose("Model:",_):h=await n.ask(`Model for ${p}: `),!h)throw new Error("A model name is required.");c.push({provider:p,model:h})}}else{let p=await Promise.all(jn.map(async h=>({provider:h,names:await(s.models??co)(h).catch(()=>[])}))),_=p.flatMap(({provider:h,names:g})=>g.filter(E=>E.toLowerCase()===t.toLowerCase()).map(E=>({provider:h,model:E})));if(c.push(..._.length?_:p.flatMap(({provider:h,names:g})=>Dc(t,g).map(E=>({provider:h,model:E})))),!c.length)return null}if(o!==void 0){let p=await lk(o,n);if(p===null)return 0;e=p}if(e===void 0){let p=[...new Set(c.map(_=>_.provider))].map(_=>({provider:_,models:c.filter(h=>h.provider===_).map(h=>h.model)}));return(s.model??Uc)([],r,{selections:p})}let d=await n.choose("Prompt destination:",c.map(p=>`${p.provider}/${p.model}`)),u=c.find(p=>`${p.provider}/${p.model}`===d),f=await hh(u.provider,u.model,r.cwd??process.cwd(),n),m=await aa(f.file,n,r,s,f.alias);return m||wo([f.file,f.alias],e,r,s)}async function ck(t,e,n,r={}){let s=new Fn(n,r.ask);try{let o=cd(n.cwd??process.cwd(),t);if(!ak(o))throw new Error(`Batch file not found: ${o}`);if(!bH(o,"utf8").trim())throw new Error(`Batch file has no prompts: ${o}`);if(e.length>2||e.some(c=>c.startsWith("-")))throw new Error("Expected .lmb [teamfile [alias]]; force/yes flags are not allowed in inferred mode.");let i=e[0]?cd(n.cwd??process.cwd(),e[0]):await ph(s,n.cwd??process.cwd()),a=await aa(i,s,n,r,e[1]);if(a)return a;let l=await la(i,e[1],s);return(r.batch??$h)([i,l,o],n)}catch(o){return n.stderr.write(`error: ${o instanceof Error?o.message:String(o)}
|
|
2104
|
+
`),2}finally{s.close()}}async function LH(t,e,n={}){let r=new Fn(e,n.ask);try{let s=LI(t);if(!s)return null;if(s.kind==="script")return await Sh([cd(e.cwd??process.cwd(),s.file),...s.rest],e);if(s.kind==="batch")return r.close(),ck(s.file,s.rest,e,n);if(s.kind==="models")return await RH(s.query,s.prompt,r,e,n,s.pendingPrompt);if(s.pendingPrompt!==void 0){let d=await lk(s.pendingPrompt,r);if(d===null)return 0;s.prompt=d}if(s.kind==="team"){let d=cd(e.cwd??process.cwd(),s.file),u=s.alias;if(ak(d)&&(u!==void 0||s.prompt!==void 0)){let m=be(d);if(!m.parseErrors.length&&m.members.length){u=await la(d,u,r);let p=m.members.find(_=>_.alias===u);if(s.prompt!==void 0&&(p.session||p.teamfile))return await wo([d,u],s.prompt,e,n)}}let f=await aa(d,r,e,n,u);return f||(u=u!==void 0||s.prompt!==void 0?await la(d,u,r):void 0,s.prompt!==void 0?await wo([d,u],s.prompt,e,n):await ik(d,u,r,e,n))}let o=await(n.registrations??tk)(s.id,e);if(o.length){let d=await r.choose("Registered session:",o.map(f=>`${f.file}:${f.member.alias}`)),u=o.find(f=>`${f.file}:${f.member.alias}`===d);return s.prompt!==void 0?await wo([u.file,u.member.alias],s.prompt,e,n):await ik(u.file,u.member.alias,r,e,n)}let i=await(n.findProviders??Er)(s.id),a=i.length?await r.choose("Session provider:",i):await r.choose("Session provider:",yo),l=await(n.summary??ad)(a,s.id);ld([l],e);let c=await _h(s.id,a,l.model,e.cwd??process.cwd(),r,e,l.sessiondir);if(s.prompt!==void 0){if(!c)throw new Error("A teamfile and alias are required before sending a prompt.");return wo([c.file,c.alias],s.prompt,e,n)}return 0}catch(s){return e.stderr.write(`error: ${s instanceof Error?s.message:String(s)}
|
|
2105
|
+
`),2}finally{r.close()}}var Mh=x(()=>{"use strict";Be();Cc();xI();Fc();nd();Ih();Ph();fn();ed();sk()});var fk={};me(fk,{runBatch:()=>$h});import{readFileSync as xH}from"node:fs";async function $h(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(dk),0;let n=ae(t,[],["--legacy","--single"]);if(n.error!==void 0)return D(e,n.error);if(n.positionals.length===1&&/\.lmb$/i.test(n.positionals[0])&&Object.keys(n.flags).length===0){let{runInferredBatch:E}=await Promise.resolve().then(()=>(Mh(),Dh));return E(n.positionals[0],[],e)}if(n.positionals.length!==3)return D(e,dk.trimEnd());let[r,s,o]=n.positionals,i=n.flags["--legacy"]===!0,a=n.flags["--single"]===!0,l,c;try{let E=xH(o,"utf8").replace(/^\uFEFF/u,"").replace(/\r\n?/gu,`
|
|
2106
|
+
`);if(l=a?[E.trim()].filter(y=>y.length>0):E.split(/\n\s*\n/u).map(y=>y.trim()).filter(Boolean),l.length===0)return D(e,`batch: ${o}: no prompts found`);c=Xe(r,s,e.dal)}catch(E){return D(e,`batch: ${E instanceof Error?E.message:String(E)}`)}let d=!i&&l.length>1&&await DH(c),u={...e.env??process.env},f=await MH(e,{member:c,batchfile:o,promptCount:l.length,parentInvocationId:$s(u.LMCTL_INVOCATION_ID)}),m={status:"error",error:"batch exited without a terminal outcome"},p=E=>{m=E},_=E=>{f!==null&&(PH(e,f,{status:"cancelled",signal:E,error:`batch interrupted by ${E}`}),process.exit(E==="SIGINT"?130:143))},h=()=>_("SIGINT"),g=()=>_("SIGTERM");f!==null&&(u.LMCTL_INVOCATION_ID=String(f),process.once("SIGINT",h),process.once("SIGTERM",g)),e.stderr.write(`batch ${Vr()}: starting ${l.length} prompt${l.length===1?"":"s"} -> ${c.alias} (teamfile=${r} input=${o})
|
|
2107
|
+
`);try{return d?await CH(e,{member:c,prompts:l,env:u,setRootFinish:p,teamfile:r,batchfile:o}):await Uh(e,{member:c,prompts:l,env:u,setRootFinish:p,teamfile:r,batchfile:o})}finally{f!==null&&(process.removeListener("SIGINT",h),process.removeListener("SIGTERM",g),await $H(e,f,m))}}async function Uh(t,e){let{member:n,prompts:r,env:s}=e;for(let[o,i]of r.entries()){t.stderr.write(`
|
|
2108
2108
|
batch ${Vr()}: prompt ${o+1}/${r.length} -> ${n.alias}
|
|
2109
2109
|
${i}${i.endsWith(`
|
|
2110
2110
|
`)?"":`
|
|
@@ -2116,11 +2116,11 @@ ${i}${i.endsWith(`
|
|
|
2116
2116
|
`)?"":`
|
|
2117
2117
|
`}
|
|
2118
2118
|
`)),l.status!=="ok"){let c=l.status==="stalled"?"provider stalled":l.status==="empty"?"provider returned no content and no observed activity for this turn":l.message,d=`batch: stopped at prompt ${o+1}/${r.length} (${o} completed): ${c}; later prompts were not sent`;return e.setRootFinish({status:l.status==="busy"?"busy":"error",exit_code:1,error:d,result_summary:`${o}/${r.length} prompts completed`}),D(t,d)}}catch(l){let c=`batch: stopped at prompt ${o+1}/${r.length} (${o} completed): ${l instanceof Error?l.message:String(l)}; later prompts were not sent`;return e.setRootFinish({status:"error",exit_code:1,error:c,result_summary:`${o}/${r.length} prompts completed`}),D(t,c)}finally{a.stop()}}return t.stderr.write(`batch ${Vr()}: completed ${r.length}/${r.length} prompts
|
|
2119
|
-
`),e.setRootFinish({status:"done",exit_code:0,result_summary:`batch completed ${r.length}/${r.length} prompts`}),0}async function
|
|
2119
|
+
`),e.setRootFinish({status:"done",exit_code:0,result_summary:`batch completed ${r.length}/${r.length} prompts`}),0}async function CH(t,e){let{member:n,prompts:r,env:s}=e,o=await W(t,f=>(bl(f,n.teamfile,n.alias),Zt(f,n.teamfile,n.alias)));if(o.busy){let f=o.reason==="in-flight"?`${n.alias} is servicing ${o.inFlight.sender_alias} (${o.inFlight.sender_teamfile}) since ${o.inFlight.started_at} \u2014 wait and retry`:o.source==="terminal-lock"?qi(o.terminalLock):`${n.alias} is busy (interactive terminal); wait and retry`;return e.setRootFinish({status:"busy",exit_code:1,error:f,result_summary:"0 prompts completed"}),D(t,`batch: cannot start bundle: ${f}`)}let i=await W(t,f=>OH(s,f)),a=await W(t,f=>tr(f,{receiver_teamfile:n.teamfile,receiver_alias:n.alias,sender_teamfile:i?.teamfile??n.teamfile,sender_alias:i?.alias??"operator",ttlMs:ar()}));if(!a.acquired){let f=`${n.alias} is servicing ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} \u2014 wait and retry`;return e.setRootFinish({status:"busy",exit_code:1,error:f,result_summary:"0 prompts completed"}),D(t,`batch: cannot start bundle: ${f}`)}let l={row:a.lease,leaseId:a.leaseId},c=Qa(f=>W(t,m=>m.heartbeatAgentInflight(l.row,l.leaseId,f))),d,u=si(t,f=>`batch ${Vr()}: opening provider session (${f}s elapsed)
|
|
2120
2120
|
`);try{let f={...s};try{let m=await W(t,p=>p.getRootTeam(n.teamfile)?.name??null);m!==null&&(f.LMBEE_TEAM_NAME=m)}catch{}d=await Ep({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,env:f,...n.model!==void 0?{model:n.model}:{},...n.effort!==void 0?{effort:n.effort}:{},alias:n.alias,isLead:n.isLead,permissionMode:"yolo",holdOpen:Np(t,{teamfile:n.teamfile,alias:n.alias},f)})}catch(f){return U({event:"persistent_session_open_failed",provider:n.provider,session_id:n.sessionid,error_message:f instanceof Error?f.message:String(f)}),clearInterval(c),await uk(t,l),Uh(t,{member:n,prompts:r,env:s,setRootFinish:e.setRootFinish,teamfile:e.teamfile,batchfile:e.batchfile})}finally{u.stop()}try{return await Uh(t,{member:n,prompts:r,env:s,setRootFinish:e.setRootFinish,teamfile:e.teamfile,batchfile:e.batchfile,heldLease:l,bundleSession:d})}finally{await d.close(),clearInterval(c),await uk(t,l)}}async function uk(t,e){try{await W(t,n=>{n.releaseAgentInflight(e.row,e.leaseId)})}catch(n){t.stderr.write(`warning: failed to release batch bundle lease: ${n instanceof Error?n.message:String(n)}
|
|
2121
|
-
`)}}function
|
|
2122
|
-
`),null}}async function
|
|
2123
|
-
`)}}function
|
|
2121
|
+
`)}}function OH(t,e){let n=Nc(t,e);if(n.ok)return rs(n.identity);if(n.reason==="unset")return null;throw new Error(ns("batch",t,e))}async function DH(t){let e=t.provider.trim().toLowerCase();return Al(e,Ll(),Bi())}async function MH(t,e){try{let{member:n}=e;return await W(t,r=>r.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:n.teamfile,from_identity:`${n.teamfile}:batch`,target_teamfile:n.teamfile,target_alias:n.alias,root_teamfile:n.teamfile,cwd:n.sessiondir,command:`lmctl batch ${n.teamfile} ${n.alias} ${e.batchfile}`,holder_pid:process.pid,launch_source:"exec",parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({batchfile:e.batchfile,prompt_count:e.promptCount,provider:n.provider,sessionid:n.sessionid,...n.model!==void 0?{model:n.model}:{}})}).id)}catch(n){return t.stderr.write(`warning: failed to start batch root invocation: ${n instanceof Error?n.message:String(n)}
|
|
2122
|
+
`),null}}async function $H(t,e,n){try{await W(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){t.stderr.write(`warning: failed to finish batch root invocation: ${r instanceof Error?r.message:String(r)}
|
|
2123
|
+
`)}}function PH(t,e,n){try{if(t.dal!==void 0){t.dal.finishTrackedInvocation(e,n);return}let r=$e({path:Je()});try{r.finishTrackedInvocation(e,n)}finally{r.close()}}catch{}}var dk,Ph=x(()=>{"use strict";re();xp();le();Nn();nt();vt();Wt();kl();Il();Ac();Gi();Rc();xl();Rp();Un();dk=`usage: lmctl batch <teamfile> <alias> <batchfile> [--legacy] [--single]
|
|
2124
2124
|
lmctl batch <file.lmb> (infer or ask for teamfile and member)
|
|
2125
2125
|
|
|
2126
2126
|
Send blank-line-separated paragraphs as prompts, one completed turn at a
|
|
@@ -2148,7 +2148,7 @@ lease) -- the pre-bundle behavior -- as an opt-out while bundle is new.
|
|
|
2148
2148
|
--single sends the WHOLE file as ONE prompt: blank lines are content, not
|
|
2149
2149
|
separators. A single prompt (one paragraph, or --single) never bundles and
|
|
2150
2150
|
never takes a batch-level lease -- one plain turn.
|
|
2151
|
-
`});import{mkdtempSync as
|
|
2151
|
+
`});import{mkdtempSync as UH,readFileSync as FH,rmSync as jH,writeFileSync as WH}from"node:fs";import{tmpdir as HH}from"node:os";import{spawnSync as BH}from"node:child_process";import{basename as dd,extname as Fh,join as jh,resolve as Wh}from"node:path";import*as mk from"node:readline";function XH(t){return e=>{let n=t.EDITOR??t.VISUAL??"vi";BH(n,[e],{stdio:"inherit"})}}async function pk(t){let{io:e,cwd:n,env:r=process.env}=t,s=t.initial??{},o=mk.createInterface({input:t.input,output:e.stdout,terminal:!1}),i=[],a=[];o.on("line",u=>{let f=a.shift();f!==void 0?f(u):i.push(u)});let l=!1;o.on("close",()=>{for(l=!0;a.length>0;)a.shift()("")});let c=async u=>{e.stdout.write(u);let f=i.shift();return f!==void 0?f.trim():l?"":new Promise(m=>a.push(p=>m(p.trim())))},d=()=>o.close();try{let u,f;if(s.output!==void 0)u=Wh(n,s.output),f=dd(u,Fh(u));else{let g=Wh(n,t.directory??"."),E=await c(`Directory [${g}]: `),y=E===""?g:Wh(n,E),T=`${dd(y)}.lmctl`,w=await c(`Teamfile name [${T}]: `),S=w===""?T:w,I=Fh(S)?S:`${S}.lmctl`;u=jh(y,I),f=dd(I,Fh(I))}let m;if(s.members!==void 0&&s.members.length>0)m=s.members.map(g=>({...g,model:g.model??s.model}));else{let g=wr(Mt(e.env??process.env,t.initConfigPath)),E=[...new Set(g===null?[]:Object.values(g).map(b=>b.provider))];e.stdout.write(`Providers from lmctl init: ${E.length>0?E.join(", "):"(none saved; run lmctl init to save suggestions)"}
|
|
2152
2152
|
`),e.stdout.write(`You can type another provider.
|
|
2153
2153
|
`);let y=s.provider??g?.provider1.provider,T=s.provider??(E.length===1?E[0]:void 0);for(;T===void 0;){let b=await c(`Default provider${y!==void 0?` [${y}]`:""}: `),L=b===""?y:b;if(L===void 0){if(l)return e.stderr.write(`error: stdin closed (EOF) at the provider prompt and no default is available
|
|
2154
2154
|
`),d(),null;continue}if(kt({alias:"Probe",provider:L})!==void 0){e.stdout.write(`unknown provider "${L}" (known: ${Object.keys(ds).join(", ")})
|
|
@@ -2167,10 +2167,10 @@ never takes a batch-level lease -- one plain turn.
|
|
|
2167
2167
|
`),O.length===0&&e.stdout.write(` No model suggestions available.
|
|
2168
2168
|
`);for(let R of O)e.stdout.write(` ${R}
|
|
2169
2169
|
`);e.stdout.write(`Type a model name, including one not listed, or leave blank to ${s.model!==void 0?"keep the default":"omit"}.
|
|
2170
|
-
`);let v=s.model,A=await c(`Model for ${b}${v!==void 0?` [${v}]`:" (blank to omit)"}: `),N=A===""?v:A;m.push({alias:b,provider:L,...N!==void 0?{model:N}:{}})}}let p=Sr({teamName:f,members:m}),_=t.editFile??
|
|
2170
|
+
`);let v=s.model,A=await c(`Model for ${b}${v!==void 0?` [${v}]`:" (blank to omit)"}: `),N=A===""?v:A;m.push({alias:b,provider:L,...N!==void 0?{model:N}:{}})}}let p=Sr({teamName:f,members:m}),_=t.editFile??XH(r),h=s.seed??!0;for(;;){e.stdout.write(`
|
|
2171
2171
|
--- ${u} ---
|
|
2172
2172
|
${p}---
|
|
2173
|
-
`);let g=(await c(`Write and seed? [${h?"Y/n":"y/N"}/e(dit)]: `)).toLowerCase();if(g==="e"||g==="edit"){let y
|
|
2173
|
+
`);let g=(await c(`Write and seed? [${h?"Y/n":"y/N"}/e(dit)]: `)).toLowerCase();if(g==="e"||g==="edit"){let y=UH(jh(HH(),"lmctl-plan-edit-"));try{let T=jh(y,dd(u));WH(T,p,"utf8"),_(T),p=FH(T,"utf8")}finally{jH(y,{recursive:!0,force:!0})}continue}if(g==="q"||g==="quit"||g==="abort")return d(),null;let E=g===""?h:g!=="n"&&g!=="no";return d(),{destPath:u,text:p,seed:E}}}catch(u){throw d(),u}}function hk(t){return Kc(t)}var _k=x(()=>{"use strict";na();us();jp();_n();Yc()});var Ik={};me(Ik,{readPlanSource:()=>kr,runPlan:()=>QH});import{existsSync as Ek,mkdirSync as qH,readdirSync as GH,readFileSync as gk,statSync as VH,writeFileSync as JH}from"node:fs";import{basename as Tk,dirname as KH,extname as YH,join as wk,resolve as Bh}from"node:path";async function QH(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(zH),0;let r=[],s=[];for(let k=0;k<t.length;k+=1){let v=t[k];if(v==="--member"){let A=t[k+1];if(A===void 0||A.startsWith("--"))return e.stderr.write(`error: missing value for --member
|
|
2174
2174
|
`),2;r.push(A),k+=1;continue}s.push(v)}let o=ae(s,["--pattern","--provider","--model","--from","--output"],["--json","--stdout","--force","--seed","--no-seed","--wizard","--non-interactive","--no-interactive"]);if(o.error!==void 0)return e.stderr.write(`error: ${o.error}
|
|
2175
2175
|
`),e.stderr.write(`usage: lmctl plan [directory] [options]
|
|
2176
2176
|
`),2;if(o.positionals.length>1)return e.stderr.write(`usage: lmctl plan [directory] [options]
|
|
@@ -2183,18 +2183,18 @@ ${p}---
|
|
|
2183
2183
|
`),2;let T=l!==void 0||c!==void 0||d!==void 0||u!==void 0||r.length>0,w=e.stdin??process.stdin,S=n.stdinIsTTY??(e.stdin===void 0?process.stdin.isTTY===!0:w.isTTY===!0),I=!T||u===void 0&&r.length===0&&(l===void 0||c===void 0),b=E||!y&&I&&!p&&!m&&S,L;if(b){if(u!==void 0)return e.stderr.write(`error: --from cannot be combined with --wizard
|
|
2184
2184
|
`),2;if(l!==void 0&&r.length>0)return e.stderr.write(`error: --pattern and --member are mutually exclusive
|
|
2185
2185
|
`),2;let k=Sk(r,d,v=>{e.stderr.write(`error: ${v}
|
|
2186
|
-
`)});if(k.error!==void 0)return 1;L=await
|
|
2187
|
-
`),2;let k=await
|
|
2186
|
+
`)});if(k.error!==void 0)return 1;L=await ZH(e,w,i,a,{provider:c,model:d,pattern:l,members:k.members,seed:!g,output:f},n)}else{if(!T)return e.stderr.write(`error: ${vk}
|
|
2187
|
+
`),2;let k=await eB({pattern:l,provider:c,model:d,from:u,memberRaws:r,output:f,directory:a,cwd:i,seedFlag:h,deps:{...n,initConfigPath:Mt(e.env??process.env,n.initConfigPath)}},v=>{e.stderr.write(`error: ${v}
|
|
2188
2188
|
`)});if(typeof k=="number")return k;L=k}if(L===null)return e.stderr.write(`aborted
|
|
2189
|
-
`),1;if(p)return e.stdout.write(L.text),0;let O=L.destPath;return
|
|
2190
|
-
`),1;
|
|
2189
|
+
`),1;if(p)return e.stdout.write(L.text),0;let O=L.destPath;return nB(L,O,{asJson:m,force:_,seed:L.seed},e)}async function ZH(t,e,n,r,s,o){let i=await pk({io:t,input:e,cwd:n,...r!==void 0?{directory:r}:{},initial:s,...o.initConfigPath!==void 0?{initConfigPath:o.initConfigPath}:{},...o.loadModels!==void 0?{loadModels:o.loadModels}:{},...o.editFile!==void 0?{editFile:o.editFile}:{},...t.env!==void 0?{env:t.env}:{}});return i===null?null:{text:i.text,destPath:i.destPath,members:hk(i.text),seed:i.seed}}async function eB(t,e){let{pattern:n,provider:r,model:s,from:o,memberRaws:i,output:a,directory:l,cwd:c,seedFlag:d,deps:u}=t,f=[n!==void 0,i.length>0,o!==void 0].filter(Boolean).length;if(f===0)return e(vk),2;if(f>1)return e("--pattern, --member and --from are mutually exclusive"),2;if(o!==void 0&&(r!==void 0||s!==void 0))return e("--from cannot be combined with --provider or --model (the source teamfile defines the roster)"),2;let m=tB(a,l,c);if(o!==void 0){let h;try{h=await kr(o,u.fetchFn??globalThis.fetch,c)}catch(y){return e(y instanceof Error?y.message:String(y)),1}let g=Ub(h),E=Kc(g);return E.length===0?(e(`--from source "${o}" has no parseable _MEMBER_ lines`),1):{text:g,destPath:m,members:E,seed:d}}let p;if(i.length>0){let h=Sk(i,s,e);if(h.error!==void 0)return 1;p=h.members}else{let h=Mb(n);if(h===void 0)return e(`invalid pattern "${n}" (expected ${Jc})`),2;if(r!==void 0){let g=kt({alias:"Lead",provider:r});if(g!==void 0)return e(g),1;p=h.map(E=>({alias:E,provider:r,...s!==void 0?{model:s}:{}}))}else{let g=wr(u.initConfigPath);if(g===null)return e("missing --provider, and no ~/.lmctl/init.toml found. Run `lmctl init` first, or pass --provider explicitly."),2;let E=[g.provider1,g.provider2,g.provider3];p=h.map((y,T)=>{let w=E[T%E.length];return{alias:y,provider:w.provider,model:s??w.model1}})}}let _=Tk(m,YH(m));return{text:Sr({teamName:_,members:p}),destPath:m,members:p,seed:d}}function Sk(t,e,n){if(t.length===0)return{members:void 0};let r=[],s=new Set;for(let o of t){let i=$b(o);if(i.error!==void 0)return n(i.error),{error:i.error};let a=i.spec,l=a.alias.toLowerCase();if(s.has(l))return n(`duplicate member alias "${a.alias}"`),{error:l};s.add(l),r.push({...a,model:a.model??e})}return r[0].alias.toLowerCase()!=="lead"?(n(`the first member must be Lead (got "${r[0].alias}")`),{error:"lead-not-first"}):{members:r}}function tB(t,e,n){if(t!==void 0)return Bh(n,t);let r=Bh(n,e??".");return wk(r,`${Tk(r)}.lmctl`)}async function nB(t,e,n,r){if(Ek(e)&&!n.force)return r.stderr.write(`error: ${e} already exists (use --force to overwrite)
|
|
2190
|
+
`),1;qH(KH(e),{recursive:!0}),JH(e,t.text,"utf8");let s=n.asJson?{...r,stdout:{write:()=>{}}}:r;if(!(await vr([e],s)===0))return n.seed&&r.stderr.write(`error: refusing to seed \u2014 lint failed
|
|
2191
2191
|
`),n.asJson&&te(r,Hh(e,!1,!1,t.members)),1;let a=!1;if(n.seed){let l=await oa([e],s);return a=l===0,n.asJson&&te(r,Hh(e,!0,a,t.members)),l}return n.asJson?(te(r,Hh(e,!0,!1,t.members)),0):(r.stdout.write(`Created ${e}
|
|
2192
2192
|
`),r.stdout.write(`This is a starting point, not a finished teamfile -- edit it freely.
|
|
2193
2193
|
`),r.stdout.write(`Only _MEMBER_ lines are parsed; everything else is free-form.
|
|
2194
2194
|
`),r.stdout.write(`Format, and what lint/seed each do: https://lmctl.com/lmctl/docs/manuals/teamfile-format
|
|
2195
2195
|
`),r.stdout.write(`After editing, run: lmctl lint ${e}
|
|
2196
2196
|
`),r.stdout.write(`Then run: lmctl seed ${e}
|
|
2197
|
-
`),0)}function Hh(t,e,n,r){return{path:t,linted:e,seeded:n,members:r.map(s=>({alias:s.alias,provider:s.provider,...s.model!==void 0?{model:s.model}:{}}))}}async function kr(t,e,n){if(/^http:\/\//i.test(t))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(t))return
|
|
2197
|
+
`),0)}function Hh(t,e,n,r){return{path:t,linted:e,seeded:n,members:r.map(s=>({alias:s.alias,provider:s.provider,...s.model!==void 0?{model:s.model}:{}}))}}async function kr(t,e,n){if(/^http:\/\//i.test(t))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(t))return sB(t,e);let r=Bh(n,t);if(!Ek(r))throw new Error(`source not found: ${t}`);if(!VH(r).isDirectory())return gk(r,"utf8");let o=GH(r).filter(i=>xe(i));if(o.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(o.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return gk(wk(r,o[0]),"utf8")}async function sB(t,e){let n=new URL(t);for(let r=0;;r+=1){if(n.protocol!=="https:")throw new Error("HTTPS redirects must remain https://");let s=await e(n.href,{redirect:"manual"});if(s.url!==""&&new URL(s.url).protocol!=="https:")throw new Error("HTTPS redirects must remain https://");if(!rB.has(s.status)){if(!s.ok)throw new Error(`HTTP ${s.status}`);return await s.text()}if(r>=yk)throw new Error(`too many HTTPS redirects (maximum ${yk})`);let o=s.headers.get("location");if(o===null)throw new Error(`HTTP ${s.status} redirect missing Location header`);n=new URL(o,n)}}var zH,vk,rB,yk,ua=x(()=>{"use strict";Be();le();_k();_n();us();Yc();zH=`usage: lmctl plan [directory] [options]
|
|
2198
2198
|
|
|
2199
2199
|
Generate an lmctl teamfile. With no config flags and a TTY, an interactive
|
|
2200
2200
|
wizard completes missing information; complete flags run immediately.
|
|
@@ -2235,29 +2235,29 @@ Examples:
|
|
|
2235
2235
|
lmctl plan ./backend --pattern 3 --provider claude --seed
|
|
2236
2236
|
`,vk=`missing required flags for non-interactive plan:
|
|
2237
2237
|
one of: --pattern <${Jc}>, --member <Alias:provider[:model]>, or --from <file|dir|url>
|
|
2238
|
-
plus: --provider <name> (required with --pattern)`;
|
|
2239
|
-
`),1;let a=`${
|
|
2238
|
+
plus: --provider <name> (required with --pattern)`;rB=new Set([301,302,303,307,308]),yk=10});var ud={};me(ud,{extractSaveScriptFlags:()=>kk,performSaveScript:()=>Ak,runWithSaveScript:()=>pB});import{existsSync as oB,mkdirSync as iB,renameSync as aB,writeFileSync as lB}from"node:fs";import{dirname as cB,extname as dB,join as uB}from"node:path";function kk(t,e,n={}){let r=[],s,o,i=!1;for(let c=0;c<t.length;c+=1){let d=t[c];if(d==="--save-script"){let u=t[c+1];if(u===void 0)return{rest:r,error:"--save-script requires a file path"};s=u,c+=1;continue}if(d==="--script"){let u=t[c+1];if(u===void 0)return{rest:r,error:"--script requires a name"};o=u,c+=1;continue}if(d==="--force"&&!n.ownsForce){i=!0;continue}r.push(d)}if(n.ownsForce&&(i=t.includes("--force")),s===void 0)return o!==void 0?{rest:r,error:"--script requires --save-script"}:{rest:r};let a=o??e;if(!bk.test(a))return{rest:r,error:`--script "${a}" must match ${bk} (letters, digits, ., _, -)`};let l=n.extension??".lms";return{rest:r,request:{destPath:s,slug:a,extension:l,force:i}}}function mB(t){let e=t.slice(0,512).trimStart().toLowerCase();return e.startsWith("<!doctype html")||e.startsWith("<html")}async function Ak(t,e,n=fetch){let{destPath:r,slug:s,extension:o,force:i}=e;if(oB(r)&&!i)return t.stderr.write(`error: --save-script: ${r} already exists (use --force to overwrite)
|
|
2239
|
+
`),1;let a=`${fB}/${s}${o}`,l;try{l=await kr(a,n,process.cwd())}catch(u){let f=u instanceof Error?u.message:String(u);return f==="HTTP 404"?t.stderr.write(`error: --save-script: no script is published at ${a} for this command
|
|
2240
2240
|
`):t.stderr.write(`error: --save-script: could not fetch ${a}: ${f}
|
|
2241
|
-
`),1}if(
|
|
2241
|
+
`),1}if(dB(r).toLowerCase()!==o.toLowerCase()&&t.stderr.write(`warning: --save-script: ${r} does not end in "${o}", the extension lmctl.com actually serves for this command
|
|
2242
2242
|
`),l.trim().length===0)return t.stderr.write(`error: --save-script: ${a} returned an empty response
|
|
2243
|
-
`),1;if(
|
|
2244
|
-
`),1;let c=
|
|
2245
|
-
`),0}async function
|
|
2246
|
-
`),2;let i=await r(o.rest);return i!==0||o.request===void 0?i:Ak(t,o.request)}var
|
|
2247
|
-
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:d??1,message:c.trim()||`lmctl prompt exited with code ${d}`})})})}function
|
|
2248
|
-
`}async function Lk(t,e){let n=!1,r="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(Vh({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await
|
|
2243
|
+
`),1;if(mB(l))return t.stderr.write(`error: --save-script: ${a} did not return a script (looks like an HTML page, not lmscript)
|
|
2244
|
+
`),1;let c=cB(r);iB(c,{recursive:!0});let d=uB(c,`.save-script-${process.pid}-${Date.now()}.tmp`);return lB(d,l,"utf8"),aB(d,r),t.stdout.write(`Saved ${a} to ${r}
|
|
2245
|
+
`),0}async function pB(t,e,n,r,s={}){let o=kk(n,e,s);if(o.error!==void 0)return t.stderr.write(`error: ${o.error}
|
|
2246
|
+
`),2;let i=await r(o.rest);return i!==0||o.request===void 0?i:Ak(t,o.request)}var fB,bk,fd=x(()=>{"use strict";ua();fB="https://lmctl.com/lmscript/commands",bk=/^[A-Za-z0-9._-]+$/});var fa,Vte,Xh=x(()=>{"use strict";fa=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],Vte=fa.length});import{spawn as hB}from"node:child_process";async function Rk(t,e,n){let r=gB.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of r.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return yB(r.name,s)}function yB(t,e){return t==="lmctl_chat"?EB(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function EB(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["prompt",n,r,e];return ye()&&Ke(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),TB(s,process.cwd())}function TB(t,e){return new Promise(n=>{let r=!1,s,o=d=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(d))},i=hB("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=wB(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl prompt timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",d=>{l+=d.toString("utf8")}),i.stderr?.on("data",d=>{c+=d.toString("utf8")}),i.on("error",d=>{o({status:"error",code:1,message:`failed to spawn lmctl prompt: ${d.message}`})}),i.on("exit",d=>{if(d===0){ye()&&Ke(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2247
|
+
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:d??1,message:c.trim()||`lmctl prompt exited with code ${d}`})})})}function wB(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return Nk;let n=Number(e);return!Number.isFinite(n)||n<=0?Nk:n}function qh(t,e=process.env){let r=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:_B),s=t.getConfig("api.token"),o=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:r,token:o}}var _B,Nk,gB,Gh=x(()=>{"use strict";Xh();re();_B="http://127.0.0.1:8787",Nk=30*60*1e3,gB=new Map(fa.map(t=>[t.name,t]))});async function bB(t,e){let n=t.id===void 0,r=t.id??null;if(t.method==="exit")return n||e.io.write(Vh({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:vB,capabilities:{tools:{listChanged:!1}},serverInfo:{name:SB,version:IB}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:fa.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await Rk(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return n?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:r,error:{code:-32601,message:`method not found: ${t.method}`}}}}function Vh(t){return`${JSON.stringify(t)}
|
|
2248
|
+
`}async function Lk(t,e){let n=!1,r="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){t.io.write(Vh({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await bB(l,t);c.kind==="response"?t.io.write(Vh(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,i(u))},d=()=>{let u=r.indexOf(`
|
|
2249
2249
|
`);for(;u!==-1;){let f=r.slice(0,u);r=r.slice(u+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),u=r.indexOf(`
|
|
2250
2250
|
`)}};e.setEncoding("utf8"),e.on("data",u=>{r+=u,d()}),e.on("end",()=>{r.trim().length>0&&(a=a.then(()=>o(r))),a.finally(()=>c(0))}),e.on("error",u=>{t.io.log?.(`mcp: stdin error: ${u.message}
|
|
2251
|
-
`),a.finally(()=>c(1))})})}var
|
|
2252
|
-
`),2;U({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??
|
|
2251
|
+
`),a.finally(()=>c(1))})})}var vB,SB,IB,xk=x(()=>{"use strict";Xh();Gh();vB="2025-06-18",SB="lmctl",IB="0.0.1"});var Ok={};me(Ok,{runMcp:()=>AB});async function AB(t,e={stdout:process.stdout,stderr:process.stderr},n=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(kB),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
2252
|
+
`),2;U({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??NB(),o=1;try{let i=s===void 0?qh({getConfig:()=>null},process.env):qh(s,process.env);return o=await Lk({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},n),o}finally{U({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),r&&s!==void 0&&s.close()}}function NB(){let t=Je(),e=3;for(let n=1;n<=e;n+=1)try{return $e({path:t})}catch(r){let s=r instanceof Error?r.message:String(r);if(U({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:n,db_path:t,error_message:s}),n<e&&Ck(s))RB(50*n);else if(!Ck(s))break}}function Ck(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function RB(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var kB,Dk=x(()=>{"use strict";vt();Gh();xk();re();Nn();kB=`usage: lmctl mcp
|
|
2253
2253
|
|
|
2254
2254
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2255
2255
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
2256
|
-
`});function Mk(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),o=n[2],i=o==="s"?s:o==="m"?s*60:o==="h"?s*3600:s*86400;return{date:new Date(Date.now()-i*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var $k=x(()=>{"use strict"});var Gk={};me(Gk,{applyMaxBytes:()=>hd,parseTailSince:()=>Xk,renderMessage:()=>Bk,runTail:()=>
|
|
2256
|
+
`});function Mk(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),o=n[2],i=o==="s"?s:o==="m"?s*60:o==="h"?s*3600:s*86400;return{date:new Date(Date.now()-i*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var $k=x(()=>{"use strict"});var Gk={};me(Gk,{applyMaxBytes:()=>hd,parseTailSince:()=>Xk,renderMessage:()=>Bk,runTail:()=>DB});async function DB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${OB}
|
|
2257
2257
|
`),0;let n=ae(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help","--json"]);if(n.error!==void 0)return D(e,n.error);let r=z(n,"--json");if(V(n,"--session")!==void 0&&n.positionals.length>0)return e.stderr.write(`usage: --session cannot be combined with a positional target
|
|
2258
2258
|
`),2;let s=V(n,"--since"),o=Xk(s);if("error"in o)return D(e,o.error);let i=o.date,a=V(n,"--lines"),l=V(n,"--max-bytes");if(r&&l!==void 0)return e.stderr.write(`usage: --json cannot be combined with --max-bytes; use --lines
|
|
2259
|
-
`),2;if(a!==void 0&&l!==void 0)return D(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let g=Number.parseInt(a,10);if(!Number.isFinite(g)||g<1||String(g)!==a)return D(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:g}}else{let g=l===void 0?
|
|
2260
|
-
`),2;let f=u===void 0?
|
|
2259
|
+
`),2;if(a!==void 0&&l!==void 0)return D(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let g=Number.parseInt(a,10);if(!Number.isFinite(g)||g<1||String(g)!==a)return D(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:g}}else{let g=l===void 0?xB:Number.parseInt(l,10);if(!Number.isFinite(g)||g<0||l!==void 0&&String(g)!==l)return D(e,`invalid --max-bytes "${l}" (expected a non-negative integer)`);c={kind:"bytes",maxBytes:g}}let d=z(n,"--watch"),u=V(n,"--watch-interval");if(u!==void 0&&!d)return e.stderr.write(`usage: --watch-interval requires --watch
|
|
2260
|
+
`),2;let f=u===void 0?CB:Number.parseInt(u.replace(/s$/,""),10);if(!Number.isSafeInteger(f)||f<1||f>2147483||u!==void 0&&!/^[1-9][0-9]*s?$/.test(u))return D(e,`invalid --watch-interval "${u}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return D(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let m=V(n,"--run");if(m!==void 0){if(n.positionals.length>0)return D(e,"--run is mutually exclusive with positional [target] [alias]");if(V(n,"--session")!==void 0)return D(e,"--run is mutually exclusive with --session");if(V(n,"--provider")!==void 0)return D(e,"--run is mutually exclusive with --provider");let g=Number.parseInt(m,10);if(!Number.isFinite(g)||g<=0||String(g)!==m)return D(e,`invalid --run "${m}" (expected a positive integer run id)`);try{return await W(e,async E=>MB(e,E,g,c,d,f,i,r))}catch(E){return Ot(e,E)}}let p=sn(LB,{target:n.positionals[0],alias:n.positionals[1],flags:{session:V(n,"--session"),provider:V(n,"--provider")}});if(p.mode==="error")return D(e,p.message);if(p.mode==="managed")return D(e,"tail managed mode requires --run <id>");let _;if(p.mode==="ai-team"){if(V(n,"--provider")!==void 0)return e.stderr.write(`usage: --provider applies only to raw sessions; teamfiles declare their provider
|
|
2261
2261
|
`),2;if(p.alias===void 0){let g;try{g=await W(e,T=>Ne(p.teamfile,T))}catch(T){return D(e,`tail: ${T instanceof Error?T.message:String(T)}`)}let E;try{E=be(g)}catch(T){return D(e,`tail: ${T instanceof Error?T.message:String(T)}`)}let y=Hs(E);if(y===void 0)return D(e,`tail: ${p.teamfile} has no Lead member; pass <tf>:<alias>`);try{let T=await W(e,w=>Xe(p.teamfile,y.alias,w));_={provider:T.provider,sessionId:T.sessionid,cwd:T.sessiondir}}catch(T){return T instanceof ge?D(e,T.message):Ot(e,T)}}else try{let g=await W(e,E=>Xe(p.teamfile,p.alias,E));_={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?D(e,g.message):Ot(e,g)}}else{let g=p.sessionid,E=p.provider;if(E===void 0){let y=await Er(g);if(y.length===0)return D(e,`tail: session "${g}" not found in any provider store`);if(y.length>1)return D(e,`tail: session "${g}" matches multiple providers (${y.join(", ")}); pass --provider`);E=y[0]}_={provider:E,sessionId:g}}let h=await Pk(e,_.provider,_.sessionId,c,-1,i,r);return h===pd?1:d?await new Promise(g=>{let E=async()=>{try{let w=await Pk(e,_.provider,_.sessionId,c,h,i,r);w!==pd&&(h=w)}catch(w){e.stderr.write(`tail: ${w instanceof Error?w.message:String(w)}
|
|
2262
2262
|
`)}},y=setInterval(()=>{E()},f*1e3),T=()=>{clearInterval(y),g(0)};process.once("SIGINT",T),process.once("SIGTERM",T)}):0}async function Pk(t,e,n,r,s,o,i){let a;try{a=await je(n,e)}catch(f){return t.stderr.write(`tail: failed to load session: ${f instanceof Error?f.message:String(f)}
|
|
2263
2263
|
`),pd}if(a===null)return t.stderr.write(`tail: session not found: ${n} (provider=${e})
|
|
@@ -2267,10 +2267,10 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
2267
2267
|
`).split(`
|
|
2268
2268
|
`),o=s[0]??"",i=s.slice(1);return i.length===0?`${n}: ${o}`:`${n}: ${o}
|
|
2269
2269
|
${i.map(a=>` ${a}`).join(`
|
|
2270
|
-
`)}`}function Uk(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function
|
|
2270
|
+
`)}`}function Uk(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function MB(t,e,n,r,s,o,i,a){if(e.getRun(n)===null)return D(t,`tail: run ${n}: not found`);let c=i===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=i.getTime()),d=r.kind==="lines"?c.slice(Math.max(0,c.length-r.lines)):c;if(a===!0)te(t,{schema_version:md,run_id:n,truncated:d.length<c.length,events:Uk(d)});else{let f=d.map(m=>`${Wk(m)}
|
|
2271
2271
|
`).join("");t.stdout.write(r.kind==="bytes"?hd(f,r.maxBytes):f)}let u=c.length>0?c[c.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let h=e.listSessionEvents(n,u);if(h.length===0)return;for(let E of h)u=E.id;if(a===!0){te(t,{schema_version:md,run_id:n,truncated:!1,events:Uk(h)});return}let g=h.map(E=>`${Wk(E)}
|
|
2272
2272
|
`).join("");t.stdout.write(r.kind==="bytes"?hd(g,r.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
2273
|
-
`)}},o*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function hd(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(Fk,"utf8");if(r>=e)return jk(t,e);let s=e-r,o=jk(t,s);return`${Fk}${o}`}function jk(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function Wk(t){let e=qk(new Date(t.timestamp_ms))??"",n="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(n=`alias=${o.alias}`),typeof o.provider=="string"&&(n+=`${n?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(n+=`${n?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(n+=`${n?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function Xk(t){return Mk(t,"--since")}function qk(t){if(t===void 0)return;let e=(0,Hk.formatLocalTimestamp)(t);return e==="unknown"?void 0:e}var Hk,
|
|
2273
|
+
`)}},o*1e3),_=()=>{clearInterval(p),f(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}function hd(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(Fk,"utf8");if(r>=e)return jk(t,e);let s=e-r,o=jk(t,s);return`${Fk}${o}`}function jk(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function Wk(t){let e=qk(new Date(t.timestamp_ms))??"",n="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(n=`alias=${o.alias}`),typeof o.provider=="string"&&(n+=`${n?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(n+=`${n?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(n+=`${n?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function Xk(t){return Mk(t,"--since")}function qk(t){if(t===void 0)return;let e=(0,Hk.formatLocalTimestamp)(t);return e==="unknown"?void 0:e}var Hk,LB,xB,CB,md,OB,pd,Fk,Vk=x(()=>{"use strict";fn();Hk=Ft(Ct(),1);le();nt();Be();rn();$k();LB={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},xB=4096,CB=2,md=1,OB=`usage: lmctl tail [target] [alias]
|
|
2274
2274
|
lmctl tail --session <id> [--provider <name>]
|
|
2275
2275
|
lmctl tail --run <id>
|
|
2276
2276
|
[--lines N | --max-bytes N] [--since <duration|ISO8601>]
|
|
@@ -2299,7 +2299,7 @@ everything new by construction. --json and --max-bytes cannot be combined;
|
|
|
2299
2299
|
--lines still applies. --watch --json emits one JSON
|
|
2300
2300
|
object per poll tick with something new (NDJSON) -- a tick with
|
|
2301
2301
|
nothing new prints no line at all, same as text mode.`;pd=-2;Fk=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
2302
|
-
`});var Yk={};me(Yk,{isSeedAck:()=>Lf,isSeedPrompt:()=>yi,runExport:()=>
|
|
2302
|
+
`});var Yk={};me(Yk,{isSeedAck:()=>Lf,isSeedPrompt:()=>yi,runExport:()=>PB,trimExportSeedExchange:()=>Kk});function $B(t){return gr().some(e=>e.name===t)}function Kk(t){let e=t.messages.findIndex(i=>i.role==="user");if(e===-1||!yi(t.messages[e].content))return;let n=-1,r=!1;for(let i=e+1;i<t.messages.length;i++){let a=t.messages[i].role;if(a==="user")break;if(a==="assistant"){n=i;break}a!=="thinking"&&(r=!0)}let s=!1;n!==-1&&!r&&Lf(t.messages[n].content)&&(s=!0),s?t.messages.splice(e,n-e+1):t.messages.splice(e,1),Array.isArray(t.userPrompts)&&t.userPrompts.length>0&&yi(t.userPrompts[0])&&t.userPrompts.shift(),t.messageCount=t.messages.filter(i=>i.role==="user"||i.role==="assistant").length;let o=t.messages.filter(i=>i.role==="user");o.length>0?(t.firstUserMessage=G(o[0].content.trim(),80),t.lastUserMessage=G(o[o.length-1].content.trim(),80)):(t.firstUserMessage=void 0,t.lastUserMessage=void 0)}async function PB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(Jk),0;let n=ae(t,["--provider"],["--prompt-only","--json"]);if(n.error!==void 0)return D(e,n.error);let r=z(n,"--json"),s=z(n,"--prompt-only");if(r&&s)return D(e,"export: --prompt-only cannot be combined with --json");let o=V(n,"--provider"),i=n.positionals.length===1&&o!==void 0,a=n.positionals.length===2&&o===void 0;if(!i&&!a)return D(e,Jk.trimEnd());let l,c;if(i){if(l=n.positionals[0],c=o,!$B(c))return D(e,`export: provider is not registered: ${c}`)}else l="",c="";let d;if(a){try{d=Xe(n.positionals[0],n.positionals[1],e.dal)}catch(m){return m instanceof ge?D(e,m.message):Ot(e,m)}l=d.sessionid,c=d.provider}let u;try{u=await je(l,c)}catch(m){return D(e,`export: failed to load session: ${m instanceof Error?m.message:String(m)}`)}if(u===null)return D(e,`export: session not found: ${l} (provider=${c})`);if(Kk(u),r)return te(e,u),0;let f=[];if(s){let m=u.userPrompts??u.messages.filter(p=>p.role==="user").map(p=>p.content);for(let p of m){if(yi(p)||p.trimStart().replace(/^["']/u,"").startsWith("lmctl seed initial connection only. Create or pin this provider session, then stop."))continue;let _=p.split(/\r\n|[\r\n\u2028\u2029]/u).map(h=>h.trim()).filter(Boolean).join(" ");_!==""&&f.push(_)}}else for(let m of u.messages)m.role!=="user"&&m.role!=="assistant"||m.content.trim()!==""&&f.push(`${m.role}:
|
|
2303
2303
|
${m.content}`);return f.length>0&&e.stdout.write(`${f.join(`
|
|
2304
2304
|
|
|
2305
2305
|
`)}
|
|
@@ -2316,11 +2316,11 @@ unclassified user-role records are omitted in this compact mode.
|
|
|
2316
2316
|
--json emits the complete normalized session data (messages, userPrompts
|
|
2317
2317
|
where recorded, token totals; turns/responses where recorded), for
|
|
2318
2318
|
tracked and provider-qualified session targets.
|
|
2319
|
-
`});var sA={};me(sA,{queryUsage:()=>nA,runUsage:()=>
|
|
2320
|
-
${Qk}`),2}let i;try{let a={groups:[],total:rA(),reasons:{usage:{},cost:{}}},l=Pe(e);if(
|
|
2319
|
+
`});var sA={};me(sA,{queryUsage:()=>nA,runUsage:()=>jB});import{existsSync as UB}from"node:fs";function Zk(t){if(!/^\d{4}-\d{2}-\d{2}(?:T\d{2}:\d{2}(?::\d{2}(?:\.\d{1,3})?)?(?:Z|[+-]\d{2}:\d{2})?)?$/.test(t))throw new Error(`invalid ISO date: ${t}`);let e=t.slice(0,10);if(new Date(e+"T00:00:00Z").toISOString().slice(0,10)!==e)throw new Error(`invalid ISO date: ${t}`);let n=t.length===10?t+"T00:00:00Z":/Z$|[+-]\d{2}:\d{2}$/.test(t)?t:t+"Z",r=new Date(n);if(!Number.isFinite(r.getTime()))throw new Error(`invalid ISO date: ${t}`);return r.toISOString()}function nA(t,e,n,r){let s=tA[r],o=r==="team"||r==="alias"?`CASE WHEN is_direct THEN '(direct)' ELSE COALESCE(${s},'(unknown)') END`:`COALESCE(${s},'(unknown)')`,i="FROM turn_usage WHERE started_at >= ? AND started_at < ?",a=t.prepare(`SELECT ${o} AS key,${eA} ${i} GROUP BY ${o} ORDER BY key`).all(e,n),l=t.prepare(`SELECT 'total' AS key,${eA} ${i}`).get(e,n),c={usage:{},cost:{}};for(let[d,u,f]of[["usage","usage_reason","usage_source IS NULL"],["cost","cost_reason","cost_usd IS NULL"]]){let m=t.prepare("SELECT COALESCE("+u+",'not_recorded') AS reason,COUNT(*) AS turns "+i+" AND "+f+" GROUP BY reason ORDER BY reason").all(e,n);for(let p of m)c[d][p.reason]=p.turns}return{groups:a,total:l.turns===0?rA():l,reasons:c}}function rA(){return{key:"total",turns:0,input:0,cacheRead:0,cacheWrite:0,output:0,costUsd:null,cacheHitPercent:null,unknownUsageCount:0,unknownCostCount:0}}function FB(t){let e=t.map(s=>s.split(/[\\/]/).filter(Boolean)),n=t.map(()=>1),r=e.map((s,o)=>s.at(-1)??t[o]);for(;;){let s=new Map;for(let i of r)s.set(i,(s.get(i)??0)+1);let o=!1;for(let i=0;i<r.length;i++)(s.get(r[i])??0)>1&&n[i]<e[i].length&&(n[i]++,r[i]=e[i].slice(-n[i]).join("/"),o=!0);if(!o){for(let i=0;i<r.length;i++)(s.get(r[i])??0)>1&&(r[i]=t[i]);return r}}}async function jB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(Qk),0;let n=ae(t,["--since","--until","--by"]),r,s,o;try{if(n.error)throw new Error(n.error);if(n.positionals.length)throw new Error("usage takes no positional arguments");let a=new Date;if(r=Zk(String(n.flags["--since"]??new Date(a.getTime()-7*864e5).toISOString())),s=Zk(String(n.flags["--until"]??a.toISOString())),r>=s)throw new Error("--since must be earlier than --until");let l=String(n.flags["--by"]??"day");if(!Object.hasOwn(tA,l))throw new Error(`invalid --by: ${l}`);o=l}catch(a){return e.stderr.write(`error: ${a instanceof Error?a.message:String(a)}
|
|
2320
|
+
${Qk}`),2}let i;try{let a={groups:[],total:rA(),reasons:{usage:{},cost:{}}},l=Pe(e);if(UB(l)&&(i=Cr(l),i.prepare("SELECT 1 FROM sqlite_master WHERE type='view' AND name='turn_usage'").get()&&(a=nA(i,r,s,o))),n.flags["--json"])e.stdout.write(JSON.stringify({schema_version:1,since:r,until:s,by:o,...a})+`
|
|
2321
2321
|
`);else{a.groups.length||e.stdout.write(`no usage recorded yet
|
|
2322
2322
|
`),e.stdout.write("Period (UTC): "+r+" <= started_at < "+s+`
|
|
2323
|
-
`);let c=new Intl.NumberFormat("en-US"),d=h=>h===null?"(unknown)":c.format(h),u=["group","turns","input","cache-read","cache-write","output","cost-USD","cache-hit-%","unknown-usage","unknown-cost"],f=a.groups.map(h=>h.key),m=[...o==="team"?
|
|
2323
|
+
`);let c=new Intl.NumberFormat("en-US"),d=h=>h===null?"(unknown)":c.format(h),u=["group","turns","input","cache-read","cache-write","output","cost-USD","cache-hit-%","unknown-usage","unknown-cost"],f=a.groups.map(h=>h.key),m=[...o==="team"?FB(f):f,"total"],p=[u,...[...a.groups,a.total].map((h,g)=>[m[g],d(h.turns),d(h.input),d(h.cacheRead),d(h.cacheWrite),d(h.output),h.costUsd===null?"(unknown)":h.costUsd.toFixed(6),h.cacheHitPercent===null?"(unknown)":h.cacheHitPercent.toFixed(2),d(h.unknownUsageCount),d(h.unknownCostCount)])],_=u.map((h,g)=>Math.max(...p.map(E=>E[g].length)));for(let h of p)e.stdout.write(h.map((g,E)=>E===0?g.padEnd(_[E]):g.padStart(_[E])).join(" ")+`
|
|
2324
2324
|
`);for(let[h,g]of Object.entries(a.reasons)){let E=Object.entries(g).map(([y,T])=>y+"="+c.format(T)).join(", ");E&&e.stdout.write("Unknown "+h+" reasons: "+E+`
|
|
2325
2325
|
`)}}return 0}catch(a){return e.stderr.write(`error: cannot read usage: ${a instanceof Error?a.message:String(a)}
|
|
2326
2326
|
`),1}finally{i?.close()}}var tA,Qk,eA,oA=x(()=>{"use strict";ga();le();tA={day:"day",provider:"provider",model:"model",team:"team",alias:"alias",session:"native_session_id",dir:"cwd"},Qk=`usage: lmctl usage [--since D] [--until D] [--by day|provider|model|team|alias|session|dir] [--json]
|
|
@@ -2335,8 +2335,8 @@ Model keys use reported names first; alias-like keys mean the model was not repo
|
|
|
2335
2335
|
SUM(cost_usd) AS costUsd,
|
|
2336
2336
|
100.0*SUM(CASE WHEN usage_source IS NOT NULL THEN COALESCE(tok_cache_read,0) ELSE 0 END)
|
|
2337
2337
|
/NULLIF(SUM(CASE WHEN usage_source IS NOT NULL THEN COALESCE(tok_input_uncached,0)+COALESCE(tok_cache_read,0)+COALESCE(tok_cache_write,0) ELSE 0 END),0) AS cacheHitPercent,
|
|
2338
|
-
COALESCE(SUM(usage_source IS NULL),0) AS unknownUsageCount, COALESCE(SUM(cost_usd IS NULL),0) AS unknownCostCount`});var lA={};me(lA,{FIRST_PARTY_DEEPSEEK_MODELS:()=>iA,buildCostPayload:()=>aA,normalizeModelId:()=>gd,runCost:()=>
|
|
2339
|
-
`),0;let n=ae(t,["--provider"],["--json"]);if(n.error!==void 0)return D(e,n.error);if(n.positionals.length>2)return D(e,`too many positionals (${n.positionals.length}); expected <target> [alias]`);let r=z(n,"--json"),s=sn(
|
|
2338
|
+
COALESCE(SUM(usage_source IS NULL),0) AS unknownUsageCount, COALESCE(SUM(cost_usd IS NULL),0) AS unknownCostCount`});var lA={};me(lA,{FIRST_PARTY_DEEPSEEK_MODELS:()=>iA,buildCostPayload:()=>aA,normalizeModelId:()=>gd,runCost:()=>qB});function gd(t){return t.trim().toLowerCase().replace(/(\d)\.(\d)/g,"$1-$2")}function HB(t,e,n,r){let s=new Set,o=[];for(let i of e){let a=n===null?null:Ga(t,i,n,r),l=a?.kind==="priced"||a?.kind==="estimated"?`id:${a.model.normalizedId}`:a?.kind==="known-unpriced"?`id:${a.id}`:`raw:${i.trim().toLowerCase()}`;s.has(l)||(s.add(l),o.push(i))}return o}async function aA(t,e,n){let r=[...new Set([...n.messages.map(k=>k.model),...(n.responses??[]).map(k=>k.model??void 0)].filter(k=>k!==void 0&&k!=="<synthetic>"))],s=[...n.messages].reverse().find(k=>k.model!==void 0&&k.model!=="<synthetic>")?.model,o=n.model??s??null,i=Xn(n.responses??[],n.captureStatus!=="partial"),a=t==="gemini"&&(n.totalOutputTokens!==void 0||n.totalReasoningOutputTokens!==void 0)?(n.totalOutputTokens??0)+(n.totalReasoningOutputTokens??0):n.totalOutputTokens??null,l={input:n.responses?i.input_uncached:n.totalInputTokens??null,output:n.responses?i.output:a,cachedInput:n.responses?i.input_cached:n.totalCachedInputTokens??null},c=await Tt(),d=HB(t,r,c.catalog,c.aliases),u=n.responses===void 0&&d.length>1,f="unavailable",m=null,p=null,_=null,h=null,g=!1,E=null,y=null;if(o!==null&&c.catalog!==null){let k=wt(t,o,c.catalog,c.aliases);if(f=k.state.kind,k.offer!==null)y=k.offer.pricing,m=k.offer.route,p=k.offer.source,_=k.offer.sourceModelId,h=k.provenance,g=k.offer.estimated;else switch(k.state.kind){case"unresolved":E=`alias "${k.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":E=`"${k.state.id}" is a known model with no published price row`;break;case"unknown":E=`model "${o}" not found in lmprice catalog for provider "${t}"`;break;case"wrong-provider":E=`model "${o}" is not offered by provider "${t}" (found under: ${k.state.otherProviders.join(", ")})`;break;default:E=`no lmprice catalog coverage for provider "${t}"`;break}}else o!==null&&(E="lmprice catalog unavailable");let T=y===null?null:{inputPer1m:y.input_per_1m_tokens,outputPer1m:y.output_per_1m_tokens,cachedInputPer1m:y.input_cache_read_per_1m_tokens},w=l.cachedInput??0,S=n.totalCacheWriteInputTokens??0,I=["claude","codex","gemini","qwen","copilot"].includes(t),b=l.input===null?null:Math.max(0,l.input-(I?w:0)-(t==="claude"||t==="copilot"?S:0)),L=l.input===null||l.output===null?null:Vo({input:b,output:l.output,cachedInput:w,...S>0?{cacheWrite:S,...n.totalCacheWrite5mInputTokens===void 0?{}:{cacheWrite5m:n.totalCacheWrite5mInputTokens},...n.totalCacheWrite1hInputTokens===void 0?{}:{cacheWrite1h:n.totalCacheWrite1hInputTokens}}:{}},y);if(L===null&&w>0&&y!==null&&y.input_cache_read_per_1m_tokens==null&&(E="no applicable cache-read price rate"),n.responses)if(L=null,!n.responses.length||n.captureStatus==="partial"||new Set(n.responses.map(k=>k.response_id)).size!==n.responses.length)E="session accounting coverage is incomplete";else if(!c.catalog)E="lmprice catalog unavailable";else{let k=0,v=null;for(let A of n.responses){let N=A.tokens;if(!A.model){v="a response lacks a model";break}let R=n.turns?.flatMap(Rr=>Rr.rawUsage??[]).find(Rr=>Rr.responseId===A.response_id)?.values,C=R?.promptTokens??R?.prompt_tokens,$=R?.input_tokens,P=R?.cache_read_tokens??R?.input_cache_read_tokens,q=R?.cache_write_tokens??R?.input_cache_write_tokens;if(typeof $=="number"&&typeof P=="number"&&P>$||typeof C=="number"&&typeof P=="number"&&P>C||typeof C=="number"&&typeof q=="number"&&q>C||typeof C=="number"&&typeof P=="number"&&typeof q=="number"&&P+q>C){v=`${t} reported contradictory token counters`;break}if(N.output===null){v=`${t} does not record output tokens`;break}if(N.input_cached===null){v=`${t} does not record cached input tokens`;break}let M=A.model_provider??t,ue=gd(A.model??""),H=(M==="deepseek"||A.model_provider==="deepseek")&&(A.model_provider===void 0||A.model_provider==="deepseek")&&iA.has(ue),ne=N.input_cache_write;if(ne===null&&!H){v=`${t} does not record cache-write input tokens`;break}if(t==="agy"&&(ne??0)>0){v="cache-write inclusion in input is not verified";break}let fe=["kimi","opencode","miniplayer"].includes(t),ze=wt(M,A.model,c.catalog,c.aliases),Qe=ze.offer??wt(t,A.model,c.catalog,c.aliases).offer;if(Qe===null){switch(ze.state.kind){case"no-catalog":v=`no lmprice catalog coverage for provider "${t}"`;break;case"unresolved":v=`alias "${ze.state.alias}" is deliberately unresolved in the lmprice alias table`;break;case"known-unpriced":v=`"${ze.state.id}" is a known model with no published price row`;break;case"unknown":v=`model "${A.model}" not found in lmprice catalog for provider "${t}"`;break;case"wrong-provider":v=`model "${A.model}" is not offered by provider "${t}" (found under: ${ze.state.otherProviders.join(", ")})`;break;default:v=`no applicable price for response model "${A.model}"`;break}break}if(ne===null){let Rr=(Qe.route??"").toLowerCase(),F=/^(openrouter|ollama|together|fireworks|groq|azure|bedrock|vertex)[:\/]/i.test(Rr),j=gd(Qe.sourceModelId??""),he=Qe.provider==="deepseek"&&Qe.source!=="openrouter"&&!F&&j===ue;if(H&&he)ne=0;else{v=`${t} does not record cache-write input tokens`;break}}if(N.input_uncached===null){v=`${t} does not record uncached input tokens`;break}let Ao=Vo({input:Math.max(0,N.input_uncached-(fe?ne:0)),cachedInput:N.input_cached,cacheWrite:ne,output:N.output},Qe?.pricing??null);if(Ao===null){v=`no applicable price for response model "${A.model}"`;break}k+=Ao,!m&&Qe&&(m=Qe.route,f="priced")}L=v?null:k,E=v}return L===null&&(!n.responses&&l.input===null&&l.output===null?E=`${t} does not record token usage`:!n.responses&&l.input===null&&!E?E=`${t} does not record input tokens`:!n.responses&&l.output===null&&!E?E=`${t} does not record output tokens`:E||(E=`no lmprice entry for "${o??"unknown"}"`),(f==="priced"||f==="estimated")&&(f="unavailable",m=null,p=null,_=null,h=null,T=null)),{schema_version:BB,provider:t,sessionId:e,model:o,modelsUsed:d,approximate:u,tokens:l,pricePerModel:T,costUsd:L,priceResolution:f,priceRoute:m,priceSource:p,priceSourceModelId:_,priceProvenance:h,priceEstimated:g,costUnavailableReason:E,priceDataSource:c.source,priceDataGeneratedAt:c.generatedAt}}async function qB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${XB}
|
|
2339
|
+
`),0;let n=ae(t,["--provider"],["--json"]);if(n.error!==void 0)return D(e,n.error);if(n.positionals.length>2)return D(e,`too many positionals (${n.positionals.length}); expected <target> [alias]`);let r=z(n,"--json"),s=sn(WB,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:V(n,"--provider")}});if(s.mode==="error")return D(e,s.message);if(s.mode==="managed")return D(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let o,i;if(s.mode==="ai-team")try{let E=await W(e,y=>Xe(s.teamfile,s.alias,y));o=E.provider,i=E.sessionid}catch(E){if(E instanceof ge)return D(e,E.message);throw E}else if(i=s.sessionid,s.provider!==void 0)o=s.provider;else{let E=await Er(i);if(E.length===0)return D(e,`cost: session "${i}" not found in any provider store`);if(E.length>1)return D(e,`cost: session "${i}" matches multiple providers (${E.join(", ")}); pass --provider`);o=E[0]}let a;try{a=await je(i,o)}catch(E){return D(e,`cost: failed to load session: ${E instanceof Error?E.message:String(E)}`)}if(a===null)return D(e,`cost: session not found: ${i} (provider=${o})`);let l=await aA(o,i,a),{model:c,modelsUsed:d,approximate:u,tokens:f,costUsd:m,priceEstimated:p,priceRoute:_,costUnavailableReason:h}=l,g={source:l.priceDataSource,generatedAt:l.priceDataGeneratedAt};return r?(te(e,l),0):(e.stdout.write(`Session: ${i}
|
|
2340
2340
|
`),e.stdout.write(` Provider: ${o}
|
|
2341
2341
|
`),e.stdout.write(` Model: ${c??"(unknown)"}
|
|
2342
2342
|
`),u&&e.stdout.write(` NOTE: this session used multiple models (${d.join(", ")}) -- cost below is approximate, priced at ${c}'s rate for the whole session.
|
|
@@ -2345,7 +2345,7 @@ Model keys use reported names first; alias-like keys mean the model was not repo
|
|
|
2345
2345
|
`):e.stdout.write(` Cost: ~$${m.toFixed(4)}${u?" (approximate)":""}${p?" (estimated rate)":""}
|
|
2346
2346
|
`),_!==null&&e.stdout.write(` Price route: ${_}${p?" (manual/estimated row)":""}
|
|
2347
2347
|
`),e.stdout.write(` Price data: ${g.source}${g.generatedAt?` (generated ${g.generatedAt})`:""}
|
|
2348
|
-
`),0)}var _d,
|
|
2348
|
+
`),0)}var _d,WB,iA,BB,XB,cA=x(()=>{"use strict";Co();fn();_d=Ft(Ct(),1);zt();Hr();le();nt();lo();WB={name:"cost",allowsBareTeamfile:!1,supportsRaw:!0};iA=new Set([...oo,...io,"deepseek-v4.1-flash","deepseek-chat","deepseek-reasoner","deepseek-coder","deepseek-v3","deepseek-v3.2","deepseek-r1"].map(gd));BB=1,XB=`usage: lmctl cost <target> [alias] [--json]
|
|
2349
2349
|
lmctl cost <sessionid> [--provider <name>]
|
|
2350
2350
|
|
|
2351
2351
|
Estimate a session's dollar cost: aggregate token usage x the model's
|
|
@@ -2368,39 +2368,41 @@ unavailable) and
|
|
|
2368
2368
|
\`priceDataGeneratedAt\` says how fresh it is -- the online check has a
|
|
2369
2369
|
strict short timeout and NEVER blocks or fails this command: any network
|
|
2370
2370
|
error degrades silently to the local cache, then the bundled built-in
|
|
2371
|
-
copy, in that order.`});function dA(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}var uA=x(()=>{"use strict"});var mA={};me(mA,{runLs:()=>
|
|
2372
|
-
`),0;let n=ae(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return D(e,n.error);if(n.positionals.length>0)return D(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=V(n,"--format"),s=z(n,"--json");if(z(n,"--runs")){for(let h of["--provider","--sessiondir"])if(V(n,h)!==void 0)return D(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(z(n,h))return D(e,`--runs is mutually exclusive with ${h}`);if(r==="teamfile")return D(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=V(n,"--limit"),p=
|
|
2371
|
+
copy, in that order.`});function dA(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}var uA=x(()=>{"use strict"});var mA={};me(mA,{runLs:()=>KB});import{resolve as Jh}from"node:path";function JB(t){let e=new Map;for(let n of t){let r=`${n.provider}:${n.sessionId}`,s=e.get(r);(s===void 0||n.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(r,n)}return[...e.values()]}async function KB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${GB}
|
|
2372
|
+
`),0;let n=ae(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return D(e,n.error);if(n.positionals.length>0)return D(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=V(n,"--format"),s=z(n,"--json");if(z(n,"--runs")){for(let h of["--provider","--sessiondir"])if(V(n,h)!==void 0)return D(e,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(z(n,h))return D(e,`--runs is mutually exclusive with ${h}`);if(r==="teamfile")return D(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let m=V(n,"--limit"),p=VB;if(m!==void 0){let h=Number.parseInt(m,10);if(!Number.isFinite(h)||h<1||String(h)!==m)return D(e,`invalid --limit "${m}" (expected a positive integer)`);if(h>fA)return D(e,`--limit ${h} exceeds maximum (${fA})`);p=h}let _=r==="json"||s===!0?"json":"table";try{return await W(e,async h=>YB(e,h,p,_))}catch(h){return Ot(e,h)}}let i=zB(r,s);if("error"in i)return D(e,i.error);let a=i.format,l=V(n,"--provider"),c=V(n,"--sessiondir"),d=z(n,"--recursive"),u=z(n,"--all"),f;try{f=await Tp(l?{provider:l}:{})}catch(m){return D(e,`ls: discovery failed: ${m instanceof Error?m.message:String(m)}`)}if(!u){let m=c!==void 0?Jh(c):Jh(process.cwd());f=f.filter(p=>{let _=Jh(p.cwd);return d?_===m||_.startsWith(`${m}/`):_===m})}if(f=JB(f),a==="json")return te(e,f.map(m=>({provider:m.provider,sessionId:m.sessionId,cwd:m.cwd,messageCount:m.messageCount,modifiedAt:m.modifiedAt.toISOString(),...m.model!==void 0?{model:m.model}:{}}))),0;if(f.length===0){if(a==="table"){let m=u?"(all)":c??process.cwd(),p=d?"under":"in";e.stdout.write(`No native sessions found ${p} ${m}.
|
|
2373
2373
|
`)}return 0}if(a==="teamfile"){for(let m of f)e.stdout.write(`_MEMBER_ alias=- provider=${m.provider} sessionid=${m.sessionId} sessiondir=${m.cwd}
|
|
2374
|
-
`);return 0}return(0,ot.printTable)(f.map(m=>[(0,ot.escapeCell)(m.sessionId),(0,ot.escapeCell)(m.provider),(0,ot.escapeCell)(m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd),(0,ot.formatRelativeTime)(m.modifiedAt)]),{headers:["SESSION","PROVIDER","SESSIONDIR","MODIFIED"],stream:e.stdout}),0}async function
|
|
2375
|
-
`),0):((0,ot.printTable)(s.map(o=>[(0,ot.escapeCell)(o.id),(0,ot.escapeCell)(o.workflow_id),(0,ot.escapeCell)(o.team_id),(0,ot.escapeCell)(o.current_state??""),(0,ot.escapeCell)(o.terminal_state??""),(0,ot.escapeCell)(o.started_at)]),{headers:["RUN_ID","WORKFLOW","TEAM","STATE","TERMINAL","STARTED"],stream:t.stdout}),0)}function
|
|
2374
|
+
`);return 0}return(0,ot.printTable)(f.map(m=>[(0,ot.escapeCell)(m.sessionId),(0,ot.escapeCell)(m.provider),(0,ot.escapeCell)(m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd),(0,ot.formatRelativeTime)(m.modifiedAt)]),{headers:["SESSION","PROVIDER","SESSIONDIR","MODIFIED"],stream:e.stdout}),0}async function YB(t,e,n,r){let s=dA(e,{limit:n});return r==="json"?(te(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0):s.length===0?(t.stdout.write(`No runs found.
|
|
2375
|
+
`),0):((0,ot.printTable)(s.map(o=>[(0,ot.escapeCell)(o.id),(0,ot.escapeCell)(o.workflow_id),(0,ot.escapeCell)(o.team_id),(0,ot.escapeCell)(o.current_state??""),(0,ot.escapeCell)(o.terminal_state??""),(0,ot.escapeCell)(o.started_at)]),{headers:["RUN_ID","WORKFLOW","TEAM","STATE","TERMINAL","STARTED"],stream:t.stdout}),0)}function zB(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var ot,GB,VB,fA,pA=x(()=>{"use strict";ot=Ft(Ct(),1);Un();le();uA();GB=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2376
2376
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2377
2377
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2378
2378
|
|
|
2379
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,
|
|
2380
|
-
`),2;let o=Mt(e.env??process.env,n.configPath);try{let i=pb((n.detectProviders??gb)()),a=
|
|
2381
|
-
`),1;let l={};for(let
|
|
2382
|
-
`)
|
|
2383
|
-
`)
|
|
2384
|
-
`)
|
|
2385
|
-
`),e.
|
|
2386
|
-
`),u(
|
|
2387
|
-
`),e.
|
|
2379
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,VB=50,fA=500});import{closeSync as hA,openSync as QB,writeFileSync as _A,fsyncSync as ZB,renameSync as eX,unlinkSync as tX,lstatSync as Kh,readFileSync as nX}from"node:fs";import{randomUUID as rX}from"node:crypto";import{dirname as sX,join as oX}from"node:path";function yd(t,e,n){let r=()=>n===null?(()=>{try{return Kh(t),!0}catch(a){if(a.code==="ENOENT")return!1;throw a}})():!nX(t).equals(Buffer.from(n,"utf8")),s=384;if(n!==null){let a=Kh(t);if(!a.isFile())throw new Error("Profile path must be a regular file: "+t);if(s=a.mode&511,!(s&146))throw new Error("Profile is read-only: "+t)}let o=oX(sX(t),".init-"+rX()+".tmp"),i;try{if(i=QB(o,"wx",s),_A(i,e,"utf8"),ZB(i),hA(i),i=void 0,r())throw new Error("Profile changed concurrently: "+t);if(n!==null){let a=t+".bak";try{if(!Kh(a).isFile())throw new Error("Backup path is not a regular file: "+a)}catch(l){if(l.code!=="ENOENT")throw l}if(_A(a,n,{encoding:"utf8",flag:"w",mode:s}),r())throw new Error("Profile changed concurrently: "+t)}eX(o,t)}finally{i!==void 0&&hA(i);try{tX(o)}catch(a){if(a.code!=="ENOENT")throw a}}}var gA=x(()=>{"use strict"});var yA={};me(yA,{runInit:()=>uX});import{mkdirSync as iX,readFileSync as aX}from"node:fs";import{dirname as lX}from"node:path";function dX(t){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(aX(t))}catch(e){if(e.code==="ENOENT")return null;throw new qe(t,"read",e.message)}}async function uX(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(cX),0;let r=t.includes("--force"),s=t.find(i=>i!=="--force"&&i!=="--help"&&i!=="-h");if(s!==void 0)return e.stderr.write(`error: unknown argument: ${s}
|
|
2380
|
+
`),2;let o=Mt(e.env??process.env,n.configPath);try{let i=pb((n.detectProviders??gb)()),a=dX(o);if(i.length===0)return e.stderr.write(`error: no supported provider is installed -- looked for ${fo.join(", ")} on PATH (each must run \`<name> --version\`). ${a===null?"Nothing was written":`${o} was left unchanged`}; install a provider CLI, then run this again.
|
|
2381
|
+
`),1;let l=[],c={},d=[];for(let p of i)try{let _=await(n.modelsForProvider??hb)(p);if(_.length===0)throw new Error(`No model ids are available for detected provider "${p}"`);l.push(p),c[p]=_}catch(_){let h=_ instanceof Error?_.message:String(_),g=`${p}: ${h}`;d.push(g),e.stderr.write(`warning: ${p} model catalog unavailable (${h}); skipping this provider.
|
|
2382
|
+
`)}if(l.length===0)return e.stderr.write(`error: no detected provider returned model ids (${d.join("; ")}). Nothing was written.
|
|
2383
|
+
`),1;let u=_b(l,c);e.stderr.write(`notice: installed: ${i.join(", ")} -- provider slots use order (${fo.join(", ")}); model1 uses each provider's first reported id
|
|
2384
|
+
`);let f=()=>{l.length<3&&e.stderr.write(`notice: only ${l.length} provider${l.length===1?" was":"s were"} available for slots (${l.join(", ")}) -- ${l.length===1?"Provider2 and Provider3 repeat Provider1":"Provider3 repeats Provider1"}.
|
|
2385
|
+
`)},m=p=>{p.length>0&&e.stdout.write(`${p.map(_=>`[${_}]`).join(", ")} ${p.length===1?"is":"are"} not in ${o} -- left as you have them (init refreshes only the example slots present; add one to have it filled).
|
|
2386
|
+
`)};if(a!==null&&!r){let p=yb(a,u);if(!p.ok)return e.stderr.write(`error: ${o}${p.line!==void 0?`:${p.line}`:""}: ${p.error}
|
|
2387
|
+
`),e.stderr.write("The file was left unchanged. Fix it by hand, or run `lmctl init --force` to regenerate it from scratch.\n"),1;if(p.changes.length===0)return e.stdout.write(`${o} is up to date -- detected provider/model values already match.
|
|
2388
|
+
`),m(p.absent),e.stdout.write(`
|
|
2389
|
+
`),e.stdout.write(ra(u)),e.stdout.write(`
|
|
2388
2390
|
${Yh}
|
|
2389
|
-
`),
|
|
2390
|
-
`);for(let
|
|
2391
|
-
`);return
|
|
2391
|
+
`),f(),0;yd(o,p.text,a),e.stdout.write(`Updated ${o} (previous file saved as ${o}.bak):
|
|
2392
|
+
`);for(let _ of p.changes)e.stdout.write(` ${_.section}.${_.key}: "${_.oldValue}" -> "${_.newValue}"
|
|
2393
|
+
`);return m(p.absent),e.stdout.write(`
|
|
2392
2394
|
${Yh}
|
|
2393
|
-
`),
|
|
2395
|
+
`),f(),0}if(a!==null){pn(a,o);let p=ra(u);pn(p,o),yd(o,p,a),e.stdout.write(`Wrote ${o} (previous file saved as ${o}.bak)
|
|
2394
2396
|
|
|
2395
|
-
`)}else{let
|
|
2397
|
+
`)}else{let p=ra(u);pn(p,o),iX(lX(o),{recursive:!0}),yd(o,p,null),e.stdout.write(`Wrote ${o}
|
|
2396
2398
|
|
|
2397
|
-
`)}return e.stdout.write(ra(
|
|
2399
|
+
`)}return e.stdout.write(ra(u)),e.stdout.write(`
|
|
2398
2400
|
This is a starting point, not a fixed answer -- edit provider/model1 above before running lmctl plan or lmctl quickrun if it is not right.
|
|
2399
2401
|
`),e.stdout.write(`${Yh}
|
|
2400
|
-
`),
|
|
2402
|
+
`),f(),0}catch(i){return i instanceof qe?(e.stderr.write(`error: ${i.detail}
|
|
2401
2403
|
`),e.stderr.write(r?`The file was left unchanged: --force does not overwrite a file it cannot read as TOML. Fix it by hand, or move it aside.
|
|
2402
2404
|
`:"The file was left unchanged. Fix it by hand, or run `lmctl init --force` to regenerate it from scratch.\n"),1):(e.stderr.write("error: cannot update "+o+": "+(i instanceof Error?i.message:String(i))+`
|
|
2403
|
-
`),1)}}var Yh,
|
|
2405
|
+
`),1)}}var Yh,cX,EA=x(()=>{"use strict";gA();us();Yh="These are lmctl properties: lmscript reads PROPS.Provider1.Provider and PROPS.Provider1.Model1; legacy plan/quickrun templates use them as ${Provider1}/${Model1}.",cX=`usage: lmctl init [--force]
|
|
2404
2406
|
|
|
2405
2407
|
Writes ~/.lmctl/init.toml if it does not exist: an example of three provider
|
|
2406
2408
|
slots (Provider1/2/3), each with a provider and model1.
|
|
@@ -2410,9 +2412,10 @@ How the example is chosen:
|
|
|
2410
2412
|
and \`<binary> --version\` succeeds. (Not session history: a provider
|
|
2411
2413
|
you installed a minute ago counts.)
|
|
2412
2414
|
- Ranking: lmctl's provider order, ${fo.join(", ")}; the
|
|
2413
|
-
first three installed fill Provider1,
|
|
2414
|
-
|
|
2415
|
-
|
|
2415
|
+
first three installed providers that return model ids fill Provider1,
|
|
2416
|
+
Provider2, Provider3. Unavailable model catalogs are warned and skipped.
|
|
2417
|
+
- Two available: Provider3 = Provider1. One available: Provider2 =
|
|
2418
|
+
Provider3 = Provider1. None installed or no catalogs readable: an error, and nothing is written.
|
|
2416
2419
|
- model1 is the provider's first reported native model id. Claude Code uses the highest-version undated catalog id.
|
|
2417
2420
|
|
|
2418
2421
|
If the file already exists, init refreshes only the provider/model1
|
|
@@ -2439,11 +2442,11 @@ it is expected.
|
|
|
2439
2442
|
--force Regenerate the whole example file from detection (previous file
|
|
2440
2443
|
saved as init.toml.bak). Slots you added are NOT kept by --force.
|
|
2441
2444
|
-h, --help display help for command
|
|
2442
|
-
`});function TA(t){let e=Object.create(null),n=Object.create(null),r=(s,o,i=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,o+"."+c,!1));return i&&(n[o]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let u=/^Provider[123]$/.test(o)&&["provider","model1"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,u))throw Error(`Ambiguous property '${o}.${u}'`);a[u]=r(c,o?o+"."+u:u,i&&/^[_a-zA-Z]\w*$/.test(u))}return a}return i&&(n[o]=s),s};for(let[s,o]of Object.entries(t))e[s]=r(o,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var wA=x(()=>{"use strict"});import{execFileSync as
|
|
2443
|
-
`)}catch{}}}}function
|
|
2445
|
+
`});function TA(t){let e=Object.create(null),n=Object.create(null),r=(s,o,i=!0)=>{if(Array.isArray(s)){let a=s.map((l,c)=>r(l,o+"."+c,!1));return i&&(n[o]=a),a}if(s&&typeof s=="object"&&!(s instanceof Date)){let a=Object.create(null);for(let[l,c]of Object.entries(s)){let u=/^Provider[123]$/.test(o)&&["provider","model1"].includes(l)?l[0].toUpperCase()+l.slice(1):l;if(Object.hasOwn(a,u))throw Error(`Ambiguous property '${o}.${u}'`);a[u]=r(c,o?o+"."+u:u,i&&/^[_a-zA-Z]\w*$/.test(u))}return a}return i&&(n[o]=s),s};for(let[s,o]of Object.entries(t))e[s]=r(o,s,/^[_a-zA-Z]\w*$/.test(s));return{properties:e,flat:n}}var wA=x(()=>{"use strict"});import{execFileSync as fX}from"node:child_process";import{resolve as vA}from"node:path";function mX(t){return t.filter(e=>e.state!=="retired")}function SA(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?D(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=fX("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return D(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let o=vA(s),i=e.listProjects().find(a=>vA(a.local_path)===o);return i===void 0?D(t,`terminal cannot infer a member from cwd ${o}; use \`lmctl terminal <teamfile> <alias>\``):i}function IA(t,e,n,r){if(r!==void 0){let o=e.findTeamByName(r);return o===null?D(t,`team not found: ${r}`):o}let s=e.getTeam(n.team_id);return s===null?D(t,`project ${n.name} has no assigned team; use --team <name>`):s}function bA(t,e,n,r){if(r!==void 0){let o=e.findTeamMemberByAlias(n.id,r);return o===null||o.state==="retired"?D(t,`member not found: ${r}`):o}let s=mX(e.listTeamMembers(n.id)).find(o=>o.role==="agent");return s===void 0?D(t,`team ${n.name} has no active agent member`):s}var kA=x(()=>{"use strict";le()});function AA(t,e,n){let r=t.getRun(e);if(r===null)return{err:`run ${e}: not found`};if(n!==void 0){let l=t.findTeamMemberByAlias(r.team_id,n);return l===null?{err:`run ${e}: team has no member alias "${n}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(r.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(r.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}var NA=x(()=>{"use strict"});var CA={};me(CA,{SIZE_WARN_EST_TOKENS:()=>ma,estimateTokens:()=>xA,runTeamTerminal:()=>yX,runTerminal:()=>zh});import{constants as pX}from"node:os";import{spawn as hX}from"node:child_process";import{statSync as _X}from"node:fs";async function zh(t,e){if(t.includes("--help")||t.includes("-h"))return SX(e);let n=ae(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return D(e,n.error);if(Rn(e)&&!z(n,"--size"))return D(e,"terminal opens an interactive TUI; non-interactive mode is enabled");let r=V(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return D(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return D(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?z(n,i):V(n,i)!==void 0)return D(e,`--run is mutually exclusive with ${i}`);try{return await W(e,async i=>{let a=V(n,"--alias"),l=AA(i,s,a);return"err"in l?D(e,l.err):Qh(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(i){return Ot(e,i)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?z(n,l):V(n,l)!==void 0)return D(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return D(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=n.positionals[0],i=n.positionals[1],a=sn(gX,{target:o,alias:i,flags:{}});return a.mode==="error"?D(e,a.message):a.mode!=="ai-team"?D(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?D(e,"terminal: alias required for the teamfile target"):await W(e,l=>LA(e,a.teamfile,a.alias,l,z(n,"--json")))}try{return await W(e,async s=>{let o=TX(e,s,n);if(typeof o=="number")return o;let i=V(n,"--alias");return z(n,"--size")?vX(e,s,o,i,z(n,"--json")):wX(e,s,o,i)})}catch(s){return Ot(e,s)}}async function yX(t,e,n,r,s){let o=await LA(t,e,n,r,!1,s);return{code:s.signalObserved?null:o,signal:s.signalObserved??null}}async function LA(t,e,n,r,s,o){let i;try{i=Xe(e,n,r)}catch(A){return A instanceof ge?D(t,A.message):Ot(t,A)}let a=tr(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ar(o?.env??t.env)});if(!a.acquired){let A=a.current.holder_pid,N=A===null?null:et(A)?"live":"dead",R=`${i.alias} is busy/held by ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} `+(A===null?"(holder_pid=unavailable)":`(holder_pid=${A}, ${N})`);return s?(te(t,{status:"error",errorKind:"busy",message:R,holder_pid:A,holder_liveness:N}),1):D(t,R)}let l=_I({teamfile:i.teamfile,alias:i.alias,pid:o?.pid}),c=null,d=null,u=null,f=[],m={...o?.env??t.env??process.env},p=!1,_=null,h=!1,g,E,y,T=A=>{c!==null&&(clearInterval(c),c=null);try{let N=r.getTerminalLock(l.teamfile,l.alias);!r.clearTerminalLock(l.teamfile,l.alias,l.lock_id)&&N!==null&&A.push("terminal lock release was not acknowledged")}catch(N){A.push(`terminal lock release: ${N instanceof Error?N.message:String(N)}`)}try{let N=r.getAgentInflight(l.teamfile,l.alias);!r.releaseAgentInflight(a.lease,a.leaseId)&&N!==null&&A.push("inflight release was not acknowledged")}catch(N){A.push(`inflight release: ${N instanceof Error?N.message:String(N)}`)}},w=(A,N)=>{let R=r.db.pragma("busy_timeout",{simple:!0});r.db.pragma("busy_timeout=0");try{A(N)}finally{try{r.db.pragma(`busy_timeout=${R}`)}catch(C){N.push(`busy timeout restore: ${C instanceof Error?C.message:String(C)}`)}}},S=(A,N)=>{if(!(d===null||h))try{if(r.finishTrackedInvocation(d,A)===null){let C=r.getTrackedInvocation(d);C==null||C.status==="running"?N.push("tracked terminal finish was not acknowledged"):h=!0}else h=!0}catch(R){N.push(`tracked terminal finish: ${R instanceof Error?R.message:String(R)}`)}},I=A=>{if(p)return;p=!0;let N=[];try{w(R=>{T(R),S({status:"cancelled",signal:A,exit_code:A==="SIGINT"?130:143,error:`terminal interrupted by ${A}`},R)},N)}catch(R){N.push(R instanceof Error?R.message:String(R))}N.length>0&&(_=Error(N.join("; ")))},b=!o,L=b?new AbortController:void 0,O=()=>L?.abort("SIGINT"),k=()=>L?.abort("SIGTERM");b&&(process.once("SIGINT",O),process.once("SIGTERM",k));let v=o??{env:m,signal:L?.signal};v.env=m;try{if(v.cancel=I,v.cleanupError=()=>_,o&&o.onResource?.({close(){if(E)return E;let R,C;E=new Promise((P,q)=>{R=P,C=q});let $=performance.now();return(async()=>{if(I("SIGTERM"),o.stop?.("SIGTERM"),_)throw _;if(g){let P=5e3-(performance.now()-$),q;try{if(P<=0)throw Error("terminal close deadline exceeded");await Promise.race([g.catch(()=>{}),new Promise((M,ue)=>{q=setTimeout(()=>ue(Error("terminal close deadline exceeded")),P)})])}catch(M){throw _=M instanceof Error?M:Error(String(M)),_}finally{clearTimeout(q)}}})().then(R,C),E},finalizeSync(R){if(I(R),o.stop?.(R),_)throw _}}),p||v.signal?.aborted){let R=v.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM";return I(R),R==="SIGINT"?130:143}r.setTerminalLock(l),d=EX(r,i,m,o?.pid),d!==null&&(m.LMCTL_INVOCATION_ID=String(d));let A=r.getRootTeam(i.teamfile)?.name??null;A!==null&&(m.LMBEE_TEAM_NAME=A),c=setInterval(()=>{try{let R=new Date().toISOString(),C=r.heartbeatTerminalLock(l.teamfile,l.alias,l.lock_id,R);C&&r.heartbeatAgentInflight(a.lease,a.leaseId,R),!C&&c!==null&&(clearInterval(c),c=null)}catch{}},gI(m)),c.unref?.();try{Xs(t,be(i.teamfile),i.teamfile)}catch{}let N=v;return g=Qh(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead},R=>{f.push(`${R.provider} terminal ignored model=${R.model}: ${R.reason}`)},N),u=await g,u}catch(A){throw y=A,A}finally{if(b&&(process.removeListener("SIGINT",O),process.removeListener("SIGTERM",k)),!p){p=!0;let A=[];try{w(N=>{T(N),S({status:u===0?"done":"error",exit_code:u,result_summary:u===0?"terminal session ended":null,error:u===0?null:`terminal exited with code ${u??"unknown"}`,...f.length>0?{config_warnings:JSON.stringify(f)}:{}},N)},A)}catch(N){A.push(N instanceof Error?N.message:String(N))}A.length>0&&(_=Error(A.join("; ")))}if(_){if(y===void 0)throw _;try{t.stderr.write("error: terminal cleanup: "+_.message+`
|
|
2446
|
+
`)}catch{}}}}function EX(t,e,n=process.env,r=process.pid){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:r,launch_source:"terminal",parent_invocation_id:$s(n.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}async function Qh(t,e,n,r){let{provider:s,sessionid:o,sessiondir:i,model:a}=e;if(!kc(s))return D(t,`no resume incantation for provider "${s}"`);if(!iI.test(o))return D(t,"refusing to resume: malformed sessionid");let l=Sp(s,o,{isLead:e.isLead,model:a,onModelIgnored:p=>{let _=`warning: ${p.provider} terminal ignored model=${p.model}: ${p.reason}`;t.stderr.write(`${_}
|
|
2444
2447
|
`),He({event:"model_ignored",provider:p.provider,model:p.model,reason:p.reason}),n?.(p)}});if(l===null||l.length===0)return D(t,`no resume incantation for provider "${s}"`);let c=Ce(r?.env??t.env??process.env,i,o,"terminal"),d=await aI(s,{binary:l[0],cwd:i,env:c,signal:r?.signal});if(r?.signal?.aborted){let p=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(p),p==="SIGINT"?130:143}let[u,...f]=l,m=d.kind==="use-binary"?d.binary:u;return d.message&&t.stderr.write(d.message+`
|
|
2445
|
-
`),await new Promise(p=>{if(r?.signal?.aborted){let b=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(b),p(b==="SIGINT"?130:143)}let _=r?.streams,h=_?[_.stdin,_.stdout,_.stderr].map(b=>b.fd):void 0,g=h?.every(b=>typeof b=="number"),E=
|
|
2446
|
-
`),p(O)})})}function
|
|
2448
|
+
`),await new Promise(p=>{if(r?.signal?.aborted){let b=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(b),p(b==="SIGINT"?130:143)}let _=r?.streams,h=_?[_.stdin,_.stdout,_.stderr].map(b=>b.fd):void 0,g=h?.every(b=>typeof b=="number"),E=hX(m,f,{stdio:_?g?h:["pipe","pipe","pipe"]:"inherit",cwd:i,env:c}),y=_?.stdin?.readableFlowing;_&&!g&&(_.stdin.pipe(E.stdin),E.stdout?.pipe(_.stdout,{end:!1}),E.stderr?.pipe(_.stderr,{end:!1}));let T=!1,w=b=>{if(!T){T=!0;try{r?.cancel?.(b)}catch{}{try{E.kill(b)}catch{}de(E,{stdinEnd:!1,softDelayMs:0,killDelayMs:100}).catch(()=>{})}}},S=()=>w(r?.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM");r&&(r.stop=w);let I=()=>{r?.signal?.removeEventListener("abort",S),_&&!g&&(_.stdin.unpipe(E.stdin),y||_.stdin.pause(),E.stdout?.unpipe(_.stdout),E.stderr?.unpipe(_.stderr))};r?.signal?.addEventListener("abort",S,{once:!0}),r?.signal?.aborted&&S(),E.stdin?.on("error",()=>{}),E.on("error",b=>{I(),p(D(t,`failed to launch ${m}: ${b.message}`))}),E.on("exit",(b,L)=>{I(),r&&(r.signalObserved=L);let O=b??(L?128+(pX.signals[L]??1):1),k=lI(s);k&&O!==0&&O!==130&&O!==143&&!T&&!r?.signal?.aborted&&t.stderr.write(s+" exited with status "+O+". "+k+`
|
|
2449
|
+
`),p(O)})})}function TX(t,e,n){let r=V(n,"--team");if(r!==void 0){let i=e.findTeamByName(r);return i===null?D(t,`team not found: ${r}`):i}let s=SA(t,e,V(n,"--project"));return typeof s=="number"?s:IA(t,e,s,void 0)}async function wX(t,e,n,r){let s=bA(t,e,n,r);if(typeof s=="number")return s;let o=s.sessionid;if(o===null||o.trim().length===0)return D(t,`member ${s.alias} has no session yet \u2014 seed it first: lmctl seed <teamfile> (check with lmctl status <teamfile>)`);let i=new AbortController,a=()=>i.abort("SIGINT"),l=()=>i.abort("SIGTERM");process.once("SIGINT",a),process.once("SIGTERM",l);try{return await Qh(t,{provider:ju(s),sessionid:o,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}},void 0,{env:t.env??process.env,signal:i.signal})}finally{process.removeListener("SIGINT",a),process.removeListener("SIGTERM",l)}}function xA(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=_X(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function vX(t,e,n,r,s){let o;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return D(t,`member not found: ${r}`);o=[a]}else o=e.listTeamMembers(n.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=ju(a),d=a.model??null,u=null;kc(c)&&(u=await je(l,c));let f=xA(u),m=f.est>ma;i.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?cI(c,l,d!==null?{model:d}:{}):null})}if(s)return te(t,{estimate:!0,legend:RA,guide_tokens:ma,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2447
2450
|
`),t.stdout.write(`${RA}
|
|
2448
2451
|
`);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
|
|
2449
2452
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2451,7 +2454,7 @@ it is expected.
|
|
|
2451
2454
|
session yourself:
|
|
2452
2455
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2453
2456
|
(or: lmctl terminal --team ${n.name} --alias ${a.alias})
|
|
2454
|
-
`)}return 0}function
|
|
2457
|
+
`)}return 0}function SX(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias> [--json]
|
|
2455
2458
|
lmctl terminal <teamfile> <alias> [--json]
|
|
2456
2459
|
lmctl terminal --run <id> [--alias A]
|
|
2457
2460
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2484,18 +2487,18 @@ it is expected.
|
|
|
2484
2487
|
tokens it surfaces the resume incantation so YOU can
|
|
2485
2488
|
open & self-compact. Nothing is ever changed
|
|
2486
2489
|
automatically; ${ma} is a guide, not a gate.
|
|
2487
|
-
`),0}var
|
|
2490
|
+
`),0}var gX,ma,RA,Zh=x(()=>{"use strict";zr();vt();fn();le();kA();nt();Be();Ht();Sl();Wt();Il();Ac();NA();re();qr();gX={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},ma=2e5,RA="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});var PA={};me(PA,{runQuickrun:()=>OX});import{mkdtempSync as IX,rmSync as bX}from"node:fs";import{tmpdir as kX}from"node:os";import{existsSync as t_,mkdirSync as AX,readFileSync as NX,statSync as RX,writeFileSync as DA}from"node:fs";import{basename as LX,dirname as MA,join as Td,resolve as Ed}from"node:path";async function OA(t,e){let n=await e(t,{cache:"no-store"});if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${t}`);return n.text()}function xX(t){let e=LX(t),n=Td(t,`${e}.lmctl`),r=2;for(;t_(n);)n=Td(t,`${e}${r}.lmctl`),r+=1;return n}async function CX(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write($A),0;let r=t.includes("--no-seed");if(Rn(e)&&!r&&!t.includes("--no-terminal"))return e.stderr.write(`error: quickrun opens a TUI; use --no-terminal in non-interactive mode
|
|
2488
2491
|
`),2;let s=t.includes("--no-terminal"),o=t.filter(h=>h!=="--no-seed"&&h!=="--no-terminal"&&h!=="--help"&&h!=="-h");if(o.length!==1)return e.stderr.write(`usage: lmctl quickrun <url-or-path>
|
|
2489
2492
|
`),2;let i=o[0],a=n.cwd??process.cwd(),l=n.fetchFn??fetch,c;try{c=ta(Mt(e.env??process.env,n.initConfigPath))}catch(h){return e.stderr.write(h instanceof qe&&h.kind==="missing"?"error: no ~/.lmctl/init.toml found. Run `lmctl init` first, then try quickrun again.\n":"error: "+(h instanceof Error?h.message:String(h))+`
|
|
2490
2493
|
`),1}let d;try{d=await kr(i,l,a)}catch(h){return e.stderr.write(`error: could not fetch ${i}: ${h instanceof Error?h.message:String(h)}
|
|
2491
2494
|
`),1}let u;try{let h=TA(c.document).properties;for(let g of["Directory","NonInteractive"])if(Object.hasOwn(h,g))throw Error("Property '"+g+"' conflicts with an invocation fact in "+c.path+"; fix the file or run lmctl init");Object.assign(h,{Directory:a,NonInteractive:Rn(e)}),u=Eb(d,c.config,{properties:h,path:c.path,argv:[]})}catch(h){return e.stderr.write("error: "+(h instanceof Error?h.message:String(h))+`
|
|
2492
|
-
`),1}let f=
|
|
2495
|
+
`),1}let f=xX(a);if(AX(MA(f),{recursive:!0}),DA(f,u,"utf8"),e.stdout.write(`Wrote ${f}
|
|
2493
2496
|
`),await vr([f],e)!==0)return e.stderr.write(`error: ${f} failed lint after substitution -- check the values in ~/.lmctl/init.toml.
|
|
2494
2497
|
`),1;if(r)return e.stdout.write(`Edit ${f} if needed, then run: lmctl seed ${f}
|
|
2495
|
-
`),0;let p=await oa([f],e);return p!==0?p:s?0:(n.openTerminal??zh)([f,"Lead"],e)}async function
|
|
2498
|
+
`),0;let p=await oa([f],e);return p!==0?p:s?0:(n.openTerminal??zh)([f,"Lead"],e)}async function OX(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t[0]==="--help"||t[0]==="-h")return e.stdout.write($A),0;let r=n.fetchFn??fetch,s=n.cwd??e.cwd??process.cwd();try{if(t.length===0){let m=await OA(`${e_}/index.txt`,r);return e.stdout.write(m.endsWith(`
|
|
2496
2499
|
`)?m:`${m}
|
|
2497
|
-
`),0}let o=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""),i=t.find(m=>m!=="--no-seed"&&m!=="--no-terminal")??"",a=/^https?:\/\//i.test(i)?new URL(i).pathname:i;if(/\.(lmctl|lmc)$/i.test(a)||!o&&t_(Ed(s,i))&&
|
|
2498
|
-
`);{let m=n.launch??hs,p={...e,cwd:s,...n.initConfigPath?{env:{...e.env,LMCTL_HOME:MA(n.initConfigPath)}}:{}};if(u)return m([u,...c],p);let _=
|
|
2500
|
+
`),0}let o=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""),i=t.find(m=>m!=="--no-seed"&&m!=="--no-terminal")??"",a=/^https?:\/\//i.test(i)?new URL(i).pathname:i;if(/\.(lmctl|lmc)$/i.test(a)||!o&&t_(Ed(s,i))&&RX(Ed(s,i)).isDirectory())return CX(t,e,{...n,cwd:s});let[l,...c]=t;if(!l||l.startsWith("-"))throw new Error(`unknown quickrun option: ${l}`);let d,u;if(o)d=`${e_}/${l}.lms`;else if(/^https?:\/\//i.test(l))d=l;else if(t_(Ed(s,l))||l.includes("/")||l.includes("\\"))u=Ed(s,l);else if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*(?:\.lms)?$/.test(l))d=`${e_}/${l.replace(/\.lms$/,"")}.lms`;else throw new Error("Expected a sample name, script URL, or local .lms file.");let f=d?await OA(d,r):NX(u,"utf8");e.stderr.write(`Running ${d??u}
|
|
2501
|
+
`);{let m=n.launch??hs,p={...e,cwd:s,...n.initConfigPath?{env:{...e.env,LMCTL_HOME:MA(n.initConfigPath)}}:{}};if(u)return m([u,...c],p);let _=IX(Td(kX(),"lmctl-quickrun-"));try{let h=Td(_,"download.lms");return DA(h,f,"utf8"),await m(["--base-dir",s,"--source-name",d,h,...c],p)}finally{bX(_,{recursive:!0,force:!0})}}}catch(o){return e.stderr.write(`error: ${o instanceof Error?o.message:String(o)}
|
|
2499
2502
|
`),1}}var e_,$A,UA=x(()=>{"use strict";wA();sd();le();us();ua();_n();Zh();e_="https://lmctl.com/quickrun",$A=`usage: lmctl quickrun
|
|
2500
2503
|
lmctl quickrun <sample|url|file.lms> [script arguments...]
|
|
2501
2504
|
|
|
@@ -2510,14 +2513,14 @@ to the website without a CLI release.
|
|
|
2510
2513
|
Bare names always select hosted samples; use ./paths for local scripts or directories.
|
|
2511
2514
|
Explicit URLs are also accepted. Only run scripts you trust.
|
|
2512
2515
|
Legacy .lmctl templates still accept --no-seed and --no-terminal.
|
|
2513
|
-
`});function FA(t){let e=String(t);return e.length>0&&/^[a-zA-Z0-9_./@=-]+$/.test(e)?e:"'"+e.replace(/'/g,"'\\''")+"'"}var jA=x(()=>{"use strict"});var qA={};me(qA,{runHello:()=>
|
|
2516
|
+
`});function FA(t){let e=String(t);return e.length>0&&/^[a-zA-Z0-9_./@=-]+$/.test(e)?e:"'"+e.replace(/'/g,"'\\''")+"'"}var jA=x(()=>{"use strict"});var qA={};me(qA,{runHello:()=>PX});import{existsSync as DX,writeFileSync as MX,rmSync as WA}from"node:fs";import{join as HA}from"node:path";async function PX(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write($X),0;let r,s,o,i=[];for(let T=0;T<t.length;T+=1){let w=t[T];if(w==="-p"||w==="--prompt"){s=t[T+1],T+=1;continue}if(w==="--model"){if(t[T+1]===void 0||t[T+1].startsWith("-"))return e.stderr.write(`error: --model requires a model name
|
|
2514
2517
|
`),2;o=t[T+1],T+=1;continue}if(w.startsWith("-"))return e.stderr.write(`error: unknown option ${w}
|
|
2515
2518
|
`),2;i.push(w)}if(i.length>1)return e.stderr.write(`error: hello takes one provider
|
|
2516
2519
|
`),2;r=i[0];let a=new Fn(e,n.ask);try{if(!r){let T=wr(),w=T?[...new Set([T.provider1.provider,T.provider2.provider,T.provider3.provider])]:[];w.length&&e.stdout.write(`Providers from init: ${w.join(", ")}
|
|
2517
2520
|
`);let S=w[0];r=await a.ask(`Provider${S?` [${S}]`:""}: `)||S}if(!r||!Object.hasOwn(ds,r))throw new Error(`Unknown provider: ${r??"(empty)"}`);if(o!==void 0&&!o.trim())throw new Error("A nonempty model is required with --model.");if(o!==void 0&&/[\r\n"]/u.test(o))throw new Error("Model names passed to --model cannot contain quotes or newlines.");if(o!==void 0&&(o=o.trim()),s?.trim()||(s=await a.ask("Prompt: ")),!s.trim())throw new Error("A prompt is required.")}catch(T){return e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
2518
2521
|
`),2}finally{a.close()}let l=n.cwd??e.cwd??process.cwd(),c=n.fetchFn??fetch,d=`${XA}/${r}.lmctl`,u;try{u=await kr(d,c,l)}catch(T){return e.stderr.write(`error: could not fetch ${d}: ${T instanceof Error?T.message:String(T)}
|
|
2519
|
-
`),1}if(o!==void 0)try{u=
|
|
2520
|
-
`),1}let f=HA(l,`${r}_hello.lmctl`);for(let T=2;
|
|
2522
|
+
`),1}if(o!==void 0)try{u=FX(u,r,o)}catch(T){return e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
|
|
2523
|
+
`),1}let f=HA(l,`${r}_hello.lmctl`);for(let T=2;DX(f);T++)f=HA(l,`${r}_hello${T}.lmctl`);if(MX(f,u,{encoding:"utf8",flag:"wx"}),e.stdout.write(`Wrote ${f}
|
|
2521
2524
|
`),o!==void 0){let T={write:()=>!0},w=await lh(f,{...e,stdout:T,stderr:T,env:{...process.env,...e.env}});if(w.status==="error")return WA(f,{force:!0}),e.stderr.write(`error: hello model override failed lint: ${w.errors.map(I=>I.message).join("; ")}
|
|
2522
2525
|
`),1;let S=w.warnings.find(({message:I})=>(r==="codex"||r==="agy")&&I.includes(`model="${o}" is not in ${r}'s live model catalog`));if(S)return WA(f,{force:!0}),e.stderr.write(`error: hello model override refused: ${S.message}
|
|
2523
2526
|
`),1}let m=`s=lm_seed(args[0]);if(s.status!="ok"){lm_exit(${BA});}r=lm_prompt(args[0],"Lead",args[1]);if(r.status!="ok"){lm_error(r.error);lm_exit(1);}println(r.reply);`,p="",_=new Set,h=(T=!1)=>{let w;for(;(w=p.indexOf(`
|
|
@@ -2526,9 +2529,9 @@ Legacy .lmctl templates still accept --no-seed and --no-terminal.
|
|
|
2526
2529
|
Continue with this team:
|
|
2527
2530
|
Open TUI: lmctl terminal ${y} Lead
|
|
2528
2531
|
Send a prompt: lmctl prompt ${y} Lead "your next prompt"
|
|
2529
|
-
`),E}function
|
|
2530
|
-
`).map(d=>{let u=d.endsWith("\r")?"\r":"",f=u?d.slice(0,-1):d;if(!/^\s*_MEMBER_\s+\S/u.test(f))return d;let m=[...f.matchAll(
|
|
2531
|
-
`),a,l;try{a=Cn(t,"hello").members,l=Cn(i,"hello").members}catch{return i}if(!(a.length===l.length&&l.every((d,u)=>{let f=a[u],m=d.alias.toLowerCase()==="lead";return JSON.stringify({...d,model:void 0})===JSON.stringify({...f,model:void 0})&&(m?d.model===n:d.model===f.model)})))throw new Error(`Could not set model=${s} on the Lead of the hosted ${e} hello sample without changing something else.`);return i}var XA,BA
|
|
2532
|
+
`),E}function FX(t,e,n){let r=!1,s=/\s/u.test(n)?`"${n}"`:n,o=t.split(`
|
|
2533
|
+
`).map(d=>{let u=d.endsWith("\r")?"\r":"",f=u?d.slice(0,-1):d;if(!/^\s*_MEMBER_\s+\S/u.test(f))return d;let m=[...f.matchAll(UX)],p=h=>{let g=m.filter(E=>E[1]===h).at(-1);return g===void 0?void 0:g[2]??g[3]??""};if(p("alias")?.toLowerCase()!=="lead")return d;if(p("provider")!==e)throw new Error(`The hosted ${e} hello sample declares Lead provider=${p("provider")??"(none)"}.`);r=!0;let _=f;for(let h of m.filter(g=>g[1]==="model").reverse()){let g=h.index;_=_.slice(0,g).replace(/\s+$/u,"")+_.slice(g+h[0].length)}return`${_.trimEnd()} model=${s}${u}`});if(!r)throw new Error(`The hosted ${e} hello sample has no Lead to assign a model to.`);let i=o.join(`
|
|
2534
|
+
`),a,l;try{a=Cn(t,"hello").members,l=Cn(i,"hello").members}catch{return i}if(!(a.length===l.length&&l.every((d,u)=>{let f=a[u],m=d.alias.toLowerCase()==="lead";return JSON.stringify({...d,model:void 0})===JSON.stringify({...f,model:void 0})&&(m?d.model===n:d.model===f.model)})))throw new Error(`Could not set model=${s} on the Lead of the hosted ${e} hello sample without changing something else.`);return i}var XA,BA,$X,UX,GA=x(()=>{"use strict";ua();sd();Cc();us();na();Be();_n();jA();XA="https://lmctl.com/helloexample",BA=3,$X=`usage: lmctl hello <provider> -p "<prompt>"
|
|
2532
2535
|
|
|
2533
2536
|
Downloads ${XA}/<provider>.lmctl, saves it as
|
|
2534
2537
|
<provider>_hello.lmctl in the current directory, seeds it, sends your
|
|
@@ -2544,8 +2547,8 @@ An omitted model uses the provider default. Existing teamfiles are preserved.
|
|
|
2544
2547
|
|
|
2545
2548
|
Example:
|
|
2546
2549
|
lmctl hello claude -p "hi"
|
|
2547
|
-
|
|
2548
|
-
`)}catch{}}async function
|
|
2550
|
+
`;UX=/(\w+)=(?:"([^"]*)"|(\S*))/g});function n_(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e],r=jX.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),o=r[2]===void 0?0:Number.parseInt(r[2],10),i=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${i}`;return{state:"LIMITED",resets_at:a===null?null:WX(n.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function WX(t,e,n,r,s){if(!Number.isFinite(t.getTime())||e<1||e>12||n<0||n>59)return null;let o=HX(e,r);try{let i=BX(t,s),a=VA(i.year,i.month,i.day,o,n,s);if(a.getTime()<=t.getTime()){let l=VX(i,1);a=VA(l.year,l.month,l.day,o,n,s)}return a.toISOString()}catch{return null}}function HX(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function BX(t,e){let n=JA(e,!1).formatToParts(t);return{year:Wn(n,"year"),month:Wn(n,"month"),day:Wn(n,"day")}}function VA(t,e,n,r,s,o){let i=Date.UTC(t,e-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=XX(new Date(i),o);i=Date.UTC(t,e-1,n,r,s,0,0)-l}return new Date(i)}function XX(t,e){let n=JA(e,!0).formatToParts(t);return Date.UTC(Wn(n,"year"),Wn(n,"month")-1,Wn(n,"day"),Wn(n,"hour"),Wn(n,"minute"),Wn(n,"second"),0)-t.getTime()}function JA(t,e){let n=e?GX:qX,r=n.get(t);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(t,s),s}function Wn(t,e){let n=t.find(r=>r.type===e)?.value;if(n===void 0)throw new Error(`missing ${e}`);return Number.parseInt(n,10)}function VX(t,e){let n=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var jX,qX,GX,KA=x(()=>{"use strict";jX=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;qX=new Map,GX=new Map});var lN={};me(lN,{appendIntent:()=>s_,formatAge:()=>pa,formatDuration:()=>Sd,resolveIntentLogPath:()=>eN,runStatus:()=>s2,shortIdentity:()=>gn});import{appendFileSync as JX,existsSync as KX,mkdirSync as YX}from"node:fs";import{homedir as zX}from"node:os";import{basename as QX,dirname as ZA,isAbsolute as ZX,join as e2,resolve as t2}from"node:path";function eN(){return process.env.LMCTL_INTENT_LOG??e2(zX(),".lmctl","recent-intents.log")}function s_(t){try{let e=eN();YX(ZA(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});JX(e,`${n}
|
|
2551
|
+
`)}catch{}}async function s2(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(n2),0;let n=t.find(a=>a==="--project"||a.startsWith("--project=")||a==="--web");if(n!==void 0)return D(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=ae(t,["--since"],["--json","--details"]);if(r.error!==void 0)return D(e,r.error);let s=z(r,"--json"),o=z(r,"--details");if(r.positionals.length>0){let a=await i2(e,r.positionals,{json:s,details:o,since:V(r,"--since")});return a===0&&s_({verb:"status",args:t}),a}if(o)return D(e,"--details only applies with a teamfile argument (lmctl status <teamfile> --details)");let i=k2(V(r,"--since"));if("error"in i)return D(e,i.error);try{let a=e.env??process.env;if(s){let l=await W(e,c=>zA(c,a));te(e,{schema_version:d_,...l})}else{let l=await W(e,async c=>y2(await zA(c,a),{sinceIso:i.iso}));e.stdout.write(l)}return s_({verb:"status",args:t}),0}catch(a){return D(e,a instanceof Error?a.message:String(a))}}async function i2(t,e,n){if(e.length>2)return D(t,`too many positionals (${e.length}); expected <teamfile> [alias]`);if(n.since!==void 0)return D(t,"--since only applies to the activity view (lmctl status with no teamfile argument)");let r=sn(o2,{target:e[0],alias:e[1],flags:{}});if(r.mode==="error")return D(t,r.message);if(r.mode!=="ai-team")return D(t,"lmctl status: expected <teamfile> [alias]");try{return r.alias===void 0?await A2(t,r.teamfile,n.json,n.details):await O2(t,r.teamfile,r.alias,n.json)}catch(s){return s instanceof ge?D(t,s.message):D(t,`status: ${s instanceof Error?s.message:String(s)}`)}}async function zA(t,e){let n=Ap(e,t);if(!n.ok){if(n.reason==="not-found")throw new Error(ns("status",e,t));return await l2(t)}return await a2(t,n.identity,e)}async function a2(t,e,n){let r=rs(e),s=t.getRootTeam(r.teamfile);if(s===null)throw new Error(ns("status",n,t));let o=nn(s.teamfile_path,t),i=i_(vd(t,{from:r.value})),a=i_(vd(t,{target_teamfile:r.teamfile,target_alias:r.alias})),l=f2([...o_(t,{from:r.value}),...o_(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...tN(),team:{name:o.name,teamfile:s.teamfile_path},members:o.members.map(c=>d2(t,s.teamfile_path,c)),activity:{from_me:i.map(c=>a_(c)),to_me:a.map(c=>a_(c))},transcript_harvest:await nN(l)}}function tN(){let t=null;try{t=nw(Ll())}catch{}return{db_path:Je(),site_name:t}}async function l2(t){let e=t.listRootTeams();return{scope:"db",identity:null,...tN(),teams:e.map(n=>c2(t,n)),activity:i_(vd(t)).map(n=>a_(n)),transcript_harvest:await nN(o_(t))}}function c2(t,e){if(!KX(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let n=0;try{n=nn(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function d2(t,e,n){let r=n.teamfile===void 0?null:Ne(ZX(n.teamfile)?n.teamfile:t2(ZA(e),n.teamfile),t),s=Zt(t,e,n.alias),o=s.busy&&s.reason==="in-flight"?u2(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:o,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function u2(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,i=t.db.prepare(`
|
|
2549
2552
|
SELECT * FROM tracked_invocation
|
|
2550
2553
|
WHERE kind = 'chat'
|
|
2551
2554
|
AND status = 'running'
|
|
@@ -2555,27 +2558,27 @@ Example:
|
|
|
2555
2558
|
AND holder_pid IS ?
|
|
2556
2559
|
ORDER BY started_at DESC, id DESC
|
|
2557
2560
|
LIMIT 5
|
|
2558
|
-
`).all(e,n,s,r.holder_pid).find(a=>a.request_payload!==null);return i?.request_payload===void 0||i.request_payload===null?null:{tracked_invocation_id:i.id,from_identity:i.from_identity,started_at:i.started_at,request_payload:i.request_payload,request_preview:
|
|
2561
|
+
`).all(e,n,s,r.holder_pid).find(a=>a.request_payload!==null);return i?.request_payload===void 0||i.request_payload===null?null:{tracked_invocation_id:i.id,from_identity:i.from_identity,started_at:i.started_at,request_payload:i.request_payload,request_preview:b2(i.request_payload)}}function vd(t,e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.target_teamfile!==void 0&&(n.push("target_teamfile = ?"),r.push(e.target_teamfile)),e.target_alias!==void 0&&(n.push("target_alias = ?"),r.push(e.target_alias));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`;return t.db.prepare(`
|
|
2559
2562
|
SELECT * FROM tracked_invocation
|
|
2560
2563
|
${s}
|
|
2561
2564
|
ORDER BY started_at DESC, id DESC
|
|
2562
|
-
`).all(...r)}function o_(t,e={}){return vd(t,e).filter(r=>r.kind==="chat"&&r.status==="running"&&nr(r)==="dead")}function
|
|
2565
|
+
`).all(...r)}function o_(t,e={}){return vd(t,e).filter(r=>r.kind==="chat"&&r.status==="running"&&nr(r)==="dead")}function f2(t){let e=new Set,n=[];for(let r of t)e.has(r.id)||(e.add(r.id),n.push(r));return n.sort((r,s)=>{let o=Date.parse(s.started_at)-Date.parse(r.started_at);return Number.isFinite(o)&&o!==0?o:s.id-r.id})}function i_(t){return t.filter(e=>nr(e)!=="dead")}async function nN(t){let e=[];for(let n of t)e.push(await m2(n));return e}async function m2(t){let e=t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,n={tracked_invocation_id:t.id,from_identity:t.from_identity,target:e??"(unknown)",started_at:t.started_at,tail_hint:e===null?"":`lmctl tail "${t.target_teamfile}" ${t.target_alias}`};if(e===null)return _s(n,"missing-target",null,null);if(t.request_payload===null||t.request_payload.length===0)return _s(n,"missing-request-payload",null,null);let r=p2(t.meta);if(r.provider===null||r.sessionid===null)return _s(n,"missing-session-metadata",r.provider,r.sessionid);if(!ui(r.provider))return _s(n,"unsupported-provider",r.provider,r.sessionid);let s;try{s=await je(r.sessionid,r.provider)}catch{return _s(n,"read-error",r.provider,r.sessionid)}if(s===null)return _s(n,"session-not-found",r.provider,r.sessionid);let o=h2(t.request_payload,s.messages);return o.state!=="completed"?_s(n,o.reason,r.provider,r.sessionid):{...n,state:"completed",reason:null,provider:r.provider,session_id:r.sessionid,result_payload:o.result,result_preview:aN(o.result),assistant_timestamp:o.assistantTimestamp,matched_user_index:o.userIndex}}function _s(t,e,n,r){return{...t,state:"unreconciled",reason:e,provider:n,session_id:r,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function p2(t){if(t===null||t.trim()==="")return{provider:null,sessionid:null};try{let e=JSON.parse(t);return{provider:typeof e.provider=="string"&&e.provider.length>0?e.provider:null,sessionid:typeof e.sessionid=="string"&&e.sessionid.length>0?e.sessionid:null}}catch{return{provider:null,sessionid:null}}}function h2(t,e){let n=e.map((o,i)=>({message:o,index:i})).filter(({message:o})=>o.role==="user"&&o.content===t);if(n.length===0)return{state:"unreconciled",reason:"request-not-found"};if(n.length>1)return{state:"unreconciled",reason:"duplicate-request"};let r=n[0].index,s=[];for(let o of e.slice(r+1)){if(o.role==="user")break;o.role==="assistant"&&o.content.trim().length>0&&s.push(o)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:r,result:s.map(o=>o.content).join(`
|
|
2563
2566
|
|
|
2564
|
-
`),assistantTimestamp:
|
|
2565
|
-
`)}function
|
|
2566
|
-
`)}function rN(t){return ri(t.db_path)}function l_(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,wd))
|
|
2567
|
-
`)}u.detailLoaded=m!==null,u.messageCount=m?.messageCount??null,u.observedModel=m?.model??"(unknown)",u.lastContext=m?.lastInputTokens??null,u.totalInputTokens=m?.totalInputTokens??null,u.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=m.totalCachedInputTokens),u.sessionLimit=m===null?null:n_(m.messages),i!==null&&(u.activitySinceLastCommit={messageCount:m===null?null:Lh(m,i.since),tokens:null},u.cumulativeTokens=m===null?null:xh(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(u)}return n?(te(t,{schema_version:d_,scope:"team",team:s.teamName,teamfile:s.teamfile,details:r,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(d=>({ref:d.ref,timestamp:d.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(d=>{let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,seeded:d.sessionid!==null,model:d.declaredModel,liveness:d.liveness};return d.configWarnings!==void 0&&(u.config_warnings=d.configWarnings),d.probed&&(u.messageCount=d.messageCount??null,u.observed_model=d.observedModel,u.lastContext=d.lastContext??null,u.totalInputTokens=d.totalInputTokens??null,u.totalOutputTokens=d.totalOutputTokens??null,d.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=d.totalCachedInputTokens),u.sessionLimit=d.sessionLimit??null,d.activitySinceLastCommit!==void 0&&(u.activitySinceLastCommit=d.activitySinceLastCommit),d.cumulativeTokens!==void 0&&(u.cumulativeTokens=d.cumulativeTokens==="n/a"?null:d.cumulativeTokens)),u}),...r?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(
|
|
2567
|
+
`),assistantTimestamp:_2(s[s.length-1]?.timestamp)}}function _2(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function g2(t){if(!(t===null||t.trim()===""))try{let e=JSON.parse(t);if(!Array.isArray(e))return;let n=e.filter(r=>typeof r=="string"&&r.length>0);return n.length>0?n:void 0}catch{return}}function a_(t){let e=g2(t.config_warnings),n={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:nr(t),from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:QA(t.result_summary),error:QA(t.error),...e!==void 0?{config_warnings:e}:{}};return t.error!==null&&oN.set(n,t.error),n}function y2(t,e){return t.scope==="self"?T2(t,e):w2(t,e)}function E2(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",n=t.reason==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale";return`idle (reclaimable lock: ${e} ${n})`}function T2(t,e){let n=[];n.push(`identity: ${t.identity}`),n.push(`team: ${t.team.name}`),n.push(`teamfile: ${t.team.teamfile}`),n.push(""),n.push("members:"),t.members.length===0&&n.push(" none");for(let r of t.members){let s=r.model===null?"":` model=${r.model}`,o=r.sessionid===null?"":` session=${r.sessionid}`,i=r.state==="idle"?E2(r.reclaimable):`busy (${r.reason})`,a=r.handling===null?"":` handling="${r.handling.request_preview}"`;n.push(` ${r.alias}: ${i} provider=${r.provider}${s}${o}${a}`)}return n.push(""),n.push("transcript harvest:"),sN(n,t.transcript_harvest,"self"),n.push(""),n.push("activity from me:"),l_(n,c_(t.activity.from_me,e.sinceIso),"from-me"),n.push(""),n.push("activity to me:"),l_(n,c_(t.activity.to_me,e.sinceIso),"to-me"),n.push(""),n.push(rN(t)),n.join(`
|
|
2568
|
+
`)}function w2(t,e){let n=[];n.push("scope: db"),n.push("identity: none"),n.push(""),n.push("teams:"),t.teams.length===0&&n.push(" none");for(let r of t.teams){let s=r.name===null?"(unnamed)":r.name;n.push(` ${s}: ${r.teamfile} (${r.member_count} members)`)}return n.push(""),n.push("transcript harvest:"),sN(n,t.transcript_harvest,"db"),n.push(""),n.push("recent activity:"),l_(n,c_(t.activity,e.sinceIso),"db"),n.push(""),n.push(rN(t)),n.join(`
|
|
2569
|
+
`)}function rN(t){return ri(t.db_path)}function l_(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,wd))v2(t,r,n);iN(t,e.length,wd,"older")}function sN(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,wd)){let s=n==="db"?` from ${gn(r.from_identity)} -> ${gn(r.target)}`:` -> ${gn(r.target)}`;if(r.state==="completed"){let o=r.result_preview===null?"":` "${r.result_preview}"`;t.push(` #${r.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${r.started_at}${o}`)}else t.push(` #${r.tracked_invocation_id} unreconciled${s} since ${r.started_at} (${r.reason??"unknown"})`);r.tail_hint.length>0&&t.push(` inspect: ${r.tail_hint}`)}iN(t,e.length,wd,"more transcript harvest rows")}function c_(t,e){let n=Date.parse(e);return Number.isFinite(n)?t.filter(r=>{let s=Date.parse(r.ended_at??r.started_at);return Number.isFinite(s)&&s>=n}):t}function v2(t,e,n){let r=I2(e,n),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,o=e.error??e.result,i=al(oN.get(e)??"",r_),a=o===null?"":` "${i??aN(o)}"`;if(t.push(` #${e.id} ${S2(e)} ${e.kind}${r} ${s}${a}`),e.config_warnings!==void 0)for(let l of e.config_warnings)t.push(` config not applied: ${l}`)}function S2(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function I2(t,e){if(e==="from-me")return t.target===null?"":` -> ${gn(t.target)}`;if(e==="to-me")return` from ${gn(t.from_identity)}`;let n=t.target===null?"":` -> ${gn(t.target)}`;return` from ${gn(t.from_identity)}${n}`}function iN(t,e,n,r){let s=e-n;s>0&&t.push(` (+${s} ${r} -- use --json)`)}function QA(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function aN(t){let e=sT(t).replace(/\s+/g," ").trim();return e.length<=r_?e:`${e.slice(0,r_-3)}...`}function b2(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=YA?e:`${e.slice(0,YA-3)}...`}function Sd(t){return(0,it.formatDuration)(t)}function pa(t){return(0,it.formatRelativeTime)(t)}function gn(t){if(t==="operator")return t;try{let e=rs(t);return`${QX(e.teamfile)}:${e.alias}`}catch{return t}}function k2(t){if(t===void 0)return{iso:new Date(Date.now()-r2).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],o=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}async function A2(t,e,n,r){let s=await W(t,d=>{let u=Ne(e,d),f=nn(u,d);if(f.parseErrors.length>0)throw new Error(f.parseErrors.join("; "));return{teamfile:u,teamName:f.name,targets:ca(u,d,new Set,[])}}),o=Rh(s.teamfile),i=o.kind==="repo"?o:null,a=await da(t,s.targets),l=[],c=0;for(let d of s.targets){let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,declaredModel:d.model,liveness:a.get(To(d.teamfile,d.alias))??od(),probed:!1,detailLoaded:!1},f=await Ah(t,{teamfile:d.teamfile,alias:d.alias});if(f!==void 0&&(u.configWarnings=f),r&&d.sessionid!==null){u.probed=!0;let m=null;try{m=await je(d.sessionid,d.provider)}catch(p){t.stderr.write(`warning: failed to load session "${d.sessionid}" for ${d.reportPath} (${d.provider}): ${p instanceof Error?p.message:String(p)}
|
|
2570
|
+
`)}u.detailLoaded=m!==null,u.messageCount=m?.messageCount??null,u.observedModel=m?.model??"(unknown)",u.lastContext=m?.lastInputTokens??null,u.totalInputTokens=m?.totalInputTokens??null,u.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=m.totalCachedInputTokens),u.sessionLimit=m===null?null:n_(m.messages),i!==null&&(u.activitySinceLastCommit={messageCount:m===null?null:Lh(m,i.since),tokens:null},u.cumulativeTokens=m===null?null:xh(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(u)}return n?(te(t,{schema_version:d_,scope:"team",team:s.teamName,teamfile:s.teamfile,details:r,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(d=>({ref:d.ref,timestamp:d.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(d=>{let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,seeded:d.sessionid!==null,model:d.declaredModel,liveness:d.liveness};return d.configWarnings!==void 0&&(u.config_warnings=d.configWarnings),d.probed&&(u.messageCount=d.messageCount??null,u.observed_model=d.observedModel,u.lastContext=d.lastContext??null,u.totalInputTokens=d.totalInputTokens??null,u.totalOutputTokens=d.totalOutputTokens??null,d.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=d.totalCachedInputTokens),u.sessionLimit=d.sessionLimit??null,d.activitySinceLastCommit!==void 0&&(u.activitySinceLastCommit=d.activitySinceLastCommit),d.cumulativeTokens!==void 0&&(u.cumulativeTokens=d.cumulativeTokens==="n/a"?null:d.cumulativeTokens)),u}),...r?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(L2(s.teamName,s.teamfile,o,l,r,c)),0)}function N2(t){return t.sessionid??"(not seeded)"}function R2(t){return t.sessionid===null?"not seeded":id(t.liveness)}function L2(t,e,n,r,s,o){let i=[],a=n.kind==="repo"?n:null;if(i.push(`TEAM: ${t}`),i.push(`teamfile: ${e}`),n.kind==="repo"){i.push("Git progress:");for(let _ of n.commits)i.push(` ${_.ref}: ${_.timestamp.toISOString()}`);i.push(` Uncommitted: ${$t(n.working.uncommittedTracked)} changed (tracked), ${$t(n.working.untracked)} untracked`)}else n.reason==="no-commits"?i.push(`Git progress: git repository in ${n.teamDir} has no commits (no commit-based progress to report)`):i.push(`Git progress: no git repository in ${n.teamDir} (no commit-based progress to report)`);if(!s){i.push("members:"),r.length===0&&i.push(" none");for(let _ of r){let h=_.declaredModel===null?"":` model=${_.declaredModel}`;if(_.sessionid===null?i.push(` ${_.reportPath}: not seeded provider=${_.provider}${h} (run: lmctl seed "${_.teamfile}")`):i.push(` ${_.reportPath}: ${id(_.liveness)} provider=${_.provider}${h} session=${_.sessionid}`),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}return i.push(""),i.push("session detail (observed model, messages, tokens, limits) not probed -- use --details"),`${i.join(`
|
|
2568
2571
|
`)}
|
|
2569
|
-
`}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((_,h)=>h>=5?"right":"left"),d=!1,u=r.filter(_=>_.sessionLimit!=null),f=[];for(let _ of r){let h=ek(_.lastContext??void 0,_.detailLoaded,Qb);(h==="n/a"||_.cumulativeTokens==="n/a")&&(d=!0);let g=[(0,it.escapeCell)(
|
|
2572
|
+
`}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((_,h)=>h>=5?"right":"left"),d=!1,u=r.filter(_=>_.sessionLimit!=null),f=[];for(let _ of r){let h=ek(_.lastContext??void 0,_.detailLoaded,Qb);(h==="n/a"||_.cumulativeTokens==="n/a")&&(d=!0);let g=[(0,it.escapeCell)(N2(_)),(0,it.escapeCell)(_.reportPath),(0,it.escapeCell)(_.provider),(0,it.escapeCell)(_.observedModel??"(unknown)"),R2(_),$t(_.messageCount),h];a!==null&&g.push($t(_.activitySinceLastCommit?.messageCount),$t(_.activitySinceLastCommit?.tokens),Zb(_.cumulativeTokens)),f.push(g)}let m=["TOTAL","","","","",$t(o)];a!==null&&m.push("",$t(x2(r)),$t(null),$t(C2(r))),f.push(m);let p=(0,it.formatTable)(f,{headers:l,align:c,margin:2}).split(`
|
|
2570
2573
|
`);if(i.push(p[0]),r.forEach((_,h)=>{if(i.push(p[h+1]),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}),i.push(p[p.length-1]),d&&i.push("n/a = this provider does not expose a context/token total; absence is not a health signal."),i.push(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
|
|
2571
2574
|
Right after a compaction the last completed turn IS the summarisation request, which carried the
|
|
2572
2575
|
full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
|
|
2573
2576
|
small. Re-read after the next turn before concluding a compaction failed or gating on the value.`),u.length>0){i.push("Session limits:");for(let _ of u)i.push(` ${_.reportPath}: LIMITED resets_at=${Nh(_.sessionLimit)}`)}return`${i.join(`
|
|
2574
2577
|
`)}
|
|
2575
|
-
`}function
|
|
2578
|
+
`}function x2(t){let e=0;for(let n of t){let r=n.activitySinceLastCommit?.messageCount;r==null?e=void 0:e!==void 0&&(e+=r)}return e}function C2(t){let e=0;for(let n of t){let r=n.cumulativeTokens;r==null||r==="n/a"?e=void 0:e!==void 0&&(e+=r)}return e}async function O2(t,e,n,r){let s=await W(t,p=>Xe(e,n,p)),o;try{o=await je(s.sessionid,s.provider)}catch(p){return D(t,`status: failed to load session: ${p instanceof Error?p.message:String(p)}`)}if(o===null)return D(t,`status: session not found: ${s.sessionid} (provider=${s.provider})`);let i=n_(o.messages),l=(await da(t,[{teamfile:s.teamfile,alias:s.alias}])).get(To(s.teamfile,s.alias))??od(),c=await Ah(t,{teamfile:s.teamfile,alias:s.alias}),d=Rh(s.teamfile),u=d.kind==="repo"?d:null,f={provider:o.provider,sessionid:o.sessionId,seeded:!0,alias:s.alias,teamfile:s.teamfile,reportPath:s.alias,cwd:o.cwd,messageCount:o.messageCount??null,model:s.model??null,observed_model:o.model??null,lastContext:o.lastInputTokens??null,liveness:l,totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,...c!==void 0?{config_warnings:c}:{},...u!==null?{activitySinceLastCommit:{messageCount:Lh(o,u.since),tokens:null},cumulativeTokens:xh(o)}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};if(r)return te(t,{schema_version:d_,scope:"member",...f}),0;let m=[];if(m.push(`Session: ${o.sessionId}`),m.push(` Provider: ${o.provider}`),m.push(` Alias: ${s.alias}`),m.push(` Liveness: ${id(l)}`),m.push(` CWD: ${o.cwd}`),m.push(` Messages: ${$t(o.messageCount)}`),m.push(` Model (declared): ${s.model??"(none)"}`),m.push(` Model (observed): ${o.model??"(unknown)"}`),c!==void 0)for(let p of c)m.push(` Config NOT applied: ${p}`);if(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)m.push(" Tokens: n/a");else{let p=` Tokens: ${(0,it.formatCount)(o.totalInputTokens)} in / ${(0,it.formatCount)(o.totalOutputTokens)} out`;f.totalCachedInputTokens!==void 0&&(p+=` (cached: ${(0,it.formatCount)(f.totalCachedInputTokens)})`),m.push(p)}return(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)&&m.push(" n/a = this provider does not expose a context/token total; absence is not a health signal."),m.push(` lastContext = prompt size of the LAST COMPLETED turn; it LAGS BY ONE TURN. Right after a
|
|
2576
2579
|
compaction it still reports the pre-compaction size (the summarisation request itself).`),i!==null&&m.push(` SessionLimit: LIMITED resets_at=${Nh(i)}`),m.push(` Created: ${f.createdAt}`),m.push(` Modified: ${f.modifiedAt}`),t.stdout.write(`${m.join(`
|
|
2577
2580
|
`)}
|
|
2578
|
-
`),0}var it,
|
|
2581
|
+
`),0}var it,n2,d_,wd,r2,r_,YA,o2,oN,u_=x(()=>{"use strict";it=Ft(Ct(),1);Wt();St();le();Rc();Nn();Gi();rn();nt();Ch();xl();fn();KA();hl();n2=`usage: lmctl status [--json] [--since <duration|ISO8601>]
|
|
2579
2582
|
lmctl status <teamfile> [--details] [--json]
|
|
2580
2583
|
lmctl status <teamfile> <alias> [--json]
|
|
2581
2584
|
|
|
@@ -2594,25 +2597,25 @@ With a teamfile and an alias: single-member deep view (session detail, token
|
|
|
2594
2597
|
breakdown, liveness with terminal-lock/in-flight holder info).
|
|
2595
2598
|
|
|
2596
2599
|
--json emits { schema_version: 2, scope: 'self'|'db'|'team'|'member', ... }.
|
|
2597
|
-
`,d_=2,wd=5,t2=24*60*60*1e3,r_=72,YA=80;r2={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};oN=new WeakMap});import{isAbsolute as C2,resolve as cN,join as dN}from"node:path";function fN(t){let e=uN.get(t);if(!e)throw Error("Unknown context");return e.dal()}function pN(t){return t!==null&&typeof t=="object"&&mN.has(t)}function hN(t){try{if(!t||typeof t!="object"||Array.isArray(t))return pt("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(_=>!n.includes(_)))return pt("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!C2(e.cwd))return pt("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(_=>_!==void 0&&typeof _!="string"))return pt("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return pt("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return pt("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return pt("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return pt("invalid_argument","pid must be a positive integer");let s=cN(e.cwd),o=r.LMCTL_HOME||(r.HOME?dN(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(o?dN(o,"state.db"):void 0)))return pt("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,d,u=new AbortController,f=new Set,m=_=>{if(l){try{l.close()}catch(h){_.push(Tr(h))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:u.signal,env:r,cwd:s,dbPath:cN(s,Je(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){if(c)return c;let _;return c=new Promise(h=>{_=h}),a=!0,u.abort(),(async()=>{let h=[],g=0;for(let E of[...f])try{await E.close(),g++,f.delete(E)}catch(y){h.push(Tr(y))}h.length||m(h),_({released:g,errors:h})})(),c},finalizeSync(_){if(d)return d;a=!0;let h=[],g={released:0,errors:h};d=g,c??=Promise.resolve(g);let E=[];for(let y of[...f])try{let T=y.finalizeSync(_);T instanceof Promise?E.push(T.then(()=>{g.released++,f.delete(y)}).catch(w=>{h.push(Tr(w))})):(g.released++,f.delete(y))}catch(T){h.push(Tr(T))}return u.abort(_),E.length?c=Promise.all(E).then(()=>(h.length||m(h),g)):h.length||m(h),g}});return uN.set(p,{resources:f,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=$e({path:p.dbPath})}}),mN.add(p),O2.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return pt("invalid_argument","Invalid context: "+Tr(e))}}var uN,O2,mN,Id=x(()=>{"use strict";vt();Nn();jc();uN=new WeakMap;O2=new WeakMap,mN=new WeakSet});var Nr,wN,tse,nse,rse,sse,ose,se,f_,yn,bd,Ar,kd,Nd,vo,_N,gN,yN,So,Ad,D2,EN,TN,vN,m_=x(()=>{"use strict";Nr=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Nr(e);Object.freeze(t)}return t},wN=Nr(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),tse=Nr({status:"string",error:"string|null",code:"ErrorCode?"}),nse=Nr(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),rse=Nr(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),sse=Nr(["Provider1","Provider2","Provider3"]),ose=Nr({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),se={name:"ctx",type:"context"},f_={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},yn={name:"teamfile",type:"string"},bd={name:"alias",type:"string"},Ar={name:"prompt",type:"string"},kd={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"alias",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"},{name:"sessiondir",type:"string"},{name:"sessionid",type:"string"}]},Nd=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],vo={name:"options",type:"map",optional:!0,keys:Nd},_N={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},gN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},yN={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},So={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Ad={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},D2=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"}],EN={name:"options",type:"map",optional:!0,keys:D2},TN={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},vN=Nr([{name:"resolveProfilePath",implemented:!0,params:[se,f_],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[se,f_],statuses:["ok","error"],results:{error:"string|null",profile:"{path,raw,config}",values:"{Provider1..3,Model1..3,Directory,NonInteractive}",path:"string?",line:"number?",column:"number?"},effects:["file-read"],summary:"Read and validate the complete init profile without discovery or writes."},{name:"profileValues",implemented:!0,params:[{name:"config",type:"map"}],statuses:["ok","error"],results:{error:"string|null",Provider1:"string",Provider2:"string",Provider3:"string",Model1:"string",Model2:"string",Model3:"string"},effects:[],summary:"Validate and map slots to first-model environment values."},{name:"readPrompts",implemented:!0,params:[se,{name:"path",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"single",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",prompts:"string[]"},effects:["file-read"],summary:"Read prompt records without exiting the caller.",scriptBinding:{name:"lm_read_prompts",params:[{name:"batchfile",type:"string"},{name:"single",type:"boolean",optional:!0}]}},{name:"listMembers",implemented:!0,params:[se,yn],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[yn]}},{name:"resolveMember",implemented:!0,params:[se,yn,bd],statuses:["ok","not_found","error"],results:{error:"string|null",member:"Member",isLead:"boolean",teamfile:"string"},effects:["file-read","db"],summary:"Resolve a team member with an explicit missing outcome.",scriptBinding:{name:"lm_member",params:[yn,bd]}},{name:"lintTeam",implemented:!0,params:[se,yn],statuses:["ok","error"],results:{error:"string|null",errors:"list",warnings:"list",counts:"map"},effects:["file-read","db"],summary:"Return structured lint findings.",scriptBinding:{name:"lm_lint",params:[yn]}},{name:"seedTeam",implemented:!0,params:[se,yn,_N],statuses:["ok","error"],results:{error:"string|null",seeded:"SeededMember[]"},effects:["provider","db","file-write"],summary:"Seed a team with explicit optional preambles.",scriptBinding:{name:"lm_seed",params:[yn,_N]}},{name:"promptAgent",implemented:!0,params:[se,kd,Ar,vo],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...TN,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[kd,Ar,vo]}},{name:"promptMember",implemented:!0,params:[se,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"prompt",type:"string",required:!0},{name:"messageType",type:"string"},...Nd]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[yn,bd,Ar,{name:"options",type:"map",optional:!0,keys:[...Nd,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[se,{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"workspace",type:"string"},{name:"all",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",sessions:"Session[]"},effects:["file-read"],summary:"List native sessions in an explicit workspace.",scriptBinding:{name:"lm_session_list",params:[{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"sessiondir",type:"string"},{name:"all",type:"boolean"}]}]}},{name:"deleteSession",implemented:!0,params:[se,So,yN],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[kd,{...yN,optional:!0}]}},{name:"getSession",implemented:!0,params:[se,So],statuses:["ok","not_found","error"],results:{error:"string|null",messages:"{role,content}[]"},effects:["provider","file-read"],summary:"Read native session messages.",scriptBinding:{name:"lm_session_get",params:[So]}},{name:"reserveSession",implemented:!0,params:[se,So],statuses:["ok","busy","error"],results:{error:"string|null",reservation:"SessionReservation"},effects:[],summary:"Reserve context-local handoff admission and return a capability."},{name:"releaseSession",implemented:!0,params:[se,So,{name:"reservation",type:"SessionReservation",optional:!0}],statuses:["ok","error"],results:{error:"string|null"},effects:[],summary:"Release context-local handoff admission; an optional capability makes owned cleanup idempotent and replacement-safe."},{name:"openTeamBatch",returnsResource:!0,implemented:!0,params:[se,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"label",type:"string",required:!0},{name:"promptCount",type:"number",required:!0},{name:"legacy",type:"boolean"},...Nd]}],statuses:["ok","busy","error"],results:{error:"string|null",batch:"opaque context-bound BatchRef"},effects:["provider","db"],summary:"Open a managed team batch; member-map composition remains language-owned."},{name:"batchTurn",implemented:!0,params:[se,{name:"batch",type:"BatchRef"},Ar,{name:"index",type:"number"},{name:"total",type:"number"}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn an owned live batch reference."},{name:"closeBatch",implemented:!0,params:[se,{name:"batch",type:"BatchRef"},{name:"options",type:"map",keys:[{name:"status",type:"string",required:!0,values:["done","error","cancelled"]},{name:"error",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close an owned batch."},{name:"readRatelimits",implemented:!0,params:[se,gN],statuses:["ok","error"],results:{error:"string|null",readings:"list"},effects:["file-read","network"],summary:"Read provider rate-limit data.",scriptBinding:{name:"lm_ratelimit_readings",params:[gN]}},{name:"openTerminal",implemented:!0,params:[se,{name:"target",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0}]},{name:"streams",type:"map",keys:[{name:"stdin",type:"stream",required:!0},{name:"stdout",type:"stream",required:!0},{name:"stderr",type:"stream",required:!0}]}],statuses:["ok","error"],results:{error:"string|null",code:"number|null",signal:"string|null"},effects:["provider","db","tty"],summary:"Open a native terminal with caller-supplied streams.",scriptBinding:{name:"lm_terminal",params:[yn,bd]}},{name:"sessionAdmission",implemented:!0,params:[se,So],statuses:["ok","busy","error"],results:{error:"string|null",busyReason:"turn|handoff?"},effects:[],summary:"Query context-local session admission without exposing mutable sets."},{name:"promptReservedAgent",implemented:!0,params:[se,{name:"reservation",type:"SessionReservation"},kd,Ar,vo],statuses:["ok","busy","stalled","empty","error"],results:{...TN,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[se,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Synchronously release one batch on a close deadline without cancelling unrelated batches."},{name:"inspectBatch",implemented:!0,params:[se,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null",id:"string",closed:"boolean",member:"Member",rootId:"number|null"},effects:[],summary:"Read batch metadata without exposing native transports or lease capabilities."},{name:"openNativeSession",returnsResource:!0,implemented:!0,params:[se,{name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},vo],statuses:["ok","busy","error"],results:{error:"string|null",session:"opaque context-bound NativeSessionRef"},effects:["provider","db","file-read"],summary:"Open a script-owned native conversation with existing receiver admission."},{name:"nativeSessionTurn",implemented:!0,params:[se,{name:"session",type:"NativeSessionRef"},Ar],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Record one unframed conversational turn through the existing recorder."},{name:"closeNativeSession",implemented:!0,params:[se,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close a script-owned native conversation and release its lease."},{name:"finalizeNativeSessionSync",implemented:!0,params:[se,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"nativeSessionRequest",implemented:!0,params:[se,Ad,Ar,vo],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Send a stateless native-id turn to a qualified conversation in the configured running lmbee service.",scriptBinding:{name:"lm_session_turn",params:[Ad,Ar,vo]}},{name:"nativeSessionClose",implemented:!0,params:[se,Ad],statuses:["ok","busy","error"],results:{error:"string|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Close an idle service-hosted native conversation; an absent entry is already closed.",scriptBinding:{name:"lm_session_close",params:[Ad]}},{name:"loadProperties",implemented:!0,params:[se,f_],statuses:["ok","error"],results:{error:"string|null",path:"string",properties:"map",flat:"map",line:"number?",column:"number?"},effects:["file-read"],summary:"Read the complete hierarchical init.toml properties document through the canonical reader."},{name:"listRunning",implemented:!0,params:[se,EN],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Observation only; dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[EN]}}])});function SN(t){if(!pN(t))return pt("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return pt("cancelled","Context is closed")}function IN(t){return vN.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var bN=x(()=>{"use strict";m_();Id();jc()});import{isAbsolute as M2,resolve as $2}from"node:path";function Ld(t){return Number.isFinite(t)&&Math.abs(t)<=P2}function U2(t){if(t&&typeof t=="object"){let e=t.code;if(typeof e=="string"){if(wN.includes(e))return e;if(e==="SQLITE_BUSY"||e==="SQLITE_LOCKED")return"busy";if(e==="SQLITE_READONLY"||e.startsWith("SQLITE_READONLY")||e==="EACCES"||e==="EPERM"||e==="EISDIR")return"read";if(e==="ENOENT"||e==="SQLITE_CANTOPEN")return"missing";if(e==="ETIMEDOUT"||e==="ECANCELED"||e==="ABORT_ERR")return"cancelled"}let n=t.message;if(typeof n=="string"){if(n.includes("readonly database")||n.includes("SQLITE_READONLY"))return"read";if(n.includes("database is locked")||n.includes("SQLITE_BUSY"))return"busy"}}return"internal"}function __(t,e=Date.now()){if(t===void 0)return{windowMs:kN};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let o=Number(n[1]),i=n[2],l=(i==="s"?o:i==="m"?o*60:i==="h"?o*3600:o*86400)*1e3;return!Number.isFinite(l)||l<0||!Ld(e-l)?{error:`invalid --since duration: ${t} (cutoff out of representable date range)`}:{windowMs:l}}let r=Date.parse(t);if(!Number.isFinite(r)||!Ld(r))return{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`};let s=Math.max(0,e-r);return Ld(e-s)?{windowMs:s}:{error:`invalid --since value: ${t} (cutoff out of representable date range)`}}function Rd(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function h_(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return p_;let s=e.get(n);if(s===void 0){try{s=be(n)}catch{s=null}e.set(n,s)}return s===null?p_:_l(s,r)?.model??p_}async function AN(t,e={}){let n=SN(t);if(n)return{status:"error",error:n.error,code:n.code,running:[],dead:[],idle:[]};if(e!=null){if(typeof e!="object"||Array.isArray(e))return{status:"error",error:"Options must be a map",code:"invalid_argument",running:[],dead:[],idle:[]};let o=IN("listRunning");if(o.length>0){for(let i of Object.keys(e))if(!o.includes(i))return{status:"error",error:`Unknown option: ${i}`,code:"invalid_argument",running:[],dead:[],idle:[]}}if(e.teamfile!==void 0&&(typeof e.teamfile!="string"||!e.teamfile.trim()))return{status:"error",error:"teamfile must be a nonempty string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.member!==void 0&&typeof e.member!="string")return{status:"error",error:"member must be a string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.tree!==void 0&&typeof e.tree!="boolean")return{status:"error",error:"tree must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]}}let r=t.clock(),s=kN;if(e?.since!==void 0)if(typeof e.since=="number"){if(!Number.isFinite(e.since)||e.since<0||!Ld(r-e.since))return{status:"error",error:"since must be a non-negative number of milliseconds within representable date range",code:"invalid_argument",running:[],dead:[],idle:[]};s=e.since}else if(typeof e.since=="string"){let o=__(e.since,r);if("error"in o)return{status:"error",error:o.error,code:"invalid_argument",running:[],dead:[],idle:[]};s=o.windowMs}else return{status:"error",error:"since must be a duration string or number",code:"invalid_argument",running:[],dead:[],idle:[]};try{let o=fN(t),i=e?.teamfile!==void 0?M2(e.teamfile)?e.teamfile:$2(t.cwd,e.teamfile):void 0,a=i!==void 0?Ne(i,o):void 0,l=e?.member!==void 0?e.member.toLowerCase():void 0,c=y=>!(a!==void 0&&y.target_teamfile!==a||l!==void 0&&(y.target_alias??"").toLowerCase()!==l),d=o.listAllRunningTrackedInvocations().filter(c),u=new Map,f=[],m=[];for(let y of d){let T=nr(y),w=r-new Date(y.started_at).getTime(),S={id:y.id,kind:y.kind,origin:y.origin,from_identity:y.from_identity,target:Rd(y),model:h_(y,u),started_at:y.started_at,parent_invocation_id:y.parent_invocation_id};if(T==="dead"){if(_f(o,y)!==null)continue;m.push({...S,stale_for_ms:w})}else f.push({...S,running_for_ms:w,holder_liveness:T??"unknown"})}let p=new Set(d.map(Rd).filter(y=>y!==null)),_=new Date(r-s).toISOString(),h=o.listRecentlyFinishedTrackedInvocations(_).filter(c),g=new Set,E=[];for(let y of h){let T=Rd(y);T===null||p.has(T)||g.has(T)||(g.add(T),E.push({id:y.id,kind:y.kind,origin:y.origin,from_identity:y.from_identity,target:T,model:h_(y,u),status:y.status,started_at:y.started_at,ended_at:y.ended_at,idle_ms:r-new Date(y.ended_at).getTime(),ran_ms:new Date(y.ended_at).getTime()-new Date(y.started_at).getTime(),error:y.error,parent_invocation_id:y.parent_invocation_id}))}if(e?.tree===!0){let y=new Set([...f.map(w=>w.id),...m.map(w=>w.id),...E.map(w=>w.id)]),T=[...y];for(;T.length>0;){let w=o.listFinishedTrackedInvocationChildren(T,_).filter(S=>!y.has(S.id)&&c(S));if(w.length===0)break;T=[];for(let S of w){y.add(S.id),T.push(S.id);let I=Rd(S);E.push({id:S.id,kind:S.kind,origin:S.origin,from_identity:S.from_identity,target:I,model:h_(S,u),status:S.status,started_at:S.started_at,ended_at:S.ended_at,idle_ms:r-new Date(S.ended_at).getTime(),ran_ms:new Date(S.ended_at).getTime()-new Date(S.started_at).getTime(),error:S.error,parent_invocation_id:S.parent_invocation_id})}}}return{status:"ok",error:null,running:f,dead:m,idle:E}}catch(o){return{status:"error",error:o instanceof Error?o.message:String(o),code:U2(o),running:[],dead:[],idle:[]}}}var kN,P2,p_,NN=x(()=>{"use strict";Id();bN();m_();Wt();kl();Be();rn();kN=24*60*60*1e3,P2=864e13;p_="default"});var DN={};me(DN,{_setRunningWatchMaxTicksForTests:()=>W2,runRunning:()=>Y2});import{resolve as F2}from"node:path";function W2(t){y_=t??void 0}function B2(t){let e=t.split(`
|
|
2598
|
-
`,1)[0];return e.length<=E_?e:`${e.slice(0,E_)}\u2026`}function T_(t){return t.target!==null?gn(t.target):t.from_identity}function LN(t){return[(0,Pt.escapeCell)(T_(t)),t.kind,"running",t.holder_liveness,(0,Pt.escapeCell)(t.model),pa(t.started_at)]}function xN(t){return[(0,Pt.escapeCell)(T_(t)),t.kind,"DEAD","",(0,Pt.escapeCell)(t.model),`stale ${pa(t.started_at)}, holder process confirmed dead`]}function CN(t){let e=`ran ${Sd(t.ran_ms)}, idle ${pa(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,Pt.escapeCell)(al(t.error,E_)??
|
|
2600
|
+
`,d_=2,wd=5,r2=24*60*60*1e3,r_=72,YA=80;o2={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};oN=new WeakMap});import{isAbsolute as D2,resolve as cN,join as dN}from"node:path";function fN(t){let e=uN.get(t);if(!e)throw Error("Unknown context");return e.dal()}function pN(t){return t!==null&&typeof t=="object"&&mN.has(t)}function hN(t){try{if(!t||typeof t!="object"||Array.isArray(t))return pt("invalid_argument","Context needs an explicit options map");let e={...t},n=["pid","env","cwd","dbPath","dal","onProgress","onWarning","clock","interactive"];if(Object.keys(e).some(_=>!n.includes(_)))return pt("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!D2(e.cwd))return pt("invalid_argument","Context needs an explicit env and absolute cwd");let r=Object.freeze({...e.env});if(Object.values(r).some(_=>_!==void 0&&typeof _!="string"))return pt("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return pt("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return pt("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return pt("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return pt("invalid_argument","pid must be a positive integer");let s=cN(e.cwd),o=r.LMCTL_HOME||(r.HOME?dN(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(o?dN(o,"state.db"):void 0)))return pt("invalid_argument","Context needs dbPath, LMCTL_DB, LMCTL_HOME or HOME");let a=!1,l,c,d,u=new AbortController,f=new Set,m=_=>{if(l){try{l.close()}catch(h){_.push(Tr(h))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:u.signal,env:r,cwd:s,dbPath:cN(s,Je(e.dbPath,r)),dal:e.dal,interactive:e.interactive??r.LMCTL_NON_INTERACTIVE!=="1",onProgress:e.onProgress??(()=>{}),onWarning:e.onWarning??(()=>{}),clock:e.clock??Date.now,get closed(){return a},close(){if(c)return c;let _;return c=new Promise(h=>{_=h}),a=!0,u.abort(),(async()=>{let h=[],g=0;for(let E of[...f])try{await E.close(),g++,f.delete(E)}catch(y){h.push(Tr(y))}h.length||m(h),_({released:g,errors:h})})(),c},finalizeSync(_){if(d)return d;a=!0;let h=[],g={released:0,errors:h};d=g,c??=Promise.resolve(g);let E=[];for(let y of[...f])try{let T=y.finalizeSync(_);T instanceof Promise?E.push(T.then(()=>{g.released++,f.delete(y)}).catch(w=>{h.push(Tr(w))})):(g.released++,f.delete(y))}catch(T){h.push(Tr(T))}return u.abort(_),E.length?c=Promise.all(E).then(()=>(h.length||m(h),g)):h.length||m(h),g}});return uN.set(p,{resources:f,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=$e({path:p.dbPath})}}),mN.add(p),M2.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return pt("invalid_argument","Invalid context: "+Tr(e))}}var uN,M2,mN,Id=x(()=>{"use strict";vt();Nn();jc();uN=new WeakMap;M2=new WeakMap,mN=new WeakSet});var Nr,wN,rse,sse,ose,ise,ase,se,f_,yn,bd,Ar,kd,Nd,vo,_N,gN,yN,So,Ad,$2,EN,TN,vN,m_=x(()=>{"use strict";Nr=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Nr(e);Object.freeze(t)}return t},wN=Nr(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),rse=Nr({status:"string",error:"string|null",code:"ErrorCode?"}),sse=Nr(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),ose=Nr(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),ise=Nr(["Provider1","Provider2","Provider3"]),ase=Nr({Provider1:"PROPS.Provider1.Provider",Provider2:"PROPS.Provider2.Provider",Provider3:"PROPS.Provider3.Provider",Model1:"PROPS.Provider1.Model1",Model2:"PROPS.Provider2.Model1",Model3:"PROPS.Provider3.Model1"}),se={name:"ctx",type:"context"},f_={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},yn={name:"teamfile",type:"string"},bd={name:"alias",type:"string"},Ar={name:"prompt",type:"string"},kd={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"alias",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"},{name:"sessiondir",type:"string"},{name:"sessionid",type:"string"}]},Nd=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],vo={name:"options",type:"map",optional:!0,keys:Nd},_N={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},gN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},yN={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},So={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Ad={name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},$2=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"}],EN={name:"options",type:"map",optional:!0,keys:$2},TN={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},vN=Nr([{name:"resolveProfilePath",implemented:!0,params:[se,f_],statuses:["ok","error"],results:{error:"string|null",path:"string"},effects:[],summary:"Resolve a profile path solely from explicit context."},{name:"loadProfile",implemented:!0,params:[se,f_],statuses:["ok","error"],results:{error:"string|null",profile:"{path,raw,config}",values:"{Provider1..3,Model1..3,Directory,NonInteractive}",path:"string?",line:"number?",column:"number?"},effects:["file-read"],summary:"Read and validate the complete init profile without discovery or writes."},{name:"profileValues",implemented:!0,params:[{name:"config",type:"map"}],statuses:["ok","error"],results:{error:"string|null",Provider1:"string",Provider2:"string",Provider3:"string",Model1:"string",Model2:"string",Model3:"string"},effects:[],summary:"Validate and map slots to first-model environment values."},{name:"readPrompts",implemented:!0,params:[se,{name:"path",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"single",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",prompts:"string[]"},effects:["file-read"],summary:"Read prompt records without exiting the caller.",scriptBinding:{name:"lm_read_prompts",params:[{name:"batchfile",type:"string"},{name:"single",type:"boolean",optional:!0}]}},{name:"listMembers",implemented:!0,params:[se,yn],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[yn]}},{name:"resolveMember",implemented:!0,params:[se,yn,bd],statuses:["ok","not_found","error"],results:{error:"string|null",member:"Member",isLead:"boolean",teamfile:"string"},effects:["file-read","db"],summary:"Resolve a team member with an explicit missing outcome.",scriptBinding:{name:"lm_member",params:[yn,bd]}},{name:"lintTeam",implemented:!0,params:[se,yn],statuses:["ok","error"],results:{error:"string|null",errors:"list",warnings:"list",counts:"map"},effects:["file-read","db"],summary:"Return structured lint findings.",scriptBinding:{name:"lm_lint",params:[yn]}},{name:"seedTeam",implemented:!0,params:[se,yn,_N],statuses:["ok","error"],results:{error:"string|null",seeded:"SeededMember[]"},effects:["provider","db","file-write"],summary:"Seed a team with explicit optional preambles.",scriptBinding:{name:"lm_seed",params:[yn,_N]}},{name:"promptAgent",implemented:!0,params:[se,kd,Ar,vo],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...TN,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[kd,Ar,vo]}},{name:"promptMember",implemented:!0,params:[se,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"prompt",type:"string",required:!0},{name:"messageType",type:"string"},...Nd]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[yn,bd,Ar,{name:"options",type:"map",optional:!0,keys:[...Nd,{name:"messageType",type:"string"}]}]}},{name:"listSessions",implemented:!0,params:[se,{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"workspace",type:"string"},{name:"all",type:"boolean"}]}],statuses:["ok","error"],results:{error:"string|null",sessions:"Session[]"},effects:["file-read"],summary:"List native sessions in an explicit workspace.",scriptBinding:{name:"lm_session_list",params:[{name:"options",type:"map",optional:!0,keys:[{name:"provider",type:"string"},{name:"sessiondir",type:"string"},{name:"all",type:"boolean"}]}]}},{name:"deleteSession",implemented:!0,params:[se,So,yN],statuses:["deleted","not_found","busy","error"],results:{error:"string|null"},effects:["provider","file-write"],summary:"Delete a session only with explicit force admission.",scriptBinding:{name:"lm_session_delete",params:[kd,{...yN,optional:!0}]}},{name:"getSession",implemented:!0,params:[se,So],statuses:["ok","not_found","error"],results:{error:"string|null",messages:"{role,content}[]"},effects:["provider","file-read"],summary:"Read native session messages.",scriptBinding:{name:"lm_session_get",params:[So]}},{name:"reserveSession",implemented:!0,params:[se,So],statuses:["ok","busy","error"],results:{error:"string|null",reservation:"SessionReservation"},effects:[],summary:"Reserve context-local handoff admission and return a capability."},{name:"releaseSession",implemented:!0,params:[se,So,{name:"reservation",type:"SessionReservation",optional:!0}],statuses:["ok","error"],results:{error:"string|null"},effects:[],summary:"Release context-local handoff admission; an optional capability makes owned cleanup idempotent and replacement-safe."},{name:"openTeamBatch",returnsResource:!0,implemented:!0,params:[se,{name:"request",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0},{name:"label",type:"string",required:!0},{name:"promptCount",type:"number",required:!0},{name:"legacy",type:"boolean"},...Nd]}],statuses:["ok","busy","error"],results:{error:"string|null",batch:"opaque context-bound BatchRef"},effects:["provider","db"],summary:"Open a managed team batch; member-map composition remains language-owned."},{name:"batchTurn",implemented:!0,params:[se,{name:"batch",type:"BatchRef"},Ar,{name:"index",type:"number"},{name:"total",type:"number"}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Turn an owned live batch reference."},{name:"closeBatch",implemented:!0,params:[se,{name:"batch",type:"BatchRef"},{name:"options",type:"map",keys:[{name:"status",type:"string",required:!0,values:["done","error","cancelled"]},{name:"error",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close an owned batch."},{name:"readRatelimits",implemented:!0,params:[se,gN],statuses:["ok","error"],results:{error:"string|null",readings:"list"},effects:["file-read","network"],summary:"Read provider rate-limit data.",scriptBinding:{name:"lm_ratelimit_readings",params:[gN]}},{name:"openTerminal",implemented:!0,params:[se,{name:"target",type:"map",keys:[{name:"teamfile",type:"string",required:!0},{name:"alias",type:"string",required:!0}]},{name:"streams",type:"map",keys:[{name:"stdin",type:"stream",required:!0},{name:"stdout",type:"stream",required:!0},{name:"stderr",type:"stream",required:!0}]}],statuses:["ok","error"],results:{error:"string|null",code:"number|null",signal:"string|null"},effects:["provider","db","tty"],summary:"Open a native terminal with caller-supplied streams.",scriptBinding:{name:"lm_terminal",params:[yn,bd]}},{name:"sessionAdmission",implemented:!0,params:[se,So],statuses:["ok","busy","error"],results:{error:"string|null",busyReason:"turn|handoff?"},effects:[],summary:"Query context-local session admission without exposing mutable sets."},{name:"promptReservedAgent",implemented:!0,params:[se,{name:"reservation",type:"SessionReservation"},kd,Ar,vo],statuses:["ok","busy","stalled","empty","error"],results:{...TN,messageId:"null",teamChatLogId:"null"},effects:["provider"],summary:"Turn only the session authorized by a live context-bound reservation."},{name:"finalizeBatchSync",implemented:!0,params:[se,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Synchronously release one batch on a close deadline without cancelling unrelated batches."},{name:"inspectBatch",implemented:!0,params:[se,{name:"batch",type:"BatchRef"}],statuses:["ok","error"],results:{error:"string|null",id:"string",closed:"boolean",member:"Member",rootId:"number|null"},effects:[],summary:"Read batch metadata without exposing native transports or lease capabilities."},{name:"openNativeSession",returnsResource:!0,implemented:!0,params:[se,{name:"member",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0},{name:"sessiondir",type:"string"},{name:"model",type:"string"},{name:"effort",type:"string"}]},vo],statuses:["ok","busy","error"],results:{error:"string|null",session:"opaque context-bound NativeSessionRef"},effects:["provider","db","file-read"],summary:"Open a script-owned native conversation with existing receiver admission."},{name:"nativeSessionTurn",implemented:!0,params:[se,{name:"session",type:"NativeSessionRef"},Ar],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null"},effects:["provider","db"],summary:"Record one unframed conversational turn through the existing recorder."},{name:"closeNativeSession",implemented:!0,params:[se,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["provider","db"],summary:"Idempotently close a script-owned native conversation and release its lease."},{name:"finalizeNativeSessionSync",implemented:!0,params:[se,{name:"session",type:"NativeSessionRef"}],statuses:["ok","error"],results:{error:"string|null"},effects:["db"],summary:"Critical synchronous native conversation lease release."},{name:"nativeSessionRequest",implemented:!0,params:[se,Ad,Ar,vo],statuses:["ok","busy","stalled","empty","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Send a stateless native-id turn to a qualified conversation in the configured running lmbee service.",scriptBinding:{name:"lm_session_turn",params:[Ad,Ar,vo]}},{name:"nativeSessionClose",implemented:!0,params:[se,Ad],statuses:["ok","busy","error"],results:{error:"string|null",code:"ErrorCode?",outcome:"not_sent|completed|unknown?",service_epoch:"string|null?",connection_epoch:"number|null?",connection_state:"new|reused|reinitialized|null?"},effects:["provider","db","network"],summary:"Close an idle service-hosted native conversation; an absent entry is already closed.",scriptBinding:{name:"lm_session_close",params:[Ad]}},{name:"loadProperties",implemented:!0,params:[se,f_],statuses:["ok","error"],results:{error:"string|null",path:"string",properties:"map",flat:"map",line:"number?",column:"number?"},effects:["file-read"],summary:"Read the complete hierarchical init.toml properties document through the canonical reader."},{name:"listRunning",implemented:!0,params:[se,EN],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Observation only; dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[EN]}}])});function SN(t){if(!pN(t))return pt("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return pt("cancelled","Context is closed")}function IN(t){return vN.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var bN=x(()=>{"use strict";m_();Id();jc()});import{isAbsolute as P2,resolve as U2}from"node:path";function Ld(t){return Number.isFinite(t)&&Math.abs(t)<=F2}function j2(t){if(t&&typeof t=="object"){let e=t.code;if(typeof e=="string"){if(wN.includes(e))return e;if(e==="SQLITE_BUSY"||e==="SQLITE_LOCKED")return"busy";if(e==="SQLITE_READONLY"||e.startsWith("SQLITE_READONLY")||e==="EACCES"||e==="EPERM"||e==="EISDIR")return"read";if(e==="ENOENT"||e==="SQLITE_CANTOPEN")return"missing";if(e==="ETIMEDOUT"||e==="ECANCELED"||e==="ABORT_ERR")return"cancelled"}let n=t.message;if(typeof n=="string"){if(n.includes("readonly database")||n.includes("SQLITE_READONLY"))return"read";if(n.includes("database is locked")||n.includes("SQLITE_BUSY"))return"busy"}}return"internal"}function __(t,e=Date.now()){if(t===void 0)return{windowMs:kN};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let o=Number(n[1]),i=n[2],l=(i==="s"?o:i==="m"?o*60:i==="h"?o*3600:o*86400)*1e3;return!Number.isFinite(l)||l<0||!Ld(e-l)?{error:`invalid --since duration: ${t} (cutoff out of representable date range)`}:{windowMs:l}}let r=Date.parse(t);if(!Number.isFinite(r)||!Ld(r))return{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`};let s=Math.max(0,e-r);return Ld(e-s)?{windowMs:s}:{error:`invalid --since value: ${t} (cutoff out of representable date range)`}}function Rd(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function h_(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return p_;let s=e.get(n);if(s===void 0){try{s=be(n)}catch{s=null}e.set(n,s)}return s===null?p_:_l(s,r)?.model??p_}async function AN(t,e={}){let n=SN(t);if(n)return{status:"error",error:n.error,code:n.code,running:[],dead:[],idle:[]};if(e!=null){if(typeof e!="object"||Array.isArray(e))return{status:"error",error:"Options must be a map",code:"invalid_argument",running:[],dead:[],idle:[]};let o=IN("listRunning");if(o.length>0){for(let i of Object.keys(e))if(!o.includes(i))return{status:"error",error:`Unknown option: ${i}`,code:"invalid_argument",running:[],dead:[],idle:[]}}if(e.teamfile!==void 0&&(typeof e.teamfile!="string"||!e.teamfile.trim()))return{status:"error",error:"teamfile must be a nonempty string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.member!==void 0&&typeof e.member!="string")return{status:"error",error:"member must be a string",code:"invalid_argument",running:[],dead:[],idle:[]};if(e.tree!==void 0&&typeof e.tree!="boolean")return{status:"error",error:"tree must be a boolean",code:"invalid_argument",running:[],dead:[],idle:[]}}let r=t.clock(),s=kN;if(e?.since!==void 0)if(typeof e.since=="number"){if(!Number.isFinite(e.since)||e.since<0||!Ld(r-e.since))return{status:"error",error:"since must be a non-negative number of milliseconds within representable date range",code:"invalid_argument",running:[],dead:[],idle:[]};s=e.since}else if(typeof e.since=="string"){let o=__(e.since,r);if("error"in o)return{status:"error",error:o.error,code:"invalid_argument",running:[],dead:[],idle:[]};s=o.windowMs}else return{status:"error",error:"since must be a duration string or number",code:"invalid_argument",running:[],dead:[],idle:[]};try{let o=fN(t),i=e?.teamfile!==void 0?P2(e.teamfile)?e.teamfile:U2(t.cwd,e.teamfile):void 0,a=i!==void 0?Ne(i,o):void 0,l=e?.member!==void 0?e.member.toLowerCase():void 0,c=y=>!(a!==void 0&&y.target_teamfile!==a||l!==void 0&&(y.target_alias??"").toLowerCase()!==l),d=o.listAllRunningTrackedInvocations().filter(c),u=new Map,f=[],m=[];for(let y of d){let T=nr(y),w=r-new Date(y.started_at).getTime(),S={id:y.id,kind:y.kind,origin:y.origin,from_identity:y.from_identity,target:Rd(y),model:h_(y,u),started_at:y.started_at,parent_invocation_id:y.parent_invocation_id};if(T==="dead"){if(_f(o,y)!==null)continue;m.push({...S,stale_for_ms:w})}else f.push({...S,running_for_ms:w,holder_liveness:T??"unknown"})}let p=new Set(d.map(Rd).filter(y=>y!==null)),_=new Date(r-s).toISOString(),h=o.listRecentlyFinishedTrackedInvocations(_).filter(c),g=new Set,E=[];for(let y of h){let T=Rd(y);T===null||p.has(T)||g.has(T)||(g.add(T),E.push({id:y.id,kind:y.kind,origin:y.origin,from_identity:y.from_identity,target:T,model:h_(y,u),status:y.status,started_at:y.started_at,ended_at:y.ended_at,idle_ms:r-new Date(y.ended_at).getTime(),ran_ms:new Date(y.ended_at).getTime()-new Date(y.started_at).getTime(),error:y.error,parent_invocation_id:y.parent_invocation_id}))}if(e?.tree===!0){let y=new Set([...f.map(w=>w.id),...m.map(w=>w.id),...E.map(w=>w.id)]),T=[...y];for(;T.length>0;){let w=o.listFinishedTrackedInvocationChildren(T,_).filter(S=>!y.has(S.id)&&c(S));if(w.length===0)break;T=[];for(let S of w){y.add(S.id),T.push(S.id);let I=Rd(S);E.push({id:S.id,kind:S.kind,origin:S.origin,from_identity:S.from_identity,target:I,model:h_(S,u),status:S.status,started_at:S.started_at,ended_at:S.ended_at,idle_ms:r-new Date(S.ended_at).getTime(),ran_ms:new Date(S.ended_at).getTime()-new Date(S.started_at).getTime(),error:S.error,parent_invocation_id:S.parent_invocation_id})}}}return{status:"ok",error:null,running:f,dead:m,idle:E}}catch(o){return{status:"error",error:o instanceof Error?o.message:String(o),code:j2(o),running:[],dead:[],idle:[]}}}var kN,F2,p_,NN=x(()=>{"use strict";Id();bN();m_();Wt();kl();Be();rn();kN=24*60*60*1e3,F2=864e13;p_="default"});var DN={};me(DN,{_setRunningWatchMaxTicksForTests:()=>B2,runRunning:()=>Q2});import{resolve as W2}from"node:path";function B2(t){y_=t??void 0}function q2(t){let e=t.split(`
|
|
2601
|
+
`,1)[0];return e.length<=E_?e:`${e.slice(0,E_)}\u2026`}function T_(t){return t.target!==null?gn(t.target):t.from_identity}function LN(t){return[(0,Pt.escapeCell)(T_(t)),t.kind,"running",t.holder_liveness,(0,Pt.escapeCell)(t.model),pa(t.started_at)]}function xN(t){return[(0,Pt.escapeCell)(T_(t)),t.kind,"DEAD","",(0,Pt.escapeCell)(t.model),`stale ${pa(t.started_at)}, holder process confirmed dead`]}function CN(t){let e=`ran ${Sd(t.ran_ms)}, idle ${pa(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,Pt.escapeCell)(al(t.error,E_)??q2(t.error))}`),[(0,Pt.escapeCell)(T_(t)),t.kind,t.status,"",(0,Pt.escapeCell)(t.model),e]}function g_(t){return t.filter(e=>e!=="").join(" ")}function ON(t){let e=new Map(t.map(o=>[o.id,o])),n=new Map,r=[];for(let o of t){let i=o.parent_invocation_id;if(i!==null&&e.has(i)){let a=n.get(i)??[];a.push(o),n.set(i,a)}else r.push(o)}let s=(o,i)=>i.started_at.localeCompare(o.started_at);r.sort(s);for(let o of n.values())o.sort(s);return{roots:r,childrenByParent:n}}function V2(t){let{roots:e,childrenByParent:n}=ON(t),r=[],s=(o,i)=>{r.push(`${" ".repeat(i+1)}${o.line}`);for(let a of n.get(o.id)??[])s(a,i+1)};for(let o of e)s(o,0);return r}function J2(t,e,n){let r=[...t.map(a=>({state:"running",...a})),...e.map(a=>({state:"dead",...a})),...n.map(a=>({state:"idle",...a}))],{roots:s,childrenByParent:o}=ON(r),i=a=>({...a,children:(o.get(a.id)??[]).map(i)});return s.map(i)}function K2(t,e){return e?{schema_version:RN,tree:J2(t.running,t.dead,t.idle)}:{schema_version:RN,running:t.running,dead:t.dead,idle:t.idle}}function Y2(t){let e=[...t.running.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:g_(LN(r))})),...t.dead.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:g_(xN(r))})),...t.idle.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:g_(CN(r))}))],n=V2(e);return`${n.length>0?n.join(`
|
|
2599
2602
|
`):" none"}
|
|
2600
|
-
`}function
|
|
2603
|
+
`}function z2(t,e){let n=[{title:`Running (${t.running.length}):`,rows:t.running.map(LN)},{title:`Dead (reclaimable) (${t.dead.length}):`,rows:t.dead.map(xN)},{title:`Idle, finished in the last ${Sd(e)} (${t.idle.length}):`,rows:t.idle.map(CN)}],r=["MEMBER","KIND","STATE","LIVENESS","MODEL","TIMING"],s=(0,Pt.measureColumns)([{rows:[],headers:r},...n.map(a=>a.rows)],{max:G2}),o=!1,i=[];return n.forEach((a,l)=>{if(l>0&&i.push(""),i.push(a.title),a.rows.length===0){i.push(" none");return}let c=!o;o=!0,i.push((0,Pt.renderGrid)(a.rows,{widths:s,margin:2,...c?{headers:r}:{}}))}),`${i.join(`
|
|
2601
2604
|
`)}
|
|
2602
|
-
`}async function
|
|
2603
|
-
`),0;let n=ae(t,["--team","--member","--since","--watch-interval"],["--json","--tree","--watch"]);if(n.error!==void 0)return D(e,n.error);let r=z(n,"--json"),s=z(n,"--tree"),o=z(n,"--watch"),i=V(n,"--team"),a=V(n,"--member"),l=__(V(n,"--since"));if("error"in l)return D(e,l.error);let c=V(n,"--watch-interval"),d=c===void 0?
|
|
2604
|
-
`):te(e,_),0}return e.stdout.write(s?
|
|
2605
|
-
`)}finally{p=!1}m+=1,y_!==void 0&&m>=y_&&_(E)}},g=setInterval(()=>{h(g)},d*1e3);h(g),process.once("SIGINT",()=>_(g)),process.once("SIGTERM",()=>_(g))}):u()}var Pt,RN,
|
|
2606
|
-
`),E_=120;
|
|
2607
|
-
`),0}function
|
|
2608
|
-
${Cd}`),2):n==="update"?
|
|
2605
|
+
`}async function Q2(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${X2}
|
|
2606
|
+
`),0;let n=ae(t,["--team","--member","--since","--watch-interval"],["--json","--tree","--watch"]);if(n.error!==void 0)return D(e,n.error);let r=z(n,"--json"),s=z(n,"--tree"),o=z(n,"--watch"),i=V(n,"--team"),a=V(n,"--member"),l=__(V(n,"--since"));if("error"in l)return D(e,l.error);let c=V(n,"--watch-interval"),d=c===void 0?H2:Number.parseInt(c.replace(/s$/,""),10);if(!Number.isFinite(d)||d<1)return D(e,`invalid --watch-interval "${c}" (expected <N>s, N\u22651)`);let u=()=>W(e,async f=>{let m=hN({cwd:W2(e.cwd??process.cwd()),env:e.env??process.env,dal:f,dbPath:Pe(e)});if(m.status!=="ok")return D(e,m.error);let p=await AN(m,{teamfile:i,member:a,since:V(n,"--since"),tree:s});if(p.status!=="ok")return D(e,p.error??"listRunning failed");if(r){let _=K2(p,s);return o?e.stdout.write(`${JSON.stringify(_)}
|
|
2607
|
+
`):te(e,_),0}return e.stdout.write(s?Y2(p):z2(p,l.windowMs)),0});return o?await new Promise(f=>{let m=0,p=!1,_=E=>{clearInterval(E),f(0)},h=async E=>{if(!p){p=!0;try{await u()}catch(y){e.stderr.write(`running: ${y instanceof Error?y.message:String(y)}
|
|
2608
|
+
`)}finally{p=!1}m+=1,y_!==void 0&&m>=y_&&_(E)}},g=setInterval(()=>{h(g)},d*1e3);h(g),process.once("SIGINT",()=>_(g)),process.once("SIGTERM",()=>_(g))}):u()}var Pt,RN,H2,y_,X2,E_,G2,MN=x(()=>{"use strict";Pt=Ft(Ct(),1);Id();NN();le();u_();St();RN=3,H2=2;X2=["usage: lmctl running [--team <file>] [--member <alias>] [--since <duration|ISO8601>]"," [--tree] [--watch] [--watch-interval Ns] [--json]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live (or unverifiable cross-host)'," holder -- genuinely in-flight work.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead -- an orphaned record, not active work. Its elapsed",' time is reported as staleness, not as "running", so a dead worker'," is never mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.",' A finish that failed ends with " \u2014 " and one line of the failure:'," for a provider failure the end of the provider's own output, for"," any other error its first line. It is a pointer, not the full"," error: --json has the complete text.","","--team <file> narrows the view to one teamfile (path is canonicalized","before matching); --member <alias> narrows it to one member alias","(case-insensitive; combinable with --team). --since sets the lookback","window for the Idle section -- a relative duration (<n>s|m|h|d, e.g. 7d)","or an absolute ISO8601 timestamp (default 24h). Running and Dead are","point-in-time current state and are not time-filtered.","","--watch re-renders the full snapshot every --watch-interval (default 2s)","until interrupted (SIGINT/SIGTERM). With --json, each snapshot is emitted","as ONE compact JSON object per line (NDJSON).","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl prompt`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root. Unlike the flat Idle section,","--tree does NOT collapse finished rows to one per target: every finished","descendant of a node in view (within the --since window) is rendered, so","a `lmctl batch` run shows as its batch root with ALL of its per-prompt","turns nested underneath.","","Every row also carries `model`: the target member's declared `model=`",'read straight from its teamfile (no session/provider query) -- "default"',"when the teamfile has no model= attribute, the alias/file can't be","resolved, or there is no target at all. This is the DECLARED value only,","not necessarily what actually ran (see the MODEL column in `lmctl status","<teamfile> --details`).","","--json emits { schema_version, running, dead, idle } (flat, one array","per section, matching the three flat-mode sections -- each row carries","its own status/timing/error fields). --tree --json instead emits","{ schema_version, tree } -- an array of root nodes, each row's full",'fields plus a "state" discriminant ("running"/"dead"/"idle") and a','"children" array of the same shape, nested per the dispatch lineage.',"","Queries lmctl's own database only -- never touches native provider","session files."].join(`
|
|
2609
|
+
`),E_=120;G2=[26,void 0,void 0,void 0,24,void 0]});var UN={};me(UN,{runPrices:()=>nq});import{existsSync as Z2}from"node:fs";import{resolve as $N}from"node:path";function xd(t,e,n="price snapshot unavailable"){return e?te(t,{schema_version:1,status:"unavailable",reason:n}):t.stdout.write(`unavailable: ${n}
|
|
2610
|
+
`),0}function eq(t){let e=t?.code;return typeof e=="string"&&/SQLITE_(BUSY|LOCKED|READONLY|CANTOPEN)/.test(e)}function PN(t){return t.dal!==void 0?{db:t.dal,owned:!1}:{db:$e({path:Pe(t),recover:!1}),owned:!0}}function tq(t){if(t.owned)try{t.db.close()}catch{}}async function nq(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(Cd),0;let n=t[0];return n!=="update"&&n!=="show"?(e.stderr.write(`error: expected update or show
|
|
2611
|
+
${Cd}`),2):n==="update"?rq(t.slice(1),e):sq(t.slice(1),e)}async function rq(t,e){let n=ae(t,["--aliases"],["--json"]);if(n.error||n.positionals.length>1)return e.stderr.write(`error: ${n.error??"update accepts at most one FILE"}
|
|
2609
2612
|
${Cd}`),2;let r=z(n,"--json"),s=n.positionals[0],o=V(n,"--aliases"),i;try{if(s!==void 0){let l=$N(e.cwd??process.cwd(),s),c=o===void 0?void 0:$N(e.cwd??process.cwd(),o),d=Zu(l,c);i=PN(e);let u=ef(i.db.db,d);return r?te(e,{...w_(Fs(i.db.db),e.env??process.env),status:u}):e.stdout.write(`${u}
|
|
2610
2613
|
`),0}if(o!==void 0)return e.stderr.write(`error: --aliases requires FILE
|
|
2611
2614
|
`),2;i=PN(e);let a=await tf(i.db.db,{env:e.env??process.env,force:!0});return r?te(e,{...w_(a.snapshot,e.env??process.env),status:a.status}):e.stdout.write(`${a.status}
|
|
2612
|
-
`),0}catch(a){return
|
|
2615
|
+
`),0}catch(a){return eq(a)?(r?te(e,{schema_version:1,status:"deferred",reason:"database busy or read-only"}):e.stdout.write(`deferred
|
|
2613
2616
|
`),0):(e.stderr.write(`error: ${a instanceof Error?a.message:String(a)}
|
|
2614
|
-
`),1)}finally{i!==void 0&&
|
|
2615
|
-
${Cd}`),2;let r=z(n,"--json"),s=n.positionals[0],o,i=!1;try{if(e.dal!==void 0)o=e.dal.db,i=!0;else{let a=Pe(e);if(!
|
|
2617
|
+
`),1)}finally{i!==void 0&&tq(i)}}function w_(t,e){if(t===null)return{schema_version:1,status:"unavailable",reason:"price snapshot unavailable"};let n=Date.parse(t.fetchedAt),r=Number.isFinite(n)?Math.max(0,Math.floor((Date.now()-n)/1e3)):null;return{schema_version:1,status:"ok",source:t.source,generated_at:t.generatedAt,fetched_at:t.fetchedAt,loaded_at:t.loadedAt,hash:t.sha256,record_count:t.recordCount,age_seconds:r,stale:r!==null&&r>Rs(e)/1e3}}async function sq(t,e){let n=ae(t,["--provider"],["--json"]);if(n.error||n.positionals.length>1)return e.stderr.write(`error: ${n.error??"show accepts at most one MODEL"}
|
|
2618
|
+
${Cd}`),2;let r=z(n,"--json"),s=n.positionals[0],o,i=!1;try{if(e.dal!==void 0)o=e.dal.db,i=!0;else{let a=Pe(e);if(!Z2(a))return xd(e,r,"database unavailable");o=Cr(a)}}catch(a){return xd(e,r,a instanceof Error?a.message:"database unavailable")}try{let a=Fs(o);if(a===null)return xd(e,r);let l=w_(a,e.env??process.env);if(s===void 0)return r?te(e,l):e.stdout.write(`source: ${String(l.source)}
|
|
2616
2619
|
generated_at: ${String(l.generated_at??"unknown")}
|
|
2617
2620
|
hash: ${String(l.hash)}
|
|
2618
2621
|
records: ${String(l.record_count)}
|
|
@@ -2636,20 +2639,20 @@ cache write: ${String(y.rates.input_cache_write_per_1m_tokens??"n/a")}
|
|
|
2636
2639
|
show [MODEL] [--provider PROVIDER] [--json]
|
|
2637
2640
|
Read the stored snapshot without files/network, or show its source and age.
|
|
2638
2641
|
Rates are base-tier USD per million; 1-hour write blends need turn counters.
|
|
2639
|
-
`});function at(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);return Number.isFinite(e)?Math.round(Math.min(1,Math.max(0,e))*1e6)/1e6:null}function En(t,e){if(t==null||typeof t=="boolean")return null;let n=Number(t);return at(e==="percent"?n/100:n)}function jN(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);if(!Number.isFinite(e))return null;try{return new Date(Math.trunc(e)*1e3).toISOString().replace(".000Z","Z")}catch{return null}}function WN(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function HN(t){let e=Number(t);return Number.isFinite(e)?e===300||e>=240&&e<=360?"five_hour":e===10080||e>=9e3&&e<=11500?"weekly":e===43200||e===44640||e>=38e3&&e<=46e3?"monthly":"unknown":"unknown"}function BN(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let n of[e[0],e.at(-1)]){if(n?.startsWith("5h")||n?.startsWith("five")||n==="session")return"five_hour";if(n?.startsWith("7d")||n?.startsWith("seven")||n?.startsWith("week"))return"weekly";if(n?.startsWith("30d")||n?.startsWith("month"))return"monthly"}return"unknown"}function Io(t,e=[]){let n=t==null?"":String(t);for(let r of e)typeof r=="string"&&r.length>=4&&(n=n.replaceAll(r,"***REDACTED***"));for(let r of
|
|
2640
|
-
${o}`)}function bo(t,e,n=[]){let r;try{let o=JSON.parse(e);r=typeof o?.error=="string"?o.error:o?.error?.message??o?.message??o?.detail}catch{/^\s*[<{[]/.test(e)||(r=e.trim())}if(typeof r!="string"||!r.trim())return t;let s=Io(r,n);return{...t,detail:s,provider_message:s}}var rq,sq,Hn=x(()=>{"use strict";rq="https://lmctl.com/schemas/lmratelimit-v1.json";sq=[/sk-ant-[A-Za-z0-9_-]{4,}/g,/sk-[A-Za-z0-9_-]{16,}/g,/\bbearer\s+[A-Za-z0-9._-]{8,}/gi,/\boat01[-_][A-Za-z0-9_-]{8,}/g,/\bcsrf[-_][A-Za-z0-9_-]{4,}/gi,/\b(?:csrf[-_]?token|x-codeium-csrf-token)\s*[:=]\s*['"]?[A-Za-z0-9._-]{4,}/gi]});import{spawnSync as oq}from"node:child_process";import{readdirSync as iq,readFileSync as aq}from"node:fs";import{join as lq}from"node:path";function gq(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function yq(t){let e=t.trim().toLowerCase(),n={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return n[e]?n[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function Eq(t){let e=t.toLowerCase();return e.includes("weekly")?"weekly":e.includes("five hour")||e.includes("5-hour")||e.includes("5 hour")?"five_hour":e.includes("monthly")||e.includes("month")?"monthly":null}function Tq(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},n=[];for(let r of t.split(/\r?\n/)){let s=r.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let o=Eq(s[1]);if(!o)continue;let i=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(i))continue;let a=at(i/100);n.push(At({bucket_id:`${yq(s[0])}-${e[o]}`,group_name:s[0],window_type:o,used_fraction:a===null?null:at(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:i,raw_scale:"remaining_percent"}))}return n.sort((r,s)=>String(r.group_name??"").localeCompare(String(s.group_name??""))||String(r.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function ha(t,e,n){return ht("agy","provider_unavailable",t,e,"agy_cli_print")}function wq(t,e,n={}){try{let r=pq(Math.max(t,60)*1e3,gq(e));if(Nt(n,"agy_cli_print",r.stdout??"",[e.ANTIGRAVITY_CSRF_TOKEN]),r.error?.code==="ENOENT")return ha("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return ha("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return ha("cli_failed",r.error.message,t);let s=Tq(r.stdout??"");return s.length===0?ha("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):Ge("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:s})}catch(r){return ha("cli_failed",r instanceof Error?r.message:String(r),t)}}function VN(t){if(!t||typeof t!="string")return null;let e=t.trim();if(!e||e.includes("@")||e.includes("/")||e.includes("\\")||e.includes("?")||e.includes("#")||e.includes("://")||/\s/.test(e))return null;let n;try{n=new URL(`http://${e}`)}catch{return null}if(n.username||n.password||n.pathname!=="/"||n.search||n.hash)return null;let r=n.hostname.toLowerCase();if(!(r==="localhost"||r==="127.0.0.1"||r==="[::1]"||r==="::1")||!n.port)return null;let o=Number(n.port);return!Number.isInteger(o)||o<1||o>65535||n.port!==String(o)?null:`${r==="::1"||r==="[::1]"?"[::1]":r}:${o}`}function vq(t){let e=[],n=new Set,r=(s,o,i)=>{if(!s||!o)return;let a=VN(s);!a||n.has(`${a}\0${o}`)||(n.add(`${a}\0${o}`),e.push([a,o,i]))};r(t[qN],t[GN],-1);try{for(let s of iq("/proc"))if(/^\d+$/.test(s))try{let o={};for(let i of aq(lq("/proc",s,"environ")).toString("utf8").split("\0")){let a=i.indexOf("=");a>0&&(o[i.slice(0,a)]=i.slice(a+1))}r(o[qN],o[GN],Number(s))}catch{}}catch{}return e}function Sq(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let n=e.groups;if(!Array.isArray(n))return null;let r=[];for(let s of n){if(typeof s!="object"||s===null)continue;let o=s,i=typeof o.displayName=="string"?o.displayName:null;if(Array.isArray(o.buckets))for(let a of o.buckets){if(typeof a!="object"||a===null)continue;let l=a,c=En(l.remainingFraction,"fraction");r.push(At({bucket_id:l.bucketId??l.displayName??"unknown",group_name:i,window_type:BN(l.window),used_fraction:c===null?null:at(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return r.length===0?null:(r.sort((s,o)=>String(s.group_name??"").localeCompare(String(o.group_name??""))||String(s.bucket_id??"").localeCompare(String(o.bucket_id??""))),Ge("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:r}))}async function Iq(t,e,n={}){try{let s=_q(e).map(([a,l,c])=>[VN(a),l,c]).filter(a=>a[0]!==null);if(s.length===0)return ht("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let o=[],i=Date.now()+t*1e3;for(let[a,l,c]of s){let d=i-Date.now();if(d<=0){o.push("overall connect deadline exceeded");break}try{let u=await hq(`http://${a}${cq}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":l},d);if(Nt(n,"agy_connect_rpc",u.body,[l],u.status),u.status===200){let f;try{f=JSON.parse(u.body)}catch{o.push(`pid=${c}: unparseable response`);continue}let m=Sq(f);if(m)return m;o.push(`pid=${c}: response had no quota groups`)}else u.status===401||u.status===403?o.push(`pid=${c}: HTTP ${u.status} unauthorized`):o.push(`pid=${c}: HTTP ${u.status}`)}catch(u){o.push(`pid=${c}: ${u instanceof Error?u.message:String(u)}`)}}return ht("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${o.slice(0,5).join("; ")}`,"agy_connect_rpc",s.map(([,a])=>a))}catch(r){return ht("agy","provider_unavailable","connect_failed",r instanceof Error?r.message:String(r),"agy_connect_rpc")}}async function JN(t){let e=await Iq(t.timeoutSeconds,t.env,t);if(e.status==="ok")return e;let n=wq(t.timeoutSeconds,t.env,t);return n.status==="ok"?n:ht("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(n.reason??n.status)} (${String(n.detail??"no detail")}); connect: ${String(e.reason??e.status)} (${String(e.detail??"no detail")})`,"agy_cli_print")}var qN,GN,cq,dq,uq,fq,mq,pq,hq,_q,KN=x(()=>{"use strict";Hn();Hn();qN="ANTIGRAVITY_LS_ADDRESS",GN="ANTIGRAVITY_CSRF_TOKEN",cq="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",dq=["-p","/usage"],uq=(t,e)=>{let n=oq("agy",dq,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",error:n.error}},fq=async(t,e,n)=>{let r=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(n),redirect:"error"});return{status:r.status,body:await r.text()}},mq=t=>vq(t),pq=uq,hq=fq,_q=mq});import{randomUUID as QN}from"node:crypto";import{mkdirSync as bq,readFileSync as v_,realpathSync as kq,renameSync as Aq,rmSync as S_,statSync as YN,writeFileSync as ZN}from"node:fs";import{homedir as Nq}from"node:os";import{join as I_}from"node:path";import{setTimeout as Rq}from"node:timers/promises";function A_(t){return I_(t.CLAUDE_CONFIG_DIR??I_(t.HOME??Nq(),".claude"),".credentials.json")}function b_(t){let e=JSON.parse(v_(t,"utf8"));if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid credential document");return e}function k_(t){let e=t.claudeAiOauth;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function eR(t){if(t.CLAUDE_CODE_OAUTH_TOKEN)return{oauth:{accessToken:t.CLAUDE_CODE_OAUTH_TOKEN}};let e=A_(t);try{let n=k_(b_(e));return typeof n?.accessToken=="string"&&n.accessToken?{oauth:n,path:kq(e)}:{error:"not_claude_ai_subscriber"}}catch(n){return n.code==="ENOENT"?{error:t.ANTHROPIC_API_KEY?"not_claude_ai_subscriber":"no_credentials_found"}:{error:"credentials_unreadable"}}}function Od(t){return typeof t.expiresAt=="number"&&Date.now()+Cq>=t.expiresAt}function zN(t,e){return t.accessToken===e.accessToken&&t.refreshToken===e.refreshToken}async function Oq(t,e){let n=`${t}.lmctl-refresh.lock`,r=I_(n,"owner.json"),s=QN();for(;;){e.throwIfAborted();try{bq(n,{mode:448});try{ZN(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw S_(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(v_(r,"utf8")).token===s&&S_(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(v_(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-YN(n).mtimeMs>6e4}catch{try{i=Date.now()-YN(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await Rq(50,void 0,{signal:e})}}}async function tR(t,e){if(!t.path||typeof t.oauth?.refreshToken!="string"||!t.oauth.refreshToken)throw new Error("no_refresh_token");let n=await Oq(t.path,e);try{let r=k_(b_(t.path));if(!r||typeof r.accessToken!="string")throw new Error("credentials_changed");if(!zN(r,t.oauth)&&!Od(r))return r;if(typeof r.refreshToken!="string"||!r.refreshToken)throw new Error("no_refresh_token");let s=await fetch(xq,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:r.refreshToken,client_id:Lq})});if(!s.ok)throw new Error(`refresh_http_${s.status}`);let o=await s.json();if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.expires_in!="number"||!Number.isFinite(o.expires_in)||o.expires_in<=0||o.refresh_token!==void 0&&(typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)))throw new Error("invalid_refresh_response");let i=Math.floor(Date.now()+o.expires_in*1e3);if(!Number.isSafeInteger(i)||i<=Date.now())throw new Error("invalid_refresh_response");let a=b_(t.path),l=k_(a);if(!l||!zN(r,l)){if(l&&typeof l.accessToken=="string"&&!Od(l))return l;throw new Error("credentials_changed")}let c={...l,accessToken:o.access_token,refreshToken:o.refresh_token??r.refreshToken,expiresAt:i,...typeof o.scope=="string"?{scopes:o.scope.split(/\s+/).filter(Boolean)}:{}},d=`${t.path}.${QN()}.tmp`;try{ZN(d,JSON.stringify({...a,claudeAiOauth:c}),{flag:"wx",mode:384}),Aq(d,t.path)}finally{S_(d,{force:!0})}return c}finally{n()}}var Lq,xq,Cq,nR=x(()=>{"use strict";Lq="9d1c250a-e61b-44d9-88ed-5944d1962f5e",xq="https://console.anthropic.com/v1/oauth/token",Cq=3e5});import{spawnSync as oR}from"node:child_process";function $q(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function iR(t){return Object.fromEntries(Object.entries(t).filter(([e])=>e!=="CLAUDECODE"))}function Pq(t){try{let e=oR("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:iR(t)}),n=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(n)return`claude-code/${n}`}catch{}return"claude-code/unknown"}function Vt(t,e,n,r="claude_oauth_api",s){return ht("claude",t,e,n,r,void 0,s)}function Uq(t){let e=t.get("retry-after");if(!e)return;let n=Number.parseInt(e,10);return Number.isFinite(n)?n:void 0}function Fq(t){if(!t)return;let e=/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?(?:\s*\(([^)]+)\))?$/i.exec(t.trim());if(!e)return;let n=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(n<0)return;let r=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&r!==12&&(r+=12),(e[5]??"").toLowerCase()==="am"&&r===12&&(r=0);let o=new Date(Date.UTC(new Date().getUTCFullYear(),n,Number(e[2]),r,s));return Number.isFinite(o.getTime())?Math.floor(o.getTime()/1e3):void 0}function Wq(t){let e=[];for(let n of t.split(/\r?\n/)){let r=jq.exec(n.trim());if(!r)continue;let s=r[1].trim(),i=s.toLowerCase()==="session",a=/\(([^)]+)\)/.exec(s)?.[1]?.trim()??s,l=i?"session":a.toLowerCase()==="all models"?"week-all-models":`week-scoped-${a}`,c=i?"five_hour":"weekly";e.push(At({bucket_id:l,group_name:i?"session":"weekly",window_type:c,used_fraction:En(Number(r[2]),"percent"),raw_value:Number(r[2]),raw_scale:"used_percent",resets_at:Fq(r[3])}))}return e.sort((n,r)=>String(n.window_type).localeCompare(String(r.window_type))||String(n.bucket_id).localeCompare(String(r.bucket_id)))}function Hq(t){let e={},n;for(let r of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(r.trim());if(s){n={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=n;continue}let o=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(r);if(!o||!n)continue;let i=o[2].toLowerCase(),a=i.includes(">150k context")?"pct_high_context":i.includes("active for 8+ hours")?"pct_long_sessions":i.includes("subagent-heavy")?"pct_subagent_heavy":i.includes("ran in parallel")?"pct_parallel_sessions":void 0;a&&(n[a]=Number(o[1]))}return e}function Bq(t,e){let n=t&&typeof t=="object"?t:void 0,r=e&&typeof e=="object"?e:void 0,s=!!(n?.limit||n?.used||n?.percent!==void 0);if(!s&&(!r||r.is_enabled===!1))return;let o=s&&n?.limit&&typeof n.limit=="object"?n.limit:{},i=s&&n?.used&&typeof n.used=="object"?n.used:{},a=g=>{let E=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isSafeInteger(E)&&E>=0&&E<=9?E:void 0},l=g=>{let E=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isFinite(E)?E:void 0},c=a(o.exponent??r?.decimal_places??2),d=a(i.exponent??r?.decimal_places??2),u=s?o.amount_minor:r?.monthly_limit,f=s?i.amount_minor:r?.used_credits,m=(g,E,y)=>E===void 0||y!==void 0&&y!=="USD"||l(g)===void 0?void 0:(l(g)/10**E).toFixed(2),p=En(s?n?.percent:r?.utilization,"percent"),_=s?n?.spend_limit_reached??r?.spend_limit_reached:r?.spend_limit_reached,h={limit_usd:m(u,c,o.currency??r?.currency),used_usd:m(f,d,i.currency??r?.currency),remaining_fraction:p==null?void 0:Math.max(0,1-p),resets_at_iso:s?n?.resets_at:void 0,...typeof _=="boolean"?{reached:_}:{}};return Object.values(h).every(g=>g==null)?void 0:h}async function sR(t,e,n,r={}){try{let s=oR("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(n,60)*1e3,input:"",env:iR(e),maxBuffer:16777216}),o=typeof s.stdout=="string"?s.stdout:"";Nt(r,"claude_cli_print",o,[t.accessToken,t.refreshToken]);let i=Wq(o);if(!i.length)return;let a=Hq(o);return Ge("claude",Ve.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:i,...Object.keys(a).length?{characteristics:a}:{}})}catch{return}}async function aR({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s=eR(e);if(s.error==="not_claude_ai_subscriber")return Vt(Ve.notApplicable,s.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(s.error==="no_credentials_found")return Vt(Ve.unavailable,"credentials_missing",`credentials file not found: ${A_(e)}`);if(s.error)return Vt(Ve.expired,"oauth_token_expired_or_invalid",s.error);let o=s.oauth,i=Array.isArray(o.scopes)?o.scopes:[];if(i.length&&!i.includes(rR))return Vt(Ve.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${rR} scope required by the usage endpoint`);let a=new AbortController,l=setTimeout(()=>a.abort(),t*1e3),c,d;try{let g=!1,E=async()=>{try{o=await tR({...s,oauth:o},a.signal),g=!0}catch(T){let w=T instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(T.message)?T.message:"refresh_failed";if(w==="refresh_http_429")return Vt(Ve.throttled,"rate_limited","Claude OAuth refresh was rate limited; try again later");if(w==="refresh_lock_stale")return Vt(Ve.expired,"oauth_refresh_locked","a previous Claude credential refresh exited without releasing its lock; remove the stale .credentials.json.lmctl-refresh.lock directory before retrying");let S=w==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(w);return Vt(S?Ve.expired:Ve.unavailable,S?"oauth_token_expired_or_invalid":"oauth_refresh_failed",`Claude OAuth refresh failed (${w})${S?"; renew Claude login":"; try again later"}`)}};if(Od(o)){let T=await E();if(T)return T}let y=()=>fetch(`${Dq}/api/oauth/usage`,{headers:{Authorization:`Bearer ${o.accessToken}`,"anthropic-beta":Mq,"Content-Type":"application/json","User-Agent":Pq(e)},signal:a.signal});if(c=await y(),d=await c.text(),Nt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status),c.status===401&&!g&&s.path&&o.refreshToken){let T=await E();if(T)return T;c=await y(),d=await c.text(),Nt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status)}}catch(g){let E=await sR(o,e,t,{debug:n,onRawResponse:r});return E||Vt(Ve.unavailable,"request_failed",`${g instanceof Error?g.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(l)}let u=(...g)=>bo(Vt(...g),d,[String(o.accessToken??""),String(o.refreshToken??"")]);if(c.status===401)return u(Ve.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(c.status===403)return u(Ve.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(c.status===429){let g=Uq(c.headers),E=await sR(o,e,t,{debug:n,onRawResponse:r});return E||u(Ve.throttled,"rate_limited",`usage endpoint rate limited${g==null?"":`; retry after ${g}s`}`,"claude_oauth_api",g)}if(c.status!==200)return u(Ve.unavailable,`http_${c.status}`,"usage endpoint returned an unexpected status");let f;try{f=JSON.parse(d)}catch{return Vt(Ve.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!f||typeof f!="object"||Array.isArray(f))return Vt(Ve.unavailable,"malformed_response","response was not an object");let m=f,p=Array.isArray(m.limits)?m.limits:[],_=p.length?p.flatMap(g=>{if(!g||typeof g!="object")return[];let E=g.kind,y=$q(E==="session"?"session":E),T=g.scope?.model?.display_name,w=E==="session"?"session":E==="weekly_all"?"week-all-models":`week-scoped-${T||E}`;return[At({bucket_id:w,group_name:E==="session"?"session":"weekly",window_type:y,used_fraction:En(g.percent,"percent"),resets_at_iso:g.resets_at,raw_value:g.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(g=>{let E=m[g];return!E||typeof E!="object"?[]:[At({bucket_id:g==="five_hour"?"session":"week-all-models",group_name:g==="five_hour"?"session":"weekly",window_type:g==="five_hour"?"five_hour":"weekly",used_fraction:En(E.utilization,"percent"),resets_at_iso:E.resets_at,raw_value:E.utilization,raw_scale:"used_percent"})]}),h=Bq(m.spend,m.extra_usage);return Ge("claude",Ve.ok,{source:"claude_oauth_api",account_id:null,plan_type:o.subscriptionType??o.rateLimitTier??null,ordinary_usage_allowed:null,buckets:_.sort((g,E)=>String(g.window_type).localeCompare(String(E.window_type))||String(g.bucket_id).localeCompare(String(E.bucket_id))),...h?{spend_control:h}:{}})}var Dq,Mq,rR,Ve,jq,lR=x(()=>{"use strict";Hn();nR();Hn();Dq="https://api.anthropic.com",Mq="oauth-2025-04-20",rR="user:profile";Ve={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};jq=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{randomUUID as uR}from"node:crypto";import{mkdirSync as Xq,readFileSync as N_,realpathSync as qq,renameSync as Gq,rmSync as R_,statSync as cR,writeFileSync as fR}from"node:fs";import{homedir as Vq}from"node:os";import{join as L_}from"node:path";import{setTimeout as Jq}from"node:timers/promises";function _a(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function C_(t){if(t.CODEX_AUTH_PATH)return t.CODEX_AUTH_PATH;let e=t.CODEX_HOME||L_(t.HOME||Vq(),".codex");return L_(e,"auth.json")}function x_(t){let e=_a(JSON.parse(N_(t,"utf8")));if(!e)throw new Error("invalid credential document");return e}function mR(t){if(t.CODEX_ACCESS_TOKEN)return{tokens:{access_token:t.CODEX_ACCESS_TOKEN,account_id:t.CODEX_ACCOUNT_ID}};let e=C_(t);try{let n=_a(x_(e).tokens);return typeof n?.access_token=="string"&&n.access_token?{tokens:n,path:qq(e)}:{error:"credentials_missing"}}catch(n){return{error:n.code==="ENOENT"?"credentials_missing":"credentials_unreadable"}}}function dR(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.id_token===e.id_token&&t.account_id===e.account_id}async function zq(t,e){let n=`${t}.lmctl-refresh.lock`,r=L_(n,"owner.json"),s=uR();for(;;){e.throwIfAborted();try{Xq(n,{mode:448});try{fR(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw R_(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(N_(r,"utf8")).token===s&&R_(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(N_(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-cR(n).mtimeMs>6e4}catch{try{i=Date.now()-cR(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await Jq(50,void 0,{signal:e})}}}async function pR(t,e){if(!t.path||typeof t.tokens?.refresh_token!="string"||!t.tokens.refresh_token)throw new Error("no_refresh_token");let n=await zq(t.path,e);try{let r=x_(t.path),s=_a(r.tokens);if(!s||typeof s.access_token!="string")throw new Error("credentials_changed");if(!dR(s,t.tokens)&&typeof s.access_token=="string")return s;if(typeof s.refresh_token!="string"||!s.refresh_token)throw new Error("no_refresh_token");let o=await fetch(Kq,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:s.refresh_token,client_id:Yq})});if(!o.ok)throw new Error(`refresh_http_${o.status}`);let i=_a(await o.json());if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||i.refresh_token!==void 0&&(typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token))||i.id_token!==void 0&&(typeof i.id_token!="string"||!/^\S+$/.test(i.id_token)))throw new Error("invalid_refresh_response");let a=x_(t.path),l=_a(a.tokens);if(!l||!dR(s,l)){if(l&&typeof l.access_token=="string")return l;throw new Error("credentials_changed")}let c={...l,access_token:i.access_token,...i.refresh_token===void 0?{}:{refresh_token:i.refresh_token},...i.id_token===void 0?{}:{id_token:i.id_token}},d={...a,tokens:c,last_refresh:new Date().toISOString()},u=`${t.path}.${uR()}.tmp`;try{fR(u,JSON.stringify(d),{flag:"wx",mode:384}),Gq(u,t.path)}finally{R_(u,{force:!0})}return c}finally{n()}}var Kq,Yq,hR=x(()=>{"use strict";Kq="https://auth.openai.com/oauth/token",Yq="app_EMoamEEZ73f0CkXaXp7hrann"});function Tn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function _R(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let n=e/60;return n>=240&&n<=360?"five_hour":n>=9e3&&n<=11500?"weekly":n>=38e3&&n<=46e3?"monthly":"unknown"}function gR(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function eG(t){if(Tn(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function tG(t){let e=[],n=Tn(t.rate_limit)?t.rate_limit:{},r=typeof n.allowed=="boolean"?n.allowed:void 0,s=typeof n.limit_reached=="boolean"?n.limit_reached:void 0;for(let i of["primary_window","secondary_window"]){let a=Tn(n[i])?n[i]:void 0;if(!a)continue;let l=_R(a.limit_window_seconds);e.push(At({bucket_id:`codex-${gR(l)}`,group_name:"codex",window_type:l,used_fraction:En(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...r===void 0?{}:{allowed:r},...s===void 0?{}:{limit_reached:s}}))}let o=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let i of o){if(!Tn(i))continue;let a=Tn(i.rate_limit)?i.rate_limit:{},l=typeof i.limit_name=="string"?i.limit_name:void 0,c=typeof i.metered_feature=="string"?i.metered_feature:void 0,d=c||l||"additional",u=typeof a.allowed=="boolean"?a.allowed:void 0,f=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let m of["primary_window","secondary_window"]){let p=Tn(a[m])?a[m]:void 0;if(!p)continue;let _=_R(p.limit_window_seconds);e.push(At({bucket_id:`${d}-${gR(_)}`,group_name:l||d,window_type:_,used_fraction:En(p.used_percent,"percent"),resets_at:p.reset_at,raw_value:p.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...u===void 0?{}:{allowed:u},...f===void 0?{}:{limit_reached:f}}))}}return e.sort((i,a)=>String(i.group_name??"").localeCompare(String(a.group_name??""))||String(i.bucket_id).localeCompare(String(a.bucket_id)))}function nG(t){let e=Tn(t.rate_limit)?t.rate_limit:{},n=typeof e.allowed=="boolean"?e.allowed:void 0,r=Tn(t.spend_control)?t.spend_control:void 0,s=Tn(t.credits)?t.credits:void 0;return Ge("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...n===void 0?{}:{ordinary_usage_allowed:n},buckets:tG(t),...s?{credits:eG(s)}:{},...r?{spend_control:r}:{}})}async function yR(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s}=t,o=mR(n),i=o.tokens;if(!i||typeof i.access_token!="string")return Ge("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:`no access_token in ${C_(n)} (or $CODEX_ACCESS_TOKEN)`});let a=new AbortController,l=setTimeout(()=>a.abort(),Math.ceil(e*1e3)),c=i.access_token,d=new Set([i.access_token,i.refresh_token,i.id_token].filter(u=>typeof u=="string"&&!!u));try{let u=typeof i.account_id=="string"?i.account_id:void 0,f=typeof i.refresh_token=="string"?i.refresh_token:void 0,m=typeof i.id_token=="string"?i.id_token:void 0,p="",_=()=>[...d],h=(S,I)=>bo(Ge("codex",S,I),p,_()),g=!1,E=async()=>{if(!(g||!o.path||typeof i.refresh_token!="string"))try{let S=await pR({...o,tokens:{...i,refresh_token:f}},a.signal);typeof S.access_token=="string"&&(d.add(S.access_token),c=S.access_token),u=typeof S.account_id=="string"?S.account_id:u,typeof S.refresh_token=="string"&&(d.add(S.refresh_token),f=S.refresh_token),typeof S.id_token=="string"&&(d.add(S.id_token),m=S.id_token),g=!0;return}catch(S){let I=S instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(S.message)?S.message:"refresh_failed",b=I==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(I);return Ge("codex",b?"auth_expired":"provider_unavailable",{source:"codex_http",reason:b?"oauth_token_expired_or_invalid":"oauth_refresh_failed",detail:`Codex OAuth refresh failed (${I})${b?"; renew Codex login":"; try again later"}`})}},y=()=>{let S={Authorization:`Bearer ${c}`,"User-Agent":Zq,"Content-Type":"application/json",Accept:"application/json"};u&&(S["ChatGPT-Account-Id"]=u);let I=(n.CODEX_BASE_URL||Qq).replace(/\/$/,"");return fetch(`${I}/wham/usage`,{headers:S,signal:a.signal})},T=await y();if(p=await T.text(),Nt({debug:r,onRawResponse:s},"codex_http",p,_(),T.status),T.status===401&&o.path&&f){let S=await E();if(S)return S;T=await y(),p=await T.text(),Nt({debug:r,onRawResponse:s},"codex_http",p,_(),T.status)}if(T.status===401)return h("auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(T.status===429){let S=T.headers.get("retry-after"),I=S===null?void 0:Number.parseInt(S,10);return h("reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...I!==void 0&&Number.isFinite(I)&&I>=0?{retry_after_seconds:I}:{}})}if(!T.ok)return h("provider_unavailable",{source:"codex_http",reason:`http_${T.status}`,detail:"codex usage endpoint returned an unexpected status"});let w;try{w=JSON.parse(p)}catch(S){return Ge("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:Io(String(S),d)})}return Tn(w)?nG(w):Ge("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(u){let f=u instanceof Error?`${u.name}: ${u.message}`:String(u);return Ge("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:Io(f,d)})}finally{clearTimeout(l)}}var Qq,Zq,ER=x(()=>{"use strict";Hn();hR();Hn();Qq="https://chatgpt.com/backend-api",Zq="codex-cli"});import{createHash as rG,randomUUID as sG}from"node:crypto";import{readFileSync as IR,openSync as oG,fsyncSync as iG,closeSync as aG,mkdirSync as TR,writeFileSync as bR,renameSync as lG,rmSync as cG,rmdirSync as dG,statSync as O_,utimesSync as uG}from"node:fs";import{homedir as fG}from"node:os";import{basename as mG,dirname as pG,join as Dd}from"node:path";import{setTimeout as kR}from"node:timers/promises";function _G(t){let e;try{e=IR(t,"utf8")}catch(s){if(s.code==="ENOENT")return{};throw new Error("config_unreadable")}let n={},r="other";for(let s of e.split(/\r?\n/)){let o=/^\s*\[providers\.(?:"managed:kimi-code"|'managed:kimi-code')(\.oauth)?\]\s*(?:#.*)?$/.exec(s);if(o){r=o[1]?"oauth.":"";continue}if(/^\s*\[/.test(s)){if(s.includes("managed:kimi-code"))throw new Error("config_format_unsupported");r="other";continue}if(r==="other")continue;if(/^\s*oauth\s*=/.test(s))throw new Error("config_format_unsupported");let i=/^\s*(base_url|oauth_host|storage|key)\s*=\s*("(?:[^"\\]|\\.)*"|'[^']*')\s*(?:#.*)?$/.exec(s);if(!i&&/^\s*(base_url|oauth_host|storage|key)\s*=/.test(s))throw new Error("config_malformed");if(i)try{n[r+i[1]]=i[2].startsWith('"')?JSON.parse(i[2]):i[2].slice(1,-1)}catch{throw new Error("config_malformed")}}return n}function Md(t){let e;try{e=JSON.parse(IR(t,"utf8"))}catch(n){throw new Error(n.code==="ENOENT"?"credentials_missing":"credentials_malformed")}if(e&&typeof e=="object"&&e.access_token===""&&e.refresh_token==="")throw new Error("credentials_revoked");if(!e||typeof e!="object"||Array.isArray(e)||typeof e.access_token!="string"||!e.access_token.trim())throw new Error("credentials_malformed");return e}function AR(t){let e=t.KIMI_CODE_HOME??Dd(t.HOME??fG(),".kimi-code"),n=_G(t.KIMI_CODE_CONFIG_PATH??Dd(e,"config.toml")),r=t.KIMI_CODE_BASE_URL!==void 0||t.KIMI_CODE_OAUTH_HOST!==void 0||t.KIMI_OAUTH_HOST!==void 0,s=vR(t.KIMI_CODE_BASE_URL??n.base_url??wR),o=vR(t.KIMI_CODE_OAUTH_HOST??t.KIMI_OAUTH_HOST??(r?D_:n["oauth.oauth_host"]??D_)),i=s===wR&&o===D_?"kimi-code":`kimi-code-env-${rG("sha256").update(JSON.stringify({oauthHost:o,baseUrl:s})).digest("hex").slice(0,16)}`;if(!t.KIMI_CREDENTIALS_PATH&&!r&&n["oauth.key"]===`oauth/${i}`&&n["oauth.storage"]&&n["oauth.storage"]!=="file")throw new Error("credential_storage_unsupported");let a=t.KIMI_CREDENTIALS_PATH??Dd(e,"credentials",`${i}.json`),l=Md(a),c=a,d=mG(a,".json");return{home:e,path:c,lockTarget:Dd(e,"oauth",d),baseUrl:s,oauthHost:o,token:l}}function $d(t){if(typeof t.expires_at!="number")return!1;let e=typeof t.expires_in=="number"?t.expires_in:0;return t.expires_at-Date.now()/1e3<Math.max(300,e*.5)}function SR(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.expires_at===e.expires_at&&t.expires_in===e.expires_in}async function gG(t,e){TR(pG(t),{recursive:!0}),bR(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{TR(n);break}catch(i){if(i.code!=="EEXIST")throw new Error("refresh_lock_failed");try{if(Date.now()-O_(n).mtimeMs>5e3)throw new Error("refresh_lock_stale")}catch(a){if(a.message==="refresh_lock_stale")throw a}try{await kR(50,void 0,{signal:e})}catch{throw new Error("refresh_locked")}}}let r=O_(n),s=()=>{let i;try{i=O_(n)}catch{throw new Error("refresh_lock_lost")}if(i.ino!==r.ino||i.dev!==r.dev)throw new Error("refresh_lock_lost")},o=setInterval(()=>{try{s();let i=new Date;uG(n,i,i)}catch{}},1e3);return o.unref(),{assertOwned:s,release(){clearInterval(o);try{s(),dG(n)}catch{}}}}async function NR(t,e){if(typeof t.token.refresh_token!="string"||!t.token.refresh_token)throw new Error("no_refresh_token");let n=await gG(t.lockTarget,e);try{let r=Md(t.path);if(!SR(r,t.token)&&!$d(r))return r;if(typeof r.refresh_token!="string"||!r.refresh_token)throw new Error("no_refresh_token");let s;for(let u=0;u<3;u++){try{if(s=await fetch(`${t.oauthHost}/api/oauth/token`,{method:"POST",signal:e,headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":"lmctl"},body:new URLSearchParams({client_id:hG,grant_type:"refresh_token",refresh_token:r.refresh_token})}),![429,500,502,503,504].includes(s.status)||u===2)break;await s.body?.cancel()}catch{if(e.aborted||u===2)throw new Error("refresh_request_failed")}await kR(1e3*2**u,void 0,{signal:e})}if(!s)throw new Error("refresh_request_failed");if(!s.ok){try{let u=Md(t.path);if(u.refresh_token!==r.refresh_token)return u}catch{}throw new Error(`refresh_http_${s.status}`)}let o=await s.json(),i=Number(o?.expires_in);if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)||!Number.isFinite(i)||i<=0)throw new Error("invalid_refresh_response");let a=Math.floor(Date.now()/1e3)+i;if(!Number.isSafeInteger(a))throw new Error("invalid_refresh_response");n.assertOwned();let l=Md(t.path);if(!SR(l,r)){if(!$d(l))return l;throw new Error("credentials_changed")}let c={...l,access_token:o.access_token,refresh_token:o.refresh_token,expires_at:a,expires_in:i,...typeof o.scope=="string"?{scope:o.scope}:{},...typeof o.token_type=="string"?{token_type:o.token_type}:{}},d=`${t.path}.${sG()}.tmp`;try{let u=oG(d,"wx",384);try{bR(u,JSON.stringify(c,null,2)+`
|
|
2641
|
-
`),iG(u)}finally{aG(u)}n.assertOwned(),lG(d,t.path)}finally{cG(d,{force:!0})}return c}finally{n.release()}}var wR,D_,hG,vR,RR=x(()=>{"use strict";wR="https://api.kimi.com/coding/v1",D_="https://auth.kimi.com",hG="17e5f671-d194-4dfb-9706-5516cb48c098",vR=t=>t.trim().replace(/\/+$/,"")});function LR(t){let e=i=>{if(typeof i!="number"&&typeof i!="string"||typeof i=="string"&&i.trim()==="")return;let a=Number(i);return Number.isFinite(a)&&a>=0?a:void 0},n=e(t.limit),r=e(t.used),s=e(t.remaining);if(n===void 0||n<=0||r===void 0&&(s===void 0||s>n))return;let o=r??n-s;return{used:o,limit:n,remaining:Math.max(0,n-o)}}async function xR({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s;try{s=AR(e)}catch(_){let h=_ instanceof Error&&/^(credentials_missing|credentials_malformed|credentials_revoked|config_unreadable|config_malformed|config_format_unsupported|credential_storage_unsupported)$/.test(_.message)?_.message:"credentials_unreadable";return ht("kimi",h==="credentials_revoked"?"auth_expired":"provider_unavailable",h,h==="credentials_revoked"?"Kimi login was revoked; run kimi login":h.replaceAll("_"," "),"kimi_http")}let o=s.token,i=new AbortController,a=setTimeout(()=>i.abort(),t*1e3),l,c;try{let _=!1,h=async()=>{o=await NR({...s,token:o},i.signal),_=!0};$d(o)&&await h();let g=()=>fetch(`${s.baseUrl}/usages`,{headers:{Authorization:`Bearer ${o.access_token}`,Accept:"application/json"},signal:i.signal});l=await g(),c=await l.text(),Nt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status),l.status===401&&!_&&o.refresh_token&&(await h(),l=await g(),c=await l.text(),Nt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status))}catch(_){let h=_ instanceof Error&&/^(no_refresh_token|credentials_changed|credentials_revoked|invalid_refresh_response|refresh_locked|refresh_lock_stale|refresh_lock_failed|refresh_lock_lost|refresh_request_failed|refresh_http_\d+)$/.test(_.message)?_.message:"request_failed",g=h==="credentials_revoked"||h==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(h),E=h==="refresh_lock_stale"?"Kimi refresh lock is stale; run the native Kimi CLI to recover its lock, or verify no refresh is active before removing the .lock directory":g?`Kimi credential renewal failed (${h}); run kimi login`:`Kimi quota request failed (${h})`;return ht("kimi",g?"auth_expired":"provider_unavailable",h,E,"kimi_http")}finally{clearTimeout(a)}let d=(_,h,g)=>bo(ht("kimi",_,h,h,"kimi_http",[],g),c,[o.access_token]);if(l.status===401)return d("auth_expired","HTTP 401 from Kimi usage endpoint");if(l.status===403)return d("not_applicable","HTTP 403 from Kimi usage endpoint");if(l.status===429){let _=XN(l.headers);return d("reader_throttled","HTTP 429 from Kimi usage endpoint",_)}if(l.status!==200)return d("provider_unavailable",`HTTP ${l.status} from Kimi usage endpoint`);let u;try{u=JSON.parse(c)}catch{return ht("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!u||typeof u!="object")return ht("kimi","provider_unavailable","malformed_response","response was not an object");let f=[],m=new Set;function p(_){let h=String(_.bucket_id),g=h,E=2;for(;m.has(h);)h=`${g}-${E}`,E++;m.add(h),_.bucket_id=h,f.push(At(_))}if(Array.isArray(u.limits))for(let _ of u.limits){if(!_||typeof _!="object")continue;let h=_.window,g=_.detail;if(!h||typeof h!="object"||!g||typeof g!="object")continue;let E=0;if(h.timeUnit==="TIME_UNIT_MINUTE")E=Number(h.duration);else if(h.timeUnit==="TIME_UNIT_HOUR")E=Number(h.duration)*60;else if(h.timeUnit==="TIME_UNIT_DAY")E=Number(h.duration)*1440;else if(h.timeUnit==="TIME_UNIT_WEEK")E=Number(h.duration)*10080;else if(h.timeUnit==="TIME_UNIT_MONTH")E=Number(h.duration)*43200;else continue;let y=HN(E),T="window";y==="five_hour"&&(T="5h"),y==="weekly"&&(T="weekly"),y==="monthly"&&(T="monthly");let w=LR(g);if(!w)continue;let{used:S,limit:I,remaining:b}=w;p({bucket_id:`kimi-${T}`,window_type:y,used_fraction:at(S/I),remaining_fraction:at(b/I),resets_at_iso:g.resetTime,raw_value:S,raw_scale:"count"})}if(u.usage&&typeof u.usage=="object"){let _=LR(u.usage);_&&p({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:at(_.used/_.limit),remaining_fraction:at(_.remaining/_.limit),resets_at_iso:u.usage.resetTime,raw_value:_.used,raw_scale:"count"})}if(u.usages&&typeof u.usages=="object"){let _=[{key:"limit_5h",id:"kimi-5h",type:"five_hour"},{key:"limit_7d",id:"kimi-weekly",type:"weekly"},{key:"limit_month_total",id:"kimi-monthly",type:"monthly"},{key:"limit_month_code",id:"kimi-monthly-code",type:"monthly"}];for(let{key:h,id:g,type:E}of _){let y=u.usages[h];if(!y||typeof y!="object"||y.used_ratio==null||y.used_ratio===""||typeof y.used_ratio=="boolean")continue;let T=Number(y.used_ratio);!Number.isFinite(T)||T<0||m.has(g)||(m.add(g),f.push(At({bucket_id:g,window_type:E,used_fraction:at(T),resets_at_iso:typeof y.reset_time=="string"&&y.reset_time?y.reset_time:null,raw_value:T,raw_scale:"ratio"})))}}return Ge("kimi","ok",{source:"kimi_http",buckets:f})}var CR=x(()=>{"use strict";Hn();RR();Hn()});async function OR(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(d=>typeof d!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let d of e)if(!Pd.includes(d))return{status:"error",error:`unknown provider: ${d} (valid targets: ${Pd.join(", ")})`,readings:[]};let n=t.timeoutSeconds??yG;if(!Number.isFinite(n)||n<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let r=t.env??process.env,s=new Set(e.includes("all")?["codex","agy","claude","kimi"]:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${n}s per provider) ...`);let i=Object.entries({codex:yR,agy:JN,claude:aR,kimi:xR}).filter(([d])=>s.has(d)).map(async([,d])=>{let u=[],f=await d({timeoutSeconds:n,env:r,...t.debug?{debug:t.debug}:{},...t.includeRaw?{onRawResponse:p=>u.push(p)}:{}}),m=t.includeRaw?{...f,raw_responses:u}:f;return m&&t.onReading?.(m),m}),a=await Promise.allSettled(i),l=a.find(d=>d.status==="rejected");return l?{status:"error",error:String(l.reason),readings:[]}:{status:"ok",readings:a.filter(d=>d.status==="fulfilled").map(d=>d.value).filter(Boolean)}}var Pd,yG,DR=x(()=>{"use strict";KN();lR();ER();CR();Pd=["all","codex","agy","claude","kimi"],yG=15});var UR={};me(UR,{runRatelimit:()=>bG});function M_(t){return typeof t=="object"&&t!==null}function EG(t){return(0,We.formatPercent)(typeof t=="number"?t:null)}function TG(t,e){let n=typeof e.bucket_id=="string"&&e.bucket_id!==""?e.bucket_id:"unknown-bucket";return n==="session"?n="5h":n==="week-all-models"?n="weekly":n.startsWith("week-scoped-")&&(n=`weekly-${n.slice(12)}`),t!==""&&!n.startsWith(`${t}-`)&&(n=`${t}-${n}`),(0,We.escapeCell)(n)}function vG(t,e){let n="unknown",r=null,s,o=null;if(typeof e.resets_at_iso=="string"&&e.resets_at_iso!==""){let c=Date.parse(e.resets_at_iso);o=Number.isFinite(c)?c-Date.now():null,o!==null&&(Math.abs(o)<1e3?n="now":o>0?n=`in ${(0,We.formatDuration)(o,{maxUnit:"d",style:"compact"})}`:n=`${(0,We.formatDuration)(-o,{maxUnit:"d",style:"compact"})} ago`,s=wG[typeof e.window_type=="string"?e.window_type:""],s!==void 0&&(r=Math.min(1,Math.max(0,1-o/s))))}r!==null&&(n=`${(0,We.formatBar)(r)} ${n}`);let i="";if(r!==null&&r>0&&s!==void 0&&o!==null&&typeof e.used_fraction=="number"&&Number.isFinite(e.used_fraction)){let c=e.used_fraction;if(c<=r){let d=Math.max(0,1-c/r);i=`unused +${(0,We.formatPercent)(d)}`}else{let d=r*s,u=d>0?(1-c)/c*d:0,f=Math.max(0,o-u);i=`needing -${(0,We.formatDuration)(f,{maxUnit:"d",style:"compact"})}`}}let a=[];e.is_exhausted===!0&&a.push("[EXHAUSTED]"),e.allowed===!1&&a.push("allowed=false"),e.limit_reached===!0&&a.push("limit_reached");let l=[TG(t,e),`${(0,We.formatBar)(typeof e.used_fraction=="number"?e.used_fraction:null)} ${EG(e.used_fraction)}`,n];return i!==""&&l.push(i),a.length>0&&l.push(a.join(" ")),l}function SG(t){let e=typeof t.provider=="string"&&t.provider!==""?t.provider:"unknown",n=typeof t.status=="string"?t.status:"unknown",r=typeof t.source=="string"&&t.source!==""?t.source:"unknown source",s=typeof t.reason=="string"?t.reason:"",o=`${e}: ${n} (${r})`;n!=="ok"&&typeof t.provider_message=="string"&&t.provider_message.trim()?o=`${e}: ${(0,We.escapeCell)(t.provider_message)} (${r})`:n==="auth_expired"?(o=`${e}: unavailable (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n==="provider_unavailable"&&PR.has(s)?(o=`${e}: not installed/configured (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n!=="ok"&&(o+=` -- ${s!==""?s:"no reason given"}`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`),n==="provider_unavailable"&&s!=="oauth_refresh_failed"&&!/^(credentials_|config_|credential_storage_|refresh_)/.test(s)&&(o+=` (${e} server-side, not lmctl \u2014 try again later)`));let i=typeof t.plan_type=="string"?t.plan_type.trim():"";i&&!["?","unknown","null","n/a"].includes(i.toLowerCase())&&(o+=` (${(0,We.escapeCell)(i)})`);let a=typeof t.provider=="string"?t.provider:"",l=Array.isArray(t.buckets)?t.buckets.filter(M_).map(d=>vG(a,d)):[],c=[];if(M_(t.credits)){let d=t.credits,u=[];typeof d.has_credits=="boolean"&&u.push(`has_credits=${d.has_credits}`),d.unlimited===!0&&u.push("unlimited"),d.balance!==void 0&&d.balance!==null&&u.push(`balance=${String(d.balance)}`),c.push(` credits: ${u.length>0?u.join(" "):"present"}`)}if(M_(t.spend_control)){let d=t.spend_control,u=` spend control: reached=${d.reached===!0}`;d.used_usd!==void 0&&d.used_usd!==null&&(u+=` used=$${String(d.used_usd)}`),d.limit_usd!==void 0&&d.limit_usd!==null&&(u+=` limit=$${String(d.limit_usd)}`),d.individual_limit!==void 0&&d.individual_limit!==null&&(u+=` individual_limit=${String(d.individual_limit)}`),c.push(u)}return{head:o,bucketRows:l,footers:c}}function IG(t){let e=SG(t),n=[e.head];if(e.bucketRows.length>0){let r=["LIMIT","USED","RESET TIME","OVERSTOCK"],s=(0,We.measureColumns)([{rows:[],headers:r},e.bucketRows]);n.push((0,We.renderGrid)(e.bucketRows,{widths:s,margin:2,align:["left","left","left"],headers:r}))}return n.push(...e.footers),n.join(`
|
|
2642
|
+
`});function at(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);return Number.isFinite(e)?Math.round(Math.min(1,Math.max(0,e))*1e6)/1e6:null}function En(t,e){if(t==null||typeof t=="boolean")return null;let n=Number(t);return at(e==="percent"?n/100:n)}function jN(t){if(t==null||typeof t=="boolean")return null;let e=Number(t);if(!Number.isFinite(e))return null;try{return new Date(Math.trunc(e)*1e3).toISOString().replace(".000Z","Z")}catch{return null}}function WN(t){if(typeof t!="string"||t.trim()==="")return null;let e=Date.parse(t);return Number.isFinite(e)?Math.floor(e/1e3):null}function HN(t){let e=Number(t);return Number.isFinite(e)?e===300||e>=240&&e<=360?"five_hour":e===10080||e>=9e3&&e<=11500?"weekly":e===43200||e===44640||e>=38e3&&e<=46e3?"monthly":"unknown":"unknown"}function BN(t){let e=String(t??"").trim().toLowerCase().replace(/-/g,"_").split("_").filter(Boolean);for(let n of[e[0],e.at(-1)]){if(n?.startsWith("5h")||n?.startsWith("five")||n==="session")return"five_hour";if(n?.startsWith("7d")||n?.startsWith("seven")||n?.startsWith("week"))return"weekly";if(n?.startsWith("30d")||n?.startsWith("month"))return"monthly"}return"unknown"}function Io(t,e=[]){let n=t==null?"":String(t);for(let r of e)typeof r=="string"&&r.length>=4&&(n=n.replaceAll(r,"***REDACTED***"));for(let r of iq)n=n.replace(r,"***REDACTED***");return n}function At(t){let e=at(t.used_fraction),n=at(t.remaining_fraction),r=t.resets_at==null?WN(t.resets_at_iso):Number(t.resets_at),s=t.resets_at_iso==null?jN(r):jN(WN(t.resets_at_iso)),o={bucket_id:t.bucket_id,...t.group_name!=null?{group_name:t.group_name}:{},window_type:t.window_type??"unknown",used_fraction:e??(n===null?null:at(1-n)),remaining_fraction:n??(e===null?null:at(1-e)),resets_at:r==null||!Number.isFinite(r)?null:Math.trunc(r),resets_at_iso:s,is_exhausted:t.is_exhausted??(n!==null?n<=0:e!==null?e>=1:null)};for(let i of["raw_value","raw_scale","limit_name","metered_feature","allowed","limit_reached"])t[i]!=null&&(o[i]=t[i]);return o}function Ge(t,e,n={}){let r={$schema:oq,provider:t,status:e,source:n.source??null,read_at:n.read_at??Math.floor(Date.now()/1e3),account_id:n.account_id??null,plan_type:n.plan_type??null,ordinary_usage_allowed:n.ordinary_usage_allowed??null,buckets:n.buckets??[]};for(let s of["credits","spend_control","characteristics","reason","detail","retry_after_seconds"])n[s]!=null&&(r[s]=n[s]);return r}function ht(t,e,n,r,s,o=[],i){return Ge(t,e,{source:s??null,reason:n,...r==null?{}:{detail:Io(r,o)},...i==null?{}:{retry_after_seconds:i}})}function XN(t){let e=t.get("retry-after");if(e===null)return null;let n=Number.parseFloat(e);return Number.isFinite(n)&&n>=0?Math.trunc(n):null}function Nt(t,e,n,r=[],s){if(!t.debug&&!t.onRawResponse)return;let o=Io(n,[...r].filter(i=>typeof i=="string")).replace(/("(?:access[_-]?token|refresh[_-]?token|authorization|api[_-]?key|password)"\s*:\s*")[^"\r\n]*(")/gi,"$1***REDACTED***$2");t.onRawResponse?.({source:e,...s===void 0?{}:{http_status:s},text:o}),t.debug?.(`[debug] ${e}${s===void 0?"":` HTTP ${s}`} raw response:
|
|
2643
|
+
${o}`)}function bo(t,e,n=[]){let r;try{let o=JSON.parse(e);r=typeof o?.error=="string"?o.error:o?.error?.message??o?.message??o?.detail}catch{/^\s*[<{[]/.test(e)||(r=e.trim())}if(typeof r!="string"||!r.trim())return t;let s=Io(r,n);return{...t,detail:s,provider_message:s}}var oq,iq,Hn=x(()=>{"use strict";oq="https://lmctl.com/schemas/lmratelimit-v1.json";iq=[/sk-ant-[A-Za-z0-9_-]{4,}/g,/sk-[A-Za-z0-9_-]{16,}/g,/\bbearer\s+[A-Za-z0-9._-]{8,}/gi,/\boat01[-_][A-Za-z0-9_-]{8,}/g,/\bcsrf[-_][A-Za-z0-9_-]{4,}/gi,/\b(?:csrf[-_]?token|x-codeium-csrf-token)\s*[:=]\s*['"]?[A-Za-z0-9._-]{4,}/gi]});import{spawnSync as aq}from"node:child_process";import{readdirSync as lq,readFileSync as cq}from"node:fs";import{join as dq}from"node:path";function Eq(t){return Object.fromEntries(Object.entries(t).filter(([e])=>!e.startsWith("ANTIGRAVITY")))}function Tq(t){let e=t.trim().toLowerCase(),n={"gemini models":"gemini","claude and gpt models":"3p",gemini:"gemini","3p models":"3p","3p":"3p"};return n[e]?n[e]:e.replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"")||"unknown"}function wq(t){let e=t.toLowerCase();return e.includes("weekly")?"weekly":e.includes("five hour")||e.includes("5-hour")||e.includes("5 hour")?"five_hour":e.includes("monthly")||e.includes("month")?"monthly":null}function vq(t){let e={weekly:"weekly",five_hour:"5h",monthly:"monthly"},n=[];for(let r of t.split(/\r?\n/)){let s=r.trim().split(" ").map(l=>l.trim());if(s.length<3||!s[0]||!s[1])continue;let o=wq(s[1]);if(!o)continue;let i=Number(s[2].replace(/%$/,"").trim());if(!Number.isFinite(i))continue;let a=at(i/100);n.push(At({bucket_id:`${Tq(s[0])}-${e[o]}`,group_name:s[0],window_type:o,used_fraction:a===null?null:at(1-a),remaining_fraction:a,resets_at_iso:s[3]||null,raw_value:i,raw_scale:"remaining_percent"}))}return n.sort((r,s)=>String(r.group_name??"").localeCompare(String(s.group_name??""))||String(r.bucket_id??"").localeCompare(String(s.bucket_id??"")))}function ha(t,e,n){return ht("agy","provider_unavailable",t,e,"agy_cli_print")}function Sq(t,e,n={}){try{let r=_q(Math.max(t,60)*1e3,Eq(e));if(Nt(n,"agy_cli_print",r.stdout??"",[e.ANTIGRAVITY_CSRF_TOKEN]),r.error?.code==="ENOENT")return ha("agy_not_found","the agy CLI is not on PATH",t);if(r.error?.code==="ETIMEDOUT")return ha("cli_timeout","agy -p /usage did not finish in time",t);if(r.error)return ha("cli_failed",r.error.message,t);let s=vq(r.stdout??"");return s.length===0?ha("cli_unparseable",`exit ${r.status??1}; no buckets parsed from CLI output`,t):Ge("agy","ok",{source:"agy_cli_print",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:s})}catch(r){return ha("cli_failed",r instanceof Error?r.message:String(r),t)}}function VN(t){if(!t||typeof t!="string")return null;let e=t.trim();if(!e||e.includes("@")||e.includes("/")||e.includes("\\")||e.includes("?")||e.includes("#")||e.includes("://")||/\s/.test(e))return null;let n;try{n=new URL(`http://${e}`)}catch{return null}if(n.username||n.password||n.pathname!=="/"||n.search||n.hash)return null;let r=n.hostname.toLowerCase();if(!(r==="localhost"||r==="127.0.0.1"||r==="[::1]"||r==="::1")||!n.port)return null;let o=Number(n.port);return!Number.isInteger(o)||o<1||o>65535||n.port!==String(o)?null:`${r==="::1"||r==="[::1]"?"[::1]":r}:${o}`}function Iq(t){let e=[],n=new Set,r=(s,o,i)=>{if(!s||!o)return;let a=VN(s);!a||n.has(`${a}\0${o}`)||(n.add(`${a}\0${o}`),e.push([a,o,i]))};r(t[qN],t[GN],-1);try{for(let s of lq("/proc"))if(/^\d+$/.test(s))try{let o={};for(let i of cq(dq("/proc",s,"environ")).toString("utf8").split("\0")){let a=i.indexOf("=");a>0&&(o[i.slice(0,a)]=i.slice(a+1))}r(o[qN],o[GN],Number(s))}catch{}}catch{}return e}function bq(t){if(typeof t!="object"||t===null)return null;let e=t.response;if(typeof e!="object"||e===null)return null;let n=e.groups;if(!Array.isArray(n))return null;let r=[];for(let s of n){if(typeof s!="object"||s===null)continue;let o=s,i=typeof o.displayName=="string"?o.displayName:null;if(Array.isArray(o.buckets))for(let a of o.buckets){if(typeof a!="object"||a===null)continue;let l=a,c=En(l.remainingFraction,"fraction");r.push(At({bucket_id:l.bucketId??l.displayName??"unknown",group_name:i,window_type:BN(l.window),used_fraction:c===null?null:at(1-c),remaining_fraction:c,resets_at_iso:l.resetTime??null,raw_value:l.remainingFraction??null,raw_scale:"remaining_fraction"}))}}return r.length===0?null:(r.sort((s,o)=>String(s.group_name??"").localeCompare(String(o.group_name??""))||String(s.bucket_id??"").localeCompare(String(o.bucket_id??""))),Ge("agy","ok",{source:"agy_connect_rpc",account_id:null,plan_type:null,ordinary_usage_allowed:null,buckets:r}))}async function kq(t,e,n={}){try{let s=yq(e).map(([a,l,c])=>[VN(a),l,c]).filter(a=>a[0]!==null);if(s.length===0)return ht("agy","provider_unavailable","no_active_session","no live agy process exposed ANTIGRAVITY_LS_ADDRESS/ANTIGRAVITY_CSRF_TOKEN","agy_connect_rpc");let o=[],i=Date.now()+t*1e3;for(let[a,l,c]of s){let d=i-Date.now();if(d<=0){o.push("overall connect deadline exceeded");break}try{let u=await gq(`http://${a}${uq}`,{"Content-Type":"application/json","Connect-Protocol-Version":"1","x-codeium-csrf-token":l},d);if(Nt(n,"agy_connect_rpc",u.body,[l],u.status),u.status===200){let f;try{f=JSON.parse(u.body)}catch{o.push(`pid=${c}: unparseable response`);continue}let m=bq(f);if(m)return m;o.push(`pid=${c}: response had no quota groups`)}else u.status===401||u.status===403?o.push(`pid=${c}: HTTP ${u.status} unauthorized`):o.push(`pid=${c}: HTTP ${u.status}`)}catch(u){o.push(`pid=${c}: ${u instanceof Error?u.message:String(u)}`)}}return ht("agy","provider_unavailable","no_active_session",`all candidate language servers failed: ${o.slice(0,5).join("; ")}`,"agy_connect_rpc",s.map(([,a])=>a))}catch(r){return ht("agy","provider_unavailable","connect_failed",r instanceof Error?r.message:String(r),"agy_connect_rpc")}}async function JN(t){let e=await kq(t.timeoutSeconds,t.env,t);if(e.status==="ok")return e;let n=Sq(t.timeoutSeconds,t.env,t);return n.status==="ok"?n:ht("agy","provider_unavailable","cli_and_language_server_unavailable",`cli: ${String(n.reason??n.status)} (${String(n.detail??"no detail")}); connect: ${String(e.reason??e.status)} (${String(e.detail??"no detail")})`,"agy_cli_print")}var qN,GN,uq,fq,mq,pq,hq,_q,gq,yq,KN=x(()=>{"use strict";Hn();Hn();qN="ANTIGRAVITY_LS_ADDRESS",GN="ANTIGRAVITY_CSRF_TOKEN",uq="/exa.language_server_pb.LanguageServerService/RetrieveUserQuotaSummary",fq=["-p","/usage"],mq=(t,e)=>{let n=aq("agy",fq,{encoding:"utf8",timeout:t,maxBuffer:16777216,env:e,stdio:["ignore","pipe","ignore"]});return{status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",error:n.error}},pq=async(t,e,n)=>{let r=await fetch(t,{method:"POST",headers:e,body:"{}",signal:AbortSignal.timeout(n),redirect:"error"});return{status:r.status,body:await r.text()}},hq=t=>Iq(t),_q=mq,gq=pq,yq=hq});import{randomUUID as QN}from"node:crypto";import{mkdirSync as Aq,readFileSync as v_,realpathSync as Nq,renameSync as Rq,rmSync as S_,statSync as YN,writeFileSync as ZN}from"node:fs";import{homedir as Lq}from"node:os";import{join as I_}from"node:path";import{setTimeout as xq}from"node:timers/promises";function A_(t){return I_(t.CLAUDE_CONFIG_DIR??I_(t.HOME??Lq(),".claude"),".credentials.json")}function b_(t){let e=JSON.parse(v_(t,"utf8"));if(!e||typeof e!="object"||Array.isArray(e))throw new Error("invalid credential document");return e}function k_(t){let e=t.claudeAiOauth;return e&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function eR(t){if(t.CLAUDE_CODE_OAUTH_TOKEN)return{oauth:{accessToken:t.CLAUDE_CODE_OAUTH_TOKEN}};let e=A_(t);try{let n=k_(b_(e));return typeof n?.accessToken=="string"&&n.accessToken?{oauth:n,path:Nq(e)}:{error:"not_claude_ai_subscriber"}}catch(n){return n.code==="ENOENT"?{error:t.ANTHROPIC_API_KEY?"not_claude_ai_subscriber":"no_credentials_found"}:{error:"credentials_unreadable"}}}function Od(t){return typeof t.expiresAt=="number"&&Date.now()+Dq>=t.expiresAt}function zN(t,e){return t.accessToken===e.accessToken&&t.refreshToken===e.refreshToken}async function Mq(t,e){let n=`${t}.lmctl-refresh.lock`,r=I_(n,"owner.json"),s=QN();for(;;){e.throwIfAborted();try{Aq(n,{mode:448});try{ZN(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw S_(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(v_(r,"utf8")).token===s&&S_(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(v_(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-YN(n).mtimeMs>6e4}catch{try{i=Date.now()-YN(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await xq(50,void 0,{signal:e})}}}async function tR(t,e){if(!t.path||typeof t.oauth?.refreshToken!="string"||!t.oauth.refreshToken)throw new Error("no_refresh_token");let n=await Mq(t.path,e);try{let r=k_(b_(t.path));if(!r||typeof r.accessToken!="string")throw new Error("credentials_changed");if(!zN(r,t.oauth)&&!Od(r))return r;if(typeof r.refreshToken!="string"||!r.refreshToken)throw new Error("no_refresh_token");let s=await fetch(Oq,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:r.refreshToken,client_id:Cq})});if(!s.ok)throw new Error(`refresh_http_${s.status}`);let o=await s.json();if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.expires_in!="number"||!Number.isFinite(o.expires_in)||o.expires_in<=0||o.refresh_token!==void 0&&(typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)))throw new Error("invalid_refresh_response");let i=Math.floor(Date.now()+o.expires_in*1e3);if(!Number.isSafeInteger(i)||i<=Date.now())throw new Error("invalid_refresh_response");let a=b_(t.path),l=k_(a);if(!l||!zN(r,l)){if(l&&typeof l.accessToken=="string"&&!Od(l))return l;throw new Error("credentials_changed")}let c={...l,accessToken:o.access_token,refreshToken:o.refresh_token??r.refreshToken,expiresAt:i,...typeof o.scope=="string"?{scopes:o.scope.split(/\s+/).filter(Boolean)}:{}},d=`${t.path}.${QN()}.tmp`;try{ZN(d,JSON.stringify({...a,claudeAiOauth:c}),{flag:"wx",mode:384}),Rq(d,t.path)}finally{S_(d,{force:!0})}return c}finally{n()}}var Cq,Oq,Dq,nR=x(()=>{"use strict";Cq="9d1c250a-e61b-44d9-88ed-5944d1962f5e",Oq="https://console.anthropic.com/v1/oauth/token",Dq=3e5});import{spawnSync as oR}from"node:child_process";function Uq(t){let e=String(t??"").toLowerCase();return e.includes("session")||e.includes("five")||e.includes("5h")?"five_hour":e.includes("week")||e.includes("seven")||e.includes("7d")?"weekly":e.includes("month")||e.includes("30d")?"monthly":"unknown"}function iR(t){return Object.fromEntries(Object.entries(t).filter(([e])=>e!=="CLAUDECODE"))}function Fq(t){try{let e=oR("claude",["--version"],{encoding:"utf8",timeout:2e4,stdio:["ignore","pipe","ignore"],env:iR(t)}),n=typeof e.stdout=="string"?e.stdout.trim().split(/\s+/)[0]:"";if(n)return`claude-code/${n}`}catch{}return"claude-code/unknown"}function Vt(t,e,n,r="claude_oauth_api",s){return ht("claude",t,e,n,r,void 0,s)}function jq(t){let e=t.get("retry-after");if(!e)return;let n=Number.parseInt(e,10);return Number.isFinite(n)?n:void 0}function Wq(t){if(!t)return;let e=/^([A-Za-z]{3,9})\s+(\d{1,2}),?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)?(?:\s*\(([^)]+)\))?$/i.exec(t.trim());if(!e)return;let n=["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"].indexOf(e[1].slice(0,3).toLowerCase());if(n<0)return;let r=Number(e[3]),s=Number(e[4]??0);(e[5]??"").toLowerCase()==="pm"&&r!==12&&(r+=12),(e[5]??"").toLowerCase()==="am"&&r===12&&(r=0);let o=new Date(Date.UTC(new Date().getUTCFullYear(),n,Number(e[2]),r,s));return Number.isFinite(o.getTime())?Math.floor(o.getTime()/1e3):void 0}function Bq(t){let e=[];for(let n of t.split(/\r?\n/)){let r=Hq.exec(n.trim());if(!r)continue;let s=r[1].trim(),i=s.toLowerCase()==="session",a=/\(([^)]+)\)/.exec(s)?.[1]?.trim()??s,l=i?"session":a.toLowerCase()==="all models"?"week-all-models":`week-scoped-${a}`,c=i?"five_hour":"weekly";e.push(At({bucket_id:l,group_name:i?"session":"weekly",window_type:c,used_fraction:En(Number(r[2]),"percent"),raw_value:Number(r[2]),raw_scale:"used_percent",resets_at:Wq(r[3])}))}return e.sort((n,r)=>String(n.window_type).localeCompare(String(r.window_type))||String(n.bucket_id).localeCompare(String(r.bucket_id)))}function Xq(t){let e={},n;for(let r of t.split(/\r?\n/)){let s=/^Last\s+(\S+)\s*[·-]\s*(\d+)\s+requests?\s*[·-]\s*(\d+)\s+sessions?\s*$/.exec(r.trim());if(s){n={requests:Number(s[2]),sessions:Number(s[3])},e[`window_${s[1].toLowerCase()}`]=n;continue}let o=/^\s+(\d+)%\s+of your usage\s+(.+?)\s*$/.exec(r);if(!o||!n)continue;let i=o[2].toLowerCase(),a=i.includes(">150k context")?"pct_high_context":i.includes("active for 8+ hours")?"pct_long_sessions":i.includes("subagent-heavy")?"pct_subagent_heavy":i.includes("ran in parallel")?"pct_parallel_sessions":void 0;a&&(n[a]=Number(o[1]))}return e}function qq(t,e){let n=t&&typeof t=="object"?t:void 0,r=e&&typeof e=="object"?e:void 0,s=!!(n?.limit||n?.used||n?.percent!==void 0);if(!s&&(!r||r.is_enabled===!1))return;let o=s&&n?.limit&&typeof n.limit=="object"?n.limit:{},i=s&&n?.used&&typeof n.used=="object"?n.used:{},a=g=>{let E=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isSafeInteger(E)&&E>=0&&E<=9?E:void 0},l=g=>{let E=typeof g=="number"?g:typeof g=="string"&&g.trim()!==""?Number(g):NaN;return Number.isFinite(E)?E:void 0},c=a(o.exponent??r?.decimal_places??2),d=a(i.exponent??r?.decimal_places??2),u=s?o.amount_minor:r?.monthly_limit,f=s?i.amount_minor:r?.used_credits,m=(g,E,y)=>E===void 0||y!==void 0&&y!=="USD"||l(g)===void 0?void 0:(l(g)/10**E).toFixed(2),p=En(s?n?.percent:r?.utilization,"percent"),_=s?n?.spend_limit_reached??r?.spend_limit_reached:r?.spend_limit_reached,h={limit_usd:m(u,c,o.currency??r?.currency),used_usd:m(f,d,i.currency??r?.currency),remaining_fraction:p==null?void 0:Math.max(0,1-p),resets_at_iso:s?n?.resets_at:void 0,...typeof _=="boolean"?{reached:_}:{}};return Object.values(h).every(g=>g==null)?void 0:h}async function sR(t,e,n,r={}){try{let s=oR("claude",["-p","/usage"],{encoding:"utf8",timeout:Math.max(n,60)*1e3,input:"",env:iR(e),maxBuffer:16777216}),o=typeof s.stdout=="string"?s.stdout:"";Nt(r,"claude_cli_print",o,[t.accessToken,t.refreshToken]);let i=Bq(o);if(!i.length)return;let a=Xq(o);return Ge("claude",Ve.ok,{source:"claude_cli_print",account_id:null,plan_type:t.subscriptionType??t.rateLimitTier??null,ordinary_usage_allowed:null,buckets:i,...Object.keys(a).length?{characteristics:a}:{}})}catch{return}}async function aR({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s=eR(e);if(s.error==="not_claude_ai_subscriber")return Vt(Ve.notApplicable,s.error,"no OAuth subscription credentials; API-key accounts have no subscription quota endpoint");if(s.error==="no_credentials_found")return Vt(Ve.unavailable,"credentials_missing",`credentials file not found: ${A_(e)}`);if(s.error)return Vt(Ve.expired,"oauth_token_expired_or_invalid",s.error);let o=s.oauth,i=Array.isArray(o.scopes)?o.scopes:[];if(i.length&&!i.includes(rR))return Vt(Ve.notApplicable,"not_claude_ai_subscriber",`credential lacks the ${rR} scope required by the usage endpoint`);let a=new AbortController,l=setTimeout(()=>a.abort(),t*1e3),c,d;try{let g=!1,E=async()=>{try{o=await tR({...s,oauth:o},a.signal),g=!0}catch(T){let w=T instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(T.message)?T.message:"refresh_failed";if(w==="refresh_http_429")return Vt(Ve.throttled,"rate_limited","Claude OAuth refresh was rate limited; try again later");if(w==="refresh_lock_stale")return Vt(Ve.expired,"oauth_refresh_locked","a previous Claude credential refresh exited without releasing its lock; remove the stale .credentials.json.lmctl-refresh.lock directory before retrying");let S=w==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(w);return Vt(S?Ve.expired:Ve.unavailable,S?"oauth_token_expired_or_invalid":"oauth_refresh_failed",`Claude OAuth refresh failed (${w})${S?"; renew Claude login":"; try again later"}`)}};if(Od(o)){let T=await E();if(T)return T}let y=()=>fetch(`${$q}/api/oauth/usage`,{headers:{Authorization:`Bearer ${o.accessToken}`,"anthropic-beta":Pq,"Content-Type":"application/json","User-Agent":Fq(e)},signal:a.signal});if(c=await y(),d=await c.text(),Nt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status),c.status===401&&!g&&s.path&&o.refreshToken){let T=await E();if(T)return T;c=await y(),d=await c.text(),Nt({debug:n,onRawResponse:r},"claude_oauth_api",d,[o.accessToken,o.refreshToken],c.status)}}catch(g){let E=await sR(o,e,t,{debug:n,onRawResponse:r});return E||Vt(Ve.unavailable,"request_failed",`${g instanceof Error?g.name:"request failed"} (CLI fallback also unavailable)`)}finally{clearTimeout(l)}let u=(...g)=>bo(Vt(...g),d,[String(o.accessToken??""),String(o.refreshToken??"")]);if(c.status===401)return u(Ve.expired,"oauth_token_expired_or_invalid","HTTP 401 from usage endpoint");if(c.status===403)return u(Ve.notApplicable,"not_claude_ai_subscriber","HTTP 403 from usage endpoint (account is not usage-eligible)");if(c.status===429){let g=jq(c.headers),E=await sR(o,e,t,{debug:n,onRawResponse:r});return E||u(Ve.throttled,"rate_limited",`usage endpoint rate limited${g==null?"":`; retry after ${g}s`}`,"claude_oauth_api",g)}if(c.status!==200)return u(Ve.unavailable,`http_${c.status}`,"usage endpoint returned an unexpected status");let f;try{f=JSON.parse(d)}catch{return Vt(Ve.unavailable,"malformed_response","SyntaxError: malformed JSON")}if(!f||typeof f!="object"||Array.isArray(f))return Vt(Ve.unavailable,"malformed_response","response was not an object");let m=f,p=Array.isArray(m.limits)?m.limits:[],_=p.length?p.flatMap(g=>{if(!g||typeof g!="object")return[];let E=g.kind,y=Uq(E==="session"?"session":E),T=g.scope?.model?.display_name,w=E==="session"?"session":E==="weekly_all"?"week-all-models":`week-scoped-${T||E}`;return[At({bucket_id:w,group_name:E==="session"?"session":"weekly",window_type:y,used_fraction:En(g.percent,"percent"),resets_at_iso:g.resets_at,raw_value:g.percent,raw_scale:"used_percent"})]}):["five_hour","seven_day"].flatMap(g=>{let E=m[g];return!E||typeof E!="object"?[]:[At({bucket_id:g==="five_hour"?"session":"week-all-models",group_name:g==="five_hour"?"session":"weekly",window_type:g==="five_hour"?"five_hour":"weekly",used_fraction:En(E.utilization,"percent"),resets_at_iso:E.resets_at,raw_value:E.utilization,raw_scale:"used_percent"})]}),h=qq(m.spend,m.extra_usage);return Ge("claude",Ve.ok,{source:"claude_oauth_api",account_id:null,plan_type:o.subscriptionType??o.rateLimitTier??null,ordinary_usage_allowed:null,buckets:_.sort((g,E)=>String(g.window_type).localeCompare(String(E.window_type))||String(g.bucket_id).localeCompare(String(E.bucket_id))),...h?{spend_control:h}:{}})}var $q,Pq,rR,Ve,Hq,lR=x(()=>{"use strict";Hn();nR();Hn();$q="https://api.anthropic.com",Pq="oauth-2025-04-20",rR="user:profile";Ve={ok:"ok",unavailable:"provider_unavailable",expired:"auth_expired",notApplicable:"not_applicable",throttled:"reader_throttled"};Hq=/^Current\s+(.+?):\s*(\d+(?:\.\d+)?)\s*%\s*used(?:\s*[·-]\s*resets\s*(.+?))?$/});import{randomUUID as uR}from"node:crypto";import{mkdirSync as Gq,readFileSync as N_,realpathSync as Vq,renameSync as Jq,rmSync as R_,statSync as cR,writeFileSync as fR}from"node:fs";import{homedir as Kq}from"node:os";import{join as L_}from"node:path";import{setTimeout as Yq}from"node:timers/promises";function _a(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function C_(t){if(t.CODEX_AUTH_PATH)return t.CODEX_AUTH_PATH;let e=t.CODEX_HOME||L_(t.HOME||Kq(),".codex");return L_(e,"auth.json")}function x_(t){let e=_a(JSON.parse(N_(t,"utf8")));if(!e)throw new Error("invalid credential document");return e}function mR(t){if(t.CODEX_ACCESS_TOKEN)return{tokens:{access_token:t.CODEX_ACCESS_TOKEN,account_id:t.CODEX_ACCOUNT_ID}};let e=C_(t);try{let n=_a(x_(e).tokens);return typeof n?.access_token=="string"&&n.access_token?{tokens:n,path:Vq(e)}:{error:"credentials_missing"}}catch(n){return{error:n.code==="ENOENT"?"credentials_missing":"credentials_unreadable"}}}function dR(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.id_token===e.id_token&&t.account_id===e.account_id}async function Zq(t,e){let n=`${t}.lmctl-refresh.lock`,r=L_(n,"owner.json"),s=uR();for(;;){e.throwIfAborted();try{Gq(n,{mode:448});try{fR(r,JSON.stringify({pid:process.pid,token:s}),{mode:384})}catch(o){throw R_(n,{recursive:!0,force:!0}),o}return()=>{try{JSON.parse(N_(r,"utf8")).token===s&&R_(n,{recursive:!0,force:!0})}catch{}}}catch(o){if(o.code!=="EEXIST")throw o;let i=!1;try{let a=JSON.parse(N_(r,"utf8")).pid;if(Number.isInteger(a)&&a>0)try{process.kill(a,0)}catch(l){i=l.code==="ESRCH"}else i=Date.now()-cR(n).mtimeMs>6e4}catch{try{i=Date.now()-cR(n).mtimeMs>6e4}catch{continue}}if(i)throw new Error("refresh_lock_stale");await Yq(50,void 0,{signal:e})}}}async function pR(t,e){if(!t.path||typeof t.tokens?.refresh_token!="string"||!t.tokens.refresh_token)throw new Error("no_refresh_token");let n=await Zq(t.path,e);try{let r=x_(t.path),s=_a(r.tokens);if(!s||typeof s.access_token!="string")throw new Error("credentials_changed");if(!dR(s,t.tokens)&&typeof s.access_token=="string")return s;if(typeof s.refresh_token!="string"||!s.refresh_token)throw new Error("no_refresh_token");let o=await fetch(zq,{method:"POST",headers:{"Content-Type":"application/json"},signal:e,body:JSON.stringify({grant_type:"refresh_token",refresh_token:s.refresh_token,client_id:Qq})});if(!o.ok)throw new Error(`refresh_http_${o.status}`);let i=_a(await o.json());if(!i||typeof i.access_token!="string"||!/^\S+$/.test(i.access_token)||i.refresh_token!==void 0&&(typeof i.refresh_token!="string"||!/^\S+$/.test(i.refresh_token))||i.id_token!==void 0&&(typeof i.id_token!="string"||!/^\S+$/.test(i.id_token)))throw new Error("invalid_refresh_response");let a=x_(t.path),l=_a(a.tokens);if(!l||!dR(s,l)){if(l&&typeof l.access_token=="string")return l;throw new Error("credentials_changed")}let c={...l,access_token:i.access_token,...i.refresh_token===void 0?{}:{refresh_token:i.refresh_token},...i.id_token===void 0?{}:{id_token:i.id_token}},d={...a,tokens:c,last_refresh:new Date().toISOString()},u=`${t.path}.${uR()}.tmp`;try{fR(u,JSON.stringify(d),{flag:"wx",mode:384}),Jq(u,t.path)}finally{R_(u,{force:!0})}return c}finally{n()}}var zq,Qq,hR=x(()=>{"use strict";zq="https://auth.openai.com/oauth/token",Qq="app_EMoamEEZ73f0CkXaXp7hrann"});function Tn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function _R(t){let e=typeof t=="number"?t:Number(t);if(!Number.isFinite(e)||e<=0)return"unknown";let n=e/60;return n>=240&&n<=360?"five_hour":n>=9e3&&n<=11500?"weekly":n>=38e3&&n<=46e3?"monthly":"unknown"}function gR(t){return t==="five_hour"?"5h":t==="weekly"?"weekly":t==="monthly"?"monthly":"window"}function nG(t){if(Tn(t))return{has_credits:t.has_credits,unlimited:t.unlimited,balance:t.balance}}function rG(t){let e=[],n=Tn(t.rate_limit)?t.rate_limit:{},r=typeof n.allowed=="boolean"?n.allowed:void 0,s=typeof n.limit_reached=="boolean"?n.limit_reached:void 0;for(let i of["primary_window","secondary_window"]){let a=Tn(n[i])?n[i]:void 0;if(!a)continue;let l=_R(a.limit_window_seconds);e.push(At({bucket_id:`codex-${gR(l)}`,group_name:"codex",window_type:l,used_fraction:En(a.used_percent,"percent"),resets_at:a.reset_at,raw_value:a.used_percent,raw_scale:"used_percent",...r===void 0?{}:{allowed:r},...s===void 0?{}:{limit_reached:s}}))}let o=Array.isArray(t.additional_rate_limits)?t.additional_rate_limits:[];for(let i of o){if(!Tn(i))continue;let a=Tn(i.rate_limit)?i.rate_limit:{},l=typeof i.limit_name=="string"?i.limit_name:void 0,c=typeof i.metered_feature=="string"?i.metered_feature:void 0,d=c||l||"additional",u=typeof a.allowed=="boolean"?a.allowed:void 0,f=typeof a.limit_reached=="boolean"?a.limit_reached:void 0;for(let m of["primary_window","secondary_window"]){let p=Tn(a[m])?a[m]:void 0;if(!p)continue;let _=_R(p.limit_window_seconds);e.push(At({bucket_id:`${d}-${gR(_)}`,group_name:l||d,window_type:_,used_fraction:En(p.used_percent,"percent"),resets_at:p.reset_at,raw_value:p.used_percent,raw_scale:"used_percent",...l===void 0?{}:{limit_name:l},...c===void 0?{}:{metered_feature:c},...u===void 0?{}:{allowed:u},...f===void 0?{}:{limit_reached:f}}))}}return e.sort((i,a)=>String(i.group_name??"").localeCompare(String(a.group_name??""))||String(i.bucket_id).localeCompare(String(a.bucket_id)))}function sG(t){let e=Tn(t.rate_limit)?t.rate_limit:{},n=typeof e.allowed=="boolean"?e.allowed:void 0,r=Tn(t.spend_control)?t.spend_control:void 0,s=Tn(t.credits)?t.credits:void 0;return Ge("codex","ok",{source:"codex_http",account_id:t.account_id,plan_type:t.plan_type,...n===void 0?{}:{ordinary_usage_allowed:n},buckets:rG(t),...s?{credits:nG(s)}:{},...r?{spend_control:r}:{}})}async function yR(t){let{timeoutSeconds:e,env:n,debug:r,onRawResponse:s}=t,o=mR(n),i=o.tokens;if(!i||typeof i.access_token!="string")return Ge("codex","provider_unavailable",{source:"codex_http",reason:"credentials_missing",detail:`no access_token in ${C_(n)} (or $CODEX_ACCESS_TOKEN)`});let a=new AbortController,l=setTimeout(()=>a.abort(),Math.ceil(e*1e3)),c=i.access_token,d=new Set([i.access_token,i.refresh_token,i.id_token].filter(u=>typeof u=="string"&&!!u));try{let u=typeof i.account_id=="string"?i.account_id:void 0,f=typeof i.refresh_token=="string"?i.refresh_token:void 0,m=typeof i.id_token=="string"?i.id_token:void 0,p="",_=()=>[...d],h=(S,I)=>bo(Ge("codex",S,I),p,_()),g=!1,E=async()=>{if(!(g||!o.path||typeof i.refresh_token!="string"))try{let S=await pR({...o,tokens:{...i,refresh_token:f}},a.signal);typeof S.access_token=="string"&&(d.add(S.access_token),c=S.access_token),u=typeof S.account_id=="string"?S.account_id:u,typeof S.refresh_token=="string"&&(d.add(S.refresh_token),f=S.refresh_token),typeof S.id_token=="string"&&(d.add(S.id_token),m=S.id_token),g=!0;return}catch(S){let I=S instanceof Error&&/^(no_refresh_token|credentials_changed|invalid_refresh_response|refresh_lock_stale|refresh_http_\d+)$/.test(S.message)?S.message:"refresh_failed",b=I==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(I);return Ge("codex",b?"auth_expired":"provider_unavailable",{source:"codex_http",reason:b?"oauth_token_expired_or_invalid":"oauth_refresh_failed",detail:`Codex OAuth refresh failed (${I})${b?"; renew Codex login":"; try again later"}`})}},y=()=>{let S={Authorization:`Bearer ${c}`,"User-Agent":tG,"Content-Type":"application/json",Accept:"application/json"};u&&(S["ChatGPT-Account-Id"]=u);let I=(n.CODEX_BASE_URL||eG).replace(/\/$/,"");return fetch(`${I}/wham/usage`,{headers:S,signal:a.signal})},T=await y();if(p=await T.text(),Nt({debug:r,onRawResponse:s},"codex_http",p,_(),T.status),T.status===401&&o.path&&f){let S=await E();if(S)return S;T=await y(),p=await T.text(),Nt({debug:r,onRawResponse:s},"codex_http",p,_(),T.status)}if(T.status===401)return h("auth_expired",{source:"codex_http",reason:"oauth_token_expired_or_invalid",detail:"HTTP 401 from the codex usage endpoint"});if(T.status===429){let S=T.headers.get("retry-after"),I=S===null?void 0:Number.parseInt(S,10);return h("reader_throttled",{source:"codex_http",reason:"throttled",detail:"HTTP 429 from codex usage endpoint",...I!==void 0&&Number.isFinite(I)&&I>=0?{retry_after_seconds:I}:{}})}if(!T.ok)return h("provider_unavailable",{source:"codex_http",reason:`http_${T.status}`,detail:"codex usage endpoint returned an unexpected status"});let w;try{w=JSON.parse(p)}catch(S){return Ge("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:Io(String(S),d)})}return Tn(w)?sG(w):Ge("codex","provider_unavailable",{source:"codex_http",reason:"malformed_response",detail:"response was not an object"})}catch(u){let f=u instanceof Error?`${u.name}: ${u.message}`:String(u);return Ge("codex","provider_unavailable",{source:"codex_http",reason:"http_request_failed",detail:Io(f,d)})}finally{clearTimeout(l)}}var eG,tG,ER=x(()=>{"use strict";Hn();hR();Hn();eG="https://chatgpt.com/backend-api",tG="codex-cli"});import{createHash as oG,randomUUID as iG}from"node:crypto";import{readFileSync as IR,openSync as aG,fsyncSync as lG,closeSync as cG,mkdirSync as TR,writeFileSync as bR,renameSync as dG,rmSync as uG,rmdirSync as fG,statSync as O_,utimesSync as mG}from"node:fs";import{homedir as pG}from"node:os";import{basename as hG,dirname as _G,join as Dd}from"node:path";import{setTimeout as kR}from"node:timers/promises";function yG(t){let e;try{e=IR(t,"utf8")}catch(s){if(s.code==="ENOENT")return{};throw new Error("config_unreadable")}let n={},r="other";for(let s of e.split(/\r?\n/)){let o=/^\s*\[providers\.(?:"managed:kimi-code"|'managed:kimi-code')(\.oauth)?\]\s*(?:#.*)?$/.exec(s);if(o){r=o[1]?"oauth.":"";continue}if(/^\s*\[/.test(s)){if(s.includes("managed:kimi-code"))throw new Error("config_format_unsupported");r="other";continue}if(r==="other")continue;if(/^\s*oauth\s*=/.test(s))throw new Error("config_format_unsupported");let i=/^\s*(base_url|oauth_host|storage|key)\s*=\s*("(?:[^"\\]|\\.)*"|'[^']*')\s*(?:#.*)?$/.exec(s);if(!i&&/^\s*(base_url|oauth_host|storage|key)\s*=/.test(s))throw new Error("config_malformed");if(i)try{n[r+i[1]]=i[2].startsWith('"')?JSON.parse(i[2]):i[2].slice(1,-1)}catch{throw new Error("config_malformed")}}return n}function Md(t){let e;try{e=JSON.parse(IR(t,"utf8"))}catch(n){throw new Error(n.code==="ENOENT"?"credentials_missing":"credentials_malformed")}if(e&&typeof e=="object"&&e.access_token===""&&e.refresh_token==="")throw new Error("credentials_revoked");if(!e||typeof e!="object"||Array.isArray(e)||typeof e.access_token!="string"||!e.access_token.trim())throw new Error("credentials_malformed");return e}function AR(t){let e=t.KIMI_CODE_HOME??Dd(t.HOME??pG(),".kimi-code"),n=yG(t.KIMI_CODE_CONFIG_PATH??Dd(e,"config.toml")),r=t.KIMI_CODE_BASE_URL!==void 0||t.KIMI_CODE_OAUTH_HOST!==void 0||t.KIMI_OAUTH_HOST!==void 0,s=vR(t.KIMI_CODE_BASE_URL??n.base_url??wR),o=vR(t.KIMI_CODE_OAUTH_HOST??t.KIMI_OAUTH_HOST??(r?D_:n["oauth.oauth_host"]??D_)),i=s===wR&&o===D_?"kimi-code":`kimi-code-env-${oG("sha256").update(JSON.stringify({oauthHost:o,baseUrl:s})).digest("hex").slice(0,16)}`;if(!t.KIMI_CREDENTIALS_PATH&&!r&&n["oauth.key"]===`oauth/${i}`&&n["oauth.storage"]&&n["oauth.storage"]!=="file")throw new Error("credential_storage_unsupported");let a=t.KIMI_CREDENTIALS_PATH??Dd(e,"credentials",`${i}.json`),l=Md(a),c=a,d=hG(a,".json");return{home:e,path:c,lockTarget:Dd(e,"oauth",d),baseUrl:s,oauthHost:o,token:l}}function $d(t){if(typeof t.expires_at!="number")return!1;let e=typeof t.expires_in=="number"?t.expires_in:0;return t.expires_at-Date.now()/1e3<Math.max(300,e*.5)}function SR(t,e){return t.access_token===e.access_token&&t.refresh_token===e.refresh_token&&t.expires_at===e.expires_at&&t.expires_in===e.expires_in}async function EG(t,e){TR(_G(t),{recursive:!0}),bR(t,"",{flag:"a",mode:384});let n=`${t}.lock`;for(;;){if(e.aborted)throw new Error("refresh_locked");try{TR(n);break}catch(i){if(i.code!=="EEXIST")throw new Error("refresh_lock_failed");try{if(Date.now()-O_(n).mtimeMs>5e3)throw new Error("refresh_lock_stale")}catch(a){if(a.message==="refresh_lock_stale")throw a}try{await kR(50,void 0,{signal:e})}catch{throw new Error("refresh_locked")}}}let r=O_(n),s=()=>{let i;try{i=O_(n)}catch{throw new Error("refresh_lock_lost")}if(i.ino!==r.ino||i.dev!==r.dev)throw new Error("refresh_lock_lost")},o=setInterval(()=>{try{s();let i=new Date;mG(n,i,i)}catch{}},1e3);return o.unref(),{assertOwned:s,release(){clearInterval(o);try{s(),fG(n)}catch{}}}}async function NR(t,e){if(typeof t.token.refresh_token!="string"||!t.token.refresh_token)throw new Error("no_refresh_token");let n=await EG(t.lockTarget,e);try{let r=Md(t.path);if(!SR(r,t.token)&&!$d(r))return r;if(typeof r.refresh_token!="string"||!r.refresh_token)throw new Error("no_refresh_token");let s;for(let u=0;u<3;u++){try{if(s=await fetch(`${t.oauthHost}/api/oauth/token`,{method:"POST",signal:e,headers:{"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json","User-Agent":"lmctl"},body:new URLSearchParams({client_id:gG,grant_type:"refresh_token",refresh_token:r.refresh_token})}),![429,500,502,503,504].includes(s.status)||u===2)break;await s.body?.cancel()}catch{if(e.aborted||u===2)throw new Error("refresh_request_failed")}await kR(1e3*2**u,void 0,{signal:e})}if(!s)throw new Error("refresh_request_failed");if(!s.ok){try{let u=Md(t.path);if(u.refresh_token!==r.refresh_token)return u}catch{}throw new Error(`refresh_http_${s.status}`)}let o=await s.json(),i=Number(o?.expires_in);if(!o||typeof o.access_token!="string"||!/^\S+$/.test(o.access_token)||typeof o.refresh_token!="string"||!/^\S+$/.test(o.refresh_token)||!Number.isFinite(i)||i<=0)throw new Error("invalid_refresh_response");let a=Math.floor(Date.now()/1e3)+i;if(!Number.isSafeInteger(a))throw new Error("invalid_refresh_response");n.assertOwned();let l=Md(t.path);if(!SR(l,r)){if(!$d(l))return l;throw new Error("credentials_changed")}let c={...l,access_token:o.access_token,refresh_token:o.refresh_token,expires_at:a,expires_in:i,...typeof o.scope=="string"?{scope:o.scope}:{},...typeof o.token_type=="string"?{token_type:o.token_type}:{}},d=`${t.path}.${iG()}.tmp`;try{let u=aG(d,"wx",384);try{bR(u,JSON.stringify(c,null,2)+`
|
|
2644
|
+
`),lG(u)}finally{cG(u)}n.assertOwned(),dG(d,t.path)}finally{uG(d,{force:!0})}return c}finally{n.release()}}var wR,D_,gG,vR,RR=x(()=>{"use strict";wR="https://api.kimi.com/coding/v1",D_="https://auth.kimi.com",gG="17e5f671-d194-4dfb-9706-5516cb48c098",vR=t=>t.trim().replace(/\/+$/,"")});function LR(t){let e=i=>{if(typeof i!="number"&&typeof i!="string"||typeof i=="string"&&i.trim()==="")return;let a=Number(i);return Number.isFinite(a)&&a>=0?a:void 0},n=e(t.limit),r=e(t.used),s=e(t.remaining);if(n===void 0||n<=0||r===void 0&&(s===void 0||s>n))return;let o=r??n-s;return{used:o,limit:n,remaining:Math.max(0,n-o)}}async function xR({timeoutSeconds:t,env:e,debug:n,onRawResponse:r}){let s;try{s=AR(e)}catch(_){let h=_ instanceof Error&&/^(credentials_missing|credentials_malformed|credentials_revoked|config_unreadable|config_malformed|config_format_unsupported|credential_storage_unsupported)$/.test(_.message)?_.message:"credentials_unreadable";return ht("kimi",h==="credentials_revoked"?"auth_expired":"provider_unavailable",h,h==="credentials_revoked"?"Kimi login was revoked; run kimi login":h.replaceAll("_"," "),"kimi_http")}let o=s.token,i=new AbortController,a=setTimeout(()=>i.abort(),t*1e3),l,c;try{let _=!1,h=async()=>{o=await NR({...s,token:o},i.signal),_=!0};$d(o)&&await h();let g=()=>fetch(`${s.baseUrl}/usages`,{headers:{Authorization:`Bearer ${o.access_token}`,Accept:"application/json"},signal:i.signal});l=await g(),c=await l.text(),Nt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status),l.status===401&&!_&&o.refresh_token&&(await h(),l=await g(),c=await l.text(),Nt({debug:n,onRawResponse:r},"kimi_http",c,[o.access_token,o.refresh_token],l.status))}catch(_){let h=_ instanceof Error&&/^(no_refresh_token|credentials_changed|credentials_revoked|invalid_refresh_response|refresh_locked|refresh_lock_stale|refresh_lock_failed|refresh_lock_lost|refresh_request_failed|refresh_http_\d+)$/.test(_.message)?_.message:"request_failed",g=h==="credentials_revoked"||h==="no_refresh_token"||/^refresh_http_(400|401|403)$/.test(h),E=h==="refresh_lock_stale"?"Kimi refresh lock is stale; run the native Kimi CLI to recover its lock, or verify no refresh is active before removing the .lock directory":g?`Kimi credential renewal failed (${h}); run kimi login`:`Kimi quota request failed (${h})`;return ht("kimi",g?"auth_expired":"provider_unavailable",h,E,"kimi_http")}finally{clearTimeout(a)}let d=(_,h,g)=>bo(ht("kimi",_,h,h,"kimi_http",[],g),c,[o.access_token]);if(l.status===401)return d("auth_expired","HTTP 401 from Kimi usage endpoint");if(l.status===403)return d("not_applicable","HTTP 403 from Kimi usage endpoint");if(l.status===429){let _=XN(l.headers);return d("reader_throttled","HTTP 429 from Kimi usage endpoint",_)}if(l.status!==200)return d("provider_unavailable",`HTTP ${l.status} from Kimi usage endpoint`);let u;try{u=JSON.parse(c)}catch{return ht("kimi","provider_unavailable","malformed_response","SyntaxError: malformed JSON")}if(!u||typeof u!="object")return ht("kimi","provider_unavailable","malformed_response","response was not an object");let f=[],m=new Set;function p(_){let h=String(_.bucket_id),g=h,E=2;for(;m.has(h);)h=`${g}-${E}`,E++;m.add(h),_.bucket_id=h,f.push(At(_))}if(Array.isArray(u.limits))for(let _ of u.limits){if(!_||typeof _!="object")continue;let h=_.window,g=_.detail;if(!h||typeof h!="object"||!g||typeof g!="object")continue;let E=0;if(h.timeUnit==="TIME_UNIT_MINUTE")E=Number(h.duration);else if(h.timeUnit==="TIME_UNIT_HOUR")E=Number(h.duration)*60;else if(h.timeUnit==="TIME_UNIT_DAY")E=Number(h.duration)*1440;else if(h.timeUnit==="TIME_UNIT_WEEK")E=Number(h.duration)*10080;else if(h.timeUnit==="TIME_UNIT_MONTH")E=Number(h.duration)*43200;else continue;let y=HN(E),T="window";y==="five_hour"&&(T="5h"),y==="weekly"&&(T="weekly"),y==="monthly"&&(T="monthly");let w=LR(g);if(!w)continue;let{used:S,limit:I,remaining:b}=w;p({bucket_id:`kimi-${T}`,window_type:y,used_fraction:at(S/I),remaining_fraction:at(b/I),resets_at_iso:g.resetTime,raw_value:S,raw_scale:"count"})}if(u.usage&&typeof u.usage=="object"){let _=LR(u.usage);_&&p({bucket_id:"kimi-weekly",window_type:"weekly",used_fraction:at(_.used/_.limit),remaining_fraction:at(_.remaining/_.limit),resets_at_iso:u.usage.resetTime,raw_value:_.used,raw_scale:"count"})}if(u.usages&&typeof u.usages=="object"){let _=[{key:"limit_5h",id:"kimi-5h",type:"five_hour"},{key:"limit_7d",id:"kimi-weekly",type:"weekly"},{key:"limit_month_total",id:"kimi-monthly",type:"monthly"},{key:"limit_month_code",id:"kimi-monthly-code",type:"monthly"}];for(let{key:h,id:g,type:E}of _){let y=u.usages[h];if(!y||typeof y!="object"||y.used_ratio==null||y.used_ratio===""||typeof y.used_ratio=="boolean")continue;let T=Number(y.used_ratio);!Number.isFinite(T)||T<0||m.has(g)||(m.add(g),f.push(At({bucket_id:g,window_type:E,used_fraction:at(T),resets_at_iso:typeof y.reset_time=="string"&&y.reset_time?y.reset_time:null,raw_value:T,raw_scale:"ratio"})))}}return Ge("kimi","ok",{source:"kimi_http",buckets:f})}var CR=x(()=>{"use strict";Hn();RR();Hn()});async function OR(t={}){let e=t.targets??t.providers??["all"];if(!Array.isArray(e)||e.length===0||e.some(d=>typeof d!="string"))return{status:"error",error:"providers must be a non-empty list of provider names",readings:[]};for(let d of e)if(!Pd.includes(d))return{status:"error",error:`unknown provider: ${d} (valid targets: ${Pd.join(", ")})`,readings:[]};let n=t.timeoutSeconds??TG;if(!Number.isFinite(n)||n<=0)return{status:"error",error:"timeoutSeconds must be a positive finite number",readings:[]};let r=t.env??process.env,s=new Set(e.includes("all")?["codex","agy","claude","kimi"]:e);t.progress?.(`querying ${e.join(" ")} live (timeout ${n}s per provider) ...`);let i=Object.entries({codex:yR,agy:JN,claude:aR,kimi:xR}).filter(([d])=>s.has(d)).map(async([,d])=>{let u=[],f=await d({timeoutSeconds:n,env:r,...t.debug?{debug:t.debug}:{},...t.includeRaw?{onRawResponse:p=>u.push(p)}:{}}),m=t.includeRaw?{...f,raw_responses:u}:f;return m&&t.onReading?.(m),m}),a=await Promise.allSettled(i),l=a.find(d=>d.status==="rejected");return l?{status:"error",error:String(l.reason),readings:[]}:{status:"ok",readings:a.filter(d=>d.status==="fulfilled").map(d=>d.value).filter(Boolean)}}var Pd,TG,DR=x(()=>{"use strict";KN();lR();ER();CR();Pd=["all","codex","agy","claude","kimi"],TG=15});var UR={};me(UR,{runRatelimit:()=>AG});function M_(t){return typeof t=="object"&&t!==null}function wG(t){return(0,We.formatPercent)(typeof t=="number"?t:null)}function vG(t,e){let n=typeof e.bucket_id=="string"&&e.bucket_id!==""?e.bucket_id:"unknown-bucket";return n==="session"?n="5h":n==="week-all-models"?n="weekly":n.startsWith("week-scoped-")&&(n=`weekly-${n.slice(12)}`),t!==""&&!n.startsWith(`${t}-`)&&(n=`${t}-${n}`),(0,We.escapeCell)(n)}function IG(t,e){let n="unknown",r=null,s,o=null;if(typeof e.resets_at_iso=="string"&&e.resets_at_iso!==""){let c=Date.parse(e.resets_at_iso);o=Number.isFinite(c)?c-Date.now():null,o!==null&&(Math.abs(o)<1e3?n="now":o>0?n=`in ${(0,We.formatDuration)(o,{maxUnit:"d",style:"compact"})}`:n=`${(0,We.formatDuration)(-o,{maxUnit:"d",style:"compact"})} ago`,s=SG[typeof e.window_type=="string"?e.window_type:""],s!==void 0&&(r=Math.min(1,Math.max(0,1-o/s))))}r!==null&&(n=`${(0,We.formatBar)(r)} ${n}`);let i="";if(r!==null&&r>0&&s!==void 0&&o!==null&&typeof e.used_fraction=="number"&&Number.isFinite(e.used_fraction)){let c=e.used_fraction;if(c<=r){let d=Math.max(0,1-c/r);i=`unused +${(0,We.formatPercent)(d)}`}else{let d=r*s,u=d>0?(1-c)/c*d:0,f=Math.max(0,o-u);i=`needing -${(0,We.formatDuration)(f,{maxUnit:"d",style:"compact"})}`}}let a=[];e.is_exhausted===!0&&a.push("[EXHAUSTED]"),e.allowed===!1&&a.push("allowed=false"),e.limit_reached===!0&&a.push("limit_reached");let l=[vG(t,e),`${(0,We.formatBar)(typeof e.used_fraction=="number"?e.used_fraction:null)} ${wG(e.used_fraction)}`,n];return i!==""&&l.push(i),a.length>0&&l.push(a.join(" ")),l}function bG(t){let e=typeof t.provider=="string"&&t.provider!==""?t.provider:"unknown",n=typeof t.status=="string"?t.status:"unknown",r=typeof t.source=="string"&&t.source!==""?t.source:"unknown source",s=typeof t.reason=="string"?t.reason:"",o=`${e}: ${n} (${r})`;n!=="ok"&&typeof t.provider_message=="string"&&t.provider_message.trim()?o=`${e}: ${(0,We.escapeCell)(t.provider_message)} (${r})`:n==="auth_expired"?(o=`${e}: unavailable (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n==="provider_unavailable"&&PR.has(s)?(o=`${e}: not installed/configured (${r})`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`)):n!=="ok"&&(o+=` -- ${s!==""?s:"no reason given"}`,typeof t.detail=="string"&&t.detail!==""&&(o+=` -- ${t.detail}`),n==="provider_unavailable"&&s!=="oauth_refresh_failed"&&!/^(credentials_|config_|credential_storage_|refresh_)/.test(s)&&(o+=` (${e} server-side, not lmctl \u2014 try again later)`));let i=typeof t.plan_type=="string"?t.plan_type.trim():"";i&&!["?","unknown","null","n/a"].includes(i.toLowerCase())&&(o+=` (${(0,We.escapeCell)(i)})`);let a=typeof t.provider=="string"?t.provider:"",l=Array.isArray(t.buckets)?t.buckets.filter(M_).map(d=>IG(a,d)):[],c=[];if(M_(t.credits)){let d=t.credits,u=[];typeof d.has_credits=="boolean"&&u.push(`has_credits=${d.has_credits}`),d.unlimited===!0&&u.push("unlimited"),d.balance!==void 0&&d.balance!==null&&u.push(`balance=${String(d.balance)}`),c.push(` credits: ${u.length>0?u.join(" "):"present"}`)}if(M_(t.spend_control)){let d=t.spend_control,u=` spend control: reached=${d.reached===!0}`;d.used_usd!==void 0&&d.used_usd!==null&&(u+=` used=$${String(d.used_usd)}`),d.limit_usd!==void 0&&d.limit_usd!==null&&(u+=` limit=$${String(d.limit_usd)}`),d.individual_limit!==void 0&&d.individual_limit!==null&&(u+=` individual_limit=${String(d.individual_limit)}`),c.push(u)}return{head:o,bucketRows:l,footers:c}}function kG(t){let e=bG(t),n=[e.head];if(e.bucketRows.length>0){let r=["LIMIT","USED","RESET TIME","OVERSTOCK"],s=(0,We.measureColumns)([{rows:[],headers:r},e.bucketRows]);n.push((0,We.renderGrid)(e.bucketRows,{widths:s,margin:2,align:["left","left","left"],headers:r}))}return n.push(...e.footers),n.join(`
|
|
2642
2645
|
`)}function $_(t,e){return t.stderr.write(`error: ${e}
|
|
2643
2646
|
${$R}
|
|
2644
|
-
`),2}async function
|
|
2647
|
+
`),2}async function AG(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${$R}
|
|
2645
2648
|
`),0;let n=ae(t,["--timeout"],["--json"]);if(n.error!==void 0)return $_(e,n.error);let r=z(n,"--json");for(let f of n.positionals)if(!MR.includes(f))return $_(e,`unknown provider: ${f} (valid targets: ${MR.join(", ")})`);let s=n.positionals.length>0?n.positionals:["all"],o=15,i=V(n,"--timeout");if(i!==void 0){let f=Number(i);if(!Number.isFinite(f)||f<=0)return $_(e,`invalid --timeout "${i}" (expected a positive number of seconds)`);o=f}let a=new Set(n.positionals),l=0,c=f=>{let m=typeof f.status=="string"?f.status:"",p=typeof f.reason=="string"?f.reason:"";m==="provider_unavailable"&&PR.has(p)&&!a.has(typeof f.provider=="string"?f.provider:"")||(l>0&&e.stdout.write(`
|
|
2646
|
-
`),e.stdout.write(`${
|
|
2649
|
+
`),e.stdout.write(`${kG(f)}
|
|
2647
2650
|
`),l+=1)},d=await OR({targets:s,timeoutSeconds:o,includeRaw:r,env:e.env??process.env,progress:f=>e.stderr.write(`${f}
|
|
2648
2651
|
`),...r?{}:{onReading:c},...ci()||e.env?.LMCTL_DEBUG==="1"?{debug:f=>e.stderr.write(`${f}
|
|
2649
2652
|
`)}:{}});if(d.status==="error")return e.stderr.write(`error: ${d.error}
|
|
2650
2653
|
`),1;let u=d.readings;return r?(te(e,{readings:u}),0):(l===0&&e.stdout.write(`rate-limit: no readings returned.
|
|
2651
|
-
`),0)}var We,$R,PR,MR,
|
|
2652
|
-
`),PR=new Set(["agy_not_found","credentials_missing"]),MR=Pd;
|
|
2654
|
+
`),0)}var We,$R,PR,MR,SG,FR=x(()=>{"use strict";re();We=Ft(Ct(),1);le();DR();$R=["usage: lmctl ratelimit [provider ...] [--json] [--debug] [--timeout <seconds>]",""," Queries provider subscription rate limits in REAL TIME via the TypeScript"," provider readers -- stateless: nothing is read from or written to any"," database.",""," Providers: all (default), codex, agy, claude, kimi. Multiple allowed.",""," --debug Print raw quota responses to stderr before parsing."," Credentials are redacted; JSON stdout stays clean."," --timeout <seconds> Per-provider reader timeout (default 15).",' --json Emit {"readings": [...]} in the lmratelimit-v1 schema'," with every raw field preserved verbatim -- the same"," shape lmbee's collector parses. raw_responses carries"," source, HTTP status and original response text"," (credentials redacted). Unknown future"," fields pass through.","",' Prints a "querying ..." note on stderr before the readers run.'].join(`
|
|
2655
|
+
`),PR=new Set(["agy_not_found","credentials_missing"]),MR=Pd;SG={five_hour:5*36e5,daily:864e5,weekly:7*864e5,monthly:30*864e5}});le();Nn();import{pathToFileURL as NG}from"node:url";import{execFileSync as kD}from"node:child_process";import{readFileSync as AD}from"node:fs";import{join as ND}from"node:path";import{fileURLToPath as RD}from"node:url";function tT(){return RD(new URL("../..",import.meta.url))}function qu(t=tT()){try{let e=JSON.parse(AD(ND(t,"package.json"),"utf8"));if(typeof e.version=="string")return e.version}catch{}return"0.0.0"}function oi(t,e){try{return kD("git",e,{cwd:t,stdio:["ignore","pipe","ignore"],timeout:2e3}).toString().trim()}catch{return}}function ii(t=tT()){let e=qu(t);if(oi(t,["rev-parse","--is-inside-work-tree"])!=="true"||oi(t,["ls-files","--error-unmatch","--","package.json"])===void 0)return e;let n=oi(t,["rev-parse","--short","HEAD"]);if(n===void 0)return e;let r=oi(t,["describe","--tags","--exact-match","HEAD"]),s=oi(t,["status","--porcelain"]),o=s!==void 0&&s.length>0;return r===`v${e}`&&!o?e:`${e}+${n}${o?".dirty":""}`}re();import{mkdirSync as dM,readFileSync as uM,renameSync as fM,writeFileSync as mM}from"node:fs";import{homedir as pM}from"node:os";import{dirname as hM,join as _M}from"node:path";function fT(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function lM(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function cM(t,e){return!lM(t)||fT(t)?null:`${e} must use https://: ${t}`}async function mT(t,e){let n=cM(t,e.description);if(n!==null||!fT(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),r);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw uT(t,e.description,r,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw uT(t,e.description,r,a)}}finally{clearTimeout(o)}}function uT(t,e,n,r){let o=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var gM="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",yM=60*60*1e3,EM=1500;function TM(){let t=process.env.HOME??pM();return _M(t,".lmctl",".update-check.json")}function wM(t){return t.isTTY===!0}function vM(t,e){let n=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(t),s=n(e);if(r===null||s===null)return 0;for(let o=0;o<3;o+=1){if(r[o]>s[o])return 1;if(r[o]<s[o])return-1}return 0}function Yu(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!wM(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function SM(t,e){try{let n=JSON.parse(uM(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<yM)return n.latest}catch{}return null}function IM(t,e){dM(hM(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;mM(n,`${JSON.stringify(e)}
|
|
2653
2656
|
`,"utf8"),fM(n,t)}async function bM(){let t=await mT(gM,{description:"lmctl npm metadata",timeoutMs:EM}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function pT(t,e=[],n={}){try{if(Yu(e,t)||(n.displayVersion?.()??ii()).includes("+"))return;let r=n.now?.()??Date.now(),s=n.cachePath??TM();if(SM(s,r)!==null)return;let i=await(n.fetchLatest??bM)();try{IM(s,{checkedAt:r,latest:i})}catch{return}let a=n.currentVersion?.()??qu();vM(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2654
2657
|
`)}catch{}}za();var ko=`usage: lmctl [--db PATH] [--debug] [--non-interactive] <command|target> [args]
|
|
2655
2658
|
`,P_=`${ko}
|
|
@@ -2709,7 +2712,7 @@ Global flags:
|
|
|
2709
2712
|
ratelimit also prints raw quota responses to stderr.
|
|
2710
2713
|
|
|
2711
2714
|
Run 'lmctl help <command>' for command-specific help.
|
|
2712
|
-
`,jR=new Set(["init","quickrun","hello","prompt","chat","batch","script","mcp","terminal","tail","export","cost","usage","ls","lint","seed","plan","status","running","ratelimit","models","prices","db"]),
|
|
2715
|
+
`,jR=new Set(["init","quickrun","hello","prompt","chat","batch","script","mcp","terminal","tail","export","cost","usage","ls","lint","seed","plan","status","running","ratelimit","models","prices","db"]),RG=new Set(["send","recv","loop","notify_me","exec","check","push","wait","workflow","run","project","intake","monitor","code","workspace","recover","refresh","hire","clone","team","health","session","session-index","restore","restore-teamfile","diagnose","diagnose-prompt","serve","api","device","mail","model"]);function HR(t,e){return t.stderr.write(`error: ${e}
|
|
2713
2716
|
${ko}Run 'lmctl help' for usage.
|
|
2714
2717
|
`),2}function BR(t,e){return e==="send"?(t.stderr.write(`error: unknown command: send (use lmctl prompt)
|
|
2715
2718
|
${ko}Run 'lmctl help' for usage.
|
|
@@ -2719,21 +2722,21 @@ ${ko}Run 'lmctl help' for usage.
|
|
|
2719
2722
|
${ko}Run 'lmctl help' for usage.
|
|
2720
2723
|
`),1):(t.stderr.write(`error: unknown command: ${e}
|
|
2721
2724
|
${ko}Run 'lmctl help' for usage.
|
|
2722
|
-
`),1)}async function
|
|
2723
|
-
`),0;if(c==="--help"||c==="-h"||c===void 0)return e.stdout.write(P_),0;if(c==="help"){let[m,...p]=n.slice(1);return m===void 0||m==="--help"||m==="-h"?(e.stdout.write(P_),0):jR.has(m)?WR(m,[...p,"--help"],e):BR(e,m)}Xu(Je(),e.stderr);let[d,...u]=n;if(d===void 0)return e.stdout.write(P_),0;let f=Date.now();U_(d,u,{phase:"start",started_at:new Date(f).toISOString()});try{let m=await WR(d,u,e);return U_(d,u,{phase:"finish",outcome:m===0?"ok":"error",exit_code:m,duration_ms:Date.now()-f}),jR.has(d)&&!Yu(n,e)&&await pT(e,n),m}catch(m){let p=m instanceof Error?m:new Error(String(m));return U_(d,u,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-f,error_class:p.name,error_message:p.message,error_stack:p.stack??null,causes:
|
|
2725
|
+
`),1)}async function LG(t,e={stdout:process.stdout,stderr:process.stderr}){let n=cT();try{return await xG(t,e)}finally{dT(n)}}async function xG(t,e={stdout:process.stdout,stderr:process.stderr}){let n=[],r,s=!1,o=0;for(;o<t.length;o+=1){let m=t[o];if(m==="--db"){let p=t[++o];if(p===void 0||p.startsWith("--"))return HR(e,"missing value for --db");r=p;continue}if(m==="--non-interactive"){s=!0;continue}if(m==="--debug"){Ku();continue}if(m==="--allow-schema-skew"){process.env.LMCTL_ALLOW_SCHEMA_SKEW="1";continue}break}n.push(...t.slice(o));let i=n[0]??"",a=i==="script"||i==="quickrun";if(!/\.lms$/i.test(i))for(let m=1;m<n.length;m+=1){let p=n[m];if(p==="--")break;if(p==="--debug")Ku(),n.splice(m--,1);else{if(a&&(!p.startsWith("-")||p==="-"||p==="-e"))break;(p==="-p"||p==="--prompt-file")&&(m+=1)}}let l=new Set(["status","running","models","prices","ratelimit","prompt","chat","batch","terminal","tail","export","cost","usage","ls","plan","lint","db"]);r!==void 0&&(process.env.LMCTL_DB=r),ci()&&(e={...e,env:{...e.env??process.env,LMCTL_DEBUG:"1",...r===void 0?{}:{LMCTL_DB:r}}}),(s||l.has(n[0]??"")&&n.slice(1).includes("--json"))&&(e=sl(r===void 0?e:{...e,env:{...e.env??process.env,LMCTL_DB:r}}));let c=n[0];if(c==="--version"||c==="-v"||c==="-V")return e.stdout.write(`lmctl ${ii()}
|
|
2726
|
+
`),0;if(c==="--help"||c==="-h"||c===void 0)return e.stdout.write(P_),0;if(c==="help"){let[m,...p]=n.slice(1);return m===void 0||m==="--help"||m==="-h"?(e.stdout.write(P_),0):jR.has(m)?WR(m,[...p,"--help"],e):BR(e,m)}Xu(Je(),e.stderr);let[d,...u]=n;if(d===void 0)return e.stdout.write(P_),0;let f=Date.now();U_(d,u,{phase:"start",started_at:new Date(f).toISOString()});try{let m=await WR(d,u,e);return U_(d,u,{phase:"finish",outcome:m===0?"ok":"error",exit_code:m,duration_ms:Date.now()-f}),jR.has(d)&&!Yu(n,e)&&await pT(e,n),m}catch(m){let p=m instanceof Error?m:new Error(String(m));return U_(d,u,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-f,error_class:p.name,error_message:p.message,error_stack:p.stack??null,causes:OG(p)}),CG(m,d,u,e)}}function U_(t,e,n){He({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:Je(),lmctl_version:ii(),node_version:process.version,...n})}function CG(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return s instanceof jt&&n.includes("--json")?(r.stdout.write(`${JSON.stringify({error:s.message,schema_skew:{db_version:s.dbVersion,build_version:s.buildVersion,mode:"refused"}},null,2)}
|
|
2724
2727
|
`),1):(r.stderr.write(`error: ${s.message}
|
|
2725
2728
|
`),s instanceof jt?1:ci()?(r.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
|
|
2726
2729
|
`),1):(r.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
|
|
2727
|
-
`),1))}function
|
|
2728
|
-
`);let{runChat:r}=await Promise.resolve().then(()=>(nd(),Th));return r(e,n)}case"mcp":{let{runMcp:r}=await Promise.resolve().then(()=>(Dk(),Ok));return r(e,n)}case"tail":{let{runTail:r}=await Promise.resolve().then(()=>(Vk(),Gk));return r(e,n)}case"export":{let{runExport:r}=await Promise.resolve().then(()=>(zk(),Yk));return r(e,n)}case"usage":{let{runUsage:r}=await Promise.resolve().then(()=>(oA(),sA));return r(e,n)}case"cost":{let{runCost:r}=await Promise.resolve().then(()=>(cA(),lA));return r(e,n)}case"ls":{let{runLs:r}=await Promise.resolve().then(()=>(pA(),mA));return r(e,n)}case"lint":{let{runLint:r}=await Promise.resolve().then(()=>(_n(),ch));return r(e,n)}case"seed":{let{runSeed:r}=await Promise.resolve().then(()=>(_n(),ch)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(fd(),ud));return s(n,"seed",e,o=>r(o,n))}case"plan":{let{runPlan:r}=await Promise.resolve().then(()=>(ua(),Ik)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(fd(),ud));return s(n,"plan",e,o=>r(o,n),{ownsForce:!0,extension:".txt"})}case"init":{let{runInit:r}=await Promise.resolve().then(()=>(EA(),yA));return r(e,n)}case"quickrun":{let{runQuickrun:r}=await Promise.resolve().then(()=>(UA(),PA));return r(e,n)}case"hello":{let{runHello:r}=await Promise.resolve().then(()=>(GA(),qA));return r(e,n)}case"terminal":{let{runTerminal:r}=await Promise.resolve().then(()=>(Zh(),CA));return r(e,n)}case"status":{let{runStatus:r}=await Promise.resolve().then(()=>(u_(),lN));return r(e,n)}case"running":{let{runRunning:r}=await Promise.resolve().then(()=>(MN(),DN));return r(e,n)}case"models":{let{runModels:r}=await Promise.resolve().then(()=>(Fc(),qI));return r(e,n)}case"prices":{let{runPrices:r}=await Promise.resolve().then(()=>(FN(),UN));return r(e,n)}case"ratelimit":{let{runRatelimit:r}=await Promise.resolve().then(()=>(FR(),UR));return r(e,n)}case"db":return
|
|
2730
|
+
`),1))}function OG(t){let e=[],n=t.cause,r=0;for(;n!=null&&r<8;){let s=n instanceof Error?n:new Error(String(n));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),n=s.cause,r+=1}return e}async function WR(t,e,n){switch(t){case"batch":{let{runBatch:r}=await Promise.resolve().then(()=>(Ph(),fk));return r(e,n)}case"script":{let{runScript:r}=await Promise.resolve().then(()=>(Ih(),Yb));return r(e,n)}case"prompt":{let{runChat:r}=await Promise.resolve().then(()=>(nd(),Th)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(fd(),ud));return s(n,"prompt",e,o=>r(o,n))}case"chat":{process.stderr.write(`warning: 'lmctl chat' is being phased out -- use 'lmctl prompt' (same behaviour; a prompt is answered, it is not a conversation)
|
|
2731
|
+
`);let{runChat:r}=await Promise.resolve().then(()=>(nd(),Th));return r(e,n)}case"mcp":{let{runMcp:r}=await Promise.resolve().then(()=>(Dk(),Ok));return r(e,n)}case"tail":{let{runTail:r}=await Promise.resolve().then(()=>(Vk(),Gk));return r(e,n)}case"export":{let{runExport:r}=await Promise.resolve().then(()=>(zk(),Yk));return r(e,n)}case"usage":{let{runUsage:r}=await Promise.resolve().then(()=>(oA(),sA));return r(e,n)}case"cost":{let{runCost:r}=await Promise.resolve().then(()=>(cA(),lA));return r(e,n)}case"ls":{let{runLs:r}=await Promise.resolve().then(()=>(pA(),mA));return r(e,n)}case"lint":{let{runLint:r}=await Promise.resolve().then(()=>(_n(),ch));return r(e,n)}case"seed":{let{runSeed:r}=await Promise.resolve().then(()=>(_n(),ch)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(fd(),ud));return s(n,"seed",e,o=>r(o,n))}case"plan":{let{runPlan:r}=await Promise.resolve().then(()=>(ua(),Ik)),{runWithSaveScript:s}=await Promise.resolve().then(()=>(fd(),ud));return s(n,"plan",e,o=>r(o,n),{ownsForce:!0,extension:".txt"})}case"init":{let{runInit:r}=await Promise.resolve().then(()=>(EA(),yA));return r(e,n)}case"quickrun":{let{runQuickrun:r}=await Promise.resolve().then(()=>(UA(),PA));return r(e,n)}case"hello":{let{runHello:r}=await Promise.resolve().then(()=>(GA(),qA));return r(e,n)}case"terminal":{let{runTerminal:r}=await Promise.resolve().then(()=>(Zh(),CA));return r(e,n)}case"status":{let{runStatus:r}=await Promise.resolve().then(()=>(u_(),lN));return r(e,n)}case"running":{let{runRunning:r}=await Promise.resolve().then(()=>(MN(),DN));return r(e,n)}case"models":{let{runModels:r}=await Promise.resolve().then(()=>(Fc(),qI));return r(e,n)}case"prices":{let{runPrices:r}=await Promise.resolve().then(()=>(FN(),UN));return r(e,n)}case"ratelimit":{let{runRatelimit:r}=await Promise.resolve().then(()=>(FR(),UR));return r(e,n)}case"db":return DG(e,n);default:if(t==="model")return HR(n,"command 'model' is retired; use 'models'");if(!RG.has(t)){let{runInferred:r}=await Promise.resolve().then(()=>(Mh(),Dh)),s=await r([t,...e],n);if(s!==null)return s}return BR(n,t)}}async function DG(t,e){let[n,...r]=t;return n==="--help"||n==="-h"||n==="help"?(e.stdout.write(`usage: lmctl db <subcommand>
|
|
2729
2732
|
|
|
2730
2733
|
backfill-events Replay the legacy tables into the event-log
|
|
2731
2734
|
(with --db <copy>) substrate and rebuild projections. Idempotent;
|
|
2732
2735
|
run against a COPY of the DB, never the live file.
|
|
2733
|
-
`),0):n==="backfill-events"?
|
|
2734
|
-
`),1)}async function
|
|
2736
|
+
`),0):n==="backfill-events"?MG(r,e):(e.stderr.write(`usage: lmctl db <subcommand> (backfill-events)
|
|
2737
|
+
`),1)}async function MG(t,e){let{resolveDbPath:n}=await Promise.resolve().then(()=>(Nn(),YE)),r=n();if(!((process.env.LMCTL_DB??"").length>0)&&!t.includes("--allow-live"))return e.stderr.write(`refusing to backfill the default live DB.
|
|
2735
2738
|
resolved target: ${r}
|
|
2736
2739
|
run against a COPY: cp <state.db> copy.db && lmctl --db copy.db db backfill-events
|
|
2737
2740
|
(or pass --allow-live to target the resolved DB deliberately).
|
|
2738
2741
|
`),1;let{migrate:o}=await Promise.resolve().then(()=>(za(),Zy)),{backfillEventLog:i}=await Promise.resolve().then(()=>(Ru(),Xy)),a=o({dbPath:r});try{let l=i(a);return e.stdout.write(`${JSON.stringify(l,null,2)}
|
|
2739
|
-
`),0}finally{a.close()}}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2742
|
+
`),0}finally{a.close()}}if(process.argv[1]!==void 0&&import.meta.url===NG(process.argv[1]).href){let t=await LG(process.argv.slice(2));process.exitCode=t}export{jR as COMMANDS,LG as runCli};
|