@lmctl-ai/lmctl 0.2.446 → 0.2.448
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/data/price-data.json +1 -1
- package/dist/cli/index.js +46 -43
- package/dist/cli/lmscript.js +75 -72
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var $$=Object.create;var Km=Object.defineProperty;var P$=Object.getOwnPropertyDescriptor;var U$=Object.getOwnPropertyNames;var F$=Object.getPrototypeOf,j$=Object.prototype.hasOwnProperty;var C=(t,e)=>()=>(t&&(e=t(t=0)),e);var W$=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),ge=(t,e)=>{for(var n in e)Km(t,n,{get:e[n],enumerable:!0})},H$=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of U$(e))!j$.call(t,s)&&s!==n&&Km(t,s,{get:()=>e[s],enumerable:!(r=P$(e,s))||r.enumerable});return t};var hn=(t,e,n)=>(n=t!=null?$$(F$(t)):{},H$(e||!t||!t.__esModule?Km(n,"default",{value:t,enumerable:!0}):n,t));function RT(t){return t.prepare("PRAGMA table_info(team_chat_log)").all().some(e=>e.name==="accounting_only")?_a:xT}var xT,_a,zm=C(()=>{"use strict";xT="root_teamfile <> '(direct)'",_a=xT+" AND COALESCE(accounting_only,0)=0"});import{existsSync as B$}from"node:fs";import{createRequire as X$}from"node:module";function q$(){return Ym===null&&(Ym=X$(import.meta.url)("node:sqlite").DatabaseSync),Ym}function V$(t){let e=J$[t];if(e!==void 0)return e;let n=G$[t&255];return n!==void 0?n:`SQLITE_UNKNOWN_${t}`}function Us(t){throw t&&typeof t=="object"&&"errcode"in t&&typeof t.errcode=="number"&&(t.code=V$(t.errcode)),t}function K$(t){return t instanceof Error&&/cannot rollback - no transaction is active/i.test(t.message)}function z$(t){return t instanceof Error&&/no such savepoint:/i.test(t.message)}function Qm(t){return t.length===1&&Y$(t[0])?[t[0]]:t}function Y$(t){if(!tp(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function tp(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ym,G$,J$,Zm,
|
|
1
|
+
var $$=Object.create;var Km=Object.defineProperty;var P$=Object.getOwnPropertyDescriptor;var U$=Object.getOwnPropertyNames;var F$=Object.getPrototypeOf,j$=Object.prototype.hasOwnProperty;var C=(t,e)=>()=>(t&&(e=t(t=0)),e);var W$=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),ge=(t,e)=>{for(var n in e)Km(t,n,{get:e[n],enumerable:!0})},H$=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of U$(e))!j$.call(t,s)&&s!==n&&Km(t,s,{get:()=>e[s],enumerable:!(r=P$(e,s))||r.enumerable});return t};var hn=(t,e,n)=>(n=t!=null?$$(F$(t)):{},H$(e||!t||!t.__esModule?Km(n,"default",{value:t,enumerable:!0}):n,t));function RT(t){return t.prepare("PRAGMA table_info(team_chat_log)").all().some(e=>e.name==="accounting_only")?_a:xT}var xT,_a,zm=C(()=>{"use strict";xT="root_teamfile <> '(direct)'",_a=xT+" AND COALESCE(accounting_only,0)=0"});import{existsSync as B$}from"node:fs";import{createRequire as X$}from"node:module";function q$(){return Ym===null&&(Ym=X$(import.meta.url)("node:sqlite").DatabaseSync),Ym}function V$(t){let e=J$[t];if(e!==void 0)return e;let n=G$[t&255];return n!==void 0?n:`SQLITE_UNKNOWN_${t}`}function Us(t){throw t&&typeof t=="object"&&"errcode"in t&&typeof t.errcode=="number"&&(t.code=V$(t.errcode)),t}function K$(t){return t instanceof Error&&/cannot rollback - no transaction is active/i.test(t.message)}function z$(t){return t instanceof Error&&/no such savepoint:/i.test(t.message)}function Qm(t){return t.length===1&&Y$(t[0])?[t[0]]:t}function Y$(t){if(!tp(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function tp(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ym,G$,J$,Zm,Ln,ep,Fs=C(()=>{"use strict";Ym=null;G$={1:"SQLITE_ERROR",2:"SQLITE_INTERNAL",3:"SQLITE_PERM",4:"SQLITE_ABORT",5:"SQLITE_BUSY",6:"SQLITE_LOCKED",7:"SQLITE_NOMEM",8:"SQLITE_READONLY",9:"SQLITE_INTERRUPT",10:"SQLITE_IOERR",11:"SQLITE_CORRUPT",12:"SQLITE_NOTFOUND",13:"SQLITE_FULL",14:"SQLITE_CANTOPEN",15:"SQLITE_PROTOCOL",17:"SQLITE_SCHEMA",18:"SQLITE_TOOBIG",19:"SQLITE_CONSTRAINT",20:"SQLITE_MISMATCH",21:"SQLITE_MISUSE",23:"SQLITE_AUTH",25:"SQLITE_RANGE",26:"SQLITE_NOTADB"},J$={275:"SQLITE_CONSTRAINT_CHECK",531:"SQLITE_CONSTRAINT_COMMITHOOK",787:"SQLITE_CONSTRAINT_FOREIGNKEY",1043:"SQLITE_CONSTRAINT_FUNCTION",1299:"SQLITE_CONSTRAINT_NOTNULL",1555:"SQLITE_CONSTRAINT_PRIMARYKEY",1811:"SQLITE_CONSTRAINT_TRIGGER",2067:"SQLITE_CONSTRAINT_UNIQUE",2323:"SQLITE_CONSTRAINT_VTAB",2579:"SQLITE_CONSTRAINT_ROWID",2835:"SQLITE_CONSTRAINT_PINNED",3091:"SQLITE_CONSTRAINT_DATATYPE",261:"SQLITE_BUSY_RECOVERY",517:"SQLITE_BUSY_SNAPSHOT",773:"SQLITE_BUSY_TIMEOUT",262:"SQLITE_LOCKED_SHAREDCACHE",518:"SQLITE_LOCKED_VTAB"};Zm=class{name;handle;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!B$(e))throw new Error("unable to open database file");this.name=e;try{this.handle=new(q$())(e,{readOnly:n.readonly===!0})}catch(r){Us(r)}this.exec("PRAGMA busy_timeout = 5000"),this.exec(`PRAGMA foreign_keys = ${n.foreignKeys===!0?"ON":"OFF"}`)}prepare(e){try{return new ep(this.handle.prepare(e))}catch(n){Us(n)}}exec(e){try{this.handle.exec(e)}catch(n){Us(n)}}pragma(e,n){let r=`PRAGMA ${e}`;if(e.includes("=")){this.exec(r);return}if(n?.simple===!0){let s=this.prepare(r).get();return s===void 0?void 0:Object.values(s)[0]}return this.prepare(r).all()}transaction(e){let n=(...r)=>this.runTransaction("BEGIN",e,r);return n.immediate=(...r)=>this.runTransaction("BEGIN IMMEDIATE",e,r),n}get inTransaction(){return this.handle.isTransaction}close(){try{this.handle.close()}catch(e){Us(e)}}runTransaction(e,n,r){if(!this.inTransaction){this.exec(e);try{let o=n(...r);return this.exec("COMMIT"),o}catch(o){if(this.inTransaction)try{this.exec("ROLLBACK")}catch(i){if(!K$(i))throw i}throw o}}let s=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${s}`);try{let o=n(...r);return this.exec(`RELEASE ${s}`),o}catch(o){if(this.inTransaction)try{this.exec(`ROLLBACK TO ${s}`),this.exec(`RELEASE ${s}`)}catch(i){if(!z$(i))throw i}throw o}}};Ln=Zm,ep=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){try{let n=this.handle.get(...Qm(e));return this.normalizeRow(n)}catch(n){Us(n)}}all(...e){try{return this.handle.all(...Qm(e)).map(n=>this.normalizeRow(n))}catch(n){Us(n)}}run(...e){try{let n=this.handle.run(...Qm(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}catch(n){Us(n)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&tp(e)?Object.values(e):tp(e)?{...e}:e}}});function yr(t){return new Ln(t,{readonly:!0,fileMustExist:!0})}var ga=C(()=>{"use strict";Fs()});import{createHash as Q$}from"node:crypto";import{lstat as Z$,readFile as eP,realpath as LT,stat as CT}from"node:fs/promises";import{isAbsolute as OT,relative as tP,resolve as nP,sep as rP}from"node:path";function Q(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}function oe(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:null}function ya(t){return oe(t)}function nn(t){if(typeof t!="string"&&typeof t!="number")return null;let e=new Date(t);return Number.isFinite(e.getTime())?e.toISOString():null}function Se(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 Le(t,e){return t<e?-1:t>e?1:0}function Ot(t,e,n){if(t===null||e===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 Xn(t,e,n){let r={},s=ya(t.cacheWrite5m),o=ya(t.cacheWrite1h),i=ya(t.reasoning),a=ya(t.webSearch),l=ya(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 Jr(t){return typeof t=="string"&&oP.has(t.toLowerCase())}function Ge(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 Oo(t){let e=Q(t);return e&&typeof e.content=="string"?Buffer.byteLength(e.content,"utf8"):null}async function ft(t,e){if(!OT(t))return null;let n=await Z$(t).catch(()=>null);if(!n?.isFile()||n.isSymbolicLink())return null;let r=await LT(t).catch(()=>null);if(!r)return null;for(let s of e){let o=await LT(s).catch(()=>nP(s)),i=tP(o,r);if(i===""||!i.startsWith(`..${rP}`)&&i!==".."&&!OT(i))return r}return null}async function Gt(t,e){Se(e);let n=await CT(t).catch(()=>null);if(!n?.isFile()||n.size>e.maxBytes)return null;let r=await eP(t,{signal:e.signal});e.signal.throwIfAborted();let s=await CT(t).catch(()=>null);return!s?.isFile()||n.dev!==s.dev||n.ino!==s.ino||n.size!==s.size||n.mtimeMs!==s.mtimeMs?null:{revision:`${wa}:sha256:${Q$("sha256").update(r).digest("hex")}`,data:r}}function jc(t,e){if(t.length>0&&t[t.length-1]!==10)return null;let n=t.toString("utf8"),r=n.length===0?[]:n.slice(0,-1).split(`
|
|
2
2
|
`),s=[];for(let o of r)if(e.signal.throwIfAborted(),!!o.trim())try{let i=Q(JSON.parse(o));if(!i)return null;s.push(i)}catch{return null}return s}var wa,qt,en,sP,tn,oP,wr=C(()=>{"use strict";wa="bx3",qt={input_uncached:null,input_cached:null,input_cache_write:null,output:null};en=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}},sP=0,tn=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${sP++}`,this.map.has(n)||this.map.set(n,e)}entries(){return[...this.map.values()]}};oP=new Set(["schedulewakeup","taskcreate","taskupdate","taskoutput","taskstop","todowrite","todoread","croncreate","crondelete","cronlist","monitor","listagents","toolsearch","askuserquestion","exitplanmode","agent","skill","job"])});import{readdir as iP}from"node:fs/promises";import{join as DT,sep as MT}from"node:path";var Do,np=C(()=>{"use strict";wr();Do=class{format;constructor(e){this.format=e}async discover(e,n,r){Se(e);let s=[],o=0,i=!1,a=async(l,c)=>{if(e.signal.throwIfAborted(),c>8||o>e.maxRows){i=!0;return}let d=await iP(l,{withFileTypes:!0}).catch(f=>(f.code!=="ENOENT"&&(i=!0),[])),u=f=>DT(l,f.name)+(f.isDirectory()?MT:"");for(let f of d.sort((m,p)=>Le(u(m),u(p)))){e.signal.throwIfAborted();let m=DT(l,f.name),p=f.isDirectory()&&r?.startsWith(m+MT);if(!(r&&!p&&Le(u(f),r)<=0)){if(!p&&++o>e.maxRows){i=!0;break}if(f.isDirectory())await a(m,c+1);else if(f.isFile()){let _=this.format.sessionId(m);_&&s.push({provider:this.format.provider,sessionid:_,source_id:m})}if(s.length>=n){i=!0;break}}}};return await a(this.format.root,0),s.sort((l,c)=>Le(l.source_id,c.source_id)),{sources:s.slice(0,n),truncated:i||s.length>n}}async bytes(e,n){if(Se(n),e.provider!==this.format.provider||this.format.sessionId(e.source_id)!==e.sessionid)return null;let r=await ft(e.source_id,[this.format.root]);if(!r)return null;let s=await Gt(r,n).catch(()=>(n.signal.throwIfAborted(),null));return s&&{...s,revision:`${this.format.revision}:${s.revision}`}}async inspect(e,n){let r=await this.bytes(e,n);return r?{status:"ready",revision:r.revision}:{status:"partial"}}async read(e,n,r){let s=await this.bytes(e,r);if(!s||s.revision!==n)return{status:"partial"};let o=this.format.decode(s.data,e.sessionid,e.source_id,r);return!o||!o.responses?{status:"partial"}:{status:"complete",source:e,revision:n,checkpoint:null,responses:o.responses,...o.captureStatus?{capture_status:o.captureStatus}:{}}}}});function Vr(t,e=!0){let n={input_uncached:null,input_cached:null,input_cache_write:null,output:null};if(!e||!t.length||new Set(t.map(r=>r.response_id)).size!==t.length)return n;for(let r of Object.keys(n)){let s=t.map(i=>i.tokens[r]);if(s.some(i=>i===null||!Number.isSafeInteger(i)||i<0))continue;let o=s.reduce((i,a)=>i+a,0);Number.isSafeInteger(o)&&(n[r]=o)}return n}var Ea=C(()=>{"use strict"});import{createReadStream as $T}from"node:fs";import{createInterface as PT}from"node:readline";import{stat as aP}from"node:fs/promises";import{homedir as lP}from"node:os";function UT(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*Ue(t,e){let n=$T(t,{encoding:"utf-8"}),r=PT({input:n,crlfDelay:1/0});try{for await(let s of r){let o=s.trim();if(!o)continue;let i=UT(o);i!==void 0?yield i:e?.()}}finally{n.destroy()}}async function rn(t,e){let n=[],r=$T(t,{encoding:"utf-8"}),s=PT({input:r,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(!i)continue;let a=UT(i);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function ze(t){let e=await aP(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function Oe(t){return t.replace(/\\n/g,`
|
|
3
3
|
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function te(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function _n(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var ce,nt=C(()=>{"use strict";ce=lP()});import{readdir as cP}from"node:fs/promises";import{join as Mo,resolve as dP}from"node:path";function Hc(t){return dP(t||process.env.XDG_DATA_HOME||Mo(ce,".local","share"))}function uP(t){return Mo(Hc(t),"muse","sessions")}function fP(t,e,n,r){let s=r?.input_tokens,o=r?.cache_read_tokens??r?.input_cache_read_tokens,i=r?.cache_write_tokens??r?.input_cache_write_tokens,a=typeof r?.promptTokens=="number"?r.promptTokens:typeof r?.prompt_tokens=="number"?r.prompt_tokens:void 0,l=typeof s=="number"&&typeof o=="number"&&o>s||typeof a=="number"&&typeof o=="number"&&o>a||typeof a=="number"&&typeof i=="number"&&i>a||typeof a=="number"&&typeof o=="number"&&typeof i=="number"&&o+i>a,c=l?null:typeof o=="number"?o:null,d=l?null:typeof i=="number"?i:null,u=null;return l||(typeof r?.input_uncached_tokens=="number"?u=r.input_uncached_tokens:typeof a=="number"&&typeof o=="number"&&typeof i=="number"&&a>=o+i&&(u=a-o-i)),{response_id:t,timestamp:e.toISOString(),model:typeof n=="string"&&n.length>0?n:null,tokens:{input_uncached:typeof u=="number"?u:null,input_cached:typeof c=="number"?c:null,input_cache_write:typeof d=="number"?d:null,output:typeof r?.output_tokens=="number"?r.output_tokens:null},files_read:null,files_written:null}}function WT(t,e){let n,r,s,o,i,a=[],l=new Map,c=new Map,d=new Set,u,f,m=()=>{f="partial"},p=g=>{if(typeof g!="string"||g.length===0){m();return}let w=l.get(g);return w||(w={id:g,turn:{id:g,status:"unknown"},responseIds:[]},l.set(g,w)),w},_=g=>{if(g.retained_frame&&Array.isArray(g.children)){for(let b of g.children)try{if(typeof b?.record_json!="string")throw new Error("missing record_json");_(JSON.parse(b.record_json))}catch{m()}return}if(g.stream?.kind!=="session"||g.stream?.id!==t)return;if(g.schema_version!==1){m();return}if(g.payload_type?.startsWith("runtime.session")&&g.payload_schema_version!==1){m();return}let w=g.payload?.source_run_record_id;for(let b of[g.id,w])if(!(typeof b!="string"||b.length===0)&&d.has(b))return;for(let b of[g.id,w])typeof b=="string"&&b.length>0&&d.add(b);let y=typeof g.recorded_at=="number"&&Number.isFinite(g.recorded_at)?new Date(g.recorded_at/1e3):void 0;if(g.recorded_at!==void 0&&(!y||!Number.isFinite(y.getTime()))){m();return}y&&Number.isFinite(y.getTime())&&((!s||y<s)&&(s=y),(!o||y>o)&&(o=y));let E=g.payload;if(g.payload_type==="runtime.session.metadata"&&(typeof E?.record?.workspace_root=="string"&&(n=E.record.workspace_root),typeof E?.record?.model_id=="string"&&(r=E.record.model_id)),g.payload_type!=="runtime.session"||E?.kind!=="run")return;let T=E.event,v=p(E.run_id);if(!T||!y||!v){T||m();return}if(T.kind==="started"&&typeof T.prompt=="string")a.push({role:"user",content:T.prompt,timestamp:y}),v.turn.startedAt=y,v.turn.prompt=T.prompt,v.turn.status="in_progress",i="in_progress";else if(T.kind==="assistant_message_committed"&&typeof T.text=="string")a.push({role:"assistant",content:T.text,timestamp:y});else if(T.kind==="terminal")v.turn.completedAt=y,v.turn.status=T.terminal==="completed"?"complete":"aborted",i=v.turn.status;else if(T.kind==="model_completed"){typeof T.model=="string"&&T.model.length>0&&(r=T.model,v.turn.model=T.model);let b=typeof w=="string"&&w.length>0?w:typeof g.id=="string"&&g.id.length>0?g.id:void 0;if(!b)m();else{v.responseIds.push(b);let j={};if(T.usage&&typeof T.usage=="object")for(let $ of["input_tokens","output_tokens","cached_tokens","reasoning_tokens","input_uncached_tokens","cache_read_tokens","input_cache_read_tokens","cache_write_tokens","input_cache_write_tokens","promptTokens","prompt_tokens"]){let pe=T.usage[$];typeof pe=="number"&&Number.isSafeInteger(pe)&&pe>=0&&(j[$]=pe)}Object.keys(j).length>0&&(v.turn.rawUsage=[...v.turn.rawUsage??[],{responseId:b,values:j}]),c.set(b,fP(b,y,T.model,j))}if(!T.usage)return;let k={},I=T.usage.input_tokens,N=T.usage.cache_read_tokens??T.usage.input_cache_read_tokens,A=T.usage.cache_write_tokens??T.usage.input_cache_write_tokens,S=typeof T.usage.promptTokens=="number"?T.usage.promptTokens:typeof T.usage.prompt_tokens=="number"?T.usage.prompt_tokens:void 0,x=typeof I=="number"&&typeof N=="number"&&N>I||typeof S=="number"&&typeof N=="number"&&N>S||typeof S=="number"&&typeof A=="number"&&A>S||typeof S=="number"&&typeof N=="number"&&typeof A=="number"&&N+A>S,R=x?void 0:typeof N=="number"?N:void 0,L=x?void 0:typeof A=="number"?A:void 0,D;x||(typeof T.usage.input_uncached_tokens=="number"?D=T.usage.input_uncached_tokens:typeof S=="number"&&typeof N=="number"&&typeof A=="number"&&S>=N+A&&(D=S-N-A)),D!==void 0&&D<0&&(D=void 0);let M=T.usage.output_tokens,P=T.usage.reasoning_tokens;typeof D=="number"&&Number.isSafeInteger(D)&&D>=0&&(k.inputTokens=D),typeof R=="number"&&Number.isSafeInteger(R)&&R>=0&&(k.cachedInputTokens=R),typeof L=="number"&&Number.isSafeInteger(L)&&L>=0&&(k.cacheWriteInputTokens=L),typeof M=="number"&&Number.isSafeInteger(M)&&M>=0&&(k.outputTokens=M),typeof P=="number"&&Number.isSafeInteger(P)&&P>=0&&(k.reasoningOutputTokens=P),u=k}};return{visit:_,finish:()=>{if(!n||!s||!o)return null;let g=a.filter(T=>T.role==="user").map(T=>T.content),w=[...l.values()].map(T=>({...T.turn,...T.responseIds.length>0?{responseIds:[...T.responseIds]}:{}})),y=[...c.values()],E=Vr(y,f!=="partial");return{provider:"muse",sessionId:t,filePath:e,cwd:n,createdAt:s,modifiedAt:o,model:r,messages:a,messageCount:a.length,firstUserMessage:g[0],lastUserMessage:g.at(-1),userPrompts:g,turnStatus:i,totalInputTokens:E.input_uncached??void 0,totalCachedInputTokens:E.input_cached??void 0,totalCacheWriteInputTokens:E.input_cache_write??void 0,totalOutputTokens:E.output??void 0,lastTokenUsage:u,turns:w,responses:y,...f?{captureStatus:f}:{}}},markPartial:m}}function mP(t,e,n){let r=WT(e,n);for(let s of t)r.visit(s);return r.finish()}function pP(t,e,n,r){r.signal.throwIfAborted();let s=Math.max(0,r.maxBytes),o=t.length<=s?t:t.subarray(0,Math.max(0,t.subarray(0,s).lastIndexOf(10))),i=o.length!==t.length,a=[],l=i,c=0,d=f=>{if(!f||typeof f!="object"||Array.isArray(f)){l=!0;return}let m=f;if(m.retained_frame&&Array.isArray(m.children)){for(let p of m.children){if(c>=r.maxRows){l=!0;return}let _;try{if(typeof p?.record_json!="string")throw new Error("missing record_json");_=JSON.parse(p.record_json)}catch{l=!0;continue}d(_)}return}if(c>=r.maxRows){l=!0;return}a.push(m),c++};for(let f of o.toString("utf8").split(/\r?\n/u)){if(r.signal.throwIfAborted(),f.trim()==="")continue;let m;try{m=JSON.parse(f)}catch{l=!0;continue}d(m)}let u=mP(a,e,n);return u&&l&&(u.captureStatus="partial"),u}function HT(t){return{provider:"muse",root:uP(t),revision:"muse-session-v2",sessionId:n=>n.replaceAll("\\","/").match(/\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\/session\.jsonl$/iu)?.[1]??null,decode:pP}}async function jT(t,e){let n=WT(t,e);for await(let r of Ue(e,n.markPartial))n.visit(r);return n.finish()}var FT,Wc,rp=C(()=>{"use strict";Ea();nt();FT=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;Wc=class{name="muse";dataHome;constructor(e={}){this.dataHome=Hc(e.museDataHome)}get root(){return Mo(this.dataHome,"muse","sessions")}getWatchPaths(){return[{directory:this.root,filePattern:/session\.jsonl$/}]}async files(e=this.root,n=0){let r;try{r=await cP(e,{withFileTypes:!0})}catch{return[]}let s=[];for(let o of r)o.isFile()&&o.name==="session.jsonl"?s.push(Mo(e,o.name)):o.isDirectory()&&n<4&&s.push(...await this.files(Mo(e,o.name),n+1));return s}async resolveSessionPath(e){return FT.test(e)?(await this.files()).find(n=>n.endsWith(Mo(e,"session.jsonl")))??null:null}async loadSession(e){let n=await this.resolveSessionPath(e);return n?jT(e,n):null}async discoverSessions(){let e=[];for(let n of await this.files())try{let r=n.split(/[\\/]/).at(-2);if(!FT.test(r))continue;let s=await jT(r,n);s&&e.push(s)}catch{}return e}async deleteSession(){return!1}}});import{readFile as BT,readdir as hP,rm as _P,stat as XT}from"node:fs/promises";import{basename as gP,join as $o,resolve as yP}from"node:path";function qc(t){return yP(t||process.env.MINIPLAYER_HOME||$o(process.env.XDG_DATA_HOME||$o(ce,".local","share"),"miniplayer"))}function Bc(t){if(typeof t=="string")return t;try{return JSON.stringify(t)??String(t)}catch{return String(t)}}function sp(t){return!t||typeof t!="object"?"tool":typeof t.toolName=="string"?t.toolName:typeof t.name=="string"?t.name:"tool"}function qT(t){if(!t||typeof t!="object")return null;let e=t.toolCallId??t.id;return typeof e=="string"&&e.length>0?e:null}function GT(t){return t&&typeof t=="object"&&!Array.isArray(t)?t:null}function JT(t){if(typeof t!="string")return null;try{let e=new URL(t);return e.username="",e.password="",e.search="",e.hash="",e.toString()}catch{return null}}function VT(t){let e=t.usage&&typeof t.usage=="object"&&!Array.isArray(t.usage)?t.usage:{},n={};for(let[l,c]of Object.entries(e))oe(c)!==null&&(n[l]=c);let r=oe(e.inputTokens),s=oe(e.cachedInputTokens),o=oe(t.cacheWriteInputTokens??e.cacheWriteInputTokens),i=oe(e.outputTokens),a=null;return t.usageConvention==="input-includes-cache"&&r!==null&&s!==null&&s<=r&&(a=r-s),t.usageConvention==="input-excludes-cache"&&r!==null&&o!==null&&(a=r+o),t.usageConvention==="synthetic"&&r===0&&s===0&&(o===0||o===null)&&i===0&&(a=0),{tokens:{input_uncached:a,input_cached:s,input_cache_write:o,output:i},rawUsage:n,pricingFacts:oe(e.reasoningTokens)===null?null:{reasoning_output_tokens:oe(e.reasoningTokens)}}}function zT(t,e,n){if(!t||typeof t!="object")return null;let r=t;if(![1,2].includes(r.version)||r.id!==e||typeof r.cwd!="string")return null;let s=p=>{if(typeof p!="string")return;let _=new Date(p);return Number.isFinite(_.getTime())?_:void 0},o=s(r.createdAt),i=s(r.updatedAt);if(!o||!i)return null;let a=[],l=[],c=[],d=r.version===1,u="complete";if(r.version===1){if(!Array.isArray(r.messages))return null;for(let p of r.messages){if(!p||!["user","assistant"].includes(p.role)||typeof p.content!="string")return null;a.push({role:p.role,content:p.content,timestamp:s(p.timestamp)??i})}}else{if(!Array.isArray(r.turns))return null;let p=new Set,_=new Set;for(let h of r.turns){if(!h||typeof h.responseId!="string"||!h.responseId||typeof h.input?.text!="string")return null;if(p.has(h.responseId)){d=!0;continue}p.add(h.responseId);let g=s(h.startedAt),w=s(h.completedAt??h.endedAt);if(!g)return null;let y=typeof h.model=="string"?h.model:void 0;["complete","running","failed","aborted"].includes(h.status)||(d=!0);let E=h.status==="complete"?"complete":h.status==="running"?"in_progress":h.status==="failed"?"failed":h.status==="aborted"?"aborted":"unknown";u=E==="failed"||E==="unknown"?"aborted":E,(E!=="complete"||h.partial===!0)&&(d=!0);let T=Array.isArray(h.modelResponses),v=T?h.modelResponses:[],b=[];l.push({id:h.responseId,startedAt:g,completedAt:w,model:y,prompt:h.input.text,status:E,responseIds:b}),a.push({role:"user",timestamp:g,content:h.input.text});let k=Array.isArray(h.toolEvents)&&h.toolEvents.length>0;if(!T&&!k){let x=h.usage??{},R=VT({...h,usage:x});Object.keys(R.rawUsage).length&&(l.at(-1).rawUsage=[{responseId:h.responseId,values:R.rawUsage}]),b.push(h.responseId),c.push({response_id:h.responseId,timestamp:(w??g).toISOString(),model:y??null,model_provider:typeof h.provider=="string"?h.provider:null,tokens:R.tokens,files_read:[],files_written:[],read_bytes:Buffer.byteLength(h.input.text,"utf8"),write_bytes:0,external_io:[{direction:"read",kind:"prompt",id:h.responseId,ref:null,bytes:Buffer.byteLength(h.input.text,"utf8"),basis:"input_text"}],pricing_facts:R.pricingFacts}),E!=="complete"&&!h.usage&&(d=!0),typeof h.output?.text=="string"&&a.push({role:"assistant",timestamp:w??g,content:h.output.text,model:y});continue}let I=new Map,N=new Map,A=new Set,S=[];for(let x of v){if(!x||typeof x!="object"||typeof x.responseId!="string"||!x.responseId){d=!0;continue}if(b.includes(x.responseId)){d=!0;continue}let R=x,L=S.length;S.push({response:R,index:L,filesRead:[],filesWritten:[],io:[]}),b.push(x.responseId),_.has(x.responseId)&&(d=!0),_.add(x.responseId),R.toolCalls!==void 0&&!Array.isArray(R.toolCalls)&&(d=!0,S[L].io.push({direction:"read",kind:"unattributed",id:x.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:x.responseId,ref:null,bytes:null,basis:"unknown"}));for(let D of Array.isArray(R.toolCalls)?R.toolCalls:[]){let M=qT(D),P=sp(D);if(M)I.set(M,L),N.set(M,P);else{d=!0;let j=P==="list_directory"||P==="read_file"||P==="webget"||P==="shell"||P==="tool",$=P==="write_file"||P==="shell"||P==="tool";j&&S[L].io.push({direction:"read",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"}),$&&S[L].io.push({direction:"write",kind:"unattributed",id:null,ref:null,bytes:null,basis:"unknown"})}}}b.length===0&&v.length>0&&(d=!0);for(let x of Array.isArray(h.toolEvents)?h.toolEvents:[]){let R=x&&typeof x=="object"?x:{},L=qT(R),D=L?I.get(L):void 0,M=sp(R),P=GT(R.result),j=R.status==="failed"||R.error!==void 0;if(R.type==="tool_call"?a.push({role:"tool_use",timestamp:s(R?.timestamp)??g,content:Bc(R?.input??R?.args),toolName:M,toolInput:Bc(R?.input??R?.args),toolInputData:GT(R?.input??R?.args)??void 0,...L?{toolCallId:L}:{}}):a.push({role:"tool_result",timestamp:s(R?.timestamp)??w??g,content:Bc(j?R?.error:R?.result),toolName:M,...L?{toolCallId:L}:{}}),D===void 0){d=!0;continue}let $=S[D];(R.type==="tool_result"||j||R.result!==void 0)&&A.add(L);let pe=P?.path,G=oe(P?.bytesRead??P?.bytesWritten);R.type!=="tool_call"&&(M==="read_file"&&!j&&typeof pe=="string"&&G!==null?$.filesRead.push({path:pe,bytes:G}):M==="write_file"&&!j&&typeof pe=="string"&&G!==null?$.filesWritten.push({path:pe,bytes:G}):M==="webget"&&!j&&G!==null?$.io.push({direction:"read",kind:"web",id:L,ref:JT(P?.finalUrl??P?.url),bytes:G,basis:"certified_counter"}):M==="shell"||j?(M!=="write_file"&&$.io.push({direction:"read",kind:"unattributed",id:L,ref:null,bytes:null,basis:"unknown"}),(M==="shell"||M==="write_file")&&$.io.push({direction:"write",kind:"unattributed",id:L,ref:null,bytes:null,basis:"unknown"})):M==="list_directory"||M==="read_file"||M==="webget"?$.io.push({direction:"read",kind:M==="webget"?"web":"unattributed",id:L,ref:M==="webget"?JT(P?.finalUrl??P?.url):null,bytes:null,basis:"unknown"}):M==="write_file"?$.io.push({direction:"write",kind:"unattributed",id:L,ref:null,bytes:null,basis:"unknown"}):$.io.push({direction:"read",kind:"unattributed",id:L,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:L,ref:null,bytes:null,basis:"unknown"}))}for(let[x,R]of N)if(!A.has(x)){let L=S[I.get(x)],D=R==="list_directory"||R==="read_file"||R==="webget"||R==="shell",M=R==="write_file"||R==="shell";D&&L.io.push({direction:"read",kind:"unattributed",id:x,ref:null,bytes:null,basis:"unknown"}),M&&L.io.push({direction:"write",kind:"unattributed",id:x,ref:null,bytes:null,basis:"unknown"}),d=!0}for(let x of S){let R=x.response,L=VT(R),D=s(R.completedAt??R.startedAt)??w??g;new Set((Array.isArray(R.toolCalls)?R.toolCalls:[]).map($=>sp($))).has("shell")&&!x.io.some($=>$.kind==="unattributed"&&$.direction==="read")&&x.io.push({direction:"read",kind:"unattributed",id:R.responseId,ref:null,bytes:null,basis:"unknown"},{direction:"write",kind:"unattributed",id:R.responseId,ref:null,bytes:null,basis:"unknown"}),x.index===0&&x.io.unshift({direction:"read",kind:"prompt",id:h.responseId,ref:null,bytes:Buffer.byteLength(h.input.text,"utf8"),basis:"input_text"});let P=x.io.some($=>$.direction==="read"&&$.bytes===null),j=x.io.some($=>$.direction==="write"&&$.bytes===null);if(c.push({response_id:R.responseId,timestamp:D.toISOString(),model:typeof R.model=="string"?R.model:null,model_provider:typeof R.provider=="string"?R.provider:typeof h.provider=="string"?h.provider:null,tokens:L.tokens,files_read:P?null:x.filesRead,files_written:j?null:x.filesWritten,read_bytes:P?null:x.filesRead.reduce(($,pe)=>$+(pe.bytes??0),0)+x.io.filter($=>$.direction==="read").reduce(($,pe)=>$+(pe.bytes??0),0),write_bytes:j?null:x.filesWritten.reduce(($,pe)=>$+(pe.bytes??0),0)+x.io.filter($=>$.direction==="write").reduce(($,pe)=>$+(pe.bytes??0),0),external_io:x.io,pricing_facts:L.pricingFacts}),Object.keys(L.rawUsage).length){let $=l.at(-1);$.rawUsage=[...$.rawUsage??[],{responseId:R.responseId,values:L.rawUsage}]}}l.at(-1).responseIds=b,b.length!==v.length&&(d=!0),typeof h.output?.text=="string"&&a.push({role:"assistant",timestamp:w??g,content:h.output.text,model:y})}}let f=a.filter(p=>p.role==="user").map(p=>p.content),m=Vr(c,!d);return{provider:"miniplayer",sessionId:e,cwd:r.cwd,filePath:n,createdAt:o,modifiedAt:i,model:typeof r.model=="string"?r.model:void 0,messages:a,messageCount:a.length,userPrompts:f,firstUserMessage:f[0],lastUserMessage:f.at(-1),turns:l,responses:c,turnStatus:u,...d?{captureStatus:"partial"}:{},totalInputTokens:m.input_uncached??void 0,totalCachedInputTokens:m.input_cached??void 0,totalCacheWriteInputTokens:m.input_cache_write??void 0,totalOutputTokens:m.output??void 0}}function Gc(t){return{provider:"miniplayer",root:$o(qc(t),"sessions"),revision:"miniplayer-data-v3",sessionId(e){let n=gP(e,".json");return e.endsWith(".json")&&KT.test(n)?n:null},decode(e,n,r,s){s.signal.throwIfAborted();try{let o=JSON.parse(e.toString("utf8"));return(Array.isArray(o.turns)?o.turns.reduce((a,l)=>a+1+(Array.isArray(l?.modelResponses)?l.modelResponses.length:0)+(Array.isArray(l?.toolEvents)?l.toolEvents.length:0),0):Array.isArray(o.messages)?o.messages.length:0)>s.maxRows?null:zT(o,n,r)}catch{return null}}}}var KT,Xc,Jc=C(()=>{"use strict";Ea();nt();wr();KT=/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;Xc=class{name="miniplayer";home;constructor(e={}){this.home=qc(e.miniplayerHome)}getWatchPaths(){return[{directory:$o(this.home,"sessions"),filePattern:/\.json$/}]}async discoverSessions(){let e;try{e=await hP($o(this.home,"sessions"))}catch{return[]}return(await Promise.all(e.filter(r=>r.endsWith(".json")).map(r=>this.loadSession(r.slice(0,-5))))).filter(r=>r!==null)}async resolveSessionPath(e){if(!KT.test(e))return null;let n=$o(this.home,"sessions",`${e}.json`);try{return(await XT(n)).isFile()?n:null}catch{return null}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;try{let r=zT(JSON.parse(await BT(n,"utf8")),e,n);if(!r)return null;let s="complete";try{let o=JSON.parse(await BT(`${n}.lock`,"utf8"));if(Number.isInteger(o.pid)&&o.pid>0)try{process.kill(o.pid,0),s="in_progress"}catch{s="aborted"}}catch{}return{...r,...s!=="complete"?{turnStatus:s}:{}}}catch{return null}}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{throw await XT(`${n}.lock`),new Error("Cannot delete a locked miniplayer session")}catch(r){if(r.code!=="ENOENT")throw r}return await _P(n),!0}}});import{createHash as wP}from"node:crypto";import{createRequire as EP}from"node:module";import{readdir as TP,realpath as vP}from"node:fs/promises";import{basename as YT,dirname as SP,join as QT,resolve as ZT}from"node:path";function IP(){return bP("node:sqlite").DatabaseSync}function kP(){return process.env.HOME||process.env.USERPROFILE||""}function js(t){let e=[],n=0,r=()=>{let s=0n,o=0n;for(;;){if(n>=t.length||o>63n)return null;let i=t[n++];if(s|=BigInt(i&127)<<o,o+=7n,!(i&128))break}return s<=BigInt(Number.MAX_SAFE_INTEGER)?Number(s):null};for(;n<t.length;){let s=r();if(s===null)return e;let o=s>>>3,i=s&7;if(o===0)return e;if(i===0){let a=r();if(a===null)return e;e.push({field:o,wire:i,varint:a})}else if(i===1){if(n+8>t.length)return e;n+=8,e.push({field:o,wire:i})}else if(i===5){if(n+4>t.length)return e;n+=4,e.push({field:o,wire:i})}else if(i===2){let a=r();if(a===null||n+a>t.length)return e;e.push({field:o,wire:i,bytes:t.subarray(n,n+a)}),n+=a}else return e}return e}function qn(t,e){return t.find(n=>n.field===e)}function AP(t){let e=new Map;for(let n of t){if(n.field!==20||n.bytes===void 0)continue;let r=js(n.bytes),s=qn(r,1)?.bytes,o=qn(r,2)?.bytes;if(s===void 0||o===void 0)continue;let i=s.toString("utf8");e.has(i)||e.set(i,o.toString("utf8"))}return e}function NP(t){let e=qn(js(t),5)?.bytes;if(e===void 0)return null;let n=qn(js(e),1)?.bytes;if(n===void 0)return null;let r=js(n),s=qn(r,1)?.varint;if(s===void 0)return null;let o=qn(r,2)?.varint??0,i=s*1e3+Math.floor(o/1e6),a=new Date(i);return Number.isFinite(a.getTime())?a.toISOString():null}function xP(t){let e=qn(t,4)?.bytes,n=e!==void 0?js(e):[],r=s=>{let o=qn(n,s)?.varint;return o===void 0?null:oe(o)};return{tokens:{input_uncached:r(2),input_cached:r(5),input_cache_write:r(4),output:r(3)},thinkingOutputTokens:r(9)}}function RP(t){let e=qn(js(t),1)?.bytes;if(e===void 0)return null;let n=js(e),r=AP(n),s=r.get("request_id");if(s===void 0||s.length===0)return null;let o=qn(n,19)?.bytes,i=o!==void 0&&o.length>0?o.toString("utf8"):null,a=r.get("last_step_index"),l=a===void 0?Number.NaN:Number(a),c=Number.isSafeInteger(l)&&l>=0?l:null,{tokens:d,thinkingOutputTokens:u}=xP(n);return{requestId:s,model:i,lastStepIndex:c,tokens:d,thinkingOutputTokens:u}}function ev(t,e){Se(e);let n=t.prepare("SELECT COALESCE(SUM(LENGTH(CAST(data AS BLOB))),0) AS total FROM gen_metadata").get(),r=oe(n?.total);if(r===null||r>e.maxBytes)return null;let s=t.prepare("SELECT idx, data FROM gen_metadata ORDER BY idx LIMIT ?").all(e.maxRows+1);if(s.length>e.maxRows)return null;let o=wP("sha256");o.update("rev:").update(Vc).update(`
|
|
4
4
|
`);let i=[],a=[],l=0;for(let u of s){if(e.signal.throwIfAborted(),!(u.data instanceof Uint8Array))return null;let f=Buffer.from(u.data);if(l+=f.length,l>e.maxBytes)return null;o.update("g").update(String(u.idx)).update("\0").update(f).update(`
|
|
@@ -201,7 +201,7 @@ CREATE TABLE IF NOT EXISTS on_demand_launches(
|
|
|
201
201
|
cwd, command, request_message_id, request_payload, holder_pid, holder_host, status, started_at, last_seq)
|
|
202
202
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
|
|
203
203
|
ON CONFLICT(invocation_id) DO NOTHING`).run(n,s.kind??"chat",s.origin??"unknown",s.launch_source??"",s.from_identity??"",rt(s,"target","teamfile"),rt(s,"target","alias"),s.root_teamfile??null,s.cwd??null,s.command??null,s.request_message_id??null,s.request_payload??null,s.holder_pid??null,s.holder_host??null,s.started_at??"",e);break;case be.INVOCATION_FINISH:t.prepare(`UPDATE invocation_state SET status=?, ended_at=?, result_summary=?, error=?, last_seq=?
|
|
204
|
-
WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case be.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,n);break;default:break}}var be,Bp=C(()=>{"use strict";zm();md();be={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});var qS={};ge(qS,{CURRENT_USER_VERSION:()=>
|
|
204
|
+
WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,e,n);break;case be.INVOCATION_NOTIFY_CLAIM:t.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,e,n);break;default:break}}var be,Bp=C(()=>{"use strict";zm();md();be={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});var qS={};ge(qS,{CURRENT_USER_VERSION:()=>Cn,SchemaSkewError:()=>On,_resetNewerSchemaWarningForTests:()=>lj,currentSchemaSkew:()=>cj,migrate:()=>Pa});import{existsSync as YF,mkdirSync as QF,readFileSync as jS}from"node:fs";import{randomUUID as ZF}from"node:crypto";import{homedir as ej}from"node:os";import{dirname as WS,join as tj,resolve as HS}from"node:path";import{fileURLToPath as nj,pathToFileURL as rj}from"node:url";function Pa(t){if(t.readonly){let n=new Ln(t.dbPath,{readonly:!0,fileMustExist:!0});try{return Vo(n)>Cn&&Xp(n,t.dbPath,Cn,t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1"),n.pragma("foreign_keys = ON"),n}catch(r){try{n.close()}catch{}throw r}}t.dbPath!==":memory:"&&QF(WS(t.dbPath),{recursive:!0});let e=new Ln(t.dbPath);try{e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let n=Vo(e),r=t.buildVersionForTests??Cn,s=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(n>r)return Xp(e,t.dbPath,r,s),e;if(n===Cn)return US(e),e;let o=n>0&&n<47;o&&e.pragma("foreign_keys = OFF");try{e.transaction(()=>{let i=Vo(e);i>r&&Xp(e,t.dbPath,r,s)||(i===0&&(e.exec(jS(XS,"utf8")),e.pragma("user_version = "+Cn)),i>0&&i<63&&e.exec("DROP VIEW IF EXISTS turn_usage"),oj(e,i),US(e))}).immediate()}finally{o&&e.pragma("foreign_keys = ON")}return e}catch(n){try{e.close()}catch{}throw n}}function Xp(t,e,n,r){return t.transaction(()=>{let s=Vo(t);if(s<=n)return!1;let o=ij(t,s);if(Gp={dbVersion:s,buildVersion:n},o>n&&!r)throw new On(e,s,n);return o>n&&aj(e,s,n),!0})()}function oj(t,e){let n=e;if(n<2&&n!==0&&(t.exec(`
|
|
205
205
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
206
206
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
207
207
|
team_name TEXT NOT NULL,
|
|
@@ -1044,8 +1044,8 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1044
1044
|
ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
|
|
1045
1045
|
`)}finally{t.pragma("foreign_keys = ON")}}function Vo(t){let e=t.pragma("user_version",{simple:!0});return typeof e=="number"?e:0}function ij(t,e){try{if(!yn(t,"schema_meta"))return e;let n=t.prepare("SELECT value FROM schema_meta WHERE key = 'min_reader_version'").get();if(n===void 0||typeof n.value!="string"||!/^\d+$/.test(n.value))return e;let r=Number(n.value);return Number.isSafeInteger(r)&&r>0?r:e}catch{return e}}function aj(t,e,n){qp||(qp=!0,process.stderr.write("warning: "+t+": this lmctl is too old for this database (database v"+e+"; build v"+n+`). --allow-schema-skew may hide newer data. Run: npm install -g @lmctl-ai/lmctl@latest. No manual database changes are needed.
|
|
1046
1046
|
`),process.argv.includes("--json")&&process.stderr.write(`${JSON.stringify({schema_skew:{db_version:e,build_version:n,mode:"best_effort"}})}
|
|
1047
|
-
`))}function lj(){qp=!1,Gp=null}function cj(){return Gp}function dj(){return process.env.LMCTL_DB??tj(ej(),".lmctl","state.db")}var BS,XS,sj,
|
|
1048
|
-
`)}finally{t.close()}}catch(t){if(!(t instanceof
|
|
1047
|
+
`))}function lj(){qp=!1,Gp=null}function cj(){return Gp}function dj(){return process.env.LMCTL_DB??tj(ej(),".lmctl","state.db")}var BS,XS,sj,Cn,On,qp,Gp,_d=C(()=>{"use strict";Lp();OS();Fs();MS();Bp();BS=WS(nj(import.meta.url)),XS=HS(BS,"schema.sql"),sj=HS(BS,"migrations"),Cn=67,On=class extends Error{dbPath;dbVersion;buildVersion;constructor(e,n,r=Cn,s){super(e+": refusing to proceed: this lmctl is older than this database (database v"+n+"; build v"+r+"). "+(s?"Required database structure is unavailable: "+s.replace(/\s+/g," ")+". ":"")+"Run: npm install -g @lmctl-ai/lmctl@latest. No manual database changes are needed. --allow-schema-skew is a last resort and may hide newer data."),this.name="SchemaSkewError",this.dbPath=e,this.dbVersion=n,this.buildVersion=r}};qp=!1;Gp=null;if(process.argv[1]&&(process.argv[1].endsWith("migrate.ts")||process.argv[1].endsWith("migrate.js"))&&import.meta.url===rj(process.argv[1]).href)try{let t=Pa({dbPath:process.argv[2]??dj()});try{process.stdout.write("migrated user_version="+Vo(t)+`
|
|
1048
|
+
`)}finally{t.close()}}catch(t){if(!(t instanceof On))throw t;process.stderr.write("error: "+t.message+`
|
|
1049
1049
|
`),process.exitCode=1}});function GS(t){return{getAgentInflight:t.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:t.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:t.prepare(`
|
|
1050
1050
|
INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
|
|
1051
1051
|
VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
|
|
@@ -1380,9 +1380,9 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1380
1380
|
status, started_at, last_heartbeat_at, last_seq)
|
|
1381
1381
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,o),Qp(e)&&ib(t,o,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function vd(t,e){let n=Zs(e.id),r=cb(t,n);return r===null?!1:(Kt(t,{stream_id:n,event_type:Aj,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
|
|
1382
1382
|
SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
|
|
1383
|
-
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Qp(e)&&lb(t,s,n)}),!0)}function ub(t,e,n,r){let s=Zs(e.id),o=cb(t,s);return o===null?!1:(Kt(t,{stream_id:s,event_type:Nj,observedLastSeq:o.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},i=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,i,s,o.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function fb(t,e,n){let r=Zs(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Qp(e)&&ab(t,r,n)}function mb(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Zs(e))}function pb(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Zs(e))}var kj,Aj,Nj,hb=C(()=>{"use strict";md();Td();kj="INVOCATION_START",Aj="INVOCATION_FINISH",Nj="INVOCATION_NOTIFY_CLAIM"});var xj,Rj,vZ,_b,gb,yb,wb=C(()=>{"use strict";xj="other",Rj=["not_enough_information","dont_know","other_work"],vZ=new Set([xj,...Rj]),_b="@abort",gb="invalid_decision",yb="workflow_escalation"});import{randomUUID as Eb}from"node:crypto";import{existsSync as bb,mkdirSync as Lj,renameSync as Cj,rmdirSync as Oj}from"node:fs";import{hostname as Zp}from"node:os";function eh(t){return t.provider_resolved??t.provider}function Z(){return new Date().toISOString()}function Dj(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!bb(t))return e;let n;try{n=new
|
|
1383
|
+
WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Qp(e)&&lb(t,s,n)}),!0)}function ub(t,e,n,r){let s=Zs(e.id),o=cb(t,s);return o===null?!1:(Kt(t,{stream_id:s,event_type:Nj,observedLastSeq:o.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},i=>{if(t.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,i,s,o.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function fb(t,e,n){let r=Zs(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Qp(e)&&ab(t,r,n)}function mb(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Zs(e))}function pb(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Zs(e))}var kj,Aj,Nj,hb=C(()=>{"use strict";md();Td();kj="INVOCATION_START",Aj="INVOCATION_FINISH",Nj="INVOCATION_NOTIFY_CLAIM"});var xj,Rj,vZ,_b,gb,yb,wb=C(()=>{"use strict";xj="other",Rj=["not_enough_information","dont_know","other_work"],vZ=new Set([xj,...Rj]),_b="@abort",gb="invalid_decision",yb="workflow_escalation"});import{randomUUID as Eb}from"node:crypto";import{existsSync as bb,mkdirSync as Lj,renameSync as Cj,rmdirSync as Oj}from"node:fs";import{hostname as Zp}from"node:os";function eh(t){return t.provider_resolved??t.provider}function Z(){return new Date().toISOString()}function Dj(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!bb(t))return e;let n;try{n=new Ln(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function Mj(t){if(t===":memory:"||!bb(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{Cj(r,`${e}${n}`)}catch{}}return e}function Tb(t,e){let n=e instanceof Error?e.message:String(e);try{let r=Dj(t),s=Mj(t),o=new Zo(Pa({dbPath:t}));for(let i of r.rootTeams)o.upsertRootTeam(i);for(let{key:i,value:a}of r.config)o.setConfig(i,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${Cn} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
|
|
1384
1384
|
`:`
|
|
1385
|
-
`)),o}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function Sd(t,e,n=!1){let r;try{return r=Pa({dbPath:t,allowSchemaSkew:e,readonly:n}),{dal:new Zo(r)}}catch(s){if(s instanceof
|
|
1385
|
+
`)),o}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function Sd(t,e,n=!1){let r;try{return r=Pa({dbPath:t,allowSchemaSkew:e,readonly:n}),{dal:new Zo(r)}}catch(s){if(s instanceof On)throw s;let o;if(r!==void 0)try{o=r.pragma("user_version",{simple:!0})}catch{}try{r?.close()}catch{}return{cause:s,dbVersion:o}}}function Fj(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function jj(t){if(t===":memory:")return!0;try{return Lj(`${t}${Ib}`),!0}catch{return!1}}function Wj(t){if(t!==":memory:")try{Oj(`${t}${Ib}`)}catch{}}function Ye(t){let e=t.allowSchemaSkew??process.env.LMCTL_ALLOW_SCHEMA_SKEW==="1";if(t.readonly){let s=Sd(t.path,e,!0);if(s.dal)return s.dal;throw s.cause}if(t.recover===!1){let s=Sd(t.path,e);if(s.dal)return s.dal;throw s.cause}let n={};for(let s=0;s<$j;s+=1)if(n=Sd(t.path,e),n.dal!==void 0)return n.dal;let r=n.cause?.code;if(typeof r=="string"&&/^SQLITE_(BUSY|LOCKED)/.test(r))throw new Error(t.path+": database is busy; retry this command after the other writer finishes.",{cause:n.cause});if(n.dbVersion!==void 0&&n.dbVersion>Cn){let s=n.cause instanceof Error?n.cause.message:String(n.cause);throw new On(t.path,n.dbVersion,Cn,s)}for(let s=0;s<Pj;s+=1){if(jj(t.path))try{return Tb(t.path,n.cause)}finally{Wj(t.path)}Fj(Uj);let o=Sd(t.path,e);if(o.dal!==void 0)return o.dal}return Tb(t.path,n.cause)}function vb(t,e,n){let r=Sb(e);if(r.length===0)return;let s=new Set,o=[],i=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Sb(c.definition)},a=l=>{let c=o.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...o.slice(c),l].join(" -> ")}`);if(!s.has(l)){o.push(l);try{for(let d of i(l))a(d)}finally{o.pop()}s.add(l)}};a(t)}function Sb(t){let e=Hj(t),n=e===null?null:Bj(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))bd(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function Hj(t){try{let e=JSON.parse(t);return bd(e)?e:null}catch{return null}}function Bj(t,e){let n=t[e];return bd(n)?n:null}function bd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Xj(t){try{let e=JSON.parse(t);return!bd(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function qj(t,e){return t===null?!0:t.holder_host===Zp()?!$t(t.holder_pid):t.last_heartbeat<e}function Gj(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
|
|
1386
1386
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
1387
1387
|
VALUES (?, ?, ?, ?, ?)
|
|
1388
1388
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1802,7 +1802,7 @@ CREATE INDEX IF NOT EXISTS idx_prompt_task_reassignments_prompt ON prompt_task_r
|
|
|
1802
1802
|
${d}`)}`}Ut.renderGrid=Db;function Mb(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:l}={}){return Db(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:l})}function Zj(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:l,stream:c=process.stdout}={}){let d=Mb(t,{headers:e,align:n,truncate:r,truncateTrailing:s,margin:o,max:i,ellipsis:a,decimalPlaces:l});d&&c.write(`${d}
|
|
1803
1803
|
`)}Ut.formatTable=Mb;Ut.printTable=Zj;function kb(t){return t instanceof Date?t.getTime():typeof t=="number"?t:typeof t=="string"&&t.trim()?Date.parse(t):NaN}function eW(t,{now:e=Date.now()}={}){let n=kb(e);if(!Number.isFinite(n))throw new TypeError("now must be a valid timestamp");let r=kb(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":""}`}Ut.formatRelativeTime=eW;function tW(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`}Ut.formatCount=tW;var nh=[["w",604800],["d",86400],["h",3600],["m",60],["s",1]];function nW(t,{maxUnit:e="w",style:n="spaced"}={}){if(typeof t!="number"||!Number.isFinite(t))return"unknown";let r=nh.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=nh.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}`:`${Vn(m)}${u}`;l.push({text:p,zero:!1}),d=!0}else d&&l.push({text:`${Vn(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 nh.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(" ")}Ut.formatDuration=nW;function $b(t){return t===void 0?new Date:t instanceof Date?t:typeof t=="number"||typeof t=="string"?new Date(t):new Date(NaN)}function Vn(t){return String(t).padStart(2,"0")}function Pb(t){let e=$b(t);return Number.isNaN(e.getTime())?"unknown":`${Vn(e.getHours())}:${Vn(e.getMinutes())}:${Vn(e.getSeconds())}`}Ut.formatClock=Pb;function rW(t){let e=$b(t);return Number.isNaN(e.getTime())?"unknown":`${`${e.getFullYear()}-${Vn(e.getMonth()+1)}-${Vn(e.getDate())}`} ${Pb(e)}`}Ut.formatLocalTimestamp=rW;function sW(t){return typeof t=="number"&&Number.isFinite(t)?`${Math.round(t*100)}%`:"?%"}Ut.formatPercent=sW;function oW(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)||br(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)}`}Ut.formatBar=oW;function iW(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=`${Vn(r)}:${Vn(s)}:${Vn(e)}`;return n>0?`${n}d ${o}`:o}Ut.formatTimer=iW;function aW(t){return(t==null?"":String(t)).replace(/[\x00-\x1f\x7f-\x9f]/gu,n=>n===`
|
|
1804
1804
|
`?"\\n":n===" "?"\\t":n==="\r"?"\\r":`\\x${n.codePointAt(0).toString(16).padStart(2,"0")}`)}Ut.escapeCell=aW});var Hb={};ge(Hb,{defaultDbPath:()=>rh,describeStateLocation:()=>Ha,isSlowWslMount:()=>Wb,lmctlNextHome:()=>jb,resolveDbPath:()=>mt,warnIfSlowDbPath:()=>sh});import{platform as Ub}from"node:os";import{homedir as lW}from"node:os";import{join as Fb}from"node:path";function jb(t=process.env){let e=t.LMCTL_HOME;return e!==void 0&&e.length>0?e:Fb(t.HOME||lW(),cW)}function rh(t=process.env){return Fb(jb(t),dW)}function mt(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:rh(e)}function Ha(t,e=process.env){return e.LMCTL_DB!==void 0&&e.LMCTL_DB.length>0&&e.LMCTL_DB!==rh(e)?`db: ${t} (overridden by --db/LMCTL_DB)`:`db: ${t}`}function Wb(t,e=Ub()){return e!=="linux"?!1:t.startsWith("/mnt/c/")||t==="/mnt/c"}function sh(t,e=process.stderr,n=Ub()){Wb(t,n)&&e.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
1805
|
-
`)}var cW,dW,Kn=C(()=>{"use strict";cW=".lmctl",dW="state.db"});import{statSync as uW}from"node:fs";function
|
|
1805
|
+
`)}var cW,dW,Kn=C(()=>{"use strict";cW=".lmctl",dW="state.db"});import{statSync as uW}from"node:fs";function Dn(t){return(t.env??process.env).LMCTL_NON_INTERACTIVE==="1"}function Id(t){return{...t,env:{...t.env??process.env,LMCTL_NON_INTERACTIVE:"1"}}}function Pe(t){let e=t.env?.LMCTL_DB;return e!==void 0&&e.length>0?e:mt(void 0,{...process.env,...t.env})}async function q(t,e){if(t.dal!==void 0)return e(t.dal);let n=Pe(t),r=(t.env??process.env).LMCTL_READ_ONLY==="1";try{r||=(uW(n).mode&146)===0}catch{}let s=Ye({path:n,readonly:r});try{return await e(s)}finally{s.close()}}function de(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 F(t,e){let n=t.flags[e];return typeof n=="string"?n:void 0}function z(t,e){return t.flags[e]===!0}function Y(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
|
|
1806
1806
|
`)}function O(t,e){return t.stderr.write(`error: ${e}
|
|
1807
1807
|
`),1}function eo(){return(0,qb.formatClock)()}function Ba(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 fW(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 mW(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:!fW(e)}function pW(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"?Bb(e.event):Bb(e)}function Bb(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 Gb(t,e){if(mW(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+`
|
|
1808
1808
|
`)},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+`)
|
|
@@ -1826,7 +1826,7 @@ ${r}`}}}function ni(t,e){return e===""?t:`${t}:${e.includes(`
|
|
|
1826
1826
|
`:" "}${e}`}var AW,NW,xW,RW,LW,CW,on=C(()=>{"use strict";Ad();AW=500,NW=1e6,xW=50,RW=20*1024*1024,LW=/^stderr-\d+-\d+-[0-9a-f-]{36}\.log$/,CW=/(["']?(?:api[_-]?key|access[_-]?token|refresh[_-]?token|client[_-]?secret|password|authorization|token|secret|credential)["']?\s*[:=]\s*)(?:"(?:\\.|[^"\\])*"|'[^']*'|(?:(?:Bearer|Basic)\s+)?[^\s,;}]+)/gi});import{readFileSync as eI,appendFileSync as jW,mkdirSync as WW,existsSync as iee,readdirSync as aee,unlinkSync as lee}from"node:fs";import{join as Rd,dirname as HW}from"node:path";import{homedir as BW}from"node:os";function lh(){return Rd(BW(),".lmctl")}function ch(){ri=!0,process.env.LMCTL_DEBUG="1"}function tI(){return{cliDebug:ri,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function nI(t){ri=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function $e(){if(ri||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Zb>=XW&&(Qb=VW(),Zb=t),Qb}function Va(){return ri||process.env.LMCTL_DEBUG==="1"}function qW(){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 ah(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 Ja(t);if(Array.isArray(t))return t.map(r=>ah(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]=ah(o,s,n);return n.delete(t),r}return t}function GW(t){return ah(t)}function Et(t,e){if(e?.verbose){if(!ri)return}else if(!e?.always&&!$e())return;try{JW();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,...GW(t)};jW(xd,JSON.stringify(n)+`
|
|
1827
1827
|
`)}catch{}}function JW(){if(!xd){let e=qW().slice(0,13).replace("T","-");xd=Rd(lh(),`debug-${e}.log`)}WW(HW(xd),{recursive:!0})}function At(...t){Et({event:"legacy",msg:t.join(" ")})}function pt(...t){Et({event:"legacy",msg:t.join(" ")},{verbose:!0})}function B(t){Et(t,{always:!0})}function VW(){return KW()||zW()}function KW(){try{let t=eI(Rd(lh(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
1828
1828
|
`)){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 zW(){try{let t=eI(Rd(lh(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var ri,Qb,Zb,XW,xd,we=C(()=>{"use strict";on();ri=!1,Qb=!1,Zb=0,XW=5e3;xd=null});function hH(t,e){if(!e||t.includes(e))return!1;let n=0;for(let r of t.split(`
|
|
1829
|
-
`))/^\s{2,}\S.*\([A-Za-z]+\)\s*$/.test(r)&&n++;return n>=3}function kr(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 _H)if(n.test(t,e))return{class:n.class,rule:n.rule};return{class:"unknown",rule:null}}var Dn,_H,Ld=C(()=>{"use strict";Dn=t=>e=>t.test(e);_H=[{rule:"usage-limit",class:"quota_exhausted",test:Dn(/usage limit|out of usage credits|quota (has been )?(reached|exhausted)|Insufficient Balance/i)},{rule:"spawn-enoent",class:"binary_missing",test:Dn(/spawn \S+ ENOENT/i)},{rule:"auth-message",class:"auth_required",test:Dn(/Unauthorized|Incorrect API key|invalid api key|not logged in|Authentication required|login required/i)},{rule:"no-content-no-activity",class:"upstream_undisclosed",test:Dn(/no content and no observed activity/i)},{rule:"throttled",class:"upstream_throttled",test:Dn(/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:Dn(/connection to the agent was interrupted|stalled for \d+s|provider stalled after/i)},{rule:"context-window",class:"context_exhausted",test:Dn(/ran out of room in the model's context window|context (length|window) (exceeded|full)/i)},{rule:"receiver-held",class:"receiver_busy",test:Dn(/is held by a terminal|is servicing /i)},{rule:"holder-dead",class:"holder_died",test:Dn(/holder process verified not alive|holder_pid confirmed dead|received SIGTERM/i)},{rule:"model-list",class:"model_not_offered",test:(t,e)=>hH(t,e.model)},{rule:"model-message",class:"model_not_offered",test:Dn(/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:Dn(/No conversation found with session ID|conversation \S+ not found/i)}]});import{openSync as gH,closeSync as yH,fstatSync as wH,readSync as EH,constants as aI}from"node:fs";import{dirname as TH,join as Cd}from"node:path";import{createHash as vH}from"node:crypto";function fh(t){if(!qs(t.catalog)||!Gs(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=uI(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(!lI(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&&!lI(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 cI(t){let e=gH(t,aI.O_RDONLY|aI.O_NONBLOCK);try{let n=wH(e);if(!n.isFile()||n.size>SH)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=EH(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{yH(e)}}function mh(t,e=Cd(TH(t),"aliases.json")){let n=cI(t),r=cI(e),s;try{s=dI(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=dI(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:vH("sha256").update(n).update(r).digest("hex")};return fh(i),i}function si(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 fh(o),o})():null}finally{t.pragma("busy_timeout = "+e)}}function ph(t,e,n={}){fh(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(uI(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 hh(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=si(t),o=uh.get(t),i=o&&o.hash===s?.sha256?o.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=i&&n-i<Js(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(mh(Cd(r.LMCTL_PRICE_DATA,"model_list.json"))):Dt({cacheDir:r.LMCTL_HOME?Cd(r.LMCTL_HOME,"cache","lmprice"):r.HOME?Cd(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:Js(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(uh.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=ph(t,c,{now:n}),u=si(t);return uh.set(t,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function Od(t,e){try{return(await hh(t,{env:e,budgetMs:900})).snapshot??Ka}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return Ka;try{return si(t)??Ka}catch{return Ka}}}async function _h(t){if(t.dal)return Od(t.dal.db,t.env);let e;try{return e=Ye({path:Pe(t),recover:!1}),await Od(e.db,t.env)}catch{return Ka}finally{try{e?.close()}catch{}}}var Ka,uI,lI,SH,dI,uh,Dd=C(()=>{"use strict";gn();Pt();he();Ka={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null},uI=t=>t.record_id??t.source+":"+t.source_model_id,lI=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;SH=64*1024*1024;dI=t=>JSON.parse(t.replace(/^\uFEFF/,""));uh=new WeakMap});function Ar(t){return t!=="gemini"}function Md(t){if(!Ar(t))throw new Error(ds)}var ds,oi=C(()=>{"use strict";ds="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function fI(t){if(t.length===0||!t.startsWith("---"))throw new zn("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1829
|
+
`))/^\s{2,}\S.*\([A-Za-z]+\)\s*$/.test(r)&&n++;return n>=3}function kr(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 _H)if(n.test(t,e))return{class:n.class,rule:n.rule};return{class:"unknown",rule:null}}var Sn,_H,Ld=C(()=>{"use strict";Sn=t=>e=>t.test(e);_H=[{rule:"self-session-unregistered",class:"self_session_unregistered",test:Sn(/LMCTL_SELF_SESSIONID is set but does not match any member of a registered team\b/i)},{rule:"usage-limit",class:"quota_exhausted",test:Sn(/usage limit|out of usage credits|quota (has been )?(reached|exhausted)|Insufficient Balance/i)},{rule:"spawn-enoent",class:"binary_missing",test:Sn(/spawn \S+ ENOENT/i)},{rule:"auth-message",class:"auth_required",test:Sn(/Unauthorized|Incorrect API key|invalid api key|not logged in|Authentication required|login required/i)},{rule:"no-content-no-activity",class:"upstream_undisclosed",test:Sn(/no content and no observed activity/i)},{rule:"throttled",class:"upstream_throttled",test:Sn(/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:Sn(/connection to the agent was interrupted|stalled for \d+s|provider stalled after/i)},{rule:"context-window",class:"context_exhausted",test:Sn(/ran out of room in the model's context window|context (length|window) (exceeded|full)/i)},{rule:"receiver-held",class:"receiver_busy",test:Sn(/is held by a terminal|is servicing /i)},{rule:"holder-dead",class:"holder_died",test:Sn(/holder process verified not alive|holder_pid confirmed dead|received SIGTERM/i)},{rule:"model-list",class:"model_not_offered",test:(t,e)=>hH(t,e.model)},{rule:"model-message",class:"model_not_offered",test:Sn(/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:Sn(/No conversation found with session ID|conversation \S+ not found/i)}]});import{openSync as gH,closeSync as yH,fstatSync as wH,readSync as EH,constants as aI}from"node:fs";import{dirname as TH,join as Cd}from"node:path";import{createHash as vH}from"node:crypto";function fh(t){if(!qs(t.catalog)||!Gs(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=uI(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(!lI(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&&!lI(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 cI(t){let e=gH(t,aI.O_RDONLY|aI.O_NONBLOCK);try{let n=wH(e);if(!n.isFile()||n.size>SH)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=EH(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{yH(e)}}function mh(t,e=Cd(TH(t),"aliases.json")){let n=cI(t),r=cI(e),s;try{s=dI(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=dI(r),i={catalog:s,aliases:o,source:"pinned",generatedAt:s?.generated_at||null,sha256:vH("sha256").update(n).update(r).digest("hex")};return fh(i),i}function si(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 fh(o),o})():null}finally{t.pragma("busy_timeout = "+e)}}function ph(t,e,n={}){fh(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(uI(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 hh(t,e={}){let n=e.now??Date.now(),r={...process.env,...e.env},s=si(t),o=uh.get(t),i=o&&o.hash===s?.sha256?o.at:Date.parse(s?.fetchedAt??"");if(!e.force&&s&&n>=i&&n-i<Js(r))return{status:"unchanged",snapshot:s};let a=e.load??(()=>r.LMCTL_PRICE_DATA?Promise.resolve(mh(Cd(r.LMCTL_PRICE_DATA,"model_list.json"))):Dt({cacheDir:r.LMCTL_HOME?Cd(r.LMCTL_HOME,"cache","lmprice"):r.HOME?Cd(r.HOME,".lmctl","cache","lmprice"):void 0,ttlMs:e.force?0:Js(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(uh.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=ph(t,c,{now:n}),u=si(t);return uh.set(t,{hash:u?.sha256??null,at:n}),{status:d,snapshot:u}}async function Od(t,e){try{return(await hh(t,{env:e,budgetMs:900})).snapshot??Ka}catch(n){if(/^SQLITE_(BUSY|LOCKED)(_|$)/.test(String(n?.code)))return Ka;try{return si(t)??Ka}catch{return Ka}}}async function _h(t){if(t.dal)return Od(t.dal.db,t.env);let e;try{return e=Ye({path:Pe(t),recover:!1}),await Od(e.db,t.env)}catch{return Ka}finally{try{e?.close()}catch{}}}var Ka,uI,lI,SH,dI,uh,Dd=C(()=>{"use strict";gn();Pt();he();Ka={catalog:null,aliases:null,source:"unavailable",generatedAt:null,sha256:null},uI=t=>t.record_id??t.source+":"+t.source_model_id,lI=t=>t===null||typeof t=="number"&&Number.isFinite(t)&&t>=0;SH=64*1024*1024;dI=t=>JSON.parse(t.replace(/^\uFEFF/,""));uh=new WeakMap});function Ar(t){return t!=="gemini"}function Md(t){if(!Ar(t))throw new Error(ds)}var ds,oi=C(()=>{"use strict";ds="Standalone Gemini CLI support is disabled; use provider=agy with an Agy-supported Gemini model."});function fI(t){if(t.length===0||!t.startsWith("---"))throw new zn("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
1830
1830
|
`);if(e[0]!=="---")throw new zn("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 zn(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!bH.has(c))throw new zn(`unknown frontmatter key "${c}" \u2014 allowed keys: ${$d.join(", ")}`);n[c]=d}if(r===-1)throw new zn("frontmatter not closed (missing trailing `---` on its own line)");for(let i of $d)if(n[i]===void 0)throw new zn(`missing required frontmatter key "${i}" \u2014 required: ${$d.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 $d,bH,zn,mI=C(()=>{"use strict";$d=["title","description","members"],bH=new Set($d),zn=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});function no(t){return gh.has(t)}var gh,za=C(()=>{"use strict";gh=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","pi","miniplayer","muse","ClaudeMock"])});import{readFileSync as IH,writeFileSync as Oee,renameSync as Dee,existsSync as hI}from"node:fs";import{basename as kH,resolve as ii,dirname as yh}from"node:path";function AH(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 NH(t){return/^\s*_(?:MEMBER|AGENT)_\s+\S/.test(t)}function xH(t){return/^\s*_SESSION_\s+\S/.test(t)}function RH(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function st(t){return/\.(?:lmctl|lmc)$/i.test(t)}function Ya(t){return kH(t).replace(/\.(?:lmctl|lmc)$/i,"")}function Fe(t){let e=IH(t,"utf-8"),n=yh(ii(t)),r=ai(e,Ya(t),{baseDir:n,sourcePath:ii(t)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=ii(n,s.sessiondir));return r}function ai(t,e,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
|
|
1831
1831
|
`);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=fI(o)}catch(l){if(l instanceof zn)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
1832
1832
|
`);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(xH(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(RH(c)||!NH(c))continue;let u=AH(c);for(let m of Object.keys(u))if(!pI.includes(m))throw new Error(`line ${d}: unknown key "${m}" on _MEMBER_ line: ${c.trim()}
|
|
@@ -1837,9 +1837,9 @@ ${r}`}}}function ni(t,e){return e===""?t:`${t}:${e.includes(`
|
|
|
1837
1837
|
Use: lmctl ${t.name} ${n}:<alias> or lmctl ${t.name} ${n} <alias>`};if(Ih(n)){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${r}" but "${n}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${n}" is a bare sessionid, but ${t.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:n};return s.provider!==void 0&&(a.provider=s.provider),a}return r!==void 0?{mode:"error",message:`lmctl ${t.name}: got a second positional "${r}" but "${n}" is not a teamfile path.
|
|
1838
1838
|
Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${n}".
|
|
1839
1839
|
Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
|
|
1840
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var De,qH,GH,JH,jd,Nt=C(()=>{"use strict";Tt();Tt();Qn();bh();De=class extends Error{constructor(e,n){super(e),this.name="ChatTargetError",n&&Object.defineProperty(this,"kind",{value:n})}},qH=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,GH=/^ses_[A-Za-z0-9_-]+$/,JH=/^session_[A-Za-z0-9_-]+$/,jd=/^[A-Za-z][A-Za-z0-9_-]*$/});import{existsSync as VH,mkdirSync as KH,readFileSync as zH,renameSync as YH,unlinkSync as QH,writeFileSync as ZH}from"node:fs";import{homedir as kI}from"node:os";import{dirname as tl,join as Ft,resolve as eB}from"node:path";function di(t,e,n){let r=tl(eB(n)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??r,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries())er(Ft(i,".mcp.json"),"mcpServers",[us(),fs()]),a.has("opencode")&&er(Ft(i,".opencode","opencode.json"),"mcp",[AI(),NI()]),a.has("kimi")&&er(Ft(i,".kimi-code","mcp.json"),"mcpServers",[us(),fs()]);for(let i of s)oB(i)}function nB(t=kh??kI()){return Ft(t,".copilot","mcp-config.json")}function rB(t,e){
|
|
1841
|
-
`,"utf8"),
|
|
1842
|
-
`)),B({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function II(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function aB(t){let e=new Map,n;for(let s of t.split(/\n/)){let o=xI(s);if(o===null)return null;if(o!==void 0){n=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),l=s.slice(i+1).trim(),c=lB(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Wd&&c[1]!==Hd)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=RI(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=dB(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let r=new Set;for(let[s,o]of e.entries())s===Wd&&CI(o.command,o.args)&&r.add(s),s===Hd&&OI(o.command,o.args)&&r.add(s);return r}function lB(t,e){if(t.startsWith("mcp_servers"))return Bd(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=Bd(t);return n===null?null:[...e,...n]}function xI(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Bd(e[1])}function cB(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return Bd(n)}function Bd(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",o=!1;for(;n<t.length;){let i=t[n];if(i==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(i==='"'){n+=1,o=!0;break}s+=i,n+=1}if(!o)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function RI(t){let e=LI(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function dB(t){let e=LI(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>RI(s.trim()));return r.some(s=>s===null)?null:r}function LI(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function uB(t){return ci(t)?t.type==="stdio"&&typeof t.command=="string"&&CI(t.command,t.args):!1}function fB(t){return!ci(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&MI(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&DI(t.command[0],[t.command[1],t.command[2]])}function mB(t){return ci(t)?t.type==="stdio"&&OI(t.command,t.args):!1}function pB(t){return!ci(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&$I(t.command[0])&&t.command[1]==="mcp"}function CI(t,e){return MI(t)&&PI(e)||DI(t,e)}function OI(t,e){return $I(t)&&PI(e)}function DI(t,e){return hB(t)&&Array.isArray(e)&&e.length===2&&_B(e[0])&&e[1]==="mcp"}function MI(t){return typeof t=="string"&&Ah(t)==="lmctl"}function $I(t){return typeof t=="string"&&Ah(t)==="lmctl0"}function hB(t){if(typeof t!="string")return!1;let e=Ah(t).toLowerCase();return e==="node"||e==="node.exe"}function _B(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Ah(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function PI(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function ci(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Wd,Hd,tB,
|
|
1840
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var De,qH,GH,JH,jd,Nt=C(()=>{"use strict";Tt();Tt();Qn();bh();De=class extends Error{constructor(e,n){super(e),this.name="ChatTargetError",n&&Object.defineProperty(this,"kind",{value:n})}},qH=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,GH=/^ses_[A-Za-z0-9_-]+$/,JH=/^session_[A-Za-z0-9_-]+$/,jd=/^[A-Za-z][A-Za-z0-9_-]*$/});import{existsSync as VH,mkdirSync as KH,readFileSync as zH,renameSync as YH,unlinkSync as QH,writeFileSync as ZH}from"node:fs";import{homedir as kI}from"node:os";import{dirname as tl,join as Ft,resolve as eB}from"node:path";function di(t,e,n){let r=tl(eB(n)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??r,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries())er(Ft(i,".mcp.json"),"mcpServers",[us(),fs()]),a.has("opencode")&&er(Ft(i,".opencode","opencode.json"),"mcp",[AI(),NI()]),a.has("kimi")&&er(Ft(i,".kimi-code","mcp.json"),"mcpServers",[us(),fs()]);for(let i of s)oB(i)}function nB(t=kh??kI()){return Ft(t,".copilot","mcp-config.json")}function rB(t,e){bn.mkdirSync(tl(t),{recursive:!0});let n=Ft(tl(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{bn.writeFileSync(n,`${JSON.stringify(e,null,2)}
|
|
1841
|
+
`,"utf8"),bn.renameSync(n,t)}catch(r){try{bn.unlinkSync(n)}catch{}throw r}}function sB(t,e){bn.mkdirSync(tl(t),{recursive:!0});let n=Ft(tl(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{bn.writeFileSync(n,e,"utf8"),bn.renameSync(n,t)}catch(r){try{bn.unlinkSync(n)}catch{}throw r}}function er(t,e,n){try{if(!bn.existsSync(t))return;let r=JSON.parse(bn.readFileSync(t,"utf8"));if(!ci(r)||!ci(r[e]))return;let s={...r[e]},o=[];for(let{name:i,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,i)&&a(s[i])&&(delete s[i],o.push(i));if(o.length===0)return;r[e]=s,rB(t,r),B({event:"mcp_cleanup",path:t,removed:o})}catch{}}function us(){return{name:Hd,shouldRemove:mB}}function AI(){return{name:Hd,shouldRemove:pB}}function fs(){return{name:Wd,shouldRemove:uB}}function NI(){return{name:Wd,shouldRemove:fB}}function oB(t){let e=kh??kI();switch(t){case"copilot":er(nB(e),"mcpServers",[us(),fs()]);return;case"claude":er(Ft(e,".claude.json"),"mcpServers",[us(),fs()]);return;case"gemini":er(Ft(e,".gemini","settings.json"),"mcpServers",[us(),fs()]);return;case"qwen":er(Ft(e,".qwen","settings.json"),"mcpServers",[us(),fs()]);return;case"agy":er(Ft(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[us(),fs()]);return;case"opencode":er(Ft(e,".config","opencode","opencode.json"),"mcp",[AI(),NI()]);return;case"kimi":er(Ft(kh===void 0?process.env.KIMI_CODE_HOME??Ft(e,".kimi-code"):Ft(e,".kimi-code"),"mcp.json"),"mcpServers",[us(),fs()]);return;case"codex":iB(Ft(e,".codex","config.toml"));return;default:return}}function iB(t){try{if(!bn.existsSync(t))return;let e=bn.readFileSync(t,"utf8"),n=aB(e);if(n===null)return;let r=e.split(/\n/),s=[],o=new Set,i=!1,a;for(let l of r){let c=xI(l);if(c===null)return;if(c!==void 0){if(II(c,n)){i=!0,a=c[1],o.add(a);continue}i=!1,a=void 0,s.push(l);continue}if(i){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&o.add(a);continue}let d=cB(l);if(d===null)return;if(d!==void 0&&II(d,n)){o.add(d[1]);continue}s.push(l)}if(o.size===0)return;sB(t,s.join(`
|
|
1842
|
+
`)),B({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function II(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function aB(t){let e=new Map,n;for(let s of t.split(/\n/)){let o=xI(s);if(o===null)return null;if(o!==void 0){n=o;continue}let i=s.indexOf("=");if(i<0)continue;let a=s.slice(0,i).trim(),l=s.slice(i+1).trim(),c=lB(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Wd&&c[1]!==Hd)continue;let d=e.get(c[1])??{};if(c[2]==="command"){let u=RI(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=dB(l);if(u===null)return null;d.args=u}e.set(c[1],d)}let r=new Set;for(let[s,o]of e.entries())s===Wd&&CI(o.command,o.args)&&r.add(s),s===Hd&&OI(o.command,o.args)&&r.add(s);return r}function lB(t,e){if(t.startsWith("mcp_servers"))return Bd(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=Bd(t);return n===null?null:[...e,...n]}function xI(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Bd(e[1])}function cB(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return Bd(n)}function Bd(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",o=!1;for(;n<t.length;){let i=t[n];if(i==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(i==='"'){n+=1,o=!0;break}s+=i,n+=1}if(!o)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function RI(t){let e=LI(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function dB(t){let e=LI(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>RI(s.trim()));return r.some(s=>s===null)?null:r}function LI(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function uB(t){return ci(t)?t.type==="stdio"&&typeof t.command=="string"&&CI(t.command,t.args):!1}function fB(t){return!ci(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&MI(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&DI(t.command[0],[t.command[1],t.command[2]])}function mB(t){return ci(t)?t.type==="stdio"&&OI(t.command,t.args):!1}function pB(t){return!ci(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&$I(t.command[0])&&t.command[1]==="mcp"}function CI(t,e){return MI(t)&&PI(e)||DI(t,e)}function OI(t,e){return $I(t)&&PI(e)}function DI(t,e){return hB(t)&&Array.isArray(e)&&e.length===2&&_B(e[0])&&e[1]==="mcp"}function MI(t){return typeof t=="string"&&Ah(t)==="lmctl"}function $I(t){return typeof t=="string"&&Ah(t)==="lmctl0"}function hB(t){if(typeof t!="string")return!1;let e=Ah(t).toLowerCase();return e==="node"||e==="node.exe"}function _B(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Ah(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function PI(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function ci(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Wd,Hd,tB,bn,kh,Xd=C(()=>{"use strict";we();Wd="lmctl",Hd="lmctl0",tB={existsSync:VH,mkdirSync:KH,readFileSync:zH,writeFileSync:ZH,renameSync:YH,unlinkSync:QH},bn=tB});import{basename as gB}from"node:path";function jI(t,e){let n=new Date(e.now.getTime()-ms()).toISOString(),r=BI(t,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=TB(e.sender,r),o=vB(e.sender,r);o!==null&&o.teamfile===e.root&&!FI(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(m=>FI(m,i)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,d=c!==null&&e.now.getTime()-c<yB,u=Nh(e.sender,r).length;return{stop:l.length>=1&&d&&u>=wB,chain:SB(a)}}function WI(t,e){let n=new Date(e.now.getTime()-ms()).toISOString(),r=BI(t,n),s=Nh(e.sender,r);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function ms(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return UI;let n=Number(e);return!Number.isFinite(n)||n<=0?UI:n}function HI(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function EB(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function BI(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(EB).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function TB(t,e,n={}){let r=new Map;for(let a of e)r.set(ro(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([ro(t)]);for(let a=0;a<64;a+=1){let l=r.get(ro(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let d=ro(l.sender);if(i.has(d))break;s.unshift(c),i.add(d),o=l.sender}return s}function Nh(t,e){let n=ro(t),r=new Set([n]),s=[n],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=ro(l.sender),d=ro(l.receiver);c!==a&&d!==a||(o.includes(l)||o.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(d)||(r.add(d),s.push(d)))}}return o.sort((i,a)=>i.at-a.at)}function vB(t,e){let n=Nh(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function FI(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function ro(t){return`${t.teamfile}\0${t.alias}`}function SB(t){return t.map(e=>`${gB(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var yB,wB,UI,qd=C(()=>{"use strict";yB=6e4,wB=2,UI=8*60*60*1e3});function xh(t,e){if(yd(e)!=="dead")return null;let n=`holder process verified not alive; reconciled to aborted (invocation #${e.id}, holder pid ${e.holder_pid??"unknown"} on ${e.holder_host??"unknown"})`;return t.abortTrackedInvocationAndTerminalizeMessage(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},n)}function Gd(t,e,n){let r=t.query(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
|
|
1843
1843
|
FROM tracked_invocation
|
|
1844
1844
|
WHERE target_teamfile = ?
|
|
1845
1845
|
AND target_alias = ?
|
|
@@ -1957,6 +1957,9 @@ not officially supported.
|
|
|
1957
1957
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function fo(t,e=process.env,n){let r=n?.db?.name??mt(void 0,e),s=e.LMCTL_DB===r?e:{...e,LMCTL_DB:void 0};return`lmctl ${t}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
|
|
1958
1958
|
The session marker may be stale or the team may not be registered in this lmctl database.
|
|
1959
1959
|
Consulted ${Ha(r,s)}
|
|
1960
|
+
For a deliberately isolated database, remove the inherited session marker explicitly:
|
|
1961
|
+
env -u LMCTL_SELF_SESSIONID lmctl ...
|
|
1962
|
+
In LMScript, before lm_* calls: set_env("LMCTL_SELF_SESSIONID", null);
|
|
1960
1963
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function bN(t){return`unknown option --from
|
|
1961
1964
|
${dJ(t)}`}function Qu(t,e){let n=Kg(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function Kg(t,e){let n=t[Xh];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let o of e.listRootTeams()){let i;try{i=Yn(o.teamfile_path,e)}catch{continue}for(let a of i.members)a.teamfile===void 0&&a.session===n&&r.push(`${o.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var Ll=C(()=>{"use strict";Pt();Fs();Mn();Kn();Qn()});function mo(t){let e=Nr(t);if(e===null)throw new Error(`invalid agent identity: ${t}`);return{teamfile:e.teamfile,alias:e.alias,value:t}}var Zu=C(()=>{"use strict";Nt()});function zg(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,o=()=>t.dal!==void 0?t.dal:(s===null&&(s=Ye({path:Pe(t)})),s),i=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>o().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&$t(a.holder_pid)),pollMs:uJ,settleMs:fJ,maxHoldMs:zo(n),onHold:()=>B({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{i(),!(!a.held&&a.reason==="cleared")&&B({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function IN(t){let e=t.literalPrompt?t.newMessage:mJ(t.newMessage,{newMessageFrom:t.newMessageFrom??pJ(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=$e(),s=0,o=0,i=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,i=Buffer.byteLength(c,"utf8"),o+=i),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.registry&&(a.registry=t.registry),t.signal&&(a.signal=t.signal),t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),t.requireResume!==void 0&&(a.requireResume=t.requireResume),t.bundleSession!==void 0&&(a.bundleSession=t.bundleSession),a.holdOpen=zg(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await Al(a);if(t.requireResume&&l.sessionId!==t.receiver.sessionId)throw Object.assign(new Error(`provider session changed: expected ${t.receiver.sessionId}, received ${l.sessionId??"(missing)"}`),{usage:l.usage,sessionId:l.sessionId});return r&&At(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:o,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:i,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:l.status==="empty"?{status:"empty",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}:{status:"ok",receipt:l.text,sessionId:l.sessionId,...l.usage?{usage:l.usage}:{},prompt:e,wroteDelta:n,durationMs:l.durationMs,...l.warnings!==void 0?{warnings:l.warnings}:{}}}function mJ(t,e={}){return[`--- new prompt (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
|
|
1962
1965
|
`)}function pJ(t){return`${t.teamfile}:${t.alias}`}var ice,uJ,fJ,Yg=C(()=>{"use strict";Or();we();he();Pt();Qs();Tn();ice=60*60*1e3,uJ=2e3,fJ=5e3});async function ef(t){let e=t.onEvent??(()=>{}),n=hJ(t.io,e),r=null,s=null,o=null,i,a,l=null,c=!1,d=null,u=t.prompt,f,m=()=>{let p=t.signal?.reason;if(o===null||!["SIGINT","SIGTERM","SIGHUP"].includes(p))return;let _;try{_=n.dal??Ye({path:Pe(n)}),_.finishTrackedInvocation(o,{status:"cancelled",signal:p,exit_code:p==="SIGINT"?130:p==="SIGTERM"?143:129,error:`prompt holder received ${p}`,team_chat_log_id:l}),s!==null&&_.releaseAgentInflight(s.row,s.leaseId)}catch(h){n.stderr.write(`error: failed to record holder ${p}: ${String(h)}
|
|
@@ -1965,7 +1968,7 @@ ${dJ(t)}`}function Qu(t,e){let n=Kg(t,e);return n.ok?{ok:!0,identity:n.identity,
|
|
|
1965
1968
|
`),null}}async function NN(t,e,n){let r=Ol(n.message),s=n.response===null?null:Ol(n.response);try{await q(t,o=>o.finishTeamChatLog(e,{usage:n.usage,root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(o){t.stderr.write(`warning: failed to finish chat log ${e}: ${o instanceof Error?o.message:String(o)}
|
|
1966
1969
|
`)}}async function LJ(t,e,n){if(e!==null)try{await q(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
|
|
1967
1970
|
`)}}async function xN(t,e){let n=Ol(e.message),r=e.response===null?null:Ol(e.response);try{return await q(t,s=>s.insertTeamChatLog({usage:e.usage,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:r?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,message_type:e.message_type??null,created_at:e.started_at??new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
1968
|
-
`),null}}function po(t,e,n,r,s){t!==null||e===null||B({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:r,message_preview:tf(n)})}function Ol(t){return t.length<=kN?{text:t,truncated:!1}:{text:t.slice(0,kN),truncated:!0}}var kN,RN,Zg=C(()=>{"use strict";$a();Ld();Dd();on();Pt();Nt();Tt();Xd();Qn();qd();we();he();Tn();Jd();gN();wN();Yu();Ll();Zu();Yg();Td();kN=256*1024,RN=3e4});import*as DN from"node:readline";var Dr,nf=C(()=>{"use strict";he();Dr=class{io;override;rl;queue=[];waiters=[];ended=!1;constructor(e,n){this.io=e,this.override=n}get interactive(){return!
|
|
1971
|
+
`),null}}function po(t,e,n,r,s){t!==null||e===null||B({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:r,message_preview:tf(n)})}function Ol(t){return t.length<=kN?{text:t,truncated:!1}:{text:t.slice(0,kN),truncated:!0}}var kN,RN,Zg=C(()=>{"use strict";$a();Ld();Dd();on();Pt();Nt();Tt();Xd();Qn();qd();we();he();Tn();Jd();gN();wN();Yu();Ll();Zu();Yg();Td();kN=256*1024,RN=3e4});import*as DN from"node:readline";var Dr,nf=C(()=>{"use strict";he();Dr=class{io;override;rl;queue=[];waiters=[];ended=!1;constructor(e,n){this.io=e,this.override=n}get interactive(){return!Dn(this.io)&&(this.override!==void 0||(this.io.stdin??process.stdin).isTTY===!0)}async ask(e){if(!this.interactive)throw new Error(`More information is needed: ${e.trim()} Run interactively or use an explicit command with all arguments.`);let n;if(this.override?n=await this.override(e):(this.rl||(this.rl=DN.createInterface({input:this.io.stdin??process.stdin,terminal:!1}),this.rl.on("line",r=>{let s=this.waiters.shift();s?s(r):this.queue.push(r)}),this.rl.on("close",()=>{for(this.ended=!0;this.waiters.length;)this.waiters.shift()(null)})),this.io.stderr.write(e),n=this.queue.length?this.queue.shift():this.ended?null:await new Promise(r=>this.waiters.push(r))),n===null)throw new Error("Input ended; no further action taken.");return n.trim()}async confirm(e){let n=await this.ask(`${e} [y/N]: `);return/^(y|yes)$/i.test(n)}async choose(e,n,r=!1){if(n.length===1&&!r)return n[0];if(!n.length)throw new Error(`No choices available for ${e}`);for(this.io.stderr.write(`${e}
|
|
1969
1972
|
${n.map((s,o)=>` ${o+1}) ${s}`).join(`
|
|
1970
1973
|
`)}
|
|
1971
1974
|
`);;){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.
|
|
@@ -2004,7 +2007,7 @@ Old catalog-known ids are omitted unless --old is used. Claude catalog ids are u
|
|
|
2004
2007
|
`))}return s}var se,yo=C(()=>{se=class t extends Error{line;column;codeblock;constructor(e,n){let[r,s]=oV(n.toml,n.ptr),o=iV(n.toml,r,s);super(`Invalid TOML document: ${e}
|
|
2005
2008
|
|
|
2006
2009
|
${o}`,n),this.line=r,this.column=s,this.codeblock=o}static x(e,n,r){throw new t(e,{toml:n.s,ptr:r??n.p})}}});function pf(t){let e=t.p,n=t.s.charCodeAt(t.p++),r=n,s=n===39,o=n===t.s.charCodeAt(t.p)&&n===t.s.charCodeAt(t.p+1);o&&((n=t.s.charCodeAt(t.p+=2))===10?t.p++:n===13&&t.s.charCodeAt(t.p+1)===10&&(t.p+=2));let i="",a=t.p,l=0;for(;t.p<t.s.length;t.p++)if(n=t.s.charCodeAt(t.p),o&&(n===10||n===13&&t.s.charCodeAt(t.p+1)===10))l=l&&3;else if(n<32&&n!==9||n===127)se.x("control characters are not allowed in strings",t);else if((!l||l===3)&&n===r&&(!o||t.s.charCodeAt(t.p+1)===r&&t.s.charCodeAt(t.p+2)===r)){if(o&&(t.s.charCodeAt(t.p+3)===r&&t.p++,t.s.charCodeAt(t.p+3)===r&&t.p++),!l){let c=t.s.slice(a,t.p);i=i?i+c:c}return t.p+=o?3:1,i}else if(!l)!s&&n===92&&(i+=t.s.slice(a,a=t.p),l=1);else if(l===1)if(n===120||n===117||n===85){let c=t.p++-1,d=0,u=n===120?2:n===117?4:8;for(let f=0;f<u;f++,t.p++){let m=t.s.charCodeAt(t.p),p=m>=48&&m<=57?m-48:m>=65&&m<=70?m-65+10:m>=97&&m<=102?m-97+10:-1;p<0&&se.x("invalid non-hex character in unicode escape",t),d=d<<4|p}(d<0||d>1114111||d>=55296&&d<=57343)&&se.x("invalid unicode escape",t,c),i+=String.fromCodePoint(d),a=t.p--,l=0}else o&&(n===32||n===9)?l=2:(n===98?i+="\b":n===116?i+=" ":n===110?i+=`
|
|
2007
|
-
`:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":se.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&se.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);se.x("unfinished string",t,e)}var py=C(()=>{yo();});var aV,Pl,hy=C(()=>{aV=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,Pl=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,o=!0,i="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(i=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(i=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,o=n!==3}else{let l=e.match(aV);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),o=!!l[2],o&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(i=l[3]||null,!i&&o&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=o,this.#e=i)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function ln(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function gy(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function Fl(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||se.x("document contains excessively nested structures. aborting.",t);let s=r===91?ax(t):ix(t);return t.d++,s}return r===34||r===39?pf(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&se.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&se.x("invalid value",t,n),t.p++,!1):r===43||r===45?hf(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?lV(t,r,e):t.s.charCodeAt(t.p+2)===58?cV(t,r,e):hf(t,t.p,r,0,e)}function hf(t,e,n,r,s){let o=n,i=0,a=!1;if(o===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&se.x("invalid value",t,e),t.p++,(r||1)/0;if(o===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&se.x("invalid value",t,e),t.p++,NaN;if(o===48){if(++t.p>=t.s.length||gy(o=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(o===120)return _y(t,e,16,s);if(o===98)return _y(t,e,2,s);if(o===111)return _y(t,e,8,s)}o===46?i=2:o===101||o===69?i=4:se.x("illegal leading zero",t,e)}else ln(o)||se.x("invalid value",t,e);for(;++t.p<t.s.length&&(o=t.s.charCodeAt(t.p),!gy(o,s));)i||(i=1),o===95?(i&1||se.x("illegal underscore",t),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(ln(o)?i>9?i-=11:i&1||i++:se.x("illegal character in numeric literal",t));if(!i){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}i&1||se.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),i>1?parseFloat(l):ox(t,l,10,e)}function _y(t,e,n,r){let s,o=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!gy(s,r));)s===95?(o&1&&se.x("illegal underscore",t),o=3):ln(s,n)?o&1&&o--:se.x("illegal character in numeric literal",t);o&1&&se.x("unfinished numeric value",t);let i=t.s.slice(e+2,t.p);return o&&(i=i.replaceAll("_","")),ox(t,i,n,e)}function ox(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;se.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function lV(t,e,n){let r=t.p++,s;if(!ln(e)||!ln(t.s.charCodeAt(t.p++))||!ln(t.s.charCodeAt(t.p++))||!ln(t.s.charCodeAt(t.p++)))return hf(t,t.p=r,e,0,n);if(t.p+=5,ln(t.s.charCodeAt(t.p++))||se.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!ln(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let i=t.s.slice(r,t.p);return Ul(t,i,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&se.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;ln(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let i=t.s.slice(r,++t.p);return Ul(t,i,1,s,r,"[+00:00]")}if(e===43||e===45){let i=t.s.slice(r,t.p+=6);return Ul(t,i,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let o=t.s.slice(r,t.p);return Ul(t,o,2,s,r)}function cV(t,e,n){let r=t.p;if(!ln(e)||!ln(t.s.charCodeAt(++t.p)))return hf(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;ln(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return Ul(t,s,4,!1,r)}function Ul(t,e,n,r,s,o){if(t.ld){let i=new Pl(e,n,r);return i.isValid()||se.x("invalid date",t,s),i}try{switch(o&&(e+=o),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(i){se.x(i instanceof Error?i.message:""+i,t,s)}}var yy=C(()=>{py();wy();yo();hy();});function dV(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&se.x("control characters are not allowed in comments",t)}}function Wn(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;dV(t)}}var Ey=C(()=>{yo();});function _f(t,e=61){let n,r=0,s=[],o,i=t.s.charCodeAt(n=t.p);do{if(i===e)return r||se.x("unexpected end of key",t),r===1&&s.push(t.s.slice(o,t.p)),t.p++,s;i===46?(r||se.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(o,t.p)),r=0):!r&&(i===34||i===39)?(i===t.s.charCodeAt(t.p+1)&&i===t.s.charCodeAt(t.p+2)&&se.x("illegal quoted key: multiline strings are not allowed",t),s.push(pf(t)),r=2,t.p--):i===32||i===9?r===1&&(s.push(t.s.slice(o,t.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?se.x("illegal character in key",t):r||(r=1,o=t.p)}while(i=t.s.charCodeAt(++t.p));se.x("incomplete key-value: cannot find end of key",t,n)}function ix(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(Wn(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let o,i=n,a=!1,l=t.p,c=_f(t);for(let u=0;u<c.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=c[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&se.x("trying to redefine an already defined value",t,l);let f=o==="__proto__";if(t.uk&&(f||o==="constructor")){i=t.uk!==1&&se.x("document contains an unsafe property",t,l);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&se.x("trying to redefine an already defined value",t,l),Wn(t,!0,!0);let d=Fl(t,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Wn(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&se.x("expected comma or end of structure",t,t.p-1)}se.x("unfinished table",t,e)}function ax(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(Wn(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(Fl(t,93)),Wn(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&se.x("expected comma or end of structure",t,t.p-1)}se.x("unfinished array",t,e)}var wy=C(()=>{py();yy();Ey();yo();});function lx(t,e,n,r,s){let o=n,i=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(o=l?o[a]:o[a]=Object.create(null),i=(c=i[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=e[d],(l=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=i[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)o=l?o[a]:o[a]=Object.create(null);else if(s===0&&l)return null;return[a,o,c.c]}function cx(t,e,n){(e===null||t.uk===2)&&se.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function xi(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,Wn(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;o=n.p+=+c,i=!1;let d=_f(n,93);c&&(t.charCodeAt(n.p)!==93&&se.x("expected end of table array declaration",n),n.p++);let u=lx(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(cx(n,u,o),i=!0)}else{o=n.p;let c=_f(n),d=lx(n,c,a,l,0);!d&&!i&&cx(n,d,o),Wn(n,!0,!0);let u=Fl(n,void 0);d&&!i&&(d[1][d[0]]=u)}Wn(n,!0),n.p<t.length&&(o=t.charCodeAt(n.p))!==10&&(o!==13||t.charCodeAt(n.p+1)!==10)&&se.x("each key-value declaration must be followed by an end-of-line",n),Wn(n)}return r}var dx=C(()=>{wy();yy();Ey();yo();});var Ode,ux=C(()=>{Ode=!!"".isWellFormed});var Ty=C(()=>{dx();ux();hy();yo();});import{readFileSync as uV}from"node:fs";import{homedir as fV}from"node:os";import{join as fx,resolve as mV}from"node:path";function bn(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?mV(e):fx(n||fx(t.HOME||fV(),".lmctl"),"init.toml")}function pV(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function ar(t,e="<init.toml>"){let{document:n}=mx(t,e),r={};for(let o of wo){let i=n[o];if(i===void 0)continue;if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new vt(e,"schema","["+o+"] must be a table with provider and model1");let a={};for(let l of jl){let c=i[l];if(typeof c!="string"||!c.trim())throw new vt(e,"schema",o+"."+l+" must be a nonempty string");a[l]=c}r[o]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let o=wo.find(i=>!r[i]);if(o)throw new vt(e,"schema","["+o+"] is not in "+e+"; this needs the example slots ["+wo.join("], [")+"] -- add ["+o+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function mx(t,e="<init.toml>"){let n;try{n=xi(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new vt(e,"syntax",s.message,s.line??1,(s.column??1)+(t.startsWith("\uFEFF")&&s.line===1?1:0))}return{raw:t,document:n,path:e}}function hV(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(uV(t))}catch(n){let r=n;throw new vt(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function Wl(t=bn()){return ar(hV(t),t)}var wo,jl,vt,gf=C(()=>{"use strict";Ty();wo=["Provider1","Provider2","Provider3"],jl=["provider","model1"];vt=class extends Error{path;kind;line;column;detail;constructor(e,n,r,s=1,o=1){let i=pV(e,n,r,s,o);super(n==="missing"?i+". Run lmctl init first.":i+". Fix the file or run lmctl init."),this.path=e,this.kind=n,this.line=s,this.column=o,this.detail=i}}});function _V(t){let e=[],n=0;for(;n<t.length;){let r=t[n];if(r==="\r"||r===`
|
|
2010
|
+
`:n===102?i+="\f":n===114?i+="\r":n===101?i+="\x1B":n===34?i+='"':n===92?i+="\\":se.x("unrecognised escape sequence",t),a=t.p+1,l=0);else n!==32&&n!==9&&(l===2&&se.x("invalid escape: only line-ending whitespace may be escaped",t,a),l=!s&&n===92?1:0,a=t.p);se.x("unfinished string",t,e)}var py=C(()=>{yo();});var aV,Pl,hy=C(()=>{aV=/^(\d{4}-\d{2}-\d{2})?[Tt ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|z|[-+]\d{2}:\d{2})?$/i,Pl=class t extends Date{#t=!1;#n=!1;#e=null;constructor(e,n,r){let s=!0,o=!0,i="Z",a;if(typeof e=="string")if(n)e:{if(n<3){if(+e.slice(11,13)>23){e="";break e}n===2?(i=null,e+="Z"):(a=e.charCodeAt(e.length-1))!==90&&a!==122&&(i=e.slice(e.length-6)),r&&(e=e.slice(0,10)+"T"+e.slice(11))}else n===4&&(e=+e.slice(0,2)>23?"":`0000-01-01T${e}Z`);s=n!==4,o=n!==3}else{let l=e.match(aV);l?(l[1]||(s=!1,e=`0000-01-01T${e}`),o=!!l[2],o&&e[10]===" "&&(e=e.replace(" ","T")),l[2]&&+l[2]>23?e="":(i=l[3]||null,!i&&o&&(e+="Z"))):e=""}super(e),isNaN(this.getTime())||(this.#t=s,this.#n=o,this.#e=i)}isDateTime(){return this.#t&&this.#n}isLocal(){return!this.#t||!this.#n||!this.#e}isDate(){return this.#t&&!this.#n}isTime(){return this.#n&&!this.#t}isValid(){return this.#t||this.#n}toISOString(){let e=super.toISOString();if(this.isDate())return e.slice(0,10);if(this.isTime())return e.slice(11,23);if(this.#e===null)return e.slice(0,-1);if(this.#e==="Z"||this.#e==="z")return e;let n=+this.#e.slice(1,3)*60+ +this.#e.slice(4,6);return n=this.#e[0]==="-"?n:-n,new Date(this.getTime()-n*6e4).toISOString().slice(0,-1)+this.#e}static wrapAsOffsetDateTime(e,n="Z"){let r=new t(e);return r.#e=n,r}static wrapAsLocalDateTime(e){let n=new t(e);return n.#e=null,n}static wrapAsLocalDate(e){let n=new t(e);return n.#n=!1,n.#e=null,n}static wrapAsLocalTime(e){let n=new t(e);return n.#t=!1,n.#e=null,n}}});function ln(t,e=10){return e===16?t>47&&t<58||t>64&&t<71||t>96&&t<103:t>47&&t<48+e}function gy(t,e){return t===32||t===9||t===10||t===13||e&&(t===e||t===44)||t===35}function Fl(t,e){let n=t.p,r=t.s.charCodeAt(t.p);if(r===91||r===123){t.d--||se.x("document contains excessively nested structures. aborting.",t);let s=r===91?ax(t):ix(t);return t.d++,s}return r===34||r===39?pf(t):r===116?((t.s.charCodeAt(++t.p)!==114||t.s.charCodeAt(++t.p)!==117||t.s.charCodeAt(++t.p)!==101)&&se.x("invalid value",t,n),t.p++,!0):r===102?((t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==108||t.s.charCodeAt(++t.p)!==115||t.s.charCodeAt(++t.p)!==101)&&se.x("invalid value",t,n),t.p++,!1):r===43||r===45?hf(t,t.p,t.s.charCodeAt(++t.p),44-r,e):t.s.charCodeAt(t.p+4)===45&&t.s.charCodeAt(t.p+7)===45?lV(t,r,e):t.s.charCodeAt(t.p+2)===58?cV(t,r,e):hf(t,t.p,r,0,e)}function hf(t,e,n,r,s){let o=n,i=0,a=!1;if(o===105)return(t.s.charCodeAt(++t.p)!==110||t.s.charCodeAt(++t.p)!==102)&&se.x("invalid value",t,e),t.p++,(r||1)/0;if(o===110)return(t.s.charCodeAt(++t.p)!==97||t.s.charCodeAt(++t.p)!==110)&&se.x("invalid value",t,e),t.p++,NaN;if(o===48){if(++t.p>=t.s.length||gy(o=t.s.charCodeAt(t.p),s))return t.bi===!0?0n:0;if(!r){if(o===120)return _y(t,e,16,s);if(o===98)return _y(t,e,2,s);if(o===111)return _y(t,e,8,s)}o===46?i=2:o===101||o===69?i=4:se.x("illegal leading zero",t,e)}else ln(o)||se.x("invalid value",t,e);for(;++t.p<t.s.length&&(o=t.s.charCodeAt(t.p),!gy(o,s));)i||(i=1),o===95?(i&1||se.x("illegal underscore",t),i+=11,a=!0):i===1&&o===46?i=2:(i===1||i===3)&&(o===101||o===69)?i=4:i===4&&(o===43||o===45)||(ln(o)?i>9?i-=11:i&1||i++:se.x("illegal character in numeric literal",t));if(!i){let c=(n-48)*(r||1);return t.bi===!0?BigInt(c):c}i&1||se.x("unfinished numeric value",t,e);let l=t.s.slice(e,t.p);return a&&(l=l.replaceAll("_","")),i>1?parseFloat(l):ox(t,l,10,e)}function _y(t,e,n,r){let s,o=1;for(;++t.p<t.s.length&&(s=t.s.charCodeAt(t.p),!gy(s,r));)s===95?(o&1&&se.x("illegal underscore",t),o=3):ln(s,n)?o&1&&o--:se.x("illegal character in numeric literal",t);o&1&&se.x("unfinished numeric value",t);let i=t.s.slice(e+2,t.p);return o&&(i=i.replaceAll("_","")),ox(t,i,n,e)}function ox(t,e,n,r){if(t.bi!==!0)e:{let s=parseInt(e,n);if(!Number.isSafeInteger(s)){if(t.bi)break e;se.x("integer value cannot be represented losslessly",t,r)}return s}return BigInt(n===10?e:(n===2?"0b":n===8?"0o":"0x")+e)}function lV(t,e,n){let r=t.p++,s;if(!ln(e)||!ln(t.s.charCodeAt(t.p++))||!ln(t.s.charCodeAt(t.p++))||!ln(t.s.charCodeAt(t.p++)))return hf(t,t.p=r,e,0,n);if(t.p+=5,ln(t.s.charCodeAt(t.p++))||se.x("invalid date-time: date part is malformed",t,r),t.p>=t.s.length||((e=t.s.charCodeAt(t.p))!==32||(s=!0,!ln(t.s.charCodeAt(t.p+1))))&&e!==84&&e!==116){let i=t.s.slice(r,t.p);return Ul(t,i,3,!1,r)}if(t.s.charCodeAt(t.p+=3)!==58&&se.x("invalid date-time: time part is malformed",t,r),t.s.charCodeAt(t.p+=3)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;ln(t.s.charCodeAt(++t.p)););if(e=t.s.charCodeAt(t.p)){if(e===90||e===122){let i=t.s.slice(r,++t.p);return Ul(t,i,1,s,r,"[+00:00]")}if(e===43||e===45){let i=t.s.slice(r,t.p+=6);return Ul(t,i,1,s,r,!t.ld&&"["+t.s.slice(t.p-6,t.p)+"]")}}let o=t.s.slice(r,t.p);return Ul(t,o,2,s,r)}function cV(t,e,n){let r=t.p;if(!ln(e)||!ln(t.s.charCodeAt(++t.p)))return hf(t,--t.p,e,0,n);if(t.s.charCodeAt(t.p+=4)===58&&(t.p+=3),t.s.charCodeAt(t.p)===46)for(;ln(t.s.charCodeAt(++t.p)););let s=t.s.slice(r,t.p);return Ul(t,s,4,!1,r)}function Ul(t,e,n,r,s,o){if(t.ld){let i=new Pl(e,n,r);return i.isValid()||se.x("invalid date",t,s),i}try{switch(o&&(e+=o),n){case 1:return Temporal.ZonedDateTime.from(e);case 2:return Temporal.PlainDateTime.from(e);case 3:return Temporal.PlainDate.from(e);case 4:return Temporal.PlainTime.from(e)}}catch(i){se.x(i instanceof Error?i.message:""+i,t,s)}}var yy=C(()=>{py();wy();yo();hy();});function dV(t){for(;t.p<t.s.length;t.p++){let e=t.s.charCodeAt(t.p);if(e===10)break;if(e===13&&t.s.charCodeAt(t.p+1)===10){t.p++;break}(e<32&&e!==9||e===127)&&se.x("control characters are not allowed in comments",t)}}function Wn(t,e,n){let r;for(;t.p<t.s.length;){for(;t.p<t.s.length&&((r=t.s.charCodeAt(t.p))===32||r===9||!e&&(r===10||r===13&&t.s.charCodeAt(t.p+1)===10));)t.p++;if(n||r!==35)break;dV(t)}}var Ey=C(()=>{yo();});function _f(t,e=61){let n,r=0,s=[],o,i=t.s.charCodeAt(n=t.p);do{if(i===e)return r||se.x("unexpected end of key",t),r===1&&s.push(t.s.slice(o,t.p)),t.p++,s;i===46?(r||se.x("illegal empty bare key",t),r===1&&s.push(t.s.slice(o,t.p)),r=0):!r&&(i===34||i===39)?(i===t.s.charCodeAt(t.p+1)&&i===t.s.charCodeAt(t.p+2)&&se.x("illegal quoted key: multiline strings are not allowed",t),s.push(pf(t)),r=2,t.p--):i===32||i===9?r===1&&(s.push(t.s.slice(o,t.p)),r=2):r===2||i<48&&i!==45||i>57&&i<65||i>90&&i<97&&i!==95||i>122?se.x("illegal character in key",t):r||(r=1,o=t.p)}while(i=t.s.charCodeAt(++t.p));se.x("incomplete key-value: cannot find end of key",t,n)}function ix(t){let e=t.p++,n=Object.create(null),r=new Set,s;for(;t.p<t.s.length;){if(Wn(t),(s=t.s.charCodeAt(t.p))===125)return t.p++,n;let o,i=n,a=!1,l=t.p,c=_f(t);for(let u=0;u<c.length;u++){u&&(i=a?i[o]:i[o]=Object.create(null)),o=c[u],(a=Object.hasOwn(i,o))&&(typeof i[o]!="object"||r.has(i[o]))&&se.x("trying to redefine an already defined value",t,l);let f=o==="__proto__";if(t.uk&&(f||o==="constructor")){i=t.uk!==1&&se.x("document contains an unsafe property",t,l);break}!a&&f&&Object.defineProperty(i,o,{enumerable:!0,configurable:!0,writable:!0})}a&&se.x("trying to redefine an already defined value",t,l),Wn(t,!0,!0);let d=Fl(t,125);if(i&&typeof(i[o]=d)=="object"&&r.add(d),Wn(t),(s=t.s.charCodeAt(t.p++))===125)return n;s!==44&&se.x("expected comma or end of structure",t,t.p-1)}se.x("unfinished table",t,e)}function ax(t){let e=t.p++,n=[],r;for(;t.p<t.s.length;){if(Wn(t),(r=t.s.charCodeAt(t.p))===93)return t.p++,n;if(n.push(Fl(t,93)),Wn(t),(r=t.s.charCodeAt(t.p++))===93)return n;r!==44&&se.x("expected comma or end of structure",t,t.p-1)}se.x("unfinished array",t,e)}var wy=C(()=>{py();yy();Ey();yo();});function lx(t,e,n,r,s){let o=n,i=r,a,l=!1,c;for(let d=0;d<e.length;d++){if(d){if(o=l?o[a]:o[a]=Object.create(null),i=(c=i[a]).c,s===0&&(c.t===1||c.t===2))return null;if(c.t===2){let u=o.length-1;o=o[u],i=i[u].c}}if(a=e[d],(l=Object.hasOwn(o,a))&&i[a]?.t===0&&i[a]?.d)return null;if(!l){let u=a==="__proto__";if(t.uk&&(u||a==="constructor"))return!1;u&&(Object.defineProperty(o,a,{enumerable:!0,configurable:!0,writable:!0}),Object.defineProperty(i,a,{enumerable:!0,configurable:!0,writable:!0})),i[a]={t:d<e.length-1&&s===2?3:s,d:!1,i:0,c:Object.create(null)}}}if(c=i[a],c.t!==s&&!(s===1&&c.t===3)||(s===2&&(c.d||(c.d=!0,o[a]=[]),o[a].push(o=Object.create(null)),c.c[c.i++]=c={t:1,d:!1,i:0,c:Object.create(null)}),c.d))return null;if(c.d=!0,s===1)o=l?o[a]:o[a]=Object.create(null);else if(s===0&&l)return null;return[a,o,c.c]}function cx(t,e,n){(e===null||t.uk===2)&&se.x(e===null?"trying to redefine an already defined table or value":"document contains an unsafe property",t,n)}function xi(t,e={}){let n={s:t,p:0,d:e.maxDepth??1e3,bi:e.integersAsBigInt??!1,ld:e.useLegacyDate??!0,uk:e.unsafeKeyBehaviour==="throw"?2:e.unsafeKeyBehaviour==="drop"?1:0},r=Object.create(null),s=Object.create(null),o,i=!1,a=r,l=s;for(t.charCodeAt(0)===65279&&n.p++,Wn(n);n.p<t.length;){if(t.charCodeAt(n.p)===91){let c=t.charCodeAt(++n.p)===91;o=n.p+=+c,i=!1;let d=_f(n,93);c&&(t.charCodeAt(n.p)!==93&&se.x("expected end of table array declaration",n),n.p++);let u=lx(n,d,r,s,c?2:1);u?(l=u[2],a=u[1]):(cx(n,u,o),i=!0)}else{o=n.p;let c=_f(n),d=lx(n,c,a,l,0);!d&&!i&&cx(n,d,o),Wn(n,!0,!0);let u=Fl(n,void 0);d&&!i&&(d[1][d[0]]=u)}Wn(n,!0),n.p<t.length&&(o=t.charCodeAt(n.p))!==10&&(o!==13||t.charCodeAt(n.p+1)!==10)&&se.x("each key-value declaration must be followed by an end-of-line",n),Wn(n)}return r}var dx=C(()=>{wy();yy();Ey();yo();});var Ode,ux=C(()=>{Ode=!!"".isWellFormed});var Ty=C(()=>{dx();ux();hy();yo();});import{readFileSync as uV}from"node:fs";import{homedir as fV}from"node:os";import{join as fx,resolve as mV}from"node:path";function In(t=process.env,e){let n=t.LMCTL_HOME||(t.HOME===void 0?process.env.LMCTL_HOME:void 0);return e!==void 0?mV(e):fx(n||fx(t.HOME||fV(),".lmctl"),"init.toml")}function pV(t,e,n,r,s){return e==="missing"?"Missing "+t:e==="read"?"Cannot read "+t+": "+n:"Invalid "+t+":"+r+":"+s+": "+n}function ar(t,e="<init.toml>"){let{document:n}=mx(t,e),r={};for(let o of wo){let i=n[o];if(i===void 0)continue;if(!i||typeof i!="object"||Array.isArray(i)||i instanceof Date)throw new vt(e,"schema","["+o+"] must be a table with provider and model1");let a={};for(let l of jl){let c=i[l];if(typeof c!="string"||!c.trim())throw new vt(e,"schema",o+"."+l+" must be a nonempty string");a[l]=c}r[o]=a}let s={raw:t,document:n,path:e,slots:r};return Object.defineProperty(s,"config",{enumerable:!1,get(){let o=wo.find(i=>!r[i]);if(o)throw new vt(e,"schema","["+o+"] is not in "+e+"; this needs the example slots ["+wo.join("], [")+"] -- add ["+o+"] with provider and model1");return{provider1:r.Provider1,provider2:r.Provider2,provider3:r.Provider3}}}),s}function mx(t,e="<init.toml>"){let n;try{n=xi(t.startsWith("\uFEFF")?t.slice(1):t,{integersAsBigInt:"asNeeded",useLegacyDate:!0})}catch(r){let s=r;throw new vt(e,"syntax",s.message,s.line??1,(s.column??1)+(t.startsWith("\uFEFF")&&s.line===1?1:0))}return{raw:t,document:n,path:e}}function hV(t){let e;try{e=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(uV(t))}catch(n){let r=n;throw new vt(t,r.code==="ENOENT"?"missing":"read",r.message)}return e}function Wl(t=In()){return ar(hV(t),t)}var wo,jl,vt,gf=C(()=>{"use strict";Ty();wo=["Provider1","Provider2","Provider3"],jl=["provider","model1"];vt=class extends Error{path;kind;line;column;detail;constructor(e,n,r,s=1,o=1){let i=pV(e,n,r,s,o);super(n==="missing"?i+". Run lmctl init first.":i+". Fix the file or run lmctl init."),this.path=e,this.kind=n,this.line=s,this.column=o,this.detail=i}}});function _V(t){let e=[],n=0;for(;n<t.length;){let r=t[n];if(r==="\r"||r===`
|
|
2008
2011
|
`){let o=n;n+=r==="\r"&&t[n+1]===`
|
|
2009
2012
|
`?2:1,e.push({start:o,end:n,text:`
|
|
2010
2013
|
`,kind:"newline"});continue}if(/\s/.test(r)){n++;continue}if(r==="#"){for(;n<t.length&&t[n]!=="\r"&&t[n]!==`
|
|
@@ -2032,7 +2035,7 @@ ${e("Provider1",t.provider1)}
|
|
|
2032
2035
|
${e("Provider2",t.provider2)}
|
|
2033
2036
|
|
|
2034
2037
|
${e("Provider3",t.provider3)}
|
|
2035
|
-
`}function Ci(t){try{return Wl(
|
|
2038
|
+
`}function Ci(t){try{return Wl(In(process.env,t)).config}catch(e){if(e instanceof vt&&e.kind==="missing")return null;throw e}}function Sx(t,e){return hx(t,e)}function bx(t,e,n={}){let r={...rx(e)},s=n.properties??Object.fromEntries([1,2,3].map(o=>{let i=e["provider"+o];return["Provider"+o,{Provider:i.provider,Model1:i.model1}]}));return tx(t,o=>{if(o.kind==="variable")return Object.hasOwn(r,o.name)?r[o.name]:void 0;if(o.kind==="argument")return n.argv?.[o.index];let i=o.key.split(".");/^Provider[123]$/.test(i[0])&&i.length===2&&["provider","model1"].includes(i[1])&&(i[1]=i[1][0].toUpperCase()+i[1].slice(1));let a=s;for(let d of i){if(!a||typeof a!="object"||!Object.hasOwn(a,d))throw Error("Property '"+o.key+"' is not defined in "+(n.path??"~/.lmctl/init.toml")+"; define it there or run lmctl init");a=a[d]}let l=new Set,c=(d,u)=>{if(d instanceof Date)return d.toISOString();if(d===null||typeof d=="string"||typeof d=="boolean"||typeof d=="number"&&Number.isFinite(d))return d;if(d&&typeof d=="object"&&(Array.isArray(d)||[Object.prototype,null].includes(Object.getPrototypeOf(d)))){if(l.has(d))throw Error("Property '"+u+"' contains a cycle in "+(n.path??"~/.lmctl/init.toml"));l.add(d);try{if(Array.isArray(d))return d.map((m,p)=>c(m,u+"."+p));let f=Object.create(null);for(let[m,p]of Object.entries(d))f[m]=c(p,u+"."+m);return f}finally{l.delete(d)}}throw Error("Property '"+u+"' has an unsupported value type: "+typeof d+" in "+(n.path??"~/.lmctl/init.toml"))};return c(a,o.key)})}var Li,Eo=C(()=>{"use strict";nx();sx();gf();gf();_x();Ni();gn();Hl();Li=["claude","codex","agy","kimi"]});import{homedir as bV}from"node:os";function Ix(t,e){let n=new Set;return{text:t.replace(kV,(s,o)=>{let i=o.trim(),a=IV[i];return a===void 0?(n.add(i),s):a(e)}),unknownNames:[...n].sort()}}function kx(t){return{workdir:t.workdir,teamfile:t.teamfile,date:AV(t.date)}}function AV(t){return t.toISOString().slice(0,10)}var IV,kV,Ax=C(()=>{"use strict";Tt();IV={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>Ya(t.teamfile),home:()=>bV(),date:t=>t.date},kV=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Ly={};ge(Ly,{_setAgyModelsRunnerForTests:()=>DV,_setCatalogSnapshotForTests:()=>OV,_setCodexModelsRunnerForTests:()=>MV,_setLintOpenCodeConfigProbeForTests:()=>UV,_setLintSessiondirFsOpsForTests:()=>PV,_setTeamfileSeedForTests:()=>$V,buildRootTeamRegistrationRow:()=>Fx,lintTeamfileStructured:()=>VV,registerRootTeam:()=>Ef,runLint:()=>As,runSeed:()=>ql,seedTeamfile:()=>Di,sha256Text:()=>Ux,validateMemberSpec:()=>cn});import{createHash as NV}from"node:crypto";import{accessSync as xV,constants as Nx,existsSync as RV,readFileSync as Iy,realpathSync as ky,statSync as LV,writeFileSync as xx}from"node:fs";import{dirname as vo,resolve as Lx}from"node:path";function OV(t){Xl=t??void 0}function Mx(t){return BN(t,Xl!==void 0?{snapshot:Xl}:{})}function $x(t){return XN(t,Xl!==void 0?{snapshot:Xl}:{})}function DV(t){xy=t??void 0}function MV(t){Ry=t??void 0}function $V(t){Ox=t===null,Cx=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(Or(),Pg)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings,usage:ir(r)}:{error:r.error??"provider seed failed",errorCode:r.errorCode,usage:ir(r),sessionId:r.sessionId}})}function PV(t){To=t===null?Ay:{...Ay,...t}}function UV(t){Dx=t??ml}async function FV(t,e,n){let r=t.filter(o=>o.teamfile===void 0&&o.provider.trim().toLowerCase()==="opencode"&&o.model!==void 0&&o.model.length>0);return(await Promise.all(r.map(async o=>({member:o,result:await Dx({cwd:o.sessiondir??e,model:o.model,...o.effort!==void 0?{effort:o.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:o,result:i})=>i.status==="rejected"?[`[${o.alias}] ${i.option}="${i.value}" rejected by opencode: ${i.error}`]:[])}function jV(t,e){let n=vo(e),r=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??n,a=Lx(i);if(r.has(a))continue;let l=WV(a);l!==void 0&&(r.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function WV(t){try{if(To.existsSync(t)){if(!To.statSync(t).isDirectory())return"ENOTDIR";To.accessSync(t,Nx.W_OK);return}let e=BV(t);if(e===void 0)return;if(!To.statSync(e).isDirectory())return"ENOTDIR";To.accessSync(e,Nx.W_OK);return}catch(e){return XV(e)??"permission check failed"}}function HV(t){let e=Lx(t);try{return ky(e)}catch{return e}}function BV(t){let e=t;for(;;){try{if(To.existsSync(e))return e}catch{return}let n=vo(e);if(n===e)return;e=n}}function XV(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function Px(t,e){let n;try{n=await q(e,l=>Qe(t,l))}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let r;try{r=Fe(n)}catch(l){return{ok:!1,message:`${t}: ${l instanceof Error?l.message:String(l)}`}}let s=Qa(r,vo(n));e.stderr.write(`notice: checking teamfile and models ...
|
|
2036
2039
|
`);let o=ay(r.members,{agyModelsRunner:xy,codexModelsRunner:Ry});o.push(...await Mx(r.members)),s.push(...await $x(r.members));let i=Iy(n,"utf8"),a=Ix(i,kx({workdir:vo(n),teamfile:n,date:new Date})).unknownNames;a.length>0&&o.push(`unknown template placeholder${a.length===1?"":"s"}: ${a.map(l=>`{{${l}}}`).join(", ")}`),o.push(...a_(r.members,vo(n))),o.push(...jV(r.members,n)),o.push(...await FV(r.members,vo(n),e.env));for(let l of s)e.stderr.write(`error: ${l.field}: ${l.message}
|
|
2037
2040
|
`);for(let l of r.members)Ny([l],e),l.session!==void 0&&l.session.length<Oi&&o.push(`${l.alias}: sessionid is shorter than ${Oi} chars; run lmctl seed to refresh it`);return{ok:!0,result:{config:r,absTeamfile:n,errors:s,warnings:o}}}async function As(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(CV),0;let n=de(t,[],[]);if(n.error!==void 0)return e.stderr.write(`error: ${n.error}
|
|
2038
2041
|
`),2;if(n.positionals.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
@@ -2202,7 +2205,7 @@ ${Gx}
|
|
|
2202
2205
|
`);a<0||(e.stdout.write(n.slice(0,a+1).startsWith("Usage: lmscript ")?"Usage: "+tR.slice(7)+`
|
|
2203
2206
|
`:n.slice(0,a+1)),e.stdout.write(n.slice(a+1)),n="",r=!1)}}});return n&&e.stdout.write(n),o}return Kl(t,e)}var tR,Gy=C(()=>{"use strict";qy();he();tR="usage: lmctl script [--check|--dry-run|--lint] [--no-preflight] [--dry-loop-limit N] [--dryrun-timeout MS] [--plan-format text|json] [--resumepoint PATH] [--pref FILE] [--module SPEC=FILE]... <file>|-| -e <code> [args...]"});import{execFileSync as Jy}from"node:child_process";import{dirname as rR,resolve as LK}from"node:path";function sR(t){return(0,Vy.formatCount)(t)}async function Ky(t,e){return q(t,n=>{let r=n.query(`SELECT config_warnings FROM tracked_invocation
|
|
2204
2207
|
WHERE target_teamfile = ? AND target_alias = ? AND config_warnings IS NOT NULL
|
|
2205
|
-
ORDER BY started_at DESC LIMIT 1`,e.teamfile,e.alias);if(r.length!==0)try{let s=JSON.parse(r[0].config_warnings);if(!Array.isArray(s))return;let o=s.filter(i=>typeof i=="string"&&i.length>0);return o.length>0?o:void 0}catch{return}})}function zl(t,e,n,r){let s=Qe(t,e);if(n.has(s))return[];n.add(s);let o=Yn(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...zl(LK(rR(s),a.teamfile),e,n,[...r,a.alias]));continue}i.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session!==void 0&&a.session.length>0?a.session:null,model:a.model??null})}return i}async function Yl(t,e){try{let n=await q(t,r=>e.map(s=>{let o=En(r,s.teamfile,s.alias);return[ji(s.teamfile,s.alias),CK(o)]}));return new Map(n)}catch{return new Map}}function ji(t,e){return`${t}\0${e.toLowerCase()}`}function CK(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:Cf(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function Cf(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function Of(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale"})`}return"idle"}function zy(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function
|
|
2208
|
+
ORDER BY started_at DESC LIMIT 1`,e.teamfile,e.alias);if(r.length!==0)try{let s=JSON.parse(r[0].config_warnings);if(!Array.isArray(s))return;let o=s.filter(i=>typeof i=="string"&&i.length>0);return o.length>0?o:void 0}catch{return}})}function zl(t,e,n,r){let s=Qe(t,e);if(n.has(s))return[];n.add(s);let o=Yn(s,e);if(o.parseErrors.length>0)throw new Error(`${s}: ${o.parseErrors.join("; ")}`);let i=[];for(let a of o.members){if(a.teamfile!==void 0){i.push(...zl(LK(rR(s),a.teamfile),e,n,[...r,a.alias]));continue}i.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session!==void 0&&a.session.length>0?a.session:null,model:a.model??null})}return i}async function Yl(t,e){try{let n=await q(t,r=>e.map(s=>{let o=En(r,s.teamfile,s.alias);return[ji(s.teamfile,s.alias),CK(o)]}));return new Map(n)}catch{return new Map}}function ji(t,e){return`${t}\0${e.toLowerCase()}`}function CK(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:Cf(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function Cf(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function Of(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale"})`}return"idle"}function zy(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function kn(t){return t==null?"unknown":(0,Vy.formatCount)(t)}function oR(t){return t==="n/a"?t:kn(t)}function iR(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function Yy(t){let e=rR(t),n;try{Jy("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=Jy("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((o,i)=>({ref:i===0?"HEAD":`HEAD~${i}`,timestamp:new Date(o*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:OK(e)}}function OK(t){let e;try{e=Jy("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function Qy(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function Zy(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var Vy,ew=C(()=>{"use strict";Vy=hn(sn(),1);Tn();he();Qn()});async function aR(t,e){return q(e,n=>{let r=[];for(let s of n.listRootTeams())try{for(let o of Fe(s.teamfile_path).members)!o.teamfile&&o.session===t&&r.push({file:s.teamfile_path,member:o})}catch{}return r})}async function Df(t,e){let n=await _t(e,t).catch(()=>null),r=n?.createdAt?.getTime();return{provider:t,sessiondir:n?.cwd,sessionid:e,model:n?.model??null,running:n?.turnStatus==="in_progress"?"busy":"unregistered",ageMs:r!==void 0&&Number.isFinite(r)?Math.max(0,Date.now()-r):null,context:n?.lastInputTokens??null}}async function tw(t,e,n){let r=await q(e,i=>zl(t,i,new Set,[])),s=n?r.filter(i=>i.alias.toLowerCase()===n.toLowerCase()||i.reportPath.toLowerCase()===n.toLowerCase()):r;if(n&&!s.length)throw new Error(`No member "${n}" in ${t}`);let o=await Yl(e,s);return Promise.all(s.map(async i=>{let a=i.sessionid?await Df(i.provider,i.sessionid):{provider:i.provider,sessionid:null,model:null,running:"not seeded",ageMs:null,context:null};return{...a,file:i.teamfile,alias:i.alias,model:i.model??a.model,running:i.sessionid?a.running==="busy"?"busy":o.get(ji(i.teamfile,i.alias))?.state??"unknown":"not seeded"}}))}function Mf(t,e){let n=t.map(r=>[r.alias??"-",r.provider,r.model??"n/a",r.running,r.ageMs===null?"n/a":(0,Rs.formatDuration)(r.ageMs),r.context===null?"n/a":(0,Rs.formatCount)(r.context),r.sessionid??"-"].map(Rs.escapeCell));e.stdout.write(`${(0,Rs.formatTable)(n,{headers:["ALIAS","PROVIDER","MODEL","RUNNING","AGE","CONTEXT","SESSION"],margin:2})}
|
|
2206
2209
|
`),e.stdout.write(`Context is the last completed turn; unavailable values are n/a.
|
|
2207
2210
|
`)}function lR(t){return t.running==="idle"&&t.ageMs!==null&&t.ageMs>=7*864e5&&t.context!==null&&t.context>=1e5}async function cR(t,e,n,r){return q(r,async s=>{if(En(s,t,e).busy)throw new Error(`${e} is busy; its session was not replaced.`);let o=ls(s,{receiver_teamfile:t,receiver_alias:e,sender_teamfile:t,sender_alias:e,ttlMs:8*60*60*1e3});if(!o.acquired)throw new Error(`${e} is busy; its session was not replaced.`);try{let i=Fe(t).members.find(a=>a.alias.toLowerCase()===e.toLowerCase());if(!i||i.session!==n)throw new Error("Session binding changed; refresh cancelled.");if((await Df(i.provider,n)).running==="busy")throw new Error(`${e} is running; its session was not replaced.`);return await Di(t,{...r,dal:s},{replaceSession:{alias:e,sessionid:n}})}finally{s.releaseAgentInflight(o.lease,o.leaseId)}})}var Rs,dR=C(()=>{"use strict";Tt();Fn();ew();he();Rs=hn(sn(),1);Tn();Pr()});var nw={};ge(nw,{runInferred:()=>PK,runInferredBatch:()=>yR,sendInferredPrompt:()=>Wi});import{existsSync as fR,mkdtempSync as mR,readFileSync as DK,rmSync as pR,writeFileSync as hR}from"node:fs";import{tmpdir as _R}from"node:os";import{resolve as $f,join as Pf}from"node:path";async function Wi(t,e,n,r={}){let s=mR(Pf(_R(),"lmctl-intent-prompt-")),o=Pf(s,"prompt.txt");try{return hR(o,`${e}\r
|
|
2208
2211
|
`,{encoding:"utf8",mode:384}),await(r.chat??Wy)([...t,"--prompt-file",o],n)}finally{pR(s,{recursive:!0,force:!0})}}async function uR(t,e,n,r,s){let o=await(s.rows??tw)(t,r,e);Mf(o,r);for(let i of o)if(!(!i.file||!i.alias||!i.sessionid||!lR(i))&&(r.stdout.write(`${i.alias}: old and large (at least 7 days and 100,000 context tokens). A refresh starts a new context; the old transcript remains.
|
|
@@ -2263,14 +2266,14 @@ never takes a batch-level lease -- one plain turn.
|
|
|
2263
2266
|
`))return o}}return null}function cr(t,e){let n=t.env??process.env,r=VR(n);if(!r)return null;let s=JR(n);async function o(i,a,l,c=!0,d={}){let u=await e.fetch(s+a,{method:i,headers:{authorization:`Bearer ${r}`,...l===void 0?{}:{"content-type":"application/json"},...d},...l===void 0?{}:{body:JSON.stringify(l)},...c&&e.signal?{signal:e.signal}:{}}),f=await u.text(),m=null;try{m=f?JSON.parse(f):null}catch{m=null}if(u.status>=400){let p=m?.error;throw new Hn(u.status,typeof p=="string"?p:"request_failed")}return{status:u.status,json:m}}return{call:o,base:s}}function Ne(t){return t instanceof Hn||t instanceof Error?t.message:String(t)}function zR(t){for(let e of t.trim().split(`
|
|
2264
2267
|
`).reverse())try{let n=JSON.parse(e);if(n&&(n.status==="error"||n.status==="failed")&&typeof(n.message??n.error)=="string")return String(n.message??n.error)}catch{}return null}function YR(t,e,n,r,s=nc.outputBytes){return new Promise(o=>{let i=Date.now(),a={out:{chunks:[],bytes:0,kept:0},err:{chunks:[],bytes:0,kept:0}},l=(_,h)=>{if(_.bytes+=h.length,_.kept<s){let g=h.subarray(0,s-_.kept);_.chunks.push(g),_.kept+=g.length}},c=!1,d=!1,u=(_,h,g)=>{d||(d=!0,clearTimeout(p),o({exit_code:_,signal:h,timed_out:c,stdout:Buffer.concat(a.out.chunks).toString(),stderr:Buffer.concat(a.err.chunks).toString(),stdout_bytes:a.out.bytes,stderr_bytes:a.err.bytes,stdout_truncated:a.out.bytes>s,stderr_truncated:a.err.bytes>s,started_at:new Date(i).toISOString(),ended_at:new Date().toISOString(),duration_ms:Date.now()-i,...g?{spawn_error:g}:{}}))},f=HR("bash",["-lc",t],{cwd:e,env:r,detached:!0,stdio:["ignore","pipe","pipe"]}),m=()=>{try{f.pid&&process.kill(-f.pid,"SIGKILL")}catch{}},p=setTimeout(()=>{c=!0,m()},n);f.stdout.on("data",_=>l(a.out,_)),f.stderr.on("data",_=>l(a.err,_)),f.on("error",_=>u(null,null,_.message)),f.on("exit",()=>setTimeout(m,300)),f.on("close",(_,h)=>u(_,h))})}async function uw(t,e){await tc(Ze(t,".."),{recursive:!0,mode:448}),await oz(t,`${JSON.stringify(e)}
|
|
2265
2268
|
`,{mode:384}),await iz(t,384)}function Vf(t){let e=t;if(typeof t=="string")try{let r=JSON.parse(t);e=r?.detail??(typeof r?.error=="string"?r:null)}catch{return null}if(!e||typeof e!="object"||typeof e.error!="string")return null;let n=(r,s)=>s==null||s===""?[]:[`${r}: ${s}`];return[...n("error",e.error),...n("message",e.message),...n("exit code",e.exit_code),...n("signal",e.signal),...e.timed_out?["timed out: yes"]:[],...n("command",e.command),...n("started",e.started_at),...n("ended",e.ended_at),...n("duration",typeof e.duration_ms=="number"?`${e.duration_ms} ms`:null),...n("site",e.site),...n("job",e.job_id),...e.stdout_tail?["--- stdout (tail)",String(e.stdout_tail).replace(/\n$/,"")]:[],...e.stderr_tail?["--- stderr (tail)",String(e.stderr_tail).replace(/\n$/,"")]:[]].join(`
|
|
2266
|
-
`)}function dn(t,e,n,r){let s=n instanceof oc?n.run:null,o={error:e,message:St(Ne(n)).slice(0,4e3),exit_code:s?.exit_code??null,signal:s?.signal??null,timed_out:s?.timed_out??!1,command:s?St(s.command.join(" ")).slice(0,2e3):null,stdout_tail:s?St(Bf(s.stdout_tail)):null,stderr_tail:s?St(Bf(s.stderr_tail)):null,started_at:s?.started_at??null,ended_at:s?.ended_at??new Date(r.now).toISOString(),duration_ms:s?.duration_ms??null,site:r.site,job_id:r.job};return{status:t,headers:{"content-type":"application/json"},body:JSON.stringify({error:e,detail:o})}}function yw(t,e){return t.map(n=>{let r=n.lastIndexOf(":"),s=r>0&&Gf.test(n.slice(r+1))?n.slice(r+1):null;return{teamfile:hw(e,s===null?n:n.slice(0,r)),alias:s}})}function qi(t){let e=t.lastIndexOf(":");if(e<=0)return null;let n=t.slice(e+1);return Gf.test(n)?{teamfile:t.slice(0,e),alias:n}:null}function fw(t,e,n,r=Date.now()){let s=new Map,o=(c,d)=>n||!e.length||e.some(u=>u.teamfile===c&&(u.alias===null||u.alias===d)),i=t??{};if(Array.isArray(i.sessions))for(let c of i.sessions){let d=c??{};if(typeof d.team_path!="string"||!d.team_path.startsWith("/")||typeof d.member!="string"||!Gf.test(d.member))continue;let u=`${d.team_path}:${d.member}`;if(s.has(u))continue;let f=d.busy===!0,m=d.terminal_held===!0,p=typeof d.state=="string"?d.state.slice(0,16):null,_=UR(d.last_activity_at),h=UR(d.started_at),g=!f&&_?Math.max(0,Math.round((r-Date.parse(_))/1e3)):null,w=d.can_prompt===!0&&!f&&!m;s.set(u,{target:u,teamfile:d.team_path,alias:d.member,state:f?"busy":g===null?"unknown":"idle",idle_seconds:g,model:typeof d.model=="string"?d.model.slice(0,128):null,allowed:o(d.team_path,d.member),running_seconds:(f||d.liveness==="dead")&&h?Math.max(0,Math.round((r-Date.parse(h))/1e3)):null,stuck:d.liveness==="dead",last_status:d.liveness==="dead"?null:p==="error"?"error":p==="done"?"done":null,last_error:null,id:typeof d.id=="string"?d.id:`${d.team_path}#${d.member}`,kind:typeof d.kind=="string"?d.kind.slice(0,16):null,run_state:p,liveness:typeof d.liveness=="string"?d.liveness.slice(0,16):null,started_at:h,last_activity_at:_,busy:f,terminal_held:m,can_prompt:w,cannot_prompt_reason:w?null:typeof d.cannot_prompt_reason=="string"?d.cannot_prompt_reason.slice(0,64):f?"busy":m?"terminal-held":"unavailable-target"})}let a=t??{},l=c=>typeof c=="number"&&Number.isFinite(c)&&c>=0?c:null;for(let[c,d]of[["running",a.running],["dead",a.dead],["idle",a.idle]])for(let u of Array.isArray(d)?d:[]){let f=u;if(typeof f.target!="string"||!f.target.startsWith("/"))continue;let m=qi(f.target);if(!m||s.has(f.target))continue;let p=l(f.idle_ms),_=c==="running"?l(f.running_for_ms):c==="dead"?l(f.age_ms):null,h=c==="idle"&&(f.status==="error"||f.status==="aborted");s.set(f.target,{target:f.target,teamfile:m.teamfile,alias:m.alias,state:c==="idle"?p===null?"unknown":"idle":"busy",idle_seconds:c==="idle"&&p!==null?Math.round(p/1e3):null,model:typeof f.model=="string"?f.model:null,allowed:o(m.teamfile,m.alias),running_seconds:_===null?null:Math.round(_/1e3),stuck:c==="dead",last_status:c==="idle"&&typeof f.status=="string"?f.status.slice(0,32):null,last_error:h&&typeof f.error=="string"&&f.error?St(f.error).slice(0,200):null,id:`${m.teamfile}#${m.alias}`,busy:c!=="idle",terminal_held:!1,can_prompt:c==="idle",cannot_prompt_reason:c==="idle"?null:c==="dead"?"unavailable-target":"busy"})}for(let c of e){if(c.alias===null)continue;let d=`${c.teamfile}:${c.alias}`;s.has(d)||s.set(d,{target:d,teamfile:c.teamfile,alias:c.alias,state:"unknown",idle_seconds:null,model:null,allowed:!0,id:`${c.teamfile}#${c.alias}`,busy:!1,terminal_held:!1,can_prompt:!0,cannot_prompt_reason:null})}return[...s.values()].slice(0,XR)}function QR(t){return t.filter(e=>e.allowed).map(e=>({teamfile:Bi(e.teamfile),path:e.teamfile,alias:e.alias,provider:null,state:e.state,idle_seconds:e.state==="idle"?e.idle_seconds:null,...e.running_seconds!=null?{running_seconds:e.running_seconds}:{},...e.stuck?{stuck:!0}:{},...e.last_status?{last_status:e.last_status}:{},...e.last_error?{last_error:e.last_error}:{},...e.id?{id:e.id}:{},...e.model?{model:e.model}:{},...e.kind?{kind:e.kind}:{},...e.run_state?{run_state:e.run_state}:{},...e.liveness?{liveness:e.liveness}:{},...e.started_at?{started_at:e.started_at}:{},...e.last_activity_at?{last_activity_at:e.last_activity_at}:{},busy:e.busy===!0,terminal_held:e.terminal_held===!0,can_prompt:e.can_prompt!==!1,cannot_prompt_reason:e.can_prompt===!1?e.cannot_prompt_reason??"unavailable-target":null,...e.tmux?.panes?.length?{tmux:e.tmux}:{}}))}function ec(t,e,n){let r=t.filter(i=>i.allowed&&i.alias===n),s=r.filter(i=>i.teamfile===e);if(s.length===1)return s[0];if(e.includes("/"))return null;let o=r.filter(i=>Bi(i.teamfile)===e);return o.length===1?o[0]:null}function Wf(t){if(t.can_prompt!==!1&&t.busy!==!0&&t.terminal_held!==!0)return null;let e=t.terminal_held?"terminal-held":t.busy?"busy":t.cannot_prompt_reason??"unavailable-target";return{status:409,body:e==="terminal-held"?"session_terminal_held":e==="busy"?"session_busy":"session_unavailable"}}function ZR(t){let e={};for(let[n,r]of Object.entries(t))/^LMCTL_(APPKEY|SELF_|INVOCATION_ID|LAUNCH_SOURCE)/.test(n)||n==="LMCTL_SITE_API_URL"||n==="CLAUDECODE"||n.startsWith("CLAUDE_CODE_")||(e[n]=r);return e}function St(t,e=[]){let n=t;for(let r of e)r&&r.length>=6&&(n=n.split(r).join("[redacted-session-id]"));return n.replace(/lmk_[A-Za-z0-9_-]{8,}/g,"[redacted-appkey]").replace(/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,"[redacted-token]").replace(/\b(Bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,"$1 [redacted-token]").replace(/\b(?:sk|pk|rk)-[A-Za-z0-9_-]{16,}|\b(?:ghp|gho|ghs|github_pat)_[A-Za-z0-9_]{16,}|\bxox[abprs]-[A-Za-z0-9-]{10,}|\bAKIA[A-Z0-9]{16}\b/g,"[redacted-token]").replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g,"[redacted-private-key]").replace(/\bAIza[0-9A-Za-z_-]{30,}/g,"[redacted-token]").replace(/\b(session_?id|sessionid)(\s*[=:]\s*"?)[A-Za-z0-9._:-]{6,}/gi,"$1$2[redacted-session-id]").replace(/\b((?:aws_)?secret(?:_access)?_?key|api_?key|access_?token|refresh_?token|client_?secret|password|passwd|secret|token)(\s*[=:]\s*["']?)[^\s"',;]{8,}/gi,"$1$2[redacted-secret]").replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,"[redacted-id]").replace(/\b[a-f0-9]{40,}\b/gi,"[redacted-token]")}function ww(t){let e=t??{};if(e.role!=="system")return!1;let n=e.content;if(n&&typeof n=="object"&&FR.has(String(n.type)))return!0;if(typeof n!="string"||!n.trimStart().startsWith("{"))return!1;try{return FR.has(String(JSON.parse(n).type))}catch{return!1}}function Xf(t){let e=t??{};if(!e.usage||typeof e.usage!="object"||!e.cost||typeof e.cost!="object")return{};let n=e.usage,r=e.cost;return{usage:{response_ids:Array.isArray(n.response_ids)?n.response_ids.filter(s=>typeof s=="string").slice(0,50).map(s=>s.slice(0,80)):[],responses:kn(n.responses)??0,model:bo(n.model,120),input:kn(n.input),output:kn(n.output),cache_read:kn(n.cache_read),cache_write:kn(n.cache_write),...n.cache_write_5m!==void 0?{cache_write_5m:kn(n.cache_write_5m)}:{},...n.cache_write_1h!==void 0?{cache_write_1h:kn(n.cache_write_1h)}:{},...n.reasoning!==void 0?{reasoning:kn(n.reasoning)}:{}},cost:{total:kn(r.total),currency:"USD",model:bo(r.model,120),price_route:bo(r.price_route),rates_source:bo(r.rates_source,20),rates_generated_at:bo(r.rates_generated_at,40),unknown_reason:bo(r.unknown_reason,300),...r.estimated===!0?{estimated:!0}:{},breakdown:(Array.isArray(r.breakdown)?r.breakdown:[]).filter(s=>s&&pz.has(s.type??"")).slice(0,8).map(s=>{let o=s;return{type:o.type,tokens:kn(o.tokens),rate_per_mtok:kn(o.rate_per_mtok),usd:kn(o.usd),...o.included_in==="output"?{included_in:"output"}:{}}})}}}function tL(t,e){let n=e??{},r=typeof n.sessionId=="string"?[n.sessionId]:[],s=(Array.isArray(n.messages)?n.messages:[]).filter(i=>!ww(i)).map(i=>{let a=i??{},l=typeof a.content=="string"?a.content:JSON.stringify(a.content??""),c=St(l,r);return{role:typeof a.role=="string"?a.role:"other",timestamp:typeof a.timestamp=="string"?a.timestamp:null,model:typeof a.model=="string"?a.model:null,text:c.slice(0,Hf),clipped:c.length>Hf,...Xf(i)}}),o=n.truncated===!0;for(;s.length&&Buffer.byteLength(JSON.stringify(s))>GR;)s.shift(),o=!0;return{schema:Jf,target:t,provider:typeof n.provider=="string"?n.provider:null,truncated:o,...eL(e?.usage_coverage),messages:s}}function nL(t,e){let n=e??{},r=typeof n.sessionId=="string"?[n.sessionId]:[],s=d=>typeof d=="string"&&/^c1\.[0-9a-z.]{1,60}$/.test(d),o=[],i=s(n.next_cursor)?n.next_cursor:null,a=!1,l=2;for(let d of Array.isArray(n.messages)?n.messages:[]){if(ww(d))continue;let u=d??{},f=St(typeof u.content=="string"?u.content:JSON.stringify(u.content??""),r),m={role:typeof u.role=="string"?u.role:"other",timestamp:typeof u.timestamp=="string"?u.timestamp:null,model:typeof u.model=="string"?u.model:null,tool:typeof u.toolName=="string"?u.toolName.slice(0,80):null,text:f.slice(0,Hf),clipped:f.length>Hf,cursor:s(u.cursor)?u.cursor:null,...Xf(d)},p=Buffer.byteLength(JSON.stringify(m))+1;if(o.length&&l+p>GR){a=!0,i=o[o.length-1].cursor??i;break}l+=p,o.push(m)}let c=(Array.isArray(e?.updates)?e.updates:[]).slice(0,20).filter(d=>s(d?.cursor)).map(d=>({cursor:d.cursor,...Xf(d)})).filter(d=>d.cost);return{schema:Jf,target:t,provider:typeof n.provider=="string"?n.provider:null,live:!0,reset:n.reset===!0,truncated:n.truncated===!0,more:a,next_cursor:i,...eL(e?.usage_coverage),...c.length?{updates:c}:{},messages:o}}function Ew(t){if(t==null||t==="")return null;if(typeof t!="string"||t.length>64)return"invalid";let e=/^([0-9T:.+\-Z]{10,40})\|(\d{1,4})$/.exec(t);return!e||Number.isNaN(Date.parse(e[1]))?"invalid":{ts:e[1],seen:Number(e[2])}}function rL(t,e){if(!e)return t;let n=Date.parse(e.ts),r=e.seen;return t.filter(s=>{let o=s.timestamp?Date.parse(s.timestamp):NaN;return Number.isNaN(o)||o<n?!1:o===n&&r>0?(r--,!1):!0})}function sL(t,e){let n=t.filter(i=>i.timestamp&&!Number.isNaN(Date.parse(i.timestamp)));if(!n.length)return e?`${e.ts}|${e.seen}`:null;let r=n[n.length-1].timestamp,s=Date.parse(r),o=n.filter(i=>Date.parse(i.timestamp)===s).length;return e&&Date.parse(e.ts)===s&&(o+=e.seen),`${r}|${o}`}function qf(t,e){let n=[],r=[];for(let s=0;s<t.length;s++){if(t[s]!==e){r.push(t[s]);continue}let o=t[s+1];if(o===void 0||o.startsWith("--"))return{error:`missing value for ${e}`};n.push(o),s++}return{values:n,rest:r}}async function oL(t,e,n=Date.now){let r=de(t,["--targets-file","--text-file","--since","--total-ms","--per-session-ms","--per-session-bytes"],["--json"]);if(r.error||r.positionals.length)return O(e,r.error??"usage: lmctl site search-local --targets-file F --text-file T [--since ISO]");let s,o;try{s=JSON.parse(rc(F(r,"--targets-file")??"","utf8")),o=rc(F(r,"--text-file")??"","utf8")}catch{return O(e,"lmctl site search-local: cannot read the targets or the text")}let i=F(r,"--since"),a=i?new Date(i):void 0,l=Math.min(Number(F(r,"--total-ms")??Ls.totalMs),6e4),c=Math.min(Number(F(r,"--per-session-ms")??Ls.perSessionMs),1e4),d=Math.min(Number(F(r,"--per-session-bytes")??Ls.perSessionBytes),32*1024*1024),u=n(),f=[];for(let m of s.slice(0,XR)){let p={target:`${m.teamfile}:${m.alias}`,teamfile:m.teamfile,alias:m.alias,provider:null,reader:null,hits:[],scanned_bytes:0,file_bytes:0,complete:!1,stopped:null,skipped:null};if(n()-u>=l){f.push({...p,skipped:"time_cap"});continue}try{let _=await q(e,g=>lt(m.teamfile,m.alias,g)).catch(()=>{let g=Fe(m.teamfile).members.find(w=>w.alias===m.alias);if(!g?.session)throw new Error("unresolved");return{provider:g.provider,sessionid:g.session}});if(!_.sessionid){f.push({...p,skipped:"no_session"});continue}let h=await pN(_.sessionid,_.provider,o,{maxBytes:d,deadline:Math.min(n()+c,u+l),maxHits:Ls.hitsPerSession,since:a,now:n,redact:g=>St(g)});if(!h){f.push({...p,provider:_.provider,skipped:"transcript_not_found"});continue}f.push({...p,provider:_.provider,reader:h.reader,hits:h.hits.map(g=>({role:g.role,timestamp:g.timestamp,snippet:g.snippet})),scanned_bytes:h.scanned_bytes,file_bytes:h.file_bytes,complete:h.complete,stopped:h.stopped})}catch{f.push({...p,skipped:"unreadable"})}}return Y(e,{schema:gw,elapsed_ms:n()-u,results:f}),0}function mw(t,e=!1){let n=[];for(let r of t?.providers??[])if(!(typeof r.provider!="string"||r.status!=="ok"||!/^[a-z]{2,16}$/.test(r.provider)))for(let s of r.models??[])typeof s.id=="string"&&fz.test(s.id)&&n.push({provider:r.provider,model:s.id});return e&&n.push({provider:"ClaudeMock",model:"claude-mock"}),n.slice(0,60)}function iL(t,e,n){return`_TEAM_ name=${t}
|
|
2269
|
+
`)}function dn(t,e,n,r){let s=n instanceof oc?n.run:null,o={error:e,message:St(Ne(n)).slice(0,4e3),exit_code:s?.exit_code??null,signal:s?.signal??null,timed_out:s?.timed_out??!1,command:s?St(s.command.join(" ")).slice(0,2e3):null,stdout_tail:s?St(Bf(s.stdout_tail)):null,stderr_tail:s?St(Bf(s.stderr_tail)):null,started_at:s?.started_at??null,ended_at:s?.ended_at??new Date(r.now).toISOString(),duration_ms:s?.duration_ms??null,site:r.site,job_id:r.job};return{status:t,headers:{"content-type":"application/json"},body:JSON.stringify({error:e,detail:o})}}function yw(t,e){return t.map(n=>{let r=n.lastIndexOf(":"),s=r>0&&Gf.test(n.slice(r+1))?n.slice(r+1):null;return{teamfile:hw(e,s===null?n:n.slice(0,r)),alias:s}})}function qi(t){let e=t.lastIndexOf(":");if(e<=0)return null;let n=t.slice(e+1);return Gf.test(n)?{teamfile:t.slice(0,e),alias:n}:null}function fw(t,e,n,r=Date.now()){let s=new Map,o=(c,d)=>n||!e.length||e.some(u=>u.teamfile===c&&(u.alias===null||u.alias===d)),i=t??{};if(Array.isArray(i.sessions))for(let c of i.sessions){let d=c??{};if(typeof d.team_path!="string"||!d.team_path.startsWith("/")||typeof d.member!="string"||!Gf.test(d.member))continue;let u=`${d.team_path}:${d.member}`;if(s.has(u))continue;let f=d.busy===!0,m=d.terminal_held===!0,p=typeof d.state=="string"?d.state.slice(0,16):null,_=UR(d.last_activity_at),h=UR(d.started_at),g=!f&&_?Math.max(0,Math.round((r-Date.parse(_))/1e3)):null,w=d.can_prompt===!0&&!f&&!m;s.set(u,{target:u,teamfile:d.team_path,alias:d.member,state:f?"busy":g===null?"unknown":"idle",idle_seconds:g,model:typeof d.model=="string"?d.model.slice(0,128):null,allowed:o(d.team_path,d.member),running_seconds:(f||d.liveness==="dead")&&h?Math.max(0,Math.round((r-Date.parse(h))/1e3)):null,stuck:d.liveness==="dead",last_status:d.liveness==="dead"?null:p==="error"?"error":p==="done"?"done":null,last_error:null,id:typeof d.id=="string"?d.id:`${d.team_path}#${d.member}`,kind:typeof d.kind=="string"?d.kind.slice(0,16):null,run_state:p,liveness:typeof d.liveness=="string"?d.liveness.slice(0,16):null,started_at:h,last_activity_at:_,busy:f,terminal_held:m,can_prompt:w,cannot_prompt_reason:w?null:typeof d.cannot_prompt_reason=="string"?d.cannot_prompt_reason.slice(0,64):f?"busy":m?"terminal-held":"unavailable-target"})}let a=t??{},l=c=>typeof c=="number"&&Number.isFinite(c)&&c>=0?c:null;for(let[c,d]of[["running",a.running],["dead",a.dead],["idle",a.idle]])for(let u of Array.isArray(d)?d:[]){let f=u;if(typeof f.target!="string"||!f.target.startsWith("/"))continue;let m=qi(f.target);if(!m||s.has(f.target))continue;let p=l(f.idle_ms),_=c==="running"?l(f.running_for_ms):c==="dead"?l(f.age_ms):null,h=c==="idle"&&(f.status==="error"||f.status==="aborted");s.set(f.target,{target:f.target,teamfile:m.teamfile,alias:m.alias,state:c==="idle"?p===null?"unknown":"idle":"busy",idle_seconds:c==="idle"&&p!==null?Math.round(p/1e3):null,model:typeof f.model=="string"?f.model:null,allowed:o(m.teamfile,m.alias),running_seconds:_===null?null:Math.round(_/1e3),stuck:c==="dead",last_status:c==="idle"&&typeof f.status=="string"?f.status.slice(0,32):null,last_error:h&&typeof f.error=="string"&&f.error?St(f.error).slice(0,200):null,id:`${m.teamfile}#${m.alias}`,busy:c!=="idle",terminal_held:!1,can_prompt:c==="idle",cannot_prompt_reason:c==="idle"?null:c==="dead"?"unavailable-target":"busy"})}for(let c of e){if(c.alias===null)continue;let d=`${c.teamfile}:${c.alias}`;s.has(d)||s.set(d,{target:d,teamfile:c.teamfile,alias:c.alias,state:"unknown",idle_seconds:null,model:null,allowed:!0,id:`${c.teamfile}#${c.alias}`,busy:!1,terminal_held:!1,can_prompt:!0,cannot_prompt_reason:null})}return[...s.values()].slice(0,XR)}function QR(t){return t.filter(e=>e.allowed).map(e=>({teamfile:Bi(e.teamfile),path:e.teamfile,alias:e.alias,provider:null,state:e.state,idle_seconds:e.state==="idle"?e.idle_seconds:null,...e.running_seconds!=null?{running_seconds:e.running_seconds}:{},...e.stuck?{stuck:!0}:{},...e.last_status?{last_status:e.last_status}:{},...e.last_error?{last_error:e.last_error}:{},...e.id?{id:e.id}:{},...e.model?{model:e.model}:{},...e.kind?{kind:e.kind}:{},...e.run_state?{run_state:e.run_state}:{},...e.liveness?{liveness:e.liveness}:{},...e.started_at?{started_at:e.started_at}:{},...e.last_activity_at?{last_activity_at:e.last_activity_at}:{},busy:e.busy===!0,terminal_held:e.terminal_held===!0,can_prompt:e.can_prompt!==!1,cannot_prompt_reason:e.can_prompt===!1?e.cannot_prompt_reason??"unavailable-target":null,...e.tmux?.panes?.length?{tmux:e.tmux}:{}}))}function ec(t,e,n){let r=t.filter(i=>i.allowed&&i.alias===n),s=r.filter(i=>i.teamfile===e);if(s.length===1)return s[0];if(e.includes("/"))return null;let o=r.filter(i=>Bi(i.teamfile)===e);return o.length===1?o[0]:null}function Wf(t){if(t.can_prompt!==!1&&t.busy!==!0&&t.terminal_held!==!0)return null;let e=t.terminal_held?"terminal-held":t.busy?"busy":t.cannot_prompt_reason??"unavailable-target";return{status:409,body:e==="terminal-held"?"session_terminal_held":e==="busy"?"session_busy":"session_unavailable"}}function ZR(t){let e={};for(let[n,r]of Object.entries(t))/^LMCTL_(APPKEY|SELF_|INVOCATION_ID|LAUNCH_SOURCE)/.test(n)||n==="LMCTL_SITE_API_URL"||n==="CLAUDECODE"||n.startsWith("CLAUDE_CODE_")||(e[n]=r);return e}function St(t,e=[]){let n=t;for(let r of e)r&&r.length>=6&&(n=n.split(r).join("[redacted-session-id]"));return n.replace(/lmk_[A-Za-z0-9_-]{8,}/g,"[redacted-appkey]").replace(/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,"[redacted-token]").replace(/\b(Bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi,"$1 [redacted-token]").replace(/\b(?:sk|pk|rk)-[A-Za-z0-9_-]{16,}|\b(?:ghp|gho|ghs|github_pat)_[A-Za-z0-9_]{16,}|\bxox[abprs]-[A-Za-z0-9-]{10,}|\bAKIA[A-Z0-9]{16}\b/g,"[redacted-token]").replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?(?:-----END [A-Z ]*PRIVATE KEY-----|$)/g,"[redacted-private-key]").replace(/\bAIza[0-9A-Za-z_-]{30,}/g,"[redacted-token]").replace(/\b(session_?id|sessionid)(\s*[=:]\s*"?)[A-Za-z0-9._:-]{6,}/gi,"$1$2[redacted-session-id]").replace(/\b((?:aws_)?secret(?:_access)?_?key|api_?key|access_?token|refresh_?token|client_?secret|password|passwd|secret|token)(\s*[=:]\s*["']?)[^\s"',;]{8,}/gi,"$1$2[redacted-secret]").replace(/\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/gi,"[redacted-id]").replace(/\b[a-f0-9]{40,}\b/gi,"[redacted-token]")}function ww(t){let e=t??{};if(e.role!=="system")return!1;let n=e.content;if(n&&typeof n=="object"&&FR.has(String(n.type)))return!0;if(typeof n!="string"||!n.trimStart().startsWith("{"))return!1;try{return FR.has(String(JSON.parse(n).type))}catch{return!1}}function Xf(t){let e=t??{};if(!e.usage||typeof e.usage!="object"||!e.cost||typeof e.cost!="object")return{};let n=e.usage,r=e.cost;return{usage:{response_ids:Array.isArray(n.response_ids)?n.response_ids.filter(s=>typeof s=="string").slice(0,50).map(s=>s.slice(0,80)):[],responses:An(n.responses)??0,model:bo(n.model,120),input:An(n.input),output:An(n.output),cache_read:An(n.cache_read),cache_write:An(n.cache_write),...n.cache_write_5m!==void 0?{cache_write_5m:An(n.cache_write_5m)}:{},...n.cache_write_1h!==void 0?{cache_write_1h:An(n.cache_write_1h)}:{},...n.reasoning!==void 0?{reasoning:An(n.reasoning)}:{}},cost:{total:An(r.total),currency:"USD",model:bo(r.model,120),price_route:bo(r.price_route),rates_source:bo(r.rates_source,20),rates_generated_at:bo(r.rates_generated_at,40),unknown_reason:bo(r.unknown_reason,300),...r.estimated===!0?{estimated:!0}:{},breakdown:(Array.isArray(r.breakdown)?r.breakdown:[]).filter(s=>s&&pz.has(s.type??"")).slice(0,8).map(s=>{let o=s;return{type:o.type,tokens:An(o.tokens),rate_per_mtok:An(o.rate_per_mtok),usd:An(o.usd),...o.included_in==="output"?{included_in:"output"}:{}}})}}}function tL(t,e){let n=e??{},r=typeof n.sessionId=="string"?[n.sessionId]:[],s=(Array.isArray(n.messages)?n.messages:[]).filter(i=>!ww(i)).map(i=>{let a=i??{},l=typeof a.content=="string"?a.content:JSON.stringify(a.content??""),c=St(l,r);return{role:typeof a.role=="string"?a.role:"other",timestamp:typeof a.timestamp=="string"?a.timestamp:null,model:typeof a.model=="string"?a.model:null,text:c.slice(0,Hf),clipped:c.length>Hf,...Xf(i)}}),o=n.truncated===!0;for(;s.length&&Buffer.byteLength(JSON.stringify(s))>GR;)s.shift(),o=!0;return{schema:Jf,target:t,provider:typeof n.provider=="string"?n.provider:null,truncated:o,...eL(e?.usage_coverage),messages:s}}function nL(t,e){let n=e??{},r=typeof n.sessionId=="string"?[n.sessionId]:[],s=d=>typeof d=="string"&&/^c1\.[0-9a-z.]{1,60}$/.test(d),o=[],i=s(n.next_cursor)?n.next_cursor:null,a=!1,l=2;for(let d of Array.isArray(n.messages)?n.messages:[]){if(ww(d))continue;let u=d??{},f=St(typeof u.content=="string"?u.content:JSON.stringify(u.content??""),r),m={role:typeof u.role=="string"?u.role:"other",timestamp:typeof u.timestamp=="string"?u.timestamp:null,model:typeof u.model=="string"?u.model:null,tool:typeof u.toolName=="string"?u.toolName.slice(0,80):null,text:f.slice(0,Hf),clipped:f.length>Hf,cursor:s(u.cursor)?u.cursor:null,...Xf(d)},p=Buffer.byteLength(JSON.stringify(m))+1;if(o.length&&l+p>GR){a=!0,i=o[o.length-1].cursor??i;break}l+=p,o.push(m)}let c=(Array.isArray(e?.updates)?e.updates:[]).slice(0,20).filter(d=>s(d?.cursor)).map(d=>({cursor:d.cursor,...Xf(d)})).filter(d=>d.cost);return{schema:Jf,target:t,provider:typeof n.provider=="string"?n.provider:null,live:!0,reset:n.reset===!0,truncated:n.truncated===!0,more:a,next_cursor:i,...eL(e?.usage_coverage),...c.length?{updates:c}:{},messages:o}}function Ew(t){if(t==null||t==="")return null;if(typeof t!="string"||t.length>64)return"invalid";let e=/^([0-9T:.+\-Z]{10,40})\|(\d{1,4})$/.exec(t);return!e||Number.isNaN(Date.parse(e[1]))?"invalid":{ts:e[1],seen:Number(e[2])}}function rL(t,e){if(!e)return t;let n=Date.parse(e.ts),r=e.seen;return t.filter(s=>{let o=s.timestamp?Date.parse(s.timestamp):NaN;return Number.isNaN(o)||o<n?!1:o===n&&r>0?(r--,!1):!0})}function sL(t,e){let n=t.filter(i=>i.timestamp&&!Number.isNaN(Date.parse(i.timestamp)));if(!n.length)return e?`${e.ts}|${e.seen}`:null;let r=n[n.length-1].timestamp,s=Date.parse(r),o=n.filter(i=>Date.parse(i.timestamp)===s).length;return e&&Date.parse(e.ts)===s&&(o+=e.seen),`${r}|${o}`}function qf(t,e){let n=[],r=[];for(let s=0;s<t.length;s++){if(t[s]!==e){r.push(t[s]);continue}let o=t[s+1];if(o===void 0||o.startsWith("--"))return{error:`missing value for ${e}`};n.push(o),s++}return{values:n,rest:r}}async function oL(t,e,n=Date.now){let r=de(t,["--targets-file","--text-file","--since","--total-ms","--per-session-ms","--per-session-bytes"],["--json"]);if(r.error||r.positionals.length)return O(e,r.error??"usage: lmctl site search-local --targets-file F --text-file T [--since ISO]");let s,o;try{s=JSON.parse(rc(F(r,"--targets-file")??"","utf8")),o=rc(F(r,"--text-file")??"","utf8")}catch{return O(e,"lmctl site search-local: cannot read the targets or the text")}let i=F(r,"--since"),a=i?new Date(i):void 0,l=Math.min(Number(F(r,"--total-ms")??Ls.totalMs),6e4),c=Math.min(Number(F(r,"--per-session-ms")??Ls.perSessionMs),1e4),d=Math.min(Number(F(r,"--per-session-bytes")??Ls.perSessionBytes),32*1024*1024),u=n(),f=[];for(let m of s.slice(0,XR)){let p={target:`${m.teamfile}:${m.alias}`,teamfile:m.teamfile,alias:m.alias,provider:null,reader:null,hits:[],scanned_bytes:0,file_bytes:0,complete:!1,stopped:null,skipped:null};if(n()-u>=l){f.push({...p,skipped:"time_cap"});continue}try{let _=await q(e,g=>lt(m.teamfile,m.alias,g)).catch(()=>{let g=Fe(m.teamfile).members.find(w=>w.alias===m.alias);if(!g?.session)throw new Error("unresolved");return{provider:g.provider,sessionid:g.session}});if(!_.sessionid){f.push({...p,skipped:"no_session"});continue}let h=await pN(_.sessionid,_.provider,o,{maxBytes:d,deadline:Math.min(n()+c,u+l),maxHits:Ls.hitsPerSession,since:a,now:n,redact:g=>St(g)});if(!h){f.push({...p,provider:_.provider,skipped:"transcript_not_found"});continue}f.push({...p,provider:_.provider,reader:h.reader,hits:h.hits.map(g=>({role:g.role,timestamp:g.timestamp,snippet:g.snippet})),scanned_bytes:h.scanned_bytes,file_bytes:h.file_bytes,complete:h.complete,stopped:h.stopped})}catch{f.push({...p,skipped:"unreadable"})}}return Y(e,{schema:gw,elapsed_ms:n()-u,results:f}),0}function mw(t,e=!1){let n=[];for(let r of t?.providers??[])if(!(typeof r.provider!="string"||r.status!=="ok"||!/^[a-z]{2,16}$/.test(r.provider)))for(let s of r.models??[])typeof s.id=="string"&&fz.test(s.id)&&n.push({provider:r.provider,model:s.id});return e&&n.push({provider:"ClaudeMock",model:"claude-mock"}),n.slice(0,60)}function iL(t,e,n){return`_TEAM_ name=${t}
|
|
2267
2270
|
_MEMBER_ alias=Lead provider=${e}${e==="ClaudeMock"?"":` model=${n}`}
|
|
2268
2271
|
`}async function jf(t){try{let e=JSON.parse(await lz(t,"utf8"));return Array.isArray(e?.sessions)?e.sessions:[]}catch{return[]}}async function jR(t,e){await tc(Ze(t,".."),{recursive:!0,mode:448});let n=`${t}.${process.pid}.tmp`;await Zl(n,`${JSON.stringify({schema:"lmctl-site-new-sessions/1",sessions:e},null,2)}
|
|
2269
2272
|
`,{mode:384}),await BR(n,t)}async function Tw(t,e,n){let r=qf(t,"--allow");if("error"in r)return O(e,`${r.error}
|
|
2270
2273
|
${Te}`);let s=qf(r.rest,"--new-session-root");if("error"in s)return O(e,`${s.error}
|
|
2271
2274
|
${Te}`);let o={values:r.values,rest:s.rest},i=de(o.rest,["--name","--interval","--org","--since","--new-session-cap"],["--allow-tracked","--once","--allow-shell"]);if(i.error)return O(e,`${i.error}
|
|
2272
2275
|
${Te}`);let a=e.env??process.env,l=F(i,"--name")??"";if(!Ur.test(l))return O(e,"lmctl site serve: --name must be 1-53 characters [A-Za-z0-9._-], starting with a letter or digit");let c=yw(o.values,e.cwd??process.cwd());if(i.positionals.length)return O(e,Te);let d=z(i,"--allow-tracked"),u=F(i,"--org");if(u!==void 0&&!Cs.test(u))return O(e,"lmctl site serve: --org must be an organization id (lmctl site orgs)");let f=F(i,"--since")??"24h";if(!/^(\d{1,4}[mhd]|\d{4}-\d{2}-\d{2}T[0-9:.]+Z)$/.test(f))return O(e,"lmctl site serve: --since must be a duration such as 24h or an ISO 8601 UTC time");let m=Number(F(i,"--interval")??60);if(!Number.isFinite(m)||m<30||m>240)return O(e,"lmctl site serve: --interval must be 30-240 seconds (reports expire after 5 minutes)");let p=a.HOME||pw(),_=(s.values.length?s.values:[Ze(p,".local/state/lmctl-site/sessions")]).map(W=>hw(e.cwd??process.cwd(),W));if(_.some(W=>!W.startsWith("/")||W==="/"||W.includes("\0")))return O(e,"lmctl site serve: --new-session-root must be an absolute directory other than /");let h=Number(F(i,"--new-session-cap")??0);if(!Number.isSafeInteger(h)||h<0||h>50)return O(e,"lmctl site serve: --new-session-cap must be 0-50 per hour");let g=Ze(p,".local/state/lmctl-site/new-sessions.json"),w=z(i,"--allow-shell")||a.LMCTL_SITE_ALLOW_SHELL==="1",y=Ze(p,".lmctl","site-shell-audit.jsonl"),E=!1,T=n.tmux??LR(a),v=n.proc??RR(),b=cr(e,n);if(!b)return O(e,dr);let k=`site-${l}`,I=W=>e.stderr.write(`${new Date(n.now()).toISOString()} site ${l}: ${W}
|
|
2273
|
-
`);try{await b.call("POST","/v1/mailboxes",{name:k,...u?{org:u}:{}})}catch(W){return W instanceof Hn&&W.code==="name_taken"?O(e,`lmctl site serve: the name ${l} is taken by another account or organization; choose another --name`):W instanceof Hn&&W.code==="org_not_found"?O(e,`lmctl site serve: you are not an owner of organization ${u}`):O(e,`lmctl site serve: cannot create the relay mailbox: ${Ne(W)}`)}I(`serving ${b.base} for ${u?`organization ${u}`:"your personal organization"} (relay mailbox ${k}); sessions: lmctl running --json --since ${f}; offered: ${c.length&&!d?`only ${c.map(W=>W.alias?`${W.teamfile}:${W.alias}`:W.teamfile).join(", ")}`:"every session"} (prompted only while lmctl says can_prompt)`);let N=[],A=ZR(a),S={...A,LMCTL_READ_ONLY:"1"},x={...A};delete x.LMCTL_READ_ONLY;let R=3e4,L=new Map,D=new Map,M=(W,X,V)=>{D.get(W)!==X&&(D.set(W,X),I(`tmux: ${V}`))},P=null;function j(){return P||(P=$().finally(()=>{P=null})),P}async function $(){let W=N;try{let V=await n.lmctl(["running","--json","--since",f],{timeoutMs:3e4,env:S});W=fw(JSON.parse(V),c,d,n.now())}catch(V){I(`lmctl running failed: ${Ne(V)}`),W=[...N]}if(h)for(let V of await jf(g))V.archived_at||W.some(K=>K.teamfile===V.teamfile&&K.alias===V.alias)||W.push({target:`${V.teamfile}:${V.alias}`,teamfile:V.teamfile,alias:V.alias,state:"unknown",idle_seconds:null,model:V.model,allowed:!0,id:`${V.teamfile}#${V.alias}`,busy:!1,terminal_held:!1,can_prompt:!0,cannot_prompt_reason:null});let X=W.filter(V=>V.terminal_held===!0);for(let V of[...L.keys()])X.some(K=>`${K.teamfile}:${K.alias}`===V)||(L.delete(V),D.delete(V));if(X.length){let V=await Ff(T),K=new Map,le=V.error?`tmux did not answer (${V.error})`:"no tmux pane runs its lmctl terminal";if(!V.error)try{K=await Uf(X.map(ne=>({teamfile:ne.teamfile,alias:ne.alias})),V.panes,v)}catch(ne){le=`the association failed (${Ne(ne)})`}let _e=n.now();for(let ne of X){let ee=`${ne.teamfile}:${ne.alias}`,Ee=`${Bi(ne.teamfile)}:${ne.alias}`,ye=K.get(ee);if(ye?.length){let ae=ye.map(({pid:Re,...tt})=>tt);ne.tmux={panes:ae},L.set(ee,{panes:ae,at:_e}),M(ee,`found ${ae.map(Re=>Re.target).join(",")}`,`${Ee} is in ${ae.map(Re=>Re.target).join(", ")}`)}else{let ae=L.get(ee);ae&&_e-ae.at<=R?(ne.tmux={panes:ae.panes,stale:!0,checked_at:new Date(ae.at).toISOString()},M(ee,"stale",`${Ee}: pane not found now (${le}); keeping ${ae.panes[0].target} from ${Math.round((_e-ae.at)/1e3)} s ago`)):(ne.tmux=null,M(ee,"missing",`${Ee}: no pane (${le})`))}}}N=W}let pe=[],G=0;async function fe(){if(!(!h||n.now()-G<36e5)){G=n.now();try{pe=mw(JSON.parse(await n.lmctl(["models","--json"],{timeoutMs:6e4,env:S})),a.LMCTL_ENABLE_MOCK_PROVIDER==="1")}catch(W){pe=a.LMCTL_ENABLE_MOCK_PROVIDER==="1"?mw(null,!0):[],I(`lmctl models failed: ${Ne(W)}`)}}}async function ve(){if(!h)return;await fe();let W=n.now()-36e5,X=(await jf(g)).filter(V=>Date.parse(V.created_at)>W).length;return{roots:_,models:pe,cap_per_hour:h,created_last_hour:X}}let qe=0,ut="",Gr=()=>JSON.stringify(N.filter(W=>W.allowed).map(W=>[W.target,W.busy===!0,W.terminal_held===!0,W.can_prompt!==!1]).sort());async function Xt(W=!1,X=!1,V=!1){let K={schema:sc,host:dz(),stopped:W,sessions:W?[]:N},le=W?void 0:await ve(),_e=Gr();for(let ne=0;ne<2;ne++)try{let Ee=(await b.call("POST","/api/running/report",{device_id:l,...u?{org:u}:{},payload:K,targets:W?[]:QR(N),...le?{new_session:le}:{},...w&&!W?{shell:{enabled:!0,home:p}}:{},...X?{state_change:!0}:{}},!W)).json?.quick_check_s,ye=typeof Ee=="number"&&Number.isInteger(Ee)&&Ee>=2&&Ee<=60?Ee:0;return ye!==qe&&I(ye?`a queued prompt waits here: checking sessions every ${ye} s`:"no queued prompt waits here: back to the report interval"),qe=ye,ut=_e,!0}catch(ee){if(X&&V&&ne===0&&ee instanceof Hn&&ee.status===429){if(await n.sleep(3500,n.signal),n.signal?.aborted)return!1;continue}if(X&&ee instanceof Hn&&ee.status===429)return!1;if(ne===0&&ee instanceof Hn&&ee.status===429){if(await n.sleep(21e3,W?void 0:n.signal),!W&&n.signal?.aborted)return!1;continue}return I(`report failed: ${Ne(ee)}`),!1}return!1}async function H(W){let X=W.request??{};if(X.op==="new_session")return Qt(W,X);if(X.op==="search")return We(W,X);if(X.op==="shell")return J(W,X);if(X.op==="tmux_send")return Ae(W,X);if(X.op==="report_now"){await j();let re=await Xt(!1,!0,!0);return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:"lmctl-site-report/1",reported:re,quick_check_s:qe})}}if(X.op==="archive_session")return Uc(W,X);let V,K,le,_e,ne,ee,Ee;if(typeof X.op=="string")({op:V,teamfile:K,alias:le,text:_e,lines:ne}=X),ee=X.since,Ee=X.tools,typeof X.path=="string"&&X.path.startsWith("/")&&(K=X.path);else if(X.method==="POST"&&X.path==="/prompt"){let re={};try{re=typeof X.body=="string"?JSON.parse(X.body):X.body??{}}catch{return{status:400,body:"invalid_body"}}V="prompt";let Me=typeof re.target=="string"?qi(re.target):null;K=Me?.teamfile,le=Me?.alias,_e=re.text}else if(X.method==="POST"&&X.path==="/tail"){let re={};try{re=typeof X.body=="string"?JSON.parse(X.body):X.body??{}}catch{return{status:400,body:"invalid_body"}}V="tail";let Me=typeof re.target=="string"?qi(re.target):null;K=Me?.teamfile,le=Me?.alias,ne=re.lines,ee=re.since,Ee=re.tools}else return X.method==="GET"&&X.path==="/sessions"?{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:sc,sessions:N})}:{status:400,body:"invalid_op"};if(V!=="prompt"&&V!=="idle"&&V!=="tail"&&V!=="live_tail")return{status:400,body:"invalid_op"};let ye=(re,Me,Ke)=>dn(re,Me,Ke,{job:W.id,site:l,now:n.now()});if(typeof K!="string"||typeof le!="string"||!Gf.test(le))return{status:403,body:"target_not_allowed"};await j();let ae=ec(N,K,le);if(!ae)return{status:403,body:"target_not_allowed"};let Re=()=>{let re=ec(N,ae.teamfile,ae.alias)??ae;return{state:re.state,idle_seconds:re.state==="idle"?re.idle_seconds:null,busy:re.busy===!0,terminal_held:re.terminal_held===!0,can_prompt:Wf(re)===null,cannot_prompt_reason:Wf(re)?re.terminal_held?"terminal-held":re.busy?"busy":re.cannot_prompt_reason??"unavailable-target":null}};if(V==="idle")return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify(Re())};if(V==="live_tail"){let re=X.after;if(re!=null&&(typeof re!="string"||!/^c1\.[0-9a-z.]{1,60}$/.test(re)))return{status:400,body:"after_invalid"};let Me=ne===void 0?Hi:Number(ne);if(!Number.isSafeInteger(Me)||Me<1||Me>Hi)return{status:400,body:"lines_invalid"};try{let Ke=["tail",ae.teamfile,ae.alias,"--lines",String(Me),"--tools","--json",...re?["--after",re]:[]],xn=await n.lmctl(Ke,{timeoutMs:2e4,env:S});return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({...nL(ae.target,JSON.parse(xn)),session:Re()})}}catch(Ke){let xn=Ne(Ke);return I(`job ${W.id}: live tail failed: ${St(xn)}`),/session not found/i.test(xn)?ye(404,"transcript_not_found",Ke):/timed out/i.test(xn)?ye(504,"tail_timeout",Ke):ye(502,"tail_failed",Ke)}}if(V==="tail"){let re=ne===void 0?qR:Number(ne);if(!Number.isSafeInteger(re)||re<1||re>Hi)return{status:400,body:"lines_invalid"};let Me=Ew(ee);if(Me==="invalid")return{status:400,body:"since_invalid"};if(Ee!==void 0&&typeof Ee!="boolean")return{status:400,body:"tools_invalid"};try{let Ke=["tail",ae.teamfile,ae.alias,"--lines",String(Me?Hi:re),...Me?["--since",Me.ts]:[],...Ee===!1?[]:["--tools"],"--json"],xn=await n.lmctl(Ke,{timeoutMs:3e4,env:S}),Vm=tL(ae.target,JSON.parse(xn)),NT=rL(Vm.messages,Me);return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({...Vm,messages:NT,truncated:Me?!1:Vm.truncated,next_cursor:sL(NT,Me),session:Re()})}}catch(Ke){let xn=Ne(Ke);return I(`job ${W.id}: tail failed: ${St(xn)}`),/session not found/i.test(xn)?ye(404,"transcript_not_found",Ke):/timed out/i.test(xn)?ye(504,"tail_timeout",Ke):ye(502,"tail_failed",Ke)}}if(typeof _e!="string"||!_e.length||_e.includes("\0")||Buffer.byteLength(_e)>Io)return{status:400,body:"text_invalid"};let tt=Wf(ae);if(tt)return I(`job ${W.id}: refused ${ae.target}: ${tt.body}`),{...tt,measured:Re()};let Zt=Number(X.timeout_s),ha=Math.min(Number.isFinite(Zt)&&Zt>0?Zt*1e3:dw*1e3,dw*1e3),Fc=await MR(Ze(PR(),"lmctl-site-prompt-"));try{let re=Ze(Fc,"prompt");await Zl(re,_e,{mode:384,flag:"wx"}),I(`job ${W.id}: prompt ${ae.target}`);let Me=await n.lmctl(["prompt",ae.teamfile,ae.alias,"--prompt-file",re,"--json"],{timeoutMs:ha,env:x});await j(),Xt();let Ke=Buffer.from(Me);return{status:200,headers:{"content-type":"application/x-ndjson"},body:Ke.subarray(Math.max(0,Ke.length-cw)).toString(),measured:Re()}}catch(re){return I(`job ${W.id}: prompt failed: ${St(Ne(re))}`),await j(),{...ye(502,"execution_failed",re),measured:Re()}}finally{await $R(Fc,{recursive:!0,force:!0})}}async function J(W,X){if(!w)return{status:403,body:"shell_not_enabled"};let V=X.command,K=X.cwd,le=X.timeout_s??nc.defaultTimeoutS;if(typeof V!="string"||!V.trim()||V.includes("\0")||Buffer.byteLength(V)>nc.commandBytes)return{status:400,body:"command_invalid"};if(typeof K!="string"||!K.startsWith("/")||K.includes("\0")||K.length>1024)return{status:400,body:"cwd_invalid"};if(!Number.isSafeInteger(le)||le<1||le>nc.maxTimeoutS)return{status:400,body:"timeout_invalid"};let _e={job:W.id,site:l,now:n.now()};try{if(!(await cz(K)).isDirectory())throw new Error("not a directory")}catch{return dn(400,"cwd_not_found",new Error(`the working directory ${K} does not exist on this machine or is not a directory`),_e)}if(E)return{status:409,body:"shell_busy"};E=!0;let ne=X.by&&typeof X.by=="object"?X.by:{};try{I(`job ${W.id}: shell in ${K} (${Buffer.byteLength(V)} bytes, timeout ${le} s)`);let ee=await YR(V,K,le*1e3,x);return await uw(y,{at:new Date(n.now()).toISOString(),job_id:W.id,run_id:typeof ne.run_id=="string"?ne.run_id:null,user:typeof ne.user=="string"?ne.user:null,org:typeof ne.org=="string"?ne.org:null,site:l,cwd:K,command:aw(V),exit_code:ee.exit_code,signal:ee.signal,timed_out:ee.timed_out,duration_ms:ee.duration_ms,stdout_bytes:ee.stdout_bytes,stderr_bytes:ee.stderr_bytes,...ee.spawn_error?{spawn_error:ee.spawn_error}:{}}).catch(Ee=>I(`shell audit write failed: ${Ne(Ee)}`)),ee.spawn_error?dn(502,"shell_failed",new Error(ee.spawn_error),_e):{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:mz,...ee,cwd:K,stdout:aw(ee.stdout),stderr:aw(ee.stderr)})}}finally{E=!1}}async function Ae(W,X){if(!w)return{status:403,body:"shell_not_enabled"};let V={job:W.id,site:l,now:n.now()},K=X.text,le=X.pane,_e=typeof X.path=="string"?X.path:X.teamfile,ne=X.alias;if(typeof _e!="string"||typeof ne!="string")return{status:400,body:"target_invalid"};if(le!=null&&(typeof le!="string"||!/^[^:\s]{1,128}:\d{1,4}\.\d{1,4}$/.test(le)))return{status:400,body:"pane_invalid"};if(typeof K!="string"||!K.length||K.includes("\0")||Buffer.byteLength(K)>Ql.textBytes)return{status:400,body:"text_invalid"};await j();let ee=ec(N,_e,ne);if(!ee)return{status:404,body:"unknown_target"};if(ee.terminal_held!==!0)return dn(409,"not_terminal_held",new Error(`${Bi(ee.teamfile)}:${ee.alias} is not held by a terminal now; send it as a session prompt instead`),V);let Ee=X.by&&typeof X.by=="object"?X.by:{},ye=async(ae,Re=le)=>uw(y,{at:new Date(n.now()).toISOString(),op:"tmux_send",job_id:W.id,run_id:typeof Ee.run_id=="string"?Ee.run_id:null,user:typeof Ee.user=="string"?Ee.user:null,org:typeof Ee.org=="string"?Ee.org:null,target:`${ee.teamfile}:${ee.alias}`,pane:Re??null,bytes:Buffer.byteLength(K),sha256:uz("sha256").update(K).digest("hex"),result:ae});try{let ae={teamfile:ee.teamfile,alias:ee.alias},Re=`${Bi(ee.teamfile)}:${ee.alias}`,tt=typeof le=="string"?le:null;if(!tt){let re=await Ff(T);if(re.error)return await ye("tmux_unavailable","-"),dn(503,"tmux_unavailable",new Error(`tmux did not answer (${re.error}); try again`),V);if(tt=(await Uf([ae],re.panes,v)).get(`${ae.teamfile}:${ae.alias}`)?.[0]?.target??null,!tt){let Me=await CR(ae,v),Ke=Me?"terminal_not_in_tmux":"pane_not_found";return await ye(Ke,"-"),dn(409,Ke,new Error(Me?`the lmctl terminal holding ${Re} runs outside tmux (pid ${Me}), so nothing can be typed into it from here`:`no tmux pane runs lmctl terminal for ${Re} now`),V)}}let Zt=await OR(T,v,ae,tt,K);if(!Zt.ok)return await ye(Zt.code,tt),dn(409,Zt.code,new Error(Zt.message),V);await ye("sent",tt),I(`job ${W.id}: typed ${Buffer.byteLength(K)} bytes into tmux ${tt}`);let{pid:ha,...Fc}=Zt.place;return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:"lmctl-site-tmux/1",sent:!0,pane:Fc,bytes:Buffer.byteLength(K)})}}catch(ae){return await ye("failed"),dn(502,"tmux_failed",ae,V)}}async function We(W,X){let V=X.text,K=X.since??"24h";if(typeof V!="string"||V.trim().length<2||Buffer.byteLength(V)>200||V.includes("\0"))return{status:400,body:"text_invalid"};if(!["24h","7d","all"].includes(K))return{status:400,body:"since_invalid"};let le=[];try{le=fw(JSON.parse(await n.lmctl(["running","--json","--since",K==="all"?"30d":K],{timeoutMs:3e4,env:S})),c,d,n.now())}catch(ee){return I(`job ${W.id}: search: lmctl running failed: ${St(Ne(ee))}`),dn(502,"search_failed",ee,{job:W.id,site:l,now:n.now()})}let _e=le.filter(ee=>ee.allowed).map(ee=>({teamfile:ee.teamfile,alias:ee.alias})),ne=await MR(Ze(PR(),"lmctl-site-search-"));try{await Zl(Ze(ne,"targets.json"),JSON.stringify(_e),{mode:384}),await Zl(Ze(ne,"text"),V,{mode:384});let ee=K==="all"?void 0:new Date(n.now()-(K==="7d"?7*864e5:864e5)).toISOString(),Ee=await n.lmctl(["site","search-local","--targets-file",Ze(ne,"targets.json"),"--text-file",Ze(ne,"text"),...ee?["--since",ee]:[]],{timeoutMs:Ls.totalMs+15e3,env:S}),ye=JSON.parse(Ee),ae=Ls.totalHits,Re=ye.results.map(tt=>{let Zt=tt.hits.slice(0,Math.max(0,ae)).map(ha=>({...ha,snippet:St(ha.snippet).slice(0,400)}));return ae-=Zt.length,{...tt,target:void 0,hits:Zt,truncated:!tt.complete||tt.hits.length>Zt.length}});return I(`job ${W.id}: search over ${_e.length} sessions in ${ye.elapsed_ms} ms`),{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:gw,elapsed_ms:ye.elapsed_ms,sessions:_e.length,hits:Ls.totalHits-ae,results:Re})}}catch(ee){return I(`job ${W.id}: search failed: ${St(Ne(ee))}`),dn(502,"search_failed",ee,{job:W.id,site:l,now:n.now()})}finally{await $R(ne,{recursive:!0,force:!0})}}async function Qt(W,X){let V=(Re,tt)=>({status:Re,headers:{"content-type":"application/json"},body:JSON.stringify(tt)});if(!h)return{status:403,body:"new_session_disabled"};let K=X.name,le=X.root,_e=X.provider,ne=X.model;if(typeof K!="string"||!_w.test(K))return{status:400,body:"name_invalid"};if(typeof le!="string"||!_.includes(le))return{status:403,body:"root_not_allowed"};if(await fe(),!pe.some(Re=>Re.provider===_e&&Re.model===ne))return{status:400,body:"model_not_offered"};let ee=await jf(g);if(ee.filter(Re=>Date.parse(Re.created_at)>n.now()-36e5).length>=h)return{status:429,body:"new_session_cap"};let Ee=Ze(le,K),ye=Ze(Ee,`${K}.lmctl`);try{return await az(Ee),{status:409,body:"name_taken"}}catch{}try{await tc(le,{recursive:!0,mode:448}),await tc(Ee,{mode:448}),await Zl(ye,iL(K,_e,ne),{mode:384,flag:"wx"}),I(`job ${W.id}: new session ${ye} (${_e} ${ne})`),await n.lmctl(["seed",ye],{timeoutMs:18e4,env:x})}catch(Re){return I(`job ${W.id}: new session failed: ${St(Ne(Re))}`),dn(502,"new_session_failed",Re,{job:W.id,site:l,now:n.now()})}let ae={name:K,root:le,dir:Ee,teamfile:ye,alias:"Lead",provider:_e,model:ne,created_at:new Date(n.now()).toISOString()};return await jR(g,[...ee,ae]),await j(),Xt(),V(200,{schema:lw,teamfile:ye,path:ye,alias:"Lead",provider:_e,model:ne,created_at:ae.created_at})}async function Uc(W,X){let V=await jf(g),K=V.find(ne=>ne.name===X.name&&ne.root===X.root&&!ne.archived_at);if(!K)return{status:404,body:"not_created_here"};await j();let le=ec(N,K.teamfile,K.alias);if(le&&(le.busy||le.terminal_held))return{status:409,body:le.terminal_held?"session_terminal_held":"session_busy"};let _e=Ze(K.root,".archived",`${K.name}-${new Date(n.now()).toISOString().replace(/[:.]/g,"-")}`);try{await tc(Ze(K.root,".archived"),{recursive:!0,mode:448}),await BR(K.dir,_e)}catch(ne){return I(`job ${W.id}: archive failed: ${St(Ne(ne))}`),dn(502,"archive_failed",ne,{job:W.id,site:l,now:n.now()})}return K.archived_at=new Date(n.now()).toISOString(),K.archived_to=_e,await jR(g,V),I(`job ${W.id}: archived ${K.teamfile} -> ${_e}`),{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:lw,archived:!0,teamfile:K.teamfile,archived_at:K.archived_at})}}let gr=new Set,fa=encodeURIComponent(k),ma=0,pa=0;for(;!n.signal?.aborted;){if(n.now()-ma>=m*1e3){if(ma=n.now(),await j(),await Xt(),z(i,"--once"))break}else qe&&n.now()-pa>=qe*1e3&&(pa=n.now(),await j(),Gr()!==ut&&await Xt(!1,!0)&&(ma=n.now()));if(gr.size>=4){await b.call("GET",`/v1/rpc/${fa}/next?capacity=0`).catch(()=>{}),await Promise.race([...gr,n.sleep(2e4,n.signal)]);continue}let W=null,X=n.now();try{let K=await b.call("GET",`/v1/rpc/${fa}/next?wait_s=${Math.min(20,m,qe||20)}`);W=K.status===200?K.json:null,!W&&n.now()-X<500&&await n.sleep(1e3,n.signal)}catch(K){if(n.signal?.aborted)break;I(`relay poll failed: ${Ne(K)}`),await n.sleep(2e3,n.signal);continue}if(!W?.id)continue;let V=(async()=>{let K=await H(W);await b.call("POST",`/v1/rpc/${fa}/${encodeURIComponent(W.id)}/response`,K,!1).catch(le=>I(`job ${W.id}: respond failed: ${Ne(le)}`))})();gr.add(V),V.finally(()=>gr.delete(V))}return await Promise.allSettled([...gr]),await Xt(!0),I("stopped"),0}async function vw(t,e,n,r=!1){let s=de(t,["--org","--stalled-min"],["--json","--all","--attention"]);if(s.error||s.positionals.length)return O(e,s.error??Te);let o=F(s,"--org");if(o!==void 0&&!Cs.test(o))return O(e,"lmctl site attention: --org must be an organization id (lmctl site orgs)");let i=F(s,"--stalled-min");if(i!==void 0&&!(/^\d+$/.test(i)&&Number(i)>=1&&Number(i)<=1440))return O(e,"lmctl site attention: --stalled-min must be 1-1440 minutes");let a=cr(e,n);if(!a)return O(e,dr);let l;try{l=(await a.call("GET",`/api/sessions${i?`?stalled_min=${i}`:""}`,void 0,!0,o?{"x-lmctl-org":o}:{})).json}catch(p){return O(e,`lmctl site attention: ${Ne(p)}`)}let c=(l.targets??[]).filter(p=>p.attention),u=r||z(s,"--all")?c:c.filter(p=>p.attention.needs),f=c.filter(p=>p.attention.needs).length;if(z(s,"--json"))return Y(e,{attention:f,sessions:u}),0;let m=new Set(c.map(p=>p.siteid)).size;e.stdout.write(`${f?`${f} session${f===1?" needs":"s need"} attention`:"nothing needs attention"} (${c.length} session${c.length===1?"":"s"} on ${m} site${m===1?"":"s"})
|
|
2276
|
+
`);try{await b.call("POST","/v1/mailboxes",{name:k,...u?{org:u}:{}})}catch(W){return W instanceof Hn&&W.code==="name_taken"?O(e,`lmctl site serve: the name ${l} is taken by another account or organization; choose another --name`):W instanceof Hn&&W.code==="org_not_found"?O(e,`lmctl site serve: you are not an owner of organization ${u}`):O(e,`lmctl site serve: cannot create the relay mailbox: ${Ne(W)}`)}I(`serving ${b.base} for ${u?`organization ${u}`:"your personal organization"} (relay mailbox ${k}); sessions: lmctl running --json --since ${f}; offered: ${c.length&&!d?`only ${c.map(W=>W.alias?`${W.teamfile}:${W.alias}`:W.teamfile).join(", ")}`:"every session"} (prompted only while lmctl says can_prompt)`);let N=[],A=ZR(a),S={...A,LMCTL_READ_ONLY:"1"},x={...A};delete x.LMCTL_READ_ONLY;let R=3e4,L=new Map,D=new Map,M=(W,X,V)=>{D.get(W)!==X&&(D.set(W,X),I(`tmux: ${V}`))},P=null;function j(){return P||(P=$().finally(()=>{P=null})),P}async function $(){let W=N;try{let V=await n.lmctl(["running","--json","--since",f],{timeoutMs:3e4,env:S});W=fw(JSON.parse(V),c,d,n.now())}catch(V){I(`lmctl running failed: ${Ne(V)}`),W=[...N]}if(h)for(let V of await jf(g))V.archived_at||W.some(K=>K.teamfile===V.teamfile&&K.alias===V.alias)||W.push({target:`${V.teamfile}:${V.alias}`,teamfile:V.teamfile,alias:V.alias,state:"unknown",idle_seconds:null,model:V.model,allowed:!0,id:`${V.teamfile}#${V.alias}`,busy:!1,terminal_held:!1,can_prompt:!0,cannot_prompt_reason:null});let X=W.filter(V=>V.terminal_held===!0);for(let V of[...L.keys()])X.some(K=>`${K.teamfile}:${K.alias}`===V)||(L.delete(V),D.delete(V));if(X.length){let V=await Ff(T),K=new Map,le=V.error?`tmux did not answer (${V.error})`:"no tmux pane runs its lmctl terminal";if(!V.error)try{K=await Uf(X.map(ne=>({teamfile:ne.teamfile,alias:ne.alias})),V.panes,v)}catch(ne){le=`the association failed (${Ne(ne)})`}let _e=n.now();for(let ne of X){let ee=`${ne.teamfile}:${ne.alias}`,Ee=`${Bi(ne.teamfile)}:${ne.alias}`,ye=K.get(ee);if(ye?.length){let ae=ye.map(({pid:Re,...tt})=>tt);ne.tmux={panes:ae},L.set(ee,{panes:ae,at:_e}),M(ee,`found ${ae.map(Re=>Re.target).join(",")}`,`${Ee} is in ${ae.map(Re=>Re.target).join(", ")}`)}else{let ae=L.get(ee);ae&&_e-ae.at<=R?(ne.tmux={panes:ae.panes,stale:!0,checked_at:new Date(ae.at).toISOString()},M(ee,"stale",`${Ee}: pane not found now (${le}); keeping ${ae.panes[0].target} from ${Math.round((_e-ae.at)/1e3)} s ago`)):(ne.tmux=null,M(ee,"missing",`${Ee}: no pane (${le})`))}}}N=W}let pe=[],G=0;async function fe(){if(!(!h||n.now()-G<36e5)){G=n.now();try{pe=mw(JSON.parse(await n.lmctl(["models","--json"],{timeoutMs:6e4,env:S})),a.LMCTL_ENABLE_MOCK_PROVIDER==="1")}catch(W){pe=a.LMCTL_ENABLE_MOCK_PROVIDER==="1"?mw(null,!0):[],I(`lmctl models failed: ${Ne(W)}`)}}}async function ve(){if(!h)return;await fe();let W=n.now()-36e5,X=(await jf(g)).filter(V=>Date.parse(V.created_at)>W).length;return{roots:_,models:pe,cap_per_hour:h,created_last_hour:X}}let qe=0,ut="",Gr=()=>JSON.stringify(N.filter(W=>W.allowed).map(W=>[W.target,W.busy===!0,W.terminal_held===!0,W.can_prompt!==!1]).sort());async function Xt(W=!1,X=!1,V=!1){let K={schema:sc,host:dz(),stopped:W,sessions:W?[]:N},le=W?void 0:await ve(),_e=Gr();for(let ne=0;ne<2;ne++)try{let Ee=(await b.call("POST","/api/running/report",{device_id:l,...u?{org:u}:{},payload:K,targets:W?[]:QR(N),...le?{new_session:le}:{},...w&&!W?{shell:{enabled:!0,home:p}}:{},...X?{state_change:!0}:{}},!W)).json?.quick_check_s,ye=typeof Ee=="number"&&Number.isInteger(Ee)&&Ee>=2&&Ee<=60?Ee:0;return ye!==qe&&I(ye?`a queued prompt waits here: checking sessions every ${ye} s`:"no queued prompt waits here: back to the report interval"),qe=ye,ut=_e,!0}catch(ee){if(X&&V&&ne===0&&ee instanceof Hn&&ee.status===429){if(await n.sleep(3500,n.signal),n.signal?.aborted)return!1;continue}if(X&&ee instanceof Hn&&ee.status===429)return!1;if(ne===0&&ee instanceof Hn&&ee.status===429){if(await n.sleep(21e3,W?void 0:n.signal),!W&&n.signal?.aborted)return!1;continue}return I(`report failed: ${Ne(ee)}`),!1}return!1}async function H(W){let X=W.request??{};if(X.op==="new_session")return Qt(W,X);if(X.op==="search")return We(W,X);if(X.op==="shell")return J(W,X);if(X.op==="tmux_send")return Ae(W,X);if(X.op==="report_now"){await j();let re=await Xt(!1,!0,!0);return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:"lmctl-site-report/1",reported:re,quick_check_s:qe})}}if(X.op==="archive_session")return Uc(W,X);let V,K,le,_e,ne,ee,Ee;if(typeof X.op=="string")({op:V,teamfile:K,alias:le,text:_e,lines:ne}=X),ee=X.since,Ee=X.tools,typeof X.path=="string"&&X.path.startsWith("/")&&(K=X.path);else if(X.method==="POST"&&X.path==="/prompt"){let re={};try{re=typeof X.body=="string"?JSON.parse(X.body):X.body??{}}catch{return{status:400,body:"invalid_body"}}V="prompt";let Me=typeof re.target=="string"?qi(re.target):null;K=Me?.teamfile,le=Me?.alias,_e=re.text}else if(X.method==="POST"&&X.path==="/tail"){let re={};try{re=typeof X.body=="string"?JSON.parse(X.body):X.body??{}}catch{return{status:400,body:"invalid_body"}}V="tail";let Me=typeof re.target=="string"?qi(re.target):null;K=Me?.teamfile,le=Me?.alias,ne=re.lines,ee=re.since,Ee=re.tools}else return X.method==="GET"&&X.path==="/sessions"?{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:sc,sessions:N})}:{status:400,body:"invalid_op"};if(V!=="prompt"&&V!=="idle"&&V!=="tail"&&V!=="live_tail")return{status:400,body:"invalid_op"};let ye=(re,Me,Ke)=>dn(re,Me,Ke,{job:W.id,site:l,now:n.now()});if(typeof K!="string"||typeof le!="string"||!Gf.test(le))return{status:403,body:"target_not_allowed"};await j();let ae=ec(N,K,le);if(!ae)return{status:403,body:"target_not_allowed"};let Re=()=>{let re=ec(N,ae.teamfile,ae.alias)??ae;return{state:re.state,idle_seconds:re.state==="idle"?re.idle_seconds:null,busy:re.busy===!0,terminal_held:re.terminal_held===!0,can_prompt:Wf(re)===null,cannot_prompt_reason:Wf(re)?re.terminal_held?"terminal-held":re.busy?"busy":re.cannot_prompt_reason??"unavailable-target":null}};if(V==="idle")return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify(Re())};if(V==="live_tail"){let re=X.after;if(re!=null&&(typeof re!="string"||!/^c1\.[0-9a-z.]{1,60}$/.test(re)))return{status:400,body:"after_invalid"};let Me=ne===void 0?Hi:Number(ne);if(!Number.isSafeInteger(Me)||Me<1||Me>Hi)return{status:400,body:"lines_invalid"};try{let Ke=["tail",ae.teamfile,ae.alias,"--lines",String(Me),"--tools","--json",...re?["--after",re]:[]],Rn=await n.lmctl(Ke,{timeoutMs:2e4,env:S});return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({...nL(ae.target,JSON.parse(Rn)),session:Re()})}}catch(Ke){let Rn=Ne(Ke);return I(`job ${W.id}: live tail failed: ${St(Rn)}`),/session not found/i.test(Rn)?ye(404,"transcript_not_found",Ke):/timed out/i.test(Rn)?ye(504,"tail_timeout",Ke):ye(502,"tail_failed",Ke)}}if(V==="tail"){let re=ne===void 0?qR:Number(ne);if(!Number.isSafeInteger(re)||re<1||re>Hi)return{status:400,body:"lines_invalid"};let Me=Ew(ee);if(Me==="invalid")return{status:400,body:"since_invalid"};if(Ee!==void 0&&typeof Ee!="boolean")return{status:400,body:"tools_invalid"};try{let Ke=["tail",ae.teamfile,ae.alias,"--lines",String(Me?Hi:re),...Me?["--since",Me.ts]:[],...Ee===!1?[]:["--tools"],"--json"],Rn=await n.lmctl(Ke,{timeoutMs:3e4,env:S}),Vm=tL(ae.target,JSON.parse(Rn)),NT=rL(Vm.messages,Me);return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({...Vm,messages:NT,truncated:Me?!1:Vm.truncated,next_cursor:sL(NT,Me),session:Re()})}}catch(Ke){let Rn=Ne(Ke);return I(`job ${W.id}: tail failed: ${St(Rn)}`),/session not found/i.test(Rn)?ye(404,"transcript_not_found",Ke):/timed out/i.test(Rn)?ye(504,"tail_timeout",Ke):ye(502,"tail_failed",Ke)}}if(typeof _e!="string"||!_e.length||_e.includes("\0")||Buffer.byteLength(_e)>Io)return{status:400,body:"text_invalid"};let tt=Wf(ae);if(tt)return I(`job ${W.id}: refused ${ae.target}: ${tt.body}`),{...tt,measured:Re()};let Zt=Number(X.timeout_s),ha=Math.min(Number.isFinite(Zt)&&Zt>0?Zt*1e3:dw*1e3,dw*1e3),Fc=await MR(Ze(PR(),"lmctl-site-prompt-"));try{let re=Ze(Fc,"prompt");await Zl(re,_e,{mode:384,flag:"wx"}),I(`job ${W.id}: prompt ${ae.target}`);let Me=await n.lmctl(["prompt",ae.teamfile,ae.alias,"--prompt-file",re,"--json"],{timeoutMs:ha,env:x});await j(),Xt();let Ke=Buffer.from(Me);return{status:200,headers:{"content-type":"application/x-ndjson"},body:Ke.subarray(Math.max(0,Ke.length-cw)).toString(),measured:Re()}}catch(re){return I(`job ${W.id}: prompt failed: ${St(Ne(re))}`),await j(),{...ye(502,"execution_failed",re),measured:Re()}}finally{await $R(Fc,{recursive:!0,force:!0})}}async function J(W,X){if(!w)return{status:403,body:"shell_not_enabled"};let V=X.command,K=X.cwd,le=X.timeout_s??nc.defaultTimeoutS;if(typeof V!="string"||!V.trim()||V.includes("\0")||Buffer.byteLength(V)>nc.commandBytes)return{status:400,body:"command_invalid"};if(typeof K!="string"||!K.startsWith("/")||K.includes("\0")||K.length>1024)return{status:400,body:"cwd_invalid"};if(!Number.isSafeInteger(le)||le<1||le>nc.maxTimeoutS)return{status:400,body:"timeout_invalid"};let _e={job:W.id,site:l,now:n.now()};try{if(!(await cz(K)).isDirectory())throw new Error("not a directory")}catch{return dn(400,"cwd_not_found",new Error(`the working directory ${K} does not exist on this machine or is not a directory`),_e)}if(E)return{status:409,body:"shell_busy"};E=!0;let ne=X.by&&typeof X.by=="object"?X.by:{};try{I(`job ${W.id}: shell in ${K} (${Buffer.byteLength(V)} bytes, timeout ${le} s)`);let ee=await YR(V,K,le*1e3,x);return await uw(y,{at:new Date(n.now()).toISOString(),job_id:W.id,run_id:typeof ne.run_id=="string"?ne.run_id:null,user:typeof ne.user=="string"?ne.user:null,org:typeof ne.org=="string"?ne.org:null,site:l,cwd:K,command:aw(V),exit_code:ee.exit_code,signal:ee.signal,timed_out:ee.timed_out,duration_ms:ee.duration_ms,stdout_bytes:ee.stdout_bytes,stderr_bytes:ee.stderr_bytes,...ee.spawn_error?{spawn_error:ee.spawn_error}:{}}).catch(Ee=>I(`shell audit write failed: ${Ne(Ee)}`)),ee.spawn_error?dn(502,"shell_failed",new Error(ee.spawn_error),_e):{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:mz,...ee,cwd:K,stdout:aw(ee.stdout),stderr:aw(ee.stderr)})}}finally{E=!1}}async function Ae(W,X){if(!w)return{status:403,body:"shell_not_enabled"};let V={job:W.id,site:l,now:n.now()},K=X.text,le=X.pane,_e=typeof X.path=="string"?X.path:X.teamfile,ne=X.alias;if(typeof _e!="string"||typeof ne!="string")return{status:400,body:"target_invalid"};if(le!=null&&(typeof le!="string"||!/^[^:\s]{1,128}:\d{1,4}\.\d{1,4}$/.test(le)))return{status:400,body:"pane_invalid"};if(typeof K!="string"||!K.length||K.includes("\0")||Buffer.byteLength(K)>Ql.textBytes)return{status:400,body:"text_invalid"};await j();let ee=ec(N,_e,ne);if(!ee)return{status:404,body:"unknown_target"};if(ee.terminal_held!==!0)return dn(409,"not_terminal_held",new Error(`${Bi(ee.teamfile)}:${ee.alias} is not held by a terminal now; send it as a session prompt instead`),V);let Ee=X.by&&typeof X.by=="object"?X.by:{},ye=async(ae,Re=le)=>uw(y,{at:new Date(n.now()).toISOString(),op:"tmux_send",job_id:W.id,run_id:typeof Ee.run_id=="string"?Ee.run_id:null,user:typeof Ee.user=="string"?Ee.user:null,org:typeof Ee.org=="string"?Ee.org:null,target:`${ee.teamfile}:${ee.alias}`,pane:Re??null,bytes:Buffer.byteLength(K),sha256:uz("sha256").update(K).digest("hex"),result:ae});try{let ae={teamfile:ee.teamfile,alias:ee.alias},Re=`${Bi(ee.teamfile)}:${ee.alias}`,tt=typeof le=="string"?le:null;if(!tt){let re=await Ff(T);if(re.error)return await ye("tmux_unavailable","-"),dn(503,"tmux_unavailable",new Error(`tmux did not answer (${re.error}); try again`),V);if(tt=(await Uf([ae],re.panes,v)).get(`${ae.teamfile}:${ae.alias}`)?.[0]?.target??null,!tt){let Me=await CR(ae,v),Ke=Me?"terminal_not_in_tmux":"pane_not_found";return await ye(Ke,"-"),dn(409,Ke,new Error(Me?`the lmctl terminal holding ${Re} runs outside tmux (pid ${Me}), so nothing can be typed into it from here`:`no tmux pane runs lmctl terminal for ${Re} now`),V)}}let Zt=await OR(T,v,ae,tt,K);if(!Zt.ok)return await ye(Zt.code,tt),dn(409,Zt.code,new Error(Zt.message),V);await ye("sent",tt),I(`job ${W.id}: typed ${Buffer.byteLength(K)} bytes into tmux ${tt}`);let{pid:ha,...Fc}=Zt.place;return{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:"lmctl-site-tmux/1",sent:!0,pane:Fc,bytes:Buffer.byteLength(K)})}}catch(ae){return await ye("failed"),dn(502,"tmux_failed",ae,V)}}async function We(W,X){let V=X.text,K=X.since??"24h";if(typeof V!="string"||V.trim().length<2||Buffer.byteLength(V)>200||V.includes("\0"))return{status:400,body:"text_invalid"};if(!["24h","7d","all"].includes(K))return{status:400,body:"since_invalid"};let le=[];try{le=fw(JSON.parse(await n.lmctl(["running","--json","--since",K==="all"?"30d":K],{timeoutMs:3e4,env:S})),c,d,n.now())}catch(ee){return I(`job ${W.id}: search: lmctl running failed: ${St(Ne(ee))}`),dn(502,"search_failed",ee,{job:W.id,site:l,now:n.now()})}let _e=le.filter(ee=>ee.allowed).map(ee=>({teamfile:ee.teamfile,alias:ee.alias})),ne=await MR(Ze(PR(),"lmctl-site-search-"));try{await Zl(Ze(ne,"targets.json"),JSON.stringify(_e),{mode:384}),await Zl(Ze(ne,"text"),V,{mode:384});let ee=K==="all"?void 0:new Date(n.now()-(K==="7d"?7*864e5:864e5)).toISOString(),Ee=await n.lmctl(["site","search-local","--targets-file",Ze(ne,"targets.json"),"--text-file",Ze(ne,"text"),...ee?["--since",ee]:[]],{timeoutMs:Ls.totalMs+15e3,env:S}),ye=JSON.parse(Ee),ae=Ls.totalHits,Re=ye.results.map(tt=>{let Zt=tt.hits.slice(0,Math.max(0,ae)).map(ha=>({...ha,snippet:St(ha.snippet).slice(0,400)}));return ae-=Zt.length,{...tt,target:void 0,hits:Zt,truncated:!tt.complete||tt.hits.length>Zt.length}});return I(`job ${W.id}: search over ${_e.length} sessions in ${ye.elapsed_ms} ms`),{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:gw,elapsed_ms:ye.elapsed_ms,sessions:_e.length,hits:Ls.totalHits-ae,results:Re})}}catch(ee){return I(`job ${W.id}: search failed: ${St(Ne(ee))}`),dn(502,"search_failed",ee,{job:W.id,site:l,now:n.now()})}finally{await $R(ne,{recursive:!0,force:!0})}}async function Qt(W,X){let V=(Re,tt)=>({status:Re,headers:{"content-type":"application/json"},body:JSON.stringify(tt)});if(!h)return{status:403,body:"new_session_disabled"};let K=X.name,le=X.root,_e=X.provider,ne=X.model;if(typeof K!="string"||!_w.test(K))return{status:400,body:"name_invalid"};if(typeof le!="string"||!_.includes(le))return{status:403,body:"root_not_allowed"};if(await fe(),!pe.some(Re=>Re.provider===_e&&Re.model===ne))return{status:400,body:"model_not_offered"};let ee=await jf(g);if(ee.filter(Re=>Date.parse(Re.created_at)>n.now()-36e5).length>=h)return{status:429,body:"new_session_cap"};let Ee=Ze(le,K),ye=Ze(Ee,`${K}.lmctl`);try{return await az(Ee),{status:409,body:"name_taken"}}catch{}try{await tc(le,{recursive:!0,mode:448}),await tc(Ee,{mode:448}),await Zl(ye,iL(K,_e,ne),{mode:384,flag:"wx"}),I(`job ${W.id}: new session ${ye} (${_e} ${ne})`),await n.lmctl(["seed",ye],{timeoutMs:18e4,env:x})}catch(Re){return I(`job ${W.id}: new session failed: ${St(Ne(Re))}`),dn(502,"new_session_failed",Re,{job:W.id,site:l,now:n.now()})}let ae={name:K,root:le,dir:Ee,teamfile:ye,alias:"Lead",provider:_e,model:ne,created_at:new Date(n.now()).toISOString()};return await jR(g,[...ee,ae]),await j(),Xt(),V(200,{schema:lw,teamfile:ye,path:ye,alias:"Lead",provider:_e,model:ne,created_at:ae.created_at})}async function Uc(W,X){let V=await jf(g),K=V.find(ne=>ne.name===X.name&&ne.root===X.root&&!ne.archived_at);if(!K)return{status:404,body:"not_created_here"};await j();let le=ec(N,K.teamfile,K.alias);if(le&&(le.busy||le.terminal_held))return{status:409,body:le.terminal_held?"session_terminal_held":"session_busy"};let _e=Ze(K.root,".archived",`${K.name}-${new Date(n.now()).toISOString().replace(/[:.]/g,"-")}`);try{await tc(Ze(K.root,".archived"),{recursive:!0,mode:448}),await BR(K.dir,_e)}catch(ne){return I(`job ${W.id}: archive failed: ${St(Ne(ne))}`),dn(502,"archive_failed",ne,{job:W.id,site:l,now:n.now()})}return K.archived_at=new Date(n.now()).toISOString(),K.archived_to=_e,await jR(g,V),I(`job ${W.id}: archived ${K.teamfile} -> ${_e}`),{status:200,headers:{"content-type":"application/json"},body:JSON.stringify({schema:lw,archived:!0,teamfile:K.teamfile,archived_at:K.archived_at})}}let gr=new Set,fa=encodeURIComponent(k),ma=0,pa=0;for(;!n.signal?.aborted;){if(n.now()-ma>=m*1e3){if(ma=n.now(),await j(),await Xt(),z(i,"--once"))break}else qe&&n.now()-pa>=qe*1e3&&(pa=n.now(),await j(),Gr()!==ut&&await Xt(!1,!0)&&(ma=n.now()));if(gr.size>=4){await b.call("GET",`/v1/rpc/${fa}/next?capacity=0`).catch(()=>{}),await Promise.race([...gr,n.sleep(2e4,n.signal)]);continue}let W=null,X=n.now();try{let K=await b.call("GET",`/v1/rpc/${fa}/next?wait_s=${Math.min(20,m,qe||20)}`);W=K.status===200?K.json:null,!W&&n.now()-X<500&&await n.sleep(1e3,n.signal)}catch(K){if(n.signal?.aborted)break;I(`relay poll failed: ${Ne(K)}`),await n.sleep(2e3,n.signal);continue}if(!W?.id)continue;let V=(async()=>{let K=await H(W);await b.call("POST",`/v1/rpc/${fa}/${encodeURIComponent(W.id)}/response`,K,!1).catch(le=>I(`job ${W.id}: respond failed: ${Ne(le)}`))})();gr.add(V),V.finally(()=>gr.delete(V))}return await Promise.allSettled([...gr]),await Xt(!0),I("stopped"),0}async function vw(t,e,n,r=!1){let s=de(t,["--org","--stalled-min"],["--json","--all","--attention"]);if(s.error||s.positionals.length)return O(e,s.error??Te);let o=F(s,"--org");if(o!==void 0&&!Cs.test(o))return O(e,"lmctl site attention: --org must be an organization id (lmctl site orgs)");let i=F(s,"--stalled-min");if(i!==void 0&&!(/^\d+$/.test(i)&&Number(i)>=1&&Number(i)<=1440))return O(e,"lmctl site attention: --stalled-min must be 1-1440 minutes");let a=cr(e,n);if(!a)return O(e,dr);let l;try{l=(await a.call("GET",`/api/sessions${i?`?stalled_min=${i}`:""}`,void 0,!0,o?{"x-lmctl-org":o}:{})).json}catch(p){return O(e,`lmctl site attention: ${Ne(p)}`)}let c=(l.targets??[]).filter(p=>p.attention),u=r||z(s,"--all")?c:c.filter(p=>p.attention.needs),f=c.filter(p=>p.attention.needs).length;if(z(s,"--json"))return Y(e,{attention:f,sessions:u}),0;let m=new Set(c.map(p=>p.siteid)).size;e.stdout.write(`${f?`${f} session${f===1?" needs":"s need"} attention`:"nothing needs attention"} (${c.length} session${c.length===1?"":"s"} on ${m} site${m===1?"":"s"})
|
|
2274
2277
|
`);for(let p of u)e.stdout.write(`${p.attention.state.toUpperCase().padEnd(8)} ${p.siteid} ${p.path??p.teamfile}:${p.alias} ${p.attention.reason}
|
|
2275
2278
|
`);return 0}async function aL(t,e,n){if(t.includes("--attention"))return vw(t,e,n,!0);let r=de(t,["--org"],["--json"]);if(r.error||r.positionals.length)return O(e,r.error??Te);let s=F(r,"--org");if(s!==void 0&&!Cs.test(s))return O(e,"lmctl site list: --org must be an organization id (lmctl site orgs)");let o=cr(e,n);if(!o)return O(e,dr);let i;try{i=(await o.call("GET",`/api/running/me${s?`?org=${encodeURIComponent(s)}`:""}`)).json?.devices??[]}catch(l){return O(e,`lmctl site list: ${Ne(l)}`)}let a=i.filter(l=>l.payload?.schema===sc&&!l.payload.stopped).map(l=>({site:String(l.device_id),reported_at:typeof l.reported_at=="string"?l.reported_at:null,host:String(l.payload.host??""),sessions:l.payload.sessions??[]})).sort((l,c)=>l.site.localeCompare(c.site));if(z(r,"--json"))return Y(e,{schema:sc,sites:a}),0;if(!a.length)return e.stdout.write(`no sites reported in the last 5 minutes (start one with: lmctl site serve --name NAME)
|
|
2276
2279
|
`),0;for(let l of a){let c=l.reported_at?Math.max(0,Math.round((n.now()-Date.parse(l.reported_at))/1e3)):null;e.stdout.write(`${l.site} (host ${l.host||"?"}, reported ${c===null?"?":`${c}s ago`}, ${l.sessions.length} session${l.sessions.length===1?"":"s"})
|
|
@@ -2330,7 +2333,7 @@ ${Te}`);let[s,...o]=r.positionals;if(s===void 0||o.length)return O(e,Te);if(s.tr
|
|
|
2330
2333
|
`)}return p.state==="failed"?1:0}catch(f){return O(e,`lmctl site search: ${Ne(f)}`)}}async function yz(t,e,n=_L()){let[r,...s]=t;if(!r||r==="--help"||r==="-h"||r==="help")return e.stdout.write(`${Te}
|
|
2331
2334
|
`),r?0:2;if(s.includes("--help")||s.includes("-h"))return e.stdout.write(`${Te}
|
|
2332
2335
|
`),0;switch(r){case"serve":return Tw(s,e,n);case"list":return aL(s,e,n);case"prompt":return cL(s,e,n);case"remove":return fL(s,e,n);case"orgs":return uL(s,e,n);case"tail":return dL(s,e,n);case"schedule":return gL(s,e,n);case"attention":return vw(s,e,n);case"new-session":case"sessions-created":case"archive-session":return yL(r,s,e,n);case"search-local":return oL(s,e);case"search":return wL(s,e,n);case"enable":return pL(s,e);case"disable":return hL(s,e);case"status":return Kf(s,e);default:return O(e,`lmctl site: unknown subcommand ${r}
|
|
2333
|
-
${Te}`)}}var sc,Ur,Gf,Cs,Io,_w,lw,fz,gw,Ls,cw,XR,qR,Hi,Hf,GR,Jf,dw,Te,Hn,dr,KR,oc,Bf,mz,nc,aw,UR,FR,
|
|
2336
|
+
${Te}`)}}var sc,Ur,Gf,Cs,Io,_w,lw,fz,gw,Ls,cw,XR,qR,Hi,Hf,GR,Jf,dw,Te,Hn,dr,KR,oc,Bf,mz,nc,aw,UR,FR,An,bo,pz,eL,gz,Gi=C(()=>{"use strict";he();Nt();Tt();Fn();DR();sc="lmctl-site/1",Ur=/^[A-Za-z0-9][A-Za-z0-9._-]{0,52}$/,Gf=/^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$/,Cs=/^[A-Za-z0-9_-]{1,128}$/,Io=8192,_w=/^[a-z0-9][a-z0-9-]{1,39}$/,lw="lmctl-site-new-session/1",fz=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,79}$/,gw="lmctl-site-search/1",Ls={perSessionBytes:8*1024*1024,perSessionMs:3e3,totalMs:25e3,hitsPerSession:5,totalHits:100},cw=256*1024,XR=100,qR=20,Hi=50,Hf=4e3,GR=64*1024,Jf="lmctl-site-tail/1",dw=3*3600,Te=`usage: lmctl site serve --name NAME [--org ORG] [--since 24h] [--allow TEAMFILE[:ALIAS]]... [--interval SECONDS]
|
|
2334
2337
|
[--new-session-root DIR]... [--new-session-cap N] [--allow-shell]
|
|
2335
2338
|
lmctl site list [--org ORG] [--json] [--attention]
|
|
2336
2339
|
lmctl site attention [--all] [--stalled-min N] [--org ORG] [--json]
|
|
@@ -2379,7 +2382,7 @@ ${Te}`)}}var sc,Ur,Gf,Cs,Io,_w,lw,fz,gw,Ls,cw,XR,qR,Hi,Hf,GR,Jf,dw,Te,Hn,dr,KR,o
|
|
|
2379
2382
|
disable stop running the site agent in the daemon from its next start; status shows the stored settings
|
|
2380
2383
|
|
|
2381
2384
|
Server: LMCTL_SITE_API_URL (default https://lmctl.ai). Identity: LMCTL_APPKEY, LMCTL_APPKEY_FILE or
|
|
2382
|
-
$XDG_CONFIG_HOME/lmctl/appkey.json (same appkey as the lmctl.ai tools).`;Hn=class extends Error{status;code;constructor(e,n){super(`${e} ${n}`),this.status=e,this.code=n}};dr="lmctl site: no appkey found (set LMCTL_APPKEY or LMCTL_APPKEY_FILE, or put it in ~/.config/lmctl/appkey.json)";KR=8*1024,oc=class extends Error{run;constructor(e,n){super(e),this.run=n,this.name="LmctlRunError"}},Bf=(t,e=KR)=>{let n=Buffer.from(t);return n.length<=e?t:n.subarray(n.length-e).toString().replace(/^\uFFFD+/,"")};mz="lmctl-site-shell/1",nc={defaultTimeoutS:30,maxTimeoutS:120,outputBytes:64*1024,commandBytes:8192},aw=t=>t.replace(/lmk_[A-Za-z0-9_-]{8,}/g,"[redacted-appkey]").replace(/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,"[redacted-token]");UR=t=>typeof t=="string"&&!Number.isNaN(Date.parse(t))?t:null;FR=new Set(["queue-operation","file-history-snapshot","summary"]);
|
|
2385
|
+
$XDG_CONFIG_HOME/lmctl/appkey.json (same appkey as the lmctl.ai tools).`;Hn=class extends Error{status;code;constructor(e,n){super(`${e} ${n}`),this.status=e,this.code=n}};dr="lmctl site: no appkey found (set LMCTL_APPKEY or LMCTL_APPKEY_FILE, or put it in ~/.config/lmctl/appkey.json)";KR=8*1024,oc=class extends Error{run;constructor(e,n){super(e),this.run=n,this.name="LmctlRunError"}},Bf=(t,e=KR)=>{let n=Buffer.from(t);return n.length<=e?t:n.subarray(n.length-e).toString().replace(/^\uFFFD+/,"")};mz="lmctl-site-shell/1",nc={defaultTimeoutS:30,maxTimeoutS:120,outputBytes:64*1024,commandBytes:8192},aw=t=>t.replace(/lmk_[A-Za-z0-9_-]{8,}/g,"[redacted-appkey]").replace(/eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]*/g,"[redacted-token]");UR=t=>typeof t=="string"&&!Number.isNaN(Date.parse(t))?t:null;FR=new Set(["queue-operation","file-history-snapshot","summary"]);An=t=>typeof t=="number"&&Number.isFinite(t)&&t>=0?t:null,bo=(t,e=160)=>typeof t=="string"?t.slice(0,e):null,pz=new Set(["input","output","cache_read","cache_write","cache_write_5m","cache_write_1h","reasoning"]);eL=t=>{let e=t??null;return e&&(e.state==="per_response"||e.state==="unavailable")?{usage_coverage:{state:e.state,reason:bo(e.reason,300)}}:{}};gz=/^[a-f0-9]{24}$/});function Sw(t,e){let n=Number(t.pragma("busy_timeout",{simple:!0}));t.pragma("busy_timeout = 0");try{return e()}finally{t.pragma(`busy_timeout = ${n}`)}}function Ji(t,e){return t.prepare("SELECT 1 FROM on_demand_launches WHERE job_id = ?").get(e)!==void 0}function EL(t,e,n,r){if(t.prepare(`UPDATE on_demand_launches SET phase = 'dispatching', run_id = ?, updated_at = ?
|
|
2383
2386
|
WHERE conversation_id = ? AND generation = ? AND job_id = ? AND phase = 'reserved' AND receipt_path = ?`).run(n,new Date().toISOString(),r.conversationId,r.generation,e,r.receiptPath).changes!==1)throw new Error("On-demand generation no longer owns this dispatch")}function TL(t,e,n,r){return t.prepare(`SELECT 1 FROM on_demand_launches WHERE conversation_id = ? AND generation = ?
|
|
2384
2387
|
AND job_id = ? AND run_id = ? AND phase = 'dispatching'`).get(r.conversationId,r.generation,e,n)!==void 0}var bw=C(()=>{"use strict"});import{randomUUID as wz}from"node:crypto";function Vi(t){return typeof t=="number"&&Number.isFinite(t)&&Math.abs(t)<=864e13}function SL(t){if(t===null||typeof t!="object")return!1;let e=t;return typeof e.previous_tick_at=="string"&&Number.isFinite(Date.parse(e.previous_tick_at))&&typeof e.tick_at=="string"&&Number.isFinite(Date.parse(e.tick_at))&&Vi(e.gap_ms)&&Vi(e.interval_ms)&&e.interval_ms>0&&Vi(e.approx_missed_ticks)&&Vi(e.skipped_overlaps)&&typeof e.same_process=="boolean"&&Vi(e.pid)}function bL(t){let e=t.prepare("SELECT v FROM kv WHERE k = ?").get(vL);if(e===void 0)return null;try{let n=JSON.parse(e.v);return Vi(n.at_ms)&&typeof n.proc=="string"?{at_ms:n.at_ms,proc:n.proc,pid:typeof n.pid=="number"?n.pid:0}:null}catch{return null}}function IL(t,e,n,r=Tz,s=process.pid){let o=n.atMs??e;return t.transaction(()=>{let i=bL(t),a=null;if(i!==null&&o-i.at_ms>Ez*n.intervalMs&&o>i.at_ms){let l=o-i.at_ms;a={previous_tick_at:new Date(i.at_ms).toISOString(),tick_at:new Date(o).toISOString(),gap_ms:l,interval_ms:n.intervalMs,approx_missed_ticks:Math.max(0,Math.round(l/n.intervalMs)-1),skipped_overlaps:i.proc===r?n.skippedOverlaps:0,same_process:i.proc===r,pid:s},t.prepare("INSERT INTO events(ts, scan, team, status, note) VALUES (?, NULL, ?, ?, ?)").run(a.tick_at,Iw,kw,JSON.stringify(a))}return t.prepare("INSERT INTO kv(k, v) VALUES (?, ?) ON CONFLICT(k) DO UPDATE SET v = excluded.v").run(vL,JSON.stringify({at_ms:o,proc:r,pid:s})),a}).immediate()}function ac(t){let e=Math.round(t/6e4);return e<1?`${Math.round(t/1e3)}s`:e<120?`${e}m`:`${Math.floor(e/60)}h${String(e%60).padStart(2,"0")}m`}function zf(t){return`no cron evaluation for ${ac(t.gap_ms)} (every ${ac(t.interval_ms)}; about ${t.approx_missed_ticks} ticks missed), ${t.same_process?`same process pid ${t.pid}`:"a different process than the previous evaluation (restart)"}${t.same_process?`, ${t.skipped_overlaps} interval fires dropped while a tick was still running`:""}`}function kL(t,e=20){let n=t.prepare("SELECT note FROM events WHERE team = ? AND status = ? ORDER BY id DESC LIMIT ?").all(Iw,kw,e),r=[];for(let s of n)try{let o=JSON.parse(s.note??"");SL(o)&&r.push(o)}catch{}return r}function lc(t,e){let n=bL(t),r=new Date(e-24*36e5).toISOString(),s=t.prepare("SELECT note FROM events WHERE team = ? AND status = ? AND ts >= ? ORDER BY id DESC LIMIT 100000").all(Iw,kw,r),o=0,i=0;for(let a of s)try{let l=JSON.parse(a.note??"");if(!SL(l))continue;o+=1,i=Math.max(i,l.gap_ms)}catch{}return{last_tick_at:n===null?null:new Date(n.at_ms).toISOString(),last_tick_age_ms:n===null?null:Math.max(0,e-n.at_ms),gaps_24h:o,longest_gap_24h_ms:i}}var vL,Iw,kw,Ez,Tz,Aw=C(()=>{"use strict";vL="cron.last_tick",Iw="lmcron",kw="tick_gap",Ez=2,Tz=wz()});function Ce(){return`${new Date().toISOString().replace("Z","000Z")}`}function Fr(t,e){if(!t.trim())throw new ko("INVALID_ARGUMENT",`${e} must not be blank`);return t}var ko,Ao=C(()=>{"use strict";ko=class extends Error{code;exitCode;constructor(e,n,r=2){super(n),this.code=e,this.exitCode=r}}});var U,No=C(()=>{"use strict";U=class extends Error{code;exitCode;constructor(e,n,r=2){super(n),this.code=e,this.exitCode=r}}});function xw(t){let e;try{if(typeof t!="string")throw new Error("expected a cron expression string");let n=t.trim().split(/\s+/);if(n.length!==5)throw new Error("expected five fields: minute hour day-of-month month day-of-week");e="minute";let r=cc(n[0],0,59);e="hour";let s=cc(n[1],0,23);e="dayOfMonth";let o=cc(n[2],1,31);e="month";let i=cc(n[3],1,12);e="dayOfWeek";let a=cc(n[4],0,7,c=>c===7?0:c);return{ok:!0,schedule:{__brand:"CronSchedule",minute:r,hour:s,dayOfMonth:o,month:i,dayOfWeek:a}}}catch(n){let r=n instanceof Error?n.message:String(n);return{ok:!1,error:e?{message:r,field:e}:{message:r}}}}function cc(t,e,n,r=s=>s){if(t.length===0)throw new Error("empty field");let s=new Set;for(let o of t.split(",")){if(o.length===0)throw new Error(`invalid list in "${t}"`);let i=o.split("/");if(i.length>2)throw new Error(`invalid step in "${o}"`);let a=i[0],l=i[1]===void 0?1:Nw(i[1],1,n-e+1,o),c=a.split("-");if(c.length>2)throw new Error(`invalid range in "${o}"`);let d=a==="*"?e:Nw(c[0],e,n,o),u=a==="*"?n:c[1]!==void 0?Nw(c[1],e,n,o):i[1]?n:d;if(d>u)throw new Error(`range starts after it ends in "${o}"`);for(let f=d;f<=u;f+=l)s.add(r(f))}return{values:s,wildcard:t.split(",").some(o=>o.split("/")[0]==="*")}}function Nw(t,e,n,r){if(!/^\d+$/.test(t))throw new Error(`expected an integer in "${r}"`);let s=Number(t);if(!Number.isSafeInteger(s)||s<e||s>n)throw new Error(`value ${t} is outside ${e}-${n}`);return s}function vz(t,e){let n=t;if(!n.minute.values.has(e.getMinutes())||!n.hour.values.has(e.getHours())||!n.month.values.has(e.getMonth()+1))return!1;let r=n.dayOfMonth.values.has(e.getDate()),s=n.dayOfWeek.values.has(e.getDay());return n.dayOfMonth.wildcard?s:n.dayOfWeek.wildcard?r:r||s}function AL(t,e,n){let r=e.getTime(),s=n.getTime();if(s<r)throw new RangeError("untilInclusive must not precede sinceExclusive");for(let o=(Math.floor(r/6e4)+1)*6e4;o<=s;o+=6e4)if(vz(t,new Date(o)))return!0;return!1}var NL=C(()=>{"use strict"});import{spawn as Sz}from"node:child_process";import{closeSync as bz,existsSync as Iz,mkdirSync as kz,openSync as Az,readdirSync as Nz,unlinkSync as xz}from"node:fs";import{homedir as Rz}from"node:os";import{join as Yf}from"node:path";function Qf(){return process.env.LMBEE_CRON_LOG_DIR?process.env.LMBEE_CRON_LOG_DIR:Yf(Rz(),".lmbee","cron-logs")}function Oz(t,e){try{let n=Nz(t).sort();for(let r of n.slice(0,Math.max(0,n.length-e)))try{xz(Yf(t,r))}catch{}}catch{}}function Dz(t,e){return[...e.spawnPrefix??(e.systemdUnitName!==void 0?[...xL,"--unit",e.systemdUnitName,"--"]:[...xL,"--"]),"sh","-c",t]}function dc(t,e={}){let n=Yf(e.logDir??Qf(),String(t.id));Iz(n)||kz(n,{recursive:!0});let r=Yf(n,`${new Date().toISOString().replace(/[:.]/g,"-")}.log`),s=Az(r,"a"),o=Dz(t.action_payload,e),[i,...a]=o,l;try{l=Sz(i,a,{detached:!0,stdio:["ignore",s,s],...e.cwd!==void 0?{cwd:e.cwd}:{},...e.env!==void 0?{env:e.env}:{}})}finally{bz(s)}l.unref();let c=l.pid??null;if(c!==null)try{e.onSpawn?.(c)}catch{}let d=!1,u=e.timeoutMs===void 0?RL:e.timeoutMs,f=e.sigkillGraceMs??Cz,m=u===null?void 0:setTimeout(()=>{if(d)return;let _=l.pid;if(_!==void 0){try{process.kill(-_,"SIGTERM")}catch{}setTimeout(()=>{try{process.kill(-_,0)}catch{return}try{process.kill(-_,"SIGKILL")}catch{}},f).unref()}process.stderr.write(`[lmcron] job ${t.id} timed out after ${u}ms, sending SIGTERM
|
|
2385
2388
|
`)},u??RL);m?.unref();let p=(_,h)=>{d||(d=!0,m!==void 0&&clearTimeout(m),Oz(n,Lz),e.onExit?.(_,h,c,r))};l.on("error",_=>{process.stderr.write(`[lmcron] job ${t.id} spawn error: ${_.message}
|
|
@@ -2394,9 +2397,9 @@ $XDG_CONFIG_HOME/lmctl/appkey.json (same appkey as the lmctl.ai tools).`;Hn=clas
|
|
|
2394
2397
|
escalation_resolution_note = ?, updated_at = ? WHERE id = ? AND escalation_resolved_at IS NULL`).run(Ce(),o||"resolved",i||"operator",a||o||"resolved",Ce(),e),l=!0);let c=bt(t,e);if(c.reported_at===null&&(c.status==="pending"||c.status==="running")&&(t.prepare(`UPDATE cron_runs SET status = 'failed', summary = ?, finished_at = ?, updated_at = ?
|
|
2395
2398
|
WHERE id = ? AND status IN ${mc} AND reported_at IS NULL`).run(`reconciled by operator without a worker report: ${a||o||"execution confirmed stopped"}`.slice(0,xo),Ce(),Ce(),e),l=!0),!l)throw new U("INVALID_ARGUMENT",`Cron run ${e} has no fenced execution or unresolved escalation to resolve`);let d=Ce();return t.prepare("UPDATE cron_jobs SET last_checked_ts = ?, updated_at = ? WHERE id = ? AND (last_checked_ts IS NULL OR last_checked_ts < ?)").run(d,d,s.job_id,d),bt(t,e)});return un(()=>r.immediate())}function FL(t,e){if(!Number.isSafeInteger(e.limit)||e.limit<1||e.limit>1e4)throw new U("INVALID_ARGUMENT",`limit must be a positive integer <= ${1e4}`);return un(()=>{let n=["id > ?"],r=[e.after];e.jobId!==void 0&&(n.push("job_id = ?"),r.push(e.jobId)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status));let s=t.prepare(`SELECT * FROM cron_runs WHERE ${n.join(" AND ")} ORDER BY id LIMIT ?`).all(...r,e.limit+1),o=s.length>e.limit,i=o?s.slice(0,e.limit):s;return{rows:i,next_cursor:o?i[i.length-1].id:null}})}function Bz(t){if(t===null)return null;let e=Hz.exec(t);return e===null?null:Number(e[1])}function Xz(t){if(t===null)return null;let e=(t.split(`
|
|
2396
2399
|
`)[0]??"").replace(/[\u0000-\u001f\u007f-\u009f]/g," ").trim();return e.length>160?`${e.slice(0,157)}...`:e}function $w(t,e){let n=new Map;return un(()=>{let r=t.prepare("SELECT id, status, execution_state, started_at, finished_at, summary FROM cron_runs WHERE job_id = ? ORDER BY id DESC LIMIT ?"),s=t.prepare(`SELECT id, status, execution_state, pid, COALESCE(started_at, created_at) AS since FROM cron_runs
|
|
2397
|
-
WHERE job_id = ? AND execution_state != 'gone' ORDER BY id LIMIT 1`);for(let o of e){let i=r.all(o,Wz),a=i[0],l=s.get(o);n.set(o,{last_run:a===void 0?null:{id:a.id,status:a.status,execution_state:a.execution_state,started_at:a.started_at,finished_at:a.finished_at,exit_code:Bz(a.summary),summary:Xz(a.summary)},recent_runs:{window:i.length,succeeded:i.filter(c=>c.status==="succeeded").length,failed:i.filter(c=>c.status==="failed").length,escalated:i.filter(c=>c.status==="escalated").length,unfinished:i.filter(c=>c.status==="pending"||c.status==="running").length},holding_fence:l===void 0?null:{id:l.id,status:l.status,execution_state:l.execution_state,since:l.since,pid:l.pid}})}return n})}var xo,fc,Lw,Zf,Cw,Ow,mc,Pz,Wz,Hz,em=C(()=>{"use strict";Ao();Ao();No();xo=16*1024,fc=16*1024,Lw=512,Zf=100,Cw=4096,Ow=1024*1024,mc="('pending','running')",Pz="execution_state != 'gone' OR (status = 'escalated' AND escalation_resolved_at IS NULL)";Wz=20,Hz=/\bexit(?:ed)?(?: with)?(?: code)? (-?\d{1,4})\b/});import{spawn as Uw}from"node:child_process";import{fileURLToPath as qz}from"node:url";import{createHash as Gz}from"node:crypto";import{existsSync as Jz,mkdirSync as Vz,mkdtempSync as Kz,readFileSync as zz,renameSync as Yz,rmSync as Fw,writeFileSync as Hw}from"node:fs";import{homedir as Qz,tmpdir as Zz}from"node:os";import{isAbsolute as e6,join as wc,resolve as
|
|
2400
|
+
WHERE job_id = ? AND execution_state != 'gone' ORDER BY id LIMIT 1`);for(let o of e){let i=r.all(o,Wz),a=i[0],l=s.get(o);n.set(o,{last_run:a===void 0?null:{id:a.id,status:a.status,execution_state:a.execution_state,started_at:a.started_at,finished_at:a.finished_at,exit_code:Bz(a.summary),summary:Xz(a.summary)},recent_runs:{window:i.length,succeeded:i.filter(c=>c.status==="succeeded").length,failed:i.filter(c=>c.status==="failed").length,escalated:i.filter(c=>c.status==="escalated").length,unfinished:i.filter(c=>c.status==="pending"||c.status==="running").length},holding_fence:l===void 0?null:{id:l.id,status:l.status,execution_state:l.execution_state,since:l.since,pid:l.pid}})}return n})}var xo,fc,Lw,Zf,Cw,Ow,mc,Pz,Wz,Hz,em=C(()=>{"use strict";Ao();Ao();No();xo=16*1024,fc=16*1024,Lw=512,Zf=100,Cw=4096,Ow=1024*1024,mc="('pending','running')",Pz="execution_state != 'gone' OR (status = 'escalated' AND escalation_resolved_at IS NULL)";Wz=20,Hz=/\bexit(?:ed)?(?: with)?(?: code)? (-?\d{1,4})\b/});import{spawn as Uw}from"node:child_process";import{fileURLToPath as qz}from"node:url";import{createHash as Gz}from"node:crypto";import{existsSync as Jz,mkdirSync as Vz,mkdtempSync as Kz,readFileSync as zz,renameSync as Yz,rmSync as Fw,writeFileSync as Hw}from"node:fs";import{homedir as Qz,tmpdir as Zz}from"node:os";import{isAbsolute as e6,join as wc,resolve as Nn}from"node:path";function gc(){return{text:"",overflow:!1}}function yc(t,e){if(t.overflow)return;let n=t.text+e.toString("utf8");n.length>nm?(t.text=n.slice(0,nm),t.overflow=!0):t.text=n}function at(t){return t instanceof Error?t.message:String(t)}function a6(t,e,n){try{_c(t,e,n)}catch{}}function gt(t,e,n){try{return Qi(t,e,n),!0}catch(r){return process.stderr.write(`[lmcron] run ${e} completion could not be committed (fence retained): ${at(r)}
|
|
2398
2401
|
`),!1}}function fn(t,e,n,r){a6(t,e,n);try{PL(t,e,r)}catch(s){process.stderr.write(`[lmcron] run ${e} outcome could not be persisted (fence retained): ${at(s)}
|
|
2399
|
-
`)}}function jw(t,e,n){if(t===null)throw new Error(`${n}: disabling timeout is supported only for script workers`);let r=t??e;if(!Number.isFinite(r)||r<=0||r>jL)throw new Error(`${n} must be a positive number of milliseconds <= ${jL}`);return r}function rm(t){if(!WL.has(t))throw new U("INVALID_ARGUMENT",`provider "${t}" is not one of lmctl's supported providers (${[...WL].join(", ")})`);return t}function Bw(t){if(!l6.test(t))throw new U("INVALID_ARGUMENT",`model "${t}" is not a safe lmctl model token (no whitespace, quotes, '=' or control characters)`);return t}function Ec(t){if(!e6(t))throw new U("INVALID_ARGUMENT",`sessiondir "${t}" must be an absolute path`);if(/["\u0000-\u001f\u007f]/.test(t))throw new U("INVALID_ARGUMENT",`sessiondir contains a quote, newline, or control character that lmctl cannot represent: ${JSON.stringify(t)}`);return t}function c6(t){let e=["_MEMBER_",`alias=${t.alias}`,`provider=${rm(t.provider)}`];return t.model!==null&&t.model!==void 0&&e.push(`model=${Bw(t.model)}`),e.push(`sessiondir="${Ec(t.sessiondir)}"`),e.join(" ")}function d6(t){let e=t.name,n=e!==void 0&&e.length>0?
|
|
2402
|
+
`)}}function jw(t,e,n){if(t===null)throw new Error(`${n}: disabling timeout is supported only for script workers`);let r=t??e;if(!Number.isFinite(r)||r<=0||r>jL)throw new Error(`${n} must be a positive number of milliseconds <= ${jL}`);return r}function rm(t){if(!WL.has(t))throw new U("INVALID_ARGUMENT",`provider "${t}" is not one of lmctl's supported providers (${[...WL].join(", ")})`);return t}function Bw(t){if(!l6.test(t))throw new U("INVALID_ARGUMENT",`model "${t}" is not a safe lmctl model token (no whitespace, quotes, '=' or control characters)`);return t}function Ec(t){if(!e6(t))throw new U("INVALID_ARGUMENT",`sessiondir "${t}" must be an absolute path`);if(/["\u0000-\u001f\u007f]/.test(t))throw new U("INVALID_ARGUMENT",`sessiondir contains a quote, newline, or control character that lmctl cannot represent: ${JSON.stringify(t)}`);return t}function c6(t){let e=["_MEMBER_",`alias=${t.alias}`,`provider=${rm(t.provider)}`];return t.model!==null&&t.model!==void 0&&e.push(`model=${Bw(t.model)}`),e.push(`sessiondir="${Ec(t.sessiondir)}"`),e.join(" ")}function d6(t){let e=t.name,n=e!==void 0&&e.length>0?Nn(e):":memory:";return Gz("sha256").update(n,"utf8").digest("hex").slice(0,16)}function u6(){return process.env.LMBEE_CRON_SESSION_DIR?process.env.LMBEE_CRON_SESSION_DIR:wc(Qz(),".lmbee","cron-sessions")}function HL(t){return`'${t.replace(/'/g,"'\\''")}'`}function f6(t){let e=t.name;return e!==void 0&&e.length>0&&e!==":memory:"?`LMCTL_DB=${HL(Nn(e))} LMBEE_DB=${HL(Nn(e))} `:""}function m6(t,e,n){let r=f6(n);return`${t}
|
|
2400
2403
|
|
|
2401
2404
|
---
|
|
2402
2405
|
When you have finished, report the outcome exactly once by running this command (the token is
|
|
@@ -2423,11 +2426,11 @@ ${a}
|
|
|
2423
2426
|
`)){let i=o.trim();if(i.length===0)continue;let a;try{a=JSON.parse(i)}catch{continue}if(typeof a!="object"||a===null)continue;let l=a,c=typeof l.message=="string"?l.message:String(l.status);l.status==="ok"&&typeof l.replyText=="string"?e=l.replyText:l.status==="stalled"?n=c:l.status==="busy"?r=c:(l.status==="error"||l.status==="failed")&&(s=c)}return n!==null?{kind:"stalled",message:n}:r!==null?{kind:"busy",message:r}:s!==null?{kind:"error",message:s}:e!==null?{kind:"completed",text:e}:{kind:"none"}}function qw(t,e){try{let n=zz(t,"utf8").trim();return n.length>e?n.slice(-e):n}catch{return""}}function Pw(t,e,n,r){let s=t.receiptPath+".tmp-"+process.pid,o={adopted:!1,conversationId:t.conversationId,generation:t.generation,jobId:e,runId:n,error:r};try{Hw(s,JSON.stringify(o),{mode:384,flag:"wx"}),Yz(s,t.receiptPath)}catch{try{Fw(s,{force:!0})}catch{}}}function v6(t){try{return process.kill(-t,0),!1}catch(e){return e.code==="ESRCH"}}function VL(t,e){let n=e.isInFlight??(l=>tm.has(l)),r=e.processGroupGone??v6,s=e.runOrphanAfterMs??E6,o=e.pendingOrphanAfterMs??T6,i=t.prepare(`SELECT id, job_id, status, execution_state, pid, created_at, started_at, reported_at FROM cron_runs
|
|
2424
2427
|
WHERE execution_state IN ('active', 'uncertain') AND trigger_kind LIKE 'script%'`).all(),a=[];for(let l of i){if(n(l.id))continue;let c=Date.parse(l.started_at??""),d=Date.parse(l.created_at),u=Number.isFinite(c)?c:d,f=Number.isFinite(u)?e.nowMs-u:Number.POSITIVE_INFINITY,m;if(l.status==="pending"){if(f<o)continue;m=`it never started (still pending after ${Number.isFinite(f)?`${Math.round(f/6e4)} minutes`:"an unknown time"})`}else if(l.pid!==null){if(!r(l.pid))continue;m=`its process (pid ${l.pid}) has exited`}else{if(Ji(t,l.job_id)||f<s)continue;m=`no pid was recorded and it has been held for ${Number.isFinite(f)?`${Math.round(f/36e5)} hours`:"an unknown time"}`}let p=Ce(),_=l.status!=="pending"&&l.status!=="running",h=`outcome unknown: the process that started this run is gone and nothing recorded how it ended (${m}); released by lmcron reconciliation`,g=`fence released by lmcron reconciliation: ${m}`;try{t.transaction(()=>{let y="id = ? AND status = ? AND execution_state = ? AND pid IS ? AND started_at IS ? AND reported_at IS ?",E=[l.id,l.status,l.execution_state,l.pid,l.started_at,l.reported_at];return _?t.prepare(`UPDATE cron_runs SET execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL, execution_confirmation_note = ?, updated_at = ? WHERE ${y}`).run(p,g,p,...E).changes:t.prepare(`UPDATE cron_runs SET status = 'failed', summary = ?, finished_at = ?, execution_state = 'gone', execution_gone_at = ?, execution_uncertain_reason = NULL,
|
|
2425
2428
|
execution_confirmation_note = ?, updated_at = ? WHERE ${y}`).run(h.slice(0,4e3),p,p,g,p,...E).changes}).immediate()===1&&a.push(l.id)}catch(w){process.stderr.write(`[lmcron] run ${l.id} could not be released (fence retained): ${at(w)}
|
|
2426
|
-
`)}}return a}function qL(t){let{db:e,job:n,run:r}=t,s=t.onDemand===void 0?n.action_payload:[process.execPath,qz(new URL("./on-demand-worker.cjs",import.meta.url)),
|
|
2427
|
-
`);return}}catch(o){t.onDemand!==void 0&&Pw(t.onDemand,n.id,r.id,`pre-spawn mark running failed: ${at(o)}`),gt(e,r.id,{fallback:{ok:!1,summary:`script setup failed before spawn: ${at(o)}`}});return}tm.add(r.id);try{dc({id:n.id,action_payload:s},{onSpawn:o=>{try{Yi(e,r.id,{kind:"script",cwd:n.working_directory},o)}catch{}},...t.logDir!==void 0?{logDir:t.logDir}:{},...n.working_directory!==null?{cwd:n.working_directory}:{},...t.spawnPrefixes?.script!==void 0?{spawnPrefix:t.spawnPrefixes.script}:{},...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.sigkillGraceMs!==void 0?{sigkillGraceMs:t.sigkillGraceMs}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:
|
|
2429
|
+
`)}}return a}function qL(t){let{db:e,job:n,run:r}=t,s=t.onDemand===void 0?n.action_payload:[process.execPath,qz(new URL("./on-demand-worker.cjs",import.meta.url)),Nn(e.name),t.onDemand.conversationId,String(t.onDemand.generation),String(n.id),String(r.id),n.action_payload,t.onDemand.receiptPath].map(o=>`'${o.replaceAll("'","'\\''")}'`).join(" ");try{if(!zi(e,r.id,{kind:"script",cwd:n.working_directory},null)){t.onDemand!==void 0&&Pw(t.onDemand,n.id,r.id,"run was no longer pending; not started"),process.stderr.write(`[lmcron] run ${r.id} of job ${n.id} was no longer pending when it was about to start; not started
|
|
2430
|
+
`);return}}catch(o){t.onDemand!==void 0&&Pw(t.onDemand,n.id,r.id,`pre-spawn mark running failed: ${at(o)}`),gt(e,r.id,{fallback:{ok:!1,summary:`script setup failed before spawn: ${at(o)}`}});return}tm.add(r.id);try{dc({id:n.id,action_payload:s},{onSpawn:o=>{try{Yi(e,r.id,{kind:"script",cwd:n.working_directory},o)}catch{}},...t.logDir!==void 0?{logDir:t.logDir}:{},...n.working_directory!==null?{cwd:n.working_directory}:{},...t.spawnPrefixes?.script!==void 0?{spawnPrefix:t.spawnPrefixes.script}:{},...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{},...t.sigkillGraceMs!==void 0?{sigkillGraceMs:t.sigkillGraceMs}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{},onExit:(o,i,a,l)=>{let c=()=>{if(tm.delete(r.id),i!==void 0){gt(e,r.id,{fallback:{ok:!1,summary:`script spawn error: ${i.message}`}});return}let d=o===0||o===XL,u=qw(l,w6),f=o===XL?`script no-op (exit ${o})${u?`: ${u}`:""}`:`script exited with code ${o}${u?`: ${u}`:""}`;a!==null&&Xw(a)?fn(e,r.id,"process group still alive after exit",{fallback:{ok:d,summary:f}}):gt(e,r.id,{fallback:{ok:d,summary:f}})};if(t.onDemand===void 0)return c();try{Sw(e,c)}catch{}}})}catch(o){tm.delete(r.id),t.onDemand!==void 0&&Pw(t.onDemand,n.id,r.id,`script spawn error: ${at(o)}`),gt(e,r.id,{fallback:{ok:!1,summary:`script spawn error: ${at(o)}`}})}}function S6(t){let{db:e,job:n,run:r}=t,s,o,i,a;try{s=jw(t.timeoutMs,s6,"timeoutMs"),o=t.sigkillGraceMs??GL,i=[...t.spawnPrefixes?.miniplayer??r6,"run",...n.model!==null?["-m",n.model]:[]],a=p6(n.action_payload,t.runToken)}catch(h){gt(e,r.id,{fallback:{ok:!1,summary:`miniplayer setup failed before spawn: ${at(h)}`}});return}let[l,...c]=i,d;try{d=Uw(l,c,{detached:!0,stdio:["pipe","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(h){gt(e,r.id,{fallback:{ok:!1,summary:`miniplayer spawn error: ${at(h)}`}});return}d.unref();let u=gc(),f=gc(),m=!1,p=!1,_=setTimeout(()=>{m||(m=!0,Ww(d,o),fn(e,r.id,`miniplayer timed out after ${s}ms`,{fallback:{ok:!1,summary:`miniplayer timed out after ${s}ms`}}))},s);_.unref(),d.on("spawn",()=>p=!0),d.stdout?.on("data",h=>yc(u,h)),d.stderr?.on("data",h=>yc(f,h)),d.stdin?.on("error",()=>{}),d.on("error",h=>{if(m)return;m=!0,clearTimeout(_);let g={fallback:{ok:!1,summary:`miniplayer spawn error: ${h.message}`}};p?fn(e,r.id,`miniplayer post-spawn error: ${h.message}`,g):gt(e,r.id,g)}),d.on("close",(h,g)=>{if(m)return;m=!0,clearTimeout(_);let w=d.pid??null,y=w!==null&&Xw(w),E=u.overflow?{ok:!1,reason:`output exceeded the ${nm}-byte capture limit`}:JL(u.text,t.runToken),T=E.ok?{report:E.result}:{fallback:{ok:!1,summary:`miniplayer produced no valid structured result (${E.reason})`+(h!==0||g!==null?`; exit ${g??h}: ${f.text.trim().slice(-300)}`:"")}};y?fn(e,r.id,"miniplayer process group still alive after wrapper exit",T):u.overflow?fn(e,r.id,"miniplayer output exceeded the capture limit; result not trusted",T):gt(e,r.id,T)});try{zi(e,r.id,{kind:"miniplayer",model:n.model},d.pid??null)}catch(h){process.stderr.write(`[lmcron] miniplayer run ${r.id} state write failed after spawn: ${at(h)}
|
|
2428
2431
|
`)}try{d.stdin?.write(a),d.stdin?.end()}catch(h){process.stderr.write(`[lmcron] miniplayer run ${r.id} stdin write failed: ${at(h)}
|
|
2429
|
-
`)}}function b6(t){let{db:e,job:n,run:r}=t,s,o,i;try{s=jw(t.timeoutMs,o6,"timeoutMs"),o=jw(t.seedTimeoutMs,i6,"seedTimeoutMs"),i=t.sigkillGraceMs??GL}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session setup failed before spawn: ${at(y)}`}});return}let a,l;try{({teamfile:a,alias:l}=g6(e,n,t.sessionDir))}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session teamfile creation failed: ${at(y)}`}});return}let c=()=>{let y=t.spawnPrefixes?.chat??t6,E,T,v;try{let D=BL(n)?n.action_payload:m6(n.action_payload,t.runToken,e);E=Kz(wc(Zz(),"lmbee-cron-session-")),T=wc(E,`${r.id}.md`),Hw(T,D,{mode:384}),v=[...y,"prompt",`${a}:${l}`,"--prompt-file",T,"--json"]}catch(D){gt(e,r.id,{fallback:{ok:!1,summary:`session dispatch setup failed before spawn: ${at(D)}`}});return}let[b,...k]=v,I;try{I=Uw(b,k,{detached:!0,stdio:["ignore","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:
|
|
2430
|
-
`)}try{Yi(e,r.id,{kind:"session",phase:"dispatch",teamfile:a,alias:l},I.pid??null)}catch{}};if(n.session_seeded_at!==null){c();return}let u=[...t.spawnPrefixes?.seed??n6,"seed",a],f=u[0],m=u.slice(1),p;try{p=Uw(f,m,{detached:!0,stdio:["ignore","ignore","pipe"],...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:
|
|
2432
|
+
`)}}function b6(t){let{db:e,job:n,run:r}=t,s,o,i;try{s=jw(t.timeoutMs,o6,"timeoutMs"),o=jw(t.seedTimeoutMs,i6,"seedTimeoutMs"),i=t.sigkillGraceMs??GL}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session setup failed before spawn: ${at(y)}`}});return}let a,l;try{({teamfile:a,alias:l}=g6(e,n,t.sessionDir))}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session teamfile creation failed: ${at(y)}`}});return}let c=()=>{let y=t.spawnPrefixes?.chat??t6,E,T,v;try{let D=BL(n)?n.action_payload:m6(n.action_payload,t.runToken,e);E=Kz(wc(Zz(),"lmbee-cron-session-")),T=wc(E,`${r.id}.md`),Hw(T,D,{mode:384}),v=[...y,"prompt",`${a}:${l}`,"--prompt-file",T,"--json"]}catch(D){gt(e,r.id,{fallback:{ok:!1,summary:`session dispatch setup failed before spawn: ${at(D)}`}});return}let[b,...k]=v,I;try{I=Uw(b,k,{detached:!0,stdio:["ignore","pipe","pipe"],...n.working_directory!==null?{cwd:n.working_directory}:{},...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(D){try{Fw(E,{recursive:!0,force:!0})}catch{}gt(e,r.id,{fallback:{ok:!1,summary:`session dispatch spawn error: ${at(D)}`}});return}I.unref();let N=gc(),A=gc(),S=!1,x=!1,R=()=>{try{Fw(E,{recursive:!0,force:!0})}catch{}},L=setTimeout(()=>{S||(S=!0,Ww(I,i),fn(e,r.id,`session timed out after ${s}ms`,{fallback:{ok:!1,summary:`session timed out after ${s}ms`}}))},s);L.unref(),I.on("spawn",()=>x=!0),I.stdout?.on("data",D=>yc(N,D)),I.stderr?.on("data",D=>yc(A,D)),I.on("error",D=>{if(S)return;S=!0,clearTimeout(L);let M={fallback:{ok:!1,summary:`session dispatch spawn error: ${D.message}`}};x?fn(e,r.id,`session post-spawn error: ${D.message}`,M):(R(),gt(e,r.id,M))}),I.on("close",D=>{if(S)return;S=!0,clearTimeout(L);let M=I.pid??null,P=M!==null&&Xw(M),j=N.overflow?{kind:"overflow"}:y6(N.text),$=j.kind==="completed"?JL(j.text,t.runToken):null,pe=j.kind==="completed"&&!P&&!N.overflow,G=$!==null&&$.ok?{report:$.result}:j.kind==="completed"&&BL(n)&&!N.overflow?{fallback:{ok:!0,summary:`answered: ${j.text.trim().slice(-400)}`}}:{fallback:{ok:!1,summary:(j.kind==="completed"?"session ended without a valid report":j.kind==="stalled"?"session stalled (native turn still running)":j.kind==="busy"?"session was busy; not started":j.kind==="error"?`session provider error: ${j.message}`:j.kind==="overflow"?`session output exceeded the ${nm}-byte capture limit`:"session ended without positive completion")+(D!==0?` (exit ${D}: ${A.text.trim().slice(-300)})`:"")}};if(pe){if($!==null&&!$.ok){R(),gt(e,r.id,G);return}if(gt(e,r.id,G)){R();return}return}let fe=j.kind==="stalled"?`session stalled (native turn still running): ${j.message}`:j.kind==="busy"?`session busy (a live worker may own it): ${j.message}`:j.kind==="error"?`session provider error (termination unconfirmed): ${j.message}`:j.kind==="overflow"?"session output exceeded the capture limit; result not trusted":P?"session process group still alive after wrapper exit":`session wrapper exited without positive completion (code ${D})`;fn(e,r.id,fe,G)});try{zi(e,r.id,{kind:"session",provider:n.provider,model:n.model,teamfile:a,alias:l},I.pid??null)}catch(D){process.stderr.write(`[lmcron] session run ${r.id} state write failed after spawn: ${at(D)}
|
|
2433
|
+
`)}try{Yi(e,r.id,{kind:"session",phase:"dispatch",teamfile:a,alias:l},I.pid??null)}catch{}};if(n.session_seeded_at!==null){c();return}let u=[...t.spawnPrefixes?.seed??n6,"seed",a],f=u[0],m=u.slice(1),p;try{p=Uw(f,m,{detached:!0,stdio:["ignore","ignore","pipe"],...e.name!==void 0&&e.name!==":memory:"?{env:{...process.env,LMCTL_DB:Nn(e.name),LMBEE_DB:Nn(e.name)}}:{}})}catch(y){gt(e,r.id,{fallback:{ok:!1,summary:`session seed spawn error: ${at(y)}`}});return}p.unref();let _=gc(),h=!1,g=!1,w=setTimeout(()=>{h||(h=!0,Ww(p,i),fn(e,r.id,`session seed timed out after ${o}ms; provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed timed out after ${o}ms`}}))},o);w.unref(),p.on("spawn",()=>g=!0),p.stderr?.on("data",y=>yc(_,y)),p.on("error",y=>{if(h)return;h=!0,clearTimeout(w);let E={fallback:{ok:!1,summary:`session seed spawn error: ${y.message}`}};g?fn(e,r.id,`session seed post-spawn error: ${y.message}`,E):gt(e,r.id,E)}),p.on("close",y=>{if(!h){if(h=!0,clearTimeout(w),y!==0){fn(e,r.id,`session seed failed (exit ${y}); provider initialization may still be running`,{fallback:{ok:!1,summary:`session seed failed (exit ${y}): ${_.text.trim().slice(-300)}`}});return}try{e.prepare("UPDATE cron_jobs SET session_seeded_at = ?, updated_at = ? WHERE id = ?").run(new Date().toISOString(),new Date().toISOString(),n.id)}catch(E){fn(e,r.id,`session seeded but recording identity failed: ${at(E)}`,{fallback:{ok:!1,summary:"session seeded but recording seed state failed; will recover on retry"}});return}c()}});try{Yi(e,r.id,{kind:"session",phase:"seed",teamfile:a,alias:l},p.pid??null)}catch{}}function Gw(t){if(Ji(t.db,t.job.id)){if(t.onDemand===void 0||!TL(t.db,t.job.id,t.run.id,t.onDemand))return;Sw(t.db,()=>qL(t));return}try{switch(t.job.action_kind){case"script":qL(t);return;case"miniplayer":S6(t);return;case"session":b6(t);return;default:gt(t.db,t.run.id,{fallback:{ok:!1,summary:`unsupported run worker kind: ${t.job.action_kind}`}})}}catch(e){fn(t.db,t.run.id,`unexpected worker dispatch failure: ${at(e)}`,{fallback:{ok:!1,summary:`worker dispatch error: ${at(e)}`}})}}var t6,n6,r6,s6,o6,i6,jL,GL,nm,WL,l6,h6,_6,w6,XL,tm,E6,T6,KL=C(()=>{"use strict";bw();Ao();No();em();Rw();t6=["systemd-run","--user","--scope","--collect","--quiet","--","lmctl"],n6=["lmctl"],r6=["miniplayer"],s6=10*6e4,o6=50*6e4,i6=50*6e4,jL=24*60*6e4,GL=5e3,nm=1024*1024;WL=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","hermes","ClaudeMock"]),l6=/^[A-Za-z0-9][A-Za-z0-9._:@/+~-]*$/;h6=new Set(["run_token","status","summary","artifacts","escalation"]),_6=new Set(["owner","reason","requestedAction"]);w6=500,XL=75;tm=new Set,E6=24*36e5,T6=5*6e4});import{execFileSync as I6}from"node:child_process";function ZL(...t){throw new U("KIND_RETIRED",QL)}function k6(t){return t==="enqueue"||t==="command"||t==="script"||t==="session"||t==="miniplayer"}function A6(t){return t==="script"||t==="session"||t==="miniplayer"}function mn(t){return t instanceof Error?t.message:String(t)}function Zi(t){let e=t&&typeof t=="object"&&"code"in t?String(t.code):void 0;if(e!==void 0&&(e.startsWith("SQLITE_BUSY")||e.startsWith("SQLITE_LOCKED")))throw new U("DB_BUSY","Database busy; retry after the current writer completes",5);let n=t instanceof Error?t.message:String(t);throw e!==void 0&&e.startsWith("SQLITE_CONSTRAINT")?new U("STRUCTURAL_ERROR",n,2):new U("STORAGE_ERROR",n,1)}function Wr(t){try{return t()}catch(e){if(e instanceof U)throw e;if(e instanceof ko)throw new U(e.code,e.message,e.exitCode);return Zi(e)}}function sm(t,e){t.prepare("UPDATE cron_jobs SET revision = revision + 1, updated_at = ? WHERE id = ?").run(Ce(),e)}function om(t,e){return Wr(()=>t.prepare("SELECT * FROM cron_jobs WHERE id = ?").get(e)??null)}function Je(t,e){let n=om(t,e);if(n===null)throw new U("NOT_FOUND",`Cron job ${e} does not exist`,3);return n}function im(t,e){if(Fr(e,"action_payload"),t==="enqueue")throw new U("KIND_RETIRED",QL)}function am(t){let{actionKind:e}=t;if(e==="session"&&t.targeted)t.provider&&rm(t.provider),t.workingDirectory&&Ec(t.workingDirectory);else if(e==="session"){if(t.provider===void 0||t.provider===null||t.provider.trim().length===0)throw new U("INVALID_ARGUMENT","a session job requires a nonblank provider");if(rm(t.provider),t.workingDirectory===void 0||t.workingDirectory===null||t.workingDirectory.trim().length===0)throw new U("INVALID_ARGUMENT","a session job requires an absolute working_directory (--cwd)");Ec(t.workingDirectory)}else if(t.provider!==void 0&&t.provider!==null&&t.provider.trim().length>0)throw new U("INVALID_ARGUMENT",`provider is only valid for session jobs (not ${e})`);if(t.model!==void 0&&t.model!==null&&t.model.trim().length===0)throw new U("INVALID_ARGUMENT","model, if given, must be nonblank");if(t.model!==void 0&&t.model!==null&&t.model.trim().length>0&&e!=="session"&&e!=="miniplayer")throw new U("INVALID_ARGUMENT",`model is only valid for session/miniplayer jobs (not ${e})`);if(t.model!==void 0&&t.model!==null&&t.model.trim().length>0&&Bw(t.model),t.workingDirectory!==void 0&&t.workingDirectory!==null&&t.workingDirectory.trim().length>0&&e==="enqueue")throw new U("INVALID_ARGUMENT","working_directory is not valid for enqueue jobs");if(t.workingDirectory!==void 0&&t.workingDirectory!==null&&t.workingDirectory.trim().length===0)throw new U("INVALID_ARGUMENT","working_directory, if given, must be nonblank");if(t.escalationOwner!==void 0&&t.escalationOwner!==null&&t.escalationOwner.trim().length===0)throw new U("INVALID_ARGUMENT","escalation_owner, if given, must be nonblank")}function Tc(t){let e=Fr(t,"timezone");try{new Intl.DateTimeFormat(void 0,{timeZone:e})}catch{throw new U("INVALID_ARGUMENT",`timezone "${e}" is not a recognized IANA zone name`)}return e}function vc(t){let e=xw(t);if(!e.ok){let n=e.error.field?` (field: ${e.error.field})`:"";throw new U("INVALID_SCHEDULE",`${e.error.message}${n}`)}}function lm(t,e){let n=t.transaction(()=>{if(e.id!==void 0&&(!Number.isSafeInteger(e.id)||e.id<1))throw new U("INVALID_ARGUMENT","id, if given, must be a positive safe integer");let r=Fr(e.title,"title");if(!k6(e.actionKind))throw new U("INVALID_ARGUMENT",'action_kind must be "enqueue", "command", "script", "session", or "miniplayer"');if(vc(e.scheduleExpr),im(e.actionKind,e.actionPayload),e.sessionTarget&&e.actionKind!=="session")throw new U("INVALID_ARGUMENT","a session target is only for session jobs");am({actionKind:e.actionKind,provider:e.provider??null,model:e.model??null,workingDirectory:e.workingDirectory??null,escalationOwner:e.escalationOwner??null,targeted:e.sessionTarget!==void 0});let s=e.timezone!==void 0?Tc(e.timezone):null,o=Ce();try{let i=t.prepare(e.id!==void 0?`INSERT INTO cron_jobs(id, title, schedule_expr, action_kind, action_payload, provider, model,
|
|
2431
2434
|
working_directory, escalation_owner, enabled, timezone, created_at, updated_at)
|
|
2432
2435
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`:`INSERT INTO cron_jobs(title, schedule_expr, action_kind, action_payload, provider, model,
|
|
2433
2436
|
working_directory, escalation_owner, enabled, timezone, created_at, updated_at)
|
|
@@ -2484,7 +2487,7 @@ ${Qw}
|
|
|
2484
2487
|
|
|
2485
2488
|
install registers the daemon as a boot-surviving systemd user service on Linux and enables user lingering.
|
|
2486
2489
|
On other operating systems, install and start open a terminal window and start the daemon in it.`});function bc(t,e=[]){let n=new Set(e),r=[],s={};for(let o=0;o<t.length;o++){let i=t[o];if(i==="-h")s.help=!0;else if(i.startsWith("--")){let a=i.slice(2),l=t[o+1];!n.has(a)&&l!==void 0&&!l.startsWith("--")?(s[a]=l,o++):s[a]=!0}else r.push(i)}return{positionals:r,flags:s}}var eE=C(()=>{"use strict"});function yC(t){return mt(t)}var wC=C(()=>{"use strict";Fs();Pt();Kn()});import{existsSync as X6,readFileSync as q6,writeFileSync as G6}from"node:fs";function z6(t){return{id:t.id,title:t.title,schedule_expr:t.schedule_expr,action_kind:t.action_kind,action_payload:t.action_payload,provider:t.provider,model:t.model,working_directory:t.working_directory,escalation_owner:t.escalation_owner,timezone:t.timezone,enabled:!!t.enabled}}function Y6(t){return t instanceof Error&&"code"in t&&typeof t.code=="string"&&t.code.startsWith("SQLITE_BUSY")}function Q6(t,e){let n;try{n=t.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'cron_jobs'").get()!==void 0?t.prepare("SELECT * FROM cron_jobs ORDER BY id").all():[]}catch(r){throw Y6(r)?new U("SOURCE_BUSY","source database is locked by another process -- export never waits on locks (busy_timeout = 0); retry shortly",3):r}for(let r of n)if(r.action_kind!=="command"&&r.action_kind!=="script")throw new U("INVALID_ARGUMENT",`cron job ${r.id} "${r.title}" has action_kind "${r.action_kind}" -- export does not carry ${r.action_kind}-kind jobs, so no file was written (import would refuse it; never produce a transferable payload containing one -- re-create the job manually on the target)`);return{schema_version:1,kind:tE,exported_at:new Date().toISOString(),exported_from:e,jobs:n.map(z6)}}function Z6(t,e,n){let r=Q6(t,n);try{G6(e,`${JSON.stringify(r,null,2)}
|
|
2487
|
-
`,{flag:"wx"})}catch(s){throw s&&typeof s=="object"&&"code"in s&&s.code==="EEXIST"?new U("INVALID_ARGUMENT",`export path already exists: ${e} (rm it first; there is no --force)`):new U("INVALID_ARGUMENT",`cannot write export to ${e}: ${s instanceof Error?s.message:String(s)}`)}return r}function e4(t){let e=J6(t);V6(e);let n=new
|
|
2490
|
+
`,{flag:"wx"})}catch(s){throw s&&typeof s=="object"&&"code"in s&&s.code==="EEXIST"?new U("INVALID_ARGUMENT",`export path already exists: ${e} (rm it first; there is no --force)`):new U("INVALID_ARGUMENT",`cannot write export to ${e}: ${s instanceof Error?s.message:String(s)}`)}return r}function e4(t){let e=J6(t);V6(e);let n=new Ln(e,{readonly:!0,fileMustExist:!0});return n.pragma("busy_timeout = 0"),{db:n,path:e,close:()=>n.close()}}function Ic(t,e,n){if(e.length>1)throw new U("INVALID_ARGUMENT",`cron ${t} takes exactly one PATH argument -- refusing unexpected extra argument ${JSON.stringify(e[1])}`);for(let r of Object.keys(n))if(r!=="json"&&r!=="help")throw new U("INVALID_ARGUMENT",`cron ${t} does not know flag "--${r}" (only --json and --help)`)}function SC(t){let{positionals:e,flags:n}=bc(t,["json","help"]),r=n.json===!0;try{if(n.help===!0)return{output:vC,exitCode:0};Ic("export",e,n);let s=e[0];if(s===void 0)throw new U("INVALID_ARGUMENT",`an export PATH is required
|
|
2488
2491
|
${vC}`);let o=e4();try{let i=Z6(o.db,s,o.path);return r?{output:JSON.stringify({schema_version:1,ok:!0,data:{path:s,exported_from:o.path,jobs:i.jobs.length}}),exitCode:0}:{output:`exported ${i.jobs.length} jobs to ${s}`,exitCode:0}}finally{o.close()}}catch(s){if(s instanceof U)return r?{output:JSON.stringify({schema_version:1,ok:!1,error:{code:s.code,message:s.message}}),exitCode:s.exitCode}:{output:`${s.code}: ${s.message}`,exitCode:s.exitCode};throw s}}function pn(t,e){throw new U("INVALID_ARGUMENT",`jobs[${t}]: ${e}`)}function t4(t,e){(typeof t!="object"||t===null||Array.isArray(t))&&pn(e,"must be a JSON object");let n=t;for(let c of Object.keys(n))TC.includes(c)||pn(e,`unknown key "${c}"`);for(let c of TC)c in n||pn(e,`missing key "${c}"`);let{id:r,title:s,schedule_expr:o,action_kind:i,action_payload:a,enabled:l}=n;(typeof r!="number"||!Number.isSafeInteger(r)||r<1)&&pn(e,"id must be a positive safe integer"),(typeof s!="string"||s.trim().length===0)&&pn(e,"title must be a nonblank string"),typeof o!="string"&&pn(e,"schedule_expr must be a string"),typeof i!="string"&&pn(e,"action_kind must be a string"),i==="enqueue"&&pn(e,"import does not carry enqueue-kind jobs (zero existed when this was designed; refusing rather than risking a payload current validation rejects -- create it manually)"),(i==="session"||i==="miniplayer")&&pn(e,`import does not carry ${i}-kind jobs (out of scope -- untested expansion; create it manually)`),i!=="command"&&i!=="script"&&pn(e,`action_kind "${i}" is not a known kind; only "command" and "script" are accepted`),typeof a!="string"&&pn(e,"action_payload must be a string"),typeof l!="boolean"&&pn(e,`enabled must be a JSON boolean (true/false), not ${JSON.stringify(l)}`);for(let c of K6){let d=n[c];d!==null&&typeof d!="string"&&pn(e,`${c} must be a string or null`)}return n}function bC(t){let e;try{e=q6(t,"utf8")}catch(i){throw new U("INVALID_ARGUMENT",`cannot read import file ${t}: ${i instanceof Error?i.message:String(i)}`)}let n;try{n=JSON.parse(e)}catch(i){throw new U("INVALID_ARGUMENT",`import file ${t} is not valid JSON: ${i instanceof Error?i.message:String(i)}`)}if(typeof n!="object"||n===null||Array.isArray(n))throw new U("INVALID_ARGUMENT","import document must be a JSON object");let r=n;for(let i of Object.keys(r))if(!EC.includes(i))throw new U("INVALID_ARGUMENT",`unknown top-level key "${i}"`);for(let i of EC)if(!(i in r))throw new U("INVALID_ARGUMENT",`missing top-level key "${i}"`);if(r.schema_version!==1)throw new U("INVALID_ARGUMENT",`schema_version must be 1, got ${JSON.stringify(r.schema_version)}`);if(r.kind!==tE)throw new U("INVALID_ARGUMENT",`kind must be "${tE}", got ${JSON.stringify(r.kind)}`);for(let i of["exported_at","exported_from"])if(typeof r[i]!="string")throw new U("INVALID_ARGUMENT",`${i} must be a string, got ${JSON.stringify(r[i])}`);if(!Array.isArray(r.jobs))throw new U("INVALID_ARGUMENT","jobs must be an array");let s=r.jobs.map((i,a)=>t4(i,a)),o=new Set;for(let i of s){if(o.has(i.id))throw new U("INVALID_ARGUMENT",`duplicate id ${i.id} within the document`);o.add(i.id)}return s}function IC(t){return{...t,title:t.title.trim(),timezone:t.timezone===null?null:t.timezone.trim()}}function n4(t,e){let n=IC(e);return t.title===n.title&&t.schedule_expr===n.schedule_expr&&t.action_kind===n.action_kind&&t.action_payload===n.action_payload&&t.provider===n.provider&&t.model===n.model&&t.working_directory===n.working_directory&&t.escalation_owner===n.escalation_owner&&t.timezone===n.timezone&&!!t.enabled===n.enabled}function r4(t){let e=IC(t);return{id:e.id,title:e.title,scheduleExpr:e.schedule_expr,actionKind:e.action_kind,actionPayload:e.action_payload,enabled:e.enabled,...e.provider!==null?{provider:e.provider}:{},...e.model!==null?{model:e.model}:{},...e.working_directory!==null?{workingDirectory:e.working_directory}:{},...e.escalation_owner!==null?{escalationOwner:e.escalation_owner}:{},...e.timezone!==null?{timezone:e.timezone}:{}}}function kC(t){bC(t)}function AC(t,e){let n=bC(e),r=[],s=[];t.transaction(()=>{for(let a of n){let l=om(t,a.id);if(l!==null){if(n4(l,a)){r.push({id:a.id,title:a.title});continue}throw new U("CONFLICT",`cron job ${a.id} already exists with a different definition: existing "${l.title}" vs import "${a.title}" -- refusing the whole file, nothing written`,4)}lm(t,r4(a)),s.push(a)}}).immediate();let i=[];for(let a of s)a.working_directory!==null&&!X6(a.working_directory)&&i.push(`job ${a.id} "${a.title}": working_directory ${a.working_directory} does not exist on this host`);return{imported:s.length,skipped:r,warnings:i}}function NC(t){let e=[`imported ${t.imported}, skipped ${t.skipped.length} already-present`];for(let n of t.skipped)e.push(`skipped: ${n.id} "${n.title}"`);for(let n of t.warnings)e.push(`warning: ${n}`);return e.join(`
|
|
2489
2492
|
`)}var J6,V6,tE,EC,TC,K6,vC,nE=C(()=>{"use strict";Fs();wC();eE();No();dm();J6=t=>t||process.env.LMBEE_DB||yC(t),V6=t=>{},tE="lmbee-cron-export",EC=["schema_version","kind","exported_at","exported_from","jobs"],TC=["id","title","schedule_expr","action_kind","action_payload","provider","model","working_directory","escalation_owner","timezone","enabled"],K6=["provider","model","working_directory","escalation_owner","timezone"];vC=`usage: lmbee cron export PATH [--json] -- write all cron job DEFINITIONS (ids preserved) as one JSON document;
|
|
2490
2493
|
refuses if PATH already exists (rm it first; there is no --force). Definitions only, never execution state.`});import{existsSync as s4,readFileSync as o4}from"node:fs";import{resolve as i4}from"node:path";function Ds(t,e,n={}){if(t===void 0)return;if(typeof t!="string"||!/^\d+$/.test(t))throw new U("INVALID_ARGUMENT",`${e} must be a nonnegative integer`);let r=Number(t),s=n.minimum??1;if(!Number.isSafeInteger(r)||r<s||n.maximum!==void 0&&r>n.maximum){let o=n.maximum!==void 0?`between ${s} and ${n.maximum}`:`>= ${s}`;throw new U("INVALID_ARGUMENT",`${e} must be an integer ${o}`)}return r}function Br(t,e){let n=Ds(t,e,{minimum:1});if(n===void 0)throw new U("INVALID_ARGUMENT",`${e} is required`);return n}function a4(t){return t==="enqueue"||t==="command"||t==="script"||t==="session"||t==="miniplayer"}function c4(t){return l4.includes(t)}function xC(t){let e=t.payload,n=t.prompt,r=t["prompt-file"];if([e,n,r].filter(o=>o!==void 0).length>1)throw new U("INVALID_ARGUMENT","provide only one of --payload, --prompt, or --prompt-file");if(r!==void 0){if(typeof r!="string")throw new U("INVALID_ARGUMENT","--prompt-file requires a path");try{return o4(r,"utf8")}catch(o){throw new U("INVALID_ARGUMENT",`cannot read --prompt-file ${r}: ${o instanceof Error?o.message:String(o)}`)}}if(typeof e=="string")return e;if(typeof n=="string")return n}function Ve(t){return typeof t=="string"?t:void 0}function Lt(t,e,n={}){return t?JSON.stringify({schema_version:1,ok:!0,data:e,meta:n}):f4(e,n)}function RC(t,e){return t?{output:JSON.stringify({schema_version:1,ok:!1,error:{code:e.code,message:e.message}}),exitCode:e.exitCode}:{output:`${e.code}: ${e.message}`,exitCode:e.exitCode}}function rE(t){return t.last_tick_at===null?"last cron evaluation: not recorded yet (the daemon predates the tick record, or has not ticked)":`last cron evaluation: ${t.last_tick_at} (${ac(t.last_tick_age_ms??0)} ago); gaps in the last 24h: ${t.gaps_24h}${t.gaps_24h>0?`, longest ${ac(t.longest_gap_24h_ms)}`:""}`}function u4(t){let e=t.last_run,n=t.recent_runs,r=t.holding_fence;if(e===void 0||n===void 0)return"";let s=[];return e===null?s.push("never run"):(s.push(e.exit_code!==null&&e.exit_code!==0&&e.status==="failed"?`${e.status} (exit ${e.exit_code})`:e.status),s.push(`${n.failed}/${n.window} failed${n.escalated>0?`, ${n.escalated} escalated`:""}`)),r!=null&&Date.now()-Date.parse(r.since)>d4&&s.push(`HOLDING FENCE run ${r.id} (${r.status}/${r.execution_state}) since ${r.since}`),s.join("; ")}function f4(t,e){let n;if(Array.isArray(t)){let s=o=>o!==null&&typeof o=="object"&&"title"in o;n=t.length===0?"(empty)":t.every(s)?(0,ea.formatTable)([["ID","ENABLED","KIND","SCHEDULE","LAST RUN","TITLE"],...t.map(o=>[...["id","enabled","action_kind","schedule_expr"].map(a=>(0,ea.escapeCell)(String(o[a]??""))),(0,ea.escapeCell)(u4(o)),(0,ea.escapeCell)(String(o.title??""))])]):t.map(o=>JSON.stringify(o)).join(`
|
|
@@ -2527,15 +2530,15 @@ appkey source: ${e.appkeySource}`,exitCode:n}}var nO=C(()=>{"use strict";cE();ZC
|
|
|
2527
2530
|
`),assistantTimestamp:_Y(s[s.length-1]?.timestamp)}}function _Y(t){if(t===void 0)return null;let e=t.getTime();return Number.isFinite(e)?t.toISOString():null}function gY(t){if(!(t===null||t.trim()===""))try{let e=JSON.parse(t);if(!Array.isArray(e))return;let n=e.filter(r=>typeof r=="string"&&r.length>0);return n.length>0?n:void 0}catch{return}}function bE(t,e){let n=gY(t.config_warnings),r={id:t.id,kind:t.kind,origin:t.origin,status:t.status,holder_liveness:e(t),from_identity:t.from_identity,target:t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`,started_at:t.started_at,ended_at:t.ended_at,result:NO(t.result_summary),error:NO(t.error),...n!==void 0?{config_warnings:n}:{}};return t.error!==null&&MO.set(r,t.error),r}function yY(t,e){return t.scope==="self"?EY(t,e):TY(t,e)}function wY(t){if(t===null)return"idle";let e=t.holder_pid!==null?`pid ${t.holder_pid}${t.holder_host!==null?` on ${t.holder_host}`:""}`:"holder",n=t.reason==="dead-pid"?"appears dead -- the provider process ended before the turn completed":"stale";return`idle (reclaimable lock: ${e} ${n})`}function EY(t,e){let n=[];n.push(`identity: ${t.identity}`),n.push(`team: ${t.team.name}`),n.push(`teamfile: ${t.team.teamfile}`),n.push(""),n.push("members:"),t.members.length===0&&n.push(" none");for(let r of t.members){let s=r.model===null?"":` model=${r.model}`,o=r.sessionid===null?"":` session=${r.sessionid}`,i=r.state==="idle"?wY(r.reclaimable):`busy (${r.reason})`,a=r.handling===null?"":` handling="${r.handling.request_preview}"`;n.push(` ${r.alias}: ${i} provider=${r.provider}${s}${o}${a}`)}return n.push(""),n.push("transcript harvest:"),DO(n,t.transcript_harvest,"self"),n.push(""),n.push("activity from me:"),IE(n,kE(t.activity.from_me,e.sinceIso),"from-me"),n.push(""),n.push("activity to me:"),IE(n,kE(t.activity.to_me,e.sinceIso),"to-me"),n.push(""),n.push(OO(t)),n.join(`
|
|
2528
2531
|
`)}function TY(t,e){let n=[];n.push("scope: db"),n.push("identity: none"),n.push(""),n.push("teams:"),t.teams.length===0&&n.push(" none");for(let r of t.teams){let s=r.name===null?"(unnamed)":r.name;n.push(` ${s}: ${r.teamfile} (${r.member_count} members)`)}return n.push(""),n.push("transcript harvest:"),DO(n,t.transcript_harvest,"db"),n.push(""),n.push("recent activity:"),IE(n,kE(t.activity,e.sinceIso),"db"),n.push(""),n.push(OO(t)),n.join(`
|
|
2529
2532
|
`)}function OO(t){return Ha(t.db_path)}function IE(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,bm))vY(t,r,n);$O(t,e.length,bm,"older")}function DO(t,e,n){if(e.length===0){t.push(" none");return}for(let r of e.slice(0,bm)){let s=n==="db"?` from ${fr(r.from_identity)} -> ${fr(r.target)}`:` -> ${fr(r.target)}`;if(r.state==="completed"){let o=r.result_preview===null?"":` "${r.result_preview}"`;t.push(` #${r.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${r.started_at}${o}`)}else t.push(` #${r.tracked_invocation_id} unreconciled${s} since ${r.started_at} (${r.reason??"unknown"})`);r.tail_hint.length>0&&t.push(` inspect: ${r.tail_hint}`)}$O(t,e.length,bm,"more transcript harvest rows")}function kE(t,e){let n=Date.parse(e);return Number.isFinite(n)?t.filter(r=>{let s=Date.parse(r.ended_at??r.started_at);return Number.isFinite(s)&&s>=n}):t}function vY(t,e,n){let r=bY(e,n),s=e.status==="running"?`since ${e.started_at}`:`ended ${e.ended_at??e.started_at}`,o=e.error??e.result,i=Nd(MO.get(e)??"",EE),a=o===null?"":` "${i??PO(o)}"`;if(t.push(` #${e.id} ${SY(e)} ${e.kind}${r} ${s}${a}`),e.config_warnings!==void 0)for(let l of e.config_warnings)t.push(` config not applied: ${l}`)}function SY(t){return t.status==="running"&&t.holder_liveness==="unknown"?"RUNNING_UNKNOWN":t.status.toUpperCase()}function bY(t,e){if(e==="from-me")return t.target===null?"":` -> ${fr(t.target)}`;if(e==="to-me")return` from ${fr(t.from_identity)}`;let n=t.target===null?"":` -> ${fr(t.target)}`;return` from ${fr(t.from_identity)}${n}`}function $O(t,e,n,r){let s=e-n;s>0&&t.push(` (+${s} ${r} -- use --json)`)}function NO(t){return t===null||t.length===0?null:t.replace(/\s+/g," ").trim()}function PO(t){let e=zb(t).replace(/\s+/g," ").trim();return e.length<=EE?e:`${e.slice(0,EE-3)}...`}function IY(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=kO?e:`${e.slice(0,kO-3)}...`}function km(t){return(0,Wt.formatDuration)(t)}function Ac(t){return(0,Wt.formatRelativeTime)(t)}function fr(t){if(t==="operator")return t;try{let e=mo(t);return`${Q4(e.teamfile)}:${e.alias}`}catch{return t}}function kY(t){if(t===void 0)return{iso:new Date(Date.now()-rY).toISOString()};let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let r=Number(e[1]),s=e[2],o=s==="s"?r:s==="m"?r*60:s==="h"?r*3600:r*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let n=Date.parse(t);return Number.isFinite(n)?{iso:new Date(n).toISOString()}:{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}}async function AY(t,e,n,r){let s=await q(t,d=>{let u=Qe(e,d),f=Yn(u,d);if(f.parseErrors.length>0)throw new Error(f.parseErrors.join("; "));return{teamfile:u,teamName:f.name,targets:zl(u,d,new Set,[])}}),o=Yy(s.teamfile),i=o.kind==="repo"?o:null,a=await Yl(t,s.targets),l=[],c=0;for(let d of s.targets){let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,declaredModel:d.model,liveness:a.get(ji(d.teamfile,d.alias))??Cf(),probed:!1,detailLoaded:!1},f=await Ky(t,{teamfile:d.teamfile,alias:d.alias});if(f!==void 0&&(u.configWarnings=f),r&&d.sessionid!==null){u.probed=!0;let m=null;try{m=await _t(d.sessionid,d.provider)}catch(p){t.stderr.write(`warning: failed to load session "${d.sessionid}" for ${d.reportPath} (${d.provider}): ${p instanceof Error?p.message:String(p)}
|
|
2530
|
-
`)}u.detailLoaded=m!==null,u.messageCount=m?.messageCount??null,u.observedModel=m?.model??"(unknown)",u.lastContext=m?.lastInputTokens??null,u.totalInputTokens=m?.totalInputTokens??null,u.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=m.totalCachedInputTokens),u.sessionLimit=m===null?null:wE(m.messages),i!==null&&(u.activitySinceLastCommit={messageCount:m===null?null:Qy(m,i.since),tokens:null},u.cumulativeTokens=m===null?null:Zy(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(u)}return n?(Y(t,{schema_version:AE,scope:"team",team:s.teamName,teamfile:s.teamfile,details:r,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(d=>({ref:d.ref,timestamp:d.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(d=>{let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,seeded:d.sessionid!==null,model:d.declaredModel,liveness:d.liveness};return d.configWarnings!==void 0&&(u.config_warnings=d.configWarnings),d.probed&&(u.messageCount=d.messageCount??null,u.observed_model=d.observedModel,u.lastContext=d.lastContext??null,u.totalInputTokens=d.totalInputTokens??null,u.totalOutputTokens=d.totalOutputTokens??null,d.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=d.totalCachedInputTokens),u.sessionLimit=d.sessionLimit??null,d.activitySinceLastCommit!==void 0&&(u.activitySinceLastCommit=d.activitySinceLastCommit),d.cumulativeTokens!==void 0&&(u.cumulativeTokens=d.cumulativeTokens==="n/a"?null:d.cumulativeTokens)),u}),...r?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(RY(s.teamName,s.teamfile,o,l,r,c)),0)}function NY(t){return t.sessionid??"(not seeded)"}function xY(t){return t.sessionid===null?"not seeded":Of(t.liveness)}function RY(t,e,n,r,s,o){let i=[],a=n.kind==="repo"?n:null;if(i.push(`TEAM: ${t}`),i.push(`teamfile: ${e}`),n.kind==="repo"){i.push("Git progress:");for(let _ of n.commits)i.push(` ${_.ref}: ${_.timestamp.toISOString()}`);i.push(` Uncommitted: ${
|
|
2533
|
+
`)}u.detailLoaded=m!==null,u.messageCount=m?.messageCount??null,u.observedModel=m?.model??"(unknown)",u.lastContext=m?.lastInputTokens??null,u.totalInputTokens=m?.totalInputTokens??null,u.totalOutputTokens=m?.totalOutputTokens??null,m?.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=m.totalCachedInputTokens),u.sessionLimit=m===null?null:wE(m.messages),i!==null&&(u.activitySinceLastCommit={messageCount:m===null?null:Qy(m,i.since),tokens:null},u.cumulativeTokens=m===null?null:Zy(m)??"n/a"),m?.messageCount===void 0?c=void 0:c!==void 0&&(c+=m.messageCount)}l.push(u)}return n?(Y(t,{schema_version:AE,scope:"team",team:s.teamName,teamfile:s.teamfile,details:r,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(d=>({ref:d.ref,timestamp:d.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(d=>{let u={alias:d.alias,reportPath:d.reportPath,teamfile:d.teamfile,provider:d.provider,sessionid:d.sessionid,seeded:d.sessionid!==null,model:d.declaredModel,liveness:d.liveness};return d.configWarnings!==void 0&&(u.config_warnings=d.configWarnings),d.probed&&(u.messageCount=d.messageCount??null,u.observed_model=d.observedModel,u.lastContext=d.lastContext??null,u.totalInputTokens=d.totalInputTokens??null,u.totalOutputTokens=d.totalOutputTokens??null,d.totalCachedInputTokens!==void 0&&(u.totalCachedInputTokens=d.totalCachedInputTokens),u.sessionLimit=d.sessionLimit??null,d.activitySinceLastCommit!==void 0&&(u.activitySinceLastCommit=d.activitySinceLastCommit),d.cumulativeTokens!==void 0&&(u.cumulativeTokens=d.cumulativeTokens==="n/a"?null:d.cumulativeTokens)),u}),...r?{total:{messageCount:c??null}}:{}}),0):(t.stdout.write(RY(s.teamName,s.teamfile,o,l,r,c)),0)}function NY(t){return t.sessionid??"(not seeded)"}function xY(t){return t.sessionid===null?"not seeded":Of(t.liveness)}function RY(t,e,n,r,s,o){let i=[],a=n.kind==="repo"?n:null;if(i.push(`TEAM: ${t}`),i.push(`teamfile: ${e}`),n.kind==="repo"){i.push("Git progress:");for(let _ of n.commits)i.push(` ${_.ref}: ${_.timestamp.toISOString()}`);i.push(` Uncommitted: ${kn(n.working.uncommittedTracked)} changed (tracked), ${kn(n.working.untracked)} untracked`)}else n.reason==="no-commits"?i.push(`Git progress: git repository in ${n.teamDir} has no commits (no commit-based progress to report)`):i.push(`Git progress: no git repository in ${n.teamDir} (no commit-based progress to report)`);if(!s){i.push("members:"),r.length===0&&i.push(" none");for(let _ of r){let h=_.declaredModel===null?"":` model=${_.declaredModel}`;if(_.sessionid===null?i.push(` ${_.reportPath}: not seeded provider=${_.provider}${h} (run: lmctl seed "${_.teamfile}")`):i.push(` ${_.reportPath}: ${Of(_.liveness)} provider=${_.provider}${h} session=${_.sessionid}`),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}return i.push(""),i.push("session detail (observed model, messages, tokens, limits) not probed -- use --details"),`${i.join(`
|
|
2531
2534
|
`)}
|
|
2532
|
-
`}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((_,h)=>h>=5?"right":"left"),d=!1,u=r.filter(_=>_.sessionLimit!=null),f=[];for(let _ of r){let h=iR(_.lastContext??void 0,_.detailLoaded,sR);(h==="n/a"||_.cumulativeTokens==="n/a")&&(d=!0);let g=[(0,Wt.escapeCell)(NY(_)),(0,Wt.escapeCell)(_.reportPath),(0,Wt.escapeCell)(_.provider),(0,Wt.escapeCell)(_.observedModel??"(unknown)"),xY(_),
|
|
2535
|
+
`}let l=a!==null?["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT","MSGS SINCE COMMIT","TOKENS SINCE COMMIT","TOKENS (cumulative)"]:["SESSION","ALIAS","PROVIDER","OBSERVED MODEL","LIVE","MSGS","LAST CONTEXT"],c=l.map((_,h)=>h>=5?"right":"left"),d=!1,u=r.filter(_=>_.sessionLimit!=null),f=[];for(let _ of r){let h=iR(_.lastContext??void 0,_.detailLoaded,sR);(h==="n/a"||_.cumulativeTokens==="n/a")&&(d=!0);let g=[(0,Wt.escapeCell)(NY(_)),(0,Wt.escapeCell)(_.reportPath),(0,Wt.escapeCell)(_.provider),(0,Wt.escapeCell)(_.observedModel??"(unknown)"),xY(_),kn(_.messageCount),h];a!==null&&g.push(kn(_.activitySinceLastCommit?.messageCount),kn(_.activitySinceLastCommit?.tokens),oR(_.cumulativeTokens)),f.push(g)}let m=["TOTAL","","","","",kn(o)];a!==null&&m.push("",kn(LY(r)),kn(null),kn(CY(r))),f.push(m);let p=(0,Wt.formatTable)(f,{headers:l,align:c,margin:2}).split(`
|
|
2533
2536
|
`);if(i.push(p[0]),r.forEach((_,h)=>{if(i.push(p[h+1]),_.configWarnings!==void 0)for(let g of _.configWarnings)i.push(` config not applied: ${g}`)}),i.push(p[p.length-1]),d&&i.push("n/a = this provider does not expose a context/token total; absence is not a health signal."),i.push(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
|
|
2534
2537
|
Right after a compaction the last completed turn IS the summarisation request, which carried the
|
|
2535
2538
|
full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
|
|
2536
2539
|
small. Re-read after the next turn before concluding a compaction failed or gating on the value.`),u.length>0){i.push("Session limits:");for(let _ of u)i.push(` ${_.reportPath}: LIMITED resets_at=${zy(_.sessionLimit)}`)}return`${i.join(`
|
|
2537
2540
|
`)}
|
|
2538
|
-
`}function LY(t){let e=0;for(let n of t){let r=n.activitySinceLastCommit?.messageCount;r==null?e=void 0:e!==void 0&&(e+=r)}return e}function CY(t){let e=0;for(let n of t){let r=n.cumulativeTokens;r==null||r==="n/a"?e=void 0:e!==void 0&&(e+=r)}return e}async function OY(t,e,n,r){let s=await q(t,p=>lt(e,n,p)),o;try{o=await _t(s.sessionid,s.provider)}catch(p){return O(t,`status: failed to load session: ${p instanceof Error?p.message:String(p)}`)}if(o===null)return O(t,`status: session not found: ${s.sessionid} (provider=${s.provider})`);let i=wE(o.messages),l=(await Yl(t,[{teamfile:s.teamfile,alias:s.alias}])).get(ji(s.teamfile,s.alias))??Cf(),c=await Ky(t,{teamfile:s.teamfile,alias:s.alias}),d=Yy(s.teamfile),u=d.kind==="repo"?d:null,f={provider:o.provider,sessionid:o.sessionId,seeded:!0,alias:s.alias,teamfile:s.teamfile,reportPath:s.alias,cwd:o.cwd,messageCount:o.messageCount??null,model:s.model??null,observed_model:o.model??null,lastContext:o.lastInputTokens??null,liveness:l,totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,...c!==void 0?{config_warnings:c}:{},...u!==null?{activitySinceLastCommit:{messageCount:Qy(o,u.since),tokens:null},cumulativeTokens:Zy(o)}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};if(r)return Y(t,{schema_version:AE,scope:"member",...f}),0;let m=[];if(m.push(`Session: ${o.sessionId}`),m.push(` Provider: ${o.provider}`),m.push(` Alias: ${s.alias}`),m.push(` Liveness: ${Of(l)}`),m.push(` CWD: ${o.cwd}`),m.push(` Messages: ${
|
|
2541
|
+
`}function LY(t){let e=0;for(let n of t){let r=n.activitySinceLastCommit?.messageCount;r==null?e=void 0:e!==void 0&&(e+=r)}return e}function CY(t){let e=0;for(let n of t){let r=n.cumulativeTokens;r==null||r==="n/a"?e=void 0:e!==void 0&&(e+=r)}return e}async function OY(t,e,n,r){let s=await q(t,p=>lt(e,n,p)),o;try{o=await _t(s.sessionid,s.provider)}catch(p){return O(t,`status: failed to load session: ${p instanceof Error?p.message:String(p)}`)}if(o===null)return O(t,`status: session not found: ${s.sessionid} (provider=${s.provider})`);let i=wE(o.messages),l=(await Yl(t,[{teamfile:s.teamfile,alias:s.alias}])).get(ji(s.teamfile,s.alias))??Cf(),c=await Ky(t,{teamfile:s.teamfile,alias:s.alias}),d=Yy(s.teamfile),u=d.kind==="repo"?d:null,f={provider:o.provider,sessionid:o.sessionId,seeded:!0,alias:s.alias,teamfile:s.teamfile,reportPath:s.alias,cwd:o.cwd,messageCount:o.messageCount??null,model:s.model??null,observed_model:o.model??null,lastContext:o.lastInputTokens??null,liveness:l,totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,...c!==void 0?{config_warnings:c}:{},...u!==null?{activitySinceLastCommit:{messageCount:Qy(o,u.since),tokens:null},cumulativeTokens:Zy(o)}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};if(r)return Y(t,{schema_version:AE,scope:"member",...f}),0;let m=[];if(m.push(`Session: ${o.sessionId}`),m.push(` Provider: ${o.provider}`),m.push(` Alias: ${s.alias}`),m.push(` Liveness: ${Of(l)}`),m.push(` CWD: ${o.cwd}`),m.push(` Messages: ${kn(o.messageCount)}`),m.push(` Model (declared): ${s.model??"(none)"}`),m.push(` Model (observed): ${o.model??"(unknown)"}`),c!==void 0)for(let p of c)m.push(` Config NOT applied: ${p}`);if(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)m.push(" Tokens: n/a");else{let p=` Tokens: ${(0,Wt.formatCount)(o.totalInputTokens)} in / ${(0,Wt.formatCount)(o.totalOutputTokens)} out`;f.totalCachedInputTokens!==void 0&&(p+=` (cached: ${(0,Wt.formatCount)(f.totalCachedInputTokens)})`),m.push(p)}return(o.totalInputTokens===void 0||o.totalOutputTokens===void 0)&&m.push(" n/a = this provider does not expose a context/token total; absence is not a health signal."),m.push(` lastContext = prompt size of the LAST COMPLETED turn; it LAGS BY ONE TURN. Right after a
|
|
2539
2542
|
compaction it still reports the pre-compaction size (the summarisation request itself).`),i!==null&&m.push(` SessionLimit: LIMITED resets_at=${zy(i)}`),m.push(` Created: ${f.createdAt}`),m.push(` Modified: ${f.modifiedAt}`),t.stdout.write(`${m.join(`
|
|
2540
2543
|
`)}
|
|
2541
2544
|
`),0}var Wt,nY,AE,bm,rY,EE,kO,oY,MO,NE=C(()=>{"use strict";Wt=hn(sn(),1);Tn();hE();on();he();Zu();Kn();Ll();Qn();Nt();ew();Qd();Fn();IO();za();nY=`usage: lmctl status [--json] [--since <duration|ISO8601>]
|
|
@@ -2558,20 +2561,20 @@ breakdown, liveness with terminal-lock/in-flight holder info).
|
|
|
2558
2561
|
|
|
2559
2562
|
--json emits { schema_version: 2, scope: 'self'|'db'|'team'|'member', ... }.
|
|
2560
2563
|
`,AE=2,bm=5,rY=24*60*60*1e3,EE=72,kO=80;oY={name:"status",allowsBareTeamfile:!0,supportsRaw:!1};MO=new WeakMap});var OE={};ge(OE,{_setRunningWatchMaxTicksForTests:()=>$Y,runRunning:()=>qY});import{resolve as DY}from"node:path";function $Y(t){RE=t??void 0}function UY(t,e,n,r){let s=new Map,o=l=>l.split(/[\\/]/).pop().replace(/\.(lmctl|lmbee)$/i,""),i=(l,c,d,u,f,m,p,_,h,g)=>{if(!l||!c||d!=="chat"&&d!=="exec")return;let w=`${l}#${c}`,y=En(e,l,c),E=y.busy&&y.reason==="terminal-held",v=u==="running"&&f!=="dead"||y.busy,b={id:w,team_path:l,team:o(l),member:c,kind:d,state:u,liveness:f??(E?"live":null),model:m,started_at:p,last_activity_at:_,busy:v,terminal_held:E,can_prompt:!v,cannot_prompt_reason:v?E?"terminal-held":"busy":null,sender_identity:h,completed_run:g},k=s.get(w);(!k||(b.last_activity_at??"")>(k.last_activity_at??""))&&s.set(w,b)};for(let l of t.running){let c=l.target?.lastIndexOf(":")??-1;i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,"running",l.holder_liveness,l.model,l.started_at,l.last_heartbeat_at??l.started_at,l.from_identity,null)}for(let l of t.dead){let c=l.target?.lastIndexOf(":")??-1;i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,"error","dead",l.model,l.started_at,l.started_at,l.from_identity,{ended_at:l.started_at,elapsed_ms:l.age_ms,error:"invocation holder exited before completion"})}for(let l of t.idle){let c=l.target?.lastIndexOf(":")??-1,d=l.status==="done"?"done":"error";i(c>0?l.target.slice(0,c):null,c>0?l.target.slice(c+1):null,l.kind,d,null,l.model,l.started_at,l.ended_at,l.from_identity,{ended_at:l.ended_at,elapsed_ms:l.ran_ms,error:l.error})}let a=n.getTime()-r.sinceMs;return[...s.values()].filter(l=>r.state===void 0||r.state==="all"||l.state===r.state).filter(l=>r.kind===void 0||l.kind===r.kind).filter(l=>r.team===void 0||l.team.toLowerCase()===r.team.toLowerCase()||l.team_path.toLowerCase()===r.team.toLowerCase()).filter(l=>r.member===void 0||l.member.toLowerCase()===r.member.toLowerCase()).filter(l=>r.model===void 0||(l.model??"").toLowerCase().includes(r.model.toLowerCase())).filter(l=>l.state==="running"||l.last_activity_at!==null&&Date.parse(l.last_activity_at)>=a).sort((l,c)=>(c.last_activity_at??"").localeCompare(l.last_activity_at??"")).slice(0,r.limit)}function FY(t){let e=t.split(`
|
|
2561
|
-
`,1)[0];return e.length<=LE?e:`${e.slice(0,LE)}\u2026`}function CE(t){return t.target!==null?fr(t.target):t.from_identity}function FO(t){return[(0,
|
|
2564
|
+
`,1)[0];return e.length<=LE?e:`${e.slice(0,LE)}\u2026`}function CE(t){return t.target!==null?fr(t.target):t.from_identity}function FO(t){return[(0,xn.escapeCell)(CE(t)),t.kind,"running",t.holder_liveness,(0,xn.escapeCell)(t.model),Ac(t.started_at)]}function jO(t){return[(0,xn.escapeCell)(CE(t)),t.kind,"DEAD","",(0,xn.escapeCell)(t.model),`started ${Ac(t.started_at)}, holder process confirmed dead`]}function WO(t){let e=`ran ${km(t.ran_ms)}, idle ${Ac(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${(0,xn.escapeCell)(Nd(t.error,LE)??FY(t.error))}`),[(0,xn.escapeCell)(CE(t)),t.kind,t.status,"",(0,xn.escapeCell)(t.model),e]}function xE(t){return t.filter(e=>e!=="").join(" ")}function WY(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 HY(t){let{roots:e,childrenByParent:n}=WY(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 BY(t){let e=[...t.running.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:xE(FO(r))})),...t.dead.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:xE(jO(r))})),...t.idle.map(r=>({id:r.id,parent_invocation_id:r.parent_invocation_id,started_at:r.started_at,line:xE(WO(r))}))],n=HY(e);return`${n.length>0?n.join(`
|
|
2562
2565
|
`):" none"}
|
|
2563
|
-
`}function XY(t,e){let n=[{title:`Running (${t.running.length}):`,rows:t.running.map(FO)},{title:`Dead (reclaimable) (${t.dead.length}):`,rows:t.dead.map(jO)},{title:`Idle, finished in the last ${km(e)} (${t.idle.length}):`,rows:t.idle.map(WO)}],r=["MEMBER","KIND","STATE","LIVENESS","MODEL","TIMING"],s=(0,
|
|
2566
|
+
`}function XY(t,e){let n=[{title:`Running (${t.running.length}):`,rows:t.running.map(FO)},{title:`Dead (reclaimable) (${t.dead.length}):`,rows:t.dead.map(jO)},{title:`Idle, finished in the last ${km(e)} (${t.idle.length}):`,rows:t.idle.map(WO)}],r=["MEMBER","KIND","STATE","LIVENESS","MODEL","TIMING"],s=(0,xn.measureColumns)([{rows:[],headers:r},...n.map(a=>a.rows)],{max:jY}),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,xn.renderGrid)(a.rows,{widths:s,margin:2,...c?{headers:r}:{}}))}),`${i.join(`
|
|
2564
2567
|
`)}
|
|
2565
2568
|
`}async function qY(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${PY}
|
|
2566
2569
|
`),0;let n=de(t,["--team","--member","--since","--watch-interval","--state","--kind","--model","--limit"],["--json","--tree","--watch","--reconcile"]);if(n.error!==void 0)return O(e,n.error);let r=z(n,"--json"),s=z(n,"--tree"),o=z(n,"--watch"),i=F(n,"--team"),a=F(n,"--member"),l=yE(F(n,"--since"));if("error"in l)return O(e,l.error);let c=F(n,"--state");if(c!==void 0&&!["running","done","error","all"].includes(c))return O(e,`invalid --state "${c}" (expected running, done, error, or all)`);let d=F(n,"--kind");if(d!==void 0&&!["chat","exec"].includes(d))return O(e,`invalid --kind "${d}" (expected chat or exec)`);let u=F(n,"--limit"),f=u===void 0?void 0:Number(u);if(f!==void 0&&(!Number.isInteger(f)||f<1))return O(e,`invalid --limit "${u}" (expected a positive integer)`);let m=F(n,"--watch-interval"),p=m===void 0?MY:Number.parseInt(m.replace(/s$/,""),10);if(!Number.isFinite(p)||p<1)return O(e,`invalid --watch-interval "${m}" (expected <N>s, N\u22651)`);let _=()=>q(e,async h=>{let g=cO({cwd:DY(e.cwd??process.cwd()),env:e.env??process.env,dal:h,dbPath:Pe(e)});if(g.status!=="ok")return O(e,g.error);let w=await TO(g,{teamfile:r?void 0:i,member:a,since:F(n,"--since"),tree:s,reconcile:z(n,"--reconcile")});if(w.status!=="ok")return O(e,w.error??"listRunning failed");if(r){let y=new Date,E={generated_at:y.toISOString(),sessions:UY(w,h,y,{sinceMs:l.windowMs,state:c,kind:d,team:i,member:a,model:F(n,"--model"),limit:f})};return o?e.stdout.write(`${JSON.stringify(E)}
|
|
2567
2570
|
`):Y(e,E),0}return e.stdout.write(s?BY(w):XY(w,l.windowMs)),0});return o?await new Promise(h=>{let g=0,w=!1,y=v=>{clearInterval(v),h(0)},E=async v=>{if(!w){w=!0;try{await _()}catch(b){e.stderr.write(`running: ${b instanceof Error?b.message:String(b)}
|
|
2568
|
-
`)}finally{w=!1}g+=1,RE!==void 0&&g>=RE&&y(v)}},T=setInterval(()=>{E(T)},p*1e3);E(T),process.once("SIGINT",()=>y(T)),process.once("SIGTERM",()=>y(T))}):_()}var
|
|
2571
|
+
`)}finally{w=!1}g+=1,RE!==void 0&&g>=RE&&y(v)}},T=setInterval(()=>{E(T)},p*1e3);E(T),process.once("SIGINT",()=>y(T)),process.once("SIGTERM",()=>y(T))}):_()}var xn,MY,RE,PY,LE,jY,DE=C(()=>{"use strict";xn=hn(sn(),1);_m();vO();Tn();he();NE();on();MY=2;PY=["usage: lmctl running [--json] [--since <duration|ISO8601>] [--state running|done|error|all]"," [--kind chat|exec] [--team <name-or-path>] [--member <alias>] [--model <name>] [--limit <N>]"," [--tree] [--reconcile] [--watch] [--watch-interval Ns]","","JSON mode lists stable team/member sessions from lmctl state, never provider session IDs.","The default lookback is 24h; active sessions are included regardless of age.","Filters combine. --team accepts a team name or path; --state defaults to all.","--since filters completed activity. --limit must be a positive integer.","can_prompt is evaluated from current lmctl activity and terminal reservations.","","Text mode 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 holder, or unknown liveness.'," Unknown includes recent heartbeat/dispatch evidence contradicting a"," dead historical PID; it does not certify that the member is live now.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead without contrary activity evidence. Its age (time"," since it started; the moment the holder died is not recorded) is",' reported as "age_ms", 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","not time-filtered. --since also bounds the later-dispatch evidence used","to distinguish dead from unknown; a recent advancing heartbeat counts too.","","Looking is read-only: a dead holder is listed under Dead and left as it is.","Dispatch reconciles dead holders for its receiver. Scheduled lmctl cron maintenance","explicitly opts into --reconcile, which aborts confirmed-dead rows and","terminalizes their linked messages. Unknown rows are never reconciled here.","","--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`).","","Queries lmctl's own database only -- never touches native provider","session files."].join(`
|
|
2569
2572
|
`);LE=120;jY=[26,void 0,void 0,void 0,24,void 0]});var ME={};ge(ME,{runFoldedView:()=>JY});async function JY(t,e,n){let r=e.includes("--json"),s=e.filter(o=>!o.startsWith("--"));try{return await q(n,o=>{if(t==="teams"){let i=o.listRootTeams().map(a=>({name:a.name??a.teamfile_path,team:a.name??a.teamfile_path,path:a.teamfile_path,channel:"local"}));if(r)Y(n,{teams:i});else for(let a of i)n.stdout.write(`${a.name} ${a.path}
|
|
2570
2573
|
`);return 0}if(t==="history"){let i=s.find(u=>/^\d+$/.test(u)),a=Math.max(1,Math.min(500,Number(i??20))),l=s.find(u=>!/^\d+$/.test(u)),d=o.db.prepare(`SELECT id, created_at AS ts, root_teamfile AS team, sender_alias, receiver_alias, message, response, status FROM team_chat_log ${l?"WHERE root_teamfile = ?":""} ORDER BY id DESC LIMIT ?`).all(...l?[l,a]:[a]).reverse();if(r)Y(n,{events:d});else for(let u of d)n.stdout.write(`${String(u.ts)} ${String(u.team)} ${String(u.status)}
|
|
2571
2574
|
`);return 0}if(t==="state"){let i=s[0],a=o.db.prepare("SELECT t.name AS team, m.alias, m.state AS status, m.state_reason AS reason, m.state_updated_at AS updated_at FROM team t JOIN team_member m ON m.team_id=t.id ORDER BY t.name, m.alias").all();if(i==="get"){let d=s[1],u=a.filter(f=>f.team===d);if(r)Y(n,{team:{name:d,state:u[0]??null}});else for(let f of u)n.stdout.write(`${String(f.team)}:${String(f.alias)} ${String(f.status)}
|
|
2572
2575
|
`);return u.length||!d?0:1}if(i==="active"){let d=HO(a);if(r)Y(n,{active:d});else for(let u of d)n.stdout.write(`${String(u)}
|
|
2573
2576
|
`);return 0}if(i!=="list")return O(n,"usage: lmctl state list|get|active [--json]");let l=a.map(d=>({team:d.team,state:d})),c=HO(a);if(r)Y(n,{teams:l,active:c});else for(let d of a)n.stdout.write(`${String(d.team)}:${String(d.alias)} ${String(d.status)}
|
|
2574
|
-
`);return 0}return O(n,`unsupported folded view: ${t}`)})}catch(o){return O(n,`${t}: ${o instanceof Error?o.message:String(o)}`)}}var GY,HO,$E=C(()=>{"use strict";he();he();GY=t=>t!=="idle"&&t!=="retired",HO=t=>[...new Set(t.filter(e=>GY(e.status)).map(e=>String(e.team)))]});import{mkdtempSync as VY,readFileSync as KY,rmSync as zY,writeFileSync as YY}from"node:fs";import{tmpdir as QY}from"node:os";import{spawnSync as ZY}from"node:child_process";import{basename as Am,extname as PE,join as UE,resolve as FE}from"node:path";import*as BO from"node:readline";function e8(t){return e=>{let n=t.EDITOR??t.VISUAL??"vi";ZY(n,[e],{stdio:"inherit"})}}async function XO(t){let{io:e,cwd:n,env:r=process.env}=t,s=t.initial??{},o=BO.createInterface({input:t.input,output:e.stdout,terminal:!1}),i=[],a=[];o.on("line",u=>{let f=a.shift();f!==void 0?f(u):i.push(u)});let l=!1;o.on("close",()=>{for(l=!0;a.length>0;)a.shift()("")});let c=async u=>{e.stdout.write(u);let f=i.shift();return f!==void 0?f.trim():l?"":new Promise(m=>a.push(p=>m(p.trim())))},d=()=>o.close();try{let u,f;if(s.output!==void 0)u=FE(n,s.output),f=Am(u,PE(u));else{let g=FE(n,t.directory??"."),w=await c(`Directory [${g}]: `),y=w===""?g:FE(n,w),E=`${Am(y)}.lmctl`,T=await c(`Teamfile name [${E}]: `),v=T===""?E:T,b=PE(v)?v:`${v}.lmctl`;u=UE(y,b),f=Am(b,PE(b))}let m;if(s.members!==void 0&&s.members.length>0)m=s.members.map(g=>({...g,model:g.model??s.model}));else{let g=Ci(
|
|
2577
|
+
`);return 0}return O(n,`unsupported folded view: ${t}`)})}catch(o){return O(n,`${t}: ${o instanceof Error?o.message:String(o)}`)}}var GY,HO,$E=C(()=>{"use strict";he();he();GY=t=>t!=="idle"&&t!=="retired",HO=t=>[...new Set(t.filter(e=>GY(e.status)).map(e=>String(e.team)))]});import{mkdtempSync as VY,readFileSync as KY,rmSync as zY,writeFileSync as YY}from"node:fs";import{tmpdir as QY}from"node:os";import{spawnSync as ZY}from"node:child_process";import{basename as Am,extname as PE,join as UE,resolve as FE}from"node:path";import*as BO from"node:readline";function e8(t){return e=>{let n=t.EDITOR??t.VISUAL??"vi";ZY(n,[e],{stdio:"inherit"})}}async function XO(t){let{io:e,cwd:n,env:r=process.env}=t,s=t.initial??{},o=BO.createInterface({input:t.input,output:e.stdout,terminal:!1}),i=[],a=[];o.on("line",u=>{let f=a.shift();f!==void 0?f(u):i.push(u)});let l=!1;o.on("close",()=>{for(l=!0;a.length>0;)a.shift()("")});let c=async u=>{e.stdout.write(u);let f=i.shift();return f!==void 0?f.trim():l?"":new Promise(m=>a.push(p=>m(p.trim())))},d=()=>o.close();try{let u,f;if(s.output!==void 0)u=FE(n,s.output),f=Am(u,PE(u));else{let g=FE(n,t.directory??"."),w=await c(`Directory [${g}]: `),y=w===""?g:FE(n,w),E=`${Am(y)}.lmctl`,T=await c(`Teamfile name [${E}]: `),v=T===""?E:T,b=PE(v)?v:`${v}.lmctl`;u=UE(y,b),f=Am(b,PE(b))}let m;if(s.members!==void 0&&s.members.length>0)m=s.members.map(g=>({...g,model:g.model??s.model}));else{let g=Ci(In(e.env??process.env,t.initConfigPath)),w=[...new Set(g===null?[]:Object.values(g).map(k=>k.provider))];e.stdout.write(`Providers from lmctl init: ${w.length>0?w.join(", "):"(none saved; run lmctl init to save suggestions)"}
|
|
2575
2578
|
`),e.stdout.write(`You can type another provider.
|
|
2576
2579
|
`);let y=s.provider??g?.provider1.provider,E=s.provider??(w.length===1?w[0]:void 0);for(;E===void 0;){let k=await c(`Default provider${y!==void 0?` [${y}]`:""}: `),I=k===""?y:k;if(I===void 0){if(l)return e.stderr.write(`error: stdin closed (EOF) at the provider prompt and no default is available
|
|
2577
2580
|
`),d(),null;continue}if(cn({alias:"Probe",provider:I})!==void 0){e.stdout.write(`unknown provider "${I}" (known: ${Object.keys(Ri).join(", ")})
|
|
@@ -2597,7 +2600,7 @@ ${p}---
|
|
|
2597
2600
|
`),2;r.push(x),A+=1;continue}s.push(S)}let o=de(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}
|
|
2598
2601
|
`),e.stderr.write(`usage: lmctl plan [directory] [options]
|
|
2599
2602
|
`),2;if(o.positionals.length>1)return e.stderr.write(`usage: lmctl plan [directory] [options]
|
|
2600
|
-
`),2;let i=e.cwd??process.cwd(),a=o.positionals[0],l=F(o,"--pattern"),c=F(o,"--provider"),d=F(o,"--model"),u=F(o,"--from"),f=F(o,"--output"),m=z(o,"--json"),p=z(o,"--stdout"),_=z(o,"--force"),h=z(o,"--seed"),g=z(o,"--no-seed"),w=z(o,"--wizard"),y=
|
|
2603
|
+
`),2;let i=e.cwd??process.cwd(),a=o.positionals[0],l=F(o,"--pattern"),c=F(o,"--provider"),d=F(o,"--model"),u=F(o,"--from"),f=F(o,"--output"),m=z(o,"--json"),p=z(o,"--stdout"),_=z(o,"--force"),h=z(o,"--seed"),g=z(o,"--no-seed"),w=z(o,"--wizard"),y=Dn(e)||m||z(o,"--non-interactive")||z(o,"--no-interactive");if(m&&p)return e.stderr.write(`error: --json and --stdout are mutually exclusive
|
|
2601
2604
|
`),2;if(p&&h)return e.stderr.write(`error: --seed requires a written teamfile; it cannot be combined with --stdout
|
|
2602
2605
|
`),2;if(h&&g)return e.stderr.write(`error: --seed and --no-seed are mutually exclusive
|
|
2603
2606
|
`),2;if(w&&p)return e.stderr.write(`error: --wizard cannot be combined with --stdout
|
|
@@ -2607,7 +2610,7 @@ ${p}---
|
|
|
2607
2610
|
`),2;if(l!==void 0&&r.length>0)return e.stderr.write(`error: --pattern and --member are mutually exclusive
|
|
2608
2611
|
`),2;let A=ZO(r,d,S=>{e.stderr.write(`error: ${S}
|
|
2609
2612
|
`)});if(A.error!==void 0)return 1;I=await c8(e,T,i,a,{provider:c,model:d,pattern:l,members:A.members,seed:!g,output:f},n)}else{if(!E)return e.stderr.write(`error: ${QO}
|
|
2610
|
-
`),2;let A=await d8({pattern:l,provider:c,model:d,from:u,memberRaws:r,output:f,directory:a,cwd:i,seedFlag:h,deps:{...n,initConfigPath:
|
|
2613
|
+
`),2;let A=await d8({pattern:l,provider:c,model:d,from:u,memberRaws:r,output:f,directory:a,cwd:i,seedFlag:h,deps:{...n,initConfigPath:In(e.env??process.env,n.initConfigPath)}},S=>{e.stderr.write(`error: ${S}
|
|
2611
2614
|
`)});if(typeof A=="number")return A;I=A}if(I===null)return e.stderr.write(`aborted
|
|
2612
2615
|
`),1;if(p)return e.stdout.write(I.text),0;let N=I.destPath;return f8(I,N,{asJson:m,force:_,seed:I.seed},e)}async function c8(t,e,n,r,s,o){let i=await XO({io:t,input:e,cwd:n,...r!==void 0?{directory:r}:{},initial:s,...o.initConfigPath!==void 0?{initConfigPath:o.initConfigPath}:{},...o.loadModels!==void 0?{loadModels:o.loadModels}:{},...o.editFile!==void 0?{editFile:o.editFile}:{},...t.env!==void 0?{env:t.env}:{}});return i===null?null:{text:i.text,destPath:i.destPath,members:qO(i.text),seed:i.seed}}async function d8(t,e){let{pattern:n,provider:r,model:s,from:o,memberRaws:i,output:a,directory:l,cwd:c,seedFlag:d,deps:u}=t,f=[n!==void 0,i.length>0,o!==void 0].filter(Boolean).length;if(f===0)return e(QO),2;if(f>1)return e("--pattern, --member and --from are mutually exclusive"),2;if(o!==void 0&&(r!==void 0||s!==void 0))return e("--from cannot be combined with --provider or --model (the source teamfile defines the roster)"),2;let m=u8(a,l,c);if(o!==void 0){let h;try{h=await ia(o,u.fetchFn??globalThis.fetch,c)}catch(y){return e(y instanceof Error?y.message:String(y)),1}let g=Xx(h),w=vf(g);return w.length===0?(e(`--from source "${o}" has no parseable _MEMBER_ lines`),1):{text:g,destPath:m,members:w,seed:d}}let p;if(i.length>0){let h=ZO(i,s,e);if(h.error!==void 0)return 1;p=h.members}else{let h=Wx(n);if(h===void 0)return e(`invalid pattern "${n}" (expected ${Tf})`),2;if(r!==void 0){let g=cn({alias:"Lead",provider:r});if(g!==void 0)return e(g),1;p=h.map(w=>({alias:w,provider:r,...s!==void 0?{model:s}:{}}))}else{let g=Ci(u.initConfigPath);if(g===null)return e("missing --provider, and no ~/.lmctl/init.toml found. Run `lmctl init` first, or pass --provider explicitly."),2;let w=[g.provider1,g.provider2,g.provider3];p=h.map((y,E)=>{let T=w[E%w.length];return{alias:y,provider:T.provider,model:s??T.model1}})}}let _=zO(m,i8(m));return{text:Ns({teamName:_,members:p}),destPath:m,members:p,seed:d}}function ZO(t,e,n){if(t.length===0)return{members:void 0};let r=[],s=new Set;for(let o of t){let i=Hx(o);if(i.error!==void 0)return n(i.error),{error:i.error};let a=i.spec,l=a.alias.toLowerCase();if(s.has(l))return n(`duplicate member alias "${a.alias}"`),{error:l};s.add(l),r.push({...a,model:a.model??e})}return r[0].alias.toLowerCase()!=="lead"?(n(`the first member must be Lead (got "${r[0].alias}")`),{error:"lead-not-first"}):{members:r}}function u8(t,e,n){if(t!==void 0)return WE(n,t);let r=WE(n,e??".");return YO(r,`${zO(r)}.lmctl`)}async function f8(t,e,n,r){if(KO(e)&&!n.force)return r.stderr.write(`error: ${e} already exists (use --force to overwrite)
|
|
2613
2616
|
`),1;t8(o8(e),{recursive:!0}),s8(e,t.text,"utf8");let s=n.asJson?{...r,stdout:{write:()=>{}}}:r;if(!(await As([e],s)===0))return n.seed&&r.stderr.write(`error: refusing to seed \u2014 lint failed
|
|
@@ -2831,7 +2834,7 @@ copy, in that order.`});function VD(t,e={}){return t.query("SELECT * FROM run OR
|
|
|
2831
2834
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2832
2835
|
|
|
2833
2836
|
List native provider sessions in scope, or list recent managed runs with --runs.`,d3=50,zD=500});import{closeSync as ZD,openSync as h3,writeFileSync as eM,fsyncSync as _3,renameSync as g3,unlinkSync as y3,lstatSync as zE,readFileSync as w3}from"node:fs";import{randomUUID as E3}from"node:crypto";import{dirname as T3,join as v3}from"node:path";function $m(t,e,n){let r=()=>n===null?(()=>{try{return zE(t),!0}catch(a){if(a.code==="ENOENT")return!1;throw a}})():!w3(t).equals(Buffer.from(n,"utf8")),s=384;if(n!==null){let a=zE(t);if(!a.isFile())throw new Error("Profile path must be a regular file: "+t);if(s=a.mode&511,!(s&146))throw new Error("Profile is read-only: "+t)}let o=v3(T3(t),".init-"+E3()+".tmp"),i;try{if(i=h3(o,"wx",s),eM(i,e,"utf8"),_3(i),ZD(i),i=void 0,r())throw new Error("Profile changed concurrently: "+t);if(n!==null){let a=t+".bak";try{if(!zE(a).isFile())throw new Error("Backup path is not a regular file: "+a)}catch(l){if(l.code!=="ENOENT")throw l}if(eM(a,n,{encoding:"utf8",flag:"w",mode:s}),r())throw new Error("Profile changed concurrently: "+t)}g3(o,t)}finally{i!==void 0&&ZD(i);try{y3(o)}catch(a){if(a.code!=="ENOENT")throw a}}}var tM=C(()=>{"use strict"});var nM={};ge(nM,{runInit:()=>N3});import{mkdirSync as S3,readFileSync as b3}from"node:fs";import{dirname as I3}from"node:path";function A3(t){try{return new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(b3(t))}catch(e){if(e.code==="ENOENT")return null;throw new vt(t,"read",e.message)}}async function N3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(k3),0;let r=t.includes("--force"),s=t.find(i=>i!=="--force"&&i!=="--help"&&i!=="-h");if(s!==void 0)return e.stderr.write(`error: unknown argument: ${s}
|
|
2834
|
-
`),2;let o=
|
|
2837
|
+
`),2;let o=In(e.env??process.env,n.configPath);try{let i=Ex((n.detectProviders??wf)()),a=A3(o);if(i.length===0)return e.stderr.write(`error: no supported provider is installed -- looked for ${Li.join(", ")} on PATH (each must run \`<name> --version\`). ${a===null?"Nothing was written":`${o} was left unchanged`}; install a provider CLI, then run this again.
|
|
2835
2838
|
`),1;let l=[],c={},d=[];for(let p of i)try{let _=await(n.modelsForProvider??Tx)(p);if(_.length===0)throw new Error(`No model ids are available for detected provider "${p}"`);l.push(p),c[p]=_}catch(_){let h=_ instanceof Error?_.message:String(_),g=`${p}: ${h}`;d.push(g),e.stderr.write(`warning: ${p} model catalog unavailable (${h}); skipping this provider.
|
|
2836
2839
|
`)}if(l.length===0)return e.stderr.write(`error: no detected provider returned model ids (${d.join("; ")}). Nothing was written.
|
|
2837
2840
|
`),1;let u=vx(l,c);e.stderr.write(`notice: installed: ${i.join(", ")} -- provider slots use order (${Li.join(", ")}); model1 uses each provider's first reported id
|
|
@@ -2896,7 +2899,7 @@ it is expected.
|
|
|
2896
2899
|
--force Regenerate the whole example file from detection (previous file
|
|
2897
2900
|
saved as init.toml.bak). Slots you added are NOT kept by --force.
|
|
2898
2901
|
-h, --help display help for command
|
|
2899
|
-
`});function sM(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 oM=C(()=>{"use strict"});import{execFileSync as x3}from"node:child_process";import{resolve as iM}from"node:path";function R3(t){return t.filter(e=>e.state!=="retired")}function aM(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?O(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=x3("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return O(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let o=iM(s),i=e.listProjects().find(a=>iM(a.local_path)===o);return i===void 0?O(t,`terminal cannot infer a member from cwd ${o}; use \`lmctl terminal <teamfile> <alias>\``):i}function lM(t,e,n,r){if(r!==void 0){let o=e.findTeamByName(r);return o===null?O(t,`team not found: ${r}`):o}let s=e.getTeam(n.team_id);return s===null?O(t,`project ${n.name} has no assigned team; use --team <name>`):s}function cM(t,e,n,r){if(r!==void 0){let o=e.findTeamMemberByAlias(n.id,r);return o===null||o.state==="retired"?O(t,`member not found: ${r}`):o}let s=R3(e.listTeamMembers(n.id)).find(o=>o.role==="agent");return s===void 0?O(t,`team ${n.name} has no active agent member`):s}var dM=C(()=>{"use strict";he()});function uM(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 fM=C(()=>{"use strict"});var _M={};ge(_M,{SIZE_WARN_EST_TOKENS:()=>Rc,estimateTokens:()=>hM,runTeamTerminal:()=>M3,runTerminal:()=>QE});import{constants as L3}from"node:os";import{spawn as C3}from"node:child_process";import{statSync as O3}from"node:fs";async function QE(t,e){if(t.includes("--help")||t.includes("-h"))return j3(e);let n=de(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return O(e,n.error);if(
|
|
2902
|
+
`});function sM(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 oM=C(()=>{"use strict"});import{execFileSync as x3}from"node:child_process";import{resolve as iM}from"node:path";function R3(t){return t.filter(e=>e.state!=="retired")}function aM(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?O(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=x3("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return O(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let o=iM(s),i=e.listProjects().find(a=>iM(a.local_path)===o);return i===void 0?O(t,`terminal cannot infer a member from cwd ${o}; use \`lmctl terminal <teamfile> <alias>\``):i}function lM(t,e,n,r){if(r!==void 0){let o=e.findTeamByName(r);return o===null?O(t,`team not found: ${r}`):o}let s=e.getTeam(n.team_id);return s===null?O(t,`project ${n.name} has no assigned team; use --team <name>`):s}function cM(t,e,n,r){if(r!==void 0){let o=e.findTeamMemberByAlias(n.id,r);return o===null||o.state==="retired"?O(t,`member not found: ${r}`):o}let s=R3(e.listTeamMembers(n.id)).find(o=>o.role==="agent");return s===void 0?O(t,`team ${n.name} has no active agent member`):s}var dM=C(()=>{"use strict";he()});function uM(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 fM=C(()=>{"use strict"});var _M={};ge(_M,{SIZE_WARN_EST_TOKENS:()=>Rc,estimateTokens:()=>hM,runTeamTerminal:()=>M3,runTerminal:()=>QE});import{constants as L3}from"node:os";import{spawn as C3}from"node:child_process";import{statSync as O3}from"node:fs";async function QE(t,e){if(t.includes("--help")||t.includes("-h"))return j3(e);let n=de(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return O(e,n.error);if(Dn(e)&&!z(n,"--size"))return O(e,"terminal opens an interactive TUI; non-interactive mode is enabled");let r=F(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return O(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return O(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?z(n,i):F(n,i)!==void 0)return O(e,`--run is mutually exclusive with ${i}`);try{return await q(e,async i=>{let a=F(n,"--alias"),l=uM(i,s,a);return"err"in l?O(e,l.err):ZE(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 vn(e,i)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?z(n,l):F(n,l)!==void 0)return O(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return O(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=n.positionals[0],i=n.positionals[1],a=Zn(D3,{target:o,alias:i,flags:{}});return a.mode==="error"?O(e,a.message):a.mode!=="ai-team"?O(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?O(e,"terminal: alias required for the teamfile target"):await q(e,l=>pM(e,a.teamfile,a.alias,l,z(n,"--json")))}try{return await q(e,async s=>{let o=P3(e,s,n);if(typeof o=="number")return o;let i=F(n,"--alias");return z(n,"--size")?F3(e,s,o,i,z(n,"--json")):U3(e,s,o,i)})}catch(s){return vn(e,s)}}async function M3(t,e,n,r,s){let o=await pM(t,e,n,r,!1,s);return{code:s.signalObserved?null:o,signal:s.signalObserved??null}}async function pM(t,e,n,r,s,o){let i;try{i=lt(e,n,r)}catch(x){return x instanceof De?O(t,x.message):vn(t,x)}let a=ls(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ms(o?.env??t.env)});if(!a.acquired){let x=a.current.holder_pid,R=x===null?null:$t(x)?"live":"dead",L=`${i.alias} is busy/held by ${a.current.sender_alias} (${a.current.sender_teamfile}) since ${a.current.started_at} `+(x===null?"(holder_pid=unavailable)":`(holder_pid=${x}, ${R})`);return s?(Y(t,{status:"error",errorKind:"busy",message:L,holder_pid:x,holder_liveness:R}),1):O(t,L)}let l=TN({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,w,y,E=x=>{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&&x.push("terminal lock release was not acknowledged")}catch(R){x.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&&x.push("inflight release was not acknowledged")}catch(R){x.push(`inflight release: ${R instanceof Error?R.message:String(R)}`)}},T=(x,R)=>{let L=r.db.pragma("busy_timeout",{simple:!0});r.db.pragma("busy_timeout=0");try{x(R)}finally{try{r.db.pragma(`busy_timeout=${L}`)}catch(D){R.push(`busy timeout restore: ${D instanceof Error?D.message:String(D)}`)}}},v=(x,R)=>{if(!(d===null||h))try{if(r.finishTrackedInvocation(d,x)===null){let D=r.getTrackedInvocation(d);D==null||D.status==="running"?R.push("tracked terminal finish was not acknowledged"):h=!0}else h=!0}catch(L){R.push(`tracked terminal finish: ${L instanceof Error?L.message:String(L)}`)}},b=x=>{if(p)return;p=!0;let R=[];try{T(L=>{E(L),v({status:"cancelled",signal:x,exit_code:x==="SIGINT"?130:143,error:`terminal interrupted by ${x}`},L)},R)}catch(L){R.push(L instanceof Error?L.message:String(L))}R.length>0&&(_=Error(R.join("; ")))},k=!o,I=k?new AbortController:void 0,N=()=>I?.abort("SIGINT"),A=()=>I?.abort("SIGTERM");k&&(process.once("SIGINT",N),process.once("SIGTERM",A));let S=o??{env:m,signal:I?.signal};S.env=m;try{if(S.cancel=b,S.cleanupError=()=>_,o&&o.onResource?.({close(){if(w)return w;let L,D;w=new Promise((P,j)=>{L=P,D=j});let M=performance.now();return(async()=>{if(b("SIGTERM"),o.stop?.("SIGTERM"),_)throw _;if(g){let P=5e3-(performance.now()-M),j;try{if(P<=0)throw Error("terminal close deadline exceeded");await Promise.race([g.catch(()=>{}),new Promise(($,pe)=>{j=setTimeout(()=>pe(Error("terminal close deadline exceeded")),P)})])}catch($){throw _=$ instanceof Error?$:Error(String($)),_}finally{clearTimeout(j)}}})().then(L,D),w},finalizeSync(L){if(b(L),o.stop?.(L),_)throw _}}),p||S.signal?.aborted){let L=S.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM";return b(L),L==="SIGINT"?130:143}r.setTerminalLock(l),d=$3(r,i,m,o?.pid),d!==null&&(m.LMCTL_INVOCATION_ID=String(d));let x=r.getRootTeam(i.teamfile)?.name??null;x!==null&&(m.LMBEE_TEAM_NAME=x),c=setInterval(()=>{try{let L=new Date().toISOString(),D=r.heartbeatTerminalLock(l.teamfile,l.alias,l.lock_id,L);D&&r.heartbeatAgentInflight(a.lease,a.leaseId,L),!D&&c!==null&&(clearInterval(c),c=null)}catch{}},vN(m)),c.unref?.();try{di(t,Fe(i.teamfile),i.teamfile)}catch{}let R=S;return g=ZE(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead},L=>{f.push(`${L.provider} terminal ignored model=${L.model}: ${L.reason}`)},R),u=await g,u}catch(x){throw y=x,x}finally{if(k&&(process.removeListener("SIGINT",N),process.removeListener("SIGTERM",A)),!p){p=!0;let x=[];try{T(R=>{E(R),v({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)},x)}catch(R){x.push(R instanceof Error?R.message:String(R))}x.length>0&&(_=Error(x.join("; ")))}if(_){if(y===void 0)throw _;try{t.stderr.write("error: terminal cleanup: "+_.message+`
|
|
2900
2903
|
`)}catch{}}}}function $3(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:ti(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 ZE(t,e,n,r){let{provider:s,sessionid:o,sessiondir:i,model:a}=e;if(!zu(s))return O(t,`no resume incantation for provider "${s}"`);if(!dN.test(o))return O(t,"refusing to resume: malformed sessionid");let l=Xg(s,o,{isLead:e.isLead,model:a,onModelIgnored:p=>{let _=`warning: ${p.provider} terminal ignored model=${p.model}: ${p.reason}`;t.stderr.write(`${_}
|
|
2901
2904
|
`),Et({event:"model_ignored",provider:p.provider,model:p.model,reason:p.reason}),n?.(p)}});if(l===null||l.length===0)return O(t,`no resume incantation for provider "${s}"`);let c=ot(r?.env??t.env??process.env,i,o,"terminal"),d=await uN(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+`
|
|
2902
2905
|
`),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"),w=C3(m,f,{stdio:_?g?h:["pipe","pipe","pipe"]:"inherit",cwd:i,env:c}),y=_?.stdin?.readableFlowing;_&&!g&&(_.stdin.pipe(w.stdin),w.stdout?.pipe(_.stdout,{end:!1}),w.stderr?.pipe(_.stderr,{end:!1}));let E=!1,T=k=>{if(!E){E=!0;try{r?.cancel?.(k)}catch{}{try{w.kill(k)}catch{}ke(w,{stdinEnd:!1,softDelayMs:0,killDelayMs:100}).catch(()=>{})}}},v=()=>T(r?.signal?.reason==="SIGINT"?"SIGINT":"SIGTERM");r&&(r.stop=T);let b=()=>{r?.signal?.removeEventListener("abort",v),_&&!g&&(_.stdin.unpipe(w.stdin),y||_.stdin.pause(),w.stdout?.unpipe(_.stdout),w.stderr?.unpipe(_.stderr))};r?.signal?.addEventListener("abort",v,{once:!0}),r?.signal?.aborted&&v(),w.stdin?.on("error",()=>{}),w.on("error",k=>{b(),p(O(t,`failed to launch ${m}: ${k.message}`))}),w.on("exit",(k,I)=>{b(),r&&(r.signalObserved=I);let N=k??(I?128+(L3.signals[I]??1):1),A=fN(s);A&&N!==0&&N!==130&&N!==143&&!E&&!r?.signal?.aborted&&t.stderr.write(s+" exited with status "+N+". "+A+`
|
|
@@ -2949,11 +2952,11 @@ ${Pm(await Oc(X3,t)).map(n=>` ${n.name} ${n.description}`).join(`
|
|
|
2949
2952
|
`)}
|
|
2950
2953
|
`}function G3(t){let e=[],n=t.split(/\r?\n/);for(let s=0;s<n.length;s+=1){let o=n[s];if(!o.trim()||o.trimStart().startsWith("//")){let i=o.match(/^\s*\/\/ autorun-role: ([A-Za-z][A-Za-z0-9_-]*) provider=([^\s]+) model=(?:"([^"\r\n]+)"|([^\s]+))\s*$/);if(i)e.push({name:i[1],provider:i[2],model:i[3]??i[4],line:s});else if(o.includes("autorun-role:"))throw new Error(`invalid autorun role declaration on line ${s+1}`);continue}break}let r=new Set;for(let s of e){if(r.has(s.name))throw new Error(`duplicate autorun role ${s.name} in header`);if(r.add(s.name),!t.includes(`@role(${s.name}.provider)`)||!t.includes(`@role(${s.name}.model)`))throw new Error(`role ${s.name} must use @role(${s.name}.provider) and @role(${s.name}.model) in the script`)}return e}function sT(t,e,n){let r=t.split(/\r?\n/);for(let s of e){let o=n.get(s.name)??s,i=/\s/.test(o.model)?JSON.stringify(o.model):o.model;r[s.line]=`// autorun-role: ${s.name} provider=${o.provider} model=${i}`;let a=JSON.stringify(o.provider).slice(1,-1),l=JSON.stringify(o.model).slice(1,-1);t=r.join(`
|
|
2951
2954
|
`).replaceAll(`@role(${s.name}.provider)`,a).replaceAll(`@role(${s.name}.model)`,l),r.splice(0,r.length,...t.split(/\r?\n/))}return r.join(`
|
|
2952
|
-
`)}function oT(t,e){let n="autorun";try{let s=/^https?:\/\//i.test(e)?new URL(e).pathname:e,o=TM(s).replace(/\.lms$/i,"").replace(/[^A-Za-z0-9_-]/g,"_");o&&(n=o)}catch{}let r=$s(t,`${n}.lms`);for(let s=2;Cc(r);s+=1)r=$s(t,`${n}${s}.lms`);return r}async function Oc(t,e){let n=await e(t,{cache:"no-store"});if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${t}`);return n.text()}function J3(t){let e=TM(t),n=$s(t,`${e}.lmctl`),r=2;for(;Cc(n);)n=$s(t,`${e}${r}.lmctl`),r+=1;return n}async function V3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(aT),0;let r=t.includes("--no-seed");if(
|
|
2955
|
+
`)}function oT(t,e){let n="autorun";try{let s=/^https?:\/\//i.test(e)?new URL(e).pathname:e,o=TM(s).replace(/\.lms$/i,"").replace(/[^A-Za-z0-9_-]/g,"_");o&&(n=o)}catch{}let r=$s(t,`${n}.lms`);for(let s=2;Cc(r);s+=1)r=$s(t,`${n}${s}.lms`);return r}async function Oc(t,e){let n=await e(t,{cache:"no-store"});if(!n.ok)throw new Error(`HTTP ${n.status} fetching ${t}`);return n.text()}function J3(t){let e=TM(t),n=$s(t,`${e}.lmctl`),r=2;for(;Cc(n);)n=$s(t,`${e}${r}.lmctl`),r+=1;return n}async function V3(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(aT),0;let r=t.includes("--no-seed");if(Dn(e)&&!r&&!t.includes("--no-terminal"))return e.stderr.write(`error: quickrun opens a TUI; use --no-terminal in non-interactive mode
|
|
2953
2956
|
`),2;let s=t.includes("--no-terminal"),o=t.filter(h=>h!=="--no-seed"&&h!=="--no-terminal"&&h!=="--help"&&h!=="-h");if(o.length!==1)return e.stderr.write(`usage: lmctl quickrun <url-or-path>
|
|
2954
|
-
`),2;let i=o[0],a=n.cwd??process.cwd(),l=n.fetchFn??fetch,c;try{c=Wl(
|
|
2957
|
+
`),2;let i=o[0],a=n.cwd??process.cwd(),l=n.fetchFn??fetch,c;try{c=Wl(In(e.env??process.env,n.initConfigPath))}catch(h){return e.stderr.write(h instanceof vt&&h.kind==="missing"?"error: no ~/.lmctl/init.toml found. Run `lmctl init` first, then try quickrun again.\n":"error: "+(h instanceof Error?h.message:String(h))+`
|
|
2955
2958
|
`),1}let d;try{d=await ia(i,l,a)}catch(h){return e.stderr.write(`error: could not fetch ${i}: ${h instanceof Error?h.message:String(h)}
|
|
2956
|
-
`),1}let u;try{let h=sM(c.document).properties;for(let g of["Directory","NonInteractive"])if(Object.hasOwn(h,g))throw Error("Property '"+g+"' conflicts with an invocation fact in "+c.path+"; fix the file or run lmctl init");Object.assign(h,{Directory:a,NonInteractive:
|
|
2959
|
+
`),1}let u;try{let h=sM(c.document).properties;for(let g of["Directory","NonInteractive"])if(Object.hasOwn(h,g))throw Error("Property '"+g+"' conflicts with an invocation fact in "+c.path+"; fix the file or run lmctl init");Object.assign(h,{Directory:a,NonInteractive:Dn(e)}),u=bx(d,c.config,{properties:h,path:c.path,argv:[]})}catch(h){return e.stderr.write("error: "+(h instanceof Error?h.message:String(h))+`
|
|
2957
2960
|
`),1}let f=J3(a);if(W3(iT(f),{recursive:!0}),la(f,u,"utf8"),e.stdout.write(`Wrote ${f}
|
|
2958
2961
|
`),await As([f],e)!==0)return e.stderr.write(`error: ${f} failed lint after substitution -- check the values in ~/.lmctl/init.toml.
|
|
2959
2962
|
`),1;if(r)return e.stdout.write(`Edit ${f} if needed, then run: lmctl seed ${f}
|
|
@@ -2961,7 +2964,7 @@ ${Pm(await Oc(X3,t)).map(n=>` ${n.name} ${n.description}`).join(`
|
|
|
2961
2964
|
`),2;let u=c.slice(0,d),f=s.get(u)??{provider:"",model:""};l==="--role-provider"?f.provider=c.slice(d+1):f.model=c.slice(d+1),s.set(u,f);continue}return e.stderr.write(`error: unknown autorun option: ${l}
|
|
2962
2965
|
${aT}`),2}t=t.slice(o);let i=n.fetchFn??fetch,a=n.cwd??e.cwd??process.cwd();try{if(t.length===0)return e.stdout.write(await SM(i)),0;let l=/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(t[0]??""),c=t.find(N=>N!=="--no-seed"&&N!=="--no-terminal")??"",d=/^https?:\/\//i.test(c)?new URL(c).pathname:c;if(/\.(lmctl|lmc)$/i.test(d)||!l&&Cc(Lc(a,c))&&B3(Lc(a,c)).isDirectory())return V3(t,e,{...n,cwd:a});let[u,...f]=t;if(!u||u.startsWith("-"))throw new Error(`unknown quickrun option: ${u}`);let m,p,_=async N=>{let S=tT(await Oc(vM,i)).find(x=>x.name===N);if(!S)throw new Error(`unknown autorun example: ${N}; run lmctl autorun to list available examples`);return S.url};if(l)m=await _(u);else if(/^https?:\/\//i.test(u))m=u;else if(Cc(Lc(a,u))||u.includes("/")||u.includes("\\"))p=Lc(a,u);else if(/^[a-zA-Z0-9][a-zA-Z0-9_-]*\.lms$/.test(u))m=await _(u.slice(0,-4));else throw new Error("Expected a sample name, script URL, or local .lms file.");let h=m?await Oc(m,i):H3(p,"utf8"),g=G3(h),w=new Map;for(let N of g)w.set(N.name,{provider:N.provider,model:N.model});for(let[N,A]of s){if(!g.some(L=>L.name===N))throw new Error(`no autorun role named ${N}`);let S=w.get(N),x=A.provider||S.provider,R=A.model||(x===S.provider?S.model:(await(n.listModels??or)(x))[0]);if(!R)throw new Error(`no default model is available for ${x}; specify --role-model ${N}=MODEL`);w.set(N,{provider:x,model:R})}let y=(n.detectProviders??wf)(),E=g.filter(N=>!y.includes(w.get(N.name).provider)),T=new Map,v=y;for(let N of E){let A=v.find(x=>x!==w.get(N.name).provider);if(!A)continue;let S=await(n.listModels??or)(A);S.length&&T.set(N.name,{provider:A,model:S[0]})}if(T.size){e.stdout.write(`Suggested provider/model substitutions:
|
|
2963
2966
|
`);for(let A of g){let S=T.get(A.name);if(S){let x=w.get(A.name);e.stdout.write(` ${A.name}: ${x.provider}/${x.model} -> ${S.provider}/${S.model}
|
|
2964
|
-
`)}}let N="save";if(!r&&!
|
|
2967
|
+
`)}}let N="save";if(!r&&!Dn(e)){let A=new Dr(e,n.ask);try{if(N=(await A.ask("Choose accept, edit, or save [accept/edit/save]: ")).toLowerCase(),N==="edit")for(let S of g){if(!T.has(S.name))continue;let x=v.filter(M=>M!==w.get(S.name).provider),R=await A.ask(`Provider for ${S.name} (${x.join(", ")}): `);if(!x.includes(R))throw new Error(`provider must be one of: ${x.join(", ")}`);let L=await(n.listModels??or)(R);if(!L.length)throw new Error(`no models are available for ${R}`);let D=await A.ask(`Model for ${S.name} (${L.join(", ")}): `);if(!L.includes(D))throw new Error(`model must be one of: ${L.join(", ")}`);T.set(S.name,{provider:R,model:D})}else if(N!=="accept"&&N!=="save")throw new Error("choose accept, edit, or save")}finally{A.close()}}for(let[A,S]of T)w.set(A,S);if(r||Dn(e)||N==="save"){let A=oT(a,u);return la(A,sT(h,g,w),{flag:"wx",encoding:"utf8"}),e.stdout.write(`Saved mapped script: ${A}
|
|
2965
2968
|
Edit it, then run: lmscript ${A}
|
|
2966
2969
|
`),0}}else if(E.length){let N=oT(a,u);return la(N,sT(h,g,w),{flag:"wx",encoding:"utf8"}),e.stderr.write(`No installed provider/model replacement is available for ${E.map(A=>A.provider).join(", ")}. `),e.stdout.write(`Saved script: ${N}
|
|
2967
2970
|
Edit it, then run: lmscript ${N}
|
|
@@ -3139,9 +3142,9 @@ ${ua}Run 'lmctl help' for usage.
|
|
|
3139
3142
|
`),1):(t.stderr.write(`error: unknown command: ${e}
|
|
3140
3143
|
${ua}Run 'lmctl help' for usage.
|
|
3141
3144
|
`),1)}async function C9(t,e={stdout:process.stdout,stderr:process.stderr}){let n=tI();try{return await O9(t,e)}finally{nI(n)}}async function O9(t,e={stdout:process.stdout,stderr:process.stderr}){let n=[],r,s=!1,o=0;for(;o<t.length;o+=1){let m=t[o];if(m==="--db"){let p=t[++o];if(p===void 0||p.startsWith("--"))return Pc(e,"missing value for --db");r=p;continue}if(m==="--non-interactive"){s=!0;continue}if(m==="--debug"){ch();continue}if(m==="--allow-schema-skew"){process.env.LMCTL_ALLOW_SCHEMA_SKEW="1";continue}break}n.push(...t.slice(o));let i=n[0]??"",a=i==="script"||i==="quickrun"||i==="autorun";if(!/\.lms$/i.test(i))for(let m=1;m<n.length;m+=1){let p=n[m];if(p==="--")break;if(p==="--debug")ch(),n.splice(m--,1);else{if(a&&(!p.startsWith("-")||p==="-"||p==="-e"))break;(a&&(p==="--role-provider"||p==="--role-model")||p==="-p"||p==="--prompt-file")&&(m+=1)}}let l=new Set(["status","running","models","prices","ratelimit","prompt","chat","batch","terminal","tail","export","cost","usage","ls","plan","lint","db"]);r!==void 0&&(process.env.LMCTL_DB=r),Va()&&(e={...e,env:{...e.env??process.env,LMCTL_DEBUG:"1",...r===void 0?{}:{LMCTL_DB:r}}}),(s||l.has(n[0]??"")&&n.slice(1).includes("--json"))&&(e=Id(r===void 0?e:{...e,env:{...e.env??process.env,LMCTL_DB:r}}));let c=n[0];if(c==="--version"||c==="-v"||c==="-V")return e.stdout.write(`lmctl ${qa()}
|
|
3142
|
-
`),0;if(c==="--help"||c==="-h"||c===void 0)return e.stdout.write(kT),0;if(c==="help"){let[m,...p]=n.slice(1);return m===void 0||m==="--help"||m==="-h"?(e.stdout.write(kT),0):O$.has(m)?D$(m,[...p,"--help"],e):M$(e,m)}sh(mt(),e.stderr);let[d,...u]=n;if(d===void 0)return e.stdout.write(kT),0;let f=Date.now();AT(d,u,{phase:"start",started_at:new Date(f).toISOString()});try{let m=await D$(d,u,e);return AT(d,u,{phase:"finish",outcome:m===0?"ok":"error",exit_code:m,duration_ms:Date.now()-f}),O$.has(d)&&!dh(n,e)&&await iI(e,n),m}catch(m){let p=m instanceof Error?m:new Error(String(m));return AT(d,u,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-f,error_class:p.name,error_message:p.message,error_stack:p.stack??null,causes:M9(p)}),D9(m,d,u,e)}}function AT(t,e,n){Et({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:mt(),lmctl_version:qa(),node_version:process.version,...n})}function D9(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return s instanceof
|
|
3145
|
+
`),0;if(c==="--help"||c==="-h"||c===void 0)return e.stdout.write(kT),0;if(c==="help"){let[m,...p]=n.slice(1);return m===void 0||m==="--help"||m==="-h"?(e.stdout.write(kT),0):O$.has(m)?D$(m,[...p,"--help"],e):M$(e,m)}sh(mt(),e.stderr);let[d,...u]=n;if(d===void 0)return e.stdout.write(kT),0;let f=Date.now();AT(d,u,{phase:"start",started_at:new Date(f).toISOString()});try{let m=await D$(d,u,e);return AT(d,u,{phase:"finish",outcome:m===0?"ok":"error",exit_code:m,duration_ms:Date.now()-f}),O$.has(d)&&!dh(n,e)&&await iI(e,n),m}catch(m){let p=m instanceof Error?m:new Error(String(m));return AT(d,u,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-f,error_class:p.name,error_message:p.message,error_stack:p.stack??null,causes:M9(p)}),D9(m,d,u,e)}}function AT(t,e,n){Et({event:t,record_kind:"cli_action",command:t,argv:e,cwd:process.cwd(),db_path:mt(),lmctl_version:qa(),node_version:process.version,...n})}function D9(t,e,n,r){let s=t instanceof Error?t:new Error(String(t));return s instanceof On&&n.includes("--json")?(r.stdout.write(`${JSON.stringify({error:s.message,schema_skew:{db_version:s.dbVersion,build_version:s.buildVersion,mode:"refused"}},null,2)}
|
|
3143
3146
|
`),1):(r.stderr.write(`error: ${s.message}
|
|
3144
|
-
`),s instanceof
|
|
3147
|
+
`),s instanceof On?1:Va()?(r.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
|
|
3145
3148
|
`),1):(r.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
|
|
3146
3149
|
`),1))}function M9(t){let e=[],n=t.cause,r=0;for(;n!=null&&r<8;){let s=n instanceof Error?n:new Error(String(n));e.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),n=s.cause,r+=1}return e}async function D$(t,e,n){switch(t){case"batch":{let{runBatch:r}=await Promise.resolve().then(()=>(ow(),TR));return r(e,n)}case"serve":{let{runServeCommand:r}=await Promise.resolve().then(()=>(gC(),_C));return r(e,n)}case"sites":{let{runSite:r}=await Promise.resolve().then(()=>(Gi(),ic)),[s,...o]=e;return s!==void 0&&s!=="list"?Pc(n,"use lmctl site list for the authenticated site directory"):r(["list",...o],n)}case"fleet":{let{runSite:r}=await Promise.resolve().then(()=>(Gi(),ic)),[s,...o]=e;return s!==void 0&&!["status","roster","agents","list"].includes(s)?Pc(n,"use lmctl site list for the authenticated site directory"):r(["list",...o],n)}case"cron":{let{runCronCommand:r}=await Promise.resolve().then(()=>(MC(),DC));return r(e,n)}case"lmmail":case"lmchat":case"lmnote":case"lmsheet":case"lmtext":case"lmsound":return R9(t,e,n);case"whoami":{if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return n.stdout.write(`usage: lmctl whoami [--json]
|
|
3147
3150
|
Show the configured lmctl account identity.
|