@lmctl-ai/lmctl 0.1.257 → 0.1.258
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 +92 -92
- package/package.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var rA=Object.defineProperty;var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var
|
|
1
|
+
var rA=Object.defineProperty;var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var me=(e,t)=>{for(var n in t)rA(e,n,{get:t[n],enumerable:!0})};var Up={};me(Up,{defaultDbPath:()=>Pp,describeStateLocation:()=>vs,isSlowWslMount:()=>Fp,lmctlNextHome:()=>Hi,resolveDbPath:()=>re,warnIfSlowDbPath:()=>cc});import{platform as Dp}from"node:os";import{homedir as sA}from"node:os";import{join as jp}from"node:path";function Hi(){let e=process.env.LMCTL_HOME;return e!==void 0&&e.length>0?e:jp(sA(),iA)}function Pp(){return jp(Hi(),oA)}function re(e){return e!==void 0&&e.length>0?e:process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?process.env.LMCTL_DB:Pp()}function vs(e){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0?`db: ${e} (overridden by --db/LMCTL_DB)`:`db: ${e}`}function Fp(e,t=Dp()){return t!=="linux"?!1:e.startsWith("/mnt/c/")||e==="/mnt/c"}function cc(e,t=process.stderr,n=Dp()){Fp(e,n)&&t.write(`warning: DB on /mnt/c is slow; consider moving to ~/.lmctl/state.db (set LMCTL_DB or use --db)
|
|
2
2
|
`)}var iA,oA,Qe=w(()=>{"use strict";iA=".lmctl",oA="state.db"});function dA(e){for(let t of cA)if(e.startsWith(t))return!0;if(e.startsWith("172.")){let t=Number(e.split(".")[1]);if(Number.isFinite(t)&&t>=16&&t<=31)return!0}return!!e.startsWith("169.254.")}function uA(e){let t=e.toLowerCase();return!!(t==="::1"||t==="::"||t.startsWith("fe80:")||t.startsWith("fe80::"))}function pA(e){let t=e.split(".");if(t.length!==4)return!1;for(let n of t){if(n.length===0||n.length>3)return!1;let r=Number(n);if(!Number.isFinite(r)||r<0||r>255)return!1}return!0}function bs(e){let t=e;for(let{re:n,replacement:r}of lA)t=t.replace(n,r);return t=t.replace(fA,n=>!pA(n)||dA(n)?n:Wp),t=t.replace(mA,n=>uA(n)?n:Wp),t}function Ss(e){return e.split(`
|
|
3
3
|
`).map(t=>bs(t)).join(`
|
|
4
4
|
`)}function Bp(e,t){let n=e.toUpperCase();return n.includes("TOKEN")||n.includes("SECRET")||n.includes("KEY")||n.includes("PASSWORD")||n.includes("PASSWD")||n.includes("CREDENTIAL")||n.includes("AUTH")?{key:e,value:_t}:{key:e,value:bs(t)}}function kn(e){if(typeof e=="string")return bs(e);if(Array.isArray(e))return e.map(t=>kn(t));if(e!==null&&typeof e=="object"){let t={};for(let[n,r]of Object.entries(e)){let s=n.toUpperCase();s.includes("TOKEN")||s.includes("SECRET")||s.includes("KEY")||s.includes("PASSWORD")||s.includes("PASSWD")||s.includes("CREDENTIAL")?t[n]=typeof r=="string"?_t:kn(r):t[n]=kn(r)}return t}return e}function Hp(e,t){for(let{name:n,re:r}of _A){let s=t.match(r);if(s!==null&&!s[0].includes(_t))throw new Zn(e,n)}}var _t,aA,Wp,qp,lA,cA,fA,mA,_A,Zn,Xi=w(()=>{"use strict";_t="[REDACTED]",aA="[REDACTED_EMAIL]",Wp="[REDACTED_IP]",qp="[USER]",lA=[{re:/(authorization\s*[:=]\s*)(bearer\s+[^\s,;"']+)/gi,replacement:`$1Bearer ${_t}`},{re:/(authorization\s*[:=]\s*)(basic\s+[^\s,;"']+)/gi,replacement:`$1Basic ${_t}`},{re:/\b(Bearer\s+)[A-Za-z0-9_\-./+=]{8,}/g,replacement:`$1${_t}`},{re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/g,replacement:_t},{re:/\bsk-[A-Za-z0-9_\-]{16,}/g,replacement:_t},{re:/\bgh[pousr]_[A-Za-z0-9]{30,}/g,replacement:_t},{re:/\bAKIA[0-9A-Z]{16}\b/g,replacement:_t},{re:/\b(api[_-]?key|token|secret|password|passwd)(\s*[:=]\s*"?)([A-Za-z0-9_\-./+=]{8,})("?)/gi,replacement:`$1$2${_t}$4`},{re:/(\/home\/)[^/\s"'`]+/g,replacement:`$1${qp}`},{re:/(\/Users\/)[^/\s"'`]+/g,replacement:`$1${qp}`},{re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/g,replacement:aA}],cA=["127.","10.","192.168.","0.0.0.0"];fA=/\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b/g,mA=/\b(?:[0-9a-fA-F]{1,4}:){2,7}(?::[0-9a-fA-F]{1,4})+\b|\b(?:[0-9a-fA-F]{1,4}:){3,7}[0-9a-fA-F]{1,4}\b|::1\b|::\b(?=[\s,;"')]|$)/g;_A=[{name:"sk-ant",re:/\bsk-ant-[A-Za-z0-9_\-]{8,}/},{name:"sk-openai",re:/\bsk-[A-Za-z0-9_\-]{16,}/},{name:"github-pat",re:/\bgh[pousr]_[A-Za-z0-9]{30,}/},{name:"aws-akid",re:/\bAKIA[0-9A-Z]{16}\b/},{name:"bearer",re:/\bBearer\s+[A-Za-z0-9_\-./+=]{8,}/},{name:"email",re:/\b[A-Za-z0-9._%+\-]+@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}\b/},{name:"home-path",re:/\/home\/(?!\[USER\])[^/\s"'`]+/},{name:"users-path",re:/\/Users\/(?!\[USER\])[^/\s"'`]+/}],Zn=class extends Error{bundlePath;patternName;constructor(t,n){super(`sanitization failed: ${n} pattern matched in ${t}`),this.bundlePath=t,this.patternName=n,this.name="SanitizationError"}}});import{spawnSync as dc}from"node:child_process";import{readFileSync as hA}from"node:fs";import{readFile as fc,stat as Xp}from"node:fs/promises";import{homedir as gA}from"node:os";import{join as yA}from"node:path";import{fileURLToPath as EA}from"node:url";function $t(){try{let e=new URL("../../package.json",import.meta.url),t=JSON.parse(hA(EA(e),"utf8"));if(typeof t.version=="string")return t.version}catch{}return"0.0.0"}async function Jp(e){let t=new Set(e.include??Ji),n={};return t.has("serve")&&(n.serve=await TA(e)),t.has("db")&&(n.db=vA(e)),t.has("runs")&&(n.runs=bA(e)),t.has("jobs")&&(n.jobs=SA(e)),t.has("attentions")&&(n.attentions=kA(e)),t.has("env")&&(n.env=await IA(e)),t.has("intents")&&(n.intents=await xA(e)),n}async function TA(e){let t=e.pidFile??process.env.LMCTL_PID_FILE,n=e.serveLog??process.env.LMCTL_SERVE_LOG,r=e.logTailLines??1e3,s=null,i="none";if(t!==void 0)try{let d=(await fc(t,"utf8")).trim(),u=Number.parseInt(d,10);Number.isInteger(u)&&u>0&&(s=u,i="pidfile")}catch{}let o=null;if(s!==null)try{process.kill(s,0),o=!0}catch{o=!1}let a="",l=null,c=0;if(n===void 0)l="no serve log configured (set LMCTL_SERVE_LOG or --serve-log)";else try{let u=(await fc(n,"utf8")).split(`
|
|
@@ -12,8 +12,8 @@ var rA=Object.defineProperty;var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var fe=(e,t)=>{f
|
|
|
12
12
|
`)),c=[];for(let d of wA){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(Bp(d,u))}return{lmctl_next_version:t,node_version:n,os_info:s,disk_usage:l,env_keys_present:c}}function NA(){return process.env.LMCTL_INTENT_LOG??yA(gA(),".lmctl","recent-intents.log")}async function xA(e){let t=e.intentLog??NA(),n=e.intentLogTailLines??500;try{let s=(await fc(t,"utf8")).split(`
|
|
13
13
|
`).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-n));return{source_path:t,tail_lines:i.length,tail:Ss(i.join(`
|
|
14
14
|
`)),note:null}}catch(r){return r.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${r instanceof Error?r.message:String(r)}`}}}var Ji,wA,uc,ks=w(()=>{"use strict";Xi();Ji=["serve","db","runs","jobs","attentions","env","intents"];wA=["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"];uc=["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 Vp,appendFileSync as AA,mkdirSync as RA,existsSync as kY,readdirSync as IY,unlinkSync as NY}from"node:fs";import{join as Ki,dirname as LA}from"node:path";import{homedir as OA}from"node:os";function mc(){return Ki(OA(),".lmctl")}function Yp(){vr=!0,process.env.LMCTL_DEBUG="1"}function zp(){return{cliDebug:vr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Zp(e){vr=e.cliDebug,e.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=e.lmctlDebugEnv}function le(){if(vr||process.env.LMCTL_DEBUG==="1")return!0;let e=Date.now();return e-Kp>=$A&&(Gp=DA(),Kp=e),Gp}function Qp(){return vr||process.env.LMCTL_DEBUG==="1"}function CA(){let e=new Date,t=e.getTimezoneOffset(),n=t<=0?"+":"-",r=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),s=String(Math.abs(t)%60).padStart(2,"0");return new Date(e.getTime()-t*6e4).toISOString().replace("Z",`${n}${r}:${s}`)}function Ue(e,t){if(t?.verbose){if(!vr)return}else if(!t?.always&&!le())return;try{MA();let n={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...e};AA(Gi,JSON.stringify(n)+`
|
|
15
|
-
`)}catch{}}function MA(){if(!Gi){let t=CA().slice(0,13).replace("T","-");Gi=Ki(mc(),`debug-${t}.log`)}RA(LA(Gi),{recursive:!0})}function je(...e){Ue({event:"legacy",msg:e.join(" ")})}function Ke(...e){Ue({event:"legacy",msg:e.join(" ")},{verbose:!0})}function
|
|
16
|
-
`)){let n=t.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function PA(){try{let e=Vp(Ki(mc(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var vr,Gp,Kp,$A,Gi,
|
|
15
|
+
`)}catch{}}function MA(){if(!Gi){let t=CA().slice(0,13).replace("T","-");Gi=Ki(mc(),`debug-${t}.log`)}RA(LA(Gi),{recursive:!0})}function je(...e){Ue({event:"legacy",msg:e.join(" ")})}function Ke(...e){Ue({event:"legacy",msg:e.join(" ")},{verbose:!0})}function $(e){Ue(e,{always:!0})}function DA(){return jA()||PA()}function jA(){try{let e=Vp(Ki(mc(),"config.toml"),"utf-8");for(let t of e.split(`
|
|
16
|
+
`)){let n=t.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function PA(){try{let e=Vp(Ki(mc(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var vr,Gp,Kp,$A,Gi,ce=w(()=>{"use strict";vr=!1,Gp=!1,Kp=0,$A=5e3;Gi=null});import{existsSync as rR}from"node:fs";import{createRequire as sR}from"node:module";function iR(){return _c===null&&(_c=sR(import.meta.url)("node:sqlite").DatabaseSync),_c}function hc(e){return e.length===1&&oR(e[0])?[e[0]]:e}function oR(e){if(!Ec(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Ec(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var _c,gc,s_,yc,i_=w(()=>{"use strict";_c=null;gc=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,n={}){if(n.fileMustExist===!0&&t!==":memory:"&&!rR(t))throw new Error("unable to open database file");this.name=t,this.handle=new(iR())(t,{readOnly:n.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new yc(this.handle.prepare(t))}exec(t){this.handle.exec(t),this.updateTransactionDepth(t)}pragma(t,n){let r=`PRAGMA ${t}`;if(t.includes("=")){this.exec(r);return}let s=this.prepare(r).get();return n?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(t){return(...n)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=t(...n);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let r=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${r}`);try{let s=t(...n);return this.exec(`RELEASE ${r}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${r}`),this.exec(`RELEASE ${r}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(t){let n=t.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(n!==void 0){if(n==="BEGIN"||n==="SAVEPOINT"){this.transactionDepth+=1;return}if(n==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(n==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}n==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(t.trim())&&(this.transactionDepth=0)}}},s_=gc,yc=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let n=this.handle.get(...hc(t));return this.normalizeRow(n)}all(...t){return this.handle.all(...hc(t)).map(n=>this.normalizeRow(n))}run(...t){let n=this.handle.run(...hc(t));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&Ec(t)?Object.values(t):Ec(t)?{...t}:t}}});var p_={};me(p_,{CURRENT_USER_VERSION:()=>f_,migrate:()=>Vi});import{existsSync as aR,mkdirSync as lR,readFileSync as a_}from"node:fs";import{homedir as cR}from"node:os";import{dirname as l_,join as dR,resolve as c_}from"node:path";import{fileURLToPath as uR,pathToFileURL as fR}from"node:url";function Vi(e){e.dbPath!==":memory:"&&lR(l_(e.dbPath),{recursive:!0});let t=new s_(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let n=m_(t);return n===0&&(t.exec(a_(u_,"utf8")),t.pragma(`user_version = ${f_}`)),pR(t,n),t}function pR(e,t){let n=t;if(n<2&&n!==0&&(e.exec(`
|
|
17
17
|
CREATE TABLE IF NOT EXISTS session_size (
|
|
18
18
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
19
19
|
team_name TEXT NOT NULL,
|
|
@@ -1213,7 +1213,7 @@ var rA=Object.defineProperty;var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var fe=(e,t)=>{f
|
|
|
1213
1213
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,t.kind,t.origin,t.launch_source??t.kind,t.from_identity,t.target_teamfile,t.target_alias,t.root_teamfile,t.cwd,t.command,t.team_chat_log_id===null?null:`msg_tcl_${t.team_chat_log_id}`,t.request_payload,t.holder_pid,t.holder_host,t.started_at,t.last_heartbeat_at,i),xc(t)&&D_(e,i,{invocationId:n,targetTeamfile:t.target_teamfile,targetAlias:t.target_alias??"",holderPid:t.holder_pid,holderHost:t.holder_host,heartbeatAt:s})})}function ro(e,t){let n=er(t.id),r=W_(e,n);return r===null?!1:(Ne(e,{stream_id:n,event_type:CR,observedLastSeq:r.last_seq,ts:t.ended_at??t.started_at,payload:{invocation_id:n,status:t.status,ended_at:t.ended_at,exit_code:t.exit_code,signal:t.signal,result_summary:t.result_summary,error:t.error,legacy:{table:"tracked_invocation",id:t.id}}},s=>{if(e.prepare(`UPDATE invocation_state
|
|
1214
1214
|
SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
|
|
1215
1215
|
WHERE invocation_id = ? AND last_seq = ?`).run(t.status,t.ended_at,t.result_summary,t.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);xc(t)&&P_(e,s,n)}),!0)}function B_(e,t,n,r){let s=er(t.id),i=W_(e,s);return i===null?!1:(Ne(e,{stream_id:s,event_type:MR,observedLastSeq:i.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:t.id}}},o=>{if(e.prepare("UPDATE invocation_state SET notified_by = ?, notified_at = ?, last_seq = ? WHERE invocation_id = ? AND last_seq = ?").run(n,r,o,s,i.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_NOTIFY_CLAIM for ${s}`)}),!0)}function H_(e,t,n){let r=er(t.id);e.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),xc(t)&&j_(e,r,n)}function X_(e,t,n){e.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,er(t))}function J_(e,t,n){e.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,er(t))}var $R,CR,MR,G_=w(()=>{"use strict";zi();Rr();$R="INVOCATION_START",CR="INVOCATION_FINISH",MR="INVOCATION_NOTIFY_CLAIM"});function Lr(e){return typeof e=="string"&&DR.has(e)}function Y_(e){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${e.length>0?e.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: ${so[0]}`,` STANCE: ${so[1]}`,` STANCE: ${so[2]}`,` STANCE: ${K_}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
|
|
1216
|
-
`)}var K_,so,DR,Os,V_,Ac,io,$s=w(()=>{"use strict";K_="other",so=["not_enough_information","dont_know","other_work"],DR=new Set([K_,...so]),Os="@abort",V_="invalid_decision",Ac="escalation_aborted",io="workflow_escalation"});import{randomUUID as z_}from"node:crypto";import{hostname as Cs}from"node:os";function et(e){return e.provider_resolved??e.provider}function M(){return new Date().toISOString()}function Xe(e){return new Rc(Vi({dbPath:e.path}))}function Z_(e,t,n){let r=Q_(t);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===e)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Q_(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(e)}function Q_(e){let t=jR(e),n=t===null?null:PR(t,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))oo(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function jR(e){try{let t=JSON.parse(e);return oo(t)?t:null}catch{return null}}function PR(e,t){let n=e[t];return oo(n)?n:null}function oo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function FR(e){try{let t=JSON.parse(e);return!oo(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function UR(e,t){return e===null?!0:e.holder_host===Cs()?!$e(e.holder_pid):e.last_heartbeat<t}function WR(e,t){if(e.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let n=e.delivering_at<t;if(e.delivery_holder_host===Cs()&&qR(e.delivery_holder_pid)){let r=$e(e.delivery_holder_pid);return r?n?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:r}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:r}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:r}}return n?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function xn(e,t,n={}){let r=new Date().toISOString(),s=t.delivering_at===null?NaN:Date.parse(t.delivering_at),i=Date.parse(r)
|
|
1216
|
+
`)}var K_,so,DR,Os,V_,Ac,io,$s=w(()=>{"use strict";K_="other",so=["not_enough_information","dont_know","other_work"],DR=new Set([K_,...so]),Os="@abort",V_="invalid_decision",Ac="escalation_aborted",io="workflow_escalation"});import{randomUUID as z_}from"node:crypto";import{hostname as Cs}from"node:os";function et(e){return e.provider_resolved??e.provider}function M(){return new Date().toISOString()}function Xe(e){return new Rc(Vi({dbPath:e.path}))}function Z_(e,t,n){let r=Q_(t);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===e)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return Q_(c.definition)},a=l=>{let c=i.indexOf(l);if(c>=0)throw new Error(`cycle detected: ${[...i.slice(c),l].join(" -> ")}`);if(!s.has(l)){i.push(l);try{for(let d of o(l))a(d)}finally{i.pop()}s.add(l)}};a(e)}function Q_(e){let t=jR(e),n=t===null?null:PR(t,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))oo(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function jR(e){try{let t=JSON.parse(e);return oo(t)?t:null}catch{return null}}function PR(e,t){let n=e[t];return oo(n)?n:null}function oo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function FR(e){try{let t=JSON.parse(e);return!oo(t)||typeof t.lock_id!="string"||typeof t.holder_pid!="number"||typeof t.holder_host!="string"||typeof t.started_at!="string"||typeof t.last_heartbeat!="string"?null:{lock_id:t.lock_id,holder_pid:t.holder_pid,holder_host:t.holder_host,started_at:t.started_at,last_heartbeat:t.last_heartbeat}}catch{return null}}function UR(e,t){return e===null?!0:e.holder_host===Cs()?!$e(e.holder_pid):e.last_heartbeat<t}function WR(e,t){if(e.delivering_at===null)return{reclaim:!1,reason:"not-delivering",holderPidAlive:null};let n=e.delivering_at<t;if(e.delivery_holder_host===Cs()&&qR(e.delivery_holder_pid)){let r=$e(e.delivery_holder_pid);return r?n?{reclaim:!0,reason:"stale-live-local-pid",holderPidAlive:r}:{reclaim:!1,reason:"pid-still-alive",holderPidAlive:r}:{reclaim:!0,reason:"dead-local-pid",holderPidAlive:r}}return n?{reclaim:!0,reason:"stale-other-holder",holderPidAlive:null}:{reclaim:!1,reason:"not-yet-stale",holderPidAlive:null}}function xn(e,t,n={}){let r=new Date().toISOString(),s=t.delivering_at===null?NaN:Date.parse(t.delivering_at),i=Date.parse(r);$({event:e,event_at:r,message_id:t.id,message_type:t.message_type,lane_key:JSON.stringify([t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias]),sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,message_created_at:t.created_at,delivering_at:t.delivering_at,delivered_at:t.delivered_at,delivery_holder_pid:t.delivery_holder_pid,delivery_holder_host:t.delivery_holder_host,lease_age_ms:Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):null,...n})}function qR(e){return Number.isInteger(e)&&(e??0)>0}function BR(e){return{...T_(e),getRuntimeState:e.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:e.prepare(`
|
|
1217
1217
|
INSERT INTO runtime_state (scope, key, kind, data, updated_at)
|
|
1218
1218
|
VALUES (?, ?, ?, ?, ?)
|
|
1219
1219
|
ON CONFLICT(scope, key, kind) DO UPDATE SET
|
|
@@ -1620,11 +1620,11 @@ var rA=Object.defineProperty;var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var fe=(e,t)=>{f
|
|
|
1620
1620
|
response = NULL
|
|
1621
1621
|
WHERE id = ?
|
|
1622
1622
|
AND status = 'running'
|
|
1623
|
-
`),...y_(e),...__(e)}}function HR(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var Rc,dt=w(()=>{"use strict";wc();h_();E_();Yi();b_();tn();me();Rr();G_();$s();Rc=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=BR(t),this.claimTxn=t.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=t.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:n,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:n}:{claimed:!0,job:m}}),this.resumeRunTxn=t.transaction((n,r,s)=>HR("state_not_found")),this.resumeInteractiveTxn=t.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==io)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Os&&!a.includes(r))return{resumed:!1,reason:V_};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=$_(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((n,r)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(n,r),i=Qn(s.filter(a=>a.message_type==="request")),o=i===null?null:{action:"set",messageId:Pe(i.id)};for(let a of s)Rs(this.db,a,"",M(),null,a.message_type==="request"?o:null),this.stmts.deleteMailboxMessage.run(a.id);return s})}close(){this.db.close()}query(t,...n){let r=t.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(t).all(...n)}insertWorkflow(t){Z_(t.name,t.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,M()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,t.definition,t.author??null,M());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,t.definition),i}upsertWorkflow(t){Z_(t.name,t.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(t.name);if(n===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,t.definition,t.author??null,M());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??n.definition_schema_version,s,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,t.definition),this.getWorkflow(n.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,M())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,n){return(n===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,n))??null}findWorkflowByName(t,n){return this.getWorkflowByName(t,n)}insertWorkflowVersion(t,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,n,r??null,M());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,t),this.syncWorkflowTriggers(t,r.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,M()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,n){return this.stmts.setTriggerCursor.run(n,M(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,n){return this.stmts.setTriggerFailure.run(M(),n,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let n=this.stmts.insertTeam.run(t.name,M());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let n=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,M());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,n){return this.stmts.findTeamMemberByAlias.get(t,n)??null}updateTeamMemberSession(t,n){return this.stmts.updateTeamMemberSession.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,n,r){return this.stmts.setMemberState.run(n,r??null,M(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,n){return this.stmts.setMemberPromptSnapshot.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,n){return this.stmts.setMemberProviderResolved.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,n){return this.stmts.setMemberRolePrompt.run(n,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,n){let r=this.stmts.getTeamMember.get(t);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let n=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,M());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(t){let n=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",M());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,n){return this.stmts.setProjectIntakeConfig.run(n,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,n){let r=this.stmts.getProject.get(t);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let n=JSON.parse(t.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let n=t.condition??null,r=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,n,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,M());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,n)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let n=M(),r=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,n={}){return this.stmts.listIssuesForProject.all(t).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(t,n){return this.stmts.claimNextIssue.get(n,M(),t)??null}claimIssue(t,n){return this.stmts.claimIssue.get(n,M(),t)??null}closeIssue(t,n,r){let s=M(),i=this.stmts.closeIssue.get(n,r??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,n){let r=this.stmts.reopenIssue.get(n,M(),t);if(r===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return r}updateIssue(t,n){let r=this.getIssue(t);if(r===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,M(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,n){let r=this.stmts.getWebuiSession.get(t);if(r!==void 0)return r;let s=M();return this.stmts.insertWebuiSession.run(t,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,M(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,n){if(this.stmts.setWebuiSessionChatbot.run(n,M(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,n){let r=z_(),s=M();return this.stmts.insertChatbotSession.run(r,t,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,n,r,s){let i=M(),o=this.stmts.insertChatbotMessage.run(t,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,n){this.stmts.upsertConfig.run(t,n,M())}getConfigAll(){let t=this.stmts.listConfig.all(),n={};for(let r of t)n[r.key]=r.value;return n}enqueueJob(t){let n=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??M(),t.dedupe_key??null,t.concurrency_key??null,M());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,r,n)}claimNextJobWithConcurrency(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,r,n,t.evaluator)}claimJobByIdWithConcurrency(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,r,n,t.evaluator)}releaseJob(t,n,r){let s=n==="queued"||n==="running"?null:M();return this.stmts.releaseJob.run(n,r??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,n){return this.stmts.findJobByDedupe.get(t,n)??null}insertRun(t){let n=this.getWorkflow(t.workflow_id);if(n===null)throw new Error(`workflow not found: ${t.workflow_id}`);let r=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,n.active_version_id,t.parent_run_id??null,M()),s=this.stmts.getRun.get(r.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,n){return this.stmts.setJobRun.run(n,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,M()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,n){return this.stmts.setPromptDispatchCompleted.run(n??M(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let n=t.id??"default";this.stmts.ensureWorkspace.run(n,t.name??"Default workspace",t.idleThresholdMs??6e5,M());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let n=M(),r=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let n=this.getWebProject(t.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??n.name,t.config_json===void 0?n.config_json:t.config_json,M(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(M(),t).changes===1}loadMailboxCursor(t,n){return this.stmts.loadMailboxCursor.get(t,n)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,n,r){return this.stmts.loadUsage.get(t,n,r)??null}sumUsageForPeriod(t,n){let r=this.stmts.sumUsageForPeriod.get(t,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at),r=Number(n.lastInsertRowid);return kc(this.db,r,t),no(this.db,r,t),r})()}beginTeamChatLog(t){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at),r=Number(n.lastInsertRowid);return kc(this.db,r,t),r})()}finishTeamChatLog(t,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,t).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${t}`);no(this.db,t,n)})()}setCurrentlyHandlingMessage(t,n,r){this.db.transaction(()=>{Ar(this.db,t,n,r)})()}clearCurrentlyHandlingMessage(t,n,r){return this.db.transaction(()=>to(this.db,t,n,r))()}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,n=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){return this.db.transaction(()=>this.startTrackedInvocationInner(t))()}startTrackedInvocationInner(t){let n=t.started_at??M(),r=t.holder_host??Cs(),s=t.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Ct(t.command),n,t.holder_pid??null,r,s,Ct(t.meta),t.launch_source??t.kind,t.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return q_(this.db,o),o}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,n){return this.db.transaction(()=>{let r=n.ended_at??M();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Ct(n.result_summary),Ct(n.error),n.team_chat_log_id??null,Ct(n.meta),r,t).changes!==1)return null;let i=this.getTrackedInvocation(t);return ro(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(t,n,r){return this.db.transaction(()=>{let s=r.ended_at??M();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Ct(r.result_summary),Ct(r.error),r.team_chat_log_id??null,Ct(r.meta),s,t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(t);return ro(this.db,o),o})()}heartbeatTrackedInvocation(t,n=M()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,t).changes!==1)return null;let s=this.getTrackedInvocation(t);return H_(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(t,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,t).changes!==1?null:(X_(this.db,t,n),this.getTrackedInvocation(t)))()}linkTrackedInvocationMessage(t,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,t).changes!==1?null:(J_(this.db,t,rn(n)),this.getTrackedInvocation(t)))()}abortTrackedInvocationAndTerminalizeMessage(t,n,r){return this.db.transaction(()=>{let s=M();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Ct(r),t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(t);return ro(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(t,n){let r=this.stmts.getTeamChatLogById.get(t);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,t).changes!==1||no(this.db,t,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:M()})}listClaimableTerminalTrackedInvocations(t){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(t,n,r=M()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,t).changes!==1)return null;let i=this.getTrackedInvocation(t);return B_(this.db,i,n,r),i})()}listTrackedInvocations(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile)),t.status!==void 0&&(n.push("status = ?"),r.push(t.status)),t.kind!==void 0&&(n.push("kind = ?"),r.push(t.kind)),t.origin!==void 0&&(n.push("origin = ?"),r.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){return this.db.transaction(()=>{let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Is(t.payload),t.created_at??M(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null),s=this.getMailboxMessage(Number(r.lastInsertRowid));return Sc(this.db,s,{provider:t.receiver_provider,sessionId:t.receiver_session_id},{provider:t.sender_provider,sessionId:t.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(t,n,r,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,n,r,s)}listEnqueuedResponseMailFromSender(t,n,r,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,n,r,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,n,r){let s=[...new Set(t.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=Is(n),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of s){let d=this.getMailboxMessage(c),u=this.stmts.markMailboxMessageDelivered.run(r,i,c);a+=u.changes,u.changes===1&&d!==null&&o.push(d)}let l=new Map;for(let c of o){if(c.message_type!=="request")continue;let d=`${c.receiver_teamfile}\0${c.receiver_alias}`,u=l.get(d);(u===void 0||Qn([u,c])?.id===c.id)&&l.set(d,c)}for(let c of o){let d=l.get(`${c.receiver_teamfile}\0${c.receiver_alias}`)??null;Rs(this.db,c,i,r,null,c.message_type==="request"&&d!==null?{action:"clear",messageId:Pe(d.id)}:null)}this.db.exec("COMMIT");for(let c of o)xn("mailbox_delivery_delivered",c,{transition:c.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:r});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(t,n,r){let s=Is(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,s,d.id,d.delivering_at,d.delivery_holder_pid,d.delivery_holder_host).changes!==1){o.push(d);continue}a+=1,i.push(d)}let l=Qn(i),c=l===null?null:{action:"clear",messageId:Pe(l.id)};for(let d of i)Rs(this.db,d,s,r,null,c);this.db.exec("COMMIT");for(let d of i)xn("mailbox_delivery_delivered",d,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas"});for(let d of o)xn("mailbox_delivery_finalize_skipped",d,{delivered_at:r,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(t,n,r){let s=Is(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,s,p.id,p.delivering_at,p.delivery_holder_pid,p.delivery_holder_host).changes!==1){o.push(p);continue}a+=1,i.push(p)}let c=[...i].sort((p,_)=>p.created_at.localeCompare(_.created_at)||p.id-_.id),d=Qn(i),u=null;if(d!==null&&d.sender_teamfile!==null&&d.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(d.sender_teamfile,d.sender_alias,d.receiver_teamfile,d.receiver_alias,d.root_teamfile,s,r,null,null,null,null,d.reply_mode,d.id);if(l=p.changes,p.changes===1&&(u=this.getMailboxMessage(Number(p.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let f=u===null?null:Pe(u.id),m=d===null?null:{action:"clear",messageId:Pe(d.id)};for(let p of i)Rs(this.db,p,s,r,d!==null&&p.id!==d.id?f:null,m);u!==null&&Sc(this.db,u,{},{},c.map(p=>Pe(p.id))),this.db.exec("COMMIT");for(let p of i)xn("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas-with-response"});for(let p of o)xn("mailbox_delivery_finalize_skipped",p,{delivered_at:r,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(t,n,r=process.pid,s=Cs()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(n,r,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&(L_(this.db,d,n,r,s),o.push(d))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)xn("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:n,delivery_holder_pid:r,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let n=[...new Set(t.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(n.length===0)return 0;let r=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of n){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(Ic(this.db,o,"explicit-clear"),r.push(o))}this.db.exec("COMMIT");for(let i of r)xn("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(t,n="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(t.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&Ic(this.db,s,n),this.getMailboxMessage(t.id)})()}reclaimStaleMailboxDeliveries(t){let n=this.stmts.listInFlightMailboxDeliveries.all(),r=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of n){let o=WR(i,t);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&r.push(a)}this.db.exec("COMMIT");for(let i of s)xn(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:t,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return r}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(t,n){return this.stmts.listDeliveredReceiptsForSender.all(t,n)}listOutboundPendingForSender(t,n){return this.stmts.listOutboundPendingForSender.all(t,n)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,n=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(n))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,t)}getAgentInflight(t,n){return this.stmts.getAgentInflight.get(t,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,n){return this.tryAcquireAgentInflightTxn(t,n)}heartbeatAgentInflight(t,n,r=M()){return this.db.transaction(()=>{let s=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);return s===null||s.sender_teamfile!==t.sender_teamfile||s.sender_alias!==t.sender_alias||s.started_at!==t.started_at?!1:C_(this.db,s,n,r)})()}clearAgentInflight(t,n){this.db.transaction(()=>{let s=this.getAgentInflight(t,n);if(s===null)return;this.stmts.clearAgentInflight.run(t,n).changes===1&&Ls(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(t,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(t,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Ls(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(t,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1623
|
+
`),...y_(e),...__(e)}}function HR(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var Rc,dt=w(()=>{"use strict";wc();h_();E_();Yi();b_();tn();ce();Rr();G_();$s();Rc=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=BR(t),this.claimTxn=t.transaction((n,r,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(n,r,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((n,r,s,i)=>{let o=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of o){let l=this.getJob(a.id);if(l===null)continue;let c=i(l);if(c.concurrency_key!==null&&(l.concurrency_key_resolved!==c.concurrency_key&&this.stmts.setJobConcurrencyKey.run(c.concurrency_key,l.id),(this.stmts.countRunningByConcurrencyKey.get(c.concurrency_key,s,l.id)?.count??0)>=Math.max(1,c.concurrent_limit)))continue;if(this.stmts.claimJob.run(n,r,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=t.transaction((n,r,s,i,o)=>{let a=this.getJob(n);if(a===null)return{claimed:!1,reason:"not_found",job_id:n};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(r,s,i,a.id,i,i,i).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=i?"locked":"not_claimable",job_id:n,status:p?.status??a.status,locked_by:p?.locked_by??a.locked_by,locked_until:p?.locked_until??a.locked_until}}let m=this.getJob(a.id);return m===null?{claimed:!1,reason:"not_found",job_id:n}:{claimed:!0,job:m}}),this.resumeRunTxn=t.transaction((n,r,s)=>HR("state_not_found")),this.resumeInteractiveTxn=t.transaction((n,r,s,i)=>{let o=this.getInteractiveSessionByStepId(n);if(o===null)return{resumed:!1,reason:"not_found"};if(o.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(o.run_id);if(a===null)return{resumed:!1,reason:"run_not_found"};let l=s?"done":"waiting_agent";return this.stmts.updateInteractiveSession.run(l,r,Date.now(),o.id),this.stmts.resumeRunState.run(o.state_name,a.id),this.stmts.requeuePausedJob.run(i,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(n),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==io)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(r!==Os&&!a.includes(r))return{resumed:!1,reason:V_};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=r,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(o,l.id),this.stmts.requeuePausedJob.run(s,l.job_id),this.stmts.ackAttention.run(s,n),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(n,r={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=this.getAgentInflight(n.receiver_teamfile,n.receiver_alias),i=r.reclaim_observed,o=this.stmts.acquireAgentInflight.get({...n,holder_pid:process.pid,stale_before:r.stale_before??null,force:r.force===!0?1:0,reclaim_observed_sender_teamfile:i?.sender_teamfile??null,reclaim_observed_sender_alias:i?.sender_alias??null,reclaim_observed_started_at:i?.started_at??null,reclaim_observed_holder_pid:typeof i?.holder_pid=="number"?i.holder_pid:null}),a;if(o!==void 0){let l=s===null?null:r.reclaim_reason??(r.force===!0?"force":r.reclaim_observed!==void 0?"dead-pid":"stale"),c=$_(this.db,o,s,l,r.stale_before??null,r.force===!0);a={acquired:!0,current:o,lease_id:c}}else a={acquired:!1,current:this.getAgentInflight(n.receiver_teamfile,n.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),a}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((n,r)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(n,r),i=Qn(s.filter(a=>a.message_type==="request")),o=i===null?null:{action:"set",messageId:Pe(i.id)};for(let a of s)Rs(this.db,a,"",M(),null,a.message_type==="request"?o:null),this.stmts.deleteMailboxMessage.run(a.id);return s})}close(){this.db.close()}query(t,...n){let r=t.trim().toLowerCase();if(!r.startsWith("select")&&!r.startsWith("with")&&!r.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(t).all(...n)}insertWorkflow(t){Z_(t.name,t.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,M()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,t.definition,t.author??null,M());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,t.definition),i}upsertWorkflow(t){Z_(t.name,t.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(t.name);if(n===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,t.definition,t.author??null,M());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??n.definition_schema_version,s,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,t.definition),this.getWorkflow(n.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,M())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,n){return(n===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,n))??null}findWorkflowByName(t,n){return this.getWorkflowByName(t,n)}insertWorkflowVersion(t,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,n,r??null,M());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(r.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(n,r.definition,s,t),this.syncWorkflowTriggers(t,r.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,M()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,n){return this.stmts.setTriggerCursor.run(n,M(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,n){return this.stmts.setTriggerFailure.run(M(),n,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,n){let r;try{r=JSON.parse(n)}catch{return}if(r===null||typeof r!="object"||Array.isArray(r))return;let s=r.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let n=this.stmts.insertTeam.run(t.name,M());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let n=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,M());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,n){return this.stmts.findTeamMemberByAlias.get(t,n)??null}updateTeamMemberSession(t,n){return this.stmts.updateTeamMemberSession.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,n,r){return this.stmts.setMemberState.run(n,r??null,M(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,n){return this.stmts.setMemberPromptSnapshot.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,n){return this.stmts.setMemberProviderResolved.run(n,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,n){return this.stmts.setMemberRolePrompt.run(n,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,n){let r=this.stmts.getTeamMember.get(t);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"role_prompt"),i=Object.prototype.hasOwnProperty.call(n,"model"),o=Object.prototype.hasOwnProperty.call(n,"provider");return this.stmts.updateTeamMemberMeta.run(s?n.role_prompt??null:r.role_prompt,i?n.model??null:r.model,o?n.provider??r.provider:r.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let n=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,M());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(t){let n=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",M());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,n){return this.stmts.setProjectIntakeConfig.run(n,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,n){let r=this.stmts.getProject.get(t);if(r===void 0)return null;let s=Object.prototype.hasOwnProperty.call(n,"local_path"),i=Object.prototype.hasOwnProperty.call(n,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(n,"default_branch"),a=Object.prototype.hasOwnProperty.call(n,"intake_config");return this.stmts.updateProjectSettings.run(s?n.local_path:r.local_path,i?n.durable_memory_mode:r.durable_memory_mode,o?n.default_branch??null:r.default_branch,a?n.intake_config??null:r.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let n=JSON.parse(t.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let n=t.condition??null,r=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,n,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,M());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,n)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let n=M(),r=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,n={}){return this.stmts.listIssuesForProject.all(t).filter(r=>!(n.status!==void 0&&!n.status.includes(r.status)||n.severity!==void 0&&!n.severity.includes(r.severity)||n.ai_test_path!==void 0&&r.ai_test_path!==n.ai_test_path))}claimNextIssue(t,n){return this.stmts.claimNextIssue.get(n,M(),t)??null}claimIssue(t,n){return this.stmts.claimIssue.get(n,M(),t)??null}closeIssue(t,n,r){let s=M(),i=this.stmts.closeIssue.get(n,r??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,n){let r=this.stmts.reopenIssue.get(n,M(),t);if(r===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return r}updateIssue(t,n){let r=this.getIssue(t);if(r===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(n,"labels"),i=Object.prototype.hasOwnProperty.call(n,"ai_test_path"),o=this.stmts.updateIssue.get(n.title??r.title,n.body??r.body,n.severity??r.severity,s?n.labels??null:r.labels,i?n.ai_test_path??null:r.ai_test_path,M(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,n){let r=this.stmts.getWebuiSession.get(t);if(r!==void 0)return r;let s=M();return this.stmts.insertWebuiSession.run(t,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,M(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,n){if(this.stmts.setWebuiSessionChatbot.run(n,M(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,n){let r=z_(),s=M();return this.stmts.insertChatbotSession.run(r,t,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,n,r,s){let i=M(),o=this.stmts.insertChatbotMessage.run(t,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,n){this.stmts.upsertConfig.run(t,n,M())}getConfigAll(){let t=this.stmts.listConfig.all(),n={};for(let r of t)n[r.key]=r.value;return n}enqueueJob(t){let n=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??M(),t.dedupe_key??null,t.concurrency_key??null,M());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,r,n)}claimNextJobWithConcurrency(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,r,n,t.evaluator)}claimJobByIdWithConcurrency(t){let n=M(),r=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,r,n,t.evaluator)}releaseJob(t,n,r){let s=n==="queued"||n==="running"?null:M();return this.stmts.releaseJob.run(n,r??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,n){return this.stmts.findJobByDedupe.get(t,n)??null}insertRun(t){let n=this.getWorkflow(t.workflow_id);if(n===null)throw new Error(`workflow not found: ${t.workflow_id}`);let r=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,n.active_version_id,t.parent_run_id??null,M()),s=this.stmts.getRun.get(r.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,n){return this.stmts.setJobRun.run(n,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,M()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,n){return this.stmts.setPromptDispatchCompleted.run(n??M(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let n=t.id??"default";this.stmts.ensureWorkspace.run(n,t.name??"Default workspace",t.idleThresholdMs??6e5,M());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let n=M(),r=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,n,n),s=Number(r.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let n=this.getWebProject(t.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??n.name,t.config_json===void 0?n.config_json:t.config_json,M(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run(M(),t).changes===1}loadMailboxCursor(t,n){return this.stmts.loadMailboxCursor.get(t,n)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,n,r){return this.stmts.loadUsage.get(t,n,r)??null}sumUsageForPeriod(t,n){let r=this.stmts.sumUsageForPeriod.get(t,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at),r=Number(n.lastInsertRowid);return kc(this.db,r,t),no(this.db,r,t),r})()}beginTeamChatLog(t){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at),r=Number(n.lastInsertRowid);return kc(this.db,r,t),r})()}finishTeamChatLog(t,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,t).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${t}`);no(this.db,t,n)})()}setCurrentlyHandlingMessage(t,n,r){this.db.transaction(()=>{Ar(this.db,t,n,r)})()}clearCurrentlyHandlingMessage(t,n,r){return this.db.transaction(()=>to(this.db,t,n,r))()}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,n=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){return this.db.transaction(()=>this.startTrackedInvocationInner(t))()}startTrackedInvocationInner(t){let n=t.started_at??M(),r=t.holder_host??Cs(),s=t.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Ct(t.command),n,t.holder_pid??null,r,s,Ct(t.meta),t.launch_source??t.kind,t.request_payload??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return q_(this.db,o),o}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,n){return this.db.transaction(()=>{let r=n.ended_at??M();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,Ct(n.result_summary),Ct(n.error),n.team_chat_log_id??null,Ct(n.meta),r,t).changes!==1)return null;let i=this.getTrackedInvocation(t);return ro(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(t,n,r){return this.db.transaction(()=>{let s=r.ended_at??M();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,Ct(r.result_summary),Ct(r.error),r.team_chat_log_id??null,Ct(r.meta),s,t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(t);return ro(this.db,o),o})()}heartbeatTrackedInvocation(t,n=M()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,t).changes!==1)return null;let s=this.getTrackedInvocation(t);return H_(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(t,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,t).changes!==1?null:(X_(this.db,t,n),this.getTrackedInvocation(t)))()}linkTrackedInvocationMessage(t,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,t).changes!==1?null:(J_(this.db,t,rn(n)),this.getTrackedInvocation(t)))()}abortTrackedInvocationAndTerminalizeMessage(t,n,r){return this.db.transaction(()=>{let s=M();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,Ct(r),t,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(t);return ro(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(t,n){let r=this.stmts.getTeamChatLogById.get(t);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,t).changes!==1||no(this.db,t,{root_teamfile:r.root_teamfile,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,message:r.message,response:null,origin:r.origin,status:"error",error_detail:n,truncated:r.truncated,created_at:M()})}listClaimableTerminalTrackedInvocations(t){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return r.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${n.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...r)}claimTrackedInvocationNotification(t,n,r=M()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,t).changes!==1)return null;let i=this.getTrackedInvocation(t);return B_(this.db,i,n,r),i})()}listTrackedInvocations(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile)),t.status!==void 0&&(n.push("status = ?"),r.push(t.status)),t.kind!==void 0&&(n.push("kind = ?"),r.push(t.kind)),t.origin!==void 0&&(n.push("origin = ?"),r.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));r.push(s);let i=n.length===0?"":` WHERE ${n.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...r)}maxTrackedInvocationId(t={}){let n=[],r=[];t.from!==void 0&&(n.push("from_identity = ?"),r.push(t.from)),t.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(t.scope_teamfile));let s=n.length===0?"":` WHERE ${n.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...r);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){return this.db.transaction(()=>{let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Is(t.payload),t.created_at??M(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null),s=this.getMailboxMessage(Number(r.lastInsertRowid));return Sc(this.db,s,{provider:t.receiver_provider,sessionId:t.receiver_session_id},{provider:t.sender_provider,sessionId:t.sender_session_id}),s})()}listEnqueuedRequestMailFromSender(t,n,r,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,n,r,s)}listEnqueuedResponseMailFromSender(t,n,r,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,n,r,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,n,r){let s=[...new Set(t.map(a=>Math.trunc(a)).filter(a=>Number.isInteger(a)&&a>0))];if(s.length===0)return 0;let i=Is(n),o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let c of s){let d=this.getMailboxMessage(c),u=this.stmts.markMailboxMessageDelivered.run(r,i,c);a+=u.changes,u.changes===1&&d!==null&&o.push(d)}let l=new Map;for(let c of o){if(c.message_type!=="request")continue;let d=`${c.receiver_teamfile}\0${c.receiver_alias}`,u=l.get(d);(u===void 0||Qn([u,c])?.id===c.id)&&l.set(d,c)}for(let c of o){let d=l.get(`${c.receiver_teamfile}\0${c.receiver_alias}`)??null;Rs(this.db,c,i,r,null,c.message_type==="request"&&d!==null?{action:"clear",messageId:Pe(d.id)}:null)}this.db.exec("COMMIT");for(let c of o)xn("mailbox_delivery_delivered",c,{transition:c.delivering_at===null?"pending->delivered":"delivering->delivered",delivered_at:r});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDelivered(t,n,r){let s=Is(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0;for(let d of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,s,d.id,d.delivering_at,d.delivery_holder_pid,d.delivery_holder_host).changes!==1){o.push(d);continue}a+=1,i.push(d)}let l=Qn(i),c=l===null?null:{action:"clear",messageId:Pe(l.id)};for(let d of i)Rs(this.db,d,s,r,null,c);this.db.exec("COMMIT");for(let d of i)xn("mailbox_delivery_delivered",d,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas"});for(let d of o)xn("mailbox_delivery_finalize_skipped",d,{delivered_at:r,finalizer:"lease-cas",reason:"observed delivery lease changed before finalization"});return a}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}markRelayRequestDeliveredAndEnqueueResponses(t,n,r){let s=Is(n),i=[],o=[];this.db.exec("BEGIN IMMEDIATE");try{let a=0,l=0;for(let p of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(r,s,p.id,p.delivering_at,p.delivery_holder_pid,p.delivery_holder_host).changes!==1){o.push(p);continue}a+=1,i.push(p)}let c=[...i].sort((p,_)=>p.created_at.localeCompare(_.created_at)||p.id-_.id),d=Qn(i),u=null;if(d!==null&&d.sender_teamfile!==null&&d.sender_alias!==null){let p=this.stmts.insertMailboxResponseIfAbsent.run(d.sender_teamfile,d.sender_alias,d.receiver_teamfile,d.receiver_alias,d.root_teamfile,s,r,null,null,null,null,d.reply_mode,d.id);if(l=p.changes,p.changes===1&&(u=this.getMailboxMessage(Number(p.lastInsertRowid)),u===null))throw new Error("mailbox response disappeared during event append")}let f=u===null?null:Pe(u.id),m=d===null?null:{action:"clear",messageId:Pe(d.id)};for(let p of i)Rs(this.db,p,s,r,d!==null&&p.id!==d.id?f:null,m);u!==null&&Sc(this.db,u,{},{},c.map(p=>Pe(p.id))),this.db.exec("COMMIT");for(let p of i)xn("mailbox_delivery_delivered",p,{transition:"delivering->delivered",delivered_at:r,finalizer:"lease-cas-with-response"});for(let p of o)xn("mailbox_delivery_finalize_skipped",p,{delivered_at:r,finalizer:"lease-cas-with-response",reason:"observed delivery lease changed before finalization"});return{marked:a,responses:l}}catch(a){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),a}}claimMailForDelivery(t,n,r=process.pid,s=Cs()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let l of i)if(this.stmts.claimMailboxMessageDelivery.run(n,r,s,l).changes===1){let d=this.getMailboxMessage(l);d!==null&&(L_(this.db,d,n,r,s),o.push(d))}this.db.exec("COMMIT");let a=o.map(l=>l.id);for(let l of o)xn("mailbox_delivery_claimed",l,{transition:"pending->delivering",batch_ids:a,delivering_at:n,delivery_holder_pid:r,delivery_holder_host:s});return o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let n=[...new Set(t.map(s=>Math.trunc(s)).filter(s=>Number.isInteger(s)&&s>0))];if(n.length===0)return 0;let r=[];this.db.exec("BEGIN IMMEDIATE");try{let s=0;for(let i of n){let o=this.getMailboxMessage(i),a=this.stmts.clearMailboxMessageDelivery.run(i);s+=a.changes,a.changes===1&&o!==null&&o.delivering_at!==null&&(Ic(this.db,o,"explicit-clear"),r.push(o))}this.db.exec("COMMIT");for(let i of r)xn("mailbox_delivery_cleared",i,{transition:"delivering->pending",reason:"explicit non-CAS clear"});return s}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}reclaimMailboxDeliveryIfUnchanged(t,n="delivery-failure"){return this.db.transaction(()=>{let s=this.getMailboxMessage(t.id);if(this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1)return null;if(s===null)throw new Error("mailbox row disappeared during claim release");return s.delivering_at!==null&&Ic(this.db,s,n),this.getMailboxMessage(t.id)})()}reclaimStaleMailboxDeliveries(t){let n=this.stmts.listInFlightMailboxDeliveries.all(),r=[],s=[];this.db.exec("BEGIN IMMEDIATE");try{for(let i of n){let o=WR(i,t);if(!o.reclaim){s.push({row:i,decision:o,reclaimed:!1});continue}let a=this.reclaimMailboxDeliveryIfUnchanged(i,o.reason),l=a!==null;s.push({row:i,decision:o,reclaimed:l}),l&&r.push(a)}this.db.exec("COMMIT");for(let i of s)xn(i.decision.reclaim?i.reclaimed?"mailbox_delivery_reclaimed":"mailbox_delivery_reclaim_raced":"mailbox_delivery_reclaim_deferred",i.row,{transition:i.reclaimed?"delivering->pending":"delivering->delivering",stale_before:t,reclaim_reason:i.decision.reason,holder_pid_alive:i.decision.holderPidAlive});return r}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}listDeliveredReceiptsForSender(t,n){return this.stmts.listDeliveredReceiptsForSender.all(t,n)}listOutboundPendingForSender(t,n){return this.stmts.listOutboundPendingForSender.all(t,n)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,n=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(n))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,t)}getAgentInflight(t,n){return this.stmts.getAgentInflight.get(t,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,n){return this.tryAcquireAgentInflightTxn(t,n)}heartbeatAgentInflight(t,n,r=M()){return this.db.transaction(()=>{let s=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);return s===null||s.sender_teamfile!==t.sender_teamfile||s.sender_alias!==t.sender_alias||s.started_at!==t.started_at?!1:C_(this.db,s,n,r)})()}clearAgentInflight(t,n){this.db.transaction(()=>{let s=this.getAgentInflight(t,n);if(s===null)return;this.stmts.clearAgentInflight.run(t,n).changes===1&&Ls(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(t,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(t,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:n,observed_sender_teamfile:r.sender_teamfile,observed_sender_alias:r.sender_alias,observed_started_at:r.started_at,observed_holder_pid:r.holder_pid});return o.changes===1&&i!==null&&Ls(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(t,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
|
|
1624
1624
|
WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(t.receiver_teamfile,t.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return i.changes===1&&Ls(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<t),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Ls(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(t,n){let r=this.stmts.getRuntimeState.get(Ns,As(t,n),xs);return r===void 0?null:v_(r.data)}setTerminalLock(t){this.db.transaction(()=>{let r=this.getTerminalLock(t.teamfile,t.alias);r!==null&&r.lock_id!==t.lock_id&&Nc(this.db,r,!0),this.stmts.upsertRuntimeState.run(Ns,As(t.teamfile,t.alias),xs,JSON.stringify(t),t.last_heartbeat),r?.lock_id!==t.lock_id&&M_(this.db,t)})()}heartbeatTerminalLock(t,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,n);if(i===null||i.lock_id!==r)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Ns,As(t,n),xs,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Ns,As(t,n),xs);return i.changes===1&&Nc(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,n,r){let s=this.stmts.getRuntimeState.get(t,n,r);return s===void 0?null:FR(s.data)}tryAcquireRuntimeProcessLock(t,n,r,s,i=M()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,n,r);if(o!==null&&!UR(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:z_(),holder_pid:process.pid,holder_host:Cs(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,n,r,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,n){return this.stmts.setRunCurrentState.run(n,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,n,r){return this.stmts.setRunPausedState.run(n,r,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,n){return this.stmts.setRunPendingEscalationDecision.run(n,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,n){return this.stmts.setRunTerminalState.run(n,M(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,n){return this.resumeRunTxn(t,n,M())}insertStep(t){let n=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,M());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(t,n,r){return this.stmts.finishStep.run(n??null,r??null,M(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let n=this.stmts.listLatestStepOutcomesByState.all(t),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(t){let n=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??M(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let n=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,M());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(t){let r=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,M()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:r}}insertExternalSignal(t){let n=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,M()),r=n.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:r}}raiseAttention(t){let n=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,M());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run(M(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let n=M();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,n,n),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,n){return this.stmts.getDurableMemoryByName.get(t,n)??null}deleteDurableMemory(t,n){return this.stmts.deleteDurableMemory.run(t,n).changes>0}listDurableMemory(t,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(t,n):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(t).filter(s=>n.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(t){let n=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??M());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,n,r=20){return this.stmts.sessionSizeHistory.all(t,n,r)}insertSessionEvent(t){let n=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(t,n){return n!==void 0?this.stmts.listSessionEventsSince.all(t,n):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,n=1e3){return this.stmts.listAllEventsSince.all(t,n)}latestAgentCall(t){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(n===void 0)return null;try{let r=JSON.parse(n.payload);return typeof r.alias!="string"||typeof r.provider!="string"?null:{alias:r.alias,provider:r.provider,...typeof r.model=="string"?{model:r.model}:{}}}catch{return null}}agentCallTokenTotals(t){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),r=0,s=0,i=0;for(let o of n)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(r+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:r,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let n=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,n,r){return this.stmts.findUnackedDrift.get(t,n??null,r)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let n=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,n,n),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,n){return this.stmts.getInteractiveSessionByRunAndState.get(t,n)??null}setInteractiveAgentOutput(t,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),t)}resumeInteractive(t,n,r){return this.resumeInteractiveTxn(t,n,r,M())}resumeEscalation(t,n){return this.resumeEscalationTxn(t,n,M())}}});import{realpathSync as XR}from"node:fs";import{resolve as JR}from"node:path";function Lc(e){let t=JR(e);try{return XR(t)}catch{return t}}var eh=w(()=>{"use strict"});import{platform as th}from"node:os";function Dt(e){let t=new Ms;for(let n of e)t.registerAdapter(n);return t}var Ms,Oc=w(()=>{"use strict";eh();Ms=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let n=[],r=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(t?.workspace){let o=Lc(t.workspace);i=i.filter(a=>Lc(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,n){let r=await this.resolveSessions(t,n);return r.length===1?r[0]:null}async resolveSessions(t,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=th()==="darwin"||th()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:t,filePattern:s.filePattern});return n}async deleteSession(t,n){let r=await this.resolveSession(t,n);return r?r.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:n=>t.load(n),resolveSessionPath:n=>t.resolvePath(n),deleteSession:n=>t.delete(n),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as nh}from"node:fs";import{createInterface as rh}from"node:readline";import{stat as GR}from"node:fs/promises";import{homedir as KR}from"node:os";function sh(e){try{let t=JSON.parse(e);return t===null||typeof t!="object"||Array.isArray(t)?void 0:t}catch{return}}async function*Je(e){let t=nh(e,{encoding:"utf-8"}),n=rh({input:t,crlfDelay:1/0});try{for await(let r of n){let s=r.trim();if(!s)continue;let i=sh(s);i!==void 0&&(yield i)}}finally{t.destroy()}}async function Ve(e,t){let n=[],r=nh(e,{encoding:"utf-8"}),s=rh({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=sh(o);if(a!==void 0&&n.push(a),n.length>=t)break}}finally{s.close(),r.destroy()}return n}async function Ce(e){let t=await GR(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function pe(e){return e.replace(/\\n/g,`
|
|
1625
1625
|
`).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}function jt(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}var ke,on=w(()=>{"use strict";ke=KR()});import{readdir as ao,stat as ih,unlink as VR}from"node:fs/promises";import{join as Or,basename as oh}from"node:path";function YR(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function zR(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return pe(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function ah(e){let t=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of Je(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;n+=u+f+m,r+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function ZR(e){let t=QR(e),n=new Set;for(let r of e){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=t.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/Command running in background with ID:\s*([A-Za-z0-9_-]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of e){if(r.role!=="tool_use"||r.toolName!=="TaskOutput"&&r.toolName!=="TaskStop"||r.toolCallId===void 0)continue;let s=r.toolInputData?.task_id;if(typeof s!="string"||!n.has(s))continue;r.backgroundTaskId=s;let i=t.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function QR(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}var lo,lh=w(()=>{"use strict";on();lo=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Or(ke,".claude"),this.projectsDir=Or(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await ao(this.projectsDir)}catch{return t}for(let r of n){let s=Or(this.projectsDir,r);if(!(await ih(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ao(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=oh(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Or(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,n){let r=await Ve(t,50),s=await Ce(t),i="",o,a,l,c,d,u;for(let m of r)if(!YR(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=G(p.trim(),80)),d=G(p.trim(),80)}}if(!i)return null;let f=await ah(t);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await Ce(n),s=[],i="",o,a,l,c,d,u,f,m=t,p;for await(let h of Je(n))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:zR(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),E=h.message.content;if(typeof E=="string"){if(E.includes("<command-name>")||E.includes("<local-command-"))continue;d||(d=G(E.trim(),80)),u=G(E.trim(),80),p=void 0,s.push({role:"user",timestamp:g,content:pe(E.trim())})}else if(Array.isArray(E)){for(let y of E)if(y.type==="tool_result"){let b=typeof y.content=="string"?pe(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:b,toolCallId:y.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.stop_reason===null||h.message.stop_reason==="tool_use"?p="in_progress":typeof h.message.stop_reason=="string"&&(p="complete"),h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),E=h.message.content;if(Array.isArray(E))for(let y of E)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:pe(y.text),model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolInputData:y.input,toolCallId:y.id,model:h.message.model,...typeof h.message.stop_reason=="string"?{stopReason:h.message.stop_reason}:{}}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;ZR(s);let _=await ah(n);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||r.createdAt,modifiedAt:r.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,turnStatus:p,firstUserMessage:d,lastUserMessage:u,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:_.totalCacheWriteInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let n=await this.resolveSessionFile(t);return n?(await VR(n),!0):!1}async resolveSessionFile(t){let n;try{n=await ao(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=Or(this.projectsDir,o);if(!(await ih(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ao(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=oh(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&r.push({filePath:Or(a,d),fileSessionId:u})}}let s=r.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Ve(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});import{readFileSync as e0,writeFileSync as q3,mkdirSync as B3}from"node:fs";import{join as t0,dirname as X3}from"node:path";import{homedir as n0}from"node:os";function s0(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e}function i0(e){let t=e.indexOf("=");if(t===-1)return null;let n=e.slice(0,t).trim(),r=s0(e.slice(t+1).trim());return n?{key:n,value:r}:null}function o0(e){let t=e.trim();return t.startsWith("[")&&t.endsWith("]")?t.slice(1,-1).trim():null}function co(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function a0(){return t0(n0(),".lmctl","config.toml")}function Cc(e){let t=e??a0(),n;try{n=e0(t,"utf-8")}catch{return{tools:{}}}return l0(n)}function ch(e){if(typeof e=="number")return Number.isFinite(e)?e:null;let t=String(e).trim();if(!t)return null;let n=t.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function l0(e){let t={},n={},r=e.split(`
|
|
1626
1626
|
`),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let f=t[s.tool]??{};if(s.profile){let m=f.profiles?.[s.profile]??{};i.description&&(m.description=i.description),i.flags!==void 0&&(m.flags=i.flags),f.profiles||(f.profiles={}),f.profiles[s.profile]=m}else i.start&&(f.start=i.start),i.resume&&(f.resume=i.resume),i.agent&&(f.agent=i.agent),i.profile_flag!==void 0&&(f.profile_flag=i.profile_flag);t[s.tool]=f}else if(s.kind==="compact"){let f=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let m=ch(i.min);m!==null&&(f.min=m)}if(i.max!==void 0){let m=ch(i.max);m!==null&&(f.max=m)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=f):n.global=f}i={}}for(let f of r){let m=f.trim();if(!m||m.startsWith("#"))continue;let p=o0(m);if(p!==null){if(o=!0,l(),p.startsWith("tool.")){let h=".profile.",g=p.indexOf(h);g!==-1?s={kind:"tool",tool:p.slice(5,g),profile:p.slice(g+h.length)}:s={kind:"tool",tool:p.slice(5),profile:null}}else p==="compact"?s={kind:"compact",provider:null}:p.startsWith("compact.")?s={kind:"compact",provider:p.slice(8)}:s={kind:"none"};continue}let _=i0(m);_&&s.kind!=="none"?i[_.key]=_.value:_&&!o&&(a[_.key]=_.value)}l();let c={tools:t};(n.global||n.providers)&&(c.compact=n);let d=a.site_name;d!==void 0&&d.length>0&&(c.site_name=d);let u=a.mailbox_queue_enabled;return u!==void 0&&u.trim().length>0&&(c.mailbox_queue_enabled=u.trim().toLowerCase()!=="false"),c}function dh(e){return e.site_name??null}function uh(e=process.env){let t=e.LMCTL_MAILBOX_QUEUE_ENABLED;if(t!==void 0&&t.trim().length>0)return t.trim().toLowerCase()!=="false";try{return Cc().mailbox_queue_enabled??!1}catch{return!1}}function c0(e,t,n){if(!n)return"";let r=e.tools[t]??$c[t],s=r?.profiles?.[n]?.flags??$c[t]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${t}"`)}function fh(e,t){return!!e.tools[t]}function mh(e,t,n,r,s){let i=e.tools[t]??$c[t],o;if(i?.agent){let l=co(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=r0[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let d=c.map(co).join(" ");o=`printf '%s\\n' ${co(r)} | ${d}`}else o=c.map(co).join(" ")}let a=c0(e,t,s);return a&&(o+=" "+a),o}var $c,r0,uo=w(()=>{"use strict";$c={claude:{start:"claude",resume:"claude --resume {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},codex:{start:"codex",resume:"codex resume {{session_id}} --dangerously-bypass-approvals-and-sandbox",profiles:{default:{description:"Default profile",flags:""}}},opencode:{start:"opencode",resume:"opencode --session {{session_id}}",profiles:{default:{description:"Default profile",flags:""}}},gemini:{start:"gemini",resume:"gemini --resume {{session_id}} -y",profiles:{default:{description:"Default profile",flags:""}}},copilot:{start:"copilot",resume:"copilot --resume={{session_id}} --yolo",profiles:{default:{description:"Default profile",flags:""}}},qwen:{start:"qwen",resume:"qwen --resume {{session_id}} --approval-mode yolo",profiles:{default:{description:"Default profile",flags:""}}},agy:{start:"agy",resume:"agy --conversation {{session_id}} --dangerously-skip-permissions",profiles:{default:{description:"Default profile",flags:""}}},kimi:{start:"kimi --auto",resume:"kimi --session {{session_id}} --auto",profiles:{default:{description:"Default profile",flags:""}}}},r0={claude:{mode:"argv",argv:["claude","-p","{{prompt}}","--resume","{{session_id}}"]},codex:{mode:"argv",argv:["codex","exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","resume","{{session_id}}","{{prompt}}"]},opencode:{mode:"argv",argv:["opencode","run","--session","{{session_id}}","{{prompt}}"]},gemini:{mode:"argv",argv:["gemini","-p","{{prompt}}","--resume","{{session_id}}"]},copilot:{mode:"argv",argv:["gh","copilot","--","--resume={{session_id}}","-p","{{prompt}}","-s","--allow-all-tools"]},qwen:{mode:"argv",argv:["qwen","-p","{{prompt}}","--resume","{{session_id}}","--approval-mode","yolo"]},agy:{mode:"argv",argv:["agy","--conversation","{{session_id}}","-p","{{prompt}}","--dangerously-skip-permissions","--print-timeout","8h"]},kimi:{mode:"argv",argv:["kimi","-p","{{prompt}}","--session","{{session_id}}","--output-format","stream-json"]}}});function ph(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let n=Number(t);return!Number.isFinite(n)||n<=0?6e5:n}var _h=w(()=>{"use strict"});var d0,ge,fo,yt=w(()=>{"use strict";d0="ACK: waiting for explicit lmctl task.",ge=`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. Reply exactly: ${d0}`,fo=`send this exact lmctl seed instruction: "${ge}"`});function An(e,t){let n={...e??process.env,PWD:t};return delete n.OLDPWD,n}function f0(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Ds]:t}}function Ye(e,t,n,r="chat"){return{...f0(An(e,t),n),[u0]:r}}var Ds,u0,Et=w(()=>{"use strict";Ds="LMCTL_SELF_SESSIONID",u0="LMCTL_LAUNCH_SOURCE"});import{spawn as hh}from"node:child_process";import{mkdirSync as m0}from"node:fs";var Mc,Ae,Pt=w(()=>{"use strict";uo();_h();yt();Et();Mc=class e extends Error{cancelReason;constructor(t,n){super(t),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,e.prototype)}},Ae=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let n=t?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===ge?n:r)}seed(t,n){return m0(t,{recursive:!0}),new Promise(r=>{let s;try{s=hh(this.binary,this.seedArgsFor(n),{cwd:t,env:An(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return r({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=n?.prompt!==void 0&&this.seedStdin!==void 0?`${n.prompt}
|
|
1627
|
-
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{r(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(t,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:fo,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,n){if(n.userConfig&&fh(n.userConfig,this.name)){let s=n.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,n,s.agent)}let r=n.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return r<=0&&!n.signal?this.transportFn(t,{...n,binary:this.binary}):this.withTimeouts(r,t,n)}withTimeouts(t,n,r){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...r,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),r.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),r.onProgress?.(p)}},f=this.transportFn(n,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new Mc("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,n,r){let s=mh(n.userConfig,this.name,n.sessionId,t,n.profile),i=Date.now();return new Promise((o,a)=>{let l=ph(n.env),c=hh(s,{shell:!0,cwd:n.cwd,env:Ye(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let h=_.toString();m+=h,n.onDelta?.(h)}),c.stderr?.on("data",_=>{p+=_.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let h=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:h}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function po(e,t){let n;if(t&&typeof t=="object"){let r=t.code;typeof r=="number"&&(n=r)}return new ln(e,n,t)}var ut,Ie,an,mo,ln,$r=w(()=>{"use strict";ut=class extends Error{constructor(t,n){super(t,n),this.name=this.constructor.name}},Ie=class extends ut{},an=class extends ut{exitCode;signal;stderr;constructor(t,n,r=null,s){super(t),this.exitCode=n,this.signal=r,this.stderr=s}},mo=class extends ut{line;constructor(t,n,r){super(t,{cause:r}),this.line=n}},ln=class extends ut{rpcCode;rpcData;constructor(t,n,r){super(t),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as jc from"node:child_process";function _0(e){if(typeof jc.spawnSync=="function")try{jc.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function gh(e){return e.exitCode!==null||e.signalCode!==null}function Dc(e,t){return gh(e)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,e.removeListener("exit",s),n(!1))},t);e.once("exit",s)})}async function tt(e,t={}){let n=Date.now(),r=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??_0;if(gh(e))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await Dc(e,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await Dc(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await Dc(e,p0)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var p0,js=w(()=>{"use strict";p0=1e3});function yh(e){le()&&Ue({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function Rn(e,t){let n=g0[e];if(n)return n[t]??n.yolo}function E0(e,t){if(t.length===0)return!0;for(let n=0;n+t.length<=e.length;n++){let r=!0;for(let s=0;s<t.length;s++)if(e[n+s]!==t[s]){r=!1;break}if(r)return!0}return!1}function wt(e,t,n="yolo"){if(y0.has(e)){yh(`YOLO ${e} [mode=${n}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":e==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?Rn(e,"plan"):h0[e];if(!r){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw
|
|
1627
|
+
`:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{r(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(t,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:fo,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,n){if(n.userConfig&&fh(n.userConfig,this.name)){let s=n.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,n,s.agent)}let r=n.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return r<=0&&!n.signal?this.transportFn(t,{...n,binary:this.binary}):this.withTimeouts(r,t,n)}withTimeouts(t,n,r){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...r,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),r.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),r.onProgress?.(p)}},f=this.transportFn(n,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new Mc("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,n,r){let s=mh(n.userConfig,this.name,n.sessionId,t,n.profile),i=Date.now();return new Promise((o,a)=>{let l=ph(n.env),c=hh(s,{shell:!0,cwd:n.cwd,env:Ye(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let h=_.toString();m+=h,n.onDelta?.(h)}),c.stderr?.on("data",_=>{p+=_.toString()}),n.signal){if(n.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));n.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let h=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:h}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function po(e,t){let n;if(t&&typeof t=="object"){let r=t.code;typeof r=="number"&&(n=r)}return new ln(e,n,t)}var ut,Ie,an,mo,ln,$r=w(()=>{"use strict";ut=class extends Error{constructor(t,n){super(t,n),this.name=this.constructor.name}},Ie=class extends ut{},an=class extends ut{exitCode;signal;stderr;constructor(t,n,r=null,s){super(t),this.exitCode=n,this.signal=r,this.stderr=s}},mo=class extends ut{line;constructor(t,n,r){super(t,{cause:r}),this.line=n}},ln=class extends ut{rpcCode;rpcData;constructor(t,n,r){super(t),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as jc from"node:child_process";function _0(e){if(typeof jc.spawnSync=="function")try{jc.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function gh(e){return e.exitCode!==null||e.signalCode!==null}function Dc(e,t){return gh(e)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,e.removeListener("exit",s),n(!1))},t);e.once("exit",s)})}async function tt(e,t={}){let n=Date.now(),r=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??_0;if(gh(e))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await Dc(e,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await Dc(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await Dc(e,p0)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var p0,js=w(()=>{"use strict";p0=1e3});function yh(e){le()&&Ue({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function Rn(e,t){let n=g0[e];if(n)return n[t]??n.yolo}function E0(e,t){if(t.length===0)return!0;for(let n=0;n+t.length<=e.length;n++){let r=!0;for(let s=0;s<t.length;s++)if(e[n+s]!==t[s]){r=!1;break}if(r)return!0}return!1}function wt(e,t,n="yolo"){if(y0.has(e)){yh(`YOLO ${e} [mode=${n}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":e==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?Rn(e,"plan"):h0[e];if(!r){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw $({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new Ie(s)}if(!E0(t,r)){let s=r.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw $({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:n,args:t.join(" "),message:i}),new Ie(i)}yh(`YOLO ${e} [mode=${n}]: argv flag '${r.join(" ")}'`)}var h0,g0,y0,Cr=w(()=>{"use strict";$r();ce();h0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},g0={claude:{yolo:["--dangerously-skip-permissions"],plan:["--permission-mode","plan"]},qwen:{yolo:["--approval-mode","yolo"],plan:["--approval-mode","plan"]},gemini:{yolo:["-y"],plan:["--approval-mode","plan"]},copilot:{yolo:["--yolo"],plan:["--yolo"]},agy:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]},lmplayer:{yolo:["--dangerously-skip-permissions"],plan:["--dangerously-skip-permissions"]}};y0=new Set(["codex","opencode","kimi"])});async function k0(e,t,n){if(typeof e=="boolean")return e;let r,s;try{return await Promise.race([e,new Promise(i=>{r=setTimeout(()=>i(Pc),t),r.unref?.(),n!==void 0&&(s=()=>i(Pc),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function _o(e,t){if(e===void 0){t.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{e.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}t.closeStdin()},s=Date.now();I0(e,t,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function I0(e,t,n,r){let s=e.pollMs??w0,i=e.maxHoldMs??T0,o=e.settleMs??v0,a=e.backgroundGraceMs??b0,l=!1,c=null,d=u=>r({startedMs:n,held:l,reason:u});for(;;){if(t.isAborted())return d("aborted");if(t.hasChildExited())return d("child-exited");let u=i-(Date.now()-n);if(u<=0)return d("max-hold");let f;try{f=await k0(e.hasOutstandingWork(),u,t.signal)}catch{return d("check-error")}if(f===Pc)return d(t.isAborted()||t.signal?.aborted===!0?"aborted":"max-hold");if(f)c=null;else{if(!l&&t.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let _=a-(Date.now()-n);await new Promise(h=>setTimeout(h,Math.max(0,Math.min(s,S0,_))).unref?.());continue}if(!l||o<=0)return d("cleared");c===null&&(c=Date.now(),Ke(`${t.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let p=Math.max(c,t.lastEventAtMs());if(!t.isTurnInFlight()&&Date.now()-p>=o)return d("cleared")}if(l||(l=!0,e.onHold?.(),Ke(`${t.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return $({event:"transport_hold_open_max_wait",provider:t.label,elapsed_ms:Date.now()-n}),d("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}var w0,T0,v0,b0,S0,Pc,Fc=w(()=>{"use strict";ce();w0=2e3,T0=8*60*60*1e3,v0=5e3,b0=1e3,S0=50,Pc=Symbol("check-timed-out")});function Eh(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let n=0;n<e.length;n++)n===0?t.push(e[n]):t.push(`
|
|
1628
1628
|
|
|
1629
1629
|
--- additional response (turn ${n+1} of ${e.length}; likely an injected mid-call notification) ---
|
|
1630
1630
|
|
|
@@ -1632,19 +1632,19 @@ var rA=Object.defineProperty;var w=(e,t)=>()=>(e&&(t=e(e=0)),t);var fe=(e,t)=>{f
|
|
|
1632
1632
|
One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return t?`Original provider error:
|
|
1633
1633
|
${t}
|
|
1634
1634
|
|
|
1635
|
-
${n}`:n}function Th(e,t){return new Promise((n,r)=>{let s=t.tool||"claude",i=t.binaryPath||A0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=Rn(s,a)??L0[s]??["--dangerously-skip-permissions"];o.push(...l);try{wt(s,o,a)}catch(S){return r(S)}if(t.cwd&&!x0(t.cwd))return
|
|
1636
|
-
`);u=k.pop()||"";for(let F of k)E(F)});let y="";c.stderr?.on("data",S=>{y+=S.toString()}),c.on("error",S=>{
|
|
1637
|
-
`),Ke(`stream-json: prompt sent (${e.length} chars)`)})}var A0,L0,vh=w(()=>{"use strict";$r();js();Cr();
|
|
1635
|
+
${n}`:n}function Th(e,t){return new Promise((n,r)=>{let s=t.tool||"claude",i=t.binaryPath||A0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=Rn(s,a)??L0[s]??["--dangerously-skip-permissions"];o.push(...l);try{wt(s,o,a)}catch(S){return r(S)}if(t.cwd&&!x0(t.cwd))return $({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),r(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=N0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.sessionId)});c.stdin?.on("error",S=>{Ke(`stream-json: stdin pipe error, ignored (exit handler reports): ${S.message}`)});let d=!1;if(t.signal){if(t.signal.aborted)return d=!0,$({event:"transport_abort",provider:s,phase:"pre_spawn"}),tt(c).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,$({event:"transport_abort",provider:s}),tt(c).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let u="",f=!1,m=!1,p=0,_=!1,h=Uc({onEvent:S=>{p=Date.now(),_=S.type!=="result",t.onEvent?.(S)},onText:t.onText});function g(){m||(m=!0,_o(t.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>_,lastEventAtMs:()=>p,closeStdin:()=>{c.stdin?.end()},signal:t.signal,label:t.tool||"claude"}))}function E(S){let k=h.sawResult();h.processLine(S),!k&&h.sawResult()&&g()}c.stdout?.on("data",S=>{u+=S.toString();let k=u.split(`
|
|
1636
|
+
`);u=k.pop()||"";for(let F of k)E(F)});let y="";c.stderr?.on("data",S=>{y+=S.toString()}),c.on("error",S=>{$({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:S.message}),r(new Ie(`Failed to spawn ${i}: ${S.message}`,{cause:S}))}),c.on("exit",S=>{if(f=!0,d)return;u.trim()&&E(u);let k=h.finalize();k?(Ke(`stream-json: result ${k.result.slice(0,80)}${k.result.length>80?"...":""} (${k.durationMs}ms)`),n({...k,exitCode:S})):($({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:S,stderr_tail:y.slice(0,500)}),r(new Error(R0({tool:s,exitCode:S,stderr:y}))))});let b=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(b+`
|
|
1637
|
+
`),Ke(`stream-json: prompt sent (${e.length} chars)`)})}var A0,L0,vh=w(()=>{"use strict";$r();js();Cr();ce();Fc();Et();Wc();Wc();A0={claude:"claude",qwen:"qwen"};L0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function ho(e={}){return[]}var qc=w(()=>{"use strict"});function Bc(e){return e==="plan"?"read-only":"danger-full-access"}function bh(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function Hc(){return{agentItems:new Map,resultText:""}}function go(e,t,n,r){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(r&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function Xc(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function Sh(e){let t=e.params,n=t?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Jc(){return{pendingCodexError:null}}function Gc(e,t){let n=Sh(e);return n.willRetry||(t.pendingCodexError=n.turnError),n}function Kc(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=e.params?.turn;if((typeof r?.status=="string"?r.status:void 0)==="failed"){let i=r?.error,o=typeof i?.message=="string"?i.message:void 0,a=o&&o.length>0?o:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}var Vc=w(()=>{"use strict"});import{spawn as O0}from"node:child_process";import{createInterface as $0}from"node:readline";import{existsSync as C0,readFileSync as M0}from"node:fs";import{fileURLToPath as D0}from"node:url";function P0(){return bh(j0)}function Ln(e,t){Ke(`[codex:${e}] ${JSON.stringify(t)}`)}function F0(e){let t=e.stderr.trim().slice(0,500),n=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
|
|
1638
1638
|
One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return t?`Original provider error:
|
|
1639
1639
|
${t}
|
|
1640
1640
|
|
|
1641
|
-
${n}`:n}function kh(e,t){return new Promise((n,r)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?ho():[];i.push(...a),le()&&je(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=Bc(l);try{wt("codex",i,l)}catch(D){return r(D)}if(t.cwd&&!C0(t.cwd))return
|
|
1641
|
+
${n}`:n}function kh(e,t){return new Promise((n,r)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?ho():[];i.push(...a),le()&&je(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=Bc(l);try{wt("codex",i,l)}catch(D){return r(D)}if(t.cwd&&!C0(t.cwd))return $({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),r(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=O0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,$({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),tt(d).catch(()=>{}),r(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,$({event:"transport_abort",provider:"codex"}),tt(d).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=$0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",h="",g=!1,E=!1,y=Date.now(),b=Hc(),S=Jc();function k(D,U={}){return new Promise((x,H)=>{let J=p++;m.set(J,{resolve:x,reject:H});let N=JSON.stringify({jsonrpc:"2.0",id:J,method:D,params:U});d.stdin?.write(N+`
|
|
1642
1642
|
`)})}function F(D,U={}){let x=JSON.stringify({jsonrpc:"2.0",method:D,params:U});d.stdin?.write(x+`
|
|
1643
|
-
`)}f.on("line",D=>{let U;try{U=JSON.parse(D)}catch{return}if(typeof U.id=="number"&&m.has(U.id)){let J=m.get(U.id);if(m.delete(U.id),U.error){let N=U.error,A=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(U.error);J.reject(po(`codex app-server error: ${A}`,N))}else J.resolve(U);t.onEvent?.(U);return}let x=U.method;if(!x){t.onEvent?.(U);return}if(x==="thread/started"){let N=U.params?.thread;N?.id&&(_=N.id)}let H=le()?J=>{Ln("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let J=U.params,N=J?.turn;N?.id&&(h=N.id),go(U,b,t.onDelta,H),le()&&Ln("turn/started",{params:J??null})}if(le()&&(x==="item/started"||x==="item/completed")){let J=U.params;J?.item?.type==="agentMessage"&&Ln(x,{params:J??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let J=U.params;le()&&Ln("agentMessage/delta",{params:J??null})}go(U,b,t.onDelta,H)}if(x==="turn/completed"){let J=U.params;if(le())for(let[A,O]of b.agentItems.entries())O.buffer&&Ln("turn/completed/unflushed-item",{itemId:A,phase:O.phase,bufferLen:O.buffer.length});Xc(b),le()&&Ln("turn/completed",{params:J??null});let N=Kc(U,S);N.shouldReject?(le()&&Ln("turn/completed/terminal-reject",{message:N.turnError.message}),E=!0,g=!0,d.stdin?.end(),r(N.turnError)):(g=!0,d.stdin?.end())}if(x==="error"){let J=Gc(U,S);if(le()){let N=U.params,A=N?.error,O=typeof A?.message=="string"?A.message:"(no message)";Ln(J.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:J.willRetry,params:N??null})}}t.onEvent?.(U)});let P="";d.stderr?.on("data",D=>{P+=D.toString()}),d.on("error",D=>{
|
|
1644
|
-
`)
|
|
1643
|
+
`)}f.on("line",D=>{let U;try{U=JSON.parse(D)}catch{return}if(typeof U.id=="number"&&m.has(U.id)){let J=m.get(U.id);if(m.delete(U.id),U.error){let N=U.error,A=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(U.error);J.reject(po(`codex app-server error: ${A}`,N))}else J.resolve(U);t.onEvent?.(U);return}let x=U.method;if(!x){t.onEvent?.(U);return}if(x==="thread/started"){let N=U.params?.thread;N?.id&&(_=N.id)}let H=le()?J=>{Ln("item.text/buffer-mismatch",{itemId:J.itemId,threadId:J.threadId??null,turnId:J.turnId??null,expectedFromItemText:J.expectedFromItemText,gotFromBuffer:J.gotFromBuffer,expectedLen:J.expectedFromItemText.length,gotLen:J.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let J=U.params,N=J?.turn;N?.id&&(h=N.id),go(U,b,t.onDelta,H),le()&&Ln("turn/started",{params:J??null})}if(le()&&(x==="item/started"||x==="item/completed")){let J=U.params;J?.item?.type==="agentMessage"&&Ln(x,{params:J??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let J=U.params;le()&&Ln("agentMessage/delta",{params:J??null})}go(U,b,t.onDelta,H)}if(x==="turn/completed"){let J=U.params;if(le())for(let[A,O]of b.agentItems.entries())O.buffer&&Ln("turn/completed/unflushed-item",{itemId:A,phase:O.phase,bufferLen:O.buffer.length});Xc(b),le()&&Ln("turn/completed",{params:J??null});let N=Kc(U,S);N.shouldReject?(le()&&Ln("turn/completed/terminal-reject",{message:N.turnError.message}),E=!0,g=!0,d.stdin?.end(),r(N.turnError)):(g=!0,d.stdin?.end())}if(x==="error"){let J=Gc(U,S);if(le()){let N=U.params,A=N?.error,O=typeof A?.message=="string"?A.message:"(no message)";Ln(J.willRetry?"error/retry":"error/terminal-deferred",{message:O,willRetry:J.willRetry,params:N??null})}}t.onEvent?.(U)});let P="";d.stderr?.on("data",D=>{P+=D.toString()}),d.on("error",D=>{$({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),r(new Ie(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),d.on("exit",D=>{if(!u&&!E){if(g){n({result:b.resultText,threadId:_,turnId:h,durationMs:Date.now()-y,exitCode:D});return}if(S.pendingCodexError){r(S.pendingCodexError);return}$({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:P.slice(0,500)}),r(new Error(F0({exitCode:D,stderr:P})))}}),(async()=>{try{if(await k("initialize",P0()),F("initialized",{}),t.threadId)try{let D=k("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),U=new Promise((x,H)=>setTimeout(()=>H(new Error("resume timeout")),5e3));await Promise.race([D,U]),_=t.threadId}catch(D){process.stderr.write(`[codex] thread/resume failed, creating new thread
|
|
1644
|
+
`),$({event:"codex_thread_resume_fallback",provider:"codex",thread_id:t.threadId,error_message:D instanceof Error?D.message:String(D)});let x=(await k("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;x?.id&&(_=x.id)}else{let U=(await k("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;U?.id&&(_=U.id)}await k("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(D){tt(d).catch(()=>{}),r(D instanceof Error?D:new Error(String(D)))}})()})}var j0,Ih=w(()=>{"use strict";ce();ce();$r();js();Cr();qc();ce();Et();Vc();Vc();j0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(M0(D0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as Ah,mkdirSync as U0,readFileSync as Rh,writeFileSync as Nh}from"node:fs";import{join as Ps,resolve as W0}from"node:path";function Lh(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Yc(e,t,n={existsSync:Ah,readFileSync:Rh}){let r=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=W0(t,s.sessiondir??t);for(let o of q0(i)){let a=B0(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Lh(a.permission)||r.push(`[${s.alias}] ${o} sets a non-allow \`permission\`, which opencode merges over lmctl's YOLO (.opencode/opencode.json permission:"allow") \u2014 the member may hang on permission prompts. Set \`permission: "allow"\` in that file (or remove the key).`))}}return r}function q0(e){return[Ps(e,".opencode","opencode.jsonc"),Ps(e,"opencode.jsonc"),Ps(e,"opencode.json")]}function B0(e,t){try{if(!t.existsSync(e))return;let n=t.readFileSync(e,"utf-8"),r=JSON.parse(H0(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function H0(e){let t="",n=!1,r="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(n){t+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
|
|
1645
1645
|
`;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function yo(e,t={}){let n=Ps(e,".opencode"),r=Ps(n,"opencode.json");if(!Ah(r)){U0(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return Nh(r,o+`
|
|
1646
|
-
`,"utf-8"),!0}let s;try{s=JSON.parse(Rh(r,"utf-8"))}catch{return console.log(xh.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(xh.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),Lh(s.permission)
|
|
1647
|
-
`,"utf-8"),i}var xh,Eo=w(()=>{"use strict";
|
|
1646
|
+
`,"utf-8"),!0}let s;try{s=JSON.parse(Rh(r,"utf-8"))}catch{return console.log(xh.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(xh.yellow(` .opencode/opencode.json at ${r} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),Lh(s.permission)||$({event:"opencode_yolo_override",provider:"opencode",config_path:r,user_permission:s.permission,message:`opencode.json has a user-set 'permission' value other than 'allow' \u2014 lmctl's YOLO contract is NOT in effect; turns may hang waiting on permission prompts. Set permission: "allow" or remove the key to restore YOLO.`}),i&&Nh(r,JSON.stringify(s,null,2)+`
|
|
1647
|
+
`,"utf-8"),i}var xh,Eo=w(()=>{"use strict";ce();xh={yellow:e=>e}});function Ch(e){let t=[...e.matchAll(X0)];if(t.length>0){let n=t[t.length-1],r=(n.index??0)+n[0].length;return Oh(e.slice(r).trimStart())}return Oh(Y0(e.replace(J0,"")))}function Y0(e){let t=G0.exec(e);if(t===null)return e;let n=e.slice(t[0].length),r=[...n.matchAll(K0)];if(r.length<2)return e;let s=r[0],i=(s.index??0)+s[0].length;return n.slice(i).trimStart()}function Oh(e){let t=[...e.matchAll(V0)];if(t.length===0)return e;let n=t[t.length-1],r=(n.index??0)+n[0].length;return e.slice(r).trimStart()}function Mr(e,t=""){let n=e.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:t}function Mh(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function zc(e={}){let t="",n="",r="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?Ch(n):n,sessionId:t,stopReason:r});return{setSessionId(a){t=a},beginTurn(){n="",r="",s=!1,i=!0},completeTurn(a){return r=Mh(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(n+=u,e.onDelta?.(u)),!0},finalize(){return s?o():null}}}var $h,X0,J0,G0,K0,V0,Zc=w(()=>{"use strict";$h="(?:png|jpe?g|webp|heic|pdf)",X0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${$h}\\s*`,"gi"),J0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${$h}\\s*`,"i"),G0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,K0=/^STANCE:\s+\S+\s*$/gim,V0=/\[Thought:\s*true\]\s*/gi});import{spawn as Dh}from"node:child_process";import{existsSync as z0}from"node:fs";import{createInterface as Z0}from"node:readline";function Q0(e){let t=e.stderr.trim().slice(0,500),n=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
|
|
1648
1648
|
One possible cause: the provider process failed before a complete ACP response was delivered.`;return t?`Original provider error:
|
|
1649
1649
|
${t}
|
|
1650
1650
|
|
|
@@ -1652,31 +1652,31 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1652
1652
|
`);if(/\bcode:\s*-32601\b/.test(l)&&/Method not found[^]*notifications\/initialized/.test(l)){s=a;continue}}r.push(i)}return r.join(`
|
|
1653
1653
|
`)}function jh(e,t){let n=Z0({input:e.stdout}),r=new Map,s=(o,a={})=>new Promise((l,c)=>{let d=tL++;r.set(d,{resolve:l,reject:c});let u=JSON.stringify({jsonrpc:"2.0",id:d,method:o,params:a});Ue({event:"acp_send",direction:"SEND",provider:t.provider,method:o,id:d,params:a}),e.stdin?.write(`${u}
|
|
1654
1654
|
`)}),i=(o,a={})=>{e.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
|
|
1655
|
-
`)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Ue({event:"acp_recv",direction:"RECV",provider:t.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),t.onEvent?.(a),typeof a.id=="number"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let d=a.error,u=typeof d?.message=="string"&&d.message.length>0?d.message:JSON.stringify(a.error);c.reject(po(`ACP RPC error: ${u}`,d))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){
|
|
1656
|
-
`);return}t.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Ie("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function ed(e){let t;try{t=Dh(e.binaryPath??Qc.opencode.binary,Qc.opencode.args,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ye(e.env,e.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=jh(t,{provider:"opencode"}),r=e.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),t.removeListener("error",a),t.removeListener("exit",l),n.close(),!u){s(d);return}tt(t,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};t.once("error",a),t.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let d=await n.sendRpc("session/new",{cwd:e.cwd,mcpServers:[]}),u=Mr(d);try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:e.model})}catch(f){o({status:"rejected",option:"model",value:e.model,error:f instanceof Error?f.message:String(f)});return}if(e.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:e.effort})}catch(f){o({status:"rejected",option:"effort",value:e.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function nL(e){if(e.method!=="session/update")return!1;let n=e.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}function Ph(e,t){let n=Qc[t.tool];return n?new Promise((r,s)=>{let i=t.binaryPath||n.binary;if(t.tool==="opencode")try{yo(t.cwd)}catch(k){
|
|
1657
|
-
`)
|
|
1658
|
-
`)
|
|
1659
|
-
`)
|
|
1660
|
-
`)
|
|
1661
|
-
`)
|
|
1655
|
+
`)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Ue({event:"acp_recv",direction:"RECV",provider:t.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),t.onEvent?.(a),typeof a.id=="number"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let d=a.error,u=typeof d?.message=="string"&&d.message.length>0?d.message:JSON.stringify(a.error);c.reject(po(`ACP RPC error: ${u}`,d))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){$({event:"acp_unhandled_request",provider:t.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Ue({event:"acp_send",direction:"SEND",provider:t.provider,replyTo:a.id,error:"method not found"}),e.stdin?.write(`${c}
|
|
1656
|
+
`);return}t.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new Ie("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function ed(e){let t;try{t=Dh(e.binaryPath??Qc.opencode.binary,Qc.opencode.args,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ye(e.env,e.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=jh(t,{provider:"opencode"}),r=e.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),t.removeListener("error",a),t.removeListener("exit",l),n.close(),!u){s(d);return}tt(t,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};t.once("error",a),t.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},r);(async()=>{try{await n.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),n.sendNotification("notifications/initialized");let d=await n.sendRpc("session/new",{cwd:e.cwd,mcpServers:[]}),u=Mr(d);try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:e.model})}catch(f){o({status:"rejected",option:"model",value:e.model,error:f instanceof Error?f.message:String(f)});return}if(e.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:e.effort})}catch(f){o({status:"rejected",option:"effort",value:e.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function nL(e){if(e.method!=="session/update")return!1;let n=e.params?.update;if(n===void 0)return!1;let r=n.sessionUpdate;if(r!=="tool_call"&&r!=="tool_call_update")return!1;let s=n.status;return s!==void 0&&s!=="pending"&&s!=="in_progress"?!1:n.rawInput?.background===!0}function Ph(e,t){let n=Qc[t.tool];return n?new Promise((r,s)=>{let i=t.binaryPath||n.binary;if(t.tool==="opencode")try{yo(t.cwd)}catch(k){$({event:"opencode_config_install_failed",cwd:t.cwd,error_message:k instanceof Error?k.message:String(k)})}let o=t.permissionMode??"yolo",a=[...n.args];if(o==="plan")if(t.tool==="gemini"){let k=Rn("gemini","plan"),F=Rn("gemini","yolo");a=a.filter(P=>!(F??[]).includes(P)),k&&a.push(...k)}else t.tool==="copilot"&&(process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
|
|
1657
|
+
`),$({event:"acp_plan_mode_unsupported",provider:t.tool,requested_mode:"plan",effective_mode:"yolo"}));t.model&&t.tool==="gemini"&&a.push("--model",t.model);let l=t.tool==="copilot"?"yolo":o;try{wt(t.tool,a,l)}catch(k){return s(k)}if(t.model&&t.tool==="copilot"&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
|
|
1658
|
+
`),$({event:"acp_model_unsupported",provider:t.tool,model:t.model})),t.cwd&&!z0(t.cwd))return $({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new Ie(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Dh(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ye(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1,f=!1,m=0,p=!1,_=!1;if(t.signal){if(t.signal.aborted)return u=!0,$({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),tt(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,$({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),tt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let h=t.sessionId||"",g=zc({tool:t.tool,onDelta:t.onDelta});g.setSessionId(h);let E=jh(c,{provider:t.tool,onEvent:k=>{m=Date.now(),nL(k)&&(_=!0),t.onEvent?.(k)},onNotification:k=>{m=Date.now(),g.processMessage(k)}}),{sendRpc:y,sendNotification:b}=E,S="";c.stderr?.on("data",k=>{S+=k.toString()}),c.on("error",k=>{E.close(k),$({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:k.message,elapsed_ms:Date.now()-d}),s(new Ie(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${k.message}`,{cause:k}))}),c.on("exit",k=>{if(f=!0,E.close(new Ie(`ACP process exited with code ${String(k)}`)),u)return;let F=g.finalize();if(F!==null)r({result:F.result,sessionId:F.sessionId,durationMs:Date.now()-d,stopReason:F.stopReason,exitCode:k});else{let P=eL(t.tool,S);$({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:k,stderr_tail:P.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(Q0({tool:t.tool,exitCode:k,stderr:P})))}}),(async()=>{try{if(await y("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),b("notifications/initialized"),t.sessionId)try{let P=await y("session/load",{sessionId:t.sessionId,cwd:t.cwd,mcpServers:[]});h=Mr(P,t.sessionId),g.setSessionId(h)}catch(P){if(t.requireResume)throw new Error(`Cannot resume session ${t.sessionId} via ACP: ${P instanceof Error?P.message:String(P)}`);process.stderr.write(`[acp] session/load failed for ${t.sessionId}, creating new session
|
|
1659
|
+
`),$({event:"acp_session_resume_fallback",provider:t.tool,session_id:t.sessionId,error_message:P instanceof Error?P.message:String(P)});let D=await y("session/new",{cwd:t.cwd,mcpServers:[]});h=Mr(D),g.setSessionId(h)}else{let P=await y("session/new",{cwd:t.cwd,mcpServers:[]});h=Mr(P),g.setSessionId(h)}if(t.tool==="kimi"){let P=o==="plan"?"plan":"auto";try{await y("session/set_config_option",{sessionId:h,configId:"mode",value:P}),Ke(`acp: set_config_option(mode=${P}) ok`)}catch(D){let U=D instanceof Error?D.message:String(D);throw $({event:"acp_permission_mode_failed",provider:t.tool,config_id:"mode",value:P,error_message:U}),new Error(`Cannot set Kimi ACP permission mode to ${P}: ${U}`)}}if(t.model&&(t.tool==="opencode"||t.tool==="kimi"))try{await y("session/set_config_option",{sessionId:h,configId:"model",value:t.model}),Ke(`acp: set_config_option(model=${t.model}) ok`)}catch(P){let D=P instanceof Error?P.message:String(P);process.stderr.write(`[acp] set_config_option(model=${t.model}) failed: ${D}
|
|
1660
|
+
`),$({event:"acp_config_option_failed",provider:t.tool,config_id:"model",value:t.model,error_message:D})}if(t.effort&&t.tool==="opencode"){let P="effort";try{await y("session/set_config_option",{sessionId:h,configId:P,value:t.effort}),Ke(`acp: set_config_option(${P}=${t.effort}) ok`)}catch(D){let U=D instanceof Error?D.message:String(D);process.stderr.write(`[acp] set_config_option(effort=${t.effort}) failed: ${U}
|
|
1661
|
+
`),$({event:"acp_config_option_failed",provider:t.tool,config_id:P,value:t.effort,error_message:U})}}g.beginTurn(),p=!0,Ke(`acp: prompt sent (${e.length} chars)`);let k=await y("session/prompt",{sessionId:h,prompt:[{type:"text",text:e}]}),F=g.completeTurn(k);p=!1,Ke(`acp: result received (${F.result.length} chars, stopReason=${F.stopReason})`),_o(t.holdOpen,{isAborted:()=>u,hasChildExited:()=>f,isTurnInFlight:()=>p,lastEventAtMs:()=>m,closeStdin:()=>{c.stdin?.end()},signal:t.signal,label:t.tool,wasBackgroundJobLaunched:()=>_})}catch(k){tt(c).catch(()=>{}),s(k instanceof Error?k:new Error(String(k)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var Qc,tL,td=w(()=>{"use strict";ce();$r();js();Fc();Cr();Eo();ce();Et();Zc();Zc();Qc={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},tL=1});function be(e,t=120){let n=e.replace(/\s+/g," ").trim();return n.length>t?n.slice(0,t-1)+"\u2026":n}function Fh(e,t){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(e.size>=rL){let r=e.keys().next().value;r!==void 0&&e.delete(r)}e.set(n.id,Date.now()),t(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=e.get(n.id);if(r!==void 0){t({...n,elapsedMs:Date.now()-r}),e.delete(n.id);return}}t(n)}}function sL(){let e=new Map;return(t,n)=>{iL(t,Fh(e,n))}}function iL(e,t){let n=e.type;if(n==="system"){let r=e.subtype;if(r==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(be(a,60));let d=c.length>0?c.join(", "):r;t({kind:"api_retry",summary:d});return}if(r==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(be(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:r||"system",raw:e});return}if(n==="assistant"||n==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:be(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=be(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:be(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:be(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
|
|
1662
1662
|
`).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(d=`${f.split(`
|
|
1663
1663
|
`).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(n==="result"){t({kind:"system",summary:"result",raw:e});return}}async function wo(e,t){let n=t.binary==="qwen"?"qwen":"claude",r=t.onProgress?sL():void 0,s=await Th(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:n,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onEvent:r?i=>r(i,t.onProgress):void 0,signal:t.signal,holdOpen:t.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function oL(){let e=new Map;return(t,n)=>{aL(t,Fh(e,n))}}function aL(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:be(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";t({kind:"thinking",summary:be(a)});return}if(i==="tool_call"){let o=s.title||s.kind||"tool",a=typeof s.toolCallId=="string"?s.toolCallId:void 0,l="",c=s.rawInput;c&&(typeof c.command=="string"?l=c.command:typeof c.file_path=="string"?l=c.file_path:typeof c.path=="string"?l=c.path:l=be(JSON.stringify(c))),t({kind:"tool_use",tool:o,summary:be(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")t({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${be(c,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:i})}}async function On(e,t){let n=t.acpTool||t.binary;t.model&&n==="copilot"&&Ue({event:"model_ignored",provider:n,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let r=t.onProgress?oL():void 0,s=await Ph(e,{tool:n,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:r?i=>r(i,t.onProgress):void 0,signal:t.signal,holdOpen:t.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function lL(e,t){let n=e.method;if(!n)return;let r=e.params;if(n==="turn/started"){t({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(n==="error"){let s=r?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=r?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${be(o,120)}`}:{kind:"other",summary:`codex error: ${be(o,120)}`});return}if(n==="item/started"||n==="item/completed"){let s=r?.item;if(!s)return;let i=s.type,o=n==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)t({kind:"tool_use",tool:"Bash",summary:be(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:be(c||"(edit)"),id:a})}else{let l=s.status||"done";t({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:be(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(n==="item/agentMessage/delta"){let s=r?.delta||"";if(s){let i=typeof r?._lmctlItemPhase=="string"?r._lmctlItemPhase:void 0;t(i==="commentary"?{kind:"thinking",summary:be(s)}:{kind:"text",summary:be(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&t({kind:"thinking",summary:be(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
|
|
1664
1664
|
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${be(o,60)}`:be(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(n==="item/commandExecution/terminalInteraction"||n==="item/commandExecution/outputChunk"||n==="item/commandExecution/output"){let s=(typeof r?.stdin=="string"?r.stdin:"")||(typeof r?.delta=="string"?r.delta:"")||(typeof r?.output=="string"?r.output:"")||(typeof r?.text=="string"?r.text:"")||(typeof r?.content=="string"?r.content:"")||(typeof r?.chunk=="string"?r.chunk:"")||"";if(s){let i=s.split(`
|
|
1665
|
-
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${be(o,60)}`:be(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){t({kind:"other",summary:n.slice(5)});return}}async function Uh(e,t){let n=await kh(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?r=>lL(r,t.onProgress):void 0,signal:t.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var rL,$n=w(()=>{"use strict";vh();Ih();td();
|
|
1665
|
+
`).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${be(o,60)}`:be(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){t({kind:"other",summary:n.slice(5)});return}}async function Uh(e,t){let n=await kh(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?r=>lL(r,t.onProgress):void 0,signal:t.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var rL,$n=w(()=>{"use strict";vh();Ih();td();ce();rL=256});function rd(e){return new nd(e)}var nd,sd=w(()=>{"use strict";lh();Pt();$n();yt();nd=class extends Ae{constructor(t){super({provider:new lo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:wo})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}}});import{readdir as cL,stat as Wh,unlink as dL}from"node:fs/promises";import{join as Fs,basename as uL}from"node:path";function fL(e,t,n){return`${e}|${t.toISOString()}|${n}`}function Us(e,t,n){let r=fL(n.role,n.timestamp,n.content);t.has(r)||(t.add(r),e.push(n))}function qh(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function mL(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function Dr(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(n=>{if(typeof n=="string")return n;if(n&&typeof n=="object"){let r=n;if(typeof r.text=="string")return r.text;if(typeof r.image_url=="string")return"[input_image]";if(typeof r.type=="string")return`[${r.type}]`}return Dr(n)}).filter(n=>n.length>0).join(`
|
|
1666
1666
|
`);try{return JSON.stringify(e)}catch{return String(e)}}function pL(e){let t=e;if(typeof e=="string")try{t=JSON.parse(e)}catch{return}return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}function _L(e,t){if(t===void 0)return;let n={input:t};if(e!=="apply_patch"||typeof t!="string")return n;let r=[...t.matchAll(/^\*\*\* (?:(Add|Update|Delete) File|(Move) to): (.+)\r?$/gm)].map(s=>({kind:s[1]??s[2],path:s[3]?.trim()})).filter(s=>!!(s.kind&&s.path));return r.length>0&&(n.path=r[0].path,n.paths=r.map(s=>s.path),n.kinds=r.map(s=>s.kind)),n}async function Bh(e){let t=0,n=0,r=0,s=0,i=0,o,a;for await(let l of Je(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;n=c.input_tokens??n,r=c.cached_input_tokens??c.cache_read_input_tokens??r,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=mL(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var To,Hh=w(()=>{"use strict";on();To=class{name="codex";codexDirs;constructor(t={}){let n=[Fs(ke,".codex"),Fs(ke,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let r=[t.codexDir||n[0],t.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:Fs(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let n of this.codexDirs){let r=Fs(n,"sessions");try{await Wh(r),t.push(r)}catch{}}return t}async discoverSessions(){let t=[],n=await this.getSessionsDirs();for(let r of n){let s=await this.findSessionFiles(r);for(let i of s)try{let o=await this.extractSummary(i);o&&t.push(o)}catch{}}return t}async findSessionFiles(t){let n=[],r;try{r=await cL(t)}catch{return n}for(let s of r){let i=Fs(t,s),o=await Wh(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);n.push(...a)}else s.endsWith(".jsonl")&&n.push(i)}return n}extractSessionIdFromFilename(t){let n=uL(t,".jsonl"),r=n.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async extractSummary(t){let n=await Ve(t,30),r=await Ce(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of n){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=G(_.trim(),80)),d=G(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(h=>h.type==="input_text"&&typeof h.text=="string"&&h.text);typeof _?.text=="string"&&(c||(c=G(_.text.trim(),80)),d=G(_.text.trim(),80))}}if(!i)return null;let m=await Bh(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:qh(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r=await Ce(n),s=[],i="",o,a,l,c,d,u=t,f,m,p=new Set;for await(let h of Je(n)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=qh(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let E=h.payload;if(E.type==="message"){if(E.role==="user"&&E.content){for(let y of E.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let b=y.text.trim();c||(c=G(b,80)),d=G(b,80),Us(s,p,{role:"user",timestamp:g,content:pe(b)})}continue}if(E.role==="assistant"&&E.content){for(let y of E.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&Us(s,p,{role:"assistant",timestamp:g,content:pe(y.text),model:a});continue}if(E.role!=="user"&&E.role!=="assistant"&&E.content){for(let y of E.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&Us(s,p,{role:"system",timestamp:g,content:pe(y.text.trim())});continue}}if(E.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:E.name||"unknown tool",toolName:E.name,toolInput:E.arguments!==void 0?pe(Dr(E.arguments)):void 0,toolInputData:pL(E.arguments),toolCallId:E.call_id});continue}if(E.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Dr(E.output)),toolCallId:E.call_id});continue}if(E.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:g,content:E.name||"unknown tool",toolName:E.name,toolInput:E.input!==void 0?pe(Dr(E.input)):void 0,toolInputData:_L(E.name,E.input),toolCallId:E.call_id});continue}if(E.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:g,content:pe(Dr(E.output)),toolCallId:E.call_id});continue}if(E.type==="reasoning"&&E.summary){let y=E.summary.map(b=>Dr(b.text)).join(`
|
|
1667
1667
|
`);y.trim()&&Us(s,p,{role:"thinking",timestamp:g,content:pe(y)});continue}}if(h.type==="event_msg"&&h.payload&&(h.payload.type==="task_started"?m="in_progress":h.payload.type==="task_complete"?m="complete":h.payload.type==="turn_aborted"&&(m="aborted"),h.payload.type==="agent_reasoning")){let E=h.payload.message||h.payload.text;E&&Us(s,p,{role:"thinking",timestamp:g,content:pe(E)})}}if(!i)return null;let _=await Bh(n);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:d,messageCount:_.messageCount,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:_.lastTokenUsage,modelContextWindow:_.modelContextWindow,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let n=await this.resolveSessionFile(t);return n?(await dL(n),!0):!1}async resolveSessionFile(t){let n=await this.getSessionsDirs(),r=[];for(let i of n){let o=await this.findSessionFiles(i);r.push(...o)}for(let i of r)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Ve(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function od(e){return new id(e)}var id,ad=w(()=>{"use strict";Hh();Pt();$n();yt();id=class extends Ae{constructor(t){super({provider:new To(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${ge}
|
|
1668
1668
|
`,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Uh})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n.slice(0,-1),"--model",t.model,n[n.length-1]]:n}}});function Ws(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);if(t.length>1)try{let r=JSON.parse(t[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(e)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function vo(e){let t=Ws(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=e.split(`
|
|
1669
1669
|
`).map(a=>a).filter(a=>a.trim().length>0);if(n.length===0)throw new Error("gemini session file is empty");let r=n[0],s;try{s=JSON.parse(r)}catch(a){throw new Error(`gemini JSONL session: metadata line failed to parse: ${a instanceof Error?a.message:String(a)}`)}if(s===null||typeof s!="object")throw new Error("gemini JSONL session: metadata line is not an object");let i=[],o=new Map;for(let a=1;a<n.length;a++){let l;try{l=JSON.parse(n[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?hL(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function hL(e,t){for(let[n,r]of Object.entries(t))if(r!==void 0){if(n==="tokens"&&Xh(e.tokens)&&Xh(r)){e.tokens={...e.tokens,...r};continue}e[n]=r}}function Xh(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Jh(e,t){if(t==="json")return JSON.stringify(e,null,2);let{messages:n,...r}=e,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
|
|
1670
1670
|
`)+`
|
|
1671
|
-
`}var ld=w(()=>{"use strict"});import{createHash as gL}from"node:crypto";import{readdir as qs,readFile as Gh,stat as bo,unlink as yL}from"node:fs/promises";import{join as st,basename as EL,dirname as wL}from"node:path";import{cwd as TL}from"node:process";function Kh(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Vh(e){return e==="user"}function cd(e){return e==="gemini"||e==="assistant"}function tr(e,t=new Date(0)){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function vL(e){return`${e.sessionId}\0${e.cwd}`}function bL(e,t){let n=e.filePaths??[e.filePath],r=t.filePaths??[t.filePath],s=[...new Set([...n,...r])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function So(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Yh(e){let t=0,n=0,r=0,s=0,i=0,o;for(let a of e){if(!cd(a.type)||!a.tokens)continue;let l=So(a.tokens.input),c=So(a.tokens.cached),d=Math.max(l-c,0),u=So(a.tokens.output),f=So(a.tokens.thoughts);t+=l,n+=c,r+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function SL(e){return gL("sha256").update(e).digest("hex")}function Bs(e,t){let n=t;for(;n&&!e.has(n);){e.add(n);let r=wL(n);if(r===n)break;n=r}}var ko,zh=w(()=>{"use strict";on();ld();
|
|
1672
|
-
`).trim();k&&i.push({role:"thinking",timestamp:tr(S.timestamp,g),content:pe(k)})}i.push({role:"assistant",timestamp:g,content:y,model:h.model});continue}let b=E?`[${E}] `:"";i.push({role:"system",timestamp:g,content:`${b}${y}`.trim()})}let m=tr(r.startTime,s.createdAt),p=tr(r.lastUpdated,s.modifiedAt),_=Yh(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let n=await this.readSessionFile(t);if(!n)return null;let r=await Ce(t),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(t),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Vh(m.type)){u++;let p=Kh(m.content).trim();p&&(l||(l=G(pe(p),80)),c=G(pe(p),80))}else cd(m.type)&&(u++,m.model&&(d=m.model));let f=Yh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:tr(n.startTime,r.createdAt),modifiedAt:tr(n.lastUpdated,r.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let n=await Gh(t,"utf-8");if(Ws(n)==="unknown")return
|
|
1671
|
+
`}var ld=w(()=>{"use strict"});import{createHash as gL}from"node:crypto";import{readdir as qs,readFile as Gh,stat as bo,unlink as yL}from"node:fs/promises";import{join as st,basename as EL,dirname as wL}from"node:path";import{cwd as TL}from"node:process";function Kh(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function Vh(e){return e==="user"}function cd(e){return e==="gemini"||e==="assistant"}function tr(e,t=new Date(0)){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function vL(e){return`${e.sessionId}\0${e.cwd}`}function bL(e,t){let n=e.filePaths??[e.filePath],r=t.filePaths??[t.filePath],s=[...new Set([...n,...r])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function So(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Yh(e){let t=0,n=0,r=0,s=0,i=0,o;for(let a of e){if(!cd(a.type)||!a.tokens)continue;let l=So(a.tokens.input),c=So(a.tokens.cached),d=Math.max(l-c,0),u=So(a.tokens.output),f=So(a.tokens.thoughts);t+=l,n+=c,r+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function SL(e){return gL("sha256").update(e).digest("hex")}function Bs(e,t){let n=t;for(;n&&!e.has(n);){e.add(n);let r=wL(n);if(r===n)break;n=r}}var ko,zh=w(()=>{"use strict";on();ld();ce();ko=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let n=t.geminiDir||st(ke,".gemini");this.geminiProjectsFile=st(n,"projects.json"),this.geminiTmpDir=st(n,"tmp");let r=t.claudeDir||st(ke,".claude");this.claudeProjectsDir=st(r,"projects");let s=[st(ke,".codex"),st(ke,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>st(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),n=new Map;for(let r of t)try{let s=await this.extractSummary(r);if(!s)continue;let i=vL(s),o=n.get(i);n.set(i,o?bL(o,s):s)}catch{}return[...n.values()]}async loadSession(t){let n=await this.resolveSessionFile(t);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Ce(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let h of o){let g=tr(h.timestamp),E=h.type,y=pe(Kh(h.content));if(Vh(E)){let S=y.trim();S&&(d||(d=G(S,80)),u=G(S,80)),i.push({role:"user",timestamp:g,content:S||y});continue}if(cd(E)){h.model&&(f=h.model);for(let S of h.thoughts||[]){let k=[S.subject,S.description].filter(Boolean).join(`
|
|
1672
|
+
`).trim();k&&i.push({role:"thinking",timestamp:tr(S.timestamp,g),content:pe(k)})}i.push({role:"assistant",timestamp:g,content:y,model:h.model});continue}let b=E?`[${E}] `:"";i.push({role:"system",timestamp:g,content:`${b}${y}`.trim()})}let m=tr(r.startTime,s.createdAt),p=tr(r.lastUpdated,s.modifiedAt),_=Yh(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:n,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let n=await this.readSessionFile(t);if(!n)return null;let r=await Ce(t),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(t),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if(Vh(m.type)){u++;let p=Kh(m.content).trim();p&&(l||(l=G(pe(p),80)),c=G(pe(p),80))}else cd(m.type)&&(u++,m.model&&(d=m.model));let f=Yh(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:tr(n.startTime,r.createdAt),modifiedAt:tr(n.lastUpdated,r.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let n=await Gh(t,"utf-8");if(Ws(n)==="unknown")return $({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:n.slice(0,120),message:`gemini session file at ${t} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return vo(n)}catch{return null}}extractSessionIdFromFilename(t){let n=EL(t).replace(/\.jsonl?$/,""),r=n.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return r?r[1]:n}async findSessionFiles(){let t=[],n;try{n=await qs(this.geminiTmpDir)}catch{return t}for(let r of n){let s=st(this.geminiTmpDir,r,"chats");if(!(await bo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await qs(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(st(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let n=await this.resolveSessionFile(t);return n?(await yL(n),!0):!1}async resolveSessionFile(t){let n=await this.findSessionFiles(),r=[];for(let s of n){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ce(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:tr(i?.lastUpdated,d.modifiedAt)})}return r.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),r[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;Bs(t,TL());for(let r of this.extraWorkspacePaths)Bs(t,r);for(let r of await this.collectGeminiProjectPaths())Bs(t,r);for(let r of await this.collectCodexCwds())Bs(t,r);for(let r of await this.collectClaudeCwds())Bs(t,r);let n=new Map;for(let r of t)n.set(SL(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let t;try{t=await Gh(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(t).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Ve(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,n;try{n=await qs(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=st(this.claudeProjectsDir,r);if(!(await bo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await qs(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=st(s,a),d=(await Ve(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let n=[];if(!(await bo(t).catch(()=>null))?.isDirectory())return n;let s;try{s=await qs(t)}catch{return n}for(let i of s){let o=st(t,i),a=await bo(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);n.push(...l)}else i.endsWith(".jsonl")&&n.push(o)}return n}}});import{readFileSync as kL,writeFileSync as IL,mkdirSync as NL}from"node:fs";import{join as xL,dirname as AL}from"node:path";import{randomUUID as RL}from"node:crypto";function ud(e){return new dd(e)}var dd,fd=w(()=>{"use strict";zh();Pt();$n();yt();ld();dd=class extends Ae{constructor(t){super({provider:new ko(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(n,r)=>On(n,{...r,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
|
|
1673
1673
|
`)}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:fo,lsCommand:`lmctl ls --provider gemini --sessiondir ${t}`}}async fork(t,n){let r=await this.resolvePath(t);if(!r)return{success:!1,error:`Session file not found for ${t}`};try{let s=kL(r,"utf-8"),i=Ws(s),o=vo(s),a=RL();o.sessionId=a,o.kind="main";let l=AL(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=xL(l,u);return NL(l,{recursive:!0}),IL(f,Jh(o,i),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Zh,readFile as LL,rm as OL,stat as jr}from"node:fs/promises";import{basename as $L,join as Tt}from"node:path";function CL(e){if(!e)return null;let t={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(e))r?.usage&&(n=!0,t.inputTokens+=r.usage.inputTokens??0,t.outputTokens+=r.usage.outputTokens??0,t.cacheReadTokens+=r.usage.cacheReadTokens??0,t.cacheWriteTokens+=r.usage.cacheWriteTokens??0,t.reasoningTokens+=r.usage.reasoningTokens??0);return n?t:null}function md(){return{shutdownTotals:null,assistantOutputSum:0}}function eg(e,t){if(t.type==="assistant.message"){let n=t.data?.outputTokens;typeof n=="number"&&(e.assistantOutputSum+=n,e.lastAssistantOutputTokens=n)}else if(t.type==="session.shutdown"){let n=CL(t.data?.modelMetrics);n&&(e.shutdownTotals=n)}}function Qh(e){let t=e.shutdownTotals,n=e.lastAssistantOutputTokens!==void 0?{outputTokens:e.lastAssistantOutputTokens}:void 0;return{totalInputTokens:t?.inputTokens,totalCachedInputTokens:t?.cacheReadTokens,totalCacheWriteInputTokens:t?.cacheWriteTokens,totalOutputTokens:t?.outputTokens??(e.lastAssistantOutputTokens===void 0?void 0:e.assistantOutputSum),totalReasoningOutputTokens:t?.reasoningTokens,lastTokenUsage:n}}function ML(e){let t={};for(let n of e.split(`
|
|
1674
1674
|
`)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(t[r[1]]=r[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function nr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function DL(e){let t=0,n=md();for await(let r of Je(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++,eg(n,r);return{messageCount:t,tokens:n}}function jL(e){let t=PL(e),n=new Map;for(let r of e){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=t.get(r.toolCallId),d=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
|
|
1675
|
-
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=t.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function PL(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}var Io,tg=w(()=>{"use strict";on();Io=class{name="copilot";sessionStateDir;constructor(t={}){let n=t.copilotDir||Tt(ke,".copilot");this.sessionStateDir=Tt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await Zh(this.sessionStateDir)}catch{return t}for(let r of n){let s=Tt(this.sessionStateDir,r);if((await jr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&t.push(o)}catch{}}return t}async loadSession(t){let n=await this.resolveSessionDir(t);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=Tt(n,"events.jsonl"),i=await jr(s).catch(()=>null),o=i?s:Tt(n,"workspace.yaml"),a=await Ce(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",d,u,f,m,p,_,h=r?.id||$L(n)||t,g=md();if(i)for await(let E of Je(s)){let y=nr(E.timestamp)||a.modifiedAt;if(eg(g,E),E.type==="session.start"&&E.data){E.data.sessionId&&(h=E.data.sessionId),E.data.copilotVersion&&(u=E.data.copilotVersion),E.data.startTime&&(_=nr(E.data.startTime)),E.data.selectedModel&&(d=E.data.selectedModel),E.data.context&&(E.data.context.cwd&&(c=E.data.context.cwd),E.data.context.branch&&(f=E.data.context.branch));continue}if(E.type==="session.model_change"&&E.data?.newModel){d=E.data.newModel;continue}if(E.type==="user.message"&&E.data){let b=E.data.content||"",S=b.trim();S&&(m||(m=G(S,80)),p=G(S,80)),l.push({role:"user",timestamp:y,content:pe(S||b)});continue}if(E.type==="assistant.message"&&E.data){let b=(E.data.content||"").trim();if(b&&l.push({role:"assistant",timestamp:y,content:pe(b),model:d}),E.data.toolRequests)for(let S of E.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:S.name||"unknown tool",toolName:S.name,toolInput:S.arguments?JSON.stringify(S.arguments,null,2):void 0,toolInputData:jt(S.arguments),toolCallId:S.toolCallId});continue}if(E.type==="tool.execution_complete"&&E.data){let b=E.data.result?.content||"",S=E.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:pe(b),toolDetailedContent:S?pe(S):void 0,toolCallId:E.data.toolCallId});continue}if(E.type==="assistant.reasoning"&&E.data?.content){l.push({role:"thinking",timestamp:y,content:pe(E.data.content)});continue}if(E.type==="session.error"||E.type==="session.warning"||E.type==="session.info"||E.type==="system.message"){let b=E.data?.message||"";b.trim()&&l.push({role:"system",timestamp:y,content:pe(b)});continue}}if(!m){let E=(r?.summary||"").trim();E&&(m=G(E,80))}return jL(l),{provider:"copilot",sessionId:h,cwd:c,createdAt:_??nr(r?.created_at)??a.createdAt,modifiedAt:nr(r?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(E=>E.role==="user"||E.role==="assistant").length,filePath:o,...Qh(g),messages:l}}async extractSummary(t,n){let r=await this.readWorkspaceYaml(t),s=Tt(t,"events.jsonl"),i=await jr(s).catch(()=>null),o=i?s:Tt(t,"workspace.yaml"),a=await Ce(i?s:t),l=i?await Ve(s,20):[],c=r?.id||n,d=r?.cwd||"(unknown workspace)",u,f,m,p,_;for(let g of l)if(g.type==="session.start"&&g.data&&(g.data.sessionId&&(c=g.data.sessionId),g.data.copilotVersion&&(f=g.data.copilotVersion),g.data.startTime&&(m=nr(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context?.cwd&&(d=g.data.context.cwd)),g.type==="session.model_change"&&g.data?.newModel&&(u||(u=g.data.newModel)),g.type==="user.message"&&g.data){let E=(g.data.content||"").trim();E&&(p||(p=G(E,80)),_=G(E,80))}if(!p){let g=(r?.summary||"").trim();g&&(p=G(g,80))}let h=i?await DL(s):{messageCount:0,tokens:md()};return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??nr(r?.created_at)??a.createdAt,modifiedAt:nr(r?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:h.messageCount,filePath:o,...Qh(h.tokens)}}async readWorkspaceYaml(t){let n=Tt(t,"workspace.yaml");try{let r=await LL(n,"utf-8");return ML(r)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let n=await this.resolveSessionDir(t);return n?(await OL(n,{recursive:!0}),!0):!1}async resolveSessionDir(t){let n;try{n=await Zh(this.sessionStateDir)}catch{return null}if(n.includes(t)){let s=Tt(this.sessionStateDir,t);if((await jr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(t)){let i=Tt(this.sessionStateDir,s);(await jr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=Tt(this.sessionStateDir,s);if(!(await jr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function _d(e){return new pd(e)}var pd,hd=w(()=>{"use strict";tg();Pt();$n();
|
|
1675
|
+
`).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(d===void 0)continue;let u=`copilot-shell:${d}:${r.toolCallId}`;n.set(d,u),r.backgroundTaskId=u,l!==void 0&&(l.backgroundTaskId=u);continue}if(!["read_bash","write_bash","stop_bash"].includes(r.toolName??""))continue;let s=r.toolInputData?.shellId;if(typeof s!="string"&&typeof s!="number")continue;let i=String(s),o=n.get(i);if(o===void 0)continue;r.backgroundTaskId=o;let a=t.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function PL(e){let t=new Map;for(let n of e)n.role==="tool_result"&&n.toolCallId!==void 0&&t.set(n.toolCallId,n);return t}var Io,tg=w(()=>{"use strict";on();Io=class{name="copilot";sessionStateDir;constructor(t={}){let n=t.copilotDir||Tt(ke,".copilot");this.sessionStateDir=Tt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],n;try{n=await Zh(this.sessionStateDir)}catch{return t}for(let r of n){let s=Tt(this.sessionStateDir,r);if((await jr(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&t.push(o)}catch{}}return t}async loadSession(t){let n=await this.resolveSessionDir(t);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=Tt(n,"events.jsonl"),i=await jr(s).catch(()=>null),o=i?s:Tt(n,"workspace.yaml"),a=await Ce(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",d,u,f,m,p,_,h=r?.id||$L(n)||t,g=md();if(i)for await(let E of Je(s)){let y=nr(E.timestamp)||a.modifiedAt;if(eg(g,E),E.type==="session.start"&&E.data){E.data.sessionId&&(h=E.data.sessionId),E.data.copilotVersion&&(u=E.data.copilotVersion),E.data.startTime&&(_=nr(E.data.startTime)),E.data.selectedModel&&(d=E.data.selectedModel),E.data.context&&(E.data.context.cwd&&(c=E.data.context.cwd),E.data.context.branch&&(f=E.data.context.branch));continue}if(E.type==="session.model_change"&&E.data?.newModel){d=E.data.newModel;continue}if(E.type==="user.message"&&E.data){let b=E.data.content||"",S=b.trim();S&&(m||(m=G(S,80)),p=G(S,80)),l.push({role:"user",timestamp:y,content:pe(S||b)});continue}if(E.type==="assistant.message"&&E.data){let b=(E.data.content||"").trim();if(b&&l.push({role:"assistant",timestamp:y,content:pe(b),model:d}),E.data.toolRequests)for(let S of E.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:S.name||"unknown tool",toolName:S.name,toolInput:S.arguments?JSON.stringify(S.arguments,null,2):void 0,toolInputData:jt(S.arguments),toolCallId:S.toolCallId});continue}if(E.type==="tool.execution_complete"&&E.data){let b=E.data.result?.content||"",S=E.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:pe(b),toolDetailedContent:S?pe(S):void 0,toolCallId:E.data.toolCallId});continue}if(E.type==="assistant.reasoning"&&E.data?.content){l.push({role:"thinking",timestamp:y,content:pe(E.data.content)});continue}if(E.type==="session.error"||E.type==="session.warning"||E.type==="session.info"||E.type==="system.message"){let b=E.data?.message||"";b.trim()&&l.push({role:"system",timestamp:y,content:pe(b)});continue}}if(!m){let E=(r?.summary||"").trim();E&&(m=G(E,80))}return jL(l),{provider:"copilot",sessionId:h,cwd:c,createdAt:_??nr(r?.created_at)??a.createdAt,modifiedAt:nr(r?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(E=>E.role==="user"||E.role==="assistant").length,filePath:o,...Qh(g),messages:l}}async extractSummary(t,n){let r=await this.readWorkspaceYaml(t),s=Tt(t,"events.jsonl"),i=await jr(s).catch(()=>null),o=i?s:Tt(t,"workspace.yaml"),a=await Ce(i?s:t),l=i?await Ve(s,20):[],c=r?.id||n,d=r?.cwd||"(unknown workspace)",u,f,m,p,_;for(let g of l)if(g.type==="session.start"&&g.data&&(g.data.sessionId&&(c=g.data.sessionId),g.data.copilotVersion&&(f=g.data.copilotVersion),g.data.startTime&&(m=nr(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context?.cwd&&(d=g.data.context.cwd)),g.type==="session.model_change"&&g.data?.newModel&&(u||(u=g.data.newModel)),g.type==="user.message"&&g.data){let E=(g.data.content||"").trim();E&&(p||(p=G(E,80)),_=G(E,80))}if(!p){let g=(r?.summary||"").trim();g&&(p=G(g,80))}let h=i?await DL(s):{messageCount:0,tokens:md()};return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??nr(r?.created_at)??a.createdAt,modifiedAt:nr(r?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:h.messageCount,filePath:o,...Qh(h.tokens)}}async readWorkspaceYaml(t){let n=Tt(t,"workspace.yaml");try{let r=await LL(n,"utf-8");return ML(r)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let n=await this.resolveSessionDir(t);return n?(await OL(n,{recursive:!0}),!0):!1}async resolveSessionDir(t){let n;try{n=await Zh(this.sessionStateDir)}catch{return null}if(n.includes(t)){let s=Tt(this.sessionStateDir,t);if((await jr(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(t)){let i=Tt(this.sessionStateDir,s);(await jr(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=Tt(this.sessionStateDir,s);if(!(await jr(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function _d(e){return new pd(e)}var pd,hd=w(()=>{"use strict";tg();Pt();$n();ce();yt();pd=class extends Ae{constructor(t){super({provider:new Io(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>On(n,{...r,acpTool:"copilot"})})}async seed(t,n){let r=await super.seed(t,n);if(n?.model===void 0||n.model.trim().length===0)return r;let s="copilot seed does not implement per-session model selection";return Ue({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as ng,readdirSync as FL,statSync as rg}from"node:fs";import{join as Cn}from"node:path";import{createRequire as UL}from"node:module";function sg(){return gd===null&&(gd=UL(import.meta.url)("node:sqlite").DatabaseSync),gd}function ig(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function og(e,t){if(!t)return;e.observed=!0;let n=t.input??0,r=t.output??0,s=t.reasoning??0,i=t.cache?.read??0,o=t.cache?.write??0;if(e.totalInputTokens+=n,e.totalCachedInputTokens+=i,e.totalCacheWriteInputTokens+=o,e.totalOutputTokens+=r,e.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;e.lastInputTokens=a,e.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function ag(e){return e.observed?{totalInputTokens:e.totalInputTokens,totalCachedInputTokens:e.totalCachedInputTokens,totalCacheWriteInputTokens:e.totalCacheWriteInputTokens,totalOutputTokens:e.totalOutputTokens,totalReasoningOutputTokens:e.totalReasoningOutputTokens,lastInputTokens:e.lastInputTokens,lastTokenUsage:e.lastTokenUsage}:{}}function WL(){let e=process.env.XDG_DATA_HOME||Cn(ke,".local","share"),t=process.env.XDG_CONFIG_HOME||Cn(ke,".config");return[Cn(e,"opencode","opencode.db"),Cn(t,"opencode","opencode.db")]}function qL(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||Cn(ke,".local","share"),t=Cn(e,"lmplayer"),n=Cn(t,"opencode-local.db"),r=[n];try{let s=FL(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>Cn(t,i)).filter(i=>i!==n).sort((i,o)=>{try{return rg(o).mtimeMs-rg(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function BL(e){return e==="lmplayer"?qL():WL()}var gd,Pr,yd=w(()=>{"use strict";on();ce();gd=null;Pr=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,this.busyTimeoutMs=t?.busyTimeoutMs??5e3,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=BL(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>ng(t))}openDb(t){if(!ng(t))return null;let n=new(sg())(t,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let t=[];for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=new Map,i=r.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=r.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1676
1676
|
s.time_created, s.time_updated
|
|
1677
1677
|
FROM session s
|
|
1678
1678
|
ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=r.prepare(`SELECT m.id, m.data, m.time_created FROM message m
|
|
1679
|
-
WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=ig(),h=[];for(let E of d){let y;try{y=JSON.parse(E.data)}catch{continue}p||(p=y.model?.modelID||y.modelID),(y.role==="user"||y.role==="assistant")&&u++,y.role==="user"&&h.push(E.id),y.role==="assistant"&&og(_,y.tokens)}let g=[...h.length>0?[h[0]]:[],...h.length>1?[h[h.length-1]]:[]];for(let E of g){let y=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(E),b=this.extractText(y);b&&(f||(f=G(b,80)),m=G(b,80))}t.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:u,filePath:n,...ag(_)})}}catch{}finally{r.close()}}return t.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(t){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,t);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(t,n,r){let s=t.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=t.prepare(`SELECT id, session_id, time_created, time_updated, data
|
|
1679
|
+
WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=ig(),h=[];for(let E of d){let y;try{y=JSON.parse(E.data)}catch{continue}p||(p=y.model?.modelID||y.modelID),(y.role==="user"||y.role==="assistant")&&u++,y.role==="user"&&h.push(E.id),y.role==="assistant"&&og(_,y.tokens)}let g=[...h.length>0?[h[0]]:[],...h.length>1?[h[h.length-1]]:[]];for(let E of g){let y=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(E),b=this.extractText(y);b&&(f||(f=G(b,80)),m=G(b,80))}t.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:u,filePath:n,...ag(_)})}}catch(s){$({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return t.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(t){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,t);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(t,n,r){let s=t.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=t.prepare(`SELECT id, session_id, time_created, time_updated, data
|
|
1680
1680
|
FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,d,u,f=ig();for(let m of o){let p;try{p=JSON.parse(m.data)}catch{continue}c||(c=p.model?.modelID||p.modelID);let _=p.model?.modelID||p.modelID,h=new Date(p.time?.created||m.time_created),g=t.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(m.id);if(p.role==="user"){let E=this.extractText(g);E&&(d||(d=G(E,80)),u=G(E,80)),a.push({role:"user",timestamp:h,content:E||"(empty)"}),l++}else if(p.role==="assistant"){og(f,p.tokens);for(let E of g){let y;try{y=JSON.parse(E.data)}catch{continue}y.type==="text"&&y.text?a.push({role:"assistant",timestamp:h,content:y.text,model:_}):y.type==="reasoning"&&y.text?a.push({role:"thinking",timestamp:h,content:y.text}):y.type==="tool"&&y.tool&&(a.push({role:"tool_use",timestamp:h,content:`${y.tool}`,toolName:y.tool,toolCallId:y.callID,toolInput:y.state?.input?JSON.stringify(y.state.input):void 0,toolInputData:jt(y.state?.input)}),y.state&&(y.state.status==="completed"||y.state.status==="error"||y.state.output!==void 0||y.state.error!==void 0)&&a.push({role:"tool_result",timestamp:h,content:y.state.error??y.state.output??"",toolCallId:y.callID}))}l++}}return{provider:this.name,sessionId:n.id,slug:n.slug,cwd:i,createdAt:new Date(n.time_created),modifiedAt:new Date(n.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:d,lastUserMessage:u,messageCount:l,filePath:r,...ag(f),messages:a}}extractText(t){let n=[];for(let r of t){let s;try{s=JSON.parse(r.data)}catch{continue}s.type==="text"&&s.text&&n.push(s.text)}return n.join(`
|
|
1681
1681
|
`).trim()}async resolveSessionPath(t){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{if(this.findSessionRow(r,t))return n}catch{}finally{r.close()}}return null}async deleteSession(t){for(let n of this.existingDbPaths()){let r=new(sg())(n,{open:!0});try{let s=this.findSessionRow(r,t);if(!s)continue;return r.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{r.close()}}return!1}findSessionRow(t,n){let r=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
|
|
1682
1682
|
s.time_created, s.time_updated
|
|
@@ -1692,7 +1692,7 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1692
1692
|
`)}}),i.stderr?.on("data",h=>{a+=h.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",h=>{f||(f=!0,p(),l.length>0&&_(l),r({code:h,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",h=>{f||(f=!0,p(),s(h))})})}function hg(e){for(let t of["text","content","delta","output","message"]){let n=e[t];if(typeof n=="string")return n}for(let t of["data","event","payload","part"]){let n=e[t];if(Ao(n)){let r=hg(n);if(r)return r}}}function xo(e,t){for(let r of["sessionID","sessionId","session_id"]){let s=e[r];if(typeof s=="string"&&s.length>0)return s}let n=e.session;if(typeof n=="string"&&n.length>0)return n;if(Ao(n)){let r=xo(n,t);if(r!==void 0)return r}if(t){let r=e.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=e[r];if(Ao(s)){let i=xo(s,t);if(i!==void 0)return i}}}function Ao(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Nd,Ad=w(()=>{"use strict";yd();Pt();yt();Cr();Et();Nd=class extends Ae{constructor(t){super({provider:new Pr({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:iO})}seedArgsFor(t){return pg({prompt:t?.prompt??ge,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,n){sO(t,{recursive:!0});let r=this.seedArgsFor(n);wt("lmplayer",r);try{let s=await _g(this.binary,r,{cwd:t,env:An(void 0,t),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as Ro,readFile as oO,rm as aO}from"node:fs/promises";import{basename as gg,join as Mn}from"node:path";function lO(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Hs(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function cO(e,t){if(!t)return;e.observed=!0;let n=Hs(t.promptTokenCount),r=Hs(t.cachedContentTokenCount),s=Hs(t.candidatesTokenCount),i=Hs(t.thoughtsTokenCount);e.totalInputTokens+=n,e.totalCachedInputTokens+=r,e.totalOutputTokens+=s,e.totalReasoningOutputTokens+=i,e.lastInputTokens=n,e.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:Hs(t.totalTokenCount)||n+s}}function dO(e){return{totalInputTokens:e.observed?e.totalInputTokens:void 0,totalCachedInputTokens:e.observed?e.totalCachedInputTokens:void 0,totalOutputTokens:e.observed?e.totalOutputTokens:void 0,totalReasoningOutputTokens:e.observed?e.totalReasoningOutputTokens:void 0,lastInputTokens:e.lastInputTokens,lastTokenUsage:e.lastTokenUsage}}function yg(e){return e.type==="user"||e.message?.role==="user"}function Eg(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function wg(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
|
|
1693
1693
|
`):Array.isArray(t.parts)?t.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
|
|
1694
1694
|
`):"":""}function Tg(e){return e.model||e.message?.model}function uO(e){let t=e.message?.content;return typeof t=="string"?t.length>0?1:0:bg(e).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Xs(e,t=!1){if(e!==void 0){if(typeof e=="string")return e;try{return JSON.stringify(e,null,t?2:void 0)}catch{return String(e)}}}function fO(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e;return Xs(t.output??t.error??e)}return Xs(e)}function bg(e){return Array.isArray(e.message?.content)?e.message.content:e.message?.parts??[]}function vg(e,t,n){let r=e.name||"tool";return{role:"tool_use",timestamp:t,content:r,toolName:r,toolInput:Xs(e.args,!0),toolInputData:jt(e.args),toolCallId:e.id,model:n}}var Lo,Sg=w(()=>{"use strict";on();Lo=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||Mn(ke,".qwen")}async discoverSessions(){let t=Mn(this.baseDir,"projects"),n;try{n=await Ro(t)}catch{return[]}let r=[];for(let s of n){let i=Mn(t,s,"chats"),o;try{o=await Ro(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Mn(i,a);try{let d=await this.extractSummary(c,l);d&&r.push(d)}catch{}}}return r}async extractSummary(t,n){let r=await Ve(t,30);if(r.length===0)return null;let s=await Ce(t),i="(unknown)",o,a,l,c,d=0;for(let u of r){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),yg(u)){let f=wg(u).trim();f&&(l||(l=G(f,80)),c=G(f,80),d++)}if(Eg(u)){let f=Tg(u);f&&(o=f),d+=uO(u)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=gg(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(t,n){let r=await Ce(t),s="(unknown)",i,o,a,l,c,d,u=[],f=lO();for await(let m of Je(t)){if(cO(f,m.usageMetadata),m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.gitBranch&&(a=m.gitBranch)),m.type==="system"&&m.cwd&&(s=m.cwd,m.version&&(o=m.version),m.model&&(i=m.model),m.gitBranch&&(a=m.gitBranch)),!m.message)continue;let p=m.message,_=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let h=bg(m).filter(g=>g.functionResponse!==void 0);h.length===0&&m.toolCallResult?.callId&&u.push({role:"tool_result",timestamp:_,content:Xs(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let g of h){let E=g.functionResponse,y=fO(E.response),b=Xs(m.toolCallResult?.resultDisplay);u.push({role:"tool_result",timestamp:_,content:b??y??m.toolCallResult?.status??"tool result",toolName:E.name,toolCallId:m.toolCallResult?.callId??E.id,...y!==void 0?{toolDetailedContent:y}:{}})}}else if(yg(m)){let h=wg(m);h.trim()&&(c||(c=G(h.trim(),80)),d=G(h.trim(),80)),u.push({role:"user",timestamp:_,content:h})}else if(Eg(m)){let h=Tg(m);if(h&&(i=h),Array.isArray(p.content))for(let g of p.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:_,content:g.text,model:h}):g.type==="thinking"&&g.thinking?u.push({role:"thinking",timestamp:_,content:g.thinking}):g.functionCall&&u.push(vg(g.functionCall,_,h));else if(typeof p.content=="string")u.push({role:"assistant",timestamp:_,content:p.content,model:h});else if(Array.isArray(p.parts))for(let g of p.parts)if(g.thought||g.type==="thinking"){let E=g.thinking||g.text;E&&u.push({role:"thinking",timestamp:_,content:E})}else g.functionCall?u.push(vg(g.functionCall,_,h)):g.text&&u.push({role:"assistant",timestamp:_,content:g.text,model:h})}}return{provider:"qwen",sessionId:n,slug:l,cwd:s,createdAt:r.createdAt,modifiedAt:r.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:t,...dO(f),messages:u}}async resolveSessionPath(t){let n=Mn(this.baseDir,"projects");try{let r=await Ro(n),s=[];for(let i of r){let o=Mn(n,i,"chats",`${t}.jsonl`);try{return await oO(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=Mn(n,i,"chats"),a;try{a=await Ro(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;gg(l,".jsonl").startsWith(t)&&s.push(Mn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;try{return await aO(n),!0}catch{return!1}}}});function Ld(){return new Rd}var Rd,Od=w(()=>{"use strict";Sg();Pt();$n();yt();Rd=class extends Ae{constructor(){super({provider:new Lo,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:wo})}seedArgsFor(t){let n=super.seedArgsFor(t);return t?.model?[...n,"--model",t.model]:n}}});import{readdir as kg,readFile as Ig,rm as Ng,stat as xg}from"node:fs/promises";import{basename as $d,join as Ft}from"node:path";import{fileURLToPath as mO}from"node:url";async function pO(e){let t=await Promise.all(e.map(n=>Ce(n)));return{createdAt:new Date(Math.min(...t.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(n=>n.modifiedAt.getTime())))}}function _O(e,t){if(!e)return t;let n=new Date(e);return Number.isNaN(n.getTime())?t:n}function Ag(e){return e.type==="USER_INPUT"}function Rg(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function hO(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function Lg(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function Og(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function gO(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function yO(e){for await(let t of Je(e)){let n=t.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=EO(s);if(i)return i}let r=wO(t.content);if(r)return r}return null}function EO(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,n=t.Cwd??t.cwd??t.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function wO(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function TO(e,t){if(e.status!=="RUNNING"||!e.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(e.content);if(!(!n||n[1]!==t)&&!(e.step_index===void 0||Number(n[3])!==e.step_index))return n[2]}function vO(e,t){let n=new Set;for(let r of t){let s=bO(e,n,r);if(!s)continue;n.add(s);let i=r.event.step_index===void 0?void 0:`agy-step-${r.event.step_index}`;s.message.toolCallId=i,s.message.backgroundTaskId=r.message.backgroundTaskId,r.message.toolName=s.name,r.message.toolCallId=i}}function bO(e,t,n){let r=n.message.backgroundTaskId===void 0?void 0:NO(n.event.content);if(r!==void 0)return $g(e.filter(i=>!t.has(i)&&xO(i)===r),n.event.step_index);let s=IO(n.event);if(s!==void 0)return $g(e.filter(i=>!t.has(i)&&SO(i.name,n.event.type)&&Mg(kO(i))===s),n.event.step_index)}function $g(e,t){if(e.length===0)return;if(e.length===1)return e[0];if(t===void 0)return;let n=e.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(t-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function SO(e,t){return t==="VIEW_FILE"?e==="view_file":t!=="CODE_ACTION"?!1:e==="write_to_file"||e==="replace_file_content"||e==="multi_replace_file_content"}function kO(e){let t=e.name==="view_file"?e.input?.AbsolutePath:e.input?.TargetFile;return typeof t=="string"?t:void 0}function IO(e){if(!e.content)return;let t;return e.type==="VIEW_FILE"?t=/File Path:\s*`?([^`\n]+)`?/.exec(e.content)?.[1]:e.type==="CODE_ACTION"&&(t=/Created file\s+(.+?)\s+with requested content/.exec(e.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(e.content)?.[1]),Mg(t)}function Mg(e){if(!e)return;let t=e.trim().replace(/^`|`$/g,"");if(!t.startsWith("file://"))return t;try{return mO(t)}catch{return}}function NO(e){if(e)return/Task Description:\s*([^\n]+)/.exec(e)?.[1]?.trim()}function xO(e){if(e.name==="run_command"){let t=e.input?.CommandLine;return typeof t=="string"?t:void 0}if(e.name==="schedule"){let t=e.input?.DurationSeconds,n=e.input?.Prompt;return typeof t!="string"&&typeof t!="number"||typeof n!="string"?void 0:`Timer: ${t}s, Prompt: ${n}`}}function Cg(e){if(e.endsWith(".db"))return $d(e,".db");let t="/brain/",n=e.indexOf(t);return n===-1?null:e.slice(n+t.length).split("/")[0]||null}var Oo,Dg=w(()=>{"use strict";on();Oo=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||Ft(ke,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Ft(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=Ft(this.baseDir,"conversations"),n;try{n=await kg(t)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=$d(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(t){return Ft(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t,n){return Ft(this.baseDir,"brain",t,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(t){for(let n of[this.transcriptPath(t,!0),this.transcriptPath(t,!1)])try{return await xg(n),n}catch{}return null}async extractSummary(t){let n=this.conversationPath(t),r=await this.existingTranscriptPath(t),s=r??n,i=await pO([n,r].filter(Boolean)),o=await this.resolveCwd(t,r),a,l,c,d=0;if(r){let u=await Ve(r,80);for(let f of u){let m=Og(f.content);if(m&&(a=m),Ag(f)){let p=Lg(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),d++}else Rg(f)&&f.content&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(t){let n=await this.resolveSessionPath(t);if(!n)return null;let r=Cg(n);if(!r)return null;let s=await this.extractSummary(r);if(!s)return null;let i=await this.existingTranscriptPath(r),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage,d=[],u=[];if(i)for await(let f of Je(i)){let m=_O(f.created_at,s.modifiedAt),p=Og(f.content);if(p&&(a=p),Ag(f)){let _=Lg(f.content),h=_.trim();h&&(l||(l=G(h,80)),c=G(h,80)),o.push({role:"user",timestamp:m,content:_});continue}if(Array.isArray(f.tool_calls))for(let _ of f.tool_calls){let h=_.name||"tool",g=gO(_.args),E=jt(_.args),y={role:"tool_use",timestamp:m,content:g,toolName:h,toolInput:g,toolInputData:E};o.push(y),d.push({name:h,stepIndex:f.step_index,input:E,message:y})}if(Rg(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(hO(f)&&f.content){let _=TO(f,r),h=_===void 0?null:await this.readTaskLog(r,_),g={role:"tool_result",timestamp:h?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:_,...h===null?{}:{toolDetailedContent:h.content}};o.push(g),u.push({event:f,message:g})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return vO(d,u),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(t){let n=this.conversationPath(t);try{return await xg(n),n}catch{}let r=Ft(this.baseDir,"conversations");try{let s=[];for(let i of await kg(r)){if(!i.endsWith(".db"))continue;$d(i,".db").startsWith(t)&&s.push(Ft(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let n=await this.resolveSessionPath(t);if(!n)return!1;let r=Cg(n);return r?(await Ng(this.conversationPath(r),{force:!0}),await Ng(Ft(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,n){let r=await this.cwdFromLastConversationCache(t);if(r)return r;if(n){let s=await yO(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let n=Ft(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Ig(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===t)return s}catch{}return null}async readTaskLog(t,n){if(!/^task-\d+$/.test(n))return null;let r=Ft(this.baseDir,"brain",t,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Ig(r,"utf8"),Ce(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as AO}from"node:child_process";function Md(e){return new Cd(e)}async function RO(e,t){let n=Date.now(),r=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",OO(t.timeoutMs)];t.model&&r.push("--model",t.model),wt("agy",r,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await LO(t.binary,r,{cwd:t.cwd,env:Ye(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-n}}function LO(e,t,n){return new Promise((r,s)=>{let i;try{i=AO(e,t,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let o="",a="";i.stdout?.on("data",c=>{o+=c.toString()}),i.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{i.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(n.signal){if(n.signal.aborted){l();return}n.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{n.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function OO(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var Cd,Dd=w(()=>{"use strict";Dg();Pt();yt();Et();Cr();Cd=class extends Ae{constructor(t){super({provider:new Oo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:RO})}seedArgsFor(t){let n=[...super.seedArgsFor(t)];return t?.model&&n.push("--model",t.model),n}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as $O}from"node:crypto";import{existsSync as CO,mkdirSync as Pd,readFileSync as MO,renameSync as DO,rmdirSync as Hg,statSync as jO,writeFileSync as PO}from"node:fs";import{dirname as qd,join as jg,resolve as jd}from"node:path";function FO(e){return $O("sha256").update(e).digest("hex").slice(0,8)}function UO(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function WO(e,t){let n=t?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function Xg(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function $o(e){return Math.max(1,Math.ceil(e.length/4))}function Ur(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return jd(t);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?jg(qd(jd(n)),".lmctl-claude-mock","sessions.json"):jg(jd(e),".lmctl-claude-mock","sessions.json")}function Pg(){return{schemaVersion:1,sessions:{}}}function Js(e){if(!CO(e))return Pg();try{let t=JSON.parse(MO(e,"utf8")),n=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},r=typeof t.script=="object"&&t.script!==null?t.script:void 0,s=typeof t.scriptContains=="object"&&t.scriptContains!==null?t.scriptContains:void 0,i=Fd(t.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return Pg()}}function Jg(e,t){Pd(qd(e),{recursive:!0});let n=`${e}.${process.pid}.${Date.now()}.tmp`;PO(n,`${JSON.stringify(t,null,2)}
|
|
1695
|
-
`,"utf8"),DO(n,e)}function HO(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function XO(e){let t=`${e}.lock`;Pd(qd(e),{recursive:!0});let n=Date.now()+Fg;for(;;)try{return Pd(t),t}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-jO(t).mtimeMs>qO){try{Hg(t)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${Fg}ms: ${t}`);HO(BO)}}function JO(e){try{Hg(e)}catch{}}function Gg(e,t){let n=XO(e);try{return t()}finally{JO(n)}}function GO(e){return{...e,timestamp:e.timestamp.toISOString()}}function KO(e){return{...e,timestamp:new Date(e.timestamp)}}function VO(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(GO)}}function Kg(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(KO)}}function Co(e,t=process.cwd()){let n=Fr.get(e);if(n!==void 0)return n;let s=Js(Ur(t)).sessions[e];if(s===void 0)return;let i=Kg(s);return Fr.set(i.sessionId,i),i}function Ug(e){Fr.set(e.sessionId,e);let t=Ur(e.cwd);Gg(t,()=>{let n=Js(t);n.sessions[e.sessionId]=VO({...e,filePath:t}),Jg(t,n)})}function YO(e,t=process.cwd()){let n=Ur(t);return Gg(n,()=>{let r=Js(n),s=r.sessions[e]!==void 0;return s&&(delete r.sessions[e],Jg(n,r)),s})}function zO(){let e=Js(Ur()),t=Object.values(e.sessions).map(Kg);for(let n of t)Fr.set(n.sessionId,n);return t}function Fd(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Wg(e){if(typeof e=="string")return{kind:"success",text:e};if(e!==void 0&&typeof e.text=="string"&&typeof e.error!="string"){let t=Fd(e.delayMs);return{kind:"success",text:e.text,...t!==void 0?{delayMs:t}:{}}}if(e!==void 0&&typeof e.error=="string"&&typeof e.text!="string"){let t=Fd(e.delayMs);return{kind:"error",error:e.error,...t!==void 0?{delayMs:t}:{}}}}async function qg(e){e!==void 0&&e>0&&await new Promise(t=>setTimeout(t,e))}function ZO(e,t){let{script:n,scriptContains:r}=t;if(n!==void 0){let s=Wg(n[e]??n[Xg(e)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(e.includes(s)){let i=Wg(r[s]);if(i!==void 0)return i}}}function Bg(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function Bd(){return new Wd}var Fr,qO,BO,Fg,Ud,Wd,Hd=w(()=>{"use strict";Fr=new Map;qO=5e3,BO=15,Fg=1e4;Ud=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let n of zO())t.set(n.sessionId,n);for(let n of Fr.values())t.set(n.sessionId,n);return[...t.values()].map(Bg)}async loadSession(t){let n=Co(t);return n===void 0?null:{...Bg(n),messages:n.messages.slice()}}async resolveSessionPath(t){return Co(t)?.filePath??null}async deleteSession(t){let n=Fr.delete(t),r=YO(t);return n||r}},Wd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Ud;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,n){let r=UO(WO(t,n)),s=`mock-${r}-${FO(`${t}:${r}`)}`,i=new Date,o=Ur(t),a=Co(s,t),l=n?.prompt??"ClaudeMock seed",c=$o(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=$o("ACK: ClaudeMock seeded"),Ug(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,n){let r=Date.now(),s=Co(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Js(Ur(n.cwd)),a=ZO(t,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await qg(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${Xg(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=$o(t),s.totalOutputTokens+=$o(c),Ug(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await qg(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ut(e){let t=[rd({claudeDir:e?.claudeDir}),od({codexDir:e?.codexDir,codeDir:e?.codeDir}),ud({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),_d({copilotDir:e?.copilotDir}),wd(),kd({kimiHome:e?.kimiHome}),xd({lmplayerDbPath:e?.lmplayerDbPath}),Ld(),Md({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(Bd()),t}var Xd=w(()=>{"use strict";sd();ad();fd();hd();Td();Id();Ad();Od();Dd();Hd();sd();ad();fd();hd();Td();Id();Ad();Od();Dd();Hd()});var Kd={};fe(Kd,{ProviderRegistry:()=>Ms,TransportConnectionError:()=>Ie,TransportError:()=>ut,TransportJsonError:()=>mo,TransportProcessError:()=>an,TransportRpcError:()=>ln,_resetDefaultRegistryForTests:()=>QO,chat:()=>Wt,countTokens:()=>Gd,createAdapterRegistry:()=>Dt,createAllAdapters:()=>Ut,listSessions:()=>Gs,seed:()=>Jd});function Do(){return Mo===null&&(Mo=Dt(Ut())),Mo}function QO(){Mo=null}function Yg(e,t){let n=e.getAdapter(t);if(!n)throw new Error(`provider "${t}" is not registered in this registry`);return n}async function Wt(e){let t=e.registry??Do(),n=Yg(t,e.provider),r={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,holdOpen:e.holdOpen},s=await n.sendTurn(e.prompt,r);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Jd(e){let t=e.registry??Do(),n=Yg(t,e.provider),r=await Vg(t,e.provider,e.cwd),s=await n.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await Vg(t,e.provider,e.cwd),a=e$(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function Vg(e,t,n){let r=await e.listAll({provider:t,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function e$(e,t){let n=[];for(let r of t.keys())e.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function Gs(e={}){return(e.registry??Do()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function Gd(e){let n=await(e.registry??Do()).getSession(e.sessionId,e.provider);if(!n)throw new Error(`session "${e.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var Mo,vt=w(()=>{"use strict";Oc();Xd();Oc();Xd();$r();Mo=null});function t$(){return Vd===null&&(Vd=Dt(Ut())),Vd}async function jo(e){let{dal:t,team_member_id:n}=e,r=t!==void 0&&n!==void 0;r&&t.setMemberState(n,"in_chat");let s=!1,i;try{return await r$(e)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)Wr.delete(n),t.setMemberState(n,"idle");else{let o=n$(i,n);t.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function n$(e,t){if(!(e instanceof Re))return Wr.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let n=(Wr.get(t)??0)+1;return n>=3?(Wr.delete(t),"consecutive_timeouts"):(Wr.set(t,n),null)}return Wr.delete(t),null}async function r$(e){let t=e.timeoutMs,n=typeof t=="number"&&t>0,r=t$(),s;try{let d=await r.resolveSession(e.sessionid);if(!d)return Promise.reject(new Re("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,Yd(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Re("other",null,`library: session resolution failed: ${zg(d)}`,Yd(e.sessionid,e.sessiondir,"unresolved")))}let i=Yd(e.sessionid,e.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await Wt({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new Re("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new Re("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):s$(d,i)}finally{a!==null&&clearTimeout(a)}}function Yd(e,t,n){return["<library>","chat",e,t,"--provider",n]}function zg(e){return e instanceof Error?e.message:String(e)}function s$(e,t){if(e instanceof Re)return e;if(e instanceof Ie){let n=e.cause;return n?.code==="ENOENT_CWD"?new Re("sessiondir_missing",null,e.message,t):n?.code==="ENOENT"?new Re("enoent",null,e.message,t):new Re("other",null,e.message,t)}return e instanceof an?new Re("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof ln?new Re("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof ut?new Re("other",null,e.message,t):new Re("other",null,zg(e),t)}var Re,Vd,Wr,Po=w(()=>{"use strict";vt();Re=class extends Error{kind;exit_status;stderr;argv;constructor(t,n,r,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},Vd=null;Wr=new Map});function Zg(){return zd===null&&(zd=Dt(Ut())),zd}function o$(e,t){if(!i$.test(e))return e;let n=t.getConfig(`workspace.${e}`);if(n===null||n.length===0)throw new Me("other",null,`no provider mapping for ${e} (set lmctl_config workspace.${e})`,["<library>","seed","--provider",e]);return n}async function Fo(e){let t=o$(e.member.provider,e.dal),n=t===e.member.provider?e.member:{...e.member,provider:t},r=await a$({member:n});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:r.sessionid,provider_resolved:t}}async function a$(e){let t=e.member.provider,n=e.member.sessiondir,r=Zd("seed",n,t);try{let s=await Jd({provider:t,cwd:n,registry:Zg()});if(!s.success)throw c$(s.error,r);if(!s.sessionId)throw new Me("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Me?s:Qd(s,r)}}async function Qg(e){return l$(e)}async function l$(e){let t=Zg(),n=Zd("tokens",e.sessionid,"unresolved"),r;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new Me("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Me?i:Qd(i,n)}let s=Zd("tokens",e.sessionid,r);try{let i=await Gd({sessionId:e.sessionid,provider:r,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Me?i:Qd(i,s)}}function Zd(e,t,n){return["<library>",e,t,"--provider",n]}function c$(e,t){let n=e??"";if(/\bENOENT\b/i.test(n))return new Me("enoent",null,n,t);if(/timed?\s*out/i.test(n))return new Me("timeout",null,n,t);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Me("nonzero_exit",Number(r[1]),n,t)}return new Me("other",null,n,t)}function Qd(e,t){return e instanceof Me?e:e instanceof Ie?e.cause?.code==="ENOENT"?new Me("enoent",null,e.message,t):new Me("other",null,e.message,t):e instanceof an?new Me("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof ln?new Me("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof ut?new Me("other",null,e.message,t):new Me("other",null,e instanceof Error?e.message:String(e),t)}var Me,zd,i$,eu=w(()=>{"use strict";vt();Me=class extends Error{kind;exit_status;stderr;argv;constructor(t,n,r,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},zd=null;i$=/^provider[123]$/});function Uo(e){return Buffer.from(e,"utf8").toString("base64url")}function Vs(e){return Buffer.from(e,"base64url").toString("utf8")}async function ey(e,t=n=>Qg({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of d$(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),n+=1}catch(o){r+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:n,failed:r}}async function ty(e,t,n){let r=ny(e,t,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new Ks(n,r.member.state);e.setMemberState(r.member.id,"in_chat","compacting");try{return await jo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),e.setMemberState(r.member.id,"idle",null),{ok:!0,row:ry(e,t,n)}}catch(s){throw e.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function tu(e,t,n){let r=ny(e,t,n);if(r===null)throw new Error("session member not found");let s=await Fo({member:r.member,dal:e});return e.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:ry(e,t,n)}}function d$(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(n=>n.sessionid!==null).map(n=>({team_name:t.name,member:n})))}function ny(e,t,n){let r=e.findTeamByName(t);if(r===null)return null;let s=e.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function ry(e,t,n){return e.sessionSizeHistory(t,n,1)[0]??null}var Ks,Wo=w(()=>{"use strict";Po();eu();Ks=class extends Error{constructor(t,n){super(`member ${t} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function nu(e){let t=e.dal,n=e.nowMs??Date.now(),r=e.thresholdMs??f$(t),s=n-r,i=t.query(`
|
|
1695
|
+
`,"utf8"),DO(n,e)}function HO(e){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,e)}function XO(e){let t=`${e}.lock`;Pd(qd(e),{recursive:!0});let n=Date.now()+Fg;for(;;)try{return Pd(t),t}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-jO(t).mtimeMs>qO){try{Hg(t)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${Fg}ms: ${t}`);HO(BO)}}function JO(e){try{Hg(e)}catch{}}function Gg(e,t){let n=XO(e);try{return t()}finally{JO(n)}}function GO(e){return{...e,timestamp:e.timestamp.toISOString()}}function KO(e){return{...e,timestamp:new Date(e.timestamp)}}function VO(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(GO)}}function Kg(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(KO)}}function Co(e,t=process.cwd()){let n=Fr.get(e);if(n!==void 0)return n;let s=Js(Ur(t)).sessions[e];if(s===void 0)return;let i=Kg(s);return Fr.set(i.sessionId,i),i}function Ug(e){Fr.set(e.sessionId,e);let t=Ur(e.cwd);Gg(t,()=>{let n=Js(t);n.sessions[e.sessionId]=VO({...e,filePath:t}),Jg(t,n)})}function YO(e,t=process.cwd()){let n=Ur(t);return Gg(n,()=>{let r=Js(n),s=r.sessions[e]!==void 0;return s&&(delete r.sessions[e],Jg(n,r)),s})}function zO(){let e=Js(Ur()),t=Object.values(e.sessions).map(Kg);for(let n of t)Fr.set(n.sessionId,n);return t}function Fd(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:void 0}function Wg(e){if(typeof e=="string")return{kind:"success",text:e};if(e!==void 0&&typeof e.text=="string"&&typeof e.error!="string"){let t=Fd(e.delayMs);return{kind:"success",text:e.text,...t!==void 0?{delayMs:t}:{}}}if(e!==void 0&&typeof e.error=="string"&&typeof e.text!="string"){let t=Fd(e.delayMs);return{kind:"error",error:e.error,...t!==void 0?{delayMs:t}:{}}}}async function qg(e){e!==void 0&&e>0&&await new Promise(t=>setTimeout(t,e))}function ZO(e,t){let{script:n,scriptContains:r}=t;if(n!==void 0){let s=Wg(n[e]??n[Xg(e)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(e.includes(s)){let i=Wg(r[s]);if(i!==void 0)return i}}}function Bg(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function Bd(){return new Wd}var Fr,qO,BO,Fg,Ud,Wd,Hd=w(()=>{"use strict";Fr=new Map;qO=5e3,BO=15,Fg=1e4;Ud=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let n of zO())t.set(n.sessionId,n);for(let n of Fr.values())t.set(n.sessionId,n);return[...t.values()].map(Bg)}async loadSession(t){let n=Co(t);return n===void 0?null:{...Bg(n),messages:n.messages.slice()}}async resolveSessionPath(t){return Co(t)?.filePath??null}async deleteSession(t){let n=Fr.delete(t),r=YO(t);return n||r}},Wd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Ud;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,n){let r=UO(WO(t,n)),s=`mock-${r}-${FO(`${t}:${r}`)}`,i=new Date,o=Ur(t),a=Co(s,t),l=n?.prompt??"ClaudeMock seed",c=$o(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=$o("ACK: ClaudeMock seeded"),Ug(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,n){let r=Date.now(),s=Co(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Js(Ur(n.cwd)),a=ZO(t,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await qg(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${Xg(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=$o(t),s.totalOutputTokens+=$o(c),Ug(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await qg(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ut(e){let t=[rd({claudeDir:e?.claudeDir}),od({codexDir:e?.codexDir,codeDir:e?.codeDir}),ud({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),_d({copilotDir:e?.copilotDir}),wd(),kd({kimiHome:e?.kimiHome}),xd({lmplayerDbPath:e?.lmplayerDbPath}),Ld(),Md({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(Bd()),t}var Xd=w(()=>{"use strict";sd();ad();fd();hd();Td();Id();Ad();Od();Dd();Hd();sd();ad();fd();hd();Td();Id();Ad();Od();Dd();Hd()});var Kd={};me(Kd,{ProviderRegistry:()=>Ms,TransportConnectionError:()=>Ie,TransportError:()=>ut,TransportJsonError:()=>mo,TransportProcessError:()=>an,TransportRpcError:()=>ln,_resetDefaultRegistryForTests:()=>QO,chat:()=>Wt,countTokens:()=>Gd,createAdapterRegistry:()=>Dt,createAllAdapters:()=>Ut,listSessions:()=>Gs,seed:()=>Jd});function Do(){return Mo===null&&(Mo=Dt(Ut())),Mo}function QO(){Mo=null}function Yg(e,t){let n=e.getAdapter(t);if(!n)throw new Error(`provider "${t}" is not registered in this registry`);return n}async function Wt(e){let t=e.registry??Do(),n=Yg(t,e.provider),r={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,holdOpen:e.holdOpen},s=await n.sendTurn(e.prompt,r);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function Jd(e){let t=e.registry??Do(),n=Yg(t,e.provider),r=await Vg(t,e.provider,e.cwd),s=await n.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await Vg(t,e.provider,e.cwd),a=e$(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function Vg(e,t,n){let r=await e.listAll({provider:t,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function e$(e,t){let n=[];for(let r of t.keys())e.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function Gs(e={}){return(e.registry??Do()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function Gd(e){let n=await(e.registry??Do()).getSession(e.sessionId,e.provider);if(!n)throw new Error(`session "${e.sessionId}" not found`);let r=n.totalInputTokens??0,s=n.totalCachedInputTokens??0,i=n.totalCacheWriteInputTokens??0,o=n.totalOutputTokens??0,a=n.totalReasoningOutputTokens??0;return{provider:n.provider,sessionId:n.sessionId,input:r,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:r+s+i+o+a,lastTurn:n.lastTokenUsage}}var Mo,vt=w(()=>{"use strict";Oc();Xd();Oc();Xd();$r();Mo=null});function t$(){return Vd===null&&(Vd=Dt(Ut())),Vd}async function jo(e){let{dal:t,team_member_id:n}=e,r=t!==void 0&&n!==void 0;r&&t.setMemberState(n,"in_chat");let s=!1,i;try{return await r$(e)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)Wr.delete(n),t.setMemberState(n,"idle");else{let o=n$(i,n);t.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function n$(e,t){if(!(e instanceof Re))return Wr.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let n=(Wr.get(t)??0)+1;return n>=3?(Wr.delete(t),"consecutive_timeouts"):(Wr.set(t,n),null)}return Wr.delete(t),null}async function r$(e){let t=e.timeoutMs,n=typeof t=="number"&&t>0,r=t$(),s;try{let d=await r.resolveSession(e.sessionid);if(!d)return Promise.reject(new Re("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,Yd(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new Re("other",null,`library: session resolution failed: ${zg(d)}`,Yd(e.sessionid,e.sessiondir,"unresolved")))}let i=Yd(e.sessionid,e.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await Wt({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new Re("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new Re("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):s$(d,i)}finally{a!==null&&clearTimeout(a)}}function Yd(e,t,n){return["<library>","chat",e,t,"--provider",n]}function zg(e){return e instanceof Error?e.message:String(e)}function s$(e,t){if(e instanceof Re)return e;if(e instanceof Ie){let n=e.cause;return n?.code==="ENOENT_CWD"?new Re("sessiondir_missing",null,e.message,t):n?.code==="ENOENT"?new Re("enoent",null,e.message,t):new Re("other",null,e.message,t)}return e instanceof an?new Re("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof ln?new Re("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof ut?new Re("other",null,e.message,t):new Re("other",null,zg(e),t)}var Re,Vd,Wr,Po=w(()=>{"use strict";vt();Re=class extends Error{kind;exit_status;stderr;argv;constructor(t,n,r,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},Vd=null;Wr=new Map});function Zg(){return zd===null&&(zd=Dt(Ut())),zd}function o$(e,t){if(!i$.test(e))return e;let n=t.getConfig(`workspace.${e}`);if(n===null||n.length===0)throw new Me("other",null,`no provider mapping for ${e} (set lmctl_config workspace.${e})`,["<library>","seed","--provider",e]);return n}async function Fo(e){let t=o$(e.member.provider,e.dal),n=t===e.member.provider?e.member:{...e.member,provider:t},r=await a$({member:n});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:r.sessionid,provider_resolved:t}}async function a$(e){let t=e.member.provider,n=e.member.sessiondir,r=Zd("seed",n,t);try{let s=await Jd({provider:t,cwd:n,registry:Zg()});if(!s.success)throw c$(s.error,r);if(!s.sessionId)throw new Me("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Me?s:Qd(s,r)}}async function Qg(e){return l$(e)}async function l$(e){let t=Zg(),n=Zd("tokens",e.sessionid,"unresolved"),r;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new Me("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Me?i:Qd(i,n)}let s=Zd("tokens",e.sessionid,r);try{let i=await Gd({sessionId:e.sessionid,provider:r,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Me?i:Qd(i,s)}}function Zd(e,t,n){return["<library>",e,t,"--provider",n]}function c$(e,t){let n=e??"";if(/\bENOENT\b/i.test(n))return new Me("enoent",null,n,t);if(/timed?\s*out/i.test(n))return new Me("timeout",null,n,t);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Me("nonzero_exit",Number(r[1]),n,t)}return new Me("other",null,n,t)}function Qd(e,t){return e instanceof Me?e:e instanceof Ie?e.cause?.code==="ENOENT"?new Me("enoent",null,e.message,t):new Me("other",null,e.message,t):e instanceof an?new Me("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof ln?new Me("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof ut?new Me("other",null,e.message,t):new Me("other",null,e instanceof Error?e.message:String(e),t)}var Me,zd,i$,eu=w(()=>{"use strict";vt();Me=class extends Error{kind;exit_status;stderr;argv;constructor(t,n,r,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},zd=null;i$=/^provider[123]$/});function Uo(e){return Buffer.from(e,"utf8").toString("base64url")}function Vs(e){return Buffer.from(e,"base64url").toString("utf8")}async function ey(e,t=n=>Qg({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of d$(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),n+=1}catch(o){r+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:n,failed:r}}async function ty(e,t,n){let r=ny(e,t,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new Ks(n,r.member.state);e.setMemberState(r.member.id,"in_chat","compacting");try{return await jo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),e.setMemberState(r.member.id,"idle",null),{ok:!0,row:ry(e,t,n)}}catch(s){throw e.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function tu(e,t,n){let r=ny(e,t,n);if(r===null)throw new Error("session member not found");let s=await Fo({member:r.member,dal:e});return e.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:ry(e,t,n)}}function d$(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(n=>n.sessionid!==null).map(n=>({team_name:t.name,member:n})))}function ny(e,t,n){let r=e.findTeamByName(t);if(r===null)return null;let s=e.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function ry(e,t,n){return e.sessionSizeHistory(t,n,1)[0]??null}var Ks,Wo=w(()=>{"use strict";Po();eu();Ks=class extends Error{constructor(t,n){super(`member ${t} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function nu(e){let t=e.dal,n=e.nowMs??Date.now(),r=e.thresholdMs??f$(t),s=n-r,i=t.query(`
|
|
1696
1696
|
SELECT
|
|
1697
1697
|
isess.id AS interactive_session_id,
|
|
1698
1698
|
isess.run_id,
|
|
@@ -1846,7 +1846,7 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1846
1846
|
ON isess.run_id = a.run_id
|
|
1847
1847
|
AND isess.id = (
|
|
1848
1848
|
SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
|
|
1849
|
-
)`});var My={};
|
|
1849
|
+
)`});var My={};me(My,{parseApiArgs:()=>Sy,readApiClientConfig:()=>zs,runApi:()=>P$});import{readFileSync as $$}from"node:fs";import{basename as C$,extname as M$}from"node:path";async function P$(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(j$),0;if(e[0]==="config")return U$(e.slice(1),t);let n=$y(e,"--direct");if(n.rest[0]==="escalations")return W$(n.rest.slice(1),t,n.present);if(n.rest[0]==="workflows"&&n.rest[1]==="verify"&&na(n.rest.slice(2)))return t.stdout.write(`${X$}
|
|
1850
1850
|
`),0;if(n.rest[0]==="workflows"&&n.rest[1]==="verify")return n.present?(t.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
|
|
1851
1851
|
`),2):FC(n.rest.slice(2),t);if(n.rest[0]==="run"&&n.rest[1]==="where"&&na(n.rest.slice(2)))return t.stdout.write(`${B$}
|
|
1852
1852
|
`),0;if(n.rest[0]==="run"&&n.rest[1]==="timeline"&&na(n.rest.slice(2)))return t.stdout.write(`${H$}
|
|
@@ -1893,19 +1893,19 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1893
1893
|
`)}n.stdout.write(` Respond: lmctl api escalations respond ${r.attention_id} "<answer>" [--done to end chat]
|
|
1894
1894
|
`),n.stdout.write(`
|
|
1895
1895
|
`)}return 0}function V$(e){let t=Date.parse(e);if(Number.isNaN(t))return"recently";let n=Math.max(0,Math.round((Date.now()-t)/1e3));if(n<60)return`${n}s ago`;let r=Math.round(n/60);if(r<60)return`${r}m ago`;let s=Math.round(r/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function Y$(e,t){let n=e.filter(a=>a!=="--json"&&a!=="--text");if(n.length!==1)return t.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
|
|
1896
|
-
`),2;let r=
|
|
1896
|
+
`),2;let r=de(n[0],"attention_id");if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
1897
1897
|
`),2;let s=ar(t),i=Pn("application/json",s.token),o;try{o=await fetch(new URL(`/api/escalations/${r}`,s.baseUrl),{method:"GET",headers:i})}catch(a){return t.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
|
|
1898
1898
|
`),1}return o.status===404?(t.stderr.write(`error: escalation not found: ${r}
|
|
1899
1899
|
`),1):o.ok?(t.stdout.write(`${JSON.stringify(await o.json(),null,2)}
|
|
1900
1900
|
`),0):(t.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
|
|
1901
1901
|
`),o.status===400?2:1)}async function z$(e,t){let n=!1,r=!1,s=[];for(let f=0;f<e.length;f+=1){let m=e[f];if(m==="--json"){n=!0;continue}if(m==="--done"){r=!0;continue}s.push(m)}if(s.length!==2)return t.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1902
|
-
`),2;let i=
|
|
1902
|
+
`),2;let i=de(s[0],"attention_id");if(typeof i=="string")return t.stderr.write(`error: ${i}
|
|
1903
1903
|
`),2;let o=s[1],a=ar(t),l=Pn("application/json",a.token);l["Content-Type"]="application/json";let c={input:o};r&&(c.done=!0);let d;try{d=await fetch(new URL(`/api/escalations/${i}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return t.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
|
|
1904
1904
|
`),1}if(d.status===404)return t.stderr.write(`error: escalation not found: ${i}
|
|
1905
1905
|
`),1;if(!d.ok){let f=await d.text();return t.stderr.write(`error: HTTP ${d.status}: ${f}
|
|
1906
1906
|
`),d.status===400?2:1}let u=await d.json();return n?t.stdout.write(`${JSON.stringify(u,null,2)}
|
|
1907
1907
|
`):t.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
|
|
1908
|
-
`),0}function wy(e,t,n){return e!=="api.token"||n?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Z$(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let n=Number(t);if(!Number.isInteger(n)||n<=0||n>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===qo||e===Bo){let n=Number(t);if(!Number.isInteger(n)||n<=0)return`invalid ${e}: ${t}`}return null}function Q$(e,t){let n=$$(e),r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength),s=new FormData;return s.append("image",new Blob([r],{type:eC(e)}),C$(e)),t!==void 0&&s.append("project",t),s}function eC(e){switch(M$(e).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function tC(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function nC(e,t){let[n,...r]=e;if(n===void 0)return"usage: lmctl api pr <id|list|get>";if(n==="list")return Ys(r,"--status","/api/submitted-prs","status",t);if(n==="get"){let[s]=r;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(n)?{method:"GET",path:`/api/submitted-prs/${n}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${n}`}function Ny(e){let t=[],n="json";for(let r of e)r==="--json"?n="json":r==="--text"?n="text":t.push(r);return{args:t,format:n}}function ta(e,t,n){return e.length>0?ae(e[0]):{method:"GET",path:t,accept:n?"application/json":"text/html",json:n}}function Ys(e,t,n,r,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return ae(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${r}=${encodeURIComponent(o)}`;return{method:"GET",path:`${n}${a}`,accept:s?"application/json":"text/html",json:s}}function Ty(e,t,n,r,s){let i=!1;for(let o of e){if(o!==t)return ae(o);i=!0}return{method:"GET",path:`${n}${i?`?${r}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function rC(e,t,n){if(e.length!==1)return`usage: lmctl api ${n} <id>`;let r=ce(e[0],"id");return typeof r=="string"?r:{method:"GET",path:`${t}/${r}`,accept:"application/json",json:!0}}function sC(e,t){let[n,...r]=e;if(n!==void 0&&r.length===0&&n!=="enqueue"&&n!=="run")return rC([n],"/api/jobs","job");if(n==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<r.length;u+=1){let f=r[u],m=r[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ae(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=du(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(n==="run"){if(r.length!==1)return"usage: lmctl api job run <id>";let s=ce(r[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function iC(e,t){let[n,...r]=e;if(n==="list"){let[s,...i]=r;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return ae(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(n==="show"){if(r.length!==1)return"usage: lmctl api issues show <id>";let s=ce(r[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return n==="create"?xy(r,t):n==="claim"?Ay(r,t):n==="claim-next"?Ry(r,t):n==="close"?Ly(r,t):n==="reopen"?Oy(r,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function xy(e,t){let[n,...r]=e;if(n===void 0||n.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=du(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=ce(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ae(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(n)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Ay(e,t){let[n,...r]=e;if(n===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=ce(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=ce(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return ae(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Ry(e,t){let[n,...r]=e;if(n===void 0||n.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<r.length;i+=1){let o=r[i],a=r[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=ce(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ae(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(n)}/issues/claim-next`,accept:"application/json",json:t,body:JSON.stringify(s)}}function Ly(e,t){let[n,...r]=e;if(n===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=ce(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=ce(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return ae(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Oy(e,t){let[n,...r]=e;if(n===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=ce(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=ce(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ae(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function oC(e,t){let[n,...r]=e;if(n===void 0||n.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<r.length;i+=1){let o=r[i];if(o!=="--project")return ae(o);let a=r[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:n,project:s}}}function aC(e,t){let n,r,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")n=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;r=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return ae(l)}if(n===void 0&&r===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return n!==void 0&&(o.workflow=n),r!==void 0&&(o.workflow_id_override=r),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function du(e){try{return JSON.parse(e)}catch{return e}}function lC(e,t){let[n,r]=e;return n!=="show"||r===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(r)}`,accept:"application/json",json:t}}function cC(e,t){for(let n of e)if(!(n==="--json"||n==="--text"))return ae(n);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function dC(e,t){let[n,r,...s]=e;return n==="workflow"?uC([r,...s].filter(i=>i!==void 0),t):n!=="show"||r===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(r)}`,accept:"application/json",json:t}}function uC(e,t){let[n,...r]=e;if(n==="list")return r.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(r[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(n==="show"){if(r.length!==1)return"usage: lmctl api project workflow show <id>";let s=ce(r[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(n==="remove"||n==="enable"||n==="disable"){if(r.length!==1)return`usage: lmctl api project workflow ${n} <id>`;let s=ce(r[0],"id");if(typeof s=="string")return s;let i=n==="remove"?"DELETE":"POST",o=n==="remove"?"":`/${n}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(n==="add"){let s=fC(r);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function fC(e){let[t,n,...r]=e;if(t===void 0||n===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:n};for(let i=0;i<r.length;i+=1){let o=r[i],a=r[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=du(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ae(o)}return{project:t,body:s}}function mC(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let n,r,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=ce(l,"run");if(typeof c=="string")return c;n=c}else if(a==="--kind")r=l;else return ae(a)}return n===void 0||r===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${n}/artifacts/${encodeURIComponent(r)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function pC(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let n=ce(e[1],"id");return typeof n=="string"?n:{method:"POST",path:`/api/attentions/${n}/ack`,accept:t?"application/json":"text/html",json:t}}function _C(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function hC(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function gC(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function yC(e,t){let n=e[0];if(n==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(n==="history"||n==="compact"||n==="refresh"){if(e.length!==3)return`usage: lmctl api session ${n} <team_name> <alias>`;let r=Uo(e[1]),s=encodeURIComponent(e[2]);return{method:n==="history"?"GET":"POST",path:`/api/sessions/${r}/${s}/${n}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function EC(e,t){let[n,r,s,i]=e;if(n!==void 0&&/^\d+$/.test(n)&&r===void 0){let o=ce(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(n==="resume"){if(r===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=ce(r,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return ae(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(n==="get"){if(r===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=ce(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(n==="step"||n==="transcript"||n==="messages"){if(r===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${n} <run_id> <step_id>`;let o=ce(r,"run_id");if(typeof o=="string")return o;let a=ce(s,"step_id");if(typeof a=="string")return a;let l=n==="step"?"":`/${n}`,c=n==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(n==="artifacts"){if(r===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=ce(r,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return ae(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(n==="where"){if(r===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=ce(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(n==="timeline"){if(r===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=ce(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function ce(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function ae(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function $y(e,t){let n=[],r=!1;for(let s of e){if(s===t){r=!0;continue}n.push(s)}return{rest:n,present:r}}async function wC(e,t){let n=Ny(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
|
|
1908
|
+
`),0}function wy(e,t,n){return e!=="api.token"||n?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function Z$(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let n=Number(t);if(!Number.isInteger(n)||n<=0||n>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===qo||e===Bo){let n=Number(t);if(!Number.isInteger(n)||n<=0)return`invalid ${e}: ${t}`}return null}function Q$(e,t){let n=$$(e),r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength),s=new FormData;return s.append("image",new Blob([r],{type:eC(e)}),C$(e)),t!==void 0&&s.append("project",t),s}function eC(e){switch(M$(e).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function tC(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function nC(e,t){let[n,...r]=e;if(n===void 0)return"usage: lmctl api pr <id|list|get>";if(n==="list")return Ys(r,"--status","/api/submitted-prs","status",t);if(n==="get"){let[s]=r;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(n)?{method:"GET",path:`/api/submitted-prs/${n}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${n}`}function Ny(e){let t=[],n="json";for(let r of e)r==="--json"?n="json":r==="--text"?n="text":t.push(r);return{args:t,format:n}}function ta(e,t,n){return e.length>0?ae(e[0]):{method:"GET",path:t,accept:n?"application/json":"text/html",json:n}}function Ys(e,t,n,r,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return ae(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${r}=${encodeURIComponent(o)}`;return{method:"GET",path:`${n}${a}`,accept:s?"application/json":"text/html",json:s}}function Ty(e,t,n,r,s){let i=!1;for(let o of e){if(o!==t)return ae(o);i=!0}return{method:"GET",path:`${n}${i?`?${r}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function rC(e,t,n){if(e.length!==1)return`usage: lmctl api ${n} <id>`;let r=de(e[0],"id");return typeof r=="string"?r:{method:"GET",path:`${t}/${r}`,accept:"application/json",json:!0}}function sC(e,t){let[n,...r]=e;if(n!==void 0&&r.length===0&&n!=="enqueue"&&n!=="run")return rC([n],"/api/jobs","job");if(n==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<r.length;u+=1){let f=r[u],m=r[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ae(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=du(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(n==="run"){if(r.length!==1)return"usage: lmctl api job run <id>";let s=de(r[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function iC(e,t){let[n,...r]=e;if(n==="list"){let[s,...i]=r;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return ae(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(n==="show"){if(r.length!==1)return"usage: lmctl api issues show <id>";let s=de(r[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return n==="create"?xy(r,t):n==="claim"?Ay(r,t):n==="claim-next"?Ry(r,t):n==="close"?Ly(r,t):n==="reopen"?Oy(r,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function xy(e,t){let[n,...r]=e;if(n===void 0||n.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=du(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=de(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ae(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(n)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Ay(e,t){let[n,...r]=e;if(n===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=de(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=de(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return ae(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Ry(e,t){let[n,...r]=e;if(n===void 0||n.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<r.length;i+=1){let o=r[i],a=r[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=de(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ae(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(n)}/issues/claim-next`,accept:"application/json",json:t,body:JSON.stringify(s)}}function Ly(e,t){let[n,...r]=e;if(n===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=de(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=de(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return ae(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Oy(e,t){let[n,...r]=e;if(n===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=de(n,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<r.length;o+=1){let a=r[o],l=r[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=de(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ae(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function oC(e,t){let[n,...r]=e;if(n===void 0||n.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<r.length;i+=1){let o=r[i];if(o!=="--project")return ae(o);let a=r[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:n,project:s}}}function aC(e,t){let n,r,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")n=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;r=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return ae(l)}if(n===void 0&&r===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return n!==void 0&&(o.workflow=n),r!==void 0&&(o.workflow_id_override=r),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function du(e){try{return JSON.parse(e)}catch{return e}}function lC(e,t){let[n,r]=e;return n!=="show"||r===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(r)}`,accept:"application/json",json:t}}function cC(e,t){for(let n of e)if(!(n==="--json"||n==="--text"))return ae(n);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function dC(e,t){let[n,r,...s]=e;return n==="workflow"?uC([r,...s].filter(i=>i!==void 0),t):n!=="show"||r===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(r)}`,accept:"application/json",json:t}}function uC(e,t){let[n,...r]=e;if(n==="list")return r.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(r[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(n==="show"){if(r.length!==1)return"usage: lmctl api project workflow show <id>";let s=de(r[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(n==="remove"||n==="enable"||n==="disable"){if(r.length!==1)return`usage: lmctl api project workflow ${n} <id>`;let s=de(r[0],"id");if(typeof s=="string")return s;let i=n==="remove"?"DELETE":"POST",o=n==="remove"?"":`/${n}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(n==="add"){let s=fC(r);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function fC(e){let[t,n,...r]=e;if(t===void 0||n===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:n};for(let i=0;i<r.length;i+=1){let o=r[i],a=r[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=du(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ae(o)}return{project:t,body:s}}function mC(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let n,r,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=de(l,"run");if(typeof c=="string")return c;n=c}else if(a==="--kind")r=l;else return ae(a)}return n===void 0||r===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${n}/artifacts/${encodeURIComponent(r)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function pC(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let n=de(e[1],"id");return typeof n=="string"?n:{method:"POST",path:`/api/attentions/${n}/ack`,accept:t?"application/json":"text/html",json:t}}function _C(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function hC(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function gC(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function yC(e,t){let n=e[0];if(n==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(n==="history"||n==="compact"||n==="refresh"){if(e.length!==3)return`usage: lmctl api session ${n} <team_name> <alias>`;let r=Uo(e[1]),s=encodeURIComponent(e[2]);return{method:n==="history"?"GET":"POST",path:`/api/sessions/${r}/${s}/${n}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function EC(e,t){let[n,r,s,i]=e;if(n!==void 0&&/^\d+$/.test(n)&&r===void 0){let o=de(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(n==="resume"){if(r===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=de(r,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return ae(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(n==="get"){if(r===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=de(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(n==="step"||n==="transcript"||n==="messages"){if(r===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${n} <run_id> <step_id>`;let o=de(r,"run_id");if(typeof o=="string")return o;let a=de(s,"step_id");if(typeof a=="string")return a;let l=n==="step"?"":`/${n}`,c=n==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(n==="artifacts"){if(r===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=de(r,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return ae(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(n==="where"){if(r===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=de(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(n==="timeline"){if(r===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=de(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function de(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function ae(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function $y(e,t){let n=[],r=!1;for(let s of e){if(s===t){r=!0;continue}n.push(s)}return{rest:n,present:r}}async function wC(e,t){let n=Ny(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
|
|
1909
1909
|
`),2;let r=n.args,s=n.format!=="text",[i,...o]=r;if(i===void 0)return t.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
|
|
1910
1910
|
`),2;let a=t.dal===void 0,l=t.dal??Xe({path:re()});try{if(i==="issues"){let[c,...d]=o;return c===void 0?(t.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
|
|
1911
1911
|
`),2):c==="create"?TC(l,d,t,s):c==="claim"?vC(l,d,t,s):c==="claim-next"?bC(l,d,t,s):c==="close"?SC(l,d,t,s):c==="reopen"?kC(l,d,t,s):c==="list"?AC(l,d,t,s):c==="show"?RC(l,d,t,s):(t.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
|
|
@@ -1934,7 +1934,7 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1934
1934
|
`),2;a=p}else if(f==="--ai-test-path")l=m;else return n.stderr.write(`error: ${ae(f)}
|
|
1935
1935
|
`),2}let c=e.findProjectByName(s);if(c===null)return n.stderr.write(`error: project not found: ${s}
|
|
1936
1936
|
`),1;let d=e.listIssues(c.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return it(n,d,r),0}function RC(e,t,n,r){if(t.length!==1)return n.stderr.write(`error: usage: lmctl api --direct issues show <id>
|
|
1937
|
-
`),2;let s=
|
|
1937
|
+
`),2;let s=de(t[0],"id");if(typeof s=="string")return n.stderr.write(`error: ${s}
|
|
1938
1938
|
`),2;let i=e.getIssue(s);return i===null?(n.stderr.write(`error: issue not found: ${s}
|
|
1939
1939
|
`),1):(it(n,i,r),0)}function LC(e,t,n,r){return t.length>0?(n.stderr.write(`error: ${ae(t[0])}
|
|
1940
1940
|
`),2):(it(n,Xo(e),r),0)}function OC(e,t,n,r){return t.length>0?(n.stderr.write(`error: ${ae(t[0])}
|
|
@@ -1975,12 +1975,12 @@ ${n}`:n}function eL(e,t){if(e!=="kimi"||!t.includes("notifications/initialized")
|
|
|
1975
1975
|
`),2}return it(n,jn(e,{unacked:s}),r),0}function Cy(e,t,n){let[r,...s]=t;if(r===void 0)return n.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
|
|
1976
1976
|
`),2;if(r==="list"){let i=ky(s);if(typeof i=="string")return n.stderr.write(`error: ${i}
|
|
1977
1977
|
`),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=Vo(e,o);return Iy(a,i.json,n)}if(r==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return n.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
|
|
1978
|
-
`),2;let o=
|
|
1978
|
+
`),2;let o=de(i[0],"attention_id");if(typeof o=="string")return n.stderr.write(`error: ${o}
|
|
1979
1979
|
`),2;let a=qt(e,o);return a===null?(n.stderr.write(`error: escalation not found: ${o}
|
|
1980
1980
|
`),1):(n.stdout.write(`${JSON.stringify(a,null,2)}
|
|
1981
1981
|
`),0)}return r==="respond"?WC(e,s,n):(n.stderr.write(`error: --direct escalations does not support: ${r} (supported: list, show, respond)
|
|
1982
1982
|
`),2)}function WC(e,t,n){let r=!1,s=!1,i=[];for(let m of t){if(m==="--json"){r=!0;continue}if(m==="--done"){s=!0;continue}i.push(m)}if(i.length!==2)return n.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
|
|
1983
|
-
`),2;let o=
|
|
1983
|
+
`),2;let o=de(i[0],"attention_id");if(typeof o=="string")return n.stderr.write(`error: ${o}
|
|
1984
1984
|
`),2;let a=i[1],l=qt(e,o);if(l===null)return n.stderr.write(`error: escalation not found: ${o}
|
|
1985
1985
|
`),1;let c=jn(e).find(m=>m.id===o);if(c===void 0)return n.stderr.write(`error: escalation not found: ${o}
|
|
1986
1986
|
`),1;if(c.kind==="workflow_escalation"){let m=e.resumeEscalation(o,a);if(!m.resumed)return n.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${o})
|
|
@@ -2133,11 +2133,11 @@ and \`lmctl api escalations\` (no args) print detailed usage.
|
|
|
2133
2133
|
and report the first step that would be started. Default output is the TTY
|
|
2134
2134
|
table; --json emits the structured WorkflowVerifyReport payload.`;xC=["open","assigned","closed","reopened"]});import Dy from"jexl";function Hr(e){Dy.compile(jy(e))}async function lr(e,t){return Dy.eval(jy(e),t)}function jy(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Zs=w(()=>{"use strict"});import{z as T}from"zod";function yu(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var qC,Py,fu,mu,pu,_u,hu,gu,Fy,BC,HC,XC,Qs,JC,ra,sa,ia,oa,aa,Uy,GC,KC,VC,YC,la,Xr=w(()=>{"use strict";Zs();qC=T.object({kind:T.enum(["success","neutral","failure"])}),Py=T.enum(["string","number","boolean","object","array"]),fu=T.object({name:T.string().min(1),type:Py,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),mu=T.object({name:T.string().min(1),type:Py,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),pu=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),_u="__failure__",hu=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),gu=T.object({on_unhandled_failure:T.object({attention_kind:T.string().min(1).default("workflow_failed"),severity:T.enum(["warn","error","critical"]).default("warn"),capture_evidence:T.boolean().default(!0),recommend_recovery:T.string().min(1).optional()}).optional(),on_unhandled_failure_state:T.string().min(1).optional()}).optional(),Fy=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),BC=T.object({name:T.string().min(1),command:T.string().min(1).optional(),args:T.array(T.string()).optional(),env:T.record(T.string(),T.string()).optional(),type:T.enum(["stdio","http","sse"]).optional(),url:T.string().min(1).optional(),headers:T.record(T.string(),T.string()).optional()}).strict(),HC=T.union([T.string().min(1),BC]),XC=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),Qs=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(HC).optional(),skills:T.array(XC).optional()}),JC=T.object({kind:T.literal("shell"),command:T.string().min(1),description:T.string().optional()}),ra=T.object({type:T.literal("Review"),state_name:T.string().min(1),coder:Qs,pre_checks:T.array(JC).optional(),reviewers:T.array(Qs.extend({rubric_artifact:T.string().optional()})).optional(),outcomes:T.object({approve:T.string().min(1),request_changes:T.string().optional(),fail_pre_check:T.string().optional(),max_loops_exceeded:T.string().optional()}),writes_to_project_path:T.boolean().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional(),max_loops:T.number().int().positive().default(5),loop_feedback_artifact:T.string().optional(),outcomes_from_stance:T.record(T.string(),T.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),sa=T.object({type:T.literal("Consolidate"),state_name:T.string().min(1),researchers:T.array(Qs.extend({topic:T.string().min(1)})).optional(),consolidator:Qs,outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),research_artifact_prefix:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),ia=T.object({type:T.literal("Interactive"),state_name:T.string().min(1),agent:Qs.extend({initial_prompt_template:T.string().min(1)}),termination:T.object({operator_signal:T.boolean().default(!0),agent_signal:T.string().optional(),max_turns:T.number().int().positive().default(20),timeout_seconds:T.number().int().positive().optional()}),outcomes:T.object({done:T.string().min(1),timeout:T.string().optional()}),artifact_name:T.string().optional(),durable_memory_tags:T.array(T.string().min(1)).optional(),write_back_durable_memory:T.union([T.boolean(),T.string().min(1)]).optional()}),oa=T.object({type:T.literal("Loop"),state_name:T.string().min(1),over:T.string().min(1),item_var:T.string().min(1),body:T.string().min(1),outcomes:T.object({ok:T.string().min(1),error:T.string().optional()}),stop_on_error:T.boolean().default(!0),max_items:T.number().int().positive().default(1e3)}),aa=T.object({type:T.literal("ShellStep"),state_name:T.string().min(1),command:T.string().min(1),outcomes_from_exit:T.record(T.string(),T.string().min(1)),timeout_ms:T.number().int().nonnegative().optional(),capture_output_to:T.string().optional(),writes_to_project_path:T.boolean().optional()}),Uy=T.object({type:T.literal("Choice"),state_name:T.string().min(1),branches:T.array(T.object({when:T.string().min(1),next:T.string().min(1)})).default([]),default_next:T.string().min(1).optional()}).superRefine((e,t)=>{for(let[n,r]of e.branches.entries())try{Hr(yu(r.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",n,"when"],message:`invalid jexl expression: ${i}`})}}),GC=T.discriminatedUnion("type",[Fy,ra,sa,ia,oa,aa,Uy]),KC=T.object({type:T.literal("ForEach"),state_name:T.string().min(1),items_from:T.string().min(1),mode:T.enum(["sequential","parallel"]).default("sequential"),max_concurrency:T.number().int().positive().default(1),on_item_failure:T.enum(["continue","stop"]).default("stop"),body:GC,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((e,t)=>{try{Hr(yu(e.items_from))}catch(n){let r=n instanceof Error?n.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${r}`})}}),VC=T.object({type:T.literal("Subflow"),state_name:T.string().min(1),workflow_name:T.string().min(1),inputs:T.record(T.string(),T.string().min(1)).optional(),outcomes:T.record(T.string(),T.string().min(1))}).superRefine((e,t)=>{for(let[n,r]of Object.entries(e.inputs??{}))try{Hr(yu(r))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",n],message:`invalid jexl expression: ${i}`})}}),YC=T.discriminatedUnion("type",[Fy,ra,sa,ia,oa,aa,Uy,KC,VC]),la=T.object({name:T.string().min(1),version:T.number().int().positive(),definition_schema_version:T.union([T.literal(1),T.literal(2)]),description:T.string().optional(),estimated_duration_ms:T.number().int().nonnegative().optional(),primitive_version:T.union([T.literal(1),T.literal(2)]).default(1),start_at:T.string().min(1),states:T.record(T.string().min(1),YC),terminals:T.record(T.string().min(1),qC),errors:gu,concurrency_key:T.string().min(1).optional(),concurrent_limit:T.number().int().positive().optional(),default_task_timeout_ms:T.number().int().positive().max(216e5).optional(),inputs:T.array(fu).optional(),outputs:T.array(mu).optional(),triggers:T.array(pu).optional(),read_only:T.boolean().optional(),requires:hu}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var zC,ca,ZC,QC,eM,Bt,Jr=w(()=>{"use strict";Xr();zC=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ca=Q.string().regex(zC),ZC=Q.object({step_id:ca,type:Q.literal("main"),index:Q.number().int().min(0)}),QC=Q.record(ca,Q.record(Q.string().min(1),Q.array(Q.array(ZC)))),eM=Q.object({id:ca,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),Bt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:gu,inputs:Q.array(fu).optional(),outputs:Q.array(mu).optional(),steps:Q.array(eM).min(1),connections:QC.default({}),entry_step_id:ca,triggers:Q.array(pu).optional(),read_only:Q.boolean().optional(),requires:hu}).superRefine((e,t)=>{let n=new Set;for(let[r,s]of e.steps.entries())n.has(s.id)&&t.addIssue({code:"custom",path:["steps",r,"id"],message:`duplicate step id: ${s.id}`}),n.add(s.id);n.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[r,s]of Object.entries(e.connections)){n.has(r)||t.addIssue({code:"custom",path:["connections",r],message:`connection source does not reference an existing step: ${r}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())n.has(d.step_id)||t.addIssue({code:"custom",path:["connections",r,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function da(e){return wu(e)}function wu(e){if(Array.isArray(e))return e.map(wu);if(e===null||typeof e!="object")return e;let t=e,n={};for(let r of Object.keys(t))n[r]=wu(t[r]);if(typeof n.type=="string"){let r=nM[n.type];r!==void 0&&(n.type=r)}return n}var Eu,tM,nM,Tu=w(()=>{"use strict";Eu="lmctl.builtin.",tM={Review:`${Eu}Review`,Research:`${Eu}Research`,Consolidate:`${Eu}Consolidate`},nM=Object.fromEntries(Object.entries(tM).map(([e,t])=>[t,e]))});import{readFileSync as rM}from"node:fs";function By(e){return sM(e)}function sM(e){let t=da(aM(e));if(oM(t),Hy(t)===3)return iM(t);let n=la.safeParse(t);if(!n.success)throw new dn({errors:n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let r=lM(n.data);if(r.errors.length>0||r.unresolvedRefs.length>0)throw new dn(r);return n.data}function iM(e){let t=Bt.safeParse(e);if(!t.success)throw new dn({errors:t.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message}))});return t.data}function oM(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=Hy(e);if(!(t===null||Wy.includes(t)))throw new dn({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${Wy.join(", ")}`}]})}function Hy(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function aM(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
|
|
2135
2135
|
`)||t.startsWith("{")||t.startsWith("[")?qy(e,"$"):t.endsWith(".json")?qy(rM(t,"utf8"),t):e}function qy(e,t){try{return JSON.parse(e)}catch(n){let r=n instanceof Error?n.message:"invalid JSON";throw new dn({errors:[{path:t,message:`invalid JSON: ${r}`}]})}}function lM(e){let t=[],n=[],r=new Set(Object.keys(e.states));r.has(e.start_at)||n.push({state:"$",ref:e.start_at,kind:"next"}),cM(e,r,n);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:n}}function cM(e,t,n){let r=e.errors?.on_unhandled_failure_state;r!==void 0&&(t.has(r)||n.push({state:"$",ref:r,kind:"next"}))}var Wy,dn,Xy=w(()=>{"use strict";Xr();Jr();Tu();Wy=[1,2,3],dn=class extends Error{errors;unresolvedRefs;constructor(t){super(t.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=t.errors??[],this.unresolvedRefs=t.unresolvedRefs??[]}}});import{createHash as dM}from"node:crypto";function Jy(e,t){let n=uM(t),r=dM("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${n}-${r}`}function uM(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var Gy=w(()=>{"use strict";Jr()});function pM(e,t){let n=mM[e]??[],r={},s={};for(let[i,o]of Object.entries(t))n.includes(i)?s[i]=o:r[i]=o;return{params:r,members:s}}function zy(e){let t=[],n=(N,A)=>{throw new Gr([{line:N,message:A}])},r=e.split(`
|
|
2136
|
-
`),s=[];for(let N=0;N<r.length;N+=1){let O=gM(r[N]).trim();O.length>0&&s.push({n:N+1,text:O})}s.length===0&&n(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??n(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,h=new Map,g=(N,A,O,X,q,j)=>{l.has(N)&&n(X,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||n(X,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:A,params:O,line:X,isTerminal:q,...j?{members:j}:{}}),d.push(N)},E=N=>{let A=[],O=N+1;for(;O<s.length;O+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(X===null)break;A.push({label:X[1],dst:X[2]})}return{branches:A,nextIdx:O-1}};for(let N=1;N<s.length;N+=1){let{n:A,text:O}=s[N],X=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){N!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),j=Fn(q[1],A,n);for(let ne of Object.keys(j))Vy.has(ne)||n(A,`unknown \`meta\` key \`${ne}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Vy].join(", ")} (no grammar inflation; bounded)`);m=j;continue}if(X==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),j=q[1],ne=q[2],Se=q[3],ue=Ky[ne];ue===void 0&&n(A,`unknown step type: ${ne} (supported \`step\` archetypes: ${Object.keys(Ky).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:xe,members:Qt}=pM(ue,Fn(Se,A,n));g(j,ue,xe,A,!1,Object.keys(Qt).length>0?Qt:void 0);continue}if(X==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),j=q[1],ne=q[2],Se=q[3],ue=Yy[ne];ue===void 0&&n(A,`unknown trigger type: ${ne} (registered trigger archetypes: ${Object.keys(Yy).join(", ")})`),p.has(j)&&n(A,`duplicate trigger id: ${j}`),p.set(j,{id:j,type:ue,parameters:Fn(Se,A,n)});continue}if(X==="mcp"||X==="skill"){let q=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??n(A,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${O}`),j=q[1],ne=q[2].trim(),Se=X==="mcp"?_:h;Se.has(j)&&n(A,`duplicate ${X} declaration: ${j}`);let ue;if(ne.startsWith("{")){let xe=Fn(ne,A,n);X==="mcp"?ue={...xe,name:j}:((typeof xe.content!="string"||xe.content.length===0)&&n(A,`\`skill ${j}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ue={name:j,content:xe.content})}else{let xe=Zy(ne);(typeof xe!="string"||xe.length===0)&&n(A,`\`${X} ${j}\`: string form must be a non-empty file path or http(s) URL`),ue=xe}Se.set(j,ue);continue}if(X==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);g(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},A,!0);continue}if(X==="seq"){let j=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ne=>ne.trim()).filter(ne=>ne.length>0);(j.length<3||j.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let ne=0;ne+2<j.length+1&&!(ne+2>j.length-1);ne+=2){let Se=j[ne],ue=j[ne+1],xe=j[ne+2],Qt=ue==="->"?"main":ue.slice(1,-2);c.push({srcDeclId:Se,port:Qt,dstDeclId:xe,line:A})}continue}if(X==="choice"){let j=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],ne=[],Se,ue=N+1;for(;ue<s.length;ue+=1){let xe=s[ue].text,Qt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(xe);if(Qt!==null){Se!==void 0&&n(s[ue].n,`\`choice ${j}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Ts=Qt[2];ne.push({when:Qt[1].trim(),next:`@terminal:${Ts}`}),c.push({srcDeclId:j,port:Ts,dstDeclId:Qt[3],line:s[ue].n});continue}let lc=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(xe);if(lc!==null){Se!==void 0&&n(s[ue].n,`\`choice ${j}\` has more than one \`default\``);let Ts=lc[1];Se=`@terminal:${Ts}`,c.push({srcDeclId:j,port:Ts,dstDeclId:lc[2],line:s[ue].n});continue}break}ne.length===0&&n(A,`\`choice ${j}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(j,"lmctl/choice",{branches:ne,...Se!==void 0?{default_next:Se}:{}},A,!1),N=ue-1;continue}if(X==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);g(q[1],"lmctl/loop",Fn(q[2],A,n),A,!1);continue}if(X==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),j=Fn(q[2],A,n);"mode"in j&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(q[1],"lmctl/foreach",j,A,!1);continue}if(X==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),j=q[1],ne=Fn(q[2],A,n),Se=ne.workflow;(typeof Se!="string"||Se.length===0)&&n(A,`\`call ${j}\` requires a \`workflow=<name>\` argument`);let{workflow:ue,...xe}=ne;g(j,"lmctl/subflow",{workflow_name:Se,...xe},A,!1),u.push({declId:j,target:Se,line:A});continue}if(X==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),j=q[1],ne=Fn(q[2],A,n),{branches:Se,nextIdx:ue}=E(N);Se.length===0&&n(A,`\`decide ${j}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(j,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:ne});for(let xe of Se)c.push({srcDeclId:j,port:xe.label,dstDeclId:xe.dst,line:A});N=ue;continue}if(X==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}n(A,`unknown statement \`${X}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let y=N=>{if(Array.isArray(N)){for(let O of N)y(O);return}if(typeof N!="object"||N===null)return;let A=N;if(typeof A.alias=="string")for(let[O,X]of[["mcp",_],["skills",h]]){let q=A[O];Array.isArray(q)&&(A[O]=q.map(j=>typeof j=="string"&&X.has(j)?structuredClone(X.get(j)):j))}for(let O of Object.values(A))y(O)};for(let N of d){let A=l.get(N);A.members!==void 0&&y(A.members)}let b=N=>Jy(o,N),S=d.map(N=>{let A=l.get(N);return{id:b(N),name:N,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),k={};for(let N of c){l.has(N.srcDeclId)||n(N.line,`edge source references undeclared step: ${N.srcDeclId}`),l.has(N.dstDeclId)||n(N.line,`dangling edge target: ${N.dstDeclId} is not declared`),l.get(N.srcDeclId).isTerminal&&n(N.line,`terminal \`${N.srcDeclId}\` cannot have an outgoing edge`);let A=b(N.srcDeclId);k[A]??={},k[A][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),k[A][N.port]=[[{step_id:b(N.dstDeclId),type:"main",index:0}]]}for(let N of d){let A=l.get(N);_M.has(A.type)||n(A.line,`unknown archetype \`${A.type}\` for step \`${N}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let N of u)N.target===o&&n(N.line,`subflow cycle: \`call ${N.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let F=new Map;for(let N of c){let A=F.get(N.srcDeclId);A===void 0?F.set(N.srcDeclId,[N.dstDeclId]):A.push(N.dstDeclId)}for(let N of d){let A=l.get(N);if(A.type!=="lmctl/loop")continue;let O=A.params.body;if(typeof O=="string"&&l.has(O)){let X=F.get(N);X===void 0?F.set(N,[O]):X.push(O)}}let P=new Set([f]),D=[f];for(;D.length>0;){let N=D.shift();for(let A of F.get(N)??[])P.has(A)||(P.add(A),D.push(A))}for(let N of d)P.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let U=new Map;for(let N of c){let A=U.get(N.srcDeclId);A===void 0&&(A=new Set,U.set(N.srcDeclId,A)),A.add(N.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of d){let A=l.get(N);if(A.isTerminal)continue;let O=U.get(N)??new Set;if(A.type==="lmctl/review"){let q=[...O].some(j=>!x.has(j));!O.has("approve")&&!q&&n(A.line,`uncovered outcome: review step \`${N}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${N} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let X=hM[A.type];if(X!==void 0)for(let q of X)O.has(q)||n(A.line,`uncovered outcome: required outcome \`${q}\` of step \`${N}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${N} -${q}-> <target|terminal>\`)`);else O.size===0&&n(A.line,`uncovered outcome: non-terminal step \`${N}\` (\`${A.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let N of d){let A=l.get(N),O=fM[A.type];if(O===void 0)continue;let X={...A.params,...A.members??{},type:O.v2type,state_name:N,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},q=O.schema.safeParse(X);if(!q.success){let j=q.error.issues[0],ne=j.path.length===0?"$":j.path.map(String).join(".");n(A.line,`step \`${N}\` (\`${A.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${ne}\`: ${j.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${N} = ${A.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:S,connections:k,entry_step_id:b(f)},J=Bt.safeParse(H);if(!J.success)throw new Gr(J.error.issues.map(N=>({line:s[0].n,message:`emitted V3 invalid at ${N.path.length===0?"$":N.path.map(String).join(".")}: ${N.message}`})));return J.data}function gM(e){let t=null;for(let n=0;n<e.length;n+=1){let r=e[n];if(t!==null){if(r==="\\"){n+=1;continue}r===t&&(t=null);continue}if(r==='"'||r==="'"){t=r;continue}if(r==="#")return e.slice(0,n)}return e}function Fn(e,t,n){let r=e.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(t,"structured args must be a JSON object"),i}let s={};for(let i of yM(r)){let o=i.indexOf("=");o===-1&&n(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||n(t,`invalid arg name: ${a}`),s[a]=Zy(l)}return s}function yM(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function Zy(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var fM,mM,Ky,Gr,_M,hM,Vy,Yy,Qy=w(()=>{"use strict";Jr();Gy();Xr();fM={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:ra},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:sa},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:ia},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:oa},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:aa}},mM={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Ky={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},Gr=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
|
|
2136
|
+
`),s=[];for(let N=0;N<r.length;N+=1){let O=gM(r[N]).trim();O.length>0&&s.push({n:N+1,text:O})}s.length===0&&n(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??n(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,h=new Map,g=(N,A,O,X,q,j)=>{l.has(N)&&n(X,`duplicate step/terminal id: ${N}`),/^[A-Za-z][\w-]*$/.test(N)||n(X,`invalid id (must start with a letter): ${N}`),l.set(N,{declId:N,type:A,params:O,line:X,isTerminal:q,...j?{members:j}:{}}),d.push(N)},E=N=>{let A=[],O=N+1;for(;O<s.length;O+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(X===null)break;A.push({label:X[1],dst:X[2]})}return{branches:A,nextIdx:O-1}};for(let N=1;N<s.length;N+=1){let{n:A,text:O}=s[N],X=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){N!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let q=/^meta\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),j=Fn(q[1],A,n);for(let ne of Object.keys(j))Vy.has(ne)||n(A,`unknown \`meta\` key \`${ne}\` \u2014 only workflow-level runtime metadata is allowed: ${[...Vy].join(", ")} (no grammar inflation; bounded)`);m=j;continue}if(X==="step"){let q=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),j=q[1],ne=q[2],Se=q[3],fe=Ky[ne];fe===void 0&&n(A,`unknown step type: ${ne} (supported \`step\` archetypes: ${Object.keys(Ky).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:xe,members:Qt}=pM(fe,Fn(Se,A,n));g(j,fe,xe,A,!1,Object.keys(Qt).length>0?Qt:void 0);continue}if(X==="trigger"){let q=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),j=q[1],ne=q[2],Se=q[3],fe=Yy[ne];fe===void 0&&n(A,`unknown trigger type: ${ne} (registered trigger archetypes: ${Object.keys(Yy).join(", ")})`),p.has(j)&&n(A,`duplicate trigger id: ${j}`),p.set(j,{id:j,type:fe,parameters:Fn(Se,A,n)});continue}if(X==="mcp"||X==="skill"){let q=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??n(A,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${O}`),j=q[1],ne=q[2].trim(),Se=X==="mcp"?_:h;Se.has(j)&&n(A,`duplicate ${X} declaration: ${j}`);let fe;if(ne.startsWith("{")){let xe=Fn(ne,A,n);X==="mcp"?fe={...xe,name:j}:((typeof xe.content!="string"||xe.content.length===0)&&n(A,`\`skill ${j}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),fe={name:j,content:xe.content})}else{let xe=Zy(ne);(typeof xe!="string"||xe.length===0)&&n(A,`\`${X} ${j}\`: string form must be a non-empty file path or http(s) URL`),fe=xe}Se.set(j,fe);continue}if(X==="terminal"){let q=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);g(q[1],"lmctl/terminal",{name:q[2],kind:q[3]??"neutral"},A,!0);continue}if(X==="seq"){let j=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ne=>ne.trim()).filter(ne=>ne.length>0);(j.length<3||j.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let ne=0;ne+2<j.length+1&&!(ne+2>j.length-1);ne+=2){let Se=j[ne],fe=j[ne+1],xe=j[ne+2],Qt=fe==="->"?"main":fe.slice(1,-2);c.push({srcDeclId:Se,port:Qt,dstDeclId:xe,line:A})}continue}if(X==="choice"){let j=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],ne=[],Se,fe=N+1;for(;fe<s.length;fe+=1){let xe=s[fe].text,Qt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(xe);if(Qt!==null){Se!==void 0&&n(s[fe].n,`\`choice ${j}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Ts=Qt[2];ne.push({when:Qt[1].trim(),next:`@terminal:${Ts}`}),c.push({srcDeclId:j,port:Ts,dstDeclId:Qt[3],line:s[fe].n});continue}let lc=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(xe);if(lc!==null){Se!==void 0&&n(s[fe].n,`\`choice ${j}\` has more than one \`default\``);let Ts=lc[1];Se=`@terminal:${Ts}`,c.push({srcDeclId:j,port:Ts,dstDeclId:lc[2],line:s[fe].n});continue}break}ne.length===0&&n(A,`\`choice ${j}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),g(j,"lmctl/choice",{branches:ne,...Se!==void 0?{default_next:Se}:{}},A,!1),N=fe-1;continue}if(X==="loop"){let q=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);g(q[1],"lmctl/loop",Fn(q[2],A,n),A,!1);continue}if(X==="foreach"){let q=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),j=Fn(q[2],A,n);"mode"in j&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),g(q[1],"lmctl/foreach",j,A,!1);continue}if(X==="call"){let q=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),j=q[1],ne=Fn(q[2],A,n),Se=ne.workflow;(typeof Se!="string"||Se.length===0)&&n(A,`\`call ${j}\` requires a \`workflow=<name>\` argument`);let{workflow:fe,...xe}=ne;g(j,"lmctl/subflow",{workflow_name:Se,...xe},A,!1),u.push({declId:j,target:Se,line:A});continue}if(X==="decide"){let q=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),j=q[1],ne=Fn(q[2],A,n),{branches:Se,nextIdx:fe}=E(N);Se.length===0&&n(A,`\`decide ${j}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),g(j,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:ne});for(let xe of Se)c.push({srcDeclId:j,port:xe.label,dstDeclId:xe.dst,line:A});N=fe;continue}if(X==="entry"){let q=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=q[1];continue}n(A,`unknown statement \`${X}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let y=N=>{if(Array.isArray(N)){for(let O of N)y(O);return}if(typeof N!="object"||N===null)return;let A=N;if(typeof A.alias=="string")for(let[O,X]of[["mcp",_],["skills",h]]){let q=A[O];Array.isArray(q)&&(A[O]=q.map(j=>typeof j=="string"&&X.has(j)?structuredClone(X.get(j)):j))}for(let O of Object.values(A))y(O)};for(let N of d){let A=l.get(N);A.members!==void 0&&y(A.members)}let b=N=>Jy(o,N),S=d.map(N=>{let A=l.get(N);return{id:b(N),name:N,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),k={};for(let N of c){l.has(N.srcDeclId)||n(N.line,`edge source references undeclared step: ${N.srcDeclId}`),l.has(N.dstDeclId)||n(N.line,`dangling edge target: ${N.dstDeclId} is not declared`),l.get(N.srcDeclId).isTerminal&&n(N.line,`terminal \`${N.srcDeclId}\` cannot have an outgoing edge`);let A=b(N.srcDeclId);k[A]??={},k[A][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),k[A][N.port]=[[{step_id:b(N.dstDeclId),type:"main",index:0}]]}for(let N of d){let A=l.get(N);_M.has(A.type)||n(A.line,`unknown archetype \`${A.type}\` for step \`${N}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let N of u)N.target===o&&n(N.line,`subflow cycle: \`call ${N.declId}\` invokes this workflow (\`${o}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let F=new Map;for(let N of c){let A=F.get(N.srcDeclId);A===void 0?F.set(N.srcDeclId,[N.dstDeclId]):A.push(N.dstDeclId)}for(let N of d){let A=l.get(N);if(A.type!=="lmctl/loop")continue;let O=A.params.body;if(typeof O=="string"&&l.has(O)){let X=F.get(N);X===void 0?F.set(N,[O]):X.push(O)}}let P=new Set([f]),D=[f];for(;D.length>0;){let N=D.shift();for(let A of F.get(N)??[])P.has(A)||(P.add(A),D.push(A))}for(let N of d)P.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let U=new Map;for(let N of c){let A=U.get(N.srcDeclId);A===void 0&&(A=new Set,U.set(N.srcDeclId,A)),A.add(N.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of d){let A=l.get(N);if(A.isTerminal)continue;let O=U.get(N)??new Set;if(A.type==="lmctl/review"){let q=[...O].some(j=>!x.has(j));!O.has("approve")&&!q&&n(A.line,`uncovered outcome: review step \`${N}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${N} -approve-> <target>\`) or a stance port (run.ts:423-438 synthesizes outcomes_from_stance; review.ts:88-102 routes a stance before default approve)`);continue}let X=hM[A.type];if(X!==void 0)for(let q of X)O.has(q)||n(A.line,`uncovered outcome: required outcome \`${q}\` of step \`${N}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${N} -${q}-> <target|terminal>\`)`);else O.size===0&&n(A.line,`uncovered outcome: non-terminal step \`${N}\` (\`${A.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let N of d){let A=l.get(N),O=fM[A.type];if(O===void 0)continue;let X={...A.params,...A.members??{},type:O.v2type,state_name:N,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},q=O.schema.safeParse(X);if(!q.success){let j=q.error.issues[0],ne=j.path.length===0?"$":j.path.map(String).join(".");n(A.line,`step \`${N}\` (\`${A.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${ne}\`: ${j.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${N} = ${A.type.replace("lmctl/","")}({ ... })\``)}}let H={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:S,connections:k,entry_step_id:b(f)},J=Bt.safeParse(H);if(!J.success)throw new Gr(J.error.issues.map(N=>({line:s[0].n,message:`emitted V3 invalid at ${N.path.length===0?"$":N.path.map(String).join(".")}: ${N.message}`})));return J.data}function gM(e){let t=null;for(let n=0;n<e.length;n+=1){let r=e[n];if(t!==null){if(r==="\\"){n+=1;continue}r===t&&(t=null);continue}if(r==='"'||r==="'"){t=r;continue}if(r==="#")return e.slice(0,n)}return e}function Fn(e,t,n){let r=e.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(t,"structured args must be a JSON object"),i}let s={};for(let i of yM(r)){let o=i.indexOf("=");o===-1&&n(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||n(t,`invalid arg name: ${a}`),s[a]=Zy(l)}return s}function yM(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function Zy(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var fM,mM,Ky,Gr,_M,hM,Vy,Yy,Qy=w(()=>{"use strict";Jr();Gy();Xr();fM={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:ra},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:sa},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:ia},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:oa},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:aa}},mM={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Ky={review:"lmctl/review",consolidate:"lmctl/consolidate",interactive:"lmctl/interactive","shell-step":"lmctl/shell-step","assert-repo-clean":"lmctl/assert-repo-clean","render-docx":"lmctl/render-docx","render-xlsx":"lmctl/render-xlsx"},Gr=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
|
|
2137
2137
|
${t.map(n=>` line ${n.line}: ${n.message}`).join(`
|
|
2138
2138
|
`)}`),this.issues=t,this.name="DslCompileError"}},_M=new Set(["lmctl/assert-repo-clean","lmctl/review","lmctl/consolidate","lmctl/interactive","lmctl/loop","lmctl/render-docx","lmctl/render-xlsx","lmctl/shell-step","lmctl/choice","lmctl/foreach","lmctl/subflow","lmctl/terminal","lmctl/trigger-schedule","lmctl/trigger-gh-issue"]),hM={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},Vy=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Yy={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as EM}from"node:fs";function wM(){let e=process.env.LMCTL_DSL;return e===void 0?!0:!["0","false","off"].includes(e.trim().toLowerCase())}function TM(e){for(let t of e.split(`
|
|
2139
2139
|
`)){let n=t.replace(/#.*/,"").trim();if(n.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(n)}return!1}function bt(e){if(typeof e=="string"&&wM()&&TM(e)){let n;try{n=zy(e)}catch(s){throw s instanceof Gr?new un(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let r=Bt.safeParse(n);if(!r.success)throw new un(r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return r.data}let t=da(bM(e));if(SM(t)&&t.definition_schema_version===3){let n=Bt.safeParse(t);if(!n.success)throw new un(n.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message})));return n.data}return vM(t)}function vM(e){let t=la.safeParse(e);if(!t.success)throw new un(t.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let n=t.data,r=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(n.states))if(r.has(i.type))throw new un([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return By(n)}catch(s){throw s instanceof dn?new vu(s):s}}function bM(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
|
|
2140
|
-
`)||t.startsWith("{")||t.startsWith("[")?eE(e):t.endsWith(".json")?eE(EM(t,"utf8")):e}function eE(e){return JSON.parse(e)}function SM(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var vu,un,ei=w(()=>{"use strict";Xr();Xy();Tu();Jr();Qy();vu=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},un=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function ua(e){let t=e.workflow?.concurrent_limit??1,n=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return n===null||n.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:kM(n,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:NM(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function kM(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(n,r)=>{let s=IM(t,r.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function IM(e,t){let n=e;for(let r of t.split(".")){if(typeof n!="object"||n===null||!Object.prototype.hasOwnProperty.call(n,r))return;n=n[r]}return n}function NM(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var bu=w(()=>{"use strict"});var tE={};fe(tE,{enqueueFromAgentOutput:()=>AM,enqueueFromGitHubIssue:()=>Su,enqueueManual:()=>xM,enqueueScheduled:()=>RM});function Su(e,t){return ma(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:fa(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function xM(e,t){return ma(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:fa(t.payload),concurrency_key:t.concurrency_key})}function AM(e,t){let n=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return ma(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:n,dedupe_key:n,available_at:t.available_at,payload:fa(t.payload),concurrency_key:t.concurrency_key})}function RM(e,t){return ma(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:fa(t.payload),concurrency_key:t.concurrency_key})}function fa(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function ma(e,t){let n=t.concurrency_key;if(n!==void 0)return e.enqueueJob({...t,concurrency_key:n});let r=e.getProject(t.project_id),s=r===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name);if(r===null||s===null)return e.enqueueJob(t);try{let i=bt(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=ua({workflow:i,job:o,project:r});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var ku=w(()=>{"use strict";ei();bu()});async function rE(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return nE(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let n={event:{kind:"github_issue",issue:e.issue}},r=[],s=0;for(let i of t){if(!await LM(i.condition,n))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...OM(i.parameters_override)},l=nE(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);r.push(...l.jobs),s+=l.new_jobs}return{jobs:r,new_jobs:s}}function nE(e,t,n,r,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",r);return{jobs:[Su(e,{project_id:t,issue_url:n.url,payload:i,workflow_id_override:s,dedupe_key:r,priority:o})],new_jobs:a===null?1:0}}async function LM(e,t){if(e===null||e.trim().length===0)return!0;try{return await lr(e,t)===!0}catch{return!1}}function OM(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var sE=w(()=>{"use strict";Zs();ku()});import{spawnSync as $M}from"node:child_process";async function CM(e){let t=e.labels??["bug"],n=e.state??"open",r=["issue","list","--repo",e.project.name,"--state",n,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&r.splice(4,0,"--label",t.join(","));let s=$M(e.binary??"gh",r,{encoding:"utf8",timeout:e.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!DM(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await rE({dal:e.dal,project:e.project,issue:jM(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function pa(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let n of e.listProjectsWithIntakeEnabled()){let r=MM(n.intake_config);try{let s=await CM({dal:e,project:n,labels:r.labels,state:r.state});t.push({project_id:n.id,project_name:n.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:n.id,project_name:n.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:n.id,payload:JSON.stringify({project_id:n.id,project_name:n.name,error:i})})}catch{}}}return t}function MM(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Iu(t))return{};let n=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,r=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:r,state:n}}catch{return{}}}function DM(e){return Array.isArray(e)&&e.every(t=>{if(!Iu(t))return!1;let n=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(n===void 0||Array.isArray(n)&&n.every(r=>typeof r=="string"?!0:Iu(r)&&typeof r.name=="string"))})}function jM(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:n,...r}=e;return t===void 0?r:{...r,labels:t}}function Iu(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Nu=w(()=>{"use strict";sE()});function oE(e){return async t=>FM(e.app,t,e.log!==void 0?{log:e.log}:{})}async function FM(e,t,n={}){let r=UM(t.path),s={"content-type":"application/json",...t.headers??{},[_a]:xu},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(r,i),a=Date.now();try{let l=await e.fetch(o),c=await WM(l);if(n.log!==void 0){let d=Date.now()-a;n.log(`[mailbox-dispatch] ${t.method} ${iE(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(n.log!==void 0){let c=Date.now()-a;n.log(`[mailbox-dispatch] ${t.method} ${iE(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function iE(e){let t=e.startsWith("/")?e:`/${e}`,n=t.search(/[?#]/);return n===-1?t:t.slice(0,n)}function UM(e){let t=e.startsWith("/")?e:`/${e}`;return`${PM}${t}`}async function WM(e){let t=await e.text(),n;if(t==="")n=void 0;else try{n=JSON.parse(t)}catch{n=t}let r={};e.headers.forEach((i,o)=>{o.toLowerCase()!==_a&&(r[o]=i)});let s={status:e.status};return Object.keys(r).length>0&&(s.headers=r),n!==void 0&&(s.body=n),s}var _a,xu,PM,Au=w(()=>{"use strict";_a="x-mailbox-channel",xu="1",PM="http://mailbox.local"});import{createHash as aE,createHmac as qM,timingSafeEqual as BM}from"node:crypto";function lE(e={}){return async(t,n)=>{if(e.disabled===!0){await n();return}let r=cE();if(r===null||KM(t.req.path)){await n();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(_a)===xu){await n();return}let s=t.req.query("token");if(s!==void 0&&ha(s,r)){Lu(t,r),await n();return}if(GM(t,r)){await n();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function cE(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function dE(e){let t=cE();return t!==null&&ha(e,t)}function Lu(e,t,n=new Date){e.header("Set-Cookie",`${Ru}=${XM(t,n)}; Path=/; HttpOnly; SameSite=Lax`)}function uE(e){e.header("Set-Cookie",`${Ru}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function XM(e,t=new Date){let r=`auth=ok|${new Date(t.getTime()+HM*24*60*60*1e3).toISOString()}`;return Buffer.from(`${r}|${fE(e,r)}`,"utf8").toString("base64url")}function JM(e,t,n=new Date){let r;try{r=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=r.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=n.getTime()?!1:ha(s[2],fE(t,`${s[0]}|${s[1]}`))}function ha(e,t){return BM(aE("sha256").update(e).digest(),aE("sha256").update(t).digest())}function GM(e,t){let n=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(n!==void 0&&ha(n,t))return!0;let r=VM(e.req.header("cookie")??"")[Ru];return r!==void 0&&JM(r,t)}function KM(e){return e==="/login"||e==="/logout"}function VM(e){let t={};for(let n of e.split(";")){let[r,...s]=n.trim().split("=");r===void 0||r.length===0||s.length===0||(t[r]=s.join("="))}return t}function fE(e,t){return qM("sha256",e).update(t).digest("hex")}var Ru,HM,mE=w(()=>{"use strict";Au();Ru="lmctl_next_session",HM=30});import{existsSync as Kr,mkdirSync as YM,readdirSync as zM,readFileSync as ga,unlinkSync as ZM,writeFileSync as Cu}from"node:fs";import{join as cr}from"node:path";function ft(e){if(!QM.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function _E(e,t){let n=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(n===null)return null;let r=n[1],s=n[2].trimStart(),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return rD(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:pE,updated_at:pE}:null}function eD(e,t,n,r){let s=n!==null?`
|
|
2140
|
+
`)||t.startsWith("{")||t.startsWith("[")?eE(e):t.endsWith(".json")?eE(EM(t,"utf8")):e}function eE(e){return JSON.parse(e)}function SM(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var vu,un,ei=w(()=>{"use strict";Xr();Xy();Tu();Jr();Qy();vu=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},un=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function ua(e){let t=e.workflow?.concurrent_limit??1,n=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return n===null||n.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:kM(n,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:NM(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function kM(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(n,r)=>{let s=IM(t,r.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function IM(e,t){let n=e;for(let r of t.split(".")){if(typeof n!="object"||n===null||!Object.prototype.hasOwnProperty.call(n,r))return;n=n[r]}return n}function NM(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var bu=w(()=>{"use strict"});var tE={};me(tE,{enqueueFromAgentOutput:()=>AM,enqueueFromGitHubIssue:()=>Su,enqueueManual:()=>xM,enqueueScheduled:()=>RM});function Su(e,t){return ma(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:fa(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function xM(e,t){return ma(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:fa(t.payload),concurrency_key:t.concurrency_key})}function AM(e,t){let n=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return ma(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:n,dedupe_key:n,available_at:t.available_at,payload:fa(t.payload),concurrency_key:t.concurrency_key})}function RM(e,t){return ma(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:fa(t.payload),concurrency_key:t.concurrency_key})}function fa(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function ma(e,t){let n=t.concurrency_key;if(n!==void 0)return e.enqueueJob({...t,concurrency_key:n});let r=e.getProject(t.project_id),s=r===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name);if(r===null||s===null)return e.enqueueJob(t);try{let i=bt(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=ua({workflow:i,job:o,project:r});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var ku=w(()=>{"use strict";ei();bu()});async function rE(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return nE(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let n={event:{kind:"github_issue",issue:e.issue}},r=[],s=0;for(let i of t){if(!await LM(i.condition,n))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...OM(i.parameters_override)},l=nE(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);r.push(...l.jobs),s+=l.new_jobs}return{jobs:r,new_jobs:s}}function nE(e,t,n,r,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",r);return{jobs:[Su(e,{project_id:t,issue_url:n.url,payload:i,workflow_id_override:s,dedupe_key:r,priority:o})],new_jobs:a===null?1:0}}async function LM(e,t){if(e===null||e.trim().length===0)return!0;try{return await lr(e,t)===!0}catch{return!1}}function OM(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var sE=w(()=>{"use strict";Zs();ku()});import{spawnSync as $M}from"node:child_process";async function CM(e){let t=e.labels??["bug"],n=e.state??"open",r=["issue","list","--repo",e.project.name,"--state",n,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&r.splice(4,0,"--label",t.join(","));let s=$M(e.binary??"gh",r,{encoding:"utf8",timeout:e.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!DM(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await rE({dal:e.dal,project:e.project,issue:jM(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function pa(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let n of e.listProjectsWithIntakeEnabled()){let r=MM(n.intake_config);try{let s=await CM({dal:e,project:n,labels:r.labels,state:r.state});t.push({project_id:n.id,project_name:n.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:n.id,project_name:n.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:n.id,payload:JSON.stringify({project_id:n.id,project_name:n.name,error:i})})}catch{}}}return t}function MM(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Iu(t))return{};let n=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,r=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:r,state:n}}catch{return{}}}function DM(e){return Array.isArray(e)&&e.every(t=>{if(!Iu(t))return!1;let n=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(n===void 0||Array.isArray(n)&&n.every(r=>typeof r=="string"?!0:Iu(r)&&typeof r.name=="string"))})}function jM(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:n,...r}=e;return t===void 0?r:{...r,labels:t}}function Iu(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Nu=w(()=>{"use strict";sE()});function oE(e){return async t=>FM(e.app,t,e.log!==void 0?{log:e.log}:{})}async function FM(e,t,n={}){let r=UM(t.path),s={"content-type":"application/json",...t.headers??{},[_a]:xu},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(r,i),a=Date.now();try{let l=await e.fetch(o),c=await WM(l);if(n.log!==void 0){let d=Date.now()-a;n.log(`[mailbox-dispatch] ${t.method} ${iE(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(n.log!==void 0){let c=Date.now()-a;n.log(`[mailbox-dispatch] ${t.method} ${iE(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function iE(e){let t=e.startsWith("/")?e:`/${e}`,n=t.search(/[?#]/);return n===-1?t:t.slice(0,n)}function UM(e){let t=e.startsWith("/")?e:`/${e}`;return`${PM}${t}`}async function WM(e){let t=await e.text(),n;if(t==="")n=void 0;else try{n=JSON.parse(t)}catch{n=t}let r={};e.headers.forEach((i,o)=>{o.toLowerCase()!==_a&&(r[o]=i)});let s={status:e.status};return Object.keys(r).length>0&&(s.headers=r),n!==void 0&&(s.body=n),s}var _a,xu,PM,Au=w(()=>{"use strict";_a="x-mailbox-channel",xu="1",PM="http://mailbox.local"});import{createHash as aE,createHmac as qM,timingSafeEqual as BM}from"node:crypto";function lE(e={}){return async(t,n)=>{if(e.disabled===!0){await n();return}let r=cE();if(r===null||KM(t.req.path)){await n();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(_a)===xu){await n();return}let s=t.req.query("token");if(s!==void 0&&ha(s,r)){Lu(t,r),await n();return}if(GM(t,r)){await n();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function cE(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function dE(e){let t=cE();return t!==null&&ha(e,t)}function Lu(e,t,n=new Date){e.header("Set-Cookie",`${Ru}=${XM(t,n)}; Path=/; HttpOnly; SameSite=Lax`)}function uE(e){e.header("Set-Cookie",`${Ru}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function XM(e,t=new Date){let r=`auth=ok|${new Date(t.getTime()+HM*24*60*60*1e3).toISOString()}`;return Buffer.from(`${r}|${fE(e,r)}`,"utf8").toString("base64url")}function JM(e,t,n=new Date){let r;try{r=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=r.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=n.getTime()?!1:ha(s[2],fE(t,`${s[0]}|${s[1]}`))}function ha(e,t){return BM(aE("sha256").update(e).digest(),aE("sha256").update(t).digest())}function GM(e,t){let n=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(n!==void 0&&ha(n,t))return!0;let r=VM(e.req.header("cookie")??"")[Ru];return r!==void 0&&JM(r,t)}function KM(e){return e==="/login"||e==="/logout"}function VM(e){let t={};for(let n of e.split(";")){let[r,...s]=n.trim().split("=");r===void 0||r.length===0||s.length===0||(t[r]=s.join("="))}return t}function fE(e,t){return qM("sha256",e).update(t).digest("hex")}var Ru,HM,mE=w(()=>{"use strict";Au();Ru="lmctl_next_session",HM=30});import{existsSync as Kr,mkdirSync as YM,readdirSync as zM,readFileSync as ga,unlinkSync as ZM,writeFileSync as Cu}from"node:fs";import{join as cr}from"node:path";function ft(e){if(!QM.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function _E(e,t){let n=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(n===null)return null;let r=n[1],s=n[2].trimStart(),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return rD(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:pE,updated_at:pE}:null}function eD(e,t,n,r){let s=n!==null?`
|
|
2141
2141
|
description: ${n}`:"";return`---
|
|
2142
2142
|
name: ${e}${s}
|
|
2143
2143
|
type: ${t}
|
|
@@ -2228,7 +2228,7 @@ ${s}`;uD(e,o,"utf8")}function pD(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
|
|
|
2228
2228
|
`);try{let p=await ci({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let h=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,h),{outcome:null,text:"",status_detail:h}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=oi(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof Re?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function zr(e,t){return(t?.length??0)>0?qE(e.project.local_path,t):null}function rw(e){return Ku(Vu(e))}function zu(e,t){let n=e.dal.query(`SELECT state_name, outcome FROM step
|
|
2229
2229
|
WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
|
|
2230
2230
|
ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(n.length===0)return!1;let r=n[0];return e.workflow.states[r.state_name]?.type==="Interactive"&&r.outcome==="done"}function Zu(e,t){if(!ZE(e))return!1;let n=Na(e,"durable-memory");function r(s){let i;try{i=QE(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=Na(s,o.name);if(a!==n)if(o.isDirectory()){if(r(a))return!0}else try{if(ew(a).mtime>t)return!0}catch{}}return!1}return r(e)}function aj(e,t,n){let r=Na(e.local_path,"durable-memory");if(!ZE(r))return;let s;try{s=QE(r)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=Na(r,i),a;try{a=ew(o).mtime}catch{continue}if(a<=n)continue;let l;try{l=rj(o,"utf8")}catch{continue}let c=cj(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
|
|
2231
|
-
`)
|
|
2231
|
+
`),$({event:"durable_memory_frontmatter_invalid",project_id:e.id,file:i,path:o});continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function cj(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let n=t[1],r=t[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!lj.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}var li,lj,nt=w(()=>{"use strict";dt();Xr();Po();BE();Gu();$s();GE();ce();KE();ai();li="__paused__:";lj=new Set(["user","feedback","project","reference"])});import{spawnSync as sw}from"node:child_process";function dj(e,t){let n=e.stateId,r=e.displayName,s=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1;let i=e.project.local_path,o=sw("git",["diff","--quiet"],{cwd:i}).status!==0,a=sw("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),Z(e,n,r,_u),{kind:"terminal",terminal:ee(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),Z(e,n,r,"clean"),V(e.workflow,t.next)}var iw,ow=w(()=>{"use strict";nt();iw={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:e=>dj(e,e.state)}});async function uj(e,t){let n=e.stateId,r=e.displayName,s=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1;for(let i of t.branches)if(await VE(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),Z(e,n,r,"matched"),V(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),Z(e,n,r,"no_match"),t.default_next!==void 0?V(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":ee(e.workflow)}}var aw,lw=w(()=>{"use strict";nt();ai();aw={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async e=>uj(e,e.state)}});async function fj(e,t){let n=e.stateId,r=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=zr(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${r}:researcher_${m.alias}[${p}]`,h=await Yr(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);h.text.length>0&&(a[p]=h.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
|
|
2232
2232
|
${m}`:null).filter(m=>m!==null).join(`
|
|
2233
2233
|
|
|
2234
2234
|
`),c=`${r}:consolidator`,d=await Yr(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=K(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&Z(e,n,r,"error");let m=t.outcomes.error;return m!==void 0?V(e.workflow,m):{kind:"terminal",terminal:ee(e.workflow)}}let f=t.research_artifact_prefix??r;if(e.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),e.dal.finishStep(u.id,"ok","consolidated"),Z(e,n,r,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await fn(e,r,m,t.write_back_durable_memory)}return V(e.workflow,t.outcomes.ok)}var cw,dw=w(()=>{"use strict";nt();cw={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>fj(e,e.state)}});async function mj(e,t){let n=e.stateId,r=e.displayName,s=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1;let i=e.progress_step_id;e.progress_step_id=s.id;try{let o=await ka(t.items_from,e),a=gj(o);if(a===null){e.dal.finishStep(s.id,null,`foreach_invalid_items:${t.items_from}`);let f=t.outcomes.any_failed;return f!==void 0?V(e.workflow,f):{kind:"terminal",terminal:ee(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await _j(e,t,s.id,a,l):await pj(e,t,s.id,a,l);if(l.routed!==null)return e.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(e.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),Z(e,n,r,u),d){let f=t.outcomes.any_failed;return f!==void 0?V(e.workflow,f):{kind:"terminal",terminal:ee(e.workflow)}}return V(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function pj(e,t,n,r,s){let i=[];for(let o=0;o<r.length;o+=1){let a=await fw(e,t,n,r[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&t.on_item_failure==="stop"))break}return i}async function _j(e,t,n,r,s){let i=new Array(r.length),o=0,a=Array.from({length:Math.min(t.max_concurrency,r.length)},async()=>{for(;o<r.length&&s.routed===null;){let l=o;o+=1,i[l]=await fw(e,t,n,r[l],l,s)}});return await Promise.all(a),i}async function fw(e,t,n,r,s,i){let o=e.iteration;e.iteration={item:r,index:s};let a=`${e.displayName}[${s}]`;e.emit_progress?.({kind:"item_started",data:{index:s,item:r}});let l;try{l=await e.dispatchState(a,t.body,{parent_step_id:n,iteration:{item:r,index:s}})}finally{e.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&e.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":hj(e.outcomes[a]);return e.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:r,outcome:d}}),{index:s,value:r,outcome:d}}function hj(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function gj(e){if(!Array.isArray(e))return null;let t=[];for(let n of e)if(typeof n=="string")t.push(n);else if(typeof n=="number"||typeof n=="boolean")t.push(String(n));else return null;return t}var uw,mw=w(()=>{"use strict";nt();ai();uw={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>mj(e,e.state)}});async function yj(e,t){let n=e.stateId,r=e.displayName,s=t.termination.timeout_seconds!==void 0?t.termination.timeout_seconds*1e3:void 0,i=e.membersByAlias.get(t.agent.alias);if(i===void 0||i.sessionid===null){let f=K(e,{run_id:e.run_id,state_name:r});return e.steps_executed+=1,e.dal.finishStep(f.id,null,`missing_agent:${t.agent.alias}`),{kind:"terminal",terminal:ee(e.workflow)}}let o=zr(e,t.durable_memory_tags),a=e.dal.getInteractiveSessionByRunAndState(e.run_id,n);if(a!==null){if(a.status==="done")return e.dal.finishStep(a.step_id,"done","operator_done"),e.outcomes[r]="done",t.write_back_durable_memory&&await fn(e,r,i,t.write_back_durable_memory),V(e.workflow,t.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=t.termination.max_turns){e.dal.finishStep(a.step_id,"timeout",`max_turns=${t.termination.max_turns}`),Z(e,n,r,"timeout");let m=t.outcomes.timeout;return m!==void 0?V(e.workflow,m):{kind:"terminal",terminal:ee(e.workflow)}}let f=a.last_operator_input??"";try{let m=await ci({context:e,stateId:r,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:r,kind:m.violationKind,command_summary:m.summary,message:`State ${r} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:r,message:`State ${r} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),Z(e,n,r,"done"),t.write_back_durable_memory&&await fn(e,r,i,t.write_back_durable_memory),V(e.workflow,t.outcomes.done)):(pw({context:e,state:t,stateId:n,displayName:r,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Re?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(e.workflow)}}}return{kind:"paused"}}let l=K(e,{run_id:e.run_id,state_name:r});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:n,status:"waiting_agent"}),d=await ot(t.agent.initial_prompt_template,e,r),u=o?`${o}
|
|
@@ -2252,7 +2252,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
2252
2252
|
JOIN job j ON j.id = r.job_id
|
|
2253
2253
|
WHERE j.project_id = ?
|
|
2254
2254
|
AND r.terminal_state IS NOT NULL
|
|
2255
|
-
${n!==null?"AND r.id > ?":""}`,...n!==null?[t.id,n]:[t.id]);return{count:r[0]?.cnt??0,maxRunId:r[0]?.max_id??0}}function aT(e){for(let t of _1)try{t(e)}catch{}}var Ca,mi,_1,sf=w(()=>{"use strict";Ca="memory_policy",mi="memory_consolidation_request";_1=[m1]});var mT={};
|
|
2255
|
+
${n!==null?"AND r.id > ?":""}`,...n!==null?[t.id,n]:[t.id]);return{count:r[0]?.cnt??0,maxRunId:r[0]?.max_id??0}}function aT(e){for(let t of _1)try{t(e)}catch{}}var Ca,mi,_1,sf=w(()=>{"use strict";Ca="memory_policy",mi="memory_consolidation_request";_1=[m1]});var mT={};me(mT,{getOrInsertConsolidationWorkflow:()=>cT,runJobById:()=>w1,runOnce:()=>ur,startWorker:()=>T1});import{createHash as h1}from"node:crypto";import{readFileSync as g1}from"node:fs";import{pathToFileURL as y1}from"node:url";function cT(e,t="durable-memory-consolidation-v2"){let n=e.getWorkflowByName(t);if(n!==null)return n;try{$E({swallow:!0});let r=ba(t);if(r===null)return null;let s=g1(r,"utf8"),i=bt(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:y1(r).href,source_sha256:h1("sha256").update(s).digest("hex")})}catch{return null}}async function ur(e){let t=Date.now(),n=null;try{return n=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??lT,evaluator:r=>uT(e.dal,r)}),n===null?null:await dT(e.dal,n,t)}catch(r){if(n!==null)return Bn(e.dal,n,"worker_run_failed",dr(r),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ma(dr(r))})})}catch{}return null}finally{e.max_concurrent}}async function w1(e){let t=Date.now(),n=null;try{let r=e.dal.claimJobByIdWithConcurrency({job_id:e.job_id,worker_id:e.worker_id,lease_ms:e.lease_ms??lT,evaluator:s=>uT(e.dal,s)});return r.claimed?(n=r.job,{claimed:!0,...await dT(e.dal,n,t)}):r}catch(r){if(n!==null)return{claimed:!0,...Bn(e.dal,n,"worker_run_failed",dr(r),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Ma(dr(r)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function dT(e,t,n){let r=e.getProjectByJob(t.id);if(r===null)return Bn(e,t,"worker_project_missing","project_not_found",n);let s=t.source===Ca&&t.source_ref===mi,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=cT(e):o=fT(e,t,r),o===null)return Bn(e,t,"worker_workflow_missing","workflow_not_found",n,r);let a=e.getTeam(i?.team_id??r.team_id),l=a===null?[]:e.listTeamMembers(a.id);if(a===null||l.length===0)return Bn(e,t,"worker_team_missing","team_not_found",n,r);let c;try{c=bt(o.definition)}catch(u){return Bn(e,t,"worker_workflow_invalid",dr(u),n,r)}let d=v1(c,l);if(d.length>0)return Bn(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,n,r,a);try{let u=await Jw({dal:e,job:t,workflow:c,team:a,members:l,workflowRow:o});return e.setJobRun(t.id,u.run_id),u.paused===!0?{job_id:t.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-n}:(e.releaseJob(t.id,"done",null),{job_id:t.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-n})}catch(u){return Bn(e,t,"worker_run_failed",dr(u),n,r,a)}}function uT(e,t){let n=e.getProjectByJob(t.id);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let r=fT(e,t,n);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=bt(r.definition)}catch{s=null}return ua({workflow:s,job:t,project:n})}function fT(e,t,n){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name)}async function T1(e){let t=!1,n=null,r=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await ur(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Ma(dr(i))})})}catch{}}t||(n=setTimeout(()=>{r=s()},e.poll_interval_ms??E1))}};return r=s(),{stop:async()=>{t=!0,n!==null&&clearTimeout(n),await r.catch(()=>{})}}}function Bn(e,t,n,r,s,i,o){let a=Ma(r);return e.releaseJob(t.id,"failed",a),e.raiseAttention({kind:n,severity:"error",project_id:i?.id??t.project_id,payload:JSON.stringify({job_id:t.id,team_id:o?.id??null,error:a})}),{job_id:t.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function dr(e){return e instanceof Error?e.message:String(e)}function Ma(e){return e.length>4096?e.slice(0,4096):e}function v1(e,t){let n=oT(e);if(n.length===0)return[];let r=new Set(t.map(s=>s.alias));return n.filter(s=>!r.has(s))}var lT,E1,Da=w(()=>{"use strict";qu();Zw();ei();$a();bu();sf();lT=6e5,E1=5e3});import{existsSync as b1,readFileSync as S1}from"node:fs";import{marked as k1}from"marked";function gT(e,t){e.get("/layman",n=>n.html(We("Layman Home",I1(t.dal)))),e.get("/api/layman",n=>n.json(TT(t.dal))),e.get("/layman/start/:workflow",n=>{let r=hT(n);return r===null?n.notFound():n.html(We(`Start ${Qr(r)}`,A1(t.dal,r)))}),e.post("/layman/start/:workflow",async n=>{let r=hT(n);return r===null?n.notFound():r==="newspaper"?pT(n,t.dal):R1(n,t.dal,r)}),e.get("/layman/run/:id",n=>{let r=ir(t.dal,ja(n,"id"));return r===null?n.notFound():n.html(We(`Run ${r.id}`,$1(t.dal,r)))}),e.get("/api/layman/run/:id",n=>{let r=ir(t.dal,ja(n,"id"));return r===null?n.notFound():n.json(H1(t.dal,r))}),e.post("/layman/run/:id/respond",async n=>M1(n,t.dal)),e.get("/layman/newspaper",n=>n.html(We("Newspaper Subscriptions",q1(t.dal)))),e.post("/layman/newspaper",n=>pT(n,t.dal)),e.delete("/layman/newspaper/:id",n=>_T(n,t.dal)),e.post("/layman/newspaper/:id/delete",n=>_T(n,t.dal))}function I1(e){let t=TT(e);return`<section class="layman-home">
|
|
2256
2256
|
<h1>Welcome</h1>
|
|
2257
2257
|
<p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
|
|
2258
2258
|
<div class="grid">${Pa.map(N1).join("")}</div>
|
|
@@ -2337,7 +2337,7 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
2337
2337
|
WHERE run_id = ?
|
|
2338
2338
|
AND acknowledged_at IS NULL
|
|
2339
2339
|
AND requires_user = 1
|
|
2340
|
-
ORDER BY id DESC LIMIT 1`,t);return n.length===0?null:{kind:n[0].kind,attention_id:n[0].id}}var za=w(()=>{"use strict"});function fv(e,t){e.all("/runtime/*",n=>VF(n.req.raw,t))}async function VF(e,t){try{return Response.json(await YF(e,t))}catch(n){if(n instanceof de)return Response.json({error:n.message},{status:n.status});let r=n instanceof Error?n.message:String(n);return Response.json({error:r},{status:500})}}async function YF(e,t){let n=new URL(e.url),r=rU(t),s=n.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&n.pathname==="/runtime/workspaces")return Tf(e),[{id:r.id,name:r.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Za(e,r.id,s[2]),zF(t.dal,r);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Za(e,r.id,s[2]);let i=sv(t.dal,s[4]);return rv(t.dal,r,i)}if(e.method==="GET"&&n.pathname==="/runtime/lead-teams")return Tf(e),t.dal.listTeams().map(i=>nU(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=iv(t.dal,ov(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new de(400,"runtime lead chat body does not match route team");return lv(e,r.id,o.context),av(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=iv(t.dal,ov(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new de(400,"runtime lead message body does not match route team");lv(e,r.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new de(400,"runtime lead message requires draft.body");return av(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Za(e,r.id,s[2]);let i=sv(t.dal,s[4]),o=await e.json();if(o.workspaceId!==r.id||o.projectId!==i.name)throw new de(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new de(400,"runtime workflow message requires draft.body");return eU(t.dal,i,a),rv(t.dal,r,i)}if(e.method==="GET"&&n.pathname==="/runtime/templates")return pi(e,r.id),t.dal.listWorkflows().map(i=>sU(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){pi(e,r.id);let i=oU(t.dal,s[2]);return iU(i)}if(e.method==="GET"&&n.pathname==="/runtime/runs"){pi(e,r.id);let i=n.searchParams.get("project"),o=n.searchParams.get("template");if(i!==null&&o!==null)throw new de(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return aU(t.dal,i,o).map(l=>dv(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){pi(e,r.id);let i=cv(t.dal,s[2]);return dv(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){pi(e,r.id);let i=cv(t.dal,s[2]),o=cU(t.dal,i);return{runId:If(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new de(404,`unknown runtime request: ${e.method} ${n.pathname}`)}function zF(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(n=>mv(e,t,n))}}function rv(e,t,n){let r=mv(e,t,n);return{...r,managedWorkflow:{...r.managedWorkflow,instance:ZF(e,n),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${n.workflow_name}`,templateId:`template:${n.workflow_name}`,runId:r.managedWorkflow.runId}},workflowMessages:QF(e,n)}}function mv(e,t,n){let r=pv(e,n.id),s=bf(r);return{id:n.name,workspaceId:t.id,name:n.name,...n.description===null?{}:{description:n.description},status:s,managedWorkflow:{templateId:`template:${n.workflow_name}`,templateName:n.workflow_name,runId:r===null?`project:${n.id}:no-run`:`run:${r.id}`,status:s}}}function ZF(e,t){let n=pv(e,t.id),r=n?.current_state??null;return{id:n===null?`project:${t.id}:no-run`:`run:${n.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:bf(n),currentStepIds:r===null?[]:[r],...n?.started_at===void 0?{}:{createdAt:n.started_at},...n?.ended_at===null||n?.ended_at===void 0?{}:{updatedAt:n.ended_at}}}function QF(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(r=>({id:`attention:${r.id}`,role:"event",author:"lmctl",timestamp:r.created_at,body:r.kind}))}function eU(e,t,n){let r=tU(e,t.id);if(r!==null){let s=Ya(e,r.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,n);if(!i.resumed)throw new de(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=qt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new de(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,n,!0);if(!o.resumed)throw new de(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:n}),priority:0})}function pv(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function tU(e,t){return e.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",t)[0]??null}function bf(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function sv(e,t){let n=e.findProjectByName(t);if(n===null)throw new de(404,`project not found: ${t}`);return n}function iv(e,t){let n=e.listTeams().find(r=>r.name===t);if(n===void 0)throw new de(404,`team not found: ${t}`);return n}function ov(e){return e.startsWith("team:")?e.slice(5):e}function nU(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function av(e,t,n){let r=new Date().toISOString(),s=n===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:r,body:n},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:r,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??uv}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function rU(e){let t=e.workspaceName??"default";return{id:t,name:t}}function Tf(e){if(e.headers.get("x-lmctl-workspace-id")!==uv)throw new de(400,"runtime request requires global-admin workspace identity")}function Za(e,t,n){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new de(400,"runtime request requires workspace identity");if(n!==t||r!==t)throw new de(400,"runtime workspace identity does not match route")}function pi(e,t){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new de(400,"runtime request requires workspace identity");if(n!==t)throw new de(400,"runtime workspace identity does not match server workspace")}function lv(e,t,n){if(n?.scope==="workspace"){if(n.workspaceId===void 0)throw new de(400,"workspace manager context requires workspace identity");Za(e,t,n.workspaceId);return}Tf(e)}function Sf(e){return`${rs}${kf(e.name)}`}function kf(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function If(e){return`${vf}${e.id}`}function sU(e){let t=Qa(e.definition);return{id:Sf(e),name:e.name,...t.description===null?{}:{description:t.description}}}function iU(e){let t=Qa(e.definition);return{id:Sf(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Qa(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let n=t,r=typeof n.description=="string"?n.description:null,s=[],i=new Map;if(n.schema_version==="lmctl/v3"&&Array.isArray(n.steps)){let o=typeof n.entry_step_id=="string"?n.entry_step_id:null;for(let a of n.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:r,graph:t,stepIds:s,nameToId:i}}function oU(e,t){if(!t.startsWith(rs))throw new de(404,`template not found: ${t}`);let n=t.slice(rs.length),r=e.listWorkflows().filter(s=>kf(s.name)===n);if(r.length===0)throw new de(404,`template not found: ${t}`);if(r.length>1){let s=r.map(i=>i.name).join(", ");throw new de(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return r[0]}function cv(e,t){if(!t.startsWith(vf))throw new de(404,`run not found: ${t}`);let n=t.slice(vf.length);if(!/^[1-9]\d*$/.test(n))throw new de(404,`run not found: ${t}`);let r=Number.parseInt(n,10);if(!Number.isFinite(r)||r<=0||String(r)!==n)throw new de(404,`run not found: ${t}`);let s=e.getRun(r);if(s===null)throw new de(404,`run not found: ${t}`);return s}function aU(e,t,n){if(n!==null){if(!n.startsWith(rs))return[];let s=n.slice(rs.length),i=e.listWorkflows().filter(a=>kf(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let r=e.findProjectByName(t);return r===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",r.id)}function dv(e,t){let n=e.getWorkflow(t.workflow_id),r=bf(t),s=lU(n,t);return{id:If(t),templateId:n===null?`${rs}unknown`:Sf(n),label:n===null?`run ${t.id}`:`${n.name} #${t.id}`,status:r,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function lU(e,t){if(t.current_state===null)return[];let n=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[n]:[Qa(e.definition).nameToId.get(n)??n]}function cU(e,t){let n=e.getWorkflow(t.workflow_id),r=n===null?{stepIds:[],nameToId:new Map}:Qa(n.definition),s=c=>r.nameToId.get(c)??c,i=If(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=dU(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function dU(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var uv,rs,vf,de,_v=w(()=>{"use strict";za();cn();uv="global-admin";rs="template:",vf="run:";de=class extends Error{status;constructor(t,n){super(n),this.status=t}}});import{mkdirSync as uU,writeFileSync as fU}from"node:fs";import{randomUUID as hv}from"node:crypto";import{dirname as mU,resolve as el,sep as gv}from"node:path";async function Ev(e,t){let n;try{n=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let r=n.image;if(!yU(r))return e.text("missing image file",400);if(r.size>pU)return e.text("upload too large",413);let s=Buffer.from(await r.arrayBuffer()),i=EU(s);if(i===null||!(i in yv))return e.text("unsupported upload MIME type",415);if(r.type.length>0&&r.type!==i)return e.text("upload MIME type does not match file content",415);let o=_U(t,n.project);if(typeof o=="string")return e.text(o,404);let a=o===null?el(gU()):el(o.local_path),l=el(a,"uploads",hv()),c=el(l,`${hv()}${yv[i]}`);if(!hU(c,a))return e.text("invalid upload path",400);uU(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);fU(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function _U(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function hU(e,t){let n=t.endsWith(gv)?t:`${t}${gv}`;return e.startsWith(n)}function gU(){return mU(re())}function yU(e){return typeof File<"u"&&e instanceof File}function EU(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var pU,yv,wv=w(()=>{"use strict";Qe();pU=10*1024*1024,yv={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as tl}from"node:fs";import{basename as wU,dirname as TU,extname as vU,isAbsolute as bU,join as SU,relative as kU}from"node:path";import{fileURLToPath as IU}from"node:url";import{Hono as NU}from"hono";import{serveStatic as Ht}from"@hono/node-server/serve-static";function Nv(e){let t=new NU,n=[],r=e.localWebui!==void 0?xf(e.localWebui.webuiDir):xU();if(e.localWebui!==void 0&&OT(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),r!==null){let s=AU();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Ht({root:r})),t.use("/vendor/*",s,Ht({root:r})),t.use("/src/*",s,Ht({root:r})),t.get("/",s,Ht({root:r,path:"index.html"})),t.get("/admin",s,Ht({root:r,path:"index.html"})),t.get("/admin/*",s,Ht({root:r,path:"index.html"})),t.get("/terminal",s,Ht({root:r,path:"index.html"})),t.get("/terminal/*",s,Ht({root:r,path:"index.html"})),t.get("/chat",s,Ht({root:r,path:"index.html"})),t.get("/chat/*",s,Ht({root:r,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",lE({disabled:e.authDisabled})),t.get("/login",s=>s.html(We("Login",`
|
|
2340
|
+
ORDER BY id DESC LIMIT 1`,t);return n.length===0?null:{kind:n[0].kind,attention_id:n[0].id}}var za=w(()=>{"use strict"});function fv(e,t){e.all("/runtime/*",n=>VF(n.req.raw,t))}async function VF(e,t){try{return Response.json(await YF(e,t))}catch(n){if(n instanceof ue)return Response.json({error:n.message},{status:n.status});let r=n instanceof Error?n.message:String(n);return Response.json({error:r},{status:500})}}async function YF(e,t){let n=new URL(e.url),r=rU(t),s=n.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&n.pathname==="/runtime/workspaces")return Tf(e),[{id:r.id,name:r.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return Za(e,r.id,s[2]),zF(t.dal,r);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){Za(e,r.id,s[2]);let i=sv(t.dal,s[4]);return rv(t.dal,r,i)}if(e.method==="GET"&&n.pathname==="/runtime/lead-teams")return Tf(e),t.dal.listTeams().map(i=>nU(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=iv(t.dal,ov(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new ue(400,"runtime lead chat body does not match route team");return lv(e,r.id,o.context),av(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=iv(t.dal,ov(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new ue(400,"runtime lead message body does not match route team");lv(e,r.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ue(400,"runtime lead message requires draft.body");return av(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){Za(e,r.id,s[2]);let i=sv(t.dal,s[4]),o=await e.json();if(o.workspaceId!==r.id||o.projectId!==i.name)throw new ue(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ue(400,"runtime workflow message requires draft.body");return eU(t.dal,i,a),rv(t.dal,r,i)}if(e.method==="GET"&&n.pathname==="/runtime/templates")return pi(e,r.id),t.dal.listWorkflows().map(i=>sU(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){pi(e,r.id);let i=oU(t.dal,s[2]);return iU(i)}if(e.method==="GET"&&n.pathname==="/runtime/runs"){pi(e,r.id);let i=n.searchParams.get("project"),o=n.searchParams.get("template");if(i!==null&&o!==null)throw new ue(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return aU(t.dal,i,o).map(l=>dv(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){pi(e,r.id);let i=cv(t.dal,s[2]);return dv(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){pi(e,r.id);let i=cv(t.dal,s[2]),o=cU(t.dal,i);return{runId:If(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ue(404,`unknown runtime request: ${e.method} ${n.pathname}`)}function zF(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(n=>mv(e,t,n))}}function rv(e,t,n){let r=mv(e,t,n);return{...r,managedWorkflow:{...r.managedWorkflow,instance:ZF(e,n),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${n.workflow_name}`,templateId:`template:${n.workflow_name}`,runId:r.managedWorkflow.runId}},workflowMessages:QF(e,n)}}function mv(e,t,n){let r=pv(e,n.id),s=bf(r);return{id:n.name,workspaceId:t.id,name:n.name,...n.description===null?{}:{description:n.description},status:s,managedWorkflow:{templateId:`template:${n.workflow_name}`,templateName:n.workflow_name,runId:r===null?`project:${n.id}:no-run`:`run:${r.id}`,status:s}}}function ZF(e,t){let n=pv(e,t.id),r=n?.current_state??null;return{id:n===null?`project:${t.id}:no-run`:`run:${n.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:bf(n),currentStepIds:r===null?[]:[r],...n?.started_at===void 0?{}:{createdAt:n.started_at},...n?.ended_at===null||n?.ended_at===void 0?{}:{updatedAt:n.ended_at}}}function QF(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(r=>({id:`attention:${r.id}`,role:"event",author:"lmctl",timestamp:r.created_at,body:r.kind}))}function eU(e,t,n){let r=tU(e,t.id);if(r!==null){let s=Ya(e,r.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,n);if(!i.resumed)throw new ue(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=qt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ue(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,n,!0);if(!o.resumed)throw new ue(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:n}),priority:0})}function pv(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function tU(e,t){return e.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",t)[0]??null}function bf(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function sv(e,t){let n=e.findProjectByName(t);if(n===null)throw new ue(404,`project not found: ${t}`);return n}function iv(e,t){let n=e.listTeams().find(r=>r.name===t);if(n===void 0)throw new ue(404,`team not found: ${t}`);return n}function ov(e){return e.startsWith("team:")?e.slice(5):e}function nU(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function av(e,t,n){let r=new Date().toISOString(),s=n===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:r,body:n},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:r,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??uv}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function rU(e){let t=e.workspaceName??"default";return{id:t,name:t}}function Tf(e){if(e.headers.get("x-lmctl-workspace-id")!==uv)throw new ue(400,"runtime request requires global-admin workspace identity")}function Za(e,t,n){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new ue(400,"runtime request requires workspace identity");if(n!==t||r!==t)throw new ue(400,"runtime workspace identity does not match route")}function pi(e,t){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new ue(400,"runtime request requires workspace identity");if(n!==t)throw new ue(400,"runtime workspace identity does not match server workspace")}function lv(e,t,n){if(n?.scope==="workspace"){if(n.workspaceId===void 0)throw new ue(400,"workspace manager context requires workspace identity");Za(e,t,n.workspaceId);return}Tf(e)}function Sf(e){return`${rs}${kf(e.name)}`}function kf(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function If(e){return`${vf}${e.id}`}function sU(e){let t=Qa(e.definition);return{id:Sf(e),name:e.name,...t.description===null?{}:{description:t.description}}}function iU(e){let t=Qa(e.definition);return{id:Sf(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Qa(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let n=t,r=typeof n.description=="string"?n.description:null,s=[],i=new Map;if(n.schema_version==="lmctl/v3"&&Array.isArray(n.steps)){let o=typeof n.entry_step_id=="string"?n.entry_step_id:null;for(let a of n.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:r,graph:t,stepIds:s,nameToId:i}}function oU(e,t){if(!t.startsWith(rs))throw new ue(404,`template not found: ${t}`);let n=t.slice(rs.length),r=e.listWorkflows().filter(s=>kf(s.name)===n);if(r.length===0)throw new ue(404,`template not found: ${t}`);if(r.length>1){let s=r.map(i=>i.name).join(", ");throw new ue(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return r[0]}function cv(e,t){if(!t.startsWith(vf))throw new ue(404,`run not found: ${t}`);let n=t.slice(vf.length);if(!/^[1-9]\d*$/.test(n))throw new ue(404,`run not found: ${t}`);let r=Number.parseInt(n,10);if(!Number.isFinite(r)||r<=0||String(r)!==n)throw new ue(404,`run not found: ${t}`);let s=e.getRun(r);if(s===null)throw new ue(404,`run not found: ${t}`);return s}function aU(e,t,n){if(n!==null){if(!n.startsWith(rs))return[];let s=n.slice(rs.length),i=e.listWorkflows().filter(a=>kf(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let r=e.findProjectByName(t);return r===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",r.id)}function dv(e,t){let n=e.getWorkflow(t.workflow_id),r=bf(t),s=lU(n,t);return{id:If(t),templateId:n===null?`${rs}unknown`:Sf(n),label:n===null?`run ${t.id}`:`${n.name} #${t.id}`,status:r,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function lU(e,t){if(t.current_state===null)return[];let n=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[n]:[Qa(e.definition).nameToId.get(n)??n]}function cU(e,t){let n=e.getWorkflow(t.workflow_id),r=n===null?{stepIds:[],nameToId:new Map}:Qa(n.definition),s=c=>r.nameToId.get(c)??c,i=If(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=dU(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function dU(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var uv,rs,vf,ue,_v=w(()=>{"use strict";za();cn();uv="global-admin";rs="template:",vf="run:";ue=class extends Error{status;constructor(t,n){super(n),this.status=t}}});import{mkdirSync as uU,writeFileSync as fU}from"node:fs";import{randomUUID as hv}from"node:crypto";import{dirname as mU,resolve as el,sep as gv}from"node:path";async function Ev(e,t){let n;try{n=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let r=n.image;if(!yU(r))return e.text("missing image file",400);if(r.size>pU)return e.text("upload too large",413);let s=Buffer.from(await r.arrayBuffer()),i=EU(s);if(i===null||!(i in yv))return e.text("unsupported upload MIME type",415);if(r.type.length>0&&r.type!==i)return e.text("upload MIME type does not match file content",415);let o=_U(t,n.project);if(typeof o=="string")return e.text(o,404);let a=o===null?el(gU()):el(o.local_path),l=el(a,"uploads",hv()),c=el(l,`${hv()}${yv[i]}`);if(!hU(c,a))return e.text("invalid upload path",400);uU(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);fU(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function _U(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function hU(e,t){let n=t.endsWith(gv)?t:`${t}${gv}`;return e.startsWith(n)}function gU(){return mU(re())}function yU(e){return typeof File<"u"&&e instanceof File}function EU(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var pU,yv,wv=w(()=>{"use strict";Qe();pU=10*1024*1024,yv={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as tl}from"node:fs";import{basename as wU,dirname as TU,extname as vU,isAbsolute as bU,join as SU,relative as kU}from"node:path";import{fileURLToPath as IU}from"node:url";import{Hono as NU}from"hono";import{serveStatic as Ht}from"@hono/node-server/serve-static";function Nv(e){let t=new NU,n=[],r=e.localWebui!==void 0?xf(e.localWebui.webuiDir):xU();if(e.localWebui!==void 0&&OT(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),r!==null){let s=AU();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,Ht({root:r})),t.use("/vendor/*",s,Ht({root:r})),t.use("/src/*",s,Ht({root:r})),t.get("/",s,Ht({root:r,path:"index.html"})),t.get("/admin",s,Ht({root:r,path:"index.html"})),t.get("/admin/*",s,Ht({root:r,path:"index.html"})),t.get("/terminal",s,Ht({root:r,path:"index.html"})),t.get("/terminal/*",s,Ht({root:r,path:"index.html"})),t.get("/chat",s,Ht({root:r,path:"index.html"})),t.get("/chat/*",s,Ht({root:r,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",lE({disabled:e.authDisabled})),t.get("/login",s=>s.html(We("Login",`
|
|
2341
2341
|
<h1>Login</h1>
|
|
2342
2342
|
<form method="post" action="/login">
|
|
2343
2343
|
<label>Token <input name="token" type="password"></label>
|
|
@@ -2396,10 +2396,10 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
|
|
|
2396
2396
|
FROM tracked_invocation
|
|
2397
2397
|
WHERE target_teamfile = ?
|
|
2398
2398
|
AND target_alias = ?
|
|
2399
|
-
AND status = 'running'`,t,n),s=0;for(let i of r)rl(e,i)!==null&&(s+=1);return s}var _i=w(()=>{"use strict";gt()});async function R(e,t){if(e.dal!==void 0)return t(e.dal);let n=Xe({path:re()});try{return await t(n)}finally{n.close()}}function Y(e,t,n=["--json"]){let r=new Set(t),s=new Set(n),i=[],o={};for(let a=0;a<e.length;a+=1){let l=e[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!r.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=e[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function
|
|
2399
|
+
AND status = 'running'`,t,n),s=0;for(let i of r)rl(e,i)!==null&&(s+=1);return s}var _i=w(()=>{"use strict";gt()});async function R(e,t){if(e.dal!==void 0)return t(e.dal);let n=Xe({path:re()});try{return await t(n)}finally{n.close()}}function Y(e,t,n=["--json"]){let r=new Set(t),s=new Set(n),i=[],o={};for(let a=0;a<e.length;a+=1){let l=e[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!r.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=e[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function C(e,t){let n=e.flags[t];return typeof n=="string"?n:void 0}function W(e,t){return e.flags[t]===!0}function z(e,t){e.stdout.write(`${JSON.stringify(t,null,2)}
|
|
2400
2400
|
`)}function I(e,t){return e.stderr.write(`error: ${t}
|
|
2401
2401
|
`),1}function qe(e,t){let n=t instanceof Error?t.message:String(t);return e.stderr.write(`internal error: ${n}
|
|
2402
|
-
`),2}var Le=w(()=>{"use strict";dt();Qe()});import{hostname as Fv}from"node:os";function Uv(e,t,n){let r=`${t.teamfile}:${t.alias}`,s=null,i=()=>e.dal!==void 0?e.dal:(s===null&&(s=Xe({path:re()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===t.teamfile&&a.sender_alias===t.alias&&!(a.receiver_teamfile===t.teamfile&&a.receiver_alias===t.alias)&&a.holder_pid!==null&&$e(a.holder_pid)),pollMs:aW,settleMs:lW,maxHoldMs:Ir(n),onHold:()
|
|
2402
|
+
`),2}var Le=w(()=>{"use strict";dt();Qe()});import{hostname as Fv}from"node:os";function Uv(e,t,n){let r=`${t.teamfile}:${t.alias}`,s=null,i=()=>e.dal!==void 0?e.dal:(s===null&&(s=Xe({path:re()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===t.teamfile&&a.sender_alias===t.alias&&!(a.receiver_teamfile===t.teamfile&&a.receiver_alias===t.alias)&&a.holder_pid!==null&&$e(a.holder_pid)),pollMs:aW,settleMs:lW,maxHoldMs:Ir(n),onHold:()=>$({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&$({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function is(e){let t=e.finalize??"auto";await al(e.io,e.env);let n=await R(e.io,_=>{if(e.onlyMailboxId!==void 0){let h=_.getMailboxMessage(e.onlyMailboxId);return h!==null&&h.message_type==="request"&&Wv(h,e.sender)&&h.receiver_teamfile===e.receiver.teamfile&&h.receiver_alias===e.receiver.alias&&h.delivered_at===null&&h.delivering_at===null?[h]:[]}return _.listEnqueuedRequestMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)}),r=n.length===0?[]:await R(e.io,_=>_.claimMailForDelivery(n.map(h=>h.id),new Date().toISOString(),process.pid,Fv())),s=e.newMessage===void 0?Qn(r):null,i=s===null?null:Pe(s.id);if(i!==null)try{await R(e.io,_=>{_.setCurrentlyHandlingMessage(e.receiver.teamfile,e.receiver.alias,i)})}catch(_){e.io.stderr.write(`warning: failed to set mailbox causal pointer: ${_ instanceof Error?_.message:String(_)}
|
|
2403
2403
|
`)}let o=cW(r,e.newMessage,{newMessageFrom:e.newMessageFrom??Bv(e.sender)});if(o.length===0)throw new Error(`no queued mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let a=!1,l=le(),c=0,d=0,u=0,f={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:o,permissionMode:e.permissionMode,env:e.env,onDelta:_=>{a=!0,l&&(c+=1,u=Buffer.byteLength(_,"utf8"),d+=u),e.onDelta?.(_)},onProgress:_=>e.onProgress?.(_)};e.receiver.model!==void 0&&(f.model=e.receiver.model),e.receiver.effort!==void 0&&(f.effort=e.receiver.effort),f.alias=e.receiver.alias,f.isLead=e.receiver.isLead,e.idleTimeoutMs!==void 0&&(f.timeoutMs=e.idleTimeoutMs),f.holdOpen=Uv(e.io,e.receiver,e.env);let m;try{_n("mailbox_delivery_attempt_started",r,{batch_ids:r.map(_=>_.id),provider:e.receiver.provider,receiver_session_id:e.receiver.sessionId}),await e.onPromptBuilt?.(o),m=await Wt(f)}catch(_){let h=_ instanceof Error?_.message:String(_);if(_n("mailbox_delivery_attempt_failed",r,{error_message:h}),t==="auto"&&await Pv(e.io,r,"provider-or-preflight-error",h),t==="caller")return{status:"error",receipt:h,prompt:o,queued:r,deliveredIds:[],wroteDelta:a,error:h};throw _}finally{if(i!==null)try{await R(e.io,_=>{_.clearCurrentlyHandlingMessage(e.receiver.teamfile,e.receiver.alias,i)})}catch(_){e.io.stderr.write(`warning: failed to clear mailbox causal pointer: ${_ instanceof Error?_.message:String(_)}
|
|
2404
2404
|
`)}}if(l&&je(JSON.stringify({event:"chat_return",alias:e.receiver.alias,provider:e.receiver.provider,streamed:a,blockCount:c,streamedBytes:d,resultTextBytes:Buffer.byteLength(m.text,"utf8"),lastChunkBytes:u,tailPreview:m.text.slice(-200)})),m.status==="stalled")return _n("mailbox_delivery_attempt_stalled",r,{stalled_after_ms:m.stalledAfterMs,duration_ms:m.durationMs}),t==="auto"&&await Pv(e.io,r,"provider-stalled"),{status:"stalled",receipt:m.text,prompt:o,queued:r,deliveredIds:[],wroteDelta:a,durationMs:m.durationMs,stalledAfterMs:m.stalledAfterMs};let p=r.map(_=>_.id);return t==="auto"&&await il(e.io,r,m.text),{status:"ok",receipt:m.text,prompt:o,queued:r,deliveredIds:p,wroteDelta:a,durationMs:m.durationMs}}async function ol(e){await al(e.io,e.env);let t=await R(e.io,i=>{if(e.onlyMailboxId!==void 0){let o=i.getMailboxMessage(e.onlyMailboxId);return o!==null&&o.message_type==="response"&&Wv(o,e.sender)&&o.receiver_teamfile===e.receiver.teamfile&&o.receiver_alias===e.receiver.alias&&o.delivered_at===null&&o.delivering_at===null?[o]:[]}return i.listEnqueuedResponseMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)}),n=t.length===0?[]:await R(e.io,i=>i.claimMailForDelivery(t.map(o=>o.id),new Date().toISOString(),process.pid,Fv())),r=dW(n);if(r.length===0)throw new Error(`no queued response mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let s={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:r,permissionMode:e.permissionMode,env:e.env,alias:e.receiver.alias,isLead:e.receiver.isLead};e.receiver.model!==void 0&&(s.model=e.receiver.model),e.receiver.effort!==void 0&&(s.effort=e.receiver.effort),e.idleTimeoutMs!==void 0&&(s.timeoutMs=e.idleTimeoutMs),s.holdOpen=Uv(e.io,e.receiver,e.env),_n("mailbox_delivery_attempt_started",n,{batch_ids:n.map(i=>i.id),provider:e.receiver.provider,receiver_session_id:e.receiver.sessionId});try{let i=await Wt(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
|
|
2405
2405
|
${i.text}`;return _n("mailbox_delivery_attempt_stalled",n,{stalled_after_ms:i.stalledAfterMs,duration_ms:i.durationMs}),await il(e.io,n,a),{status:"stalled",receipt:a,prompt:r,queued:n,deliveredIds:n.map(l=>l.id),durationMs:i.durationMs,stalledAfterMs:i.stalledAfterMs}}let o="response delivered; recipient output discarded";return await il(e.io,n,o),{status:"ok",receipt:o,prompt:r,queued:n,deliveredIds:n.map(a=>a.id),durationMs:i.durationMs}}catch(i){let o=i instanceof Error?i.message:String(i),a=`response delivery error: ${o}`;return _n("mailbox_delivery_attempt_failed",n,{error_message:o}),await il(e.io,n,a),{status:"error",receipt:a,prompt:r,queued:n,deliveredIds:n.map(l=>l.id),error:o}}}function cW(e,t,n={}){let r=e.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${qv(s)}, sent ${s.created_at}) ---`,s.payload].join(`
|
|
@@ -2411,8 +2411,8 @@ ${i.text}`;return _n("mailbox_delivery_attempt_stalled",n,{stalled_after_ms:i.st
|
|
|
2411
2411
|
|
|
2412
2412
|
`)}function qv(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":Bv({teamfile:e.sender_teamfile,alias:e.sender_alias})}function Bv(e){return`${e.teamfile}:${e.alias}`}async function il(e,t,n){if(t.length!==0)try{await R(e,r=>{r.markRelayRequestDelivered(t,n,new Date().toISOString())})}catch(r){let s=r instanceof Error?r.message:String(r);_n("mailbox_delivery_finalize_failed",t,{error_message:s}),e.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${s}
|
|
2413
2413
|
`)}}async function Pv(e,t,n,r){if(t.length!==0)try{let s=await R(e,i=>t.map(o=>({row:o,cleared:i.reclaimMailboxDeliveryIfUnchanged(o)!==null})));for(let i of s)_n(i.cleared?"mailbox_delivery_cleared":"mailbox_delivery_clear_skipped",[i.row],{transition:i.cleared?"delivering->pending":"delivering->delivering",reason:n,...r===void 0?{}:{error_message:r}})}catch(s){let i=s instanceof Error?s.message:String(s);_n("mailbox_delivery_clear_failed",t,{reason:n,error_message:i,...r===void 0?{}:{causing_error:r}}),e.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${i}
|
|
2414
|
-
`)}}async function al(e,t=process.env){try{await R(e,n=>{n.reclaimStaleMailboxDeliveries(new Date(Date.now()-Af(t)).toISOString())})}catch{}}function Af(e=process.env){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return jv;let n=Number(t);return!Number.isFinite(n)||n<=0?jv:n}function _n(e,t,n={}){let r=new Date().toISOString();for(let s of t)
|
|
2415
|
-
`);if(t[0]!=="---")throw new Jt("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Jt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!yW.has(c))throw new Jt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${cl.join(", ")}`);n[c]=d}if(r===-1)throw new Jt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of cl)if(n[o]===void 0)throw new Jt(`missing required frontmatter key "${o}" \u2014 required: ${cl.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var cl,yW,Jt,zv=w(()=>{"use strict";cl=["title","description","members"],yW=new Set(cl),Jt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as EW,writeFileSync as
|
|
2414
|
+
`)}}async function al(e,t=process.env){try{await R(e,n=>{n.reclaimStaleMailboxDeliveries(new Date(Date.now()-Af(t)).toISOString())})}catch{}}function Af(e=process.env){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return jv;let n=Number(t);return!Number.isFinite(n)||n<=0?jv:n}function _n(e,t,n={}){let r=new Date().toISOString();for(let s of t)$({event:e,event_at:r,message_id:s.id,message_type:s.message_type,lane_key:JSON.stringify([s.sender_teamfile,s.sender_alias,s.receiver_teamfile,s.receiver_alias]),sender_teamfile:s.sender_teamfile,sender_alias:s.sender_alias,receiver_teamfile:s.receiver_teamfile,receiver_alias:s.receiver_alias,message_created_at:s.created_at,delivering_at:s.delivering_at,delivered_at:s.delivered_at,delivery_holder_pid:s.delivery_holder_pid,delivery_holder_host:s.delivery_holder_host,...n})}var jv,aW,lW,ll=w(()=>{"use strict";vt();Yi();Rr();ce();Le();dt();Qe();tn();gt();jv=60*60*1e3,aW=2e3,lW=5e3});import{basename as uW}from"node:path";function Jv(e,t){let n=new Date(t.now.getTime()-Xt()).toISOString(),r=Vv(e,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=_W(t.sender,r),i=hW(t.sender,r);i!==null&&i.teamfile===t.root&&!Xv(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,o],l=s.filter(m=>Xv(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,d=c!==null&&t.now.getTime()-c<fW,u=Rf(t.sender,r).length;return{stop:l.length>=1&&d&&u>=mW,chain:gW(a)}}function Gv(e,t){let n=new Date(t.now.getTime()-Xt()).toISOString(),r=Vv(e,n),s=Rf(t.sender,r);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function Xt(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Hv;let n=Number(t);return!Number.isFinite(n)||n<=0?Hv:n}function Kv(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function pW(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function Vv(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(pW).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=t).sort((n,r)=>n.at-r.at)}function _W(e,t,n={}){let r=new Map;for(let a of t)r.set(mr(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([mr(e)]);for(let a=0;a<64;a+=1){let l=r.get(mr(i));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&n.includePromptSender!==!0)break;let d=mr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function Rf(e,t){let n=mr(e),r=new Set([n]),s=[n],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=mr(l.sender),d=mr(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(d)||(r.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function hW(e,t){let n=Rf(e,t);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function Xv(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function mr(e){return`${e.teamfile}\0${e.alias}`}function gW(e){return e.map(t=>`${uW(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var fW,mW,Hv,hi=w(()=>{"use strict";fW=6e4,mW=2,Hv=8*60*60*1e3});function Yv(e){if(e.length===0||!e.startsWith("---"))throw new Jt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
|
|
2415
|
+
`);if(t[0]!=="---")throw new Jt("frontmatter must start at line 1 with `---` on its own line");let n={},r=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){r=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Jt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!yW.has(c))throw new Jt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${cl.join(", ")}`);n[c]=d}if(r===-1)throw new Jt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of cl)if(n[o]===void 0)throw new Jt(`missing required frontmatter key "${o}" \u2014 required: ${cl.join(", ")}`);let s=0;for(let o=0;o<=r;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=n.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:n.title,description:n.description,members:i,bodyOffset:s}}var cl,yW,Jt,zv=w(()=>{"use strict";cl=["title","description","members"],yW=new Set(cl),Jt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as EW,writeFileSync as Nee,renameSync as xee,existsSync as Qv}from"node:fs";import{basename as wW,resolve as os,dirname as Lf}from"node:path";function vW(e){let t={},n=/(\w+)=(?:"([^"]*)"|([\S]*))/g,r;for(;(r=n.exec(e))!==null;){let s=r[1],i=r[2]!==void 0?r[2]:r[3];t[s]=i}return t}function bW(e){return/^\s*_MEMBER_\s+\S/.test(e)}function SW(e){return/^\s*_SESSION_\s+\S/.test(e)}function kW(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function $f(e){let t=wW(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function lt(e){let t=EW(e,"utf-8"),n=Lf(os(e)),r=Cf(t,$f(e),{baseDir:n,sourcePath:os(e)});for(let s of r.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=os(n,s.sessiondir));return r}function Cf(e,t,n={}){let r=[],s=[];n.sourcePath,n.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
|
|
2416
2416
|
`);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=Yv(i)}catch(l){if(l instanceof Jt)s.push(`frontmatter: ${l.message}`);else throw l}let a=e.split(`
|
|
2417
2417
|
`);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(SW(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(kW(c)||!bW(c))continue;let u=vW(c);for(let p of Object.keys(u))if(!Zv.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
|
|
2418
2418
|
allowed keys: ${Zv.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${r.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),r.push(m)}return{name:t,members:r,rawText:e,parseErrors:s,frontmatter:o}}function Mf(e,t){let n=[];for(let i of e.parseErrors)n.push({field:"session",message:i});let r=e.members.filter(i=>i.alias.toLowerCase()===Of.toLowerCase());r.length>1&&n.push({field:Of,message:`${r.length} alias=Lead found (max 1)`});let s=new Set;for(let i of e.members){let o=i.alias.toLowerCase();if(s.has(o)&&n.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=t?os(t,i.teamfile):os(i.teamfile);if(!Qv(a))n.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=lt(a),c=Gt(l);c?c.session||n.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):n.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else TW.has(i.provider)||n.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&n.push({field:i.alias,message:"sessiondir is empty"})}return n}function Gt(e){return e.members.find(t=>t.alias.toLowerCase()===Of.toLowerCase())}function Df(e,t,n,r={}){let s=r.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let i=os(t,e.teamfile),o=n??new Set;if(o.has(i))throw new Error(`Circular team reference: ${e.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!Qv(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${e.alias}")`);let a=lt(i),l=Gt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return Df(l,Lf(i),o,r);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Lf(i),alias:e.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function dl(e,t){return e.members.find(n=>n.alias===t)??e.members.find(n=>n.alias.toLowerCase()===t.toLowerCase())}var Of,TW,Zv,hn=w(()=>{"use strict";zv();Of="Lead",TW=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"]);Zv=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as IW}from"node:crypto";import{existsSync as eb,readFileSync as tb,realpathSync as NW}from"node:fs";import{dirname as xW,resolve as nb}from"node:path";function Ee(e,t){let n=nb(e);if(eb(n))return NW(n);if(t!==void 0){let r=RW(e,n,t);if(r!==null)return r}return n}function fl(e,t){let n=xW(t),r=Cf(e,$f(t),{baseDir:n});for(let s of r.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=nb(n,s.sessiondir));return r}function Be(e,t,n=r=>{process.stderr.write(`warning: ${r}
|
|
@@ -2422,17 +2422,17 @@ ${i.text}`;return _n("mailbox_delivery_attempt_stalled",n,{stalled_after_ms:i.st
|
|
|
2422
2422
|
Use: lmctl ${e.name} ${n}:<alias> or lmctl ${e.name} ${n} <alias>`};if(jW(n)){if(r!==void 0)return{mode:"error",message:`lmctl ${e.name}: got a second positional "${r}" but "${n}" is not a teamfile path.`};if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: "${n}" is a bare sessionid, but ${e.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:n};return s.provider!==void 0&&(a.provider=s.provider),a}return r!==void 0?{mode:"error",message:`lmctl ${e.name}: got a second positional "${r}" but "${n}" is not a teamfile path.
|
|
2423
2423
|
Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${e.name}: can't infer target type from "${n}".
|
|
2424
2424
|
Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: --session (raw mode) is not supported by ${e.name}.`};let o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${e.name}: a target is required.
|
|
2425
|
-
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var we,MW,DW,ml,rt=w(()=>{"use strict";hn();Kt();we=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},MW=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,DW=/^ses_[A-Za-z0-9_-]+$/,ml=/^[A-Za-z][A-Za-z0-9_-]*$/});function pl(e){return FW.has(e)}function Uf(){return Ff===null&&(Ff=Dt(Ut())),Ff}function Wf(e,t,n={}){if(!pl(e))return null;try{let r=Uf().getAdapter?.(e);if(r===void 0)return null;let s=r.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&n.isLead===!0?ho({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?PW[e]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:e,model:n.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...ib[e]??[]]}catch{return null}}function _l(e,t,n={}){let r=Wf(e,t,n);return r===null?null:r.join(" ")}function De(e,t){return Uf().getSession(e,t)}async function as(e){return(await Uf().resolveSessions(e)).map(n=>n.provider.name)}var ib,PW,FW,ob,Ff,At=w(()=>{"use strict";vt();qc();ib={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[],kimi:[]},PW={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e],kimi:e=>["--model",e]},FW=new Set(Object.keys(ib)),ob=/^[\w.:-]+$/;Ff=null});function UW(e=process.env){let t=e.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(t===void 0||t.trim()==="")return ab;let n=Number(t);return!Number.isFinite(n)||n<=0?ab:n}async function WW(e,t,n){try{let r=Te(t,n,e),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await as(s);if(c.length!==1)return null;i=c[0]}let o=await De(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function ls(e,t,n,r,s){if(!t.busy||t.reason!=="in-flight")return!1;let i=s??UW(),o=await WW(e,n,r),a=o!==null&&o>=i;return a
|
|
2426
|
-
${e.receipt}`:`relay delivery error: ${e.error}`}function KW(e,t){e.reclaimStaleMailboxDeliveries(new Date(Date.now()-Af(t)).toISOString())}function VW(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var lb,ub=w(()=>{"use strict";gt();_i();ll();hi();rt();hl();lb=10});function gi(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function zW(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let n=new Set;for(let r of t.split(",")){let s=r.trim();if(s!==""){if(s==="all")return new Set(fb);YW.has(s)&&n.add(s)}}return n}function mb(e){let t=e.intervalMs??gi(),n=e.runOnceFn??ur,r=new Set(e.features??zW()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...r].sort(),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,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;r.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Lv)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=pb(e.dal,r,e.monitorSessionActivityFn??nu,t,s).finally(()=>{l=null})),l.finally(()=>u(ru(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=ZW(e.dal,n,e.collectSessionSizesFn??ey,e.scanIntakeFn??pa,e.monitorSessionActivityFn??nu,e.mailboxRelayFn??db,e.worker_id??"daemon",t,r,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),r.has("session-monitor")&&u(m)}return f}async function ZW(e,t,n,r,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,_=QW();try{if(l.has("durable-memory-policies")&&aT({dal:e}),l.has("drift-detectors")&&Cv({dal:e}),l.has("intake")&&(m=await r(e)),l.has("job-worker"))for(;;){let h=await t({dal:e,worker_id:o,lease_ms:6e5});if(h===null)break;d.push(h)}if(l.has("mailbox-relay")&&(_=await i({dal:e})),l.has("session-size")){let h=await n(e);u=h.recorded,f=h.failed}l.has("session-monitor")&&(p=await pb(e,l,s,a,c))}catch(h){c.last_error=h instanceof Error?h.message:String(h);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((h,g)=>h+g.scanned,0),c.last_intake_new_jobs=m.reduce((h,g)=>h+g.new_jobs,0),c.last_intake_failures=m.filter(h=>h.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:_}}function QW(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function pb(e,t,n,r,s){if(!t.has("session-monitor"))return null;let i=ru(e,r),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await n({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var fb,YW,qf=w(()=>{"use strict";Nu();Da();sf();Wo();Ov();Mv();su();ub();fb=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],YW=new Set(fb)});function _b(e){let t=e.listMembersInState("in_chat");for(let n of t)e.setMemberState(n.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var hb=w(()=>{"use strict"});import{mkdirSync as eq,readFileSync as tq,readdirSync as nq,statSync as rq,writeFileSync as sq}from"node:fs";import{dirname as iq,join as yb,sep as gb}from"node:path";function gl(e){return{s3:{async send(r){let s=r;switch(s._localfsTag){case Eb:return oq(e,s.input);case wb:return aq(e,s.input);case Tb:return lq(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Xf,GetObjectCommand:Hf,PutObjectCommand:Bf}}}function oq(e,t){let n=vb(e,t.Key);return eq(iq(n),{recursive:!0}),sq(n,t.Body),{}}function aq(e,t){let n=vb(e,t.Key),r;try{r=tq(n)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=r.toString("utf-8");return{Body:{transformToString:async()=>s}}}function lq(e,t){let n=t.Prefix??"";bb(n);let s=cq(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(n)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function vb(e,t){return bb(t),yb(e,t)}function bb(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function cq(e){let t=[],n=(r,s)=>{let i;try{i=nq(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=yb(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=gb==="/"?a:a.split(gb).join("/");t.push({key:c,lastModified:rq(l).mtime})}}};return n(e,""),t}var Eb,wb,Tb,Bf,Hf,Xf,Jf=w(()=>{"use strict";Eb="localfs-put",wb="localfs-get",Tb="localfs-list",Bf=class{input;_localfsTag=Eb;constructor(t){this.input=t}},Hf=class{input;_localfsTag=wb;constructor(t){this.input=t}},Xf=class{input;_localfsTag=Tb;constructor(t){this.input=t}}});function Sb(){return{put:0,get:0,list:0}}function Gf(e,t=dq){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function Kf(e){let t=new Date(e),n=t.getUTCFullYear(),r=String(t.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var dq,yl,Vf=w(()=>{"use strict";dq={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};yl=class{counts=Sb();record(t,n=1){this.counts[t]+=n}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=Sb(),t}estimateCostUsd(t){return Gf(this.counts,t)}}});function kb(e){let t=e.now??Date.now,n=e.timers??uq,r=null,s=null;async function i(){let l=t(),c=Kf(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=Gf(m);if(r!==c&&p>=e.ceilingUsd){r=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},e.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===Kf(t())}}}var uq,Ib=w(()=>{"use strict";Vf();uq={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var Yf=w(()=>{"use strict";Wa();Ba();Ba()});function fq(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let n=t.request;if(typeof n!="object"||n===null)return null;let r=n;return typeof r.method!="string"||r.method===""||typeof r.path!="string"||r.path===""?null:{message_id:t.message_id,request:r}}function mq(e){return e.reply_to!==void 0&&e.response!==void 0}function pq(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function Nb(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var El,yi,xb=w(()=>{"use strict";Yf();El=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},yi=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,n){if(this.stopped)throw new El("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=t.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=pn(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=n?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=n?.abortSignal,d;if(c!==void 0){if(c.aborted){l(Nb(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Nb(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{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(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let n=new El;for(let r of t){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(t,n){let r=fq(t);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(mq(r)){let l=this.pending.get(r.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${r.reply_to}`);return}this.pending.delete(r.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(r.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${r.message_id}`);return}let s=n?.conversation_id??pq(t)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:pn(this.now(),this.random),reply_to:r.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${r.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function zf(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var Ab=w(()=>{"use strict"});function Zf(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let n of t.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var Rb=w(()=>{"use strict"});function em(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let n of t.workflows){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n;if(typeof r.teamfile_path!="string"||r.teamfile_path===""||r.name!==null&&typeof r.name!="string"||typeof r.registered_at!="string"||r.registered_at===""||r.last_seeded_at!==null&&typeof r.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let n=t.entry;if(typeof n.id!="number"||typeof n.root_teamfile!="string"||n.root_teamfile===""||n.sender_teamfile!==null&&(typeof n.sender_teamfile!="string"||n.sender_teamfile==="")||n.sender_alias!==null&&(typeof n.sender_alias!="string"||n.sender_alias==="")||typeof n.receiver_teamfile!="string"||n.receiver_teamfile===""||typeof n.receiver_alias!="string"||n.receiver_alias===""||typeof n.message!="string"||n.response!==null&&typeof n.response!="string"||typeof n.status!="string"||n.status===""||typeof n.created_at!="string"||n.created_at==="")return!1}return!0}var Qf,Lb=w(()=>{"use strict";Qf="daemon:events"});function $b(e){return{kind:"prompt",prompt_id:e.prompt_id??pn(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function tm(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var Ob,nm=w(()=>{"use strict";Yf();Ob="prompt:root"});function Ei(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let n=JSON.parse(Mb(t[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function _q(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let n=JSON.parse(Mb(t[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function Cb(e,t=60){if(typeof e!="string"||e==="")return!0;let n=_q(e);return n===null?!0:Date.now()/1e3>=n-t}function Mb(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.padEnd(Math.ceil(t.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var rm=w(()=>{"use strict"});async function wl(e){let t=e.fetchImpl??fetch,n=`https://cognito-idp.${e.region}.amazonaws.com/`,r=await t(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":hq},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await r.text();if(!r.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${r.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var hq,sm=w(()=>{"use strict";hq="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Db,mkdirSync as jb,readFileSync as Pb,writeFileSync as Fb}from"node:fs";import{homedir as Ub}from"node:os";import{dirname as Wb,join as qb}from"node:path";function wi(){return process.env.LMCTL_DEVICE_AUTH_PATH??qb(Ub(),".lmctl","device-auth.json")}function Bb(){return process.env.LMCTL_TOKEN_PATH??qb(Ub(),".lmctl","cli-tokens.json")}function im(e=wi()){try{let t=JSON.parse(Pb(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function Hb(e,t=wi()){jb(Wb(t),{recursive:!0,mode:448}),Fb(t,JSON.stringify(e,null,2));try{Db(t,384)}catch{}}function om(e,t=Bb()){let n={};try{n=JSON.parse(Pb(t,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=e.idToken,e.accessToken!==void 0&&(r.accessToken=e.accessToken),e.refreshToken!==void 0&&(r.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(r.expiresAt=e.expiresAt);let s={...n,cognito:r};jb(Wb(t),{recursive:!0,mode:448}),Fb(t,JSON.stringify(s,null,2));try{Db(t,384)}catch{}}async function Xb(e){let t=e.deviceAuthPath??wi(),n=im(t);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await wl({region:e.region,clientId:e.clientId,refreshToken:n.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return om({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},e.cliTokensPath??Bb()),{idToken:r.idToken,userId:n.userId}}var am=w(()=>{"use strict";sm()});import{existsSync as gq,realpathSync as yq}from"node:fs";import{dirname as Eq}from"node:path";function lm(e){wq(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function wq(e){let t=e.payload.root_teamfile;try{t=yq(e.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return cs({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:o,reason:"root_unavailable"}),e.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(e.store.getRootTeam(t)===null){let i=`prompt root is not registered: ${t}`;return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unregistered"}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=vq(t);if("error"in n)return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:n.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=Mt(e.store,{receiver_teamfile:t,receiver_alias:n.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:Iq(e.env??process.env)});if(!r.acquired){let i=kq(n.alias,r.current);return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"unavailable"}),e.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=In(i=>e.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:kr(e.env??process.env)});try{let o=await(e.chat??Wt)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:n.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",c=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,d=a||l?"error":"ok";return d==="ok"?await bq(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,response:o.text,status:d,error_detail:null,log:e.log}):cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:d,response:d==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:o,reason:"provider_error"}),e.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{e.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function cs(e){C({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:Tq(e.message)})}function Tq(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function vq(e){if(!gq(e))return{error:`prompt root missing/unreadable: ${e}`};let t=lt(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let n=Gt(t);return n===void 0?{error:`prompt root has no Lead: ${e}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??Eq(e)}}async function bq(e,t){let n=Kb(t.message),r=t.response===null?null:Kb(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:n.text,response:r?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Kb(e){return e.length<=Jb?{text:e,truncated:!1}:{text:e.slice(0,Jb),truncated:!0}}function Sq(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function kq(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:Sq(e,t)}function Iq(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Gb;let n=Number(t);return!Number.isFinite(n)||n<=0?Gb:n}var Jb,Gb,Vb=w(()=>{"use strict";vt();hn();me();gt();Jb=256*1024,Gb=30*60*1e3});import{chmodSync as tS,existsSync as Nq,mkdirSync as nS,readFileSync as Sl,writeFileSync as rS}from"node:fs";import{dirname as cm,resolve as Tl,join as sS}from"node:path";import{fileURLToPath as xq}from"node:url";import{homedir as iS}from"node:os";import{CognitoIdentityClient as Aq,GetIdCommand as Rq}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Yb}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as Lq,ListObjectsV2Command as Oq,PutObjectCommand as $q,S3Client as zb}from"@aws-sdk/client-s3";function vi(e={}){let t=e.env??process.env,n=e.tfstatePath!==void 0?[e.tfstatePath]:Pq(e.selfUrl),r={},s;for(let S of n)if(Nq(S)){r=jq(S),s=S;break}let i=(...S)=>{for(let k of S)if(typeof k=="string"&&k!=="")return k},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??Cq,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??Mq,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??Dq,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??kl,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:n,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=bl(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=bl(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=bl(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),E=bl(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),b=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...h!==void 0?{heartbeatIdleMs:h}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...E!==void 0?{chatLogPollIntervalMs:E}:{},...y!==void 0?{mailboxKey:y}:{},...b!==void 0?{tokenPath:b}:{}},f}function jq(e){try{let t=Sl(e,"utf8"),r=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(r))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function Pq(e){let t=cm(xq(e??import.meta.url));return[Tl(t,"..","..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","infra","terraform","terraform.tfstate")]}function bl(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function Fq(e){let t=Uq(e.intervalMs)??oS,n=Math.max(1,Math.trunc(e.limit??500)),r=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,n);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:r(),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 e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(r()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function Uq(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function aS(e){let t=e.tokenPath??sS(iS(),".lmctl","cli-tokens.json"),n=Qb(e.tokenPath);if(Cb(n.cognito?.idToken)&&im()!==null)try{await Xb({region:e.region,clientId:e.cognitoClientId??kl,cliTokensPath:t}),n=Qb(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);e.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(n.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 r=n.cognito.idToken;if(typeof r!="string"||r==="")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.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await eS({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:r,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Yb({identityId:i,logins:{[s]:r},clientConfig:{region:e.region}}),l=new zb({region:e.region,credentials:a}),c={ListObjectsV2Command:Oq,GetObjectCommand:Lq,PutObjectCommand:$q},d=Ei(r),u=d??i,f=e.deviceId,m=es({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let x=p.loadMailboxCursor(u,m);if(x!==null)_=x.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let H=!1,J=0;for(;!H&&J<2;){J+=1;try{let N=Fa(m,"web"),A=0,O;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:N,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let q of X.Contents??[]){let j=Ua(q.Key??"",m,"web");j!==void 0&&j>A&&(A=j)}O=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(O!==void 0);_=A,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${u}`),H=!0}catch(N){let A=N instanceof Error?N.message:String(N);if(o&&J===1&&Bq(N)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),qq(t),o=!1,i=await eS({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:r,log:e.log}),a=Yb({identityId:i,logins:{[s]:r},clientConfig:{region:e.region}}),l=new zb({region:e.region,credentials:a}),m=es({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let h=null,g=e.terminalSessionManager,E=e.persistentSessionManager,y=e.promptTriggerStore,b=new yl,S=new fr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>b.record(x),onMessage:async x=>{if(g!==void 0&&zf(x.payload)){g.onInbound(x.payload);return}if(E!==void 0&&Zf(x.payload)){await E.onInbound(x.payload);return}if(!em(x.payload)){if(y!==void 0&&tm(x.payload)){lm({store:y,payload:x.payload,log:e.log});return}h!==null&&await h.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});h=new yi({client:S,...e.log!==void 0?{log:e.log}:{}}),g!==void 0&&g.setPublish(async x=>S.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),E!==void 0&&E.setPublish(async x=>S.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>S.putMessage({conversation_id:Qf,payload:x});S.start();let F=e.chatLogTailStore===void 0?void 0:Fq({store:e.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??oS,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let P=e.deviceId??i,D=`${u}/usage/`,U;return U=e.usageStore===void 0?void 0:kb({meter:b,store:e.usageStore,userId:u,deviceId:P,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:J})=>{e.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),S.stop().catch(()=>{}),U?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${D}${P}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},J;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:D,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let A of N.Contents??[]){let O=A.Key??"";if(O.endsWith(`-${x}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:O}));if(X.Body===void 0)continue;let q=JSON.parse(await X.Body.transformToString("utf-8"));H.put+=q.put??0,H.get+=q.get??0,H.list+=q.list??0}catch{}}J=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(J!==void 0);return H},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:S,fetchClient:h,publishDaemonEvent:k,async stop(){F?.stop(),U!==void 0&&(await U.flushNow().catch(()=>{}),U.stop()),await h.stop().catch(()=>{}),await S.stop().catch(()=>{})}}}async function lS(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:gl(e.rootDir),n=es({identityId:Ti,userId:Ti,deviceId:Zb}),r=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new fr({bucket:"local",identityId:Ti,userId:Ti,deviceId:Zb,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&zf(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Zf(c.payload)){await i.onInbound(c.payload);return}if(!em(c.payload)){if(o!==void 0&&tm(c.payload)){lm({store:o,payload:c.payload,log:e.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??vl,readIntervalMs:e.readIntervalMs??vl,heartbeatIdleMs:e.heartbeatIdleMs??vl,backoffReadIntervalMs:e.backoffReadIntervalMs??vl});r=new yi({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Qf,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${n} (local-fs ${e.rootDir})`),{identityId:Ti,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Qb(e){let t=e??sS(iS(),".lmctl","cli-tokens.json");try{let n=Sl(t,"utf8");return JSON.parse(n)}catch{return{}}}function Wq(e,t){if(t===void 0||t==="")return;let n={};try{let s=Sl(e,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:t}};nS(cm(e),{recursive:!0,mode:448}),rS(e,JSON.stringify(r,null,2));try{tS(e,384)}catch{}}function qq(e){let t={};try{let r=Sl(e,"utf8");t=JSON.parse(r)}catch{return}if(t.cognito===void 0)return;let n={...t,cognito:{...t.cognito}};delete n.cognito.identityId,nS(cm(e),{recursive:!0,mode:448}),rS(e,JSON.stringify(n,null,2));try{tS(e,384)}catch{}}async function eS(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new Aq({region:e.region}).send(new Rq({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{Wq(e.tokenPath,n.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${e.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function Bq(e){if(e===null||typeof e!="object")return!1;let t=e,n=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__type:void 0];for(let s of n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof t.message=="string"?t.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var oS,vl,kl,Cq,Mq,Dq,Ti,Zb,dm=w(()=>{"use strict";Ha();Jf();Vf();Ib();xb();Ab();Rb();Lb();nm();Wa();rm();am();Vb();oS=3e3,vl=1e3,kl="79u5jhkk46qofog661c9i0bdcs",Cq="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",Mq="us-east-1_4iUdFggDn",Dq="lmctl-next-preview-mailbox-254332045686";Ti="local",Zb="local"});import{spawn as pm}from"node:child_process";import{createInterface as cS}from"node:readline";var um,fm,mm,dS,uS=w(()=>{"use strict";Eo();me();js();um=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,n){this.ctx=n;let r=pm(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=cS({input:r.stdout}),this.rl.on("line",s=>{n.generation===n.currentGeneration()&&this.handleLine(s)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),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"}),n.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return r}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let n=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(n);this.ctx?.turnMap.delete(n),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(r){throw this.ctx?.turnMap.delete(n),r}}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 t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:n});try{this.child.stdin.write(o+`
|
|
2425
|
+
Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var we,MW,DW,ml,rt=w(()=>{"use strict";hn();Kt();we=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},MW=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,DW=/^ses_[A-Za-z0-9_-]+$/,ml=/^[A-Za-z][A-Za-z0-9_-]*$/});function pl(e){return FW.has(e)}function Uf(){return Ff===null&&(Ff=Dt(Ut())),Ff}function Wf(e,t,n={}){if(!pl(e))return null;try{let r=Uf().getAdapter?.(e);if(r===void 0)return null;let s=r.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&n.isLead===!0?ho({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?PW[e]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:e,model:n.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...ib[e]??[]]}catch{return null}}function _l(e,t,n={}){let r=Wf(e,t,n);return r===null?null:r.join(" ")}function De(e,t){return Uf().getSession(e,t)}async function as(e){return(await Uf().resolveSessions(e)).map(n=>n.provider.name)}var ib,PW,FW,ob,Ff,At=w(()=>{"use strict";vt();qc();ib={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[],kimi:[]},PW={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e],kimi:e=>["--model",e]},FW=new Set(Object.keys(ib)),ob=/^[\w.:-]+$/;Ff=null});function UW(e=process.env){let t=e.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(t===void 0||t.trim()==="")return ab;let n=Number(t);return!Number.isFinite(n)||n<=0?ab:n}async function WW(e,t,n){try{let r=Te(t,n,e),s=r.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof r.provider=="string"&&r.provider.trim()!=="")i=r.provider;else{let c=await as(s);if(c.length!==1)return null;i=c[0]}let o=await De(s,i);if(o===null)return null;let a=o.modifiedAt;if(!(a instanceof Date))return null;let l=a.getTime();return Number.isFinite(l)?Date.now()-l:null}catch{return null}}async function ls(e,t,n,r,s){if(!t.busy||t.reason!=="in-flight")return!1;let i=s??UW(),o=await WW(e,n,r),a=o!==null&&o>=i;return a&&$({event:"session_idle_reclaim",receiver_teamfile:n,receiver_alias:r,idle_ms:o,idle_minutes:o===null?null:Math.round(o/6e4),threshold_ms:i,reason:"in-flight holder idle past session-idle threshold; lease will be force-reclaimed"}),a}var ab,hl=w(()=>{"use strict";ce();At();rt();ab=36e5});function qW(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return lb;let n=Number(t);return!Number.isFinite(n)||n<=0?lb:Math.max(1,Math.trunc(n))}async function db(e){let t=e.env??process.env,n=e.maxBatches??qW(t),r=VW(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};KW(e.dal,t);let i=new Set;for(;s.scanned<n;){let o=e.dal.listRelayMailboxLanes(n).find(l=>!i.has(cb(l)));if(o===void 0)break;i.add(cb(o)),s.scanned+=1;let a=await BW(e.dal,r,t,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function cb(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function BW(e,t,n,r){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};sl(e,r.receiver_teamfile,r.receiver_alias);let i=ht(e,r.receiver_teamfile,r.receiver_alias),o=!1;if(i.busy){if(!await ls(e,i,r.receiver_teamfile,r.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null,l=null;try{let c=Te(r.receiver_teamfile,r.receiver_alias,e),d=Mt(e,{receiver_teamfile:r.receiver_teamfile,receiver_alias:r.receiver_alias,sender_teamfile:r.sender_teamfile,sender_alias:r.sender_alias,ttlMs:Xt(),...o?{force:!0}:{}});if(!d.acquired)return{...s,skipped_busy:1};if(a={row:d.lease,leaseId:d.leaseId},l=In(f=>e.heartbeatAgentInflight(a.row,a.leaseId,f),{intervalMs:kr(n)}),r.message_type==="response"){let f=await ol({sender:{teamfile:r.sender_teamfile,alias:r.sender_alias},receiver:{teamfile:r.receiver_teamfile,alias:r.receiver_alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},io:t,permissionMode:"yolo",env:n});return JW(f)}let u=await is({sender:{teamfile:r.sender_teamfile,alias:r.sender_alias},receiver:{teamfile:r.receiver_teamfile,alias:r.receiver_alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},io:t,permissionMode:"yolo",env:n,finalize:"caller"});return XW(e,u)}catch(c){return HW(e,r,`relay delivery error: ${c instanceof Error?c.message:String(c)}`)}finally{if(l!==null&&clearInterval(l),a!==null)try{e.releaseAgentInflight(a.row,a.leaseId)}catch{}}}function HW(e,t,n){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=t.message_type==="response"?e.listEnqueuedResponseMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias):e.listEnqueuedRequestMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias),i=t.message_type==="response"?e.markMailDelivered(s.map(o=>o.id),n,new Date().toISOString()):e.markRelayRequestDeliveredAndEnqueueResponses(s,n,new Date().toISOString()).marked;return{...r,delivered:i,errors:1}}catch{return{...r,errors:1}}}function XW(e,t){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},r=GW(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,r,s);return{...n,delivered:i,errors:t.status==="ok"?0:1}}function JW(e){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:e.deliveredIds.length,errors:e.status==="ok"?0:1}}function GW(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
|
|
2426
|
+
${e.receipt}`:`relay delivery error: ${e.error}`}function KW(e,t){e.reclaimStaleMailboxDeliveries(new Date(Date.now()-Af(t)).toISOString())}function VW(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var lb,ub=w(()=>{"use strict";gt();_i();ll();hi();rt();hl();lb=10});function gi(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function zW(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let n=new Set;for(let r of t.split(",")){let s=r.trim();if(s!==""){if(s==="all")return new Set(fb);YW.has(s)&&n.add(s)}}return n}function mb(e){let t=e.intervalMs??gi(),n=e.runOnceFn??ur,r=new Set(e.features??zW()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...r].sort(),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,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;r.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Lv)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=pb(e.dal,r,e.monitorSessionActivityFn??nu,t,s).finally(()=>{l=null})),l.finally(()=>u(ru(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=ZW(e.dal,n,e.collectSessionSizesFn??ey,e.scanIntakeFn??pa,e.monitorSessionActivityFn??nu,e.mailboxRelayFn??db,e.worker_id??"daemon",t,r,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),r.has("session-monitor")&&u(m)}return f}async function ZW(e,t,n,r,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,_=QW();try{if(l.has("durable-memory-policies")&&aT({dal:e}),l.has("drift-detectors")&&Cv({dal:e}),l.has("intake")&&(m=await r(e)),l.has("job-worker"))for(;;){let h=await t({dal:e,worker_id:o,lease_ms:6e5});if(h===null)break;d.push(h)}if(l.has("mailbox-relay")&&(_=await i({dal:e})),l.has("session-size")){let h=await n(e);u=h.recorded,f=h.failed}l.has("session-monitor")&&(p=await pb(e,l,s,a,c))}catch(h){c.last_error=h instanceof Error?h.message:String(h);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((h,g)=>h+g.scanned,0),c.last_intake_new_jobs=m.reduce((h,g)=>h+g.new_jobs,0),c.last_intake_failures=m.filter(h=>h.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:_}}function QW(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function pb(e,t,n,r,s){if(!t.has("session-monitor"))return null;let i=ru(e,r),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await n({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var fb,YW,qf=w(()=>{"use strict";Nu();Da();sf();Wo();Ov();Mv();su();ub();fb=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],YW=new Set(fb)});function _b(e){let t=e.listMembersInState("in_chat");for(let n of t)e.setMemberState(n.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var hb=w(()=>{"use strict"});import{mkdirSync as eq,readFileSync as tq,readdirSync as nq,statSync as rq,writeFileSync as sq}from"node:fs";import{dirname as iq,join as yb,sep as gb}from"node:path";function gl(e){return{s3:{async send(r){let s=r;switch(s._localfsTag){case Eb:return oq(e,s.input);case wb:return aq(e,s.input);case Tb:return lq(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:Xf,GetObjectCommand:Hf,PutObjectCommand:Bf}}}function oq(e,t){let n=vb(e,t.Key);return eq(iq(n),{recursive:!0}),sq(n,t.Body),{}}function aq(e,t){let n=vb(e,t.Key),r;try{r=tq(n)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=r.toString("utf-8");return{Body:{transformToString:async()=>s}}}function lq(e,t){let n=t.Prefix??"";bb(n);let s=cq(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(n)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function vb(e,t){return bb(t),yb(e,t)}function bb(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function cq(e){let t=[],n=(r,s)=>{let i;try{i=nq(r,{withFileTypes:!0})}catch(o){if(o.code==="ENOENT")return;throw o}for(let o of i){let a=s===""?o.name:`${s}/${o.name}`,l=yb(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=gb==="/"?a:a.split(gb).join("/");t.push({key:c,lastModified:rq(l).mtime})}}};return n(e,""),t}var Eb,wb,Tb,Bf,Hf,Xf,Jf=w(()=>{"use strict";Eb="localfs-put",wb="localfs-get",Tb="localfs-list",Bf=class{input;_localfsTag=Eb;constructor(t){this.input=t}},Hf=class{input;_localfsTag=wb;constructor(t){this.input=t}},Xf=class{input;_localfsTag=Tb;constructor(t){this.input=t}}});function Sb(){return{put:0,get:0,list:0}}function Gf(e,t=dq){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function Kf(e){let t=new Date(e),n=t.getUTCFullYear(),r=String(t.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var dq,yl,Vf=w(()=>{"use strict";dq={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};yl=class{counts=Sb();record(t,n=1){this.counts[t]+=n}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=Sb(),t}estimateCostUsd(t){return Gf(this.counts,t)}}});function kb(e){let t=e.now??Date.now,n=e.timers??uq,r=null,s=null;async function i(){let l=t(),c=Kf(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=Gf(m);if(r!==c&&p>=e.ceilingUsd){r=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},e.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===Kf(t())}}}var uq,Ib=w(()=>{"use strict";Vf();uq={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var Yf=w(()=>{"use strict";Wa();Ba();Ba()});function fq(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let n=t.request;if(typeof n!="object"||n===null)return null;let r=n;return typeof r.method!="string"||r.method===""||typeof r.path!="string"||r.path===""?null:{message_id:t.message_id,request:r}}function mq(e){return e.reply_to!==void 0&&e.response!==void 0}function pq(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function Nb(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var El,yi,xb=w(()=>{"use strict";Yf();El=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},yi=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,n){if(this.stopped)throw new El("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=t.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=pn(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=n?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=n?.abortSignal,d;if(c!==void 0){if(c.aborted){l(Nb(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Nb(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{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(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let n=new El;for(let r of t){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(t,n){let r=fq(t);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(mq(r)){let l=this.pending.get(r.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${r.reply_to}`);return}this.pending.delete(r.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(r.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${r.message_id}`);return}let s=n?.conversation_id??pq(t)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:pn(this.now(),this.random),reply_to:r.message_id,response:i};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${r.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function zf(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var Ab=w(()=>{"use strict"});function Zf(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let n of t.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var Rb=w(()=>{"use strict"});function em(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let n of t.workflows){if(typeof n!="object"||n===null||Array.isArray(n))return!1;let r=n;if(typeof r.teamfile_path!="string"||r.teamfile_path===""||r.name!==null&&typeof r.name!="string"||typeof r.registered_at!="string"||r.registered_at===""||r.last_seeded_at!==null&&typeof r.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let n=t.entry;if(typeof n.id!="number"||typeof n.root_teamfile!="string"||n.root_teamfile===""||n.sender_teamfile!==null&&(typeof n.sender_teamfile!="string"||n.sender_teamfile==="")||n.sender_alias!==null&&(typeof n.sender_alias!="string"||n.sender_alias==="")||typeof n.receiver_teamfile!="string"||n.receiver_teamfile===""||typeof n.receiver_alias!="string"||n.receiver_alias===""||typeof n.message!="string"||n.response!==null&&typeof n.response!="string"||typeof n.status!="string"||n.status===""||typeof n.created_at!="string"||n.created_at==="")return!1}return!0}var Qf,Lb=w(()=>{"use strict";Qf="daemon:events"});function $b(e){return{kind:"prompt",prompt_id:e.prompt_id??pn(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function tm(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var Ob,nm=w(()=>{"use strict";Yf();Ob="prompt:root"});function Ei(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let n=JSON.parse(Mb(t[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function _q(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let n=JSON.parse(Mb(t[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function Cb(e,t=60){if(typeof e!="string"||e==="")return!0;let n=_q(e);return n===null?!0:Date.now()/1e3>=n-t}function Mb(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t.padEnd(Math.ceil(t.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var rm=w(()=>{"use strict"});async function wl(e){let t=e.fetchImpl??fetch,n=`https://cognito-idp.${e.region}.amazonaws.com/`,r=await t(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":hq},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await r.text();if(!r.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${r.status} ${l}`)}let o=JSON.parse(s).AuthenticationResult,a=o?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof o?.AccessToken=="string"&&o.AccessToken!==""?{accessToken:o.AccessToken}:{},...typeof o?.ExpiresIn=="number"&&Number.isFinite(o.ExpiresIn)?{expiresAt:Date.now()+o.ExpiresIn*1e3}:{}}}var hq,sm=w(()=>{"use strict";hq="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as Db,mkdirSync as jb,readFileSync as Pb,writeFileSync as Fb}from"node:fs";import{homedir as Ub}from"node:os";import{dirname as Wb,join as qb}from"node:path";function wi(){return process.env.LMCTL_DEVICE_AUTH_PATH??qb(Ub(),".lmctl","device-auth.json")}function Bb(){return process.env.LMCTL_TOKEN_PATH??qb(Ub(),".lmctl","cli-tokens.json")}function im(e=wi()){try{let t=JSON.parse(Pb(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function Hb(e,t=wi()){jb(Wb(t),{recursive:!0,mode:448}),Fb(t,JSON.stringify(e,null,2));try{Db(t,384)}catch{}}function om(e,t=Bb()){let n={};try{n=JSON.parse(Pb(t,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=e.idToken,e.accessToken!==void 0&&(r.accessToken=e.accessToken),e.refreshToken!==void 0&&(r.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(r.expiresAt=e.expiresAt);let s={...n,cognito:r};jb(Wb(t),{recursive:!0,mode:448}),Fb(t,JSON.stringify(s,null,2));try{Db(t,384)}catch{}}async function Xb(e){let t=e.deviceAuthPath??wi(),n=im(t);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await wl({region:e.region,clientId:e.clientId,refreshToken:n.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return om({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},e.cliTokensPath??Bb()),{idToken:r.idToken,userId:n.userId}}var am=w(()=>{"use strict";sm()});import{existsSync as gq,realpathSync as yq}from"node:fs";import{dirname as Eq}from"node:path";function lm(e){wq(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function wq(e){let t=e.payload.root_teamfile;try{t=yq(e.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return cs({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:o,reason:"root_unavailable"}),e.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(e.store.getRootTeam(t)===null){let i=`prompt root is not registered: ${t}`;return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unregistered"}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=vq(t);if("error"in n)return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:n.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=Mt(e.store,{receiver_teamfile:t,receiver_alias:n.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:Iq(e.env??process.env)});if(!r.acquired){let i=kq(n.alias,r.current);return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"unavailable"}),e.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=In(i=>e.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:kr(e.env??process.env)});try{let o=await(e.chat??Wt)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:n.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),a=o.status==="stalled",l=!a&&o.text.trim()==="",c=a?`provider stalled${o.stalledAfterMs!==void 0?` after ${o.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,d=a||l?"error":"ok";return d==="ok"?await bq(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,response:o.text,status:d,error_detail:null,log:e.log}):cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:d,response:d==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return cs({rootTeamfile:t,receiverTeamfile:t,receiverAlias:n.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:o,reason:"provider_error"}),e.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{e.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function cs(e){$({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:Tq(e.message)})}function Tq(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function vq(e){if(!gq(e))return{error:`prompt root missing/unreadable: ${e}`};let t=lt(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let n=Gt(t);return n===void 0?{error:`prompt root has no Lead: ${e}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??Eq(e)}}async function bq(e,t){let n=Kb(t.message),r=t.response===null?null:Kb(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:n.text,response:r?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Kb(e){return e.length<=Jb?{text:e,truncated:!1}:{text:e.slice(0,Jb),truncated:!0}}function Sq(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function kq(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:Sq(e,t)}function Iq(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return Gb;let n=Number(t);return!Number.isFinite(n)||n<=0?Gb:n}var Jb,Gb,Vb=w(()=>{"use strict";vt();hn();ce();gt();Jb=256*1024,Gb=30*60*1e3});import{chmodSync as tS,existsSync as Nq,mkdirSync as nS,readFileSync as Sl,writeFileSync as rS}from"node:fs";import{dirname as cm,resolve as Tl,join as sS}from"node:path";import{fileURLToPath as xq}from"node:url";import{homedir as iS}from"node:os";import{CognitoIdentityClient as Aq,GetIdCommand as Rq}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Yb}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as Lq,ListObjectsV2Command as Oq,PutObjectCommand as $q,S3Client as zb}from"@aws-sdk/client-s3";function vi(e={}){let t=e.env??process.env,n=e.tfstatePath!==void 0?[e.tfstatePath]:Pq(e.selfUrl),r={},s;for(let S of n)if(Nq(S)){r=jq(S),s=S;break}let i=(...S)=>{for(let k of S)if(typeof k=="string"&&k!=="")return k},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??Cq,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??Mq,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??Dq,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??kl,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:n,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=bl(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),h=bl(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),g=bl(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),E=bl(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),y=i(t.LMCTL_MAILBOX_KEY),b=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...h!==void 0?{heartbeatIdleMs:h}:{},...g!==void 0?{backoffReadIntervalMs:g}:{},...E!==void 0?{chatLogPollIntervalMs:E}:{},...y!==void 0?{mailboxKey:y}:{},...b!==void 0?{tokenPath:b}:{}},f}function jq(e){try{let t=Sl(e,"utf8"),r=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(r))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function Pq(e){let t=cm(xq(e??import.meta.url));return[Tl(t,"..","..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","..","infra","terraform","terraform.tfstate"),Tl(t,"..","..","infra","terraform","terraform.tfstate")]}function bl(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function Fq(e){let t=Uq(e.intervalMs)??oS,n=Math.max(1,Math.trunc(e.limit??500)),r=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,n);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:r(),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 e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(r()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function Uq(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function aS(e){let t=e.tokenPath??sS(iS(),".lmctl","cli-tokens.json"),n=Qb(e.tokenPath);if(Cb(n.cognito?.idToken)&&im()!==null)try{await Xb({region:e.region,clientId:e.cognitoClientId??kl,cliTokensPath:t}),n=Qb(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let H=x instanceof Error?x.message:String(x);e.log?.(`[mx-mailbox] device-auth refresh failed: ${H}`)}if(n.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 r=n.cognito.idToken;if(typeof r!="string"||r==="")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.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await eS({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:r,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Yb({identityId:i,logins:{[s]:r},clientConfig:{region:e.region}}),l=new zb({region:e.region,credentials:a}),c={ListObjectsV2Command:Oq,GetObjectCommand:Lq,PutObjectCommand:$q},d=Ei(r),u=d??i,f=e.deviceId,m=es({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let x=p.loadMailboxCursor(u,m);if(x!==null)_=x.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let H=!1,J=0;for(;!H&&J<2;){J+=1;try{let N=Fa(m,"web"),A=0,O;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:N,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let q of X.Contents??[]){let j=Ua(q.Key??"",m,"web");j!==void 0&&j>A&&(A=j)}O=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(O!==void 0);_=A,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${u}`),H=!0}catch(N){let A=N instanceof Error?N.message:String(N);if(o&&J===1&&Bq(N)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),qq(t),o=!1,i=await eS({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:r,log:e.log}),a=Yb({identityId:i,logins:{[s]:r},clientConfig:{region:e.region}}),l=new zb({region:e.region,credentials:a}),m=es({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let h=null,g=e.terminalSessionManager,E=e.persistentSessionManager,y=e.promptTriggerStore,b=new yl,S=new fr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>b.record(x),onMessage:async x=>{if(g!==void 0&&zf(x.payload)){g.onInbound(x.payload);return}if(E!==void 0&&Zf(x.payload)){await E.onInbound(x.payload);return}if(!em(x.payload)){if(y!==void 0&&tm(x.payload)){lm({store:y,payload:x.payload,log:e.log});return}h!==null&&await h.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});h=new yi({client:S,...e.log!==void 0?{log:e.log}:{}}),g!==void 0&&g.setPublish(async x=>S.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),E!==void 0&&E.setPublish(async x=>S.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let k=x=>S.putMessage({conversation_id:Qf,payload:x});S.start();let F=e.chatLogTailStore===void 0?void 0:Fq({store:e.chatLogTailStore,publishDaemonEvent:k,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??oS,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let P=e.deviceId??i,D=`${u}/usage/`,U;return U=e.usageStore===void 0?void 0:kb({meter:b,store:e.usageStore,userId:u,deviceId:P,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:H,ceilingUsd:J})=>{e.log?.(`[usage] month ${x} cost $${H.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),S.stop().catch(()=>{}),U?.stop()},publishOwnRollup:async(x,H)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${D}${P}-${x}.json`,Body:JSON.stringify({...H,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let H={put:0,get:0,list:0},J;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:D,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let A of N.Contents??[]){let O=A.Key??"";if(O.endsWith(`-${x}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:O}));if(X.Body===void 0)continue;let q=JSON.parse(await X.Body.transformToString("utf-8"));H.put+=q.put??0,H.get+=q.get??0,H.list+=q.list??0}catch{}}J=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(J!==void 0);return H},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:S,fetchClient:h,publishDaemonEvent:k,async stop(){F?.stop(),U!==void 0&&(await U.flushNow().catch(()=>{}),U.stop()),await h.stop().catch(()=>{}),await S.stop().catch(()=>{})}}}async function lS(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:gl(e.rootDir),n=es({identityId:Ti,userId:Ti,deviceId:Zb}),r=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new fr({bucket:"local",identityId:Ti,userId:Ti,deviceId:Zb,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&zf(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&Zf(c.payload)){await i.onInbound(c.payload);return}if(!em(c.payload)){if(o!==void 0&&tm(c.payload)){lm({store:o,payload:c.payload,log:e.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??vl,readIntervalMs:e.readIntervalMs??vl,heartbeatIdleMs:e.heartbeatIdleMs??vl,backoffReadIntervalMs:e.backoffReadIntervalMs??vl});r=new yi({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:Qf,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${n} (local-fs ${e.rootDir})`),{identityId:Ti,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Qb(e){let t=e??sS(iS(),".lmctl","cli-tokens.json");try{let n=Sl(t,"utf8");return JSON.parse(n)}catch{return{}}}function Wq(e,t){if(t===void 0||t==="")return;let n={};try{let s=Sl(e,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:t}};nS(cm(e),{recursive:!0,mode:448}),rS(e,JSON.stringify(r,null,2));try{tS(e,384)}catch{}}function qq(e){let t={};try{let r=Sl(e,"utf8");t=JSON.parse(r)}catch{return}if(t.cognito===void 0)return;let n={...t,cognito:{...t.cognito}};delete n.cognito.identityId,nS(cm(e),{recursive:!0,mode:448}),rS(e,JSON.stringify(n,null,2));try{tS(e,384)}catch{}}async function eS(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new Aq({region:e.region}).send(new Rq({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{Wq(e.tokenPath,n.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${e.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function Bq(e){if(e===null||typeof e!="object")return!1;let t=e,n=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__type:void 0];for(let s of n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof t.message=="string"?t.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var oS,vl,kl,Cq,Mq,Dq,Ti,Zb,dm=w(()=>{"use strict";Ha();Jf();Vf();Ib();xb();Ab();Rb();Lb();nm();Wa();rm();am();Vb();oS=3e3,vl=1e3,kl="79u5jhkk46qofog661c9i0bdcs",Cq="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",Mq="us-east-1_4iUdFggDn",Dq="lmctl-next-preview-mailbox-254332045686";Ti="local",Zb="local"});import{spawn as pm}from"node:child_process";import{createInterface as cS}from"node:readline";var um,fm,mm,dS,uS=w(()=>{"use strict";Eo();ce();js();um=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,n){this.ctx=n;let r=pm(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=cS({input:r.stdout}),this.rl.on("line",s=>{n.generation===n.currentGeneration()&&this.handleLine(s)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),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"}),n.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,n.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return r}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let n=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(n);this.ctx?.turnMap.delete(n),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(r){throw this.ctx?.turnMap.delete(n),r}}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 t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:n});try{this.child.stdin.write(o+`
|
|
2427
2427
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:t,params:n});try{this.child.stdin.write(r+`
|
|
2428
2428
|
`)}catch{}}handleLine(t){if(t.trim()==="")return;let n;try{n=JSON.parse(t)}catch{return}if(typeof n.id=="number"&&this.pending.has(n.id)){let o=this.pending.get(n.id);if(this.pending.delete(n.id),n.error!==void 0){let a=n.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(n.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(n);return}let r=typeof n.method=="string"?n.method:void 0;if(r===void 0)return;let s=n.params??{},i=this.normalizeNotification(r,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(t,n){if(t==="thread/started"){let r=n.thread;return typeof r?.id=="string"&&(this.threadId=r.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:n}}}if(t==="turn/started")return{event_type:"turn_started",payload:{turn_id:n.turn?.id,thread_id:this.threadId}};if(t==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof n.delta=="string"?n.delta:""}};if(t==="item/started"||t==="item/completed"){let r=n.item;return r?.type!==void 0&&r.type!=="agentMessage"&&r.type!=="userMessage"?{event_type:"tool_call",payload:{name:r.name??r.type,status:t==="item/started"?"started":"completed",item:r}}:{event_type:"notification",payload:{method:t,params:n}}}if(t==="turn/completed"){let r=n.turn;return typeof r?.id=="string"&&this.ctx?.turnMap.delete(r.id),{event_type:"turn_complete",payload:n}}if(t==="error"){let r=n.error;return{event_type:"error",payload:{message:typeof r?.message=="string"?r.message:JSON.stringify(n),raw:n}}}return{event_type:"notification",payload:{method:t,params:n}}}},fm=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(t,n){this.ctx=n;let r=pm(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=r,r.stdout.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
|
|
2429
2429
|
`);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),r.stderr?.on("data",s=>{if(n.generation!==n.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);n.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),r}async sendTurn(t){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let n=`claude-${Date.now()}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});let r=JSON.stringify({type:"user",message:{role:"user",content:t}});try{this.child.stdin.write(r+`
|
|
2430
|
-
`)}catch(s){throw this.ctx?.turnMap.delete(n),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(t){if(t.trim()==="")return;let n;try{n=JSON.parse(t)}catch{return}let r=typeof n.type=="string"?n.type:"";if(r==="system"&&n.subtype==="init"){let s=typeof n.session_id=="string"?n.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:n}}));return}if(r==="assistant"){let i=n.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(r==="result"){let s=typeof n.session_id=="string"?n.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:n.result,session_id:s,raw:n}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n}})}},mm=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,n){this.ctx=n;let r=t.cwd??process.cwd();if(t.provider==="opencode")try{yo(r)}catch(i){
|
|
2430
|
+
`)}catch(s){throw this.ctx?.turnMap.delete(n),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(t){if(t.trim()==="")return;let n;try{n=JSON.parse(t)}catch{return}let r=typeof n.type=="string"?n.type:"";if(r==="system"&&n.subtype==="init"){let s=typeof n.session_id=="string"?n.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:n}}));return}if(r==="assistant"){let i=n.message?.content;if(Array.isArray(i))for(let o of i)o.type==="text"&&typeof o.text=="string"&&o.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:o.text}});return}if(r==="result"){let s=typeof n.session_id=="string"?n.session_id:void 0;for(let i of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(i);this.ctx?.emit({event_type:"turn_complete",payload:{result:n.result,session_id:s,raw:n}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n}})}},mm=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,n){this.ctx=n;let r=t.cwd??process.cwd();if(t.provider==="opencode")try{yo(r)}catch(i){$({event:"opencode_config_install_failed",cwd:r,error_message:i instanceof Error?i.message:String(i)})}let s=pm(t.command,t.args,{cwd:r,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=cS({input:s.stdout}),this.rl.on("line",i=>{n.generation===n.currentGeneration()&&this.handleLine(i)}),s.stderr?.on("data",i=>{if(n.generation!==n.currentGeneration())return;let o=i instanceof Buffer?i.toString("utf8"):String(i);n.emit({event_type:"notification",payload:{source:"stderr",text:o}})});try{await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;if(this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,t.provider==="kimi"){if(this.sessionId===void 0)throw new Error("Kimi ACP session/new response missing sessionId");try{await this.rpc("session/set_config_option",{sessionId:this.sessionId,configId:"mode",value:"auto"})}catch(a){let l=a instanceof Error?a.message:String(a);throw $({event:"acp_permission_mode_failed",provider:t.provider,config_id:"mode",value:"auto",error_message:l}),new Error(`Cannot set Kimi ACP permission mode to auto: ${l}`)}}return n.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}catch(i){try{await this.stop()}catch{}try{s.kill("SIGTERM")}catch{}throw i}}async sendTurn(t){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let n=`acp-${Date.now()}`;this.ctx?.turnMap.set(n,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:t}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(n)}}async stop(){this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0);for(let t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear(),this.child!==void 0&&await tt(this.child)}async rpc(t,n){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((r,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:r,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:n});try{this.child.stdin.write(o+`
|
|
2431
2431
|
`)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:t,params:n});try{this.child.stdin.write(r+`
|
|
2432
2432
|
`)}catch{}}handleLine(t){if(t.trim()==="")return;let n;try{n=JSON.parse(t)}catch{return}if(typeof n.id=="number"&&this.pending.has(n.id)){let s=this.pending.get(n.id);if(this.pending.delete(n.id),n.error!==void 0){let i=n.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(n.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(n);return}let r=typeof n.method=="string"?n.method:void 0;if(r!==void 0){if(typeof n.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:n.id,error:{code:-32601,message:`Method not found: ${r} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
|
|
2433
|
-
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:r,id:n.id,params:n.params}});return}if(r==="session/update"){let s=n.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.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:r,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n.params}})}}},dS=e=>{switch(e){case"codex":return new um;case"claude":case"qwen":return new fm;case"gemini":case"copilot":case"opencode":case"kimi":return new mm;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as Hq}from"node:crypto";import{existsSync as
|
|
2433
|
+
`)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:r,id:n.id,params:n.params}});return}if(r==="session/update"){let s=n.params,i=s?.update;if((typeof i?.sessionUpdate=="string"?i.sessionUpdate:"")==="agent_message_chunk"){let a=i?.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:r,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:r,params:n.params}})}}},dS=e=>{switch(e){case"codex":return new um;case"claude":case"qwen":return new fm;case"gemini":case"copilot":case"opencode":case"kimi":return new mm;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as Hq}from"node:crypto";import{existsSync as Ene,mkdirSync as Xq,readFileSync as Jq,writeFileSync as Gq}from"node:fs";import{homedir as Kq}from"node:os";import{dirname as Vq,join as Yq}from"node:path";function Il(){return process.env.LMCTL_DEVICE_FILE??Yq(Kq(),".lmctl","device.json")}function pr(e=Il()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let n=JSON.parse(Jq(e,"utf8"));return typeof n.device_id!="string"||n.device_id===""?null:{device_id:n.device_id,created_at:typeof n.created_at=="string"?n.created_at:""}}catch{return null}}function _m(e=Il()){let t=pr(e);if(t!==null&&t.created_at!=="env")return t;let n={device_id:Hq(),created_at:new Date().toISOString()};return Xq(Vq(e),{recursive:!0}),Gq(e,`${JSON.stringify(n,null,2)}
|
|
2434
2434
|
`,{encoding:"utf8",mode:384}),n}var hm=w(()=>{"use strict"});import{mkdirSync as zq,readFileSync as fS,rmSync as Zq,writeFileSync as Qq}from"node:fs";import{dirname as mS,join as eB}from"node:path";function Vt(e=re()){return eB(mS(e),"serve.pid")}function pS(e,t){let n=Vt(t);return zq(mS(n),{recursive:!0}),Qq(n,`${JSON.stringify(e,null,2)}
|
|
2435
|
-
`,"utf-8"),n}function gm(e){let t=Vt(e),n;try{n=fS(t,"utf-8")}catch{return null}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0?null:{pid:r.pid,startedAt:typeof r.startedAt=="string"?r.startedAt:"unknown",port:Number.isInteger(r.port)?r.port:0,bind:typeof r.bind=="string"?r.bind:"unknown",dbPath:typeof r.dbPath=="string"?r.dbPath:"unknown",startToken:typeof r.startToken=="string"?r.startToken:null}}catch{return null}}function ds(e){Zq(Vt(e),{force:!0})}function Nl(e){let t=tB(e),n=gm(e);if(n===null)return{entry:null,running:!1,stale:!1,corrupt:t};switch(k_(n.pid,n.startToken??null)){case"same":return{entry:n,running:!0,stale:!1,corrupt:!1};case"different":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:n,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function tB(e){let t=Vt(e),n;try{n=fS(t,"utf-8")}catch{return!1}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0}catch{return!0}}function _S(){return Tc(process.pid)}var hS=w(()=>{"use strict";tn();Qe()});var RS={};
|
|
2435
|
+
`,"utf-8"),n}function gm(e){let t=Vt(e),n;try{n=fS(t,"utf-8")}catch{return null}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0?null:{pid:r.pid,startedAt:typeof r.startedAt=="string"?r.startedAt:"unknown",port:Number.isInteger(r.port)?r.port:0,bind:typeof r.bind=="string"?r.bind:"unknown",dbPath:typeof r.dbPath=="string"?r.dbPath:"unknown",startToken:typeof r.startToken=="string"?r.startToken:null}}catch{return null}}function ds(e){Zq(Vt(e),{force:!0})}function Nl(e){let t=tB(e),n=gm(e);if(n===null)return{entry:null,running:!1,stale:!1,corrupt:t};switch(k_(n.pid,n.startToken??null)){case"same":return{entry:n,running:!0,stale:!1,corrupt:!1};case"different":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:n,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:n,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function tB(e){let t=Vt(e),n;try{n=fS(t,"utf-8")}catch{return!1}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0}catch{return!0}}function _S(){return Tc(process.pid)}var hS=w(()=>{"use strict";tn();Qe()});var RS={};me(RS,{_resetStdoutEpipeGuardForTests:()=>aB,bootstrapAgentRestMailbox:()=>kS,installStdoutEpipeGuard:()=>TS,publishRegisteredWorkflowsOnStart:()=>SS,resolveLocalMailboxDir:()=>xS,resolveLocalWebuiDir:()=>NS,resolveServeConfig:()=>IS,runServe:()=>iB,runServeStatus:()=>vS,runServeStop:()=>bS,validateServeArgs:()=>AS});import{randomBytes as nB}from"node:crypto";import{existsSync as ES}from"node:fs";import{isIP as gS}from"node:net";import{homedir as rB}from"node:os";import{isAbsolute as wS,resolve as ym}from"node:path";async function iB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(sB),0;let n=e[0];return n==="status"?vS(e.slice(1),t):n==="stop"?bS(e.slice(1),t):n!=="start"?(t.stderr.write(n===void 0?yS:`error: unknown serve subcommand: ${n}
|
|
2436
2436
|
|
|
2437
2437
|
${yS.replace(/^error: [^\n]*\n\n/,"")}`),2):oB(e.slice(1),t)}async function oB(e,t){let n=AS(e,process.env);if(typeof n=="string")return t.stderr.write(`error: ${n}
|
|
2438
2438
|
`),2;let r=Xe({path:re()}),s={portCli:hB(e)},i;try{i=IS({dal:r,cli:s,env:process.env,parsed:n,io:t})}catch(S){return r.close(),t.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
|
|
@@ -2543,8 +2543,8 @@ unauthenticated daemon.
|
|
|
2543
2543
|
|
|
2544
2544
|
Run 'lmctl serve --help' for details.
|
|
2545
2545
|
`;Em=!1;cB=2e3;uB=100,fB=1e4});import{existsSync as EB,mkdirSync as wB,readFileSync as TB,renameSync as vB,unlinkSync as bB,writeFileSync as SB}from"node:fs";import{homedir as $S}from"node:os";import{dirname as bi,join as Ze,resolve as kB}from"node:path";function fs(e,t,n){let r=bi(kB(n)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??r,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())Yt(Ze(o,".mcp.json"),"mcpServers",[Xn(),Jn()]),a.has("opencode")&&Yt(Ze(o,".opencode","opencode.json"),"mcp",[MS(),DS()]),a.has("kimi")&&Yt(Ze(o,".kimi-code","mcp.json"),"mcpServers",[Xn(),Jn()]);for(let o of s)AB(o)}function CS(e=wm??$S()){return Ze(e,".copilot","mcp-config.json")}function NB(e,t){pt.mkdirSync(bi(e),{recursive:!0});let n=Ze(bi(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{pt.writeFileSync(n,`${JSON.stringify(t,null,2)}
|
|
2546
|
-
`,"utf8"),pt.renameSync(n,e)}catch(r){try{pt.unlinkSync(n)}catch{}throw r}}function xB(e,t){pt.mkdirSync(bi(e),{recursive:!0});let n=Ze(bi(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{pt.writeFileSync(n,t,"utf8"),pt.renameSync(n,e)}catch(r){try{pt.unlinkSync(n)}catch{}throw r}}function Yt(e,t,n){try{if(!pt.existsSync(e))return;let r=JSON.parse(pt.readFileSync(e,"utf8"));if(!us(r)||!us(r[t]))return;let s={...r[t]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[t]=s,NB(e,r)
|
|
2547
|
-
`))
|
|
2546
|
+
`,"utf8"),pt.renameSync(n,e)}catch(r){try{pt.unlinkSync(n)}catch{}throw r}}function xB(e,t){pt.mkdirSync(bi(e),{recursive:!0});let n=Ze(bi(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{pt.writeFileSync(n,t,"utf8"),pt.renameSync(n,e)}catch(r){try{pt.unlinkSync(n)}catch{}throw r}}function Yt(e,t,n){try{if(!pt.existsSync(e))return;let r=JSON.parse(pt.readFileSync(e,"utf8"));if(!us(r)||!us(r[t]))return;let s={...r[t]},i=[];for(let{name:o,shouldRemove:a}of n)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;r[t]=s,NB(e,r),$({event:"mcp_cleanup",path:e,removed:i})}catch{}}function Xn(){return{name:Al,shouldRemove:jB}}function MS(){return{name:Al,shouldRemove:PB}}function Jn(){return{name:xl,shouldRemove:MB}}function DS(){return{name:xl,shouldRemove:DB}}function AB(e){let t=wm??$S();switch(e){case"copilot":Yt(CS(t),"mcpServers",[Xn(),Jn()]);return;case"claude":Yt(Ze(t,".claude.json"),"mcpServers",[Xn(),Jn()]);return;case"gemini":Yt(Ze(t,".gemini","settings.json"),"mcpServers",[Xn(),Jn()]);return;case"qwen":Yt(Ze(t,".qwen","settings.json"),"mcpServers",[Xn(),Jn()]);return;case"agy":Yt(Ze(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[Xn(),Jn()]);return;case"opencode":Yt(Ze(t,".config","opencode","opencode.json"),"mcp",[MS(),DS()]);return;case"kimi":Yt(Ze(wm===void 0?process.env.KIMI_CODE_HOME??Ze(t,".kimi-code"):Ze(t,".kimi-code"),"mcp.json"),"mcpServers",[Xn(),Jn()]);return;case"codex":RB(Ze(t,".codex","config.toml"));return;default:return}}function RB(e){try{if(!pt.existsSync(e))return;let t=pt.readFileSync(e,"utf8"),n=LB(t);if(n===null)return;let r=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let c=jS(l);if(c===null)return;if(c!==void 0){if(OS(c,n)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=$B(l);if(d===null)return;if(d!==void 0&&OS(d,n)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;xB(e,s.join(`
|
|
2547
|
+
`)),$({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function OS(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function LB(e){let t=new Map,n;for(let s of e.split(/\n/)){let i=jS(s);if(i===null)return null;if(i!==void 0){n=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=OB(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==xl&&c[1]!==Al)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=PS(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=CB(l);if(u===null)return null;d.args=u}t.set(c[1],d)}let r=new Set;for(let[s,i]of t.entries())s===xl&&US(i.command,i.args)&&r.add(s),s===Al&&WS(i.command,i.args)&&r.add(s);return r}function OB(e,t){if(e.startsWith("mcp_servers"))return Rl(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let n=Rl(e);return n===null?null:[...t,...n]}function jS(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:Rl(t[1])}function $B(e){let t=e.indexOf("=");if(t<0)return;let n=e.slice(0,t).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return Rl(n)}function Rl(e){let t=[],n=0,r=()=>{for(;n<e.length&&/\s/.test(e[n]);)n+=1};for(;n<e.length;){if(r(),n>=e.length)return null;if(e[n]==='"'){n+=1;let s="",i=!1;for(;n<e.length;){let o=e[n];if(o==="\\"){if(n+1>=e.length)return null;s+=e[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;t.push(s)}else{let s=n;for(;n<e.length&&/[A-Za-z0-9_-]/.test(e[n]);)n+=1;if(n===s)return null;t.push(e.slice(s,n))}if(r(),n>=e.length)break;if(e[n]!==".")return null;n+=1}return t.length>0?t:null}function PS(e){let t=FS(e).trim();if(t.startsWith('"'))try{let n=JSON.parse(t);return typeof n=="string"?n:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function CB(e){let t=FS(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let n=t.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>PS(s.trim()));return r.some(s=>s===null)?null:r}function FS(e){let t;for(let n=0;n<e.length;n+=1){let r=e[n];if(t!==void 0){if(t==='"'&&r==="\\"){n+=1;continue}r===t&&(t=void 0);continue}if(r==='"'||r==="'"){t=r;continue}if(r==="#")return e.slice(0,n)}return e}function MB(e){return us(e)?e.type==="stdio"&&typeof e.command=="string"&&US(e.command,e.args):!1}function DB(e){return!us(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&BS(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&qS(e.command[0],[e.command[1],e.command[2]])}function jB(e){return us(e)?e.type==="stdio"&&WS(e.command,e.args):!1}function PB(e){return!us(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&HS(e.command[0])&&e.command[1]==="mcp"}function US(e,t){return BS(e)&&XS(t)||qS(e,t)}function WS(e,t){return HS(e)&&XS(t)}function qS(e,t){return FB(e)&&Array.isArray(t)&&t.length===2&&UB(t[0])&&t[1]==="mcp"}function BS(e){return typeof e=="string"&&Tm(e)==="lmctl"}function HS(e){return typeof e=="string"&&Tm(e)==="lmctl0"}function FB(e){if(typeof e!="string")return!1;let t=Tm(e).toLowerCase();return t==="node"||t==="node.exe"}function UB(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function Tm(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(r=>r.length>0).at(-1)??t}function XS(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function us(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var xl,Al,IB,pt,wm,Si=w(()=>{"use strict";ce();xl="lmctl",Al="lmctl0",IB={existsSync:EB,mkdirSync:wB,readFileSync:TB,writeFileSync:SB,renameSync:vB,unlinkSync:bB},pt=IB});function KS(e){let t=JS(e.registry,e.fromTeamfile);if(t===void 0)return ms(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!GS(t,e.fromAlias))return ms(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let n=JS(e.registry,e.toTeamfile);return n===void 0?ms(`target team is not registered in policy graph: ${e.toTeamfile}`):GS(n,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?ms(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?ms(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:ms(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function JS(e,t){return e.teams.find(n=>n.teamfile===t)}function GS(e,t){return e.aliases.some(n=>n===t)}function ms(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var VS=w(()=>{"use strict"});function WB(e){return e===null?null:$e(e)?"live":"dead"}function vm(e){let t=e.nowMs??Date.now(),n=Date.parse(e.since);return{holder_pid:e.holderPid,holder_liveness:WB(e.holderPid),since:e.since,idle_ms:Number.isFinite(n)?Math.max(0,t-n):null}}function qB(e){let t=Math.floor(e/1e3),n=Math.floor(t/3600),r=Math.floor(t%3600/60),s=t%60;return n>0?`${n}h ${String(r).padStart(2,"0")}m`:r>0?`${r}m ${String(s).padStart(2,"0")}s`:`${s}s`}function bm(e){let t=[];return e.idle_ms!==null&&t.push(`active ${qB(e.idle_ms)}`),t.push(`since ${e.since}`),t.push(e.holder_pid===null?"holder_pid=unavailable":`holder_pid=${e.holder_pid}, ${e.holder_liveness}`),`(${t.join("; ")})`}var YS=w(()=>{"use strict";tn()});import{randomUUID as BB}from"node:crypto";import{hostname as zS,networkInterfaces as HB}from"node:os";function ZS(e){let t=(e.now??new Date).toISOString();return{lock_id:BB(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??zS(),holder_ips:e.ips??VB(),started_at:t,last_heartbeat:t}}function QS(e=process.env){return ek(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,XB)}function GB(e=process.env){return ek(e.LMCTL_TERMINAL_LOCK_STALE_MS,JB)}function Sm(e,t={}){let n=t.now??new Date,r=t.localHost??zS(),s=t.staleMs??GB();if(e.holder_host===r)return(t.isProcessAlive??KB)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(e.last_heartbeat);return Number.isFinite(i)?n.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function km(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function ek(e,t){if(e===void 0||e.trim()==="")return t;let n=e.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?t:r}function KB(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}function VB(){let e=new Set;for(let t of Object.values(HB()))for(let n of t??[])n.internal||e.add(n.address);return[...e].sort()}var XB,JB,Im=w(()=>{"use strict";XB=15e3,JB=12e4});function Nm(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
|
|
2548
2548
|
manually, outside a member session that lmctl started. Running lmctl this way is
|
|
2549
2549
|
not officially supported.
|
|
2550
2550
|
To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function yn(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
|
|
@@ -2557,7 +2557,7 @@ ${Nm(e)}`}function nk(e,t){let n=_r(e,t);return n.ok?{ok:!0,identity:n.identity,
|
|
|
2557
2557
|
`),null}}async function ik(e,t,n){let r=Ni(n.message),s=n.response===null?null:Ni(n.response);try{await R(e,i=>i.finishTeamChatLog(t,{root_teamfile:n.root_teamfile,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,receiver_provider:n.receiver_provider,receiver_session_id:n.receiver_session_id,provider_prompt:n.message,message:r.text,response:s?.text??null,origin:n.origin,status:n.status,error_detail:n.error_detail,truncated:r.truncated||s?.truncated?1:0,created_at:new Date().toISOString()}))}catch(i){e.stderr.write(`warning: failed to finish chat log ${t}: ${i instanceof Error?i.message:String(i)}
|
|
2558
2558
|
`)}}async function pH(e,t,n){if(t!==null)try{await R(e,r=>{r.clearCurrentlyHandlingMessage(t.receiver_teamfile,t.receiver_alias,n)})}catch(r){e.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
|
|
2559
2559
|
`)}}async function _H(e,t){let n=Ni(t.message),r=t.response===null?null:Ni(t.response);try{return await R(e,s=>s.insertTeamChatLog({root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,receiver_provider:t.receiver_provider,receiver_session_id:t.receiver_session_id,provider_prompt:t.message,message:n.text,response:r?.text??null,origin:t.origin,status:t.status,error_detail:t.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return e.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
|
|
2560
|
-
`),null}}function ps(e,t,n,r,s){e!==null||t===null
|
|
2560
|
+
`),null}}function ps(e,t,n,r,s){e!==null||t===null||$({event:"chat_attempt_error",reason:s,root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,origin:t.origin,error_detail:r,message_preview:Ii(n)})}function Ni(e){return e.length<=rk?{text:e,truncated:!1}:{text:e.slice(0,rk),truncated:!0}}var rk,ok,Lm=w(()=>{"use strict";rt();hn();Si();VS();Kt();hi();ce();Le();gt();_i();hl();uo();YS();Im();ki();Ll();ll();Rr();rk=256*1024,ok=3e4});var _k={};me(_k,{parseIdleTimeoutMs:()=>mk,resolvePromptInput:()=>fk,runChat:()=>yH});import{readFileSync as hH}from"node:fs";async function yH(e,t={stdout:process.stdout,stderr:process.stderr}){let n=t.env??process.env;if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(`${dk}
|
|
2561
2561
|
`),e.length===0?2:0;let r=EH(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
|
|
2562
2562
|
${dk}
|
|
2563
2563
|
`),2;if(r.promptFile!==void 0){let u=await fk(r.promptFile,t);if(typeof u!="string")return t.stderr.write(`error: ${u.error}
|
|
@@ -2602,7 +2602,7 @@ ${dk}
|
|
|
2602
2602
|
`),s}async function wH(e){let t=[];for await(let n of e)t.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(t).toString("utf8")}function mk(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let n=Number(t[1]),r=t[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function pk(e,t,n){n.kind==="tool_use"?e.stderr.write(`[${t}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}
|
|
2603
2603
|
`):n.kind==="tool_result"?e.stderr.write(`[${t}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}
|
|
2604
2604
|
`):n.kind==="api_retry"&&e.stderr.write(`[${t}] api_retry${n.summary?`: ${n.summary}`:""}
|
|
2605
|
-
`)}function TH(e,t){return e.slice(-t)}function vH(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?pk(e,t.alias,t.event):e.stderr.write(t.message)}var gH,dk,hk=w(()=>{"use strict";vt();Yi();Le();rt();Lm();ki();
|
|
2605
|
+
`)}function TH(e,t){return e.slice(-t)}function vH(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?pk(e,t.alias,t.event):e.stderr.write(t.message)}var gH,dk,hk=w(()=>{"use strict";vt();Yi();Le();rt();Lm();ki();ce();za();cn();gH={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},dk=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
|
|
2606
2606
|
lmctl chat <teamfile> <alias> "<prompt>"
|
|
2607
2607
|
lmctl chat <sessionid> "<prompt>" --provider <name>
|
|
2608
2608
|
lmctl chat --provider <name> --session <id> "<prompt>"
|
|
@@ -2623,7 +2623,7 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
|
|
|
2623
2623
|
"message_id":"msg_..."} line after durable creation, then a final result line
|
|
2624
2624
|
with the same message_id. Busy and enqueued outcomes emit one line.
|
|
2625
2625
|
|
|
2626
|
-
Send a prompt to a team member or raw provider session, or answer a paused run.`});function xi(e){for(let t=e.length-1;t>=0;t-=1){let n=e[t],r=bH.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),i=r[2]===void 0?0:Number.parseInt(r[2],10),o=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:SH(n.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function SH(e,t,n,r,s){if(!Number.isFinite(e.getTime())||t<1||t>12||n<0||n>59)return null;let i=kH(t,r);try{let o=IH(e,s),a=gk(o.year,o.month,o.day,i,n,s);if(a.getTime()<=e.getTime()){let l=RH(o,1);a=gk(l.year,l.month,l.day,i,n,s)}return a.toISOString()}catch{return null}}function kH(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function IH(e,t){let n=yk(t,!1).formatToParts(e);return{year:En(n,"year"),month:En(n,"month"),day:En(n,"day")}}function gk(e,t,n,r,s,i){let o=Date.UTC(e,t-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=NH(new Date(o),i);o=Date.UTC(e,t-1,n,r,s,0,0)-l}return new Date(o)}function NH(e,t){let n=yk(t,!0).formatToParts(e);return Date.UTC(En(n,"year"),En(n,"month")-1,En(n,"day"),En(n,"hour"),En(n,"minute"),En(n,"second"),0)-e.getTime()}function yk(e,t){let n=t?AH:xH,r=n.get(e);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(e,s),s}function En(e,t){let n=e.find(r=>r.type===t)?.value;if(n===void 0)throw new Error(`missing ${t}`);return Number.parseInt(n,10)}function RH(e,t){let n=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var bH,xH,AH,Om=w(()=>{"use strict";bH=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;xH=new Map,AH=new Map});var Tk={};
|
|
2626
|
+
Send a prompt to a team member or raw provider session, or answer a paused run.`});function xi(e){for(let t=e.length-1;t>=0;t-=1){let n=e[t],r=bH.exec(n.content);if(r===null){if(n.role==="assistant"&&n.content.trim().length>0)return null;continue}let s=Number.parseInt(r[1],10),i=r[2]===void 0?0:Number.parseInt(r[2],10),o=r[3].toLowerCase(),a=r[4]?.trim()??null,l=`${r[1]}${r[2]!==void 0?`:${r[2]}`:""}${o}`;return{state:"LIMITED",resets_at:a===null?null:SH(n.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function SH(e,t,n,r,s){if(!Number.isFinite(e.getTime())||t<1||t>12||n<0||n>59)return null;let i=kH(t,r);try{let o=IH(e,s),a=gk(o.year,o.month,o.day,i,n,s);if(a.getTime()<=e.getTime()){let l=RH(o,1);a=gk(l.year,l.month,l.day,i,n,s)}return a.toISOString()}catch{return null}}function kH(e,t){return t==="am"?e===12?0:e:e===12?12:e+12}function IH(e,t){let n=yk(t,!1).formatToParts(e);return{year:En(n,"year"),month:En(n,"month"),day:En(n,"day")}}function gk(e,t,n,r,s,i){let o=Date.UTC(e,t-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=NH(new Date(o),i);o=Date.UTC(e,t-1,n,r,s,0,0)-l}return new Date(o)}function NH(e,t){let n=yk(t,!0).formatToParts(e);return Date.UTC(En(n,"year"),En(n,"month")-1,En(n,"day"),En(n,"hour"),En(n,"minute"),En(n,"second"),0)-e.getTime()}function yk(e,t){let n=t?AH:xH,r=n.get(e);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:e,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...t?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(e,s),s}function En(e,t){let n=e.find(r=>r.type===t)?.value;if(n===void 0)throw new Error(`missing ${t}`);return Number.parseInt(n,10)}function RH(e,t){let n=new Date(Date.UTC(e.year,e.month-1,e.day+t));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var bH,xH,AH,Om=w(()=>{"use strict";bH=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;xH=new Map,AH=new Map});var Tk={};me(Tk,{runRecover:()=>OH});import{dirname as Ek,resolve as wk}from"node:path";async function OH(e,t,n={}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${$m}
|
|
2627
2627
|
`),0;let r=Y(e.filter(p=>p!=="--"),[],["--all","--dry-run","--json"]);if(r.error!==void 0)return I(t,`${r.error}
|
|
2628
2628
|
|
|
2629
2629
|
${$m}`);if(r.positionals.length===0)return I(t,`recover requires a <teamfile>
|
|
@@ -2631,7 +2631,7 @@ ${$m}`);if(r.positionals.length===0)return I(t,`recover requires a <teamfile>
|
|
|
2631
2631
|
${$m}`);if(r.positionals.length>2)return I(t,`unexpected argument: ${r.positionals[2]}`);let s=r.positionals[0],i=gn(s),o=i?.teamfile??s,a=r.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return I(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(W(r,"--all")&&l!==void 0)return I(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await $H(t,o,l)}catch(p){if(p instanceof we)return I(t,p.message);throw p}let d=n.now??new Date,u=W(r,"--dry-run"),f=[];for(let p of c)f.push(await CH(t,p,{now:d,dryRun:u}));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(W(r,"--json"))z(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(MH(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
|
|
2632
2632
|
`)}return m.errors>0?1:0}async function $H(e,t,n){return await R(e,r=>{let s=Ee(t,r);if(n!==void 0){let i=Be(s,r);if(i.parseErrors.length>0)throw new we(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=dl(i,n);return o?.teamfile!==void 0?Cm(wk(Ek(s),o.teamfile),r,new Set):[Te(t,n,r)]}return Cm(s,r,new Set)})}function Cm(e,t,n){let r=Ee(e,t);if(n.has(r))return[];n.add(r);let s=Be(r,t);if(s.parseErrors.length>0)throw new we(`lmctl: ${r}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Cm(wk(Ek(r),o.teamfile),t,n));continue}o.session!==void 0&&i.push(Te(r,o.alias,t))}return i}async function CH(e,t,n){let r;try{let a=await De(t.sessionid,t.provider);if(a===null)return zt(t,"session_not_found",null,"session detail not found");r=xi(a.messages)}catch(a){return zt(t,"load_error",null,a instanceof Error?a.message:String(a))}if(r===null)return zt(t,"not_limited",null,"no current session-limit marker");if(r.resets_at===null)return zt(t,"unknown_reset",r,"reset time could not be parsed");let s=Date.parse(r.resets_at);if(!Number.isFinite(s))return zt(t,"unknown_reset",r,"reset time could not be parsed");if(s>n.now.getTime())return zt(t,"not_due",r,`resets_at ${r.resets_at} is in the future`);let i=await R(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return zt(t,"busy",r,`in-flight since ${i.started_at}`);if(n.dryRun)return zt(t,"would_recover",r,null);let o=await Cl({teamfile:t.teamfile,alias:t.alias,prompt:LH,permissionMode:"yolo",io:e,env:process.env});return o.status==="ok"||o.status==="stalled"?zt(t,"recovered",r,null):zt(t,o.status==="busy"?"busy":"send_error",r,o.message)}function zt(e,t,n,r){return{alias:e.alias,teamfile:e.teamfile,provider:e.provider,sessionid:e.sessionid,action:t,sessionLimit:n,reason:r}}function MH(e){let t=e.sessionLimit?.resets_at??"unknown",n=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${n}
|
|
2633
2633
|
`}var LH,$m,vk=w(()=>{"use strict";Om();At();hn();Kt();rt();Lm();Le();LH="Your session limit reset time has passed. Continue your work from the last actionable point.",$m=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<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(`
|
|
2634
|
-
`)});var Ml,Mm=w(()=>{"use strict";Ml=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"])});var Ak={};fe(Ak,{buildSessionInspection:()=>Li,runSession:()=>WH});import{readFile as DH}from"node:fs/promises";async function WH(e,t,n=PH){if(e.length===1&&(e[0]==="--help"||e[0]==="-h"))return z(t,{schema_version:jm,usage:kk}),0;let r=Y(e,["--query-file"],[]);if(r.error!==void 0)return Gn(t,r.error,!0);if(r.positionals.length>0)return Gn(t,"positional and inline JSON arguments are not supported; use --query-file",!0);let s=$(r,"--query-file");if(s===void 0)return Gn(t,"missing required --query-file",!0);let i;try{i=s==="-"?await n2(t.stdin??process.stdin):await DH(s,"utf8")}catch(u){return Gn(t,`cannot read query file ${JSON.stringify(s)}: ${Ai(u)}`)}let o;try{o=BH(i)}catch(u){return Gn(t,Ai(u))}let a,l,c;try{if(o.teamfile!==void 0&&o.alias!==void 0){let u=await n.resolveTeamTarget(o.teamfile,o.alias,t);a=u.provider,l=u.sessionid,c=u.alias}else a=o.provider,l=o.sessionId}catch(u){return Gn(t,Ai(u))}let d;try{d=await n.loadSession(l,a)}catch(u){return Gn(t,`failed to load session: ${Ai(u)}`)}return d===null?Gn(t,`session not found: ${l} (provider=${a})`):(z(t,Li(d,c)),0)}function Li(e,t){let n=QH(e.messages),r=e2(n,jH),s=KH(e,n!==null),i=HH(e),o=t?.toLowerCase()==="lead",a=i.filter(u=>u.kind==="file_write").length,l=i.filter(u=>u.kind==="file_edit").length,c=Ri[e.provider],d=t===void 0?c==="none"?"none":"partial":c;return{schema_version:jm,provider:e.provider,sessionId:e.sessionId,modifiedAt:e.modifiedAt.toISOString(),lastPrompt:r.text,lastPromptTruncated:r.truncated,handled:s.value,handledSignal:s.signal,tokens:VH(e),toolCalls:i,authorship:{alias:t??null,isLeadAlias:o,selfFileWriteCount:a,selfFileEditCount:l,flag:o&&a+l>0?"lead_self_authoring":null},coverage:{toolCalls:Ri[e.provider],resultPairing:Ik[e.provider],backgroundTaskCorrelation:qH(e.provider),authorship:d,tokens:FH[e.provider],handled:s.coverage}}}function qH(e){return e==="claude"||e==="kimi"||e==="agy"?"full":e==="copilot"?"partial":"none"}function BH(e){let t;try{t=JSON.parse(e)}catch(l){throw new Error(`query is not valid JSON: ${Ai(l)}`)}if(!xk(t))throw new Error("query must be a JSON object");let n=Dl(t.teamfile),r=Dl(t.alias),s=Dl(t.provider),i=Dl(t.sessionId),o=n!==void 0||r!==void 0,a=s!==void 0||i!==void 0;if(o&&a)throw new Error("query must use exactly one target form: teamfile+alias or provider+sessionId");if(o){if(n===void 0||r===void 0)throw new Error("team target requires both teamfile and alias");return{teamfile:n,alias:r}}if(a){if(s===void 0||i===void 0)throw new Error("raw target requires both provider and sessionId");if(!Ml.has(s))throw new Error(`invalid provider ${JSON.stringify(s)}`);return{provider:s,sessionId:i}}throw new Error("query requires teamfile+alias or provider+sessionId")}function HH(e){if(Ri[e.provider]==="none")return[];let t=UH[e.provider]??{},n=new Set,r=[];for(let s=0;s<e.messages.length;s+=1){let i=e.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=t[i.toolName],a=i.toolInputData??t2(i.toolInput),l=o===void 0?void 0:XH(o,a),c=GH(e.messages,s,i.toolCallId,n,e.provider==="agy"),d=c===void 0?void 0:e.messages[c];c!==void 0&&n.add(c);let u=o===void 0?[]:JH(o,a),f=u.length>0?u:[{kind:o?.kind??"other",value:l}];for(let m of f)r.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:d?.timestamp.toISOString()??null,result:d===void 0?null:d.toolDetailedContent??d.content})}return r}function XH(e,t){if(t!==void 0)for(let n of[e.inputKey,...e.fallbackInputKeys??[]]){let r=Dm(t[n]);if(r!==void 0)return r}}function JH(e,t){if(e.multi===void 0||t===void 0)return[];let n=t[e.multi.pathsKey],r=t[e.multi.kindsKey];if(!Array.isArray(n)||!Array.isArray(r))return[];let s=[];for(let i=0;i<Math.min(n.length,r.length);i+=1){let o=Dm(n[i]),a=Dm(r[i]),l=a===void 0?void 0:e.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function GH(e,t,n,r,s){if(n===void 0)return;let i=s?0:t+1;for(let o=i;o<e.length;o+=1){let a=e[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function KH(e,t){if(!t)return{value:null,signal:"unavailable",coverage:"unavailable"};if(e.turnStatus!==void 0){let s=e.provider==="claude"?"native_stop_reason":e.turnStatus==="complete"?"native_task_complete":e.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:e.turnStatus==="complete",signal:s,coverage:"native"}}let n=Nk(e.messages,"user");return{value:n>=0&&e.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function VH(e){let t=e.lastTokenUsage,n=zH(e),r=ZH(e.provider);return{lastTurn:YH(t),aggregate:{input:n,output:e.totalOutputTokens??null,cacheRead:e.totalCachedInputTokens??null,cacheWrite:e.totalCacheWriteInputTokens??null},normalization:r}}function YH(e){return{input:e?.inputTokens??null,output:e?.outputTokens??null,cacheRead:e?.cachedInputTokens??null,cacheWrite:e?.cacheWriteInputTokens??null}}function zH(e){return e.totalInputTokens===void 0?null:e.provider==="claude"?Math.max(0,e.totalInputTokens-(e.totalCachedInputTokens??0)-(e.totalCacheWriteInputTokens??0)):e.provider==="gemini"||e.provider==="qwen"?Math.max(0,e.totalInputTokens-(e.totalCachedInputTokens??0)):e.totalInputTokens}function ZH(e){switch(e){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function QH(e){let t=Nk(e,"user");return t<0?null:e[t].content}function Nk(e,t){for(let n=e.length-1;n>=0;n-=1)if(e[n].role===t)return n;return-1}function e2(e,t){if(e===null)return{text:null,truncated:!1};let n=Buffer.from(e,"utf8");if(n.length<=t)return{text:e,truncated:!1};let r=t;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function t2(e){if(e!==void 0)try{let t=JSON.parse(e);return xk(t)?t:void 0}catch{return}}function xk(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Dl(e){return typeof e=="string"&&e.trim().length>0?e:void 0}function Dm(e){return typeof e=="string"?e:void 0}async function n2(e){let t="";for await(let n of e)t+=Buffer.isBuffer(n)?n.toString("utf8"):String(n);return t}function Gn(e,t,n=!1){return z(e,{schema_version:jm,error:t,...n?{usage:kk}:{}}),1}function Ai(e){return e instanceof Error?e.message:String(e)}var jm,jH,kk,PH,Ri,Ik,bk,FH,Sk,UH,Pm=w(()=>{"use strict";Mm();At();Le();rt();jm=1,jH=32*1024,kk="usage: lmctl session --query-file <path> (- reads JSON from stdin)",PH={loadSession:De,resolveTeamTarget:(e,t,n)=>R(n,r=>Te(e,t,r))},Ri={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",ClaudeMock:"none"},Ik={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",ClaudeMock:"none"},bk={none:0,heuristic:1,partial:2,full:3};for(let e of Object.keys(Ri))if(bk[Ik[e]]>bk[Ri[e]])throw new Error(`invalid session coverage for ${e}: result pairing exceeds tool-call coverage`);FH={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",ClaudeMock:"none"},Sk={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},UH={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:Sk,lmplayer:Sk,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});function Fm(e){let t;try{t=m2(e)}catch{return[{kind:"mutate",note:"shell command could not be parsed"}]}let n=[],r="",s=!1;for(let i=0;i<t.length;i+=1){let a=t[i].command;if(a.argv.length===0&&a.redirects.length===0)continue;let l=Ck(a.argv),c=l===a.argv?a:{...a,argv:l},d=Oi(c.argv[0]?.text??"");if(d==="cd"){let f=c.argv[1];f===void 0?s=!0:f.literal?r=Pk(r,f.text):s=!0;continue}if(r2.has(c.argv[0]?.text??"")){n.push({kind:"mutate",note:`compound shell construct not analyzed: ${Ge(e)}`});break}let u=h2(c);if(u!==null){let f=u.literal?Fm(u.text):[{kind:"mutate",note:"sh -c script involves expansion; not analyzed"}];n.push(...f.map(m=>Ok(m,r,s)));continue}n.push(...c2(c,d,jk(t,i)).map(f=>Ok(f,r,s)))}return n}function c2(e,t,n){let r=[],s=e.redirects.filter(o=>o.fd===1||o.fd==="&"),i=e.redirects.filter(o=>o.fd===2);for(let o of i){let a=Lk(o);a!=="ignored"&&r.push(a===null?{kind:"mutate",note:`stderr redirect target not literal: ${Ge(e.raw)}`}:{kind:"mutate",path:a,note:"file receives command stderr; content not reconstructable"})}if(s.length>0){let o=Mk(e,t,n);for(let a of s){let l=Lk(a);l!=="ignored"&&(l===null?r.push({kind:"mutate",note:`redirect target not literal: ${Ge(e.raw)}`}):o===null||e.hasSubstitution?r.push({kind:"mutate",path:l,note:`content not reconstructable from: ${Ge(e.raw)}`}):r.push({kind:a.op===">>"?"append":"write",path:l,content:o}))}return r}if(r.push(...u2(e,t,n)),r.length===0&&d2(e,t)){let o=e.argv.slice(1).map(a=>a.text).filter(a=>a.length>0);o.length>0&&r.push({kind:"opaque",tokens:o,command:Ge(e.raw)})}return r}function d2(e,t){return t===""||l2.has(t)?!1:o2.has(t)?t==="find"?e.argv.some(n=>n.text==="-delete"||n.text==="-exec"||n.text==="-execdir"||n.text==="-ok"):!1:!0}function Ck(e){let t=0;for(;t<e.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(e[t].text);)t+=1;for(;t<e.length&&i2.has(Oi(e[t].text));){let n=Oi(e[t].text);for(t+=1;t<e.length&&e[t].text.startsWith("-");)t+=1;if(n==="timeout"&&t<e.length&&/^\d/.test(e[t].text)&&(t+=1),n==="env")for(;t<e.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(e[t].text);)t+=1}return t===0?e:e.slice(t)}function Mk(e,t,n){if(e.hasSubstitution)return null;let r=e.argv.slice(1);if(t==="echo"){let s=!0,i=0;for(;i<r.length&&/^-[neE]+$/.test(r[i].text);){let a=r[i].text;if(a.includes("n")&&(s=!1),a.includes("e"))return null;i+=1}let o=r.slice(i);return o.every(a=>a.literal)?o.map(a=>a.text).join(" ")+(s?`
|
|
2634
|
+
`)});var Ml,Mm=w(()=>{"use strict";Ml=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","ClaudeMock"])});var Ak={};me(Ak,{buildSessionInspection:()=>Li,runSession:()=>WH});import{readFile as DH}from"node:fs/promises";async function WH(e,t,n=PH){if(e.length===1&&(e[0]==="--help"||e[0]==="-h"))return z(t,{schema_version:jm,usage:kk}),0;let r=Y(e,["--query-file"],[]);if(r.error!==void 0)return Gn(t,r.error,!0);if(r.positionals.length>0)return Gn(t,"positional and inline JSON arguments are not supported; use --query-file",!0);let s=C(r,"--query-file");if(s===void 0)return Gn(t,"missing required --query-file",!0);let i;try{i=s==="-"?await n2(t.stdin??process.stdin):await DH(s,"utf8")}catch(u){return Gn(t,`cannot read query file ${JSON.stringify(s)}: ${Ai(u)}`)}let o;try{o=BH(i)}catch(u){return Gn(t,Ai(u))}let a,l,c;try{if(o.teamfile!==void 0&&o.alias!==void 0){let u=await n.resolveTeamTarget(o.teamfile,o.alias,t);a=u.provider,l=u.sessionid,c=u.alias}else a=o.provider,l=o.sessionId}catch(u){return Gn(t,Ai(u))}let d;try{d=await n.loadSession(l,a)}catch(u){return Gn(t,`failed to load session: ${Ai(u)}`)}return d===null?Gn(t,`session not found: ${l} (provider=${a})`):(z(t,Li(d,c)),0)}function Li(e,t){let n=QH(e.messages),r=e2(n,jH),s=KH(e,n!==null),i=HH(e),o=t?.toLowerCase()==="lead",a=i.filter(u=>u.kind==="file_write").length,l=i.filter(u=>u.kind==="file_edit").length,c=Ri[e.provider],d=t===void 0?c==="none"?"none":"partial":c;return{schema_version:jm,provider:e.provider,sessionId:e.sessionId,modifiedAt:e.modifiedAt.toISOString(),lastPrompt:r.text,lastPromptTruncated:r.truncated,handled:s.value,handledSignal:s.signal,tokens:VH(e),toolCalls:i,authorship:{alias:t??null,isLeadAlias:o,selfFileWriteCount:a,selfFileEditCount:l,flag:o&&a+l>0?"lead_self_authoring":null},coverage:{toolCalls:Ri[e.provider],resultPairing:Ik[e.provider],backgroundTaskCorrelation:qH(e.provider),authorship:d,tokens:FH[e.provider],handled:s.coverage}}}function qH(e){return e==="claude"||e==="kimi"||e==="agy"?"full":e==="copilot"?"partial":"none"}function BH(e){let t;try{t=JSON.parse(e)}catch(l){throw new Error(`query is not valid JSON: ${Ai(l)}`)}if(!xk(t))throw new Error("query must be a JSON object");let n=Dl(t.teamfile),r=Dl(t.alias),s=Dl(t.provider),i=Dl(t.sessionId),o=n!==void 0||r!==void 0,a=s!==void 0||i!==void 0;if(o&&a)throw new Error("query must use exactly one target form: teamfile+alias or provider+sessionId");if(o){if(n===void 0||r===void 0)throw new Error("team target requires both teamfile and alias");return{teamfile:n,alias:r}}if(a){if(s===void 0||i===void 0)throw new Error("raw target requires both provider and sessionId");if(!Ml.has(s))throw new Error(`invalid provider ${JSON.stringify(s)}`);return{provider:s,sessionId:i}}throw new Error("query requires teamfile+alias or provider+sessionId")}function HH(e){if(Ri[e.provider]==="none")return[];let t=UH[e.provider]??{},n=new Set,r=[];for(let s=0;s<e.messages.length;s+=1){let i=e.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=t[i.toolName],a=i.toolInputData??t2(i.toolInput),l=o===void 0?void 0:XH(o,a),c=GH(e.messages,s,i.toolCallId,n,e.provider==="agy"),d=c===void 0?void 0:e.messages[c];c!==void 0&&n.add(c);let u=o===void 0?[]:JH(o,a),f=u.length>0?u:[{kind:o?.kind??"other",value:l}];for(let m of f)r.push({kind:m.kind,name:i.toolName,...m.kind==="shell"?{command:m.value??null}:{},...m.kind==="file_read"||m.kind==="file_write"||m.kind==="file_edit"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:d?.timestamp.toISOString()??null,result:d===void 0?null:d.toolDetailedContent??d.content})}return r}function XH(e,t){if(t!==void 0)for(let n of[e.inputKey,...e.fallbackInputKeys??[]]){let r=Dm(t[n]);if(r!==void 0)return r}}function JH(e,t){if(e.multi===void 0||t===void 0)return[];let n=t[e.multi.pathsKey],r=t[e.multi.kindsKey];if(!Array.isArray(n)||!Array.isArray(r))return[];let s=[];for(let i=0;i<Math.min(n.length,r.length);i+=1){let o=Dm(n[i]),a=Dm(r[i]),l=a===void 0?void 0:e.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function GH(e,t,n,r,s){if(n===void 0)return;let i=s?0:t+1;for(let o=i;o<e.length;o+=1){let a=e[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function KH(e,t){if(!t)return{value:null,signal:"unavailable",coverage:"unavailable"};if(e.turnStatus!==void 0){let s=e.provider==="claude"?"native_stop_reason":e.turnStatus==="complete"?"native_task_complete":e.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:e.turnStatus==="complete",signal:s,coverage:"native"}}let n=Nk(e.messages,"user");return{value:n>=0&&e.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function VH(e){let t=e.lastTokenUsage,n=zH(e),r=ZH(e.provider);return{lastTurn:YH(t),aggregate:{input:n,output:e.totalOutputTokens??null,cacheRead:e.totalCachedInputTokens??null,cacheWrite:e.totalCacheWriteInputTokens??null},normalization:r}}function YH(e){return{input:e?.inputTokens??null,output:e?.outputTokens??null,cacheRead:e?.cachedInputTokens??null,cacheWrite:e?.cacheWriteInputTokens??null}}function zH(e){return e.totalInputTokens===void 0?null:e.provider==="claude"?Math.max(0,e.totalInputTokens-(e.totalCachedInputTokens??0)-(e.totalCacheWriteInputTokens??0)):e.provider==="gemini"||e.provider==="qwen"?Math.max(0,e.totalInputTokens-(e.totalCachedInputTokens??0)):e.totalInputTokens}function ZH(e){switch(e){case"claude":return{id:"claude-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent"};case"gemini":return{id:"gemini-input-excludes-cache",note:"input excludes cached prompt tokens; cacheRead reports the cached subset"};case"kimi":return{id:"kimi-splits-other",note:"input is Kimi inputOther; cacheRead and cacheWrite are separate counters"};case"codex":return{id:"codex-upstream-passthrough",note:"input and cacheRead preserve Codex upstream token_count semantics"};case"opencode":case"lmplayer":return{id:"opencode-standard",note:"input excludes cacheRead and cacheWrite; all four counters are independent per-turn DB rows"};case"copilot":return{id:"copilot-shutdown-aggregate",note:"aggregate input/cache come from session.shutdown modelMetrics (absent on live sessions); lastTurn reports output only"};case"qwen":return{id:"qwen-gemini-usage-metadata",note:"input excludes cachedContentTokenCount (Gemini usageMetadata semantics: prompt includes the cached subset); output includes thoughts; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function QH(e){let t=Nk(e,"user");return t<0?null:e[t].content}function Nk(e,t){for(let n=e.length-1;n>=0;n-=1)if(e[n].role===t)return n;return-1}function e2(e,t){if(e===null)return{text:null,truncated:!1};let n=Buffer.from(e,"utf8");if(n.length<=t)return{text:e,truncated:!1};let r=t;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function t2(e){if(e!==void 0)try{let t=JSON.parse(e);return xk(t)?t:void 0}catch{return}}function xk(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Dl(e){return typeof e=="string"&&e.trim().length>0?e:void 0}function Dm(e){return typeof e=="string"?e:void 0}async function n2(e){let t="";for await(let n of e)t+=Buffer.isBuffer(n)?n.toString("utf8"):String(n);return t}function Gn(e,t,n=!1){return z(e,{schema_version:jm,error:t,...n?{usage:kk}:{}}),1}function Ai(e){return e instanceof Error?e.message:String(e)}var jm,jH,kk,PH,Ri,Ik,bk,FH,Sk,UH,Pm=w(()=>{"use strict";Mm();At();Le();rt();jm=1,jH=32*1024,kk="usage: lmctl session --query-file <path> (- reads JSON from stdin)",PH={loadSession:De,resolveTeamTarget:(e,t,n)=>R(n,r=>Te(e,t,r))},Ri={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",ClaudeMock:"none"},Ik={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",ClaudeMock:"none"},bk={none:0,heuristic:1,partial:2,full:3};for(let e of Object.keys(Ri))if(bk[Ik[e]]>bk[Ri[e]])throw new Error(`invalid session coverage for ${e}: result pairing exceeds tool-call coverage`);FH={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",ClaudeMock:"none"},Sk={bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"filePath",fallbackInputKeys:["path","file"]},write:{kind:"file_write",inputKey:"filePath",fallbackInputKeys:["path","file"]},edit:{kind:"file_edit",inputKey:"filePath",fallbackInputKeys:["path","file"]}},UH={claude:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"file_path"},Write:{kind:"file_write",inputKey:"file_path"},Edit:{kind:"file_edit",inputKey:"file_path"}},codex:{exec_command:{kind:"shell",inputKey:"cmd"},apply_patch:{kind:"file_edit",inputKey:"path",multi:{pathsKey:"paths",kindsKey:"kinds",kindByValue:{Add:"file_write",Update:"file_edit",Move:"file_edit",Delete:"file_edit"}}}},copilot:{bash:{kind:"shell",inputKey:"command"}},opencode:Sk,lmplayer:Sk,kimi:{Bash:{kind:"shell",inputKey:"command"},Read:{kind:"file_read",inputKey:"path"},Write:{kind:"file_write",inputKey:"path"},Edit:{kind:"file_edit",inputKey:"path"}},qwen:{run_shell_command:{kind:"shell",inputKey:"command"},read_file:{kind:"file_read",inputKey:"file_path"}},agy:{run_command:{kind:"shell",inputKey:"CommandLine"},view_file:{kind:"file_read",inputKey:"AbsolutePath"},write_to_file:{kind:"file_write",inputKey:"TargetFile"},replace_file_content:{kind:"file_edit",inputKey:"TargetFile"},multi_replace_file_content:{kind:"file_edit",inputKey:"TargetFile"}}}});function Fm(e){let t;try{t=m2(e)}catch{return[{kind:"mutate",note:"shell command could not be parsed"}]}let n=[],r="",s=!1;for(let i=0;i<t.length;i+=1){let a=t[i].command;if(a.argv.length===0&&a.redirects.length===0)continue;let l=Ck(a.argv),c=l===a.argv?a:{...a,argv:l},d=Oi(c.argv[0]?.text??"");if(d==="cd"){let f=c.argv[1];f===void 0?s=!0:f.literal?r=Pk(r,f.text):s=!0;continue}if(r2.has(c.argv[0]?.text??"")){n.push({kind:"mutate",note:`compound shell construct not analyzed: ${Ge(e)}`});break}let u=h2(c);if(u!==null){let f=u.literal?Fm(u.text):[{kind:"mutate",note:"sh -c script involves expansion; not analyzed"}];n.push(...f.map(m=>Ok(m,r,s)));continue}n.push(...c2(c,d,jk(t,i)).map(f=>Ok(f,r,s)))}return n}function c2(e,t,n){let r=[],s=e.redirects.filter(o=>o.fd===1||o.fd==="&"),i=e.redirects.filter(o=>o.fd===2);for(let o of i){let a=Lk(o);a!=="ignored"&&r.push(a===null?{kind:"mutate",note:`stderr redirect target not literal: ${Ge(e.raw)}`}:{kind:"mutate",path:a,note:"file receives command stderr; content not reconstructable"})}if(s.length>0){let o=Mk(e,t,n);for(let a of s){let l=Lk(a);l!=="ignored"&&(l===null?r.push({kind:"mutate",note:`redirect target not literal: ${Ge(e.raw)}`}):o===null||e.hasSubstitution?r.push({kind:"mutate",path:l,note:`content not reconstructable from: ${Ge(e.raw)}`}):r.push({kind:a.op===">>"?"append":"write",path:l,content:o}))}return r}if(r.push(...u2(e,t,n)),r.length===0&&d2(e,t)){let o=e.argv.slice(1).map(a=>a.text).filter(a=>a.length>0);o.length>0&&r.push({kind:"opaque",tokens:o,command:Ge(e.raw)})}return r}function d2(e,t){return t===""||l2.has(t)?!1:o2.has(t)?t==="find"?e.argv.some(n=>n.text==="-delete"||n.text==="-exec"||n.text==="-execdir"||n.text==="-ok"):!1:!0}function Ck(e){let t=0;for(;t<e.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(e[t].text);)t+=1;for(;t<e.length&&i2.has(Oi(e[t].text));){let n=Oi(e[t].text);for(t+=1;t<e.length&&e[t].text.startsWith("-");)t+=1;if(n==="timeout"&&t<e.length&&/^\d/.test(e[t].text)&&(t+=1),n==="env")for(;t<e.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(e[t].text);)t+=1}return t===0?e:e.slice(t)}function Mk(e,t,n){if(e.hasSubstitution)return null;let r=e.argv.slice(1);if(t==="echo"){let s=!0,i=0;for(;i<r.length&&/^-[neE]+$/.test(r[i].text);){let a=r[i].text;if(a.includes("n")&&(s=!1),a.includes("e"))return null;i+=1}let o=r.slice(i);return o.every(a=>a.literal)?o.map(a=>a.text).join(" ")+(s?`
|
|
2635
2635
|
`:""):null}if(t==="printf"){if(r.length===0||!r.every(i=>i.literal))return null;let s=r[0].text;return r.length===1?/[%\\]/.test(s)?null:s:s==="%s\\n"||s===`%s
|
|
2636
2636
|
`?r.slice(1).map(i=>`${i.text}
|
|
2637
2637
|
`).join(""):null}return t==="cat"?r.filter(i=>!i.text.startsWith("-")).length>0?null:e.heredoc!==void 0?e.heredoc.safe?e.heredoc.body:null:n!==null?n:null:t===""?"":null}function u2(e,t,n){let r=e.argv.slice(1),s=r.filter(o=>!o.text.startsWith("-")),i=r.filter(o=>o.text.startsWith("-")).map(o=>o.text).join(" ");switch(t){case"tee":{let o=i.includes("a"),a=[],l=e.heredoc!==void 0?e.heredoc.safe?e.heredoc.body:null:n;for(let c of s)c.literal?l===null||e.hasSubstitution?a.push({kind:"mutate",path:c.text,note:`tee content not reconstructable from: ${Ge(e.raw)}`}):a.push({kind:o?"append":"write",path:c.text,content:l}):a.push({kind:"mutate",note:`tee target not literal: ${Ge(e.raw)}`});return a}case"rm":{let o=/r/i.test(i);return s.map(a=>a.literal?{kind:"delete",path:a.text,recursive:o}:{kind:"mutate",note:`rm target not literal (recovery may resurrect files deleted by: ${Ge(e.raw)})`})}case"mv":case"cp":{let o=/[rR]/.test(i);if(s.length!==2||s.some(c=>!c.literal)||t==="cp"&&o)return[{kind:"mutate",note:`${t} form not analyzed: ${Ge(e.raw)}`}];let[a,l]=[s[0].text,s[1].text];return[t==="mv"?{kind:"move",from:a,to:l}:{kind:"copy",from:a,to:l}]}case"touch":return s.map(o=>o.literal?{kind:"touch",path:o.text}:{kind:"mutate",note:`touch target not literal: ${Ge(e.raw)}`});case"truncate":{let o=r.some((a,l)=>a.text==="-s"&&r[l+1]?.text==="0")||r.some(a=>a.text==="-s0");return s.map(a=>a.literal&&o?{kind:"write",path:a.text,content:""}:{kind:"mutate",...a.literal?{path:a.text}:{},note:`truncate form not analyzed: ${Ge(e.raw)}`})}case"sed":case"perl":{if(!(r.some(l=>l.text==="-i"||l.text.startsWith("-i."))||/^-[a-hj-z]*i/.test(r[0]?.text??"")))return[];let a=s.slice(1);return a.length===0?[{kind:"mutate",note:`${t} -i with no identifiable path: ${Ge(e.raw)}`}]:a.map(l=>({kind:"mutate",...l.literal?{path:l.text}:{},note:`${t} -i edit not reconstructable: ${Ge(e.raw)}`}))}case"ln":case"install":case"rsync":case"patch":case"unzip":case"dd":return[{kind:"mutate",note:`${t} invocation not analyzed: ${Ge(e.raw)}`}];case"tar":return/x/.test(r[0]?.text??"")?[{kind:"mutate",note:`tar extraction not analyzed: ${Ge(e.raw)}`}]:[];case"git":{let o=f2(r);return o!==void 0&&a2.has(o)?[]:[{kind:"mutate",note:`git ${o??"command"} may modify working-tree files: ${Ge(e.raw)}`}]}default:return[]}}function f2(e){let t=new Set(["-C","-c","--git-dir","--work-tree","--namespace","--super-prefix","--config-env","--exec-path"]);for(let n=0;n<e.length;n+=1){let r=e[n].text;if(r==="--version"||r==="--help")return r;if(t.has(r)){n+=1;continue}if(!(/^(?:-C|-c).+/.test(r)||/^--(?:git-dir|work-tree|namespace|super-prefix|config-env|exec-path)=/.test(r)||r.startsWith("-")))return r}}function m2(e){let t=[],n=Rk(),r=null,s="",i=!0,o=!1,a=[],l=[0],c=()=>{o&&(n.argv.push({text:s,literal:i}),s="",i=!0,o=!1)},d=(f,m)=>{c(),n.raw=e.slice(l[l.length-1],m).trim(),t.push({command:n,connector:r}),r=f,n=Rk(),l.push(m+1)},u=0;for(;u<e.length;){let f=e[u];if(f==="'"){let m=e.indexOf("'",u+1);if(m===-1)throw new Error("unterminated single quote");s+=e.slice(u+1,m),o=!0,u=m+1;continue}if(f==='"'){let m=Dk(e,u+1);if(m===-1)throw new Error("unterminated double quote");let p=e.slice(u+1,m);/[$`]/.test(p)&&(i=!1),s+=p.replace(/\\([$`"\\])/g,"$1"),o=!0,u=m+1;continue}if(f==="\\"){if(u+1<e.length){let m=e[u+1];if(m===`
|
|
@@ -2652,10 +2652,10 @@ ${$m}`);if(r.positionals.length>2)return I(t,`unexpected argument: ${r.positiona
|
|
|
2652
2652
|
`):e.split(`
|
|
2653
2653
|
`);e===""&&(r=[]);let s=0;for(let i of t){if(i.oldLines.length===0){if(r.length===0){r=[...i.newLines],s=r.length;continue}return null}let o=E2(r,i,s);if(o===-1)return null;r=[...r.slice(0,o),...i.newLines,...r.slice(o+i.oldLines.length)],s=o+i.newLines.length}return r.length===0?"":`${r.join(`
|
|
2654
2654
|
`)}
|
|
2655
|
-
`}function y2(e){let t=e.slice(2).trim();return t===""?void 0:t}function E2(e,t,n){let r=t.scope,s=r!==void 0&&t.oldLines[0]!==r,i=s?[r,...t.oldLines]:t.oldLines,o=s?1:0,a=new Set;return Wk(e,i,n,o,a),n>0&&Wk(e,i,0,o,a,n),a.size!==1?-1:[...a][0]}function Wk(e,t,n,r,s,i=e.length-t.length+1){let o=Math.min(i,e.length-t.length+1);e:for(let a=n;a<o;a+=1){for(let l=0;l<t.length;l+=1)if(e[a+l]!==t[l])continue e;s.add(a+r)}}var Uk,g2,Hk=w(()=>{"use strict";Uk="*** Begin Patch",g2="*** End Patch"});var eI={};
|
|
2655
|
+
`}function y2(e){let t=e.slice(2).trim();return t===""?void 0:t}function E2(e,t,n){let r=t.scope,s=r!==void 0&&t.oldLines[0]!==r,i=s?[r,...t.oldLines]:t.oldLines,o=s?1:0,a=new Set;return Wk(e,i,n,o,a),n>0&&Wk(e,i,0,o,a,n),a.size!==1?-1:[...a][0]}function Wk(e,t,n,r,s,i=e.length-t.length+1){let o=Math.min(i,e.length-t.length+1);e:for(let a=n;a<o;a+=1){for(let l=0;l<t.length;l+=1)if(e[a+l]!==t[l])continue e;s.add(a+r)}}var Uk,g2,Hk=w(()=>{"use strict";Uk="*** Begin Patch",g2="*** End Patch"});var eI={};me(eI,{extractRestoreOps:()=>Qk,runRestore:()=>L2});import{existsSync as Um,lstatSync as w2,realpathSync as T2}from"node:fs";import{lstat as Pl,mkdir as Wm,mkdtemp as v2,readFile as b2,rename as S2,rm as k2,stat as I2,utimes as Gk,writeFile as Kk}from"node:fs/promises";import{basename as Vk,dirname as Hl,isAbsolute as Ul,join as N2,relative as qm,resolve as Tn}from"node:path";async function L2(e,t,n=R2){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${_s}
|
|
2656
2656
|
`),0;let r=Y(e.filter(k=>k!=="--"),["--target","--dir"],["--force","--dry-run","--single-session","--recursive","--json"]);if(r.error!==void 0)return I(t,`${r.error}
|
|
2657
2657
|
|
|
2658
|
-
${_s}`);let s
|
|
2658
|
+
${_s}`);let s=C(r,"--dir");if(s!==void 0)return r.positionals.length>0?I(t,`--dir targets a directory and takes no <teamfile>/<alias>
|
|
2659
2659
|
|
|
2660
2660
|
${_s}`):W(r,"--single-session")?I(t,"--single-session applies to <teamfile> <alias> targeting; --dir always merges every discovered session"):O2(s,r,t,n);if(W(r,"--recursive"))return I(t,`--recursive requires --dir
|
|
2661
2661
|
|
|
@@ -2663,23 +2663,23 @@ ${_s}`);if(r.positionals.length===0)return I(t,`restore requires a <teamfile> (o
|
|
|
2663
2663
|
|
|
2664
2664
|
${_s}`);if(r.positionals.length>2)return I(t,`unexpected argument: ${r.positionals[2]}`);let i=r.positionals[0],o=gn(i),a=o?.teamfile??i,l=r.positionals[1],c=o?.alias??l;if(o!==null&&l!==void 0)return I(t,"restore alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(c===void 0)return I(t,`restore requires an <alias>
|
|
2665
2665
|
|
|
2666
|
-
${_s}`);let d;try{d=await n.resolveTeamTarget(a,c,t)}catch(k){if(k instanceof we)return I(t,k.message);throw k}let u;try{u=await n.loadSession(d.sessionid,d.provider)}catch(k){return I(t,`failed to load session: ${Bl(k)}`)}if(u===null)return I(t,`session not found: ${d.sessionid} (provider=${d.provider})`);let f=W(r,"--dry-run"),m=W(r,"--force"),p=W(r,"--single-session")||n.resolveTeamRoster===void 0,_
|
|
2666
|
+
${_s}`);let d;try{d=await n.resolveTeamTarget(a,c,t)}catch(k){if(k instanceof we)return I(t,k.message);throw k}let u;try{u=await n.loadSession(d.sessionid,d.provider)}catch(k){return I(t,`failed to load session: ${Bl(k)}`)}if(u===null)return I(t,`session not found: ${d.sessionid} (provider=${d.provider})`);let f=W(r,"--dry-run"),m=W(r,"--force"),p=W(r,"--single-session")||n.resolveTeamRoster===void 0,_=C(r,"--target"),h=_===void 0?void 0:Tn(_),g=p?[d]:$2([d,...await n.resolveTeamRoster(a,t)]),E=[],y=[],b=[];for(let k of g){if(k.sessionid===d.sessionid){b.push({member:k,detail:u}),y.push(gr(k,"target",0));continue}try{let F=await n.loadSession(k.sessionid,k.provider);if(F===null){y.push(gr(k,"not_found",0)),E.push(`team member ${k.alias}: session ${k.sessionid} not found \u2014 its file history is missing from this recovery`);continue}b.push({member:k,detail:F}),y.push(gr(k,"merged",0))}catch(F){y.push(gr(k,"load_error",0)),E.push(`team member ${k.alias}: session load failed (${Bl(F)}) \u2014 its file history is missing from this recovery`)}}let S={toolCalls:Li(u).coverage.toolCalls,structuredReplay:Yk[u.provider],shellScan:Bm[u.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...Wl[u.provider]!==void 0?{structuredNote:Wl[u.provider]}:{},shellNote:zk};return Zk(t,{json:W(r,"--json"),dryRun:f,force:m,absTarget:h,loaded:b,members:y,loadWarnings:E,coverage:S,mode:p?"single_session":"team",headerJson:{provider:u.provider,sessionId:u.sessionId,sessionCwd:u.cwd},describe:p?" (single session)":` from ${b.length} team session(s)`})}function Jk(e){let t=Tn(e),n=[];for(;;)try{return N2(T2(t),...n.reverse())}catch{let r=Hl(t);if(r===t)return Tn(e);n.push(Vk(t)),t=r}}async function O2(e,t,n,r){if(r.discoverSessions===void 0)return I(n,"--dir is not available: session discovery is not wired in this harness");let s=Jk(e),i=W(t,"--recursive"),o;try{o=await r.discoverSessions()}catch(E){return I(n,`session discovery failed: ${Bl(E)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],d=0,u=0,f=0;for(let E of o){let y=`${E.provider}:${E.sessionId}`;if(l.has(y)){f+=1;continue}if(l.add(y),typeof E.cwd!="string"||E.cwd.trim()===""){d+=1;continue}let b=Jk(E.cwd);b===s||i&&b.startsWith(a)?c.push(E):u+=1}if(c.sort((E,y)=>E.createdAt.getTime()-y.createdAt.getTime()),c.length===0)return I(n,`no provider sessions recorded working directory ${s}${i?" (or its subdirectories)":""} \u2014 checked ${o.length} session(s); ${d} had no recorded cwd`);let m=[],p=[],_=[];for(let E of c){let y={teamfile:"",alias:`${E.provider}:${E.sessionId}`,provider:E.provider,sessionid:E.sessionId,sessiondir:E.cwd,isLead:!1};try{let b=await r.loadSession(E.sessionId,E.provider);if(b===null){p.push(gr(y,"not_found",0)),m.push(`session ${y.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}_.push({member:y,detail:b}),p.push(gr(y,"merged",0))}catch(b){p.push(gr(y,"load_error",0)),m.push(`session ${y.alias}: load failed (${Bl(b)}) \u2014 its file history is missing from this recovery`)}}let g={crossSession:"directory_merged",providers:[...new Set(_.map(E=>E.detail.provider))].map(E=>({provider:E,structuredReplay:Yk[E],shellScan:Bm[E]!==void 0?"best_effort":"none",...Wl[E]!==void 0?{structuredNote:Wl[E]}:{}})),shellNote:zk};return Zk(n,{json:W(t,"--json"),dryRun:W(t,"--dry-run"),force:W(t,"--force"),absTarget:C(t,"--target")===void 0?void 0:Tn(C(t,"--target")),loaded:_,members:p,loadWarnings:m,coverage:g,mode:"directory",headerJson:{dir:s,recursive:i,discovery:{sessionsScanned:o.length,duplicates:f,matched:c.length,merged:_.length,excludedNoCwd:d,excludedOutsideDir:u}},describe:` from ${_.length} session(s) recorded in ${s}`})}async function Zk(e,t){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=t,l=C2(i);for(let _ of o)_.fileOps=l.filter(h=>h.alias===_.alias).length;let{files:c,warnings:d}=await P2(l,{dryRun:n,force:r,targetDir:s}),u=[...a,...d],f=i.flatMap(({member:_,detail:h})=>W2(h,l.filter(g=>g.alias===_.alias),_.alias)),m={files:c.length,written:c.filter(_=>_.action==="written").length,wouldWrite:c.filter(_=>_.action==="would_write").length,skipped:c.filter(_=>_.action==="skipped").length,unreplayable:c.filter(_=>_.action==="unreplayable").length,stitchedFiles:c.filter(_=>_.aliases.length>1).length,unreplayedCalls:f.length,warnings:u.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(t.json)z(e,{schema_version:x2,...t.headerJson,target:s??null,dryRun:n,force:r,mode:t.mode,members:o,coverage:t.coverage,summary:m,files:c,unreplayedCalls:f,warnings:u});else{for(let _ of c){let h=_.aliases.length>1?` [stitched: ${_.aliases.join("+")}]`:"",g=_.detail===null?"":` \u2014 ${_.detail}`;e.stdout.write(`${_.path}: ${_.action} (${_.reason})${h}${g}
|
|
2667
2667
|
`)}for(let _ of f)e.stdout.write(`unreplayed ${_.kind} call ${_.tool} [${_.alias}]${_.path===null?"":` ${_.path}`}: ${_.reason}
|
|
2668
2668
|
`);for(let _ of u)e.stdout.write(`warning: ${_}
|
|
2669
2669
|
`);e.stdout.write(`Restore ${n?"planned":"replayed"} ${m.files} file(s)${t.describe}: ${n?`${m.wouldWrite} would write`:`${m.written} written`}, ${m.skipped} skipped, ${m.unreplayable} unreplayable, ${m.stitchedFiles} stitched, ${m.unreplayedCalls} unreplayed call(s), ${m.warnings} warning(s).
|
|
2670
2670
|
`),p&&e.stdout.write(`warning: recovery is incomplete \u2014 see per-file reasons above
|
|
2671
2671
|
`)}return p?1:0}function $2(e){let t=new Set,n=[];for(let r of e)t.has(r.sessionid)||(t.add(r.sessionid),n.push(r));return n}function gr(e,t,n){return{alias:e.alias,provider:e.provider,sessionId:e.sessionid,status:t,fileOps:n}}function C2(e){let t=[];for(let n=0;n<e.length;n+=1){let{member:r,detail:s}=e[n],i=Qk(s);for(let o=0;o<i.length;o+=1)t.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return t.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),t.map(n=>n.op)}function Qk(e){let t=A2[e.provider]??{},n=Bm[e.provider]??{},r=[];for(let s of e.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??J2(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=t[s.toolName];if(a!==void 0){let c=M2(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(e.provider==="codex"&&s.toolName==="apply_patch"){r.push(...D2(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=j2(i[l]);if(c===null)continue;for(let d of Fm(c))r.push({effect:d,source:"shell",...o})}}return r}function M2(e,t){let n=Fl(t,e.pathKeys);if(n===void 0)return null;if(e.op==="write"){let o=Fl(t,e.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=Fl(t,e.oldKeys),s=Fl(t,e.newKeys);if(r===void 0||s===void 0)return null;let i=e.replaceAllKeys.some(o=>t[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function D2(e,t){let n=typeof e.input=="string"?e.input:void 0;if(n===void 0)return[];let r=qk(n);return r===null?[]:r.map(s=>({effect:s.kind==="add"?{kind:"write",path:s.path,content:s.content}:s.kind==="delete"?{kind:"delete",path:s.path,recursive:!1}:{kind:"hunks",path:s.path,hunks:s.hunks,...s.moveTo!==void 0?{moveTo:s.moveTo}:{}},source:"patch",...t}))}function j2(e){if(typeof e=="string")return e;if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))return null;let t=e,n=t.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<t.length?t[n+1]:t.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:t.join(" ")}async function P2(e,t){let n=new Map,r=[],s=new Set,i=[],o=(u,f,m)=>{let p=n.get(u);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(u,p)),p.lastOp=m.timestamp,p.ops+=1,p.sources.add(m.source),p.aliases.includes(m.alias)||p.aliases.push(m.alias),p},a=(u,f)=>{let m=H2(u,f.cwd,t.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(u)){s.add(u);let p=m.reason==="symlink_path";r.push({path:u,sessionPath:u,ops:1,sources:[f.source],aliases:[f.alias],action:p?"unreplayable":"skipped",reason:m.reason,detail:null,sessionMtime:f.timestamp.toISOString(),diskMtime:null})}return null},l=async(u,f)=>{if(u.state==="known")return u.content;if(u.ops>1||!Um(f))return null;try{return await b2(f,"utf8")}catch{return null}},c=(u,f,m)=>{u.state="unknown",u.content=null,u.unknownReason=f,m!==void 0&&(u.unknownDetail=m)};for(let u of e){let f=u.effect;switch(f.kind){case"write":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;let _=p.state==="deleted"?"":await l(p,m)??"";p.state="known",p.content=_+f.content,delete p.unknownReason,delete p.unknownDetail;break}case"edit":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"edit_mismatch","edit follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=U2(_,f.oldString,f.newString,f.replaceAll);if(h===null){c(p,"edit_mismatch");break}p.state="known",p.content=h;break}case"hunks":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"patch_context_mismatch","update follows in-session delete");break}let _=await l(p,m);if(_===null){c(p,"edit_base_missing");break}let h=Bk(_,f.hunks);if(h===null){c(p,"patch_context_mismatch");break}if(p.state="known",p.content=h,f.moveTo!==void 0){let g=a(f.moveTo,u);if(g!==null){let E=o(g,f.moveTo,u);E.state="known",E.content=h,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);if(p.state="deleted",p.content=null,f.recursive){let _=m.endsWith("/")?m:`${m}/`;for(let[h,g]of n)h.startsWith(_)&&(g.state="deleted",g.content=null,g.lastOp=u.timestamp,g.ops+=1)}break}case"move":case"copy":{let m=a(f.from,u),p=a(f.to,u),_=m===null?void 0:n.get(m);if(p!==null){let h=o(p,f.to,u);_!==void 0&&_.state==="known"?(h.state="known",h.content=_.content,delete h.unknownReason,delete h.unknownDetail):c(h,"move_source_unknown",`${f.kind} source ${f.from} content not tracked in this session`)}if(f.kind==="move"&&m!==null){let h=o(m,f.from,u);h.state="deleted",h.content=null}break}case"touch":{let m=a(f.path,u);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let _=o(m,f.path,u);_.state="known",_.content="",delete _.unknownReason,delete _.unknownDetail}else if(p!==void 0)o(m,f.path,u);else if(!Um(m)){let _=o(m,f.path,u);_.state="known",_.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${u.tool} @ ${u.timestamp.toISOString()}: ${f.note}`);for(let _ of n.values())_.state!=="unknown"&&(_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",f.note));break}let m=a(f.path,u);if(m===null)break;let p=o(m,f.path,u);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,_]of n)_.state!=="unknown"&&q2(f.tokens,p,_.sessionPath)&&(m=!0,_.lastOp=u.timestamp,_.ops+=1,_.sources.add(u.source),_.aliases.includes(u.alias)||_.aliases.push(u.alias),c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of B2(f.tokens)){let _=a(p,u);if(_===null||n.has(_))continue;m=!0;let h=o(_,p,u);c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${u.tool} @ ${u.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let d=[...r];for(let[u,f]of n)d.push(await F2(u,f,t));return{files:d,warnings:i}}async function F2(e,t,n){if(n.targetDir!==void 0&&ql(n.targetDir,e))return hr(e,t,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=Um(e)?await I2(e):null,s=r?.mtime??null;if(t.state==="deleted")return hr(e,t,"skipped","deleted_in_session",s,null);if(t.state==="unknown"||t.content===null)return hr(e,t,"unreplayable",t.unknownReason??"not_reconstructable",s,t.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(t.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return hr(e,t,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return hr(e,t,"would_write",i,s,null);if(n.targetDir===void 0)await Wm(Hl(e),{recursive:!0}),await Kk(e,t.content,"utf8"),await Gk(e,t.lastOp,t.lastOp);else try{await X2(n.targetDir,e,t.content,t.lastOp)}catch(o){if(o instanceof wn)return hr(e,t,"unreplayable","symlink_path",s,o.message);throw o}return hr(e,t,"written",i,s,null)}function U2(e,t,n,r){return t===""?e===""?n:null:e.includes(t)?r?e.split(t).join(n):e.replace(t,n):null}function W2(e,t,n){let r=new Set(t.map(o=>o.callId).filter(o=>o!==null)),s=Li(e),i=[];for(let o of s.toolCalls)o.kind!=="file_write"&&o.kind!=="file_edit"||o.callId!==null&&r.has(o.callId)||i.push({tool:o.name,alias:n,kind:o.kind,path:o.path??null,callId:o.callId,startedAt:o.startedAt,reason:"content extraction is not supported for this tool call"});return i}function q2(e,t,n){let r=Vk(t);for(let s of e)if(s===t||s===n||s.includes(t)||n.length>=3&&s.includes(n)||r.length>=3&&(s===r||s.endsWith(`/${r}`))||r.length>=5&&s.includes(r))return!0;return!1}function B2(e){return[...new Set(e.filter(t=>t===""||t.startsWith("-")||/[$`*?{}();]/.test(t)||/\s/.test(t)?!1:Ul(t)||t.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(t)))]}function H2(e,t,n){if(n===void 0)return Ul(e)?{abs:e}:t===""?{reason:"unresolvable_path"}:{abs:Tn(t,e)};let r=Ul(e)?t===""?void 0:qm(t,e):e;if(r===void 0)return{reason:"unresolvable_path"};let s=Tn(n,r),i=qm(n,s);return i===""||i.startsWith("..")||Ul(i)?{reason:"outside_target"}:ql(n,s)?{reason:"symlink_path"}:{abs:s}}function ql(e,t){let n=t;for(;;){try{if(w2(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===e)return!1;let r=Hl(n);if(r===n)return!0;n=r}}async function X2(e,t,n,r){try{let l=await Pl(e);if(l.isSymbolicLink()||!l.isDirectory())throw new wn(`unsafe restore root: ${e}`)}catch(l){if(l.code!=="ENOENT")throw l;await Wm(e,{recursive:!0});let c=await Pl(e);if(c.isSymbolicLink()||!c.isDirectory())throw new wn(`unsafe restore root: ${e}`)}let s=qm(e,Hl(t)),i=e;for(let l of s===""?[]:s.split(/[\\/]/)){i=Tn(i,l);try{let c=await Pl(i);if(c.isSymbolicLink()||!c.isDirectory())throw new wn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await Wm(i);let d=await Pl(i);if(d.isSymbolicLink()||!d.isDirectory())throw new wn(`unsafe restore parent: ${i}`)}}if(ql(e,t))throw new wn(`restore target contains a symbolic link: ${t}`);let o=await v2(Tn(i,".lmctl-restore-")),a=Tn(o,"content.tmp");try{if(await Kk(a,n,{encoding:"utf8",flag:"wx"}),await Gk(a,r,r),ql(e,t))throw new wn(`restore target contains a symbolic link: ${t}`);await S2(a,t)}finally{await k2(o,{recursive:!0,force:!0})}}function hr(e,t,n,r,s,i){return{path:e,sessionPath:t.sessionPath,ops:t.ops,sources:[...t.sources],aliases:[...t.aliases],action:n,reason:r,detail:i,sessionMtime:t.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function Fl(e,t){for(let n of t){let r=e[n];if(typeof r=="string")return r}}function J2(e){if(e!==void 0)try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function Bl(e){return e instanceof Error?e.message:String(e)}var x2,_s,Yk,Wl,zk,Xk,A2,Bm,R2,wn,tI=w(()=>{"use strict";At();vt();Pm();Fk();Hk();Le();rt();Kt();x2=2,_s=["usage: lmctl restore <teamfile> <alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore <teamfile>:<alias> [--target <dir>] [--force] [--dry-run] [--single-session] [--json]"," lmctl restore --dir <path> [--recursive] [--target <dir>] [--force] [--dry-run] [--json]","","Replay the file writes/edits recorded in a member's provider session","transcript back onto disk (recover files after the working directory was","lost). Structured Write/Edit tools, shell commands that carry their file","content (heredocs, echo/printf/tee redirects), and codex apply_patch","payloads are all replayed; mutations whose content cannot be reconstructed","are reported as explicit gaps. A recovered file's mtime is set to the","session's write timestamp.","","A file missing on disk is always recovered. An existing file is only","overwritten when the session's write is newer than the disk file's mtime;","--force overwrites regardless. Files the session itself deleted are not","resurrected (and are never deleted on disk by this command).","","Replay is TEAM-AWARE by default: file operations from every seeded member","of the same teamfile are merged into one chronological stream, so a file","created by one alias and edited by another reconstructs correctly no","matter which alias you target. Files whose history needed more than one","member's session are marked as stitched.","","DIRECTORY mode (--dir) needs no teamfile at all: it discovers EVERY","provider session on this machine whose recorded working directory is","<path> (add --recursive to include subdirectories) \u2014 any provider, any","alias, current or superseded \u2014 and merges them all. Use it when a","teamfile's seeded sessions no longer cover the project's full history","(reseeded aliases, or work done before any teamfile existed).",""," --dir <path> target a directory instead of <teamfile> <alias>;"," mutually exclusive with the positional forms."," --recursive with --dir, also merge sessions recorded in"," subdirectories of <path>."," --target <dir> re-root recovered files under <dir> instead of the"," session's original working directory (session paths"," outside that directory are skipped)."," --dry-run report the per-file plan without touching disk."," --single-session replay ONLY the targeted alias's own session (audit"," what that one session alone would have produced)."].join(`
|
|
2672
|
-
`),Yk={claude:"full",kimi:"full",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},Wl={codex:"apply_patch replays from the raw payload (Add/Delete/Move exact, Update context-based); calls without a preserved payload become unreplayed calls",agy:"write_to_file content replays; replace_file_content edit chunks are not replayed",gemini:"this provider reader exposes no structured file tools",copilot:"this provider reader exposes no structured file tools",qwen:"this provider reader exposes no structured file tools",ClaudeMock:"this provider reader exposes no structured file tools"},zk="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",Xk={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},A2={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:Xk,lmplayer:Xk,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}}},Bm={claude:{Bash:"command"},kimi:{Bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"}},R2={loadSession:De,resolveTeamTarget:(e,t,n)=>R(n,r=>Te(e,t,r)),resolveTeamRoster:(e,t)=>R(t,n=>{let r=Ee(e,n),s=Be(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(Te(e,o.alias,n))}catch{}return i}),discoverSessions:()=>Gs({})};wn=class extends Error{}});var $i,
|
|
2673
|
-
`).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function Q2(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return nI;let n=Number(t);return!Number.isFinite(n)||n<=0?nI:n}function Xm(e,t=process.env){let r=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:K2),s=e.getConfig("api.token"),i=t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:s;return{baseUrl:r,token:i}}var K2,nI,V2,Jm=w(()=>{"use strict";Hm();
|
|
2672
|
+
`),Yk={claude:"full",kimi:"full",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},Wl={codex:"apply_patch replays from the raw payload (Add/Delete/Move exact, Update context-based); calls without a preserved payload become unreplayed calls",agy:"write_to_file content replays; replace_file_content edit chunks are not replayed",gemini:"this provider reader exposes no structured file tools",copilot:"this provider reader exposes no structured file tools",qwen:"this provider reader exposes no structured file tools",ClaudeMock:"this provider reader exposes no structured file tools"},zk="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",Xk={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},A2={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:Xk,lmplayer:Xk,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}}},Bm={claude:{Bash:"command"},kimi:{Bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"}},R2={loadSession:De,resolveTeamTarget:(e,t,n)=>R(n,r=>Te(e,t,r)),resolveTeamRoster:(e,t)=>R(t,n=>{let r=Ee(e,n),s=Be(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(Te(e,o.alias,n))}catch{}return i}),discoverSessions:()=>Gs({})};wn=class extends Error{}});var $i,_se,Hm=w(()=>{"use strict";$i=[{name:"lmctl_chat",description:"Synchronous/blocking backup: send one prompt to a member of an AI-managed .lmctl team \u2014 addressed by teamfile path (team) and alias \u2014 and return the reply. This is the only MCP tool lmctl exposes. Prefer the CLI for normal delegation. For async or long-running work, use the provider or host runtime background/task surface around the blocking command.",inputSchema:{type:"object",properties:{team:{type:"string",description:"Path to .lmctl teamfile"},alias:{type:"string",description:"Target alias; omitted means Lead"},prompt:{type:"string",description:"Prompt text to send"}},required:["team","prompt"]},local:!0}],_se=$i.length});import{spawn as G2}from"node:child_process";async function rI(e,t,n){let r=V2.get(e);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of r.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return Y2(r.name,s)}function Y2(e,t){return e==="lmctl_chat"?z2(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function z2(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof e.team=="string"?e.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",n,r,t];return le()&&je(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),Z2(s,process.cwd())}function Z2(e,t){return new Promise(n=>{let r=!1,s,i=d=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(d))},o=G2("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=Q2(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){le()&&je(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
|
|
2673
|
+
`).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function Q2(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return nI;let n=Number(t);return!Number.isFinite(n)||n<=0?nI:n}function Xm(e,t=process.env){let r=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:K2),s=e.getConfig("api.token"),i=t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:s;return{baseUrl:r,token:i}}var K2,nI,V2,Jm=w(()=>{"use strict";Hm();ce();K2="http://127.0.0.1:8787",nI=30*60*1e3,V2=new Map($i.map(e=>[e.name,e]))});async function rX(e,t){let n=e.id===void 0,r=e.id??null;if(e.method==="exit")return n||t.io.write(Gm({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:eX,capabilities:{tools:{listChanged:!1}},serverInfo:{name:tX,version:nX}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:$i.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await rI(i,o,t.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return n?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:r,error:{code:-32601,message:`method not found: ${e.method}`}}}}function Gm(e){return`${JSON.stringify(e)}
|
|
2674
2674
|
`}async function sI(e,t){let n=!1,r="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){e.io.write(Gm({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await rX(l,e);c.kind==="response"?e.io.write(Gm(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=r.indexOf(`
|
|
2675
2675
|
`);for(;u!==-1;){let f=r.slice(0,u);r=r.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),u=r.indexOf(`
|
|
2676
2676
|
`)}};t.setEncoding("utf8"),t.on("data",u=>{r+=u,d()}),t.on("end",()=>{r.trim().length>0&&(a=a.then(()=>i(r))),a.finally(()=>c(0))}),t.on("error",u=>{e.io.log?.(`mcp: stdin error: ${u.message}
|
|
2677
|
-
`),a.finally(()=>c(1))})})}var eX,tX,nX,iI=w(()=>{"use strict";Hm();Jm();eX="2025-06-18",tX="lmctl",nX="0.0.1"});var aI={};
|
|
2678
|
-
`),2
|
|
2677
|
+
`),a.finally(()=>c(1))})})}var eX,tX,nX,iI=w(()=>{"use strict";Hm();Jm();eX="2025-06-18",tX="lmctl",nX="0.0.1"});var aI={};me(aI,{runMcp:()=>iX});async function iX(e,t={stdout:process.stdout,stderr:process.stderr},n=process.stdin){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(sX),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
|
|
2678
|
+
`),2;$({event:"mcp_bridge_start",pid:process.pid});let r=t.dal===void 0,s=t.dal??oX(),i=1;try{let o=s===void 0?Xm({getConfig:()=>null},process.env):Xm(s,process.env);return i=await sI({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},n),i}finally{$({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),r&&s!==void 0&&s.close()}}function oX(){let e=re(),t=3;for(let n=1;n<=t;n+=1)try{return Xe({path:e})}catch(r){let s=r instanceof Error?r.message:String(r);if($({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:n,db_path:e,error_message:s}),n<t&&oI(s))aX(50*n);else if(!oI(s))break}}function oI(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function aX(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var sX,lI=w(()=>{"use strict";dt();Jm();iI();ce();Qe();sX=`usage: lmctl mcp
|
|
2679
2679
|
|
|
2680
2680
|
Start the stdio MCP bridge. The bridge resolves api.url and api.token from
|
|
2681
2681
|
local config, then uses stdin/stdout for JSON-RPC frames.
|
|
2682
|
-
`});var cI={};
|
|
2682
|
+
`});var cI={};me(cI,{runDevice:()=>yX});import{readFileSync as lX}from"node:fs";import{homedir as cX}from"node:os";import{join as dX}from"node:path";import{CognitoIdentityClient as uX,GetIdCommand as fX}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as mX}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as pX,ListObjectsV2Command as _X,PutObjectCommand as hX,S3Client as gX}from"@aws-sdk/client-s3";async function yX(e,t={stdout:process.stdout,stderr:process.stderr}){let[n]=e;if(n===void 0||n==="--help"||n==="-h"||n==="help")return t.stdout.write(Km),0;if(n==="init"){let r=_m();return t.stdout.write(`${r.device_id}
|
|
2683
2683
|
`),0}if(n==="id"){let r=pr();return r===null?(t.stderr.write(`error: no device id initialized at ${Il()}; run 'lmctl device init'
|
|
2684
2684
|
`),1):(t.stdout.write(`${r.device_id}
|
|
2685
2685
|
`),0)}return n==="login"?await EX(e.slice(1),t):n==="prompt"?await TX(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
|
|
@@ -2709,7 +2709,7 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
|
2709
2709
|
WHERE event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2710
2710
|
AND ts >= ?
|
|
2711
2711
|
ORDER BY seq ASC
|
|
2712
|
-
`).all(t.since).map(kX),s=new Map;for(let l of r){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new Kn(`${l.stream_id} ${l.event_type} is missing receiver identity`);let c=l.sender_teamfile===null||l.sender_alias===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias},d=IX(l);s.set(l.stream_id,{seq:l.seq,message_id:l.stream_id,from:c,to:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},message_type:l.event_type==="RESPONSE_CREATE"?"response":"request",at:l.ts,parent_message_id:d.message_id,parent_link:d.link,orphaned_to_root:d.message_id===null,children:[]})}for(let l of s.values()){if(l.parent_message_id===null)continue;let c=s.get(l.parent_message_id);if(c===void 0){l.orphaned_to_root=!0;continue}c.children.push(l)}let i=t.cursorSeq??null,o=[...s.values()].filter(l=>mI(l,t.root)&&!NX(l,s,t.root)&&(i===null||l.seq>i)),a=o.slice(0,t.limit);return{sent:a.map(l=>pI(l,new Set)),next_seq:o.length>t.limit?a.at(-1).seq:null}}function kX(e){try{let t=JSON.parse(e.payload);if(!_I(t))throw new Kn(`message_event seq ${e.seq} payload is not an object`);return{...e,payload:t}}catch(t){throw t instanceof Kn?t:new Kn(`message_event seq ${e.seq} payload is invalid JSON`)}}function IX(e){if(e.event_type==="RESPONSE_CREATE"){let r=uI(e.payload.in_reply_to_message_id);return{message_id:r,link:r===null?null:"in_reply_to_message_id"}}let t=_I(e.payload.causation)?e.payload.causation:null,n=uI(t?.request_message_id);return{message_id:n,link:n===null?null:"invocation_state.request_message_id"}}function mI(e,t){return t===null?e.from===null:e.from?.teamfile===t.teamfile&&e.from.alias===t.alias}function NX(e,t,n){let r=new Set([e.message_id]),s=e.parent_message_id;for(;s!==null;){if(r.has(s))return!1;r.add(s);let i=t.get(s);if(i===void 0)return!1;if(mI(i,n))return!0;s=i.parent_message_id}return!1}function pI(e,t){let{seq:n,children:r,...s}=e;if(t.has(e.message_id))return{...s,children:[]};let i=new Set(t).add(e.message_id);return{...s,children:r.map(o=>pI(o,i))}}function _I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function uI(e){return typeof e=="string"&&e.length>0?e:null}var Kn,hI=w(()=>{"use strict";Kn=class extends Error{errorKind="data_error"}});var II={};
|
|
2712
|
+
`).all(t.since).map(kX),s=new Map;for(let l of r){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new Kn(`${l.stream_id} ${l.event_type} is missing receiver identity`);let c=l.sender_teamfile===null||l.sender_alias===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias},d=IX(l);s.set(l.stream_id,{seq:l.seq,message_id:l.stream_id,from:c,to:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},message_type:l.event_type==="RESPONSE_CREATE"?"response":"request",at:l.ts,parent_message_id:d.message_id,parent_link:d.link,orphaned_to_root:d.message_id===null,children:[]})}for(let l of s.values()){if(l.parent_message_id===null)continue;let c=s.get(l.parent_message_id);if(c===void 0){l.orphaned_to_root=!0;continue}c.children.push(l)}let i=t.cursorSeq??null,o=[...s.values()].filter(l=>mI(l,t.root)&&!NX(l,s,t.root)&&(i===null||l.seq>i)),a=o.slice(0,t.limit);return{sent:a.map(l=>pI(l,new Set)),next_seq:o.length>t.limit?a.at(-1).seq:null}}function kX(e){try{let t=JSON.parse(e.payload);if(!_I(t))throw new Kn(`message_event seq ${e.seq} payload is not an object`);return{...e,payload:t}}catch(t){throw t instanceof Kn?t:new Kn(`message_event seq ${e.seq} payload is invalid JSON`)}}function IX(e){if(e.event_type==="RESPONSE_CREATE"){let r=uI(e.payload.in_reply_to_message_id);return{message_id:r,link:r===null?null:"in_reply_to_message_id"}}let t=_I(e.payload.causation)?e.payload.causation:null,n=uI(t?.request_message_id);return{message_id:n,link:n===null?null:"invocation_state.request_message_id"}}function mI(e,t){return t===null?e.from===null:e.from?.teamfile===t.teamfile&&e.from.alias===t.alias}function NX(e,t,n){let r=new Set([e.message_id]),s=e.parent_message_id;for(;s!==null;){if(r.has(s))return!1;r.add(s);let i=t.get(s);if(i===void 0)return!1;if(mI(i,n))return!0;s=i.parent_message_id}return!1}function pI(e,t){let{seq:n,children:r,...s}=e;if(t.has(e.message_id))return{...s,children:[]};let i=new Set(t).add(e.message_id);return{...s,children:r.map(o=>pI(o,i))}}function _I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function uI(e){return typeof e=="string"&&e.length>0?e:null}var Kn,hI=w(()=>{"use strict";Kn=class extends Error{errorKind="data_error"}});var II={};me(II,{runMail:()=>HX});import{hostname as xX}from"node:os";async function HX(e,t){if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(CX),0;let[n,...r]=e,s=Zt(r);try{switch(n){case"sent":return await XX(r,t);case"history":return await JX(r,t);case"seen":return await GX(r,t);case"pending":return await KX(r,t);case"read":return await YX(r,t);case"deliver":return await zX(r,t);case"handle":return await nJ(r,t);case"ack":return await tJ(r,t);case"tree":return await rJ(r,t);default:return te(t,s,"invalid_command",`unknown mail command: ${n}`)}}catch(i){return i instanceof ve||i instanceof Kn?te(t,s,i.errorKind,i.message):te(t,s,"internal",i instanceof Error?i.message:String(i))}}async function XX(e,t){if(Sn(e))return t.stdout.write(MX),0;let n=Zt(e),r=Y(Jl(e,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);if(r.positionals.length>0)return te(t,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=Ym(C(r,"--to"));if("error"in s)return te(t,n,"invalid_arguments",s.error);let i=pJ(C(r,"--since"));if("error"in i)return te(t,n,"invalid_arguments",i.error);let o=C(r,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return te(t,n,"invalid_arguments","--status must be queued or delivered");let a=Zm(C(r,"--limit"));if("error"in a)return te(t,n,"invalid_arguments",a.error);let l=SI(C(r,"--cursor"),"sent");if("error"in l)return te(t,n,"invalid_arguments",l.error);if(l.value!==null&&(C(r,"--to")!==void 0||C(r,"--since")!==void 0||o!==void 0))return te(t,n,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let c=await R(t,d=>{let u=l.value===null?Fe(zm(d,t,"mail sent")):Fe(l.value.self),f=l.value===null?s.value:l.value.to===null?null:Fe(l.value.to),m=l.value?.since??i.iso,p=l.value?.status??o??null,_=sJ(d,u,f,m,p??void 0,a.value,l.value?.seq??null),h=_.next_seq===null?null:bI({v:1,kind:"sent",seq:_.next_seq,self:u.value,to:f?.value??null,since:m,status:p});return{schema_version:vn,schema:"event-log-v1",identity:u.value,filters:{to:f?.value??null,since:m,status:p},messages:_.messages,next_cursor:h}});if(W(r,"--json"))z(t,c);else{t.stdout.write(`Messages sent from ${c.identity}
|
|
2713
2713
|
`);for(let d of c.messages)t.stdout.write(`${d.created_at} ${d.message_id} ${d.message_type} ${d.lifecycle_state} -> ${d.receiver.teamfile}:${d.receiver.alias}
|
|
2714
2714
|
`);c.messages.length===0&&t.stdout.write(`(none)
|
|
2715
2715
|
`)}return 0}async function JX(e,t){if(Sn(e))return t.stdout.write(WX),0;let n=Zt(e),r=Y(e,[],["--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);let s=hs(r.positionals,"history");if("error"in s)return te(t,n,"invalid_id",s.error);let i=await R(t,a=>{let l=EI(a,s.value);return l!==null&&rl(a,l),wI(a,s.value)}),o={schema_version:vn,schema:"event-log-v1",message_id:s.value,events:i};if(W(r,"--json"))z(t,o);else{t.stdout.write(`History for ${s.value}
|
|
@@ -2718,7 +2718,7 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
|
|
|
2718
2718
|
`),t.stdout.write(` db: ${i.db.delivered?"delivered":i.db.handled?"handled":"not delivered"}
|
|
2719
2719
|
`),t.stdout.write(` transcript: ${i.transcript.checked?i.transcript.found?`seen at ${i.transcript.seen_at}`:"not found":`not checked (${i.transcript.reason})`}
|
|
2720
2720
|
`),t.stdout.write(` answered: ${i.answered?.via??"no evidence"}
|
|
2721
|
-
`)),0}async function KX(e,t){if(Sn(e))return t.stdout.write(DX),0;let n=Zt(e),r=Y(Jl(e,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);if(r.positionals.length>0)return te(t,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=Ym(
|
|
2721
|
+
`)),0}async function KX(e,t){if(Sn(e))return t.stdout.write(DX),0;let n=Zt(e),r=Y(Jl(e,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);if(r.positionals.length>0)return te(t,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=Ym(C(r,"--receiver"));if("error"in s)return te(t,n,"invalid_arguments",s.error);let i=Zm(C(r,"--limit"));if("error"in i)return te(t,n,"invalid_arguments",i.error);let o=await R(t,l=>{let c=s.value;if(c===null){let m=_r(t.env??process.env,l);if(m.ok)c=Fe(m.identity);else if(m.reason==="not-found")throw new ve("self_identity",yn("mail pending"))}let d=c===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",u=c===null?[]:[c.teamfile,c.alias],f=l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
2722
2722
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq
|
|
2723
2723
|
FROM message_pending ${d}
|
|
2724
2724
|
ORDER BY created_seq ASC LIMIT ?`).all(...u,i.value);return{receiver:c,messages:f}}),a={schema_version:vn,schema:"event-log-v1",filters:{receiver:o.receiver===null?null:`${o.receiver.teamfile}:${o.receiver.alias}`,limit:i.value},messages:o.messages.map(l=>({message_id:l.message_id,message_type:l.message_type,in_reply_to:l.in_reply_to,sender:l.sender_teamfile===null?null:{teamfile:l.sender_teamfile,alias:l.sender_alias??""},receiver:{teamfile:l.receiver_teamfile,alias:l.receiver_alias},lifecycle_state:l.lifecycle_state,created_seq:l.created_seq}))};if(W(r,"--json"))z(t,a);else if(a.messages.length===0)t.stdout.write(`no pending messages
|
|
@@ -2740,11 +2740,11 @@ ${i.content}
|
|
|
2740
2740
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
|
|
2741
2741
|
ORDER BY seq ASC LIMIT 1`).get(t);if(n===void 0)throw new ve("not_found",`no such message: ${t}`);let r=Xl(n),s=e.db.prepare(`SELECT message_type, lifecycle_state
|
|
2742
2742
|
FROM message_pending WHERE message_id = ?`).get(t);if(s===void 0)throw new ve("invalid_state",`${t} is not pending`);if(s.lifecycle_state!=="queued")throw new ve("invalid_state",`${t} is ${s.lifecycle_state}; only queued messages can be delivered`);let i=yr(r.payload.legacy)?r.payload.legacy:null,o=kI(i?.id);if(i?.table!=="agent_mailbox"||o===null||!Number.isSafeInteger(o)||o<1)throw new ve("data_error",`${t} does not reference a deliverable agent_mailbox row`);let a=e.getMailboxMessage(o);if(a===null)throw new ve("data_error",`${t} references missing mailbox row ${o}`);if(a.message_type!==s.message_type||a.receiver_teamfile!==r.receiver_teamfile||a.receiver_alias!==r.receiver_alias)throw new ve("data_error",`${t} mailbox/event identity does not match`);if(a.delivered_at!==null||a.delivering_at!==null)throw new ve("invalid_state",`${t} legacy delivery state is not queued`);if(r.receiver_teamfile===null||r.receiver_alias===null)throw new ve("data_error",`${t} is missing receiver identity`);return{row:a,messageId:t,messageType:s.message_type,receiver:{teamfile:r.receiver_teamfile,alias:r.receiver_alias},leaseSender:a.sender_teamfile===null||a.sender_alias===null?{teamfile:a.receiver_teamfile,alias:"operator"}:{teamfile:a.sender_teamfile,alias:a.sender_alias}}}async function QX(e,t,n){let r=ht(e,n.receiver.teamfile,n.receiver.alias),s=!1;if(r.busy){if(r.reason==="terminal-held")return{outcome:"skipped_terminal",providerStatus:null,message:"receiver is terminal-held"};if(!await ls(e,r,n.receiver.teamfile,n.receiver.alias))return{outcome:"skipped_busy",providerStatus:null,message:"receiver is busy"};s=!0}let i=Te(n.receiver.teamfile,n.receiver.alias,e),o=Mt(e,{receiver_teamfile:n.receiver.teamfile,receiver_alias:n.receiver.alias,sender_teamfile:n.leaseSender.teamfile,sender_alias:n.leaseSender.alias,ttlMs:Xt(),...s?{force:!0,reclaimReason:"session-idle"}:{}});if(!o.acquired)return{outcome:"skipped_busy",providerStatus:null,message:"receiver lease was acquired elsewhere"};let a={row:o.lease,leaseId:o.leaseId},l=t.env??process.env,c=In(d=>e.heartbeatAgentInflight(a.row,a.leaseId,d),{intervalMs:kr(l)});try{let d={teamfile:n.receiver.teamfile,alias:n.receiver.alias,provider:i.provider,sessionId:i.sessionid,cwd:i.sessiondir,...i.model!==void 0?{model:i.model}:{},...i.effort!==void 0?{effort:i.effort}:{},...i.isLead!==void 0?{isLead:i.isLead}:{}};if(n.messageType==="response"){let p=await ol({sender:n.leaseSender,receiver:d,io:t,permissionMode:"yolo",env:l,onlyMailboxId:n.row.id}),_=e.getMailboxMessage(n.row.id),h=_!==null&&_.delivered_at!==null;return p.status==="ok"&&h?{outcome:"delivered",providerStatus:"ok",message:null}:{outcome:"error",providerStatus:p.status,message:p.error??(p.status==="stalled"?"provider stalled during response delivery":"response delivery was not finalized")}}let u=await is({sender:n.leaseSender,receiver:d,io:t,permissionMode:"yolo",env:l,finalize:"caller",onlyMailboxId:n.row.id}),f=eJ(u),m=0;try{m=e.markRelayRequestDeliveredAndEnqueueResponses(u.queued,f,new Date().toISOString()).marked}catch(p){return{outcome:"error",providerStatus:u.status,message:`delivery finalization failed: ${p instanceof Error?p.message:String(p)}`}}return u.status==="ok"&&m===1?{outcome:"delivered",providerStatus:"ok",message:null}:{outcome:"error",providerStatus:u.status,message:u.status==="stalled"?"provider stalled during request delivery":u.status==="error"?u.error:"request delivery was not finalized"}}catch(d){throw d instanceof Error&&/^no queued (?:response )?mail to deliver/.test(d.message)?new ve("invalid_state",`${n.messageId} was no longer queued when delivery claimed it`):d}finally{clearInterval(c);try{e.releaseAgentInflight(a.row,a.leaseId)}catch{}}}function eJ(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
|
|
2743
|
-
${e.receipt}`:`relay delivery error: ${e.error}`}async function tJ(e,t){if(Sn(e))return t.stdout.write(FX),0;let n=Zt(e),r=Y(Jl(e,["--note"]),["--note"],["--terminalize-pending","--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);let s=hs(r.positionals,"ack");if("error"in s)return te(t,n,"invalid_id",s.error);let i
|
|
2743
|
+
${e.receipt}`:`relay delivery error: ${e.error}`}async function tJ(e,t){if(Sn(e))return t.stdout.write(FX),0;let n=Zt(e),r=Y(Jl(e,["--note"]),["--note"],["--terminalize-pending","--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);let s=hs(r.positionals,"ack");if("error"in s)return te(t,n,"invalid_id",s.error);let i=C(r,"--note"),o=await R(t,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
|
|
2744
2744
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new ve("not_found",`no such message: ${s.value}`);let d=_r(t.env??process.env,l);if(!d.ok&&d.reason==="not-found")throw new ve("self_identity",yn("mail ack"));let u=d.ok?d.identity:"operator",f=l.db.transaction(()=>{let m=U_(l.db,{messageId:s.value,ackedBy:u,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:xX(),terminalizePending:W(r,"--terminalize-pending")});if(d.ok){let p=Fe(d.identity);l.clearCurrentlyHandlingMessage(p.teamfile,p.alias,s.value)}return m})();return{ackedBy:u,ack:f}}),a={schema_version:vn,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return W(r,"--json")?z(t,a):t.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
|
|
2745
2745
|
`),0}async function nJ(e,t){if(Sn(e))return t.stdout.write(UX),0;let n=Zt(e),r=Y(e,[],["--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);let s=hs(r.positionals,"handle");if("error"in s)return te(t,n,"invalid_id",s.error);let i=await R(t,a=>{if(a.db.prepare(`SELECT 1 FROM message_event
|
|
2746
2746
|
WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new ve("not_found",`no such message: ${s.value}`);let c=Fe(zm(a,t,"mail handle"));return{identity:c,handling:F_(a.db,{messageId:s.value,handlingBy:c.value,handlingTeamfile:c.teamfile,handlingAlias:c.alias})}}),o={schema_version:vn,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return W(r,"--json")?z(t,o):t.stdout.write(`${o.appended?"handling":"handling refreshed"} ${o.message_id} as ${o.handling_by} since ${o.handling_at}
|
|
2747
|
-
`),0}async function rJ(e,t){if(Sn(e))return t.stdout.write(BX),0;let n=Zt(e),r=Y(Jl(e,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);if(r.positionals.length>0)return te(t,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=vI(
|
|
2747
|
+
`),0}async function rJ(e,t){if(Sn(e))return t.stdout.write(BX),0;let n=Zt(e),r=Y(Jl(e,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(r.error!==void 0)return te(t,n,"invalid_arguments",r.error);if(r.positionals.length>0)return te(t,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=vI(C(r,"--since"),AX);if("error"in s)return te(t,n,"invalid_arguments",s.error);let i=Ym(C(r,"--root"));if("error"in i)return te(t,n,"invalid_arguments",i.error);let o=Zm(C(r,"--limit"));if("error"in o)return te(t,n,"invalid_arguments",o.error);let a=SI(C(r,"--cursor"),"tree");if("error"in a)return te(t,n,"invalid_arguments",a.error);if(a.value!==null&&(C(r,"--root")!==void 0||C(r,"--since")!==void 0))return te(t,n,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await R(t,c=>{let d=a.value===null?i.value??Fe(zm(c,t,"mail tree")):Fe(a.value.root),u=a.value?.since??s.iso,f=a.value?.since_label??C(r,"--since")??"24h",m=fI(c,{root:{teamfile:d.teamfile,alias:d.alias},since:u,limit:o.value,cursorSeq:a.value?.seq??null}),p=m.next_seq===null?null:bI({v:1,kind:"tree",seq:m.next_seq,root:d.value,since:u,since_label:f});return{schema_version:vn,schema:"event-log-v1",root:{teamfile:d.teamfile,alias:d.alias},since:f,since_timestamp:u,sent:m.sent,next_cursor:p,orphan_policy:"Missing causal linkage, including a genuinely fresh or unprompted send before any inbound delivery, is surfaced as a root; no temporal fallback is used.",incomplete_capture_note:"External composition is causally linked by calling mail handle before a reactive send. A send remains an orphan root when no handle was declared or the handling pointer exceeded its one-hour TTL."}});if(W(r,"--json"))z(t,l);else{t.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
|
|
2748
2748
|
`);for(let c of l.sent)TI(t,c,0);l.sent.length===0&&t.stdout.write(`(none)
|
|
2749
2749
|
`),t.stdout.write(`
|
|
2750
2750
|
Note: ${l.orphan_policy}
|
|
@@ -3017,7 +3017,7 @@ With --json, the stable external contract is:
|
|
|
3017
3017
|
"incomplete_capture_note":"..."}
|
|
3018
3018
|
${bn}
|
|
3019
3019
|
Default text output is human-readable and may change without notice.
|
|
3020
|
-
`,ve=class extends Error{errorKind;constructor(t,n){super(n),this.errorKind=t}}});import{existsSync as xI,mkdirSync as EJ,readdirSync as wJ,readFileSync as AI,writeFileSync as TJ}from"node:fs";import{join as gs}from"node:path";import{fileURLToPath as vJ}from"node:url";function SJ(e){try{return bJ.some(t=>xI(gs(e,t)))}catch{return!1}}function kJ(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let n=t[1],r=t[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}function RI(e,t){e.durable_memory_mode!=="db"?IJ(e):NJ(e,t)}function LI(e){let t=SJ(e),n;try{n=wJ(Gl).filter(r=>r.endsWith(".template")).sort()}catch(r){return
|
|
3020
|
+
`,ve=class extends Error{errorKind;constructor(t,n){super(n),this.errorKind=t}}});import{existsSync as xI,mkdirSync as EJ,readdirSync as wJ,readFileSync as AI,writeFileSync as TJ}from"node:fs";import{join as gs}from"node:path";import{fileURLToPath as vJ}from"node:url";function SJ(e){try{return bJ.some(t=>xI(gs(e,t)))}catch{return!1}}function kJ(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let n=t[1],r=t[2].trimStart(),s=n.match(/^name:\s*(.+)$/m),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}function RI(e,t){e.durable_memory_mode!=="db"?IJ(e):NJ(e,t)}function LI(e){let t=SJ(e),n;try{n=wJ(Gl).filter(r=>r.endsWith(".template")).sort()}catch(r){return $({event:"bootstrap_templates_unreadable",path:Gl,error_message:r instanceof Error?r.message:String(r)}),[]}return n.filter(r=>r==="skills_lmprobe.md.template"||r==="skills_lmdebug.md.template"?t:!0)}function IJ(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path"),$({event:"bootstrap_skipped_no_local_path",project_id:e.id,project_name:e.name});return}let n=gs(t,"durable-memory");try{EJ(n,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),$({event:"bootstrap_memory_dir_create_failed",project_id:e.id,path:n,error_message:i instanceof Error?i.message:String(i)});return}let r=LI(t),s=[];for(let i of r){let o=i.replace(/\.template$/,""),a=gs(n,o);if(!xI(a))try{let l=AI(gs(Gl,i),"utf8");TJ(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),$({event:"bootstrap_template_copy_failed",project_id:e.id,template:i,path:a,error_message:l instanceof Error?l.message:String(l)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${n}: ${s.join(", ")}`)}function NJ(e,t){let n=e.local_path??"",r=LI(n),s=[];for(let i of r){let o=gs(Gl,i),a;try{a=AI(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c),$({event:"bootstrap_template_read_failed",project_id:e.id,template:i,path:o,error_message:c instanceof Error?c.message:String(c)});continue}let l=kJ(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),$({event:"bootstrap_template_frontmatter_invalid",project_id:e.id,template:i,path:o});continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c),$({event:"bootstrap_memory_upsert_failed",project_id:e.id,memory_name:l.name,template:i,error_message:c instanceof Error?c.message:String(c)})}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var Gl,bJ,OI=w(()=>{"use strict";ce();Gl=gs(vJ(import.meta.url),"../../config/durable_memory_templates"),bJ=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as xJ}from"node:crypto";import{existsSync as AJ,mkdirSync as RJ,writeFileSync as LJ}from"node:fs";import{dirname as OJ,join as ys}from"node:path";function Qm(e){return typeof e=="string"&&e.startsWith($I)}function PJ(e){if(!Qm(e))throw new Rt(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice($I.length),n=t.indexOf("/");if(n<=0)throw new Rt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${e}`,"malformed");let r=t.slice(0,n);if(!DJ.has(r))throw new Rt(`unknown lmctl:// kind '${r}' (expected workflow|mcp|skill): ${e}`,"malformed");let s=t.slice(n+1),i,o=s.indexOf("@");o>=0&&(i=s.slice(o+1).trim(),s=s.slice(0,o));let a=s.trim();if(a.length===0)throw new Rt(`empty name in lmctl:// URI: ${e}`,"malformed");if(/[\\/]|\.\./.test(a))throw new Rt(`invalid name in lmctl:// URI (no path separators): ${e}`,"malformed");return{kind:r,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function FJ(e,t,n){if(e==="workflow")return ba(t,n);let r=e==="mcp"?ys("templates","mcp",`${t}.json`):ys("templates","skills",t,"SKILL.md");for(let s of Wu(n)){let i=ys(s,r);if(AJ(i))return i}return null}function UJ(e,t,n){let r=ys(Uu(n),CJ,e);return e==="skill"?ys(r,t,"SKILL.md"):ys(r,`${t}${e==="workflow"?".compound.json":".json"}`)}function WJ(e,t){if(t.trim().length===0)return!1;if(e==="skill")return!0;let n=t.trim();if(e==="mcp")try{let r=JSON.parse(n);return r!==null&&typeof r=="object"}catch{return!1}if(n.startsWith("{")||n.startsWith("["))try{return JSON.parse(n),!0}catch{return!1}return!0}async function CI(e,t){let{kind:n,name:r,ref:s}=PJ(e),i=FJ(n,r,t);if(i!==null)return i;let o=`${$J}${n}/${r}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(MJ)})}catch(d){throw new Rt(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new Rt(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=jJ.exec(s);if(d!==null){let u=xJ("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new Rt(`lmctl:// '${e}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!WJ(n,l))throw new Rt(`lmctl:// '${e}' remote artifact failed shape validation for ${n} \u2014 discarded, NOT cached.`,"validation-failure");let c=UJ(n,r,t);return RJ(OJ(c),{recursive:!0}),LJ(c,l,"utf8"),c}var $I,$J,CJ,MJ,DJ,Rt,jJ,MI=w(()=>{"use strict";qu();$I="lmctl://",$J="https://lmctl.com/templates/",CJ=".cache",MJ=8e3,DJ=new Set(["workflow","mcp","skill"]),Rt=class extends Error{reason;constructor(t,n="malformed"){super(t),this.reason=n,this.name="LmctlUriError"}},jJ=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as qJ}from"node:child_process";import{cpSync as DI,existsSync as BJ,mkdirSync as HJ,mkdtempSync as XJ,readFileSync as _ie,statSync as JJ,writeFileSync as jI}from"node:fs";import{homedir as GJ,tmpdir as KJ}from"node:os";import{basename as PI,join as Lt}from"node:path";function ep(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function tp(e,t,n){if(Array.isArray(e)){for(let r of e)tp(r,t,n);return}if(ep(e)){e.alias===t&&(Array.isArray(e.mcp)&&n.mcp.push(...e.mcp),Array.isArray(e.skills)&&n.skills.push(...e.skills));for(let r of Object.values(e))tp(r,t,n)}}function ZJ(e,t){let n={mcp:[],skills:[]},r=new Set;for(let i of e.listProjects()){if(i.team_id!==t.team_id)continue;let o=e.getWorkflowByName(i.workflow_name);if(o===null||r.has(o.id))continue;r.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!ep(a)||!Array.isArray(a.steps)))for(let l of a.steps)ep(l)&&l.members!==void 0&&tp(l.members,t.alias,n)}let s=i=>{let o=new Map;for(let a of i)o.set(zJ(a),a);return[...o.values()]};return{mcp:s(n.mcp),skills:s(n.skills)}}function QJ(e,t){return e.listProjects().find(n=>n.team_id===t.team_id)?.local_path}async function eG(e,t){let n;try{n=await fetch(e,{signal:AbortSignal.timeout(VJ)})}catch(s){throw new Vn(t,`fetch ${e} failed: ${s.message}`)}if(!n.ok)throw new Vn(t,`fetch ${e} \u2192 HTTP ${n.status}`);let r=await n.text();if(r.length>FI)throw new Vn(t,`fetched ${e} exceeds ${FI} bytes`);return r}function tG(e,t,n,r){let s=qJ(e,t,{cwd:n,env:An(void 0,n),encoding:"utf8",timeout:6e4});if(s.error)throw new Vn(r,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new Vn(r,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function nG(e){if(typeof e!="string")return e.name;let t=PI(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?PI(e.replace(/\/skill\.md$/i,"")):t}async function UI(e,t,n){let r=nG(e),s=Lt(t,r);if(HJ(s,{recursive:!0}),typeof e!="string")return jI(Lt(s,"SKILL.md"),e.content,"utf8"),{name:r,dir:s};if(Qm(e)&&(e=await CI(e)),qI.test(e))return jI(Lt(s,"SKILL.md"),await eG(e,n),"utf8"),{name:r,dir:s};if(!BJ(e))throw new Vn(n,`skill path not found: ${e}`);return JJ(e).isDirectory()?(DI(e,s,{recursive:!0}),{name:r,dir:s}):(DI(e,Lt(s,"SKILL.md")),{name:r,dir:s})}async function BI(e){let{dal:t,member:n,stderr:r}=e,s=ZJ(t,n);if(s.mcp.length===0&&s.skills.length===0)return;let i=et(n),o=n.sessiondir||e.baseDir||QJ(t,n)||process.cwd(),a=l=>{r.write(`[seed:${n.alias}] ${l}
|
|
3021
3021
|
`)};if(s.mcp.length>0&&a(`MCP capability install is disabled in lmctl; ${s.mcp.length} declared server(s) NOT installed. Use nomcp for MCP server access.`),s.skills.length>0)if(YJ.has(i))a(`skills for ${i} are honest-BLOCKED \u2014 opencode has NO SKILL.md filesystem ingestion (no \`skill\` subcommand, no skills dir, no SKILL.md in the opencode package; \`opencode agent\` is a distinct artifact); ${s.skills.length} declared skill(s) NOT installed (operator follow-up).`);else if(i==="gemini"||i==="agy"){let l=XJ(Lt(KJ(),`lmctl-skill-${n.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!qI.test(c)?c:(await UI(c,l,n.alias)).dir;tG(i,["skills","install",d,"--scope","user","--consent"],o,n.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(WI[i]!==void 0){let l=WI[i]();for(let c of s.skills)await UI(c,l,n.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${i} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Vn,qI,VJ,FI,YJ,zJ,Mi,WI,HI=w(()=>{"use strict";dt();MI();Et();Si();Vn=class extends Error{alias;constructor(t,n){super(`capability install failed for ${t}: ${n}`),this.alias=t,this.name="CapabilityInstallError"}},qI=/^https?:\/\//i,VJ=8e3,FI=1e6,YJ=new Set(["opencode"]),zJ=e=>JSON.stringify(e),Mi=()=>process.env.HOME??GJ();WI={claude:()=>Lt(Mi(),".claude","skills"),qwen:()=>Lt(Mi(),".qwen","skills"),codex:()=>Lt(Mi(),".codex","skills"),copilot:()=>Lt(Mi(),".copilot","skills"),kimi:()=>Lt(process.env.KIMI_CODE_HOME??Lt(Mi(),".kimi-code"),"skills")}});var np,XI=w(()=>{"use strict";np=`---
|
|
3022
3022
|
|
|
3023
3023
|
# Durable memory \u2014 how to use it
|
|
@@ -3029,21 +3029,21 @@ ON EVERY NEW TASK:
|
|
|
3029
3029
|
2. Pull only the chapters relevant to your current task. Don't load everything.
|
|
3030
3030
|
3. If you learn something durable (a project convention, a decision, a fact worth preserving), write it back: create/update \`<project>/durable-memory/<descriptive-name>.md\` with YAML frontmatter (name/description/type) + body. The engine syncs the write automatically.
|
|
3031
3031
|
|
|
3032
|
-
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var GI={};
|
|
3032
|
+
Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var GI={};me(GI,{runTeam:()=>oG});import{existsSync as rG}from"node:fs";import{join as sG}from"node:path";async function oG(e,t){let[n,...r]=e;if(n==="--help"||n==="-h"||n==="help")return t.stdout.write(iG),0;try{return await R(t,async s=>{switch(n){case"create":return lG(r,t,s);case"list":return cG(r,t,s);case"show":return dG(r,t,s);case"add-member":return uG(r,t,s);case"seed":return JI(r,t,s,!1);case"refresh":return JI(r,t,s,!0);case"companion":return mG(r,t,s);case"list-roots":return aG(r,t,s);default:return I(t,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return qe(t,s)}}function aG(e,t,n){let r=Y(e,[]);if(r.error!==void 0)return I(t,r.error);if(r.positionals.length>0)return I(t,"usage: team list-roots [--json]");let s=n.listRootTeams().map(i=>({...i,missing_on_disk:!rG(i.teamfile_path)||void 0}));return W(r,"--json")?z(t,s):t.stdout.write(s.map(i=>`${i.name??"(unnamed)"} ${i.teamfile_path} ${i.last_seeded_at??""}${i.missing_on_disk?" MISSING (file deleted or renamed)":""}`).join(`
|
|
3033
3033
|
`)+(s.length>0?`
|
|
3034
3034
|
`:"")),0}function lG(e,t,n){let[r]=e;if(r===void 0)return I(t,"usage: team create <name>");let s=n.insertTeam({name:r});return t.stdout.write(`created team ${s.name}
|
|
3035
3035
|
`),0}function cG(e,t,n){let r=Y(e,[]);if(r.error!==void 0)return I(t,r.error);let s=n.listTeams();return W(r,"--json")?z(t,s):t.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
|
|
3036
3036
|
`)}${s.length>0?`
|
|
3037
3037
|
`:""}`),0}function dG(e,t,n){let r=Y(e,[]);if(r.error!==void 0)return I(t,r.error);let[s]=r.positionals;if(s===void 0)return I(t,"usage: team show <name> [--json]");let i=n.findTeamByName(s);if(i===null)return I(t,`team not found: ${s}`);let o=n.listTeamMembers(i.id);if(W(r,"--json"))z(t,{team:i,members:o});else{t.stdout.write(`team ${i.name}
|
|
3038
3038
|
`);for(let a of o)t.stdout.write(`- ${a.alias} ${et(a)} ${a.sessionid??"(unseeded)"}
|
|
3039
|
-
`)}return 0}function uG(e,t,n){let r=Y(e,["--alias","--provider","--model","--role","--sessiondir"]);if(r.error!==void 0)return I(t,r.error);let[s]=r.positionals;if(s===void 0)return I(t,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=n.findTeamByName(s);if(i===null)return I(t,`team not found: ${s}`);let o
|
|
3040
|
-
`),0}async function JI(e,t,n,r){let s=Y(e,["--alias"]);if(s.error!==void 0)return I(t,s.error);let[i]=s.positionals;if(i===void 0)return I(t,r?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=n.findTeamByName(i);if(o===null)return I(t,`team not found: ${i}`);let a
|
|
3039
|
+
`)}return 0}function uG(e,t,n){let r=Y(e,["--alias","--provider","--model","--role","--sessiondir"]);if(r.error!==void 0)return I(t,r.error);let[s]=r.positionals;if(s===void 0)return I(t,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=n.findTeamByName(s);if(i===null)return I(t,`team not found: ${s}`);let o=C(r,"--alias"),a=C(r,"--provider");if(o===void 0||a===void 0)return I(t,"team add-member requires --alias and --provider");let l=n.insertTeamMember({team_id:i.id,alias:o,provider:a,model:C(r,"--model")??null,role:C(r,"--role")??"agent",sessiondir:C(r,"--sessiondir")??sG(Hi(),"sessions",i.name,o)});return W(r,"--json")?z(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
|
|
3040
|
+
`),0}async function JI(e,t,n,r){let s=Y(e,["--alias"]);if(s.error!==void 0)return I(t,s.error);let[i]=s.positionals;if(i===void 0)return I(t,r?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=n.findTeamByName(i);if(o===null)return I(t,`team not found: ${i}`);let a=C(s,"--alias");if(r&&a===void 0)return I(t,"team refresh requires --alias");if(r&&a!==void 0&&a.trim().toLowerCase()==="lead")return I(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=fG(n.listTeamMembers(o.id),a,r);if(a!==void 0&&l.length===0)return I(t,`member not found or already seeded: ${a}`);if(r&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return I(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=n.listProjects().filter(m=>m.team_id===o.id),d=new Set;for(let m of c){if(d.has(m.workflow_name))continue;d.add(m.workflow_name);let p=n.getWorkflowByName(m.workflow_name);if(p===null)continue;let _=nT(m.workflow_name,p.definition);if(_.status==="FAIL")return I(t,`cannot seed team \`${o.name}\`: workflow \`${m.workflow_name}\` failed verify-at-seed \u2014 ${_.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let m of c)RI(m,n);let u=[],f=!1;for(let m of l){let p=await Fo({member:m,dal:n}),_=n.updateTeamMemberSession(m.id,p.sessionid);if(_!==null){let h=_.role_prompt??"",g=h.length>0?`${h}
|
|
3041
3041
|
|
|
3042
3042
|
${np}`:np;n.setMemberPromptSnapshot(m.id,g),u.push(_);let E=_l(et(_),p.sessionid);E!==null&&t.stderr.write(`[seeded ${_.alias}] customize/compact in its native TUI:
|
|
3043
3043
|
${E}
|
|
3044
3044
|
`);try{await BI({dal:n,member:_,stderr:t.stderr})}catch(y){f=!0,t.stderr.write(`error: ${y instanceof Error?y.message:String(y)}
|
|
3045
3045
|
`)}}}return W(s,"--json")?z(t,u):t.stdout.write(`seeded ${u.length} member(s)
|
|
3046
|
-
`),f?1:0}function fG(e,t,n){return e.filter(r=>t!==void 0&&r.alias!==t?!1:n||r.sessionid===null)}function mG(e,t,n){let r=Y(e,["--interpreter","--of"]);if(r.error!==void 0)return I(t,r.error);let[s]=r.positionals;if(s===void 0)return I(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=n.findTeamByName(s);if(i===null)return I(t,`team not found: ${s}`);let o
|
|
3046
|
+
`),f?1:0}function fG(e,t,n){return e.filter(r=>t!==void 0&&r.alias!==t?!1:n||r.sessionid===null)}function mG(e,t,n){let r=Y(e,["--interpreter","--of"]);if(r.error!==void 0)return I(t,r.error);let[s]=r.positionals;if(s===void 0)return I(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=n.findTeamByName(s);if(i===null)return I(t,`team not found: ${s}`);let o=C(r,"--interpreter"),a=C(r,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return I(t,"team companion requires --interpreter and --of");let l=n.findTeamMemberByAlias(i.id,o);if(l===null)return I(t,`member not found: ${o}`);for(let c of a){let d=n.findTeamMemberByAlias(i.id,c);if(d===null)return I(t,`member not found: ${c}`);n.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
|
|
3047
3047
|
`),0}var iG,KI=w(()=>{"use strict";Qe();eu();OI();dt();At();HI();$a();Le();XI();iG=`usage: lmctl team create <name>
|
|
3048
3048
|
lmctl team list [--json]
|
|
3049
3049
|
lmctl team show <name> [--json]
|
|
@@ -3056,8 +3056,8 @@ ${np}`:np;n.setMemberPromptSnapshot(m.id,g),u.push(_);let E=_l(et(_),p.sessionid
|
|
|
3056
3056
|
Manage DB-backed teams, members, and provider session lifecycle. Use seed or
|
|
3057
3057
|
refresh to create/update native provider sessions for team members.
|
|
3058
3058
|
team refresh rejects Lead members (alias matching is case-insensitive).
|
|
3059
|
-
`});var tN={};
|
|
3060
|
-
`),0;let n=Y(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(n.error!==void 0)return I(t,n.error);let r
|
|
3059
|
+
`});var tN={};me(tN,{applyMaxBytes:()=>Kl,renderMessage:()=>QI,runTail:()=>yG});async function yG(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${gG}
|
|
3060
|
+
`),0;let n=Y(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(n.error!==void 0)return I(t,n.error);let r=C(n,"--lines"),s=C(n,"--max-bytes");if(r!==void 0&&s!==void 0)return I(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(r!==void 0){let m=Number.parseInt(r,10);if(!Number.isFinite(m)||m<1||String(m)!==r)return I(t,`invalid --lines "${r}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?_G:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return I(t,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=W(n,"--watch"),a=C(n,"--watch-interval"),l=a===void 0?hG:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return I(t,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return I(t,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let c=C(n,"--run");if(c!==void 0){if(n.positionals.length>0)return I(t,"--run is mutually exclusive with positional [target] [alias]");if(C(n,"--session")!==void 0)return I(t,"--run is mutually exclusive with --session");if(C(n,"--provider")!==void 0)return I(t,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return I(t,`invalid --run "${c}" (expected a positive integer run id)`);try{return await R(t,async p=>EG(t,p,m,i,o,l))}catch(p){return qe(t,p)}}let d=Hn(pG,{target:n.positionals[0],alias:n.positionals[1],flags:{session:C(n,"--session"),provider:C(n,"--provider")}});if(d.mode==="error")return I(t,d.message);if(d.mode==="managed")return I(t,"tail managed mode requires --run <id>");let u;if(d.mode==="ai-team")if(d.alias===void 0){let m;try{m=await R(t,h=>Ee(d.teamfile,h))}catch(h){return I(t,`tail: ${h instanceof Error?h.message:String(h)}`)}let p;try{p=lt(m)}catch(h){return I(t,`tail: ${h instanceof Error?h.message:String(h)}`)}let _=Gt(p);if(_===void 0)return I(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let h=await R(t,g=>Te(d.teamfile,_.alias,g));u={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof we?I(t,h.message):qe(t,h)}}else try{let m=await R(t,p=>Te(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof we?I(t,m.message):qe(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let _=await as(m);if(_.length===0)return I(t,`tail: session "${m}" not found in any provider store`);if(_.length>1)return I(t,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}u={provider:p,sessionId:m}}let f=await VI(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let g=await VI(t,u.provider,u.sessionId,i,f);g>=0&&(f=g)}catch(g){t.stderr.write(`tail: ${g instanceof Error?g.message:String(g)}
|
|
3061
3061
|
`)}},_=setInterval(()=>{p()},l*1e3),h=()=>{clearInterval(_),m(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}async function VI(e,t,n,r,s){let i;try{i=await De(n,t)}catch(c){return e.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
|
|
3062
3062
|
`),-1}if(i===null)return e.stderr.write(`tail: session not found: ${n} (provider=${t})
|
|
3063
3063
|
`),-1;let o=i.messages??[],a=s<0&&r.kind==="lines"?Math.max(0,o.length-r.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let c=a;c<o.length;c+=1)l+=`${QI(o[c])}
|
|
@@ -3077,8 +3077,8 @@ ${o.map(a=>` ${a}`).join(`
|
|
|
3077
3077
|
Print or watch provider session messages, or follow a managed run timeline.
|
|
3078
3078
|
A bare <teamfile> with no alias tails that team's Lead member.
|
|
3079
3079
|
--lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;YI=`\u2026 [truncated older output \u2014 raise with --max-bytes]
|
|
3080
|
-
`});var dN={};
|
|
3081
|
-
`),0;let n=Y(e,["--provider","--run"],["--json","--help"]);if(n.error!==void 0)return I(t,n.error);if(n.positionals.length>2)return I(t,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let r=W(n,"--json"),s
|
|
3080
|
+
`});var dN={};me(dN,{runInfo:()=>SG});import{execFileSync as rp}from"node:child_process";import{dirname as rN,resolve as wG}from"node:path";function bG(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function SG(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${vG}
|
|
3081
|
+
`),0;let n=Y(e,["--provider","--run"],["--json","--help"]);if(n.error!==void 0)return I(t,n.error);if(n.positionals.length>2)return I(t,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let r=W(n,"--json"),s=C(n,"--run");if(s!==void 0){if(n.positionals.length>0)return I(t,"--run is mutually exclusive with positional [target] [alias]");if(C(n,"--provider")!==void 0)return I(t,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return I(t,`invalid --run "${s}" (expected a positive integer run id)`);try{return await R(t,async u=>IG(t,u,d,r))}catch(u){return qe(t,u)}}let i=Hn(TG,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:C(n,"--provider")}});if(i.mode==="error")return I(t,i.message);if(i.mode==="managed")return I(t,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await R(t,u=>Ee(i.teamfile,u))}catch(u){return I(t,`health: ${u instanceof Error?u.message:String(u)}`)}return NG(t,d,r)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await R(t,u=>Te(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof we?I(t,d.message):qe(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await as(a);if(d.length===0)return I(t,`health: session "${a}" not found in any provider store`);if(d.length>1)return I(t,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return kG(t,o,a,l,r,c)}async function kG(e,t,n,r,s,i){let o;try{o=await De(n,t)}catch(d){return I(e,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return I(e,`health: session not found: ${n} (provider=${t})`);let a=xi(o.messages),l=i===void 0?null:await xG(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...r!==void 0?{alias:r}:{},...l??{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},sessionLimit:a,createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(z(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
|
|
3082
3082
|
`),e.stdout.write(` Provider: ${o.provider}
|
|
3083
3083
|
`),r!==void 0&&e.stdout.write(` Alias: ${r}
|
|
3084
3084
|
`),l!==null&&e.stdout.write(` Liveness: ${sp(l.liveness)}
|
|
@@ -3125,8 +3125,8 @@ A bare <teamfile> with no alias tails that team's Lead member.
|
|
|
3125
3125
|
lmctl health --run <id> # run state, step rollup, and token totals
|
|
3126
3126
|
[--json]
|
|
3127
3127
|
|
|
3128
|
-
Show provider session details, team rollups, or managed run state/token totals.`});var mN={};
|
|
3129
|
-
`),0;let n=Y(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return I(t,n.error);if(n.positionals.length>0)return I(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r
|
|
3128
|
+
Show provider session details, team rollups, or managed run state/token totals.`});var mN={};me(mN,{runLs:()=>DG});import{resolve as ap}from"node:path";function MG(e){let t=new Map;for(let n of e){let r=`${n.provider}:${n.sessionId}`,s=t.get(r);(s===void 0||n.modifiedAt.getTime()>s.modifiedAt.getTime())&&t.set(r,n)}return[...t.values()]}async function DG(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${$G}
|
|
3129
|
+
`),0;let n=Y(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return I(t,n.error);if(n.positionals.length>0)return I(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=C(n,"--format"),s=W(n,"--json");if(W(n,"--runs")){for(let g of["--provider","--sessiondir"])if(C(n,g)!==void 0)return I(t,`--runs is mutually exclusive with ${g}`);for(let g of["--recursive","--all"])if(W(n,g))return I(t,`--runs is mutually exclusive with ${g}`);if(r==="teamfile")return I(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=C(n,"--limit"),_=CG;if(p!==void 0){let g=Number.parseInt(p,10);if(!Number.isFinite(g)||g<1||String(g)!==p)return I(t,`invalid --limit "${p}" (expected a positive integer)`);if(g>fN)return I(t,`--limit ${g} exceeds maximum (${fN})`);_=g}let h=r==="json"||s===!0?"json":"table";try{return await R(t,async g=>jG(t,g,_,h))}catch(g){return qe(t,g)}}let o=PG(r,s);if("error"in o)return I(t,o.error);let a=o.format,l=C(n,"--provider"),c=C(n,"--sessiondir"),d=W(n,"--recursive"),u=W(n,"--all"),f;try{f=await Gs(l?{provider:l}:{})}catch(p){return I(t,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?ap(c):ap(process.cwd());f=f.filter(_=>{let h=ap(_.cwd);return d?h===p||h.startsWith(`${p}/`):h===p})}if(f=MG(f),a==="json")return z(t,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=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
|
|
3130
3130
|
`)}return 0}if(a==="teamfile"){for(let p of f)t.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
|
|
3131
3131
|
`);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));t.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
|
|
3132
3132
|
`);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;t.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
|
|
@@ -3137,7 +3137,7 @@ Show provider session details, team rollups, or managed run state/token totals.`
|
|
|
3137
3137
|
[--recursive] [--all] [--format table|teamfile|json] [--json]
|
|
3138
3138
|
lmctl ls --runs [--limit N] [--format table|json] [--json]
|
|
3139
3139
|
|
|
3140
|
-
List native provider sessions in scope, or list recent managed runs with --runs.`,CG=50,fN=500});import{existsSync as Es,readFileSync as dp}from"node:fs";import{homedir as hN}from"node:os";import{dirname as gN,resolve as Yn}from"node:path";import{fileURLToPath as FG}from"node:url";function up(e,t={}){let n=[],r=qG(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&n.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&n.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.`),i==="copilot"){if(!s.model)continue;n.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){n.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(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&n.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){n.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=YG(t.opencodeConfigPath);if(!a.available){n.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}`));n.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}n.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(i==="kimi"){if(!s.model)continue;let a=KG(t.kimiConfigPath);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${_N(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(!s.model)continue;let o=r.get(i);if(!o){n.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Yl??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${_N(o)}`)}return n}function qG(e){if(!e&&Di)return Di;let t=new Map,n,r=e??BG();if(!Es(r))return n=`${r} not found`,e||lp(t),e||(Di=t),e||(Yl=n),t;let s;try{s=dp(r,"utf-8")}catch(i){return n=`${r} could not be read: ${i instanceof Error?i.message:String(i)}`,e||lp(t),e||(Di=t),e||(Yl=n),t}for(let[i,o]of Object.entries(UG)){let a=JG(s,o),l=GG(a);l.length>0&&t.set(i,l)}return t.size===0&&(n=`${r} has no tested model rows`),!e&&t.size===0&&lp(t),e||(Di=t),e||(Yl=n),t}function BG(){return HG(gN(FG(import.meta.url)))}function HG(e){let t=XG(e);if(t){let r=Yn(t,"durable-memory","model_selection.md");if(Es(r))return r}let n=[Yn(e,"..","..","durable-memory","model_selection.md"),Yn(e,"..","..","..","durable-memory","model_selection.md")];for(let r of n)if(Es(r))return r;return n[n.length-1]}function XG(e){let t=Yn(e);for(;;){if(Es(Yn(t,"package.json")))return t;let n=gN(t);if(n===t)return null;t=n}}function lp(e){for(let[t,n]of Object.entries(WG))e.set(t,n)}function JG(e,t){let r=new RegExp(`^## ${ZG(t)}\\s*$`,"m").exec(e);if(!r)return"";let s=r.index+r[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function GG(e){let t=new Set;for(let n of e.split(/\r?\n/)){let r=n.trim();if(!r.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(r);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function KG(e){let t=process.env.KIMI_CODE_HOME||Yn(hN(),".kimi-code"),n=e??Yn(t,"config.toml");if(!Es(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=dp(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=VG(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s].sort()}}function VG(e){let t=[],n=0;for(;n<e.length;){for(;/\s/.test(e[n]??"");)n++;if(n>=e.length)break;let r="",s=e[n]==='"'||e[n]==="'"?e[n++]:void 0;if(s){for(;n<e.length&&e[n]!==s;)s==='"'&&e[n]==="\\"&&n+1<e.length&&n++,r+=e[n++];if(e[n]!==s)return null;n++}else{for(;n<e.length&&e[n]!==".";)r+=e[n++];r=r.trim()}if(!r)return null;for(t.push(r);/\s/.test(e[n]??"");)n++;if(n>=e.length)break;if(e[n]!==".")return null;n++}return t.length>0?t:null}function YG(e){let t=e??Yn(hN(),".config","opencode","opencode.json");if(!Es(t))return{available:!0,models:[]};let n;try{n=JSON.parse(dp(t,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${t} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:zG(n)}}function zG(e){if(!cp(e))return[];let t=Vl(e.provider)??Vl(e.providers);if(!t)return[];let n=new Set;for(let[r,s]of Object.entries(t)){if(!cp(s))continue;let i=Vl(s.models)??Vl(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function Vl(e){return cp(e)?e:null}function cp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function _N(e){return e.length>0?e.join(", "):"(none)"}function ZG(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var UG,WG,Di,Yl,yN=w(()=>{"use strict";UG={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},WG={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","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.6-sol","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 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},Di=null});import{homedir as QG}from"node:os";import{basename as e4}from"node:path";function zl(e,t){let n=new Set;return{text:e.replace(n4,(s,i)=>{let o=i.trim(),a=t4[o];return a===void 0?(n.add(o),s):a(t)}),unknownNames:[...n].sort()}}function Zl(e){return{workdir:e.workdir,teamfile:e.teamfile,date:r4(e.date)}}function r4(e){return e.toISOString().slice(0,10)}var t4,n4,fp=w(()=>{"use strict";t4={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=e4(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>QG(),date:e=>e.date},n4=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Fi={};fe(Fi,{GEMINI_PROVIDER_NOTICE:()=>vN,_setLintOpenCodeConfigProbeForTests:()=>f4,_setLintSessiondirFsOpsForTests:()=>u4,_setTeamfileSeedForTests:()=>d4,buildRootTeamRegistrationRow:()=>xN,registerRootTeam:()=>AN,runHire:()=>T4,runLint:()=>w4,runRefresh:()=>v4,runSeed:()=>IN,sha256Text:()=>NN});import{createHash as s4}from"node:crypto";import{accessSync as i4,constants as EN,existsSync as o4,readFileSync as tc,realpathSync as _p,statSync as a4,writeFileSync as ec}from"node:fs";import{dirname as zn,resolve as TN}from"node:path";function d4(e){bN=e??(async t=>{let{seed:n}=await Promise.resolve().then(()=>(vt(),Kd)),r=await n(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}})}function u4(e){Er=e===null?hp:{...hp,...e}}function f4(e){SN=e??ed}async function m4(e,t,n){let r=e.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(r.map(async i=>({member:i,result:await SN({cwd:i.sessiondir??t,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function p4(e,t){let n=zn(t),r=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=TN(o);if(r.has(a))continue;let l=_4(a);l!==void 0&&(r.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function _4(e){try{if(Er.existsSync(e)){if(!Er.statSync(e).isDirectory())return"ENOTDIR";Er.accessSync(e,EN.W_OK);return}let t=y4(e);if(t===void 0)return;if(!Er.statSync(t).isDirectory())return"ENOTDIR";Er.accessSync(t,EN.W_OK);return}catch(t){return E4(t)??"permission check failed"}}function h4(e,t){let n=[];for(let r of e)r.teamfile!==void 0||r.sessiondir===void 0||kN(r.sessiondir,t)&&n.push(`${r.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return n}function g4(e,t,n,r){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!kN(i.sessiondir,r))continue;let o=n.get(i.alias.toLowerCase());if(o===void 0)continue;let a=RN(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function kN(e,t){return wN(e)===wN(t)}function wN(e){let t=TN(e);try{return _p(t)}catch{return t}}function y4(e){let t=e;for(;;){try{if(Er.existsSync(t))return t}catch{return}let n=zn(t);if(n===t)return;t=n}}function E4(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function w4(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(l4),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
3140
|
+
List native provider sessions in scope, or list recent managed runs with --runs.`,CG=50,fN=500});import{existsSync as Es,readFileSync as dp}from"node:fs";import{homedir as hN}from"node:os";import{dirname as gN,resolve as Yn}from"node:path";import{fileURLToPath as FG}from"node:url";function up(e,t={}){let n=[],r=qG(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&n.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&n.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.`),i==="copilot"){if(!s.model)continue;n.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){n.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(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&n.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){n.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=YG(t.opencodeConfigPath);if(!a.available){n.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}`));n.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}n.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(i==="kimi"){if(!s.model)continue;let a=KG(t.kimiConfigPath);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not declared in Kimi's [models] config. Valid configured models: ${_N(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(!s.model)continue;let o=r.get(i);if(!o){n.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Yl??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${_N(o)}`)}return n}function qG(e){if(!e&&Di)return Di;let t=new Map,n,r=e??BG();if(!Es(r))return n=`${r} not found`,e||lp(t),e||(Di=t),e||(Yl=n),t;let s;try{s=dp(r,"utf-8")}catch(i){return n=`${r} could not be read: ${i instanceof Error?i.message:String(i)}`,e||lp(t),e||(Di=t),e||(Yl=n),t}for(let[i,o]of Object.entries(UG)){let a=JG(s,o),l=GG(a);l.length>0&&t.set(i,l)}return t.size===0&&(n=`${r} has no tested model rows`),!e&&t.size===0&&lp(t),e||(Di=t),e||(Yl=n),t}function BG(){return HG(gN(FG(import.meta.url)))}function HG(e){let t=XG(e);if(t){let r=Yn(t,"durable-memory","model_selection.md");if(Es(r))return r}let n=[Yn(e,"..","..","durable-memory","model_selection.md"),Yn(e,"..","..","..","durable-memory","model_selection.md")];for(let r of n)if(Es(r))return r;return n[n.length-1]}function XG(e){let t=Yn(e);for(;;){if(Es(Yn(t,"package.json")))return t;let n=gN(t);if(n===t)return null;t=n}}function lp(e){for(let[t,n]of Object.entries(WG))e.set(t,n)}function JG(e,t){let r=new RegExp(`^## ${ZG(t)}\\s*$`,"m").exec(e);if(!r)return"";let s=r.index+r[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function GG(e){let t=new Set;for(let n of e.split(/\r?\n/)){let r=n.trim();if(!r.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(r);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function KG(e){let t=process.env.KIMI_CODE_HOME||Yn(hN(),".kimi-code"),n=e??Yn(t,"config.toml");if(!Es(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=dp(n,"utf-8")}catch(i){return{available:!1,models:[],reason:`${n} could not be read: ${i instanceof Error?i.message:String(i)}`}}let s=new Set;for(let i of r.split(/\r?\n/)){if(/^\s*\[/.test(i)&&!/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.test(i))return{available:!1,models:[],reason:`${n} has an invalid TOML table header`};let o=/^\s*\[\s*(.+?)\s*\]\s*(?:#.*)?$/.exec(i);if(!o)continue;let a=VG(o[1]);if(o[1].trim().startsWith("models")&&a===null)return{available:!1,models:[],reason:`${n} has an invalid [models] table header`};a?.[0]==="models"&&a.length>=2&&s.add(a[1])}return s.size===0?{available:!1,models:[],reason:`${n} has no [models] entries`}:{available:!0,models:[...s].sort()}}function VG(e){let t=[],n=0;for(;n<e.length;){for(;/\s/.test(e[n]??"");)n++;if(n>=e.length)break;let r="",s=e[n]==='"'||e[n]==="'"?e[n++]:void 0;if(s){for(;n<e.length&&e[n]!==s;)s==='"'&&e[n]==="\\"&&n+1<e.length&&n++,r+=e[n++];if(e[n]!==s)return null;n++}else{for(;n<e.length&&e[n]!==".";)r+=e[n++];r=r.trim()}if(!r)return null;for(t.push(r);/\s/.test(e[n]??"");)n++;if(n>=e.length)break;if(e[n]!==".")return null;n++}return t.length>0?t:null}function YG(e){let t=e??Yn(hN(),".config","opencode","opencode.json");if(!Es(t))return{available:!0,models:[]};let n;try{n=JSON.parse(dp(t,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${t} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:zG(n)}}function zG(e){if(!cp(e))return[];let t=Vl(e.provider)??Vl(e.providers);if(!t)return[];let n=new Set;for(let[r,s]of Object.entries(t)){if(!cp(s))continue;let i=Vl(s.models)??Vl(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function Vl(e){return cp(e)?e:null}function cp(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function _N(e){return e.length>0?e.join(", "):"(none)"}function ZG(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var UG,WG,Di,Yl,yN=w(()=>{"use strict";UG={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},WG={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-opus-5","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.6-sol","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 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},Di=null});import{homedir as QG}from"node:os";import{basename as e4}from"node:path";function zl(e,t){let n=new Set;return{text:e.replace(n4,(s,i)=>{let o=i.trim(),a=t4[o];return a===void 0?(n.add(o),s):a(t)}),unknownNames:[...n].sort()}}function Zl(e){return{workdir:e.workdir,teamfile:e.teamfile,date:r4(e.date)}}function r4(e){return e.toISOString().slice(0,10)}var t4,n4,fp=w(()=>{"use strict";t4={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=e4(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>QG(),date:e=>e.date},n4=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Fi={};me(Fi,{GEMINI_PROVIDER_NOTICE:()=>vN,_setLintOpenCodeConfigProbeForTests:()=>f4,_setLintSessiondirFsOpsForTests:()=>u4,_setTeamfileSeedForTests:()=>d4,buildRootTeamRegistrationRow:()=>xN,registerRootTeam:()=>AN,runHire:()=>T4,runLint:()=>w4,runRefresh:()=>v4,runSeed:()=>IN,sha256Text:()=>NN});import{createHash as s4}from"node:crypto";import{accessSync as i4,constants as EN,existsSync as o4,readFileSync as tc,realpathSync as _p,statSync as a4,writeFileSync as ec}from"node:fs";import{dirname as zn,resolve as TN}from"node:path";function d4(e){bN=e??(async t=>{let{seed:n}=await Promise.resolve().then(()=>(vt(),Kd)),r=await n(t);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}})}function u4(e){Er=e===null?hp:{...hp,...e}}function f4(e){SN=e??ed}async function m4(e,t,n){let r=e.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(r.map(async i=>({member:i,result:await SN({cwd:i.sessiondir??t,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...n!==void 0?{env:n}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function p4(e,t){let n=zn(t),r=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=TN(o);if(r.has(a))continue;let l=_4(a);l!==void 0&&(r.add(a),s.push(`${i.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function _4(e){try{if(Er.existsSync(e)){if(!Er.statSync(e).isDirectory())return"ENOTDIR";Er.accessSync(e,EN.W_OK);return}let t=y4(e);if(t===void 0)return;if(!Er.statSync(t).isDirectory())return"ENOTDIR";Er.accessSync(t,EN.W_OK);return}catch(t){return E4(t)??"permission check failed"}}function h4(e,t){let n=[];for(let r of e)r.teamfile!==void 0||r.sessiondir===void 0||kN(r.sessiondir,t)&&n.push(`${r.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return n}function g4(e,t,n,r){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!kN(i.sessiondir,r))continue;let o=n.get(i.alias.toLowerCase());if(o===void 0)continue;let a=RN(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function kN(e,t){return wN(e)===wN(t)}function wN(e){let t=TN(e);try{return _p(t)}catch{return t}}function y4(e){let t=e;for(;;){try{if(Er.existsSync(t))return t}catch{return}let n=zn(t);if(n===t)return;t=n}}function E4(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function w4(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(l4),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
|
|
3141
3141
|
`),2;let n=e[0],r;try{r=await R(t,c=>Ee(n,c))}catch(c){return He(t,`${n}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=lt(r)}catch(c){return He(t,`${n}: ${c instanceof Error?c.message:String(c)}`)}let i=Mf(s,zn(r)),o=up(s.members),a=tc(r,"utf8"),l=zl(a,Zl({workdir:zn(r),teamfile:r,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Yc(s.members,zn(r))),o.push(...p4(s.members,r)),o.push(...h4(s.members,zn(r))),o.push(...await m4(s.members,zn(r),t.env));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
|
|
3142
3142
|
`);for(let c of s.members)yp([c],t),c.session!==void 0&&c.session.length<ji&&o.push(`${c.alias}: sessionid is shorter than ${ji} chars; run lmctl seed to refresh it`);for(let c of o)t.stderr.write(`warning: ${c}
|
|
3143
3143
|
`);return i.length>0?1:(t.stdout.write(`ok
|
|
@@ -3156,7 +3156,7 @@ List native provider sessions in scope, or list recent managed runs with --runs.
|
|
|
3156
3156
|
`),"utf8"),t.stdout.write(`${g.alias}: seeded ${y.sessionId} provider=${g.provider} sessiondir=${E}
|
|
3157
3157
|
`)}let p=l.join(`
|
|
3158
3158
|
`),_=L4(p,_p(r));(_!==p||d)&&ec(r,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
|
|
3159
|
-
`);let h=new Date().toISOString();try{await R(t,g=>{AN(g,{teamfilePath:s,name:o.name,rawText:_,now:h})})}catch(g){return He(t,g instanceof Error?g.message:String(g))}return 0}async function T4(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Ql),0;let n=Y(e,["--provider","--sessiondir"],[]);if(n.error!==void 0)return pp(t,n.error,Ql);if(n.positionals.length!==2)return pp(t,"expected <teamfile.lmctl> and <alias>",Ql);let[r,s]=n.positionals;if(!x4(s))return He(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return He(t,"hire only applies to non-Lead members");let i
|
|
3159
|
+
`);let h=new Date().toISOString();try{await R(t,g=>{AN(g,{teamfilePath:s,name:o.name,rawText:_,now:h})})}catch(g){return He(t,g instanceof Error?g.message:String(g))}return 0}async function T4(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Ql),0;let n=Y(e,["--provider","--sessiondir"],[]);if(n.error!==void 0)return pp(t,n.error,Ql);if(n.positionals.length!==2)return pp(t,"expected <teamfile.lmctl> and <alias>",Ql);let[r,s]=n.positionals;if(!x4(s))return He(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return He(t,"hire only applies to non-Lead members");let i=C(n,"--provider");if(i===void 0)return pp(t,"missing value for --provider",Ql);if(!LN(i))return He(t,`invalid provider "${i}"`);let o;try{o=await R(t,u=>Ee(r,u))}catch(u){return He(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=tc(o,"utf8")}catch(u){return He(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}if(N4(a,s))return He(t,`${s}: alias already exists in ${o}`);let l=C(n,"--sessiondir"),c=[`_MEMBER_ alias=${gp(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${gp(l)}`]].join(" "),d=R4(a,c);return ec(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
|
|
3160
3160
|
`),t.stdout.write(`Run: lmctl seed ${o}
|
|
3161
3161
|
`),0}async function v4(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(mp),0;let n,r;if(e.length===1){let u=gn(e[0]);if(u===null)return t.stderr.write(mp),2;n=u.teamfile,r=u.alias}else if(e.length===2)[n,r]=e;else return t.stderr.write(mp),2;let s;try{s=await R(t,u=>Ee(n,u))}catch(u){return He(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=tc(s,"utf8")}catch(u){return He(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
|
|
3162
3162
|
`),a=I4(o,r);if(a===void 0)return He(t,`${r}: no active _MEMBER_ entry found`);let l=o[a];if(Pi(l,"teamfile")!==void 0)return He(t,`${r}: refresh only applies to provider-backed members, not teamfile= members`);let c=(t.env??process.env)[Ds],d=Pi(l,"sessionid");return c!==void 0&&c.length>0&&d===c?He(t,`${r}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=RN(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),ec(s,o.join(`
|
|
@@ -3202,7 +3202,7 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
|
|
|
3202
3202
|
re-seed.
|
|
3203
3203
|
A member cannot refresh its own running session; run the refresh from a
|
|
3204
3204
|
different member session or a plain operator shell.
|
|
3205
|
-
`,vN='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',hp={existsSync:o4,statSync:a4,accessSync:i4},bN=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),Kd)),n=await t(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}},Er=hp,SN=ed});var jN={};
|
|
3205
|
+
`,vN='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',hp={existsSync:o4,statSync:a4,accessSync:i4},bN=async e=>{let{seed:t}=await Promise.resolve().then(()=>(vt(),Kd)),n=await t(e);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}},Er=hp,SN=ed});var jN={};me(jN,{runClone:()=>F4});import{existsSync as Ep,mkdirSync as O4,readFileSync as $4,readdirSync as C4,statSync as MN,writeFileSync as M4}from"node:fs";import{basename as ON,dirname as D4,extname as j4,join as DN,resolve as $N}from"node:path";async function F4(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(P4),0;if(e.length!==2)return t.stderr.write(`usage: lmctl clone <source> <dest>
|
|
3206
3206
|
`),2;let[n,r]=e,s,i=n;try{if(/^http:\/\//i.test(n))throw new Error("plaintext http:// sources are not allowed; use https://");if(/^https:\/\//i.test(n))s=await W4(n);else{let c=$N(n);if(!Ep(c))throw new Error(`source not found: ${n}`);let u=MN(c).isDirectory()?q4(c):c;s=$4(u,"utf8"),i=u}}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
|
|
3207
3207
|
`),1}let o=$N(r),a=B4(o,i,r);if(Ep(a))return t.stderr.write(`error: ${a} already exists.
|
|
3208
3208
|
`),1;let l=X4(H4(s));return O4(D4(a),{recursive:!0}),M4(a,l,"utf8"),t.stdout.write(`Cloned ${n} -> ${a}
|
|
@@ -3223,7 +3223,7 @@ Examples:
|
|
|
3223
3223
|
lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
3224
3224
|
lmctl clone ./backend/ ./backend-v2/backend-v2.lmctl
|
|
3225
3225
|
lmctl clone https://example.com/backend.lmctl ./backend-v2/backend-v2.lmctl
|
|
3226
|
-
`;U4=new Set([301,302,303,307,308]),CN=10});var XN={};
|
|
3226
|
+
`;U4=new Set([301,302,303,307,308]),CN=10});var XN={};me(XN,{runRestoreTeamfile:()=>tK});import{randomUUID as J4}from"node:crypto";import{existsSync as qN,linkSync as G4,lstatSync as K4,mkdirSync as V4,realpathSync as Y4,renameSync as z4,rmSync as Z4,writeFileSync as Q4}from"node:fs";import{basename as wp,dirname as Tp,extname as eK,isAbsolute as BN,resolve as Wi}from"node:path";async function tK(e,t={stdout:process.stdout,stderr:process.stderr},n={}){if(e.length===1&&(e[0]==="--help"||e[0]==="-h"))return t.stdout.write(FN),0;let r=Y(e,[],["--force","--json"]);if(r.error!==void 0)return I(t,r.error);if(r.positionals.length!==1)return I(t,FN.trimEnd());try{return await R(t,s=>nK(r.positionals[0],W(r,"--force"),W(r,"--json"),t,s,n.now?.()??new Date))}catch(s){return qe(t,s)}}function nK(e,t,n,r,s,i){let o=r.cwd??process.cwd(),a=rK(s,o),l=sK(a,e,o);if(l.kind==="missing")return I(r,`no usage evidence found for teamfile ${JSON.stringify(e)} in the local event log; optional teamfile reconstruction is unavailable, but lmctl restore can still recover files from native provider sessions`);if(l.kind==="ambiguous"){let h=l.paths.map(g=>` ${g.path} (tracked_invocations=${g.invocations.length}, team_messages=${g.chats.length})`).join(`
|
|
3227
3227
|
`);return I(r,`ambiguous teamfile name ${JSON.stringify(e)}; specify one exact path:
|
|
3228
3228
|
${h}`)}let c=l.path,d=c.path,u=qN(d);if(u&&!t)return I(r,`refusing to overwrite existing teamfile: ${d} (re-run with --force to reconstruct it from usage evidence)`);let f=lK(c);if(f.members.length===0)return I(r,`usage evidence exists for ${d}, but no member has usable latest provider/session metadata; no teamfile was written. lmctl restore can still recover files from native provider sessions`);let m=`${f.members.map(h=>h.line).join(`
|
|
3229
3229
|
`)}
|
|
@@ -3254,10 +3254,10 @@ Only members with usable tracked_invocation metadata are restored.
|
|
|
3254
3254
|
This is best-effort: local event history may be incomplete across lmctl versions.
|
|
3255
3255
|
Use lmctl restore to recover files from native provider sessions independently.
|
|
3256
3256
|
Existing files are never overwritten unless --force is supplied.
|
|
3257
|
-
`;qi=class extends Error{}});var VN={};
|
|
3257
|
+
`;qi=class extends Error{}});var VN={};me(VN,{runPlan:()=>vK});import{existsSync as hK,mkdirSync as gK,writeFileSync as yK}from"node:fs";import{basename as GN,extname as KN,join as EK,resolve as wK}from"node:path";async function vK(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(TK),0;let n=Y(e,["--team","--provider"],[]);if(n.error!==void 0)return t.stderr.write(`error: ${n.error}
|
|
3258
3258
|
`),t.stderr.write(`usage: lmctl plan [options] <directory>
|
|
3259
3259
|
`),2;if(n.positionals.length!==1)return t.stderr.write(`usage: lmctl plan [options] <directory>
|
|
3260
|
-
`),2;let r=wK(n.positionals[0]);gK(r,{recursive:!0});let s
|
|
3260
|
+
`),2;let r=wK(n.positionals[0]);gK(r,{recursive:!0});let s=C(n,"--team")??GN(r),i=C(n,"--provider")??"claude",o=EK(r,bK(s));if(hK(o))return t.stderr.write(`error: ${o} already exists.
|
|
3261
3261
|
`),1;let a=kK({teamName:SK(s),leadProvider:i}),l=zl(a,Zl({workdir:r,teamfile:o,date:new Date}));return yK(o,l.text,"utf8"),t.stdout.write(`Created ${o}
|
|
3262
3262
|
`),t.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
|
|
3263
3263
|
`),t.stdout.write(`After editing, run: lmctl lint ${o}
|
|
@@ -3289,8 +3289,8 @@ Examples:
|
|
|
3289
3289
|
|
|
3290
3290
|
# Same shape, codex for the Lead and Reviewer2
|
|
3291
3291
|
lmctl plan ./backend --provider codex
|
|
3292
|
-
`});import{execFileSync as IK}from"node:child_process";import{resolve as zN}from"node:path";function NK(e){return e.filter(t=>t.state!=="retired")}function ZN(e,t,n){if(n!==void 0){let a=t.findProjectByName(n);return a===null?I(e,`project not found: ${n}`):a}let r=e.cwd??process.cwd(),s;try{s=IK("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return I(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=zN(s),o=t.listProjects().find(a=>zN(a.local_path)===i);return o===void 0?I(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function QN(e,t,n,r){if(r!==void 0){let i=t.findTeamByName(r);return i===null?I(e,`team not found: ${r}`):i}let s=t.getTeam(n.team_id);return s===null?I(e,`project ${n.name} has no assigned team; use --team <name>`):s}function ex(e,t,n,r){if(r!==void 0){let i=t.findTeamMemberByAlias(n.id,r);return i===null||i.state==="retired"?I(e,`member not found: ${r}`):i}let s=NK(t.listTeamMembers(n.id)).find(i=>i.role==="agent");return s===void 0?I(e,`team ${n.name} has no active agent member`):s}var tx=w(()=>{"use strict";Le()});var sx={};
|
|
3293
|
-
`),Ue({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return I(e,`no resume incantation for provider "${n}"`);let[a,...l]=o;return await new Promise(c=>{let d=xK(a,l,{stdio:"inherit",cwd:s,env:Ye(process.env,s,r,"terminal")});d.on("error",u=>{c(I(e,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function MK(e,t,n){let r
|
|
3292
|
+
`});import{execFileSync as IK}from"node:child_process";import{resolve as zN}from"node:path";function NK(e){return e.filter(t=>t.state!=="retired")}function ZN(e,t,n){if(n!==void 0){let a=t.findProjectByName(n);return a===null?I(e,`project not found: ${n}`):a}let r=e.cwd??process.cwd(),s;try{s=IK("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return I(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=zN(s),o=t.listProjects().find(a=>zN(a.local_path)===i);return o===void 0?I(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function QN(e,t,n,r){if(r!==void 0){let i=t.findTeamByName(r);return i===null?I(e,`team not found: ${r}`):i}let s=t.getTeam(n.team_id);return s===null?I(e,`project ${n.name} has no assigned team; use --team <name>`):s}function ex(e,t,n,r){if(r!==void 0){let i=t.findTeamMemberByAlias(n.id,r);return i===null||i.state==="retired"?I(e,`member not found: ${r}`):i}let s=NK(t.listTeamMembers(n.id)).find(i=>i.role==="agent");return s===void 0?I(e,`team ${n.name} has no active agent member`):s}var tx=w(()=>{"use strict";Le()});var sx={};me(sx,{SIZE_WARN_EST_TOKENS:()=>Bi,estimateTokens:()=>rx,runTerminal:()=>LK});import{spawn as xK}from"node:child_process";import{statSync as AK}from"node:fs";async function LK(e,t){if(e.includes("--help")||e.includes("-h"))return PK(t);let n=Y(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return I(t,n.error);let r=C(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return I(t,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return I(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?W(n,o):C(n,o)!==void 0)return I(t,`--run is mutually exclusive with ${o}`);try{return await R(t,async o=>{let a=C(n,"--alias"),l=nv(o,s,a);return"err"in l?I(t,l.err):vp(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return qe(t,o)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?W(n,l):C(n,l)!==void 0)return I(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return I(t,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=n.positionals[0],o=n.positionals[1],a=Hn(RK,{target:i,alias:o,flags:{}});return a.mode==="error"?I(t,a.message):a.mode!=="ai-team"?I(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?I(t,"terminal: alias required for the teamfile target"):await R(t,l=>OK(t,a.teamfile,a.alias,l,W(n,"--json")))}try{return await R(t,async s=>{let i=MK(t,s,n);if(typeof i=="number")return i;let o=C(n,"--alias");return W(n,"--size")?jK(t,s,i,o,W(n,"--json")):DK(t,s,i,o)})}catch(s){return qe(t,s)}}async function OK(e,t,n,r,s){let i;try{i=Te(t,n,r)}catch(u){return u instanceof we?I(e,u.message):qe(e,u)}let o=Mt(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:Xt()});if(!o.acquired){let u=o.current.holder_pid,f=u===null?null:$e(u)?"live":"dead",m=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(u===null?"(holder_pid=unavailable)":`(holder_pid=${u}, ${f})`);return s?(z(e,{status:"error",errorKind:"busy",message:m,holder_pid:u,holder_liveness:f}),1):I(e,m)}let a=ZS({teamfile:i.teamfile,alias:i.alias}),l=null,c=null,d=null;try{r.setTerminalLock(a),c=$K(r,i),l=setInterval(()=>{try{let u=new Date().toISOString(),f=r.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,u);f&&r.heartbeatAgentInflight(o.lease,o.leaseId,u),!f&&l!==null&&(clearInterval(l),l=null)}catch{}},QS()),l.unref?.();try{fs(e,lt(i.teamfile),i.teamfile)}catch{}return d=await vp(e,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead}),d}finally{l!==null&&clearInterval(l),r.clearTerminalLock(a.teamfile,a.alias,a.lock_id),r.releaseAgentInflight(o.lease,o.leaseId),CK(r,c,d)}}function $K(e,t){try{return e.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:t.teamfile,from_identity:`${t.teamfile}:terminal`,target_teamfile:t.teamfile,target_alias:t.alias,root_teamfile:t.teamfile,cwd:t.sessiondir,command:`lmctl terminal ${t.teamfile} ${t.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:t.provider,sessionid:t.sessionid,...t.model!==void 0?{model:t.model}:{}})}).id}catch{return null}}function CK(e,t,n){if(t!==null)try{e.finishTrackedInvocation(t,{status:n===0?"done":"error",exit_code:n,result_summary:n===0?"terminal session ended":null,error:n===0?null:`terminal exited with code ${n??"unknown"}`})}catch{}}async function vp(e,t){let{provider:n,sessionid:r,sessiondir:s,model:i}=t;if(!pl(n))return I(e,`no resume incantation for provider "${n}"`);if(!ob.test(r))return I(e,"refusing to resume: malformed sessionid");let o=Wf(n,r,{isLead:t.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;e.stderr.write(`${d}
|
|
3293
|
+
`),Ue({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return I(e,`no resume incantation for provider "${n}"`);let[a,...l]=o;return await new Promise(c=>{let d=xK(a,l,{stdio:"inherit",cwd:s,env:Ye(process.env,s,r,"terminal")});d.on("error",u=>{c(I(e,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function MK(e,t,n){let r=C(n,"--team");if(r!==void 0){let o=t.findTeamByName(r);return o===null?I(e,`team not found: ${r}`):o}let s=ZN(e,t,C(n,"--project"));return typeof s=="number"?s:QN(e,t,s,void 0)}async function DK(e,t,n,r){let s=ex(e,t,n,r);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?I(e,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${n.name}\` first`):vp(e,{provider:et(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function rx(e){if(e&&Array.isArray(e.messages)&&e.messages.length>0){let n=e.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:e.messages.length,bytes:null}}let t=e?.filePath;if(t!==void 0)try{let n=AK(t).size;return{chars:n,est:Math.ceil(n/4),messages:e?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function jK(e,t,n,r,s){let i;if(r!==void 0){let a=t.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return I(e,`member not found: ${r}`);i=[a]}else i=t.listTeamMembers(n.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let o=[];for(let a of i){let l=a.sessionid;if(l===null)continue;let c=et(a),d=a.model??null,u=null;pl(c)&&(u=await De(l,c));let f=rx(u),m=f.est>Bi;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?_l(c,l,d!==null?{model:d}:{}):null})}if(s)return z(e,{estimate:!0,legend:nx,guide_tokens:Bi,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
|
|
3294
3294
|
`),e.stdout.write(`${nx}
|
|
3295
3295
|
`);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);e.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
|
|
3296
3296
|
`),a.over_guide&&e.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
|
|
@@ -3331,7 +3331,7 @@ Examples:
|
|
|
3331
3331
|
tokens it surfaces the resume incantation so YOU can
|
|
3332
3332
|
open & self-compact. Nothing is ever changed
|
|
3333
3333
|
automatically; ${Bi} is a guide, not a gate.
|
|
3334
|
-
`),0}var RK,Bi,nx,ix=w(()=>{"use strict";dt();At();Le();tx();rt();hn();Et();Si();gt();hi();Im();za();
|
|
3334
|
+
`),0}var RK,Bi,nx,ix=w(()=>{"use strict";dt();At();Le();tx();rt();hn();Et();Si();gt();hi();Im();za();ce();tn();RK={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bi=2e5,nx="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{createHash as FK,randomBytes as UK}from"node:crypto";import{readFile as WK}from"node:fs/promises";function ox(e=new Date,t=UK(4)){let n=e.getUTCFullYear().toString().padStart(4,"0"),r=(e.getUTCMonth()+1).toString().padStart(2,"0"),s=e.getUTCDate().toString().padStart(2,"0"),i=e.getUTCHours().toString().padStart(2,"0"),o=e.getUTCMinutes().toString().padStart(2,"0"),a=e.getUTCSeconds().toString().padStart(2,"0"),l=t.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${n}${r}${s}-${i}${o}${a}-${l}`}function qK(e){return FK("sha256").update(e).digest("hex")}async function ax(e){return(await Promise.all(e.map(async({bundlePath:n,absPath:r})=>{let s=await WK(r);return{path:n,sha256:qK(s),size:s.byteLength}}))).sort((n,r)=>n.path<r.path?-1:n.path>r.path?1:0)}function lx(e){return{ticket_id:e.ticketId,lmctl_next_version:e.lmctlNextVersion,node_version:e.nodeVersion,platform:e.platform,generated_at:e.generatedAt.toISOString(),sanitized:e.sanitized,files:e.files}}var bp=w(()=>{"use strict"});import{spawnSync as cx}from"node:child_process";import{mkdir as Sp,writeFile as dx,readFile as BK,rm as ux}from"node:fs/promises";import{tmpdir as HK}from"node:os";import{dirname as fx,join as kp}from"node:path";async function mx(e){let t=e.stagingDir??kp(HK(),`lmctl-diag-${e.ticketId}`),n=kp(t,`diagnostic-${e.ticketId}`);await Sp(n,{recursive:!0});let r=[],s=async(u,f)=>{let m=kp(n,u);if(await Sp(fx(m),{recursive:!0}),typeof f=="string")await dx(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await dx(m,new Uint8Array(p))}r.push({bundlePath:u,absPath:m})},i=u=>`${JSON.stringify(u,null,2)}
|
|
3335
3335
|
`;if(e.data.serve!==void 0){let u=e.data.serve,f=u.pid===null?`no daemon (source=${u.pid_source})
|
|
3336
3336
|
`:`${u.pid}
|
|
3337
3337
|
# source=${u.pid_source} alive=${String(u.pid_alive)}
|
|
@@ -3350,7 +3350,7 @@ Examples:
|
|
|
3350
3350
|
# tail_lines=${u.tail_lines}
|
|
3351
3351
|
`;await s("intents/recent.log",`${m}${u.tail}${u.tail.length>0?`
|
|
3352
3352
|
`:""}`)}if(await s("README.md",XK(e)),e.sanitized)for(let u of r){let f=await BK(u.absPath);try{Hp(u.bundlePath,f.toString("utf8"))}catch(m){throw await ux(t,{recursive:!0,force:!0}),m instanceof Zn,m}}let o=await ax(r),a=lx({ticketId:e.ticketId,lmctlNextVersion:e.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:e.generatedAt??new Date,sanitized:e.sanitized,files:o});await s("manifest.json",i(a)),await Sp(fx(e.outputPath),{recursive:!0});let l=cx("tar",["-czf",e.outputPath,"-C",t,`diagnostic-${e.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=cx("stat",["-c","%s",e.outputPath],{encoding:"utf8"}),d=Number.parseInt((c.stdout??"0").trim(),10)||0;return await ux(t,{recursive:!0,force:!0}),{outputPath:e.outputPath,manifest:a,bundleSizeBytes:d}}function XK(e){let t=Object.keys(e.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${e.ticketId}`,"",`Generated by lmctl ${e.lmctlNextVersion}.`,"",`Sections included: ${t}`,`Sanitized: ${e.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(`
|
|
3353
|
-
`)}var px=w(()=>{"use strict";bp();Xi()});import{spawnSync as JK}from"node:child_process";import{stat as GK}from"node:fs/promises";async function _x(e){try{if(!(await GK(e.bundlePath)).isFile())return{mode:e.mode,ok:!1,message:`bundle not a regular file: ${e.bundlePath}`}}catch(t){return{mode:e.mode,ok:!1,message:`bundle missing: ${t instanceof Error?t.message:String(t)}`}}switch(e.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${e.bundlePath}`,destination:e.bundlePath};case"internal-s3":return KK(e);case"hq":return VK(e)}}function KK(e){let n=JK("which",["aws"],{encoding:"utf8"}).status===0,s=`${e.s3Prefix??"s3://lmctl/diagnostics/"}${e.ticketId}.tar.gz`;return n?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${e.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${e.bundlePath} -> ${s}`,destination:s}}function VK(e){let t=e.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${t}/diagnostics/init with ticket ${e.ticketId}`,destination:t}}var hx=w(()=>{"use strict"});var yx={};
|
|
3353
|
+
`)}var px=w(()=>{"use strict";bp();Xi()});import{spawnSync as JK}from"node:child_process";import{stat as GK}from"node:fs/promises";async function _x(e){try{if(!(await GK(e.bundlePath)).isFile())return{mode:e.mode,ok:!1,message:`bundle not a regular file: ${e.bundlePath}`}}catch(t){return{mode:e.mode,ok:!1,message:`bundle missing: ${t instanceof Error?t.message:String(t)}`}}switch(e.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${e.bundlePath}`,destination:e.bundlePath};case"internal-s3":return KK(e);case"hq":return VK(e)}}function KK(e){let n=JK("which",["aws"],{encoding:"utf8"}).status===0,s=`${e.s3Prefix??"s3://lmctl/diagnostics/"}${e.ticketId}.tar.gz`;return n?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${e.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${e.bundlePath} -> ${s}`,destination:s}}function VK(e){let t=e.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${t}/diagnostics/init with ticket ${e.ticketId}`,destination:t}}var hx=w(()=>{"use strict"});var yx={};me(yx,{parseDiagnoseArgs:()=>gx,runDiagnose:()=>ZK});import{tmpdir as YK}from"node:os";import{join as zK}from"node:path";async function ZK(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${tV()}
|
|
3354
3354
|
`),0;let n=gx(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
|
|
3355
3355
|
`),2;if(n.noSanitize&&(n.upload||n.internalS3||n.hqUrl!==void 0))return t.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
|
|
3356
3356
|
`),2;if(n.upload&&n.internalS3)return t.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
|
|
@@ -3361,7 +3361,7 @@ Examples:
|
|
|
3361
3361
|
`),t.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
|
|
3362
3362
|
`)),c.ok||i==="local"?0:1})}catch(o){return t.stderr.write(`diagnose failed: ${o instanceof Error?o.message:String(o)}
|
|
3363
3363
|
`),1}}function gx(e){let t={upload:!1,internalS3:!1,noSanitize:!1,json:!1},n=[];for(let r=0;r<e.length;r+=1){let s=e[r];if(s==="--output"){let i=e[++r];if(i===void 0||i.startsWith("--"))return"missing value for --output";t.outputPath=i;continue}if(s==="--upload"){t.upload=!0;continue}if(s==="--internal-s3"){t.internalS3=!0;continue}if(s==="--hq"){let i=e[++r];if(i===void 0||i.startsWith("--"))return"missing value for --hq";t.hqUrl=i,t.upload=!0;continue}if(s==="--include"){let i=e[++r];if(i===void 0||i.startsWith("--"))return"missing value for --include";if(!QK(i))return`unknown section: ${i} (expected one of ${Ji.join(", ")})`;n.push(i);continue}if(s==="--no-sanitize"){t.noSanitize=!0;continue}if(s==="--json"){t.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return n.length>0&&(t.include=n),t}function QK(e){return Ji.includes(e)}function eV(e){return zK(YK(),`lmctl-diag-${e}.tar.gz`)}function tV(){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(`
|
|
3364
|
-
`)}var Ex=w(()=>{"use strict";ks();px();bp();Xi();hx();Qe();Le()});var kx={};
|
|
3364
|
+
`)}var Ex=w(()=>{"use strict";ks();px();bp();Xi();hx();Qe();Le()});var kx={};me(kx,{ATTENTION_STATES:()=>xp,DAEMON_INTERVAL_FAST_MS:()=>Np,REQUIRED_TEAM_ALIASES:()=>wx,chooseDiagnoses:()=>bx,collectEvidence:()=>vx,diagnose:()=>Tx,renderReport:()=>Sx,runDiagnosePrompt:()=>sV});function Tx(e,t){let n=vx(e,t),r=bx(n);return Sx(n,r)}function vx(e,t){let n=t.trim(),r={promptId:n,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:gi(),lastTickAt:null}},s=null;try{s=e.getPromptDispatch(n)}catch{r.dispatch.sectionAvailable=!1}if(s!=null&&(r.dispatch.rowExists=!0,r.prompt.exists=!0,r.prompt.project_id=s.project_id,r.prompt.text_preview=rV(s.text),r.prompt.created_at=s.created_at,r.prompt.completed_at=s.completed_at,r.prompt.job_id=s.job_id),r.prompt.job_id!==void 0)try{let i=e.getJob(r.prompt.job_id);if(i!==null&&(r.job.exists=!0,r.job.status=i.status,r.job.attempt_count=i.attempt_count,r.job.last_error=i.last_error,r.job.available_at=i.available_at,r.job.locked_by=i.locked_by,r.job.run_id=i.run_id,i.run_id!==null))try{let o=e.getRun(i.run_id);if(o!==null){r.run.exists=!0,r.run.id=o.id,r.run.current_state=o.current_state,r.run.terminal_state=o.terminal_state,r.run.started_at=o.started_at,r.run.ended_at=o.ended_at;let a="__paused__:";r.run.paused_step=o.current_state!==null&&o.current_state.startsWith(a)?o.current_state.slice(a.length):null,r.run.paused_at=o.paused_at}}catch{r.run.sectionAvailable=!1}}catch{r.job.sectionAvailable=!1}if(r.prompt.project_id!==void 0)try{let i=e.getProject(r.prompt.project_id);if(i!==null){r.project.exists=!0,r.project.id=i.id,r.project.name=i.name,r.project.local_path=i.local_path,r.project.test_command=i.test_command,r.project.workflow_name=i.workflow_name,r.project.team_id=i.team_id;try{r.project.workflow_name_resolves=e.getWorkflowByName(i.workflow_name)!==null}catch{r.project.workflow_name_resolves=!1}}}catch{r.project.sectionAvailable=!1}if(r.project.id!==void 0)try{let i=e.listProjectWorkflows(r.project.id);r.workflows.count=i.length;for(let o of i){let a=`workflow_id=${o.workflow_id}`,l=0,c=null;try{let u=e.listWorkflows().find(f=>f.id===o.workflow_id);u!==void 0&&(a=u.name,l=u.version,c=u.source_uri)}catch{}r.workflows.rows.push({workflow_name:a,version:l,enabled:o.enabled,source_uri:c})}}catch{r.workflows.sectionAvailable=!1}if(r.project.team_id!==void 0)try{r.team.teamId=r.project.team_id;let i=e.listTeamMembers(r.project.team_id);for(let a of i)r.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 o=new Set(i.map(a=>a.alias));r.team.missingAliases=wx.filter(a=>!o.has(a))}catch{r.team.sectionAvailable=!1}return r.daemon.workerPid=null,r.daemon.lastTickAt=null,r}function bx(e){let t=[];if(e.dispatch.sectionAvailable&&!e.dispatch.rowExists)return t.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"}),t;e.dispatch.rowExists&&e.job.exists&&(e.job.run_id===null||e.job.run_id===void 0)&&!e.run.exists&&t.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)"}),e.daemon.intervalMs>Np&&t.push({cause:`Daemon poll interval is ${e.daemon.intervalMs}ms (${Math.round(e.daemon.intervalMs/1e3)}s); WT/dev expected <=${Np}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),e.project.exists&&e.workflows.sectionAvailable&&e.workflows.count===0&&e.project.workflow_name_resolves!==!0&&t.push({cause:`Project ${e.project.name??`id=${e.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"The workflow/project CLI surface is retired; inspect the dormant DB rows or migrate this project to a .lmctl teamfile path."}),e.team.sectionAvailable&&e.team.missingAliases.length>0&&t.push({cause:`Default team (team_id=${e.team.teamId??"?"}) missing required aliases: ${e.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 n=e.team.sectionAvailable?e.team.members.filter(s=>xp.has(s.state)):[];if(e.run.exists&&(e.run.paused_step??null)!==null||n.length>0){let s=e.run.paused_step??null,i=n.map(a=>a.alias).join(", "),o=s!==null&&i.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${i} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${i} awaiting operator attention`;t.push({cause:o,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return e.dispatch.rowExists&&e.job.exists&&!e.run.exists&&e.daemon.workerPid===null&&t.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"}),t.slice(0,3)}function Sx(e,t){let n=[];if(n.push(`DIAGNOSE ${e.promptId}`),n.push(""),n.push("[PROMPT]"),e.prompt.exists?(n.push(` id: ${e.promptId}`),n.push(` project_id: ${e.prompt.project_id??"?"}`),n.push(` text: ${e.prompt.text_preview??"?"}`),n.push(` created_at: ${e.prompt.created_at??"?"}`),n.push(` completed_at: ${e.prompt.completed_at??"null"}`)):n.push(" not present in prompt_dispatch table"),n.push(""),n.push("[PROMPT_DISPATCH]"),e.dispatch.sectionAvailable?(n.push(` row exists in prompt_dispatch table: ${e.dispatch.rowExists?"YES":"NO"}`),e.dispatch.rowExists&&(n.push(` job_id: ${e.prompt.job_id??"?"}`),n.push(` dispatched_at: ${e.prompt.created_at??"?"}`),n.push(` last_seen_status: ${nV(e)}`))):n.push(" table not present (schema variation)"),n.push(""),n.push("[PROMPT_RUN]"),e.job.sectionAvailable?e.job.exists?e.run.exists?(n.push(" row exists in prompt_runs table: YES"),n.push(` run_id: ${e.run.id??"?"}`),n.push(` current_step: ${e.run.current_state??"null"}`),n.push(` status: ${e.run.terminal_state??"in_progress"}`),n.push(` started_at: ${e.run.started_at??"?"}`),n.push(` attempts: ${e.job.attempt_count??0}`)):(n.push(" row exists in prompt_runs table: NO"),n.push(` job_id: ${e.prompt.job_id??"?"} status=${e.job.status??"?"} attempts=${e.job.attempt_count??0}`),n.push(" -> job enqueued but no run; daemon poll did not consume it")):(n.push(" row exists in prompt_runs table: NO"),n.push(" -> worker never picked up the prompt (job row missing)")):n.push(" job table not accessible"),n.push(""),n.push("[PROJECT]"),e.project.sectionAvailable?e.project.exists?(n.push(` id: ${e.project.id??"?"}`),n.push(` name: ${e.project.name??"?"}`),n.push(` local_path: ${e.project.local_path??"?"}`),n.push(` test_command: ${e.project.test_command??"null"}`),n.push(` default_workflow: ${e.project.workflow_name??"null"}`)):e.prompt.project_id===void 0?n.push(" not resolvable (no project_id on prompt)"):n.push(` not present (id=${e.prompt.project_id})`):n.push(" project table not accessible"),n.push(""),n.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!e.workflows.sectionAvailable)n.push(" project_workflow table not accessible");else if(e.workflows.count===0&&e.project.exists&&e.project.workflow_name_resolves===!0)n.push(` default_workflow_name: ${e.project.workflow_name??"?"} (resolved via project.workflow_name)`),n.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{n.push(` count: ${e.workflows.count}`);for(let i of e.workflows.rows)n.push(` - ${i.workflow_name} v${i.version} enabled=${i.enabled===1?"true":"false"} source=${i.source_uri??"null"}`)}if(n.push(""),n.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!e.team.sectionAvailable)n.push(" team_member table not accessible");else if(e.team.teamId===void 0)n.push(" not resolvable (no team_id on project)");else{e.team.members.length===0&&n.push(" (no members)");for(let i of e.team.members)n.push(` - alias=${i.alias} provider=${i.provider} state=${i.state} sessionid=${i.sessionid??"null"} sessiondir=${i.sessiondir}`);e.team.missingAliases.length>0&&n.push(` ! missing aliases: ${e.team.missingAliases.join(", ")}`)}n.push("");let r=e.team.sectionAvailable?e.team.members.filter(i=>xp.has(i.state)):[],s=e.run.exists?e.run.paused_step??null:null;if(s!==null||r.length>0){if(n.push("[ATTENTION/ESCALATION]"),s!==null){let i=e.run.paused_at??e.run.started_at??"?";n.push(` paused_step: ${s} (started: ${i})`)}if(r.length>0){let i=r.map(o=>`${o.alias} (state=${o.state}${o.state_updated_at?` since ${o.state_updated_at}`:""}${o.state_reason?`, reason="${o.state_reason}"`:""})`).join(", ");n.push(` members awaiting operator: ${i}`)}else n.push(" members awaiting operator: (none flagged on team)");n.push(" next action expected: operator response via /admin or webcli escalations verb"),n.push("")}if(n.push("[DAEMON STATE]"),n.push(` worker pid: ${e.daemon.workerPid===null?"not observable from CLI":String(e.daemon.workerPid)}`),n.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${e.daemon.intervalMs}`),n.push(` last daemon tick: ${e.daemon.lastTickAt??"not exposed"}`),n.push(""),n.push("[DIAGNOSIS]"),t.length===0)n.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let i of t)n.push(` - ${i.cause}`),n.push(` -> ${i.action}`);return n.join(`
|
|
3365
3365
|
`)+`
|
|
3366
3366
|
`}function nV(e){return e.dispatch.rowExists?e.prompt.completed_at!==null&&e.prompt.completed_at!==void 0?"done":e.job.exists?e.run.exists?e.run.terminal_state!==null&&e.run.terminal_state!==void 0?`terminal:${e.run.terminal_state}`:`running:${e.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function rV(e){let t=e.replace(/\s+/g," ").trim();return t.length<=80?t:`${t.slice(0,80)}...`}async function sV(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${Ip()}
|
|
3367
3367
|
`),0;let n=[];for(let s of e){if(s.startsWith("--"))return t.stderr.write(`error: unknown flag: ${s}
|
|
@@ -3370,8 +3370,8 @@ Examples:
|
|
|
3370
3370
|
`),t.stderr.write(`${Ip()}
|
|
3371
3371
|
`),2;let r=n[0];try{return await R(t,s=>(t.stdout.write(Tx(s,r)),0))}catch(s){return t.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
|
|
3372
3372
|
`),1}}function Ip(){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(`
|
|
3373
|
-
`)}var wx,Np,xp,Ix=w(()=>{"use strict";qf();Le();wx=["Coder","Reviewer1","Polisher"],Np=3e4,xp=new Set(["attention_needed","paused","escalation"])});var Vx={};
|
|
3374
|
-
`)}catch{}}async function hV(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(mV),0;let n=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(n!==void 0)return I(t,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=Y(e,["--since"],["--json"]);if(r.error!==void 0)return I(t,r.error);if(r.positionals.length>0)return I(t,`unknown argument: ${r.positionals[0]}`);let s=W(r,"--json"),i=KV(
|
|
3373
|
+
`)}var wx,Np,xp,Ix=w(()=>{"use strict";qf();Le();wx=["Coder","Reviewer1","Polisher"],Np=3e4,xp=new Set(["attention_needed","paused","escalation"])});var Vx={};me(Vx,{appendIntent:()=>Ux,resolveIntentLogPath:()=>Fx,runStatus:()=>hV});import{appendFileSync as iV,existsSync as oV,mkdirSync as aV}from"node:fs";import{homedir as lV,hostname as Nx}from"node:os";import{basename as cV,dirname as Px,isAbsolute as dV,join as uV,resolve as fV}from"node:path";function Fx(){return process.env.LMCTL_INTENT_LOG??uV(lV(),".lmctl","recent-intents.log")}function Ux(e){try{let t=Fx();aV(Px(t),{recursive:!0});let n=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});iV(t,`${n}
|
|
3374
|
+
`)}catch{}}async function hV(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(mV),0;let n=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(n!==void 0)return I(t,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=Y(e,["--since"],["--json"]);if(r.error!==void 0)return I(t,r.error);if(r.positionals.length>0)return I(t,`unknown argument: ${r.positionals[0]}`);let s=W(r,"--json"),i=KV(C(r,"--since"));if("error"in i)return I(t,i.error);try{let o=t.env??process.env;if(s){let a=await R(t,l=>Ox(l,o));z(t,a)}else{let a=await R(t,async l=>$V(await Ox(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return Ux({verb:"status",args:e}),0}catch(o){return I(t,o instanceof Error?o.message:String(o))}}async function Ox(e,t){let n=_r(t,e);if(!n.ok){if(n.reason==="not-found")throw new Error(yn("status"));return await yV(e)}return await gV(e,n.identity)}async function gV(e,t){let n=Fe(t),r=e.getRootTeam(n.teamfile);if(r===null)throw new Error(yn("status"));let s=Be(r.teamfile_path,e),i=Rp(rc(e,{from:n.value})),o=Rp(rc(e,{target_teamfile:n.teamfile,target_alias:n.alias})),a=vV([...Ap(e,{from:n.value}),...Ap(e,{target_teamfile:n.teamfile,target_alias:n.alias})]);return{scope:"self",identity:n.value,...Wx(),team:{name:s.name,teamfile:r.teamfile_path},members:s.members.map(l=>wV(e,r.teamfile_path,l)),activity:{from_me:i.map(l=>Lp(l,e)),to_me:o.map(l=>Lp(l,e))},transcript_harvest:await Bx(a),mailbox:{outbound:sc(bV(e,n.teamfile,n.alias),"outbound"),inbound_pending:sc(SV(e,n.teamfile,n.alias),"inbound")},waiting_on:kV(e,n.teamfile,n.alias).map(l=>qx(l,e))}}function Wx(){let e=null;try{e=dh(Cc())}catch{}return{db_path:re(),site_name:e}}async function yV(e){let t=e.listRootTeams();return{scope:"db",identity:null,...Wx(),teams:t.map(n=>EV(e,n)),activity:Rp(rc(e)).map(n=>Lp(n,e)),transcript_harvest:await Bx(Ap(e)),mailbox:{pending_outbound:sc($x(e,"sender"),"outbound"),pending_inbound:sc($x(e,"receiver"),"inbound")},waiting_on:IV(e).map(n=>qx(n,e))}}function EV(e,t){if(!oV(t.teamfile_path))return{name:t.name,teamfile:t.teamfile_path,member_count:0,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at,missing_on_disk:!0};let n=0;try{n=Be(t.teamfile_path,e).members.length}catch{n=0}return{name:t.name,teamfile:t.teamfile_path,member_count:n,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at}}function wV(e,t,n){let r=n.teamfile===void 0?null:Ee(dV(n.teamfile)?n.teamfile:fV(Px(t),n.teamfile),e),s=ht(e,t,n.alias),i=s.busy&&s.reason==="in-flight"?TV(e,t,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:t,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function TV(e,t,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,o=e.db.prepare(`
|
|
3375
3375
|
SELECT * FROM tracked_invocation
|
|
3376
3376
|
WHERE kind = 'chat'
|
|
3377
3377
|
AND status = 'running'
|
|
@@ -3460,7 +3460,7 @@ state. From a plain operator shell, show a DB-wide team/activity summary.
|
|
|
3460
3460
|
Text output shows recent activity from the last 24h by default. Use --since 7d
|
|
3461
3461
|
or an ISO timestamp to widen the investigation window. --json returns complete,
|
|
3462
3462
|
uncapped data.
|
|
3463
|
-
`,nc=5,xx=5,Ax=5,pV=5,_V=24*60*60*1e3,Rx=72,Lx=80});var Zx={};
|
|
3463
|
+
`,nc=5,xx=5,Ax=5,pV=5,_V=24*60*60*1e3,Rx=72,Lx=80});var Zx={};me(Zx,{backfillEventLog:()=>tY,rebuildProjections:()=>zx});import{createHash as VV}from"node:crypto";function Tr(e,t){return e==null?null:{teamfile:e,alias:t??""}}function YV(e,t,n){return`lease_${VV("sha256").update(`${e}\0${t}\0${n}`).digest("hex").slice(0,16)}`}function ac(e,t,n,r){n.forEach((s,i)=>{Ne(e,{stream_id:t,event_type:s.event_type,payload:s.payload,observedLastSeq:i,ts:s.ts},()=>{}).appended?r.appended+=1:r.skipped+=1})}function zV(e){let t=`msg_tcl_${e.id}`,n=Tr(e.sender_teamfile,e.sender_alias),r=Tr(e.receiver_teamfile,e.receiver_alias),s={table:"team_chat_log",id:e.id},i={message_id:t,sender:n,receiver:r,root_teamfile:e.root_teamfile,legacy:s},o=[{event_type:oe.CREATE,ts:e.created_at,payload:{...i,message_type:"request",content:e.message,origin:e.origin,correlation_status:"legacy-unavailable"}}];return e.status!=="running"&&o.push({event_type:oe.HANDLED,ts:e.created_at,payload:{...i,outcome:e.status,receipt:e.response,error:e.error_detail,truncated:e.truncated===1}}),{streamId:t,events:o}}function ZV(e){let t=`msg_mbx_${e.id}`,n=Tr(e.sender_teamfile,e.sender_alias),r=Tr(e.receiver_teamfile,e.receiver_alias),s={table:"agent_mailbox",id:e.id},i={message_id:t,sender:n,receiver:r,root_teamfile:e.root_teamfile,legacy:s},o=[];if(e.message_type==="response"){let a=e.request_mailbox_id!==null?`msg_mbx_${e.request_mailbox_id}`:null;return o.push({event_type:oe.RESPONSE_CREATE,ts:e.created_at,payload:{...i,message_type:"response",content:e.payload,in_reply_to_message_id:a,correlation_status:"legacy-unavailable"}}),o.push({event_type:oe.RESPONSE_ENQUEUE,ts:e.created_at,payload:{...i,message_type:"response",in_reply_to_message_id:a}}),e.delivered_at!==null&&o.push({event_type:oe.RESPONSE_DELIVERED,ts:e.delivered_at,payload:{...i,message_type:"response",receipt:e.receipt}}),{streamId:t,events:o}}return o.push({event_type:oe.CREATE,ts:e.created_at,payload:{...i,message_type:"request",content:e.payload,correlation_status:"legacy-unavailable"}}),o.push({event_type:oe.ENQUEUE,ts:e.created_at,payload:{...i,message_type:"request"}}),e.waited_at!==null&&o.push({event_type:oe.WAIT_REGISTER,ts:e.waited_at,payload:{...i,waited_by:e.waited_by}}),(e.delivering_at!==null||e.delivery_holder_pid!==null)&&o.push({event_type:oe.DELIVER_CLAIM,ts:e.delivering_at??e.created_at,payload:{...i,pid:e.delivery_holder_pid,host:e.delivery_holder_host}}),e.delivered_at!==null&&o.push({event_type:oe.DELIVERED,ts:e.delivered_at,payload:{...i,receipt:e.receipt}}),{streamId:t,events:o}}function QV(e){let t=`inv_${e.id}`,n=Tr(e.target_teamfile,e.target_alias),r={table:"tracked_invocation",id:e.id},s=[{event_type:oe.INVOCATION_START,ts:e.started_at,payload:{invocation_id:t,kind:e.kind,origin:e.origin,launch_source:e.launch_source,from_identity:e.from_identity,target:n,root_teamfile:e.root_teamfile,scope_teamfile:e.scope_teamfile,cwd:e.cwd,command:e.command,request_payload:e.request_payload,started_at:e.started_at,request_message_id:e.team_chat_log_id!==null?`msg_tcl_${e.team_chat_log_id}`:null,holder_pid:e.holder_pid,holder_host:e.holder_host,legacy:r}}];return e.notified_by!==null&&s.push({event_type:oe.INVOCATION_NOTIFY_CLAIM,ts:e.notified_at??e.started_at,payload:{invocation_id:t,notified_by:e.notified_by,notified_at:e.notified_at,legacy:r}}),e.status!=="running"&&s.push({event_type:oe.INVOCATION_FINISH,ts:e.ended_at??e.started_at,payload:{invocation_id:t,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:r}}),{streamId:t,events:s}}function eY(e){let t=YV(e.receiver_teamfile,e.receiver_alias,e.started_at),n=Tr(e.receiver_teamfile,e.receiver_alias),r=Tr(e.sender_teamfile,e.sender_alias);return{streamId:t,events:[{event_type:oe.INFLIGHT_TAKE,ts:e.started_at,payload:{lease_id:t,receiver:n,sender:r,holder_pid:e.holder_pid,holder_host:null,started_at:e.started_at,legacy:{table:"agent_inflight",receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias}}}]}}function tY(e){let t={appended:0,skipped:0},n={team_chat_log:0,agent_mailbox:0,tracked_invocation:0,agent_inflight:0};e.transaction(()=>{for(let i of e.prepare("SELECT * FROM team_chat_log ORDER BY id").all()){let o=t.appended+t.skipped,{streamId:a,events:l}=zV(i);ac(e,a,l,t),n.team_chat_log+=t.appended+t.skipped-o}for(let i of e.prepare("SELECT * FROM agent_mailbox ORDER BY id").all()){let o=t.appended+t.skipped,{streamId:a,events:l}=ZV(i);ac(e,a,l,t),n.agent_mailbox+=t.appended+t.skipped-o}for(let i of e.prepare("SELECT * FROM tracked_invocation ORDER BY id").all()){let o=t.appended+t.skipped,{streamId:a,events:l}=QV(i);ac(e,a,l,t),n.tracked_invocation+=t.appended+t.skipped-o}for(let i of e.prepare("SELECT * FROM agent_inflight ORDER BY receiver_teamfile, receiver_alias").all()){let o=t.appended+t.skipped,{streamId:a,events:l}=eY(i);ac(e,a,l,t),n.agent_inflight+=t.appended+t.skipped-o}zx(e)})();let s=i=>e.prepare(`SELECT count(*) AS n FROM ${i}`).get().n;return{appended:t.appended,skipped:t.skipped,bySource:n,projections:{agent_state:s("agent_state"),message_pending:s("message_pending"),invocation_state:s("invocation_state")}}}function zx(e){e.exec("DELETE FROM agent_state"),e.exec("DELETE FROM message_pending"),e.exec("DELETE FROM invocation_state");let t=e.prepare("SELECT seq, stream_id, event_type, payload FROM message_event ORDER BY seq").all();for(let n of t){let r=JSON.parse(n.payload);nY(e,n.seq,n.stream_id,n.event_type,r)}}function Oe(e,t,n){let r=e[t];return r!=null?r[n]??null:null}function nY(e,t,n,r,s){switch(r){case oe.ENQUEUE:case oe.RESPONSE_ENQUEUE:{let i=r===oe.RESPONSE_ENQUEUE;e.prepare(`INSERT INTO message_pending
|
|
3464
3464
|
(message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
|
|
3465
3465
|
receiver_teamfile, receiver_alias, lifecycle_state, created_seq, last_seq)
|
|
3466
3466
|
VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', ?, ?)
|
|
@@ -3484,7 +3484,7 @@ uncapped data.
|
|
|
3484
3484
|
cwd, command, request_message_id, request_payload, holder_pid, holder_host, status, started_at, last_seq)
|
|
3485
3485
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?)
|
|
3486
3486
|
ON CONFLICT(invocation_id) DO NOTHING`).run(n,s.kind??"chat",s.origin??"unknown",s.launch_source??"",s.from_identity??"",Oe(s,"target","teamfile"),Oe(s,"target","alias"),s.root_teamfile??null,s.cwd??null,s.command??null,s.request_message_id??null,s.request_payload??null,s.holder_pid??null,s.holder_host??null,s.started_at??"",t);break;case oe.INVOCATION_FINISH:e.prepare(`UPDATE invocation_state SET status=?, ended_at=?, result_summary=?, error=?, last_seq=?
|
|
3487
|
-
WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,t,n);break;case oe.INVOCATION_NOTIFY_CLAIM:e.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,t,n);break;default:break}}var oe,Qx=w(()=>{"use strict";zi();oe={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});Qe();ks();
|
|
3487
|
+
WHERE invocation_id=?`).run(s.status??"done",s.ended_at??null,s.result_summary??null,s.error??null,t,n);break;case oe.INVOCATION_NOTIFY_CLAIM:e.prepare("UPDATE invocation_state SET notified_by=?, notified_at=?, last_seq=? WHERE invocation_id=?").run(s.notified_by??null,s.notified_at??null,t,n);break;default:break}}var oe,Qx=w(()=>{"use strict";zi();oe={CREATE:"CREATE",ENQUEUE:"ENQUEUE",DELIVER_CLAIM:"DELIVER_CLAIM",DELIVER_CLAIM_RELEASE:"DELIVER_CLAIM_RELEASE",DELIVERED:"DELIVERED",HANDLED:"HANDLED",WAIT_REGISTER:"WAIT_REGISTER",RESPONSE_CREATE:"RESPONSE_CREATE",RESPONSE_ENQUEUE:"RESPONSE_ENQUEUE",RESPONSE_DELIVERED:"RESPONSE_DELIVERED",INFLIGHT_TAKE:"INFLIGHT_TAKE",INFLIGHT_RELEASE:"INFLIGHT_RELEASE",INFLIGHT_RECLAIM:"INFLIGHT_RECLAIM",TERMINAL_LOCK_TAKE:"TERMINAL_LOCK_TAKE",TERMINAL_LOCK_RELEASE:"TERMINAL_LOCK_RELEASE",TERMINAL_LOCK_EXPIRE:"TERMINAL_LOCK_EXPIRE",INVOCATION_START:"INVOCATION_START",INVOCATION_FINISH:"INVOCATION_FINISH",INVOCATION_NOTIFY_CLAIM:"INVOCATION_NOTIFY_CLAIM"}});Qe();ks();ce();import{pathToFileURL as rY}from"node:url";import{mkdirSync as WA,readFileSync as qA,renameSync as BA,writeFileSync as HA}from"node:fs";import{homedir as XA}from"node:os";import{dirname as JA,join as GA}from"node:path";function t_(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function FA(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function UA(e,t){return!FA(e)||t_(e)?null:`${t} must use https://: ${e}`}async function n_(e,t){let n=UA(e,t.description);if(n!==null||!t_(e))throw new Error(n??`${t.description} must use https://: ${e}`);let r=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw e_(e,t.description,r,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw e_(e,t.description,r,a)}}finally{clearTimeout(i)}}function e_(e,t,n,r){let i=r instanceof Error&&r.name==="AbortError"?`timed out after ${n}ms`:r instanceof Error?r.message:String(r);return new Error(`failed to fetch ${t} ${e}: ${i}`)}ks();var KA="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",VA=60*60*1e3,YA=1500;function zA(){let e=process.env.HOME??XA();return GA(e,".lmctl",".update-check.json")}function ZA(e){return e.isTTY===!0}function QA(e,t){let n=i=>{let o=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(i.trim());if(o===null)return null;let a=o.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},r=n(e),s=n(t);if(r===null||s===null)return 0;for(let i=0;i<3;i+=1){if(r[i]>s[i])return 1;if(r[i]<s[i])return-1}return 0}function pc(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!ZA(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function eR(e,t){try{let n=JSON.parse(qA(e,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&t-n.checkedAt<VA)return n.latest}catch{}return null}function tR(e,t){WA(JA(e),{recursive:!0});let n=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;HA(n,`${JSON.stringify(t)}
|
|
3488
3488
|
`,"utf8"),BA(n,e)}async function nR(){let e=await n_(KA,{description:"lmctl npm metadata",timeoutMs:YA}),t=JSON.parse(e.toString("utf8"));if(typeof t.version!="string"||t.version.trim()==="")throw new Error("registry response missing version");return t.version}async function r_(e,t=[],n={}){try{if(pc(t,e))return;let r=n.now?.()??Date.now(),s=n.cachePath??zA();if(eR(s,r)!==null)return;let o=await(n.fetchLatest??nR)();try{tR(s,{checkedAt:r,latest:o})}catch{return}let a=n.currentVersion?.()??$t();QA(o,a)>0&&e.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
|
|
3489
3489
|
`)}catch{}}var ws=`usage: lmctl [--db PATH] [--debug] <command> [args]
|
|
3490
3490
|
`,Cp=`${ws}
|