@lmctl-ai/lmctl 0.2.354 → 0.2.356
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 +24 -23
- package/dist/cli/lmscript.js +2 -2
- package/dist/lmbee.js +3 -3
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -8,12 +8,12 @@ var iR=Object.create;var Jd=Object.defineProperty;var aR=Object.getOwnPropertyDe
|
|
|
8
8
|
`)){let o=s.replace(/\r$/,""),i=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(o);if(i){r(),n={path:i[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(o);if(a){n&&(n.path=a[1].trim());continue}if(o.startsWith("*** ")){r();continue}n&&o.startsWith("+")&&(n.bytes+=Buffer.byteLength(o.slice(1),"utf8")+1)}return r(),[...e].map(([s,o])=>({path:s,bytes:o}))}function iL(t){if(typeof t!="string"||t.length===0)return null;try{let e=new URL(t);return e.protocol!=="http:"&&e.protocol!=="https:"?null:`${e.origin}${e.pathname}`}catch{return null}}function aL(t,e=!1){let n=B(t);if(!n)return{...ut};let r=n.input===void 0?e?null:0:K(n.input),s=n.output===void 0?e?null:0:K(n.output),o=n.reasoning===void 0?e?null:0:K(n.reasoning),i=B(n.cache),a=i?.read===void 0?e?null:0:K(i.read),l=i?.write===void 0?e?null:0:K(i.write);return e&&r===0&&s===0&&o===0&&a===0&&l===0?{...ut}:e?{input_uncached:r!==null&&l!==null&&Number.isSafeInteger(r+l)?r+l:null,input_cached:a,input_cache_write:l,output:s!==null&&o!==null&&Number.isSafeInteger(s+o)?s+o:null}:r===null||s===null||o===null||a===null||l===null?{...ut}:r+s+o+a+l===0?{...ut}:{input_uncached:r+l,input_cached:a,input_cache_write:l,output:s+o}}function Fg(t,e,n){oe(n);let r=n.maxRows*20,s=t.prepare("SELECT (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM message WHERE session_id=?) + (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM part WHERE session_id=?) AS total").get(e,e),o=K(s?.total);if(o===null||o>n.maxBytes)return null;let i=t.prepare("SELECT id,time_created,time_updated,data FROM message WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1),a=t.prepare("SELECT id,message_id,time_created,time_updated,data FROM part WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1);if(i.length+a.length>r)return null;let l=0,c=Jx("sha256");for(let d of[...i,...a]){n.signal.throwIfAborted();let u=JSON.stringify(d);if(l+=Buffer.byteLength(u),l>n.maxBytes)return null;c.update(u).update(`
|
|
9
9
|
`)}return{revision:`${Uo}:sha256:${c.digest("hex")}`,messages:i,parts:a}}function lL(t){let e=0,n=!1,r=!1;for(let s of t){let o;try{o=B(JSON.parse(s.data))}catch{continue}let i=typeof o?.type=="string"?o.type:"";o?.synthetic===!0||o?.ignored===!0||(i==="text"&&typeof o.text=="string"?(e+=Buffer.byteLength(o.text,"utf8"),n=!0):i&&!nL.has(i)&&(r=!0))}return n?e:r?"unknown":null}function cL(t,e,n,r){let s=new Map;for(let c of n.parts){let d=s.get(c.message_id)??[];d.push(c),s.set(c.message_id,d)}let o=new Map;for(let c of n.messages){let d;try{d=B(JSON.parse(c.data))}catch{continue}if(d?.role!=="user")continue;let u=lL(s.get(c.id)??[]);u==="unknown"?o.set(c.id,null):u!==null&&o.set(c.id,u)}let i=new Map,a=new Set;for(let c of n.messages){let d;try{d=B(JSON.parse(c.data))}catch{continue}if(d?.role!=="assistant")continue;let u=typeof d.parentID=="string"?d.parentID:null;u!==null&&o.has(u)&&!a.has(u)&&(a.add(u),i.set(c.id,{id:u,bytes:o.get(u)}))}let l=[];for(let c of n.messages){r.signal.throwIfAborted();let d;try{d=B(JSON.parse(c.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&d&&Object.hasOwn(d,"tokens")&&d.role!=="assistant")return{status:"partial"};if(!d||d.role!=="assistant")continue;let u=new yt,f=new Et,m=0,p=i.get(c.id);p&&f.record({direction:"read",kind:"prompt",id:p.id,ref:null,bytes:p.bytes,basis:p.bytes===null?"unknown":"input_text"});for(let b of s.get(c.id)??[]){let k;try{k=B(JSON.parse(b.data))}catch{return{status:"partial"}}if(k?.type!=="tool")continue;let N=typeof k.tool=="string"?k.tool.toLowerCase():"",O=rL(k.tool),I=B(k.state),v=B(I?.input),A=typeof k.callID=="string"&&k.callID?k.callID:typeof I?.callID=="string"&&I.callID?I.callID:b.id;if(O==="written")u.record(A,"written",Ug(v),sL(v));else if(O==="apply_patch"){let R=v?.patchText;if(typeof R=="string")for(let x of oL(R))u.record(A,"written",x.path,x.bytes);else be(f,A)}else if(O==="read"){let R=Ug(v,["filePath","path","file","file_path"]);if(R===null)continue;let x=null;if(I?.status==="completed"){let C=B(B(I.metadata)?.display);C?.type==="file"&&typeof C.text=="string"&&(x=Buffer.byteLength(C.text,"utf8"))}u.record(A,"read",R,x)}else if(N==="webfetch"){m+=1;let R=I?.status==="completed"?I.output:void 0;f.record({direction:"read",kind:"web",id:A,ref:iL(v?.url),bytes:typeof R=="string"?Buffer.byteLength(R,"utf8"):null,basis:typeof R=="string"?"normalized_content":"unknown"})}else Jn(k.tool)||be(f,A)}let _=B(d.time),h=B(d.model)?.modelID??d.modelID,g=aL(d.tokens,r.requireBillingCounters),E=B(d.tokens),y=u.files("read"),T=u.files("written"),w=f.entries(),S=Kt({reasoning:E?.reasoning,webFetch:m>0?m:void 0},g.output,g.input_cache_write);if(l.push({response_id:c.id,timestamp:Tt(_?.created??c.time_created),model:typeof h=="string"&&h?h:null,tokens:g,files_read:y,files_written:T,external_io:w,read_bytes:nt(y,w,"read"),write_bytes:nt(T,w,"written"),model_provider:typeof d.providerID=="string"&&d.providerID?d.providerID:null,pricing_facts:S}),l.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:t,revision:e,checkpoint:e,responses:l}}function jg(t={}){return new Bo(t)}var jr,Yx,Zx,eL,tL,nL,Bo,du=L(()=>{"use strict";In();jr="opencode",Yx=Kx(import.meta.url);Zx=["read","read_file","view","view_file","view_image"],eL=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],tL=["filePath","path","file","file_path","filepath","notebook_path","paths"],nL=new Set(["session-job-notification"]);Bo=class{dbPaths;sqliteBusyTimeoutMs;constructor(e={}){this.dbPaths=(e.dbPaths??Qx()).map(n=>cu(n)),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3}openDb(e){if(!this.dbPaths.includes(cu(e)))return null;try{let n=new(zx())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discover(e,n,r=null){oe(e);let s=new Map;for(let i of this.dbPaths){e.signal.throwIfAborted();let a=await Ue(i,[cu(i,"..")]);if(!a||r&&pe(a,r.source_id)<0)continue;let l=this.openDb(a);if(l)try{let c=r?.source_id===a?r.sessionid:"",d=l.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(c,n);for(let u of d)typeof u.id=="string"&&u.id&&!s.has(u.id)&&s.set(u.id,{provider:jr,sessionid:u.id,source_id:a})}catch{}finally{l.close()}}return{sources:[...s.values()].sort((i,a)=>pe(`${i.source_id}\0${i.sessionid}`,`${a.source_id}\0${a.sessionid}`)).slice(0,n),truncated:!1}}inspect(e,n){if(oe(n),e.provider!==jr)return{status:"unsupported"};let r=this.openDb(e.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return{status:"unavailable"};let o=Fg(r,e.sessionid,n);return o?{status:"ready",revision:o.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}read(e,n,r){if(oe(r),e.provider!==jr)return{status:"unsupported"};let s=this.openDb(e.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let i=Fg(s,e.sessionid,r);if(!i||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=cL(e,n,i,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}}});import{readdir as dL,realpath as uL,stat as fL}from"node:fs/promises";import{basename as Wg,dirname as mL,join as Hg,resolve as Bg}from"node:path";function _L(t){let e=new Map,n=null,r=()=>{n&&(e.set(n.path,(e.get(n.path)??0)+n.bytes),n=null)};for(let s of t.split(`
|
|
10
10
|
`)){let o=s.replace(/\r$/,""),i=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(o);if(i){r(),n={path:i[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(o);if(a){n&&(n.path=a[1].trim());continue}if(o.startsWith("*** ")){r();continue}n&&o.startsWith("+")&&(n.bytes+=Buffer.byteLength(o.slice(1),"utf8")+1)}return r(),[...e].map(([s,o])=>({path:s,bytes:o}))}function gL(t){let e=t?.content;return typeof e=="string"?Buffer.byteLength(e,"utf8"):null}function yL(t,e,n){let r=B(t);if(!r)return{entry:null,incomplete:t!=null};let s=[],o=!1;for(let[a,l]of Object.entries(r)){let c=B(l);if(!c){o=!0;continue}let d=B(c.usage),u=B(c.requests),f=B(c.tokenDetails),m=B(f?.input);s.push({model:a,requests_count:u?K(u.count):null,input_tokens:d?K(d.inputTokens):null,input_other_tokens:m?K(m.tokenCount):null,cache_read_tokens:d?K(d.cacheReadTokens):null,cache_write_tokens:d?K(d.cacheWriteTokens):null,output_tokens:d?K(d.outputTokens):null,reasoning_tokens:d?K(d.reasoningTokens):null})}s.sort((a,l)=>pe(a.model,l.model));let i=o||s.length>0;return e===null?{entry:null,incomplete:i}:{entry:{native_id:e,recorded_at:n,kind:"copilot_session_shutdown",semantics:"reported_scope_unknown",models:s},incomplete:o}}function EL(t,e,n,r){let s=new Map;for(let u of t){if(u.type!=="user.message")continue;let f=B(u.data),m=typeof f?.interactionId=="string"?f.interactionId:null;if(m===null)continue;let p=gL(f);s.has(m)?s.get(m)===null&&p!==null&&s.set(m,p):s.set(m,p)}let o=new Map,i=new Set,a=new Map,l=!1,c=1e3;for(let u of t){if(r.signal.throwIfAborted(),u.type==="session.shutdown"){let g=typeof u.id=="string"&&u.id?u.id:null,E=Tt(u.timestamp),{entry:y,incomplete:T}=yL(B(u.data)?.modelMetrics,g,E);if(T&&(l=!0),y){let w=a.get(y.native_id);if(w&&JSON.stringify(w)!==JSON.stringify(y))l=!0;else if(a.set(y.native_id,y),a.size>c)return{snapshot:{status:"partial"},sessionUsage:null}}continue}if(u.type!=="assistant.message")continue;let f=B(u.data);if(!f)continue;let m=typeof f.messageId=="string"&&f.messageId?f.messageId:typeof u.id=="string"&&u.id?u.id:null;if(m===null)continue;let p=typeof f.interactionId=="string"?f.interactionId:null,_=o.get(m);if(!_){if(_={meta:{response_id:m,timestamp:Tt(u.timestamp),model:typeof f.model=="string"&&f.model?f.model:null,tokens:{...ut},files_read:[],files_written:[]},obs:new yt,io:new Et,promptRecorded:!1},o.set(m,_),o.size>r.maxRows)return{snapshot:{status:"partial"},sessionUsage:null};if(p!==null&&s.has(p)){if(!i.has(p)){i.add(p);let g=s.get(p);_.io.record({direction:"read",kind:"prompt",id:p,ref:null,bytes:g,basis:g===null?"unknown":"input_text"}),_.promptRecorded=!0}}else _.io.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})}let h=K(f.outputTokens);if(h!==null&&(_.meta.tokens.output=(_.meta.tokens.output??0)+h),_.meta.model===null&&typeof f.model=="string"&&f.model&&(_.meta.model=f.model),Array.isArray(f.toolRequests))for(let g of f.toolRequests){let E=B(g);if(!E)continue;let y=typeof E.name=="string"?E.name.toLowerCase():"",T=typeof E.toolCallId=="string"&&E.toolCallId?E.toolCallId:null,w=E.arguments;if(y==="create"){let S=B(w),b=typeof S?.path=="string"?S.path:null,k=typeof S?.file_text=="string"?Buffer.byteLength(S.file_text,"utf8"):null;b!==null?_.obs.record(T??m,"written",b,k):be(_.io,T)}else if(y==="apply_patch")if(typeof w=="string"){let S=_L(w);if(S.length>0)for(let b of S)_.obs.record(T??m,"written",b.path,b.bytes);else be(_.io,T)}else be(_.io,T);else if(hL.has(y)){let S=B(w),b=typeof S?.path=="string"?S.path:null;b!==null?_.obs.record(T??m,"read",b,null):be(_.io,T)}else pL.has(y)||be(_.io,T)}}let d=[];for(let{meta:u,obs:f,io:m}of o.values()){let p=f.files("read"),_=f.files("written"),h=m.entries();d.push({...u,files_read:p,files_written:_,external_io:h,read_bytes:nt(p,h,"read"),write_bytes:nt(_,h,"written"),model_provider:null,pricing_facts:null})}return l?{snapshot:{status:"partial"},sessionUsage:null}:{snapshot:{status:"complete",source:e,revision:n,checkpoint:n,responses:d},sessionUsage:a.size>0?[...a.values()]:null}}function TL(){return process.env.HOME||process.env.USERPROFILE||""}function qg(t={}){return new uu(t)}var Zn,Xg,pL,hL,uu,Gg=L(()=>{"use strict";In();Zn="copilot",Xg="events.jsonl",pL=new Set(["report_intent"]),hL=new Set(["view"]);uu=class{sessionStateDir;constructor(e={}){this.sessionStateDir=Bg(e.copilotSessionStateDir??Hg(TL(),".copilot","session-state"))}async discover(e,n,r=null){oe(e);let s;try{s=await dL(this.sessionStateDir)}catch{return{sources:[],truncated:!1}}let o=[];for(let i of s.sort(pe)){e.signal.throwIfAborted();let a=Hg(this.sessionStateDir,i,Xg);if(!(await fL(a).catch(()=>null))?.isFile())continue;let c=await uL(a).catch(()=>Bg(a)),d={provider:Zn,sessionid:i,source_id:c};r!==null&&pe(`${c}\0${i}`,r)<=0||o.push(d)}return o.sort((i,a)=>pe(`${i.source_id}\0${i.sessionid}`,`${a.source_id}\0${a.sessionid}`)),{sources:o.slice(0,n),truncated:!1}}matches(e,n){return Wg(n)===Xg&&Wg(mL(n))===e.sessionid}async inspect(e,n){if(oe(n),e.provider!==Zn)return{status:"unsupported"};let r=await Ue(e.source_id,[this.sessionStateDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await ft(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){return(await this.readWithUsage(e,n,r)).snapshot}async readWithUsage(e,n,r){if(oe(r),e.provider!==Zn)return{snapshot:{status:"unsupported"},sessionUsage:null};let s=await Ue(e.source_id,[this.sessionStateDir]);if(!s||!this.matches(e,s))return{snapshot:{status:"unavailable"},sessionUsage:null};let o=await ft(s,r).catch(()=>null);if(!o||o.revision!==n)return{snapshot:{status:"partial"},sessionUsage:null};let i=ba(o.data,r);return i?EL(i,e,n,r):{snapshot:{status:"partial"},sessionUsage:null}}}});import{readdir as Vg,readFile as wL,realpath as fu,stat as Jg}from"node:fs/promises";import{basename as qo,dirname as Ns,isAbsolute as pu,join as As,relative as zg,resolve as Xo,sep as Qg}from"node:path";function NL(t){return AL.has(t)||Jn(t)}function RL(){return process.env.HOME||process.env.USERPROFILE||""}function xL(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=[],r=0;for(;r<t.length;){e.signal.throwIfAborted();let s=t.indexOf(10,r);s===-1&&(s=t.length);let o=t.toString("utf8",r,s);if(r=s+1,!!o.trim())try{let i=B(JSON.parse(o));if(!i)return null;n.push(i)}catch{return null}}return n}function Kg(t){let e=B(t);if(!e)return null;let n=K(e.inputOther),r=K(e.inputCacheRead),s=K(e.inputCacheCreation),o=K(e.output);return n===null||r===null||s===null||o===null?null:{input_uncached:n+s,input_cached:r,input_cache_write:s,output:o}}function LL(t){if(!Array.isArray(t))return null;let e=0,n=!1;for(let r of t){let s=B(r);s?.type==="text"&&typeof s.text=="string"&&(e+=Buffer.byteLength(s.text,"utf8"),n=!0)}return n?e:null}function OL(t,e,n,r){let s=t.find(E=>E.type==="metadata"),o=s&&typeof s.protocol_version=="string"?s.protocol_version:null;if(o!==null&&!vL.has(o))return{status:"unsupported"};let i=DL(e.source_id),a=new Map,l=new Map,c=[],d=new Set,u=new Set,f=null,m=!1,p=E=>`${i}/${E}`,_=(E,y)=>{let T=p(E),w=a.get(T);return w||(w={meta:{response_id:T,timestamp:Tt(typeof y=="number"?y:null),model:null,tokens:{...ut},files_read:[],files_written:[]},obs:new yt,io:new Et,turnStepKey:null,tokensSource:"none"},a.set(T,w)),w},h=(E,y)=>{if(E.turnStepKey!==null)return;let T=y.turnId===void 0?null:String(y.turnId),w=y.step===void 0?null:String(y.step);T!==null&&w!==null&&(E.turnStepKey=`${T}.${w}`)};for(let E of t){if(r.signal.throwIfAborted(),E.type==="turn.prompt"){let T=B(E.origin),w=typeof T?.kind=="string"?T.kind:null,S=typeof E.promptId=="string"&&E.promptId?E.promptId:null;if(w!==null&&CL.has(w))continue;if(S!==null){if(d.has(S))continue;d.add(S)}w==="user"?c.push({bytes:LL(E.input),id:S}):c.push({bytes:null,id:S});continue}if(E.type==="usage.record"){if(u.size>1){m=!0;continue}if(u.size===0){f===null&&(m=!0);continue}let[T]=u,w=a.get(p(T));if(!w){m=!0;continue}if(w.tokensSource==="record"){m=!0;continue}let S=Kg(E.usage);S&&(w.meta.tokens=S,w.tokensSource="record");continue}if(E.type==="llm.request"){let T=typeof E.turnStep=="string"?E.turnStep:null,w=(typeof E.modelAlias=="string"&&E.modelAlias?E.modelAlias:null)??(typeof E.model=="string"&&E.model?E.model:null);T!==null&&w!==null&&(l.has(T)?l.get(T)!==w&&l.set(T,null):l.set(T,w));continue}if(E.type!=="context.append_loop_event")continue;let y=B(E.event);if(y){if(y.type==="step.begin"){let T=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(T===null)continue;let w=_(T,E.time);if(a.size>r.maxRows)return{status:"partial"};if(u.add(T),h(w,y),c.length>0){for(let S of c)w.io.record({direction:"read",kind:"prompt",id:S.id,ref:null,bytes:S.bytes,basis:S.bytes===null?"unknown":"input_text"});c.length=0}continue}if(y.type==="step.end"){let T=typeof y.uuid=="string"&&y.uuid?y.uuid:null;if(T===null)continue;let w=_(T,E.time);if(a.size>r.maxRows)return{status:"partial"};u.delete(T),f=T,h(w,y);let S=Kg(y.usage);S&&(w.meta.tokens=S),w.tokensSource="end",w.meta.timestamp===null&&(w.meta.timestamp=Tt(typeof E.time=="number"?E.time:null));continue}if(y.type==="tool.call"){let T=typeof y.stepUuid=="string"&&y.stepUuid?y.stepUuid:null;if(T===null)continue;let w=_(T,E.time);if(a.size>r.maxRows)return{status:"partial"};let S=typeof y.name=="string"?y.name.toLowerCase():"",b=typeof y.toolCallId=="string"&&y.toolCallId?y.toolCallId:null,k=B(y.args),N=typeof k?.path=="string"&&k.path?k.path:typeof k?.file_path=="string"&&k.file_path?k.file_path:null;IL.has(S)?N!==null?w.obs.record(b??"","read",N,null):be(w.io,b):kL.has(S)?N!==null?w.obs.record(b??"","written",N,Ss(k)):be(w.io,b):NL(S)||be(w.io,b);continue}}}let g=[];for(let{meta:E,obs:y,io:T,turnStepKey:w}of a.values()){E.model===null&&w!==null&&(E.model=l.get(w)??null);let S=y.files("read"),b=y.files("written"),k=T.entries();g.push({...E,files_read:S,files_written:b,external_io:k,read_bytes:nt(S,k,"read"),write_bytes:nt(b,k,"written"),model_provider:null,pricing_facts:Kt({},E.tokens.output,E.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:g,...m?{capture_status:"partial"}:{}}}function mu(t){return qo(t)===hu&&qo(Ns(Ns(t)))===Zg}function Yg(t){return qo(Ns(Ns(Ns(t))))}function DL(t){return qo(Ns(t))}function ML(t,e){let n=zg(e,t);return n===""||!n.startsWith(`..${Qg}`)&&n!==".."&&!pu(n)}function $L(t){if(t instanceof Error&&t.name==="AbortError")throw t}function ey(t={}){return new Go(t)}var er,hu,Zg,vL,SL,bL,IL,kL,AL,CL,Go,_u=L(()=>{"use strict";In();er="kimi",hu="wire.jsonl",Zg="agents",vL=new Set(["1.4","1.5"]),SL=5e5,bL=8*1024*1024,IL=new Set(["read"]),kL=new Set(["write","edit"]),AL=new Set(["todolist","tasklist","taskoutput","taskstop","waitfor","creategoal","updategoal","getgoal","enterplanmode","exitplanmode","agentswarm","agent","skill","croncreate","crondelete","cronlist"]);CL=new Set(["system_trigger","cron_job","task"]);Go=class{home;sessionsDir;indexPath;maxDiscoveryTraversalVisits;constructor(e={}){this.home=Xo(e.kimiHome??process.env.KIMI_CODE_HOME??As(RL(),".kimi-code")),this.sessionsDir=As(this.home,"sessions"),this.indexPath=As(this.home,"session_index.jsonl"),this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):SL}async discover(e,n,r=null){oe(e);let s=new Set,o=!1,i=await fu(this.sessionsDir).catch(()=>Xo(this.sessionsDir)),a=f=>{mu(f)&&ML(f,i)&&s.add(f)},l=0,c=async(f,m)=>{if(e.signal.throwIfAborted(),o)return;let p=await Vg(f,{withFileTypes:!0}).catch(()=>[]);p.sort((_,h)=>pe(_.name,h.name));for(let _ of p){if(e.signal.throwIfAborted(),l+=1,l>this.maxDiscoveryTraversalVisits){o=!0;return}let h=As(f,_.name);if(_.isDirectory()&&!_.isSymbolicLink()&&m<4){if(await c(h,m+1),o)return}else _.isFile()&&_.name===hu&&mu(h)&&a(await fu(h).catch(()=>Xo(h)))}};await c(this.sessionsDir,0);try{await this.unionIndex(a,e)}catch(f){$L(f)}let d=[...s].sort(pe);return{sources:(r===null?d:d.filter(f=>pe(f,r)>0)).slice(0,n).map(f=>({provider:er,sessionid:Yg(f),source_id:f})),truncated:o}}async unionIndex(e,n){let r=await Jg(this.indexPath).catch(()=>null);if(!r?.isFile()||r.size>bL)return;let s=await wL(this.indexPath,{signal:n.signal});for(let o of s.toString("utf8").split(`
|
|
11
|
-
`)){if(n.signal.throwIfAborted(),!o.trim())continue;let i;try{i=B(JSON.parse(o))}catch{continue}let a=typeof i?.sessionId=="string"?i.sessionId:null,l=typeof i?.sessionDir=="string"?i.sessionDir:null;if(!a||!l||!pu(l)||qo(l)!==a)continue;let c=zg(this.sessionsDir,Xo(l));if(c.startsWith(`..${Qg}`)||c===".."||pu(c))continue;let d=As(l,Zg),u=await Vg(d,{withFileTypes:!0}).catch(()=>[]);for(let f of u){if(!f.isDirectory())continue;let m=As(d,f.name,hu);(await Jg(m).catch(()=>null))?.isFile()&&e(await fu(m).catch(()=>Xo(m)))}}}matches(e,n){return mu(n)&&Yg(n)===e.sessionid}async inspect(e,n){if(oe(n),e.provider!==er)return{status:"unsupported"};let r=await Ue(e.source_id,[this.sessionsDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await ft(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(oe(r),e.provider!==er)return{status:"unsupported"};let s=await Ue(e.source_id,[this.sessionsDir]);if(!s||!this.matches(e,s))return{status:"unavailable"};let o=await ft(s,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let i=xL(o.data,r);return i?OL(i,e,n,r):{status:"partial"}}}});import{createHash as vu}from"node:crypto";import{createRequire as PL}from"node:module";import{lstat as UL,readFile as FL,readdir as jL,realpath as Tu,stat as ty}from"node:fs/promises";import{basename as $a,dirname as WL,isAbsolute as ny,join as Wr,relative as HL,resolve as kn,sep as BL}from"node:path";function Su(t){return typeof t=="string"&&qL.has(t.toLowerCase())}function Ko(t,e){t.record({direction:"read",kind:"unattributed",id:e,ref:null,bytes:null,basis:"unknown"}),t.record({direction:"write",kind:"unattributed",id:e,ref:null,bytes:null,basis:"unknown"})}function ly(t){if(typeof t!="string"||t.length===0)return null;try{let e=new URL(t);return e.protocol!=="http:"&&e.protocol!=="https:"?null:`${e.origin}${e.pathname}`}catch{return null}}function Ls(t,e,n){if(t===null)return null;let r=n==="written"?"write":"read",s=0;for(let o of t){if(o.bytes===null)return null;s+=o.bytes}for(let o of e)if(o.direction===r){if(o.bytes===null)return null;s+=o.bytes}return s}function xs(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function bu(t,e,n){let r={},s=xs(t.cacheWrite5m),o=xs(t.cacheWrite1h),i=xs(t.reasoning),a=xs(t.webSearch),l=xs(t.webFetch);i!==null&&(e===null||i<=e)&&(r.reasoning_output_tokens=i);let c=(s??0)+(o??0),d=n===null||c<=n;return s!==null&&d&&(r.cache_write_5m_tokens=s),o!==null&&d&&(r.cache_write_1h_tokens=o),a!==null&&(r.web_search_requests=a),l!==null&&(r.web_fetch_requests=l),Object.keys(r).length>0?r:null}function Pa(){return process.env.HOME||process.env.USERPROFILE||""}function JL(){if(process.env.OPENCODE_DB)return[kn(process.env.OPENCODE_DB)];let t=process.env.XDG_DATA_HOME||Wr(Pa(),".local","share");return[Wr(t,"lmplayer","opencode-local.db"),Wr(t,"lmplayer","opencode-dev.db")]}function KL(){return VL("node:sqlite").DatabaseSync}function
|
|
11
|
+
`)){if(n.signal.throwIfAborted(),!o.trim())continue;let i;try{i=B(JSON.parse(o))}catch{continue}let a=typeof i?.sessionId=="string"?i.sessionId:null,l=typeof i?.sessionDir=="string"?i.sessionDir:null;if(!a||!l||!pu(l)||qo(l)!==a)continue;let c=zg(this.sessionsDir,Xo(l));if(c.startsWith(`..${Qg}`)||c===".."||pu(c))continue;let d=As(l,Zg),u=await Vg(d,{withFileTypes:!0}).catch(()=>[]);for(let f of u){if(!f.isDirectory())continue;let m=As(d,f.name,hu);(await Jg(m).catch(()=>null))?.isFile()&&e(await fu(m).catch(()=>Xo(m)))}}}matches(e,n){return mu(n)&&Yg(n)===e.sessionid}async inspect(e,n){if(oe(n),e.provider!==er)return{status:"unsupported"};let r=await Ue(e.source_id,[this.sessionsDir]);if(!r||!this.matches(e,r))return{status:"unavailable"};let s=await ft(r,n).catch(()=>null);return s?{status:"ready",revision:s.revision}:{status:"partial"}}async read(e,n,r){if(oe(r),e.provider!==er)return{status:"unsupported"};let s=await Ue(e.source_id,[this.sessionsDir]);if(!s||!this.matches(e,s))return{status:"unavailable"};let o=await ft(s,r).catch(()=>null);if(!o)return{status:"partial"};if(o.revision!==n)return{status:"partial"};let i=xL(o.data,r);return i?OL(i,e,n,r):{status:"partial"}}}});import{createHash as vu}from"node:crypto";import{createRequire as PL}from"node:module";import{lstat as UL,readFile as FL,readdir as jL,realpath as Tu,stat as ty}from"node:fs/promises";import{basename as $a,dirname as WL,isAbsolute as ny,join as Wr,relative as HL,resolve as kn,sep as BL}from"node:path";function Su(t){return typeof t=="string"&&qL.has(t.toLowerCase())}function Ko(t,e){t.record({direction:"read",kind:"unattributed",id:e,ref:null,bytes:null,basis:"unknown"}),t.record({direction:"write",kind:"unattributed",id:e,ref:null,bytes:null,basis:"unknown"})}function ly(t){if(typeof t!="string"||t.length===0)return null;try{let e=new URL(t);return e.protocol!=="http:"&&e.protocol!=="https:"?null:`${e.origin}${e.pathname}`}catch{return null}}function Ls(t,e,n){if(t===null)return null;let r=n==="written"?"write":"read",s=0;for(let o of t){if(o.bytes===null)return null;s+=o.bytes}for(let o of e)if(o.direction===r){if(o.bytes===null)return null;s+=o.bytes}return s}function xs(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function bu(t,e,n){let r={},s=xs(t.cacheWrite5m),o=xs(t.cacheWrite1h),i=xs(t.reasoning),a=xs(t.webSearch),l=xs(t.webFetch);i!==null&&(e===null||i<=e)&&(r.reasoning_output_tokens=i);let c=(s??0)+(o??0),d=n===null||c<=n;return s!==null&&d&&(r.cache_write_5m_tokens=s),o!==null&&d&&(r.cache_write_1h_tokens=o),a!==null&&(r.web_search_requests=a),l!==null&&(r.web_fetch_requests=l),Object.keys(r).length>0?r:null}function Pa(){return process.env.HOME||process.env.USERPROFILE||""}function JL(){if(process.env.OPENCODE_DB)return[kn(process.env.OPENCODE_DB)];let t=process.env.XDG_DATA_HOME||Wr(Pa(),".local","share");return[Wr(t,"lmplayer","opencode-local.db"),Wr(t,"lmplayer","opencode-dev.db")]}function KL(){return VL("node:sqlite").DatabaseSync}function z(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}function mt(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function ku(t){if(typeof t!="string"&&typeof t!="number")return null;let e=new Date(t);return Number.isFinite(e.getTime())?e.toISOString():null}function Jo(t){if(!Number.isSafeInteger(t.maxBytes)||t.maxBytes<=0)throw new Error("maxBytes must be a positive safe integer");if(!Number.isSafeInteger(t.maxRows)||t.maxRows<=0)throw new Error("maxRows must be a positive safe integer");t.signal.throwIfAborted()}function Ua(t){return`${t.source_id}\0${t.sessionid}`}function rr(t,e){return t<e?-1:t>e?1:0}function gu(t,e){return rr(Ua(t),Ua(e))}function YL(t){let e={version:2,pos:t.pos,done:t.done,rr:t.rr};return Buffer.from(JSON.stringify(e),"utf8").toString("base64url")}function ry(t){let e=z(t);if(!e||typeof e.source_id!="string"||typeof e.sessionid!="string"||e.source_id.includes("\0")||e.sessionid.includes("\0"))throw new Error("invalid passive session discovery cursor");return{source_id:e.source_id,sessionid:e.sessionid}}function zL(t){if(t===void 0)return null;let e;try{e=z(JSON.parse(Buffer.from(t,"base64url").toString("utf8")))}catch{throw new Error("invalid passive session discovery cursor")}if(!e)throw new Error("invalid passive session discovery cursor");if(e.version===1){let o=e.provider;if(!Number.isSafeInteger(o)||o<0||o>=yu.length)throw new Error("invalid passive session discovery cursor");let i=o,a=ry({source_id:e.source_id,sessionid:e.sessionid}),l=new Map([[yu[i],a]]),c=new Set(yu.slice(0,i));return{pos:l,done:c,rr:0}}if(e.version!==2)throw new Error("invalid passive session discovery cursor");let n=z(e.pos);if(!n||!Array.isArray(e.done)||!Number.isSafeInteger(e.rr)||e.rr<0)throw new Error("invalid passive session discovery cursor");let r=new Map;for(let[o,i]of Object.entries(n))r.set(o,ry(i));let s=new Set;for(let o of e.done){if(typeof o!="string")throw new Error("invalid passive session discovery cursor");s.add(o)}return{pos:r,done:s,rr:e.rr}}function cy(t){if(typeof t!="string")return null;let e=t.toLowerCase();return e==="apply_patch"?"apply_patch":QL.includes(e)?"read":ZL.includes(e)?"written":null}function tC(t){return typeof t=="string"?(()=>{try{return JSON.parse(t)}catch{return t}})():t}function Fa(t,e=eC){let n=z(t);if(!n)return null;for(let r of e){let s=n[r];if(typeof s=="string"&&s.length>0)return s;if(Array.isArray(s)){for(let o of s)if(typeof o=="string"&&o.length>0)return o}}return null}function dy(t){let e=z(t);if(!e)return null;if(typeof e.content=="string")return Buffer.byteLength(e.content,"utf8");if(typeof e.new_string=="string")return Buffer.byteLength(e.new_string,"utf8");if(typeof e.newString=="string")return Buffer.byteLength(e.newString,"utf8");if(typeof e.new_source=="string")return Buffer.byteLength(e.new_source,"utf8");if(typeof e.newSource=="string")return Buffer.byteLength(e.newSource,"utf8");if(Array.isArray(e.edits)){let n=0;for(let r of e.edits){let s=z(r),o=s?.new_string??s?.newString;if(typeof o!="string")return null;n+=Buffer.byteLength(o,"utf8")}return n}return null}function ja(t){let e=new Map,n=null,r=()=>{n&&(e.set(n.path,(e.get(n.path)??0)+n.bytes),n=null)};for(let s of t.split(`
|
|
12
12
|
`)){let o=s.replace(/\r$/,""),i=/^\*\*\* (?:Add|Update|Delete) File: (.+)$/.exec(o);if(i){r(),n={path:i[1].trim(),bytes:0};continue}let a=/^\*\*\* Move to: (.+)$/.exec(o);if(a){n&&(n.path=a[1].trim());continue}if(o.startsWith("*** ")){r();continue}n&&o.startsWith("+")&&(n.bytes+=Buffer.byteLength(o.slice(1),"utf8")+1)}return r(),[...e].map(([s,o])=>({path:s,bytes:o}))}function rC(t){let e=0,n=t.length,r=()=>{for(;e<n&&/\s/.test(t[e]);)e++};r();let s=0,o=!1;for(let[c,d]of nC)if(t.startsWith(c,e)){e+=c.length,s=d,o=!0;break}if(!o||t[e]!=='"')return null;let i=e;e++;let a=!1;for(;e<n;){let c=t[e];if(c==="\\"){e+=2;continue}if(c==='"'){e++,a=!0;break}e++}if(!a)return null;let l;try{l=JSON.parse(t.slice(i,e))}catch{return null}if(typeof l!="string")return null;for(let c=0;c<s;c++){if(r(),t[e]!==")")return null;e++}return r(),t[e]===";"&&e++,r(),e<n?null:l}function sy(t){if(t.length===0||t.endsWith(`
|
|
13
13
|
`))return null;let e=[];for(let n of t.split(`
|
|
14
14
|
`)){let r=/^\s*\d+\t(.*)$/s.exec(n);if(r===null)return null;e.push(r[1])}return e.join(`
|
|
15
|
-
`)}async function oy(t,e){Jo(e);let n=await ty(t).catch(()=>null);if(!n?.isFile()||n.size>e.maxBytes)return null;let r=await FL(t,{signal:e.signal});e.signal.throwIfAborted();let s=await ty(t).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${Iu}:sha256:${vu("sha256").update(r).digest("hex")}`,data:r}}function sC(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=[],r=0;for(;r<t.length;){e.signal.throwIfAborted();let s=t.indexOf(10,r);s===-1&&(s=t.length);let o=t.toString("utf8",r,s);if(r=s+1,!!o.trim())try{let i=Y(JSON.parse(o));if(!i)return null;n.push(i)}catch{return null}}return n}function oC(t){return $a(WL(t))==="subagents"}function iC(t){let e=Y(t);if(!e)return null;let n=mt(e.input_tokens),r=mt(e.output_tokens);if(n===null||r===null)return null;let s=e.cache_read_input_tokens===void 0?0:mt(e.cache_read_input_tokens),o=e.cache_creation_input_tokens===void 0?0:mt(e.cache_creation_input_tokens);return s===null||o===null?null:{input_uncached:n+o,input_cached:s,input_cache_write:o,output:r}}function aC(t,e){let n=new Map;for(let r of t){if(e.signal.throwIfAborted(),r.type!=="user")continue;let s=Y(r.message),o=Array.isArray(s?.content)?s.content:null;if(!o)continue;let i=o.map(Y).filter(d=>d?.type==="tool_result"),a=i.length===1,l=Y(r.toolUseResult),c=l?.type==="text"?Y(l.file):null;for(let d of i){if(typeof d.tool_use_id!="string"||d.tool_use_id.length===0)continue;let u,f=null;if(d.is_error===!0)u=null;else if(a&&c&&typeof c.content=="string")u=Buffer.byteLength(c.content,"utf8"),f=typeof c.filePath=="string"?c.filePath:null;else if(typeof d.content=="string"){let m=sy(d.content);u=m!==null?Buffer.byteLength(m,"utf8"):null}else if(Array.isArray(d.content)){let m=d.content.map(Y).filter(p=>p?.type==="text"&&typeof p.text=="string").map(p=>p.text);if(m.length===1){let p=sy(m[0]);u=p!==null?Buffer.byteLength(p,"utf8"):null}else u=null}else u=null;n.set(d.tool_use_id,{bytes:u,cleanPath:f})}}return n}function lC(t){let e=t?.content;if(typeof e=="string")return Buffer.byteLength(e,"utf8");if(Array.isArray(e)){let n=0,r=!1;for(let s of e){let o=Y(s);o?.type==="text"&&typeof o.text=="string"&&(n+=Buffer.byteLength(o.text,"utf8"),r=!0)}if(r)return n}return null}function cC(t){if(t.type!=="user"||t.toolUseResult!==void 0||t.isMeta===!0||t.isCompactSummary===!0||t.isVisibleInTranscriptOnly===!0||t.promptSource==="system"||t.scheduledTaskId!==void 0||t.scheduledFireId!==void 0)return!1;let e=Y(t.message)?.content;return!(Array.isArray(e)&&e.some(n=>Y(n)?.type==="tool_result"))}function dC(t){let e=new Map,n=new Set,r=new Map;for(let i of t){let a=typeof i.uuid=="string"&&i.uuid?i.uuid:null;if(a!==null&&(e.set(a,typeof i.parentUuid=="string"&&i.parentUuid?i.parentUuid:null),cC(i))){n.add(a);let l=lC(Y(i.message));l!==null&&r.set(a,l)}}let s=new Map;return{promptBytes:r,parent:e,resolve:i=>{let a=[],l=new Set,c=i,d;for(;;){let u=s.get(c);if(u){d=u;break}if(n.has(c)){d={kind:"found",uuid:c};break}if(!e.has(c)){d={kind:"broken"};break}if(l.has(c)){d={kind:"broken"};break}l.add(c),a.push(c);let f=e.get(c)??null;if(f===null){d={kind:"clean"};break}c=f}for(let u of a)s.set(u,d);return d}}}function uC(t,e){let n=Y(e.cache_creation),r=Y(e.output_tokens_details),s=Y(e.server_tool_use),o=(i,a)=>{let l=xs(a);l!==null&&(t[i]=l)};o("cacheWrite5m",n?.ephemeral_5m_input_tokens),o("cacheWrite1h",n?.ephemeral_1h_input_tokens),o("reasoning",r?.thinking_tokens),o("webSearch",s?.web_search_requests),o("webFetch",s?.web_fetch_requests)}function fC(t,e,n,r,s=!1){let o=aC(t,r),{promptBytes:i,parent:a,resolve:l}=dC(t),c=new Set,d=(p,_)=>{let h=i.get(_)??null;p.record({direction:"read",kind:"prompt",id:_,ref:null,bytes:h,basis:h===null?"unknown":"input_text"})},u=p=>{p.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})},f=new Map;for(let p of t){if(r.signal.throwIfAborted(),p.type!=="assistant"||p.isSidechain===!0&&!s||p.isMeta===!0)continue;let _=Y(p.message);if(!_||typeof _.id!="string"||_.id.length===0)continue;let h=f.get(_.id);if(!h){if(h={meta:{response_id:_.id,timestamp:ku(p.timestamp),model:null,tokens:{...Vo},files_read:[],files_written:[]},obs:new tr,io:new nr,pricingRaw:{}},f.set(_.id,h),f.size>r.maxRows)return{status:"partial"};let E=typeof p.uuid=="string"&&p.uuid?p.uuid:null;if(E===null)u(h.io);else{let y=l(E);if(y.kind==="broken")u(h.io);else if(y.kind==="found"){let T=[],w=y.uuid;for(;w!==null&&!c.has(w);){let S=w;c.add(S),T.push(S);let b=a.get(S)??null;if(b===null){w=null;continue}let k=l(b);w=k.kind==="found"?k.uuid:null}for(let S=T.length-1;S>=0;S-=1)d(h.io,T[S])}}}let g=Y(_.usage);if(g){let E=iC(g);E&&(h.meta.tokens=E),uC(h.pricingRaw,g)}if(typeof _.model=="string"&&_.model&&(h.meta.model=_.model),Array.isArray(_.content))for(let E of _.content){let y=Y(E);if(y?.type!=="tool_use")continue;let T=typeof y.id=="string"&&y.id?y.id:_.id,w=cy(y.name),S=tC(y.input),b=typeof y.name=="string"?y.name.toLowerCase():"";if(w==="read"){let k=Fa(S,["file_path","filePath","path","file"]);if(k===null)continue;let N=o.get(T),O=N===void 0||N.cleanPath!==null&&N.cleanPath!==k?null:N.bytes;h.obs.record(T,"read",k,O)}else if(w==="written")h.obs.record(T,"written",Fa(S),dy(S));else if(w==="apply_patch"){let k=typeof S=="string"?S:Y(S)?.input;if(typeof k=="string")for(let N of ja(k))h.obs.record(T,"written",N.path,N.bytes)}else b==="webfetch"||b==="websearch"?h.io.record({direction:"read",kind:"web",id:T,ref:ly(Y(S)?.url),bytes:null,basis:"unknown"}):Su(y.name)||Ko(h.io,T)}}let m=[];for(let{meta:p,obs:_,io:h,pricingRaw:g}of f.values()){let E=_.files("read"),y=_.files("written"),T=h.entries();m.push({...p,files_read:E,files_written:y,external_io:T,read_bytes:Ls(E,T,"read"),write_bytes:Ls(y,T,"written"),model_provider:null,pricing_facts:bu(g,p.tokens.output,p.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:m}}function mC(t){let e=Y(t);if(!e)return null;let n=mt(e.input_tokens),r=mt(e.cached_input_tokens),s=mt(e.output_tokens);if(n===null||r===null||s===null||r>n)return null;let o=e.cache_write_input_tokens===void 0?null:mt(e.cache_write_input_tokens);return e.cache_write_input_tokens!==void 0&&o===null?null:{input_uncached:n-r,input_cached:r,input_cache_write:o,output:s}}function pC(t,e,n){let r=typeof t.call_id=="string"&&t.call_id?t.call_id:null,s=typeof t.name=="string"?t.name.toLowerCase():"",o=t.type==="custom_tool_call"?t.input:t.arguments;if(s==="apply_patch"&&typeof o=="string"){if(r!==null)for(let i of ja(o))e.record(r,"written",i.path,i.bytes);return}if(typeof o=="string"){let i=rC(o);if(i!==null){if(r!==null)for(let a of ja(i))e.record(r,"written",a.path,a.bytes);return}}Su(s)||Ko(n,r)}function hC(t){let n=Y(t.internal_chat_message_metadata_passthrough)?.content_item_kinds,r=t.content;if(!Array.isArray(n))return"unknown";if(!Array.isArray(r))return"injected";let s=0,o=!1;for(let i=0;i<r.length;i+=1){if(n[i]!=="user.text")continue;let a=Y(r[i]);a&&typeof a.text=="string"&&(s+=Buffer.byteLength(a.text,"utf8"),o=!0)}return o?{bytes:s}:"injected"}function _C(t,e,n,r){let s=new Map,o=new Map,i=null,a=null,l=new tr,c=new nr,d=0,u=!1,f=!0,m=new Set;for(let _ of t){r.signal.throwIfAborted();let h=Y(_.payload);if(_.type==="session_meta"&&h&&typeof h.model_provider=="string"&&h.model_provider){a=h.model_provider;continue}if(_.type==="turn_context"&&h){let T=typeof h.model=="string"&&h.model?h.model:null;T&&(i=T),T&&typeof h.turn_id=="string"&&o.set(h.turn_id,T);continue}if(_.type==="response_item"&&h){if(h.type==="function_call"||h.type==="custom_tool_call")pC(h,l,c);else if(h.type==="local_shell_call")Ko(c,typeof h.call_id=="string"?h.call_id:null);else if(h.type==="web_search_call")d+=1,c.record({direction:"read",kind:"web",id:typeof h.id=="string"?h.id:null,ref:null,bytes:null,basis:"unknown"});else if(h.type==="message"&&h.role==="user"){let T=hC(h),w=typeof h.id=="string"&&h.id?h.id:null;T==="unknown"?c.record({direction:"read",kind:"prompt",id:w,ref:null,bytes:null,basis:"unknown"}):T!=="injected"&&(w===null?c.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"}):m.has(w)||(m.add(w),c.record({direction:"read",kind:"prompt",id:w,ref:null,bytes:T.bytes,basis:"input_text"})))}continue}if(_.type==="event_msg"&&h?.type==="token_count"){u=!0,f&&(l=new tr,c=new nr,d=0);continue}if(_.type!=="token_usage_record"||!h)continue;if(typeof h.response_id!="string"||h.response_id.length===0)return{status:"unsupported"};let g=mC(h.usage);if(!g)return{status:"partial"};let E=typeof h.turn_id=="string"?o.get(h.turn_id)??i:i,y=s.get(h.response_id);if(!y&&(y={meta:{response_id:h.response_id,timestamp:null,model:null,tokens:g,files_read:[],files_written:[]},obs:new tr,io:new nr,rawUsage:null,webSearch:0},s.set(h.response_id,y),s.size>r.maxRows))return{status:"partial"};f=!1,y.meta.timestamp=ku(_.timestamp),y.meta.model=E??null,y.meta.tokens=g,y.rawUsage=Y(h.usage),y.obs.absorb(l),y.io.absorb(c),y.webSearch+=d,l=new tr,c=new nr,d=0}if(u&&s.size===0)return{status:"unsupported"};let p=[];for(let{meta:_,obs:h,io:g,rawUsage:E,webSearch:y}of s.values()){let T=h.files("read"),w=h.files("written"),S=g.entries(),b=Y(E),k=bu({reasoning:b?.reasoning_output_tokens,webSearch:y>0?y:void 0},_.tokens.output,_.tokens.input_cache_write);p.push({..._,files_read:T,files_written:w,external_io:S,read_bytes:Ls(T,S,"read"),write_bytes:Ls(w,S,"written"),model_provider:a,pricing_facts:k})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:p,...u?{capture_status:"partial"}:{}}}function gC(t,e=!1){let n=Y(t);if(!n)return{...Vo};let r=n.input===void 0?e?null:0:mt(n.input),s=n.output===void 0?e?null:0:mt(n.output),o=n.reasoning===void 0?e?null:0:mt(n.reasoning),i=Y(n.cache),a=i?.read===void 0?e?null:0:mt(i.read),l=i?.write===void 0?e?null:0:mt(i.write);return e&&r===0&&s===0&&o===0&&a===0&&l===0?{...Vo}:e?{input_uncached:r!==null&&l!==null&&Number.isSafeInteger(r+l)?r+l:null,input_cached:a,input_cache_write:l,output:s!==null&&o!==null&&Number.isSafeInteger(s+o)?s+o:null}:r===null||s===null||o===null||a===null||l===null?{...Vo}:r+s+o+a+l===0?{...Vo}:{input_uncached:r+l,input_cached:a,input_cache_write:l,output:s+o}}function iy(t,e,n){Jo(n);let r=n.maxRows*20,s=t.prepare("SELECT (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM message WHERE session_id=?) + (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM part WHERE session_id=?) AS total").get(e,e),o=mt(s?.total);if(o===null||o>n.maxBytes)return null;let i=t.prepare("SELECT id,time_created,time_updated,data FROM message WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1),a=t.prepare("SELECT id,message_id,time_created,time_updated,data FROM part WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1);if(i.length+a.length>r)return null;let l=0,c=vu("sha256");for(let d of[...i,...a]){n.signal.throwIfAborted();let u=JSON.stringify(d);if(l+=Buffer.byteLength(u),l>n.maxBytes)return null;c.update(u).update(`
|
|
16
|
-
`)}return{revision:`${Iu}:sha256:${c.digest("hex")}`,messages:i,parts:a}}function EC(t){let e=0,n=!1,r=!1;for(let s of t){let o;try{o=Y(JSON.parse(s.data))}catch{continue}let i=typeof o?.type=="string"?o.type:"";o?.synthetic===!0||o?.ignored===!0||(i==="text"&&typeof o.text=="string"?(e+=Buffer.byteLength(o.text,"utf8"),n=!0):i&&!yC.has(i)&&(r=!0))}return n?e:r?"unknown":null}function TC(t,e,n,r){let s=new Map;for(let c of n.parts){let d=s.get(c.message_id)??[];d.push(c),s.set(c.message_id,d)}let o=new Map;for(let c of n.messages){let d;try{d=Y(JSON.parse(c.data))}catch{continue}if(d?.role!=="user")continue;let u=EC(s.get(c.id)??[]);u==="unknown"?o.set(c.id,null):u!==null&&o.set(c.id,u)}let i=new Map,a=new Set;for(let c of n.messages){let d;try{d=Y(JSON.parse(c.data))}catch{continue}if(d?.role!=="assistant")continue;let u=typeof d.parentID=="string"?d.parentID:null;u!==null&&o.has(u)&&!a.has(u)&&(a.add(u),i.set(c.id,{id:u,bytes:o.get(u)}))}let l=[];for(let c of n.messages){r.signal.throwIfAborted();let d;try{d=Y(JSON.parse(c.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&d&&Object.hasOwn(d,"tokens")&&d.role!=="assistant")return{status:"partial"};if(!d||d.role!=="assistant")continue;let u=new tr,f=new nr,m=0,p=i.get(c.id);p&&f.record({direction:"read",kind:"prompt",id:p.id,ref:null,bytes:p.bytes,basis:p.bytes===null?"unknown":"input_text"});for(let b of s.get(c.id)??[]){let k;try{k=Y(JSON.parse(b.data))}catch{return{status:"partial"}}if(k?.type!=="tool")continue;let N=typeof k.tool=="string"?k.tool.toLowerCase():"",O=cy(k.tool),I=Y(k.state),v=Y(I?.input),A=typeof k.callID=="string"&&k.callID?k.callID:typeof I?.callID=="string"&&I.callID?I.callID:b.id;if(O==="written")u.record(A,"written",Fa(v),dy(v));else if(O==="apply_patch"){let R=v?.patchText;if(typeof R=="string")for(let x of ja(R))u.record(A,"written",x.path,x.bytes);else Ko(f,A)}else if(O==="read"){let R=Fa(v,["filePath","path","file","file_path"]);if(R===null)continue;let x=null;if(I?.status==="completed"){let C=Y(Y(I.metadata)?.display);C?.type==="file"&&typeof C.text=="string"&&(x=Buffer.byteLength(C.text,"utf8"))}u.record(A,"read",R,x)}else if(N==="webfetch"){m+=1;let R=I?.status==="completed"?I.output:void 0;f.record({direction:"read",kind:"web",id:A,ref:ly(v?.url),bytes:typeof R=="string"?Buffer.byteLength(R,"utf8"):null,basis:typeof R=="string"?"normalized_content":"unknown"})}else Su(k.tool)||Ko(f,A)}let _=Y(d.time),h=Y(d.model)?.modelID??d.modelID,g=gC(d.tokens,r.requireBillingCounters),E=Y(d.tokens),y=u.files("read"),T=u.files("written"),w=f.entries(),S=bu({reasoning:E?.reasoning,webFetch:m>0?m:void 0},g.output,g.input_cache_write);if(l.push({response_id:c.id,timestamp:ku(_?.created??c.time_created),model:typeof h=="string"&&h?h:null,tokens:g,files_read:y,files_written:T,external_io:w,read_bytes:Ls(y,w,"read"),write_bytes:Ls(T,w,"written"),model_provider:typeof d.providerID=="string"&&d.providerID?d.providerID:null,pricing_facts:S}),l.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:t,revision:e,checkpoint:e,responses:l}}async function Eu(t,e){if(!ny(t))return null;let n=await UL(t).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await Tu(t).catch(()=>null);if(!r)return null;for(let s of e){let o=await Tu(s).catch(()=>kn(s)),i=HL(o,r);if(i===""||!i.startsWith(`..${BL}`)&&i!==".."&&!ny(i))return r}return null}async function ay(t,e,n,r,s=null){let o=[],i=0,a=!1;async function l(c){r.signal.throwIfAborted();let d=await jL(c,{withFileTypes:!0}).catch(()=>[]);d.sort((u,f)=>rr(u.name,f.name));for(let u of d){if(r.signal.throwIfAborted(),o.length>=e)return;if(i+=1,i>n){a=!0;return}let f=Wr(c,u.name);if(u.isDirectory()&&!u.isSymbolicLink()){if(await l(f),a||o.length>=e)return}else if(u.isFile()&&u.name.endsWith(".jsonl")){let m=await Tu(f).catch(()=>kn(f));(s===null||rr(m,s)>0)&&o.push(m)}}}return await l(t),{paths:o.sort(rr),truncated:a}}function wC(t,e){let n=new Set;if(e.length===0)return n;let r=400;for(let{db:s}of t)for(let o=0;o<e.length;o+=r){let i=e.slice(o,o+r);try{let a=s.prepare(`SELECT id FROM session WHERE id IN (${i.map(()=>"?").join(",")})`).all(...i);for(let l of a)typeof l.id=="string"&&n.add(l.id)}catch{}}return n}function uy(t={}){return new wu(t)}var tr,XL,nr,qL,Rs,Vo,GL,Iu,VL,yu,QL,ZL,eC,nC,yC,wu,fy=L(()=>{"use strict";tu();nu();La();su();Cg();$g();du();Gg();_u();tr=class{map=new Map;record(e,n,r,s){if(typeof r!="string"||r.length===0||r.includes("\0"))return;let o=`${e}\0${n}\0${r}`;this.map.has(o)||this.map.set(o,{direction:n,path:r,bytes:s})}files(e){let n=[];for(let r of this.map.values())r.direction===e&&n.push({path:r.path,bytes:r.bytes});return n}absorb(e){for(let[n,r]of e.map)this.map.has(n)||this.map.set(n,r)}},XL=0,nr=class{map=new Map;record(e){let n;e.id!==null?n=`id\0${e.id}\0${e.direction}\0${e.kind}`:e.bytes===null?n=`mark\0${e.direction}\0${e.kind}\0${e.basis}\0${e.ref??""}`:n=`seq\0${XL++}`,this.map.has(n)||this.map.set(n,e)}entries(){return[...this.map.values()]}absorb(e){for(let[n,r]of e.map)this.map.has(n)||this.map.set(n,r)}},qL=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);Rs=["claude","codex","lmplayer",Yn,zn,jr,Zn,Qn,er,"muse","miniplayer"],Vo={input_uncached:null,input_cached:null,input_cache_write:null,output:null},GL=5e5,Iu="bx3",VL=PL(import.meta.url);yu=["claude","codex","lmplayer"];QL=["read","read_file","view","view_file","view_image"],ZL=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],eC=["filePath","path","file","file_path","filepath","notebook_path","paths"];nC=[["text(await tools.apply_patch(",2],["await tools.apply_patch(",1],["tools.apply_patch(",1]];yC=new Set(["session-job-notification"]);wu=class{claudeProjectsDir;codexSessionDirs;lmplayerDbPaths;sqliteBusyTimeoutMs;maxDiscoveryTraversalVisits;agyReader;dshReader;qwenReader;opencodeReader;copilotReader;kimiReader;sessionDataReaders;constructor(e={}){this.sessionDataReaders=Object.fromEntries([dg(e.museDataHome),xa(e.miniplayerHome)].map(n=>[n.provider,new bs(n)])),this.claudeProjectsDir=kn(e.claudeProjectsDir??Wr(Pa(),".claude","projects")),this.codexSessionDirs=(e.codexSessionDirs??[Wr(Pa(),".codex","sessions"),Wr(Pa(),".code","sessions")]).map(n=>kn(n)),this.lmplayerDbPaths=(e.lmplayerDbPaths??JL()).map(n=>kn(n)),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3,this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):GL,this.agyReader=Sg(e.agyConversationsDir?{agyConversationsDir:e.agyConversationsDir}:{}),this.dshReader=Lg(e.dshHome?{dshHome:e.dshHome}:{}),this.qwenReader=Mg(e.qwenProjectsDirs?{qwenProjectsDirs:e.qwenProjectsDirs}:{}),this.opencodeReader=jg(e.opencodeDbPaths?{dbPaths:e.opencodeDbPaths}:{}),this.copilotReader=qg(e.copilotSessionStateDir?{copilotSessionStateDir:e.copilotSessionStateDir}:{}),this.kimiReader=ey(e.kimiHome?{kimiHome:e.kimiHome}:{})}capabilities(){let e=vu("sha256").update(JSON.stringify({claudeProjectsDir:this.claudeProjectsDir,codexSessionDirs:this.codexSessionDirs,lmplayerDbPaths:this.lmplayerDbPaths,agyExtractionRevisionTag:Ca,sessionData:Object.values(this.sessionDataReaders).map(({format:n})=>[n.provider,n.root,n.revision])})).digest("hex");return{scope:"account",revision:`${Iu}:${e}`,providers:[...Rs],metering:{muse:"partial",miniplayer:"partial",claude:"per_response",codex:"per_response",lmplayer:"per_response",opencode:"per_response",[Qn]:"per_response",[zn]:"per_response",[Yn]:"partial",[Zn]:"partial",[er]:"per_response"}}}async discover(e){if(Jo(e),!Number.isSafeInteger(e.maxSources)||e.maxSources<=0)throw new Error("maxSources must be a positive safe integer");let n=zL(e.after),r=n?.pos??new Map,s=n?.done??new Set,o=n?.rr??0,i=Rs.filter(h=>!s.has(h));if(i.length===0)return{sources:[],complete:!0,cursor:null};let a=new Map,l=new Map;for(let h of i){e.signal.throwIfAborted();let g=r.get(h)??null,{sources:E,truncated:y}=await this.discoverProvider(Rs.indexOf(h),e,e.maxSources+1,g);if(y)throw new Error(`passive session discovery exceeded the traversal budget for provider "${h}"; cannot certify a complete or progressing sweep`);let T=g?Ua({provider:h,source_id:g.source_id,sessionid:g.sessionid}):null,w=T===null?E:E.filter(S=>rr(Ua(S),T)>0);l.set(h,w.length>e.maxSources),a.set(h,w.slice(0,e.maxSources))}let c=o%i.length,d=i.map((h,g)=>i[(g+c)%i.length]),u=new Map(i.map(h=>[h,0])),f=[],m=!0;for(;f.length<e.maxSources&&m;){m=!1;for(let h of d){if(f.length>=e.maxSources)break;let g=a.get(h),E=u.get(h);E<g.length&&(f.push(g[E]),u.set(h,E+1),m=!0)}}let p={},_=[...s];for(let h of i){let g=a.get(h),E=u.get(h);if(!l.get(h)&&E===g.length){_.push(h);continue}if(E>0){let T=g[E-1];p[h]={source_id:T.source_id,sessionid:T.sessionid}}else{let T=r.get(h);T&&(p[h]=T)}}return Rs.every(h=>_.includes(h))?{sources:f,complete:!0,cursor:null}:{sources:f,complete:!1,cursor:YL({pos:p,done:_,rr:o+1})}}async inspect(e,n){if(Jo(n),!Rs.includes(e.provider))return{status:"unsupported"};if(e.provider==="claude"||e.provider==="codex"){let r=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,s=await Eu(e.source_id,r);if(!s||!this.jsonlSourceMatches(e,s))return{status:"unavailable"};let o=await oy(s,n).catch(()=>null);return o?{status:"ready",revision:o.revision}:{status:"partial"}}return e.provider==="lmplayer"?this.inspectLmplayer(e,n):e.provider===Yn?this.agyReader.inspect(e,n):e.provider===zn?this.dshReader.inspect(e,n):e.provider===jr?this.opencodeReader.inspect(e,n):e.provider===Zn?this.copilotReader.inspect(e,n):e.provider===Qn?this.qwenReader.inspect(e,n):e.provider===er?this.kimiReader.inspect(e,n):this.sessionDataReaders[e.provider]?.inspect(e,n)??{status:"unsupported"}}async read(e,n,r){if(Jo(r),e.provider==="claude"||e.provider==="codex"){let s=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,o=await Eu(e.source_id,s);if(!o||!this.jsonlSourceMatches(e,o))return{status:"unavailable"};let i=await oy(o,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let a=sC(i.data,r);return a?e.provider==="claude"?fC(a,e,n,r,oC(o)):_C(a,e,n,r):{status:"partial"}}if(e.provider==="lmplayer")return this.readLmplayer(e,n,r);if(e.provider===Yn)return this.agyReader.read(e,n,r);if(e.provider===zn)return this.dshReader.read(e,n,r);if(e.provider===jr)return this.opencodeReader.read(e,n,r);if(e.provider===Qn)return this.qwenReader.read(e,n,r);if(e.provider===Zn){let{snapshot:s,sessionUsage:o}=await this.copilotReader.readWithUsage(e,n,r);return s.status!=="complete"?s:{...s,session_usage:o}}return e.provider===er?this.kimiReader.read(e,n,r):this.sessionDataReaders[e.provider]?this.sessionDataReaders[e.provider].read(e,n,r):{status:"unsupported"}}async discoverProvider(e,n,r,s){let o=s?.source_id??null;if(e===0){let{paths:i,truncated:a}=await ay(this.claudeProjectsDir,r,this.maxDiscoveryTraversalVisits,n,o);return{sources:i.map(l=>({provider:"claude",sessionid:$a(l,".jsonl"),source_id:l})).sort(gu),truncated:a}}if(e===1){let i=[],a=!1;for(let l of[...this.codexSessionDirs].sort(rr)){let c=await ay(l,r,this.maxDiscoveryTraversalVisits,n,o);c.truncated&&(a=!0);for(let d of c.paths){let u=$a(d,".jsonl"),f=u.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u);i.push({provider:"codex",sessionid:f?.[1]??u,source_id:d})}}return{sources:i.sort(gu).slice(0,r),truncated:a}}if(e===2)return{sources:await this.discoverLmplayer(n,r,s),truncated:!1};if(e===3)return this.agyReader.discover(n,r,o);if(e===4)return this.dshReader.discover(n,r,o);if(e===5)return this.opencodeReader.discover(n,r,s);if(e===6){let i=s?`${s.source_id}\0${s.sessionid}`:null;return this.copilotReader.discover(n,r,i)}return e===7?this.qwenReader.discover(n,r,o):e===8?this.kimiReader.discover(n,r,o):this.sessionDataReaders[Rs[e]].discover(n,r,o)}jsonlSourceMatches(e,n){let r=$a(n,".jsonl");return e.provider==="claude"?r===e.sessionid:(r.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u)?.[1]??r)===e.sessionid}openLmplayer(e){if(!this.lmplayerDbPaths.includes(kn(e)))return null;try{let n=new(KL())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discoverLmplayer(e,n,r){let s=[];try{let o=[...new Set(this.lmplayerDbPaths.map(a=>kn(a)))].sort(rr);for(let a of o){e.signal.throwIfAborted();let l=await Eu(a,[kn(a,"..")]);if(!l)continue;let c=this.openLmplayer(l);c&&s.push({path:l,db:c})}let i=[];for(let a=0;a<s.length&&i.length<n;a+=1){e.signal.throwIfAborted();let{path:l,db:c}=s[a];if(r&&rr(l,r.source_id)<0)continue;let d=r?.source_id===l?r.sessionid:"";for(;;){e.signal.throwIfAborted();let u;try{u=c.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(d,n)}catch{break}if(u.length===0)break;let f=u.map(p=>typeof p.id=="string"&&p.id?p.id:"").filter(Boolean);if(f.length===0)break;let m=a===0?new Set:wC(s.slice(0,a),f);for(let p of f){if(i.length>=n)break;m.has(p)||i.push({provider:"lmplayer",sessionid:p,source_id:l})}if(d=f[f.length-1],i.length>=n||u.length<n)break}}return i.sort(gu).slice(0,n)}finally{for(let{db:o}of s)try{o.close()}catch{}}}inspectLmplayer(e,n){let r=this.openLmplayer(e.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return{status:"unavailable"};let o=iy(r,e.sessionid,n);return o?{status:"ready",revision:o.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}readLmplayer(e,n,r){let s=this.openLmplayer(e.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let i=iy(s,e.sessionid,r);if(!i||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=TC(e,n,i,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}}});function Yo(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function Hr(t){let e=Yo(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=t.split(`
|
|
15
|
+
`)}async function oy(t,e){Jo(e);let n=await ty(t).catch(()=>null);if(!n?.isFile()||n.size>e.maxBytes)return null;let r=await FL(t,{signal:e.signal});e.signal.throwIfAborted();let s=await ty(t).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${Iu}:sha256:${vu("sha256").update(r).digest("hex")}`,data:r}}function sC(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=[],r=0;for(;r<t.length;){e.signal.throwIfAborted();let s=t.indexOf(10,r);s===-1&&(s=t.length);let o=t.toString("utf8",r,s);if(r=s+1,!!o.trim())try{let i=z(JSON.parse(o));if(!i)return null;n.push(i)}catch{return null}}return n}function oC(t){return $a(WL(t))==="subagents"}function iC(t){let e=z(t);if(!e)return null;let n=mt(e.input_tokens),r=mt(e.output_tokens);if(n===null||r===null)return null;let s=e.cache_read_input_tokens===void 0?0:mt(e.cache_read_input_tokens),o=e.cache_creation_input_tokens===void 0?0:mt(e.cache_creation_input_tokens);return s===null||o===null?null:{input_uncached:n+o,input_cached:s,input_cache_write:o,output:r}}function aC(t,e){let n=new Map;for(let r of t){if(e.signal.throwIfAborted(),r.type!=="user")continue;let s=z(r.message),o=Array.isArray(s?.content)?s.content:null;if(!o)continue;let i=o.map(z).filter(d=>d?.type==="tool_result"),a=i.length===1,l=z(r.toolUseResult),c=l?.type==="text"?z(l.file):null;for(let d of i){if(typeof d.tool_use_id!="string"||d.tool_use_id.length===0)continue;let u,f=null;if(d.is_error===!0)u=null;else if(a&&c&&typeof c.content=="string")u=Buffer.byteLength(c.content,"utf8"),f=typeof c.filePath=="string"?c.filePath:null;else if(typeof d.content=="string"){let m=sy(d.content);u=m!==null?Buffer.byteLength(m,"utf8"):null}else if(Array.isArray(d.content)){let m=d.content.map(z).filter(p=>p?.type==="text"&&typeof p.text=="string").map(p=>p.text);if(m.length===1){let p=sy(m[0]);u=p!==null?Buffer.byteLength(p,"utf8"):null}else u=null}else u=null;n.set(d.tool_use_id,{bytes:u,cleanPath:f})}}return n}function lC(t){let e=t?.content;if(typeof e=="string")return Buffer.byteLength(e,"utf8");if(Array.isArray(e)){let n=0,r=!1;for(let s of e){let o=z(s);o?.type==="text"&&typeof o.text=="string"&&(n+=Buffer.byteLength(o.text,"utf8"),r=!0)}if(r)return n}return null}function cC(t){if(t.type!=="user"||t.toolUseResult!==void 0||t.isMeta===!0||t.isCompactSummary===!0||t.isVisibleInTranscriptOnly===!0||t.promptSource==="system"||t.scheduledTaskId!==void 0||t.scheduledFireId!==void 0)return!1;let e=z(t.message)?.content;return!(Array.isArray(e)&&e.some(n=>z(n)?.type==="tool_result"))}function dC(t){let e=new Map,n=new Set,r=new Map;for(let i of t){let a=typeof i.uuid=="string"&&i.uuid?i.uuid:null;if(a!==null&&(e.set(a,typeof i.parentUuid=="string"&&i.parentUuid?i.parentUuid:null),cC(i))){n.add(a);let l=lC(z(i.message));l!==null&&r.set(a,l)}}let s=new Map;return{promptBytes:r,parent:e,resolve:i=>{let a=[],l=new Set,c=i,d;for(;;){let u=s.get(c);if(u){d=u;break}if(n.has(c)){d={kind:"found",uuid:c};break}if(!e.has(c)){d={kind:"broken"};break}if(l.has(c)){d={kind:"broken"};break}l.add(c),a.push(c);let f=e.get(c)??null;if(f===null){d={kind:"clean"};break}c=f}for(let u of a)s.set(u,d);return d}}}function uC(t,e){let n=z(e.cache_creation),r=z(e.output_tokens_details),s=z(e.server_tool_use),o=(i,a)=>{let l=xs(a);l!==null&&(t[i]=l)};o("cacheWrite5m",n?.ephemeral_5m_input_tokens),o("cacheWrite1h",n?.ephemeral_1h_input_tokens),o("reasoning",r?.thinking_tokens),o("webSearch",s?.web_search_requests),o("webFetch",s?.web_fetch_requests)}function fC(t,e,n,r,s=!1){let o=aC(t,r),{promptBytes:i,parent:a,resolve:l}=dC(t),c=new Set,d=(p,_)=>{let h=i.get(_)??null;p.record({direction:"read",kind:"prompt",id:_,ref:null,bytes:h,basis:h===null?"unknown":"input_text"})},u=p=>{p.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"})},f=new Map;for(let p of t){if(r.signal.throwIfAborted(),p.type!=="assistant"||p.isSidechain===!0&&!s||p.isMeta===!0)continue;let _=z(p.message);if(!_||typeof _.id!="string"||_.id.length===0)continue;let h=f.get(_.id);if(!h){if(h={meta:{response_id:_.id,timestamp:ku(p.timestamp),model:null,tokens:{...Vo},files_read:[],files_written:[]},obs:new tr,io:new nr,pricingRaw:{}},f.set(_.id,h),f.size>r.maxRows)return{status:"partial"};let E=typeof p.uuid=="string"&&p.uuid?p.uuid:null;if(E===null)u(h.io);else{let y=l(E);if(y.kind==="broken")u(h.io);else if(y.kind==="found"){let T=[],w=y.uuid;for(;w!==null&&!c.has(w);){let S=w;c.add(S),T.push(S);let b=a.get(S)??null;if(b===null){w=null;continue}let k=l(b);w=k.kind==="found"?k.uuid:null}for(let S=T.length-1;S>=0;S-=1)d(h.io,T[S])}}}let g=z(_.usage);if(g){let E=iC(g);E&&(h.meta.tokens=E),uC(h.pricingRaw,g)}if(typeof _.model=="string"&&_.model&&(h.meta.model=_.model),Array.isArray(_.content))for(let E of _.content){let y=z(E);if(y?.type!=="tool_use")continue;let T=typeof y.id=="string"&&y.id?y.id:_.id,w=cy(y.name),S=tC(y.input),b=typeof y.name=="string"?y.name.toLowerCase():"";if(w==="read"){let k=Fa(S,["file_path","filePath","path","file"]);if(k===null)continue;let N=o.get(T),O=N===void 0||N.cleanPath!==null&&N.cleanPath!==k?null:N.bytes;h.obs.record(T,"read",k,O)}else if(w==="written")h.obs.record(T,"written",Fa(S),dy(S));else if(w==="apply_patch"){let k=typeof S=="string"?S:z(S)?.input;if(typeof k=="string")for(let N of ja(k))h.obs.record(T,"written",N.path,N.bytes)}else b==="webfetch"||b==="websearch"?h.io.record({direction:"read",kind:"web",id:T,ref:ly(z(S)?.url),bytes:null,basis:"unknown"}):Su(y.name)||Ko(h.io,T)}}let m=[];for(let{meta:p,obs:_,io:h,pricingRaw:g}of f.values()){let E=_.files("read"),y=_.files("written"),T=h.entries();m.push({...p,files_read:E,files_written:y,external_io:T,read_bytes:Ls(E,T,"read"),write_bytes:Ls(y,T,"written"),model_provider:null,pricing_facts:bu(g,p.tokens.output,p.tokens.input_cache_write)})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:m}}function mC(t){let e=z(t);if(!e)return null;let n=mt(e.input_tokens),r=mt(e.cached_input_tokens),s=mt(e.output_tokens);if(n===null||r===null||s===null||r>n)return null;let o=e.cache_write_input_tokens===void 0?null:mt(e.cache_write_input_tokens);return e.cache_write_input_tokens!==void 0&&o===null?null:{input_uncached:n-r,input_cached:r,input_cache_write:o,output:s}}function pC(t,e,n){let r=typeof t.call_id=="string"&&t.call_id?t.call_id:null,s=typeof t.name=="string"?t.name.toLowerCase():"",o=t.type==="custom_tool_call"?t.input:t.arguments;if(s==="apply_patch"&&typeof o=="string"){if(r!==null)for(let i of ja(o))e.record(r,"written",i.path,i.bytes);return}if(typeof o=="string"){let i=rC(o);if(i!==null){if(r!==null)for(let a of ja(i))e.record(r,"written",a.path,a.bytes);return}}Su(s)||Ko(n,r)}function hC(t){let n=z(t.internal_chat_message_metadata_passthrough)?.content_item_kinds,r=t.content;if(!Array.isArray(n))return"unknown";if(!Array.isArray(r))return"injected";let s=0,o=!1;for(let i=0;i<r.length;i+=1){if(n[i]!=="user.text")continue;let a=z(r[i]);a&&typeof a.text=="string"&&(s+=Buffer.byteLength(a.text,"utf8"),o=!0)}return o?{bytes:s}:"injected"}function _C(t,e,n,r){let s=new Map,o=new Map,i=null,a=null,l=new tr,c=new nr,d=0,u=!1,f=!0,m=new Set;for(let _ of t){r.signal.throwIfAborted();let h=z(_.payload);if(_.type==="session_meta"&&h&&typeof h.model_provider=="string"&&h.model_provider){a=h.model_provider;continue}if(_.type==="turn_context"&&h){let T=typeof h.model=="string"&&h.model?h.model:null;T&&(i=T),T&&typeof h.turn_id=="string"&&o.set(h.turn_id,T);continue}if(_.type==="response_item"&&h){if(h.type==="function_call"||h.type==="custom_tool_call")pC(h,l,c);else if(h.type==="local_shell_call")Ko(c,typeof h.call_id=="string"?h.call_id:null);else if(h.type==="web_search_call")d+=1,c.record({direction:"read",kind:"web",id:typeof h.id=="string"?h.id:null,ref:null,bytes:null,basis:"unknown"});else if(h.type==="message"&&h.role==="user"){let T=hC(h),w=typeof h.id=="string"&&h.id?h.id:null;T==="unknown"?c.record({direction:"read",kind:"prompt",id:w,ref:null,bytes:null,basis:"unknown"}):T!=="injected"&&(w===null?c.record({direction:"read",kind:"prompt",id:null,ref:null,bytes:null,basis:"unknown"}):m.has(w)||(m.add(w),c.record({direction:"read",kind:"prompt",id:w,ref:null,bytes:T.bytes,basis:"input_text"})))}continue}if(_.type==="event_msg"&&h?.type==="token_count"){u=!0,f&&(l=new tr,c=new nr,d=0);continue}if(_.type!=="token_usage_record"||!h)continue;if(typeof h.response_id!="string"||h.response_id.length===0)return{status:"unsupported"};let g=mC(h.usage);if(!g)return{status:"partial"};let E=typeof h.turn_id=="string"?o.get(h.turn_id)??i:i,y=s.get(h.response_id);if(!y&&(y={meta:{response_id:h.response_id,timestamp:null,model:null,tokens:g,files_read:[],files_written:[]},obs:new tr,io:new nr,rawUsage:null,webSearch:0},s.set(h.response_id,y),s.size>r.maxRows))return{status:"partial"};f=!1,y.meta.timestamp=ku(_.timestamp),y.meta.model=E??null,y.meta.tokens=g,y.rawUsage=z(h.usage),y.obs.absorb(l),y.io.absorb(c),y.webSearch+=d,l=new tr,c=new nr,d=0}if(u&&s.size===0)return{status:"unsupported"};let p=[];for(let{meta:_,obs:h,io:g,rawUsage:E,webSearch:y}of s.values()){let T=h.files("read"),w=h.files("written"),S=g.entries(),b=z(E),k=bu({reasoning:b?.reasoning_output_tokens,webSearch:y>0?y:void 0},_.tokens.output,_.tokens.input_cache_write);p.push({..._,files_read:T,files_written:w,external_io:S,read_bytes:Ls(T,S,"read"),write_bytes:Ls(w,S,"written"),model_provider:a,pricing_facts:k})}return{status:"complete",source:e,revision:n,checkpoint:n,responses:p,...u?{capture_status:"partial"}:{}}}function gC(t,e=!1){let n=z(t);if(!n)return{...Vo};let r=n.input===void 0?e?null:0:mt(n.input),s=n.output===void 0?e?null:0:mt(n.output),o=n.reasoning===void 0?e?null:0:mt(n.reasoning),i=z(n.cache),a=i?.read===void 0?e?null:0:mt(i.read),l=i?.write===void 0?e?null:0:mt(i.write);return e&&r===0&&s===0&&o===0&&a===0&&l===0?{...Vo}:e?{input_uncached:r!==null&&l!==null&&Number.isSafeInteger(r+l)?r+l:null,input_cached:a,input_cache_write:l,output:s!==null&&o!==null&&Number.isSafeInteger(s+o)?s+o:null}:r===null||s===null||o===null||a===null||l===null?{...Vo}:r+s+o+a+l===0?{...Vo}:{input_uncached:r+l,input_cached:a,input_cache_write:l,output:s+o}}function iy(t,e,n){Jo(n);let r=n.maxRows*20,s=t.prepare("SELECT (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM message WHERE session_id=?) + (SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) FROM part WHERE session_id=?) AS total").get(e,e),o=mt(s?.total);if(o===null||o>n.maxBytes)return null;let i=t.prepare("SELECT id,time_created,time_updated,data FROM message WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1),a=t.prepare("SELECT id,message_id,time_created,time_updated,data FROM part WHERE session_id=? ORDER BY time_created,id LIMIT ?").all(e,r+1);if(i.length+a.length>r)return null;let l=0,c=vu("sha256");for(let d of[...i,...a]){n.signal.throwIfAborted();let u=JSON.stringify(d);if(l+=Buffer.byteLength(u),l>n.maxBytes)return null;c.update(u).update(`
|
|
16
|
+
`)}return{revision:`${Iu}:sha256:${c.digest("hex")}`,messages:i,parts:a}}function EC(t){let e=0,n=!1,r=!1;for(let s of t){let o;try{o=z(JSON.parse(s.data))}catch{continue}let i=typeof o?.type=="string"?o.type:"";o?.synthetic===!0||o?.ignored===!0||(i==="text"&&typeof o.text=="string"?(e+=Buffer.byteLength(o.text,"utf8"),n=!0):i&&!yC.has(i)&&(r=!0))}return n?e:r?"unknown":null}function TC(t,e,n,r){let s=new Map;for(let c of n.parts){let d=s.get(c.message_id)??[];d.push(c),s.set(c.message_id,d)}let o=new Map;for(let c of n.messages){let d;try{d=z(JSON.parse(c.data))}catch{continue}if(d?.role!=="user")continue;let u=EC(s.get(c.id)??[]);u==="unknown"?o.set(c.id,null):u!==null&&o.set(c.id,u)}let i=new Map,a=new Set;for(let c of n.messages){let d;try{d=z(JSON.parse(c.data))}catch{continue}if(d?.role!=="assistant")continue;let u=typeof d.parentID=="string"?d.parentID:null;u!==null&&o.has(u)&&!a.has(u)&&(a.add(u),i.set(c.id,{id:u,bytes:o.get(u)}))}let l=[];for(let c of n.messages){r.signal.throwIfAborted();let d;try{d=z(JSON.parse(c.data))}catch{return{status:"partial"}}if(r.requireBillingCounters&&d&&Object.hasOwn(d,"tokens")&&d.role!=="assistant")return{status:"partial"};if(!d||d.role!=="assistant")continue;let u=new tr,f=new nr,m=0,p=i.get(c.id);p&&f.record({direction:"read",kind:"prompt",id:p.id,ref:null,bytes:p.bytes,basis:p.bytes===null?"unknown":"input_text"});for(let b of s.get(c.id)??[]){let k;try{k=z(JSON.parse(b.data))}catch{return{status:"partial"}}if(k?.type!=="tool")continue;let N=typeof k.tool=="string"?k.tool.toLowerCase():"",O=cy(k.tool),I=z(k.state),v=z(I?.input),A=typeof k.callID=="string"&&k.callID?k.callID:typeof I?.callID=="string"&&I.callID?I.callID:b.id;if(O==="written")u.record(A,"written",Fa(v),dy(v));else if(O==="apply_patch"){let R=v?.patchText;if(typeof R=="string")for(let x of ja(R))u.record(A,"written",x.path,x.bytes);else Ko(f,A)}else if(O==="read"){let R=Fa(v,["filePath","path","file","file_path"]);if(R===null)continue;let x=null;if(I?.status==="completed"){let C=z(z(I.metadata)?.display);C?.type==="file"&&typeof C.text=="string"&&(x=Buffer.byteLength(C.text,"utf8"))}u.record(A,"read",R,x)}else if(N==="webfetch"){m+=1;let R=I?.status==="completed"?I.output:void 0;f.record({direction:"read",kind:"web",id:A,ref:ly(v?.url),bytes:typeof R=="string"?Buffer.byteLength(R,"utf8"):null,basis:typeof R=="string"?"normalized_content":"unknown"})}else Su(k.tool)||Ko(f,A)}let _=z(d.time),h=z(d.model)?.modelID??d.modelID,g=gC(d.tokens,r.requireBillingCounters),E=z(d.tokens),y=u.files("read"),T=u.files("written"),w=f.entries(),S=bu({reasoning:E?.reasoning,webFetch:m>0?m:void 0},g.output,g.input_cache_write);if(l.push({response_id:c.id,timestamp:ku(_?.created??c.time_created),model:typeof h=="string"&&h?h:null,tokens:g,files_read:y,files_written:T,external_io:w,read_bytes:Ls(y,w,"read"),write_bytes:Ls(T,w,"written"),model_provider:typeof d.providerID=="string"&&d.providerID?d.providerID:null,pricing_facts:S}),l.length>r.maxRows)return{status:"partial"}}return{status:"complete",source:t,revision:e,checkpoint:e,responses:l}}async function Eu(t,e){if(!ny(t))return null;let n=await UL(t).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await Tu(t).catch(()=>null);if(!r)return null;for(let s of e){let o=await Tu(s).catch(()=>kn(s)),i=HL(o,r);if(i===""||!i.startsWith(`..${BL}`)&&i!==".."&&!ny(i))return r}return null}async function ay(t,e,n,r,s=null){let o=[],i=0,a=!1;async function l(c){r.signal.throwIfAborted();let d=await jL(c,{withFileTypes:!0}).catch(()=>[]);d.sort((u,f)=>rr(u.name,f.name));for(let u of d){if(r.signal.throwIfAborted(),o.length>=e)return;if(i+=1,i>n){a=!0;return}let f=Wr(c,u.name);if(u.isDirectory()&&!u.isSymbolicLink()){if(await l(f),a||o.length>=e)return}else if(u.isFile()&&u.name.endsWith(".jsonl")){let m=await Tu(f).catch(()=>kn(f));(s===null||rr(m,s)>0)&&o.push(m)}}}return await l(t),{paths:o.sort(rr),truncated:a}}function wC(t,e){let n=new Set;if(e.length===0)return n;let r=400;for(let{db:s}of t)for(let o=0;o<e.length;o+=r){let i=e.slice(o,o+r);try{let a=s.prepare(`SELECT id FROM session WHERE id IN (${i.map(()=>"?").join(",")})`).all(...i);for(let l of a)typeof l.id=="string"&&n.add(l.id)}catch{}}return n}function uy(t={}){return new wu(t)}var tr,XL,nr,qL,Rs,Vo,GL,Iu,VL,yu,QL,ZL,eC,nC,yC,wu,fy=L(()=>{"use strict";tu();nu();La();su();Cg();$g();du();Gg();_u();tr=class{map=new Map;record(e,n,r,s){if(typeof r!="string"||r.length===0||r.includes("\0"))return;let o=`${e}\0${n}\0${r}`;this.map.has(o)||this.map.set(o,{direction:n,path:r,bytes:s})}files(e){let n=[];for(let r of this.map.values())r.direction===e&&n.push({path:r.path,bytes:r.bytes});return n}absorb(e){for(let[n,r]of e.map)this.map.has(n)||this.map.set(n,r)}},XL=0,nr=class{map=new Map;record(e){let n;e.id!==null?n=`id\0${e.id}\0${e.direction}\0${e.kind}`:e.bytes===null?n=`mark\0${e.direction}\0${e.kind}\0${e.basis}\0${e.ref??""}`:n=`seq\0${XL++}`,this.map.has(n)||this.map.set(n,e)}entries(){return[...this.map.values()]}absorb(e){for(let[n,r]of e.map)this.map.has(n)||this.map.set(n,r)}},qL=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"]);Rs=["claude","codex","lmplayer",Yn,zn,jr,Zn,Qn,er,"muse","miniplayer"],Vo={input_uncached:null,input_cached:null,input_cache_write:null,output:null},GL=5e5,Iu="bx3",VL=PL(import.meta.url);yu=["claude","codex","lmplayer"];QL=["read","read_file","view","view_file","view_image"],ZL=["write","write_file","edit","edit_file","multiedit","notebookedit","notebook_edit"],eC=["filePath","path","file","file_path","filepath","notebook_path","paths"];nC=[["text(await tools.apply_patch(",2],["await tools.apply_patch(",1],["tools.apply_patch(",1]];yC=new Set(["session-job-notification"]);wu=class{claudeProjectsDir;codexSessionDirs;lmplayerDbPaths;sqliteBusyTimeoutMs;maxDiscoveryTraversalVisits;agyReader;dshReader;qwenReader;opencodeReader;copilotReader;kimiReader;sessionDataReaders;constructor(e={}){this.sessionDataReaders=Object.fromEntries([dg(e.museDataHome),xa(e.miniplayerHome)].map(n=>[n.provider,new bs(n)])),this.claudeProjectsDir=kn(e.claudeProjectsDir??Wr(Pa(),".claude","projects")),this.codexSessionDirs=(e.codexSessionDirs??[Wr(Pa(),".codex","sessions"),Wr(Pa(),".code","sessions")]).map(n=>kn(n)),this.lmplayerDbPaths=(e.lmplayerDbPaths??JL()).map(n=>kn(n)),this.sqliteBusyTimeoutMs=e.sqliteBusyTimeoutMs??5e3,this.maxDiscoveryTraversalVisits=e.maxDiscoveryTraversalVisits&&e.maxDiscoveryTraversalVisits>0?Math.trunc(e.maxDiscoveryTraversalVisits):GL,this.agyReader=Sg(e.agyConversationsDir?{agyConversationsDir:e.agyConversationsDir}:{}),this.dshReader=Lg(e.dshHome?{dshHome:e.dshHome}:{}),this.qwenReader=Mg(e.qwenProjectsDirs?{qwenProjectsDirs:e.qwenProjectsDirs}:{}),this.opencodeReader=jg(e.opencodeDbPaths?{dbPaths:e.opencodeDbPaths}:{}),this.copilotReader=qg(e.copilotSessionStateDir?{copilotSessionStateDir:e.copilotSessionStateDir}:{}),this.kimiReader=ey(e.kimiHome?{kimiHome:e.kimiHome}:{})}capabilities(){let e=vu("sha256").update(JSON.stringify({claudeProjectsDir:this.claudeProjectsDir,codexSessionDirs:this.codexSessionDirs,lmplayerDbPaths:this.lmplayerDbPaths,agyExtractionRevisionTag:Ca,sessionData:Object.values(this.sessionDataReaders).map(({format:n})=>[n.provider,n.root,n.revision])})).digest("hex");return{scope:"account",revision:`${Iu}:${e}`,providers:[...Rs],metering:{muse:"partial",miniplayer:"partial",claude:"per_response",codex:"per_response",lmplayer:"per_response",opencode:"per_response",[Qn]:"per_response",[zn]:"per_response",[Yn]:"partial",[Zn]:"partial",[er]:"per_response"}}}async discover(e){if(Jo(e),!Number.isSafeInteger(e.maxSources)||e.maxSources<=0)throw new Error("maxSources must be a positive safe integer");let n=zL(e.after),r=n?.pos??new Map,s=n?.done??new Set,o=n?.rr??0,i=Rs.filter(h=>!s.has(h));if(i.length===0)return{sources:[],complete:!0,cursor:null};let a=new Map,l=new Map;for(let h of i){e.signal.throwIfAborted();let g=r.get(h)??null,{sources:E,truncated:y}=await this.discoverProvider(Rs.indexOf(h),e,e.maxSources+1,g);if(y)throw new Error(`passive session discovery exceeded the traversal budget for provider "${h}"; cannot certify a complete or progressing sweep`);let T=g?Ua({provider:h,source_id:g.source_id,sessionid:g.sessionid}):null,w=T===null?E:E.filter(S=>rr(Ua(S),T)>0);l.set(h,w.length>e.maxSources),a.set(h,w.slice(0,e.maxSources))}let c=o%i.length,d=i.map((h,g)=>i[(g+c)%i.length]),u=new Map(i.map(h=>[h,0])),f=[],m=!0;for(;f.length<e.maxSources&&m;){m=!1;for(let h of d){if(f.length>=e.maxSources)break;let g=a.get(h),E=u.get(h);E<g.length&&(f.push(g[E]),u.set(h,E+1),m=!0)}}let p={},_=[...s];for(let h of i){let g=a.get(h),E=u.get(h);if(!l.get(h)&&E===g.length){_.push(h);continue}if(E>0){let T=g[E-1];p[h]={source_id:T.source_id,sessionid:T.sessionid}}else{let T=r.get(h);T&&(p[h]=T)}}return Rs.every(h=>_.includes(h))?{sources:f,complete:!0,cursor:null}:{sources:f,complete:!1,cursor:YL({pos:p,done:_,rr:o+1})}}async inspect(e,n){if(Jo(n),!Rs.includes(e.provider))return{status:"unsupported"};if(e.provider==="claude"||e.provider==="codex"){let r=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,s=await Eu(e.source_id,r);if(!s||!this.jsonlSourceMatches(e,s))return{status:"unavailable"};let o=await oy(s,n).catch(()=>null);return o?{status:"ready",revision:o.revision}:{status:"partial"}}return e.provider==="lmplayer"?this.inspectLmplayer(e,n):e.provider===Yn?this.agyReader.inspect(e,n):e.provider===zn?this.dshReader.inspect(e,n):e.provider===jr?this.opencodeReader.inspect(e,n):e.provider===Zn?this.copilotReader.inspect(e,n):e.provider===Qn?this.qwenReader.inspect(e,n):e.provider===er?this.kimiReader.inspect(e,n):this.sessionDataReaders[e.provider]?.inspect(e,n)??{status:"unsupported"}}async read(e,n,r){if(Jo(r),e.provider==="claude"||e.provider==="codex"){let s=e.provider==="claude"?[this.claudeProjectsDir]:this.codexSessionDirs,o=await Eu(e.source_id,s);if(!o||!this.jsonlSourceMatches(e,o))return{status:"unavailable"};let i=await oy(o,r).catch(()=>null);if(!i)return{status:"partial"};if(i.revision!==n)return{status:"partial"};let a=sC(i.data,r);return a?e.provider==="claude"?fC(a,e,n,r,oC(o)):_C(a,e,n,r):{status:"partial"}}if(e.provider==="lmplayer")return this.readLmplayer(e,n,r);if(e.provider===Yn)return this.agyReader.read(e,n,r);if(e.provider===zn)return this.dshReader.read(e,n,r);if(e.provider===jr)return this.opencodeReader.read(e,n,r);if(e.provider===Qn)return this.qwenReader.read(e,n,r);if(e.provider===Zn){let{snapshot:s,sessionUsage:o}=await this.copilotReader.readWithUsage(e,n,r);return s.status!=="complete"?s:{...s,session_usage:o}}return e.provider===er?this.kimiReader.read(e,n,r):this.sessionDataReaders[e.provider]?this.sessionDataReaders[e.provider].read(e,n,r):{status:"unsupported"}}async discoverProvider(e,n,r,s){let o=s?.source_id??null;if(e===0){let{paths:i,truncated:a}=await ay(this.claudeProjectsDir,r,this.maxDiscoveryTraversalVisits,n,o);return{sources:i.map(l=>({provider:"claude",sessionid:$a(l,".jsonl"),source_id:l})).sort(gu),truncated:a}}if(e===1){let i=[],a=!1;for(let l of[...this.codexSessionDirs].sort(rr)){let c=await ay(l,r,this.maxDiscoveryTraversalVisits,n,o);c.truncated&&(a=!0);for(let d of c.paths){let u=$a(d,".jsonl"),f=u.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u);i.push({provider:"codex",sessionid:f?.[1]??u,source_id:d})}}return{sources:i.sort(gu).slice(0,r),truncated:a}}if(e===2)return{sources:await this.discoverLmplayer(n,r,s),truncated:!1};if(e===3)return this.agyReader.discover(n,r,o);if(e===4)return this.dshReader.discover(n,r,o);if(e===5)return this.opencodeReader.discover(n,r,s);if(e===6){let i=s?`${s.source_id}\0${s.sessionid}`:null;return this.copilotReader.discover(n,r,i)}return e===7?this.qwenReader.discover(n,r,o):e===8?this.kimiReader.discover(n,r,o):this.sessionDataReaders[Rs[e]].discover(n,r,o)}jsonlSourceMatches(e,n){let r=$a(n,".jsonl");return e.provider==="claude"?r===e.sessionid:(r.match(/^rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/u)?.[1]??r)===e.sessionid}openLmplayer(e){if(!this.lmplayerDbPaths.includes(kn(e)))return null;try{let n=new(KL())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.sqliteBusyTimeoutMs}`),n}catch{return null}}async discoverLmplayer(e,n,r){let s=[];try{let o=[...new Set(this.lmplayerDbPaths.map(a=>kn(a)))].sort(rr);for(let a of o){e.signal.throwIfAborted();let l=await Eu(a,[kn(a,"..")]);if(!l)continue;let c=this.openLmplayer(l);c&&s.push({path:l,db:c})}let i=[];for(let a=0;a<s.length&&i.length<n;a+=1){e.signal.throwIfAborted();let{path:l,db:c}=s[a];if(r&&rr(l,r.source_id)<0)continue;let d=r?.source_id===l?r.sessionid:"";for(;;){e.signal.throwIfAborted();let u;try{u=c.prepare("SELECT id FROM session WHERE id > ? ORDER BY id LIMIT ?").all(d,n)}catch{break}if(u.length===0)break;let f=u.map(p=>typeof p.id=="string"&&p.id?p.id:"").filter(Boolean);if(f.length===0)break;let m=a===0?new Set:wC(s.slice(0,a),f);for(let p of f){if(i.length>=n)break;m.has(p)||i.push({provider:"lmplayer",sessionid:p,source_id:l})}if(d=f[f.length-1],i.length>=n||u.length<n)break}}return i.sort(gu).slice(0,n)}finally{for(let{db:o}of s)try{o.close()}catch{}}}inspectLmplayer(e,n){let r=this.openLmplayer(e.source_id);if(!r)return{status:"unavailable"};try{if(r.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return{status:"unavailable"};let o=iy(r,e.sessionid,n);return o?{status:"ready",revision:o.revision}:{status:"partial"}}catch{return{status:"unsupported"}}finally{r.close()}}readLmplayer(e,n,r){let s=this.openLmplayer(e.source_id);if(!s)return{status:"unavailable"};try{if(s.exec("BEGIN"),s.prepare("SELECT id FROM session WHERE id=?").get(e.sessionid)?.id!==e.sessionid)return s.exec("ROLLBACK"),{status:"unavailable"};let i=iy(s,e.sessionid,r);if(!i||i.revision!==n)return s.exec("ROLLBACK"),{status:"partial"};let a=TC(e,n,i,r);return s.exec("COMMIT"),a}catch{try{s.exec("ROLLBACK")}catch{}return{status:"unsupported"}}finally{s.close()}}}});function Yo(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function Hr(t){let e=Yo(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=t.split(`
|
|
17
17
|
`).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let o=[],i=new Map;for(let a=1;a<n.length;a++){let l;try{l=JSON.parse(n[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=i.get(d.id);u?vC(u,d):(o.push(d),i.set(d.id,d))}else o.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function vC(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&my(t.tokens)&&my(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function my(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function py(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:n,...r}=t,s=[JSON.stringify(r)];for(let o of n)s.push(JSON.stringify(o));return s.join(`
|
|
18
18
|
`)+`
|
|
19
19
|
`}var Wa=L(()=>{"use strict"});import{createHash as hy}from"node:crypto";import{opendir as SC,open as bC,realpath as _y}from"node:fs/promises";import{constants as Au}from"node:fs";import{join as IC,relative as kC,isAbsolute as AC,basename as NC,dirname as RC}from"node:path";function LC(t,e,n){try{if(t==="pi"){let d=e.split(`
|
|
@@ -1703,7 +1703,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1703
1703
|
${d}`)}`}st.renderGrid=QE;function ZE(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:l}={}){return QE(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:l})}function ID(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:l,stream:c=process.stdout}={}){let d=ZE(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:l});d&&c.write(`${d}
|
|
1704
1704
|
`)}st.formatTable=ZE;st.printTable=ID;function XE(t){return t instanceof Date?t.getTime():typeof t=="number"?t:typeof t=="string"&&t.trim()?Date.parse(t):NaN}function kD(t,{now:e=Date.now()}={}){let n=XE(e);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=XE(t);if(!Number.isFinite(r))return"unknown";let s=r-n,o=Math.floor(Math.abs(s)/1e3);if(o===0)return"now";for(let[i,a]of[["w",604800],["d",86400],["h",3600],["m",60],["s",1]])if(o>=a)return`${Math.floor(o/a)}${i}${s<0?" ago":""}`}st.formatRelativeTime=kD;function AD(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=t<0?"-":"",n=Math.abs(t);if(n<1e3)return String(t);let r=Math.round(n/1e3);return r<1e3?`${e}${r}K`:`${e}${(n/1e6).toFixed(1)}M`}st.formatCount=AD;var zu=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function ND(t,{maxUnit:e="w",style:n="spaced"}={}){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let r=zu.findIndex(([a])=>a===e);if(r===-1)throw new TypeError('maxUnit must be one of "w", "d", "h", "m", "s"');if(n!=="spaced"&&n!=="compact")throw new TypeError('style must be "spaced" or "compact"');let s=Math.floor(Math.max(0,t)/1e3);if(n==="compact"){let a=zu.slice(r).filter(([u])=>u!=="s");if(a.length===0||s<60)return"<1m";let l=[],c=s,d=!1;for(let[u,f]of a){let m=Math.floor(c/f);if(c-=m*f,m>0&&!d){let p=u==="d"||u==="w"?`${m}${u}`:`${tn(m)}${u}`;l.push({text:p,zero:!1}),d=!0}else d&&l.push({text:`${tn(m)}${u}`,zero:m===0})}for(;l.length>0&&l[l.length-1].zero;)l.pop();return l.map(u=>u.text).join("")}let o=s,i=[];for(let[a,l]of zu.slice(r))if(o>=l||a==="s"&&i.length===0){let c=Math.floor(o/l);if(o-=c*l,i.push(`${c}${a}`),i.length===2)break}return i.join(" ")}st.formatDuration=ND;function eT(t){return t===void 0?new Date:t instanceof Date?t:typeof t=="number"||typeof t=="string"?new Date(t):new Date(NaN)}function tn(t){return String(t).padStart(2,"0")}function tT(t){let e=eT(t);return Number.isNaN(e.getTime())?"unknown":`${tn(e.getHours())}:${tn(e.getMinutes())}:${tn(e.getSeconds())}`}st.formatClock=tT;function RD(t){let e=eT(t);return Number.isNaN(e.getTime())?"unknown":`${`${e.getFullYear()}-${tn(e.getMonth()+1)}-${tn(e.getDate())}`} ${tT(e)}`}st.formatLocalTimestamp=RD;function xD(t){return typeof t=="number"&&Number.isFinite(t)?`${Math.round(t*100)}%`:"?%"}st.formatPercent=xD;function LD(t,{width:e=10,fill:n="#",empty:r=" ",unknown:s="?"}={}){if(typeof e!="number"||!Number.isInteger(e)||e<1)throw new TypeError("width must be a positive integer");for(let[i,a]of[["fill",n],["empty",r],["unknown",s]])if(typeof a!="string"||[...a].length!==1||/[\x00-\x1f\x7f-\x9f]/u.test(a)||Ln(a)!==1)throw new TypeError(`${i} must be a single character with terminal display width 1`);if(typeof t!="number"||!Number.isFinite(t))return s.repeat(e);let o=Math.min(e,Math.max(0,Math.round(t*e)));return`${n.repeat(o)}${r.repeat(e-o)}`}st.formatBar=LD;function CD(t){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let e=Math.floor(Math.max(0,t)/1e3),n=Math.floor(e/86400);e-=n*86400;let r=Math.floor(e/3600);e-=r*3600;let s=Math.floor(e/60);e-=s*60;let o=`${tn(r)}:${tn(s)}:${tn(e)}`;return n>0?`${n}d ${o}`:o}st.formatTimer=CD;function OD(t){return(t==null?"":String(t)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
|
|
1705
1705
|
`?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}st.escapeCell=OD});var iT={};me(iT,{defaultDbPath:()=>Qu,describeStateLocation:()=>di,isSlowWslMount:()=>oT,lmctlNextHome:()=>sT,resolveDbPath:()=>Ye,warnIfSlowDbPath:()=>Zu});import{platform as nT}from"node:os";import{homedir as DD}from"node:os";import{join as rT}from"node:path";function sT(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:rT(t.HOME||DD(),MD)}function Qu(t=process.env){return rT(sT(t),$D)}function Ye(t,e=process.env){return t!==void 0&&t.length>0?t:e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0?e.LMCTL_DB:Qu(e)}function di(t,e=process.env){return e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0&&e.LMCTL_DB!==Qu(e)?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}function oT(t,e=nT()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function Zu(t,e=process.stderr,n=nT()){oT(t,n)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
1706
|
-
`)}var MD,$D,Cn=L(()=>{"use strict";MD=".lmctl",$D="state.db"});function On(t){return(t.env??process.env).LMCTL_NON_INTERACTIVE==="1"}function dl(t){return{...t,env:{...t.env??process.env,LMCTL_NON_INTERACTIVE:"1"}}}function Ce(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:Ye(void 0,{...process.env,...t.env})}async function W(t,e){if(t.dal!==void 0)return e(t.dal);let n=Fe({path:Ce(t)});try{return await e(n)}finally{n.close()}}function ae(t,e,n=["--json"]){let r=new Set(e),s=new Set(n),o=Array.from(new Set([...e,...n])),i=[],a={},l=new Map;for(let u of o){if(!u.startsWith("--"))continue;let f=u.slice(2).split(/[-_]/);if(!(f.length<2||f.some(m=>!/^[a-z0-9]+$/.test(m))))for(let m of["","_","-"]){let p=`--${f.join(m)}`,_=l.get(p)??[];_.push(u),l.set(p,_)}}function c(u){if(s.has(u)&&r.has(u))return null;if(s.has(u)||r.has(u))return u;let f=l.get(u);if(f!==void 0&&f.length===1){let m=f[0];return s.has(m)&&r.has(m)?null:m}return null}let d=u=>o.length>0?`unknown flag: ${u} (supported flags: ${o.join(", ")})`:`unknown flag: ${u}`;for(let u=0;u<t.length;u+=1){let f=t[u];if(!f.startsWith("--")){i.push(f);continue}let m=c(f);if(m===null)return{positionals:i,flags:a,error:d(f)};if(s.has(m)){a[m]=!0;continue}if(!r.has(m))return{positionals:i,flags:a,error:d(f)};let p=t[u+1];if(p===void 0||p.startsWith("--"))return{positionals:i,flags:a,error:`missing value for ${m}`};a[m]=p,u+=1}return{positionals:i,flags:a}}function V(t,e){let n=t.flags[e];return typeof n=="string"?n:void 0}function
|
|
1706
|
+
`)}var MD,$D,Cn=L(()=>{"use strict";MD=".lmctl",$D="state.db"});function On(t){return(t.env??process.env).LMCTL_NON_INTERACTIVE==="1"}function dl(t){return{...t,env:{...t.env??process.env,LMCTL_NON_INTERACTIVE:"1"}}}function Ce(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:Ye(void 0,{...process.env,...t.env})}async function W(t,e){if(t.dal!==void 0)return e(t.dal);let n=Fe({path:Ce(t)});try{return await e(n)}finally{n.close()}}function ae(t,e,n=["--json"]){let r=new Set(e),s=new Set(n),o=Array.from(new Set([...e,...n])),i=[],a={},l=new Map;for(let u of o){if(!u.startsWith("--"))continue;let f=u.slice(2).split(/[-_]/);if(!(f.length<2||f.some(m=>!/^[a-z0-9]+$/.test(m))))for(let m of["","_","-"]){let p=`--${f.join(m)}`,_=l.get(p)??[];_.push(u),l.set(p,_)}}function c(u){if(s.has(u)&&r.has(u))return null;if(s.has(u)||r.has(u))return u;let f=l.get(u);if(f!==void 0&&f.length===1){let m=f[0];return s.has(m)&&r.has(m)?null:m}return null}let d=u=>o.length>0?`unknown flag: ${u} (supported flags: ${o.join(", ")})`:`unknown flag: ${u}`;for(let u=0;u<t.length;u+=1){let f=t[u];if(!f.startsWith("--")){i.push(f);continue}let m=c(f);if(m===null)return{positionals:i,flags:a,error:d(f)};if(s.has(m)){a[m]=!0;continue}if(!r.has(m))return{positionals:i,flags:a,error:d(f)};let p=t[u+1];if(p===void 0||p.startsWith("--"))return{positionals:i,flags:a,error:`missing value for ${m}`};a[m]=p,u+=1}return{positionals:i,flags:a}}function V(t,e){let n=t.flags[e];return typeof n=="string"?n:void 0}function Y(t,e){return t.flags[e]===!0}function Z(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1707
1707
|
`)}function D(t,e){return t.stderr.write(`error: ${e}
|
|
1708
1708
|
`),1}function Zr(){return(0,cT.formatClock)()}function ui(t,e,n=5e3){let r=Date.now(),s=r,o=setInterval(()=>{let i=Date.now();i-s<n||t.stderr.write(e(Math.round((i-r)/1e3)))},n);return o.unref(),{poke:()=>{s=Date.now()},stop:()=>clearInterval(o)}}function PD(t=process.env){return t.LMCTL_SELF_SESSIONID!==void 0&&t.LMCTL_SELF_SESSIONID!==""||t.LMCTL_LAUNCH_SOURCE!==void 0&&t.LMCTL_LAUNCH_SOURCE!==""||t.LMCTL_INVOCATION_ID!==void 0&&t.LMCTL_INVOCATION_ID!==""||t.LMCTL_NON_INTERACTIVE==="1"}function UD(t){let e=t.env??process.env;return e.LMCTL_HEARTBEAT==="0"||e.LMCTL_HEARTBEAT==="never"?!1:e.LMCTL_HEARTBEAT==="1"||e.LMCTL_HEARTBEAT==="always"?!0:!t.stderr.isTTY?!1:!PD(e)}function FD(t){if(t==null)return!0;if(typeof t!="object")return!1;let e=t;return e.kind==="delta"?typeof e.chunk=="string"&&e.chunk.length>0:e.kind==="progress"&&e.event&&typeof e.event=="object"?aT(e.event):aT(e)}function aT(t){let e=t.kind;return e==="text"||e==="tool_use"||e==="tool_result"?!0:e==="thinking"||e==="system"||e==="api_retry"||e==="warning"?!1:e==="other"}function dT(t,e){if(UD(t)){let l=e.intervalMs??5e3,c=Date.now(),d=c,u=t.env??process.env,f=t.stderr.isTTY===!0&&u.TERM!=="dumb",m=!1,p=setInterval(()=>{let _=Date.now();if(_-d<l)return;let h=Math.round((_-c)/1e3),g=e.alias+": turn still running ("+h+"s elapsed)";f?(m=!0,t.stderr.write("\r\x1B[K"+g)):t.stderr.write(g+`
|
|
1709
1709
|
`)},l);return p.unref(),{poke:()=>{d=Date.now()},stop:()=>{clearInterval(p),f&&m&&t.stderr.write("\r\x1B[K")}}}let n=t.env??process.env,r=e.stallThresholdMs;if(r===void 0){if(n.LMCTL_STALL_THRESHOLD_MS){let l=Number(n.LMCTL_STALL_THRESHOLD_MS);Number.isFinite(l)&&l>0&&(r=l)}else if(n.LMCTL_STALL_MINUTES){let l=Number(n.LMCTL_STALL_MINUTES);Number.isFinite(l)&&l>0&&(r=l*6e4)}}(r===void 0||r<=0)&&(r=10*6e4);let s=Math.min(1e3,r),o=Date.now(),i=!1,a=setInterval(()=>{let c=Date.now()-o;if(c>=r&&!i){i=!0;let d=Math.max(1,Math.floor(c/6e4)),u=e.alias+": no assistant output or tool activity for "+d+" min (reasoning events may still be arriving; inspect with: lmctl tail "+e.teamfile+" "+e.alias+`)
|
|
@@ -1724,11 +1724,11 @@ ${oM(t,ZD,"provider output not saved")}
|
|
|
1724
1724
|
\u2026 ${s} characters of provider stderr dropped \u2026
|
|
1725
1725
|
${r}`}}}function Bs(t,e){return e===""?t:`${t}:${e.includes(`
|
|
1726
1726
|
`)?`
|
|
1727
|
-
`:" "}${e}`}var QD,ZD,eM,tM,nM,rM,It=L(()=>{"use strict";fl();QD=500,ZD=1e6,eM=50,tM=20*1024*1024,nM=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,rM=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as yT,appendFileSync as uM,mkdirSync as fM,existsSync as
|
|
1727
|
+
`:" "}${e}`}var QD,ZD,eM,tM,nM,rM,It=L(()=>{"use strict";fl();QD=500,ZD=1e6,eM=50,tM=20*1024*1024,nM=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,rM=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as yT,appendFileSync as uM,mkdirSync as fM,existsSync as wY,readdirSync as vY,unlinkSync as SY}from"node:fs";import{join as hl,dirname as mM}from"node:path";import{homedir as pM}from"node:os";function rf(){return hl(pM(),".lmctl")}function sf(){Xs=!0,process.env.LMCTL_DEBUG="1"}function ET(){return{cliDebug:Xs,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function TT(t){Xs=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ye(){if(Xs||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-gT>=hM&&(_T=EM(),gT=t),_T}function _i(){return Xs||process.env.LMCTL_DEBUG==="1"}function _M(){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 nf(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 hi(t);if(Array.isArray(t))return t.map(r=>nf(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]=nf(o,s,n);return n.delete(t),r}return t}function gM(t){return nf(t)}function qe(t,e){if(e?.verbose){if(!Xs)return}else if(!e?.always&&!ye())return;try{yM();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,...gM(t)};uM(pl,JSON.stringify(n)+`
|
|
1728
1728
|
`)}catch{}}function yM(){if(!pl){let e=_M().slice(0,13).replace("T","-");pl=hl(rf(),`debug-${e}.log`)}fM(mM(pl),{recursive:!0})}function ze(...t){qe({event:"legacy",msg:t.join(" ")})}function je(...t){qe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function U(t){qe(t,{always:!0})}function EM(){return TM()||wM()}function TM(){try{let t=yT(hl(rf(),"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 wM(){try{let t=yT(hl(rf(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Xs,_T,gT,hM,pl,re=L(()=>{"use strict";It();Xs=!1,_T=!1,gT=0,hM=5e3;pl=null});function jM(t,e){if(!e||t.includes(e))return!1;let n=0;for(let r of t.split(`
|
|
1730
1730
|
`))/^\s{2,}\S.*\([A-Za-z]+\)\s*$/.test(r)&&n++;return n>=3}function Mn(t,e={}){if(typeof t!="string"||t==="")return e.status==="busy"?{class:"receiver_busy",rule:"status-busy"}:e.status==="empty"?{class:"upstream_undisclosed",rule:"status-empty"}:e.status==="stalled"?{class:"transport_interrupted",rule:"status-stalled"}:{class:"unknown",rule:null};for(let n of WM)if(n.test(t,e))return{class:n.class,rule:n.rule};return{class:"unknown",rule:null}}var Ht,WM,_l=L(()=>{"use strict";Ht=t=>e=>t.test(e);WM=[{rule:"usage-limit",class:"quota_exhausted",test:Ht(/usage limit|out of usage credits|quota (has been )?(reached|exhausted)|Insufficient Balance/i)},{rule:"spawn-enoent",class:"binary_missing",test:Ht(/spawn \S+ ENOENT/i)},{rule:"auth-message",class:"auth_required",test:Ht(/Unauthorized|Incorrect API key|invalid api key|not logged in|Authentication required|login required/i)},{rule:"no-content-no-activity",class:"upstream_undisclosed",test:Ht(/no content and no observed activity/i)},{rule:"throttled",class:"upstream_throttled",test:Ht(/rate.?limit|too many requests|at capacity|(?:\bhttp\b[^\n]{0,20}|\bstatus(?: code)?\W{0,3}|\berror\W{0,3}|\bcode\W{0,3})429\b/i)},{rule:"connection-interrupted",class:"transport_interrupted",test:Ht(/connection to the agent was interrupted|stalled for \d+s|provider stalled after/i)},{rule:"context-window",class:"context_exhausted",test:Ht(/ran out of room in the model's context window|context (length|window) (exceeded|full)/i)},{rule:"receiver-held",class:"receiver_busy",test:Ht(/is held by a terminal|is servicing /i)},{rule:"holder-dead",class:"holder_died",test:Ht(/holder process verified not alive|holder_pid confirmed dead|received SIGTERM/i)},{rule:"model-list",class:"model_not_offered",test:(t,e)=>jM(t,e.model)},{rule:"model-message",class:"model_not_offered",test:Ht(/model is not supported|model .{0,60}(does not exist|not found|unavailable)|unknown model|invalid model/i)},{rule:"conversation-gone",class:"stale_session",test:Ht(/No conversation found with session ID|conversation \S+ not found/i)}]});import{openSync as HM,closeSync as BM,fstatSync as XM,readSync as qM,constants as IT}from"node:fs";import{dirname as GM,join as gl}from"node:path";import{createHash as VM}from"node:crypto";function lf(t){if(!Xr(t.catalog)||!qr(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=RT(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(!kT(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&&!kT(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 AT(t){let e=HM(t,IT.O_RDONLY|IT.O_NONBLOCK);try{let n=XM(e);if(!n.isFile()||n.size>JM)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=qM(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{BM(e)}}function cf(t,e=gl(GM(t),"aliases.json")){let n=AT(t),r=AT(e),s;try{s=NT(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=NT(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:VM("sha256").update(n).update(r).digest("hex")};return lf(i),i}function qs(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 lf(o),o})():null}finally{t.pragma("busy_timeout = "+e)}}function df(t,e,n={}){lf(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(RT(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 uf(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=qs(t),o=af.get(t),i=o&&o.hash===s?.sha256?o.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=i&&n-i<Ms(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(cf(gl(r.LMCTL_PRICE_DATA,"model_list.json"))):vt({cacheDir:r.LMCTL_HOME?gl(r.LMCTL_HOME,"cache","lmprice"):r.HOME?gl(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:Ms(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(af.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=df(t,c,{now:n}),u=qs(t);return af.set(t,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function yl(t,e){try{return(await uf(t,{env:e,budgetMs:900})).snapshot??gi}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return gi;try{return qs(t)??gi}catch{return gi}}}async function ff(t){if(t.dal)return yl(t.dal.db,t.env);let e;try{return e=Fe({path:Ce(t),recover:!1}),await yl(e.db,t.env)}catch{return gi}finally{try{e?.close()}catch{}}}var gi,RT,kT,JM,NT,af,El=L(()=>{"use strict";Qt();bt();le();gi={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null},RT=t=>t.record_id??t.source+":"+t.source_model_id,kT=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;JM=64*1024*1024;NT=t=>JSON.parse(t.replace(/^\uFEFF/,""));af=new WeakMap});function $n(t){return t!=="gemini"}function Tl(t){if(!$n(t))throw new Error(cr)}var cr,Gs=L(()=>{"use strict";cr="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function xT(t){if(t.length===0||!t.startsWith("---"))throw new nn("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1731
|
-
`);if(e[0]!=="---")throw new nn("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 nn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!KM.has(c))throw new nn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${wl.join(", ")}`);n[c]=d}if(r===-1)throw new nn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of wl)if(n[i]===void 0)throw new nn(`missing required frontmatter key "${i}" \u2014 required: ${wl.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 wl,KM,nn,LT=L(()=>{"use strict";wl=["title","description","members"],KM=new Set(wl),nn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function ts(t){return mf.has(t)}var mf,yi=L(()=>{"use strict";mf=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as YM,writeFileSync as
|
|
1731
|
+
`);if(e[0]!=="---")throw new nn("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 nn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!KM.has(c))throw new nn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${wl.join(", ")}`);n[c]=d}if(r===-1)throw new nn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of wl)if(n[i]===void 0)throw new nn(`missing required frontmatter key "${i}" \u2014 required: ${wl.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 wl,KM,nn,LT=L(()=>{"use strict";wl=["title","description","members"],KM=new Set(wl),nn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function ts(t){return mf.has(t)}var mf,yi=L(()=>{"use strict";mf=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as YM,writeFileSync as JY,renameSync as KY,existsSync as OT}from"node:fs";import{basename as zM,resolve as Vs,dirname as pf}from"node:path";function QM(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 ZM(t){return/^\s*_MEMBER_\s+\S/.test(t)}function e$(t){return/^\s*_SESSION_\s+\S/.test(t)}function t$(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Oe(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Ei(t){return zM(t).replace(/\.(?:lmctl|lmc)$/i,"")}function Ie(t){let e=YM(t,"utf-8"),n=pf(Vs(t)),r=Pn(e,Ei(t),{baseDir:n,sourcePath:Vs(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Vs(n,s.sessiondir));return r}function Pn(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
|
|
1732
1732
|
`);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=xT(o)}catch(l){if(l instanceof nn)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
1733
1733
|
`);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(e$(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(t$(c)||!ZM(c))continue;let u=QM(c);for(let m of Object.keys(u))if(!CT.includes(m))throw new Error(`line ${d}: unknown key "${m}" on _MEMBER_ line: ${c.trim()}
|
|
1734
1734
|
allowed keys: ${CT.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 Ti(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()===hf.toLowerCase());r.length>1&&n.push({field:hf,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?Vs(e,o.teamfile):Vs(o.teamfile);if(!OT(a))n.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Ie(a),c=Js(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 mf.has(o.provider)?$n(o.provider)||n.push({field:o.alias,message:cr}):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 Js(t){return t.members.find(e=>e.alias.toLowerCase()===hf.toLowerCase())}function _f(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=Vs(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),!OT(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Ie(o),l=Js(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return _f(l,pf(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||pf(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function vl(t,e){return t.members.find(n=>n.alias===e)??t.members.find(n=>n.alias.toLowerCase()===e.toLowerCase())}var hf,CT,Ge=L(()=>{"use strict";Gs();LT();yi();hf="Lead";CT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as n$}from"node:crypto";import{existsSync as DT,readFileSync as MT,realpathSync as r$}from"node:fs";import{dirname as s$,resolve as $T}from"node:path";function Ne(t,e){let n=$T(t);if(DT(n))return r$(n);if(e!==void 0){let r=i$(t,n,e);if(r!==null)return r}return n}function bl(t,e){let n=s$(e),r=Pn(t,Ei(e),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=$T(n,s.sessiondir));return r}function rn(t,e,n=r=>{process.stderr.write(`warning: ${r}
|
|
@@ -1747,7 +1747,7 @@ ${r}`}}}function Bs(t,e){return e===""?t:`${t}:${e.includes(`
|
|
|
1747
1747
|
AND status = 'running'`,e,n),s=0;for(let o of r)If(t,o)!==null&&(s+=1);return s}var Cl=L(()=>{"use strict";ot();bt();Wt()});function Ol(t,e,n){return $n(t)&&e.tools[t]?.agent===void 0&&n.includes(t)}async function Fn(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 zs(`session identity mismatch: expected "${n}", got "${t.sessionId}"`);let o=await t.sendTurn(r,s);if(o.sessionId!==n)throw Object.assign(new zs(`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 Dl(t,e){Tl(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 Fn(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 zs(`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 zs&&(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 zs,Qs=L(()=>{"use strict";Gs();zs=class extends Error{}});import{realpathSync as K$}from"node:fs";import{resolve as Y$}from"node:path";function kf(t){let e=Y$(t);try{return K$(e)}catch{return e}}var lw=L(()=>{"use strict"});import{platform as cw}from"node:os";function Zs(t){let e=new bi;for(let n of t)e.registerAdapter(n);return e}var bi,Af=L(()=>{"use strict";lw();bi=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=kf(e.workspace);o=o.filter(a=>kf(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=cw()==="darwin"||cw()==="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 Lf(){return new Rf}function Cf(t){let e=!1;for(let n of t.split(`
|
|
1748
1748
|
`)){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 Of(t){let e=t.trimEnd().split(`
|
|
1749
1749
|
`).at(-1)?.trimStart()??"";if(!e.startsWith("{"))return!1;try{return JSON.parse(e),!1}catch{return!0}}function dw(t){let e,n=!1,r=!1,s;for(let o of t.split(`
|
|
1750
|
-
`)){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=at(a.input_tokens),c=at(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||c===null||c>l?null:l-c,cacheRead:c,cacheWrite:0,output:at(a.output_tokens),reasoning:at(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:zt([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(Of(t)||Cf(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 at,z$,Nf,Rf,xf,Df=L(()=>{"use strict";zo();at=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,z$=(t,e)=>t===null||e===null?null:at(t+e),Nf=(t,e)=>JSON.stringify([t,e]),Rf=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(Nf(e,n))}turn(e,n=""){return new xf(this,e,n)}};xf=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(Nf(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(Nf(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=>at(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=at(e.emittedAtMs)??d,f=at(e.ordinal)??at(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=at(_.inputTokens),g=at(_.cachedInputTokens),y={source:"wire",inputUncached:h===null||g===null||g>h?null:h-g,cacheRead:g,cacheWrite:at(_.cacheWriteInputTokens??0),output:at(_.outputTokens),reasoning:at(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:zt([_.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],b=y[w];S!==null&&b!==null&&at(S+b)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[w]=z$(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 Q$,writeFileSync as
|
|
1750
|
+
`)){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=at(a.input_tokens),c=at(a.cached_input_tokens);s={source:"wire",inputUncached:l===null||c===null||c>l?null:l-c,cacheRead:c,cacheWrite:0,output:at(a.output_tokens),reasoning:at(a.reasoning_output_tokens),modelReported:typeof i.model=="string"?i.model:null,providerCostUsd:null,reason:null,invalidCounters:zt([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(Of(t)||Cf(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 at,z$,Nf,Rf,xf,Df=L(()=>{"use strict";zo();at=t=>typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null,z$=(t,e)=>t===null||e===null?null:at(t+e),Nf=(t,e)=>JSON.stringify([t,e]),Rf=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(Nf(e,n))}turn(e,n=""){return new xf(this,e,n)}};xf=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(Nf(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(Nf(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=>at(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=at(e.emittedAtMs)??d,f=at(e.ordinal)??at(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=at(_.inputTokens),g=at(_.cachedInputTokens),y={source:"wire",inputUncached:h===null||g===null||g>h?null:h-g,cacheRead:g,cacheWrite:at(_.cacheWriteInputTokens??0),output:at(_.outputTokens),reasoning:at(_.reasoningOutputTokens),modelReported:null,providerCostUsd:null,reason:null,invalidCounters:zt([_.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],b=y[w];S!==null&&b!==null&&at(S+b)===null&&(this.value.invalidCounters=!0,this.value.reason="counter_not_exposed"),this.value[w]=z$(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 Q$,writeFileSync as P6,mkdirSync as U6}from"node:fs";import{join as Z$,dirname as j6}from"node:path";import{homedir as eP}from"node:os";function nP(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function rP(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=nP(t.slice(e+1).trim());return n?{key:n,value:r}:null}function sP(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function Ml(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function oP(){return Z$(eP(),".lmctl","config.toml")}function $l(t){let e=t??oP(),n;try{n=Q$(e,"utf-8")}catch{return{tools:{}}}return iP(n)}function uw(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 iP(t){let e={},n={},r=t.split(`
|
|
1751
1751
|
`),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=uw(o.min);f!==null&&(u.min=f)}if(o.max!==void 0){let f=uw(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=sP(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=rP(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 fw(t){return t.site_name??null}function aP(t,e,n){if(!n)return"";let r=t.tools[e]??Mf[e],s=r?.profiles?.[n]?.flags??Mf[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 mw(t,e){return!!t.tools[e]}function pw(t,e,n,r,s){let o=t.tools[e]??Mf[e],i;if(o?.agent){let l=Ml(r);i=o.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=tP[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(Ml).join(" ");i=`printf '%s\\n' ${Ml(r)} | ${d}`}else i=c.map(Ml).join(" ")}let a=aP(t,e,s);return a&&(i+=" "+a),i}var Mf,tP,Pl=L(()=>{"use strict";Mf={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:""}}}},tP={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 hw(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 _w=L(()=>{"use strict"});function Fl(t){let e=t?.prompt??ee;if(t?.teamfile!==void 0){let n=t.teamfileContent??"";e=`${ee}${yw}${t.teamfile}:
|
|
1752
1752
|
${n}${Pf}${JSON.stringify(t.teamfile)}${Uf}`}return t?.flightToken&&(e=`${t.flightToken.startsWith("[lmctl-seed:")?t.flightToken:`[lmctl-seed:${t.flightToken}]`}
|
|
1753
1753
|
${e}`),e}function gw(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===ee)return!0;let r=`${ee}${yw}`;if(!e.startsWith(r)||!e.endsWith(Uf))return!1;let s=e.slice(r.length),o=s.slice(0,-Uf.length),i=o.lastIndexOf(Pf);if(i===-1)return!1;let a=o.slice(i+Pf.length),l;try{if(l=JSON.parse(a),typeof l!="string")return!1}catch{return!1}let c=`${l}:
|
|
@@ -1869,7 +1869,7 @@ ${n.map((s,o)=>` ${o+1}) ${s}`).join(`
|
|
|
1869
1869
|
`);;){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.
|
|
1870
1870
|
`)}}close(){this.rl?.close()}}});function Fc(t){return/\S\s+\S/u.test(t)}function jb(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("-")&&!Fc(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=Un(e)??(e.endsWith(":")&&Oe(e.slice(0,-1))?{teamfile:e.slice(0,-1),alias:""}:null);if(r||Oe(e)){let o=r?.teamfile??e,i=r?.alias,a=[...n];return!i&&a.length&&!Fc(a[0])&&(i=a.shift()),{kind:"team",file:o,...i!==void 0?{alias:i}:{},...a.length?a.some(Fc)?{prompt:a.join(" ")}:{pendingPrompt:a.join(" ")}:{}}}let s=n.length?n.some(Fc)?{prompt:n.join(" ")}:{pendingPrompt:n.join(" ")}:{};return wf(e)?{kind:"session",id:e,...s}:{kind:"models",query:e,...s}}function jc(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 Wb=L(()=>{"use strict";Ge();ot()});import{spawnSync as Gp}from"node:child_process";import{existsSync as Bb,readFileSync as Xb}from"node:fs";import{homedir as qb}from"node:os";import{resolve as Xp}from"node:path";function po(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 Bj(){let t=Gp("agy",["models"],{encoding:"utf-8",timeout:Hj});return{status:t.status,stdout:t.stdout??"",error:t.error}}function qj(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 fs(t){if(!t&&Wp)return Wp;let e=o=>(t||(Wp=o),o),n;try{n=(t??Xj??Bj)()}catch(o){return e({available:!1,models:[],reason:o instanceof Error?po("agy models",o):`agy models could not be run: ${String(o)}`})}if(n.error)return e({available:!1,models:[],reason:po("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}=qj(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r,displayNames:s})}function Vj(){let t=Gp("codex",["debug","models"],{encoding:"utf-8",timeout:Gj});return{status:t.status,stdout:t.stdout??"",error:t.error}}function Kj(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 ms(t){if(!t&&Hp)return Hp;let e=s=>(t||(Hp=s),s),n;try{n=(t??Jj??Vj)()}catch(s){return e({available:!1,models:[],reason:s instanceof Error?po("codex debug models",s):`codex debug models could not be run: ${String(s)}`})}if(n.error)return e({available:!1,models:[],reason:po("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=Kj(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 zj(t){let e=Gp("opencode",t?["models",t]:["models"],{encoding:"utf-8",timeout:Yj});return{status:e.status,stdout:e.stdout??"",error:e.error}}function Vp(t,e){if(!e&&Bp.has(t))return Bp.get(t);let n=i=>(e||Bp.set(t,i),i),r=t?`opencode models ${t}`:"opencode models",s;try{s=(e??zj)(t)}catch(i){return n({available:!1,models:[],reason:i instanceof Error?po(r,i):`${r} could not be run: ${String(i)}`})}if(s.error)return n({available:!1,models:[],reason:po(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 Jp(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=Zj(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=Vp(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=ps(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: ${na(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=fs(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: ${na(o.models)}`):n.push(`[${r.alias}] model="${r.model}" cannot be verified for agy: ${o.reason}.`);continue}if(s==="dsh"){if(!r.model||mo.includes(r.model))continue;fo.includes(r.model)||n.push(`[${r.alias}] model="${r.model}" is not in dsh's built-in catalog. Valid pinned models: ${na(fo)}. 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): ${na(mo)}. 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===Hb&&n.push(`[${r.alias}] model="${Hb}" 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=ms(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: ${na(o.models)}`);continue}r.model&&(Gb.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 Vb(t,e={}){let n=t.filter(i=>i.model!==void 0&&Gb.has(i.provider.trim().toLowerCase()));if(n.length===0)return{warnings:[],errors:[]};let r=e.snapshot??await vt();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=Qa(a,l,r.catalog,r.aliases);if(c.kind==="unknown"){let d=Yy(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")&&Wj.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 Jb(t,e={}){return(await Vb(t,e)).warnings}async function Kb(t,e={}){return(await Vb(t,e)).errors}function ps(t){let e=process.env.KIMI_CODE_HOME||Xp(qb(),".kimi-code"),n=t??Xp(e,"config.toml");if(!Bb(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=Xb(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=Qj(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 Qj(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 Zj(t){let e=t??Xp(qb(),".config","opencode","opencode.json");if(!Bb(e))return{available:!0,models:[]};let n;try{n=JSON.parse(Xb(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:eW(n)}}function eW(t){if(!qp(t))return[];let e=Wc(t.provider)??Wc(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!qp(s))continue;let o=Wc(s.models)??Wc(s.model);if(o)for(let i of Object.keys(o))n.add(i.startsWith(`${r}/`)?i:`${r}/${i}`)}return[...n].sort()}function Wc(t){return qp(t)?t:null}function qp(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function na(t){return t.length>0?t.join(", "):"(none)"}var Gb,Wj,fo,mo,Hb,Hj,Wp,Xj,Gj,Hp,Jj,Yj,Bp,ho=L(()=>{"use strict";Qt();Jr();Gb=new Set(Object.keys(Zt).filter(t=>t!=="codex"&&t!=="kimi")),Wj=/\d\.(?=\d)/,fo=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],mo=["deepseek-flash","deepseek-pro"],Hb="gpt-5.3-codex-spark",Hj=15e3;Wp=null;Gj=5e3;Hp=null;Yj=5e3;Bp=new Map});function Hc(t){return["agy","opencode","copilot","hermes","pi","lmplayer","miniplayer"].includes(t)}function Yb(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 Zt[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 tW(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=Zt[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")||Hc(t)&&!Yb(o)||n.push(o)}return[...new Set(n)].sort()}async function Bc(t){let e;switch(t){case"dsh":e=[...mo,...fo];break;case"codex":e=ms().models;break;case"agy":e=fs().models;break;case"kimi":e=ps().models;break;case"opencode":e=Vp("").models;break;default:{let{catalog:n}=await vt();e=n?tW(t,n):[]}}return[...new Set(e.filter(n=>!Hc(t)||Yb(n)))].sort()}var Kp=L(()=>{"use strict";Qt();Jr();ho()});var tI={};me(tI,{MODEL_PROVIDERS:()=>qn,knownModelNames:()=>_o,runModels:()=>Xc});function Zb(t,e){switch(t){case"codex":return ms();case"agy":return fs();case"kimi":return ps();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 _o(t){if(!qn.includes(t))return Bc(t);let e=t==="claude"?await vt():{catalog:null,aliases:null,source:"unavailable",generatedAt:null};return Zb(t,e).models}function Yp(t,e){return t==="agy"?e.replace(/-(low|medium|high)$/i,""):e}function zp(t,e,n){if(!qn.includes(t)||!n.catalog)return;let r=rW[t],s=Yp(t,e);return n.catalog.records.find(o=>o.native?.[r]===s)}function ra(t,e,n){let r=St(t,e,n.catalog,n.aliases).state;return r.kind==="priced"||r.kind==="estimated"||r.kind==="known-unpriced"}function sW(t,e,n){if(zp(t,e,n))return!0;let r=eI(t,e,n)?.state;return r?.kind==="priced"||r?.kind==="estimated"||r?.kind==="known-unpriced"}function oW(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)&&ra("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(Yp("agy",a.native.agy));continue}if(a.mode!=="chat")continue;let l=a.source_model_id.split("/").at(-1);(/^gemini-\d/.test(l)?ra("gemini",l,n):a.provider==="anthropic"&&/^claude-[a-z]+-\d+(?:-\d+)?$/.test(l)?ra("claude",l,n):/^gpt-oss-\d/.test(l)?ra("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)&&ra("kimi",l,n)&&s.add(l)}}let o=new Set(e);return[...s].filter(i=>!o.has(i)&&sW(t,i,n))}function eI(t,e,n){if(!n.catalog)return null;if(zp(t,e,n)||t!=="agy")return St(t,e,n.catalog,n.aliases);let s=Yp("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 St("agy",s,{...n.catalog,records:o},n.aliases)}function Qb(t,e,n,r,s){let o=zp(t,e,r),i=eI(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 Xc(t,e,n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(zb),0;let r=ae(t,[],["--old","--json"]),s=r.positionals.find(u=>u!=="all"&&!qn.includes(u)),o=r.error??(s===void 0?void 0:`unknown provider: ${s} (valid targets: all, ${qn.join(", ")})`);if(o!==void 0)return e.stderr.write(`error: ${o}
|
|
1871
1871
|
${zb}`),2;let i=n.selections?.map(u=>u.provider)??(r.positionals.length===0||r.positionals.includes("all")?[...qn]:qn.filter(u=>r.positionals.includes(u)));e.stderr.write(`querying models: ${i.join(", ")} ...
|
|
1872
|
-
`);let a=await(n.loadSnapshot??vt)(),l=
|
|
1872
|
+
`);let a=await(n.loadSnapshot??vt)(),l=Y(r,"--old"),c=[];for(let u of i){let f;try{let g=n.selections?.find(E=>E.provider===u);f=g?.models!==void 0?{available:!0,models:g.models}:n.loadModels?await n.loadModels(u,a):Zb(u,a)}catch(g){f={available:!1,models:[],reason:g instanceof Error?g.message:String(g)}}let m=nW[u]??"provider model list",p=f.available?[...new Set(f.models)].map(g=>Qb(u,g,f.displayNames?.[g]??null,a,u==="claude"?"unverified":"valid")):[],_=p.filter(g=>g.catalog_model===null).map(g=>g.id),h=f.available&&l?oW(u,f.models,a).map(g=>Qb(u,g,null,a,"old")):[];c.push({provider:u,status:f.available?"ok":"unavailable",source:m,reason:f.reason??null,models:[...p,...h],unmatched:_})}if(Y(r,"--json"))return Z(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.
|
|
1873
1873
|
`),e.stdout.write(`Price catalog: ${a.source}${a.generatedAt?` (${a.generatedAt})`:""}
|
|
1874
1874
|
`);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(`
|
|
1875
1875
|
${u.provider} (${u.source})
|
|
@@ -2178,7 +2178,7 @@ ${p}---
|
|
|
2178
2178
|
`),2;r.push(A),I+=1;continue}s.push(v)}let o=ae(s,["--pattern","--provider","--model","--from","--output","--member"],["--json","--stdout","--force","--seed","--no-seed","--wizard","--non-interactive","--no-interactive"]);if(o.error!==void 0)return e.stderr.write(`error: ${o.error}
|
|
2179
2179
|
`),e.stderr.write(`usage: lmctl plan [directory] [options]
|
|
2180
2180
|
`),2;if(o.positionals.length>1)return e.stderr.write(`usage: lmctl plan [directory] [options]
|
|
2181
|
-
`),2;let i=e.cwd??process.cwd(),a=o.positionals[0],l=V(o,"--pattern"),c=V(o,"--provider"),d=V(o,"--model"),u=V(o,"--from"),f=V(o,"--output"),m=
|
|
2181
|
+
`),2;let i=e.cwd??process.cwd(),a=o.positionals[0],l=V(o,"--pattern"),c=V(o,"--provider"),d=V(o,"--model"),u=V(o,"--from"),f=V(o,"--output"),m=Y(o,"--json"),p=Y(o,"--stdout"),_=Y(o,"--force"),h=Y(o,"--seed"),g=Y(o,"--no-seed"),E=Y(o,"--wizard"),y=On(e)||m||Y(o,"--non-interactive")||Y(o,"--no-interactive");if(m&&p)return e.stderr.write(`error: --json and --stdout are mutually exclusive
|
|
2182
2182
|
`),2;if(p&&h)return e.stderr.write(`error: --seed requires a written teamfile; it cannot be combined with --stdout
|
|
2183
2183
|
`),2;if(h&&g)return e.stderr.write(`error: --seed and --no-seed are mutually exclusive
|
|
2184
2184
|
`),2;if(E&&p)return e.stderr.write(`error: --wizard cannot be combined with --stdout
|
|
@@ -2258,9 +2258,9 @@ Examples:
|
|
|
2258
2258
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2259
2259
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
2260
2260
|
`});function Vk(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 Jk=L(()=>{"use strict"});var sA={};me(sA,{applyMaxBytes:()=>Sd,parseTailSince:()=>nA,renderMessage:()=>tA,runTail:()=>QB});async function QB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${zB}
|
|
2261
|
-
`),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=
|
|
2261
|
+
`),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=Y(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
|
|
2262
2262
|
`),2;let s=V(n,"--since"),o=nA(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
|
|
2263
|
-
`),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?KB: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=
|
|
2263
|
+
`),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?KB: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=Y(n,"--watch"),u=V(n,"--watch-interval");if(u!==void 0&&!d)return e.stderr.write(`usage: --watch-interval requires --watch
|
|
2264
2264
|
`),2;let f=u===void 0?YB: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=>ZB(e,E,g,c,d,f,i,r))}catch(E){return Ot(e,E)}}let p=on(JB,{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
|
|
2265
2265
|
`),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=Ie(g)}catch(T){return D(e,`tail: ${T instanceof Error?T.message:String(T)}`)}let y=Js(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=>Ve(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=>Ve(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 br(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 Kk(e,_.provider,_.sessionId,c,-1,i,r);return h===vd?1:d?await new Promise(g=>{let E=async()=>{try{let w=await Kk(e,_.provider,_.sessionId,c,h,i,r);w!==vd&&(h=w)}catch(w){e.stderr.write(`tail: ${w instanceof Error?w.message:String(w)}
|
|
2266
2266
|
`)}},y=setInterval(()=>{E()},f*1e3),T=()=>{clearInterval(y),g(0)};process.once("SIGINT",T),process.once("SIGTERM",T)}):0}async function Kk(t,e,n,r,s,o,i){let a;try{a=await He(n,e)}catch(f){return t.stderr.write(`tail: failed to load session: ${f instanceof Error?f.message:String(f)}
|
|
@@ -2303,7 +2303,7 @@ everything new by construction. --json and --max-bytes cannot be combined;
|
|
|
2303
2303
|
--lines still applies. --watch --json emits one JSON
|
|
2304
2304
|
object per poll tick with something new (NDJSON) -- a tick with
|
|
2305
2305
|
nothing new prints no line at all, same as text mode.`;vd=-2;zk=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
2306
|
-
`});var lA={};me(lA,{isSeedAck:()=>Ff,isSeedPrompt:()=>Ii,runExport:()=>t2,trimExportSeedExchange:()=>aA});function e2(t){return vr().some(e=>e.name===t)}function aA(t){let e=t.messages.findIndex(i=>i.role==="user");if(e===-1||!Ii(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&&Ff(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&&Ii(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 t2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(iA),0;let n=ae(t,["--provider"],["--prompt-only","--json"]);if(n.error!==void 0)return D(e,n.error);let r=
|
|
2306
|
+
`});var lA={};me(lA,{isSeedAck:()=>Ff,isSeedPrompt:()=>Ii,runExport:()=>t2,trimExportSeedExchange:()=>aA});function e2(t){return vr().some(e=>e.name===t)}function aA(t){let e=t.messages.findIndex(i=>i.role==="user");if(e===-1||!Ii(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&&Ff(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&&Ii(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 t2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(iA),0;let n=ae(t,["--provider"],["--prompt-only","--json"]);if(n.error!==void 0)return D(e,n.error);let r=Y(n,"--json"),s=Y(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,iA.trimEnd());let l,c;if(i){if(l=n.positionals[0],c=o,!e2(c))return D(e,`export: provider is not registered: ${c}`)}else l="",c="";let d;if(a){try{d=Ve(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 He(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(aA(u),r)return Z(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(Ii(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}:
|
|
2307
2307
|
${m.content}`);return f.length>0&&e.stdout.write(`${f.join(`
|
|
2308
2308
|
|
|
2309
2309
|
`)}
|
|
@@ -2330,7 +2330,8 @@ ${dA}`),2}let i;try{let a={groups:[],total:hA(),reasons:{usage:{},cost:{}}},l=Ce
|
|
|
2330
2330
|
`),1}finally{i?.close()}}var mA,dA,fA,gA=L(()=>{"use strict";$o();le();mA={day:"day",provider:"provider",model:"model",team:"team",alias:"alias",session:"native_session_id",dir:"cwd"},dA=`usage: lmctl usage [--since D] [--until D] [--by day|provider|model|team|alias|session|dir] [--json]
|
|
2331
2331
|
|
|
2332
2332
|
Stored team and direct turn usage, not session estimates. Default: last 7 days, grouped by UTC day.
|
|
2333
|
-
--since is inclusive; --until is exclusive. ISO
|
|
2333
|
+
--since is inclusive; --until is exclusive. D is an ISO date (YYYY-MM-DD, midnight UTC) or a full ISO timestamp
|
|
2334
|
+
(YYYY-MM-DDTHH:MM[:SS[.fraction]][Z|+HH:MM|-HH:MM]; fraction is 1-3 digits; an omitted zone is UTC).
|
|
2334
2335
|
Unknown usage/cost counts and reason summaries are shown; old unrecorded turns are absent.
|
|
2335
2336
|
Model keys use reported names first; alias-like keys mean the model was not reported.
|
|
2336
2337
|
`;fA=`COUNT(*) AS turns,
|
|
@@ -2357,7 +2358,7 @@ Model keys use reported names first; alias-like keys mean the model was not repo
|
|
|
2357
2358
|
`);for(let[O,I]of S.entries()){O>0&&r.stdout.write(`
|
|
2358
2359
|
`);let v=[0,...I];r.stdout.write((0,yn.renderGrid)([v.map(A=>E[N][A])],{widths:v.map(A=>y[A]),headers:v.map(A=>g[A]),align:v.map((A,R)=>R===0?"left":"right"),margin:2,truncate:!1})+`
|
|
2359
2360
|
`)}}return 0}catch(l){return D(r,`cost: cannot read cost summary: ${l instanceof Error?l.message:String(l)}`)}finally{a?.close()}}async function u2(t,e={stdout:process.stdout,stderr:process.stderr},n=new Date){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${c2}
|
|
2360
|
-
`),0;let r=ae(t,["--provider","--days"],["--json"]);if(r.error!==void 0)return D(e,r.error);let s=
|
|
2361
|
+
`),0;let r=ae(t,["--provider","--days"],["--json"]);if(r.error!==void 0)return D(e,r.error);let s=Y(r,"--json");if(r.positionals.length===0){let y=7,T=V(r,"--days");if(T!==void 0){let S=Number(T);if(!/^[1-9]\d*$/.test(T)||!Number.isSafeInteger(S)||S>366)return D(e,`invalid --days "${T}" (expected an integer from 1 to 366)`);y=S}let w=V(r,"--provider");return w!==void 0&&!ts(w)?D(e,`invalid provider "${w}"; use a canonical provider name (see lmctl help)`):d2(y,w,s,e,n)}if(V(r,"--days")!==void 0)return D(e,"--days is only supported without a target");if(r.positionals.length>2)return D(e,`too many positionals (${r.positionals.length}); expected <target> [alias]`);let o=on(i2,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:V(r,"--provider")}});if(o.mode==="error")return D(e,o.message);if(o.mode==="managed")return D(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,a;if(o.mode==="ai-team")try{let y=await W(e,T=>Ve(o.teamfile,o.alias,T));i=y.provider,a=y.sessionid}catch(y){if(y instanceof ge)return D(e,y.message);throw y}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let y=await br(a);if(y.length===0)return D(e,`cost: session "${a}" not found in any provider store`);if(y.length>1)return D(e,`cost: session "${a}" matches multiple providers (${y.join(", ")}); pass --provider`);i=y[0]}let l;try{l=await He(a,i)}catch(y){return D(e,`cost: failed to load session: ${y instanceof Error?y.message:String(y)}`)}if(l===null)return D(e,`cost: session not found: ${a} (provider=${i})`);let c=await EA(i,a,l),{model:d,modelsUsed:u,approximate:f,tokens:m,costUsd:p,priceEstimated:_,priceRoute:h,costUnavailableReason:g}=c,E={source:c.priceDataSource,generatedAt:c.priceDataGeneratedAt};return s?(Z(e,c),0):(e.stdout.write(`Session: ${a}
|
|
2361
2362
|
`),e.stdout.write(` Provider: ${i}
|
|
2362
2363
|
`),e.stdout.write(` Model: ${d??"(unknown)"}
|
|
2363
2364
|
`),f&&e.stdout.write(` NOTE: this session used multiple models (${u.join(", ")}) -- cost below is approximate, priced at ${d}'s rate for the whole session.
|
|
@@ -2398,7 +2399,7 @@ unavailable) and
|
|
|
2398
2399
|
strict short timeout and NEVER blocks or fails this command: any network
|
|
2399
2400
|
error degrades silently to the local cache, then the bundled built-in
|
|
2400
2401
|
copy, in that order.`});function SA(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}var bA=L(()=>{"use strict"});var kA={};me(kA,{runLs:()=>h2});import{resolve as s_}from"node:path";function p2(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 h2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${f2}
|
|
2401
|
-
`),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=
|
|
2402
|
+
`),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=Y(n,"--json");if(Y(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(Y(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=m2;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>IA)return D(e,`--limit ${h} exceeds maximum (${IA})`);p=h}let _=r==="json"||s===!0?"json":"table";try{return await W(e,async h=>_2(e,h,p,_))}catch(h){return Ot(e,h)}}let i=g2(r,s);if("error"in i)return D(e,i.error);let a=i.format,l=V(n,"--provider"),c=V(n,"--sessiondir"),d=Y(n,"--recursive"),u=Y(n,"--all"),f;try{f=await Rp(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?s_(c):s_(process.cwd());f=f.filter(p=>{let _=s_(p.cwd);return d?_===m||_.startsWith(`${m}/`):_===m})}if(f=p2(f),a==="json")return Z(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}.
|
|
2402
2403
|
`)}return 0}if(a==="teamfile"){for(let m of f)e.stdout.write(`_MEMBER_ alias=- provider=${m.provider} sessionid=${m.sessionId} sessiondir=${m.cwd}
|
|
2403
2404
|
`);return 0}return(0,lt.printTable)(f.map(m=>[(0,lt.escapeCell)(m.sessionId),(0,lt.escapeCell)(m.provider),(0,lt.escapeCell)(m.cwd.length>36?`\u2026${m.cwd.slice(-35)}`:m.cwd),(0,lt.formatRelativeTime)(m.modifiedAt)]),{headers:["SESSION","PROVIDER","SESSIONDIR","MODIFIED"],stream:e.stdout}),0}async function _2(t,e,n,r){let s=SA(e,{limit:n});return r==="json"?(Z(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.
|
|
2404
2405
|
`),0):((0,lt.printTable)(s.map(o=>[(0,lt.escapeCell)(o.id),(0,lt.escapeCell)(o.workflow_id),(0,lt.escapeCell)(o.team_id),(0,lt.escapeCell)(o.current_state??""),(0,lt.escapeCell)(o.terminal_state??""),(0,lt.escapeCell)(o.started_at)]),{headers:["RUN_ID","WORKFLOW","TEAM","STATE","TERMINAL","STARTED"],stream:t.stdout}),0)}function g2(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 lt,f2,m2,IA,AA=L(()=>{"use strict";lt=Ft(Ct(),1);Bn();le();bA();f2=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
@@ -2471,7 +2472,7 @@ it is expected.
|
|
|
2471
2472
|
--force Regenerate the whole example file from detection (previous file
|
|
2472
2473
|
saved as init.toml.bak). Slots you added are NOT kept by --force.
|
|
2473
2474
|
-h, --help display help for command
|
|
2474
|
-
`});function OA(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 DA=L(()=>{"use strict"});import{execFileSync as C2}from"node:child_process";import{resolve as MA}from"node:path";function O2(t){return t.filter(e=>e.state!=="retired")}function $A(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=C2("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=MA(s),i=e.listProjects().find(a=>MA(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 PA(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 UA(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=O2(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 FA=L(()=>{"use strict";le()});function jA(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 WA=L(()=>{"use strict"});var qA={};me(qA,{SIZE_WARN_EST_TOKENS:()=>Ea,estimateTokens:()=>XA,runTeamTerminal:()=>U2,runTerminal:()=>a_});import{constants as D2}from"node:os";import{spawn as M2}from"node:child_process";import{statSync as $2}from"node:fs";async function a_(t,e){if(t.includes("--help")||t.includes("-h"))return B2(e);let n=ae(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return D(e,n.error);if(On(e)&&!
|
|
2475
|
+
`});function OA(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 DA=L(()=>{"use strict"});import{execFileSync as C2}from"node:child_process";import{resolve as MA}from"node:path";function O2(t){return t.filter(e=>e.state!=="retired")}function $A(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=C2("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=MA(s),i=e.listProjects().find(a=>MA(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 PA(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 UA(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=O2(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 FA=L(()=>{"use strict";le()});function jA(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 WA=L(()=>{"use strict"});var qA={};me(qA,{SIZE_WARN_EST_TOKENS:()=>Ea,estimateTokens:()=>XA,runTeamTerminal:()=>U2,runTerminal:()=>a_});import{constants as D2}from"node:os";import{spawn as M2}from"node:child_process";import{statSync as $2}from"node:fs";async function a_(t,e){if(t.includes("--help")||t.includes("-h"))return B2(e);let n=ae(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return D(e,n.error);if(On(e)&&!Y(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"?Y(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=jA(i,s,a);return"err"in l?D(e,l.err):l_(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"?Y(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=on(P2,{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=>BA(e,a.teamfile,a.alias,l,Y(n,"--json")))}try{return await W(e,async s=>{let o=j2(e,s,n);if(typeof o=="number")return o;let i=V(n,"--alias");return Y(n,"--size")?H2(e,s,o,i,Y(n,"--json")):W2(e,s,o,i)})}catch(s){return Ot(e,s)}}async function U2(t,e,n,r,s){let o=await BA(t,e,n,r,!1,s);return{code:s.signalObserved?null:o,signal:s.signalObserved??null}}async function BA(t,e,n,r,s,o){let i;try{i=Ve(e,n,r)}catch(A){return A instanceof ge?D(t,A.message):Ot(t,A)}let a=ir(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:fr(o?.env??t.env)});if(!a.acquired){let A=a.current.holder_pid,R=A===null?null:rt(A)?"live":"dead",x=`${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}, ${R})`);return s?(Z(t,{status:"error",errorKind:"busy",message:x,holder_pid:A,holder_liveness:R}),1):D(t,x)}let l=kb({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 R=r.getTerminalLock(l.teamfile,l.alias);!r.clearTerminalLock(l.teamfile,l.alias,l.lock_id)&&R!==null&&A.push("terminal lock release was not acknowledged")}catch(R){A.push(`terminal lock release: ${R instanceof Error?R.message:String(R)}`)}try{let R=r.getAgentInflight(l.teamfile,l.alias);!r.releaseAgentInflight(a.lease,a.leaseId)&&R!==null&&A.push("inflight release was not acknowledged")}catch(R){A.push(`inflight release: ${R instanceof Error?R.message:String(R)}`)}},w=(A,R)=>{let x=r.db.pragma("busy_timeout",{simple:!0});r.db.pragma("busy_timeout=0");try{A(R)}finally{try{r.db.pragma(`busy_timeout=${x}`)}catch(C){R.push(`busy timeout restore: ${C instanceof Error?C.message:String(C)}`)}}},S=(A,R)=>{if(!(d===null||h))try{if(r.finishTrackedInvocation(d,A)===null){let C=r.getTrackedInvocation(d);C==null||C.status==="running"?R.push("tracked terminal finish was not acknowledged"):h=!0}else h=!0}catch(x){R.push(`tracked terminal finish: ${x instanceof Error?x.message:String(x)}`)}},b=A=>{if(p)return;p=!0;let R=[];try{w(x=>{T(x),S({status:"cancelled",signal:A,exit_code:A==="SIGINT"?130:143,error:`terminal interrupted by ${A}`},x)},R)}catch(x){R.push(x instanceof Error?x.message:String(x))}R.length>0&&(_=Error(R.join("; ")))},k=!o,N=k?new AbortController:void 0,O=()=>N?.abort("SIGINT"),I=()=>N?.abort("SIGTERM");k&&(process.once("SIGINT",O),process.once("SIGTERM",I));let v=o??{env:m,signal:N?.signal};v.env=m;try{if(v.cancel=b,v.cleanupError=()=>_,o&&o.onResource?.({close(){if(E)return E;let x,C;E=new Promise((P,q)=>{x=P,C=q});let M=performance.now();return(async()=>{if(b("SIGTERM"),o.stop?.("SIGTERM"),_)throw _;if(g){let P=5e3-(performance.now()-M),q;try{if(P<=0)throw Error("terminal close deadline exceeded");await Promise.race([g.catch(()=>{}),new Promise(($,ue)=>{q=setTimeout(()=>ue(Error("terminal close deadline exceeded")),P)})])}catch($){throw _=$ instanceof Error?$:Error(String($)),_}finally{clearTimeout(q)}}})().then(x,C),E},finalizeSync(x){if(b(x),o.stop?.(x),_)throw _}}),p||v.signal?.aborted){let x=v.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM";return b(x),x==="SIGINT"?130:143}r.setTerminalLock(l),d=F2(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 x=new Date().toISOString(),C=r.heartbeatTerminalLock(l.teamfile,l.alias,l.lock_id,x);C&&r.heartbeatAgentInflight(a.lease,a.leaseId,x),!C&&c!==null&&(clearInterval(c),c=null)}catch{}},Ab(m)),c.unref?.();try{Ys(t,Ie(i.teamfile),i.teamfile)}catch{}let R=v;return g=l_(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead},x=>{f.push(`${x.provider} terminal ignored model=${x.model}: ${x.reason}`)},R),u=await g,u}catch(A){throw y=A,A}finally{if(k&&(process.removeListener("SIGINT",O),process.removeListener("SIGTERM",I)),!p){p=!0;let A=[];try{w(R=>{T(R),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)}:{}},R)},A)}catch(R){A.push(R instanceof Error?R.message:String(R))}A.length>0&&(_=Error(A.join("; ")))}if(_){if(y===void 0)throw _;try{t.stderr.write("error: terminal cleanup: "+_.message+`
|
|
2475
2476
|
`)}catch{}}}}function F2(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:Hs(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 l_(t,e,n,r){let{provider:s,sessionid:o,sessiondir:i,model:a}=e;if(!Cc(s))return D(t,`no resume incantation for provider "${s}"`);if(!_b.test(o))return D(t,"refusing to resume: malformed sessionid");let l=Cp(s,o,{isLead:e.isLead,model:a,onModelIgnored:p=>{let _=`warning: ${p.provider} terminal ignored model=${p.model}: ${p.reason}`;t.stderr.write(`${_}
|
|
2476
2477
|
`),qe({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=De(r?.env??t.env??process.env,i,o,"terminal"),d=await gb(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+`
|
|
2477
2478
|
`),await new Promise(p=>{if(r?.signal?.aborted){let k=r.signal.reason==="SIGINT"?"SIGINT":"SIGTERM";return r.cancel?.(k),p(k==="SIGINT"?130:143)}let _=r?.streams,h=_?[_.stdin,_.stdout,_.stderr].map(k=>k.fd):void 0,g=h?.every(k=>typeof k=="number"),E=M2(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=k=>{if(!T){T=!0;try{r?.cancel?.(k)}catch{}{try{E.kill(k)}catch{}de(E,{stdinEnd:!1,softDelayMs:0,killDelayMs:100}).catch(()=>{})}}},S=()=>w(r?.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM");r&&(r.stop=w);let b=()=>{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",k=>{b(),p(D(t,`failed to launch ${m}: ${k.message}`))}),E.on("exit",(k,N)=>{b(),r&&(r.signalObserved=N);let O=k??(N?128+(D2.signals[N]??1):1),I=yb(s);I&&O!==0&&O!==130&&O!==143&&!T&&!r?.signal?.aborted&&t.stderr.write(s+" exited with status "+O+". "+I+`
|
|
@@ -2577,7 +2578,7 @@ An omitted model uses the provider default. Existing teamfiles are preserved.
|
|
|
2577
2578
|
Example:
|
|
2578
2579
|
lmctl hello claude -p "hi"
|
|
2579
2580
|
`;sX=/(\w+)=(?:"([^"]*)"|(\S*))/g});function f_(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e],r=iX.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:aX(n.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function aX(t,e,n,r,s){if(!Number.isFinite(t.getTime())||e<1||e>12||n<0||n>59)return null;let o=lX(e,r);try{let i=cX(t,s),a=iN(i.year,i.month,i.day,o,n,s);if(a.getTime()<=t.getTime()){let l=mX(i,1);a=iN(l.year,l.month,l.day,o,n,s)}return a.toISOString()}catch{return null}}function lX(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function cX(t,e){let n=aN(e,!1).formatToParts(t);return{year:Vn(n,"year"),month:Vn(n,"month"),day:Vn(n,"day")}}function iN(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=dX(new Date(i),o);i=Date.UTC(t,e-1,n,r,s,0,0)-l}return new Date(i)}function dX(t,e){let n=aN(e,!0).formatToParts(t);return Date.UTC(Vn(n,"year"),Vn(n,"month")-1,Vn(n,"day"),Vn(n,"hour"),Vn(n,"minute"),Vn(n,"second"),0)-t.getTime()}function aN(t,e){let n=e?fX:uX,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 Vn(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 mX(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 iX,uX,fX,lN=L(()=>{"use strict";iX=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;uX=new Map,fX=new Map});var wN={};me(wN,{appendIntent:()=>p_,formatAge:()=>Ta,formatDuration:()=>xd,resolveIntentLogPath:()=>mN,runStatus:()=>bX,shortIdentity:()=>En});import{appendFileSync as pX,existsSync as hX,mkdirSync as _X}from"node:fs";import{homedir as gX}from"node:os";import{basename as yX,dirname as fN,isAbsolute as EX,join as TX,resolve as wX}from"node:path";function mN(){return process.env.LMCTL_INTENT_LOG??TX(gX(),".lmctl","recent-intents.log")}function p_(t){try{let e=mN();_X(fN(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});pX(e,`${n}
|
|
2580
|
-
`)}catch{}}async function bX(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(vX),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=
|
|
2581
|
+
`)}catch{}}async function bX(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(vX),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=Y(r,"--json"),o=Y(r,"--details");if(r.positionals.length>0){let a=await kX(e,r.positionals,{json:s,details:o,since:V(r,"--since")});return a===0&&p_({verb:"status",args:t}),a}if(o)return D(e,"--details only applies with a teamfile argument (lmctl status <teamfile> --details)");let i=GX(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=>dN(c,a));Z(e,{schema_version:T_,...l})}else{let l=await W(e,async c=>UX(await dN(c,a),{sinceIso:i.iso}));e.stdout.write(l)}return p_({verb:"status",args:t}),0}catch(a){return D(e,a instanceof Error?a.message:String(a))}}async function kX(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=on(IX,{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 VX(t,r.teamfile,n.json,n.details):await ZX(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 dN(t,e){let n=$p(e,t);if(!n.ok){if(n.reason==="not-found")throw new Error(cs("status",e,t));return await NX(t)}return await AX(t,n.identity,e)}async function AX(t,e,n){let r=ds(e),s=t.getRootTeam(r.teamfile);if(s===null)throw new Error(cs("status",n,t));let o=rn(s.teamfile_path,t),i=__(Rd(t,{from:r.value})),a=__(Rd(t,{target_teamfile:r.teamfile,target_alias:r.alias})),l=CX([...h_(t,{from:r.value}),...h_(t,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...pN(),team:{name:o.name,teamfile:s.teamfile_path},members:o.members.map(c=>xX(t,s.teamfile_path,c)),activity:{from_me:i.map(c=>g_(c)),to_me:a.map(c=>g_(c))},transcript_harvest:await hN(l)}}function pN(){let t=null;try{t=fw($l())}catch{}return{db_path:Ye(),site_name:t}}async function NX(t){let e=t.listRootTeams();return{scope:"db",identity:null,...pN(),teams:e.map(n=>RX(t,n)),activity:__(Rd(t)).map(n=>g_(n)),transcript_harvest:await hN(h_(t))}}function RX(t,e){if(!hX(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=rn(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 xX(t,e,n){let r=n.teamfile===void 0?null:Ne(EX(n.teamfile)?n.teamfile:wX(fN(e),n.teamfile),t),s=en(t,e,n.alias),o=s.busy&&s.reason==="in-flight"?LX(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 LX(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,i=t.db.prepare(`
|
|
2581
2582
|
SELECT * FROM tracked_invocation
|
|
2582
2583
|
WHERE kind = 'chat'
|
|
2583
2584
|
AND status = 'running'
|
|
@@ -2626,25 +2627,25 @@ With a teamfile and an alias: single-member deep view (session detail, token
|
|
|
2626
2627
|
breakdown, liveness with terminal-lock/in-flight holder info).
|
|
2627
2628
|
|
|
2628
2629
|
--json emits { schema_version: 2, scope: 'self'|'db'|'team'|'member', ... }.
|
|
2629
|
-
`,T_=2,Nd=5,SX=24*60*60*1e3,m_=72,cN=80;IX={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};yN=new WeakMap});import{isAbsolute as eq,resolve as vN,join as SN}from"node:path";function IN(t){let e=bN.get(t);if(!e)throw Error("Unknown context");return e.dal()}function AN(t){return t!==null&&typeof t=="object"&&kN.has(t)}function NN(t){try{if(!t||typeof t!="object"||Array.isArray(t))return gt("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 gt("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!eq(e.cwd))return gt("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 gt("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return gt("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return gt("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return gt("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return gt("invalid_argument","pid must be a positive integer");let s=vN(e.cwd),o=r.LMCTL_HOME||(r.HOME?SN(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(o?SN(o,"state.db"):void 0)))return gt("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(Ir(h))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:u.signal,env:r,cwd:s,dbPath:vN(s,Ye(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(Ir(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(Ir(w))})):(g.released++,f.delete(y))}catch(T){h.push(Ir(T))}return u.abort(_),E.length?c=Promise.all(E).then(()=>(h.length||m(h),g)):h.length||m(h),g}});return bN.set(p,{resources:f,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=Fe({path:p.dbPath})}}),kN.add(p),tq.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return gt("invalid_argument","Invalid context: "+Ir(e))}}var bN,tq,kN,Ld=L(()=>{"use strict";bt();Cn();Vc();bN=new WeakMap;tq=new WeakMap,kN=new WeakSet});var Dr,DN,Ose,Dse,Mse,$se,Pse,se,v_,Tn,Cd,Or,Od,Md,Ro,RN,xN,LN,xo,Dd,nq,CN,ON,MN,S_=L(()=>{"use strict";Dr=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Dr(e);Object.freeze(t)}return t},DN=Dr(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),Ose=Dr({status:"string",error:"string|null",code:"ErrorCode?"}),Dse=Dr(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),Mse=Dr(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),$se=Dr(["Provider1","Provider2","Provider3"]),Pse=Dr({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"},v_={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},Tn={name:"teamfile",type:"string"},Cd={name:"alias",type:"string"},Or={name:"prompt",type:"string"},Od={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"}]},Md=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],Ro={name:"options",type:"map",optional:!0,keys:Md},RN={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},xN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},LN={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},xo={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Dd={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"}]},nq=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"}],CN={name:"options",type:"map",optional:!0,keys:nq},ON={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},MN=Dr([{name:"resolveProfilePath",implemented:!0,params:[se,v_],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,v_],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:"classifyFailure",implemented:!0,params:[{name:"text",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"model",type:"string"},{name:"status",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null",class:"string",rule:"string|null"},effects:[],summary:"Classify a recorded provider failure text by the one classifier; text no rule recognises is `unknown`, never the nearest class.",scriptBinding:{name:"lm_classify_failure",params:[{name:"text",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"model",type:"string"},{name:"status",type:"string"}]}]}},{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,Tn],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[Tn]}},{name:"resolveMember",implemented:!0,params:[se,Tn,Cd],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:[Tn,Cd]}},{name:"lintTeam",implemented:!0,params:[se,Tn],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:[Tn]}},{name:"seedTeam",implemented:!0,params:[se,Tn,RN],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:[Tn,RN]}},{name:"promptAgent",implemented:!0,params:[se,Od,Or,Ro],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...ON,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Od,Or,Ro]}},{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"},...Md]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",errorKind:"cycle|provider|target?",code:"ErrorCode?",errorClass:"string|null",usage:"map|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[Tn,Cd,Or,{name:"options",type:"map",optional:!0,keys:[...Md,{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,xo,LN],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:[Od,{...LN,optional:!0}]}},{name:"getSession",implemented:!0,params:[se,xo],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:[xo]}},{name:"reserveSession",implemented:!0,params:[se,xo],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,xo,{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"},...Md]}],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"},Or,{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,xN],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:[xN]}},{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:[Tn,Cd]}},{name:"sessionAdmission",implemented:!0,params:[se,xo],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"},Od,Or,Ro],statuses:["ok","busy","stalled","empty","error"],results:{...ON,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"}]},Ro],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"},Or],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,Dd,Or,Ro],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:[Dd,Or,Ro]}},{name:"nativeSessionClose",implemented:!0,params:[se,Dd],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:[Dd]}},{name:"loadProperties",implemented:!0,params:[se,v_],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,CN],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:[CN]}}])});function $N(t){if(!AN(t))return gt("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return gt("cancelled","Context is closed")}function PN(t){return MN.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var UN=L(()=>{"use strict";S_();Ld();Vc()});import{isAbsolute as rq,resolve as sq}from"node:path";function Pd(t){return Number.isFinite(t)&&Math.abs(t)<=oq}function iq(t){if(t&&typeof t=="object"){let e=t.code;if(typeof e=="string"){if(DN.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 k_(t,e=Date.now()){if(t===void 0)return{windowMs:FN};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||!Pd(e-l)?{error:`invalid --since duration: ${t} (cutoff out of representable date range)`}:{windowMs:l}}let r=Date.parse(t);if(!Number.isFinite(r)||!Pd(r))return{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`};let s=Math.max(0,e-r);return Pd(e-s)?{windowMs:s}:{error:`invalid --since value: ${t} (cutoff out of representable date range)`}}function $d(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function I_(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return b_;let s=e.get(n);if(s===void 0){try{s=Ie(n)}catch{s=null}e.set(n,s)}return s===null?b_:vl(s,r)?.model??b_}async function jN(t,e={}){let n=$N(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=PN("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=FN;if(e?.since!==void 0)if(typeof e.since=="number"){if(!Number.isFinite(e.since)||e.since<0||!Pd(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=k_(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=IN(t),i=e?.teamfile!==void 0?rq(e.teamfile)?e.teamfile:sq(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=ar(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:$d(y),model:I_(y,u),started_at:y.started_at,parent_invocation_id:y.parent_invocation_id};if(T==="dead"){if(If(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($d).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=$d(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:I_(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 b=$d(S);E.push({id:S.id,kind:S.kind,origin:S.origin,from_identity:S.from_identity,target:b,model:I_(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:iq(o),running:[],dead:[],idle:[]}}}var FN,oq,b_,WN=L(()=>{"use strict";Ld();UN();S_();Wt();Cl();Ge();sn();FN=24*60*60*1e3,oq=864e13;b_="default"});var VN={};me(VN,{_setRunningWatchMaxTicksForTests:()=>cq,runRunning:()=>yq});import{resolve as aq}from"node:path";function cq(t){N_=t??void 0}function uq(t){let e=t.split(`
|
|
2630
|
+
`,T_=2,Nd=5,SX=24*60*60*1e3,m_=72,cN=80;IX={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};yN=new WeakMap});import{isAbsolute as eq,resolve as vN,join as SN}from"node:path";function IN(t){let e=bN.get(t);if(!e)throw Error("Unknown context");return e.dal()}function AN(t){return t!==null&&typeof t=="object"&&kN.has(t)}function NN(t){try{if(!t||typeof t!="object"||Array.isArray(t))return gt("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 gt("invalid_argument","Unknown context option");if(!e.env||typeof e.env!="object"||Array.isArray(e.env)||typeof e.cwd!="string"||!eq(e.cwd))return gt("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 gt("invalid_argument","Environment values must be strings or undefined");for(let _ of["onProgress","onWarning","clock"])if(e[_]!==void 0&&typeof e[_]!="function")return gt("invalid_argument",_+" must be a function");if(e.interactive!==void 0&&typeof e.interactive!="boolean")return gt("invalid_argument","interactive must be a boolean");if(e.dbPath!==void 0&&(typeof e.dbPath!="string"||!e.dbPath))return gt("invalid_argument","dbPath must be a nonempty string");if(e.pid!==void 0&&(!Number.isInteger(e.pid)||e.pid<=0))return gt("invalid_argument","pid must be a positive integer");let s=vN(e.cwd),o=r.LMCTL_HOME||(r.HOME?SN(r.HOME,".lmctl"):void 0);if(!(e.dbPath||r.LMCTL_DB||(o?SN(o,"state.db"):void 0)))return gt("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(Ir(h))}l=void 0}},p=Object.freeze({status:"ok",error:null,pid:e.pid,signal:u.signal,env:r,cwd:s,dbPath:vN(s,Ye(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(Ir(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(Ir(w))})):(g.released++,f.delete(y))}catch(T){h.push(Ir(T))}return u.abort(_),E.length?c=Promise.all(E).then(()=>(h.length||m(h),g)):h.length||m(h),g}});return bN.set(p,{resources:f,dal(){if(e.dal)return e.dal;if(l)return l;if(a)throw Error("Context is closed");return l??=Fe({path:p.dbPath})}}),kN.add(p),tq.set(p,{activeAgents:new WeakSet,activeSessions:new Set,handoffSessions:new Set,reservations:new Map}),p}catch(e){return gt("invalid_argument","Invalid context: "+Ir(e))}}var bN,tq,kN,Ld=L(()=>{"use strict";bt();Cn();Vc();bN=new WeakMap;tq=new WeakMap,kN=new WeakSet});var Dr,DN,Ose,Dse,Mse,$se,Pse,se,v_,Tn,Cd,Or,Od,Md,Ro,RN,xN,LN,xo,Dd,nq,CN,ON,MN,S_=L(()=>{"use strict";Dr=t=>{if(t&&typeof t=="object"){for(let e of Object.values(t))Dr(e);Object.freeze(t)}return t},DN=Dr(["invalid_argument","not_found","missing","read","syntax","schema","busy","provider","noninteractive","cancelled","internal","closed","service_unavailable","outcome_unknown"]),Ose=Dr({status:"string",error:"string|null",code:"ErrorCode?"}),Dse=Dr(["Provider1","Provider2","Provider3","Model1","Model2","Model3"]),Mse=Dr(["Provider1.Provider","Provider1.Model1","Provider2.Provider","Provider2.Model1","Provider3.Provider","Provider3.Model1"]),$se=Dr(["Provider1","Provider2","Provider3"]),Pse=Dr({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"},v_={name:"options",type:"map",optional:!0,keys:[{name:"path",type:"string"}]},Tn={name:"teamfile",type:"string"},Cd={name:"alias",type:"string"},Or={name:"prompt",type:"string"},Od={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"}]},Md=[{name:"permissionMode",type:"string",values:["yolo","plan"]},{name:"idleTimeoutMs",type:"number"}],Ro={name:"options",type:"map",optional:!0,keys:Md},RN={name:"options",type:"map",optional:!0,keys:[{name:"preamble",type:"string|map"}]},xN={name:"options",type:"map",optional:!0,keys:[{name:"providers",type:"list"},{name:"provider",type:"string"},{name:"timeoutSeconds",type:"number"}]},LN={name:"options",type:"map",keys:[{name:"force",type:"boolean",required:!0,values:[!0]}]},xo={name:"target",type:"map",keys:[{name:"provider",type:"string",required:!0},{name:"sessionid",type:"string",required:!0}]},Dd={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"}]},nq=[{name:"teamfile",type:"string"},{name:"member",type:"string"},{name:"since",type:"string"},{name:"tree",type:"boolean"},{name:"reconcile",type:"boolean"}],CN={name:"options",type:"map",optional:!0,keys:nq},ON={error:"string|null",reply:"string",sessionid:"string|null",messageId:"string|null",teamChatLogId:"number|null"},MN=Dr([{name:"resolveProfilePath",implemented:!0,params:[se,v_],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,v_],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:"classifyFailure",implemented:!0,params:[{name:"text",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"model",type:"string"},{name:"status",type:"string"}]}],statuses:["ok","error"],results:{error:"string|null",class:"string",rule:"string|null"},effects:[],summary:"Classify a recorded provider failure text by the one classifier; text no rule recognises is `unknown`, never the nearest class.",scriptBinding:{name:"lm_classify_failure",params:[{name:"text",type:"string"},{name:"options",type:"map",optional:!0,keys:[{name:"model",type:"string"},{name:"status",type:"string"}]}]}},{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,Tn],statuses:["ok","error"],results:{error:"string|null",members:"Member[]"},effects:["file-read"],summary:"List team members.",scriptBinding:{name:"lm_members",params:[Tn]}},{name:"resolveMember",implemented:!0,params:[se,Tn,Cd],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:[Tn,Cd]}},{name:"lintTeam",implemented:!0,params:[se,Tn],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:[Tn]}},{name:"seedTeam",implemented:!0,params:[se,Tn,RN],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:[Tn,RN]}},{name:"promptAgent",implemented:!0,params:[se,Od,Or,Ro],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{...ON,messageId:"null",teamChatLogId:"null"},effects:["provider","db"],summary:"Turn a provider session without mutating the input member.",scriptBinding:{name:"lm_agent",params:[Od,Or,Ro]}},{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"},...Md]}],statuses:["ok","busy","stalled","empty","cancelled","error"],results:{error:"string|null",reply:"string",messageId:"string|null",teamChatLogId:"number|null",errorKind:"cycle|provider|target?",code:"ErrorCode?",errorClass:"string|null",usage:"map|null"},effects:["provider","db"],summary:"Turn a team member through native team admission.",scriptBinding:{name:"lm_prompt",params:[Tn,Cd,Or,{name:"options",type:"map",optional:!0,keys:[...Md,{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,xo,LN],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:[Od,{...LN,optional:!0}]}},{name:"getSession",implemented:!0,params:[se,xo],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:[xo]}},{name:"reserveSession",implemented:!0,params:[se,xo],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,xo,{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"},...Md]}],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"},Or,{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,xN],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:[xN]}},{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:[Tn,Cd]}},{name:"sessionAdmission",implemented:!0,params:[se,xo],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"},Od,Or,Ro],statuses:["ok","busy","stalled","empty","error"],results:{...ON,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"}]},Ro],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"},Or],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,Dd,Or,Ro],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:[Dd,Or,Ro]}},{name:"nativeSessionClose",implemented:!0,params:[se,Dd],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:[Dd]}},{name:"loadProperties",implemented:!0,params:[se,v_],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,CN],statuses:["ok","error"],results:{error:"string|null",running:"RunningRow[]",dead:"DeadRow[]",idle:"IdleRow[]"},effects:["db"],summary:"DB-wide view of tracked invocation activity. Read-only unless reconcile:true, which also aborts rows whose holder is confirmed dead. Dispatch and branch on status busy, never gate on this.",scriptBinding:{name:"lm_running",params:[CN]}}])});function $N(t){if(!AN(t))return gt("invalid_argument","Expected a context created by createLmctlContext");if(t.closed)return gt("cancelled","Context is closed")}function PN(t){return MN.find(e=>e.name===t)?.params.find(e=>e.name==="options")?.keys?.map(e=>e.name)??[]}var UN=L(()=>{"use strict";S_();Ld();Vc()});import{isAbsolute as rq,resolve as sq}from"node:path";function Pd(t){return Number.isFinite(t)&&Math.abs(t)<=oq}function iq(t){if(t&&typeof t=="object"){let e=t.code;if(typeof e=="string"){if(DN.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 k_(t,e=Date.now()){if(t===void 0)return{windowMs:FN};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||!Pd(e-l)?{error:`invalid --since duration: ${t} (cutoff out of representable date range)`}:{windowMs:l}}let r=Date.parse(t);if(!Number.isFinite(r)||!Pd(r))return{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`};let s=Math.max(0,e-r);return Pd(e-s)?{windowMs:s}:{error:`invalid --since value: ${t} (cutoff out of representable date range)`}}function $d(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function I_(t,e){let n=t.target_teamfile,r=t.target_alias;if(n===null||r===null)return b_;let s=e.get(n);if(s===void 0){try{s=Ie(n)}catch{s=null}e.set(n,s)}return s===null?b_:vl(s,r)?.model??b_}async function jN(t,e={}){let n=$N(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=PN("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.reconcile!==void 0&&typeof e.reconcile!="boolean")return{status:"error",error:"reconcile must be a boolean",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=FN;if(e?.since!==void 0)if(typeof e.since=="number"){if(!Number.isFinite(e.since)||e.since<0||!Pd(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=k_(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=IN(t),i=e?.teamfile!==void 0?rq(e.teamfile)?e.teamfile:sq(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=ar(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:$d(y),model:I_(y,u),started_at:y.started_at,parent_invocation_id:y.parent_invocation_id};if(T==="dead"){if(e?.reconcile===!0&&If(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($d).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=$d(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:I_(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 b=$d(S);E.push({id:S.id,kind:S.kind,origin:S.origin,from_identity:S.from_identity,target:b,model:I_(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:iq(o),running:[],dead:[],idle:[]}}}var FN,oq,b_,WN=L(()=>{"use strict";Ld();UN();S_();Wt();Cl();Ge();sn();FN=24*60*60*1e3,oq=864e13;b_="default"});var VN={};me(VN,{_setRunningWatchMaxTicksForTests:()=>cq,runRunning:()=>yq});import{resolve as aq}from"node:path";function cq(t){N_=t??void 0}function uq(t){let e=t.split(`
|
|
2630
2631
|
`,1)[0];return e.length<=R_?e:`${e.slice(0,R_)}\u2026`}function x_(t){return t.target!==null?En(t.target):t.from_identity}function BN(t){return[(0,Pt.escapeCell)(x_(t)),t.kind,"running",t.holder_liveness,(0,Pt.escapeCell)(t.model),Ta(t.started_at)]}function XN(t){return[(0,Pt.escapeCell)(x_(t)),t.kind,"DEAD","",(0,Pt.escapeCell)(t.model),`stale ${Ta(t.started_at)}, holder process confirmed dead`]}function qN(t){let e=`ran ${xd(t.ran_ms)}, idle ${Ta(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,Pt.escapeCell)(ml(t.error,R_)??uq(t.error))}`),[(0,Pt.escapeCell)(x_(t)),t.kind,t.status,"",(0,Pt.escapeCell)(t.model),e]}function A_(t){return t.filter(e=>e!=="").join(" ")}function GN(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 mq(t){let{roots:e,childrenByParent:n}=GN(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 pq(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}=GN(r),i=a=>({...a,children:(o.get(a.id)??[]).map(i)});return s.map(i)}function hq(t,e){return e?{schema_version:HN,tree:pq(t.running,t.dead,t.idle)}:{schema_version:HN,running:t.running,dead:t.dead,idle:t.idle}}function _q(t){let e=[...t.running.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:A_(BN(r))})),...t.dead.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:A_(XN(r))})),...t.idle.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:A_(qN(r))}))],n=mq(e);return`${n.length>0?n.join(`
|
|
2631
2632
|
`):" none"}
|
|
2632
2633
|
`}function gq(t,e){let n=[{title:`Running (${t.running.length}):`,rows:t.running.map(BN)},{title:`Dead (reclaimable) (${t.dead.length}):`,rows:t.dead.map(XN)},{title:`Idle, finished in the last ${xd(e)} (${t.idle.length}):`,rows:t.idle.map(qN)}],r=["MEMBER","KIND","STATE","LIVENESS","MODEL","TIMING"],s=(0,Pt.measureColumns)([{rows:[],headers:r},...n.map(a=>a.rows)],{max:fq}),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(`
|
|
2633
2634
|
`)}
|
|
2634
2635
|
`}async function yq(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${dq}
|
|
2635
|
-
`),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=
|
|
2636
|
+
`),0;let n=ae(t,["--team","--member","--since","--watch-interval"],["--json","--tree","--watch","--reconcile"]);if(n.error!==void 0)return D(e,n.error);let r=Y(n,"--json"),s=Y(n,"--tree"),o=Y(n,"--watch"),i=V(n,"--team"),a=V(n,"--member"),l=k_(V(n,"--since"));if("error"in l)return D(e,l.error);let c=V(n,"--watch-interval"),d=c===void 0?lq: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=NN({cwd:aq(e.cwd??process.cwd()),env:e.env??process.env,dal:f,dbPath:Ce(e)});if(m.status!=="ok")return D(e,m.error);let p=await jN(m,{teamfile:i,member:a,since:V(n,"--since"),tree:s,reconcile:Y(n,"--reconcile")});if(p.status!=="ok")return D(e,p.error??"listRunning failed");if(r){let _=hq(p,s);return o?e.stdout.write(`${JSON.stringify(_)}
|
|
2636
2637
|
`):Z(e,_),0}return e.stdout.write(s?_q(p):gq(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)}
|
|
2637
|
-
`)}finally{p=!1}m+=1,N_!==void 0&&m>=N_&&_(E)}},g=setInterval(()=>{h(g)},d*1e3);h(g),process.once("SIGINT",()=>_(g)),process.once("SIGTERM",()=>_(g))}):u()}var Pt,HN,lq,N_,dq,R_,fq,JN=L(()=>{"use strict";Pt=Ft(Ct(),1);Ld();WN();le();w_();It();HN=3,lq=2;dq=["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(`
|
|
2638
|
+
`)}finally{p=!1}m+=1,N_!==void 0&&m>=N_&&_(E)}},g=setInterval(()=>{h(g)},d*1e3);h(g),process.once("SIGINT",()=>_(g)),process.once("SIGTERM",()=>_(g))}):u()}var Pt,HN,lq,N_,dq,R_,fq,JN=L(()=>{"use strict";Pt=Ft(Ct(),1);Ld();WN();le();w_();It();HN=3,lq=2;dq=["usage: lmctl running [--team <file>] [--member <alias>] [--since <duration|ISO8601>]"," [--tree] [--reconcile] [--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.","","Looking is read-only: a dead holder is listed under Dead and left as it is.","Dispatch reconciles dead holders for its receiver. Scheduled lmbee maintenance","explicitly opts into --reconcile, which aborts confirmed-dead rows and","terminalizes their linked messages. Ordinary reads do not reconcile them.","","--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(`
|
|
2638
2639
|
`),R_=120;fq=[26,void 0,void 0,void 0,24,void 0]});var zN={};me(zN,{runPrices:()=>vq});import{existsSync as Eq}from"node:fs";import{resolve as KN}from"node:path";function Ud(t,e,n="price snapshot unavailable"){return e?Z(t,{schema_version:1,status:"unavailable",reason:n}):t.stdout.write(`unavailable: ${n}
|
|
2639
2640
|
`),0}function Tq(t){let e=t?.code;return typeof e=="string"&&/SQLITE_(BUSY|LOCKED|READONLY|CANTOPEN)/.test(e)}function YN(t){return t.dal!==void 0?{db:t.dal,owned:!1}:{db:Fe({path:Ce(t),recover:!1}),owned:!0}}function wq(t){if(t.owned)try{t.db.close()}catch{}}async function vq(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(Fd),0;let n=t[0];return n!=="update"&&n!=="show"?(e.stderr.write(`error: expected update or show
|
|
2640
2641
|
${Fd}`),2):n==="update"?Sq(t.slice(1),e):bq(t.slice(1),e)}async function Sq(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"}
|
|
2641
|
-
${Fd}`),2;let r=
|
|
2642
|
+
${Fd}`),2;let r=Y(n,"--json"),s=n.positionals[0],o=V(n,"--aliases"),i;try{if(s!==void 0){let l=KN(e.cwd??process.cwd(),s),c=o===void 0?void 0:KN(e.cwd??process.cwd(),o),d=cf(l,c);i=YN(e);let u=df(i.db.db,d);return r?Z(e,{...L_(qs(i.db.db),e.env??process.env),status:u}):e.stdout.write(`${u}
|
|
2642
2643
|
`),0}if(o!==void 0)return e.stderr.write(`error: --aliases requires FILE
|
|
2643
2644
|
`),2;i=YN(e);let a=await uf(i.db.db,{env:e.env??process.env,force:!0});return r?Z(e,{...L_(a.snapshot,e.env??process.env),status:a.status}):e.stdout.write(`${a.status}
|
|
2644
2645
|
`),0}catch(a){return Tq(a)?(r?Z(e,{schema_version:1,status:"deferred",reason:"database busy or read-only"}):e.stdout.write(`deferred
|
|
2645
2646
|
`),0):(e.stderr.write(`error: ${a instanceof Error?a.message:String(a)}
|
|
2646
2647
|
`),1)}finally{i!==void 0&&wq(i)}}function L_(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>Ms(e)/1e3}}async function bq(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"}
|
|
2647
|
-
${Fd}`),2;let r=
|
|
2648
|
+
${Fd}`),2;let r=Y(n,"--json"),s=n.positionals[0],o,i=!1;try{if(e.dal!==void 0)o=e.dal.db,i=!0;else{let a=Ce(e);if(!Eq(a))return Ud(e,r,"database unavailable");o=bn(a)}}catch(a){return Ud(e,r,a instanceof Error?a.message:"database unavailable")}try{let a=qs(o);if(a===null)return Ud(e,r);let l=L_(a,e.env??process.env);if(s===void 0)return r?Z(e,l):e.stdout.write(`source: ${String(l.source)}
|
|
2648
2649
|
generated_at: ${String(l.generated_at??"unknown")}
|
|
2649
2650
|
hash: ${String(l.hash)}
|
|
2650
2651
|
records: ${String(l.record_count)}
|
|
@@ -2674,7 +2675,7 @@ ${o}`)}function Mr(t,e,n=[]){let r;try{let o=JSON.parse(e);r=typeof o?.error=="s
|
|
|
2674
2675
|
`)}function G_(t,e){return t.stderr.write(`error: ${e}
|
|
2675
2676
|
${Y0}
|
|
2676
2677
|
`),2}async function VG(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${Y0}
|
|
2677
|
-
`),0;let n=ae(t,["--timeout"],["--json"]);if(n.error!==void 0)return G_(e,n.error);let r=
|
|
2678
|
+
`),0;let n=ae(t,["--timeout"],["--json"]);if(n.error!==void 0)return G_(e,n.error);let r=Y(n,"--json");for(let f of n.positionals)if(!K0.includes(f))return G_(e,`unknown provider: ${f} (valid targets: ${K0.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 G_(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"&&z0.has(p)&&!a.has(typeof f.provider=="string"?f.provider:"")||(l>0&&e.stdout.write(`
|
|
2678
2679
|
`),e.stdout.write(`${GG(f)}
|
|
2679
2680
|
`),l+=1)},d=await V0({targets:s,timeoutSeconds:o,includeRaw:r,env:e.env??process.env,progress:f=>e.stderr.write(`${f}
|
|
2680
2681
|
`),...r?{}:{onReading:c},..._i()||e.env?.LMCTL_DEBUG==="1"?{debug:f=>e.stderr.write(`${f}
|