@lmctl-ai/lmctl 0.1.100 → 0.1.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +146 -145
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -12,7 +12,7 @@ var Pk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{f
|
|
|
12
12
|
FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:or(r)}}async function pI(t){let e=lt(),r=process.version,n=xl("uname",["-a"],{encoding:"utf8"}),s=es((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Am(i);let u=xl("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Am(a);let u=xl("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":es(o.join(`
|
|
13
13
|
`)),c=[];for(let u of lI){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Nm(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function hI(){return process.env.LMCTL_INTENT_LOG??iI(oI(),".lmctl","recent-intents.log")}async function _I(t){let e=t.intentLog??hI(),r=t.intentLogTailLines??500;try{let s=(await Rl(e,"utf8")).split(`
|
|
14
14
|
`).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:es(o.join(`
|
|
15
|
-
`)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var wo,lI,Al,ts=E(()=>{"use strict";yo();wo=["serve","db","runs","jobs","attentions","env","intents"];lI=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];Al=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as jm,appendFileSync as gI,mkdirSync as yI,existsSync as
|
|
15
|
+
`)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var wo,lI,Al,ts=E(()=>{"use strict";yo();wo=["serve","db","runs","jobs","attentions","env","intents"];lI=["LMCTL_DB","LMCTL_API_URL","LMCTL_API_TOKEN","LMCTL_PID_FILE","LMCTL_SERVE_LOG","LMCTL_SESSIONDIR","LMCTL_DAEMON_INTERVAL_MS","LMCTL_SESSION_SIZE_DISABLED","NODE_ENV","PATH"];Al=["id","job_id","workflow_id","team_id","current_state","terminal_state","started_at","ended_at","paused_at","parent_run_id","blocker"].join(", ")});import{readFileSync as jm,appendFileSync as gI,mkdirSync as yI,existsSync as eX,readdirSync as tX,unlinkSync as rX}from"node:fs";import{join as To,dirname as wI}from"node:path";import{homedir as EI}from"node:os";function $l(){return To(EI(),".lmctl")}function Om(){Qr=!0,process.env.LMCTL_DEBUG="1"}function Cm(){return{cliDebug:Qr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Mm(t){Qr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function fe(){if(Qr||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-Lm>=TI&&($m=vI(),Lm=t),$m}function Ll(){return Qr||process.env.LMCTL_DEBUG==="1"}function bI(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=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",`${r}${n}:${s}`)}function Oe(t,e){if(e?.verbose){if(!Qr)return}else if(!e?.always&&!fe())return;try{SI();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t};gI(Eo,JSON.stringify(r)+`
|
|
16
16
|
`)}catch{}}function SI(){if(!Eo){let e=bI().slice(0,13).replace("T","-");Eo=To($l(),`debug-${e}.log`)}yI(wI(Eo),{recursive:!0})}function Ce(...t){Oe({event:"legacy",msg:t.join(" ")})}function Tt(...t){Oe({event:"legacy",msg:t.join(" ")},{verbose:!0})}function z(t){Oe(t,{always:!0})}function vI(){return kI()||II()}function kI(){try{let t=jm(To($l(),"config.toml"),"utf-8");for(let e of t.split(`
|
|
17
17
|
`)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function II(){try{let t=jm(To($l(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Qr,$m,Lm,TI,Eo,ve=E(()=>{"use strict";Qr=!1,$m=!1,Lm=0,TI=5e3;Eo=null});function rs(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function jl(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function ns(t,e){return!jl(t)||rs(t)?null:`${e} must use https://: ${t}`}async function bo(t,e){let r=ns(t,e.description);if(r!==null||!rs(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Dm(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw Dm(t,e.description,n,a)}}finally{clearTimeout(o)}}function Dm(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Ol=E(()=>{"use strict"});import{existsSync as HI}from"node:fs";import{createRequire as qI}from"node:module";function JI(){return Ml===null&&(Ml=qI(import.meta.url)("node:sqlite").DatabaseSync),Ml}function Dl(t){return t.length===1&&XI(t[0])?[t[0]]:t}function XI(t){if(!Ul(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function Ul(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Ml,Pl,So,Fl,Wl=E(()=>{"use strict";Ml=null;Pl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!HI(e))throw new Error("unable to open database file");this.name=e,this.handle=new(JI())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new Fl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},So=Pl,Fl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...Dl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...Dl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...Dl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&Ul(e)?Object.values(e):Ul(e)?{...e}:e}}});import{existsSync as GI,mkdirSync as KI,readFileSync as Um}from"node:fs";import{homedir as VI}from"node:os";import{dirname as Wm,join as YI,resolve as Bm}from"node:path";import{fileURLToPath as zI,pathToFileURL as ZI}from"node:url";function Hl(t){t.dbPath!==":memory:"&&KI(Wm(t.dbPath),{recursive:!0});let e=new So(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Jm(e);return r===0&&(e.exec(Um(qm,"utf8")),e.pragma(`user_version = ${Bl}`)),e0(e,r),e}function e0(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
|
|
18
18
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
@@ -883,6 +883,7 @@ var Pk=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var ne=(t,e)=>{f
|
|
|
883
883
|
WHERE sender_teamfile = ?
|
|
884
884
|
AND sender_alias = ?
|
|
885
885
|
AND delivered_at IS NULL
|
|
886
|
+
AND delivering_at IS NULL
|
|
886
887
|
ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
|
|
887
888
|
`),deleteMailboxMessage:t.prepare("DELETE FROM agent_mailbox WHERE id = ?")}}function Jl(t){if(Buffer.byteLength(t,"utf8")<=65536)return t;let r=Buffer.byteLength(zm,"utf8"),n=Math.max(0,65536-r),s=Buffer.from(t,"utf8"),o=n;for(;o>0&&(s[o]&192)===128;)o-=1;return`${s.subarray(0,o).toString("utf8")}${zm}`}var zm,Qm=E(()=>{"use strict";zm=`
|
|
888
889
|
...[truncated]`});function as(t,e){return JSON.stringify([t,e])}function ep(t){try{let e=JSON.parse(t);return typeof e.lock_id!="string"||typeof e.teamfile!="string"||typeof e.alias!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||!Array.isArray(e.holder_ips)||!e.holder_ips.every(r=>typeof r=="string")||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,teamfile:e.teamfile,alias:e.alias,holder_pid:e.holder_pid,holder_host:e.holder_host,holder_ips:e.holder_ips,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}var os,is,tp=E(()=>{"use strict";os="terminal_lock",is="member"});function ir(t){if(!Number.isInteger(t)||(t??0)<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}var ko=E(()=>{"use strict"});function en(t){return typeof t=="string"&&r0.has(t)}function sp(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${Io[0]}`,` STANCE: ${Io[1]}`,` STANCE: ${Io[2]}`,` STANCE: ${rp}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
@@ -2012,7 +2013,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2012
2013
|
AND r.terminal_state IS NOT NULL
|
|
2013
2014
|
ORDER BY r.id DESC
|
|
2014
2015
|
LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,i1).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,UE)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:UE,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function WE(t){for(let e of l1)try{e(t)}catch{}}var i1,UE,l1,BE=E(()=>{"use strict";i1="request_changes",UE="reviewer_rejection_rate_high";l1=[a1]});function Ks(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function HE(t){let e=t.intervalMs??Ks(),r=t.runOnceFn??qr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??PE)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=qE(t.dal,t.monitorSessionActivityFn??Jc,e,n).finally(()=>{a=null})),a.finally(()=>u(Xc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=c1(t.dal,r,t.collectSessionSizesFn??Ih,t.scanIntakeFn??xn,t.monitorSessionActivityFn??Jc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function c1(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(pw({dal:t}),WE({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await qE(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function qE(t,e,r,n){let s=Xc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var jd=E(()=>{"use strict";zi();Xs();cd();ni();FE();BE();Gc()});function JE(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var XE=E(()=>{"use strict"});import{mkdirSync as u1,readFileSync as d1,readdirSync as f1,statSync as m1,writeFileSync as p1}from"node:fs";import{dirname as h1,join as KE,sep as GE}from"node:path";function Da(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case VE:return _1(t,s.input);case YE:return g1(t,s.input);case zE:return y1(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Md,GetObjectCommand:Cd,PutObjectCommand:Od}}}function _1(t,e){let r=ZE(t,e.Key);return u1(h1(r),{recursive:!0}),p1(r,e.Body),{}}function g1(t,e){let r=ZE(t,e.Key),n;try{n=d1(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function y1(t,e){let r=e.Prefix??"";QE(r);let s=w1(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function ZE(t,e){return QE(e),KE(t,e)}function QE(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function w1(t){let e=[],r=(n,s)=>{let o;try{o=f1(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=KE(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=GE==="/"?a:a.split(GE).join("/");e.push({key:c,lastModified:m1(l).mtime})}}};return r(t,""),e}var VE,YE,zE,Od,Cd,Md,Dd=E(()=>{"use strict";VE="localfs-put",YE="localfs-get",zE="localfs-list",Od=class{input;_localfsTag=VE;constructor(e){this.input=e}},Cd=class{input;_localfsTag=YE;constructor(e){this.input=e}},Md=class{input;_localfsTag=zE;constructor(e){this.input=e}}});function eT(){return{put:0,get:0,list:0}}function Pd(t,e=E1){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function Fd(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var E1,Pa,Ud=E(()=>{"use strict";E1={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};Pa=class{counts=eT();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=eT(),e}estimateCostUsd(e){return Pd(this.counts,e)}}});function tT(t){let e=t.now??Date.now,r=t.timers??T1,n=null,s=null;async function o(){let l=e(),c=Fd(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=Pd(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===Fd(e())}}}var T1,rT=E(()=>{"use strict";Ud();T1={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var Wd=E(()=>{"use strict";Ta();Sa();Sa()});function b1(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function S1(t){return t.reply_to!==void 0&&t.response!==void 0}function v1(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function nT(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var Fa,Vs,sT=E(()=>{"use strict";Wd();Fa=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Vs=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new Fa("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Qt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(nT(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(nT(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new Fa;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=b1(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(S1(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??v1(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Qt(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function Bd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var oT=E(()=>{"use strict"});function Hd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var iT=E(()=>{"use strict"});function Jd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var qd,aT=E(()=>{"use strict";qd="daemon:events"});function cT(t){return{kind:"prompt",prompt_id:t.prompt_id??Qt(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function Xd(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var lT,Gd=E(()=>{"use strict";Wd();lT="prompt:root"});function Ys(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function k1(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(dT(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function uT(t,e=60){if(typeof t!="string"||t==="")return!0;let r=k1(t);return r===null?!0:Date.now()/1e3>=r-e}function dT(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var Kd=E(()=>{"use strict"});async function Ua(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":I1},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var I1,Vd=E(()=>{"use strict";I1="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as fT,mkdirSync as mT,readFileSync as pT,writeFileSync as hT}from"node:fs";import{homedir as _T}from"node:os";import{dirname as gT,join as yT}from"node:path";function zs(){return process.env.LMCTL_DEVICE_AUTH_PATH??yT(_T(),".lmctl","device-auth.json")}function wT(){return process.env.LMCTL_TOKEN_PATH??yT(_T(),".lmctl","cli-tokens.json")}function Yd(t=zs()){try{let e=JSON.parse(pT(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function ET(t,e=zs()){mT(gT(e),{recursive:!0,mode:448}),hT(e,JSON.stringify(t,null,2));try{fT(e,384)}catch{}}function zd(t,e=wT()){let r={};try{r=JSON.parse(pT(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};mT(gT(e),{recursive:!0,mode:448}),hT(e,JSON.stringify(s,null,2));try{fT(e,384)}catch{}}async function TT(t){let e=t.deviceAuthPath??zs(),r=Yd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await Ua({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return zd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??wT()),{idToken:n.idToken,userId:r.userId}}var Zd=E(()=>{"use strict";Vd()});function bT(t){if(t.length===0||!t.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
|
|
2015
|
-
`);if(e[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!N1.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Wa.join(", ")}`);r[c]=u}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Wa)if(r[i]===void 0)throw new Rt(`missing required frontmatter key "${i}" \u2014 required: ${Wa.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var Wa,N1,Rt,ST=E(()=>{"use strict";Wa=["title","description","members"],N1=new Set(Wa),Rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as x1,writeFileSync as
|
|
2016
|
+
`);if(e[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!N1.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${Wa.join(", ")}`);r[c]=u}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of Wa)if(r[i]===void 0)throw new Rt(`missing required frontmatter key "${i}" \u2014 required: ${Wa.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var Wa,N1,Rt,ST=E(()=>{"use strict";Wa=["title","description","members"],N1=new Set(Wa),Rt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as x1,writeFileSync as d5,renameSync as f5,existsSync as kT}from"node:fs";import{basename as A1,resolve as Fn,dirname as Qd}from"node:path";function $1(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function L1(t){return/^\s*_MEMBER_\s+\S/.test(t)}function j1(t){return/^\s*_SESSION_\s+\S/.test(t)}function O1(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Ba(t){let e=A1(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Fe(t){let e=x1(t,"utf-8"),r=Qd(Fn(t)),n=tf(e,Ba(t),{baseDir:r,sourcePath:Fn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Fn(r,s.sessiondir));return n}function tf(t,e,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let o=t;if(o.startsWith("#teamfile:")){let l=o.indexOf(`
|
|
2016
2017
|
`);o=l>=0?o.slice(l+1):""}let i=null;if(o.startsWith("---"))try{i=bT(o)}catch(l){if(l instanceof Rt)s.push(`frontmatter: ${l.message}`);else throw l}let a=t.split(`
|
|
2017
2018
|
`);for(let l=0;l<a.length;l++){let c=a[l],u=l+1;if(j1(c))throw new Error(`line ${u}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(O1(c)||!L1(c))continue;let d=$1(c);for(let p of Object.keys(d))if(!vT.includes(p))throw new Error(`line ${u}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
|
|
2018
2019
|
allowed keys: ${vT.join(", ")}`);if(!d.provider&&!d.teamfile){s.push(`line ${u}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:d.alias||`member${n.length+1}`,provider:d.provider||"",extra:{}};d.sessionid&&(m.session=d.sessionid),Object.prototype.hasOwnProperty.call(d,"sessiondir")&&(m.sessiondir=d.sessiondir),d.teamfile&&(m.teamfile=d.teamfile),d.model&&(m.model=d.model),d.effort&&(m.effort=d.effort),n.push(m)}return{name:e,members:n,rawText:t,parseErrors:s,frontmatter:i}}function rf(t,e){let r=[];for(let o of t.parseErrors)r.push({field:"session",message:o});let n=t.members.filter(o=>o.alias.toLowerCase()===ef.toLowerCase());n.length>1&&r.push({field:ef,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Fn(e,o.teamfile):Fn(o.teamfile);if(!kT(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=$t(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else R1.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function $t(t){return t.members.find(e=>e.alias.toLowerCase()===ef.toLowerCase())}function nf(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Fn(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!kT(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Fe(o),l=$t(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return nf(l,Qd(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Qd(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function Ha(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var ef,R1,vT,er=E(()=>{"use strict";ST();ef="Lead",R1=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);vT=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{hostname as C1}from"node:os";function Sr(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-e.ttlMs).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r},o=t.getAgentInflight(e.receiver_teamfile,e.receiver_alias),i=o===null||o.holder_pid===null,a=t.tryAcquireAgentInflight(s,{...i?{stale_before:n}:{},force:e.force});if(a.acquired){let c=o===null?null:e.force===!0?"force":o.holder_pid===null&&o.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:o,reclaimReason:c}}if(!xT(a.current,n))return{acquired:!1,current:a.current};let l=t.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function Un(t,e,r){let n=t.getTerminalLock(e,r);if(n!==null&&M1(n))return!0;let s=t.getAgentInflight(e,r);if(s===null)return!1;let o=new Date(Date.now()-D1()).toISOString();return!xT(s,o)}function M1(t){if(t.holder_host===C1())return ir(t.holder_pid);let e=Date.parse(t.last_heartbeat);return Number.isFinite(e)?Date.now()-e<=P1():!1}function xT(t,e){return t.holder_pid===null?t.started_at<e:!ir(t.holder_pid)}function D1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return IT;let r=Number(e);return!Number.isFinite(r)||r<=0?IT:r}function P1(t=process.env){let e=t.LMCTL_TERMINAL_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return NT;let r=Number(e);return!Number.isFinite(r)||r<=0?NT:r}var IT,NT,Wn=E(()=>{"use strict";ko();IT=8*60*60*1e3,NT=12e4});import{existsSync as F1,realpathSync as U1}from"node:fs";import{dirname as W1}from"node:path";function sf(t){B1(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function B1(t){let e=t.payload.root_teamfile;try{e=U1(t.payload.root_teamfile)}catch(s){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return await Bn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let s=`prompt root is not registered: ${e}`;return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=H1(e);if("error"in r)return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=Sr(t.store,{receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:X1(t.env??process.env)});if(!n.acquired){let s=J1(r.alias,n.current);return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:s,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let o=await(t.chat??Jt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),i=o.status==="stalled",a=!i&&o.text.trim()==="",l=i?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=i||a?"error":"ok";return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:c==="error"?null:o.text,status:c,error_detail:l,log:t.log}),{status:c,response:c==="error"?null:o.text,error_detail:l}}catch(s){let o=s instanceof Error?s.message:String(s);return await Bn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{try{t.store.releaseAgentInflight(n.lease)}catch(s){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function H1(t){if(!F1(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=$t(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??W1(t)}}async function Bn(t,e){let r=$T(e.message),n=e.response===null?null:$T(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function $T(t){return t.length<=AT?{text:t,truncated:!1}:{text:t.slice(0,AT),truncated:!0}}function q1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function J1(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:q1(t,e)}function X1(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return RT;let r=Number(e);return!Number.isFinite(r)||r<=0?RT:r}var AT,RT,LT=E(()=>{"use strict";kt();er();Wn();AT=256*1024,RT=30*60*1e3});import{chmodSync as PT,existsSync as G1,mkdirSync as FT,readFileSync as Ga,writeFileSync as UT}from"node:fs";import{dirname as of,resolve as qa,join as WT}from"node:path";import{fileURLToPath as K1}from"node:url";import{homedir as BT}from"node:os";import{CognitoIdentityClient as V1,GetIdCommand as Y1}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as jT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as z1,ListObjectsV2Command as Z1,PutObjectCommand as Q1,S3Client as OT}from"@aws-sdk/client-s3";function Qs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:sF(t.selfUrl),n={},s;for(let x of r)if(G1(x)){n=nF(x),s=x;break}let o=(...x)=>{for(let k of x)if(typeof k=="string"&&k!=="")return k},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??eF,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??tF,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??rF,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ka,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=Xa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=Xa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=Xa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),S=Xa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=o(e.LMCTL_MAILBOX_KEY),b=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...S!==void 0?{chatLogPollIntervalMs:S}:{},...w!==void 0?{mailboxKey:w}:{},...b!==void 0?{tokenPath:b}:{}},f}function nF(t){try{let e=Ga(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function sF(t){let e=of(K1(t??import.meta.url));return[qa(e,"..","..","..","..","infra","terraform","terraform.tfstate"),qa(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),qa(e,"..","..","..","infra","terraform","terraform.tfstate"),qa(e,"..","..","infra","terraform","terraform.tfstate")]}function Xa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function oF(t){let e=iF(t.intervalMs)??HT,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function iF(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function qT(t){let e=t.tokenPath??WT(BT(),".lmctl","cli-tokens.json"),r=MT(t.tokenPath);if(uT(r.cognito?.idToken)&&Yd()!==null)try{await TT({region:t.region,clientId:t.cognitoClientId??Ka,cliTokensPath:e}),r=MT(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch($){let Z=$ instanceof Error?$.message:String($);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Z}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await DT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=jT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new OT({region:t.region,credentials:a}),c={ListObjectsV2Command:Z1,GetObjectCommand:z1,PutObjectCommand:Q1},u=Ys(n),d=u??o,f=t.deviceId,m=On({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let $=p.loadMailboxCursor(d,m);if($!==null)h=$.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let Z=!1,J=0;for(;!Z&&J<2;){J+=1;try{let I=wa(m,"web"),N=0,O;do{let q=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let B of q.Contents??[]){let F=Ea(B.Key??"",m,"web");F!==void 0&&F>N&&(N=F)}O=q.IsTruncated===!0?q.NextContinuationToken:void 0}while(O!==void 0);h=N,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${d}`),Z=!0}catch(I){let N=I instanceof Error?I.message:String(I);if(i&&J===1&&cF(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),lF(e),i=!1,o=await DT({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=jT({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new OT({region:t.region,credentials:a}),m=On({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,S=t.persistentSessionManager,w=t.promptTriggerStore,b=new Pa,x=new Jr({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:$=>b.record($),onMessage:async $=>{if(_!==void 0&&Bd($.payload)){_.onInbound($.payload);return}if(S!==void 0&&Hd($.payload)){await S.onInbound($.payload);return}if(!Jd($.payload)){if(w!==void 0&&Xd($.payload)){sf({store:w,payload:$.payload,log:t.log});return}g!==null&&await g.handleIncoming($.payload,$)}},...p!==void 0?{onCursorAdvance:$=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:$,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Vs({client:x,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async $=>x.putMessage({conversation_id:`terminal:${$.session_id}`,payload:$})),S!==void 0&&S.setPublish(async $=>x.putMessage({conversation_id:`provider:${$.session_id}`,payload:$}));let k=$=>x.putMessage({conversation_id:qd,payload:$});x.start();let j=t.chatLogTailStore===void 0?void 0:oF({store:t.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??HT,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let V=t.deviceId??o,W=`${d}/usage/`,M;return M=t.usageStore===void 0?void 0:tT({meter:b,store:t.usageStore,userId:d,deviceId:V,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:$,costUsd:Z,ceilingUsd:J})=>{t.log?.(`[usage] month ${$} cost $${Z.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),x.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async($,Z)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${W}${V}-${$}.json`,Body:JSON.stringify({...Z,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async $=>{let Z={put:0,get:0,list:0},J;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:W,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let N of I.Contents??[]){let O=N.Key??"";if(O.endsWith(`-${$}.json`))try{let q=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(q.Body===void 0)continue;let B=JSON.parse(await q.Body.transformToString("utf-8"));Z.put+=B.put??0,Z.get+=B.get??0,Z.list+=B.list??0}catch{}}J=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(J!==void 0);return Z},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:x,fetchClient:g,publishDaemonEvent:k,async stop(){j?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await x.stop().catch(()=>{})}}}async function JT(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:Da(t.rootDir),r=On({identityId:Zs,userId:Zs,deviceId:CT}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Jr({bucket:"local",identityId:Zs,userId:Zs,deviceId:CT,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&Bd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&Hd(c.payload)){await o.onInbound(c.payload);return}if(!Jd(c.payload)){if(i!==void 0&&Xd(c.payload)){sf({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??Ja,readIntervalMs:t.readIntervalMs??Ja,heartbeatIdleMs:t.heartbeatIdleMs??Ja,backoffReadIntervalMs:t.backoffReadIntervalMs??Ja});n=new Vs({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:qd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Zs,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function MT(t){let e=t??WT(BT(),".lmctl","cli-tokens.json");try{let r=Ga(e,"utf8");return JSON.parse(r)}catch{return{}}}function aF(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ga(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};FT(of(t),{recursive:!0,mode:448}),UT(t,JSON.stringify(n,null,2));try{PT(t,384)}catch{}}function lF(t){let e={};try{let n=Ga(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,FT(of(t),{recursive:!0,mode:448}),UT(t,JSON.stringify(r,null,2));try{PT(t,384)}catch{}}async function DT(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new V1({region:t.region}).send(new Y1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{aF(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function cF(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var HT,Ja,Ka,eF,tF,rF,Zs,CT,af=E(()=>{"use strict";va();Dd();Ud();rT();sT();oT();iT();aT();Gd();Ta();Kd();Zd();LT();HT=3e3,Ja=1e3,Ka="79u5jhkk46qofog661c9i0bdcs",eF="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",tF="us-east-1_4iUdFggDn",rF="lmctl-next-preview-mailbox-254332045686";Zs="local",CT="local"});import{spawn as df}from"node:child_process";import{createInterface as XT}from"node:readline";var lf,cf,uf,GT,KT=E(()=>{"use strict";Po();ve();lf=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=df(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=XT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
|
|
@@ -2022,7 +2023,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
|
|
|
2022
2023
|
`)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},uf=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{Do(n)}catch(a){z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=df(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=XT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
|
|
2023
2024
|
`)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
|
|
2024
2025
|
`)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
|
|
2025
|
-
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},GT=t=>{switch(t){case"codex":return new lf;case"claude":case"qwen":return new cf;case"gemini":case"copilot":case"opencode":return new uf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as uF}from"node:crypto";import{existsSync as
|
|
2026
|
+
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},GT=t=>{switch(t){case"codex":return new lf;case"claude":case"qwen":return new cf;case"gemini":case"copilot":case"opencode":return new uf;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as uF}from"node:crypto";import{existsSync as Q5,mkdirSync as dF,readFileSync as fF,writeFileSync as mF}from"node:fs";import{homedir as pF}from"node:os";import{dirname as hF,join as _F}from"node:path";function Va(){return process.env.LMCTL_DEVICE_FILE??_F(pF(),".lmctl","device.json")}function Xr(t=Va()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(fF(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function ff(t=Va()){let e=Xr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:uF(),created_at:new Date().toISOString()};return dF(hF(t),{recursive:!0}),mF(t,`${JSON.stringify(r,null,2)}
|
|
2026
2027
|
`,{encoding:"utf8",mode:384}),r}var mf=E(()=>{"use strict"});import*as VT from"node:child_process";function yF(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function pf(t,e={}){let r=e.spawnSync===void 0&&process.env[wF]==="1",n=e.spawnSync??VT.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ya[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=yF(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function YT(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ya).join(", ")})`;let e=gF[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var Ya,gF,wF,zT=E(()=>{"use strict";Ya={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",lmplayer:"lmplayer",qwen:"qwen",agy:"agy"},gF={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",lmplayer:"Install lmplayer and ensure the lmplayer binary is on PATH.",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};wF="LMCTL_SKIP_BINARY_CHECK"});var ab={};ne(ab,{ProviderBinaryPreflightError:()=>za,__setProviderBinaryCheckForTest:()=>xF,bootstrapAgentRestMailbox:()=>eb,publishRegisteredWorkflowsOnStart:()=>QT,resolveLocalMailboxDir:()=>ob,resolveLocalWebuiDir:()=>sb,resolveServeConfig:()=>tb,runProviderBinaryPreflight:()=>nb,runServe:()=>vF,validateServeArgs:()=>ib});import{randomBytes as EF}from"node:crypto";import{existsSync as TF}from"node:fs";import{homedir as bF}from"node:os";import{isAbsolute as ZT,resolve as hf}from"node:path";async function vF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(SF),0;let r=ib(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2027
2028
|
`),2;try{nb(e)}catch(w){return 1}let n=ge({path:le()}),s={portCli:AF(t)},o;try{o=tb({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(w){return n.close(),e.stderr.write(`error: ${w instanceof Error?w.message:String(w)}
|
|
2028
2029
|
`),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),JE(n);let i;if(r.localWebui!==void 0){let w=sb(r.localWebui.dir,process.env);if(w===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let b=ob(process.env),{s3:x,commands:k}=Da(b);i={webuiDir:w,rootDir:b,s3:x,commands:k},e.stdout.write(`local webui: serving SPA from ${w}; mailbox store ${b}
|
|
@@ -2135,18 +2136,18 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
|
|
|
2135
2136
|
|
|
2136
2137
|
Show this member's background jobs and outbound queued mail. Read-only: check
|
|
2137
2138
|
never delivers, enqueues, marks, or deletes.
|
|
2138
|
-
`});var Zb={};ne(Zb,{runPush:()=>UU});import{hostname as DU}from"node:os";async function UU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(PU),0;let r=D(t,[],["--json"]);if(r.error!==void 0)return If(e,r.error);if(r.positionals.length>0)return If(e,`unexpected positional: ${r.positionals[0]}`);let n=e.env??process.env,s=C(r,"--json"),o=null,i=null,a;try{let l=await R(e,p=>{let h=Ot(n,p);if(h.ok)return rr(h.identity);throw new Error(h.reason==="unset"?tr("push"):jt("push"))}),c=await R(e,p=>p.tryAcquireRuntimeProcessLock(Kb,l.value,Vb,new Date(Date.now()-
|
|
2139
|
-
`),1;o={key:l.value,id:c.lock.lock_id},i=await
|
|
2139
|
+
`});var Zb={};ne(Zb,{runPush:()=>UU});import{hostname as DU}from"node:os";async function UU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(PU),0;let r=D(t,[],["--json"]);if(r.error!==void 0)return If(e,r.error);if(r.positionals.length>0)return If(e,`unexpected positional: ${r.positionals[0]}`);let n=e.env??process.env,s=C(r,"--json"),o=null,i=null,a;try{let l=await R(e,p=>{let h=Ot(n,p);if(h.ok)return rr(h.identity);throw new Error(h.reason==="unset"?tr("push"):jt("push"))}),c=await R(e,p=>p.tryAcquireRuntimeProcessLock(Kb,l.value,Vb,new Date(Date.now()-JU(n)).toISOString()));if(!c.acquired)return e.stderr.write(`error: push already running (conflict) for ${l.value} on ${c.current.holder_host} pid ${c.current.holder_pid}
|
|
2140
|
+
`),1;o={key:l.value,id:c.lock.lock_id},i=await XU(e,l.value,l.teamfile,t),a=GU(e,i);let u=await R(e,p=>BU(p.listOutboundPendingForSender(l.teamfile,l.alias))),d=[];for(let p of u)d.push(await WU(e,n,l,p));let f=HU(d),m=f.error>0?1:0;if(await zb(e,i,{status:m===0?"done":"error",result_summary:`delivered=${f.delivered} skipped_busy=${f.skipped_busy} error=${f.error}`,...m===0?{}:{error:`${f.error} lane(s) failed`},exit_code:m}),s)U(e,{status:qU(f),summary:f,lanes:d});else{for(let p of d)p.status==="delivered"?e.stdout.write(`delivered ${p.delivered_ids.length} to ${p.receiver}
|
|
2140
2141
|
`):p.status==="skipped-busy"?e.stdout.write(`skipped ${p.receiver}: busy (${p.pending_count} pending)
|
|
2141
2142
|
`):e.stdout.write(`error ${p.receiver}: ${p.error} (${p.pending_count} pending)
|
|
2142
2143
|
`);e.stdout.write(`summary: delivered=${f.delivered} skipped_busy=${f.skipped_busy} error=${f.error}
|
|
2143
|
-
`)}return m}catch(l){return await zb(e,i,{status:"error",error:l instanceof Error?l.message:String(l),exit_code:2}),If(e,l instanceof Error?l.message:String(l))}finally{a!==void 0&&clearInterval(a),o!==null&&await R(e,l=>l.clearRuntimeProcessLock(Kb,o.key,Vb,o.id)).catch(()=>{})}}async function WU(t,e,r,n){let s=`${n.receiverTeamfile}:${n.receiverAlias}`,o=n.rows.length;if(await R(t,l=>Un(l,n.receiverTeamfile,n.receiverAlias)))return{receiver:s,status:"skipped-busy",pending_count:o};let a=null;try{let l=await R(t,d=>Xe(n.receiverTeamfile,n.receiverAlias,d)),c=await R(t,d=>Sr(d,{receiver_teamfile:n.receiverTeamfile,receiver_alias:n.receiverAlias,sender_teamfile:r.teamfile,sender_alias:r.alias,ttlMs:kr()}));if(!c.acquired)return{receiver:s,status:"skipped-busy",pending_count:o};a=c.lease;let u=await el({sender:r,receiver:{teamfile:n.receiverTeamfile,alias:n.receiverAlias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:e});return u.status==="stalled"?{receiver:s,status:"error",pending_count:o,error:"provider stalled"}:{receiver:s,status:"delivered",pending_count:o,delivered_ids:u.deliveredIds,receipt:u.receipt}}catch(l){return{receiver:s,status:"error",pending_count:o,error:l instanceof Error?l.message:String(l)}}finally{a!==null&&await R(t,l=>l.releaseAgentInflight(a)).catch(()=>{})}}function BU(t){let e=new Map;for(let r of t){let n=`${r.receiver_teamfile}\0${r.receiver_alias}`,s=e.get(n);s===void 0?e.set(n,[r]):s.push(r)}return[...e.values()].map(r=>({receiverTeamfile:r[0].receiver_teamfile,receiverAlias:r[0].receiver_alias,rows:r.sort((n,s)=>n.id-s.id)})).sort((r,n)=>r.rows[0].id-n.rows[0].id)}function HU(t){return{delivered:t.filter(e=>e.status==="delivered").length,skipped_busy:t.filter(e=>e.status==="skipped-busy").length,error:t.filter(e=>e.status==="error").length,lanes:t.length}}function qU(t){let e=t.LMCTL_PUSH_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return Yb;let r=Number(e);return!Number.isFinite(r)||r<=0?Yb:r}async function
|
|
2144
|
+
`)}return m}catch(l){return await zb(e,i,{status:"error",error:l instanceof Error?l.message:String(l),exit_code:2}),If(e,l instanceof Error?l.message:String(l))}finally{a!==void 0&&clearInterval(a),o!==null&&await R(e,l=>l.clearRuntimeProcessLock(Kb,o.key,Vb,o.id)).catch(()=>{})}}async function WU(t,e,r,n){let s=`${n.receiverTeamfile}:${n.receiverAlias}`,o=n.rows.length;if(await R(t,l=>Un(l,n.receiverTeamfile,n.receiverAlias)))return{receiver:s,status:"skipped-busy",pending_count:o};let a=null;try{let l=await R(t,d=>Xe(n.receiverTeamfile,n.receiverAlias,d)),c=await R(t,d=>Sr(d,{receiver_teamfile:n.receiverTeamfile,receiver_alias:n.receiverAlias,sender_teamfile:r.teamfile,sender_alias:r.alias,ttlMs:kr()}));if(!c.acquired)return{receiver:s,status:"skipped-busy",pending_count:o};a=c.lease;let u=await el({sender:r,receiver:{teamfile:n.receiverTeamfile,alias:n.receiverAlias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:e});return u.status==="stalled"?{receiver:s,status:"error",pending_count:o,error:"provider stalled"}:{receiver:s,status:"delivered",pending_count:o,delivered_ids:u.deliveredIds,receipt:u.receipt}}catch(l){return{receiver:s,status:"error",pending_count:o,error:l instanceof Error?l.message:String(l)}}finally{a!==null&&await R(t,l=>l.releaseAgentInflight(a)).catch(()=>{})}}function BU(t){let e=new Map;for(let r of t){let n=`${r.receiver_teamfile}\0${r.receiver_alias}`,s=e.get(n);s===void 0?e.set(n,[r]):s.push(r)}return[...e.values()].map(r=>({receiverTeamfile:r[0].receiver_teamfile,receiverAlias:r[0].receiver_alias,rows:r.sort((n,s)=>n.id-s.id)})).sort((r,n)=>r.rows[0].id-n.rows[0].id)}function HU(t){return{delivered:t.filter(e=>e.status==="delivered").length,skipped_busy:t.filter(e=>e.status==="skipped-busy").length,error:t.filter(e=>e.status==="error").length,lanes:t.length}}function qU(t){return t.error===0?"ok":t.delivered>0||t.skipped_busy>0?"partial":"error"}function JU(t){let e=t.LMCTL_PUSH_LOCK_STALE_MS;if(e===void 0||e.trim()==="")return Yb;let r=Number(e);return!Number.isFinite(r)||r<=0?Yb:r}async function XU(t,e,r,n){try{return(await R(t,o=>o.startTrackedInvocation({kind:"exec",origin:"agent",scope_teamfile:r,from_identity:e,target_teamfile:null,target_alias:null,root_teamfile:r,cwd:process.cwd(),command:["lmctl","push",...n].join(" "),holder_pid:process.pid,holder_host:DU(),meta:JSON.stringify({command:"push"})}))).id}catch{return null}}function GU(t,e){if(e===null)return;let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(()=>{})},FU);return r.unref?.(),r}async function zb(t,e,r){if(e!==null)try{await R(t,n=>{n.finishTrackedInvocation(e,r)})}catch{}}function If(t,e){return t.stderr.write(`error: ${e}
|
|
2144
2145
|
`),2}var PU,Kb,Vb,Yb,FU,Qb=E(()=>{"use strict";Wn();Qa();pe();to();Tf();Vr();Lt();PU=`usage: lmctl push [--json]
|
|
2145
2146
|
|
|
2146
2147
|
Flush this member's outbound queued mail for idle receivers. Blocking and
|
|
2147
2148
|
background-able; use lmctl wait as the wake when launched in the background.
|
|
2148
|
-
`,Kb="cli:push",Vb="lock",Yb=12e4,FU=3e4});var uS={};ne(uS,{runWait:()=>
|
|
2149
|
-
`),2}async function
|
|
2149
|
+
`,Kb="cli:push",Vb="lock",Yb=12e4,FU=3e4});var uS={};ne(uS,{runWait:()=>tW});import{hostname as KU}from"node:os";async function tW(t,e={stdout:process.stdout,stderr:process.stderr},r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(VU),0;let n=qn(t,"wait");if(n.error!==void 0)return Xn(e,n.error);let s=D(n.args,["--interval","--timeout"],["--json"]);if(s.error!==void 0)return Xn(e,s.error);if(s.positionals.length>1)return Xn(e,`unexpected positional: ${s.positionals[1]}`);let o=iS(A(s,"--interval"),"--interval",YU);if(typeof o=="string")return Xn(e,o);let i=iS(A(s,"--timeout"),"--timeout",zU);if(typeof i=="string")return Xn(e,i);let a,l;try{a=await rW(e,{teamfile:s.positionals[0]}),l=await nW(e,a)}catch(b){return Xn(e,b instanceof Error?b.message:String(b))}let c=C(s,"--json"),u=r.sleep??(b=>new Promise(x=>setTimeout(x,b))),d=r.now??(()=>Date.now()),f=r.appearanceGraceMs??bW(),m=r.reclaimStaleMs??TW("LMCTL_WAIT_RECLAIM_STALE_MS",QU),p=d(),h=new Date(p).toISOString(),g=hW(a,h),_=p+i,S=p+f,w=new Set;for(await R(e,b=>cW(b,d(),m)),Oe({event:"wait_start",scope:a,waitStartedAt:h,notifier:g,intervalMs:o,timeoutMs:i,appearanceGraceMs:f,reclaimStaleMs:m,dbPath:le()});;){let b=await R(e,x=>sW(x,{scope:a,snapshotIds:w,nowMs:d(),waitStartedAt:h,notifier:g,reclaimStaleMs:m,mailboxSender:l}));if(b.finished!==null||b.receipts.length>0)return il(e,{status:"completed",finished:b.finished===null?[]:[_W(b.finished)],in_flight:sS(b.running),receipts:b.receipts.map(gW)},c),0;if(w.size>0||b.hasComingMail){if(d()>=_)return il(e,{status:"timeout",finished:[],in_flight:sS(b.running),receipts:[]},c),1;await u(aS(d(),o,_));continue}if(d()>=_)return il(e,{status:"timeout",finished:[],in_flight:[],receipts:[]},c),1;if(d()>=S)return il(e,{status:"idle",finished:[],in_flight:[],receipts:[]},c),0;await u(aS(d(),o,S,_))}}function Xn(t,e){return t.stderr.write(`error: ${e}
|
|
2150
|
+
`),2}async function rW(t,e){if(e.teamfile!==void 0)return await R(t,n=>({kind:"team",teamfile:we(e.teamfile,n)}));let r=t.env??process.env;return await R(t,n=>{let s=Ot(r,n);if(s.ok)return{kind:"from",from:s.identity};throw s.reason==="unset"?new Error(tr("wait")):new Error(jt("wait"))})}async function nW(t,e){if(e.kind==="from")return rr(e.from);let r=t.env??process.env;return await R(t,n=>{try{let s=Ef(r,n);return s.ok?rr(s.identity):null}catch{return null}})}function sW(t,e){let r=new Set(t.reclaimStaleMailboxDeliveries(new Date(e.nowMs-e.reclaimStaleMs).toISOString()).map(l=>l.id)),n=oW(t,e.mailboxSender,e.scope,e.notifier,r),s=rS(t,e);if(s!==null)return{finished:s,running:nS(t,e.scope),receipts:n.receipts,hasComingMail:n.hasComingMail};if(e.snapshotIds.size===0)for(let l of nS(t,e.scope))e.snapshotIds.add(l.id);let i=[...e.snapshotIds].map(l=>uW(t,l,e.nowMs,e.reclaimStaleMs)).filter(l=>l!==null).filter(mW).sort((l,c)=>l.id-c.id);e.snapshotIds.clear();for(let l of i)e.snapshotIds.add(l.id);return{finished:rS(t,e),running:i,receipts:n.receipts,hasComingMail:n.hasComingMail}}function rS(t,e){for(let r of lW(t,e.scope)){let n=t.claimTrackedInvocationNotification(r.id,e.notifier);if(n!==null)return n}return null}function oW(t,e,r,n,s){if(e===null)return{receipts:[],hasComingMail:!1};let o=new Date().toISOString();t.db.exec("BEGIN IMMEDIATE");try{let i=t.db.prepare(`
|
|
2150
2151
|
SELECT id FROM agent_mailbox
|
|
2151
2152
|
WHERE sender_teamfile = ?
|
|
2152
2153
|
AND sender_alias = ?
|
|
@@ -2159,7 +2160,7 @@ background-able; use lmctl wait as the wake when launched in the background.
|
|
|
2159
2160
|
waited_by = ?
|
|
2160
2161
|
WHERE id = ?
|
|
2161
2162
|
AND waited_at IS NULL
|
|
2162
|
-
`).run(o,n,u).changes===1){let f=t.getMailboxMessage(u);f!==null&&a.push(f)}let l=
|
|
2163
|
+
`).run(o,n,u).changes===1){let f=t.getMailboxMessage(u);f!==null&&a.push(f)}let l=iW(t,e,s),c=aW(t,r);return t.db.exec("COMMIT"),{receipts:a,hasComingMail:l||c}}catch(i){throw t.db.inTransaction&&t.db.exec("ROLLBACK"),i}}function iW(t,e,r){if(r.size===0)return t.db.prepare(`
|
|
2163
2164
|
SELECT 1 FROM agent_mailbox
|
|
2164
2165
|
WHERE sender_teamfile = ?
|
|
2165
2166
|
AND sender_alias = ?
|
|
@@ -2172,7 +2173,7 @@ background-able; use lmctl wait as the wake when launched in the background.
|
|
|
2172
2173
|
AND delivered_at IS NULL
|
|
2173
2174
|
AND id NOT IN (${s})
|
|
2174
2175
|
LIMIT 1
|
|
2175
|
-
`).get(e.teamfile,e.alias,...n)!=null}function
|
|
2176
|
+
`).get(e.teamfile,e.alias,...n)!=null}function aW(t,e){return e.kind==="team"?t.db.prepare(`
|
|
2176
2177
|
SELECT 1 FROM tracked_invocation
|
|
2177
2178
|
WHERE scope_teamfile = ?
|
|
2178
2179
|
AND status = 'running'
|
|
@@ -2182,7 +2183,7 @@ background-able; use lmctl wait as the wake when launched in the background.
|
|
|
2182
2183
|
WHERE from_identity = ?
|
|
2183
2184
|
AND status = 'running'
|
|
2184
2185
|
LIMIT 1
|
|
2185
|
-
`).get(e.from)!=null}function nS(t,e){return e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function
|
|
2186
|
+
`).get(e.from)!=null}function nS(t,e){return e.kind==="team"?t.listRunningTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listRunningTrackedInvocations({from:e.from,limit:1e3})}function lW(t,e){return e.kind==="team"?t.listClaimableTerminalTrackedInvocations({scope_teamfile:e.teamfile,limit:1e3}):t.listClaimableTerminalTrackedInvocations({from:e.from,limit:1e3})}function cW(t,e,r){let n=[];for(let s of t.listAllRunningTrackedInvocations()){if(!cS(s,e,r))continue;let o=lS(t,s);o!==null&&pW(o)&&n.push(o)}return n}function uW(t,e,r,n){let s=t.getTrackedInvocation(e);return s===null||s.status!=="running"||!cS(s,r,n)?s:lS(t,s)??t.getTrackedInvocation(s.id)}function lS(t,e){return t.reclaimTrackedInvocationIfUnchanged(e.id,{holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat_at:e.last_heartbeat_at},{status:"error",error:tS,result_summary:tS})}function cS(t,e,r){return t.holder_host===KU()&&fW(t.holder_pid)?!ir(t.holder_pid):dW(t,e,r)}function dW(t,e,r){let n=Date.parse(t.last_heartbeat_at??t.started_at);return Number.isFinite(n)&&e-n>r}function fW(t){return Number.isInteger(t)&&(t??0)>0}function mW(t){return t.status==="running"}function pW(t){return eW.has(t.status)}function hW(t,e){let r=t.kind==="team"?t.teamfile:t.from;return`wait:${process.pid}:${t.kind}:${r}:${e}`}function _W(t){return{id:t.id,kind:t.kind,status:t.status,from_identity:t.from_identity,scope_teamfile:t.scope_teamfile,target_teamfile:t.target_teamfile,target_alias:t.target_alias,result_summary:wW(t)}}function sS(t){return t.sort((e,r)=>e.id-r.id).map(e=>({id:e.id,kind:e.kind,status:"running",from_identity:e.from_identity,target_alias:e.target_alias}))}function gW(t){return{id:t.id,receiver:`${t.receiver_teamfile}:${t.receiver_alias}`,delivered_at:t.delivered_at??t.created_at,receipt:yW(t.receipt??"")}}function yW(t){let e=t.replace(/\s+/g," ").trim();return e.length===0?"(empty)":e.length<=240?e:`${e.slice(0,239)}\u2026`}function wW(t){let r=(t.result_summary??t.error??t.status).replace(/\s+/g," ").trim();return r.length===0?"(empty)":r.length<=240?r:`${r.slice(0,239)}\u2026`}function il(t,e,r){if(r){U(t,e);return}if(e.status==="idle"){t.stdout.write(`wait: idle (no running tracked invocations or pending receipts)
|
|
2186
2187
|
`);return}if(e.status==="timeout"){t.stdout.write(`wait: timeout; ${e.in_flight.length} invocation(s) still running
|
|
2187
2188
|
`),oS(t,e.in_flight);return}if(e.receipts.length>0){t.stdout.write(`wait: received ${e.receipts.length} delivery receipt(s)
|
|
2188
2189
|
`);for(let n of e.receipts)t.stdout.write(` receipt ${n.id} to ${n.receiver} at ${n.delivered_at} ${n.receipt}
|
|
@@ -2191,7 +2192,7 @@ background-able; use lmctl wait as the wake when launched in the background.
|
|
|
2191
2192
|
`)}oS(t,e.in_flight)}function oS(t,e){if(e.length===0){t.stdout.write(`in flight: none
|
|
2192
2193
|
`);return}t.stdout.write(`in flight:
|
|
2193
2194
|
`);for(let r of e)t.stdout.write(` ${r.id} ${r.status} ${r.kind} \u2192 ${r.target_alias??"(unknown)"}
|
|
2194
|
-
`)}function iS(t,e,r){return t===void 0?r:
|
|
2195
|
+
`)}function iS(t,e,r){return t===void 0?r:EW(t,e)}function EW(t,e){let r=Number(t);return!Number.isFinite(r)||r<=0?`${e} must be a positive number of seconds`:Math.max(1,Math.ceil(r*1e3))}function TW(t,e){let r=process.env[t];if(r===void 0||r.trim()==="")return e;let n=Number(r);return!Number.isFinite(n)||n<=0?e:Math.max(1,Math.ceil(n))}function bW(){let t=process.env.LMCTL_WAIT_APPEARANCE_GRACE_MS;if(t===void 0||t.trim()==="")return eS;let e=Number(t);return Number.isFinite(e)?Math.min(ZU,Math.max(0,Math.ceil(e))):eS}function aS(t,e,...r){let n=Math.min(...r);return Math.min(e,Math.max(1,n-t))}var VU,YU,zU,eS,ZU,QU,eW,tS,dS=E(()=>{"use strict";ko();pe();Ke();wt();Vr();to();ve();VU=`usage: lmctl wait [teamfile] [--interval <seconds>] [--timeout <seconds>] [--json]
|
|
2195
2196
|
|
|
2196
2197
|
Wait for the first tracked invocation in scope to finish or for delivered
|
|
2197
2198
|
mailbox receipts for the calling member.
|
|
@@ -2203,36 +2204,36 @@ Exit codes:
|
|
|
2203
2204
|
0 completed or idle (inspect status in output/JSON)
|
|
2204
2205
|
1 timeout
|
|
2205
2206
|
2 usage or scope error
|
|
2206
|
-
`,
|
|
2207
|
-
`),2;let n=r.options,s=e.env??process.env,o=
|
|
2208
|
-
`),2}let l=await
|
|
2207
|
+
`,YU=3e3,zU=8*60*60*1e3,eS=3e3,ZU=3e4,QU=8*60*60*1e3,eW=new Set(["done","error","busy","cancelled"]),tS="reclaimed: holder process not alive"});var mS={};ne(mS,{runExec:()=>xW});import{spawn as SW}from"node:child_process";import{hostname as vW}from"node:os";import{resolve as kW}from"node:path";async function xW(t,e={stdout:process.stdout,stderr:process.stderr}){let r=AW(t);if(r.help)return e.stdout.write(IW),0;if(r.error!==void 0||r.options===void 0)return e.stderr.write(`error: ${r.error??"invalid exec invocation"}
|
|
2208
|
+
`),2;let n=r.options,s=e.env??process.env,o=kW(e.cwd??process.cwd(),n.cwd??"."),i,a=null;try{i=await RW(e,s),n.root!==void 0&&(a=await R(e,d=>we(n.root,d)))}catch(d){return e.stderr.write(`error: ${d instanceof Error?d.message:String(d)}
|
|
2209
|
+
`),2}let l=await $W(e,{fromIdentity:i,rootTeamfile:a,cwd:o,origin:"agent",command:n.command});LW(e,l,n.json);let c=jW(e,l?.id??null),u=await OW(n.command,o,s,e);return c!==void 0&&clearInterval(c),await CW(e,l?.id??null,u),DW(e,l?.id??null,u,n.json),PW(u)}function AW(t){if(t.includes("--help")||t.includes("-h"))return{help:!0};let e=t.indexOf("--");if(e<0)return{error:"lmctl exec requires -- before the command"};let r=qn(t.slice(0,e),"exec");if(r.error!==void 0)return{error:r.error};let n=r.args,s=t.slice(e+1);if(s.length===0)return{error:"lmctl exec requires a command after --"};let o={json:!1,command:s};for(let i=0;i<n.length;i+=1){let a=n[i];if(a==="--json"){o.json=!0;continue}if(a==="--root"||a==="--cwd"){let l=n[i+1];if(l===void 0||l.startsWith("--"))return{error:`missing value for ${a}`};a==="--root"&&(o.root=l),a==="--cwd"&&(o.cwd=l),i+=1;continue}return a.startsWith("--")?{error:`unknown flag: ${a}`}:{error:`unexpected positional before --: ${a}`}}return{options:o}}async function RW(t,e){return await R(t,r=>{let n=Ot(e,r);if(n.ok)return n.identity;throw n.reason==="unset"?new Error(tr("exec")):new Error(jt("exec"))})}async function $W(t,e){try{return await R(t,r=>r.startTrackedInvocation({kind:"exec",origin:e.origin,scope_teamfile:e.rootTeamfile,from_identity:e.fromIdentity,target_teamfile:null,target_alias:null,root_teamfile:e.rootTeamfile,cwd:e.cwd,command:FW(e.command),holder_pid:process.pid,holder_host:vW(),meta:JSON.stringify({argv:e.command})}))}catch{return null}}function LW(t,e,r){if(e!==null){if(r){t.stdout.write(`${JSON.stringify({id:e.id,status:"running"})}
|
|
2209
2210
|
`);return}t.stdout.write(`exec invocation ${e.id} started
|
|
2210
|
-
`)}}function
|
|
2211
|
-
`),i({code:127,signal:null,spawnError:c}))}),l.on("close",(c,u)=>{a||(a=!0,i({code:c,signal:u}))})})}async function
|
|
2212
|
-
`)}function
|
|
2211
|
+
`)}}function jW(t,e){if(e===null)return;let r=setInterval(()=>{R(t,n=>n.heartbeatTrackedInvocation(e)).catch(()=>{})},NW);return r.unref?.(),r}async function OW(t,e,r,n){let[s,...o]=t;return await new Promise(i=>{let a=!1,l=SW(s,o,{cwd:e,env:r,shell:!1,stdio:["ignore","pipe","pipe"]});l.stdout.on("data",c=>n.stdout.write(c.toString("utf8"))),l.stderr.on("data",c=>n.stderr.write(c.toString("utf8"))),l.on("error",c=>{a||(a=!0,n.stderr.write(`error: failed to start command: ${c.message}
|
|
2212
|
+
`),i({code:127,signal:null,spawnError:c}))}),l.on("close",(c,u)=>{a||(a=!0,i({code:c,signal:u}))})})}async function CW(t,e,r){if(e!==null)try{await R(t,n=>n.finishTrackedInvocation(e,fS(r)))}catch{}}function fS(t){let e=t.spawnError===void 0&&t.signal===null&&t.code===0,r=MW(t);return{status:e?"done":"error",exit_code:t.code,signal:t.signal,result_summary:r,error:e?null:r}}function MW(t){return t.spawnError!==void 0?`spawn failed: ${t.spawnError.message}`:t.signal!==null?`terminated by signal ${t.signal}`:`exit ${t.code??1}`}function DW(t,e,r,n){if(!n||e===null)return;let s=fS(r);t.stdout.write(`${JSON.stringify({id:e,status:s.status,exit_code:s.exit_code,signal:s.signal})}
|
|
2213
|
+
`)}function PW(t){return t.spawnError!==void 0?127:t.signal!==null?1:typeof t.code=="number"?t.code:1}function FW(t){return t.map(e=>JSON.stringify(e)).join(" ")}var IW,NW,pS=E(()=>{"use strict";Vr();wt();pe();IW=`usage: lmctl exec [--root <teamfile>] [--cwd DIR] [--json] -- <command> [args...]
|
|
2213
2214
|
|
|
2214
2215
|
Run a command as a tracked invocation. (Launch N background invocations by backgrounding this command, then lmctl wait interactively returns the FIRST completion; no ids).
|
|
2215
2216
|
Arguments after -- are passed directly to the child process; no shell is used.
|
|
2216
2217
|
Use "lmctl exec -- sh -lc '<command>'" when shell expansion is desired.
|
|
2217
|
-
`,
|
|
2218
|
+
`,NW=3e4});function ro(t){for(let e=t.length-1;e>=0;e-=1){let r=t[e],n=UW.exec(r.content);if(n===null){if(r.role==="assistant"&&r.content.trim().length>0)return null;continue}let s=Number.parseInt(n[1],10),o=n[2]===void 0?0:Number.parseInt(n[2],10),i=n[3].toLowerCase(),a=n[4]?.trim()??null,l=`${n[1]}${n[2]!==void 0?`:${n[2]}`:""}${i}`;return{state:"LIMITED",resets_at:a===null?null:WW(r.timestamp,s,o,i,a),reset_time:l,timezone:a,detected_at:r.timestamp.toISOString()}}return null}function WW(t,e,r,n,s){if(!Number.isFinite(t.getTime())||e<1||e>12||r<0||r>59)return null;let o=BW(e,n);try{let i=HW(t,s),a=hS(i.year,i.month,i.day,o,r,s);if(a.getTime()<=t.getTime()){let l=GW(i,1);a=hS(l.year,l.month,l.day,o,r,s)}return a.toISOString()}catch{return null}}function BW(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function HW(t,e){let r=_S(e,!1).formatToParts(t);return{year:nr(r,"year"),month:nr(r,"month"),day:nr(r,"day")}}function hS(t,e,r,n,s,o){let i=Date.UTC(t,e-1,r,n,s,0,0);for(let a=0;a<3;a+=1){let l=qW(new Date(i),o);i=Date.UTC(t,e-1,r,n,s,0,0)-l}return new Date(i)}function qW(t,e){let r=_S(e,!0).formatToParts(t);return Date.UTC(nr(r,"year"),nr(r,"month")-1,nr(r,"day"),nr(r,"hour"),nr(r,"minute"),nr(r,"second"),0)-t.getTime()}function _S(t,e){let r=e?XW:JW,n=r.get(t);if(n!==void 0)return n;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return r.set(t,s),s}function nr(t,e){let r=t.find(n=>n.type===e)?.value;if(r===void 0)throw new Error(`missing ${e}`);return Number.parseInt(r,10)}function GW(t,e){let r=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:r.getUTCFullYear(),month:r.getUTCMonth()+1,day:r.getUTCDate()}}var UW,JW,XW,Nf=E(()=>{"use strict";UW=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;JW=new Map,XW=new Map});var wS={};ne(wS,{runRecover:()=>VW});import{dirname as gS,resolve as yS}from"node:path";async function VW(t,e,r={}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${xf}
|
|
2218
2219
|
`),0;let n=D(t.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(n.error!==void 0)return y(e,`${n.error}
|
|
2219
2220
|
|
|
2220
2221
|
${xf}`);if(n.positionals.length===0)return y(e,`recover requires a <teamfile>
|
|
2221
2222
|
|
|
2222
|
-
${xf}`);if(n.positionals.length>2)return y(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=Gr(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return y(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(C(n,"--all")&&l!==void 0)return y(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await
|
|
2223
|
-
`)}return m.errors>0?1:0}async function
|
|
2224
|
-
`}var
|
|
2225
|
-
`)});var no,
|
|
2226
|
-
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function
|
|
2227
|
-
`}async function SS(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(jf({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await
|
|
2223
|
+
${xf}`);if(n.positionals.length>2)return y(e,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],o=Gr(s),i=o?.teamfile??s,a=n.positionals[1],l=o?.alias??a;if(o!==null&&a!==void 0)return y(e,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(C(n,"--all")&&l!==void 0)return y(e,"recover --all is mutually exclusive with <alias>");let c;try{c=await YW(e,i,l)}catch(p){if(p instanceof be)return y(e,p.message);throw p}let u=r.now??new Date,d=C(n,"--dry-run"),f=[];for(let p of c)f.push(await zW(e,p,{now:u,dryRun:d}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(C(n,"--json"))U(e,{dryRun:d,now:u.toISOString(),summary:m,members:f});else{for(let p of f)e.stdout.write(ZW(p));e.stdout.write(`Recover checked ${m.checked}: ${d?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
|
|
2224
|
+
`)}return m.errors>0?1:0}async function YW(t,e,r){return await R(t,n=>{let s=we(e,n);if(r!==void 0){let o=ot(s,n);if(o.parseErrors.length>0)throw new be(`lmctl: ${e}: ${o.parseErrors.join("; ")}`);let i=Ha(o,r);return i?.teamfile!==void 0?Af(yS(gS(s),i.teamfile),n,new Set):[Xe(e,r,n)]}return Af(s,n,new Set)})}function Af(t,e,r){let n=we(t,e);if(r.has(n))return[];r.add(n);let s=ot(n,e);if(s.parseErrors.length>0)throw new be(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let o=[];for(let i of s.members){if(i.teamfile!==void 0){o.push(...Af(yS(gS(n),i.teamfile),e,r));continue}i.session!==void 0&&o.push(Xe(n,i.alias,e))}return o}async function zW(t,e,r){let n;try{let a=await Gt(e.sessionid,e.provider);if(a===null)return Ct(e,"session_not_found",null,"session detail not found");n=ro(a.messages)}catch(a){return Ct(e,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Ct(e,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Ct(e,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Ct(e,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Ct(e,"not_due",n,`resets_at ${n.resets_at} is in the future`);let o=await R(t,a=>a.getAgentInflight(e.teamfile,e.alias));if(o!==null)return Ct(e,"busy",n,`in-flight since ${o.started_at}`);if(r.dryRun)return Ct(e,"would_recover",n,null);let i=await sl({teamfile:e.teamfile,alias:e.alias,prompt:KW,permissionMode:"yolo",io:t,env:process.env});return i.status==="ok"||i.status==="stalled"?Ct(e,"recovered",n,null):Ct(e,i.status==="busy"?"busy":"send_error",n,i.message)}function Ct(t,e,r,n){return{alias:t.alias,teamfile:t.teamfile,provider:t.provider,sessionid:t.sessionid,action:e,sessionLimit:r,reason:n}}function ZW(t){let e=t.sessionLimit?.resets_at??"unknown",r=t.reason===null?"":` (${t.reason})`;return`${t.alias}: ${t.action} resets_at=${e}${r}
|
|
2225
|
+
`}var KW,xf,ES=E(()=>{"use strict";Nf();Ur();er();wt();Lt();kf();pe();KW="Your session limit reset time has passed. Continue your work from the last actionable point.",xf=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
|
|
2226
|
+
`)});var no,Z7,Rf=E(()=>{"use strict";no=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For batch or long-running shell work, launch it through `lmctl exec -- <command> &` and wait for completion with `lmctl wait`.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],Z7=no.length});import{spawn as QW}from"node:child_process";async function bS(t,e,r){let n=tB.get(t);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let o of n.inputSchema.required??[])if(s[o]===void 0)return{status:"error",code:400,message:`missing required parameter: ${o}`};return rB(n.name,s)}function rB(t,e){return t==="lmctl_chat"?nB(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function nB(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof t.team=="string"?t.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",r,n,e];return fe()&&Ce(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),sB(s,process.cwd())}function sB(t,e){return new Promise(r=>{let n=!1,s,o=u=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(u))},i=QW("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=oB(process.env);s=setTimeout(()=>{try{i.kill("SIGTERM")}catch{}o({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";i.stdout?.on("data",u=>{l+=u.toString("utf8")}),i.stderr?.on("data",u=>{c+=u.toString("utf8")}),i.on("error",u=>{o({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),i.on("exit",u=>{if(u===0){fe()&&Ce(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2227
|
+
`).length})),o({status:"ok",data:{text:l.trim()||"(empty response)"}});return}o({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function oB(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return TS;let r=Number(e);return!Number.isFinite(r)||r<=0?TS:r}function $f(t,e=process.env){let n=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:eB),o=t.getConfig("api.token")??(e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:null);return{baseUrl:n,token:o}}var eB,TS,tB,Lf=E(()=>{"use strict";Rf();ve();eB="http://127.0.0.1:8787",TS=30*60*1e3,tB=new Map(no.map(t=>[t.name,t]))});async function cB(t,e){let r=t.id===void 0,n=t.id??null;if(t.method==="exit")return r||e.io.write(jf({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:iB,capabilities:{tools:{listChanged:!1}},serverInfo:{name:aB,version:lB}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:no.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},o=typeof s.name=="string"?s.name:"",i=s.arguments,a=await bS(o,i,e.dispatch),l=o==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${t.method}`}}}}function jf(t){return`${JSON.stringify(t)}
|
|
2228
|
+
`}async function SS(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(jf({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await cB(l,t);c.kind==="response"?t.io.write(jf(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
|
|
2228
2229
|
`);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
|
|
2229
2230
|
`)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
|
|
2230
|
-
`),a.finally(()=>c(1))})})}var
|
|
2231
|
-
`),2;z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??
|
|
2231
|
+
`),a.finally(()=>c(1))})})}var iB,aB,lB,vS=E(()=>{"use strict";Rf();Lf();iB="2025-06-18",aB="lmctl",lB="0.0.1"});var IS={};ne(IS,{runMcp:()=>dB});async function dB(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(uB),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
|
|
2232
|
+
`),2;z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??fB(),o=1;try{let i=s===void 0?$f({getConfig:()=>null},process.env):$f(s,process.env);return o=await SS({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function fB(){let t=le(),e=3;for(let r=1;r<=e;r+=1)try{return ge({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&kS(s))mB(50*r);else if(!kS(s))break}}function kS(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function mB(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var uB,NS=E(()=>{"use strict";We();Lf();vS();ve();Ke();uB=`usage: lmctl mcp
|
|
2232
2233
|
|
|
2233
2234
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2234
2235
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
2235
|
-
`});function so(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var xS=E(()=>{"use strict"});function
|
|
2236
|
+
`});function so(t){switch(t.kind){case"run_stale":return`run_stale:${t.run_id}`;case"stuck_job":return`stuck_job:${t.job_id}`;case"attentions_overdue":return`attentions_overdue:${t.project_id??"global"}`;case"issues_overdue":return`issues_overdue:${t.project_id??"global"}`}}var xS=E(()=>{"use strict"});function pB(t){return{stale_run_minutes:io(t,"monitor.stale_run_minutes",oo.stale_run_minutes),old_attention_days:io(t,"monitor.old_attention_days",oo.old_attention_days),old_issue_days:io(t,"monitor.old_issue_days",oo.old_issue_days),stuck_job_minutes:io(t,"monitor.stuck_job_minutes",oo.stuck_job_minutes),dedupe_window_hours:io(t,"monitor.dedupe_window_hours",oo.dedupe_window_hours)}}function io(t,e,r){let n=t.getConfig(e);if(n===null)return r;let s=Number.parseInt(n,10);return!Number.isFinite(s)||s<=0?r:s}function AS(t,e={}){let r=e.now??new Date,n=pB(t),s=[];for(let o of hB(t,n,r))s.push(o);for(let o of _B(t,n,r))s.push(o);for(let o of gB(t,n,r))s.push(o);for(let o of yB(t,n,r))s.push(o);return{findings:s,scanned_at:r.toISOString(),config:n}}function hB(t,e,r){let n=RS(r,e.stale_run_minutes).toISOString(),s=t.db.prepare(`
|
|
2236
2237
|
SELECT r.id AS id,
|
|
2237
2238
|
r.job_id AS job_id,
|
|
2238
2239
|
w.name AS workflow_name,
|
|
@@ -2243,12 +2244,12 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
2243
2244
|
WHERE r.terminal_state IS NULL
|
|
2244
2245
|
AND r.paused_at IS NULL
|
|
2245
2246
|
AND r.started_at <= ?
|
|
2246
|
-
`).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=so(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(al(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function
|
|
2247
|
+
`).all(n),o=[];for(let i of s){let a={kind:"run_stale",run_id:i.id},l=so(a),c={dedupe_key:l,run_id:i.id,job_id:i.job_id,workflow_name:i.workflow_name,started_at:i.started_at,last_event_at:i.last_event_ms===null?null:new Date(i.last_event_ms).toISOString(),threshold_minutes:e.stale_run_minutes},u=`run ${i.id} (${i.workflow_name}) stale since ${i.started_at}`;o.push(al(t,{kind:"run_stale",severity:"warning",project_id:null,run_id:i.id,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function _B(t,e,r){let n=RS(r,e.stuck_job_minutes).toISOString(),s=t.db.prepare(`
|
|
2247
2248
|
SELECT id, project_id, source, source_ref, status, enqueued_at
|
|
2248
2249
|
FROM job
|
|
2249
2250
|
WHERE status NOT IN ('done', 'failed')
|
|
2250
2251
|
AND enqueued_at <= ?
|
|
2251
|
-
`).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=so(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(al(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function
|
|
2252
|
+
`).all(n),o=[];for(let i of s){let a={kind:"stuck_job",job_id:i.id},l=so(a),c={dedupe_key:l,job_id:i.id,project_id:i.project_id,source:i.source,source_ref:i.source_ref,status:i.status,enqueued_at:i.enqueued_at,threshold_minutes:e.stuck_job_minutes},u=`job ${i.id} (${i.source}) stuck in ${i.status} since ${i.enqueued_at}`;o.push(al(t,{kind:"stuck_job",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function gB(t,e,r){let n=$S(r,e.old_attention_days).toISOString(),s=t.db.prepare(`
|
|
2252
2253
|
SELECT project_id,
|
|
2253
2254
|
COUNT(*) AS count,
|
|
2254
2255
|
(SELECT kind FROM attention a2
|
|
@@ -2263,7 +2264,7 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
2263
2264
|
AND kind NOT IN ('attentions_overdue', 'issues_overdue')
|
|
2264
2265
|
AND created_at <= ?
|
|
2265
2266
|
GROUP BY project_id
|
|
2266
|
-
`).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=so(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(al(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function
|
|
2267
|
+
`).all(n,n),o=[];for(let i of s){let a={kind:"attentions_overdue",project_id:i.project_id},l=so(a),c={dedupe_key:l,count:i.count,oldest_kind:i.oldest_kind,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_attention_days},u=i.project_id===null?"global":`project ${i.project_id}`,d=`${i.count} attention(s) overdue (${u}; oldest: ${i.oldest_kind})`;o.push(al(t,{kind:"attentions_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:d,config:e,now:r}))}return o}function yB(t,e,r){let n=$S(r,e.old_issue_days).toISOString(),s=t.db.prepare(`
|
|
2267
2268
|
SELECT project_id,
|
|
2268
2269
|
COUNT(*) AS count,
|
|
2269
2270
|
(SELECT title FROM project_issue i2
|
|
@@ -2276,23 +2277,23 @@ local config, then uses stdin/stdout for JSON-RPC frames.
|
|
|
2276
2277
|
WHERE status IN ('open', 'reopened')
|
|
2277
2278
|
AND created_at <= ?
|
|
2278
2279
|
GROUP BY project_id
|
|
2279
|
-
`).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=so(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${
|
|
2280
|
+
`).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=so(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${TB(i.oldest_title,40)})`;o.push(al(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function al(t,e){let r=wB(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function wB(t,e,r,n){let s=EB(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
|
|
2280
2281
|
SELECT * FROM attention
|
|
2281
2282
|
WHERE acknowledged_at IS NULL
|
|
2282
2283
|
AND created_at >= ?
|
|
2283
2284
|
AND payload LIKE ?
|
|
2284
2285
|
ORDER BY id DESC
|
|
2285
2286
|
LIMIT 1
|
|
2286
|
-
`).get(s,o)??null}function RS(t,e){return new Date(t.getTime()-e*60*1e3)}function
|
|
2287
|
-
`),0})}catch(o){return _e(e,o)}}function jS(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${
|
|
2287
|
+
`).get(s,o)??null}function RS(t,e){return new Date(t.getTime()-e*60*1e3)}function EB(t,e){return new Date(t.getTime()-e*60*60*1e3)}function $S(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function TB(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var oo,LS=E(()=>{"use strict";xS();oo={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var OS={};ne(OS,{renderSummary:()=>jS,runMonitor:()=>SB});async function SB(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(bB),0;let r=D(t,[],["--json","--quiet"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--json"),s=C(r,"--quiet");try{return await R(e,o=>{let i=AS(o);return n?U(e,i):s||e.stdout.write(`${jS(i.findings)}
|
|
2288
|
+
`),0})}catch(o){return _e(e,o)}}function jS(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${vB(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function vB(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var bB,CS=E(()=>{"use strict";pe();LS();bB=`usage: lmctl monitor [--json] [--quiet]
|
|
2288
2289
|
|
|
2289
2290
|
Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
|
|
2290
2291
|
issues; emit findings as attentions for the operator/master to handle.
|
|
2291
|
-
`});var MS={};ne(MS,{runDevice:()=>
|
|
2292
|
+
`});var MS={};ne(MS,{runDevice:()=>CB});import{readFileSync as kB}from"node:fs";import{homedir as IB}from"node:os";import{join as NB}from"node:path";import{CognitoIdentityClient as xB,GetIdCommand as AB}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as RB}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as $B,ListObjectsV2Command as LB,PutObjectCommand as jB,S3Client as OB}from"@aws-sdk/client-s3";async function CB(t,e={stdout:process.stdout,stderr:process.stderr}){let[r]=t;if(r===void 0||r==="--help"||r==="-h"||r==="help")return e.stdout.write(Of),0;if(r==="init"){let n=ff();return e.stdout.write(`${n.device_id}
|
|
2292
2293
|
`),0}if(r==="id"){let n=Xr();return n===null?(e.stderr.write(`error: no device id initialized at ${Va()}; run 'lmctl device init'
|
|
2293
2294
|
`),1):(e.stdout.write(`${n.device_id}
|
|
2294
|
-
`),0)}return r==="login"?await
|
|
2295
|
-
`),1)}async function
|
|
2295
|
+
`),0)}return r==="login"?await MB(t.slice(1),e):r==="prompt"?await PB(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
|
|
2296
|
+
`),1)}async function MB(t,e){let r=DB(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2296
2297
|
${Of}`),2;let n=Qs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
2297
2298
|
`),1;ET({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await Ua({region:n.config.region,clientId:n.config.cognitoClientId??Ka,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
|
|
2298
2299
|
`),1}let a=Ys(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
|
|
@@ -2300,10 +2301,10 @@ ${Of}`),2;let n=Qs();if(n.config===void 0)return e.stderr.write(`error: mailbox
|
|
|
2300
2301
|
device id: ${l.device_id}
|
|
2301
2302
|
mailbox prefix: ${r.userId}/${l.device_id}/
|
|
2302
2303
|
access key stored at ${zs()}
|
|
2303
|
-
`),0}function
|
|
2304
|
+
`),0}function DB(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function PB(t,e){let r=FB(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2304
2305
|
${Of}`),2;let n=Qs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
|
|
2305
|
-
`),1;let s=
|
|
2306
|
-
`),0}function
|
|
2306
|
+
`),1;let s=WB();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await UB({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=RB({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Xr()?.device_id,u=Ys(o)??void 0,d=new Jr({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new OB({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:LB,GetObjectCommand:$B,PutObjectCommand:jB},selfRole:"browser",onMessage:async()=>{}}),f=cT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:lT,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
|
|
2307
|
+
`),0}function FB(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function UB(t){let r=await new xB({region:t.region}).send(new AB({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function WB(t=process.env.LMCTL_TOKEN_PATH??NB(IB(),".lmctl","cli-tokens.json")){try{return JSON.parse(kB(t,"utf8"))}catch{return null}}var Of,DS=E(()=>{"use strict";mf();af();va();Gd();Kd();Zd();Vd();Of=`usage: lmctl device <id|init|login|prompt>
|
|
2307
2308
|
lmctl device login --user-id <sub> --access-key <refreshToken>
|
|
2308
2309
|
lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
|
|
2309
2310
|
|
|
@@ -2313,22 +2314,22 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
|
|
|
2313
2314
|
'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
|
|
2314
2315
|
cloud mailbox using your user-id (Cognito sub) and an access key (refresh
|
|
2315
2316
|
token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
2316
|
-
`});var FS={};ne(FS,{runTeam:()=>
|
|
2317
|
+
`});var FS={};ne(FS,{runTeam:()=>qB});import{join as BB}from"node:path";async function qB(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(HB),0;try{return await R(e,async s=>{switch(r){case"create":return XB(n,e,s);case"list":return GB(n,e,s);case"show":return KB(n,e,s);case"add-member":return VB(n,e,s);case"seed":return PS(n,e,s,!1);case"refresh":return PS(n,e,s,!0);case"companion":return zB(n,e,s);case"list-roots":return JB(n,e,s);default:return y(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return _e(e,s)}}function JB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length>0)return y(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return C(n,"--json")?U(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
|
|
2317
2318
|
`)+(s.length>0?`
|
|
2318
|
-
`:"")),0}function
|
|
2319
|
-
`),0}function
|
|
2319
|
+
`:"")),0}function XB(t,e,r){let[n]=t;if(n===void 0)return y(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
|
|
2320
|
+
`),0}function GB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listTeams();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
|
|
2320
2321
|
`)}${s.length>0?`
|
|
2321
|
-
`:""}`),0}function
|
|
2322
|
+
`:""}`),0}function KB(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(C(n,"--json"))U(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
|
|
2322
2323
|
`);for(let a of i)e.stdout.write(`- ${a.alias} ${Ae(a)} ${a.sessionid??"(unseeded)"}
|
|
2323
|
-
`)}return 0}function
|
|
2324
|
-
`),0}async function PS(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=A(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=
|
|
2324
|
+
`)}return 0}function VB(t,e,r){let n=D(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=A(n,"--alias"),a=A(n,"--provider");if(i===void 0||a===void 0)return y(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:A(n,"--model")??null,role:A(n,"--role")??"agent",sessiondir:A(n,"--sessiondir")??BB(xr(),"sessions",o.name,i)});return C(n,"--json")?U(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
|
|
2325
|
+
`),0}async function PS(t,e,r,n){let s=D(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=A(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=YB(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return y(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=cw(f.workflow_name,m.definition);if(p.status==="FAIL")return y(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))wi(f,r),Ti(f);let u=[],d=!1;for(let f of l){let m=await un({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
|
|
2325
2326
|
|
|
2326
2327
|
${pn}`:pn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=hn(Ae(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
|
|
2327
2328
|
${_}
|
|
2328
2329
|
`);try{await Mi({dal:r,member:p,stderr:e.stderr})}catch(S){d=!0,e.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
|
|
2329
2330
|
`)}}}return C(s,"--json")?U(e,u):e.stdout.write(`seeded ${u.length} member(s)
|
|
2330
|
-
`),d?1:0}function
|
|
2331
|
-
`),0}var
|
|
2331
|
+
`),d?1:0}function YB(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function zB(t,e,r){let n=D(t,["--interpreter","--of"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=A(n,"--interpreter"),a=A(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return y(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return y(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return y(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
|
|
2332
|
+
`),0}var HB,US=E(()=>{"use strict";Ke();ti();ks();ru();We();Ur();gu();pa();pe();nu();HB=`usage: lmctl team create <name>
|
|
2332
2333
|
lmctl team list [--json]
|
|
2333
2334
|
lmctl team show <name> [--json]
|
|
2334
2335
|
lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
|
|
@@ -2339,8 +2340,8 @@ ${pn}`:pn;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=hn(Ae(p),m.sessionid
|
|
|
2339
2340
|
|
|
2340
2341
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
2341
2342
|
refresh to create/update native provider sessions for team members.
|
|
2342
|
-
`});var GS={};ne(GS,{applyMaxBytes:()=>ll,renderMessage:()=>JS,runTail:()=>
|
|
2343
|
-
`),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--lines"),s=A(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?
|
|
2343
|
+
`});var GS={};ne(GS,{applyMaxBytes:()=>ll,renderMessage:()=>JS,runTail:()=>r2});async function r2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${t2}
|
|
2344
|
+
`),0;let r=D(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--lines"),s=A(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?QB:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=C(r,"--watch"),a=A(r,"--watch-interval"),l=a===void 0?e2:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=A(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await R(e,async p=>n2(e,p,m,o,i,l))}catch(p){return _e(e,p)}}let u=vr(ZB,{target:r.positionals[0],alias:r.positionals[1],flags:{session:A(r,"--session"),provider:A(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=await R(e,g=>we(u.teamfile,g))}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Fe(m)}catch(g){return y(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=$t(p);if(h===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await R(e,_=>Xe(u.teamfile,h.alias,_));d={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof be?y(e,g.message):_e(e,g)}}else try{let m=await R(e,p=>Xe(u.teamfile,u.alias,p));d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof be?y(e,m.message):_e(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await Si(m);if(h.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return y(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await WS(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await WS(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
|
|
2344
2345
|
`)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function WS(t,e,r,n,s){let o;try{o=await Gt(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
|
|
2345
2346
|
`),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
|
|
2346
2347
|
`),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${JS(i[c])}
|
|
@@ -2349,18 +2350,18 @@ refresh to create/update native provider sessions for team members.
|
|
|
2349
2350
|
`).split(`
|
|
2350
2351
|
`),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
|
|
2351
2352
|
${i.map(a=>` ${a}`).join(`
|
|
2352
|
-
`)}`}async function
|
|
2353
|
+
`)}`}async function n2(t,e,r,n,s,o){if(e.getRun(r)===null)return y(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(d=>`${qS(d)}
|
|
2353
2354
|
`).join("");t.stdout.write(n.kind==="bytes"?ll(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${qS(_)}
|
|
2354
2355
|
`,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?ll(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
|
|
2355
|
-
`)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ll(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(BS,"utf8");if(n>=e)return HS(t,e);let s=e-n,o=HS(t,s);return`${BS}${o}`}function HS(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function qS(t){let e=XS(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function XS(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var
|
|
2356
|
+
`)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function ll(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(BS,"utf8");if(n>=e)return HS(t,e);let s=e-n,o=HS(t,s);return`${BS}${o}`}function HS(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function qS(t){let e=XS(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function XS(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var ZB,QB,e2,t2,BS,KS=E(()=>{"use strict";Ur();pe();Lt();er();wt();ZB={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},QB=4096,e2=2,t2=`usage: lmctl tail [target] [alias]
|
|
2356
2357
|
lmctl tail --session <id> [--provider <name>]
|
|
2357
2358
|
lmctl tail --run <id>
|
|
2358
2359
|
[--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
|
|
2359
2360
|
|
|
2360
2361
|
Print or watch provider session messages, or follow a managed run timeline.
|
|
2361
2362
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;BS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
2362
|
-
`});var tv={};ne(tv,{runInfo:()=>
|
|
2363
|
-
`),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=C(r,"--json"),s=A(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await R(e,async u=>
|
|
2363
|
+
`});var tv={};ne(tv,{runInfo:()=>l2});import{execFileSync as Cf}from"node:child_process";import{dirname as YS,resolve as s2}from"node:path";function a2(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function l2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${i2}
|
|
2364
|
+
`),0;let r=D(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=C(r,"--json"),s=A(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(A(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await R(e,async u=>u2(e,u,c,n))}catch(u){return _e(e,u)}}let o=vr(o2,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:A(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0){let c;try{c=await R(e,u=>we(o.teamfile,u))}catch(u){return y(e,`health: ${u instanceof Error?u.message:String(u)}`)}return d2(e,c,n)}let i,a,l;if(o.mode==="ai-team")try{let c=await R(e,u=>Xe(o.teamfile,o.alias,u));i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof be?y(e,c.message):_e(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await Si(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return c2(e,i,a,l,n)}async function c2(t,e,r,n,s){let o;try{o=await Gt(r,e)}catch(l){return y(t,`health: failed to load session: ${l instanceof Error?l.message:String(l)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i=ro(o.messages),a={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:i,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(U(t,a),0):(t.stdout.write(`Session: ${o.sessionId}
|
|
2364
2365
|
`),t.stdout.write(` Provider: ${o.provider}
|
|
2365
2366
|
`),n!==void 0&&t.stdout.write(` Alias: ${n}
|
|
2366
2367
|
`),t.stdout.write(` CWD: ${o.cwd}
|
|
@@ -2371,7 +2372,7 @@ Print or watch provider session messages, or follow a managed run timeline.
|
|
|
2371
2372
|
`),i!==null&&t.stdout.write(` SessionLimit: LIMITED resets_at=${ev(i)}
|
|
2372
2373
|
`),t.stdout.write(` Created: ${a.createdAt}
|
|
2373
2374
|
`),t.stdout.write(` Modified: ${a.modifiedAt}
|
|
2374
|
-
`),0)}async function
|
|
2375
|
+
`),0)}async function u2(t,e,r,n){let s=Dr(e,r);if(s===null)return y(t,`health: run ${r}: not found`);let o=fn(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(U(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
|
|
2375
2376
|
`),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
|
|
2376
2377
|
`),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
|
|
2377
2378
|
`),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
|
|
@@ -2381,63 +2382,63 @@ Print or watch provider session messages, or follow a managed run timeline.
|
|
|
2381
2382
|
`),t.stdout.write(` Steps: ${s.steps.length}
|
|
2382
2383
|
`),t.stdout.write(` AgentCalls: ${i.agentCallCount}
|
|
2383
2384
|
`),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
|
|
2384
|
-
`),0)}async function
|
|
2385
|
-
`)}let x=b?.messageCount,k=i===null?void 0:b===null?null:
|
|
2385
|
+
`),0)}async function d2(t,e,r){let n,s;try{let w=await R(t,b=>{let x=ot(e,b);if(x.parseErrors.length>0)throw new Error(x.parseErrors.join("; "));return{teamName:x.name,targets:zS(e,b,new Set,[])}});s=w.teamName,n=w.targets}catch(w){return y(t,`health: ${w instanceof Error?w.message:String(w)}`)}let o=_2(e),i=o.kind==="repo"?o:null,a=await f2(t,n),l=[],c=0,u=i===null?void 0:0,d=i===null?void 0:0;for(let w of n){let b=null;try{b=await Gt(w.sessionid,w.provider)}catch(W){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${W instanceof Error?W.message:String(W)}
|
|
2386
|
+
`)}let x=b?.messageCount,k=i===null?void 0:b===null?null:y2(b,i.since),j=i===null?void 0:b===null?null:w2(b)??"n/a",V=i===null?void 0:{messageCount:k??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:x??null,model:b?.model??"(unknown)",lastContext:b?.lastInputTokens,detailLoaded:b!==null,liveness:a.get(ZS(w.teamfile,w.alias))??QS(),sessionLimit:b===null?null:ro(b.messages),...i!==null?{activitySinceLastCommit:V,cumulativeTokens:j}:{}}),x===void 0?c=void 0:c!==void 0&&(c+=x),i!==null&&(k==null?u=void 0:u!==void 0&&(u+=k),j==null||j==="n/a"?d=void 0:d!==void 0&&(d+=j))}if(r)return U(t,{team:s,git:i===null?null:{teamDir:i.teamDir,commits:i.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:i.since.toISOString(),working:i.working},members:l.map(({detailLoaded:w,cumulativeTokens:b,...x})=>({...x,lastContext:x.lastContext??null,...b!==void 0?{cumulativeTokens:b==="n/a"?null:b}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,h=Math.max(5,...l.map(w=>w.model.length))+1,g=Math.max(4,...l.map(w=>VS(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
|
|
2386
2387
|
`),o.kind==="repo"){t.stdout.write(`Git progress:
|
|
2387
2388
|
`);for(let w of o.commits)t.stdout.write(` ${w.ref}: ${w.timestamp.toISOString()}
|
|
2388
2389
|
`);t.stdout.write(` Uncommitted: ${Et(o.working.uncommittedTracked)} changed (tracked), ${Et(o.working.untracked)} untracked
|
|
2389
2390
|
`)}else o.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${o.teamDir} has no commits (no commit-based progress to report)
|
|
2390
2391
|
`):t.stdout.write(`Git progress: no git repository in ${o.teamDir} (no commit-based progress to report)
|
|
2391
2392
|
`);t.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(h)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(i!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
|
|
2392
|
-
`);let _=!1,S=l.filter(w=>w.sessionLimit!==null);for(let w of l){let b=
|
|
2393
|
+
`);let _=!1,S=l.filter(w=>w.sessionLimit!==null);for(let w of l){let b=h2(w.lastContext,w.detailLoaded,a2);(b==="n/a"||w.cumulativeTokens==="n/a")&&(_=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(h)}${VS(w.liveness).padEnd(g)}${Et(w.messageCount).padStart(6)} ${b.padStart(12)}`+(i!==null?` ${Et(w.activitySinceLastCommit?.messageCount).padStart(17)} ${Et(w.activitySinceLastCommit?.tokens).padStart(19)} ${p2(w.cumulativeTokens).padStart(19)}`:"")+`
|
|
2393
2394
|
`)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(h)}${"".padEnd(g)}${Et(c).padStart(6)}`+(i!==null?` ${"".padStart(12)} ${Et(u).padStart(17)} ${Et(null).padStart(19)} ${Et(d).padStart(19)}`:"")+`
|
|
2394
2395
|
`),_&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
|
|
2395
2396
|
`),S.length>0){t.stdout.write(`Session limits:
|
|
2396
2397
|
`);for(let w of S)t.stdout.write(` ${w.reportPath}: LIMITED resets_at=${ev(w.sessionLimit)}
|
|
2397
|
-
`)}return 0}function zS(t,e,r,n){let s=we(t,e);if(r.has(s))return[];r.add(s);let o=ot(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(...zS(
|
|
2398
|
+
`)}return 0}function zS(t,e,r,n){let s=we(t,e);if(r.has(s))return[];r.add(s);let o=ot(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(...zS(s2(YS(s),a.teamfile),e,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||i.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return i}async function f2(t,e){try{let r=await R(t,n=>e.map(s=>{let o=n.getAgentInflight(s.teamfile,s.alias);return[ZS(s.teamfile,s.alias),m2(o)]}));return new Map(r)}catch{return new Map}}function ZS(t,e){return`${t}\0${e.toLowerCase()}`}function m2(t){return t===null?QS():{state:"in_flight",inFlight:{senderTeamfile:t.sender_teamfile,senderAlias:t.sender_alias,startedAt:t.started_at,activeCount:t.active_count,holderPid:t.holder_pid}}}function QS(){return{state:"idle",inFlight:null}}function VS(t){return t.state}function ev(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function Et(t){return t==null?"unknown":String(t)}function p2(t){return t==="n/a"?t:Et(t)}function h2(t,e,r=String){return t!==void 0?r(t):e?"n/a":"unknown"}function _2(t){let e=YS(t),r;try{Cf("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{r=Cf("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let n=r.split(/\r?\n/).map(o=>Number.parseInt(o.trim(),10)).filter(o=>Number.isFinite(o)&&o>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=n.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:g2(e)}}function g2(t){let e;try{e=Cf("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function y2(t,e){let r=e.getTime();return t.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function w2(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return e.length===0?null:e.reduce((r,n)=>r+n,0)}var o2,i2,rv=E(()=>{"use strict";Ur();pe();Lt();wt();Xt();Nf();o2={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},i2=`usage: lmctl health [target] [alias]
|
|
2398
2399
|
lmctl health <teamfile> # team rollup
|
|
2399
2400
|
lmctl health <sessionid> [--provider <name>]
|
|
2400
2401
|
[--json]
|
|
2401
2402
|
|
|
2402
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var sv={};ne(sv,{runLs:()=>
|
|
2403
|
-
`),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=A(r,"--format"),s=C(r,"--json");if(C(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(A(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(C(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=A(r,"--limit"),h=
|
|
2403
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var sv={};ne(sv,{runLs:()=>S2});import{resolve as Mf}from"node:path";function b2(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function S2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${E2}
|
|
2404
|
+
`),0;let r=D(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=A(r,"--format"),s=C(r,"--json");if(C(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(A(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(C(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=A(r,"--limit"),h=T2;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>nv)return y(e,`--limit ${_} exceeds maximum (${nv})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await R(e,async _=>v2(e,_,h,g))}catch(_){return _e(e,_)}}let i=k2(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=A(r,"--provider"),c=A(r,"--sessiondir"),u=C(r,"--recursive"),d=C(r,"--all"),f;try{f=await Mc(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?Mf(c):Mf(process.cwd());f=f.filter(h=>{let g=Mf(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=b2(f),a==="json")return U(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
|
|
2404
2405
|
`)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
2405
2406
|
`);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
|
|
2406
2407
|
`);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
2407
|
-
`)}return 0}async function
|
|
2408
|
+
`)}return 0}async function v2(t,e,r,n){let s=dn(e,{limit:r});if(n==="json")return U(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
|
|
2408
2409
|
`),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
|
|
2409
2410
|
`);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
|
|
2410
|
-
`)}return 0}function
|
|
2411
|
+
`)}return 0}function k2(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var E2,T2,nv,ov=E(()=>{"use strict";kt();pe();Xt();E2=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
|
|
2411
2412
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
2412
2413
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
2413
2414
|
|
|
2414
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,
|
|
2415
|
-
`),2;let r=t[0],n;try{n=await R(e,c=>we(r,c))}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(n)}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=rf(s,zr(n)),i=Ff(s.members),a=hl(n,"utf8"),l=dl(a,fl({workdir:zr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...tc(s.members,zr(n))),i.push(...
|
|
2415
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,T2=50,nv=500});import{existsSync as lo,readFileSync as iv}from"node:fs";import{homedir as I2}from"node:os";import{dirname as av,resolve as Gn}from"node:path";import{fileURLToPath as N2}from"node:url";function Ff(t,e={}){let r=[],n=R2(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&o!=="lmplayer"&&o!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),o==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(o==="lmplayer")continue;if(o==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=M2(e.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(ul??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${P2(i)}`)}return r}function R2(t){if(!t&&ao)return ao;let e=new Map,r,n=t??$2();if(!lo(n))return r=`${n} not found`,t||Df(e),t||(ao=e),t||(ul=r),e;let s;try{s=iv(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Df(e),t||(ao=e),t||(ul=r),e}for(let[o,i]of Object.entries(x2)){let a=O2(s,i),l=C2(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Df(e),t||(ao=e),t||(ul=r),e}function $2(){return L2(av(N2(import.meta.url)))}function L2(t){let e=j2(t);if(e){let n=Gn(e,"durable-memory","model_selection.md");if(lo(n))return n}let r=[Gn(t,"..","..","durable-memory","model_selection.md"),Gn(t,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(lo(n))return n;return r[r.length-1]}function j2(t){let e=Gn(t);for(;;){if(lo(Gn(e,"package.json")))return e;let r=av(e);if(r===e)return null;e=r}}function Df(t){for(let[e,r]of Object.entries(A2))t.set(e,r)}function O2(t,e){let n=new RegExp(`^## ${F2(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function C2(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function M2(t){let e=t??Gn(I2(),".config","opencode","opencode.json");if(!lo(e))return{available:!0,models:[]};let r;try{r=JSON.parse(iv(e,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${e} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:D2(r)}}function D2(t){if(!Pf(t))return[];let e=cl(t.provider)??cl(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Pf(s))continue;let o=cl(s.models)??cl(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function cl(t){return Pf(t)?t:null}function Pf(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function P2(t){return t.length>0?t.join(", "):"(none)"}function F2(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var x2,A2,ao,ul,lv=E(()=>{"use strict";x2={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},A2={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},ao=null});import{homedir as U2}from"node:os";import{basename as W2}from"node:path";function dl(t,e){let r=new Set;return{text:t.replace(H2,(s,o)=>{let i=o.trim(),a=B2[i];return a===void 0?(r.add(i),s):a(e)}),unknownNames:[...r].sort()}}function fl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:q2(t.date)}}function q2(t){return t.toISOString().slice(0,10)}var B2,H2,Uf=E(()=>{"use strict";B2={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=W2(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>U2(),date:t=>t.date},H2=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var fo={};ne(fo,{GEMINI_PROVIDER_NOTICE:()=>fv,_setLintSessiondirFsOpsForTests:()=>Z2,_setTeamfileSeedForTests:()=>z2,buildRootTeamRegistrationRow:()=>gv,registerRootTeam:()=>yv,runHire:()=>iH,runLint:()=>oH,runRefresh:()=>aH,runSeed:()=>hv,sha256Text:()=>_v});import{createHash as J2}from"node:crypto";import{accessSync as X2,constants as cv,existsSync as G2,readFileSync as hl,realpathSync as Hf,statSync as K2,writeFileSync as pl}from"node:fs";import{dirname as zr,resolve as dv}from"node:path";function z2(t){mv=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(kt(),Pc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function Z2(t){Yr=t===null?qf:{...qf,...t}}function Q2(t,e){let r=zr(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dv(i);if(n.has(a))continue;let l=eH(a);l!==void 0&&(n.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 eH(t){try{if(Yr.existsSync(t)){if(!Yr.statSync(t).isDirectory())return"ENOTDIR";Yr.accessSync(t,cv.W_OK);return}let e=nH(t);if(e===void 0)return;if(!Yr.statSync(e).isDirectory())return"ENOTDIR";Yr.accessSync(e,cv.W_OK);return}catch(e){return sH(e)??"permission check failed"}}function tH(t,e){let r=[];for(let n of t)n.teamfile!==void 0||n.sessiondir===void 0||pv(n.sessiondir,e)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function rH(t,e,r,n){let s=!1;for(let o of t){if(o.teamfile!==void 0||o.sessiondir===void 0||!pv(o.sessiondir,n))continue;let i=r.get(o.alias.toLowerCase());if(i===void 0)continue;let a=wv(e[i],"sessiondir");a!==e[i]&&(e[i]=a,s=!0),o.sessiondir=void 0}return s}function pv(t,e){return uv(t)===uv(e)}function uv(t){let e=dv(t);try{return Hf(e)}catch{return e}}function nH(t){let e=t;for(;;){try{if(Yr.existsSync(e))return e}catch{return}let r=zr(e);if(r===e)return;e=r}}function sH(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 oH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(V2),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
2416
|
+
`),2;let r=t[0],n;try{n=await R(e,c=>we(r,c))}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(n)}catch(c){return je(e,`${r}: ${c instanceof Error?c.message:String(c)}`)}let o=rf(s,zr(n)),i=Ff(s.members),a=hl(n,"utf8"),l=dl(a,fl({workdir:zr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&i.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),i.push(...tc(s.members,zr(n))),i.push(...Q2(s.members,n)),i.push(...tH(s.members,zr(n)));for(let c of o)e.stderr.write(`error: ${c.field}: ${c.message}
|
|
2416
2417
|
`);for(let c of s.members)Xf([c],e),c.session!==void 0&&c.session.length<co&&i.push(`${c.alias}: sessionid is shorter than ${co} chars; run lmctl seed to refresh it`);for(let c of i)e.stderr.write(`warning: ${c}
|
|
2417
2418
|
`);return await R(e,c=>{_b(n,c,u=>e.stderr.write(`${u}
|
|
2418
2419
|
`))}),o.length>0?1:(e.stdout.write(`ok
|
|
2419
|
-
`),0)}async function hv(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(
|
|
2420
|
+
`),0)}async function hv(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Y2),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
|
|
2420
2421
|
`),2;let r=t[0],n;try{n=await R(e,_=>we(r,_))}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Hf(n)}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let o=zr(n),i;try{i=Fe(n)}catch(_){return je(e,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=hl(n,"utf8").split(`
|
|
2421
|
-
`),c=
|
|
2422
|
+
`),c=uH(l),u=rH(i.members,l,c,o),d=rf(i,o);if(d.length>0){Xf(i.members,e);for(let _ of d)e.stderr.write(`error: ${_.field}: ${_.message}
|
|
2422
2423
|
`);return 1}try{En(e,i,n)}catch{}Xf(i.members,e);for(let _ of Ff(i.members))e.stderr.write(`warning: ${_}
|
|
2423
2424
|
`);for(let _ of tc(i.members,o))e.stderr.write(`warning: ${_}
|
|
2424
2425
|
`);let f=0,m=i.members.filter(_=>_.teamfile!==void 0?!1:_.session===void 0||_.session.length<co);for(let _ of m)if(!Ev(_.provider))return e.stderr.write(`error: ${_.alias}: invalid provider "${_.provider}"
|
|
2425
2426
|
`),1;for(let _ of i.members){if(_.teamfile!==void 0)continue;if(_.session!==void 0&&_.session.length>=co){e.stderr.write(`warning: ${_.alias}: existing sessionid preserved; skipping
|
|
2426
|
-
`);continue}let S=_.sessiondir??o,w=await mv({provider:_.provider,cwd:S,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:
|
|
2427
|
+
`);continue}let S=_.sessiondir??o,w=await mv({provider:_.provider,cwd:S,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:lH(n,l.join(`
|
|
2427
2428
|
`),i.members)}:{}});if(w.error!==void 0||w.sessionId===void 0||w.sessionId.length<co){let k=`provider did not report a sessionid; no new session was found for ${S} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${w.error!==void 0?`: ${w.error}`:`; ${k}`}
|
|
2428
2429
|
`),1}let b=c.get(_.alias.toLowerCase());if(b===void 0)return e.stderr.write(`error: ${_.alias}: could not find matching _MEMBER_ line to update
|
|
2429
|
-
`),1;let x=
|
|
2430
|
+
`),1;let x=pH(l[b],"sessionid",w.sessionId);l[b]=x,f+=1,pl(n,l.join(`
|
|
2430
2431
|
`),"utf8"),e.stdout.write(`${_.alias}: seeded ${w.sessionId}
|
|
2431
2432
|
`)}let p=l.join(`
|
|
2432
|
-
`),h=
|
|
2433
|
-
`);let g=new Date().toISOString();return await R(e,_=>{yv(_,{teamfilePath:s,name:i.name,rawText:h,now:g})}),0}async function
|
|
2433
|
+
`),h=_H(p,Hf(n));(h!==p||u)&&pl(n,h,"utf8"),f===0&&e.stdout.write(`no members needed seeding
|
|
2434
|
+
`);let g=new Date().toISOString();return await R(e,_=>{yv(_,{teamfilePath:s,name:i.name,rawText:h,now:g})}),0}async function iH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(ml),0;let r=D(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Bf(e,r.error,ml);if(r.positionals.length!==2)return Bf(e,"expected <teamfile.lmctl> and <alias>",ml);let[n,s]=r.positionals;if(!mH(s))return je(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return je(e,"hire only applies to non-Lead members");let o=A(r,"--provider");if(o===void 0)return Bf(e,"missing value for --provider",ml);if(!Ev(o))return je(e,`invalid provider "${o}"`);let i;try{i=await R(e,d=>we(n,d))}catch(d){return je(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=hl(i,"utf8")}catch(d){return je(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(fH(a,s))return je(e,`${s}: alias already exists in ${i}`);let l=A(r,"--sessiondir"),c=[`_MEMBER_ alias=${Jf(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Jf(l)}`]].join(" "),u=hH(a,c);return pl(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
|
|
2434
2435
|
`),e.stdout.write(`Run: lmctl seed ${i}
|
|
2435
|
-
`),0}async function
|
|
2436
|
-
`),a=
|
|
2437
|
-
`),"utf8"),hv([s],e))}function _v(t){return
|
|
2438
|
-
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=
|
|
2439
|
-
`)}function
|
|
2440
|
-
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&uo(r,"alias")===e)return!0;return!1}function
|
|
2436
|
+
`),0}async function aH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Wf),0;let r,n;if(t.length===1){let d=Gr(t[0]);if(d===null)return e.stderr.write(Wf),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Wf),2;let s;try{s=await R(e,d=>we(r,d))}catch(d){return je(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let o;try{o=hl(s,"utf8")}catch(d){return je(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
|
|
2437
|
+
`),a=dH(i,n);if(a===void 0)return je(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(uo(l,"teamfile")!==void 0)return je(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[fs],u=uo(l,"sessionid");return c!==void 0&&c.length>0&&u===c?je(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=wv(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),pl(s,i.join(`
|
|
2438
|
+
`),"utf8"),hv([s],e))}function _v(t){return J2("sha256").update(t).digest("hex")}function gv(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:_v(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function yv(t,e){let r=gv(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function lH(t,e,r){let n=r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=n.length>0?n.join(`
|
|
2439
|
+
`):"- (no non-Lead members)",o=r.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",i=cH(o,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,"- MCP lmctl_chat is synchronous/blocking; use it only as a quick-ping or backup path.",'- Plain shell "&" alone is blind backgrounding. Use lmctl-tracked commands, then wait.',`- For non-blocking member work: run the blocking lmctl chat command in the background, then run lmctl wait. Example: lmctl chat "${t}" <alias> "your task here" & lmctl wait`,"- For arbitrary shell work: lmctl exec -- <command> & lmctl wait",i,"","Delegation is an ACTION, not a plan: to hand a member a task, run the command or call the tool.","If you use lmctl_chat and it appears only after tool search, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>`lmctl_chat(team="${t}", alias="${a.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, prefer tracked CLI commands plus lmctl wait; lmctl_chat is the synchronous backup.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
|
|
2440
|
+
`)}function cH(t,e){let r=`lmctl chat "${e}" <alias> "your task here"`;switch(t.toLowerCase()){case"claude":return`- Claude tip: run the blocking command (${r}) as background Bash (run_in_background: true); the runtime re-invokes you with the reply when it completes.`;case"copilot":return`- Copilot tip: run the blocking command (${r}) via bash async mode (mode:"async"); the runtime notifies you with output when it completes.`;case"agy":return`- Antigravity tip: run the blocking command (${r}) via run_command with WaitMsBeforeAsync: 0 (Background Tasks); agy wakes you with the output when it completes.`;case"qwen":return`- Qwen tip: run the blocking command (${r}) via the monitor tool; it notifies you on completion.`;case"codex":return"- Codex note: no native completion push; for long work, background tracked lmctl chat or lmctl exec, then run lmctl wait.";case"gemini":return"- Gemini note: no native completion push; for long work, background tracked lmctl chat or lmctl exec, then run lmctl wait.";case"opencode":return"- OpenCode note: use the provider-native background/task surface when available; otherwise run one blocking lmctl chat turn and wait.";default:return"- If your provider has native background-shell completion, use it around the blocking command; otherwise background the tracked command and run lmctl wait."}}function uH(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=uo(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function dH(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&uo(s,"alias")?.toLowerCase()===r)return n}}function fH(t,e){for(let r of t.split(`
|
|
2441
|
+
`))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&uo(r,"alias")===e)return!0;return!1}function mH(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function uo(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function pH(t,e,r){let n=`${e}=${Jf(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function wv(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Jf(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function hH(t,e){let r=t.split(`
|
|
2441
2442
|
`),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*_MEMBER_(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
|
|
2442
2443
|
`);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
|
|
2443
2444
|
`),i=r.slice(s).join(`
|
|
@@ -2445,7 +2446,7 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
2445
2446
|
|
|
2446
2447
|
`:""}${e}${i.length>0?`
|
|
2447
2448
|
${i}`:`
|
|
2448
|
-
`}`}function
|
|
2449
|
+
`}`}function _H(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
|
|
2449
2450
|
`),s=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?o.length>0?`${r}
|
|
2450
2451
|
${o}`:`${r}
|
|
2451
2452
|
`:t.length>0?`${r}
|
|
@@ -2454,10 +2455,10 @@ ${t}`:`${r}
|
|
|
2454
2455
|
`),1}function Bf(t,e,r){return t.stderr.write(`error: ${e}
|
|
2455
2456
|
${r}`),2}function Xf(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
|
|
2456
2457
|
`),r.provider==="gemini"&&e.stderr.write(`${fv.replace("%s",r.alias)}
|
|
2457
|
-
`)}var co,
|
|
2458
|
+
`)}var co,V2,Y2,ml,Wf,fv,qf,mv,Yr,mo=E(()=>{"use strict";er();lv();Po();ct();pe();wt();Lt();wt();Uf();Rs();co=5,V2=`usage: lmctl lint <teamfile.lmctl>
|
|
2458
2459
|
|
|
2459
2460
|
Validate an lmctl teamfile and warn about stale or placeholder session ids.
|
|
2460
|
-
`,
|
|
2461
|
+
`,Y2=`usage: lmctl seed <teamfile.lmctl>
|
|
2461
2462
|
|
|
2462
2463
|
Seed missing or placeholder session ids in an lmctl teamfile by calling each
|
|
2463
2464
|
member's configured native provider.
|
|
@@ -2474,32 +2475,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
2474
2475
|
re-seed.
|
|
2475
2476
|
A member cannot refresh its own running session; run the refresh from a
|
|
2476
2477
|
meta-Lead or operator shell outside that sessiondir.
|
|
2477
|
-
`,fv='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',qf={existsSync:
|
|
2478
|
-
`),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=bv(r);if(!Gf(c))throw new Error(`source not found: ${r}`);let d=Sv(c).isDirectory()?
|
|
2479
|
-
`),1}let i=bv(n),a=
|
|
2480
|
-
`),1;let l=NH(
|
|
2478
|
+
`,fv='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',qf={existsSync:G2,statSync:K2,accessSync:X2},mv=async t=>{let{seed:e}=await Promise.resolve().then(()=>(kt(),Pc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Yr=qf});var kv={};ne(kv,{runClone:()=>vH});import{existsSync as Gf,mkdirSync as gH,readFileSync as yH,readdirSync as wH,statSync as Sv,writeFileSync as EH}from"node:fs";import{basename as Tv,dirname as TH,extname as bH,join as vv,resolve as bv}from"node:path";async function vH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(SH),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
|
|
2479
|
+
`),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=bv(r);if(!Gf(c))throw new Error(`source not found: ${r}`);let d=Sv(c).isDirectory()?kH(c):c;s=yH(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
2480
|
+
`),1}let i=bv(n),a=IH(i,o,n);if(Gf(a))return e.stderr.write(`error: ${a} already exists.
|
|
2481
|
+
`),1;let l=xH(NH(s));return gH(TH(a),{recursive:!0}),EH(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
|
|
2481
2482
|
`),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2482
2483
|
`),e.stdout.write(`After editing, run: lmctl lint ${a}
|
|
2483
2484
|
`),e.stdout.write(`Then run: lmctl seed ${a}
|
|
2484
|
-
`),0}function
|
|
2485
|
+
`),0}function kH(t){let e=wH(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return vv(t,e[0])}function IH(t,e,r){if(r.endsWith("/")||Gf(t)&&Sv(t).isDirectory()){let n=Tv(e).endsWith(".lmctl")?Tv(e):"team.lmctl";return vv(t,n)}return bH(t)?t:`${t}.lmctl`}function NH(t){return t.split(`
|
|
2485
2486
|
`).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
|
|
2486
|
-
`)}function
|
|
2487
|
+
`)}function xH(t){return t.split(`
|
|
2487
2488
|
`).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
|
|
2488
|
-
`)}var
|
|
2489
|
+
`)}var SH,Iv=E(()=>{"use strict";SH=`usage: lmctl clone <source> <dest>
|
|
2489
2490
|
|
|
2490
2491
|
Copy a teamfile and strip its session ids, producing a static editable template.
|
|
2491
2492
|
|
|
2492
2493
|
Examples:
|
|
2493
2494
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
2494
|
-
`});var Av={};ne(Av,{runPlan:()=>
|
|
2495
|
+
`});var Av={};ne(Av,{runPlan:()=>CH});import{existsSync as AH,mkdirSync as RH,writeFileSync as $H}from"node:fs";import{basename as Nv,extname as xv,join as LH,resolve as jH}from"node:path";async function CH(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(OH),0;let r=D(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
|
|
2495
2496
|
`),e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2496
2497
|
`),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
|
|
2497
|
-
`),2;let n=
|
|
2498
|
-
`),1;let a=
|
|
2498
|
+
`),2;let n=jH(r.positionals[0]);RH(n,{recursive:!0});let s=A(r,"--team")??Nv(n),o=A(r,"--provider")??"claude",i=LH(n,MH(s));if(AH(i))return e.stderr.write(`error: ${i} already exists.
|
|
2499
|
+
`),1;let a=PH({teamName:DH(s),leadProvider:o}),l=dl(a,fl({workdir:n,teamfile:i,date:new Date}));return $H(i,l.text,"utf8"),e.stdout.write(`Created ${i}
|
|
2499
2500
|
`),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
2500
2501
|
`),e.stdout.write(`After editing, run: lmctl lint ${i}
|
|
2501
2502
|
`),e.stdout.write(`Then run: lmctl seed ${i}
|
|
2502
|
-
`),0}function
|
|
2503
|
+
`),0}function MH(t){return xv(t)?t:`${t}.lmctl`}function DH(t){let e=xv(t);return e?Nv(t,e):t}function PH(t){let{teamName:e,leadProvider:r}=t;return`# ${e}
|
|
2503
2504
|
|
|
2504
2505
|
# Lead operating guide: https://lmctl.com/skills/lmctl-lead.md
|
|
2505
2506
|
|
|
@@ -2511,7 +2512,7 @@ _MEMBER_ alias=Coder provider=codex
|
|
|
2511
2512
|
_MEMBER_ alias=Reviewer1 provider=codex
|
|
2512
2513
|
_MEMBER_ alias=Reviewer2 provider=${r}
|
|
2513
2514
|
_MEMBER_ alias=Reviewer3 provider=agy
|
|
2514
|
-
`}var
|
|
2515
|
+
`}var OH,Rv=E(()=>{"use strict";pe();Uf();OH=`usage: lmctl plan [options] <directory>
|
|
2515
2516
|
|
|
2516
2517
|
Generate a starter lmctl team document template for a directory.
|
|
2517
2518
|
|
|
@@ -2526,7 +2527,7 @@ Examples:
|
|
|
2526
2527
|
|
|
2527
2528
|
# Same shape, codex for the Lead and Reviewer2
|
|
2528
2529
|
lmctl plan ./backend --provider codex
|
|
2529
|
-
`});var jv={};ne(jv,{SIZE_WARN_EST_TOKENS:()=>po,estimateTokens:()=>Lv,runTerminal:()=>
|
|
2530
|
+
`});var jv={};ne(jv,{SIZE_WARN_EST_TOKENS:()=>po,estimateTokens:()=>Lv,runTerminal:()=>BH});import{spawn as FH}from"node:child_process";import{statSync as UH}from"node:fs";async function BH(t,e){if(t.includes("--help")||t.includes("-h"))return GH(e);let r=D(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=A(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(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"?C(r,i):A(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await R(e,async i=>{let a=A(r,"--alias"),l=cE(i,s,a);return"err"in l?y(e,l.err):Kf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return _e(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?C(r,l):A(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=vr(WH,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await R(e,l=>HH(e,a.teamfile,a.alias,l))}try{return await R(e,async s=>{let o=qH(e,s,r);if(typeof o=="number")return o;let i=A(r,"--alias");return C(r,"--size")?XH(e,s,o,i,C(r,"--json")):JH(e,s,o,i)})}catch(s){return _e(e,s)}}async function HH(t,e,r,n){let s;try{s=Xe(e,r,n)}catch(l){return l instanceof be?y(t,l.message):_e(t,l)}let o=Sr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:kr()});if(!o.acquired)return y(t,`${s.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at}`);let i=$b({teamfile:s.teamfile,alias:s.alias}),a=null;try{n.setTerminalLock(i),a=setInterval(()=>{try{!n.heartbeatTerminalLock(i.teamfile,i.alias,i.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Lb()),a.unref?.();try{En(t,Fe(s.teamfile),s.teamfile)}catch{}return await Kf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}finally{a!==null&&clearInterval(a),n.clearTerminalLock(i.teamfile,i.alias,i.lock_id),n.releaseAgentInflight(o.lease)}}async function Kf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!bi(r))return y(t,`no resume incantation for provider "${r}"`);if(!m_.test(n))return y(t,"refusing to resume: malformed sessionid");let o=iu(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=FH(i,a,{stdio:"inherit",cwd:s,env:He(process.env,s,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function qH(t,e,r){let n=A(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=Di(t,e,A(r,"--project"));return typeof s=="number"?s:Pi(t,e,s,void 0)}async function JH(t,e,r,n){let s=Fi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):Kf(t,{provider:Ae(s),sessionid:o,sessiondir:s.sessiondir})}function Lv(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=UH(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function XH(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ae(a),u=null;bi(c)&&(u=await Gt(l,c));let d=Lv(u),f=d.est>po;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?hn(c,l):null})}if(s)return U(t,{estimate:!0,legend:$v,guide_tokens:po,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
2530
2531
|
`),t.stdout.write(`${$v}
|
|
2531
2532
|
`);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
|
|
2532
2533
|
`),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -2534,7 +2535,7 @@ Examples:
|
|
|
2534
2535
|
session yourself:
|
|
2535
2536
|
${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
|
|
2536
2537
|
(or: lmctl terminal --team ${r.name} --alias ${a.alias})
|
|
2537
|
-
`)}return 0}function
|
|
2538
|
+
`)}return 0}function GH(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
|
|
2538
2539
|
lmctl terminal <teamfile> <alias>
|
|
2539
2540
|
lmctl terminal --run <id> [--alias A]
|
|
2540
2541
|
lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
|
|
@@ -2565,55 +2566,55 @@ Examples:
|
|
|
2565
2566
|
tokens it surfaces the resume incantation so YOU can
|
|
2566
2567
|
open & self-compact. Nothing is ever changed
|
|
2567
2568
|
automatically; ${po} is a guide, not a gate.
|
|
2568
|
-
`),0}var
|
|
2569
|
+
`),0}var WH,po,$v,Ov=E(()=>{"use strict";We();Ur();pe();Eu();Lt();er();ct();Rs();Wn();Qa();yf();$a();WH={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},po=2e5,$v="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as Vf,dirname as Pv}from"node:path";function Yf(t,e){let r=Vf(t);for(;;){let n=KH(e,r);if(n!==null)return n;let s=Pv(r);if(s===r)return null;r=s}}function KH(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function _l(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function gl(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function zf(t){if(t.io.dal!==void 0){let o=Cv(t.io.dal,t.cwd,t.projectName);if(o===null)throw new it(Mv(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(_l()||gl()){let o=le(),i=ge({path:o}),a=Cv(i,t.cwd,t.projectName);if(a===null)throw i.close(),new it(Mv(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:gl()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:_l()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?Uv(t.cwd):VH(t.projectName),r=Wv(e,t.projectName===void 0?"cwd":"project"),n=ge({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new it(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function Fv(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(_l()||gl()){let n=le();return{dal:ge({path:n}),ownsDal:!0,dbPath:n,workspaceName:gl()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:_l()?"explicit-db":"explicit-workspace"}}let e;try{e=Uv(t.cwd)}catch{throw new it("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=Wv(e,"job-cwd");return{dal:ge({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function Cv(t,e,r){return r!==void 0?t.findProjectByName(r):Yf(e,t)}function Mv(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function VH(t){let e=[];for(let r of kl())for(let n of Bv(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new it(`project not found in any workspace DB: ${t}`);return e}function Uv(t){let e=YH(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of kl())for(let o of Bv(s)){let i=Vf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new it("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function Wv(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new it(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
|
|
2569
2570
|
${Dv(n)}`):new it(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
|
|
2570
2571
|
${Dv(n)}`)}function Dv(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
|
|
2571
|
-
`)}function
|
|
2572
|
-
`),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return Ir(e,r.error);if(r.positionals.length>1)return Ir(e,yl);let n=C(r,"--json"),s=A(r,"--workflow"),o=A(r,"--project"),i=A(r,"--job"),a=A(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Ir(e,"remote workflow URL cannot be combined with --workflow or --job");if(!jl(c))return Ir(e,yl);if(hr(c))return Hv(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=ns(c,"remote workflow URLs");return m!==null?y(e,m):Hv(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return Ir(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return Ir(e,yl);if(i!==void 0&&(o!==void 0||a!==void 0))return Ir(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=
|
|
2572
|
+
`)}function YH(t){let e=[],r=Vf(t);for(;;){e.push(r);let n=Pv(r);if(n===r)return e;r=n}}function Bv(t){let e=null;try{e=new So(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>Bl)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var it,Zf=E(()=>{"use strict";Wl();ql();We();Ke();it=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var sm={};ne(sm,{assertNoCrossWorkflowSubflowCycle:()=>Vv,firstUnregisteredArchetype:()=>nm,runWorkflow:()=>uq});import{createHash as tm,randomUUID as zH}from"node:crypto";import{existsSync as ZH,readFileSync as El,readdirSync as QH,writeFileSync as eq}from"node:fs";import{basename as tq,join as rq,resolve as nq}from"node:path";import{pathToFileURL as sq}from"node:url";function rm(t,e){return{source_uri:sq(nq(t)).href,source_sha256:tm("sha256").update(e).digest("hex")}}function Jv(t){return tm("sha256").update(t).digest("hex")}async function lq(t){let e=await bo(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:Jv(e),remote:!0}}async function wl(t){if(hr(t)){let n=await xs(t),s=El(n,"utf8");return{definition:s,source_uri:t,source_sha256:Jv(s),remote:!1}}let e=ns(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(rs(t))return lq(t);let r=El(t,"utf8");return{definition:r,...rm(t,r),remote:!1}}function Xv(t){return De(t.definition)}function Gv(t){if(t.definition_schema_version!==3)return null;let e=nm(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function cq(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function uq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(aq),0;try{return r==="run"?await dq(n,e):await R(e,s=>{switch(r){case"load":return hq(n,e,s);case"author":return _q(n,e,s);case"list":return gq(n,e,s);case"sync":return yq(n,e,s);case"export":return wq(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof it?y(e,s.message):_e(e,s)}}async function dq(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${yl}
|
|
2573
|
+
`),0;let r=D(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return Ir(e,r.error);if(r.positionals.length>1)return Ir(e,yl);let n=C(r,"--json"),s=A(r,"--workflow"),o=A(r,"--project"),i=A(r,"--job"),a=A(r,"--inputs"),l=C(r,"--verbose"),c=r.positionals[0],u=C(r,"--yes")||C(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return Ir(e,"remote workflow URL cannot be combined with --workflow or --job");if(!jl(c))return Ir(e,yl);if(hr(c))return Hv(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=ns(c,"remote workflow URLs");return m!==null?y(e,m):Hv(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return Ir(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return Ir(e,yl);if(i!==void 0&&(o!==void 0||a!==void 0))return Ir(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=fq(i);if(m===null)return Ir(e,`invalid --job: ${i}`);let p=Fv({cwd:process.cwd(),io:e});try{let h=await Js({dal:p.dal,job_id:m,worker_id:Qf()});return em(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=Kv(a,e);if(d===Tl)return 2;let f=zf({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await Js({dal:f.dal,job_id:p.id,worker_id:Qf()});return em(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function Hv(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=Kv(o,r);if(l===Tl)return 2;let c,u;try{c=await wl(t),u=Xv(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=Gv(u);if(d!==null)return y(r,d);if(c.remote&&!await mq(r,c,u,a))return 1;let f=zf({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await Js({dal:f.dal,job_id:p.id,worker_id:Qf()});return em(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function Ir(t,e){return t.stderr.write(`error: ${e}
|
|
2573
2574
|
`),2}function Kv(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
|
|
2574
2575
|
`),Tl}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
|
|
2575
|
-
`),Tl):r}function
|
|
2576
|
+
`),Tl):r}function fq(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function Qf(){return`cli-${process.pid}-${zH().slice(0,8)}`}function em(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?U(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
|
|
2576
2577
|
`),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?U(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
|
|
2577
2578
|
`):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
|
|
2578
2579
|
`):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
|
|
2579
2580
|
`),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
|
|
2580
|
-
`)),e.status==="failed"?1:0}async function
|
|
2581
|
+
`)),e.status==="failed"?1:0}async function mq(t,e,r,n){let s=cq(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
|
|
2581
2582
|
`)+`
|
|
2582
|
-
`),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await
|
|
2583
|
-
`),a}function
|
|
2583
|
+
`),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await pq(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
|
|
2584
|
+
`),a}function pq(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function hq(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(hr(s))try{o=await wl(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(rs(s))try{o=await wl(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=ns(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await wl(s)}let i;try{i=Xv(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?Gv(i):null;if(a!==null)return y(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
|
|
2584
2585
|
`),o.remote&&e.stdout.write(`source: ${o.source_uri}
|
|
2585
2586
|
sha256: ${o.source_sha256}
|
|
2586
|
-
`),0}function nm(t){let e=da();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qv(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function Vv(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function
|
|
2587
|
-
`),0}function
|
|
2587
|
+
`),0}function nm(t){let e=da();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qv(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function Vv(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function _q(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=El(s,"utf8"),a;try{a=De(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return _e(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=nm(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{Vv(u,qv(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return qv(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...rm(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:tm("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
|
|
2588
|
+
`),0}function gq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
|
|
2588
2589
|
`)}${s.length>0?`
|
|
2589
|
-
`:""}`),0}function
|
|
2590
|
-
`),0}function
|
|
2591
|
-
`,c=A(n,"--out");return c!==void 0?(
|
|
2592
|
-
`)):e.stdout.write(l),0}var
|
|
2590
|
+
`:""}`),0}function yq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);Ni({swallow:!0});let s=y_(),o=[];try{o=ZH(s)?QH(s).filter(c=>oq.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=rq(s,c),d=El(u,"utf8"),f;try{f=De(d)}catch(x){return y(e,`compile failed for ${c}: ${x instanceof Error?x.message:String(x)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:tq(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,S=rm(u,d),w=r.getWorkflowByName(p);if(w!==null&&w.source_sha256===S.source_sha256){l+=1;continue}let b=w===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...S}),b?i+=1:a+=1}return C(n,"--json")?U(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
|
|
2591
|
+
`),0}function wq(t,e,r){let n=D(t,["--out"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return y(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:iq,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
|
|
2592
|
+
`,c=A(n,"--out");return c!==void 0?(eq(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
|
|
2593
|
+
`)):e.stdout.write(l),0}var oq,iq,aq,yl,Tl,om=E(()=>{"use strict";od();Nn();Ai();uu();pe();Zf();Ol();Xs();oq=[".compound.json",".lmctl"],iq="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",aq=`usage: lmctl workflow <load|author|list|sync|export|run>
|
|
2593
2594
|
|
|
2594
2595
|
Load, author, list, synchronize, inspect, or run workflow definitions. The
|
|
2595
2596
|
load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
|
|
2596
2597
|
URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
|
|
2597
2598
|
remote https:// workflow after a trust prompt.
|
|
2598
|
-
`,yl="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";Tl=Symbol("inputs-error")});function im(t,e){let r=
|
|
2599
|
-
`)}return 0}function
|
|
2600
|
-
`),0}function
|
|
2599
|
+
`,yl="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes|--no-prompt] [--verbose] | --workflow <name> [--project <name>] [--inputs <json-object>] [--verbose] | --job <id>) [--json]";Tl=Symbol("inputs-error")});function im(t,e){let r=Eq[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var Eq,Yv=E(()=>{"use strict";Eq={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var nk={};ne(nk,{initWorkspace:()=>tk,runWorkspace:()=>Nq,setWorkspaceProvider:()=>rk});import{copyFileSync as Tq,cpSync as bq,existsSync as Ue,mkdirSync as Nr,readdirSync as lm,renameSync as Sq,rmSync as bl,statSync as Sl,writeFileSync as vq}from"node:fs";import{spawnSync as kq}from"node:child_process";import{homedir as zv}from"node:os";import{dirname as cm,join as ho}from"node:path";async function Nq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(Iq),0;switch(r){case"list":return xq(n,e);case"create":return Aq(n,e);case"use":return Rq(n,e);case"show":return $q(n,e);case"delete":return Lq(n,e);case"migrate":return jq(n,e);case"init":return tk(n,e);case"set-provider":return rk(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function Qv(){let t=go(),e=[],r=new Set,n=Rr.default,s=Ue(zn()),o=Ue(Pt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?sr(n):zn(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),Ue(Ar())){let i;try{i=lm(Ar())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!Ge(a))continue;let l=!1;try{l=Sl(Pt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:sr(a),active:t===a,legacy:!1}),r.add(a))}}return e}function xq(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=Qv();if(C(r,"--json"))return U(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
|
|
2600
|
+
`)}return 0}function Aq(t,e){let r=D(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ge(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Pt(n);if(Ue(s))return y(e,`workspace already exists: ${n} (${s})`);let o=A(r,"--docroot")??Il(n);Nr(s,{recursive:!0}),Nr(o,{recursive:!0});let i=sr(n);Nr(cm(i),{recursive:!0});let a=ge({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return C(r,"--json")?U(e,l):e.stdout.write(`created workspace ${n} at ${s}
|
|
2601
|
+
`),0}function Rq(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);if(n!==Rr.default&&!Ue(Pt(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=_o();return Nr(cm(s),{recursive:!0}),vq(s,`${n}
|
|
2601
2602
|
`),C(r,"--json")?U(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
|
|
2602
|
-
`),0}function
|
|
2603
|
-
`),0}function
|
|
2604
|
-
`),0):y(e,`workspace not found: ${n}`)}function am(t,e,r){try{
|
|
2605
|
-
`),Sl(t).isDirectory()?
|
|
2603
|
+
`),0}function $q(t,e){let r=D(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);let s=Qv().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=Ue(s.db_path)?Sl(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(Ue(s.db_path)){let u=ge({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return C(r,"--json")?U(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2604
|
+
`),0}function Lq(t,e){let r=D(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ge(n))return y(e,`invalid workspace name: ${n}`);if(!C(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===Rr.default&&!C(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(go()===n&&!C(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=Pt(n);return Ue(o)?(bl(o,{recursive:!0,force:!0}),C(r,"--json")?U(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
|
|
2605
|
+
`),0):y(e,`workspace not found: ${n}`)}function am(t,e,r){try{Sq(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
|
|
2606
|
+
`),Sl(t).isDirectory()?bq(t,e,{recursive:!0}):Tq(t,e),!Ue(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);bl(t,{recursive:!0,force:!0})}function jq(t,e){let r=D(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=C(r,"--json"),s=Nl(),o=Ar(),i=[],a=(f,m)=>{if(n)U(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
|
|
2606
2607
|
`);e.stdout.write(f?`migration complete
|
|
2607
2608
|
`:`${m??"nothing to migrate"}
|
|
2608
|
-
`)}return 0};if(!Ue(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=lm(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Sl(ho(s,f)).isDirectory()}catch{return!1}});if(c.length===0)bl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ue(o))am(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Ue(ho(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Nr(o,{recursive:!0});for(let m of c)am(ho(s,m),ho(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{lm(s).length===0&&(bl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Sm(),d=_o();return Ue(u)&&(Ue(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(am(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function ek(t,e){return
|
|
2609
|
+
`)}return 0};if(!Ue(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=lm(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Sl(ho(s,f)).isDirectory()}catch{return!1}});if(c.length===0)bl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!Ue(o))am(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>Ue(ho(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);Nr(o,{recursive:!0});for(let m of c)am(ho(s,m),ho(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{lm(s).length===0&&(bl(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Sm(),d=_o();return Ue(u)&&(Ue(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(am(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function ek(t,e){return kq(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function Mq(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function Zv(t){return t==="~"?zv():t.startsWith("~/")?ho(zv(),t.slice(2)):t}async function tk(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Kn.join(", ")}.`].join(`
|
|
2609
2610
|
`)+`
|
|
2610
2611
|
`),0;let s=D(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return y(e,s.error);if(s.positionals.length!==0)return y(e,n);let o=r.spawn??ek,a=Kn.map(k=>im(k,o)).filter(k=>k.status==="ok"||k.status==="unverified").map(k=>k.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${Kn.join("|")} first
|
|
2611
|
-
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??
|
|
2612
|
+
`),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??Mq,u=r.promptLine!==void 0||l,d=k=>(e.stderr.write(`error: ${k} is required in non-interactive mode (no TTY); pass it explicitly
|
|
2612
2613
|
`),2),f,m=A(s,"--name");if(m!==void 0){if(!Ge(m))return e.stderr.write(`error: invalid workspace name: ${m}
|
|
2613
2614
|
`),2;f=m}else{if(!u)return d("--name");for(;;){let k=(await c("Workspace name [default]: ")).trim(),j=k.length===0?"default":k;if(Ge(j)){f=j;break}e.stderr.write(`invalid workspace name: ${j} (letters/digits/.-_, start alnum, \u226464)
|
|
2614
2615
|
`)}}let p=Pt(f);if(Ue(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
|
|
2615
|
-
`),2;let h,g=A(s,"--basedir"),_=Il(f);if(g!==void 0)h=Zv(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:Zv(k)}let S={};for(let k of["provider1","provider2","provider3"]){let j=A(s,`--${k}`),V=
|
|
2616
|
-
`),2;S[k]=j;continue}if(!u)return d(`--${k}`);for(;;){let M=(await c(`${k} (${
|
|
2616
|
+
`),2;let h,g=A(s,"--basedir"),_=Il(f);if(g!==void 0)h=Zv(g);else{if(!u)return d("--basedir");let k=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=k.length===0?_:Zv(k)}let S={};for(let k of["provider1","provider2","provider3"]){let j=A(s,`--${k}`),V=Oq[k],W=a.includes(V)?V:a[0];if(j!==void 0){if(!a.includes(j))return e.stderr.write(`error: --${k} ${j} is not an available provider (available: ${a.join(", ")})
|
|
2617
|
+
`),2;S[k]=j;continue}if(!u)return d(`--${k}`);for(;;){let M=(await c(`${k} (${Cq[k]}) [${W}]: `)).trim(),$=M.length===0?W:M;if(a.includes($)){S[k]=$;break}e.stderr.write(`not an available provider: ${$} (available: ${a.join(", ")})
|
|
2617
2618
|
`)}}Nr(p,{recursive:!0}),Nr(h,{recursive:!0});let w=sr(f);Nr(cm(w),{recursive:!0});let b=ge({path:w});try{b.setConfig("project.docroot",h),b.setConfig("workspace.provider1",S.provider1),b.setConfig("workspace.provider2",S.provider2),b.setConfig("workspace.provider3",S.provider3)}finally{b.close()}let x={name:f,dir:p,db_path:w,basedir:h,providers:{...S}};return C(s,"--json")?U(e,x):(e.stdout.write(`created workspace ${f} at ${p}
|
|
2618
2619
|
`),e.stdout.write(` basedir: ${h}
|
|
2619
2620
|
`),e.stdout.write(` provider1=${S.provider1} provider2=${S.provider2} provider3=${S.provider3}
|
|
@@ -2624,7 +2625,7 @@ remote https:// workflow after a trust prompt.
|
|
|
2624
2625
|
`),2;let c=r.spawn??ek,u=Kn.map(p=>im(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${Kn.join("|")} first
|
|
2625
2626
|
`),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
|
|
2626
2627
|
`),2;let d=e.dal===void 0,f=e.dal??ge({path:le()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Zn()??Rr.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
|
|
2627
|
-
`),0}var
|
|
2628
|
+
`),0}var Iq,Kn,Oq,Cq,sk=E(()=>{"use strict";We();Yv();pe();Ke();Iq=`usage: lmctl workspace list [--json]
|
|
2628
2629
|
lmctl workspace create <name> [--docroot PATH] [--json]
|
|
2629
2630
|
lmctl workspace use <name> [--json]
|
|
2630
2631
|
lmctl workspace show <name> [--json]
|
|
@@ -2636,18 +2637,18 @@ remote https:// workflow after a trust prompt.
|
|
|
2636
2637
|
Manage isolated workspace state directories, active workspace selection,
|
|
2637
2638
|
legacy profile migration, and configured provider slots.
|
|
2638
2639
|
delete requires --confirm; deleting default or active workspaces also requires --force.
|
|
2639
|
-
`;Kn=["claude","codex","gemini","qwen"],
|
|
2640
|
-
`),0}function
|
|
2640
|
+
`;Kn=["claude","codex","gemini","qwen"],Oq={provider1:"claude",provider2:"codex",provider3:"gemini"},Cq={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var ak={};ne(ak,{runProject:()=>Uq});import{existsSync as Dq,statSync as Pq}from"node:fs";import{join as ik}from"node:path";async function Uq(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(Fq),0;try{return await R(e,s=>{switch(r){case"create":return Vq(n,e,s);case"list":return Yq(n,e,s);case"show":return Gq(n,e,s);case"status":return Kq(n,e,s);case"workflow":return Wq(n,e,s);default:return y(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return _e(e,s)}}function Wq(t,e,r){let[n,...s]=t;switch(n){case"add":return Bq(s,e,r);case"list":return Hq(s,e,r);case"show":return qq(s,e,r);case"remove":return Jq(s,e,r);case"enable":return ok(s,e,r,!0);case"disable":return ok(s,e,r,!1);default:return y(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function Bq(t,e,r){let n=D(t,["--condition","--params","--priority"]);if(n.error!==void 0)return y(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return y(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return y(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return y(e,`workflow not found: ${o}`);let l=A(n,"--condition")??null;if(l!==null)try{gr(l)}catch{return y(e,"invalid --condition JEXL")}let c=Xq(A(n,"--params"));if(typeof c=="string")return y(e,c);let u=A(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return y(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return C(n,"--json")?U(e,f):e.stdout.write(`added project workflow ${f.id}
|
|
2641
|
+
`),0}function Hq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return y(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return C(n,"--json")?U(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
|
|
2641
2642
|
`)}${i.length>0?`
|
|
2642
|
-
`:""}`),0}function
|
|
2643
|
-
`),0)}function
|
|
2643
|
+
`:""}`),0}function qq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=um(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return y(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?y(e,`project workflow not found: ${s}`):(C(n,"--json")?U(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
|
|
2644
|
+
`),0)}function Jq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=um(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?y(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
|
|
2644
2645
|
`),0):y(e,`project workflow not found: ${s}`)}function ok(t,e,r,n){let s=D(t,[]);if(s.error!==void 0)return y(e,s.error);let o=um(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(C(s,"--json")?U(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
|
|
2645
|
-
`),0)}function
|
|
2646
|
-
`),0}function
|
|
2647
|
-
`),0}function
|
|
2648
|
-
`),0}function
|
|
2646
|
+
`),0)}function Xq(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function um(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function Gq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return C(n,"--json")?U(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
|
|
2647
|
+
`),0}function Kq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return C(n,"--json")?U(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
|
|
2648
|
+
`),0}function Vq(t,e,r){let n=D(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=A(n,"--owner"),i=A(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=A(n,"--local-path")??(l!==null?ik(l,u):void 0),f=A(n,"--workflow"),m=A(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let h=A(n,"--test-argv"),g=null;if(h!==void 0)try{let b=JSON.parse(h);if(!Array.isArray(b)||!b.every(x=>typeof x=="string")||b.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(b)}catch{return y(e,"--test-argv must be valid JSON")}let _=A(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let S=_!==void 0?_:zq(d)||vs(d)?"folder":"db",w=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:A(n,"--default-branch")??null,test_argv:g,durable_memory_mode:S});return C(n,"--json")?U(e,w):e.stdout.write(`created project ${w.name}
|
|
2649
|
+
`),0}function Yq(t,e,r){let n=D(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listProjects();return C(n,"--json")?U(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
|
|
2649
2650
|
`)}${s.length>0?`
|
|
2650
|
-
`:""}`),0}function
|
|
2651
|
+
`:""}`),0}function zq(t){try{let e=ik(t,"durable-memory");return Dq(e)&&Pq(e).isDirectory()}catch{return!1}}var Fq,lk=E(()=>{"use strict";pe();Sn();ks();Fq=`usage: lmctl project create <name> [--local-path P] --workflow W --team T [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2651
2652
|
lmctl project create --owner OWNER --repo REPO --workflow W --team T [--local-path P] [--default-branch B] [--test-argv JSON] [--durable-memory-mode folder|db] [--json]
|
|
2652
2653
|
lmctl project list [--json]
|
|
2653
2654
|
lmctl project show <name> [--json]
|
|
@@ -2662,7 +2663,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
|
|
|
2662
2663
|
Create, list, inspect, and check projects. The workflow subcommand manages
|
|
2663
2664
|
per-project workflow bindings and routing conditions.
|
|
2664
2665
|
If project create omits --local-path, project.docroot must be configured.
|
|
2665
|
-
`});import{createHash as
|
|
2666
|
+
`});import{createHash as Zq,randomBytes as Qq}from"node:crypto";import{readFile as eJ}from"node:fs/promises";function ck(t=new Date,e=Qq(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function tJ(t){return Zq("sha256").update(t).digest("hex")}async function uk(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await eJ(n);return{path:r,sha256:tJ(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function dk(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var dm=E(()=>{"use strict"});import{spawnSync as fk}from"node:child_process";import{mkdir as fm,writeFile as mk,readFile as rJ,rm as pk}from"node:fs/promises";import{tmpdir as nJ}from"node:os";import{dirname as hk,join as mm}from"node:path";async function _k(t){let e=t.stagingDir??mm(nJ(),`lmctl-diag-${t.ticketId}`),r=mm(e,`diagnostic-${t.ticketId}`);await fm(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=mm(r,d);if(await fm(hk(m),{recursive:!0}),typeof f=="string")await mk(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await mk(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
|
|
2666
2667
|
`;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
|
|
2667
2668
|
`:`${d.pid}
|
|
2668
2669
|
# source=${d.pid_source} alive=${String(d.pid_alive)}
|
|
@@ -2680,31 +2681,31 @@ If project create omits --local-path, project.docroot must be configured.
|
|
|
2680
2681
|
`:`# source=${f}
|
|
2681
2682
|
# tail_lines=${d.tail_lines}
|
|
2682
2683
|
`;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
|
|
2683
|
-
`:""}`)}if(await s("README.md",
|
|
2684
|
-
`)}var gk=E(()=>{"use strict";dm();yo()});import{spawnSync as
|
|
2684
|
+
`:""}`)}if(await s("README.md",sJ(t)),t.sanitized)for(let d of n){let f=await rJ(d.absPath);try{xm(d.bundlePath,f.toString("utf8"))}catch(m){throw await pk(e,{recursive:!0,force:!0}),m instanceof $r,m}}let i=await uk(n),a=dk({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await fm(hk(t.outputPath),{recursive:!0});let l=fk("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=fk("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await pk(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function sJ(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
|
|
2685
|
+
`)}var gk=E(()=>{"use strict";dm();yo()});import{spawnSync as oJ}from"node:child_process";import{stat as iJ}from"node:fs/promises";async function yk(t){try{if(!(await iJ(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return aJ(t);case"hq":return lJ(t)}}function aJ(t){let r=oJ("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function lJ(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var wk=E(()=>{"use strict"});var Tk={};ne(Tk,{parseDiagnoseArgs:()=>Ek,runDiagnose:()=>dJ});import{tmpdir as cJ}from"node:os";import{join as uJ}from"node:path";async function dJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${pJ()}
|
|
2685
2686
|
`),0;let r=Ek(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
|
|
2686
2687
|
`),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
|
|
2687
2688
|
`),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
2688
|
-
`),2;let n=ck(),s=r.outputPath??
|
|
2689
|
+
`),2;let n=ck(),s=r.outputPath??mJ(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await R(e,async i=>{let a=await Rm({dal:i,include:r.include,dbPath:le(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await _k({ticketId:n,data:a,outputPath:s,lmctlNextVersion:lt(),sanitized:!r.noSanitize})}catch(d){if(d instanceof $r)return e.stderr.write(`sanitization failed: ${d.message}
|
|
2689
2690
|
`),2;throw d}let c=await yk({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
|
|
2690
2691
|
`):(e.stdout.write(`ticket: ${n}
|
|
2691
2692
|
`),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
|
|
2692
2693
|
`),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
2693
2694
|
`)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
|
|
2694
|
-
`),1}}function Ek(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!
|
|
2695
|
-
`)}var bk=E(()=>{"use strict";ts();gk();dm();yo();wk();Ke();pe()});var xk={};ne(xk,{ATTENTION_STATES:()=>_m,DAEMON_INTERVAL_FAST_MS:()=>hm,REQUIRED_TEAM_ALIASES:()=>Sk,chooseDiagnoses:()=>Ik,collectEvidence:()=>kk,diagnose:()=>vk,renderReport:()=>Nk,runDiagnosePrompt:()=>
|
|
2695
|
+
`),1}}function Ek(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!fJ(o))return`unknown section: ${o} (expected one of ${wo.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function fJ(t){return wo.includes(t)}function mJ(t){return uJ(cJ(),`lmctl-diag-${t}.tar.gz`)}function pJ(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
|
|
2696
|
+
`)}var bk=E(()=>{"use strict";ts();gk();dm();yo();wk();Ke();pe()});var xk={};ne(xk,{ATTENTION_STATES:()=>_m,DAEMON_INTERVAL_FAST_MS:()=>hm,REQUIRED_TEAM_ALIASES:()=>Sk,chooseDiagnoses:()=>Ik,collectEvidence:()=>kk,diagnose:()=>vk,renderReport:()=>Nk,runDiagnosePrompt:()=>gJ});function vk(t,e){let r=kk(t,e),n=Ik(r);return Nk(r,n)}function kk(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:Ks(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=_J(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=Sk.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function Ik(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>hm&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${hm}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>_m.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function Nk(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${hJ(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>_m.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
|
|
2696
2697
|
`)+`
|
|
2697
|
-
`}function
|
|
2698
|
+
`}function hJ(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function _J(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function gJ(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${pm()}
|
|
2698
2699
|
`),0;let r=[];for(let s of t){if(s.startsWith("--"))return e.stderr.write(`error: unknown flag: ${s}
|
|
2699
2700
|
`),e.stderr.write(`${pm()}
|
|
2700
2701
|
`),2;r.push(s)}if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
|
|
2701
2702
|
`),e.stderr.write(`${pm()}
|
|
2702
2703
|
`),2;let n=r[0];try{return await R(e,s=>(e.stdout.write(vk(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
2703
2704
|
`),1}}function pm(){return["usage: lmctl diagnose-prompt <prompt_id>","",'Narrow read-only diagnostic for the WT-6 "prompt-pending-forever"',"symptom. Renders prompt + dispatch + run + project + workflows + team","state, then picks the top 1-3 likely root causes (daemon interval,","missing workflows, missing team aliases, etc).","","options:"," -h, --help show this help and exit"].join(`
|
|
2704
|
-
`)}var Sk,hm,_m,Ak=E(()=>{"use strict";jd();pe();Sk=["Coder","Reviewer1","Polisher"],hm=3e4,_m=new Set(["attention_needed","paused","escalation"])});var jk={};ne(jk,{appendIntent:()=>Lk,resolveIntentLogPath:()=>$k,runStatus:()=>
|
|
2705
|
-
`)}catch{}}async function
|
|
2705
|
+
`)}var Sk,hm,_m,Ak=E(()=>{"use strict";jd();pe();Sk=["Coder","Reviewer1","Polisher"],hm=3e4,_m=new Set(["attention_needed","paused","escalation"])});var jk={};ne(jk,{appendIntent:()=>Lk,resolveIntentLogPath:()=>$k,runStatus:()=>IJ});import{appendFileSync as yJ,mkdirSync as wJ}from"node:fs";import{homedir as EJ}from"node:os";import{dirname as TJ,join as bJ}from"node:path";function $k(){return process.env.LMCTL_INTENT_LOG??bJ(EJ(),".lmctl","recent-intents.log")}function Lk(t){try{let e=$k();wJ(TJ(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});yJ(e,`${r}
|
|
2706
|
+
`)}catch{}}async function IJ(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(kJ),0;let r=D(t,["--project"],["--web","--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=C(r,"--web"),s=A(r,"--project"),o=C(r,"--json");return n&&s!==void 0?y(e,"--web and --project are mutually exclusive"):R(e,i=>{let a=NJ(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
|
|
2706
2707
|
`),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
|
|
2707
|
-
`),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=
|
|
2708
|
+
`),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=xJ(i,l,a.source);return o?U(e,c):e.stdout.write(jJ(c)),Lk({verb:"status",args:t}),0})}function NJ(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=Yf(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function xJ(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=AJ(t,e.id,vJ),a=RJ(t,e.id),l=$J(t,e.id,SJ);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:LJ(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function AJ(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function RJ(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function $J(t,e,r){return t.db.prepare(`
|
|
2708
2709
|
SELECT r.*, w.name AS workflow_name
|
|
2709
2710
|
FROM run r
|
|
2710
2711
|
JOIN job j ON j.id = r.job_id
|
|
@@ -2712,13 +2713,13 @@ If project create omits --local-path, project.docroot must be configured.
|
|
|
2712
2713
|
WHERE j.project_id = ?
|
|
2713
2714
|
ORDER BY r.id DESC
|
|
2714
2715
|
LIMIT ?
|
|
2715
|
-
`).all(e,r)}function
|
|
2716
|
-
`)}var
|
|
2716
|
+
`).all(e,r)}function LJ(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return Rk(o,100)}}}catch{}return Rk(t,100)}function Rk(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function jJ(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),e.join(`
|
|
2717
|
+
`)}var SJ,vJ,kJ,Ok=E(()=>{"use strict";pe();Zf();SJ=5,vJ=10,kJ=`usage: lmctl status [--project NAME|--web] [--json]
|
|
2717
2718
|
|
|
2718
2719
|
Show the current project context, active run, unacked attentions, and recent
|
|
2719
2720
|
runs. Defaults to resolving the project from the current working directory;
|
|
2720
2721
|
--project selects a project by name, and --web uses the web UI focus.
|
|
2721
|
-
`});Ke();ts();ve();import{pathToFileURL as
|
|
2722
|
+
`});Ke();ts();ve();import{pathToFileURL as OJ}from"node:url";Ol();ts();import{mkdirSync as NI,readFileSync as xI,renameSync as AI,writeFileSync as RI}from"node:fs";import{homedir as $I}from"node:os";import{dirname as LI,join as jI}from"node:path";var OI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",CI=60*60*1e3,MI=1500;function DI(){let t=process.env.HOME??$I();return jI(t,".lmctl",".update-check.json")}function PI(t){return t.isTTY===!0}function FI(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function Cl(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!PI(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function UI(t,e){try{let r=JSON.parse(xI(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<CI)return r.latest}catch{}return null}function WI(t,e){NI(LI(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;RI(r,`${JSON.stringify(e)}
|
|
2722
2723
|
`,"utf8"),AI(r,t)}async function BI(){let t=await bo(OI,{description:"lmctl npm metadata",timeoutMs:MI}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function Pm(t,e=[],r={}){try{if(Cl(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??DI();if(UI(s,n)!==null)return;let i=await(r.fetchLatest??BI)();try{WI(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??lt();FI(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
|
|
2723
2724
|
`)}catch{}}var Vn=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
|
|
2724
2725
|
`,gm=`${Vn}
|
|
@@ -2781,9 +2782,9 @@ ${Vn}Run 'lmctl help' for usage.
|
|
|
2781
2782
|
${Vn}Run 'lmctl help' for usage.
|
|
2782
2783
|
`),1):(t.stderr.write(`error: unknown command: ${e}
|
|
2783
2784
|
${Vn}Run 'lmctl help' for usage.
|
|
2784
|
-
`),1)}async function
|
|
2785
|
+
`),1)}async function CJ(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Cm();try{return await MJ(t,e)}finally{Mm(r)}}async function MJ(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return ym(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return ym(e,"missing value for --workspace");if(!Ge(l))return ym(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Om();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${lt()}
|
|
2785
2786
|
`),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(gm),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(gm),0):Ck.has(i)?Mk(i,[...a,"--help"],e):Dk(e,i)}bm(le(),e.stderr),vm(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(gm),0;Ll()&&Oe({event:"legacy",msg:`[debug] lmctl ${lt()} | node ${process.version} | cmd ${s} ${o.join(" ")}
|
|
2786
|
-
[debug] cwd ${process.cwd()} | db ${le()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}`},{always:!0});try{let i=await Mk(s,o,e);return Ck.has(s)&&!Cl(r,e)&&await Pm(e,r),i}catch(i){return
|
|
2787
|
+
[debug] cwd ${process.cwd()} | db ${le()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}`},{always:!0});try{let i=await Mk(s,o,e);return Ck.has(s)&&!Cl(r,e)&&await Pm(e,r),i}catch(i){return DJ(i,s,o,e)}}function DJ(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Ll())return n.stderr.write(`error: ${s.message}
|
|
2787
2788
|
`),n.stderr.write(`(re-run with --debug for the full stack trace and context)
|
|
2788
2789
|
`),1;n.stderr.write(`error: ${s.message}
|
|
2789
2790
|
`),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
|
|
@@ -2791,10 +2792,10 @@ ${Vn}Run 'lmctl help' for usage.
|
|
|
2791
2792
|
`),s.stack&&n.stderr.write(`${s.stack}
|
|
2792
2793
|
`);let o=s.cause,i=0;for(;o!=null&&i<8;){let a=o instanceof Error?o:new Error(String(o));n.stderr.write(`caused by: ${a.message}
|
|
2793
2794
|
`),a.stack&&n.stderr.write(`${a.stack}
|
|
2794
|
-
`),o=a.cause,i+=1}return 1}async function Mk(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(eu(),a_));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Eu(),z_));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(lb(),ab));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(ub(),cb));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Jb(),qb));return n(e,r)}case"check":{let{runCheck:n}=await Promise.resolve().then(()=>(Gb(),Xb));return n(e,r)}case"push":{let{runPush:n}=await Promise.resolve().then(()=>(Qb(),Zb));return n(e,r)}case"wait":{let{runWait:n}=await Promise.resolve().then(()=>(dS(),uS));return n(e,r)}case"exec":{let{runExec:n}=await Promise.resolve().then(()=>(pS(),mS));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(ES(),wS));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(NS(),IS));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(CS(),OS));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(US(),FS));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(KS(),GS));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(rv(),tv));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(ov(),sv));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(mo(),fo));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(mo(),fo));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(mo(),fo));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(mo(),fo));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(Iv(),kv));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(Rv(),Av));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Ov(),jv));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(om(),sm));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(om(),sm));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(sk(),nk));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(lk(),ak));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(bk(),Tk));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Ak(),xk));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(Ok(),jk));return n(e,r)}case"db":return
|
|
2795
|
+
`),o=a.cause,i+=1}return 1}async function Mk(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(eu(),a_));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Eu(),z_));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(lb(),ab));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(ub(),cb));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Jb(),qb));return n(e,r)}case"check":{let{runCheck:n}=await Promise.resolve().then(()=>(Gb(),Xb));return n(e,r)}case"push":{let{runPush:n}=await Promise.resolve().then(()=>(Qb(),Zb));return n(e,r)}case"wait":{let{runWait:n}=await Promise.resolve().then(()=>(dS(),uS));return n(e,r)}case"exec":{let{runExec:n}=await Promise.resolve().then(()=>(pS(),mS));return n(e,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(ES(),wS));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(NS(),IS));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(CS(),OS));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(DS(),MS));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(US(),FS));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(KS(),GS));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(rv(),tv));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(ov(),sv));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(mo(),fo));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(mo(),fo));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(mo(),fo));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(mo(),fo));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(Iv(),kv));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(Rv(),Av));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Ov(),jv));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(om(),sm));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(om(),sm));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(sk(),nk));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(lk(),ak));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(bk(),Tk));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(Ak(),xk));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(Ok(),jk));return n(e,r)}case"db":return PJ(e,r);default:return Dk(r,t)}}function PJ(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2795
2796
|
|
|
2796
2797
|
Database utilities. The downgrade command is currently a documented stub;
|
|
2797
2798
|
restore from backup for rollback and use normal migrations for forward changes.
|
|
2798
2799
|
`),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
|
|
2799
2800
|
`),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
|
|
2800
|
-
`),1)}if(process.argv[1]!==void 0&&import.meta.url===
|
|
2801
|
+
`),1)}if(process.argv[1]!==void 0&&import.meta.url===OJ(process.argv[1]).href){let t=await CJ(process.argv.slice(2));process.exitCode=t}export{CJ as runCli};
|