@lmctl-ai/lmctl 0.1.318 → 0.1.320

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.
Files changed (2) hide show
  1. package/dist/cli/index.js +139 -139
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -12,7 +12,7 @@ var n0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
12
12
  `)),c=[];for(let u of w0){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(n_(u,d))}return{lmctl_next_version:e,node_version:n,os_info:s,disk_usage:l,env_keys_present:c}}function I0(){return process.env.LMCTL_INTENT_LOG??g0(h0(),".lmctl","recent-intents.log")}async function N0(t){let e=t.intentLog??I0(),n=t.intentLogTailLines??500;try{let s=(await ic(e,"utf8")).split(`
13
13
  `).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-n));return{source_path:e,tail_lines:i.length,tail:ws(i.join(`
14
14
  `)),note:null}}catch(r){return r.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${r instanceof Error?r.message:String(r)}`}}}var Wi,w0,sc,Es=E(()=>{"use strict";Ui();Wi=["serve","db","runs","jobs","attentions","env","intents"];w0=["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"];sc=["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 l_,appendFileSync as A0,mkdirSync as x0,existsSync as I8,readdirSync as N8,unlinkSync as A8}from"node:fs";import{join as Bi,dirname as R0}from"node:path";import{homedir as O0}from"node:os";function oc(){return Bi(O0(),".lmctl")}function c_(){Er=!0,process.env.LMCTL_DEBUG="1"}function d_(){return{cliDebug:Er,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function u_(t){Er=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function ce(){if(Er||process.env.LMCTL_DEBUG==="1")return!0;let t=Date.now();return t-a_>=L0&&(o_=M0(),a_=t),o_}function f_(){return Er||process.env.LMCTL_DEBUG==="1"}function C0(){let t=new Date,e=t.getTimezoneOffset(),n=e<=0?"+":"-",r=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${n}${r}:${s}`)}function De(t,e){if(e?.verbose){if(!Er)return}else if(!e?.always&&!ce())return;try{$0();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,...t};A0(qi,JSON.stringify(n)+`
15
- `)}catch{}}function $0(){if(!qi){let e=C0().slice(0,13).replace("T","-");qi=Bi(oc(),`debug-${e}.log`)}x0(R0(qi),{recursive:!0})}function $e(...t){De({event:"legacy",msg:t.join(" ")})}function Ge(...t){De({event:"legacy",msg:t.join(" ")},{verbose:!0})}function $(t){De(t,{always:!0})}function M0(){return D0()||j0()}function D0(){try{let t=l_(Bi(oc(),"config.toml"),"utf-8");for(let e of t.split(`
15
+ `)}catch{}}function $0(){if(!qi){let e=C0().slice(0,13).replace("T","-");qi=Bi(oc(),`debug-${e}.log`)}x0(R0(qi),{recursive:!0})}function $e(...t){De({event:"legacy",msg:t.join(" ")})}function Ge(...t){De({event:"legacy",msg:t.join(" ")},{verbose:!0})}function M(t){De(t,{always:!0})}function M0(){return D0()||j0()}function D0(){try{let t=l_(Bi(oc(),"config.toml"),"utf-8");for(let e of t.split(`
16
16
  `)){let n=e.trim();if(!n||n.startsWith("#"))continue;if(n.startsWith("["))break;let r=/^debug\s*=\s*(.+)$/.exec(n);if(r){let s=r[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function j0(){try{let t=l_(Bi(oc(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Er,o_,a_,L0,qi,de=E(()=>{"use strict";Er=!1,o_=!1,a_=0,L0=5e3;qi=null});var y_={};oe(y_,{INFRA_CLI_CONTRACT_EXPECTED:()=>nR,INFRA_FLAT_COMMANDS:()=>g_,INFRA_NAMESPACE_COMMAND:()=>lc,infraCliEnabled:()=>Hi,isInfraCommand:()=>Xi,runInfraCommand:()=>sR});function Hi(t=process.env){return t.LMCTL_INFRA_CLI==="1"||t.LMCTL_INFRA_CLI==="true"}function Xi(t){return g_.includes(t)||t===lc}async function sR(t,e,n,r=iR){let s;try{s=await r()}catch{return n.stderr.write(rR),1}if(s.INFRA_CLI_CONTRACT!==1)return n.stderr.write(`lmctl: infra command library contract version ${s.INFRA_CLI_CONTRACT} does not match the version this lmctl build expects (1).
17
17
  `),1;let i=t===lc?e:[t,...e],o=s.createRuntime();return s.dispatch(i,o)}async function iR(){throw new Error("infra CLI adapter target (lmt) is retired; no successor module currently implements this contract")}var nR,g_,lc,rR,cc=E(()=>{"use strict";nR=1,g_=["lmchat","lmmail","lmnote","lmsheet","lmtext","lmsound","login","whoami","exec","tell","peers","site"],lc="auto";rR=`lmctl: infra commands (site/auto/exec/tell/peers/login/whoami/lmchat/lmmail/lmnote/lmsheet/lmtext/lmsound) are not available in this build.
18
18
  `});import{existsSync as oR}from"node:fs";import{createRequire as aR}from"node:module";function lR(){return dc===null&&(dc=aR(import.meta.url)("node:sqlite").DatabaseSync),dc}function uc(t){return t.length===1&&cR(t[0])?[t[0]]:t}function cR(t){if(!pc(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function pc(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var dc,fc,Gn,mc,Ji=E(()=>{"use strict";dc=null;fc=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,n={}){if(n.fileMustExist===!0&&e!==":memory:"&&!oR(e))throw new Error("unable to open database file");this.name=e,this.handle=new(lR())(e,{readOnly:n.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new mc(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,n){let r=`PRAGMA ${e}`;if(e.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(e){return(...n)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...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=e(...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(e){let n=e.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(e.trim())&&(this.transactionDepth=0)}}},Gn=fc,mc=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let n=this.handle.get(...uc(e));return this.normalizeRow(n)}all(...e){return this.handle.all(...uc(e)).map(n=>this.normalizeRow(n))}run(...e){let n=this.handle.run(...uc(e));return{changes:Number(n.changes),lastInsertRowid:Number(n.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&pc(e)?Object.values(e):pc(e)?{...e}:e}}});import{createHash as dR}from"node:crypto";function uR(t,e,n){return dR("sha256").update(`${t}\0${e}\0${n}`).digest("hex")}function qe(t,e,n){let r=uR(e.stream_id,e.intentKey??e.event_type,e.observedLastSeq),s=t.prepare(`INSERT INTO message_event (event_id, ts, stream_id, event_type, payload)
@@ -1089,7 +1089,7 @@ var n0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1089
1089
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'running', ?, ?, ?)`).run(n,e.kind,e.origin,e.launch_source??e.kind,e.from_identity,e.target_teamfile,e.target_alias,e.root_teamfile,e.cwd,e.command,e.team_chat_log_id===null?null:`msg_tcl_${e.team_chat_log_id}`,e.request_payload,e.holder_pid,e.holder_host,e.started_at,e.last_heartbeat_at,i),Ic(e)&&J_(t,i,{invocationId:n,targetTeamfile:e.target_teamfile,targetAlias:e.target_alias??"",holderPid:e.holder_pid,holderHost:e.holder_host,heartbeatAt:s})})}function Qi(t,e){let n=Yn(e.id),r=z_(t,n);return r===null?!1:(qe(t,{stream_id:n,event_type:GR,observedLastSeq:r.last_seq,ts:e.ended_at??e.started_at,payload:{invocation_id:n,status:e.status,ended_at:e.ended_at,exit_code:e.exit_code,signal:e.signal,result_summary:e.result_summary,error:e.error,legacy:{table:"tracked_invocation",id:e.id}}},s=>{if(t.prepare(`UPDATE invocation_state
1090
1090
  SET status = ?, ended_at = ?, result_summary = ?, error = ?, last_seq = ?
1091
1091
  WHERE invocation_id = ? AND last_seq = ?`).run(e.status,e.ended_at,e.result_summary,e.error,s,n,r.last_seq).changes!==1)throw new Error(`invocation_state CAS failed during INVOCATION_FINISH for ${n}`);Ic(e)&&K_(t,s,n)}),!0)}function Q_(t,e,n,r){let s=Yn(e.id),i=z_(t,s);return i===null?!1:(qe(t,{stream_id:s,event_type:KR,observedLastSeq:i.last_seq,ts:r,payload:{invocation_id:s,notified_by:n,notified_at:r,legacy:{table:"tracked_invocation",id:e.id}}},o=>{if(t.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 eh(t,e,n){let r=Yn(e.id);t.prepare("UPDATE invocation_state SET last_heartbeat_at = ? WHERE invocation_id = ?").run(n,r),Ic(e)&&G_(t,r,n)}function th(t,e,n){t.prepare("UPDATE invocation_state SET request_payload = ? WHERE invocation_id = ?").run(n,Yn(e))}function nh(t,e,n){t.prepare("UPDATE invocation_state SET request_message_id = ? WHERE invocation_id = ?").run(n,Yn(e))}var JR,GR,KR,rh=E(()=>{"use strict";Gi();Ns();JR="INVOCATION_START",GR="INVOCATION_FINISH",KR="INVOCATION_NOTIFY_CLAIM"});function Ir(t){return typeof t=="string"&&VR.has(t)}function oh(t){return["Decide the workflow outcome. Reply with a final line:",` STANCE: <one of: ${t.length>0?t.join(" | "):"(this step declares no outcomes \u2014 escalate)"}>`,"If you cannot pick one of those declared outcomes, escalate to a","human instead \u2014 reply with exactly one of:",` STANCE: ${eo[0]}`,` STANCE: ${eo[1]}`,` STANCE: ${eo[2]}`,` STANCE: ${sh}: <one short sentence: why no declared outcome fits>`,"Never invent a different outcome; never leave the STANCE line out."].join(`
1092
- `)}var sh,eo,VR,As,ih,Nc,to,xs=E(()=>{"use strict";sh="other",eo=["not_enough_information","dont_know","other_work"],VR=new Set([sh,...eo]),As="@abort",ih="invalid_decision",Nc="escalation_aborted",to="workflow_escalation"});import{randomUUID as ah}from"node:crypto";import{existsSync as fh,mkdirSync as YR,renameSync as zR,rmdirSync as ZR}from"node:fs";import{hostname as Ac}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function P(){return new Date().toISOString()}function QR(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!fh(t))return e;let n;try{n=new Gn(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function eO(t){if(t===":memory:"||!fh(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{zR(r,`${e}${n}`)}catch{}}return e}function lh(t,e){let n=e instanceof Error?e.message:String(e);try{let r=QR(t),s=eO(t),i=new no(Ts({dbPath:t}));for(let o of r.rootTeams)i.upsertRootTeam(o);for(let{key:o,value:a}of r.config)i.setConfig(o,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${yn} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
1092
+ `)}var sh,eo,VR,As,ih,Nc,to,xs=E(()=>{"use strict";sh="other",eo=["not_enough_information","dont_know","other_work"],VR=new Set([sh,...eo]),As="@abort",ih="invalid_decision",Nc="escalation_aborted",to="workflow_escalation"});import{randomUUID as ah}from"node:crypto";import{existsSync as fh,mkdirSync as YR,renameSync as zR,rmdirSync as ZR}from"node:fs";import{hostname as Ac}from"node:os";function Qe(t){return t.provider_resolved??t.provider}function F(){return new Date().toISOString()}function QR(t){let e={rootTeams:[],config:[]};if(t===":memory:"||!fh(t))return e;let n;try{n=new Gn(t,{readonly:!0})}catch{return e}try{let r=[];try{r=n.prepare("SELECT teamfile_path, name, raw_text, raw_sha256, registered_at, last_seeded_at FROM root_team").all()}catch{}let s=[];try{s=n.prepare("SELECT key, value FROM lmctl_config").all()}catch{}return{rootTeams:r,config:s}}finally{n.close()}}function eO(t){if(t===":memory:"||!fh(t))return null;let e=`${t}.bak-${Date.now()}-${process.pid}`;for(let n of["","-wal","-shm"]){let r=`${t}${n}`;try{zR(r,`${e}${n}`)}catch{}}return e}function lh(t,e){let n=e instanceof Error?e.message:String(e);try{let r=QR(t),s=eO(t),i=new no(Ts({dbPath:t}));for(let o of r.rootTeams)i.upsertRootTeam(o);for(let{key:o,value:a}of r.config)i.setConfig(o,a);return process.stderr.write(`lmctl: couldn't migrate ${t} to schema v${yn} (${n}); started a fresh database instead. Preserved ${r.rootTeams.length} team registration(s) and ${r.config.length} config value(s).`+(s!==null?` Old database backed up at ${s}.
1093
1093
  `:`
1094
1094
  `)),i}catch(r){let s=r instanceof Error?r.message:String(r);throw new Error(`${t}: unusable (${n}), and recovery into a fresh database also failed (${s}). Check that the containing directory is writable, or move the file aside manually and retry.`)}}function ch(t){let e;try{return e=Ts({dbPath:t}),{dal:new no(e)}}catch(n){let r;if(e!==void 0)try{r=e.pragma("user_version",{simple:!0})}catch{}try{e?.close()}catch{}return{cause:n,dbVersion:r}}}function sO(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function iO(t){if(t===":memory:")return!0;try{return YR(`${t}${mh}`),!0}catch{return!1}}function oO(t){if(t!==":memory:")try{ZR(`${t}${mh}`)}catch{}}function Be(t){let e={};for(let n=0;n<tO;n+=1)if(e=ch(t.path),e.dal!==void 0)return e.dal;if(e.dbVersion!==void 0&&e.dbVersion>yn){let n=e.cause instanceof Error?e.cause.message:String(e.cause);throw new Error(`${t.path}: state.db schema is v${e.dbVersion}; this build (understands v${yn}) can no longer operate on it (${n}). Update lmctl: npm install -g @lmctl-ai/lmctl@latest`)}for(let n=0;n<nO;n+=1){if(iO(t.path))try{return lh(t.path,e.cause)}finally{oO(t.path)}sO(rO);let r=ch(t.path);if(r.dal!==void 0)return r.dal}return lh(t.path,e.cause)}function dh(t,e,n){let r=uh(e);if(r.length===0)return;let s=new Set,i=[],o=l=>{if(l===t)return r;let c=n(l);if(c===null)throw new Error(`unknown workflow reference: ${l}`);return uh(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 u of o(l))a(u)}finally{i.pop()}s.add(l)}};a(t)}function uh(t){let e=aO(t),n=e===null?null:lO(e,"states");if(n===null)return[];let r=[];for(let s of Object.values(n))ro(s)&&s.type==="Subflow"&&typeof s.workflow_name=="string"&&s.workflow_name.length>0&&r.push(s.workflow_name);return r}function aO(t){try{let e=JSON.parse(t);return ro(e)?e:null}catch{return null}}function lO(t,e){let n=t[e];return ro(n)?n:null}function ro(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function cO(t){try{let e=JSON.parse(t);return!ro(e)||typeof e.lock_id!="string"||typeof e.holder_pid!="number"||typeof e.holder_host!="string"||typeof e.started_at!="string"||typeof e.last_heartbeat!="string"?null:{lock_id:e.lock_id,holder_pid:e.holder_pid,holder_host:e.holder_host,started_at:e.started_at,last_heartbeat:e.last_heartbeat}}catch{return null}}function dO(t,e){return t===null?!0:t.holder_host===Ac()?!Re(t.holder_pid):t.last_heartbeat<e}function uO(t){return{getRuntimeState:t.prepare("SELECT * FROM runtime_state WHERE scope = ? AND key = ? AND kind = ?"),upsertRuntimeState:t.prepare(`
1095
1095
  INSERT INTO runtime_state (scope, key, kind, data, updated_at)
@@ -1498,11 +1498,11 @@ var n0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1498
1498
  response = NULL
1499
1499
  WHERE id = ?
1500
1500
  AND status = 'running'
1501
- `),...L_(t),...x_(t)}}function fO(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var tO,mh,nO,rO,no,dt=E(()=>{"use strict";Ji();yc();R_();C_();M_();Pt();Ns();rh();xs();tO=3,mh=".recovery.lock",nO=20,rO=50;no=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=uO(e),this.claimTxn=e.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=e.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=e.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,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=o(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,i,a.id)?.count??0)>=Math.max(1,d.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=e.transaction((n,r,s)=>fO("state_not_found")),this.resumeInteractiveTxn=e.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=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==to)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 u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="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!==As&&!a.includes(r))return{resumed:!1,reason:ih};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}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=B_(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}}}close(){this.db.close()}query(e,...n){let r=e.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(e).all(...n)}insertWorkflow(e){dh(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,P()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,P());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){dh(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,P());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,P())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,P());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)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,e),this.syncWorkflowTriggers(e,r.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,P()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,n){return this.stmts.setTriggerCursor.run(n,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(P(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,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:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,P());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let n=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,P());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,P(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);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,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,P());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",P());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);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,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,P());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=P(),r=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).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(e,n){return this.stmts.claimNextIssue.get(n,P(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,P(),e)??null}closeIssue(e,n,r){let s=P(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,P(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);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,P(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=P();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=ah(),s=P();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=P(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,P())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??P(),e.dedupe_key??null,e.concurrency_key??null,P());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=P(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:P();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,P()),s=this.stmts.getRun.get(r.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,n){return this.stmts.setJobRun.run(n,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,P()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,n){return this.stmts.setPromptDispatchCompleted.run(n??P(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,P());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=P(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.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(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.config_json:e.config_json,P(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(P(),e).changes===1}loadMailboxCursor(e,n){return this.stmts.loadMailboxCursor.get(e,n)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return bc(this.db,r,e),Zi(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return bc(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Zi(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{ks(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Sc(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??P(),r=e.holder_host??Ac(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,jt(e.command),n,e.holder_pid??null,r,s,jt(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Z_(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??P();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,jt(n.result_summary),jt(n.error),n.team_chat_log_id??null,jt(n.meta),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Qi(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??P();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,jt(r.result_summary),jt(r.error),r.team_chat_log_id??null,jt(r.meta),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Qi(this.db,o),o})()}heartbeatTrackedInvocation(e,n=P()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return eh(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(th(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(nh(this.db,e,tn(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=P();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,jt(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Qi(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||Zi(this.db,e,{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:P()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.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(e,n,r=P()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Q_(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.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(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.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(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=P()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:H_(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Is(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,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&&Is(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1502
- WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Is(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Is(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(vs,bs(e,n),Ss);return r===void 0?null:$_(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&kc(this.db,r,!0),this.stmts.upsertRuntimeState.run(vs,bs(e.teamfile,e.alias),Ss,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&X_(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,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(vs,bs(e,n),Ss,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(vs,bs(e,n),Ss);return i.changes===1&&kc(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:cO(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=P()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!dO(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:ah(),holder_pid:process.pid,holder_host:Ac(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,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(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,P(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,P())}insertStep(e){let n=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,P());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,P(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??P(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let n=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,P());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(e){let r=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,P()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:r}}insertExternalSignal(e){let n=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,P()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,P());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=P();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).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(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??P());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);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(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),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(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let n=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,P())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,P())}}});import{realpathSync as mO}from"node:fs";import{resolve as pO}from"node:path";function xc(t){let e=pO(t);try{return mO(e)}catch{return e}}var ph=E(()=>{"use strict"});import{platform as _h}from"node:os";function Ut(t){let e=new Rs;for(let n of t)e.registerAdapter(n);return e}var Rs,Rc=E(()=>{"use strict";ph();Rs=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=xc(e.workspace);i=i.filter(a=>xc(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=_h()==="darwin"||_h()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as hh}from"node:fs";import{createInterface as gh}from"node:readline";import{stat as _O}from"node:fs/promises";import{homedir as hO}from"node:os";function yh(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*He(t){let e=hh(t,{encoding:"utf-8"}),n=gh({input:e,crlfDelay:1/0});try{for await(let r of n){let s=r.trim();if(!s)continue;let i=yh(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function Ke(t,e){let n=[],r=hh(t,{encoding:"utf-8"}),s=gh({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=yh(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function Le(t){let e=await _O(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function pe(t){return t.replace(/\\n/g,`
1503
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function G(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Wt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var we,qt=E(()=>{"use strict";we=hO()});import{readdir as so,stat as wh,unlink as gO}from"node:fs/promises";import{join as Nr,basename as Eh}from"node:path";function yO(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function wO(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return pe(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function Th(t){let e=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of He(t))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;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;n+=d+f+m,r+=m,s+=f,i+=p;let h=d+f+m;h&&(o=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function EO(t){let e=TO(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.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 t){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=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function TO(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var io,vh=E(()=>{"use strict";qt();io=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Nr(we,".claude"),this.projectsDir=Nr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await so(this.projectsDir)}catch{return e}for(let r of n){let s=Nr(this.projectsDir,r);if(!(await wh(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await so(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Eh(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Nr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,n){let r=await Ke(e,50),s=await Le(e),i="",o,a,l,c,u,d;for(let m of r)if(!yO(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=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)),u=G(p.trim(),80)}}if(!i)return null;let f=await Th(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,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(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d,f,m=e,p;for await(let _ of He(n))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:wO(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let y=new Date(_.timestamp||0),g=_.message.content;if(typeof g=="string"){if(g.includes("<command-name>")||g.includes("<local-command-"))continue;u||(u=G(g.trim(),80)),d=G(g.trim(),80),p=void 0,s.push({role:"user",timestamp:y,content:pe(g.trim())})}else if(Array.isArray(g)){for(let w of g)if(w.type==="tool_result"){let S=typeof w.content=="string"?pe(w.content):JSON.stringify(w.content);s.push({role:"tool_result",timestamp:y,content:S,toolCallId:w.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.stop_reason===null||_.message.stop_reason==="tool_use"?p="in_progress":typeof _.message.stop_reason=="string"&&(p="complete"),_.message.model&&(l=_.message.model);let y=new Date(_.timestamp||0),g=_.message.content;if(Array.isArray(g))for(let w of g)w.type==="text"&&w.text?s.push({role:"assistant",timestamp:y,content:pe(w.text),model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):w.type==="tool_use"?s.push({role:"tool_use",timestamp:y,content:w.name||"unknown tool",toolName:w.name,toolInput:JSON.stringify(w.input,null,2),toolInputData:w.input,toolCallId:w.id,model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):w.type==="thinking"&&w.thinking&&s.push({role:"thinking",timestamp:y,content:w.thinking})}}if(!i)return null;EO(s);let h=await Th(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:u,lastUserMessage:d,messageCount:h.messageCount,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:h.totalCacheWriteInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await gO(n),!0):!1}async resolveSessionFile(e){let n;try{n=await so(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=Nr(this.projectsDir,o);if(!(await wh(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await so(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Eh(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&r.push({filePath:Nr(a,u),fileSessionId:d})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Ke(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as vO,writeFileSync as Xz,mkdirSync as Jz}from"node:fs";import{join as SO,dirname as Kz}from"node:path";import{homedir as bO}from"node:os";function IO(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function NO(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=IO(t.slice(e+1).trim());return n?{key:n,value:r}:null}function AO(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function oo(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function xO(){return SO(bO(),".lmctl","config.toml")}function bh(t){let e=t??xO(),n;try{n=vO(e,"utf-8")}catch{return{tools:{}}}return RO(n)}function Sh(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function RO(t){let e={},n={},r=t.split(`
1504
- `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let d=e[s.tool]??{};if(s.profile){let f=d.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),d.profiles||(d.profiles={}),d.profiles[s.profile]=f}else i.start&&(d.start=i.start),i.resume&&(d.resume=i.resume),i.agent&&(d.agent=i.agent),i.profile_flag!==void 0&&(d.profile_flag=i.profile_flag);e[s.tool]=d}else if(s.kind==="compact"){let d=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let f=Sh(i.min);f!==null&&(d.min=f)}if(i.max!==void 0){let f=Sh(i.max);f!==null&&(d.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=d):n.global=d}i={}}for(let d of r){let f=d.trim();if(!f||f.startsWith("#"))continue;let m=AO(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let h=".profile.",_=m.indexOf(h);_!==-1?s={kind:"tool",tool:m.slice(5,_),profile:m.slice(_+h.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=NO(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let u=a.site_name;return u!==void 0&&u.length>0&&(c.site_name=u),c}function kh(t){return t.site_name??null}function OO(t,e,n){if(!n)return"";let r=t.tools[e]??Oc[e],s=r?.profiles?.[n]?.flags??Oc[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function Ih(t,e){return!!t.tools[e]}function Nh(t,e,n,r,s){let i=t.tools[e]??Oc[e],o;if(i?.agent){let l=oo(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=kO[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let u=c.map(oo).join(" ");o=`printf '%s\\n' ${oo(r)} | ${u}`}else o=c.map(oo).join(" ")}let a=OO(t,e,s);return a&&(o+=" "+a),o}var Oc,kO,Lc=E(()=>{"use strict";Oc={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:""}}}},kO={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 Ah(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var xh=E(()=>{"use strict"});var LO,_e,ao,ut=E(()=>{"use strict";LO="ACK: waiting for explicit lmctl task.",_e=`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: ${LO}`,ao=`send this exact lmctl seed instruction: "${_e}"`});import{existsSync as CO}from"node:fs";function Rh(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let n=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),r=!n&&!CO(e);if(!n&&!r)return t;$({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function Tn(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function MO(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Os]:e}}function Ve(t,e,n,r="chat"){return{...MO(Tn(t,e),n),[$O]:r}}var Os,$O,St=E(()=>{"use strict";de();Os="LMCTL_SELF_SESSIONID",$O="LMCTL_LAUNCH_SOURCE"});function lo(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Cc=E(()=>{"use strict"});import{spawn as Oh}from"node:child_process";import{mkdirSync as DO}from"node:fs";var $c,be,bt=E(()=>{"use strict";Lc();xh();ut();St();Cc();$c=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},be=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===_e?n:r)}turnOptsFor(e){return e}seed(e,n){return DO(e,{recursive:!0}),new Promise(r=>{let s;try{s=Oh(this.binary,this.seedArgsFor(n),{cwd:e,env:Tn(void 0,e),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}
1505
- `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{if(a===0||a===null)r({success:!0});else{let l=lo(i).trim();r({success:!1,error:l.slice(0,500)||`exit code ${a}`})}}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:ao,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){let r=this.turnOptsFor(n);if(r.userConfig&&Ih(r.userConfig,this.name)){let i=r.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,r,i.agent)}let s=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(s,e,r)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let d={...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,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),o==="external"?new $c("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,n,r){let s=Nh(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=Ah(n.env),c=Oh(s,{shell:!0,cwd:n.cwd,env:Ve(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let _=h.toString();m+=_,n.onDelta?.(_)}),c.stderr?.on("data",h=>{p+=h.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",h=>{if(u)return;u=!0,clearTimeout(f);let _=Date.now()-i;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:_}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function uo(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new rn(t,n,e)}var ft,ke,nn,co,rn,Ar=E(()=>{"use strict";ft=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},ke=class extends ft{},nn=class extends ft{exitCode;signal;stderr;constructor(e,n,r=null,s){super(e),this.exitCode=n,this.signal=r,this.stderr=s}},co=class extends ft{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},rn=class extends ft{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as Dc from"node:child_process";function PO(t){if(typeof Dc.spawnSync=="function")try{Dc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Lh(t){return t.exitCode!==null||t.signalCode!==null}function Mc(t,e){return Lh(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function et(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??PO;if(Lh(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Mc(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Mc(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await Mc(t,jO)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var jO,Ls=E(()=>{"use strict";jO=1e3});function Ch(t){ce()&&De({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function vn(t,e){let n=UO[t];if(n)return n[e]??n.yolo}function qO(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function tt(t,e,n="yolo"){if(WO.has(t)){Ch(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:t==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?vn(t,"plan"):FO[t];if(!r){let s=`unknown provider "${t}" \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:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ke(s)}if(!qO(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw $({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new ke(i)}Ch(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}var FO,UO,WO,zn=E(()=>{"use strict";Ar();de();FO={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},UO={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"]}};WO=new Set(["codex","opencode","kimi","dsh"])});async function KO(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(jc),e),r.unref?.(),n!==void 0&&(s=()=>i(jc),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function fo(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();VO(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function VO(t,e,n,r){let s=t.pollMs??BO,i=t.maxHoldMs??HO,o=t.settleMs??XO,a=t.backgroundGraceMs??JO,l=!1,c=null,u=d=>r({startedMs:n,held:l,reason:d});for(;;){if(e.isAborted())return u("aborted");if(e.hasChildExited())return u("child-exited");let d=i-(Date.now()-n);if(d<=0)return u("max-hold");let f;try{f=await KO(t.hasOutstandingWork(),d,e.signal)}catch{return u("check-error")}if(f===jc)return u(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(f)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let h=a-(Date.now()-n);await new Promise(_=>setTimeout(_,Math.max(0,Math.min(s,GO,h))).unref?.());continue}if(!l||o<=0)return u("cleared");c===null&&(c=Date.now(),Ge(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let p=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-p>=o)return u("cleared")}if(l||(l=!0,t.onHold?.(),Ge(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return $({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),u("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}var BO,HO,XO,JO,GO,jc,Pc=E(()=>{"use strict";de();BO=2e3,HO=8*60*60*1e3,XO=5e3,JO=1e3,GO=50,jc=Symbol("check-timed-out")});function $h(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
1501
+ `),...L_(t),...x_(t)}}function fO(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var tO,mh,nO,rO,no,dt=E(()=>{"use strict";Ji();yc();R_();C_();M_();Pt();Ns();rh();xs();tO=3,mh=".recovery.lock",nO=20,rO=50;no=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=uO(e),this.claimTxn=e.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=e.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=e.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,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:n,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=o(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,i,a.id)?.count??0)>=Math.max(1,d.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=e.transaction((n,r,s)=>fO("state_not_found")),this.resumeInteractiveTxn=e.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=e.transaction((n,r,s)=>{let i=this.stmts.getAttention.get(n);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==to)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 u=JSON.parse(i.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(o=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="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!==As&&!a.includes(r))return{resumed:!1,reason:ih};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}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=B_(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}}}close(){this.db.close()}query(e,...n){let r=e.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(e).all(...n)}insertWorkflow(e){dh(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,F()),r=this.getWorkflow(Number(n.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(r.id,r.version,e.definition,e.author??null,F());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id);let i=this.getWorkflow(r.id);return this.syncWorkflowTriggers(r.id,e.definition),i}upsertWorkflow(e){dh(e.name,e.definition,o=>this.getWorkflowByName(o));let n=this.getWorkflowByName(e.name);if(n===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(n.id)?.version??n.version)+1,i=this.stmts.insertWorkflowVersion.run(n.id,s,e.definition,e.author??null,F());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),e.definition,e.definition_schema_version??n.definition_schema_version,s,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id),this.syncWorkflowTriggers(n.id,e.definition),this.getWorkflow(n.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,F())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,n){return(n===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,n))??null}findWorkflowByName(e,n){return this.getWorkflowByName(e,n)}insertWorkflowVersion(e,n,r){let i=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(e,i,n,r??null,F());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(e,n){let r=this.getWorkflowVersionById(n);if(r===null||r.workflow_id!==e)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,e),this.syncWorkflowTriggers(e,r.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,F()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,n){return this.stmts.setTriggerCursor.run(n,F(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,n){return this.stmts.setTriggerFailure.run(F(),n,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,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:e,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(e){let n=this.stmts.insertTeam.run(e.name,F());return this.stmts.getTeam.get(n.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let n=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,F());return this.stmts.getTeamMember.get(n.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,n){return this.stmts.findTeamMemberByAlias.get(e,n)??null}updateTeamMemberSession(e,n){return this.stmts.updateTeamMemberSession.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,n,r){return this.stmts.setMemberState.run(n,r??null,F(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,n){return this.stmts.setMemberPromptSnapshot.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,n){return this.stmts.setMemberProviderResolved.run(n,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,n){return this.stmts.setMemberRolePrompt.run(n,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,n){let r=this.stmts.getTeamMember.get(e);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,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let n=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,F());return this.stmts.getTeamMemberCompanion.get(n.lastInsertRowid)}insertProject(e){let n=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",F());return this.stmts.getProject.get(n.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,n){return this.stmts.setProjectIntakeConfig.run(n,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,n){let r=this.stmts.getProject.get(e);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,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let n=JSON.parse(e.intake_config);return typeof n=="object"&&n!==null&&!Array.isArray(n)&&n.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let n=e.condition??null,r=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n);if(r!==void 0)return r;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,n,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,F());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,n)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,n={}){return n.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,n){return this.stmts.setProjectWorkflowEnabled.run(n?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let n=F(),r=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,n,n);return this.stmts.getIssue.get(r.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,n={}){return this.stmts.listIssuesForProject.all(e).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(e,n){return this.stmts.claimNextIssue.get(n,F(),e)??null}claimIssue(e,n){return this.stmts.claimIssue.get(n,F(),e)??null}closeIssue(e,n,r){let s=F(),i=this.stmts.closeIssue.get(n,r??null,s,s,e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}reopenIssue(e,n){let r=this.stmts.reopenIssue.get(n,F(),e);if(r===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return r}updateIssue(e,n){let r=this.getIssue(e);if(r===null)throw new Error(`issue not found: ${e}`);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,F(),e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,n){let r=this.stmts.getWebuiSession.get(e);if(r!==void 0)return r;let s=F();return this.stmts.insertWebuiSession.run(e,n,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,n,r,s,i){if(this.stmts.updateWebuiSessionTransition.run(n,r,s,i,F(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,n){if(this.stmts.setWebuiSessionChatbot.run(n,F(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,n){let r=ah(),s=F();return this.stmts.insertChatbotSession.run(r,e,n??null,s,s,"active"),this.stmts.getChatbotSession.get(r)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,n,r,s){let i=F(),o=this.stmts.insertChatbotMessage.run(e,n,r,s??null,i);return this.stmts.touchChatbotSession.run(i,e),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,n){this.stmts.upsertConfig.run(e,n,F())}getConfigAll(){let e=this.stmts.listConfig.all(),n={};for(let r of e)n[r.key]=r.value;return n}enqueueJob(e){let n=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??F(),e.dedupe_key??null,e.concurrency_key??null,F());if(n.changes===1)return this.stmts.getJob.get(n.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let n=F(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,r,n)}claimNextJobWithConcurrency(e){let n=F(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,r,n,e.evaluator)}claimJobByIdWithConcurrency(e){let n=F(),r=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,r,n,e.evaluator)}releaseJob(e,n,r){let s=n==="queued"||n==="running"?null:F();return this.stmts.releaseJob.run(n,r??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,n){return this.stmts.findJobByDedupe.get(e,n)??null}insertRun(e){let n=this.getWorkflow(e.workflow_id);if(n===null)throw new Error(`workflow not found: ${e.workflow_id}`);let r=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,n.active_version_id,e.parent_run_id??null,F()),s=this.stmts.getRun.get(r.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,n){return this.stmts.setJobRun.run(n,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,F()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,n){return this.stmts.setPromptDispatchCompleted.run(n??F(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let n=e.id??"default";this.stmts.ensureWorkspace.run(n,e.name??"Default workspace",e.idleThresholdMs??6e5,F());let r=this.getWorkspace(n);if(r===null)throw new Error(`workspace ${n} missing after upsert`);return r}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let n=F(),r=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.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(e){let n=this.getWebProject(e.id);return n===null||n.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??n.name,e.config_json===void 0?n.config_json:e.config_json,F(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(F(),e).changes===1}loadMailboxCursor(e,n){return this.stmts.loadMailboxCursor.get(e,n)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,n,r){return this.stmts.loadUsage.get(e,n,r)??null}sumUsageForPeriod(e,n){let r=this.stmts.sumUsageForPeriod.get(e,n);return{put:r?.put??0,get:r?.get??0,list:r?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return bc(this.db,r,e),Zi(this.db,r,e),r})()}beginTeamChatLog(e){return this.db.transaction(()=>{let n=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.origin,e.status,e.error_detail,e.truncated,e.created_at),r=Number(n.lastInsertRowid);return bc(this.db,r,e),r})()}finishTeamChatLog(e,n){this.db.transaction(()=>{if(this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e).changes!==1)throw new Error(`team_chat_log row disappeared during finish: ${e}`);Zi(this.db,e,n)})()}setCurrentlyHandlingMessage(e,n,r){this.db.transaction(()=>{ks(this.db,e,n,r)})()}clearCurrentlyHandlingMessage(e,n,r){return this.db.transaction(()=>Sc(this.db,e,n,r))()}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,n=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(n)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}startTrackedInvocation(e){return this.db.transaction(()=>this.startTrackedInvocationInner(e))()}startTrackedInvocationInner(e){let n=e.started_at??F(),r=e.holder_host??Ac(),s=e.last_heartbeat_at??n,i=this.stmts.insertTrackedInvocation.run(e.kind,e.origin,e.scope_teamfile??null,e.from_identity,e.target_teamfile??null,e.target_alias??null,e.root_teamfile??null,e.cwd??null,jt(e.command),n,e.holder_pid??null,r,s,jt(e.meta),e.launch_source??e.kind,e.request_payload??null,e.parent_invocation_id??null),o=this.getTrackedInvocation(Number(i.lastInsertRowid));return Z_(this.db,o),o}getTrackedInvocation(e){return this.stmts.getTrackedInvocation.get(e)??null}listTrackedInvocationsForTarget(e,n,r={}){let s=["target_teamfile = ?","target_alias = ?"],i=[e,n];r.sinceMs!==void 0&&(s.push("started_at >= ?"),i.push(new Date(r.sinceMs).toISOString())),r.untilMs!==void 0&&(s.push("started_at <= ?"),i.push(new Date(r.untilMs).toISOString()));let o=Math.max(1,Math.trunc(r.limit??200));return this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${s.join(" AND ")} ORDER BY started_at DESC LIMIT ?`).all(...i,o)}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}listRecentlyFinishedTrackedInvocations(e){return this.stmts.listRecentlyFinishedTrackedInvocations.all(e)}finishTrackedInvocation(e,n){return this.db.transaction(()=>{let r=n.ended_at??F();if(this.stmts.finishTrackedInvocation.run(n.status,r,n.exit_code??null,n.signal??null,jt(n.result_summary),jt(n.error),n.team_chat_log_id??null,jt(n.meta),r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Qi(this.db,i),i})()}reclaimTrackedInvocationIfUnchanged(e,n,r){return this.db.transaction(()=>{let s=r.ended_at??F();if(this.stmts.reclaimTrackedInvocationIfUnchanged.run(r.status,s,r.exit_code??null,r.signal??null,jt(r.result_summary),jt(r.error),r.team_chat_log_id??null,jt(r.meta),s,e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Qi(this.db,o),o})()}heartbeatTrackedInvocation(e,n=F()){return this.db.transaction(()=>{if(this.stmts.heartbeatTrackedInvocation.run(n,e).changes!==1)return null;let s=this.getTrackedInvocation(e);return eh(this.db,s,n),s})()}updateTrackedInvocationRequestPayload(e,n){return this.db.transaction(()=>this.stmts.updateTrackedInvocationRequestPayload.run(n,e).changes!==1?null:(th(this.db,e,n),this.getTrackedInvocation(e)))()}linkTrackedInvocationMessage(e,n){return this.db.transaction(()=>this.stmts.linkTrackedInvocationChatLog.run(n,e).changes!==1?null:(nh(this.db,e,tn(n)),this.getTrackedInvocation(e)))()}abortTrackedInvocationAndTerminalizeMessage(e,n,r){return this.db.transaction(()=>{let s=F();if(this.stmts.abortTrackedInvocationIfUnchanged.run(s,jt(r),e,n.holder_pid,n.holder_host,n.started_at,n.last_heartbeat_at).changes!==1)return null;let o=this.getTrackedInvocation(e);return Qi(this.db,o),o.team_chat_log_id!==null&&this.terminalizeLinkedChatMessage(o.team_chat_log_id,r),o})()}terminalizeLinkedChatMessage(e,n){let r=this.stmts.getTeamChatLogById.get(e);r===void 0||r.status!=="running"||this.stmts.terminalizeTeamChatLogIfRunning.run("error",n,e).changes!==1||Zi(this.db,e,{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:F()})}listClaimableTerminalTrackedInvocations(e){let n=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(e.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(e,n,r=F()){return this.db.transaction(()=>{if(this.stmts.claimTrackedInvocationNotification.run(n,r,e).changes!==1)return null;let i=this.getTrackedInvocation(e);return Q_(this.db,i,n,r),i})()}listTrackedInvocations(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.scope_teamfile)),e.status!==void 0&&(n.push("status = ?"),r.push(e.status)),e.kind!==void 0&&(n.push("kind = ?"),r.push(e.kind)),e.origin!==void 0&&(n.push("origin = ?"),r.push(e.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(e.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(e={}){let n=[],r=[];e.from!==void 0&&(n.push("from_identity = ?"),r.push(e.from)),e.scope_teamfile!==void 0&&(n.push("scope_teamfile = ?"),r.push(e.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(e={}){return this.listTrackedInvocations({...e,status:"running"})}updateTeamChatLogResponse(e,n){this.stmts.updateTeamChatLogResponse.run(n.response,n.status,n.error_detail,n.truncated,e)}getAgentInflight(e,n){return this.stmts.getAgentInflight.get(e,n)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,n){return this.tryAcquireAgentInflightTxn(e,n)}heartbeatAgentInflight(e,n,r=F()){return this.db.transaction(()=>{let s=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);return s===null||s.sender_teamfile!==e.sender_teamfile||s.sender_alias!==e.sender_alias||s.started_at!==e.started_at?!1:H_(this.db,s,n,r)})()}clearAgentInflight(e,n){this.db.transaction(()=>{let s=this.getAgentInflight(e,n);if(s===null)return;this.stmts.clearAgentInflight.run(e,n).changes===1&&Is(this.db,s,"INFLIGHT_RECLAIM","stale")})()}clearObservedTerminalAgentInflight(e,n,r){return this.db.transaction(()=>{let i=this.getAgentInflight(e,n),o=this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:e,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&&Is(this.db,i,"INFLIGHT_RELEASE"),o.changes===1})()}releaseAgentInflight(e,n){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(n!==void 0&&this.db.prepare(`SELECT lease_id FROM agent_state
1502
+ WHERE receiver_teamfile = ? AND receiver_alias = ?`).get(e.receiver_teamfile,e.receiver_alias)?.lease_id!==n)return this.db.exec("COMMIT"),!1;if(r.active_count<=1){let i=this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return i.changes===1&&Is(this.db,r,"INFLIGHT_RELEASE"),this.db.exec("COMMIT"),i.changes===1}let s=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),s.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.db.transaction(()=>{let r=this.listAgentInflight().filter(i=>i.started_at<e),s=0;for(let i of r)this.stmts.clearAgentInflight.run(i.receiver_teamfile,i.receiver_alias).changes===1&&(Is(this.db,i,"INFLIGHT_RECLAIM","stale"),s+=1);return s})()}getTerminalLock(e,n){let r=this.stmts.getRuntimeState.get(vs,bs(e,n),Ss);return r===void 0?null:$_(r.data)}setTerminalLock(e){this.db.transaction(()=>{let r=this.getTerminalLock(e.teamfile,e.alias);r!==null&&r.lock_id!==e.lock_id&&kc(this.db,r,!0),this.stmts.upsertRuntimeState.run(vs,bs(e.teamfile,e.alias),Ss,JSON.stringify(e),e.last_heartbeat),r?.lock_id!==e.lock_id&&X_(this.db,e)})()}heartbeatTerminalLock(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(e,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(vs,bs(e,n),Ss,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(e,n,r){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(e,n);if(s===null||s.lock_id!==r)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(vs,bs(e,n),Ss);return i.changes===1&&kc(this.db,s),this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(e,n,r){let s=this.stmts.getRuntimeState.get(e,n,r);return s===void 0?null:cO(s.data)}tryAcquireRuntimeProcessLock(e,n,r,s,i=F()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(e,n,r);if(o!==null&&!dO(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:ah(),holder_pid:process.pid,holder_host:Ac(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(e,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(e,n,r,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(e,n,r);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(e,n,r);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,n){return this.stmts.setRunCurrentState.run(n,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,n,r){return this.stmts.setRunPausedState.run(n,r,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,n){return this.stmts.setRunPendingEscalationDecision.run(n,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,n){return this.stmts.setRunTerminalState.run(n,F(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,n){return this.resumeRunTxn(e,n,F())}insertStep(e){let n=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,F());return this.stmts.getStep.get(n.lastInsertRowid)}finishStep(e,n,r){return this.stmts.finishStep.run(n??null,r??null,F(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let n=this.stmts.listLatestStepOutcomesByState.all(e),r={};for(let s of n)r[s.state_name]=s.outcome;return r}insertSubmittedPr(e){let n=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??F(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(n.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let n=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,F());return this.stmts.getStepArtifact.get(n.lastInsertRowid)}insertExternalObject(e){let r=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,F()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:r}}insertExternalSignal(e){let n=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,F()),r=n.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(n.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:r}}raiseAttention(e){let n=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,F());return this.stmts.getAttention.get(n.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(F(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let n=F();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,n,n),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,n){return this.stmts.getDurableMemoryByName.get(e,n)??null}deleteDurableMemory(e,n){return this.stmts.deleteDurableMemory.run(e,n).changes>0}listDurableMemory(e,n){return n!==void 0?this.stmts.listDurableMemoryByType.all(e,n):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,n){return n!==void 0&&n.length>0?this.stmts.listDurableMemory.all(e).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(e).map(({name:r,description:s,type:i,updated_at:o})=>({name:r,description:s,type:i,updated_at:o}))}recordSessionSize(e){let n=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??F());return this.stmts.getSessionSize.get(n.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,n,r=20){return this.stmts.sessionSizeHistory.all(e,n,r)}insertSessionEvent(e){let n=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(n.lastInsertRowid)}listSessionEvents(e,n){return n!==void 0?this.stmts.listSessionEventsSince.all(e,n):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,n=1e3){return this.stmts.listAllEventsSince.all(e,n)}latestAgentCall(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);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(e){let n=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),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(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let n=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(n.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,n,r){return this.stmts.findUnackedDrift.get(e,n??null,r)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let n=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,n,n),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,n){return this.stmts.getInteractiveSessionByRunAndState.get(e,n)??null}setInteractiveAgentOutput(e,n,r){this.stmts.setInteractiveAgentOutput.run(n,r,Date.now(),e)}resumeInteractive(e,n,r){return this.resumeInteractiveTxn(e,n,r,F())}resumeEscalation(e,n){return this.resumeEscalationTxn(e,n,F())}}});import{realpathSync as mO}from"node:fs";import{resolve as pO}from"node:path";function xc(t){let e=pO(t);try{return mO(e)}catch{return e}}var ph=E(()=>{"use strict"});import{platform as _h}from"node:os";function Ut(t){let e=new Rs;for(let n of t)e.registerAdapter(n);return e}var Rs,Rc=E(()=>{"use strict";ph();Rs=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let n=[],r=e?.provider?this.providers.filter(o=>o.name===e.provider):this.providers,s=await Promise.all(r.map(o=>o.discoverSessions()));for(let o of s)n.push(...o);let i=n;if(e?.workspace){let o=xc(e.workspace);i=i.filter(a=>xc(a.cwd)===o)}if(e?.from){let o=e.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(e?.to){let o=e.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),e?.limit&&(i=i.slice(0,e.limit)),i}async getSession(e,n){let r=n?this.providers.filter(s=>s.name===n):this.providers;for(let s of r){let i=await s.loadSession(e);if(i)return i}return null}async resolveSession(e,n){let r=await this.resolveSessions(e,n);return r.length===1?r[0]:null}async resolveSessions(e,n){let r=n?this.providers.filter(i=>i.name===n):this.providers,s=[];for(let i of r){let o=await i.resolveSessionPath(e);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let e=_h()==="darwin"||_h()==="win32",n=[];for(let r of this.providers)if(typeof r.getWatchPaths=="function")for(let s of r.getWatchPaths())n.push({provider:r.name,directory:s.directory,recursive:e,filePattern:s.filePattern});return n}async deleteSession(e,n){let r=await this.resolveSession(e,n);return r?r.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:n=>e.load(n),resolveSessionPath:n=>e.resolvePath(n),deleteSession:n=>e.delete(n),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as hh}from"node:fs";import{createInterface as gh}from"node:readline";import{stat as _O}from"node:fs/promises";import{homedir as hO}from"node:os";function yh(t){try{let e=JSON.parse(t);return e===null||typeof e!="object"||Array.isArray(e)?void 0:e}catch{return}}async function*He(t){let e=hh(t,{encoding:"utf-8"}),n=gh({input:e,crlfDelay:1/0});try{for await(let r of n){let s=r.trim();if(!s)continue;let i=yh(s);i!==void 0&&(yield i)}}finally{e.destroy()}}async function Ke(t,e){let n=[],r=hh(t,{encoding:"utf-8"}),s=gh({input:r,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(!o)continue;let a=yh(o);if(a!==void 0&&n.push(a),n.length>=e)break}}finally{s.close(),r.destroy()}return n}async function Le(t){let e=await _O(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function pe(t){return t.replace(/\\n/g,`
1503
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function K(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}function Wt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:void 0}var we,qt=E(()=>{"use strict";we=hO()});import{readdir as so,stat as wh,unlink as gO}from"node:fs/promises";import{join as Nr,basename as Eh}from"node:path";function yO(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function wO(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return pe(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function Th(t){let e=0,n=0,r=0,s=0,i=0,o=0,a;for await(let l of He(t))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;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;n+=d+f+m,r+=m,s+=f,i+=p;let h=d+f+m;h&&(o=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:n,totalCacheReadInputTokens:r,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}function EO(t){let e=TO(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.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 t){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=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function TO(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var io,vh=E(()=>{"use strict";qt();io=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Nr(we,".claude"),this.projectsDir=Nr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await so(this.projectsDir)}catch{return e}for(let r of n){let s=Nr(this.projectsDir,r);if(!(await wh(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await so(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Eh(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Nr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,n){let r=await Ke(e,50),s=await Le(e),i="",o,a,l,c,u,d;for(let m of r)if(!yO(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=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=K(p.trim(),80)),u=K(p.trim(),80)}}if(!i)return null;let f=await Th(e);return{provider:"claude",sessionId:n,slug:o,cwd:i,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,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(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d,f,m=e,p;for await(let _ of He(n))if(_.type!=="file-history-snapshot"&&!_.isSidechain){if(!i&&_.cwd&&(i=_.cwd),!o&&_.slug&&(o=_.slug),!a&&_.version&&(a=_.version),!c&&_.gitBranch&&(c=_.gitBranch),!f&&_.timestamp&&(f=new Date(_.timestamp)),_.sessionId&&(m=_.sessionId),_.type==="system"||_.type==="progress"||_.type==="queue-operation"){s.push({role:"system",timestamp:new Date(_.timestamp||0),content:wO(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let y=new Date(_.timestamp||0),g=_.message.content;if(typeof g=="string"){if(g.includes("<command-name>")||g.includes("<local-command-"))continue;u||(u=K(g.trim(),80)),d=K(g.trim(),80),p=void 0,s.push({role:"user",timestamp:y,content:pe(g.trim())})}else if(Array.isArray(g)){for(let w of g)if(w.type==="tool_result"){let v=typeof w.content=="string"?pe(w.content):JSON.stringify(w.content);s.push({role:"tool_result",timestamp:y,content:v,toolCallId:w.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.stop_reason===null||_.message.stop_reason==="tool_use"?p="in_progress":typeof _.message.stop_reason=="string"&&(p="complete"),_.message.model&&(l=_.message.model);let y=new Date(_.timestamp||0),g=_.message.content;if(Array.isArray(g))for(let w of g)w.type==="text"&&w.text?s.push({role:"assistant",timestamp:y,content:pe(w.text),model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):w.type==="tool_use"?s.push({role:"tool_use",timestamp:y,content:w.name||"unknown tool",toolName:w.name,toolInput:JSON.stringify(w.input,null,2),toolInputData:w.input,toolCallId:w.id,model:_.message.model,...typeof _.message.stop_reason=="string"?{stopReason:_.message.stop_reason}:{}}):w.type==="thinking"&&w.thinking&&s.push({role:"thinking",timestamp:y,content:w.thinking})}}if(!i)return null;EO(s);let h=await Th(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:u,lastUserMessage:d,messageCount:h.messageCount,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:h.totalCacheWriteInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await gO(n),!0):!1}async resolveSessionFile(e){let n;try{n=await so(this.projectsDir)}catch{return null}let r=[];for(let o of n){let a=Nr(this.projectsDir,o);if(!(await wh(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await so(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=Eh(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&r.push({filePath:Nr(a,u),fileSessionId:d})}}let s=r.find(o=>o.fileSessionId===e);if(s)return s.filePath;let i=r.filter(o=>o.fileSessionId.startsWith(e));if(i.length===1)return i[0].filePath;for(let o of r){let a=await Ke(o.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return o.filePath}return null}}});import{readFileSync as vO,writeFileSync as Xz,mkdirSync as Jz}from"node:fs";import{join as SO,dirname as Kz}from"node:path";import{homedir as bO}from"node:os";function IO(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t}function NO(t){let e=t.indexOf("=");if(e===-1)return null;let n=t.slice(0,e).trim(),r=IO(t.slice(e+1).trim());return n?{key:n,value:r}:null}function AO(t){let e=t.trim();return e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1).trim():null}function oo(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function xO(){return SO(bO(),".lmctl","config.toml")}function bh(t){let e=t??xO(),n;try{n=vO(e,"utf-8")}catch{return{tools:{}}}return RO(n)}function Sh(t){if(typeof t=="number")return Number.isFinite(t)?t:null;let e=String(t).trim();if(!e)return null;let n=e.match(/^(\d+(?:\.\d+)?)\s*([KkMm]?)$/);if(!n)return null;let r=parseFloat(n[1]);if(!Number.isFinite(r))return null;switch(n[2]){case"K":case"k":return Math.round(r*1e3);case"M":case"m":return Math.round(r*1e6);default:return Math.round(r)}}function RO(t){let e={},n={},r=t.split(`
1504
+ `),s={kind:"none"},i={},o=!1,a={};function l(){if(s.kind==="tool"){let d=e[s.tool]??{};if(s.profile){let f=d.profiles?.[s.profile]??{};i.description&&(f.description=i.description),i.flags!==void 0&&(f.flags=i.flags),d.profiles||(d.profiles={}),d.profiles[s.profile]=f}else i.start&&(d.start=i.start),i.resume&&(d.resume=i.resume),i.agent&&(d.agent=i.agent),i.profile_flag!==void 0&&(d.profile_flag=i.profile_flag);e[s.tool]=d}else if(s.kind==="compact"){let d=s.provider?n.providers?.[s.provider]??{}:n.global??{};if(i.min!==void 0){let f=Sh(i.min);f!==null&&(d.min=f)}if(i.max!==void 0){let f=Sh(i.max);f!==null&&(d.max=f)}s.provider?(n.providers||(n.providers={}),n.providers[s.provider]=d):n.global=d}i={}}for(let d of r){let f=d.trim();if(!f||f.startsWith("#"))continue;let m=AO(f);if(m!==null){if(o=!0,l(),m.startsWith("tool.")){let h=".profile.",_=m.indexOf(h);_!==-1?s={kind:"tool",tool:m.slice(5,_),profile:m.slice(_+h.length)}:s={kind:"tool",tool:m.slice(5),profile:null}}else m==="compact"?s={kind:"compact",provider:null}:m.startsWith("compact.")?s={kind:"compact",provider:m.slice(8)}:s={kind:"none"};continue}let p=NO(f);p&&s.kind!=="none"?i[p.key]=p.value:p&&!o&&(a[p.key]=p.value)}l();let c={tools:e};(n.global||n.providers)&&(c.compact=n);let u=a.site_name;return u!==void 0&&u.length>0&&(c.site_name=u),c}function kh(t){return t.site_name??null}function OO(t,e,n){if(!n)return"";let r=t.tools[e]??Oc[e],s=r?.profiles?.[n]?.flags??Oc[e]?.profiles?.[n]?.flags;if(s!==void 0)return s.trim();if(r?.profile_flag)return r.profile_flag.replace(/\{\{profile\}\}/g,n).trim();throw new Error(`Profile "${n}" is not configured for tool "${e}"`)}function Ih(t,e){return!!t.tools[e]}function Nh(t,e,n,r,s){let i=t.tools[e]??Oc[e],o;if(i?.agent){let l=oo(r);o=i.agent.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,l)}else{let l=kO[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,n).replace(/\{\{prompt\}\}/g,r));if(l.mode==="stdin"){let u=c.map(oo).join(" ");o=`printf '%s\\n' ${oo(r)} | ${u}`}else o=c.map(oo).join(" ")}let a=OO(t,e,s);return a&&(o+=" "+a),o}var Oc,kO,Lc=E(()=>{"use strict";Oc={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:""}}}},kO={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 Ah(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let n=Number(e);return!Number.isFinite(n)||n<=0?6e5:n}var xh=E(()=>{"use strict"});var LO,_e,ao,ut=E(()=>{"use strict";LO="ACK: waiting for explicit lmctl task.",_e=`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: ${LO}`,ao=`send this exact lmctl seed instruction: "${_e}"`});import{existsSync as CO}from"node:fs";function Rh(t){let e=t.CLAUDE_CODE_EXECPATH;if(e===void 0||e.length===0)return t;let n=process.platform!=="win32"&&e.toLowerCase().endsWith(".exe"),r=!n&&!CO(e);if(!n&&!r)return t;M({event:"claude_execpath_sanitized",reason:n?"wrong_platform_exe":"missing_file",value:e,platform:process.platform});let s={...t};return delete s.CLAUDE_CODE_EXECPATH,s}function Tn(t,e){let n={...t??process.env,PWD:e};return delete n.OLDPWD,n}function MO(t,e){return e===void 0||e.length===0?t:{...t??process.env,[Os]:e}}function Ve(t,e,n,r="chat"){return{...MO(Tn(t,e),n),[$O]:r}}var Os,$O,St=E(()=>{"use strict";de();Os="LMCTL_SELF_SESSIONID",$O="LMCTL_LAUNCH_SOURCE"});function lo(t){return t.replace(/\x1b\[[0-9;]*[a-zA-Z]/g,"")}var Cc=E(()=>{"use strict"});import{spawn as Oh}from"node:child_process";import{mkdirSync as DO}from"node:fs";var $c,be,bt=E(()=>{"use strict";Lc();xh();ut();St();Cc();$c=class t extends Error{cancelReason;constructor(e,n){super(e),this.name="TurnAbortError",this.cancelReason=n,Object.setPrototypeOf(this,t.prototype)}},be=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let n=e?.prompt;return n===void 0?this.seedArgs:this.seedArgs.map(r=>r===_e?n:r)}turnOptsFor(e){return e}seed(e,n){return DO(e,{recursive:!0}),new Promise(r=>{let s;try{s=Oh(this.binary,this.seedArgsFor(n),{cwd:e,env:Tn(void 0,e),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}
1505
+ `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{if(a===0||a===null)r({success:!0});else{let l=lo(i).trim();r({success:!1,error:l.slice(0,500)||`exit code ${a}`})}}),s.on("error",a=>{r({success:!1,error:a.message})})})}resumeCommand(e,n){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:ao,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,n){let r=this.turnOptsFor(n);if(r.userConfig&&Ih(r.userConfig,this.name)){let i=r.userConfig.tools[this.name];if(i?.agent)return this.runOneShotAgent(e,r,i.agent)}let s=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return s<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(s,e,r)}withTimeouts(e,n,r){let s=new AbortController,i,o,a="",l,c=()=>{e<=0||(clearTimeout(i),i=setTimeout(()=>{r.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:r.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(i)};r.signal&&(r.signal.aborted?(o="external",s.abort()):r.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let d={...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,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),o==="external"?new $c("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,n,r){let s=Nh(n.userConfig,this.name,n.sessionId,e,n.profile),i=Date.now();return new Promise((o,a)=>{let l=Ah(n.env),c=Oh(s,{shell:!0,cwd:n.cwd,env:Ve(n.env,n.cwd,n.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let _=h.toString();m+=_,n.onDelta?.(_)}),c.stderr?.on("data",h=>{p+=h.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",h=>{if(u)return;u=!0,clearTimeout(f);let _=Date.now()-i;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:n.sessionId,durationMs:_}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function uo(t,e){let n;if(e&&typeof e=="object"){let r=e.code;typeof r=="number"&&(n=r)}return new rn(t,n,e)}var ft,ke,nn,co,rn,Ar=E(()=>{"use strict";ft=class extends Error{constructor(e,n){super(e,n),this.name=this.constructor.name}},ke=class extends ft{},nn=class extends ft{exitCode;signal;stderr;constructor(e,n,r=null,s){super(e),this.exitCode=n,this.signal=r,this.stderr=s}},co=class extends ft{line;constructor(e,n,r){super(e,{cause:r}),this.line=n}},rn=class extends ft{rpcCode;rpcData;constructor(e,n,r){super(e),n!==void 0&&(this.rpcCode=n),r!==void 0&&(this.rpcData=r)}}});import*as Dc from"node:child_process";function PO(t){if(typeof Dc.spawnSync=="function")try{Dc.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function Lh(t){return t.exitCode!==null||t.signalCode!==null}function Mc(t,e){return Lh(t)?Promise.resolve(!0):new Promise(n=>{let r=!1,s=()=>{r||(r=!0,clearTimeout(i),n(!0))},i=setTimeout(()=>{r||(r=!0,t.removeListener("exit",s),n(!1))},e);t.once("exit",s)})}async function et(t,e={}){let n=Date.now(),r=e.stdinEnd!==!1,s=e.softDelayMs??5e3,i=e.killDelayMs??5e3,o=e.platform??process.platform,a=e.runTaskkill??PO;if(Lh(t))return{signal:"natural",elapsedMs:Date.now()-n};if(r&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await Mc(t,s))return{signal:"stdin",elapsedMs:Date.now()-n};if(o==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await Mc(t,i))return{signal:"SIGTERM",elapsedMs:Date.now()-n};if(o!=="win32")try{t.kill("SIGKILL")}catch{}return await Mc(t,jO)?{signal:"SIGKILL",elapsedMs:Date.now()-n}:{signal:"abandoned",elapsedMs:Date.now()-n}}var jO,Ls=E(()=>{"use strict";jO=1e3});function Ch(t){ce()&&De({event:"legacy",msg:`[debug] ${t}`},{always:!0})}function vn(t,e){let n=UO[t];if(n)return n[e]??n.yolo}function qO(t,e){if(e.length===0)return!0;for(let n=0;n+e.length<=t.length;n++){let r=!0;for(let s=0;s<e.length;s++)if(t[n+s]!==e[s]){r=!1;break}if(r)return!0}return!1}function tt(t,e,n="yolo"){if(WO.has(t)){Ch(`YOLO ${t} [mode=${n}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${n==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":t==="kimi"?`ACP session/set_config_option (configId=mode, value=${n==="plan"?"plan":"auto"})`:t==="dsh"?"DSH_PERMISSION_MODE=danger-full-access env var on the sidecar spawn \u2014 no argv flag":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let r=n==="plan"?vn(t,"plan"):FO[t];if(!r){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw M({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ke(s)}if(!qO(e,r)){let s=r.join(" "),i=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(o=>JSON.stringify(o)).join(", ")}]`;throw M({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:n,args:e.join(" "),message:i}),new ke(i)}Ch(`YOLO ${t} [mode=${n}]: argv flag '${r.join(" ")}'`)}var FO,UO,WO,zn=E(()=>{"use strict";Ar();de();FO={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},UO={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"]}};WO=new Set(["codex","opencode","kimi","dsh"])});async function KO(t,e,n){if(typeof t=="boolean")return t;let r,s;try{return await Promise.race([t,new Promise(i=>{r=setTimeout(()=>i(jc),e),r.unref?.(),n!==void 0&&(s=()=>i(jc),n.addEventListener("abort",s,{once:!0}))})])}finally{r!==void 0&&clearTimeout(r),s!==void 0&&n?.removeEventListener("abort",s)}}function fo(t,e){if(t===void 0){e.closeStdin();return}let n=!1,r=i=>{if(!n){n=!0;try{t.onRelease?.({elapsedMs:Date.now()-i.startedMs,held:i.held,reason:i.reason})}catch{}}e.closeStdin()},s=Date.now();VO(t,e,s,r).catch(()=>{r({startedMs:s,held:!1,reason:"check-error"})})}async function VO(t,e,n,r){let s=t.pollMs??BO,i=t.maxHoldMs??HO,o=t.settleMs??XO,a=t.backgroundGraceMs??JO,l=!1,c=null,u=d=>r({startedMs:n,held:l,reason:d});for(;;){if(e.isAborted())return u("aborted");if(e.hasChildExited())return u("child-exited");let d=i-(Date.now()-n);if(d<=0)return u("max-hold");let f;try{f=await KO(t.hasOutstandingWork(),d,e.signal)}catch{return u("check-error")}if(f===jc)return u(e.isAborted()||e.signal?.aborted===!0?"aborted":"max-hold");if(f)c=null;else{if(!l&&e.wasBackgroundJobLaunched?.()===!0&&Date.now()-n<a){let h=a-(Date.now()-n);await new Promise(_=>setTimeout(_,Math.max(0,Math.min(s,GO,h))).unref?.());continue}if(!l||o<=0)return u("cleared");c===null&&(c=Date.now(),Ge(`${e.label}: dispatched work cleared \u2014 settling ${o}ms before closing stdin`));let p=Math.max(c,e.lastEventAtMs());if(!e.isTurnInFlight()&&Date.now()-p>=o)return u("cleared")}if(l||(l=!0,t.onHold?.(),Ge(`${e.label}: deferring stdin close \u2014 outstanding dispatched work (poll ${s}ms)`)),Date.now()-n>=i)return M({event:"transport_hold_open_max_wait",provider:e.label,elapsed_ms:Date.now()-n}),u("max-hold");let m=Math.max(0,Math.min(s,i-(Date.now()-n)));await new Promise(p=>setTimeout(p,m).unref?.())}}var BO,HO,XO,JO,GO,jc,Pc=E(()=>{"use strict";de();BO=2e3,HO=8*60*60*1e3,XO=5e3,JO=1e3,GO=50,jc=Symbol("check-timed-out")});function $h(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let n=0;n<t.length;n++)n===0?e.push(t[n]):e.push(`
1506
1506
 
1507
1507
  --- additional response (turn ${n+1} of ${t.length}; likely an injected mid-call notification) ---
1508
1508
 
@@ -1510,18 +1510,18 @@ var n0=Object.defineProperty;var E=(t,e)=>()=>(t&&(e=t(t=0)),e);var oe=(t,e)=>{f
1510
1510
  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 e?`Original provider error:
1511
1511
  ${e}
1512
1512
 
1513
- ${n}`:n}function Dh(t,e){return new Promise((n,r)=>{let s=e.tool||"claude",i=e.binaryPath||ZO[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=vn(s,a)??eL[s]??["--dangerously-skip-permissions"];o.push(...l);try{tt(s,o,a)}catch(v){return r(v)}if(e.cwd&&!zO(e.cwd))return $({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),r(new ke(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Ve(e.env,e.cwd,e.sessionId),u=YO(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:s==="claude"?Rh(c):c});u.stdin?.on("error",v=>{Ge(`stream-json: stdin pipe error, ignored (exit handler reports): ${v.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,$({event:"transport_abort",provider:s,phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,$({event:"transport_abort",provider:s}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f="",m=!1,p=!1,h=0,_=!1,y=Fc({onEvent:v=>{h=Date.now(),_=v.type!=="result",e.onEvent?.(v)},onText:e.onText});function g(){p||(p=!0,fo(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>m,isTurnInFlight:()=>_,lastEventAtMs:()=>h,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function w(v){let M=y.sawResult();y.processLine(v),!M&&y.sawResult()&&g()}u.stdout?.on("data",v=>{f+=v.toString();let M=f.split(`
1514
- `);f=M.pop()||"";for(let D of M)w(D)});let S="";u.stderr?.on("data",v=>{S+=v.toString()}),u.on("error",v=>{$({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:v.message}),r(new ke(`Failed to spawn ${i}: ${v.message}`,{cause:v}))}),u.on("exit",v=>{if(m=!0,d)return;f.trim()&&w(f);let M=y.finalize();M?(Ge(`stream-json: result ${M.result.slice(0,80)}${M.result.length>80?"...":""} (${M.durationMs}ms)`),n({...M,exitCode:v})):($({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:S.slice(0,500)}),r(new Error(QO({tool:s,exitCode:v,stderr:S}))))});let I=JSON.stringify({type:"user",message:{role:"user",content:t}});u.stdin?.write(I+`
1513
+ ${n}`:n}function Dh(t,e){return new Promise((n,r)=>{let s=e.tool||"claude",i=e.binaryPath||ZO[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),e.sessionId&&o.push("--resume",e.sessionId),e.model&&o.push("--model",e.model);let a=e.permissionMode??"yolo",l=vn(s,a)??eL[s]??["--dangerously-skip-permissions"];o.push(...l);try{tt(s,o,a)}catch(S){return r(S)}if(e.cwd&&!zO(e.cwd))return M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),r(new ke(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Ve(e.env,e.cwd,e.sessionId),u=YO(i,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:s==="claude"?Rh(c):c});u.stdin?.on("error",S=>{Ge(`stream-json: stdin pipe error, ignored (exit handler reports): ${S.message}`)});let d=!1;if(e.signal){if(e.signal.aborted)return d=!0,M({event:"transport_abort",provider:s,phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,M({event:"transport_abort",provider:s}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f="",m=!1,p=!1,h=0,_=!1,y=Fc({onEvent:S=>{h=Date.now(),_=S.type!=="result",e.onEvent?.(S)},onText:e.onText});function g(){p||(p=!0,fo(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>m,isTurnInFlight:()=>_,lastEventAtMs:()=>h,closeStdin:()=>{u.stdin?.end()},signal:e.signal,label:e.tool||"claude"}))}function w(S){let O=y.sawResult();y.processLine(S),!O&&y.sawResult()&&g()}u.stdout?.on("data",S=>{f+=S.toString();let O=f.split(`
1514
+ `);f=O.pop()||"";for(let P of O)w(P)});let v="";u.stderr?.on("data",S=>{v+=S.toString()}),u.on("error",S=>{M({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:S.message}),r(new ke(`Failed to spawn ${i}: ${S.message}`,{cause:S}))}),u.on("exit",S=>{if(m=!0,d)return;f.trim()&&w(f);let O=y.finalize();O?(Ge(`stream-json: result ${O.result.slice(0,80)}${O.result.length>80?"...":""} (${O.durationMs}ms)`),n({...O,exitCode:S})):(M({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:S,stderr_tail:v.slice(0,500)}),r(new Error(QO({tool:s,exitCode:S,stderr:v}))))});let N=JSON.stringify({type:"user",message:{role:"user",content:t}});u.stdin?.write(N+`
1515
1515
  `),Ge(`stream-json: prompt sent (${t.length} chars)`)})}var ZO,eL,jh=E(()=>{"use strict";Ar();Ls();zn();de();Pc();St();Uc();Uc();ZO={claude:"claude",qwen:"qwen"};eL={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function mo(t={}){return[]}var Wc=E(()=>{"use strict"});function qc(t){return t==="plan"?"read-only":"danger-full-access"}function Ph(t="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:t},capabilities:{experimentalApi:!1}}}function Bc(){return{agentItems:new Map,resultText:""}}function po(t,e,n,r){let s=t.method;if(!s)return!1;let i=t.params;if(s==="turn/started")return e.agentItems.clear(),e.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 e.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?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),n?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(e.resultText+=o,n?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=e.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,u=typeof i?.turnId=="string"?i.turnId:void 0;r({itemId:o.id,threadId:c,turnId:u,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(o.id)}return!0}return!1}return!1}function Hc(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function Fh(t){let e=t.params,n=e?.error,r=typeof n?.message=="string"?n.message:void 0,s=r&&r.length>0?r:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Xc(){return{pendingCodexError:null}}function Jc(t,e){let n=Fh(t);return n.willRetry||(e.pendingCodexError=n.turnError),n}function Gc(t,e){if(e.pendingCodexError){let i=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:i}}let r=t.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 Kc=E(()=>{"use strict"});import{spawn as tL}from"node:child_process";import{createInterface as nL}from"node:readline";import{existsSync as rL,readFileSync as sL}from"node:fs";import{fileURLToPath as iL}from"node:url";function aL(){return Ph(oL)}function Sn(t,e){Ge(`[codex:${t}] ${JSON.stringify(e)}`)}function lL(t){let e=t.stderr.trim().slice(0,500),n=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
1516
1516
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
1517
1517
  ${e}
1518
1518
 
1519
- ${n}`:n}function Uh(t,e){return new Promise((n,r)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?mo():[];i.push(...a),ce()&&$e(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=qc(l);try{tt("codex",i,l)}catch(j){return r(j)}if(e.cwd&&!rL(e.cwd))return $({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),r(new ke(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=tL(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,$({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,$({event:"transport_abort",provider:"codex"}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=nL({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",_="",y=!1,g=!1,w=Date.now(),S=Bc(),I=Xc();function v(j,U={}){return new Promise((A,Y)=>{let J=p++;m.set(J,{resolve:A,reject:Y});let N=JSON.stringify({jsonrpc:"2.0",id:J,method:j,params:U});u.stdin?.write(N+`
1520
- `)})}function M(j,U={}){let A=JSON.stringify({jsonrpc:"2.0",method:j,params:U});u.stdin?.write(A+`
1521
- `)}f.on("line",j=>{let U;try{U=JSON.parse(j)}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,x=typeof N?.message=="string"&&N.message.length>0?N.message:JSON.stringify(U.error);J.reject(uo(`codex app-server error: ${x}`,N))}else J.resolve(U);e.onEvent?.(U);return}let A=U.method;if(!A){e.onEvent?.(U);return}if(A==="thread/started"){let N=U.params?.thread;N?.id&&(h=N.id)}let Y=ce()?J=>{Sn("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(A==="turn/started"){let J=U.params,N=J?.turn;N?.id&&(_=N.id),po(U,S,e.onDelta,Y),ce()&&Sn("turn/started",{params:J??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let J=U.params;J?.item?.type==="agentMessage"&&Sn(A,{params:J??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let J=U.params;ce()&&Sn("agentMessage/delta",{params:J??null})}po(U,S,e.onDelta,Y)}if(A==="turn/completed"){let J=U.params;if(ce())for(let[x,C]of S.agentItems.entries())C.buffer&&Sn("turn/completed/unflushed-item",{itemId:x,phase:C.phase,bufferLen:C.buffer.length});Hc(S),ce()&&Sn("turn/completed",{params:J??null});let N=Gc(U,I);N.shouldReject?(ce()&&Sn("turn/completed/terminal-reject",{message:N.turnError.message}),g=!0,y=!0,u.stdin?.end(),r(N.turnError)):(y=!0,u.stdin?.end())}if(A==="error"){let J=Jc(U,I);if(ce()){let N=U.params,x=N?.error,C=typeof x?.message=="string"?x.message:"(no message)";Sn(J.willRetry?"error/retry":"error/terminal-deferred",{message:C,willRetry:J.willRetry,params:N??null})}}e.onEvent?.(U)});let D="";u.stderr?.on("data",j=>{D+=j.toString()}),u.on("error",j=>{$({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:j.message}),r(new ke(`Failed to spawn codex app-server: ${j.message}`,{cause:j}))}),u.on("exit",j=>{if(!d&&!g){if(y){n({result:S.resultText,threadId:h,turnId:_,durationMs:Date.now()-w,exitCode:j});return}if(I.pendingCodexError){r(I.pendingCodexError);return}$({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:j,stderr_tail:D.slice(0,500)}),r(new Error(lL({exitCode:j,stderr:D})))}}),(async()=>{try{if(await v("initialize",aL()),M("initialized",{}),e.threadId)try{let j=v("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),U=new Promise((A,Y)=>setTimeout(()=>Y(new Error("resume timeout")),3e4));await Promise.race([j,U]),h=e.threadId}catch(j){process.stderr.write(`[codex] thread/resume failed, creating new thread
1522
- `),$({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:j instanceof Error?j.message:String(j)});let A=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;A?.id&&(h=A.id)}else{let U=(await v("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;U?.id&&(h=U.id)}await v("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(j){et(u).catch(()=>{}),r(j instanceof Error?j:new Error(String(j)))}})()})}var oL,Wh=E(()=>{"use strict";de();de();Ar();Ls();zn();Wc();de();St();Kc();Kc();oL=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(sL(iL(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as Hh,mkdirSync as cL,readFileSync as Xh,writeFileSync as qh}from"node:fs";import{join as Cs,resolve as dL}from"node:path";function Jh(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Vc(t,e,n={existsSync:Hh,readFileSync:Xh}){let r=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=dL(e,s.sessiondir??e);for(let o of uL(i)){let a=fL(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Jh(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 uL(t){return[Cs(t,".opencode","opencode.jsonc"),Cs(t,"opencode.jsonc"),Cs(t,"opencode.json")]}function fL(t,e){try{if(!e.existsSync(t))return;let n=e.readFileSync(t,"utf-8"),r=JSON.parse(mL(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function mL(t){let e="",n=!1,r="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(n){e+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1519
+ ${n}`:n}function Uh(t,e){return new Promise((n,r)=>{let s=e.binaryPath||"codex",i=["app-server","--listen","stdio://"];e.model&&i.push("-c",`model=${JSON.stringify(e.model)}`);let o=e.isLead??e.alias?.toLowerCase()==="lead",a=o?mo():[];i.push(...a),ce()&&$e(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:o,injected:a.length>0}));let l=e.permissionMode??"yolo",c=qc(l);try{tt("codex",i,l)}catch(D){return r(D)}if(e.cwd&&!rL(e.cwd))return M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),r(new ke(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let u=tL(s,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.threadId)}),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,M({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),et(u).catch(()=>{}),r(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,M({event:"transport_abort",provider:"codex"}),et(u).catch(()=>{}),r(new Error("Aborted"))},{once:!0})}let f=nL({input:u.stdout}),m=new Map,p=1,h=e.threadId||"",_="",y=!1,g=!1,w=Date.now(),v=Bc(),N=Xc();function S(D,U={}){return new Promise((x,j)=>{let q=p++;m.set(q,{resolve:x,reject:j});let I=JSON.stringify({jsonrpc:"2.0",id:q,method:D,params:U});u.stdin?.write(I+`
1520
+ `)})}function O(D,U={}){let x=JSON.stringify({jsonrpc:"2.0",method:D,params:U});u.stdin?.write(x+`
1521
+ `)}f.on("line",D=>{let U;try{U=JSON.parse(D)}catch{return}if(typeof U.id=="number"&&m.has(U.id)){let q=m.get(U.id);if(m.delete(U.id),U.error){let I=U.error,A=typeof I?.message=="string"&&I.message.length>0?I.message:JSON.stringify(U.error);q.reject(uo(`codex app-server error: ${A}`,I))}else q.resolve(U);e.onEvent?.(U);return}let x=U.method;if(!x){e.onEvent?.(U);return}if(x==="thread/started"){let I=U.params?.thread;I?.id&&(h=I.id)}let j=ce()?q=>{Sn("item.text/buffer-mismatch",{itemId:q.itemId,threadId:q.threadId??null,turnId:q.turnId??null,expectedFromItemText:q.expectedFromItemText,gotFromBuffer:q.gotFromBuffer,expectedLen:q.expectedFromItemText.length,gotLen:q.gotFromBuffer.length})}:void 0;if(x==="turn/started"){let q=U.params,I=q?.turn;I?.id&&(_=I.id),po(U,v,e.onDelta,j),ce()&&Sn("turn/started",{params:q??null})}if(ce()&&(x==="item/started"||x==="item/completed")){let q=U.params;q?.item?.type==="agentMessage"&&Sn(x,{params:q??null})}if(x==="item/started"||x==="item/agentMessage/delta"||x==="item/completed"){if(x==="item/agentMessage/delta"){let q=U.params;ce()&&Sn("agentMessage/delta",{params:q??null})}po(U,v,e.onDelta,j)}if(x==="turn/completed"){let q=U.params;if(ce())for(let[A,$]of v.agentItems.entries())$.buffer&&Sn("turn/completed/unflushed-item",{itemId:A,phase:$.phase,bufferLen:$.buffer.length});Hc(v),ce()&&Sn("turn/completed",{params:q??null});let I=Gc(U,N);I.shouldReject?(ce()&&Sn("turn/completed/terminal-reject",{message:I.turnError.message}),g=!0,y=!0,u.stdin?.end(),r(I.turnError)):(y=!0,u.stdin?.end())}if(x==="error"){let q=Jc(U,N);if(ce()){let I=U.params,A=I?.error,$=typeof A?.message=="string"?A.message:"(no message)";Sn(q.willRetry?"error/retry":"error/terminal-deferred",{message:$,willRetry:q.willRetry,params:I??null})}}e.onEvent?.(U)});let P="";u.stderr?.on("data",D=>{P+=D.toString()}),u.on("error",D=>{M({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),r(new ke(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),u.on("exit",D=>{if(!d&&!g){if(y){n({result:v.resultText,threadId:h,turnId:_,durationMs:Date.now()-w,exitCode:D});return}if(N.pendingCodexError){r(N.pendingCodexError);return}M({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:P.slice(0,500)}),r(new Error(lL({exitCode:D,stderr:P})))}}),(async()=>{try{if(await S("initialize",aL()),O("initialized",{}),e.threadId)try{let D=S("thread/resume",{threadId:e.threadId,sandbox:c,approvalPolicy:"never",...e.model?{model:e.model}:{}}),U=new Promise((x,j)=>setTimeout(()=>j(new Error("resume timeout")),3e4));await Promise.race([D,U]),h=e.threadId}catch(D){process.stderr.write(`[codex] thread/resume failed, creating new thread
1522
+ `),M({event:"codex_thread_resume_fallback",provider:"codex",thread_id:e.threadId,error_message:D instanceof Error?D.message:String(D)});let x=(await S("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;x?.id&&(h=x.id)}else{let U=(await S("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:c,...e.model?{model:e.model}:{}})).result?.thread;U?.id&&(h=U.id)}await S("turn/start",{threadId:h,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(D){et(u).catch(()=>{}),r(D instanceof Error?D:new Error(String(D)))}})()})}var oL,Wh=E(()=>{"use strict";de();de();Ar();Ls();zn();Wc();de();St();Kc();Kc();oL=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(sL(iL(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as Hh,mkdirSync as cL,readFileSync as Xh,writeFileSync as qh}from"node:fs";import{join as Cs,resolve as dL}from"node:path";function Jh(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Vc(t,e,n={existsSync:Hh,readFileSync:Xh}){let r=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=dL(e,s.sessiondir??e);for(let o of uL(i)){let a=fL(o,n);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Jh(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 uL(t){return[Cs(t,".opencode","opencode.jsonc"),Cs(t,"opencode.jsonc"),Cs(t,"opencode.json")]}function fL(t,e){try{if(!e.existsSync(t))return;let n=e.readFileSync(t,"utf-8"),r=JSON.parse(mL(n));return r===null||typeof r!="object"||Array.isArray(r)?void 0:r}catch{return}}function mL(t){let e="",n=!1,r="",s=!1;for(let i=0;i<t.length;i+=1){let o=t[i],a=t[i+1];if(n){e+=o,s?s=!1:o==="\\"?s=!0:o===r&&(n=!1,r="");continue}if(o==='"'||o==="'"){n=!0,r=o,e+=o;continue}if(o==="/"&&a==="/"){for(;i<t.length&&t[i]!==`
1523
1523
  `;)i+=1;i<t.length&&(e+=t[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<t.length&&!(t[i]==="*"&&t[i+1]==="/");)i+=1;i+=1;continue}e+=o}return e.replace(/,\s*([}\]])/g,"$1")}function _o(t,e={}){let n=Cs(t,".opencode"),r=Cs(n,"opencode.json");if(!Hh(r)){cL(n,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return qh(r,o+`
1524
- `,"utf-8"),!0}let s;try{s=JSON.parse(Xh(r,"utf-8"))}catch{return console.log(Bh.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Bh.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),Jh(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&&qh(r,JSON.stringify(s,null,2)+`
1524
+ `,"utf-8"),!0}let s;try{s=JSON.parse(Xh(r,"utf-8"))}catch{return console.log(Bh.yellow(` .opencode/opencode.json at ${r} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(Bh.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),Jh(s.permission)||M({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&&qh(r,JSON.stringify(s,null,2)+`
1525
1525
  `,"utf-8"),i}var Bh,ho=E(()=>{"use strict";de();Bh={yellow:t=>t}});function Vh(t){let e=[...t.matchAll(pL)];if(e.length>0){let n=e[e.length-1],r=(n.index??0)+n[0].length;return Gh(t.slice(r).trimStart())}return Gh(wL(t.replace(_L,"")))}function wL(t){let e=hL.exec(t);if(e===null)return t;let n=t.slice(e[0].length),r=[...n.matchAll(gL)];if(r.length<2)return t;let s=r[0],i=(s.index??0)+s[0].length;return n.slice(i).trimStart()}function Gh(t){let e=[...t.matchAll(yL)];if(e.length===0)return t;let n=e[e.length-1],r=(n.index??0)+n[0].length;return t.slice(r).trimStart()}function xr(t,e=""){let n=t.result;return typeof n?.sessionId=="string"&&n.sessionId.length>0?n.sessionId:e}function Yh(t){let e=t.result;return typeof e?.stopReason=="string"?e.stopReason:""}function Yc(t={}){let e="",n="",r="",s=!1,i=!1,o=()=>({result:t.tool==="gemini"?Vh(n):n,sessionId:e,stopReason:r});return{setSessionId(a){e=a},beginTurn(){n="",r="",s=!1,i=!0},completeTurn(a){return r=Yh(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 u=c.content,d=typeof u?.text=="string"?u.text:"";return d&&i&&(n+=d,t.onDelta?.(d)),!0},finalize(){return s?o():null}}}var Kh,pL,_L,hL,gL,yL,zc=E(()=>{"use strict";Kh="(?:png|jpe?g|webp|heic|pdf)",pL=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Kh}\\s*`,"gi"),_L=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Kh}\\s*`,"i"),hL=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,gL=/^STANCE:\s+\S+\s*$/gim,yL=/\[Thought:\s*true\]\s*/gi});import{spawn as zh}from"node:child_process";import{existsSync as EL}from"node:fs";import{createInterface as TL}from"node:readline";function SL(t){let e=vL.exec(t);return e?e[0]:null}function bL(t){let e=t.stderr.trim().slice(0,500),n=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
1526
1526
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
1527
1527
  ${e}
@@ -1530,32 +1530,32 @@ ${n}`:n}function kL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1530
1530
  `);if(/\bcode:\s*-32601\b/.test(l)&&/Method not found[^]*notifications\/initialized/.test(l)){s=a;continue}}r.push(i)}return r.join(`
1531
1531
  `)}function Zh(t,e){let n=TL({input:t.stdout}),r=new Map,s=(o,a={})=>new Promise((l,c)=>{let u=IL++;r.set(u,{resolve:l,reject:c});let d=JSON.stringify({jsonrpc:"2.0",id:u,method:o,params:a});De({event:"acp_send",direction:"SEND",provider:e.provider,method:o,id:u,params:a}),t.stdin?.write(`${d}
1532
1532
  `)}),i=(o,a={})=>{t.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
1533
- `)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(De({event:"acp_recv",direction:"RECV",provider:e.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)}),e.onEvent?.(a),typeof a.id=="number"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let u=a.error,d=typeof u?.message=="string"&&u.message.length>0?u.message:JSON.stringify(a.error);c.reject(uo(`ACP RPC error: ${d}`,u))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){$({event:"acp_unhandled_request",provider:e.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)`}});De({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
1534
- `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new ke("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function Qc(t){let e;try{e=zh(t.binaryPath??Zc.opencode.binary,Zc.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ve(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=Zh(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(u,d=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!d){s(u);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(u))}},a=u=>{o({status:"unavailable",reason:"spawn",error:u.message},!1)},l=(u,d)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(u)}, signal=${String(d)})`},!1)};e.once("error",a),e.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 u=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),d=xr(u);try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(u){o({status:"unavailable",reason:"handshake",error:u instanceof Error?u.message:String(u)})}})()})}function NL(t){if(t.method!=="session/update")return!1;let n=t.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 Qh(t,e){let n=Zc[e.tool];return n?new Promise((r,s)=>{let i=e.binaryPath||n.binary;if(e.tool==="opencode")try{_o(e.cwd)}catch(v){$({event:"opencode_config_install_failed",cwd:e.cwd,error_message:v instanceof Error?v.message:String(v)})}let o=e.permissionMode??"yolo",a=[...n.args];if(o==="plan")if(e.tool==="gemini"){let v=vn("gemini","plan"),M=vn("gemini","yolo");a=a.filter(D=>!(M??[]).includes(D)),v&&a.push(...v)}else e.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.
1535
- `),$({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{tt(e.tool,a,l)}catch(v){return s(v)}if(e.model&&e.tool==="copilot"&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1536
- `),$({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!EL(e.cwd))return $({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ke(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=zh(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1,f=!1,m=0,p=!1,h=!1;if(e.signal){if(e.signal.aborted)return d=!0,$({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,$({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),et(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let _=e.sessionId||"",y=Yc({tool:e.tool,onDelta:e.onDelta});y.setSessionId(_);let g=Zh(c,{provider:e.tool,onEvent:v=>{m=Date.now(),NL(v)&&(h=!0),e.onEvent?.(v)},onNotification:v=>{m=Date.now(),y.processMessage(v)}}),{sendRpc:w,sendNotification:S}=g,I="";c.stderr?.on("data",v=>{I+=v.toString()}),c.on("error",v=>{g.close(v),$({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:v.message,elapsed_ms:Date.now()-u}),s(new ke(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${v.message}`,{cause:v}))}),c.on("exit",v=>{if(f=!0,g.close(new ke(`ACP process exited with code ${String(v)}`)),d)return;let M=y.finalize();if(M!==null){if(e.tool==="kimi"){let D=SL(M.result);D!==null&&$({event:"kimi_runtime_dead",provider:"kimi",session_id:M.sessionId,matched_text:D})}r({result:M.result,sessionId:M.sessionId,durationMs:Date.now()-u,stopReason:M.stopReason,exitCode:v})}else{let D=kL(e.tool,I);$({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:v,stderr_tail:D.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(bL({tool:e.tool,exitCode:v,stderr:D})))}}),(async()=>{try{if(await w("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),S("notifications/initialized"),e.sessionId)try{let D=await w("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});_=xr(D,e.sessionId),y.setSessionId(_)}catch(D){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${D instanceof Error?D.message:String(D)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1537
- `),$({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:D instanceof Error?D.message:String(D)});let j=await w("session/new",{cwd:e.cwd,mcpServers:[]});_=xr(j),y.setSessionId(_)}else{let D=await w("session/new",{cwd:e.cwd,mcpServers:[]});_=xr(D),y.setSessionId(_)}if(e.tool==="kimi"){let D=o==="plan"?"plan":"auto";try{await w("session/set_config_option",{sessionId:_,configId:"mode",value:D}),Ge(`acp: set_config_option(mode=${D}) ok`)}catch(j){let U=j instanceof Error?j.message:String(j);throw $({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:D,error_message:U}),new Error(`Cannot set Kimi ACP permission mode to ${D}: ${U}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await w("session/set_config_option",{sessionId:_,configId:"model",value:e.model}),Ge(`acp: set_config_option(model=${e.model}) ok`)}catch(D){let j=D instanceof Error?D.message:String(D);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${j}
1538
- `),$({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:j})}if(e.effort&&e.tool==="opencode"){let D="effort";try{await w("session/set_config_option",{sessionId:_,configId:D,value:e.effort}),Ge(`acp: set_config_option(${D}=${e.effort}) ok`)}catch(j){let U=j instanceof Error?j.message:String(j);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${U}
1539
- `),$({event:"acp_config_option_failed",provider:e.tool,config_id:D,value:e.effort,error_message:U})}}y.beginTurn(),p=!0,Ge(`acp: prompt sent (${t.length} chars)`);let v=await w("session/prompt",{sessionId:_,prompt:[{type:"text",text:t}]}),M=y.completeTurn(v);p=!1,Ge(`acp: result received (${M.result.length} chars, stopReason=${M.stopReason})`),fo(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>p,lastEventAtMs:()=>m,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>h})}catch(v){et(c).catch(()=>{}),s(v instanceof Error?v:new Error(String(v)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var vL,Zc,IL,ed=E(()=>{"use strict";de();Ar();Ls();Pc();zn();ho();de();St();zc();zc();vL=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;Zc={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},IL=1});function Te(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function eg(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=AL){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function xL(){let t=new Map;return(e,n)=>{RL(e,eg(t,n))}}function RL(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.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(Te(a,60));let u=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:u});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(Te(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:Te(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,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=Te(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:Te(u),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:Te(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,u,d=i.content;if(typeof d=="string")u=`${d.split(`
1533
+ `)};return n.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(De({event:"acp_recv",direction:"RECV",provider:e.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)}),e.onEvent?.(a),typeof a.id=="number"&&r.has(a.id)){let c=r.get(a.id);if(r.delete(a.id),a.error){let u=a.error,d=typeof u?.message=="string"&&u.message.length>0?u.message:JSON.stringify(a.error);c.reject(uo(`ACP RPC error: ${d}`,u))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){M({event:"acp_unhandled_request",provider:e.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)`}});De({event:"acp_send",direction:"SEND",provider:e.provider,replyTo:a.id,error:"method not found"}),t.stdin?.write(`${c}
1534
+ `);return}e.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new ke("ACP RPC channel closed")){n.close();for(let a of r.values())a.reject(o);r.clear()}}}function Qc(t){let e;try{e=zh(t.binaryPath??Zc.opencode.binary,Zc.opencode.args,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:Ve(t.env,t.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let n=Zh(e,{provider:"opencode"}),r=t.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(u,d=!0)=>{if(!i){if(i=!0,clearTimeout(c),e.removeListener("error",a),e.removeListener("exit",l),n.close(),!d){s(u);return}et(e,{softDelayMs:100,killDelayMs:100}).finally(()=>s(u))}},a=u=>{o({status:"unavailable",reason:"spawn",error:u.message},!1)},l=(u,d)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(u)}, signal=${String(d)})`},!1)};e.once("error",a),e.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 u=await n.sendRpc("session/new",{cwd:t.cwd,mcpServers:[]}),d=xr(u);try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"model",value:t.model})}catch(f){o({status:"rejected",option:"model",value:t.model,error:f instanceof Error?f.message:String(f)});return}if(t.effort!==void 0)try{await n.sendRpc("session/set_config_option",{sessionId:d,configId:"effort",value:t.effort})}catch(f){o({status:"rejected",option:"effort",value:t.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(u){o({status:"unavailable",reason:"handshake",error:u instanceof Error?u.message:String(u)})}})()})}function NL(t){if(t.method!=="session/update")return!1;let n=t.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 Qh(t,e){let n=Zc[e.tool];return n?new Promise((r,s)=>{let i=e.binaryPath||n.binary;if(e.tool==="opencode")try{_o(e.cwd)}catch(S){M({event:"opencode_config_install_failed",cwd:e.cwd,error_message:S instanceof Error?S.message:String(S)})}let o=e.permissionMode??"yolo",a=[...n.args];if(o==="plan")if(e.tool==="gemini"){let S=vn("gemini","plan"),O=vn("gemini","yolo");a=a.filter(P=>!(O??[]).includes(P)),S&&a.push(...S)}else e.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.
1535
+ `),M({event:"acp_plan_mode_unsupported",provider:e.tool,requested_mode:"plan",effective_mode:"yolo"}));e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":o;try{tt(e.tool,a,l)}catch(S){return s(S)}if(e.model&&e.tool==="copilot"&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1536
+ `),M({event:"acp_model_unsupported",provider:e.tool,model:e.model})),e.cwd&&!EL(e.cwd))return M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ke(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=zh(i,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ve(e.env,e.cwd,e.sessionId)}),u=Date.now(),d=!1,f=!1,m=0,p=!1,h=!1;if(e.signal){if(e.signal.aborted)return d=!0,M({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),et(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,M({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),et(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let _=e.sessionId||"",y=Yc({tool:e.tool,onDelta:e.onDelta});y.setSessionId(_);let g=Zh(c,{provider:e.tool,onEvent:S=>{m=Date.now(),NL(S)&&(h=!0),e.onEvent?.(S)},onNotification:S=>{m=Date.now(),y.processMessage(S)}}),{sendRpc:w,sendNotification:v}=g,N="";c.stderr?.on("data",S=>{N+=S.toString()}),c.on("error",S=>{g.close(S),M({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:S.message,elapsed_ms:Date.now()-u}),s(new ke(`Failed to spawn ${n.binary} ${n.args.join(" ")}: ${S.message}`,{cause:S}))}),c.on("exit",S=>{if(f=!0,g.close(new ke(`ACP process exited with code ${String(S)}`)),d)return;let O=y.finalize();if(O!==null){if(e.tool==="kimi"){let P=SL(O.result);P!==null&&M({event:"kimi_runtime_dead",provider:"kimi",session_id:O.sessionId,matched_text:P})}r({result:O.result,sessionId:O.sessionId,durationMs:Date.now()-u,stopReason:O.stopReason,exitCode:S})}else{let P=kL(e.tool,N);M({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:S,stderr_tail:P.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(bL({tool:e.tool,exitCode:S,stderr:P})))}}),(async()=>{try{if(await w("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),v("notifications/initialized"),e.sessionId)try{let P=await w("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]});_=xr(P,e.sessionId),y.setSessionId(_)}catch(P){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${P instanceof Error?P.message:String(P)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
1537
+ `),M({event:"acp_session_resume_fallback",provider:e.tool,session_id:e.sessionId,error_message:P instanceof Error?P.message:String(P)});let D=await w("session/new",{cwd:e.cwd,mcpServers:[]});_=xr(D),y.setSessionId(_)}else{let P=await w("session/new",{cwd:e.cwd,mcpServers:[]});_=xr(P),y.setSessionId(_)}if(e.tool==="kimi"){let P=o==="plan"?"plan":"auto";try{await w("session/set_config_option",{sessionId:_,configId:"mode",value:P}),Ge(`acp: set_config_option(mode=${P}) ok`)}catch(D){let U=D instanceof Error?D.message:String(D);throw M({event:"acp_permission_mode_failed",provider:e.tool,config_id:"mode",value:P,error_message:U}),new Error(`Cannot set Kimi ACP permission mode to ${P}: ${U}`)}}if(e.model&&(e.tool==="opencode"||e.tool==="kimi"))try{await w("session/set_config_option",{sessionId:_,configId:"model",value:e.model}),Ge(`acp: set_config_option(model=${e.model}) ok`)}catch(P){let D=P instanceof Error?P.message:String(P);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${D}
1538
+ `),M({event:"acp_config_option_failed",provider:e.tool,config_id:"model",value:e.model,error_message:D})}if(e.effort&&e.tool==="opencode"){let P="effort";try{await w("session/set_config_option",{sessionId:_,configId:P,value:e.effort}),Ge(`acp: set_config_option(${P}=${e.effort}) ok`)}catch(D){let U=D instanceof Error?D.message:String(D);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${U}
1539
+ `),M({event:"acp_config_option_failed",provider:e.tool,config_id:P,value:e.effort,error_message:U})}}y.beginTurn(),p=!0,Ge(`acp: prompt sent (${t.length} chars)`);let S=await w("session/prompt",{sessionId:_,prompt:[{type:"text",text:t}]}),O=y.completeTurn(S);p=!1,Ge(`acp: result received (${O.result.length} chars, stopReason=${O.stopReason})`),fo(e.holdOpen,{isAborted:()=>d,hasChildExited:()=>f,isTurnInFlight:()=>p,lastEventAtMs:()=>m,closeStdin:()=>{c.stdin?.end()},signal:e.signal,label:e.tool,wasBackgroundJobLaunched:()=>h})}catch(S){et(c).catch(()=>{}),s(S instanceof Error?S:new Error(String(S)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var vL,Zc,IL,ed=E(()=>{"use strict";de();Ar();Ls();Pc();zn();ho();de();St();zc();zc();vL=/runtime\s+\S+\s+does not exist in workspace\s+\S+/;Zc={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]},kimi:{binary:"kimi",args:["acp"]}},IL=1});function Te(t,e=120){let n=t.replace(/\s+/g," ").trim();return n.length>e?n.slice(0,e-1)+"\u2026":n}function eg(t,e){return n=>{if(n.kind==="tool_use"&&typeof n.id=="string"){if(t.size>=AL){let r=t.keys().next().value;r!==void 0&&t.delete(r)}t.set(n.id,Date.now()),e(n);return}if(n.kind==="tool_result"&&typeof n.id=="string"&&n.elapsedMs===void 0){let r=t.get(n.id);if(r!==void 0){e({...n,elapsedMs:Date.now()-r}),t.delete(n.id);return}}e(n)}}function xL(){let t=new Map;return(e,n)=>{RL(e,eg(t,n))}}function RL(t,e){let n=t.type;if(n==="system"){let r=t.subtype;if(r==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,i=typeof t.max_retries=="number"?t.max_retries:void 0,o=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.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(Te(a,60));let u=c.length>0?c.join(", "):r;e({kind:"api_retry",summary:u});return}if(r==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,i=typeof t.error=="string"?t.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(Te(i,80)),e({kind:"other",summary:o.join(": "),raw:t});return}e({kind:"system",summary:r||"system",raw:t});return}if(n==="assistant"||n==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&e({kind:"text",summary:Te(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,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=Te(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:Te(u),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";e({kind:"thinking",summary:Te(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,u,d=i.content;if(typeof d=="string")u=`${d.split(`
1540
1540
  `).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
1541
1541
  `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:i})}else o&&e({kind:"other",summary:o,raw:i})}return}if(n==="result"){e({kind:"system",summary:"result",raw:t});return}}async function go(t,e){let n=e.binary==="qwen"?"qwen":"claude",r=e.onProgress?xL():void 0,s=await Dh(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:n,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function OL(){let t=new Map;return(e,n)=>{LL(e,eg(t,n))}}function LL(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:Te(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:Te(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=Te(JSON.stringify(c))),e({kind:"tool_use",tool:o,summary:Te(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")e({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:"",u=c?`running\u2026 ${Te(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:i})}}async function bn(t,e){let n=e.acpTool||e.binary;e.model&&n==="copilot"&&De({event:"model_ignored",provider:n,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let r=e.onProgress?OL():void 0,s=await Qh(t,{tool:n,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:r?i=>r(i,e.onProgress):void 0,signal:e.signal,holdOpen:e.holdOpen});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function CL(t,e){let n=t.method;if(!n)return;let r=t.params;if(n==="turn/started"){e({kind:"system",summary:"turn started"});return}if(n==="turn/completed"){e({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;e(a?{kind:"api_retry",summary:`codex retry: ${Te(o,120)}`}:{kind:"other",summary:`codex error: ${Te(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)e({kind:"tool_use",tool:"Bash",summary:Te(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({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(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:Te(c||"(edit)"),id:a})}else{let l=s.status||"done";e({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)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(o?{kind:"tool_use",tool:"WebSearch",summary:Te(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&e({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;e(i==="commentary"?{kind:"thinking",summary:Te(s)}:{kind:"text",summary:Te(s)})}return}if(n==="item/reasoning/summaryTextDelta"||n==="item/reasoning/textDelta"){let s=r?.delta||"";s&&e({kind:"thinking",summary:Te(s)});return}if(n==="item/commandExecution/outputDelta"){let s=(typeof r?.delta=="string"?r.delta:"")||"";if(s){let i=s.split(`
1542
1542
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Te(o,60)}`:Te(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({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(`
1543
1543
  `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${Te(o,60)}`:Te(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(n.startsWith("item/")){e({kind:"other",summary:n.slice(5)});return}}async function tg(t,e){let n=await Uh(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?r=>CL(r,e.onProgress):void 0,signal:e.signal});return{text:n.result,sessionId:n.threadId,durationMs:n.durationMs}}var AL,kn=E(()=>{"use strict";jh();Wh();ed();de();AL=256});function nd(t){return new td(t)}var td,rd=E(()=>{"use strict";vh();bt();kn();ut();td=class extends be{constructor(e){super({provider:new io(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",_e,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:go})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as $L,stat as ng,unlink as ML}from"node:fs/promises";import{join as $s,basename as DL}from"node:path";function jL(t,e,n){return`${t}|${e.toISOString()}|${n}`}function Ms(t,e,n){let r=jL(n.role,n.timestamp,n.content);e.has(r)||(e.add(r),t.push(n))}function rg(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function PL(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function Rr(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.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 Rr(n)}).filter(n=>n.length>0).join(`
1544
- `);try{return JSON.stringify(t)}catch{return String(t)}}function FL(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function UL(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.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 sg(t){let e=0,n=0,r=0,s=0,i=0,o,a;for await(let l of He(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}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 u=PL(l.payload.info.last_token_usage);u&&(o=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var yo,ig=E(()=>{"use strict";qt();yo=class{name="codex";codexDirs;constructor(e={}){let n=[$s(we,".codex"),$s(we,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:$s(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=$s(n,"sessions");try{await ng(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],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&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await $L(e)}catch{return n}for(let s of r){let i=$s(e,s),o=await ng(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(e){let n=DL(e,".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(e){let n=await Ke(e,30),r=await Le(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,u,d,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&&(d=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 h=p.payload.message||p.payload.text;h&&(c||(c=G(h.trim(),80)),u=G(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(_=>_.type==="input_text"&&typeof _.text=="string"&&_.text);typeof h?.text=="string"&&(c||(c=G(h.text.trim(),80)),u=G(h.text.trim(),80))}}if(!i)return null;let m=await sg(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:rg(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,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(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d=e,f,m,p=new Set;for await(let _ of He(n)){let y=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(d=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=rg(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let g=_.payload;if(g.type==="message"){if(g.role==="user"&&g.content){for(let w of g.content)if(w.type==="input_text"&&typeof w.text=="string"&&w.text){let S=w.text.trim();c||(c=G(S,80)),u=G(S,80),Ms(s,p,{role:"user",timestamp:y,content:pe(S)})}continue}if(g.role==="assistant"&&g.content){for(let w of g.content)w.type==="output_text"&&typeof w.text=="string"&&w.text&&Ms(s,p,{role:"assistant",timestamp:y,content:pe(w.text),model:a});continue}if(g.role!=="user"&&g.role!=="assistant"&&g.content){for(let w of g.content)(w.type==="input_text"||w.type==="output_text")&&typeof w.text=="string"&&w.text&&Ms(s,p,{role:"system",timestamp:y,content:pe(w.text.trim())});continue}}if(g.type==="function_call"){s.push({role:"tool_use",timestamp:y,content:g.name||"unknown tool",toolName:g.name,toolInput:g.arguments!==void 0?pe(Rr(g.arguments)):void 0,toolInputData:FL(g.arguments),toolCallId:g.call_id});continue}if(g.type==="function_call_output"){s.push({role:"tool_result",timestamp:y,content:pe(Rr(g.output)),toolCallId:g.call_id});continue}if(g.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:y,content:g.name||"unknown tool",toolName:g.name,toolInput:g.input!==void 0?pe(Rr(g.input)):void 0,toolInputData:UL(g.name,g.input),toolCallId:g.call_id});continue}if(g.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:y,content:pe(Rr(g.output)),toolCallId:g.call_id});continue}if(g.type==="reasoning"&&g.summary){let w=g.summary.map(S=>Rr(S.text)).join(`
1544
+ `);try{return JSON.stringify(t)}catch{return String(t)}}function FL(t){let e=t;if(typeof t=="string")try{e=JSON.parse(t)}catch{return}return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}function UL(t,e){if(e===void 0)return;let n={input:e};if(t!=="apply_patch"||typeof e!="string")return n;let r=[...e.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 sg(t){let e=0,n=0,r=0,s=0,i=0,o,a;for await(let l of He(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}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 u=PL(l.payload.info.last_token_usage);u&&(o=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:n,totalCachedInputTokens:r,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var yo,ig=E(()=>{"use strict";qt();yo=class{name="codex";codexDirs;constructor(e={}){let n=[$s(we,".codex"),$s(we,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let r=[e.codexDir||n[0],e.codeDir||n[1]];this.codexDirs=[...new Set(r)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:$s(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let n of this.codexDirs){let r=$s(n,"sessions");try{await ng(r),e.push(r)}catch{}}return e}async discoverSessions(){let e=[],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&&e.push(o)}catch{}}return e}async findSessionFiles(e){let n=[],r;try{r=await $L(e)}catch{return n}for(let s of r){let i=$s(e,s),o=await ng(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(e){let n=DL(e,".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(e){let n=await Ke(e,30),r=await Le(e),s=this.extractSessionIdFromFilename(e),i="",o,a,l,c,u,d,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&&(d=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 h=p.payload.message||p.payload.text;h&&(c||(c=K(h.trim(),80)),u=K(h.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let h=p.payload.content.find(_=>_.type==="input_text"&&typeof _.text=="string"&&_.text);typeof h?.text=="string"&&(c||(c=K(h.text.trim(),80)),u=K(h.text.trim(),80))}}if(!i)return null;let m=await sg(e);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:rg(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,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(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r=await Le(n),s=[],i="",o,a,l,c,u,d=e,f,m,p=new Set;for await(let _ of He(n)){let y=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(d=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=rg(_.payload.originator,_.payload.source);continue}if(_.type==="turn_context"&&_.payload){_.payload.model&&(a=_.payload.model),!i&&_.payload.cwd&&(i=_.payload.cwd);continue}if(_.type==="response_item"&&_.payload){let g=_.payload;if(g.type==="message"){if(g.role==="user"&&g.content){for(let w of g.content)if(w.type==="input_text"&&typeof w.text=="string"&&w.text){let v=w.text.trim();c||(c=K(v,80)),u=K(v,80),Ms(s,p,{role:"user",timestamp:y,content:pe(v)})}continue}if(g.role==="assistant"&&g.content){for(let w of g.content)w.type==="output_text"&&typeof w.text=="string"&&w.text&&Ms(s,p,{role:"assistant",timestamp:y,content:pe(w.text),model:a});continue}if(g.role!=="user"&&g.role!=="assistant"&&g.content){for(let w of g.content)(w.type==="input_text"||w.type==="output_text")&&typeof w.text=="string"&&w.text&&Ms(s,p,{role:"system",timestamp:y,content:pe(w.text.trim())});continue}}if(g.type==="function_call"){s.push({role:"tool_use",timestamp:y,content:g.name||"unknown tool",toolName:g.name,toolInput:g.arguments!==void 0?pe(Rr(g.arguments)):void 0,toolInputData:FL(g.arguments),toolCallId:g.call_id});continue}if(g.type==="function_call_output"){s.push({role:"tool_result",timestamp:y,content:pe(Rr(g.output)),toolCallId:g.call_id});continue}if(g.type==="custom_tool_call"){s.push({role:"tool_use",timestamp:y,content:g.name||"unknown tool",toolName:g.name,toolInput:g.input!==void 0?pe(Rr(g.input)):void 0,toolInputData:UL(g.name,g.input),toolCallId:g.call_id});continue}if(g.type==="custom_tool_call_output"){s.push({role:"tool_result",timestamp:y,content:pe(Rr(g.output)),toolCallId:g.call_id});continue}if(g.type==="reasoning"&&g.summary){let w=g.summary.map(v=>Rr(v.text)).join(`
1545
1545
  `);w.trim()&&Ms(s,p,{role:"thinking",timestamp:y,content:pe(w)});continue}}if(_.type==="event_msg"&&_.payload&&(_.payload.type==="task_started"?m="in_progress":_.payload.type==="task_complete"?m="complete":_.payload.type==="turn_aborted"&&(m="aborted"),_.payload.type==="agent_reasoning")){let g=_.payload.message||_.payload.text;g&&Ms(s,p,{role:"thinking",timestamp:y,content:pe(g)})}}if(!i)return null;let h=await sg(n);return{provider:"codex",sessionId:d,cwd:i,createdAt:l||r.createdAt,modifiedAt:r.modifiedAt,model:a,cliVersion:o,startCommand:f,turnStatus:m,firstUserMessage:c,lastUserMessage:u,messageCount:h.messageCount,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:h.lastTokenUsage,modelContextWindow:h.modelContextWindow,messages:s}}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await ML(n),!0):!1}async resolveSessionFile(e){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)===e)return i;let s=[];for(let i of r)this.extractSessionIdFromFilename(i).startsWith(e)&&s.push(i);if(s.length===1)return s[0];for(let i of r){let o=await Ke(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===e||a&&a.startsWith(e))return i}}return null}}});function id(t){return new sd(t)}var og,sd,od=E(()=>{"use strict";ig();bt();kn();ut();og="gpt-5.6-sol",sd=class extends be{constructor(e){super({provider:new yo(e),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:`${_e}
1546
1546
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:tg})}seedArgsFor(e){let n=super.seedArgsFor(e),r=e?.model??og;return[...n.slice(0,-1),"--model",r,n[n.length-1]]}turnOptsFor(e){return e.model?e:{...e,model:og}}}});function Ds(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);if(e.length>1)try{let r=JSON.parse(e[0]);if(r!==null&&typeof r=="object"&&!Array.isArray(r)&&"kind"in r)return"jsonl"}catch{}let n;try{n=JSON.parse(t)}catch{return"unknown"}if(n!==null&&typeof n=="object"&&!Array.isArray(n)){let r=n;if(Array.isArray(r.messages))return"json";if("kind"in r)return"jsonl"}return"unknown"}function wo(t){let e=Ds(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let n=t.split(`
1547
1547
  `).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 u=c;if(typeof u.id=="string"){let d=o.get(u.id);d?WL(d,u):(i.push(u),o.set(u.id,u))}else i.push(u)}}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 WL(t,e){for(let[n,r]of Object.entries(e))if(r!==void 0){if(n==="tokens"&&ag(t.tokens)&&ag(r)){t.tokens={...t.tokens,...r};continue}t[n]=r}}function ag(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function lg(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:n,...r}=t,s=[JSON.stringify(r)];for(let i of n)s.push(JSON.stringify(i));return s.join(`
1548
1548
  `)+`
1549
- `}var ad=E(()=>{"use strict"});import{createHash as qL}from"node:crypto";import{readdir as js,readFile as cg,stat as Eo,unlink as BL}from"node:fs/promises";import{join as st,basename as HL,dirname as XL}from"node:path";import{cwd as JL}from"node:process";function dg(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function ug(t){return t==="user"}function ld(t){return t==="gemini"||t==="assistant"}function Zn(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function GL(t){return`${t.sessionId}\0${t.cwd}`}function KL(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function To(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function fg(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!ld(a.type)||!a.tokens)continue;let l=To(a.tokens.input),c=To(a.tokens.cached),u=Math.max(l-c,0),d=To(a.tokens.output),f=To(a.tokens.thoughts);e+=l,n+=c,r+=d,s+=f,i=l,o={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function VL(t){return qL("sha256").update(t).digest("hex")}function Ps(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=XL(n);if(r===n)break;n=r}}var vo,mg=E(()=>{"use strict";qt();ad();de();vo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||st(we,".gemini");this.geminiProjectsFile=st(n,"projects.json"),this.geminiTmpDir=st(n,"tmp");let r=e.claudeDir||st(we,".claude");this.claudeProjectsDir=st(r,"projects");let s=[st(we,".codex"),st(we,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>st(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=GL(s),o=n.get(i);n.set(i,o?KL(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Le(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let _ of o){let y=Zn(_.timestamp),g=_.type,w=pe(dg(_.content));if(ug(g)){let I=w.trim();I&&(u||(u=G(I,80)),d=G(I,80)),i.push({role:"user",timestamp:y,content:I||w});continue}if(ld(g)){_.model&&(f=_.model);for(let I of _.thoughts||[]){let v=[I.subject,I.description].filter(Boolean).join(`
1550
- `).trim();v&&i.push({role:"thinking",timestamp:Zn(I.timestamp,y),content:pe(v)})}i.push({role:"assistant",timestamp:y,content:w,model:_.model});continue}let S=g?`[${g}] `:"";i.push({role:"system",timestamp:y,content:`${S}${w}`.trim()})}let m=Zn(r.startTime,s.createdAt),p=Zn(r.lastUpdated,s.modifiedAt),h=fg(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:i.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await Le(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,u,d=0;for(let m of s)if(ug(m.type)){d++;let p=dg(m.content).trim();p&&(l||(l=G(pe(p),80)),c=G(pe(p),80))}else ld(m.type)&&(d++,m.model&&(u=m.model));let f=fg(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Zn(n.startTime,r.createdAt),modifiedAt:Zn(n.lastUpdated,r.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,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(e){let n=await cg(e,"utf-8");if(Ds(n)==="unknown")return $({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.slice(0,120),message:`gemini session file at ${e} 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 wo(n)}catch{return null}}extractSessionIdFromFilename(e){let n=HL(e).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 e=[],n;try{n=await js(this.geminiTmpDir)}catch{return e}for(let r of n){let s=st(this.geminiTmpDir,r,"chats");if(!(await Eo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await js(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(st(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await BL(n),!0):!1}async resolveSessionFile(e){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===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let u=await Le(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:Zn(i?.lastUpdated,u.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(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Ps(e,JL());for(let r of this.extraWorkspacePaths)Ps(e,r);for(let r of await this.collectGeminiProjectPaths())Ps(e,r);for(let r of await this.collectCodexCwds())Ps(e,r);for(let r of await this.collectClaudeCwds())Ps(e,r);let n=new Map;for(let r of e)n.set(VL(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await cg(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Ke(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await js(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=st(this.claudeProjectsDir,r);if(!(await Eo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await js(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=st(s,a),u=(await Ke(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await Eo(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await js(e)}catch{return n}for(let i of s){let o=st(e,i),a=await Eo(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 YL,writeFileSync as zL,mkdirSync as ZL}from"node:fs";import{join as QL,dirname as eC}from"node:path";import{randomUUID as tC}from"node:crypto";function dd(t){return new cd(t)}var cd,ud=E(()=>{"use strict";mg();bt();kn();ut();ad();cd=class extends be{constructor(e){super({provider:new vo(e),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",_e,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(n,r)=>bn(n,{...r,acpTool:"gemini"})})}forkHint(e){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(`
1549
+ `}var ad=E(()=>{"use strict"});import{createHash as qL}from"node:crypto";import{readdir as js,readFile as cg,stat as Eo,unlink as BL}from"node:fs/promises";import{join as st,basename as HL,dirname as XL}from"node:path";import{cwd as JL}from"node:process";function dg(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function ug(t){return t==="user"}function ld(t){return t==="gemini"||t==="assistant"}function Zn(t,e=new Date(0)){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function GL(t){return`${t.sessionId}\0${t.cwd}`}function KL(t,e){let n=t.filePaths??[t.filePath],r=e.filePaths??[e.filePath],s=[...new Set([...n,...r])],i=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...i,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function To(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function fg(t){let e=0,n=0,r=0,s=0,i=0,o;for(let a of t){if(!ld(a.type)||!a.tokens)continue;let l=To(a.tokens.input),c=To(a.tokens.cached),u=Math.max(l-c,0),d=To(a.tokens.output),f=To(a.tokens.thoughts);e+=l,n+=c,r+=d,s+=f,i=l,o={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:n,totalOutputTokens:r,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function VL(t){return qL("sha256").update(t).digest("hex")}function Ps(t,e){let n=e;for(;n&&!t.has(n);){t.add(n);let r=XL(n);if(r===n)break;n=r}}var vo,mg=E(()=>{"use strict";qt();ad();de();vo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let n=e.geminiDir||st(we,".gemini");this.geminiProjectsFile=st(n,"projects.json"),this.geminiTmpDir=st(n,"tmp");let r=e.claudeDir||st(we,".claude");this.claudeProjectsDir=st(r,"projects");let s=[st(we,".codex"),st(we,".code")],i=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>st(o,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),n=new Map;for(let r of e)try{let s=await this.extractSummary(r);if(!s)continue;let i=GL(s),o=n.get(i);n.set(i,o?KL(o,s):s)}catch{}return[...n.values()]}async loadSession(e){let n=await this.resolveSessionFile(e);if(!n)return null;let r;try{r=await this.readSessionFile(n)}catch{return null}if(!r)return null;let s=await Le(n),i=[],o=r.messages||[],a=r.sessionId||this.extractSessionIdFromFilename(n),l=r.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let _ of o){let y=Zn(_.timestamp),g=_.type,w=pe(dg(_.content));if(ug(g)){let N=w.trim();N&&(u||(u=K(N,80)),d=K(N,80)),i.push({role:"user",timestamp:y,content:N||w});continue}if(ld(g)){_.model&&(f=_.model);for(let N of _.thoughts||[]){let S=[N.subject,N.description].filter(Boolean).join(`
1550
+ `).trim();S&&i.push({role:"thinking",timestamp:Zn(N.timestamp,y),content:pe(S)})}i.push({role:"assistant",timestamp:y,content:w,model:_.model});continue}let v=g?`[${g}] `:"";i.push({role:"system",timestamp:y,content:`${v}${w}`.trim()})}let m=Zn(r.startTime,s.createdAt),p=Zn(r.lastUpdated,s.modifiedAt),h=fg(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:i.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:n,totalInputTokens:h.totalInputTokens||void 0,totalCachedInputTokens:h.totalCachedInputTokens||void 0,totalOutputTokens:h.totalOutputTokens||void 0,totalReasoningOutputTokens:h.totalReasoningOutputTokens||void 0,lastInputTokens:h.lastInputTokens||void 0,lastTokenUsage:h.lastTokenUsage,messages:i}}async extractSummary(e){let n=await this.readSessionFile(e);if(!n)return null;let r=await Le(e),s=n.messages||[],i=n.sessionId||this.extractSessionIdFromFilename(e),o=n.projectHash||"",a=await this.resolveWorkspace(o),l,c,u,d=0;for(let m of s)if(ug(m.type)){d++;let p=dg(m.content).trim();p&&(l||(l=K(pe(p),80)),c=K(pe(p),80))}else ld(m.type)&&(d++,m.model&&(u=m.model));let f=fg(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Zn(n.startTime,r.createdAt),modifiedAt:Zn(n.lastUpdated,r.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,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(e){let n=await cg(e,"utf-8");if(Ds(n)==="unknown")return M({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:n.slice(0,120),message:`gemini session file at ${e} 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 wo(n)}catch{return null}}extractSessionIdFromFilename(e){let n=HL(e).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 e=[],n;try{n=await js(this.geminiTmpDir)}catch{return e}for(let r of n){let s=st(this.geminiTmpDir,r,"chats");if(!(await Eo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await js(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(st(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let n=await this.resolveSessionFile(e);return n?(await BL(n),!0):!1}async resolveSessionFile(e){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===e||a.startsWith(e),c=o===e||o.startsWith(e)||o.length>=8&&e.startsWith(o);if(!l&&!c)continue;let u=await Le(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));r.push({filePath:s,modifiedAt:Zn(i?.lastUpdated,u.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(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Ps(e,JL());for(let r of this.extraWorkspacePaths)Ps(e,r);for(let r of await this.collectGeminiProjectPaths())Ps(e,r);for(let r of await this.collectCodexCwds())Ps(e,r);for(let r of await this.collectClaudeCwds())Ps(e,r);let n=new Map;for(let r of e)n.set(VL(r),r);return this.workspaceHashMap=n,n}async collectGeminiProjectPaths(){let e;try{e=await cg(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let r=JSON.parse(e).projects;return!r||typeof r!="object"||Array.isArray(r)?[]:Object.keys(r)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let n of this.codexSessionDirs){let r=await this.findJsonlFiles(n);for(let s of r){let o=(await Ke(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&e.add(o)}}return[...e]}async collectClaudeCwds(){let e=new Set,n;try{n=await js(this.claudeProjectsDir)}catch{return[]}for(let r of n){let s=st(this.claudeProjectsDir,r);if(!(await Eo(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await js(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=st(s,a),u=(await Ke(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let n=[];if(!(await Eo(e).catch(()=>null))?.isDirectory())return n;let s;try{s=await js(e)}catch{return n}for(let i of s){let o=st(e,i),a=await Eo(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 YL,writeFileSync as zL,mkdirSync as ZL}from"node:fs";import{join as QL,dirname as eC}from"node:path";import{randomUUID as tC}from"node:crypto";function dd(t){return new cd(t)}var cd,ud=E(()=>{"use strict";mg();bt();kn();ut();ad();cd=class extends be{constructor(e){super({provider:new vo(e),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",_e,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(n,r)=>bn(n,{...r,acpTool:"gemini"})})}forkHint(e){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(`
1551
1551
  `)}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:ao,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,n){let r=await this.resolvePath(e);if(!r)return{success:!1,error:`Session file not found for ${e}`};try{let s=YL(r,"utf-8"),i=Ds(s),o=wo(s),a=tC();o.sessionId=a,o.kind="main";let l=eC(r),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=i==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=QL(l,d);return ZL(l,{recursive:!0}),zL(f,lg(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 pg,readFile as nC,rm as rC,stat as Or}from"node:fs/promises";import{basename as sC,join as kt}from"node:path";function iC(t){if(!t)return null;let e={inputTokens:0,outputTokens:0,cacheReadTokens:0,cacheWriteTokens:0,reasoningTokens:0},n=!1;for(let r of Object.values(t))r?.usage&&(n=!0,e.inputTokens+=r.usage.inputTokens??0,e.outputTokens+=r.usage.outputTokens??0,e.cacheReadTokens+=r.usage.cacheReadTokens??0,e.cacheWriteTokens+=r.usage.cacheWriteTokens??0,e.reasoningTokens+=r.usage.reasoningTokens??0);return n?e:null}function fd(){return{shutdownTotals:null,assistantOutputSum:0}}function hg(t,e){if(e.type==="assistant.message"){let n=e.data?.outputTokens;typeof n=="number"&&(t.assistantOutputSum+=n,t.lastAssistantOutputTokens=n)}else if(e.type==="session.shutdown"){let n=iC(e.data?.modelMetrics);n&&(t.shutdownTotals=n)}}function _g(t){let e=t.shutdownTotals,n=t.lastAssistantOutputTokens!==void 0?{outputTokens:t.lastAssistantOutputTokens}:void 0;return{totalInputTokens:e?.inputTokens,totalCachedInputTokens:e?.cacheReadTokens,totalCacheWriteInputTokens:e?.cacheWriteTokens,totalOutputTokens:e?.outputTokens??(t.lastAssistantOutputTokens===void 0?void 0:t.assistantOutputSum),totalReasoningOutputTokens:e?.reasoningTokens,lastTokenUsage:n}}function oC(t){let e={};for(let n of t.split(`
1552
1552
  `)){let r=n.match(/^(\w+):\s*(.*)$/);r&&(e[r[1]]=r[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function Qn(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function aC(t){let e=0,n=fd();for await(let r of He(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++,hg(n,r);return{messageCount:e,tokens:n}}function lC(t){let e=cC(t),n=new Map;for(let r of t){if(r.role!=="tool_use"||r.toolCallId===void 0)continue;if(r.toolName==="bash"){let l=e.get(r.toolCallId),u=[l?.content,l?.toolDetailedContent].filter(f=>typeof f=="string").join(`
1553
- `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let d=`copilot-shell:${u}:${r.toolCallId}`;n.set(u,d),r.backgroundTaskId=d,l!==void 0&&(l.backgroundTaskId=d);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=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function cC(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var So,gg=E(()=>{"use strict";qt();So=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||kt(we,".copilot");this.sessionStateDir=kt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await pg(this.sessionStateDir)}catch{return e}for(let r of n){let s=kt(this.sessionStateDir,r);if((await Or(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=kt(n,"events.jsonl"),i=await Or(s).catch(()=>null),o=i?s:kt(n,"workspace.yaml"),a=await Le(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",u,d,f,m,p,h,_=r?.id||sC(n)||e,y=fd();if(i)for await(let g of He(s)){let w=Qn(g.timestamp)||a.modifiedAt;if(hg(y,g),g.type==="session.start"&&g.data){g.data.sessionId&&(_=g.data.sessionId),g.data.copilotVersion&&(d=g.data.copilotVersion),g.data.startTime&&(h=Qn(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context&&(g.data.context.cwd&&(c=g.data.context.cwd),g.data.context.branch&&(f=g.data.context.branch));continue}if(g.type==="session.model_change"&&g.data?.newModel){u=g.data.newModel;continue}if(g.type==="user.message"&&g.data){let S=g.data.content||"",I=S.trim();I&&(m||(m=G(I,80)),p=G(I,80)),l.push({role:"user",timestamp:w,content:pe(I||S)});continue}if(g.type==="assistant.message"&&g.data){let S=(g.data.content||"").trim();if(S&&l.push({role:"assistant",timestamp:w,content:pe(S),model:u}),g.data.toolRequests)for(let I of g.data.toolRequests)l.push({role:"tool_use",timestamp:w,content:I.name||"unknown tool",toolName:I.name,toolInput:I.arguments?JSON.stringify(I.arguments,null,2):void 0,toolInputData:Wt(I.arguments),toolCallId:I.toolCallId});continue}if(g.type==="tool.execution_complete"&&g.data){let S=g.data.result?.content||"",I=g.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:w,content:pe(S),toolDetailedContent:I?pe(I):void 0,toolCallId:g.data.toolCallId});continue}if(g.type==="assistant.reasoning"&&g.data?.content){l.push({role:"thinking",timestamp:w,content:pe(g.data.content)});continue}if(g.type==="session.error"||g.type==="session.warning"||g.type==="session.info"||g.type==="system.message"){let S=g.data?.message||"";S.trim()&&l.push({role:"system",timestamp:w,content:pe(S)});continue}}if(!m){let g=(r?.summary||"").trim();g&&(m=G(g,80))}return lC(l),{provider:"copilot",sessionId:_,cwd:c,createdAt:h??Qn(r?.created_at)??a.createdAt,modifiedAt:Qn(r?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:o,..._g(y),messages:l}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=kt(e,"events.jsonl"),i=await Or(s).catch(()=>null),o=i?s:kt(e,"workspace.yaml"),a=await Le(i?s:e),l=i?await Ke(s,20):[],c=r?.id||n,u=r?.cwd||"(unknown workspace)",d,f,m,p,h;for(let y of l)if(y.type==="session.start"&&y.data&&(y.data.sessionId&&(c=y.data.sessionId),y.data.copilotVersion&&(f=y.data.copilotVersion),y.data.startTime&&(m=Qn(y.data.startTime)),y.data.selectedModel&&(d=y.data.selectedModel),y.data.context?.cwd&&(u=y.data.context.cwd)),y.type==="session.model_change"&&y.data?.newModel&&(d||(d=y.data.newModel)),y.type==="user.message"&&y.data){let g=(y.data.content||"").trim();g&&(p||(p=G(g,80)),h=G(g,80))}if(!p){let y=(r?.summary||"").trim();y&&(p=G(y,80))}let _=i?await aC(s):{messageCount:0,tokens:fd()};return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Qn(r?.created_at)??a.createdAt,modifiedAt:Qn(r?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:_.messageCount,filePath:o,..._g(_.tokens)}}async readWorkspaceYaml(e){let n=kt(e,"workspace.yaml");try{let r=await nC(n,"utf-8");return oC(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await rC(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await pg(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=kt(this.sessionStateDir,e);if((await Or(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=kt(this.sessionStateDir,s);(await Or(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=kt(this.sessionStateDir,s);if(!(await Or(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function pd(t){return new md(t)}var md,_d=E(()=>{"use strict";gg();bt();kn();de();ut();md=class extends be{constructor(e){super({provider:new So(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",_e,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>bn(n,{...r,acpTool:"copilot"})})}async seed(e,n){let r=await super.seed(e,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 De({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as yg,readdirSync as dC,statSync as wg}from"node:fs";import{join as In}from"node:path";import{createRequire as uC}from"node:module";function Eg(){return hd===null&&(hd=uC(import.meta.url)("node:sqlite").DatabaseSync),hd}function Tg(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function vg(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function Sg(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function fC(){let t=process.env.XDG_DATA_HOME||In(we,".local","share"),e=process.env.XDG_CONFIG_HOME||In(we,".config");return[In(t,"opencode","opencode.db"),In(e,"opencode","opencode.db")]}function mC(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||In(we,".local","share"),e=In(t,"lmplayer"),n=In(e,"opencode-local.db"),r=[n];try{let s=dC(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>In(e,i)).filter(i=>i!==n).sort((i,o)=>{try{return wg(o).mtimeMs-wg(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function pC(t){return t==="lmplayer"?mC():fC()}var hd,Lr,gd=E(()=>{"use strict";qt();de();hd=null;Lr=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=pC(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>yg(e))}openDb(e){if(!yg(e))return null;let n=new(Eg())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];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,
1553
+ `).match(/<command (?:started in (?:detached )?background with|with) shellId:\s*([^>\s]+)/i)?.[1];if(u===void 0)continue;let d=`copilot-shell:${u}:${r.toolCallId}`;n.set(u,d),r.backgroundTaskId=d,l!==void 0&&(l.backgroundTaskId=d);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=e.get(r.toolCallId);a!==void 0&&(a.backgroundTaskId=o)}}function cC(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var So,gg=E(()=>{"use strict";qt();So=class{name="copilot";sessionStateDir;constructor(e={}){let n=e.copilotDir||kt(we,".copilot");this.sessionStateDir=kt(n,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],n;try{n=await pg(this.sessionStateDir)}catch{return e}for(let r of n){let s=kt(this.sessionStateDir,r);if((await Or(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,r);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.resolveSessionDir(e);if(!n)return null;let r=await this.readWorkspaceYaml(n),s=kt(n,"events.jsonl"),i=await Or(s).catch(()=>null),o=i?s:kt(n,"workspace.yaml"),a=await Le(i?s:n),l=[],c=r?.cwd||"(unknown workspace)",u,d,f,m,p,h,_=r?.id||sC(n)||e,y=fd();if(i)for await(let g of He(s)){let w=Qn(g.timestamp)||a.modifiedAt;if(hg(y,g),g.type==="session.start"&&g.data){g.data.sessionId&&(_=g.data.sessionId),g.data.copilotVersion&&(d=g.data.copilotVersion),g.data.startTime&&(h=Qn(g.data.startTime)),g.data.selectedModel&&(u=g.data.selectedModel),g.data.context&&(g.data.context.cwd&&(c=g.data.context.cwd),g.data.context.branch&&(f=g.data.context.branch));continue}if(g.type==="session.model_change"&&g.data?.newModel){u=g.data.newModel;continue}if(g.type==="user.message"&&g.data){let v=g.data.content||"",N=v.trim();N&&(m||(m=K(N,80)),p=K(N,80)),l.push({role:"user",timestamp:w,content:pe(N||v)});continue}if(g.type==="assistant.message"&&g.data){let v=(g.data.content||"").trim();if(v&&l.push({role:"assistant",timestamp:w,content:pe(v),model:u}),g.data.toolRequests)for(let N of g.data.toolRequests)l.push({role:"tool_use",timestamp:w,content:N.name||"unknown tool",toolName:N.name,toolInput:N.arguments?JSON.stringify(N.arguments,null,2):void 0,toolInputData:Wt(N.arguments),toolCallId:N.toolCallId});continue}if(g.type==="tool.execution_complete"&&g.data){let v=g.data.result?.content||"",N=g.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:w,content:pe(v),toolDetailedContent:N?pe(N):void 0,toolCallId:g.data.toolCallId});continue}if(g.type==="assistant.reasoning"&&g.data?.content){l.push({role:"thinking",timestamp:w,content:pe(g.data.content)});continue}if(g.type==="session.error"||g.type==="session.warning"||g.type==="session.info"||g.type==="system.message"){let v=g.data?.message||"";v.trim()&&l.push({role:"system",timestamp:w,content:pe(v)});continue}}if(!m){let g=(r?.summary||"").trim();g&&(m=K(g,80))}return lC(l),{provider:"copilot",sessionId:_,cwd:c,createdAt:h??Qn(r?.created_at)??a.createdAt,modifiedAt:Qn(r?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:o,..._g(y),messages:l}}async extractSummary(e,n){let r=await this.readWorkspaceYaml(e),s=kt(e,"events.jsonl"),i=await Or(s).catch(()=>null),o=i?s:kt(e,"workspace.yaml"),a=await Le(i?s:e),l=i?await Ke(s,20):[],c=r?.id||n,u=r?.cwd||"(unknown workspace)",d,f,m,p,h;for(let y of l)if(y.type==="session.start"&&y.data&&(y.data.sessionId&&(c=y.data.sessionId),y.data.copilotVersion&&(f=y.data.copilotVersion),y.data.startTime&&(m=Qn(y.data.startTime)),y.data.selectedModel&&(d=y.data.selectedModel),y.data.context?.cwd&&(u=y.data.context.cwd)),y.type==="session.model_change"&&y.data?.newModel&&(d||(d=y.data.newModel)),y.type==="user.message"&&y.data){let g=(y.data.content||"").trim();g&&(p||(p=K(g,80)),h=K(g,80))}if(!p){let y=(r?.summary||"").trim();y&&(p=K(y,80))}let _=i?await aC(s):{messageCount:0,tokens:fd()};return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??Qn(r?.created_at)??a.createdAt,modifiedAt:Qn(r?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:_.messageCount,filePath:o,..._g(_.tokens)}}async readWorkspaceYaml(e){let n=kt(e,"workspace.yaml");try{let r=await nC(n,"utf-8");return oC(r)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let n=await this.resolveSessionDir(e);return n?(await rC(n,{recursive:!0}),!0):!1}async resolveSessionDir(e){let n;try{n=await pg(this.sessionStateDir)}catch{return null}if(n.includes(e)){let s=kt(this.sessionStateDir,e);if((await Or(s).catch(()=>null))?.isDirectory())return s}let r=[];for(let s of n)if(s.startsWith(e)){let i=kt(this.sessionStateDir,s);(await Or(i).catch(()=>null))?.isDirectory()&&r.push(i)}if(r.length===1)return r[0];for(let s of n){let i=kt(this.sessionStateDir,s);if(!(await Or(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===e||a.id?.startsWith(e)))return i}return null}}});function pd(t){return new md(t)}var md,_d=E(()=>{"use strict";gg();bt();kn();de();ut();md=class extends be{constructor(e){super({provider:new So(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",_e,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(n,r)=>bn(n,{...r,acpTool:"copilot"})})}async seed(e,n){let r=await super.seed(e,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 De({event:"model_ignored",provider:"copilot",model:n.model,reason:s}),{...r,warnings:[...r.warnings??[],`copilot seed ignored model=${n.model}: ${s}`]}}}});import{existsSync as yg,readdirSync as dC,statSync as wg}from"node:fs";import{join as In}from"node:path";import{createRequire as uC}from"node:module";function Eg(){return hd===null&&(hd=uC(import.meta.url)("node:sqlite").DatabaseSync),hd}function Tg(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalCacheWriteInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function vg(t,e){if(!e)return;t.observed=!0;let n=e.input??0,r=e.output??0,s=e.reasoning??0,i=e.cache?.read??0,o=e.cache?.write??0;if(t.totalInputTokens+=n,t.totalCachedInputTokens+=i,t.totalCacheWriteInputTokens+=o,t.totalOutputTokens+=r,t.totalReasoningOutputTokens+=s,n+r+s+i+o>0){let a=n+i+o;t.lastInputTokens=a,t.lastTokenUsage={inputTokens:n,cachedInputTokens:i,cacheWriteInputTokens:o,outputTokens:r,reasoningOutputTokens:s,totalTokens:a+r+s}}}function Sg(t){return t.observed?{totalInputTokens:t.totalInputTokens,totalCachedInputTokens:t.totalCachedInputTokens,totalCacheWriteInputTokens:t.totalCacheWriteInputTokens,totalOutputTokens:t.totalOutputTokens,totalReasoningOutputTokens:t.totalReasoningOutputTokens,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}:{}}function fC(){let t=process.env.XDG_DATA_HOME||In(we,".local","share"),e=process.env.XDG_CONFIG_HOME||In(we,".config");return[In(t,"opencode","opencode.db"),In(e,"opencode","opencode.db")]}function mC(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let t=process.env.XDG_DATA_HOME||In(we,".local","share"),e=In(t,"lmplayer"),n=In(e,"opencode-local.db"),r=[n];try{let s=dC(e).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>In(e,i)).filter(i=>i!==n).sort((i,o)=>{try{return wg(o).mtimeMs-wg(i).mtimeMs}catch{return 0}});r.push(...s)}catch{}return r}function pC(t){return t==="lmplayer"?mC():fC()}var hd,Lr,gd=E(()=>{"use strict";qt();de();hd=null;Lr=class{name;startCommand;dbPaths;busyTimeoutMs;constructor(e){this.name=e?.providerName??"opencode",this.startCommand=e?.startCommand??this.name,this.busyTimeoutMs=e?.busyTimeoutMs??5e3,e?.dbPath?this.dbPaths=[e.dbPath]:this.dbPaths=pC(this.name)}existingDbPaths(){return this.dbPaths.filter(e=>yg(e))}openDb(e){if(!yg(e))return null;let n=new(Eg())(e,{open:!0,readOnly:!0});return n.exec(`PRAGMA busy_timeout = ${this.busyTimeoutMs}`),n}async discoverSessions(){let e=[];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,
1554
1554
  s.time_created, s.time_updated
1555
1555
  FROM session s
1556
1556
  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)",u=r.prepare(`SELECT m.id, m.data, m.time_created FROM message m
1557
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),d=0,f,m,p,h=Tg(),_=[];for(let g of u){let w;try{w=JSON.parse(g.data)}catch{continue}p||(p=w.model?.modelID||w.modelID),(w.role==="user"||w.role==="assistant")&&d++,w.role==="user"&&_.push(g.id),w.role==="assistant"&&vg(h,w.tokens)}let y=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let g of y){let w=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),S=this.extractText(w);S&&(f||(f=G(S,80)),m=G(S,80))}e.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:d,filePath:n,...Sg(h)})}}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 e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1558
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,u,d,f=Tg();for(let m of o){let p;try{p=JSON.parse(m.data)}catch{continue}c||(c=p.model?.modelID||p.modelID);let h=p.model?.modelID||p.modelID,_=new Date(p.time?.created||m.time_created),y=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(m.id);if(p.role==="user"){let g=this.extractText(y);g&&(u||(u=G(g,80)),d=G(g,80)),a.push({role:"user",timestamp:_,content:g||"(empty)"}),l++}else if(p.role==="assistant"){vg(f,p.tokens);for(let g of y){let w;try{w=JSON.parse(g.data)}catch{continue}w.type==="text"&&w.text?a.push({role:"assistant",timestamp:_,content:w.text,model:h}):w.type==="reasoning"&&w.text?a.push({role:"thinking",timestamp:_,content:w.text}):w.type==="tool"&&w.tool&&(a.push({role:"tool_use",timestamp:_,content:`${w.tool}`,toolName:w.tool,toolCallId:w.callID,toolInput:w.state?.input?JSON.stringify(w.state.input):void 0,toolInputData:Wt(w.state?.input)}),w.state&&(w.state.status==="completed"||w.state.status==="error"||w.state.output!==void 0||w.state.error!==void 0)&&a.push({role:"tool_result",timestamp:_,content:w.state.error??w.state.output??"",toolCallId:w.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:u,lastUserMessage:d,messageCount:l,filePath:r,...Sg(f),messages:a}}extractText(e){let n=[];for(let r of e){let s;try{s=JSON.parse(r.data)}catch{continue}s.type==="text"&&s.text&&n.push(s.text)}return n.join(`
1557
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),d=0,f,m,p,h=Tg(),_=[];for(let g of u){let w;try{w=JSON.parse(g.data)}catch{continue}p||(p=w.model?.modelID||w.modelID),(w.role==="user"||w.role==="assistant")&&d++,w.role==="user"&&_.push(g.id),w.role==="assistant"&&vg(h,w.tokens)}let y=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let g of y){let w=r.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(g),v=this.extractText(w);v&&(f||(f=K(v,80)),m=K(v,80))}e.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:d,filePath:n,...Sg(h)})}}catch(s){M({event:"opencode_discover_sessions_failed",provider:this.name,db_path:n,error_message:s instanceof Error?s.message:String(s)})}finally{r.close()}}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{let s=this.findSessionRow(r,e);if(!s)continue;return this.buildSessionDetail(r,s,n)}catch{}finally{r.close()}}return null}buildSessionDetail(e,n,r){let s=e.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(n.project_id),i=n.directory||s?.worktree||"(unknown)",o=e.prepare(`SELECT id, session_id, time_created, time_updated, data
1558
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(n.id),a=[],l=0,c,u,d,f=Tg();for(let m of o){let p;try{p=JSON.parse(m.data)}catch{continue}c||(c=p.model?.modelID||p.modelID);let h=p.model?.modelID||p.modelID,_=new Date(p.time?.created||m.time_created),y=e.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(m.id);if(p.role==="user"){let g=this.extractText(y);g&&(u||(u=K(g,80)),d=K(g,80)),a.push({role:"user",timestamp:_,content:g||"(empty)"}),l++}else if(p.role==="assistant"){vg(f,p.tokens);for(let g of y){let w;try{w=JSON.parse(g.data)}catch{continue}w.type==="text"&&w.text?a.push({role:"assistant",timestamp:_,content:w.text,model:h}):w.type==="reasoning"&&w.text?a.push({role:"thinking",timestamp:_,content:w.text}):w.type==="tool"&&w.tool&&(a.push({role:"tool_use",timestamp:_,content:`${w.tool}`,toolName:w.tool,toolCallId:w.callID,toolInput:w.state?.input?JSON.stringify(w.state.input):void 0,toolInputData:Wt(w.state?.input)}),w.state&&(w.state.status==="completed"||w.state.status==="error"||w.state.output!==void 0||w.state.error!==void 0)&&a.push({role:"tool_result",timestamp:_,content:w.state.error??w.state.output??"",toolCallId:w.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:u,lastUserMessage:d,messageCount:l,filePath:r,...Sg(f),messages:a}}extractText(e){let n=[];for(let r of e){let s;try{s=JSON.parse(r.data)}catch{continue}s.type==="text"&&s.text&&n.push(s.text)}return n.join(`
1559
1559
  `).trim()}async resolveSessionPath(e){for(let n of this.existingDbPaths()){let r=this.openDb(n);if(r)try{if(this.findSessionRow(r,e))return n}catch{}finally{r.close()}}return null}async deleteSession(e){for(let n of this.existingDbPaths()){let r=new(Eg())(n,{open:!0});try{let s=this.findSessionRow(r,e);if(!s)continue;return r.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{r.close()}}return!1}findSessionRow(e,n){let r=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1560
1560
  s.time_created, s.time_updated
1561
1561
  FROM session s WHERE s.id = ?`).get(n);if(r)return r;let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
@@ -1565,11 +1565,11 @@ ${n}`:n}function kL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1565
1565
  ORDER BY s.time_updated DESC
1566
1566
  LIMIT 2`).all(`${n}%`);return s.length!==1?null:s[0]}}});function wd(){return new yd}var yd,Ed=E(()=>{"use strict";gd();bt();kn();ut();yd=class extends be{constructor(){super({provider:new Lr,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"custom-tool",leaderSetupHint:"OpenCode supports custom tools via .opencode/tools/ directory"},binary:"opencode",seedArgs:["run",_e],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,n)=>bn(e,{...n,acpTool:"opencode"})})}seedArgsFor(e){let n=["run"];return e?.model&&n.push("--model",e.model),e?.effort&&n.push("--variant",e.effort),n.push(e?.prompt??_e),n}}});import{appendFile as _C,mkdir as hC,readFile as bg,readdir as kg,rm as gC,stat as Ig}from"node:fs/promises";import{basename as yC,dirname as wC,isAbsolute as Ng,join as er,relative as EC,resolve as Td}from"node:path";function vd(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}function bC(t){return typeof t=="number"?new Date(t):vd(t)??new Date(0)}function Ag(t){return typeof t=="string"?t.trim():Array.isArray(t)?t.map(e=>e&&typeof e=="object"&&"text"in e&&typeof e.text=="string"?e.text:"").filter(Boolean).join(`
1567
1567
  `).trim():""}function xg(t){if(t!==void 0)try{return JSON.stringify(t)}catch{return String(t)}}function kC(t){return t&&typeof t=="object"&&"output"in t&&typeof t.output=="string"?t.output:xg(t)??""}function IC(t){let e=NC(t),n=new Set;for(let r of t){if(r.role!=="tool_use"||r.toolName!=="Bash"||r.toolInputData?.run_in_background!==!0||r.toolCallId===void 0)continue;let s=e.get(r.toolCallId);if(s===void 0)continue;let i=s.content.match(/(?:^|\n)task_id:\s*([^\s]+)/)?.[1];i!==void 0&&(n.add(i),r.backgroundTaskId=i,s.backgroundTaskId=i)}for(let r of t){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=e.get(r.toolCallId);i!==void 0&&(i.backgroundTaskId=s)}}function NC(t){let e=new Map;for(let n of t)n.role==="tool_result"&&n.toolCallId!==void 0&&e.set(n.toolCallId,n);return e}var TC,vC,SC,bo,Rg=E(()=>{"use strict";qt();TC="1.4",vC="1.5",SC=new Set([TC,vC]),bo=class{name="kimi";homeDir;sessionsDir;constructor(e){this.homeDir=Td(e?.kimiHome??process.env.KIMI_CODE_HOME??er(we,".kimi-code")),this.sessionsDir=er(this.homeDir,"sessions")}async discoverSessions(){let e=[];for(let n of await this.sessionFiles())try{let r=await this.summary(n);r&&e.push(r)}catch{}return e.sort((n,r)=>r.modifiedAt.getTime()-n.modifiedAt.getTime())}async loadSession(e){let n=await this.findSession(e);if(!n)return null;let r=await this.summary(n);if(!r)return null;let s=await this.parseWire(n.wirePath);return{...r,messages:s.messages}}async resolveSessionPath(e){return(await this.findSession(e))?.wirePath??null}async deleteSession(e){let n=await this.findSession(e);return n?(await gC(n.sessionDir,{recursive:!0,force:!0}),await hC(wC(this.indexPath()),{recursive:!0,mode:448}),await _C(this.indexPath(),`${JSON.stringify({sessionId:n.sessionId,deleted:!0})}
1568
- `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return er(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await kg(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=er(this.sessionsDir,s.name),o;try{o=await kg(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=er(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await bg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Td(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:er(n,"state.json"),wirePath:er(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Ng(e)||yC(e)!==n)return!1;let r=EC(this.sessionsDir,Td(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Ng(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await bg(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Ig(e.wirePath)}catch{return null}let s=await Ig(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=vd(n.createdAt)??s.birthtime,a=vd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?G(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=!0,s,i,o,a=0,l=0,c=0,u=0,d=!1,f=0,m,p;for await(let h of He(e)){let _=bC(h.time??h.created_at);if(r&&(r=!1,h.type==="metadata"&&!SC.has(h.protocol_version))){let g=`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:g}],messageCount:1,firstUserMessage:g,lastUserMessage:g}}if(h.type==="config.update"&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),d||=h.usage!==void 0;let g=h.usage?.inputOther??0,w=h.usage?.inputCacheRead??0,S=h.usage?.inputCacheCreation??0,I=h.usage?.output??0;a+=g,l+=w,c+=S,u+=I,h.usageScope==="turn"&&(m=g+w+S,p={inputTokens:g,cachedInputTokens:w,cacheWriteInputTokens:S,outputTokens:I,totalTokens:m+I});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let g=Ag(h.input);g&&(i??=G(g,80),o=G(g,80),n.push({role:"user",timestamp:_,content:g}),f++);continue}if(h.type==="turn.steer"){let g=Ag(h.input);g&&(n.push({role:"system",timestamp:_,content:g}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let y=h.event;y.type==="content.part"&&y.part?.type==="text"&&y.part.text?(n.push({role:"assistant",timestamp:_,content:y.part.text,model:s}),f++):y.type==="content.part"&&y.part?.type==="think"&&y.part.think?n.push({role:"thinking",timestamp:_,content:y.part.think,model:s}):y.type==="tool.call"?n.push({role:"tool_use",timestamp:_,content:y.name??"tool",toolName:y.name,toolInput:xg(y.args),toolInputData:Wt(y.args),toolCallId:y.toolCallId,model:s}):y.type==="tool.result"&&n.push({role:"tool_result",timestamp:_,content:kC(y.result),toolCallId:y.toolCallId,model:s})}return IC(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:d?a:void 0,totalCachedInputTokens:d?l:void 0,totalCacheWriteInputTokens:d?c:void 0,totalOutputTokens:d?u:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function bd(t){return new Sd(t)}var Sd,kd=E(()=>{"use strict";Rg();bt();kn();ut();Sd=class extends be{constructor(e){super({provider:new bo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",_e,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>bn(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??_e,"--output-format","stream-json"),n}}});import{spawn as AC}from"node:child_process";import{mkdirSync as xC}from"node:fs";function Nd(t){return new Id(t)}async function RC(t,e){let n=Date.now(),r=Og({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});tt("lmplayer",r,e.permissionMode??"yolo");let s=await Cg(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(Lg(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Og(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...vn("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Lg(t){if(t.error)return t.error;let e=lo(t.stderr).trim();return e?e.slice(0,500):`exit code ${t.code}`}function Cg(t,e,n){return new Promise((r,s)=>{let i;try{i=AC(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(y){s(y);return}let o="",a="",l="",c,u,d,f=[],m=!1,p=n.timeoutMs===void 0?void 0:setTimeout(()=>{m||(m=!0,i.kill(),h(),s(new Error(`lmplayer seed timed out after ${n.timeoutMs}ms`)))},n.timeoutMs),h=()=>{p!==void 0&&clearTimeout(p)},_=y=>{let g=y.trim();if(!g)return;let w;try{w=JSON.parse(g)}catch{f.push(y),n.onText?.(y);return}if(!Cr(w))return;let S=ko(w,!1);c===void 0&&S!==void 0&&(c=S),u=ko(w,!0)??u,d===void 0&&(d=OC(w));let I=$g(w);I&&(f.push(I),n.onText?.(I))};i.stdout?.on("data",y=>{let g=y.toString("utf8");o+=g,l+=g;let w=l.indexOf(`
1569
- `);for(;w>=0;){let S=l.slice(0,w);l=l.slice(w+1),_(S),w=l.indexOf(`
1568
+ `,"utf-8"),!0):!1}getWatchPaths(){return[{directory:this.sessionsDir,filePattern:/wire\.jsonl$/}]}indexPath(){return er(this.homeDir,"session_index.jsonl")}async sessionFiles(){let e=await this.readIndex(),n=new Map;for(let s of e.values())this.validSessionDir(s.sessionDir,s.sessionId)&&n.set(s.sessionId,this.filesFor(s.sessionId,s.sessionDir,s.workDir));let r;try{r=await kg(this.sessionsDir,{withFileTypes:!0})}catch{return[...n.values()]}for(let s of r){if(!s.isDirectory())continue;let i=er(this.sessionsDir,s.name),o;try{o=await kg(i,{withFileTypes:!0})}catch{continue}for(let a of o){if(!a.isDirectory()||n.has(a.name))continue;let l=er(i,a.name);n.set(a.name,this.filesFor(a.name,l))}}return[...n.values()]}async readIndex(){let e;try{e=await bg(this.indexPath(),"utf-8")}catch{return new Map}let n=new Map;for(let r of e.split(/\r?\n/))if(r.trim())try{let s=JSON.parse(r);if(typeof s.sessionId!="string")continue;s.deleted===!0?n.delete(s.sessionId):typeof s.sessionDir=="string"&&typeof s.workDir=="string"&&n.set(s.sessionId,{sessionId:s.sessionId,sessionDir:Td(s.sessionDir),workDir:s.workDir})}catch{}return n}filesFor(e,n,r){return{sessionId:e,sessionDir:n,statePath:er(n,"state.json"),wirePath:er(n,"agents","main","wire.jsonl"),indexedWorkDir:r}}validSessionDir(e,n){if(!Ng(e)||yC(e)!==n)return!1;let r=EC(this.sessionsDir,Td(e));return r!==""&&r!==".."&&!r.startsWith(`..${process.platform==="win32"?"\\":"/"}`)&&!Ng(r)}async findSession(e){let n=await this.sessionFiles(),r=n.find(i=>i.sessionId===e);if(r)return r;let s=n.filter(i=>i.sessionId.startsWith(e));return s.length===1?s[0]:null}async readState(e){try{let n=JSON.parse(await bg(e,"utf-8"));return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:null}catch{return null}}async summary(e){let n=await this.readState(e.statePath);if(!n)return null;let r;try{r=await Ig(e.wirePath)}catch{return null}let s=await Ig(e.statePath).catch(()=>r),i=await this.parseWire(e.wirePath),o=vd(n.createdAt)??s.birthtime,a=vd(n.updatedAt)??(s.mtime>r.mtime?s.mtime:r.mtime);return{provider:"kimi",sessionId:e.sessionId,slug:n.title,cwd:n.workDir??e.indexedWorkDir??"(unknown)",createdAt:o,modifiedAt:a,model:i.model,startCommand:"kimi",firstUserMessage:i.firstUserMessage,lastUserMessage:i.lastUserMessage??(n.lastPrompt?K(n.lastPrompt.trim(),80):void 0),messageCount:i.messageCount,filePath:e.wirePath,filePaths:[e.statePath,e.wirePath],totalInputTokens:i.totalInputTokens,totalCachedInputTokens:i.totalCachedInputTokens,totalCacheWriteInputTokens:i.totalCacheWriteInputTokens,totalOutputTokens:i.totalOutputTokens,lastInputTokens:i.lastInputTokens,lastTokenUsage:i.lastTokenUsage}}async parseWire(e){let n=[],r=!0,s,i,o,a=0,l=0,c=0,u=0,d=!1,f=0,m,p;for await(let h of He(e)){let _=bC(h.time??h.created_at);if(r&&(r=!1,h.type==="metadata"&&!SC.has(h.protocol_version))){let g=`Kimi transcript wire protocol version ${JSON.stringify(h.protocol_version)} is not supported by this lmctl version.`;return{messages:[{role:"system",timestamp:_,content:g}],messageCount:1,firstUserMessage:g,lastUserMessage:g}}if(h.type==="config.update"&&h.modelAlias&&(s=h.modelAlias),h.type==="usage.record"){h.model&&(s=h.model),d||=h.usage!==void 0;let g=h.usage?.inputOther??0,w=h.usage?.inputCacheRead??0,v=h.usage?.inputCacheCreation??0,N=h.usage?.output??0;a+=g,l+=w,c+=v,u+=N,h.usageScope==="turn"&&(m=g+w+v,p={inputTokens:g,cachedInputTokens:w,cacheWriteInputTokens:v,outputTokens:N,totalTokens:m+N});continue}if(h.type==="turn.prompt"&&h.origin?.kind==="user"){let g=Ag(h.input);g&&(i??=K(g,80),o=K(g,80),n.push({role:"user",timestamp:_,content:g}),f++);continue}if(h.type==="turn.steer"){let g=Ag(h.input);g&&(n.push({role:"system",timestamp:_,content:g}),f++);continue}if(h.type!=="context.append_loop_event"||!h.event)continue;let y=h.event;y.type==="content.part"&&y.part?.type==="text"&&y.part.text?(n.push({role:"assistant",timestamp:_,content:y.part.text,model:s}),f++):y.type==="content.part"&&y.part?.type==="think"&&y.part.think?n.push({role:"thinking",timestamp:_,content:y.part.think,model:s}):y.type==="tool.call"?n.push({role:"tool_use",timestamp:_,content:y.name??"tool",toolName:y.name,toolInput:xg(y.args),toolInputData:Wt(y.args),toolCallId:y.toolCallId,model:s}):y.type==="tool.result"&&n.push({role:"tool_result",timestamp:_,content:kC(y.result),toolCallId:y.toolCallId,model:s})}return IC(n),{messages:n,messageCount:f,model:s,firstUserMessage:i,lastUserMessage:o,totalInputTokens:d?a:void 0,totalCachedInputTokens:d?l:void 0,totalCacheWriteInputTokens:d?c:void 0,totalOutputTokens:d?u:void 0,lastInputTokens:m,lastTokenUsage:p}}}});function bd(t){return new Sd(t)}var Sd,kd=E(()=>{"use strict";Rg();bt();kn();ut();Sd=class extends be{constructor(e){super({provider:new bo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append",leaderSetupHint:"Kimi supports skills through ~/.kimi-code/skills and --skills-dir."},binary:"kimi",seedArgs:["-p",_e,"--output-format","stream-json"],resumeTemplate:"kimi --session {{session_id}} --auto",startTemplate:"kimi --auto",transport:(n,r)=>bn(n,{...r,acpTool:"kimi"})})}seedArgsFor(e){let n=[];return e?.model&&n.push("--model",e.model),n.push("-p",e?.prompt??_e,"--output-format","stream-json"),n}}});import{spawn as AC}from"node:child_process";import{mkdirSync as xC}from"node:fs";function Nd(t){return new Id(t)}async function RC(t,e){let n=Date.now(),r=Og({prompt:t,sessionId:e.sessionId,model:e.model,effort:e.effort,formatJson:!0,permissionMode:e.permissionMode??"yolo"});tt("lmplayer",r,e.permissionMode??"yolo");let s=await Cg(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal,onText:i=>{e.onProgress?.({kind:"text",summary:i.slice(0,120)}),e.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(Lg(s));return{text:s.text.trim(),sessionId:s.sessionId??e.sessionId,durationMs:Date.now()-n}}function Og(t){let e=["run"];return t.model&&e.push("--model",t.model),t.sessionId&&e.push("--session",t.sessionId),t.formatJson&&e.push("--format","json"),t.effort&&e.push("--effort",t.effort),e.push(...vn("lmplayer",t.permissionMode)??[]),e.push("--",t.prompt),e}function Lg(t){if(t.error)return t.error;let e=lo(t.stderr).trim();return e?e.slice(0,500):`exit code ${t.code}`}function Cg(t,e,n){return new Promise((r,s)=>{let i;try{i=AC(t,e,{cwd:n.cwd,env:n.env,stdio:["ignore","pipe","pipe"]})}catch(y){s(y);return}let o="",a="",l="",c,u,d,f=[],m=!1,p=n.timeoutMs===void 0?void 0:setTimeout(()=>{m||(m=!0,i.kill(),h(),s(new Error(`lmplayer seed timed out after ${n.timeoutMs}ms`)))},n.timeoutMs),h=()=>{p!==void 0&&clearTimeout(p)},_=y=>{let g=y.trim();if(!g)return;let w;try{w=JSON.parse(g)}catch{f.push(y),n.onText?.(y);return}if(!Cr(w))return;let v=ko(w,!1);c===void 0&&v!==void 0&&(c=v),u=ko(w,!0)??u,d===void 0&&(d=OC(w));let N=$g(w);N&&(f.push(N),n.onText?.(N))};i.stdout?.on("data",y=>{let g=y.toString("utf8");o+=g,l+=g;let w=l.indexOf(`
1569
+ `);for(;w>=0;){let v=l.slice(0,w);l=l.slice(w+1),_(v),w=l.indexOf(`
1570
1570
  `)}}),i.stderr?.on("data",y=>{a+=y.toString("utf8")}),n.signal&&(n.signal.aborted?i.kill():n.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",y=>{m||(m=!0,h(),l.length>0&&_(l),r({code:y,stdout:o,stderr:a,sessionId:c??u,text:f.join(""),error:d}))}),i.on("error",y=>{m||(m=!0,h(),s(y))})})}function OC(t){let e=t.error;if(typeof e=="string"&&e.length>0)return e;if(Cr(e)){let n=e.data;if(Cr(n)&&typeof n.message=="string"&&n.message.length>0)return typeof e.name=="string"?`${e.name}: ${n.message}`:n.message;if(typeof e.message=="string"&&e.message.length>0)return e.message}}function $g(t){for(let e of["text","content","delta","output","message"]){let n=t[e];if(typeof n=="string")return n}for(let e of["data","event","payload","part"]){let n=t[e];if(Cr(n)){let r=$g(n);if(r)return r}}}function ko(t,e){for(let r of["sessionID","sessionId","session_id"]){let s=t[r];if(typeof s=="string"&&s.length>0)return s}let n=t.session;if(typeof n=="string"&&n.length>0)return n;if(Cr(n)){let r=ko(n,e);if(r!==void 0)return r}if(e){let r=t.id;if(typeof r=="string"&&r.length>0)return r}for(let r of["data","event","payload","part"]){let s=t[r];if(Cr(s)){let i=ko(s,e);if(i!==void 0)return i}}}function Cr(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Id,Ad=E(()=>{"use strict";gd();bt();ut();zn();St();Cc();Id=class extends be{constructor(e){super({provider:new Lr({providerName:"lmplayer",startCommand:"lmplayer",dbPath:e?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",_e],resumeTemplate:"lmplayer tui --session {{session_id}}",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:RC})}seedArgsFor(e){return Og({prompt:e?.prompt??_e,model:e?.model,effort:e?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(e,n){xC(e,{recursive:!0});let r=this.seedArgsFor(n);tt("lmplayer",r);try{let s=await Cg(this.binary,r,{cwd:e,env:Tn(void 0,e),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:Lg(s)}: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(e){return{launchCommand:`cd ${e} && lmplayer run --format json --dangerously-skip-permissions "${_e}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${e}`}}}});import{readdir as Io,readFile as LC,rm as CC}from"node:fs/promises";import{basename as Mg,join as Nn}from"node:path";function $C(){return{observed:!1,totalInputTokens:0,totalCachedInputTokens:0,totalOutputTokens:0,totalReasoningOutputTokens:0}}function Fs(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function MC(t,e){if(!e)return;t.observed=!0;let n=Fs(e.promptTokenCount),r=Fs(e.cachedContentTokenCount),s=Fs(e.candidatesTokenCount),i=Fs(e.thoughtsTokenCount);t.totalInputTokens+=n,t.totalCachedInputTokens+=r,t.totalOutputTokens+=s,t.totalReasoningOutputTokens+=i,t.lastInputTokens=n,t.lastTokenUsage={inputTokens:Math.max(n-r,0),cachedInputTokens:r,outputTokens:s,reasoningOutputTokens:i,totalTokens:Fs(e.totalTokenCount)||n+s}}function DC(t){return{totalInputTokens:t.observed?t.totalInputTokens:void 0,totalCachedInputTokens:t.observed?t.totalCachedInputTokens:void 0,totalOutputTokens:t.observed?t.totalOutputTokens:void 0,totalReasoningOutputTokens:t.observed?t.totalReasoningOutputTokens:void 0,lastInputTokens:t.lastInputTokens,lastTokenUsage:t.lastTokenUsage}}function Dg(t){return t.type==="user"||t.message?.role==="user"}function jg(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function Pg(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(n=>n.type==="text").map(n=>n.text||"").join(`
1571
1571
  `):Array.isArray(e.parts)?e.parts.filter(n=>!n.thought&&n.type!=="thinking").map(n=>n.text||"").join(`
1572
- `):"":""}function Fg(t){return t.model||t.message?.model}function jC(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Wg(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Us(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function PC(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Us(e.output??e.error??t)}return Us(t)}function Wg(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Ug(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Us(t.args,!0),toolInputData:Wt(t.args),toolCallId:t.id,model:n}}var No,qg=E(()=>{"use strict";qt();No=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Nn(we,".qwen")}async discoverSessions(){let e=Nn(this.baseDir,"projects"),n;try{n=await Io(e)}catch{return[]}let r=[];for(let s of n){let i=Nn(e,s,"chats"),o;try{o=await Io(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Nn(i,a);try{let u=await this.extractSummary(c,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=await Ke(e,30);if(r.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,u=0;for(let d of r){if(d.cwd&&(i=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(i=d.cwd,d.version&&(a=d.version),d.model&&(o=d.model)),Dg(d)){let f=Pg(d).trim();f&&(l||(l=G(f,80)),c=G(f,80),u++)}if(jg(d)){let f=Fg(d);f&&(o=f),u+=jC(d)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Mg(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,u,d=[],f=$C();for await(let m of He(e)){if(MC(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,h=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let _=Wg(m).filter(y=>y.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&d.push({role:"tool_result",timestamp:h,content:Us(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let y of _){let g=y.functionResponse,w=PC(g.response),S=Us(m.toolCallResult?.resultDisplay);d.push({role:"tool_result",timestamp:h,content:S??w??m.toolCallResult?.status??"tool result",toolName:g.name,toolCallId:m.toolCallResult?.callId??g.id,...w!==void 0?{toolDetailedContent:w}:{}})}}else if(Dg(m)){let _=Pg(m);_.trim()&&(c||(c=G(_.trim(),80)),u=G(_.trim(),80)),d.push({role:"user",timestamp:h,content:_})}else if(jg(m)){let _=Fg(m);if(_&&(i=_),Array.isArray(p.content))for(let y of p.content)y.type==="text"&&y.text?d.push({role:"assistant",timestamp:h,content:y.text,model:_}):y.type==="thinking"&&y.thinking?d.push({role:"thinking",timestamp:h,content:y.thinking}):y.functionCall&&d.push(Ug(y.functionCall,h,_));else if(typeof p.content=="string")d.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let y of p.parts)if(y.thought||y.type==="thinking"){let g=y.thinking||y.text;g&&d.push({role:"thinking",timestamp:h,content:g})}else y.functionCall?d.push(Ug(y.functionCall,h,_)):y.text&&d.push({role:"assistant",timestamp:h,content:y.text,model:_})}}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:u,messageCount:d.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...DC(f),messages:d}}async resolveSessionPath(e){let n=Nn(this.baseDir,"projects");try{let r=await Io(n),s=[];for(let i of r){let o=Nn(n,i,"chats",`${e}.jsonl`);try{return await LC(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=Nn(n,i,"chats"),a;try{a=await Io(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Mg(l,".jsonl").startsWith(e)&&s.push(Nn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await CC(n),!0}catch{return!1}}}});function Rd(){return new xd}var xd,Od=E(()=>{"use strict";qg();bt();kn();ut();xd=class extends be{constructor(){super({provider:new No,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",_e,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:go})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as Bg,readFile as Hg,rm as Xg,stat as Jg}from"node:fs/promises";import{basename as Ld,join as Bt}from"node:path";import{fileURLToPath as FC}from"node:url";async function UC(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function WC(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function Gg(t){return t.type==="USER_INPUT"}function Kg(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function qC(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Vg(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Yg(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function BC(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function HC(t){for await(let e of He(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=XC(s);if(i)return i}let r=JC(e.content);if(r)return r}return null}function XC(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function JC(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function GC(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function KC(t,e){let n=new Set;for(let r of e){let s=VC(t,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 VC(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:QC(n.event.content);if(r!==void 0)return zg(t.filter(i=>!e.has(i)&&e$(i)===r),n.event.step_index);let s=ZC(n.event);if(s!==void 0)return zg(t.filter(i=>!e.has(i)&&YC(i.name,n.event.type)&&Qg(zC(i))===s),n.event.step_index)}function zg(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function YC(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function zC(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function ZC(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),Qg(e)}function Qg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return FC(e)}catch{return}}function QC(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function e$(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function Zg(t){if(t.endsWith(".db"))return Ld(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var Ao,ey=E(()=>{"use strict";qt();Ao=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Bt(we,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Bt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Bt(this.baseDir,"conversations"),n;try{n=await Bg(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Ld(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return Bt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return Bt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Jg(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await UC([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,u=0;if(r){let d=await Ke(r,80);for(let f of d){let m=Yg(f.content);if(m&&(a=m),Gg(f)){let p=Vg(f.content).trim();p&&(l||(l=G(p,80)),c=G(p,80)),u++}else Kg(f)&&f.content&&u++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Zg(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,u=[],d=[];if(i)for await(let f of He(i)){let m=WC(f.created_at,s.modifiedAt),p=Yg(f.content);if(p&&(a=p),Gg(f)){let h=Vg(f.content),_=h.trim();_&&(l||(l=G(_,80)),c=G(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",y=BC(h.args),g=Wt(h.args),w={role:"tool_use",timestamp:m,content:y,toolName:_,toolInput:y,toolInputData:g};o.push(w),u.push({name:_,stepIndex:f.step_index,input:g,message:w})}if(Kg(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(qC(f)&&f.content){let h=GC(f,r),_=h===void 0?null:await this.readTaskLog(r,h),y={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(y),d.push({event:f,message:y})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return KC(u,d),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await Jg(n),n}catch{}let r=Bt(this.baseDir,"conversations");try{let s=[];for(let i of await Bg(r)){if(!i.endsWith(".db"))continue;Ld(i,".db").startsWith(e)&&s.push(Bt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=Zg(n);return r?(await Xg(this.conversationPath(r),{force:!0}),await Xg(Bt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await HC(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=Bt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Hg(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=Bt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Hg(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as t$}from"node:child_process";function $d(t){return new Cd(t)}async function n$(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",s$(e.timeoutMs)];e.model&&r.push("--model",e.model),tt("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await r$(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-n}}function r$(t,e,n){return new Promise((r,s)=>{let i;try{i=t$(t,e,{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,u)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function s$(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Cd,Md=E(()=>{"use strict";ey();bt();ut();St();zn();Cd=class extends be{constructor(e){super({provider:new Ao(e),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",_e,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:n$})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import i$ from"node:zlib";function p$(t,e){return t[e]===a$&&t[e+1]===l$&&t[e+2]===c$&&t[e+3]===d$}function ty(t,e){return(t[e]&240)===80&&t[e+1]===u$&&t[e+2]===f$&&t[e+3]===m$}function _$(t,e){if(ty(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!p$(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,u=(c&1)!==0,d=c>>1&3,f=c>>3;if(n+=3,d===3||(n+=d===1?1:f,n>t.length))return;if(u)break}if(o&&(n+=4),!(n>t.length))return n-e}}function h$(t){let e=[],n=0;for(;n+4<=t.length;){let r=_$(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function xo(t){let e=[];for(let n of h$(t))ty(n,0)||e.push(o$(n).toString("utf8"));return e.join("")}var o$,a$,l$,c$,d$,u$,f$,m$,Dd=E(()=>{"use strict";o$=i$.zstdDecompressSync,a$=40,l$=181,c$=47,d$=253,u$=42,f$=77,m$=24});import{readdir as jd,rm as g$,stat as y$}from"node:fs/promises";import{join as An}from"node:path";function w$(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Pd(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function E$(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function ny(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Pd(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of E$(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Pd(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Pd(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function T$(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function ry(t,e,n){let r=t.find(m=>m.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),d=l.length>0?new Date(Math.max(...l)):u,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:d,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...v$(t)}}function v$(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let u=Ro(c.inputTokens),d=Ro(c.cacheReadTokens),f=Ro(c.outputTokens),m=Ro(c.reasoningTokens);n+=u,r+=d,s+=f,i+=m,o=u+d,a={inputTokens:u,cachedInputTokens:d,outputTokens:f,reasoningOutputTokens:m,totalTokens:u+d+f}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function Ro(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var Oo,sy=E(()=>{"use strict";qt();Dd();Oo=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||An(we,".dsh");this.sessionsDir=An(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await jd(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await jd(An(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=ny(r),i=ry(r,n.filePath,s);return i?{...i,turnStatus:T$(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await g$(An(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return An(this.sessionsDir,w$(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await jd(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=An(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await y$(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=An(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=xo(i),a=[];for(let l of o.split(`
1572
+ `):"":""}function Fg(t){return t.model||t.message?.model}function jC(t){let e=t.message?.content;return typeof e=="string"?e.length>0?1:0:Wg(t).filter(n=>!n.thought&&n.type!=="thinking"&&typeof n.text=="string"&&n.text.length>0).length}function Us(t,e=!1){if(t!==void 0){if(typeof t=="string")return t;try{return JSON.stringify(t,null,e?2:void 0)}catch{return String(t)}}}function PC(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t;return Us(e.output??e.error??t)}return Us(t)}function Wg(t){return Array.isArray(t.message?.content)?t.message.content:t.message?.parts??[]}function Ug(t,e,n){let r=t.name||"tool";return{role:"tool_use",timestamp:e,content:r,toolName:r,toolInput:Us(t.args,!0),toolInputData:Wt(t.args),toolCallId:t.id,model:n}}var No,qg=E(()=>{"use strict";qt();No=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||Nn(we,".qwen")}async discoverSessions(){let e=Nn(this.baseDir,"projects"),n;try{n=await Io(e)}catch{return[]}let r=[];for(let s of n){let i=Nn(e,s,"chats"),o;try{o=await Io(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=Nn(i,a);try{let u=await this.extractSummary(c,l);u&&r.push(u)}catch{}}}return r}async extractSummary(e,n){let r=await Ke(e,30);if(r.length===0)return null;let s=await Le(e),i="(unknown)",o,a,l,c,u=0;for(let d of r){if(d.cwd&&(i=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(i=d.cwd,d.version&&(a=d.version),d.model&&(o=d.model)),Dg(d)){let f=Pg(d).trim();f&&(l||(l=K(f,80)),c=K(f,80),u++)}if(jg(d)){let f=Fg(d);f&&(o=f),u+=jC(d)}}return{provider:"qwen",sessionId:n,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Mg(n,".jsonl");return this.loadFromFile(n,r)}async loadFromFile(e,n){let r=await Le(e),s="(unknown)",i,o,a,l,c,u,d=[],f=$C();for await(let m of He(e)){if(MC(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,h=m.timestamp?new Date(m.timestamp):r.modifiedAt;if(m.type==="tool_result"){let _=Wg(m).filter(y=>y.functionResponse!==void 0);_.length===0&&m.toolCallResult?.callId&&d.push({role:"tool_result",timestamp:h,content:Us(m.toolCallResult.resultDisplay??m.toolCallResult.error??m.toolCallResult.status)??"tool result",toolCallId:m.toolCallResult.callId});for(let y of _){let g=y.functionResponse,w=PC(g.response),v=Us(m.toolCallResult?.resultDisplay);d.push({role:"tool_result",timestamp:h,content:v??w??m.toolCallResult?.status??"tool result",toolName:g.name,toolCallId:m.toolCallResult?.callId??g.id,...w!==void 0?{toolDetailedContent:w}:{}})}}else if(Dg(m)){let _=Pg(m);_.trim()&&(c||(c=K(_.trim(),80)),u=K(_.trim(),80)),d.push({role:"user",timestamp:h,content:_})}else if(jg(m)){let _=Fg(m);if(_&&(i=_),Array.isArray(p.content))for(let y of p.content)y.type==="text"&&y.text?d.push({role:"assistant",timestamp:h,content:y.text,model:_}):y.type==="thinking"&&y.thinking?d.push({role:"thinking",timestamp:h,content:y.thinking}):y.functionCall&&d.push(Ug(y.functionCall,h,_));else if(typeof p.content=="string")d.push({role:"assistant",timestamp:h,content:p.content,model:_});else if(Array.isArray(p.parts))for(let y of p.parts)if(y.thought||y.type==="thinking"){let g=y.thinking||y.text;g&&d.push({role:"thinking",timestamp:h,content:g})}else y.functionCall?d.push(Ug(y.functionCall,h,_)):y.text&&d.push({role:"assistant",timestamp:h,content:y.text,model:_})}}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:u,messageCount:d.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...DC(f),messages:d}}async resolveSessionPath(e){let n=Nn(this.baseDir,"projects");try{let r=await Io(n),s=[];for(let i of r){let o=Nn(n,i,"chats",`${e}.jsonl`);try{return await LC(o,{flag:"r"}),o}catch{continue}}for(let i of r){let o=Nn(n,i,"chats"),a;try{a=await Io(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Mg(l,".jsonl").startsWith(e)&&s.push(Nn(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;try{return await CC(n),!0}catch{return!1}}}});function Rd(){return new xd}var xd,Od=E(()=>{"use strict";qg();bt();kn();ut();xd=class extends be{constructor(){super({provider:new No,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",_e,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:go})}seedArgsFor(e){let n=super.seedArgsFor(e);return e?.model?[...n,"--model",e.model]:n}}});import{readdir as Bg,readFile as Hg,rm as Xg,stat as Jg}from"node:fs/promises";import{basename as Ld,join as Bt}from"node:path";import{fileURLToPath as FC}from"node:url";async function UC(t){let e=await Promise.all(t.map(n=>Le(n)));return{createdAt:new Date(Math.min(...e.map(n=>n.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(n=>n.modifiedAt.getTime())))}}function WC(t,e){if(!t)return e;let n=new Date(t);return Number.isNaN(n.getTime())?e:n}function Gg(t){return t.type==="USER_INPUT"}function Kg(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function qC(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function Vg(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function Yg(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function BC(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function HC(t){for await(let e of He(t)){let n=e.tool_calls?.map(s=>s.args)??[];for(let s of n){let i=XC(s);if(i)return i}let r=JC(e.content);if(r)return r}return null}function XC(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,n=e.Cwd??e.cwd??e.DirectoryPath;return typeof n!="string"?null:n.replace(/^"|"$/g,"")}function JC(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function GC(t,e){if(t.status!=="RUNNING"||!t.content)return;let n=/task id:\s*([^/\s]+)\/(task-(\d+))\b/.exec(t.content);if(!(!n||n[1]!==e)&&!(t.step_index===void 0||Number(n[3])!==t.step_index))return n[2]}function KC(t,e){let n=new Set;for(let r of e){let s=VC(t,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 VC(t,e,n){let r=n.message.backgroundTaskId===void 0?void 0:QC(n.event.content);if(r!==void 0)return zg(t.filter(i=>!e.has(i)&&e$(i)===r),n.event.step_index);let s=ZC(n.event);if(s!==void 0)return zg(t.filter(i=>!e.has(i)&&YC(i.name,n.event.type)&&Qg(zC(i))===s),n.event.step_index)}function zg(t,e){if(t.length===0)return;if(t.length===1)return t[0];if(e===void 0)return;let n=t.map(r=>({call:r,distance:r.stepIndex===void 0?Number.POSITIVE_INFINITY:Math.abs(e-r.stepIndex)})).sort((r,s)=>r.distance-s.distance);return n[0].distance<n[1].distance?n[0].call:void 0}function YC(t,e){return e==="VIEW_FILE"?t==="view_file":e!=="CODE_ACTION"?!1:t==="write_to_file"||t==="replace_file_content"||t==="multi_replace_file_content"}function zC(t){let e=t.name==="view_file"?t.input?.AbsolutePath:t.input?.TargetFile;return typeof e=="string"?e:void 0}function ZC(t){if(!t.content)return;let e;return t.type==="VIEW_FILE"?e=/File Path:\s*`?([^`\n]+)`?/.exec(t.content)?.[1]:t.type==="CODE_ACTION"&&(e=/Created file\s+(.+?)\s+with requested content/.exec(t.content)?.[1]??/changes were made by .*? tool to:\s*(.+?)\.\s*(?:If relevant|$)/s.exec(t.content)?.[1]),Qg(e)}function Qg(t){if(!t)return;let e=t.trim().replace(/^`|`$/g,"");if(!e.startsWith("file://"))return e;try{return FC(e)}catch{return}}function QC(t){if(t)return/Task Description:\s*([^\n]+)/.exec(t)?.[1]?.trim()}function e$(t){if(t.name==="run_command"){let e=t.input?.CommandLine;return typeof e=="string"?e:void 0}if(t.name==="schedule"){let e=t.input?.DurationSeconds,n=t.input?.Prompt;return typeof e!="string"&&typeof e!="number"||typeof n!="string"?void 0:`Timer: ${e}s, Prompt: ${n}`}}function Zg(t){if(t.endsWith(".db"))return Ld(t,".db");let e="/brain/",n=t.indexOf(e);return n===-1?null:t.slice(n+e.length).split("/")[0]||null}var Ao,ey=E(()=>{"use strict";qt();Ao=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||Bt(we,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:Bt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=Bt(this.baseDir,"conversations"),n;try{n=await Bg(e)}catch{return[]}let r=[];for(let s of n){if(!s.endsWith(".db"))continue;let i=Ld(s,".db");try{let o=await this.extractSummary(i);o&&r.push(o)}catch{}}return r}conversationPath(e){return Bt(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e,n){return Bt(this.baseDir,"brain",e,".system_generated","logs",n?"transcript_full.jsonl":"transcript.jsonl")}async existingTranscriptPath(e){for(let n of[this.transcriptPath(e,!0),this.transcriptPath(e,!1)])try{return await Jg(n),n}catch{}return null}async extractSummary(e){let n=this.conversationPath(e),r=await this.existingTranscriptPath(e),s=r??n,i=await UC([n,r].filter(Boolean)),o=await this.resolveCwd(e,r),a,l,c,u=0;if(r){let d=await Ke(r,80);for(let f of d){let m=Yg(f.content);if(m&&(a=m),Gg(f)){let p=Vg(f.content).trim();p&&(l||(l=K(p,80)),c=K(p,80)),u++}else Kg(f)&&f.content&&u++}}return{provider:"agy",sessionId:e,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:r?[n,r]:[n]}}async loadSession(e){let n=await this.resolveSessionPath(e);if(!n)return null;let r=Zg(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,u=[],d=[];if(i)for await(let f of He(i)){let m=WC(f.created_at,s.modifiedAt),p=Yg(f.content);if(p&&(a=p),Gg(f)){let h=Vg(f.content),_=h.trim();_&&(l||(l=K(_,80)),c=K(_,80)),o.push({role:"user",timestamp:m,content:h});continue}if(Array.isArray(f.tool_calls))for(let h of f.tool_calls){let _=h.name||"tool",y=BC(h.args),g=Wt(h.args),w={role:"tool_use",timestamp:m,content:y,toolName:_,toolInput:y,toolInputData:g};o.push(w),u.push({name:_,stepIndex:f.step_index,input:g,message:w})}if(Kg(f)&&f.content)o.push({role:"assistant",timestamp:m,content:f.content,model:a});else if(qC(f)&&f.content){let h=GC(f,r),_=h===void 0?null:await this.readTaskLog(r,h),y={role:"tool_result",timestamp:_?.modifiedAt??m,content:f.content,toolName:f.type?.toLowerCase(),backgroundTaskId:h,..._===null?{}:{toolDetailedContent:_.content}};o.push(y),d.push({event:f,message:y})}f.thinking&&o.push({role:"thinking",timestamp:m,content:f.thinking})}return KC(u,d),{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.filter(f=>f.role==="user"||f.role==="assistant").length,messages:o}}async resolveSessionPath(e){let n=this.conversationPath(e);try{return await Jg(n),n}catch{}let r=Bt(this.baseDir,"conversations");try{let s=[];for(let i of await Bg(r)){if(!i.endsWith(".db"))continue;Ld(i,".db").startsWith(e)&&s.push(Bt(r,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let n=await this.resolveSessionPath(e);if(!n)return!1;let r=Zg(n);return r?(await Xg(this.conversationPath(r),{force:!0}),await Xg(Bt(this.baseDir,"brain",r),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,n){let r=await this.cwdFromLastConversationCache(e);if(r)return r;if(n){let s=await HC(n);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let n=Bt(this.baseDir,"cache","last_conversations.json");try{let r=JSON.parse(await Hg(n,"utf8"));for(let[s,i]of Object.entries(r))if(i===e)return s}catch{}return null}async readTaskLog(e,n){if(!/^task-\d+$/.test(n))return null;let r=Bt(this.baseDir,"brain",e,".system_generated","tasks",`${n}.log`);try{let[s,i]=await Promise.all([Hg(r,"utf8"),Le(r)]);return{content:s,modifiedAt:i.modifiedAt}}catch{return null}}}});import{spawn as t$}from"node:child_process";function $d(t){return new Cd(t)}async function n$(t,e){let n=Date.now(),r=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",s$(e.timeoutMs)];e.model&&r.push("--model",e.model),tt("agy",r,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await r$(e.binary,r,{cwd:e.cwd,env:Ve(e.env,e.cwd,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-n}}function r$(t,e,n){return new Promise((r,s)=>{let i;try{i=t$(t,e,{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,u)=>{if(n.signal?.removeEventListener("abort",l),c===0){r({stdout:o,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function s$(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Cd,Md=E(()=>{"use strict";ey();bt();ut();St();zn();Cd=class extends be{constructor(e){super({provider:new Ao(e),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",_e,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:n$})}seedArgsFor(e){let n=[...super.seedArgsFor(e)];return e?.model&&n.push("--model",e.model),n}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import i$ from"node:zlib";function p$(t,e){return t[e]===a$&&t[e+1]===l$&&t[e+2]===c$&&t[e+3]===d$}function ty(t,e){return(t[e]&240)===80&&t[e+1]===u$&&t[e+2]===f$&&t[e+3]===m$}function _$(t,e){if(ty(t,e))return e+8>t.length?void 0:8+t.readUInt32LE(e+4);if(!p$(t,e))return;let n=e+4;if(n+1>t.length)return;let r=t[n];n+=1;let s=r>>6,i=(r&32)!==0,o=(r&4)!==0,a=r&3;i||(n+=1),n+=[0,1,2,4][a];let l=s===0?i?1:0:[2,4,8][s-1];if(n+=l,!(n>t.length)){for(;;){if(n+3>t.length)return;let c=t[n]|t[n+1]<<8|t[n+2]<<16,u=(c&1)!==0,d=c>>1&3,f=c>>3;if(n+=3,d===3||(n+=d===1?1:f,n>t.length))return;if(u)break}if(o&&(n+=4),!(n>t.length))return n-e}}function h$(t){let e=[],n=0;for(;n+4<=t.length;){let r=_$(t,n);if(r===void 0||r<=0)break;e.push(t.subarray(n,n+r)),n+=r}return e}function xo(t){let e=[];for(let n of h$(t))ty(n,0)||e.push(o$(n).toString("utf8"));return e.join("")}var o$,a$,l$,c$,d$,u$,f$,m$,Dd=E(()=>{"use strict";o$=i$.zstdDecompressSync,a$=40,l$=181,c$=47,d$=253,u$=42,f$=77,m$=24});import{readdir as jd,rm as g$,stat as y$}from"node:fs/promises";import{join as An}from"node:path";function w$(t){return"--"+t.replace(/^\/+|\/+$/g,"").replace(/\//g,"-")+"--"}function Pd(t){if(typeof t=="string")return t;if(!Array.isArray(t))return"";let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="text"&&typeof n.text=="string"&&e.push(n.text);return e.join("")}function E$(t){if(!Array.isArray(t))return[];let e=[];for(let n of t)n&&typeof n=="object"&&n.type==="reasoning"&&typeof n.text=="string"&&e.push(n.text);return e}function ny(t){let e=[];for(let n of t){let r=n.data??{},s=n.time?new Date(n.time):new Date(0);if(n.type==="user/message"){let i=r;if(i.source?.kind!==void 0&&i.source.kind!=="user")continue;e.push({role:"user",timestamp:s,content:Pd(i.content)})}else if(n.type==="assistant/message"){let i=r.message;for(let o of E$(i?.content))e.push({role:"thinking",timestamp:s,content:o});e.push({role:"assistant",timestamp:s,content:Pd(i?.content),model:i?.source?.model})}else if(n.type==="tool/call"){let i=r,o;if(typeof i.arguments=="string")try{o=JSON.parse(i.arguments)}catch{}else i.arguments&&typeof i.arguments=="object"&&(o=i.arguments);e.push({role:"tool_use",timestamp:s,content:typeof i.arguments=="string"?i.arguments:JSON.stringify(i.arguments??{}),toolName:i.name,toolCallId:i.callId,toolInputData:o})}else if(n.type==="tool/result"){let i=r,a=(Array.isArray(i.message?.content)?i.message.content:[])[0];e.push({role:"tool_result",timestamp:s,content:Pd(a?.content??i.message?.content),toolCallId:a?.toolCallId??i.message?.source?.callId})}}return e}function T$(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.type==="turn/end")return n.data?.reason?.kind==="completed"?"complete":"aborted";if(n.type==="turn/start")return"in_progress"}}function ry(t,e,n){let r=t.find(m=>m.type==="session");if(!r)return null;let s=r,i=r.data,o=s.id??i?.id;if(!o)return null;let a;for(let m of t)if(m.type==="request/header"){let p=m.data?.header;p?.config?.model&&(a=p.config.model)}let l=t.map(m=>m.time).filter(m=>typeof m=="number"),c=s.createdAt??i?.createdAt,u=c?new Date(c):new Date(0),d=l.length>0?new Date(Math.max(...l)):u,f=n.filter(m=>m.role==="user");return{provider:"dsh",sessionId:o,cwd:s.cwd??i?.cwd??"",createdAt:u,modifiedAt:d,model:a,firstUserMessage:f[0]?.content,lastUserMessage:f.at(-1)?.content,messageCount:n.filter(m=>m.role==="user"||m.role==="assistant").length,filePath:e,...v$(t)}}function v$(t){let e=!1,n=0,r=0,s=0,i=0,o,a;for(let l of t){if(l.type!=="assistant/message")continue;let c=l.data?.usage;if(!c)continue;e=!0;let u=Ro(c.inputTokens),d=Ro(c.cacheReadTokens),f=Ro(c.outputTokens),m=Ro(c.reasoningTokens);n+=u,r+=d,s+=f,i+=m,o=u+d,a={inputTokens:u,cachedInputTokens:d,outputTokens:f,reasoningOutputTokens:m,totalTokens:u+d+f}}return{totalInputTokens:e?n:void 0,totalCachedInputTokens:e?r:void 0,totalOutputTokens:e?s:void 0,totalReasoningOutputTokens:e?i:void 0,lastInputTokens:o,lastTokenUsage:a}}function Ro(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}var Oo,sy=E(()=>{"use strict";qt();Dd();Oo=class{name="dsh";sessionsDir;constructor(e={}){let n=e.dshHome||An(we,".dsh");this.sessionsDir=An(n,"sessions")}async discoverSessions(){let e=[],n;try{n=await jd(this.sessionsDir)}catch{return[]}for(let r of n){let s;try{s=await jd(An(this.sessionsDir,r))}catch{continue}for(let i of s)if(i.startsWith("session-"))try{let o=await this.readSummary(r,i);o&&e.push(o)}catch{}}return e}async loadSession(e){let n=await this.findSessionDir(e);if(!n)return null;let r=await this.readRecords(n.cwdDir,n.sessionDir);if(r.length===0)return null;let s=ny(r),i=ry(r,n.filePath,s);return i?{...i,turnStatus:T$(r),messages:s}:null}async resolveSessionPath(e){return(await this.findSessionDir(e))?.filePath??null}async deleteSession(e){let n=await this.findSessionDir(e);return n?(await g$(An(this.sessionsDir,n.cwdDir,n.sessionDir),{recursive:!0,force:!0}),!0):!1}sessionFilePath(e,n){return An(this.sessionsDir,w$(e),n,"session.jsonl.zstd")}async findSessionDir(e){let n;try{n=await jd(this.sessionsDir)}catch{return null}for(let r of n){let s=e,i=An(this.sessionsDir,r,s,"session.jsonl.zstd");try{return await y$(i),{cwdDir:r,sessionDir:s,filePath:i}}catch{}}return null}async readRecords(e,n){let{readFile:r}=await import("node:fs/promises"),s=An(this.sessionsDir,e,n,"session.jsonl.zstd"),i=await r(s),o=xo(i),a=[];for(let l of o.split(`
1573
1573
  `))if(l.trim())try{let c=JSON.parse(l);if(c.type?.endsWith("-chunks")||c.type==="assistant/chunk")continue;a.push(c)}catch{}return a}async readSummary(e,n){let r=await this.readRecords(e,n);if(r.length===0)return null;let s=An(this.sessionsDir,e,n,"session.jsonl.zstd");return ry(r,s,ny(r))}}});import{spawn as S$}from"node:child_process";async function Ud(t,e=n=>Fd.spawn(n)){if(xn){let n=await xn.catch(()=>{});if(n?.alive)return n;xn=void 0}return xn=e(t),xn}async function Wd(){if(!xn)return;(await xn.catch(()=>{}))?.shutdown(),xn=void 0}var b$,iy,$r,Fd,xn,oy=E(()=>{"use strict";b$=/dsh web:\s*(https?:\/\/\S+)/,iy=2e4,$r=class t extends Error{method;detail;constructor(e,n){super(`dsh RPC ${e} failed: ${JSON.stringify(n)}`),this.name="DshRpcCallError",this.method=e,this.detail=n,Object.setPrototypeOf(this,t.prototype)}},Fd=class t{baseUrl;child;constructor(e,n){this.baseUrl=e,this.child=n}static forTesting(e){return new t(e,void 0)}async rpc(e,n){let r=`${e}-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,s;try{s=await fetch(`${this.baseUrl}/api/${e}`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({type:"client-request",rpcId:r,method:e,payload:n})})}catch(a){throw new $r(e,`transport error: ${a instanceof Error?a.message:String(a)}`)}let i;try{i=await s.json()}catch{i=void 0}if(!s.ok)throw new $r(e,i??s.statusText);let o=i&&typeof i=="object"?i.result:void 0;if(!o||typeof o!="object"||typeof o.ok!="boolean")throw new $r(e,"malformed response: HTTP 200 but body is not a well-formed {result:{ok,\u2026}} envelope");if(o.ok===!1)throw new $r(e,o.error??o);return"value"in o?o.value:void 0}get alive(){return this.child!==void 0&&this.child.exitCode===null&&this.child.signalCode===null}shutdown(){this.child!==void 0&&this.alive&&this.child.kill("SIGTERM")}static spawn(e){return new Promise((n,r)=>{let s=S$("dsh",["web","--no-open","--port","0"],{env:e,stdio:["ignore","pipe","pipe"]}),i=!1,o="",a="",l=setTimeout(()=>{i||(i=!0,s.kill("SIGTERM"),r(new Error(`dsh web sidecar did not report a boot URL within ${iy}ms (stdout: ${o.slice(0,500)}; stderr: ${a.slice(0,500)})`)))},iy);s.stdout?.on("data",c=>{if(o+=c.toString(),i)return;let u=b$.exec(o);u&&(i=!0,clearTimeout(l),n(new t(u[1],s)))}),s.stderr?.on("data",c=>{a+=c.toString()}),s.on("error",c=>{i||(i=!0,clearTimeout(l),r(c))}),s.on("exit",(c,u)=>{if(i)return;i=!0,clearTimeout(l);let d=u?`signal ${u}`:`exit code ${c}`;r(new Error(`dsh web exited before reporting a boot URL (${d}): ${a.slice(0,500)}`))})})}}});import{randomUUID as k$}from"node:crypto";import{readFile as I$,mkdir as N$}from"node:fs/promises";function Bd(t){return new qd(t)}function ly(t){return{...t,DSH_PERMISSION_MODE:t.DSH_PERMISSION_MODE??"danger-full-access"}}function Lo(t){return t instanceof Error?t.message:String(t)}async function x$(t){let e=await cy(t),n=-1;for(let r of e)r.type==="turn/end"&&typeof r.seq=="number"&&r.seq>n&&(n=r.seq);return n}async function cy(t){let e;try{e=await I$(t)}catch{return[]}let n=xo(e),r=[];for(let s of n.split(`
1574
1574
  `))if(s.trim())try{let i=JSON.parse(s);i!==null&&typeof i=="object"&&!Array.isArray(i)&&r.push(i)}catch{}return r}function R$(t){let n=t.data?.message?.content;if(typeof n=="string")return n;if(!Array.isArray(n))return"";let r=[];for(let s of n)s&&typeof s=="object"&&s.type==="text"&&typeof s.text=="string"&&r.push(s.text);return r.join("")}var A$,ay,qd,Hd=E(()=>{"use strict";bt();sy();Dd();oy();ut();zn();A$=500,ay=8*60*60*1e3;qd=class extends be{dshProvider;constructor(e){let n=new Oo(e);super({provider:n,capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"dsh has no in-session leader-injection mechanism; the seed prompt carries lmctl's leader instructions."},binary:"dsh",seedArgs:[],resumeTemplate:"dsh web --no-open --port 0 # continuity is via the RPC sidecar, not a resume flag",startTemplate:"dsh web --no-open --port 0",transport:(r,s)=>this.dshPromptTurn(r,s)}),this.dshProvider=n}manualSeedHint(e){return{launchCommand:`cd ${e} && dsh web`,postLaunchNote:"dsh has no interactive terminal session to seed into \u2014 continuity lives in the web profile's session store, not a TTY. Boot the sidecar with the command above, open the printed http:// URL, and start a session rooted at this directory in the web UI; lmctl's managed sidecar can then cold-resume it by id (cross-profile session sharing is verified). Send lmctl's seed instruction there, wait for the reply, then find the new session id with the ls command below and register it manually.",lsCommand:`lmctl ls --provider dsh --sessiondir ${e}`}}async seed(e,n){await N$(e,{recursive:!0});let r=`session-${k$()}`,s=ly(process.env);tt("dsh",[],"yolo");try{let i;try{i=await Ud(s)}catch(a){return{success:!1,error:`dsh sidecar failed to start: ${Lo(a)}`}}try{await i.rpc("session.create",{sessionId:r,cwd:e})}catch(a){return{success:!1,error:`session.create failed: ${Lo(a)}`}}if(n?.model)try{await i.rpc("session.selectModel",{sessionId:r,provider:"deepseek-official",model:n.model})}catch(a){return{success:!1,error:`session.selectModel("${n.model}") failed: ${Lo(a)}`}}let o=n?.prompt??_e;try{await this.promptAndWait(i,e,r,o,ay)}catch(a){return{success:!1,error:`seed turn failed: ${Lo(a)}`}}return{success:!0,sessionId:r}}finally{await Wd()}}async dshPromptTurn(e,n){let r=Date.now(),s=ly(n.env??process.env);tt("dsh",[],n.permissionMode??"yolo");let i;try{let o=await Ud(s);n.model&&(await o.rpc("session.selectModel",{sessionId:n.sessionId,provider:"deepseek-official",model:n.model}),n.onProgress?.({kind:"system",summary:`dsh model set to ${n.model}`})),n.onProgress?.({kind:"system",summary:"dsh session.prompt sent"}),i=await this.promptAndWait(o,n.cwd,n.sessionId,e,n.timeoutMs&&n.timeoutMs>0?n.timeoutMs:ay)}finally{await Wd()}return n.onProgress?.({kind:"system",summary:"dsh turn completed"}),{text:i,sessionId:n.sessionId,durationMs:Date.now()-r}}async promptAndWait(e,n,r,s,i){let o=this.dshProvider.sessionFilePath(n,r),a=await x$(o);await e.rpc("session.prompt",{sessionId:r,mode:"queue",content:[{type:"text",text:s}]});let l=Date.now()+i;for(;;){let c=await cy(o),u=c.find(d=>d.type==="turn/end"&&(d.seq??-1)>a);if(u){let d=u.data?.reason?.kind,f=[...c].reverse().find(p=>p.type==="assistant/message"),m=f?R$(f):"";if(d!=="completed"&&!m)throw new Error(`dsh turn ended with reason=${d??"unknown"} and no assistant text`);return m}if(Date.now()>l)throw new Error(`dsh turn timed out after ${i}ms waiting for turn/end`);await new Promise(d=>setTimeout(d,A$))}}}});import{createHash as O$}from"node:crypto";import{existsSync as L$,mkdirSync as Jd,readFileSync as C$,renameSync as $$,rmdirSync as gy,statSync as M$,writeFileSync as D$}from"node:fs";import{dirname as Yd,join as dy,resolve as Xd}from"node:path";function j$(t){return O$("sha256").update(t).digest("hex").slice(0,8)}function P$(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function F$(t,e){let n=e?.prompt??"",r=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(n);return r!==null?r[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function yy(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Co(t){return Math.max(1,Math.ceil(t.length/4))}function Dr(t=process.cwd()){let e=process.env.LMCTL_CLAUDE_MOCK_STORE;if(e!==void 0&&e.trim().length>0)return Xd(e);let n=process.env.LMCTL_DB;return n!==void 0&&n.trim().length>0?dy(Yd(Xd(n)),".lmctl-claude-mock","sessions.json"):dy(Xd(t),".lmctl-claude-mock","sessions.json")}function uy(){return{schemaVersion:1,sessions:{}}}function Ws(t){if(!L$(t))return uy();try{let e=JSON.parse(C$(t,"utf8")),n=typeof e.sessions=="object"&&e.sessions!==null?e.sessions:{},r=typeof e.script=="object"&&e.script!==null?e.script:void 0,s=typeof e.scriptContains=="object"&&e.scriptContains!==null?e.scriptContains:void 0,i=Gd(e.defaultDelayMs);return{schemaVersion:1,sessions:n,...i!==void 0?{defaultDelayMs:i}:{},...r!==void 0?{script:r}:{},...s!==void 0?{scriptContains:s}:{}}}catch{return uy()}}function wy(t,e){Jd(Yd(t),{recursive:!0});let n=`${t}.${process.pid}.${Date.now()}.tmp`;D$(n,`${JSON.stringify(e,null,2)}
1575
1575
  `,"utf8"),$$(n,t)}function q$(t){Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,t)}function B$(t){let e=`${t}.lock`;Jd(Yd(t),{recursive:!0});let n=Date.now()+fy;for(;;)try{return Jd(e),e}catch(r){if(r.code!=="EEXIST")throw r;try{if(Date.now()-M$(e).mtimeMs>U$){try{gy(e)}catch{}continue}}catch{continue}if(Date.now()>=n)throw new Error(`ClaudeMock store lock timeout after ${fy}ms: ${e}`);q$(W$)}}function H$(t){try{gy(t)}catch{}}function Ey(t,e){let n=B$(t);try{return e()}finally{H$(n)}}function X$(t){return{...t,timestamp:t.timestamp.toISOString()}}function J$(t){return{...t,timestamp:new Date(t.timestamp)}}function G$(t){return{...t,createdAt:t.createdAt.toISOString(),modifiedAt:t.modifiedAt.toISOString(),messages:t.messages.map(X$)}}function Ty(t){return{...t,createdAt:new Date(t.createdAt),modifiedAt:new Date(t.modifiedAt),messages:t.messages.map(J$)}}function $o(t,e=process.cwd()){let n=Mr.get(t);if(n!==void 0)return n;let s=Ws(Dr(e)).sessions[t];if(s===void 0)return;let i=Ty(s);return Mr.set(i.sessionId,i),i}function my(t){Mr.set(t.sessionId,t);let e=Dr(t.cwd);Ey(e,()=>{let n=Ws(e);n.sessions[t.sessionId]=G$({...t,filePath:e}),wy(e,n)})}function K$(t,e=process.cwd()){let n=Dr(e);return Ey(n,()=>{let r=Ws(n),s=r.sessions[t]!==void 0;return s&&(delete r.sessions[t],wy(n,r)),s})}function V$(){let t=Ws(Dr()),e=Object.values(t.sessions).map(Ty);for(let n of e)Mr.set(n.sessionId,n);return e}function Gd(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:void 0}function py(t){if(typeof t=="string")return{kind:"success",text:t};if(t!==void 0&&typeof t.text=="string"&&typeof t.error!="string"){let e=Gd(t.delayMs);return{kind:"success",text:t.text,...e!==void 0?{delayMs:e}:{}}}if(t!==void 0&&typeof t.error=="string"&&typeof t.text!="string"){let e=Gd(t.delayMs);return{kind:"error",error:t.error,...e!==void 0?{delayMs:e}:{}}}}async function _y(t){t!==void 0&&t>0&&await new Promise(e=>setTimeout(e,t))}function Y$(t,e){let{script:n,scriptContains:r}=e;if(n!==void 0){let s=py(n[t]??n[yy(t)]);if(s!==void 0)return s}if(r!==void 0){for(let s of Object.keys(r))if(t.includes(s)){let i=py(r[s]);if(i!==void 0)return i}}}function hy(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function zd(){return new Vd}var Mr,U$,W$,fy,Kd,Vd,Zd=E(()=>{"use strict";Mr=new Map;U$=5e3,W$=15,fy=1e4;Kd=class{name="ClaudeMock";async discoverSessions(){let e=new Map;for(let n of V$())e.set(n.sessionId,n);for(let n of Mr.values())e.set(n.sessionId,n);return[...e.values()].map(hy)}async loadSession(e){let n=$o(e);return n===void 0?null:{...hy(n),messages:n.messages.slice()}}async resolveSessionPath(e){return $o(e)?.filePath??null}async deleteSession(e){let n=Mr.delete(e),r=K$(e);return n||r}},Vd=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Kd;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,n){let r=P$(F$(e,n)),s=`mock-${r}-${j$(`${e}:${r}`)}`,i=new Date,o=Dr(e),a=$o(s,e),l=n?.prompt??"ClaudeMock seed",c=Co(l),u={sessionId:s,cwd:e,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return u.messages.push({role:"user",timestamp:i,content:l}),u.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),u.totalInputTokens+=c,u.totalOutputTokens+=Co("ACK: ClaudeMock seeded"),my(u),{success:!0,sessionId:s}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,n){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,n){let r=Date.now(),s=$o(n.sessionId,n.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${n.sessionId}`);let i=new Date,o=Ws(Dr(n.cwd)),a=Y$(e,o),l=a?.delayMs??o.defaultDelayMs;if(a?.kind==="error")throw await _y(l),new Error(a.error);let c=a?.kind==="success"?a.text:`ClaudeMock ack: ${yy(e)}`;return s.messages.push({role:"user",timestamp:i,content:e}),s.messages.push({role:"assistant",timestamp:i,content:c,model:n.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Co(e),s.totalOutputTokens+=Co(c),my(s),n.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),await _y(l),{text:c,sessionId:n.sessionId,durationMs:Math.max(1,Date.now()-r),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function Ht(t){let e=[nd({claudeDir:t?.claudeDir}),id({codexDir:t?.codexDir,codeDir:t?.codeDir}),dd({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),pd({copilotDir:t?.copilotDir}),wd(),bd({kimiHome:t?.kimiHome}),Nd({lmplayerDbPath:t?.lmplayerDbPath}),Rd(),$d({agyDir:t?.agyDir}),Bd({dshHome:t?.dshHome})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(zd()),e}var Qd=E(()=>{"use strict";rd();od();ud();_d();Ed();kd();Ad();Od();Md();Hd();Zd();rd();od();ud();_d();Ed();kd();Ad();Od();Md();Hd();Zd()});var nu={};oe(nu,{ProviderRegistry:()=>Rs,TransportConnectionError:()=>ke,TransportError:()=>ft,TransportJsonError:()=>co,TransportProcessError:()=>nn,TransportRpcError:()=>rn,_resetDefaultRegistryForTests:()=>z$,chat:()=>sn,countTokens:()=>tu,createAdapterRegistry:()=>Ut,createAllAdapters:()=>Ht,listSessions:()=>tr,seed:()=>eu});function Do(){return Mo===null&&(Mo=Ut(Ht())),Mo}function z$(){Mo=null}function Sy(t,e){let n=t.getAdapter(e);if(!n)throw new Error(`provider "${e}" is not registered in this registry`);return n}async function sn(t){let e=t.registry??Do(),n=Sy(e,t.provider),r={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,holdOpen:t.holdOpen},s=await n.sendTurn(t.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 eu(t){let e=t.registry??Do(),n=Sy(e,t.provider),r=await vy(e,t.provider,t.cwd),s=await n.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.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 vy(e,t.provider,t.cwd),a=Z$(r,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function vy(t,e,n){let r=await t.listAll({provider:e,workspace:n}),s=new Map;for(let i of r)s.set(i.sessionId,i.modifiedAt);return s}function Z$(t,e){let n=[];for(let r of e.keys())t.has(r)||n.push(r);return n.length===1?n[0]:void 0}async function tr(t={}){return(t.registry??Do()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function tu(t){let n=await(t.registry??Do()).getSession(t.sessionId,t.provider);if(!n)throw new Error(`session "${t.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,mt=E(()=>{"use strict";Rc();Qd();Rc();Qd();Ar();Mo=null});function Q$(){return ru===null&&(ru=Ut(Ht())),ru}async function jo(t){let{dal:e,team_member_id:n}=t,r=e!==void 0&&n!==void 0;r&&e.setMemberState(n,"in_chat");let s=!1,i;try{return await tM(t)}catch(o){throw s=!0,i=o,o}finally{if(r)if(!s)jr.delete(n),e.setMemberState(n,"idle");else{let o=eM(i,n);e.setMemberState(n,o!==null?"attention_needed":"idle",o)}}}function eM(t,e){if(!(t instanceof Oe))return jr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let n=(jr.get(e)??0)+1;return n>=3?(jr.delete(e),"consecutive_timeouts"):(jr.set(e,n),null)}return jr.delete(e),null}async function tM(t){let e=t.timeoutMs,n=typeof e=="number"&&e>0,r=Q$(),s;try{let u=await r.resolveSession(t.sessionid);if(!u)return Promise.reject(new Oe("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,su(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Oe("other",null,`library: session resolution failed: ${by(u)}`,su(t.sessionid,t.sessiondir,"unresolved")))}let i=su(t.sessionid,t.sessiondir,s),o=new AbortController,a=n?setTimeout(()=>o.abort(),e):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await sn({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:o.signal,registry:r,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Oe("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,i);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(u){throw l?new Oe("timeout",null,`library: wall-clock timeout after ${e??0}ms`,i):nM(u,i)}finally{a!==null&&clearTimeout(a)}}function su(t,e,n){return["<library>","chat",t,e,"--provider",n]}function by(t){return t instanceof Error?t.message:String(t)}function nM(t,e){if(t instanceof Oe)return t;if(t instanceof ke){let n=t.cause;return n?.code==="ENOENT_CWD"?new Oe("sessiondir_missing",null,t.message,e):n?.code==="ENOENT"?new Oe("enoent",null,t.message,e):new Oe("other",null,t.message,e)}return t instanceof nn?new Oe("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof rn?new Oe("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ft?new Oe("other",null,t.message,e):new Oe("other",null,by(t),e)}var Oe,ru,jr,Po=E(()=>{"use strict";mt();Oe=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="ChatError"}},ru=null;jr=new Map});function ky(){return iu===null&&(iu=Ut(Ht())),iu}function sM(t,e){if(!rM.test(t))return t;let n=e.getConfig(`workspace.${t}`);if(n===null||n.length===0)throw new Ce("other",null,`no provider mapping for ${t} (set lmctl_config workspace.${t})`,["<library>","seed","--provider",t]);return n}async function Fo(t){let e=sM(t.member.provider,t.dal),n=e===t.member.provider?t.member:{...t.member,provider:e},r=await iM({member:n});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:r.sessionid,provider_resolved:e}}async function iM(t){let e=t.member.provider,n=t.member.sessiondir,r=ou("seed",n,e);try{let s=await eu({provider:e,cwd:n,registry:ky()});if(!s.success)throw aM(s.error,r);if(!s.sessionId)throw new Ce("parse",0,"",r);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ce?s:au(s,r)}}async function Iy(t){return oM(t)}async function oM(t){let e=ky(),n=ou("tokens",t.sessionid,"unresolved"),r;try{let i=await e.resolveSession(t.sessionid);if(!i)throw new Ce("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,n);r=i.provider.name}catch(i){throw i instanceof Ce?i:au(i,n)}let s=ou("tokens",t.sessionid,r);try{let i=await tu({sessionId:t.sessionid,provider:r,registry:e});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ce?i:au(i,s)}}function ou(t,e,n){return["<library>",t,e,"--provider",n]}function aM(t,e){let n=t??"";if(/\bENOENT\b/i.test(n))return new Ce("enoent",null,n,e);if(/timed?\s*out/i.test(n))return new Ce("timeout",null,n,e);if(/\bexit code\s+(-?\d+)\b/i.test(n)){let r=/\bexit code\s+(-?\d+)\b/i.exec(n);return new Ce("nonzero_exit",Number(r[1]),n,e)}return new Ce("other",null,n,e)}function au(t,e){return t instanceof Ce?t:t instanceof ke?t.cause?.code==="ENOENT"?new Ce("enoent",null,t.message,e):new Ce("other",null,t.message,e):t instanceof nn?new Ce("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof rn?new Ce("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof ft?new Ce("other",null,t.message,e):new Ce("other",null,t instanceof Error?t.message:String(t),e)}var Ce,iu,rM,lu=E(()=>{"use strict";mt();Ce=class extends Error{kind;exit_status;stderr;argv;constructor(e,n,r,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=n,this.stderr=r,this.argv=s,this.name="SeedError"}},iu=null;rM=/^provider[123]$/});function Uo(t){return Buffer.from(t,"utf8").toString("base64url")}function Bs(t){return Buffer.from(t,"base64url").toString("utf8")}async function Ny(t,e=n=>Iy({sessionid:n})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let n=0,r=0;for(let s of lM(t)){let i=s.member.sessionid;if(i!==null)try{let o=await e(i);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),n+=1}catch(o){r+=1;try{t.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 Ay(t,e,n){let r=xy(t,e,n);if(r===null||r.member.sessionid===null)throw new Error("session member not found");if(r.member.state!=="idle")throw new qs(n,r.member.state);t.setMemberState(r.member.id,"in_chat","compacting");try{return await jo({sessionid:r.member.sessionid,sessiondir:r.member.sessiondir,prompt:"/compact"}),t.setMemberState(r.member.id,"idle",null),{ok:!0,row:Ry(t,e,n)}}catch(s){throw t.setMemberState(r.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function cu(t,e,n){let r=xy(t,e,n);if(r===null)throw new Error("session member not found");let s=await Fo({member:r.member,dal:t});return t.updateTeamMemberSession(r.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Ry(t,e,n)}}function lM(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(n=>n.sessionid!==null).map(n=>({team_name:e.name,member:n})))}function xy(t,e,n){let r=t.findTeamByName(e);if(r===null)return null;let s=t.findTeamMemberByAlias(r.id,n);return s===null?null:{team_name:r.name,member:s}}function Ry(t,e,n){return t.sessionSizeHistory(e,n,1)[0]??null}var qs,Wo=E(()=>{"use strict";Po();lu();qs=class extends Error{constructor(e,n){super(`member ${e} is currently ${n}; cannot compact while busy`),this.name="MemberBusyError"}}});async function du(t){let e=t.dal,n=t.nowMs??Date.now(),r=t.thresholdMs??dM(e),s=n-r,i=e.query(`
@@ -1630,7 +1630,7 @@ ${n}`:n}function kL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1630
1630
  JOIN run r ON r.id = s.run_id
1631
1631
  JOIN job j ON j.id = r.job_id
1632
1632
  WHERE j.project_id = ? AND s.outcome IS NOT NULL
1633
- ${r!==null?"AND r.started_at >= ?":""}`,...s),o=new Map,a=0,l=0;for(let w of i){let S=o.get(w.state_name)??{total:0,rc:0};S.total++,w.outcome==="request_changes"&&S.rc++,o.set(w.state_name,S),a++,w.outcome==="request_changes"&&l++}let c=[...o.entries()].map(([w,S])=>({state_name:w,total:S.total,request_changes:S.rc,rate_pct:S.total>0?`${(S.rc/S.total*100).toFixed(1)}%`:"0.0%"})),u={total:a,request_changes:l,rate_pct:a>0?`${(l/a*100).toFixed(1)}%`:"0.0%",by_state:c},d=t.query(`SELECT s.state_name,
1633
+ ${r!==null?"AND r.started_at >= ?":""}`,...s),o=new Map,a=0,l=0;for(let w of i){let v=o.get(w.state_name)??{total:0,rc:0};v.total++,w.outcome==="request_changes"&&v.rc++,o.set(w.state_name,v),a++,w.outcome==="request_changes"&&l++}let c=[...o.entries()].map(([w,v])=>({state_name:w,total:v.total,request_changes:v.rc,rate_pct:v.total>0?`${(v.rc/v.total*100).toFixed(1)}%`:"0.0%"})),u={total:a,request_changes:l,rate_pct:a>0?`${(l/a*100).toFixed(1)}%`:"0.0%",by_state:c},d=t.query(`SELECT s.state_name,
1634
1634
  CAST((julianday(s.ended_at) - julianday(s.started_at)) * 86400000 AS INTEGER) AS duration_ms
1635
1635
  FROM step s
1636
1636
  JOIN run r ON r.id = s.run_id
@@ -1642,14 +1642,14 @@ ${n}`:n}function kL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1642
1642
  JOIN job j ON j.id = r.job_id
1643
1643
  WHERE j.project_id = ? AND s.ended_at IS NULL
1644
1644
  ${r!==null?"AND r.started_at >= ?":""}
1645
- GROUP BY s.state_name`,...f),p=new Map;for(let w of d){let S=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},I=w.duration_ms;I<3e5?S.lt5++:I<9e5?S.btw5_15++:I<36e5?S.btw15_60++:S.gt60++,p.set(w.state_name,S)}for(let w of m){let S=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};S.noEnd+=w.cnt,p.set(w.state_name,S)}let h=[...p.entries()].map(([w,S])=>({state_name:w,lt_5min:S.lt5,btw_5_15min:S.btw5_15,btw_15_60min:S.btw15_60,gt_60min:S.gt60,no_end:S.noEnd})),_=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1645
+ GROUP BY s.state_name`,...f),p=new Map;for(let w of d){let v=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},N=w.duration_ms;N<3e5?v.lt5++:N<9e5?v.btw5_15++:N<36e5?v.btw15_60++:v.gt60++,p.set(w.state_name,v)}for(let w of m){let v=p.get(w.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};v.noEnd+=w.cnt,p.set(w.state_name,v)}let h=[...p.entries()].map(([w,v])=>({state_name:w,lt_5min:v.lt5,btw_5_15min:v.btw5_15,btw_15_60min:v.btw15_60,gt_60min:v.gt60,no_end:v.noEnd})),_=t.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1646
1646
  FROM step s
1647
1647
  JOIN run r ON r.id = s.run_id
1648
1648
  JOIN job j ON j.id = r.job_id
1649
1649
  WHERE j.project_id = ?
1650
1650
  ${r!==null?"AND r.started_at >= ?":""}
1651
1651
  GROUP BY s.run_id, s.state_name
1652
- HAVING COUNT(*) > 1`,...s),y=new Map;for(let w of _){let S=y.get(w.state_name)??{runs:0,total_attempts:0};S.runs++,S.total_attempts+=w.attempt_count,y.set(w.state_name,S)}let g=[...y.entries()].map(([w,S])=>({state_name:w,retried_runs:S.runs,avg_retries:S.runs>0?Number((S.total_attempts/S.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:g}}function gu(t,e={}){let n=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,r=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1652
+ HAVING COUNT(*) > 1`,...s),y=new Map;for(let w of _){let v=y.get(w.state_name)??{runs:0,total_attempts:0};v.runs++,v.total_attempts+=w.attempt_count,y.set(w.state_name,v)}let g=[...y.entries()].map(([w,v])=>({state_name:w,retried_runs:v.runs,avg_retries:v.runs>0?Number((v.total_attempts/v.runs).toFixed(2)):0}));return{request_changes_rate:u,step_duration_histogram:h,retry_counts:g}}function gu(t,e={}){let n=e.since_days!==void 0?Date.now()-Math.trunc(e.since_days)*864e5:0,r=e.project_id!==void 0?t.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1653
1653
  FROM session_event se
1654
1654
  JOIN run r ON r.id = se.run_id
1655
1655
  JOIN job j ON j.id = r.job_id
@@ -1692,17 +1692,17 @@ ${n}`:n}function kL(t,e){if(t!=="kimi"||!e.includes("notifications/initialized")
1692
1692
  json_extract(payload, '$.elapsedMs') ASC`,n),o=new Map;for(let l of i){let c=o.get(l.tool_name)??[];c.push(l.elapsed_ms),o.set(l.tool_name,c)}let a=new Map(s.map(l=>[l.tool_name,l.cnt]));return r.map(l=>{let c=a.get(l.tool_name)??0,u=o.get(l.tool_name)??[],d=u.length>0?u.reduce((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function Jy(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let n=[],r=new Map,s=new Map;for(let i of e.steps){let o=typeof i.id=="string"?i.id:null;o!==null&&(n.push(o),typeof i.type=="string"&&s.set(o,i.type),typeof i.name=="string"&&i.name.length>0&&r.set(i.name,o))}return{schema:"v3",nodes:n,nodeTypes:s,nameToId:r}}if(e.states!==null&&typeof e.states=="object"){let n=e.states,r=new Map;for(let[l,c]of Object.entries(n))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&r.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,i=Object.keys(n),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)r.set(l,"Terminal");return{schema:"v2",nodes:[...o,...a],nodeTypes:r,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function Fr(t,e){let n=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(n===void 0)return null;let r=t.query("SELECT * FROM workflow WHERE id = ?",n.workflow_id)[0]??null,s=(()=>{let _=t.query("SELECT * FROM job WHERE id = ?",n.job_id)[0];return _===void 0?null:t.query("SELECT * FROM project WHERE id = ?",_.project_id)[0]?.name??null})(),i=r!==null?Jy(r.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},o=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=_=>i.schema==="v3"&&i.nameToId.has(_)?i.nameToId.get(_):_,l=new Map;for(let _ of o)l.set(a(_.state_name),_);let c=t.query(`SELECT state_name, status, last_agent_output
1693
1693
  FROM interactive_session
1694
1694
  WHERE run_id = ? AND status = 'waiting_operator'
1695
- ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let _=o.find(y=>y.ended_at===null);_!==void 0?d=a(_.state_name):o.length>0?d=a(o[o.length-1].state_name):d=n.current_state}n.terminal_state!==null&&(d=`@terminal:${n.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let _ of o){let y=a(_.state_name);!i.nodes.includes(y)&&!p.includes(y)&&p.push(y)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let _ of p){if(m.has(_))continue;m.add(_);let y=_===d,g=l.get(_),w="pending",S=null;if(_.startsWith("@terminal:"))w=n.terminal_state===_.slice(10)?"done":"pending";else if(g!==void 0&&(g.ended_at===null?w=y&&u===_?"paused":"running":g.outcome===null?w="failed":w="done",g.ended_at!==null)){let I=Date.parse(g.started_at),v=Date.parse(g.ended_at);!Number.isNaN(I)&&!Number.isNaN(v)&&(S=v-I)}y&&u===_&&(w="paused"),h.push({id:_,status:w,is_current:y,elapsed_ms:S,prompt:y&&w==="paused"?f:null,expected:y&&w==="paused"?"free_text":null})}return{run_id:e,workflow_name:r?.name??null,workflow_version:r?.version??null,workflow_version_id:n.workflow_version_id,project:s,paused:n.paused_at!==null&&n.terminal_state===null,terminal_state:n.terminal_state,current_state:d,nodes:h}}function Yo(t){let e=[],n=t.workflow_name??"?",r=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${n}, ${r}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let i of t.nodes)e.push(...yM(i));return`${e.join(`
1695
+ ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let _=o.find(y=>y.ended_at===null);_!==void 0?d=a(_.state_name):o.length>0?d=a(o[o.length-1].state_name):d=n.current_state}n.terminal_state!==null&&(d=`@terminal:${n.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let _ of o){let y=a(_.state_name);!i.nodes.includes(y)&&!p.includes(y)&&p.push(y)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let _ of p){if(m.has(_))continue;m.add(_);let y=_===d,g=l.get(_),w="pending",v=null;if(_.startsWith("@terminal:"))w=n.terminal_state===_.slice(10)?"done":"pending";else if(g!==void 0&&(g.ended_at===null?w=y&&u===_?"paused":"running":g.outcome===null?w="failed":w="done",g.ended_at!==null)){let N=Date.parse(g.started_at),S=Date.parse(g.ended_at);!Number.isNaN(N)&&!Number.isNaN(S)&&(v=S-N)}y&&u===_&&(w="paused"),h.push({id:_,status:w,is_current:y,elapsed_ms:v,prompt:y&&w==="paused"?f:null,expected:y&&w==="paused"?"free_text":null})}return{run_id:e,workflow_name:r?.name??null,workflow_version:r?.version??null,workflow_version_id:n.workflow_version_id,project:s,paused:n.paused_at!==null&&n.terminal_state===null,terminal_state:n.terminal_state,current_state:d,nodes:h}}function Yo(t){let e=[],n=t.workflow_name??"?",r=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${n}, ${r}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let i of t.nodes)e.push(...yM(i));return`${e.join(`
1696
1696
  `)}
1697
- `}function yM(t){let e=[],n=wM(t.status),r=[];t.status==="done"&&t.elapsed_ms!==null?r.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?r.push("failed"):t.status==="paused"?r.push("paused, waiting for operator input"):t.status==="running"?r.push("running"):t.status==="pending"&&r.push("pending");let s=r.length>0?`(${r.join(", ")})`:"",i=t.is_current?" <- CURRENT":"",o=t.id.padEnd(28);if(e.push(` ${n} ${o} ${s}${i}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function wM(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function zo(t,e,n={}){let r=n.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let i=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=i!==null?Jy(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=I=>c.schema==="v3"&&c.nameToId.has(I)?c.nameToId.get(I):I,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let I of d)f.set(u(I.state_name),I);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let I of m)p.set(u(I.state_name),I);let h=new Map,_=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let I of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1697
+ `}function yM(t){let e=[],n=wM(t.status),r=[];t.status==="done"&&t.elapsed_ms!==null?r.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?r.push("failed"):t.status==="paused"?r.push("paused, waiting for operator input"):t.status==="running"?r.push("running"):t.status==="pending"&&r.push("pending");let s=r.length>0?`(${r.join(", ")})`:"",i=t.is_current?" <- CURRENT":"",o=t.id.padEnd(28);if(e.push(` ${n} ${o} ${s}${i}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function wM(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function zo(t,e,n={}){let r=n.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let i=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=i!==null?Jy(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=N=>c.schema==="v3"&&c.nameToId.has(N)?c.nameToId.get(N):N,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let N of d)f.set(u(N.state_name),N);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let N of m)p.set(u(N.state_name),N);let h=new Map,_=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let N of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1698
1698
  FROM session_event
1699
1699
  WHERE run_id = ? AND step_id IS NOT NULL
1700
- GROUP BY step_id`,e))I.step_id!==null&&h.set(I.step_id,I.timestamp_ms);let y=EM(c,d,u),g=TM(s.current_state),w=t.query(`SELECT kind, severity, payload
1700
+ GROUP BY step_id`,e))N.step_id!==null&&h.set(N.step_id,N.timestamp_ms);let y=EM(c,d,u),g=TM(s.current_state),w=t.query(`SELECT kind, severity, payload
1701
1701
  FROM attention
1702
1702
  WHERE run_id = ?
1703
1703
  AND kind = 'session_hung'
1704
1704
  AND acknowledged_at IS NULL
1705
- ORDER BY id ASC`,e).map(I=>({kind:I.kind,severity:I.severity,payload:AM(I.payload)})),S=y.map(I=>{let v=f.get(I),M=p.get(I),D=vM(s,I,g,v,M),j=v===void 0?null:Date.parse(v.started_at),U=v?.ended_at===null||v===void 0?null:Date.parse(v.ended_at),A=v===void 0||Number.isNaN(j??NaN)?null:U!==null&&!Number.isNaN(U)?U-j:D==="running"||D==="paused"?r-j:null,Y=v===void 0?null:h.get(v.id)??null,J=xM(M?.last_activity_at??null,Y,_),N=i===null||M===void 0?void 0:kM(t,s.team_id,i.definition,M.state_name,v?.state_name??I);return{step_id:v?.id??null,state_id:I,status:D,started_at:v?.started_at??null,ended_at:v?.ended_at??null,last_activity_at:J,elapsed_ms:A,...N!==void 0?{member:N}:{},...M!==void 0?{interactive_session:{id:M.id,status:M.status,turn_count:M.turn_count,state_name:M.state_name}}:{}}});return{run_id:e,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:bM(s,a,S),submitted_at:a?.enqueued_at??s.started_at,nodes:S,current_node_index:SM(S,s.terminal_state!==null),related_attentions:w}}function Zo(t,e={}){let n=e.nowMs??Date.now(),r=[],s=t.workflow_name??"?",i=t.workflow_version!==null?`v${t.workflow_version}`:"v?";r.push(`run ${t.run_id} - ${s}, ${i} - ${t.status}`);let o=`${t.submitted_at} (${$y(Date.parse(t.submitted_at),n)} ago)`;r.push(`project: ${t.project??"?"} | submitted: ${o}`),r.push(""),r.push("timeline:"),r.push(`${Cy(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Cy(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Qo(a.elapsed_ms)}`;if(r.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${$y(a.last_activity_at,n)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";r.push(` ${" ".repeat(24)} ${d}`),r.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){r.push(""),r.push("attentions:");for(let a of t.related_attentions)r.push(`- ${a.kind}${RM(a.payload)}`)}return`${r.join(`
1705
+ ORDER BY id ASC`,e).map(N=>({kind:N.kind,severity:N.severity,payload:AM(N.payload)})),v=y.map(N=>{let S=f.get(N),O=p.get(N),P=vM(s,N,g,S,O),D=S===void 0?null:Date.parse(S.started_at),U=S?.ended_at===null||S===void 0?null:Date.parse(S.ended_at),x=S===void 0||Number.isNaN(D??NaN)?null:U!==null&&!Number.isNaN(U)?U-D:P==="running"||P==="paused"?r-D:null,j=S===void 0?null:h.get(S.id)??null,q=xM(O?.last_activity_at??null,j,_),I=i===null||O===void 0?void 0:kM(t,s.team_id,i.definition,O.state_name,S?.state_name??N);return{step_id:S?.id??null,state_id:N,status:P,started_at:S?.started_at??null,ended_at:S?.ended_at??null,last_activity_at:q,elapsed_ms:x,...I!==void 0?{member:I}:{},...O!==void 0?{interactive_session:{id:O.id,status:O.status,turn_count:O.turn_count,state_name:O.state_name}}:{}}});return{run_id:e,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:bM(s,a,v),submitted_at:a?.enqueued_at??s.started_at,nodes:v,current_node_index:SM(v,s.terminal_state!==null),related_attentions:w}}function Zo(t,e={}){let n=e.nowMs??Date.now(),r=[],s=t.workflow_name??"?",i=t.workflow_version!==null?`v${t.workflow_version}`:"v?";r.push(`run ${t.run_id} - ${s}, ${i} - ${t.status}`);let o=`${t.submitted_at} (${$y(Date.parse(t.submitted_at),n)} ago)`;r.push(`project: ${t.project??"?"} | submitted: ${o}`),r.push(""),r.push("timeline:"),r.push(`${Cy(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Cy(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${Qo(a.elapsed_ms)}`;if(r.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${$y(a.last_activity_at,n)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";r.push(` ${" ".repeat(24)} ${d}`),r.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){r.push(""),r.push("attentions:");for(let a of t.related_attentions)r.push(`- ${a.kind}${RM(a.payload)}`)}return`${r.join(`
1706
1706
  `)}
1707
1707
  `}function EM(t,e,n){let r=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let i=n(s.state_name);r.includes(i)||r.push(i)}return r}function TM(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function vM(t,e,n,r,s){return r===void 0?"pending":r.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&n===e?"paused":"running":r.outcome===null?"failed":"done"}function SM(t,e){if(t.length===0)return null;let n=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(n>=0)return n;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let r=t.findIndex(s=>s.status==="pending");return r>=0?r:t.length-1}function bM(t,e,n){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||n.some(r=>r.status==="failed")?"failed":"running"}function kM(t,e,n,r,s){let i=IM(n,r,s);if(i===null)return;let o=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,i)[0];return o===void 0?void 0:{alias:o.alias,provider:Qe(o)}}function IM(t,e,n){let r=NM(t);if(r===null)return null;if(Array.isArray(r.steps)){let s=r.steps.find(a=>Rn(a)?a.id===e||a.name===e||a.name===n:!1),i=Rn(s?.members)?s.members:null,o=i!==null&&Rn(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(Rn(r.states)){let s=r.states[e]??r.states[n];if(!Rn(s))return null;let i=Rn(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function NM(t){try{let e=JSON.parse(t);return Rn(e)?e:null}catch{return null}}function AM(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Rn(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function xM(...t){let e=t.filter(n=>n!==null&&Number.isFinite(n));return e.length===0?null:Math.max(...e)}function Cy(t,e){let n=Date.parse(t),r=Date.parse(e);return Number.isNaN(n)||Number.isNaN(r)?"[+? ]":`[+${Qo(Math.max(0,r-n)).padEnd(6)}]`}function $y(t,e){return Number.isNaN(t)?"?":Qo(Math.max(0,e-t))}function Qo(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let n=Math.floor(e/60),r=e%60;if(n<60)return r===0?`${n}m`:`${n}m${r}s`;let s=Math.floor(n/60),i=n%60;return i===0?`${s}h`:`${s}h${i}m`}function RM(t){if(!Rn(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",n=typeof t.member_alias=="string"?t.member_alias:null,r=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${Qo(t.elapsed_ms)} elapsed`:"",i=n===null?"":` (${n}${r===null?"":` ${r}`}${s})`;return`${e}${i}`}var By,on=E(()=>{"use strict";dt();By=`SELECT a.id AS attention_id,
1708
1708
  a.kind AS kind,
@@ -2012,8 +2012,8 @@ and \`lmctl api escalations\` (no args) print detailed usage.
2012
2012
  Verify every workflows/*.compound.json file: load/validate the workflow graph
2013
2013
  and report the first step that would be started. Default output is the TTY
2014
2014
  table; --json emits the structured WorkflowVerifyReport payload.`;ID=["open","assigned","closed","reopened"]});import cw from"jexl";function Ur(t){cw.compile(dw(t))}async function or(t,e){return cw.eval(dw(t),e)}function dw(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var Js=E(()=>{"use strict"});import{z as T}from"zod";function Iu(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var UD,uw,Eu,Tu,vu,Su,bu,ku,fw,WD,qD,BD,Gs,HD,ra,sa,ia,oa,aa,mw,XD,JD,GD,KD,la,Wr=E(()=>{"use strict";Js();UD=T.object({kind:T.enum(["success","neutral","failure"])}),uw=T.enum(["string","number","boolean","object","array"]),Eu=T.object({name:T.string().min(1),type:uw,required:T.boolean().optional(),default:T.unknown().optional(),description:T.string().optional()}),Tu=T.object({name:T.string().min(1),type:uw,source_step_id:T.string().min(1),source_field:T.string().min(1),description:T.string().optional()}),vu=T.object({id:T.string().min(1),type:T.string().min(1),parameters:T.record(T.string(),T.unknown()).default({})}),Su="__failure__",bu=T.object({tools:T.array(T.string().min(1)).optional(),auth:T.array(T.string().min(1)).optional()}).strict().optional(),ku=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(),fw=T.object({type:T.literal("AssertRepoClean"),fail_message:T.string().min(1).optional(),next:T.string().min(1)}),WD=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(),qD=T.union([T.string().min(1),WD]),BD=T.union([T.string().min(1),T.object({name:T.string().min(1),content:T.string().min(1)}).strict()]),Gs=T.object({team:T.string().min(1),alias:T.string().min(1),prompt_template:T.string().optional(),mcp:T.array(qD).optional(),skills:T.array(BD).optional()}),HD=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:Gs,pre_checks:T.array(HD).optional(),reviewers:T.array(Gs.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((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.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(Gs.extend({topic:T.string().min(1)})).optional(),consolidator:Gs,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:Gs.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()}),mw=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((t,e)=>{for(let[n,r]of t.branches.entries())try{Ur(Iu(r.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",n,"when"],message:`invalid jexl expression: ${i}`})}}),XD=T.discriminatedUnion("type",[fw,ra,sa,ia,oa,aa,mw]),JD=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:XD,outcomes:T.object({all_ok:T.string().min(1),any_failed:T.string().optional()})}).superRefine((t,e)=>{try{Ur(Iu(t.items_from))}catch(n){let r=n instanceof Error?n.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${r}`})}}),GD=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((t,e)=>{for(let[n,r]of Object.entries(t.inputs??{}))try{Ur(Iu(r))}catch(s){let i=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",n],message:`invalid jexl expression: ${i}`})}}),KD=T.discriminatedUnion("type",[fw,ra,sa,ia,oa,aa,mw,JD,GD]),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),KD),terminals:T.record(T.string().min(1),UD),errors:ku,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(Eu).optional(),outputs:T.array(Tu).optional(),triggers:T.array(vu).optional(),read_only:T.boolean().optional(),requires:bu}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as ee}from"zod";var VD,ca,YD,zD,ZD,Jt,qr=E(()=>{"use strict";Wr();VD=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ca=ee.string().regex(VD),YD=ee.object({step_id:ca,type:ee.literal("main"),index:ee.number().int().min(0)}),zD=ee.record(ca,ee.record(ee.string().min(1),ee.array(ee.array(YD)))),ZD=ee.object({id:ca,name:ee.string().min(1),type:ee.string().min(1),typeVersion:ee.number().int().positive().default(1),parameters:ee.record(ee.string(),ee.unknown()).default({}),members:ee.record(ee.string(),ee.unknown()).optional(),estimated_duration_ms:ee.number().int().nonnegative().optional()}),Jt=ee.object({schema_version:ee.literal("lmctl/v3"),definition_schema_version:ee.literal(3),name:ee.string().min(1),version:ee.number().int().positive(),description:ee.string().optional(),estimated_duration_ms:ee.number().int().nonnegative().optional(),default_task_timeout_ms:ee.number().int().positive().max(216e5).optional(),concurrency_key:ee.string().min(1).optional(),concurrent_limit:ee.number().int().positive().optional(),errors:ku,inputs:ee.array(Eu).optional(),outputs:ee.array(Tu).optional(),steps:ee.array(ZD).min(1),connections:zD.default({}),entry_step_id:ca,triggers:ee.array(vu).optional(),read_only:ee.boolean().optional(),requires:bu}).superRefine((t,e)=>{let n=new Set;for(let[r,s]of t.steps.entries())n.has(s.id)&&e.addIssue({code:"custom",path:["steps",r,"id"],message:`duplicate step id: ${s.id}`}),n.add(s.id);n.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[r,s]of Object.entries(t.connections)){n.has(r)||e.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,u]of l.entries())n.has(u.step_id)||e.addIssue({code:"custom",path:["connections",r,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function da(t){return Au(t)}function Au(t){if(Array.isArray(t))return t.map(Au);if(t===null||typeof t!="object")return t;let e=t,n={};for(let r of Object.keys(e))n[r]=Au(e[r]);if(typeof n.type=="string"){let r=ej[n.type];r!==void 0&&(n.type=r)}return n}var Nu,QD,ej,xu=E(()=>{"use strict";Nu="lmctl.builtin.",QD={Review:`${Nu}Review`,Research:`${Nu}Research`,Consolidate:`${Nu}Consolidate`},ej=Object.fromEntries(Object.entries(QD).map(([t,e])=>[e,t]))});import{readFileSync as tj}from"node:fs";function hw(t){return nj(t)}function nj(t){let e=da(ij(t));if(sj(e),gw(e)===3)return rj(e);let n=la.safeParse(e);if(!n.success)throw new an({errors:n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let r=oj(n.data);if(r.errors.length>0||r.unresolvedRefs.length>0)throw new an(r);return n.data}function rj(t){let e=Jt.safeParse(t);if(!e.success)throw new an({errors:e.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message}))});return e.data}function sj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=gw(t);if(!(e===null||pw.includes(e)))throw new an({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${pw.join(", ")}`}]})}function gw(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function ij(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
2015
- `)||e.startsWith("{")||e.startsWith("[")?_w(t,"$"):e.endsWith(".json")?_w(tj(e,"utf8"),e):t}function _w(t,e){try{return JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:"invalid JSON";throw new an({errors:[{path:e,message:`invalid JSON: ${r}`}]})}}function oj(t){let e=[],n=[],r=new Set(Object.keys(t.states));r.has(t.start_at)||n.push({state:"$",ref:t.start_at,kind:"next"}),aj(t,r,n);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:n}}function aj(t,e,n){let r=t.errors?.on_unhandled_failure_state;r!==void 0&&(e.has(r)||n.push({state:"$",ref:r,kind:"next"}))}var pw,an,yw=E(()=>{"use strict";Wr();qr();xu();pw=[1,2,3],an=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as lj}from"node:crypto";function ww(t,e){let n=cj(e),r=lj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${n}-${r}`}function cj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Ew=E(()=>{"use strict";qr()});function fj(t,e){let n=uj[t]??[],r={},s={};for(let[i,o]of Object.entries(e))n.includes(i)?s[i]=o:r[i]=o;return{params:r,members:s}}function bw(t){let e=[],n=(N,x)=>{throw new Br([{line:N,message:x}])},r=t.split(`
2016
- `),s=[];for(let N=0;N<r.length;N+=1){let C=_j(r[N]).trim();C.length>0&&s.push({n:N+1,text:C})}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=[],u=[],d=[],f,m={},p=new Map,h=new Map,_=new Map,y=(N,x,C,X,W,F)=>{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:x,params:C,line:X,isTerminal:W,...F?{members:F}:{}}),u.push(N)},g=N=>{let x=[],C=N+1;for(;C<s.length;C+=1){let X=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[C].text);if(X===null)break;x.push({label:X[1],dst:X[2]})}return{branches:x,nextIdx:C-1}};for(let N=1;N<s.length;N+=1){let{n:x,text:C}=s[N],X=C.split(/\s+/,1)[0];if(/^meta\s*\(/.test(C)){N!==1&&n(x,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${C}`),F=Cn(W[1],x,n);for(let ne of Object.keys(F))vw.has(ne)||n(x,`unknown \`meta\` key \`${ne}\` \u2014 only workflow-level runtime metadata is allowed: ${[...vw].join(", ")} (no grammar inflation; bounded)`);m=F;continue}if(X==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${C}`),F=W[1],ne=W[2],Se=W[3],me=Tw[ne];me===void 0&&n(x,`unknown step type: ${ne} (supported \`step\` archetypes: ${Object.keys(Tw).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ae,members:en}=fj(me,Cn(Se,x,n));y(F,me,Ae,x,!1,Object.keys(en).length>0?en:void 0);continue}if(X==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${C}`),F=W[1],ne=W[2],Se=W[3],me=Sw[ne];me===void 0&&n(x,`unknown trigger type: ${ne} (registered trigger archetypes: ${Object.keys(Sw).join(", ")})`),p.has(F)&&n(x,`duplicate trigger id: ${F}`),p.set(F,{id:F,type:me,parameters:Cn(Se,x,n)});continue}if(X==="mcp"||X==="skill"){let W=new RegExp(`^${X}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(C)??n(x,`malformed \`${X}\` decl (expected \`${X} <name> = {json} | ${X} <name> = "<file|url>"\`): ${C}`),F=W[1],ne=W[2].trim(),Se=X==="mcp"?h:_;Se.has(F)&&n(x,`duplicate ${X} declaration: ${F}`);let me;if(ne.startsWith("{")){let Ae=Cn(ne,x,n);X==="mcp"?me={...Ae,name:F}:((typeof Ae.content!="string"||Ae.content.length===0)&&n(x,`\`skill ${F}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),me={name:F,content:Ae.content})}else{let Ae=kw(ne);(typeof Ae!="string"||Ae.length===0)&&n(x,`\`${X} ${F}\`: string form must be a non-empty file path or http(s) URL`),me=Ae}Se.set(F,me);continue}if(X==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(C)??n(x,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${C}`);y(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},x,!0);continue}if(X==="seq"){let F=C.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ne=>ne.trim()).filter(ne=>ne.length>0);(F.length<3||F.length%2===0)&&n(x,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${C}`);for(let ne=0;ne+2<F.length+1&&!(ne+2>F.length-1);ne+=2){let Se=F[ne],me=F[ne+1],Ae=F[ne+2],en=me==="->"?"main":me.slice(1,-2);c.push({srcDeclId:Se,port:en,dstDeclId:Ae,line:x})}continue}if(X==="choice"){let F=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(C)??n(x,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${C}`))[1],ne=[],Se,me=N+1;for(;me<s.length;me+=1){let Ae=s[me].text,en=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(en!==null){Se!==void 0&&n(s[me].n,`\`choice ${F}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let hs=en[2];ne.push({when:en[1].trim(),next:`@terminal:${hs}`}),c.push({srcDeclId:F,port:hs,dstDeclId:en[3],line:s[me].n});continue}let tc=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(tc!==null){Se!==void 0&&n(s[me].n,`\`choice ${F}\` has more than one \`default\``);let hs=tc[1];Se=`@terminal:${hs}`,c.push({srcDeclId:F,port:hs,dstDeclId:tc[2],line:s[me].n});continue}break}ne.length===0&&n(x,`\`choice ${F}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),y(F,"lmctl/choice",{branches:ne,...Se!==void 0?{default_next:Se}:{}},x,!1),N=me-1;continue}if(X==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${C}`);y(W[1],"lmctl/loop",Cn(W[2],x,n),x,!1);continue}if(X==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${C}`),F=Cn(W[2],x,n);"mode"in F&&n(x,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),y(W[1],"lmctl/foreach",F,x,!1);continue}if(X==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(C)??n(x,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${C}`),F=W[1],ne=Cn(W[2],x,n),Se=ne.workflow;(typeof Se!="string"||Se.length===0)&&n(x,`\`call ${F}\` requires a \`workflow=<name>\` argument`);let{workflow:me,...Ae}=ne;y(F,"lmctl/subflow",{workflow_name:Se,...Ae},x,!1),d.push({declId:F,target:Se,line:x});continue}if(X==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(C)??n(x,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${C}`),F=W[1],ne=Cn(W[2],x,n),{branches:Se,nextIdx:me}=g(N);Se.length===0&&n(x,`\`decide ${F}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),y(F,"lmctl/interactive",{termination:{operator_signal:!0}},x,!1,{agent:ne});for(let Ae of Se)c.push({srcDeclId:F,port:Ae.label,dstDeclId:Ae.dst,line:x});N=me;continue}if(X==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(C)??n(x,`malformed \`entry\` (expected \`entry <id>\`): ${C}`);f!==void 0&&n(x,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}n(x,`unknown statement \`${X}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let w=N=>{if(Array.isArray(N)){for(let C of N)w(C);return}if(typeof N!="object"||N===null)return;let x=N;if(typeof x.alias=="string")for(let[C,X]of[["mcp",h],["skills",_]]){let W=x[C];Array.isArray(W)&&(x[C]=W.map(F=>typeof F=="string"&&X.has(F)?structuredClone(X.get(F)):F))}for(let C of Object.values(x))w(C)};for(let N of u){let x=l.get(N);x.members!==void 0&&w(x.members)}let S=N=>ww(o,N),I=u.map(N=>{let x=l.get(N);return{id:S(N),name:N,type:x.type,typeVersion:1,parameters:x.params,...x.members?{members:x.members}:{}}}),v={};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 x=S(N.srcDeclId);v[x]??={},v[x][N.port]!==void 0&&n(N.line,`duplicate edge port \`${N.port}\` on step \`${N.srcDeclId}\``),v[x][N.port]=[[{step_id:S(N.dstDeclId),type:"main",index:0}]]}for(let N of u){let x=l.get(N);mj.has(x.type)||n(x.line,`unknown archetype \`${x.type}\` for step \`${N}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let N of d)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 M=new Map;for(let N of c){let x=M.get(N.srcDeclId);x===void 0?M.set(N.srcDeclId,[N.dstDeclId]):x.push(N.dstDeclId)}for(let N of u){let x=l.get(N);if(x.type!=="lmctl/loop")continue;let C=x.params.body;if(typeof C=="string"&&l.has(C)){let X=M.get(N);X===void 0?M.set(N,[C]):X.push(C)}}let D=new Set([f]),j=[f];for(;j.length>0;){let N=j.shift();for(let x of M.get(N)??[])D.has(x)||(D.add(x),j.push(x))}for(let N of u)D.has(N)||n(l.get(N).line,`step \`${N}\` is unreachable from entry \`${f}\``);let U=new Map;for(let N of c){let x=U.get(N.srcDeclId);x===void 0&&(x=new Set,U.set(N.srcDeclId,x)),x.add(N.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let N of u){let x=l.get(N);if(x.isTerminal)continue;let C=U.get(N)??new Set;if(x.type==="lmctl/review"){let W=[...C].some(F=>!A.has(F));!C.has("approve")&&!W&&n(x.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=pj[x.type];if(X!==void 0)for(let W of X)C.has(W)||n(x.line,`uncovered outcome: required outcome \`${W}\` of step \`${N}\` (\`${x.type}\`) has no connection \u2014 route it (\`seq ${N} -${W}-> <target|terminal>\`)`);else C.size===0&&n(x.line,`uncovered outcome: non-terminal step \`${N}\` (\`${x.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let N of u){let x=l.get(N),C=dj[x.type];if(C===void 0)continue;let X={...x.params,...x.members??{},type:C.v2type,state_name:N,...Object.keys(C.outcomes).length>0?{outcomes:C.outcomes}:{}},W=C.schema.safeParse(X);if(!W.success){let F=W.error.issues[0],ne=F.path.length===0?"$":F.path.map(String).join(".");n(x.line,`step \`${N}\` (\`${x.type}\`) has invalid params for archetype \`${C.v2type}\` at \`${ne}\`: ${F.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${N} = ${x.type.replace("lmctl/","")}({ ... })\``)}}let Y={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:v,entry_step_id:S(f)},J=Jt.safeParse(Y);if(!J.success)throw new Br(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 _j(t){let e=null;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==null){if(r==="\\"){n+=1;continue}r===e&&(e=null);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Cn(t,e,n){let r=t.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(e,"structured args must be a JSON object"),i}let s={};for(let i of hj(r)){let o=i.indexOf("=");o===-1&&n(e,`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(e,`invalid arg name: ${a}`),s[a]=kw(l)}return s}function hj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function kw(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var dj,uj,Tw,Br,mj,pj,vw,Sw,Iw=E(()=>{"use strict";qr();Ew();Wr();dj={"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}},uj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Tw={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"},Br=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
2015
+ `)||e.startsWith("{")||e.startsWith("[")?_w(t,"$"):e.endsWith(".json")?_w(tj(e,"utf8"),e):t}function _w(t,e){try{return JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:"invalid JSON";throw new an({errors:[{path:e,message:`invalid JSON: ${r}`}]})}}function oj(t){let e=[],n=[],r=new Set(Object.keys(t.states));r.has(t.start_at)||n.push({state:"$",ref:t.start_at,kind:"next"}),aj(t,r,n);for(let[s,i]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:n}}function aj(t,e,n){let r=t.errors?.on_unhandled_failure_state;r!==void 0&&(e.has(r)||n.push({state:"$",ref:r,kind:"next"}))}var pw,an,yw=E(()=>{"use strict";Wr();qr();xu();pw=[1,2,3],an=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as lj}from"node:crypto";function ww(t,e){let n=cj(e),r=lj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${n}-${r}`}function cj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Ew=E(()=>{"use strict";qr()});function fj(t,e){let n=uj[t]??[],r={},s={};for(let[i,o]of Object.entries(e))n.includes(i)?s[i]=o:r[i]=o;return{params:r,members:s}}function bw(t){let e=[],n=(I,A)=>{throw new Br([{line:I,message:A}])},r=t.split(`
2016
+ `),s=[];for(let I=0;I<r.length;I+=1){let $=_j(r[I]).trim();$.length>0&&s.push({n:I+1,text:$})}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=[],u=[],d=[],f,m={},p=new Map,h=new Map,_=new Map,y=(I,A,$,G,B,W)=>{l.has(I)&&n(G,`duplicate step/terminal id: ${I}`),/^[A-Za-z][\w-]*$/.test(I)||n(G,`invalid id (must start with a letter): ${I}`),l.set(I,{declId:I,type:A,params:$,line:G,isTerminal:B,...W?{members:W}:{}}),u.push(I)},g=I=>{let A=[],$=I+1;for(;$<s.length;$+=1){let G=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[$].text);if(G===null)break;A.push({label:G[1],dst:G[2]})}return{branches:A,nextIdx:$-1}};for(let I=1;I<s.length;I+=1){let{n:A,text:$}=s[I],G=$.split(/\s+/,1)[0];if(/^meta\s*\(/.test($)){I!==1&&n(A,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let B=/^meta\s*\((.*)\)\s*$/.exec($)??n(A,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${$}`),W=Cn(B[1],A,n);for(let ne of Object.keys(W))vw.has(ne)||n(A,`unknown \`meta\` key \`${ne}\` \u2014 only workflow-level runtime metadata is allowed: ${[...vw].join(", ")} (no grammar inflation; bounded)`);m=W;continue}if(G==="step"){let B=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec($)??n(A,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${$}`),W=B[1],ne=B[2],Se=B[3],me=Tw[ne];me===void 0&&n(A,`unknown step type: ${ne} (supported \`step\` archetypes: ${Object.keys(Tw).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:Ae,members:en}=fj(me,Cn(Se,A,n));y(W,me,Ae,A,!1,Object.keys(en).length>0?en:void 0);continue}if(G==="trigger"){let B=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec($)??n(A,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${$}`),W=B[1],ne=B[2],Se=B[3],me=Sw[ne];me===void 0&&n(A,`unknown trigger type: ${ne} (registered trigger archetypes: ${Object.keys(Sw).join(", ")})`),p.has(W)&&n(A,`duplicate trigger id: ${W}`),p.set(W,{id:W,type:me,parameters:Cn(Se,A,n)});continue}if(G==="mcp"||G==="skill"){let B=new RegExp(`^${G}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec($)??n(A,`malformed \`${G}\` decl (expected \`${G} <name> = {json} | ${G} <name> = "<file|url>"\`): ${$}`),W=B[1],ne=B[2].trim(),Se=G==="mcp"?h:_;Se.has(W)&&n(A,`duplicate ${G} declaration: ${W}`);let me;if(ne.startsWith("{")){let Ae=Cn(ne,A,n);G==="mcp"?me={...Ae,name:W}:((typeof Ae.content!="string"||Ae.content.length===0)&&n(A,`\`skill ${W}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),me={name:W,content:Ae.content})}else{let Ae=kw(ne);(typeof Ae!="string"||Ae.length===0)&&n(A,`\`${G} ${W}\`: string form must be a non-empty file path or http(s) URL`),me=Ae}Se.set(W,me);continue}if(G==="terminal"){let B=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec($)??n(A,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${$}`);y(B[1],"lmctl/terminal",{name:B[2],kind:B[3]??"neutral"},A,!0);continue}if(G==="seq"){let W=$.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(ne=>ne.trim()).filter(ne=>ne.length>0);(W.length<3||W.length%2===0)&&n(A,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${$}`);for(let ne=0;ne+2<W.length+1&&!(ne+2>W.length-1);ne+=2){let Se=W[ne],me=W[ne+1],Ae=W[ne+2],en=me==="->"?"main":me.slice(1,-2);c.push({srcDeclId:Se,port:en,dstDeclId:Ae,line:A})}continue}if(G==="choice"){let W=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec($)??n(A,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${$}`))[1],ne=[],Se,me=I+1;for(;me<s.length;me+=1){let Ae=s[me].text,en=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(en!==null){Se!==void 0&&n(s[me].n,`\`choice ${W}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let hs=en[2];ne.push({when:en[1].trim(),next:`@terminal:${hs}`}),c.push({srcDeclId:W,port:hs,dstDeclId:en[3],line:s[me].n});continue}let tc=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(Ae);if(tc!==null){Se!==void 0&&n(s[me].n,`\`choice ${W}\` has more than one \`default\``);let hs=tc[1];Se=`@terminal:${hs}`,c.push({srcDeclId:W,port:hs,dstDeclId:tc[2],line:s[me].n});continue}break}ne.length===0&&n(A,`\`choice ${W}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),y(W,"lmctl/choice",{branches:ne,...Se!==void 0?{default_next:Se}:{}},A,!1),I=me-1;continue}if(G==="loop"){let B=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec($)??n(A,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${$}`);y(B[1],"lmctl/loop",Cn(B[2],A,n),A,!1);continue}if(G==="foreach"){let B=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec($)??n(A,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${$}`),W=Cn(B[2],A,n);"mode"in W&&n(A,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),y(B[1],"lmctl/foreach",W,A,!1);continue}if(G==="call"){let B=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec($)??n(A,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${$}`),W=B[1],ne=Cn(B[2],A,n),Se=ne.workflow;(typeof Se!="string"||Se.length===0)&&n(A,`\`call ${W}\` requires a \`workflow=<name>\` argument`);let{workflow:me,...Ae}=ne;y(W,"lmctl/subflow",{workflow_name:Se,...Ae},A,!1),d.push({declId:W,target:Se,line:A});continue}if(G==="decide"){let B=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec($)??n(A,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${$}`),W=B[1],ne=Cn(B[2],A,n),{branches:Se,nextIdx:me}=g(I);Se.length===0&&n(A,`\`decide ${W}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),y(W,"lmctl/interactive",{termination:{operator_signal:!0}},A,!1,{agent:ne});for(let Ae of Se)c.push({srcDeclId:W,port:Ae.label,dstDeclId:Ae.dst,line:A});I=me;continue}if(G==="entry"){let B=/^entry\s+([A-Za-z][\w-]*)$/.exec($)??n(A,`malformed \`entry\` (expected \`entry <id>\`): ${$}`);f!==void 0&&n(A,`duplicate \`entry\` (already set to ${f})`),f=B[1];continue}n(A,`unknown statement \`${G}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&n(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||n(s[0].n,`entry references undeclared step: ${f}`);let w=I=>{if(Array.isArray(I)){for(let $ of I)w($);return}if(typeof I!="object"||I===null)return;let A=I;if(typeof A.alias=="string")for(let[$,G]of[["mcp",h],["skills",_]]){let B=A[$];Array.isArray(B)&&(A[$]=B.map(W=>typeof W=="string"&&G.has(W)?structuredClone(G.get(W)):W))}for(let $ of Object.values(A))w($)};for(let I of u){let A=l.get(I);A.members!==void 0&&w(A.members)}let v=I=>ww(o,I),N=u.map(I=>{let A=l.get(I);return{id:v(I),name:I,type:A.type,typeVersion:1,parameters:A.params,...A.members?{members:A.members}:{}}}),S={};for(let I of c){l.has(I.srcDeclId)||n(I.line,`edge source references undeclared step: ${I.srcDeclId}`),l.has(I.dstDeclId)||n(I.line,`dangling edge target: ${I.dstDeclId} is not declared`),l.get(I.srcDeclId).isTerminal&&n(I.line,`terminal \`${I.srcDeclId}\` cannot have an outgoing edge`);let A=v(I.srcDeclId);S[A]??={},S[A][I.port]!==void 0&&n(I.line,`duplicate edge port \`${I.port}\` on step \`${I.srcDeclId}\``),S[A][I.port]=[[{step_id:v(I.dstDeclId),type:"main",index:0}]]}for(let I of u){let A=l.get(I);mj.has(A.type)||n(A.line,`unknown archetype \`${A.type}\` for step \`${I}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let I of d)I.target===o&&n(I.line,`subflow cycle: \`call ${I.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 O=new Map;for(let I of c){let A=O.get(I.srcDeclId);A===void 0?O.set(I.srcDeclId,[I.dstDeclId]):A.push(I.dstDeclId)}for(let I of u){let A=l.get(I);if(A.type!=="lmctl/loop")continue;let $=A.params.body;if(typeof $=="string"&&l.has($)){let G=O.get(I);G===void 0?O.set(I,[$]):G.push($)}}let P=new Set([f]),D=[f];for(;D.length>0;){let I=D.shift();for(let A of O.get(I)??[])P.has(A)||(P.add(A),D.push(A))}for(let I of u)P.has(I)||n(l.get(I).line,`step \`${I}\` is unreachable from entry \`${f}\``);let U=new Map;for(let I of c){let A=U.get(I.srcDeclId);A===void 0&&(A=new Set,U.set(I.srcDeclId,A)),A.add(I.port)}let x=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let I of u){let A=l.get(I);if(A.isTerminal)continue;let $=U.get(I)??new Set;if(A.type==="lmctl/review"){let B=[...$].some(W=>!x.has(W));!$.has("approve")&&!B&&n(A.line,`uncovered outcome: review step \`${I}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${I} -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 G=pj[A.type];if(G!==void 0)for(let B of G)$.has(B)||n(A.line,`uncovered outcome: required outcome \`${B}\` of step \`${I}\` (\`${A.type}\`) has no connection \u2014 route it (\`seq ${I} -${B}-> <target|terminal>\`)`);else $.size===0&&n(A.line,`uncovered outcome: non-terminal step \`${I}\` (\`${A.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let I of u){let A=l.get(I),$=dj[A.type];if($===void 0)continue;let G={...A.params,...A.members??{},type:$.v2type,state_name:I,...Object.keys($.outcomes).length>0?{outcomes:$.outcomes}:{}},B=$.schema.safeParse(G);if(!B.success){let W=B.error.issues[0],ne=W.path.length===0?"$":W.path.map(String).join(".");n(A.line,`step \`${I}\` (\`${A.type}\`) has invalid params for archetype \`${$.v2type}\` at \`${ne}\`: ${W.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${I} = ${A.type.replace("lmctl/","")}({ ... })\``)}}let j={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:N,connections:S,entry_step_id:v(f)},q=Jt.safeParse(j);if(!q.success)throw new Br(q.error.issues.map(I=>({line:s[0].n,message:`emitted V3 invalid at ${I.path.length===0?"$":I.path.map(String).join(".")}: ${I.message}`})));return q.data}function _j(t){let e=null;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==null){if(r==="\\"){n+=1;continue}r===e&&(e=null);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function Cn(t,e,n){let r=t.trim();if(r.length===0)return{};if(r.startsWith("{")){let i;try{i=JSON.parse(r)}catch(o){n(e,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&n(e,"structured args must be a JSON object"),i}let s={};for(let i of hj(r)){let o=i.indexOf("=");o===-1&&n(e,`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(e,`invalid arg name: ${a}`),s[a]=kw(l)}return s}function hj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function kw(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var dj,uj,Tw,Br,mj,pj,vw,Sw,Iw=E(()=>{"use strict";qr();Ew();Wr();dj={"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}},uj={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};Tw={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"},Br=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
2017
2017
  ${e.map(n=>` line ${n.line}: ${n.message}`).join(`
2018
2018
  `)}`),this.issues=e,this.name="DslCompileError"}},mj=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"]),pj={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},vw=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),Sw={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as gj}from"node:fs";function yj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function wj(t){for(let e of t.split(`
2019
2019
  `)){let n=e.replace(/#.*/,"").trim();if(n.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(n)}return!1}function It(t){if(typeof t=="string"&&yj()&&wj(t)){let n;try{n=bw(t)}catch(s){throw s instanceof Br?new ln(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let r=Jt.safeParse(n);if(!r.success)throw new ln(r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return r.data}let e=da(Tj(t));if(vj(e)&&e.definition_schema_version===3){let n=Jt.safeParse(e);if(!n.success)throw new ln(n.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message})));return n.data}return Ej(e)}function Ej(t){let e=la.safeParse(t);if(!e.success)throw new ln(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let n=e.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 ln([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return hw(n)}catch(s){throw s instanceof an?new Ru(s):s}}function Tj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
@@ -2026,7 +2026,7 @@ ${r}`}function Qj(t,e,n,r){let s=ar(t,Bu),i=`- [${e}.md](${e}.md)${r!==null?` \u
2026
2026
  `)?`${o}
2027
2027
  ${i}
2028
2028
  `:`${o}${i}
2029
- `,qu(s,o,"utf8")}function eP(t,e){let n=ar(t,Bu);if(!Hr(n))return;let r=ga(n,"utf8"),s=new RegExp(`^- \\[${Bw(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&qu(n,r.replace(s,""),"utf8")}function Bw(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function tP(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function Nt(t,e){return t.durable_memory_mode==="db"?new Wu(e,t.id):new Uu(t.local_path)}var zj,Bu,Ww,Uu,Wu,Hu=E(()=>{"use strict";zj=/^[a-zA-Z0-9_-]+$/;Bu="MEMORY.md",Ww="1970-01-01T00:00:00.000Z",Uu=class{dir;constructor(e){this.dir=ar(e,"durable-memory")}read(e){pt(e);let n=ar(this.dir,`${e}.md`);if(!Hr(n))return null;let r=ga(n,"utf8");return qw(e,r)}write(e){pt(e.name),Kj(this.dir,{recursive:!0});let n=ar(this.dir,`${e.name}.md`),r=!Hr(n),s=Zj(e.name,e.type,e.description??null,e.body);return qu(n,s,"utf8"),Qj(this.dir,e.name,e.type,e.description??null),{created:r}}index(e){return this.listFiles().filter(n=>e===void 0||e.length===0||e.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(e){return this.listFiles().filter(n=>e===void 0||n.type===e).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(e){pt(e);let n=ar(this.dir,`${e}.md`);return Hr(n)?(Yj(n),eP(this.dir,e),!0):!1}listFiles(){if(!Hr(this.dir))return[];let e=Vj(this.dir).filter(r=>r.endsWith(".md")&&r!==Bu),n=[];for(let r of e){let s=r.slice(0,-3),i=ga(ar(this.dir,r),"utf8"),o=qw(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};Wu=class{dal;projectId;constructor(e,n){this.dal=e,this.projectId=n}read(e){pt(e);let n=this.dal.getDurableMemoryByName(this.projectId,e);return n===null?null:{name:n.name,type:n.type,description:n.description,body:n.body,created_at:n.created_at,updated_at:n.updated_at}}write(e){pt(e.name);let n=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:n===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(e){return pt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Xw(t,e){let{dal:n}=e;t.get("/api/durable-memory/index/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=Nt(i,n),a=r.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return r.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",r=>{let s=Number(r.req.param("project_id")),i=r.req.param("name"),o=n.getProject(s);if(o===null)return r.json({error:"project not found"},404);let a=Nt(o,n),l;try{l=a.read(i)}catch(c){return r.json({error:c.message},400)}return l===null?r.json({error:`memory entry not found: ${i}`},404):r.json(l)}),t.post("/api/durable-memory/write/:project_id",async r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o;try{o=await r.req.json()}catch{return r.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,u=typeof o.description=="string"?o.description:null;if(a===null||!Hw.has(a))return r.json({error:`invalid type: must be one of ${[...Hw].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let d=Nt(i,n),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=Nt(i,n),a=r.req.query("type");return r.json(o.list(a))})}var Hw,Jw=E(()=>{"use strict";Hu();Hw=new Set(["user","feedback","project","reference"])});function rP(t){let e=4294967295;for(let n=0;n<t.length;n+=1)e=(nP[(e^t[n])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function sP(t){let e=Math.max(1980,t.getFullYear()),n=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,r=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:n,date:r}}function Gw(t,e=new Date){let{time:n,date:r}=sP(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let _=a.encode(h.name),y=rP(h.data),g=h.data.length,w=new Uint8Array(30+_.length),S=new DataView(w.buffer);S.setUint32(0,67324752,!0),S.setUint16(4,20,!0),S.setUint16(6,0,!0),S.setUint16(8,0,!0),S.setUint16(10,n,!0),S.setUint16(12,r,!0),S.setUint32(14,y,!0),S.setUint32(18,g,!0),S.setUint32(22,g,!0),S.setUint16(26,_.length,!0),S.setUint16(28,0,!0),w.set(_,30),s.push(w,h.data);let I=new Uint8Array(46+_.length),v=new DataView(I.buffer);v.setUint32(0,33639248,!0),v.setUint16(4,20,!0),v.setUint16(6,20,!0),v.setUint16(8,0,!0),v.setUint16(10,0,!0),v.setUint16(12,n,!0),v.setUint16(14,r,!0),v.setUint32(16,y,!0),v.setUint32(20,g,!0),v.setUint32(24,g,!0),v.setUint16(28,_.length,!0),v.setUint16(30,0,!0),v.setUint16(32,0,!0),v.setUint16(34,0,!0),v.setUint16(36,0,!0),v.setUint32(38,0,!0),v.setUint32(42,o,!0),I.set(_,46),i.push(I),o+=w.length+h.data.length}let l=o,c=0;for(let h of i)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of i)m.set(h,p),p+=h.length;return m.set(u,p),m}var nP,Kw=E(()=>{"use strict";nP=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let n=e;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;t[e]=n>>>0}return t})()});import{existsSync as Ea,mkdirSync as iP,readdirSync as oP,readFileSync as zw,statSync as aP,unlinkSync as lP,writeFileSync as cP}from"node:fs";import{join as zs}from"node:path";function Zw(t,e){let{dal:n}=e;t.post("/api/projects",async r=>{let s=await At(r);if(typeof s=="string")return R(r,s,400);let i=he(s,"name"),o=he(s,"local_path");if(i===null||i.length===0)return R(r,"missing or empty name",400);if(o===null||o.length===0)return R(r,"missing or empty local_path",400);if(n.findProjectByName(i)!==null)return R(r,`project already exists: ${i}`,409);let a=he(s,"workflow_name")??"bugfix",l,c=he(s,"team_name");if(c!==null&&c.length>0){let d=n.findTeamByName(c);if(d===null)return R(r,`team not found: ${c}`,404);l=d.id}else{let d=n.listTeams();if(d.length===0)return R(r,"no teams exist; create a team first",400);l=d[0].id}let u=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:he(s,"default_branch")});return r.json(u,201)}),t.patch("/api/projects/:name",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(r,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(r,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(r,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(r,"intake_config must be a JSON object, string, or null",400)}let a=n.updateProjectSettings(s.id,o);return a===null?R(r,"project not found",404):r.json(a)}),t.post("/api/teams",async r=>{let s=await At(r);if(typeof s=="string")return R(r,s,400);let i=he(s,"name");if(i===null||i.length===0)return R(r,"missing or empty name",400);if(n.findTeamByName(i)!==null)return R(r,`team already exists: ${i}`,409);let o=n.insertTeam({name:i});return r.json(o,201)}),t.post("/api/teams/:name/members",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return R(r,"team not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o=he(i,"alias"),a=he(i,"provider");if(o===null||o.length===0)return R(r,"missing or empty alias",400);if(a===null||a.length===0)return R(r,"missing or empty provider",400);if(n.findTeamMemberByAlias(s.id,o)!==null)return R(r,`member already exists: ${o}`,409);let l=he(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),u=he(i,"role_prompt");u!==null&&n.setMemberRolePrompt(c.id,u);let d=n.findTeamMemberByAlias(s.id,o);return r.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return R(r,"team not found",404);let i=n.findTeamMemberByAlias(s.id,r.req.param("alias"));if(i===null)return R(r,"member not found",404);let o=await At(r);if(typeof o=="string")return R(r,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(r,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(r,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(r,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(r,"no updatable fields provided",400);let l=n.updateTeamMemberMeta(i.id,a);return l===null?R(r,"member not found",404):r.json(l)}),t.get("/api/projects/:name/durable-memory",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=Nt(s,n);return r.json(i.index())}),t.post("/api/projects/:name/durable-memory",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return R(r,"missing or empty name",400);if(a===null)return R(r,"missing body",400);if(l===null||!ya.includes(l))return R(r,`invalid type: must be one of ${ya.join("|")}`,400);try{pt(o)}catch(d){return R(r,d.message,400)}let c=Nt(s,n);try{if(c.read(o)!==null)return R(r,`chapter already exists: ${o}`,409)}catch(d){return R(r,d.message,400)}try{c.write({type:l,name:o,description:he(i,"description"),body:a})}catch(d){return R(r,d.message,400)}let u=c.read(o);return u===null?R(r,"chapter created but unreadable",500):r.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=Nt(s,n),o;try{o=i.read(r.req.param("chapter"))}catch(a){return R(r,a.message,400)}return o===null?R(r,"chapter not found",404):r.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=r.req.param("chapter"),o=await At(r);if(typeof o=="string")return R(r,o,400);let a=Nt(s,n),l;try{l=a.read(i)}catch(m){return R(r,m.message,400)}if(l===null)return R(r,"chapter not found",404);let c=he(o,"body")??l.body,u=Object.prototype.hasOwnProperty.call(o,"description")?he(o,"description"):l.description,d=he(o,"type")??l.type;if(!ya.includes(d))return R(r,`invalid type: must be one of ${ya.join("|")}`,400);try{a.write({type:d,name:i,description:u,body:c})}catch(m){return R(r,m.message,400)}let f=a.read(i);return f===null?R(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=Nt(s,n),o;try{o=i.delete(r.req.param("chapter"))}catch(a){return R(r,a.message,400)}return o?r.json({removed:!0}):R(r,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",r=>{let s=n.findProjectByName(r.req.param("name"));return s===null?R(r,"project not found",404):r.json(uP(s.local_path))}),t.post("/api/projects/:name/ai-test",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return R(r,"missing or empty name",400);if(a===null)return R(r,"missing body",400);if(l===null||!wa.has(l))return R(r,`invalid type: must be one of ${[...wa].join("|")}`,400);try{pt(o)}catch(f){return R(r,f.message,400)}let c=Vs(s.local_path),u=zs(c,`${o}.md`);if(Ea(u))return R(r,`chapter already exists: ${o}`,409);iP(c,{recursive:!0}),Yw(u,o,l,he(i,"description"),a);let d=Ys(c,o);return d===null?R(r,"chapter created but unreadable",500):r.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);try{pt(r.req.param("chapter"))}catch(o){return R(r,o.message,400)}let i=Ys(Vs(s.local_path),r.req.param("chapter"));return i===null?R(r,"chapter not found",404):r.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=r.req.param("chapter");try{pt(i)}catch(m){return R(r,m.message,400)}let o=Vs(s.local_path),a=Ys(o,i);if(a===null)return R(r,"chapter not found",404);let l=await At(r);if(typeof l=="string")return R(r,l,400);let c=he(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?he(l,"description"):a.description,d=he(l,"type")??a.type;if(!wa.has(d))return R(r,`invalid type: must be one of ${[...wa].join("|")}`,400);Yw(zs(o,`${i}.md`),i,d,u,c);let f=Ys(o,i);return f===null?R(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=r.req.param("chapter");try{pt(i)}catch(a){return R(r,a.message,400)}let o=zs(Vs(s.local_path),`${i}.md`);return Ea(o)?(lP(o),r.json({removed:!0})):R(r,"chapter not found",404)}),t.get("/api/tokens",r=>r.json([])),t.post("/api/tokens",r=>R(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",r=>r.json({})),t.patch("/api/settings",async r=>{let s=await At(r);return typeof s=="string"?R(r,s,400):r.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(Vw))),t.post("/api/chat/sessions",async r=>{let s=await dP(r);if(typeof s=="string")return R(r,s,400);let i=s!==null?he(s,"title"):null,o=n.createChatbotSession(Vw,i);return r.json(o,201)}),t.get("/api/chat/sessions/:id/messages",r=>{let s=r.req.param("id");return n.getChatbotSession(s)===null?R(r,"chat session not found",404):r.json(n.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async r=>{let s=r.req.param("id");if(n.getChatbotSession(s)===null)return R(r,"chat session not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o=he(i,"role"),a=he(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(r,"role must be one of user|assistant|tool",400);if(a===null)return R(r,"missing content",400);let l=n.appendChatbotMessage(s,o,a);return r.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",r=>{let s=Number(r.req.param("id"));if(!Number.isInteger(s))return R(r,"invalid run id",400);if(n.getRun(s)===null)return R(r,"run not found",404);let o=sr(n,s),a=[];for(let c of o){let u=mP(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=zw(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=Gw(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(t,e,n){return t.json({error:e},n)}async function At(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function dP(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let n=JSON.parse(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function he(t,e){let n=t[e];return typeof n!="string"?null:n}function Vs(t){return zs(t,"ai-test")}function Ys(t,e){let n=zs(t,`${e}.md`);if(!Ea(n))return null;let r=zw(n,"utf8"),s=fP(r),i=aP(n).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function uP(t){let e=Vs(t);return Ea(e)?oP(e).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=Ys(e,n);if(r===null)return null;let{name:s,type:i,description:o,updated_at:a}=r;return{name:s,type:i,description:o,updated_at:a}}).filter(n=>n!==null):[]}function Yw(t,e,n,r,s){let i=r!==null&&r.length>0?`
2029
+ `,qu(s,o,"utf8")}function eP(t,e){let n=ar(t,Bu);if(!Hr(n))return;let r=ga(n,"utf8"),s=new RegExp(`^- \\[${Bw(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(r)&&qu(n,r.replace(s,""),"utf8")}function Bw(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function tP(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function Nt(t,e){return t.durable_memory_mode==="db"?new Wu(e,t.id):new Uu(t.local_path)}var zj,Bu,Ww,Uu,Wu,Hu=E(()=>{"use strict";zj=/^[a-zA-Z0-9_-]+$/;Bu="MEMORY.md",Ww="1970-01-01T00:00:00.000Z",Uu=class{dir;constructor(e){this.dir=ar(e,"durable-memory")}read(e){pt(e);let n=ar(this.dir,`${e}.md`);if(!Hr(n))return null;let r=ga(n,"utf8");return qw(e,r)}write(e){pt(e.name),Kj(this.dir,{recursive:!0});let n=ar(this.dir,`${e.name}.md`),r=!Hr(n),s=Zj(e.name,e.type,e.description??null,e.body);return qu(n,s,"utf8"),Qj(this.dir,e.name,e.type,e.description??null),{created:r}}index(e){return this.listFiles().filter(n=>e===void 0||e.length===0||e.includes(n.type)).map(({name:n,type:r,description:s,updated_at:i})=>({name:n,type:r,description:s,updated_at:i}))}list(e){return this.listFiles().filter(n=>e===void 0||n.type===e).map(({name:n,type:r,updated_at:s})=>({name:n,type:r,updated_at:s}))}delete(e){pt(e);let n=ar(this.dir,`${e}.md`);return Hr(n)?(Yj(n),eP(this.dir,e),!0):!1}listFiles(){if(!Hr(this.dir))return[];let e=Vj(this.dir).filter(r=>r.endsWith(".md")&&r!==Bu),n=[];for(let r of e){let s=r.slice(0,-3),i=ga(ar(this.dir,r),"utf8"),o=qw(s,i);o!==null&&n.push(o)}return n.sort((r,s)=>r.name.localeCompare(s.name))}};Wu=class{dal;projectId;constructor(e,n){this.dal=e,this.projectId=n}read(e){pt(e);let n=this.dal.getDurableMemoryByName(this.projectId,e);return n===null?null:{name:n.name,type:n.type,description:n.description,body:n.body,created_at:n.created_at,updated_at:n.updated_at}}write(e){pt(e.name);let n=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:n===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,description:r.description,updated_at:r.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(r=>({name:r.name,type:r.type,updated_at:r.updated_at}))}delete(e){return pt(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function Xw(t,e){let{dal:n}=e;t.get("/api/durable-memory/index/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=Nt(i,n),a=r.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return r.json(o.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",r=>{let s=Number(r.req.param("project_id")),i=r.req.param("name"),o=n.getProject(s);if(o===null)return r.json({error:"project not found"},404);let a=Nt(o,n),l;try{l=a.read(i)}catch(c){return r.json({error:c.message},400)}return l===null?r.json({error:`memory entry not found: ${i}`},404):r.json(l)}),t.post("/api/durable-memory/write/:project_id",async r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o;try{o=await r.req.json()}catch{return r.json({error:"invalid JSON body"},400)}let a=typeof o.type=="string"?o.type:null,l=typeof o.name=="string"?o.name:null,c=typeof o.body=="string"?o.body:null,u=typeof o.description=="string"?o.description:null;if(a===null||!Hw.has(a))return r.json({error:`invalid type: must be one of ${[...Hw].join("|")}`},400);if(l===null)return r.json({error:"missing name"},400);if(c===null)return r.json({error:"missing body"},400);let d=Nt(i,n),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return r.json({error:m.message},400)}return r.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",r=>{let s=Number(r.req.param("project_id")),i=n.getProject(s);if(i===null)return r.json({error:"project not found"},404);let o=Nt(i,n),a=r.req.query("type");return r.json(o.list(a))})}var Hw,Jw=E(()=>{"use strict";Hu();Hw=new Set(["user","feedback","project","reference"])});function rP(t){let e=4294967295;for(let n=0;n<t.length;n+=1)e=(nP[(e^t[n])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function sP(t){let e=Math.max(1980,t.getFullYear()),n=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,r=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:n,date:r}}function Gw(t,e=new Date){let{time:n,date:r}=sP(e),s=[],i=[],o=0,a=new TextEncoder;for(let h of t){let _=a.encode(h.name),y=rP(h.data),g=h.data.length,w=new Uint8Array(30+_.length),v=new DataView(w.buffer);v.setUint32(0,67324752,!0),v.setUint16(4,20,!0),v.setUint16(6,0,!0),v.setUint16(8,0,!0),v.setUint16(10,n,!0),v.setUint16(12,r,!0),v.setUint32(14,y,!0),v.setUint32(18,g,!0),v.setUint32(22,g,!0),v.setUint16(26,_.length,!0),v.setUint16(28,0,!0),w.set(_,30),s.push(w,h.data);let N=new Uint8Array(46+_.length),S=new DataView(N.buffer);S.setUint32(0,33639248,!0),S.setUint16(4,20,!0),S.setUint16(6,20,!0),S.setUint16(8,0,!0),S.setUint16(10,0,!0),S.setUint16(12,n,!0),S.setUint16(14,r,!0),S.setUint32(16,y,!0),S.setUint32(20,g,!0),S.setUint32(24,g,!0),S.setUint16(28,_.length,!0),S.setUint16(30,0,!0),S.setUint16(32,0,!0),S.setUint16(34,0,!0),S.setUint16(36,0,!0),S.setUint32(38,0,!0),S.setUint32(42,o,!0),N.set(_,46),i.push(N),o+=w.length+h.data.length}let l=o,c=0;for(let h of i)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of i)m.set(h,p),p+=h.length;return m.set(u,p),m}var nP,Kw=E(()=>{"use strict";nP=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let n=e;for(let r=0;r<8;r+=1)n=n&1?3988292384^n>>>1:n>>>1;t[e]=n>>>0}return t})()});import{existsSync as Ea,mkdirSync as iP,readdirSync as oP,readFileSync as zw,statSync as aP,unlinkSync as lP,writeFileSync as cP}from"node:fs";import{join as zs}from"node:path";function Zw(t,e){let{dal:n}=e;t.post("/api/projects",async r=>{let s=await At(r);if(typeof s=="string")return R(r,s,400);let i=he(s,"name"),o=he(s,"local_path");if(i===null||i.length===0)return R(r,"missing or empty name",400);if(o===null||o.length===0)return R(r,"missing or empty local_path",400);if(n.findProjectByName(i)!==null)return R(r,`project already exists: ${i}`,409);let a=he(s,"workflow_name")??"bugfix",l,c=he(s,"team_name");if(c!==null&&c.length>0){let d=n.findTeamByName(c);if(d===null)return R(r,`team not found: ${c}`,404);l=d.id}else{let d=n.listTeams();if(d.length===0)return R(r,"no teams exist; create a team first",400);l=d[0].id}let u=n.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:he(s,"default_branch")});return r.json(u,201)}),t.patch("/api/projects/:name",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o={};if(Object.prototype.hasOwnProperty.call(i,"local_path")){let l=i.local_path;if(typeof l!="string"||l.length===0)return R(r,"local_path must be a non-empty string",400);o.local_path=l}if(Object.prototype.hasOwnProperty.call(i,"durable_memory_mode")){let l=i.durable_memory_mode;if(l!=="folder"&&l!=="db")return R(r,'durable_memory_mode must be "folder" or "db"',400);o.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(i,"default_branch")){let l=i.default_branch;if(l!==null&&typeof l!="string")return R(r,"default_branch must be string or null",400);o.default_branch=l}if(Object.prototype.hasOwnProperty.call(i,"intake_config")){let l=i.intake_config;if(l===null)o.intake_config=null;else if(typeof l=="string")o.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))o.intake_config=JSON.stringify(l);else return R(r,"intake_config must be a JSON object, string, or null",400)}let a=n.updateProjectSettings(s.id,o);return a===null?R(r,"project not found",404):r.json(a)}),t.post("/api/teams",async r=>{let s=await At(r);if(typeof s=="string")return R(r,s,400);let i=he(s,"name");if(i===null||i.length===0)return R(r,"missing or empty name",400);if(n.findTeamByName(i)!==null)return R(r,`team already exists: ${i}`,409);let o=n.insertTeam({name:i});return r.json(o,201)}),t.post("/api/teams/:name/members",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return R(r,"team not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o=he(i,"alias"),a=he(i,"provider");if(o===null||o.length===0)return R(r,"missing or empty alias",400);if(a===null||a.length===0)return R(r,"missing or empty provider",400);if(n.findTeamMemberByAlias(s.id,o)!==null)return R(r,`member already exists: ${o}`,409);let l=he(i,"model"),c=n.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),u=he(i,"role_prompt");u!==null&&n.setMemberRolePrompt(c.id,u);let d=n.findTeamMemberByAlias(s.id,o);return r.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async r=>{let s=n.findTeamByName(r.req.param("name"));if(s===null)return R(r,"team not found",404);let i=n.findTeamMemberByAlias(s.id,r.req.param("alias"));if(i===null)return R(r,"member not found",404);let o=await At(r);if(typeof o=="string")return R(r,o,400);let a={};if(Object.prototype.hasOwnProperty.call(o,"role_prompt")){let c=o.role_prompt;if(c!==null&&typeof c!="string")return R(r,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(o,"model")){let c=o.model;if(c!==null&&typeof c!="string")return R(r,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(o,"provider")){let c=o.provider;if(typeof c!="string"||c.length===0)return R(r,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(r,"no updatable fields provided",400);let l=n.updateTeamMemberMeta(i.id,a);return l===null?R(r,"member not found",404):r.json(l)}),t.get("/api/projects/:name/durable-memory",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=Nt(s,n);return r.json(i.index())}),t.post("/api/projects/:name/durable-memory",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return R(r,"missing or empty name",400);if(a===null)return R(r,"missing body",400);if(l===null||!ya.includes(l))return R(r,`invalid type: must be one of ${ya.join("|")}`,400);try{pt(o)}catch(d){return R(r,d.message,400)}let c=Nt(s,n);try{if(c.read(o)!==null)return R(r,`chapter already exists: ${o}`,409)}catch(d){return R(r,d.message,400)}try{c.write({type:l,name:o,description:he(i,"description"),body:a})}catch(d){return R(r,d.message,400)}let u=c.read(o);return u===null?R(r,"chapter created but unreadable",500):r.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=Nt(s,n),o;try{o=i.read(r.req.param("chapter"))}catch(a){return R(r,a.message,400)}return o===null?R(r,"chapter not found",404):r.json(o)}),t.put("/api/projects/:name/durable-memory/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=r.req.param("chapter"),o=await At(r);if(typeof o=="string")return R(r,o,400);let a=Nt(s,n),l;try{l=a.read(i)}catch(m){return R(r,m.message,400)}if(l===null)return R(r,"chapter not found",404);let c=he(o,"body")??l.body,u=Object.prototype.hasOwnProperty.call(o,"description")?he(o,"description"):l.description,d=he(o,"type")??l.type;if(!ya.includes(d))return R(r,`invalid type: must be one of ${ya.join("|")}`,400);try{a.write({type:d,name:i,description:u,body:c})}catch(m){return R(r,m.message,400)}let f=a.read(i);return f===null?R(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=Nt(s,n),o;try{o=i.delete(r.req.param("chapter"))}catch(a){return R(r,a.message,400)}return o?r.json({removed:!0}):R(r,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",r=>{let s=n.findProjectByName(r.req.param("name"));return s===null?R(r,"project not found",404):r.json(uP(s.local_path))}),t.post("/api/projects/:name/ai-test",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o=he(i,"name"),a=he(i,"body"),l=he(i,"type");if(o===null||o.length===0)return R(r,"missing or empty name",400);if(a===null)return R(r,"missing body",400);if(l===null||!wa.has(l))return R(r,`invalid type: must be one of ${[...wa].join("|")}`,400);try{pt(o)}catch(f){return R(r,f.message,400)}let c=Vs(s.local_path),u=zs(c,`${o}.md`);if(Ea(u))return R(r,`chapter already exists: ${o}`,409);iP(c,{recursive:!0}),Yw(u,o,l,he(i,"description"),a);let d=Ys(c,o);return d===null?R(r,"chapter created but unreadable",500):r.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);try{pt(r.req.param("chapter"))}catch(o){return R(r,o.message,400)}let i=Ys(Vs(s.local_path),r.req.param("chapter"));return i===null?R(r,"chapter not found",404):r.json(i)}),t.put("/api/projects/:name/ai-test/:chapter",async r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=r.req.param("chapter");try{pt(i)}catch(m){return R(r,m.message,400)}let o=Vs(s.local_path),a=Ys(o,i);if(a===null)return R(r,"chapter not found",404);let l=await At(r);if(typeof l=="string")return R(r,l,400);let c=he(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?he(l,"description"):a.description,d=he(l,"type")??a.type;if(!wa.has(d))return R(r,`invalid type: must be one of ${[...wa].join("|")}`,400);Yw(zs(o,`${i}.md`),i,d,u,c);let f=Ys(o,i);return f===null?R(r,"chapter updated but unreadable",500):r.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",r=>{let s=n.findProjectByName(r.req.param("name"));if(s===null)return R(r,"project not found",404);let i=r.req.param("chapter");try{pt(i)}catch(a){return R(r,a.message,400)}let o=zs(Vs(s.local_path),`${i}.md`);return Ea(o)?(lP(o),r.json({removed:!0})):R(r,"chapter not found",404)}),t.get("/api/tokens",r=>r.json([])),t.post("/api/tokens",r=>R(r,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",r=>r.json({})),t.patch("/api/settings",async r=>{let s=await At(r);return typeof s=="string"?R(r,s,400):r.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",r=>r.json(n.listChatbotSessions(Vw))),t.post("/api/chat/sessions",async r=>{let s=await dP(r);if(typeof s=="string")return R(r,s,400);let i=s!==null?he(s,"title"):null,o=n.createChatbotSession(Vw,i);return r.json(o,201)}),t.get("/api/chat/sessions/:id/messages",r=>{let s=r.req.param("id");return n.getChatbotSession(s)===null?R(r,"chat session not found",404):r.json(n.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async r=>{let s=r.req.param("id");if(n.getChatbotSession(s)===null)return R(r,"chat session not found",404);let i=await At(r);if(typeof i=="string")return R(r,i,400);let o=he(i,"role"),a=he(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(r,"role must be one of user|assistant|tool",400);if(a===null)return R(r,"missing content",400);let l=n.appendChatbotMessage(s,o,a);return r.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",r=>{let s=Number(r.req.param("id"));if(!Number.isInteger(s))return R(r,"invalid run id",400);if(n.getRun(s)===null)return R(r,"run not found",404);let o=sr(n,s),a=[];for(let c of o){let u=mP(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=zw(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=Gw(a);return new Response(l,{status:200,headers:{"Content-Type":"application/zip","Content-Disposition":`attachment; filename="run-${s}-artifacts.zip"`,"Content-Length":String(l.byteLength)}})})}function R(t,e,n){return t.json({error:e},n)}async function At(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function dP(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let n=JSON.parse(e);return n!==null&&typeof n=="object"&&!Array.isArray(n)?n:"invalid JSON body"}catch{return"invalid JSON body"}}function he(t,e){let n=t[e];return typeof n!="string"?null:n}function Vs(t){return zs(t,"ai-test")}function Ys(t,e){let n=zs(t,`${e}.md`);if(!Ea(n))return null;let r=zw(n,"utf8"),s=fP(r),i=aP(n).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:i}}function uP(t){let e=Vs(t);return Ea(e)?oP(e).filter(n=>n.endsWith(".md")&&n!=="index.md").map(n=>n.slice(0,-3)).sort().map(n=>{let r=Ys(e,n);if(r===null)return null;let{name:s,type:i,description:o,updated_at:a}=r;return{name:s,type:i,description:o,updated_at:a}}).filter(n=>n!==null):[]}function Yw(t,e,n,r,s){let i=r!==null&&r.length>0?`
2030
2030
  description: ${r}`:"",o=`---
2031
2031
  name: ${e}${i}
2032
2032
  type: ${n}
@@ -2097,23 +2097,23 @@ ${s}`;cP(t,o,"utf8")}function fP(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
2097
2097
  JOIN step s ON s.id = sa.step_id
2098
2098
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let r=e.getRun(t);if(r===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let i=s[0].id,o=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
2099
2099
  JOIN step s ON s.id = sa.step_id
2100
- WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let A of a){let Y=l.get(A.step_id)??[];Y.push({kind:A.kind,id:A.id}),l.set(A.step_id,Y)}let c=o.map(A=>({id:A.id,state_name:A.state_name,outcome:A.outcome,duration_ms:A.started_at!==null&&A.ended_at!==null?Math.max(0,new Date(A.ended_at).getTime()-new Date(A.started_at).getTime()):null,artifacts:l.get(A.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let A of d)try{let Y=JSON.parse(A.payload);typeof Y.elapsedMs=="number"&&Y.elapsedMs>0&&(f+=Y.elapsedMs)}catch{}let m=u.map(A=>({kind:A.kind,count:A.count,total_elapsed_ms:A.kind==="tool_result"?f:0})),p=c.filter(A=>A.outcome==="request_changes"),h=[...new Set(p.map(A=>A.state_name))],_=new Date(r.started_at).getTime(),y=r.ended_at!==null?new Date(r.ended_at).getTime():Date.now(),w=e.query("SELECT project_id FROM job WHERE id = ?",r.job_id)[0]?.project_id??null,S=w!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
2101
- WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,w,_,y):[],v=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
2102
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,r.started_at,r.ended_at??new Date().toISOString())[0],M=v?.input!==null&&v?.input!==void 0?`input: ${v.input}, output: ${v.output??0}`:"n/a",D=e.getWorkflow(r.workflow_id),j=r.started_at!==null&&r.ended_at!==null?Math.max(0,new Date(r.ended_at).getTime()-new Date(r.started_at).getTime()):null,U={run_id:t,workflow_name:D?.name??null,started_at:r.started_at,ended_at:r.ended_at,terminal_state:r.terminal_state,duration_ms:j,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:S,token_totals:M};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(U)})}var lE=E(()=>{"use strict"});import{spawnSync as dE}from"node:child_process";function zu(t){return RP[t]??`no install hint; ensure '${t}' is on PATH`}function OP(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function cE(t){return dE("which",[t],{encoding:"utf8"}).status===0}function uE(t){if(t===void 0)return null;for(let e of t.tools??[])if(!cE(e)){let n=zu(e);return{kind:"missing_tool",tool:e,install_hint:n,message:`missing dependency: ${e}; ${n}`}}for(let e of t.auth??[]){if(!cE(e)){let s=zu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let n=OP(e);if(n===null)continue;let r=dE(e,n.args,{encoding:"utf8"});if(r.status!==0){let s=typeof r.stderr=="string"?r.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:zu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var RP,fE=E(()=>{"use strict";RP={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code",kimi:"install: https://github.com/MoonshotAI/kimi-code"}});import{existsSync as LP,readdirSync as CP,readFileSync as $P}from"node:fs";import{join as mE}from"node:path";function MP(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let n=e[1],r=n.match(/^tags:\s*\[([^\]]*)\]/m);if(r)return r[1].split(",").map(i=>i.trim()).filter(Boolean);let s=n.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
2100
+ WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let x of a){let j=l.get(x.step_id)??[];j.push({kind:x.kind,id:x.id}),l.set(x.step_id,j)}let c=o.map(x=>({id:x.id,state_name:x.state_name,outcome:x.outcome,duration_ms:x.started_at!==null&&x.ended_at!==null?Math.max(0,new Date(x.ended_at).getTime()-new Date(x.started_at).getTime()):null,artifacts:l.get(x.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let x of d)try{let j=JSON.parse(x.payload);typeof j.elapsedMs=="number"&&j.elapsedMs>0&&(f+=j.elapsedMs)}catch{}let m=u.map(x=>({kind:x.kind,count:x.count,total_elapsed_ms:x.kind==="tool_result"?f:0})),p=c.filter(x=>x.outcome==="request_changes"),h=[...new Set(p.map(x=>x.state_name))],_=new Date(r.started_at).getTime(),y=r.ended_at!==null?new Date(r.ended_at).getTime():Date.now(),w=e.query("SELECT project_id FROM job WHERE id = ?",r.job_id)[0]?.project_id??null,v=w!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
2101
+ WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,w,_,y):[],S=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
2102
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,r.started_at,r.ended_at??new Date().toISOString())[0],O=S?.input!==null&&S?.input!==void 0?`input: ${S.input}, output: ${S.output??0}`:"n/a",P=e.getWorkflow(r.workflow_id),D=r.started_at!==null&&r.ended_at!==null?Math.max(0,new Date(r.ended_at).getTime()-new Date(r.started_at).getTime()):null,U={run_id:t,workflow_name:P?.name??null,started_at:r.started_at,ended_at:r.ended_at,terminal_state:r.terminal_state,duration_ms:D,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:v,token_totals:O};e.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(U)})}var lE=E(()=>{"use strict"});import{spawnSync as dE}from"node:child_process";function zu(t){return RP[t]??`no install hint; ensure '${t}' is on PATH`}function OP(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function cE(t){return dE("which",[t],{encoding:"utf8"}).status===0}function uE(t){if(t===void 0)return null;for(let e of t.tools??[])if(!cE(e)){let n=zu(e);return{kind:"missing_tool",tool:e,install_hint:n,message:`missing dependency: ${e}; ${n}`}}for(let e of t.auth??[]){if(!cE(e)){let s=zu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let n=OP(e);if(n===null)continue;let r=dE(e,n.args,{encoding:"utf8"});if(r.status!==0){let s=typeof r.stderr=="string"?r.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:zu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var RP,fE=E(()=>{"use strict";RP={gh:"install: https://cli.github.com/",git:"install: apt-get install git OR brew install git",node:"install: https://nodejs.org/",claude:"install: https://docs.anthropic.com/en/docs/claude-code/quickstart",codex:"install: https://github.com/openai/codex",gemini:"install: https://github.com/google-gemini/gemini-cli",opencode:"install: https://opencode.ai/",qwen:"install: https://github.com/QwenLM/qwen-code",kimi:"install: https://github.com/MoonshotAI/kimi-code"}});import{existsSync as LP,readdirSync as CP,readFileSync as $P}from"node:fs";import{join as mE}from"node:path";function MP(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let n=e[1],r=n.match(/^tags:\s*\[([^\]]*)\]/m);if(r)return r[1].split(",").map(i=>i.trim()).filter(Boolean);let s=n.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
2103
2103
  `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function pE(t,e){let n=t.match(/^---\n([\s\S]*?)\n---/);if(!n)return null;let s=n[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function _E(t,e){if(e.length===0)return null;let n=mE(t,"durable-memory");if(!LP(n))return null;let r;try{r=CP(n).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of r)try{let o=$P(mE(n,i),"utf8");if(MP(o).some(l=>e.includes(l))){let l=pE(o,"name")??i.replace(".md",""),c=pE(o,"description");s.push(c?`${l} (${c})`:l)}}catch{}return s.length===0?null:`[Durable-memory entries relevant to this task: ${s.join(", ")}. Pull the full chapter as needed.]`}var hE=E(()=>{"use strict"});function ef(t){let e=t.trim().replace(DP,"").trim();for(let n=0;n<4;n+=1){let r=jP.exec(e);if(r===null)break;e=r[2].trim()}return e}function gE(t){let e=t.trim(),n=PP.exec(e);if(n!==null)return n[2];let r=FP.exec(e);return r!==null?r[0]:null}function ei(t,e){let n=t.split(`
2104
2104
  `),r=null,s=-1;for(let o=0;o<n.length;o+=1){let a=ef(n[o]),l=Zu.exec(a);if(l===null)continue;let c=l[1].trim();if(Qu.test(c))continue;let u=gE(c);u!==null&&(r=u,s=o)}if(r===null)return{outcome:null,reason:"no_stance"};if(!e.includes(r))return{outcome:null,reason:"unknown_outcome",actual:r};let i={};for(let o=s-1;o>=0;o-=1){let a=ef(n[o]),l=Zu.exec(a);if(l===null)break;let c=Qu.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:r,evidence:i}}function yE(t){let e=t.split(`
2105
- `),n=null;for(let r=0;r<e.length;r+=1){let s=ef(e[r]),i=Zu.exec(s);if(i===null)continue;let o=i[1].trim();if(Qu.test(o))continue;let a=gE(o);if(a===null||!Ir(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();n={token:a,reason:c}}return n}var DP,jP,Zu,Qu,PP,FP,tf=E(()=>{"use strict";xs();DP=/^#{1,6}\s+/,jP=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Zu=/^STANCE:\s+(.+)$/,Qu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PP=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FP=/^[A-Za-z0-9_-]+/});function wE(t,e,n){return r=>{let s=n(),i=Date.now(),o=JSON.stringify({kind:r.kind,tool:r.tool??null,summary:r.summary??null,id:r.id??null,elapsedMs:r.elapsedMs??null,status:r.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var EE=E(()=>{"use strict"});import{readFileSync as UP}from"node:fs";import{dirname as WP,join as qP}from"node:path";import{fileURLToPath as BP}from"node:url";function JP(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(n=>n.trim().split(/\s+/)),kind:e.kind}))}function YP(t){let e=[],n=[];for(let r of t)HP.has(r)?(n.length>0&&e.push(n),n=[]):n.push(r);return n.length>0&&e.push(n),e}function zP(t,e){if(t.length===0)return{matched:!1};let n=0;for(;n<t.length&&XP.test(t[n]);)n+=1;if(n>=t.length)return{matched:!1};let r=t[n],s=t.slice(n+1);for(let i of e)if(r===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function ZP(t,e){if(t.length===0)return{matched:!1};let n=YP(t);for(let r of n){let s=zP(r,e);if(s.matched)return s}return{matched:!1}}function nf(t){return ZP(t,VP)}function QP(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function rf(t){return QP(t).split(" ").filter(e=>e.length>0)}var HP,XP,GP,KP,VP,TE=E(()=>{"use strict";HP=new Set(["&&","||",";","|",">",">>","<","<<"]),XP=/^[A-Za-z_][A-Za-z0-9_]*=/;GP=WP(BP(import.meta.url)),KP=JSON.parse(UP(qP(GP,"side_effect_classifier.json"),"utf-8")),VP=JP(KP)});function ba(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function vE(t,e){try{return await or(sf(t)??t,ba(e))===!0}catch{return!1}}async function ka(t,e){try{return await or(sf(t)??t,ba(e))}catch{return}}async function SE(t,e){if(typeof t!="string")return t;let n=sf(t);if(n===null)return t;try{return await or(n,ba(e))}catch{return}}async function bE(t,e){let n=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(n.length===0)return t;let r="",s=0;for(let i of n){let o=i.index??0;r+=t.slice(s,o);let a=i[1]?.trim()??"";try{r+=e1(await or(a,ba(e)))}catch{r+=""}s=o+i[0].length}return r+=t.slice(s),r}function sf(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function e1(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var ti=E(()=>{"use strict";Js()});import{existsSync as kE,readdirSync as IE,readFileSync as t1,statSync as NE}from"node:fs";import{join as Na}from"node:path";function AE(t,e,n,r){return Object.assign(t,{stateId:e,state:n,displayName:r})}function K(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function z(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function _t(t,e,n,r,s={}){let i=P(),o=K(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${r}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${ni}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=Ir(n)?"generic":"unhandled";return t.dal.raiseAttention({kind:to,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:o.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:n,reason:r,declared_outcomes:[...s.declared_outcomes??[]],agent_output:n1(s.agent_output??r),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function n1(t){return t.length>8e3?`${t.slice(0,8e3)}
2106
- \u2026[truncated ${t.length-8e3} chars]`:t}function Z(t,e,n,r){t.outcomes[e]=r,n!==e&&(t.outcomes[n]=r)}function te(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function xE(t,e){let n=e.trim();if(n.startsWith("[")){try{let r=JSON.parse(n);if(Array.isArray(r)&&r.every(s=>typeof s=="string"))return r}catch{return null}return null}if(n.startsWith("job.payload.")){let r=n.slice(12);if(r.length===0)return null;let i=$n(t.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function ot(t,e,n){let r=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return n;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=$n(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=$n(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=r1(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return bE(r,e)}function r1(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function $n(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function ri(t){let{context:e,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=wE(e.dal,e.run_id,()=>i),c=of(e,n),u={violation:null},d=g=>{if(l(g),u.violation===null&&g.kind==="tool_use"&&g.tool==="Bash"&&g.summary){let w=rf(g.summary),S=nf(w);S.matched&&!c&&(u.violation={summary:g.summary,kind:S.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=g=>{d(g),s1(g,(w,S)=>{m+=w,p+=S})},_=await jo({sessionid:r.sessionid,sessiondir:r.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:r.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:r.alias,provider:Qe(r),model:r.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:_.ms})}),i1(e.project,e.dal,f);let y=u.violation;return y!==null?{kind:"g3_violation",summary:y.summary,violationKind:y.kind}:!a&&e.project.local_path.trim().length>0&&af(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:_.text,ms:_.ms,argv:_.argv}}function s1(t,e){let n=t.raw;if(n==null)return;let s=n.message?.usage;if(s!==void 0){let o=Ia(s.input_tokens),a=Ia(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=n.usage;if(i!==void 0){let o=Ia(i.input_tokens),a=Ia(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Ia(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function cn(t,e,n,r){if(n.sessionid===null)return;let s=`${e}:write_back`,i=K(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof r=="string"?` Category hint: "${r}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ri({context:t,stateId:s,member:n,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Jr(t,e,n,r,s,i,o,a=!1,l){let c=t.membersByAlias.get(n.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${n.alias}`};let u=K(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),i&&d.push(oh(s)),l!=null&&l.length>0&&d.push(l);let f=n.prompt_template!==void 0?await ot(n.prompt_template,t,e):"";f.length>0&&d.push(f),r!==null&&r.length>0&&d.push(r);let m=d.join(`
2105
+ `),n=null;for(let r=0;r<e.length;r+=1){let s=ef(e[r]),i=Zu.exec(s);if(i===null)continue;let o=i[1].trim();if(Qu.test(o))continue;let a=gE(o);if(a===null||!Ir(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();n={token:a,reason:c}}return n}var DP,jP,Zu,Qu,PP,FP,tf=E(()=>{"use strict";xs();DP=/^#{1,6}\s+/,jP=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,Zu=/^STANCE:\s+(.+)$/,Qu=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PP=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FP=/^[A-Za-z0-9_-]+/});function wE(t,e,n){return r=>{let s=n(),i=Date.now(),o=JSON.stringify({kind:r.kind,tool:r.tool??null,summary:r.summary??null,id:r.id??null,elapsedMs:r.elapsedMs??null,status:r.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:o});return}let l=o.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});t.insertSessionEvent({run_id:e,step_id:s,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:r.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var EE=E(()=>{"use strict"});import{readFileSync as UP}from"node:fs";import{dirname as WP,join as qP}from"node:path";import{fileURLToPath as BP}from"node:url";function JP(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(n=>n.trim().split(/\s+/)),kind:e.kind}))}function YP(t){let e=[],n=[];for(let r of t)HP.has(r)?(n.length>0&&e.push(n),n=[]):n.push(r);return n.length>0&&e.push(n),e}function zP(t,e){if(t.length===0)return{matched:!1};let n=0;for(;n<t.length&&XP.test(t[n]);)n+=1;if(n>=t.length)return{matched:!1};let r=t[n],s=t.slice(n+1);for(let i of e)if(r===i.command){for(let o of i.subcommands)if(o.every((l,c)=>s[c]===l))return{matched:!0,kind:i.kind}}return{matched:!1}}function ZP(t,e){if(t.length===0)return{matched:!1};let n=YP(t);for(let r of n){let s=zP(r,e);if(s.matched)return s}return{matched:!1}}function nf(t){return ZP(t,VP)}function QP(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function rf(t){return QP(t).split(" ").filter(e=>e.length>0)}var HP,XP,GP,KP,VP,TE=E(()=>{"use strict";HP=new Set(["&&","||",";","|",">",">>","<","<<"]),XP=/^[A-Za-z_][A-Za-z0-9_]*=/;GP=WP(BP(import.meta.url)),KP=JSON.parse(UP(qP(GP,"side_effect_classifier.json"),"utf-8")),VP=JP(KP)});function ba(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function vE(t,e){try{return await or(sf(t)??t,ba(e))===!0}catch{return!1}}async function ka(t,e){try{return await or(sf(t)??t,ba(e))}catch{return}}async function SE(t,e){if(typeof t!="string")return t;let n=sf(t);if(n===null)return t;try{return await or(n,ba(e))}catch{return}}async function bE(t,e){let n=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(n.length===0)return t;let r="",s=0;for(let i of n){let o=i.index??0;r+=t.slice(s,o);let a=i[1]?.trim()??"";try{r+=e1(await or(a,ba(e)))}catch{r+=""}s=o+i[0].length}return r+=t.slice(s),r}function sf(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function e1(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var ti=E(()=>{"use strict";Js()});import{existsSync as kE,readdirSync as IE,readFileSync as t1,statSync as NE}from"node:fs";import{join as Na}from"node:path";function AE(t,e,n,r){return Object.assign(t,{stateId:e,state:n,displayName:r})}function V(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function z(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function _t(t,e,n,r,s={}){let i=F(),o=V(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(o.id,null,`escalation:${r}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${ni}${e.id}`,i);let a=t.dal.getRun(t.run_id),l=Ir(n)?"generic":"unhandled";return t.dal.raiseAttention({kind:to,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:o.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:n,reason:r,declared_outcomes:[...s.declared_outcomes??[]],agent_output:n1(s.agent_output??r),paused_at:i,created_at:i})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function n1(t){return t.length>8e3?`${t.slice(0,8e3)}
2106
+ \u2026[truncated ${t.length-8e3} chars]`:t}function Z(t,e,n,r){t.outcomes[e]=r,n!==e&&(t.outcomes[n]=r)}function te(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,n])=>n.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function xE(t,e){let n=e.trim();if(n.startsWith("[")){try{let r=JSON.parse(n);if(Array.isArray(r)&&r.every(s=>typeof s=="string"))return r}catch{return null}return null}if(n.startsWith("job.payload.")){let r=n.slice(12);if(r.length===0)return null;let i=$n(t.job.payload)?.[r];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function ot(t,e,n){let r=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(e.run_id);if(i==="state_id")return n;if(i==="item")return e.iteration?.item??"";if(i==="index")return e.iteration===null?"":String(e.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(e.project.id);if(o==="name")return e.project.name;if(o==="local_path")return e.project.local_path;if(o==="default_branch")return e.project.default_branch??"";if(o==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(o==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(o==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=$n(e.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=$n(e.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=r1(e.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return bE(r,e)}function r1(t,e){let n=t;for(let r of e.split(".")){if(n===null||typeof n!="object"||Array.isArray(n))return;n=n[r]}return n}function $n(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function ri(t){let{context:e,stateId:n,member:r,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=t,l=wE(e.dal,e.run_id,()=>i),c=of(e,n),u={violation:null},d=g=>{if(l(g),u.violation===null&&g.kind==="tool_use"&&g.tool==="Bash"&&g.summary){let w=rf(g.summary),v=nf(w);v.matched&&!c&&(u.violation={summary:g.summary,kind:v.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=g=>{d(g),s1(g,(w,v)=>{m+=w,p+=v})},_=await jo({sessionid:r.sessionid,sessiondir:r.sessiondir,prompt:s,timeoutMs:o,dal:e.dal,team_member_id:r.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:r.alias,provider:Qe(r),model:r.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:_.ms})}),i1(e.project,e.dal,f);let y=u.violation;return y!==null?{kind:"g3_violation",summary:y.summary,violationKind:y.kind}:!a&&e.project.local_path.trim().length>0&&af(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:_.text,ms:_.ms,argv:_.argv}}function s1(t,e){let n=t.raw;if(n==null)return;let s=n.message?.usage;if(s!==void 0){let o=Ia(s.input_tokens),a=Ia(s.output_tokens);(o>0||a>0)&&e(o,a);return}let i=n.usage;if(i!==void 0){let o=Ia(i.input_tokens),a=Ia(i.output_tokens);(o>0||a>0)&&e(o,a)}}function Ia(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function cn(t,e,n,r){if(n.sessionid===null)return;let s=`${e}:write_back`,i=V(t,{run_id:t.run_id,state_name:s});t.steps_executed+=1;let a=`This state completed successfully.${typeof r=="string"?` Category hint: "${r}".`:""} Did you learn anything worth preserving in durable-memory? If yes, use Write to create/update an entry under <project>/durable-memory/<descriptive-name>.md. Include YAML frontmatter (name/description/type[/tags]). Be brief \u2014 one entry per insight. If you didn't learn anything new, respond with \`STANCE: no_writeback\` and the engine moves on.`;try{let l=await ri({context:t,stateId:s,member:n,prompt:a,stepId:i.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(i.id,null,"write_back_error")}}async function Jr(t,e,n,r,s,i,o,a=!1,l){let c=t.membersByAlias.get(n.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${n.alias}`};let u=V(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),i&&d.push(oh(s)),l!=null&&l.length>0&&d.push(l);let f=n.prompt_template!==void 0?await ot(n.prompt_template,t,e):"";f.length>0&&d.push(f),r!==null&&r.length>0&&d.push(r);let m=d.join(`
2107
2107
 
2108
2108
  `);try{let p=await ri({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let _=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,_),{outcome:null,text:"",status_detail:_}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!i)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=ei(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Oe?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function Gr(t,e){return(e?.length??0)>0?_E(t.project.local_path,e):null}function RE(t){return nf(rf(t))}function of(t,e){let n=t.dal.query(`SELECT state_name, outcome FROM step
2109
2109
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
2110
2110
  ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(n.length===0)return!1;let r=n[0];return t.workflow.states[r.state_name]?.type==="Interactive"&&r.outcome==="done"}function af(t,e){if(!kE(t))return!1;let n=Na(t,"durable-memory");function r(s){let i;try{i=IE(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(NE(a).mtime>e)return!0}catch{}}return!1}return r(t)}function i1(t,e,n){let r=Na(t.local_path,"durable-memory");if(!kE(r))return;let s;try{s=IE(r)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=Na(r,i),a;try{a=NE(o).mtime}catch{continue}if(a<=n)continue;let l;try{l=t1(o,"utf8")}catch{continue}let c=a1(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
2111
- `),$({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function a1(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[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||!o1.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}var ni,o1,nt=E(()=>{"use strict";dt();Wr();Po();hE();tf();xs();EE();de();TE();ti();ni="__paused__:";o1=new Set(["user","feedback","project","reference"])});import{spawnSync as OE}from"node:child_process";function l1(t,e){let n=t.stateId,r=t.displayName,s=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.project.local_path,o=OE("git",["diff","--quiet"],{cwd:i}).status!==0,a=OE("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Z(t,n,r,Su),{kind:"terminal",terminal:te(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Z(t,n,r,"clean"),z(t.workflow,e.next)}var LE,CE=E(()=>{"use strict";nt();LE={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:t=>l1(t,t.state)}});async function c1(t,e){let n=t.stateId,r=t.displayName,s=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;for(let i of e.branches)if(await vE(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),Z(t,n,r,"matched"),z(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Z(t,n,r,"no_match"),e.default_next!==void 0?z(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":te(t.workflow)}}var $E,ME=E(()=>{"use strict";nt();ti();$E={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 t=>c1(t,t.state)}});async function d1(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=Gr(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${r}:researcher_${m.alias}[${p}]`,_=await Jr(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);_.text.length>0&&(a[p]=_.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
2111
+ `),M({event:"durable_memory_frontmatter_invalid",project_id:t.id,file:i,path:o});continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function a1(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[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||!o1.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:r}}var ni,o1,nt=E(()=>{"use strict";dt();Wr();Po();hE();tf();xs();EE();de();TE();ti();ni="__paused__:";o1=new Set(["user","feedback","project","reference"])});import{spawnSync as OE}from"node:child_process";function l1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.project.local_path,o=OE("git",["diff","--quiet"],{cwd:i}).status!==0,a=OE("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Z(t,n,r,Su),{kind:"terminal",terminal:te(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Z(t,n,r,"clean"),z(t.workflow,e.next)}var LE,CE=E(()=>{"use strict";nt();LE={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:t=>l1(t,t.state)}});async function c1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;for(let i of e.branches)if(await vE(i.when,t))return t.dal.finishStep(s.id,"matched",i.when),Z(t,n,r,"matched"),z(t.workflow,i.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Z(t,n,r,"no_match"),e.default_next!==void 0?z(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":te(t.workflow)}}var $E,ME=E(()=>{"use strict";nt();ti();$E={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 t=>c1(t,t.state)}});async function d1(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms,i=e.researchers??[],o=Gr(t,e.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${r}:researcher_${m.alias}[${p}]`,_=await Jr(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);_.text.length>0&&(a[p]=_.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
2112
2112
  ${m}`:null).filter(m=>m!==null).join(`
2113
2113
 
2114
- `),c=`${r}:consolidator`,u=await Jr(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),d=K(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Z(t,n,r,"error");let m=e.outcomes.error;return m!==void 0?z(t.workflow,m):{kind:"terminal",terminal:te(t.workflow)}}let f=e.research_artifact_prefix??r;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Z(t,n,r,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await cn(t,r,m,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.ok)}var DE,jE=E(()=>{"use strict";nt();DE={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 t=>d1(t,t.state)}});async function u1(t,e){let n=t.stateId,r=t.displayName,s=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await ka(e.items_from,t),a=_1(o);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await m1(t,e,s.id,a,l):await f1(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),Z(t,n,r,d),u){let f=e.outcomes.any_failed;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}return z(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function f1(t,e,n,r,s){let i=[];for(let o=0;o<r.length;o+=1){let a=await FE(t,e,n,r[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return i}async function m1(t,e,n,r,s){let i=new Array(r.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,r.length)},async()=>{for(;o<r.length&&s.routed===null;){let l=o;o+=1,i[l]=await FE(t,e,n,r[l],l,s)}});return await Promise.all(a),i}async function FE(t,e,n,r,s,i){let o=t.iteration;t.iteration={item:r,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:r}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:n,iteration:{item:r,index:s}})}finally{t.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":p1(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:r,outcome:u}}),{index:s,value:r,outcome:u}}function p1(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function _1(t){if(!Array.isArray(t))return null;let e=[];for(let n of t)if(typeof n=="string")e.push(n);else if(typeof n=="number"||typeof n=="boolean")e.push(String(n));else return null;return e}var PE,UE=E(()=>{"use strict";nt();ti();PE={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 t=>u1(t,t.state)}});async function h1(t,e){let n=t.stateId,r=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let f=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:te(t.workflow)}}let o=Gr(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,n);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[r]="done",e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Z(t,n,r,"timeout");let m=e.outcomes.timeout;return m!==void 0?z(t.workflow,m):{kind:"terminal",terminal:te(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ri({context:t,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 t.dal.insertSessionEvent({run_id:t.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`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:te(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Z(t,n,r,"done"),e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done)):(WE({context:t,state:e,stateId:n,displayName:r,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Oe?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:te(t.workflow)}}}return{kind:"paused"}}let l=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:n,status:"waiting_agent"}),u=await ot(e.agent.initial_prompt_template,t,r),d=o?`${o}
2114
+ `),c=`${r}:consolidator`,u=await Jr(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),d=V(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Z(t,n,r,"error");let m=e.outcomes.error;return m!==void 0?z(t.workflow,m):{kind:"terminal",terminal:te(t.workflow)}}let f=e.research_artifact_prefix??r;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Z(t,n,r,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await cn(t,r,m,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.ok)}var DE,jE=E(()=>{"use strict";nt();DE={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 t=>d1(t,t.state)}});async function u1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.progress_step_id;t.progress_step_id=s.id;try{let o=await ka(e.items_from,t),a=_1(o);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await m1(t,e,s.id,a,l):await f1(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),Z(t,n,r,d),u){let f=e.outcomes.any_failed;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}return z(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=i}}async function f1(t,e,n,r,s){let i=[];for(let o=0;o<r.length;o+=1){let a=await FE(t,e,n,r[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return i}async function m1(t,e,n,r,s){let i=new Array(r.length),o=0,a=Array.from({length:Math.min(e.max_concurrency,r.length)},async()=>{for(;o<r.length&&s.routed===null;){let l=o;o+=1,i[l]=await FE(t,e,n,r[l],l,s)}});return await Promise.all(a),i}async function FE(t,e,n,r,s,i){let o=t.iteration;t.iteration={item:r,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:r}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:n,iteration:{item:r,index:s}})}finally{t.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":p1(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:r,outcome:u}}),{index:s,value:r,outcome:u}}function p1(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function _1(t){if(!Array.isArray(t))return null;let e=[];for(let n of t)if(typeof n=="string")e.push(n);else if(typeof n=="number"||typeof n=="boolean")e.push(String(n));else return null;return e}var PE,UE=E(()=>{"use strict";nt();ti();PE={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 t=>u1(t,t.state)}});async function h1(t,e){let n=t.stateId,r=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,i=t.membersByAlias.get(e.agent.alias);if(i===void 0||i.sessionid===null){let f=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:te(t.workflow)}}let o=Gr(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,n);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[r]="done",e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Z(t,n,r,"timeout");let m=e.outcomes.timeout;return m!==void 0?z(t.workflow,m):{kind:"terminal",terminal:te(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ri({context:t,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 t.dal.insertSessionEvent({run_id:t.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`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:te(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Z(t,n,r,"done"),e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done)):(WE({context:t,state:e,stateId:n,displayName:r,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Oe?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:te(t.workflow)}}}return{kind:"paused"}}let l=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:n,status:"waiting_agent"}),u=await ot(e.agent.initial_prompt_template,t,r),d=o?`${o}
2115
2115
 
2116
- ${u}`:u;try{let f=await ri({context:t,stateId:r,member:i,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:r,kind:f.violationKind,command_summary:f.summary,message:`State ${r} ran a classified side-effect command (${f.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`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:te(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[r]="done",e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done)):(WE({context:t,state:e,stateId:n,displayName:r,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Oe?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:te(t.workflow)}}}function WE(t){let{context:e,state:n,stateId:r,displayName:s,stepId:i,agentText:o}=t,a=P();e.dal.setRunPausedState(e.run_id,`${ni}${r}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(g1({context:e,stateId:s,state:n,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function g1(t){let{context:e,stateId:n,state:r,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=y1(e,n),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:n,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:w1(i,3),paused_at:o,created_run_inputs:$n(e.job.payload)}}function y1(t,e){let n=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=t.dal.getRun(s);if(o===null)break;o.current_state!==null&&n.unshift(o.current_state),s=o.parent_run_id}return n.push(e),n}function w1(t,e){if(typeof t!="string"||t.length===0)return[];let n=t.split(/\r?\n/);return(n.length>0&&n[n.length-1]===""?n.slice(0,-1):n).slice(-e)}var qE,BE=E(()=>{"use strict";Po();nt();qE={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>h1(t,t.state)}});async function E1(t,e){let n=t.stateId,r=t.displayName,s=xE(t,e.over);if(s===null){let d=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}let i=t.workflow.states[e.body];if(i===void 0){let d=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:te(t.workflow)}}let o=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<o.length;d+=1){let f=o[d],m=`${r}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,i,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let _=T1(t.outcomes[m]);if(a.push({index:d,value:f,outcome:_}),_===null&&e.stop_on_error){l=!0;break}}let c=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:o.length})),Z(t,n,r,u),l){let d=e.outcomes.error;return d!==void 0?z(t.workflow,d):{kind:"terminal",terminal:te(t.workflow)}}return z(t.workflow,e.outcomes.ok)}function T1(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var HE,XE=E(()=>{"use strict";nt();HE={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>E1(t,t.state)}});import{createHash as v1}from"node:crypto";import{existsSync as S1,mkdirSync as b1,readFileSync as k1,writeFileSync as I1}from"node:fs";import{dirname as N1,isAbsolute as GE,normalize as A1,resolve as si}from"node:path";import{Document as x1,ExternalHyperlink as R1,HeadingLevel as Kr,LevelFormat as O1,Packer as L1,Paragraph as Rt,Table as C1,TableCell as $1,TableRow as M1,TextRun as Ot,WidthType as D1}from"docx";import{marked as j1}from"marked";async function P1(t,e){let n=t.stateId,r=t.displayName,s=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await F1(t,e,r),o=await U1(t,e),a=await W1(t,e.title),l=await J1(i,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return b1(N1(o),{recursive:!0}),I1(o,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:v1("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${o}`),Z(t,n,r,{output_path:o,path:o,bytes:l.length}),z(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Z(t,n,r,{error:o}),z(t.workflow,e.outcomes?.error??"@terminal:error")}}async function F1(t,e,n){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let r=(await ot(e.markdown_source,t,n)).trim(),i=(r.length===0?X1(t,e.markdown_source):null)??r;if(i.length===0)throw new Error("markdown_source resolved empty");let o=B1(t.project.local_path,i);if(o!==null){if(!S1(o))throw new Error(`markdown_source file not found: ${o}`);return Aa(k1(o,"utf8"))}return Aa(i)}async function U1(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await ot(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=q1(t.project.local_path,n);if(!r.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${r}`);return r}async function W1(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await ot(e,t,t.stateId)).trim();return n.length===0?null:n}function q1(t,e){let n=si(t);return A1(GE(e)?si(e):si(n,e))}function B1(t,e){return H1(e)?GE(e)?si(e):si(t,e):null}function H1(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function X1(t,e){let r=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(r===void 0)return null;let s=Object.entries(t.transcripts).filter(([o])=>o.startsWith(`${r}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return Aa(s);let i=t.dal.query(`SELECT sa.content
2116
+ ${u}`:u;try{let f=await ri({context:t,stateId:r,member:i,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:r,kind:f.violationKind,command_summary:f.summary,message:`State ${r} ran a classified side-effect command (${f.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`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:te(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[r]="done",e.write_back_durable_memory&&await cn(t,r,i,e.write_back_durable_memory),z(t.workflow,e.outcomes.done)):(WE({context:t,state:e,stateId:n,displayName:r,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Oe?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:te(t.workflow)}}}function WE(t){let{context:e,state:n,stateId:r,displayName:s,stepId:i,agentText:o}=t,a=F();e.dal.setRunPausedState(e.run_id,`${ni}${r}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(g1({context:e,stateId:s,state:n,stepId:i,agentText:o,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function g1(t){let{context:e,stateId:n,state:r,stepId:s,agentText:i,pausedAt:o}=t,a=e.dal.getRun(e.run_id),l=y1(e,n),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:n,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:w1(i,3),paused_at:o,created_run_inputs:$n(e.job.payload)}}function y1(t,e){let n=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=t.dal.getRun(s);if(o===null)break;o.current_state!==null&&n.unshift(o.current_state),s=o.parent_run_id}return n.push(e),n}function w1(t,e){if(typeof t!="string"||t.length===0)return[];let n=t.split(/\r?\n/);return(n.length>0&&n[n.length-1]===""?n.slice(0,-1):n).slice(-e)}var qE,BE=E(()=>{"use strict";Po();nt();qE={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>h1(t,t.state)}});async function E1(t,e){let n=t.stateId,r=t.displayName,s=xE(t,e.over);if(s===null){let d=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?z(t.workflow,f):{kind:"terminal",terminal:te(t.workflow)}}let i=t.workflow.states[e.body];if(i===void 0){let d=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:te(t.workflow)}}let o=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<o.length;d+=1){let f=o[d],m=`${r}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,i,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let _=T1(t.outcomes[m]);if(a.push({index:d,value:f,outcome:_}),_===null&&e.stop_on_error){l=!0;break}}let c=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:o.length})),Z(t,n,r,u),l){let d=e.outcomes.error;return d!==void 0?z(t.workflow,d):{kind:"terminal",terminal:te(t.workflow)}}return z(t.workflow,e.outcomes.ok)}function T1(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var HE,XE=E(()=>{"use strict";nt();HE={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>E1(t,t.state)}});import{createHash as v1}from"node:crypto";import{existsSync as S1,mkdirSync as b1,readFileSync as k1,writeFileSync as I1}from"node:fs";import{dirname as N1,isAbsolute as GE,normalize as A1,resolve as si}from"node:path";import{Document as x1,ExternalHyperlink as R1,HeadingLevel as Kr,LevelFormat as O1,Packer as L1,Paragraph as Rt,Table as C1,TableCell as $1,TableRow as M1,TextRun as Ot,WidthType as D1}from"docx";import{marked as j1}from"marked";async function P1(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await F1(t,e,r),o=await U1(t,e),a=await W1(t,e.title),l=await J1(i,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return b1(N1(o),{recursive:!0}),I1(o,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:v1("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${o}`),Z(t,n,r,{output_path:o,path:o,bytes:l.length}),z(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Z(t,n,r,{error:o}),z(t.workflow,e.outcomes?.error??"@terminal:error")}}async function F1(t,e,n){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let r=(await ot(e.markdown_source,t,n)).trim(),i=(r.length===0?X1(t,e.markdown_source):null)??r;if(i.length===0)throw new Error("markdown_source resolved empty");let o=B1(t.project.local_path,i);if(o!==null){if(!S1(o))throw new Error(`markdown_source file not found: ${o}`);return Aa(k1(o,"utf8"))}return Aa(i)}async function U1(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await ot(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=q1(t.project.local_path,n);if(!r.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${r}`);return r}async function W1(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await ot(e,t,t.stateId)).trim();return n.length===0?null:n}function q1(t,e){let n=si(t);return A1(GE(e)?si(e):si(n,e))}function B1(t,e){return H1(e)?GE(e)?si(e):si(t,e):null}function H1(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function X1(t,e){let r=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(r===void 0)return null;let s=Object.entries(t.transcripts).filter(([o])=>o.startsWith(`${r}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return Aa(s);let i=t.dal.query(`SELECT sa.content
2117
2117
  FROM step_artifact sa
2118
2118
  JOIN step s ON s.id = sa.step_id
2119
2119
  WHERE s.run_id = ?
@@ -2121,11 +2121,11 @@ ${u}`:u;try{let f=await ri({context:t,stateId:r,member:i,prompt:d,stepId:l.id,ti
2121
2121
  AND sa.content IS NOT NULL
2122
2122
  ORDER BY sa.id DESC
2123
2123
  LIMIT 1`,t.run_id,`${r}:coder[%`);return i[0]?.content===void 0?null:Aa(i[0].content)}function Aa(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function J1(t,e){let n=VE(j1.lexer(t,{gfm:!0})),r=new x1({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:O1.DECIMAL,text:"%1."}]}]},sections:[{children:n.length===0?[new Rt("")]:n}]});return L1.toBuffer(r)}function VE(t){let e=[];for(let n of t)switch(n.type){case"space":break;case"heading":e.push(new Rt({heading:Q1(n.depth),children:Dn(Mn(n))}));break;case"paragraph":e.push(new Rt({children:Dn(Mn(n))}));break;case"text":e.push(new Rt({children:Mn(n).length===0?[new Ot(n.text)]:Dn(Mn(n))}));break;case"blockquote":e.push(...VE(Mn(n)).map(r=>r instanceof Rt?r:new Rt({children:[new Ot(n.text)]})));break;case"list":Y1(n)&&e.push(...G1(n));break;case"table":z1(n)&&e.push(K1(n));break;case"code":Z1(n)&&e.push(...V1(n));break;case"hr":e.push(new Rt(""));break;case"html":n.text.trim().length>0&&e.push(new Rt({children:[new Ot(n.text)]}));break;default:break}return e}function Dn(t,e){let n=[];for(let r of t)switch(r.type){case"text":case"escape":n.push(new Ot({text:r.text,...lf(e)}));break;case"strong":n.push(...Dn(Mn(r),{...e,bold:!0}));break;case"em":n.push(...Dn(Mn(r),{...e,italics:!0}));break;case"codespan":n.push(new Ot({text:r.text,...lf({...e,code:!0})}));break;case"link":n.push(new R1({link:r.href,children:Dn(Mn(r),{...e})}));break;case"br":n.push(new Ot({text:"",break:1}));break;case"image":n.push(new Ot({text:`[image: ${r.text}]`,italics:!0}));break;case"del":n.push(new Ot({text:r.text,strike:!0}));break;default:n.push(new Ot({text:r.raw,...lf(e)}));break}return n.length===0?[new Ot("")]:n}function lf(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function G1(t){return t.items.map(e=>new Rt({children:Dn(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:JE(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:JE(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function JE(t){return t.task?`[${t.checked?"x":" "}] `:""}function K1(t){let e=[t.header,...t.rows].map(n=>new M1({children:n.map(r=>new $1({children:[new Rt({children:Dn(r.tokens,r.header?{bold:!0}:void 0)})]}))}));return new C1({width:{size:100,type:D1.PERCENTAGE},rows:e})}function V1(t){return t.text.split(`
2124
- `).map(n=>new Rt({children:[new Ot({text:n.length===0?" ":n,font:"Courier New"})]}))}function Mn(t){let e=t.tokens;return Array.isArray(e)?e:[]}function Y1(t){return t.type==="list"&&Array.isArray(t.items)}function z1(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Z1(t){return t.type==="code"&&typeof t.text=="string"}function Q1(t){switch(t){case 1:return Kr.HEADING_1;case 2:return Kr.HEADING_2;case 3:return Kr.HEADING_3;case 4:return Kr.HEADING_4;case 5:return Kr.HEADING_5;default:return Kr.HEADING_6}}var KE,YE=E(()=>{"use strict";nt();KE={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async t=>P1(t,t.state)}});import{createHash as eF}from"node:crypto";import{existsSync as tF,mkdirSync as nF,readFileSync as zE,statSync as rF}from"node:fs";import{dirname as sF,isAbsolute as ZE,normalize as iF,resolve as ii}from"node:path";import{marked as oF}from"marked";import aF from"write-excel-file/node";async function lF(t,e){let n=t.stateId,r=t.displayName,s=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await cF(t,e),o=dF(e.input_format),a=await uF(t,e),l=await fF(t,e.title),c=o==="markdown"?TF(i):hF(i);await vF({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=rF(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eF("sha256").update(zE(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Z(t,n,r,{output_path:a,path:a,bytes:u}),z(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Z(t,n,r,{error:o}),z(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cF(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let n=(await ot(e.source,t,t.stateId)).trim(),r=pF(t.project.local_path,n);if(r!==null){if(!tF(r))throw new Error(`source file not found: ${r}`);return zE(r,"utf8")}return n}function dF(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function uF(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await ot(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=mF(t.project.local_path,n);if(!r.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${r}`);return r}async function fF(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await ot(e,t,t.stateId)).trim();return n.length===0?null:n}function mF(t,e){let n=ii(t);return iF(ZE(e)?ii(e):ii(n,e))}function pF(t,e){return _F(e)?ZE(e)?ii(e):ii(t,e):null}function _F(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function hF(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`invalid JSON source: ${r}`)}if(!xa(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((n,r)=>gF(n,r))}function gF(t,e){if(!xa(t))throw new Error(`sheets[${e}] must be an object`);let n=yF(t.headers,`sheets[${e}].headers`),r=wF(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:n,rows:r,headerStyle:EF(t.styles)}}function yF(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(n=>typeof n=="string"))throw new Error(`${e} must be an array of strings`);return t}function wF(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((n,r)=>{if(!Array.isArray(n))throw new Error(`${e}[${r}] must be an array`);return n.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${r}][${i}] must be string, number, boolean, or null`)})})}function EF(t){if(!xa(t)||!xa(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function TF(t){let e=oF.lexer(t,{gfm:!0}),n=[],r=null;for(let s of e){if(xF(s)){r=s.text;continue}RF(s)&&(n.push({name:r??`Sheet${n.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),r=null)}return n}async function vF(t){nF(sF(t.outputPath),{recursive:!0});let e=new Set,n=t.sheets.map(r=>({sheet:IF(r.name,e),data:SF(r),columns:kF(r)}));await aF(n).toFile(t.outputPath)}function SF(t){let e=[];if(t.headers.length>0){let n=AF(t.headerStyle?.fill);e.push(t.headers.map(r=>({value:r,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:n??void 0})))}for(let n of t.rows)e.push(n.map(bF));return e.length===0?[[{}]]:e}function bF(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function kF(t){let e=Math.max(t.headers.length,...t.rows.map(r=>r.length),1),n=[];for(let r=1;r<=e;r+=1){let s=[t.headers[r-1],...t.rows.map(o=>o[r-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));n.push({width:i})}return n}function IF(t,e){let n=NF(t),r=n,s=2;for(;e.has(r.toLowerCase());){let i=` ${s}`;r=`${n.slice(0,31-i.length)}${i}`,s+=1}return e.add(r.toLowerCase()),r}function NF(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function AF(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function xF(t){return t.type==="heading"&&typeof t.text=="string"}function RF(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function xa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var QE,eT=E(()=>{"use strict";nt();QE={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async t=>lF(t,t.state)}});import{spawnSync as OF}from"node:child_process";async function CF(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(OF("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Z(t,n,r,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?z(t.workflow,h):{kind:"terminal",terminal:te(t.workflow)}}let i=Gr(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${r}:coder[${f}]`,p=await Jr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
2125
- ${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let _=yE(p.text);if(_!==null){let y=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(y.id,null,`escalation_vocab:${_.token}`),{kind:"escalate",token:_.token,reason:_.reason.length>0?`${_.token}: ${_.reason}`:_.token}}}if(p.outcome===null){let _=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(_.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let g=Object.keys(e.outcomes_from_stance),w=ei(p.text,g);if(w.outcome===null){let I=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(I.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let S=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(S.id,w.outcome,"outcomes_from_stance"),Z(t,n,r,w.outcome),z(t.workflow,e.outcomes_from_stance[w.outcome])}let _=ei(p.text,LF);if(_.outcome!==null){let g=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(g.id,_.outcome,"default_failure_stance"),Z(t,n,r,_.outcome),{kind:"escalate",token:_.outcome,reason:`failure_stance:${_.outcome}`}}let y=K(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(y.id,"approve","no_reviewers"),Z(t,n,r,"approve"),e.write_back_durable_memory){let g=t.membersByAlias.get(e.coder.alias);g!==void 0&&await cn(t,r,g,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(_=>Jr(t,`${r}:reviewer_${_.alias}[${f}]`,_,`CODER OUTPUT:
2126
- ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(_=>_.outcome==="approve")){let _=K(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve",`loop=${f}`),Z(t,n,r,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await cn(t,r,y,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.approve)}if(a=h.filter(_=>_.outcome==="request_changes").map(_=>_.text).join(`
2124
+ `).map(n=>new Rt({children:[new Ot({text:n.length===0?" ":n,font:"Courier New"})]}))}function Mn(t){let e=t.tokens;return Array.isArray(e)?e:[]}function Y1(t){return t.type==="list"&&Array.isArray(t.items)}function z1(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Z1(t){return t.type==="code"&&typeof t.text=="string"}function Q1(t){switch(t){case 1:return Kr.HEADING_1;case 2:return Kr.HEADING_2;case 3:return Kr.HEADING_3;case 4:return Kr.HEADING_4;case 5:return Kr.HEADING_5;default:return Kr.HEADING_6}}var KE,YE=E(()=>{"use strict";nt();KE={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async t=>P1(t,t.state)}});import{createHash as eF}from"node:crypto";import{existsSync as tF,mkdirSync as nF,readFileSync as zE,statSync as rF}from"node:fs";import{dirname as sF,isAbsolute as ZE,normalize as iF,resolve as ii}from"node:path";import{marked as oF}from"marked";import aF from"write-excel-file/node";async function lF(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;try{let i=await cF(t,e),o=dF(e.input_format),a=await uF(t,e),l=await fF(t,e.title),c=o==="markdown"?TF(i):hF(i);await vF({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=rF(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eF("sha256").update(zE(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Z(t,n,r,{output_path:a,path:a,bytes:u}),z(t.workflow,e.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return t.dal.finishStep(s.id,"error",o),Z(t,n,r,{error:o}),z(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cF(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let n=(await ot(e.source,t,t.stateId)).trim(),r=pF(t.project.local_path,n);if(r!==null){if(!tF(r))throw new Error(`source file not found: ${r}`);return zE(r,"utf8")}return n}function dF(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function uF(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let n=(await ot(e.output_path,t,t.stateId)).trim();if(n.length===0)throw new Error("output_path resolved empty");let r=mF(t.project.local_path,n);if(!r.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${r}`);return r}async function fF(t,e){if(typeof e!="string"||e.trim().length===0)return null;let n=(await ot(e,t,t.stateId)).trim();return n.length===0?null:n}function mF(t,e){let n=ii(t);return iF(ZE(e)?ii(e):ii(n,e))}function pF(t,e){return _F(e)?ZE(e)?ii(e):ii(t,e):null}function _F(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function hF(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(n){let r=n instanceof Error?n.message:String(n);throw new Error(`invalid JSON source: ${r}`)}if(!xa(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((n,r)=>gF(n,r))}function gF(t,e){if(!xa(t))throw new Error(`sheets[${e}] must be an object`);let n=yF(t.headers,`sheets[${e}].headers`),r=wF(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:n,rows:r,headerStyle:EF(t.styles)}}function yF(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(n=>typeof n=="string"))throw new Error(`${e} must be an array of strings`);return t}function wF(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((n,r)=>{if(!Array.isArray(n))throw new Error(`${e}[${r}] must be an array`);return n.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${r}][${i}] must be string, number, boolean, or null`)})})}function EF(t){if(!xa(t)||!xa(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function TF(t){let e=oF.lexer(t,{gfm:!0}),n=[],r=null;for(let s of e){if(xF(s)){r=s.text;continue}RF(s)&&(n.push({name:r??`Sheet${n.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),r=null)}return n}async function vF(t){nF(sF(t.outputPath),{recursive:!0});let e=new Set,n=t.sheets.map(r=>({sheet:IF(r.name,e),data:SF(r),columns:kF(r)}));await aF(n).toFile(t.outputPath)}function SF(t){let e=[];if(t.headers.length>0){let n=AF(t.headerStyle?.fill);e.push(t.headers.map(r=>({value:r,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:n??void 0})))}for(let n of t.rows)e.push(n.map(bF));return e.length===0?[[{}]]:e}function bF(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function kF(t){let e=Math.max(t.headers.length,...t.rows.map(r=>r.length),1),n=[];for(let r=1;r<=e;r+=1){let s=[t.headers[r-1],...t.rows.map(o=>o[r-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));n.push({width:i})}return n}function IF(t,e){let n=NF(t),r=n,s=2;for(;e.has(r.toLowerCase());){let i=` ${s}`;r=`${n.slice(0,31-i.length)}${i}`,s+=1}return e.add(r.toLowerCase()),r}function NF(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function AF(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function xF(t){return t.type==="heading"&&typeof t.text=="string"}function RF(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function xa(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var QE,eT=E(()=>{"use strict";nt();QE={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async t=>lF(t,t.state)}});import{spawnSync as OF}from"node:child_process";async function CF(t,e){let n=t.stateId,r=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(OF("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Z(t,n,r,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?z(t.workflow,h):{kind:"terminal",terminal:te(t.workflow)}}let i=Gr(t,e.durable_memory_tags),o=e.reviewers??[],a=null,l=o.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${r}:coder[${f}]`,p=await Jr(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
2125
+ ${a}`:null,c,l,s,e.writes_to_project_path===!0,i);if(l){let _=yE(p.text);if(_!==null){let y=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(y.id,null,`escalation_vocab:${_.token}`),{kind:"escalate",token:_.token,reason:_.reason.length>0?`${_.token}: ${_.reason}`:_.token}}}if(p.outcome===null){let _=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(_.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(e.outcomes_from_stance!==void 0){let g=Object.keys(e.outcomes_from_stance),w=ei(p.text,g);if(w.outcome===null){let N=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(N.id,null,`unhandled_stance:${w.reason}`),{kind:"escalate",token:"",reason:`no_stance:${w.reason}`}}let v=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(v.id,w.outcome,"outcomes_from_stance"),Z(t,n,r,w.outcome),z(t.workflow,e.outcomes_from_stance[w.outcome])}let _=ei(p.text,LF);if(_.outcome!==null){let g=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(g.id,_.outcome,"default_failure_stance"),Z(t,n,r,_.outcome),{kind:"escalate",token:_.outcome,reason:`failure_stance:${_.outcome}`}}let y=V(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(y.id,"approve","no_reviewers"),Z(t,n,r,"approve"),e.write_back_durable_memory){let g=t.membersByAlias.get(e.coder.alias);g!==void 0&&await cn(t,r,g,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.approve)}let h=await Promise.all(o.map(_=>Jr(t,`${r}:reviewer_${_.alias}[${f}]`,_,`CODER OUTPUT:
2126
+ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(_=>_.outcome==="approve")){let _=V(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve",`loop=${f}`),Z(t,n,r,"approve"),e.write_back_durable_memory){let y=t.membersByAlias.get(e.coder.alias);y!==void 0&&await cn(t,r,y,e.write_back_durable_memory)}return z(t.workflow,e.outcomes.approve)}if(a=h.filter(_=>_.outcome==="request_changes").map(_=>_.text).join(`
2127
2127
 
2128
- `),e.loop_feedback_artifact!==void 0){let _=K(t,{run_id:t.run_id,state_name:`${r}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(_.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:_.id,kind:e.loop_feedback_artifact,content:a})}}let u=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Z(t,n,r,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?z(t.workflow,d):{kind:"terminal",terminal:te(t.workflow)}}var LF,tT,nT=E(()=>{"use strict";tf();nt();LF=["blocked","failed","aborted"],tT={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>CF(t,t.state)}});import{spawnSync as $F}from"node:child_process";async function MF(t,e){let n=t.stateId,r=t.displayName,s=await ot(e.command,t,r),i=of(t,r),o=RE(s);if(o.matched&&!i){let h=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:r,kind:o.kind,command:s,message:`ShellStep ${r} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:te(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=$F("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:r,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:te(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&af(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:r,message:`ShellStep ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:te(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Z(t,n,r,m),z(t.workflow,p))}var rT,sT=E(()=>{"use strict";nt();rT={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async t=>MF(t,t.state)}});async function DF(t,e){let n=t.stateId,r=t.displayName,s=K(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:te(t.workflow)};let o=It(i.definition),a=await jF(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:te(t.workflow)};Z(t,n,r,PF(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:te(t.workflow)}:z(t.workflow,u)}async function jF(t,e){let n={};for(let[r,s]of Object.entries(e.inputs??{})){let i=await SE(s,t);n[r]=i===s?await ka(s,t):i}return n}function PF(t,e,n){let r={};for(let s of n)r[s.name]=FF(t,e,s);return r}function FF(t,e,n){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,n.source_step_id)[0];if(s===void 0)return null;let i=UF(s,n.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,n.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function UF(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var iT,oT=E(()=>{"use strict";Ks();nt();ti();iT={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>DF(t,t.state)}});function WF(t,e){let n=t.stateId,r=t.displayName,s=e.name??r,i=K(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),Z(t,n,r,s),{kind:"terminal",terminal:s}}var aT,lT=E(()=>{"use strict";nt();aT={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:t=>WF(t,t.state)}});async function qF(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",n=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||n.length===0)return null;let r=new URL(`https://api.github.com/repos/${e}/${n}/issues`);r.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&r.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&r.searchParams.set("since",t.parameters.since);let s=await fetch(r);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=BF(t.cursor),a=i.filter(HF).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function BF(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HF(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var cT,dT=E(()=>{"use strict";cT={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async t=>qF(t)}});async function XF(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let n=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===n?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:n,cron:e}]}}var uT,fT=E(()=>{"use strict";uT={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>XF(t)}});function mT(t){t.register(LE),t.register(tT),t.register(DE),t.register(qE),t.register(HE),t.register(KE),t.register(QE),t.register(rT),t.register($E),t.register(PE),t.register(iT),t.register(aT),t.register(uT),t.register(cT)}var pT=E(()=>{"use strict";CE();ME();jE();UE();BE();XE();YE();eT();nT();sT();oT();lT();dT();fT()});function _T(){return Ra===null&&(Ra=new cf,mT(Ra)),Ra}var JF,cf,Ra,hT=E(()=>{"use strict";pT();JF={Review:"lmctl/review",Consolidate:"lmctl/consolidate",Interactive:"lmctl/interactive",Loop:"lmctl/loop",ShellStep:"lmctl/shell-step",AssertRepoClean:"lmctl/assert-repo-clean",Choice:"lmctl/choice",ForEach:"lmctl/foreach",Subflow:"lmctl/subflow",Terminal:"lmctl/terminal"},cf=class{types=new Map;register(e){let n=`${e.description.namespace}/${e.description.name}`;if(this.types.has(n))throw new Error(`archetype already registered: ${n}`);this.types.set(n,e)}get(e){let n=e.includes("/")?e:JF[e];return n?this.types.get(n):void 0}list(){return Array.from(this.types.values())}},Ra=null});async function wT(t){bT(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let n=t.dal.getProjectByJob(t.job.id);if(n===null)throw new Error(`job ${t.job.id} has no project`);let r=KF(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=oi(r)?r.entry_step_id:r.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=r.requires,l=uE(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:n.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:r.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(oi(r)){let m=df({dal:t.dal,workflow:La(r),job:t.job,project:n,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:$n(t.job.payload)??{},team_id:t.team.id}),p=await TT(r,m,o.current_state??r.entry_step_id);return yT(t.dal,n.id,o.id,r.name,p),p}let u=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},d=df({dal:t.dal,workflow:r,job:t.job,project:n,run:o,membersByAlias:c,outcomes:u,inputs:$n(t.job.payload)??{},team_id:t.team.id}),f=await ET(d,o.current_state??r.start_at);return yT(t.dal,n.id,o.id,r.name,f),f}function yT(t,e,n,r,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let u=t.getRun(n);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let _ of f.steps)if(_.type==="lmctl/terminal"&&_.parameters!==null&&typeof _.parameters=="object"){let y=_.parameters;if(y.name===i&&(y.kind==="success"||y.kind==="failure"||y.kind==="neutral")){o=y.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let _=h;(_.on_unhandled_failure!==void 0||_.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",n)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:n,payload:JSON.stringify({run_id:n,workflow_name:r,terminal_state:i,terminal_kind:o,last_error:l})})}function df(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(n,r,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await uf(e,n,r,s?.display_name??n)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(n,r,s)=>{bT(r);let i=oi(r)?r.entry_step_id:r.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:n.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=df({dal:t.dal,workflow:oi(r)?La(r):r,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return oi(r)?TT(r,a,o.current_state??r.entry_step_id):ET(a,o.current_state??r.start_at)}};return e}async function ET(t,e){let n=e;if(n.startsWith(ni))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(n.startsWith("@terminal:"))return dn(t,n.slice(10));t.dal.setRunCurrentState(t.run_id,n),t.last_state_id=n;let i=t.workflow.states[n];if(i===void 0){let l=Oa(t,te(t.workflow));if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return _t(t,{id:n,name:n,type:"unknown"},l.token,l.reason),Ye(t);if(l.kind==="terminal")return dn(t,l.terminal);n=l.state;continue}let o,a=ST(t,n);if(a!==null){let l=K(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Z(t,n,n,a),a===As)return dn(t,Nc);let c=i.outcomes?.[a];o=c!==void 0?z(t.workflow,c):_t(t,{id:n,name:n,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${n}'`)}else o=await uf(t,n,i);if(o.kind==="paused")return Ye(t);if(o.kind==="escalate")return _t(t,{id:n,name:n,type:i.type},o.token,o.reason),Ye(t);if(o.kind==="terminal"){let l=Oa(t,o.terminal);if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return _t(t,{id:n,name:n,type:i.type},l.token,l.reason),Ye(t);if(l.kind==="terminal")return dn(t,l.terminal);n=l.state;continue}n=o.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let r=Oa(t,te(t.workflow));return r.kind==="terminal"?dn(t,r.terminal):dn(t,te(t.workflow))}async function TT(t,e,n){let r=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=n;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=r.get(i);if(a===void 0)return _t(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ye(e);let l=ST(e,a.id);if(l!==null){let m=K(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Z(e,a.id,a.name,l),l===As)return dn(e,Nc);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return _t(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Ye(e);i=h;continue}let c=await GF(e,t,a);if(c.kind==="paused")return Ye(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return _t(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Ye(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=La(t,a);try{let p=Oa(e,d);if(p.kind==="paused")return Ye(e);if(p.kind==="escalate")return _t(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ye(e);if(p.kind==="terminal")return dn(e,p.terminal);let h=s.get(p.state);if(h===void 0)return _t(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ye(e);i=h.id;continue}finally{e.workflow=m}}if(Ir(d))return _t(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ye(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return _t(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ye(e);i=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),dn(e,"aborted")}async function GF(t,e,n){let r=vT(e,n),s=t.workflow;t.workflow=La(e,n);try{return await uf(t,n.id,r,n.name)}finally{t.workflow=s}}function vT(t,e){let n=e.parameters,r=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...n,coder:r.coder,reviewers:r.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...n,researchers:r.researchers,consolidator:r.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...n,agent:r.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...n,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...n,outcomes_from_exit:n.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...n,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...n};case"lmctl/foreach":return{...o,type:"ForEach",...n,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...n,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:n.name,kind:n.kind};default:return{...o,type:e.type,...n}}}async function uf(t,e,n,r){let s=_T().get(n.type);if(s===void 0)throw new Error(`unknown archetype: ${n.type}`);if(s.execute===void 0)throw new Error(`archetype ${n.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?zF(t,s):void 0,t.progress_step_id=null;try{return await s.execute(AE(t,e,n,r??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function KF(t,e){try{let n=JSON.parse(t);if(YF(n)&&n.definition_schema_version===3)return Jt.parse(n)}catch{return e}return e}function oi(t){return t.definition_schema_version===3}function La(t,e){let n=e===void 0?[]:Object.keys(t.connections[e.id]??{}),r=Object.fromEntries(n.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=vT(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(r[e.parameters.name]={kind:VF(e.parameters.kind)}),r.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:r,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function VF(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YF(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zF(t,e){let n=`progress.${e.description.namespace}/${e.description.name}`;return r=>{try{if(typeof r.kind!="string"||r.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${n}.${r.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:r.message,data:r.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${n} event: ${i}`)}}}function dn(t,e){t.dal.setRunTerminalState(t.run_id,e);try{aE(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ye(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function ST(t,e){let r=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(r===null)return null;let s;try{let a=JSON.parse(r);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function Oa(t,e){if(!ZF(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let n=t.workflow.errors;return n===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,n.on_unhandled_failure_state!==void 0?{kind:"state",state:n.on_unhandled_failure_state}:(n.on_unhandled_failure!==void 0&&QF(t,e,n.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZF(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QF(t,e,n){let r=eU(t),s=n.capture_evidence&&r!==null?tU(t,r.id):[];t.dal.raiseAttention({kind:n.attention_kind,severity:n.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:r?.id??null,last_error:r?.status_detail??null,evidence_paths:s,recommend_recovery:n.recommend_recovery??null})})}function eU(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function tU(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(r=>r.path)}function bT(t){if(!gT.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${gT.join(", ")}`)}var gT,kT=E(()=>{"use strict";qr();lE();fE();nt();hT();xs();gT=[1,2,3]});import{readFileSync as nU,readdirSync as rU}from"node:fs";import{basename as sU,join as iU,resolve as oU}from"node:path";function AT(t={}){let e=oU(t.workflowsDir??"workflows"),n=rU(e).filter(r=>r.endsWith(".compound.json")).sort((r,s)=>r.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:n.map(r=>aU(iU(e,r)))}}function aU(t){let e=sU(t);try{let n=nU(t,"utf8"),r=It(n);return OT(e,r)}catch(n){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:LT(n)}}}function xT(t,e){try{let n=It(e);return OT(t,n)}catch(n){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:LT(n)}}}function RT(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let n=t.rows.filter(i=>i.status==="PASS").length,r=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${n} pass, ${r} pass_needs_inputs, ${s} fail`),`${e.join(`
2128
+ `),e.loop_feedback_artifact!==void 0){let _=V(t,{run_id:t.run_id,state_name:`${r}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(_.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:_.id,kind:e.loop_feedback_artifact,content:a})}}let u=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Z(t,n,r,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?z(t.workflow,d):{kind:"terminal",terminal:te(t.workflow)}}var LF,tT,nT=E(()=>{"use strict";tf();nt();LF=["blocked","failed","aborted"],tT={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>CF(t,t.state)}});import{spawnSync as $F}from"node:child_process";async function MF(t,e){let n=t.stateId,r=t.displayName,s=await ot(e.command,t,r),i=of(t,r),o=RE(s);if(o.matched&&!i){let h=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:r,kind:o.kind,command:s,message:`ShellStep ${r} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:te(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=$F("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:r,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:te(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&af(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:r,message:`ShellStep ${r} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:te(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Z(t,n,r,m),z(t.workflow,p))}var rT,sT=E(()=>{"use strict";nt();rT={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async t=>MF(t,t.state)}});async function DF(t,e){let n=t.stateId,r=t.displayName,s=V(t,{run_id:t.run_id,state_name:r});t.steps_executed+=1;let i=t.dal.getWorkflowByName(e.workflow_name);if(i===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:te(t.workflow)};let o=It(i.definition),a=await jF(t,e),l=await t.runChildWorkflow(i,o,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:te(t.workflow)};Z(t,n,r,PF(t,l.run_id,o.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:te(t.workflow)}:z(t.workflow,u)}async function jF(t,e){let n={};for(let[r,s]of Object.entries(e.inputs??{})){let i=await SE(s,t);n[r]=i===s?await ka(s,t):i}return n}function PF(t,e,n){let r={};for(let s of n)r[s.name]=FF(t,e,s);return r}function FF(t,e,n){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,n.source_step_id)[0];if(s===void 0)return null;let i=UF(s,n.source_field);if(i.found)return i.value;let a=t.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,n.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function UF(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var iT,oT=E(()=>{"use strict";Ks();nt();ti();iT={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>DF(t,t.state)}});function WF(t,e){let n=t.stateId,r=t.displayName,s=e.name??r,i=V(t,{run_id:t.run_id,state_name:r});return t.steps_executed+=1,t.dal.finishStep(i.id,s,e.kind??"neutral"),Z(t,n,r,s),{kind:"terminal",terminal:s}}var aT,lT=E(()=>{"use strict";nt();aT={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:t=>WF(t,t.state)}});async function qF(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",n=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||n.length===0)return null;let r=new URL(`https://api.github.com/repos/${e}/${n}/issues`);r.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&r.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&r.searchParams.set("since",t.parameters.since);let s=await fetch(r);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let i=await s.json();if(!Array.isArray(i))throw new Error("github issue trigger returned unexpected JSON");let o=BF(t.cursor),a=i.filter(HF).filter(c=>c.id>o);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function BF(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HF(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var cT,dT=E(()=>{"use strict";cT={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async t=>qF(t)}});async function XF(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let n=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===n?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:n,cron:e}]}}var uT,fT=E(()=>{"use strict";uT={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>XF(t)}});function mT(t){t.register(LE),t.register(tT),t.register(DE),t.register(qE),t.register(HE),t.register(KE),t.register(QE),t.register(rT),t.register($E),t.register(PE),t.register(iT),t.register(aT),t.register(uT),t.register(cT)}var pT=E(()=>{"use strict";CE();ME();jE();UE();BE();XE();YE();eT();nT();sT();oT();lT();dT();fT()});function _T(){return Ra===null&&(Ra=new cf,mT(Ra)),Ra}var JF,cf,Ra,hT=E(()=>{"use strict";pT();JF={Review:"lmctl/review",Consolidate:"lmctl/consolidate",Interactive:"lmctl/interactive",Loop:"lmctl/loop",ShellStep:"lmctl/shell-step",AssertRepoClean:"lmctl/assert-repo-clean",Choice:"lmctl/choice",ForEach:"lmctl/foreach",Subflow:"lmctl/subflow",Terminal:"lmctl/terminal"},cf=class{types=new Map;register(e){let n=`${e.description.namespace}/${e.description.name}`;if(this.types.has(n))throw new Error(`archetype already registered: ${n}`);this.types.set(n,e)}get(e){let n=e.includes("/")?e:JF[e];return n?this.types.get(n):void 0}list(){return Array.from(this.types.values())}},Ra=null});async function wT(t){bT(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let n=t.dal.getProjectByJob(t.job.id);if(n===null)throw new Error(`job ${t.job.id} has no project`);let r=KF(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),i=oi(r)?r.entry_step_id:r.start_at,o=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:i}),a=r.requires,l=uE(a);if(l!==null)return t.dal.setRunTerminalState(o.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:n.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:r.name,kind:l.kind,tool:l.tool,install_hint:l.install_hint,last_error:l.message,detail:l.detail??null})}),{run_id:o.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(oi(r)){let m=df({dal:t.dal,workflow:La(r),job:t.job,project:n,run:o,membersByAlias:c,outcomes:s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},inputs:$n(t.job.payload)??{},team_id:t.team.id}),p=await TT(r,m,o.current_state??r.entry_step_id);return yT(t.dal,n.id,o.id,r.name,p),p}let u=s!==null&&o===s?t.dal.listLatestStepOutcomesByState(o.id):{},d=df({dal:t.dal,workflow:r,job:t.job,project:n,run:o,membersByAlias:c,outcomes:u,inputs:$n(t.job.payload)??{},team_id:t.team.id}),f=await ET(d,o.current_state??r.start_at);return yT(t.dal,n.id,o.id,r.name,f),f}function yT(t,e,n,r,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let u=t.getRun(n);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[i];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(o=p.kind),o==="unknown"&&Array.isArray(f.steps)){for(let _ of f.steps)if(_.type==="lmctl/terminal"&&_.parameters!==null&&typeof _.parameters=="object"){let y=_.parameters;if(y.name===i&&(y.kind==="success"||y.kind==="failure"||y.kind==="neutral")){o=y.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let _=h;(_.on_unhandled_failure!==void 0||_.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=t.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",n)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:e,run_id:n,payload:JSON.stringify({run_id:n,workflow_name:r,terminal_state:i,terminal_kind:o,last_error:l})})}function df(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(n,r,s)=>{let i=e.parent_step_id,o=e.iteration;e.parent_step_id=s?.parent_step_id??i,e.iteration=s?.iteration??o;try{return await uf(e,n,r,s?.display_name??n)}finally{e.parent_step_id=i,e.iteration=o}},runChildWorkflow:async(n,r,s)=>{bT(r);let i=oi(r)?r.entry_step_id:r.start_at,o=t.dal.insertRun({job_id:t.job.id,workflow_id:n.id,team_id:t.team_id,current_state:i,parent_run_id:e.run_id}),a=df({dal:t.dal,workflow:oi(r)?La(r):r,job:t.job,project:t.project,run:o,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return oi(r)?TT(r,a,o.current_state??r.entry_step_id):ET(a,o.current_state??r.start_at)}};return e}async function ET(t,e){let n=e;if(n.startsWith(ni))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(n.startsWith("@terminal:"))return dn(t,n.slice(10));t.dal.setRunCurrentState(t.run_id,n),t.last_state_id=n;let i=t.workflow.states[n];if(i===void 0){let l=Oa(t,te(t.workflow));if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return _t(t,{id:n,name:n,type:"unknown"},l.token,l.reason),Ye(t);if(l.kind==="terminal")return dn(t,l.terminal);n=l.state;continue}let o,a=ST(t,n);if(a!==null){let l=V(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Z(t,n,n,a),a===As)return dn(t,Nc);let c=i.outcomes?.[a];o=c!==void 0?z(t.workflow,c):_t(t,{id:n,name:n,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${n}'`)}else o=await uf(t,n,i);if(o.kind==="paused")return Ye(t);if(o.kind==="escalate")return _t(t,{id:n,name:n,type:i.type},o.token,o.reason),Ye(t);if(o.kind==="terminal"){let l=Oa(t,o.terminal);if(l.kind==="paused")return Ye(t);if(l.kind==="escalate")return _t(t,{id:n,name:n,type:i.type},l.token,l.reason),Ye(t);if(l.kind==="terminal")return dn(t,l.terminal);n=l.state;continue}n=o.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let r=Oa(t,te(t.workflow));return r.kind==="terminal"?dn(t,r.terminal):dn(t,te(t.workflow))}async function TT(t,e,n){let r=new Map(t.steps.map(o=>[o.id,o])),s=new Map(t.steps.map(o=>[o.name,o])),i=n;for(let o=0;o<1e3;o+=1){e.dal.setRunCurrentState(e.run_id,i);let a=r.get(i);if(a===void 0)return _t(e,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),Ye(e);let l=ST(e,a.id);if(l!==null){let m=V(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Z(e,a.id,a.name,l),l===As)return dn(e,Nc);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return _t(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Ye(e);i=h;continue}let c=await GF(e,t,a);if(c.kind==="paused")return Ye(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return _t(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Ye(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=La(t,a);try{let p=Oa(e,d);if(p.kind==="paused")return Ye(e);if(p.kind==="escalate")return _t(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Ye(e);if(p.kind==="terminal")return dn(e,p.terminal);let h=s.get(p.state);if(h===void 0)return _t(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Ye(e);i=h.id;continue}finally{e.workflow=m}}if(Ir(d))return _t(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ye(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return _t(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Ye(e);i=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),dn(e,"aborted")}async function GF(t,e,n){let r=vT(e,n),s=t.workflow;t.workflow=La(e,n);try{return await uf(t,n.id,r,n.name)}finally{t.workflow=s}}function vT(t,e){let n=e.parameters,r=e.members??{},s=Object.keys(t.connections[e.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...n,coder:r.coder,reviewers:r.reviewers,outcomes:{approve:i.approve??"@terminal:approve",...i.request_changes!==void 0?{request_changes:i.request_changes}:{},...i.fail_pre_check!==void 0?{fail_pre_check:i.fail_pre_check}:{},...i.max_loops_exceeded!==void 0?{max_loops_exceeded:i.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...o,type:"Consolidate",...n,researchers:r.researchers,consolidator:r.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...n,agent:r.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...n,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...n,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...n,outcomes_from_exit:n.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...n,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...n};case"lmctl/foreach":return{...o,type:"ForEach",...n,outcomes:{all_ok:i.all_ok??"@terminal:all_ok",...i.any_failed!==void 0?{any_failed:i.any_failed}:{}}};case"lmctl/subflow":return{...o,type:"Subflow",...n,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:n.name,kind:n.kind};default:return{...o,type:e.type,...n}}}async function uf(t,e,n,r){let s=_T().get(n.type);if(s===void 0)throw new Error(`unknown archetype: ${n.type}`);if(s.execute===void 0)throw new Error(`archetype ${n.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=t.emit_progress,o=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?zF(t,s):void 0,t.progress_step_id=null;try{return await s.execute(AE(t,e,n,r??e))}finally{t.emit_progress=i,t.progress_step_id=o}}function KF(t,e){try{let n=JSON.parse(t);if(YF(n)&&n.definition_schema_version===3)return Jt.parse(n)}catch{return e}return e}function oi(t){return t.definition_schema_version===3}function La(t,e){let n=e===void 0?[]:Object.keys(t.connections[e.id]??{}),r=Object.fromEntries(n.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let i=t.steps.find(o=>o.name===e.parameters.body);i!==void 0&&(s[e.parameters.body]=vT(t,i))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(r[e.parameters.name]={kind:VF(e.parameters.kind)}),r.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:r,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function VF(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YF(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zF(t,e){let n=`progress.${e.description.namespace}/${e.description.name}`;return r=>{try{if(typeof r.kind!="string"||r.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${n}.${r.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:r.message,data:r.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${n} event: ${i}`)}}}function dn(t,e){t.dal.setRunTerminalState(t.run_id,e);try{aE(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Ye(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function ST(t,e){let r=t.dal.getRun(t.run_id)?.pending_escalation_decision??null;if(r===null)return null;let s;try{let a=JSON.parse(r);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[e];if(typeof i!="string")return null;delete s[e];let o=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,o),i}function Oa(t,e){if(!ZF(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let n=t.workflow.errors;return n===void 0?{kind:"terminal",terminal:e}:(t.errors_block_fired=!0,n.on_unhandled_failure_state!==void 0?{kind:"state",state:n.on_unhandled_failure_state}:(n.on_unhandled_failure!==void 0&&QF(t,e,n.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZF(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QF(t,e,n){let r=eU(t),s=n.capture_evidence&&r!==null?tU(t,r.id):[];t.dal.raiseAttention({kind:n.attention_kind,severity:n.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:r?.id??null,last_error:r?.status_detail??null,evidence_paths:s,recommend_recovery:n.recommend_recovery??null})})}function eU(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function tU(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(r=>r.path)}function bT(t){if(!gT.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${gT.join(", ")}`)}var gT,kT=E(()=>{"use strict";qr();lE();fE();nt();hT();xs();gT=[1,2,3]});import{readFileSync as nU,readdirSync as rU}from"node:fs";import{basename as sU,join as iU,resolve as oU}from"node:path";function AT(t={}){let e=oU(t.workflowsDir??"workflows"),n=rU(e).filter(r=>r.endsWith(".compound.json")).sort((r,s)=>r.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:n.map(r=>aU(iU(e,r)))}}function aU(t){let e=sU(t);try{let n=nU(t,"utf8"),r=It(n);return OT(e,r)}catch(n){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:LT(n)}}}function xT(t,e){try{let n=It(e);return OT(t,n)}catch(n){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:LT(n)}}}function RT(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of t.rows){let o=(i.workflow_name??i.file).slice(0,36).padEnd(36),a=`${i.first_step_id??"-"}${i.first_step_type===null?"":` (${i.first_step_type})`}`;e.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let n=t.rows.filter(i=>i.status==="PASS").length,r=t.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(i=>i.status==="FAIL").length;return e.push(""),e.push(`summary: ${n} pass, ${r} pass_needs_inputs, ${s} fail`),`${e.join(`
2129
2129
  `)}
2130
2130
  `}function OT(t,e){let n=cU(e),r=dU(e);if(n===null||r===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:n,first_step_type:r,first_step_disposition:null,note:"entry step missing after validation"};let s=lU(e.inputs);return s.length>0?{file:t,workflow_name:e.name,status:"PASS_NEEDS_INPUTS",first_step_id:n,first_step_type:r,first_step_disposition:`needs_inputs:${r}`,note:`load ok; graph ok; entry step is ${n}; requires inputs: ${s.join(", ")}`}:{file:t,workflow_name:e.name,status:"PASS",first_step_id:n,first_step_type:r,first_step_disposition:`ready:${r}`,note:"load ok; graph ok; first step entered without inputs"}}function lU(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cU(t){return ff(t)?t.entry_step_id:t.start_at}function dU(t){return ff(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function ff(t){return t.definition_schema_version===3}function LT(t){return t instanceof ln?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function CT(t){let e=new Set;if(ff(t))for(let n of t.steps){let r=n.members??{};IT(r,e)}else for(let n of Object.values(t.states))IT(n,e);return[...e].sort()}function IT(t,e){let n=["coder","agent","consolidator"],r=["reviewers","researchers"];for(let s of n){let i=t[s],o=NT(i);o!==null&&e.add(o)}for(let s of r){let i=t[s];if(Array.isArray(i))for(let o of i){let a=NT(o);a!==null&&e.add(a)}}}function NT(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Ca=E(()=>{"use strict";Ks()});function uU({dal:t}){let e=t.listProjects();for(let n of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",n.id,$a)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let o=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=fU(t,n,o);if(a<20)continue;let c=o??"initial",u=`${ai}:${n.id}:${c}`;t.enqueueJob({project_id:n.id,source:$a,source_ref:ai,payload:JSON.stringify({kind:ai,project_id:n.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:u})}}function fU(t,e,n){let r=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
2131
2131
  FROM run r
@@ -2223,7 +2223,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2223
2223
  <label>Token <input name="token" type="password"></label>
2224
2224
  <button type="submit">Login</button>
2225
2225
  </form>
2226
- `))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return jw(o)?(Fu(s,o),s.redirect("/",302)):s.html(je("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Pw(s),s.redirect("/login",302))),HT(e,{dal:t.dal}),Fv(e,{dal:t.dal}),av(e,{dal:t.dal}),yv(e,{terminalSessionManager:t.terminalSessionManager}),bv(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=Bs(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await cu(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return q(s,{team:i,seeded:u,failed:d},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),Xw(e,{dal:t.dal}),Zw(e,{dal:t.dal}),e.get("/api/status",s=>q(s,Xo(t.dal),$q)),e.get("/api/projects",s=>q(s,Jo(t.dal),Mq)),e.get("/api/teams",s=>q(s,My(t.dal),Pq)),e.get("/api/workflows",s=>q(s,Go(t.dal),Fq)),e.get("/api/workflows/verify",s=>{let i=AT();return s.req.header("accept")?.includes("text/plain")?s.text(RT(i)):s.json(i)}),e.get("/api/jobs",s=>q(s,Dy(t.dal,{status:s.req.query("status")}),Uq)),e.post("/api/uploads",s=>Jv(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=Ko(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,ge)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:u,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return q(s,d,ge)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Da(),UT)),o=Ko(t.dal,ie(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():q(s,i,ge)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():q(s,t.dal.listProjectWorkflows(i.id),Dq)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await es(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(u!==null)try{Ur(u)}catch{return s.text("invalid condition",400)}let d=Rq(o.parameters_override??o.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return q(s,m,ge)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():q(s,i,ge)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?q(s,{removed:!0},ge):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!0);return i===null?s.notFound():q(s,i,ge)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!1);return i===null?s.notFound():q(s,i,ge)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Vv(s.req.query("status"),Oq);if(typeof o=="string")return s.text(o,400);let a=Vv(s.req.query("severity"),nS);return typeof a=="string"?s.text(a,400):q(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),jq)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await es(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=Lq(o.severity);if(typeof c=="object")return s.text(c.error,400);let u=Cq(o.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return q(s,d,ge)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():q(s,i,ge)}),e.post("/api/issues/:id/claim",async s=>{let i=ie(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await es(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):q(s,c,ge)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await es(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):q(s,l,ge)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await es(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return q(s,t.dal.closeIssue(ie(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),ge)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await es(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return q(s,t.dal.reopenIssue(ie(s,"id"),a),ge)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return q(s,{...i,owner:a,repo:l},ge)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=sr(t.dal,i,o);return q(s,a,ge)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=sr(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):q(s,l,ge);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=Aq(l.path);if(xq(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=yq(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return q(s,l,ge)}return q(s,l,ge)}),e.get("/api/runs",s=>q(s,Pr(t.dal,{limit:Mf(s,"limit")??100}),Wq)),e.get("/api/runs/:id",s=>{let i=rr(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,qq)}),e.get("/api/runs/:id/where",s=>{let i=Fr(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Yo(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=zo(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Zo(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ie(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(nl(t.daemon),q(s,o,Yv)):q(s,o,Yv,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ie(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(o=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(o=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(nl(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>Kv(s,t.dal,i=>q(s,i,Hq))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=Uy(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():tS(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Kv(s,t.dal,i=>{let o=Nv(i);return q(s,o,a=>ye(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>q(s,Wy(t.dal,{type:s.req.query("type")}),Xq)),e.get("/api/external-signals",s=>q(s,qy(t.dal,{unhandled:s.req.query("unhandled")==="true"}),Jq)),e.get("/api/attentions",s=>q(s,On(t.dal,{unacked:s.req.query("unacked")==="true"}),Gq)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ie(s,"id"));return i===null?s.notFound():q(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=Vo(t.dal,l);return q(s,c,u=>`<h1>Escalations</h1>${ye(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[b(d.attention_id),b(d.project),b(d.run_id),b(d.workflow_name),b(d.state_name),b((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Xt(t.dal,ie(s,"id"));return i===null?s.notFound():q(s,i,ge)}),e.post("/api/escalations/:id/respond",async s=>{let i=ie(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=Xt(t.dal,i);if(c===null)return s.notFound();let u=On(t.dal).find(m=>m.id===i);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);nl(t.daemon);let p=On(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,o,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(i);return nl(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=jy(t.dal,{status:o,pr_url:i});return q(s,a,Kq)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=Py(t.dal,i);return o===null?s.notFound():q(s,o,Vq)}),e.get("/api/sessions",s=>q(s,t.dal.latestSessionSizes(),zv)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=Bs(s.req.param("team_name"));return q(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),zv)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=Bs(s.req.param("team_name"));try{let o=await Ay(t.dal,i,s.req.param("alias"));return q(s,o,a=>Zv("compacted",a.row))}catch(o){if(o instanceof qs)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=Bs(s.req.param("team_name")),o=await cu(t.dal,i,s.req.param("alias"));return q(s,o,a=>Zv(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>q(s,n,Qv)),e.post("/api/intake/scan",async s=>(n=await pa(t.dal),q(s,n,Qv))),e.get("/api/stats/run-throughput",s=>q(s,Xy(t.dal),Yq)),e.get("/api/daemon/state",s=>q(s,t.daemon?.state??null,zq)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return q(s,{disabled:!0},ge);let i=await t.daemon.runCycle();return q(s,{state:t.daemon.state,result:i},ge)}),e.get("/metrics/:project_id",s=>{let i=ie(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=hu(t.dal,i),l=gu(t.dal,{project_id:i});return s.html(je(`Metrics \u2014 ${o.name}`,Zq(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Mf(s,"since_days");return s.json(hu(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Mf(s,"since_days");return s.json(gu(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ie(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function Kv(t,e,n){let r=_u(e,ie(t,"id"),ie(t,"step_id"));return r===null?t.notFound():n(r)}function nl(t){t!==void 0&&t.runCycle().catch(()=>{})}function q(t,e,n,r=200){return tS(t)?r===200?t.html(n(e)):t.html(n(e),400):new Response(JSON.stringify(e),{status:r,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function tS(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function Iq(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return tl(`${t}/index.html`)?Df(t):null;let e="src/serve/webui-dist";if(tl(`${e}/index.html`))return e;let n="dist/serve/webui-dist";if(tl(`${n}/index.html`))return n;let r=vq(wq(bq(import.meta.url)),"webui-dist");return tl(`${r}/index.html`)?Df(r):null}function Df(t){if(!Tq(t))return t;let e=Sq(process.cwd(),t);return e.length===0?".":e}function Nq(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function Mf(t,e){let n=t.req.query(e);if(n===void 0)return;let r=Number(n);return Number.isInteger(r)&&r>0?r:void 0}function Aq(t){switch(Eq(t).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function xq(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function es(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function Rq(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function Vv(t,e){if(t===void 0||t.length===0)return;let n=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(n.length!==0){for(let r of n)if(!e.includes(r))return`invalid value: ${r}`;return n}}function Lq(t){if(t!=null)return typeof t=="string"&&nS.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Cq(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(n=>typeof n=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function $q(t){return`<h1>Status</h1><div class="grid">
2226
+ `))),e.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return jw(o)?(Fu(s,o),s.redirect("/",302)):s.html(je("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(Pw(s),s.redirect("/login",302))),HT(e,{dal:t.dal}),Fv(e,{dal:t.dal}),av(e,{dal:t.dal}),yv(e,{terminalSessionManager:t.terminalSessionManager}),bv(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let i=Bs(s.req.param("team_name")),o=t.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(o.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await cu(t.dal,i,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return H(s,{team:i,seeded:u,failed:d},f=>`<p>refreshed team ${b(f.team)}: seeded [${f.seeded.map(m=>b(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${b(m.alias)}: ${b(m.error)}`).join(", ")}]`:""}</p>`)}),Xw(e,{dal:t.dal}),Zw(e,{dal:t.dal}),e.get("/api/status",s=>H(s,Xo(t.dal),$q)),e.get("/api/projects",s=>H(s,Jo(t.dal),Mq)),e.get("/api/teams",s=>H(s,My(t.dal),Pq)),e.get("/api/workflows",s=>H(s,Go(t.dal),Fq)),e.get("/api/workflows/verify",s=>{let i=AT();return s.req.header("accept")?.includes("text/plain")?s.text(RT(i)):s.json(i)}),e.get("/api/jobs",s=>H(s,Dy(t.dal,{status:s.req.query("status")}),Uq)),e.post("/api/uploads",s=>Jv(s,t.dal)),e.get("/api/jobs/:id",s=>{let i=Ko(t.dal,ie(s,"id"));return i===null?s.notFound():H(s,i,ge)}),e.post("/api/jobs",async s=>{let i;try{i=await s.req.json()}catch{return s.text("invalid JSON body",400)}let o=null;if(typeof i.project_id=="number")o=i.project_id;else if(typeof i.project=="string"){let f=t.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=t.dal.listProjects();f.length===1&&(o=f[0].id)}if(o===null)return s.text("missing project or project_id",400);let a=typeof i.workflow_id_override=="number"?i.workflow_id_override:null;if(a===null&&typeof i.workflow=="string"){let f=t.dal.getWorkflowByName(i.workflow);if(f===null)return s.text(`workflow not found: ${i.workflow}`,404);a=f.id}let l=typeof i.source=="string"?i.source:"manual",c=i.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:u,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return H(s,d,ge)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Da(),UT)),o=Ko(t.dal,ie(s,"id"));if(o===null)return s.notFound();let a=await i({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:o.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let i=t.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():H(s,i,ge)}),e.get("/api/projects/:name/workflows",s=>{let i=t.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():H(s,t.dal.listProjectWorkflows(i.id),Dq)}),e.post("/api/projects/:name/workflows",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await es(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.workflow=="string"?o.workflow:null,l=typeof o.workflow_id=="number"?o.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(u!==null)try{Ur(u)}catch{return s.text("invalid condition",400)}let d=Rq(o.parameters_override??o.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=t.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return H(s,m,ge)}),e.get("/api/projects/workflows/:id",s=>{let i=t.dal.getProjectWorkflow(ie(s,"id"));return i===null?s.notFound():H(s,i,ge)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(ie(s,"id"))?H(s,{removed:!0},ge):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!0);return i===null?s.notFound():H(s,i,ge)}),e.post("/api/projects/workflows/:id/disable",s=>{let i=t.dal.setProjectWorkflowEnabled(ie(s,"id"),!1);return i===null?s.notFound():H(s,i,ge)}),e.get("/api/projects/:name/issues",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Vv(s.req.query("status"),Oq);if(typeof o=="string")return s.text(o,400);let a=Vv(s.req.query("severity"),nS);return typeof a=="string"?s.text(a,400):H(s,t.dal.listIssues(i.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),jq)}),e.post("/api/projects/:name/issues",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await es(s);if(typeof o=="string")return s.text(o,400);let a=typeof o.title=="string"&&o.title.trim().length>0?o.title:null,l=typeof o.body=="string"?o.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=Lq(o.severity);if(typeof c=="object")return s.text(c.error,400);let u=Cq(o.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof o.ai_test_path=="string"?o.ai_test_path:null,source_run_id:typeof o.source_run_id=="number"?o.source_run_id:null});return H(s,d,ge)}),e.get("/api/issues/:id",s=>{let i=t.dal.getIssue(ie(s,"id"));return i===null?s.notFound():H(s,i,ge)}),e.post("/api/issues/:id/claim",async s=>{let i=ie(s,"id"),o=t.dal.getIssue(i);if(o===null)return s.notFound();let a=await es(s);if(typeof a=="string")return s.json({error:a},400);let l=typeof a.assigned_run_id=="number"?a.assigned_run_id:null;if(l===null)return s.json({error:"missing assigned_run_id"},400);let c=t.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):H(s,c,ge)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await es(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.assigned_run_id=="number"?o.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):H(s,l,ge)}),e.post("/api/issues/:id/close",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await es(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.closed_run_id=="number"?o.closed_run_id:i.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return H(s,t.dal.closeIssue(ie(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),ge)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let i=t.dal.getIssue(ie(s,"id"));if(i===null)return s.notFound();let o=await es(s);if(typeof o=="string")return s.json({error:o},400);let a=typeof o.source_run_id=="number"?o.source_run_id:i.closed_run_id??i.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return H(s,t.dal.reopenIssue(ie(s,"id"),a),ge)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let i=t.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=i.name.indexOf("/"),a=o>0?i.name.slice(0,o):null,l=o>0?i.name.slice(o+1):i.name;return H(s,{...i,owner:a,repo:l},ge)}),e.get("/api/runs/:run_id/artifacts",s=>{let i=ie(s,"run_id"),o=s.req.query("kind"),a=sr(t.dal,i,o);return H(s,a,ge)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=ie(s,"run_id"),o=s.req.param("kind"),a=sr(t.dal,i,o);if(a.length===0)return s.notFound();let l=a[a.length-1],c=s.req.query("raw")==="true";if(l.content!==null&&l.content!==void 0)return c?s.text(l.content):H(s,l,ge);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=Aq(l.path);if(xq(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=yq(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return H(s,l,ge)}return H(s,l,ge)}),e.get("/api/runs",s=>H(s,Pr(t.dal,{limit:Mf(s,"limit")??100}),Wq)),e.get("/api/runs/:id",s=>{let i=rr(t.dal,ie(s,"id"));return i===null?s.notFound():H(s,i,qq)}),e.get("/api/runs/:id/where",s=>{let i=Fr(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Yo(i)):s.json(i)}),e.get("/api/runs/:id/timeline",s=>{let i=zo(t.dal,ie(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Zo(i)):s.json(i)}),e.post("/api/runs/:id/resume",async s=>{let i=s.req.query("outcome");if(i===void 0||i.length===0){let a=s.req.header("content-type")??"";if(a.includes("application/x-www-form-urlencoded")||a.includes("multipart/form-data")){let c=(await s.req.parseBody().catch(()=>({}))).outcome;typeof c=="string"&&c.length>0&&(i=c)}}if(i===void 0||i.length===0)return s.text("missing outcome",400);let o=t.dal.resumeRun(ie(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(nl(t.daemon),H(s,o,Yv)):H(s,o,Yv,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let i=ie(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(o=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(o=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(nl(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>Kv(s,t.dal,i=>H(s,i,Hq))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=Uy(t.dal,ie(s,"id"),ie(s,"step_id"));return i===null?s.notFound():tS(s)?s.html(`<pre>${b(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>Kv(s,t.dal,i=>{let o=Nv(i);return H(s,o,a=>ye(["role","text"],a.map(l=>[b(l.role),b(l.text)])))})),e.get("/api/external-objects",s=>H(s,Wy(t.dal,{type:s.req.query("type")}),Xq)),e.get("/api/external-signals",s=>H(s,qy(t.dal,{unhandled:s.req.query("unhandled")==="true"}),Jq)),e.get("/api/attentions",s=>H(s,On(t.dal,{unacked:s.req.query("unacked")==="true"}),Gq)),e.post("/api/attentions/:id/ack",s=>{let i=t.dal.acknowledgeAttention(ie(s,"id"));return i===null?s.notFound():H(s,i,o=>`<p>acknowledged attention ${b(o.id)}</p>`)}),e.get("/api/escalations",s=>{let i=s.req.query("project"),o=s.req.query("all")==="true",a=s.req.query("since"),l={all:o};i!==void 0&&(l.project=i),a!==void 0&&(l.since=a);let c=Vo(t.dal,l);return H(s,c,u=>`<h1>Escalations</h1>${ye(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[b(d.attention_id),b(d.project),b(d.run_id),b(d.workflow_name),b(d.state_name),b((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let i=Xt(t.dal,ie(s,"id"));return i===null?s.notFound():H(s,i,ge)}),e.post("/api/escalations/:id/respond",async s=>{let i=ie(s,"id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(o=m.input),m.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let m=await s.req.parseBody().catch(()=>({}));typeof m.input=="string"&&(o=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=Xt(t.dal,i);if(c===null)return s.notFound();let u=On(t.dal).find(m=>m.id===i);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);nl(t.daemon);let p=On(t.dal).find(h=>h.id===i);return s.json({ok:!0,attention_id:i,run_id:m.run.id,decision:o,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,o,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(i);return nl(t.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=jy(t.dal,{status:o,pr_url:i});return H(s,a,Kq)}),e.get("/api/submitted-prs/:id",s=>{let i=ie(s,"id"),o=Py(t.dal,i);return o===null?s.notFound():H(s,o,Vq)}),e.get("/api/sessions",s=>H(s,t.dal.latestSessionSizes(),zv)),e.get("/api/sessions/:team_name/:alias/history",s=>{let i=Bs(s.req.param("team_name"));return H(s,t.dal.sessionSizeHistory(i,s.req.param("alias")),zv)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=Bs(s.req.param("team_name"));try{let o=await Ay(t.dal,i,s.req.param("alias"));return H(s,o,a=>Zv("compacted",a.row))}catch(o){if(o instanceof qs)return s.text(o.message,409);throw o}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=Bs(s.req.param("team_name")),o=await cu(t.dal,i,s.req.param("alias"));return H(s,o,a=>Zv(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>H(s,n,Qv)),e.post("/api/intake/scan",async s=>(n=await pa(t.dal),H(s,n,Qv))),e.get("/api/stats/run-throughput",s=>H(s,Xy(t.dal),Yq)),e.get("/api/daemon/state",s=>H(s,t.daemon?.state??null,zq)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return H(s,{disabled:!0},ge);let i=await t.daemon.runCycle();return H(s,{state:t.daemon.state,result:i},ge)}),e.get("/metrics/:project_id",s=>{let i=ie(s,"project_id"),o=t.dal.getProject(i);if(o===null)return s.notFound();let a=hu(t.dal,i),l=gu(t.dal,{project_id:i});return s.html(je(`Metrics \u2014 ${o.name}`,Zq(o.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Mf(s,"since_days");return s.json(hu(t.dal,i,o))}),e.get("/api/metrics/tools/:project_id",s=>{let i=ie(s,"project_id");if(t.dal.getProject(i)===null)return s.notFound();let o=Mf(s,"since_days");return s.json(gu(t.dal,{project_id:i,since_days:o}))}),e.post("/api/drift/:id/ack",s=>{let i=t.dal.acknowledgeDriftSignal(ie(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),e}function Kv(t,e,n){let r=_u(e,ie(t,"id"),ie(t,"step_id"));return r===null?t.notFound():n(r)}function nl(t){t!==void 0&&t.runCycle().catch(()=>{})}function H(t,e,n,r=200){return tS(t)?r===200?t.html(n(e)):t.html(n(e),400):new Response(JSON.stringify(e),{status:r,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function tS(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function Iq(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return tl(`${t}/index.html`)?Df(t):null;let e="src/serve/webui-dist";if(tl(`${e}/index.html`))return e;let n="dist/serve/webui-dist";if(tl(`${n}/index.html`))return n;let r=vq(wq(bq(import.meta.url)),"webui-dist");return tl(`${r}/index.html`)?Df(r):null}function Df(t){if(!Tq(t))return t;let e=Sq(process.cwd(),t);return e.length===0?".":e}function Nq(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function ie(t,e){return Number(t.req.param(e))}function Mf(t,e){let n=t.req.query(e);if(n===void 0)return;let r=Number(n);return Number.isInteger(r)&&r>0?r:void 0}function Aq(t){switch(Eq(t).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function xq(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function es(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function Rq(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function Vv(t,e){if(t===void 0||t.length===0)return;let n=t.split(",").map(r=>r.trim()).filter(r=>r.length>0);if(n.length!==0){for(let r of n)if(!e.includes(r))return`invalid value: ${r}`;return n}}function Lq(t){if(t!=null)return typeof t=="string"&&nS.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Cq(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(n=>typeof n=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function $q(t){return`<h1>Status</h1><div class="grid">
2227
2227
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
2228
2228
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
2229
2229
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -2277,7 +2277,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
2277
2277
  WHERE target_teamfile = ?
2278
2278
  AND target_alias = ?
2279
2279
  AND status = 'running'`,e,n),s=0;for(let i of r)ts(t,i)!==null&&(s+=1);return s}var di=E(()=>{"use strict";ct()});import{randomUUID as lB}from"node:crypto";import{existsSync as Kne,mkdirSync as cB,readFileSync as dB,writeFileSync as uB}from"node:fs";import{homedir as fB}from"node:os";import{dirname as mB,join as pB}from"node:path";function rl(){return process.env.LMCTL_DEVICE_FILE??pB(fB(),".lmctl","device.json")}function ur(t=rl()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let n=JSON.parse(dB(t,"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 ui(t=rl()){let e=ur(t);if(e!==null&&e.created_at!=="env")return e;let n={device_id:lB(),created_at:new Date().toISOString()};return cB(mB(t),{recursive:!0}),uB(t,`${JSON.stringify(n,null,2)}
2280
- `,{encoding:"utf8",mode:384}),n}var sl=E(()=>{"use strict"});async function O(t,e){if(t.dal!==void 0)return e(t.dal);let n=Be({path:Q()});try{return await e(n)}finally{n.close()}}function V(t,e,n=["--json"]){let r=new Set(e),s=new Set(n),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[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=t[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 L(t,e){let n=t.flags[e];return typeof n=="string"?n:void 0}function B(t,e){return t.flags[e]===!0}function H(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
2280
+ `,{encoding:"utf8",mode:384}),n}var sl=E(()=>{"use strict"});async function L(t,e){if(t.dal!==void 0)return e(t.dal);let n=Be({path:Q()});try{return await e(n)}finally{n.close()}}function Y(t,e,n=["--json"]){let r=new Set(e),s=new Set(n),i=[],o={};for(let a=0;a<t.length;a+=1){let l=t[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=t[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(t,e){let n=t.flags[e];return typeof n=="string"?n:void 0}function X(t,e){return t.flags[e]===!0}function J(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
2281
2281
  `)}function k(t,e){return t.stderr.write(`error: ${e}
2282
2282
  `),1}function Pe(t,e){let n=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${n}
2283
2283
  `),2}function il(t){if(t===void 0)return null;let e=Number.parseInt(t,10);return Number.isInteger(e)&&e>0?e:null}var Ie=E(()=>{"use strict";dt();We()});function hS(t){if(t.length===0||!t.startsWith("---"))throw new Kt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
@@ -2299,7 +2299,7 @@ The session marker may be stale or the team may not be registered in this lmctl
2299
2299
  Consulted ${gs(Q())}
2300
2300
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function IS(t){return`unknown option --from
2301
2301
  ${Jf(t)}`}function NS(t,e){let n=mr(t,e);return n.ok?{ok:!0,identity:n.identity,source:"session"}:n}function mr(t,e){let n=t[Os];if(n===void 0||n.length===0)return{ok:!1,reason:"unset"};let r=[];for(let i of e.listRootTeams()){let o;try{o=rt(i.teamfile_path,e)}catch{continue}for(let a of o.members)a.teamfile===void 0&&a.session===n&&r.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(r)];if(s.length===0)return{ok:!1,reason:"not-found"};if(s.length>1)throw new Error("LMCTL_SELF_SESSIONID matches multiple team members; the team registry is ambiguous");return{ok:!0,identity:s[0]}}var fi=E(()=>{"use strict";St();We();Yt()});function ul(t){return jB.has(t)}function Kf(){return Gf===null&&(Gf=Ut(Ht())),Gf}function Vf(t,e,n={}){if(!ul(t))return null;try{let r=Kf().getAdapter?.(t);if(r===void 0)return null;let s=r.resumeCommand(e).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=t==="codex"&&n.isLead===!0?mo({warn:()=>{}}):[],a=n.model!==void 0&&n.model.trim().length>0?DB[t]?.(n.model):void 0;return n.model!==void 0&&n.model.trim().length>0&&a===void 0&&n.onModelIgnored?.({provider:t,model:n.model,reason:`${t} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...AS[t]??[]]}catch{return null}}function fl(t,e,n={}){let r=Vf(t,e,n);return r===null?null:r.join(" ")}function Ne(t,e){return Kf().getSession(t,e)}async function zt(t){return(await Kf().resolveSessions(t)).map(n=>n.provider.name)}var AS,DB,jB,xS,Gf,wt=E(()=>{"use strict";mt();Wc();AS={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:["--auto"],kimi:[]},DB={claude:t=>["--model",t],codex:t=>["--model",t],gemini:t=>["--model",t],opencode:t=>["--model",t],qwen:t=>["--model",t],agy:t=>["--model",t],lmplayer:t=>["--model",t],kimi:t=>["--model",t]},jB=new Set(Object.keys(AS)),xS=/^[\w.:-]+$/;Gf=null});var BS={};oe(BS,{appendIntent:()=>DS,formatAge:()=>mi,formatDuration:()=>_l,resolveIntentLogPath:()=>MS,runStatus:()=>KB,shortIdentity:()=>Et});import{appendFileSync as PB,existsSync as FB,mkdirSync as UB}from"node:fs";import{homedir as WB}from"node:os";import{basename as qB,dirname as $S,isAbsolute as BB,join as HB,resolve as XB}from"node:path";function MS(){return process.env.LMCTL_INTENT_LOG??HB(WB(),".lmctl","recent-intents.log")}function DS(t){try{let e=MS();UB($S(e),{recursive:!0});let n=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});PB(e,`${n}
2302
- `)}catch{}}async function KB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(JB),0;let n=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(n!==void 0)return k(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=V(t,["--since"],["--json"]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length>0)return k(e,`unknown argument: ${r.positionals[0]}`);let s=B(r,"--json"),i=pH(L(r,"--since"));if("error"in i)return k(e,i.error);try{let o=e.env??process.env;if(s){let a=await O(e,l=>LS(l,o));H(e,a)}else{let a=await O(e,async l=>oH(await LS(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return DS({verb:"status",args:t}),0}catch(o){return k(e,o instanceof Error?o.message:String(o))}}async function LS(t,e){let n=mr(e,t);if(!n.ok){if(n.reason==="not-found")throw new Error(fn("status"));return await YB(t)}return await VB(t,n.identity)}async function VB(t,e){let n=Xe(e),r=t.getRootTeam(n.teamfile);if(r===null)throw new Error(fn("status"));let s=rt(r.teamfile_path,t),i=zf(pl(t,{from:n.value})),o=zf(pl(t,{target_teamfile:n.teamfile,target_alias:n.alias})),a=eH([...Yf(t,{from:n.value}),...Yf(t,{target_teamfile:n.teamfile,target_alias:n.alias})]);return{scope:"self",identity:n.value,...jS(),team:{name:s.name,teamfile:r.teamfile_path},members:s.members.map(l=>ZB(t,r.teamfile_path,l)),activity:{from_me:i.map(l=>Zf(l)),to_me:o.map(l=>Zf(l))},transcript_harvest:await PS(a)}}function jS(){let t=null;try{t=kh(bh())}catch{}return{db_path:Q(),site_name:t}}async function YB(t){let e=t.listRootTeams();return{scope:"db",identity:null,...jS(),teams:e.map(n=>zB(t,n)),activity:zf(pl(t)).map(n=>Zf(n)),transcript_harvest:await PS(Yf(t))}}function zB(t,e){if(!FB(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let n=0;try{n=rt(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function ZB(t,e,n){let r=n.teamfile===void 0?null:ve(BB(n.teamfile)?n.teamfile:XB($S(e),n.teamfile),t),s=Sr(t,e,n.alias),i=s.busy&&s.reason==="in-flight"?QB(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function QB(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,o=t.db.prepare(`
2302
+ `)}catch{}}async function KB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(JB),0;let n=t.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(n!==void 0)return k(e,`unknown option ${n}; lmctl status is team/SELF scoped now`);let r=Y(t,["--since"],["--json"]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length>0)return k(e,`unknown argument: ${r.positionals[0]}`);let s=X(r,"--json"),i=pH(C(r,"--since"));if("error"in i)return k(e,i.error);try{let o=e.env??process.env;if(s){let a=await L(e,l=>LS(l,o));J(e,a)}else{let a=await L(e,async l=>oH(await LS(l,o),{sinceIso:i.iso}));e.stdout.write(a)}return DS({verb:"status",args:t}),0}catch(o){return k(e,o instanceof Error?o.message:String(o))}}async function LS(t,e){let n=mr(e,t);if(!n.ok){if(n.reason==="not-found")throw new Error(fn("status"));return await YB(t)}return await VB(t,n.identity)}async function VB(t,e){let n=Xe(e),r=t.getRootTeam(n.teamfile);if(r===null)throw new Error(fn("status"));let s=rt(r.teamfile_path,t),i=zf(pl(t,{from:n.value})),o=zf(pl(t,{target_teamfile:n.teamfile,target_alias:n.alias})),a=eH([...Yf(t,{from:n.value}),...Yf(t,{target_teamfile:n.teamfile,target_alias:n.alias})]);return{scope:"self",identity:n.value,...jS(),team:{name:s.name,teamfile:r.teamfile_path},members:s.members.map(l=>ZB(t,r.teamfile_path,l)),activity:{from_me:i.map(l=>Zf(l)),to_me:o.map(l=>Zf(l))},transcript_harvest:await PS(a)}}function jS(){let t=null;try{t=kh(bh())}catch{}return{db_path:Q(),site_name:t}}async function YB(t){let e=t.listRootTeams();return{scope:"db",identity:null,...jS(),teams:e.map(n=>zB(t,n)),activity:zf(pl(t)).map(n=>Zf(n)),transcript_harvest:await PS(Yf(t))}}function zB(t,e){if(!FB(e.teamfile_path))return{name:e.name,teamfile:e.teamfile_path,member_count:0,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at,missing_on_disk:!0};let n=0;try{n=rt(e.teamfile_path,t).members.length}catch{n=0}return{name:e.name,teamfile:e.teamfile_path,member_count:n,registered_at:e.registered_at,last_seeded_at:e.last_seeded_at}}function ZB(t,e,n){let r=n.teamfile===void 0?null:ve(BB(n.teamfile)?n.teamfile:XB($S(e),n.teamfile),t),s=Sr(t,e,n.alias),i=s.busy&&s.reason==="in-flight"?QB(t,e,n.alias,s.inFlight):null;return{alias:n.alias,provider:n.provider,model:n.model??null,teamfile:e,referenced_teamfile:r,sessionid:n.session??null,sessiondir:n.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i,reclaimable:!s.busy&&s.reclaimable!==void 0?s.reclaimable:null}}function QB(t,e,n,r){let s=r.sender_alias==="operator"?"operator":`${r.sender_teamfile}:${r.sender_alias}`,o=t.db.prepare(`
2303
2303
  SELECT * FROM tracked_invocation
2304
2304
  WHERE kind = 'chat'
2305
2305
  AND status = 'running'
@@ -2327,36 +2327,36 @@ or an ISO timestamp to widen the investigation window. --json returns complete,
2327
2327
  uncapped data.
2328
2328
  `,ml=5,GB=24*60*60*1e3,RS=72,OS=80});var YS={};oe(YS,{runRunning:()=>rm});function gH(t){let e=t.split(`
2329
2329
  `,1)[0];return e.length<=XS?e:`${e.slice(0,XS)}\u2026`}function tm(t){return t.target_teamfile===null||t.target_alias===null?null:`${t.target_teamfile}:${t.target_alias}`}function nm(t){return t.target!==null?Et(t.target):t.from_identity}function JS(t){return`${nm(t)} ${t.kind} running ${mi(t.started_at)} liveness=${t.holder_liveness}`}function GS(t){return`${nm(t)} ${t.kind} DEAD -- stale ${mi(t.started_at)}, holder process confirmed dead`}function KS(t){let e=`${nm(t)} ${t.kind} ${t.status} ran ${_l(t.ran_ms)}, idle ${mi(t.ended_at)}`;return t.status==="error"&&t.error!==null&&t.error!==""&&(e+=` \u2014 ${gH(t.error)}`),e}function VS(t){let e=new Map(t.map(i=>[i.id,i])),n=new Map,r=[];for(let i of t){let o=i.parent_invocation_id;if(o!==null&&e.has(o)){let a=n.get(o)??[];a.push(i),n.set(o,a)}else r.push(i)}let s=(i,o)=>o.started_at.localeCompare(i.started_at);r.sort(s);for(let i of n.values())i.sort(s);return{roots:r,childrenByParent:n}}function yH(t){let{roots:e,childrenByParent:n}=VS(t),r=[],s=(i,o)=>{r.push(`${" ".repeat(o+1)}${i.line}`);for(let a of n.get(i.id)??[])s(a,o+1)};for(let i of e)s(i,0);return r}function wH(t,e,n){let r=[...t.map(a=>({state:"running",...a})),...e.map(a=>({state:"dead",...a})),...n.map(a=>({state:"idle",...a}))],{roots:s,childrenByParent:i}=VS(r),o=a=>({...a,children:(i.get(a.id)??[]).map(o)});return s.map(o)}async function rm(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${hH}
2330
- `),0;let n=V(t,[],["--json","--tree"]);if(n.error!==void 0)return k(e,n.error);let r=n.flags["--json"]===!0,s=n.flags["--tree"]===!0;return O(e,i=>{let o=Date.now(),a=i.listAllRunningTrackedInvocations(),l=[],c=[];for(let _ of a){let y=Ft(_),g=o-new Date(_.started_at).getTime(),w={id:_.id,kind:_.kind,origin:_.origin,from_identity:_.from_identity,target:tm(_),started_at:_.started_at,parent_invocation_id:_.parent_invocation_id};if(y==="dead"){if(ts(i,_)!==null)continue;c.push({...w,stale_for_ms:g})}else l.push({...w,running_for_ms:g,holder_liveness:y??"unknown"})}let u=new Set(a.map(tm).filter(_=>_!==null)),d=new Date(o-_H).toISOString(),f=i.listRecentlyFinishedTrackedInvocations(d),m=new Set,p=[];for(let _ of f){let y=tm(_);y===null||u.has(y)||m.has(y)||(m.add(y),p.push({id:_.id,kind:_.kind,origin:_.origin,from_identity:_.from_identity,target:y,status:_.status,started_at:_.started_at,ended_at:_.ended_at,idle_ms:o-new Date(_.ended_at).getTime(),ran_ms:new Date(_.ended_at).getTime()-new Date(_.started_at).getTime(),error:_.error,parent_invocation_id:_.parent_invocation_id}))}if(r)return s?H(e,{schema_version:HS,tree:wH(l,c,p)}):H(e,{schema_version:HS,running:l,dead:c,idle:p}),0;if(s){let _=[...l.map(g=>({id:g.id,parent_invocation_id:g.parent_invocation_id,started_at:g.started_at,line:JS(g)})),...c.map(g=>({id:g.id,parent_invocation_id:g.parent_invocation_id,started_at:g.started_at,line:GS(g)})),...p.map(g=>({id:g.id,parent_invocation_id:g.parent_invocation_id,started_at:g.started_at,line:KS(g)}))],y=yH(_);return e.stdout.write(`${y.length>0?y.join(`
2330
+ `),0;let n=Y(t,[],["--json","--tree"]);if(n.error!==void 0)return k(e,n.error);let r=n.flags["--json"]===!0,s=n.flags["--tree"]===!0;return L(e,i=>{let o=Date.now(),a=i.listAllRunningTrackedInvocations(),l=[],c=[];for(let _ of a){let y=Ft(_),g=o-new Date(_.started_at).getTime(),w={id:_.id,kind:_.kind,origin:_.origin,from_identity:_.from_identity,target:tm(_),started_at:_.started_at,parent_invocation_id:_.parent_invocation_id};if(y==="dead"){if(ts(i,_)!==null)continue;c.push({...w,stale_for_ms:g})}else l.push({...w,running_for_ms:g,holder_liveness:y??"unknown"})}let u=new Set(a.map(tm).filter(_=>_!==null)),d=new Date(o-_H).toISOString(),f=i.listRecentlyFinishedTrackedInvocations(d),m=new Set,p=[];for(let _ of f){let y=tm(_);y===null||u.has(y)||m.has(y)||(m.add(y),p.push({id:_.id,kind:_.kind,origin:_.origin,from_identity:_.from_identity,target:y,status:_.status,started_at:_.started_at,ended_at:_.ended_at,idle_ms:o-new Date(_.ended_at).getTime(),ran_ms:new Date(_.ended_at).getTime()-new Date(_.started_at).getTime(),error:_.error,parent_invocation_id:_.parent_invocation_id}))}if(r)return s?J(e,{schema_version:HS,tree:wH(l,c,p)}):J(e,{schema_version:HS,running:l,dead:c,idle:p}),0;if(s){let _=[...l.map(g=>({id:g.id,parent_invocation_id:g.parent_invocation_id,started_at:g.started_at,line:JS(g)})),...c.map(g=>({id:g.id,parent_invocation_id:g.parent_invocation_id,started_at:g.started_at,line:GS(g)})),...p.map(g=>({id:g.id,parent_invocation_id:g.parent_invocation_id,started_at:g.started_at,line:KS(g)}))],y=yH(_);return e.stdout.write(`${y.length>0?y.join(`
2331
2331
  `):" none"}
2332
2332
  `),0}let h=[];h.push(`Running (${l.length}):`),l.length===0&&h.push(" none");for(let _ of l)h.push(` ${JS(_)}`);h.push(""),h.push(`Dead (reclaimable) (${c.length}):`),c.length===0&&h.push(" none");for(let _ of c)h.push(` ${GS(_)}`);h.push(""),h.push(`Idle, finished in the last 24h (${p.length}):`),p.length===0&&h.push(" none");for(let _ of p)h.push(` ${KS(_)}`);return e.stdout.write(`${h.join(`
2333
2333
  `)}
2334
2334
  `),0})}var _H,HS,hH,XS,sm=E(()=>{"use strict";ct();di();Ie();hl();_H=24*60*60*1e3,HS=2,hH=["usage: lmctl running [--json] [--tree]","","Shows tracked_invocation activity DB-wide across the whole fleet, split","into three sections (flat mode, the default):",' - Running: status="running" with a live (or unverifiable cross-host)'," holder -- genuinely in-flight work.",' - Dead (reclaimable): status="running" but the holder process is'," confirmed dead -- an orphaned record, not active work. Its elapsed",' time is reported as staleness, not as "running", so a dead worker'," is never mistaken for one that is genuinely still building."," - Idle: targets with nothing running or dead, showing their most"," recent finish from the last 24 hours and how long they've been"," idle since.","","--tree shows the same rows as one hierarchical dispatch-lineage view","instead: no section headers (each row already carries its own status),","indented under the session that dispatched it (who woke whom), sorted","by the most recent root session first. A node is a specific turn at a","specific time, not a team:alias identity -- the same member can appear","as multiple nodes for its different turns. Lineage is only known for","turns dispatched by a NESTED `lmctl chat`/`lmctl terminal` call made","from within another turn's own tool calls; anything else (a human's","direct dispatch, or a turn from before this feature existed) has no","recorded parent and shows as its own root.","","--json emits { schema_version, running, dead, idle } (flat, one array","per section, matching the three flat-mode sections -- each row carries","its own status/timing/error fields). --tree --json instead emits","{ schema_version, tree } -- an array of root nodes, each row's full",'fields plus a "state" discriminant ("running"/"dead"/"idle") and a','"children" array of the same shape, nested per the dispatch lineage.',"","Queries lmctl's own database only -- never touches native provider","session files."].join(`
2335
2335
  `),XS=120});import{basename as EH}from"node:path";function vH(t){return t.replace(TH,e=>{let n=EH(e);return e.endsWith(".lmctl")?n:`.../${n}`})}function im(t){if(Array.isArray(t))return t.map(im);if(t===null||typeof t!="object")return t;let e={};for(let[n,r]of Object.entries(t))(n==="target"||n==="from_identity")&&typeof r=="string"?e[n]=Et(r):n==="error"&&typeof r=="string"?e[n]=vH(r):e[n]=im(r);return e}function kH(){let t="";return{io:{stdout:{write:n=>(t+=n,!0)},stderr:{write:()=>!0}},text:()=>t}}async function zS(t,e,n){let r=t.LMCTL_CLOUD_REPORT_APPKEY;if(!(r===void 0||r===""))try{let s=t.LMCTL_CLOUD_REPORT_URL??SH,i=ui().device_id,{io:o,text:a}=kH();await rm(["--tree","--json"],o);let l=im(JSON.parse(a())),c=await n(s,{method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${r}`},body:JSON.stringify({device_id:i,payload:l})});!c.ok&&c.status!==429&&e(`running-reporter: report rejected (${c.status})`)}catch(s){e(`running-reporter: report failed: ${s instanceof Error?s.message:String(s)}`)}}function ZS(t=process.env,e=r=>process.stderr.write(`${r}
2336
- `),n=fetch){if(t.LMCTL_CLOUD_REPORT_APPKEY===void 0||t.LMCTL_CLOUD_REPORT_APPKEY==="")return null;let r=Number.parseInt(t.LMCTL_CLOUD_REPORT_INTERVAL_MS??"",10)||bH;zS(t,e,n);let s=setInterval(()=>void zS(t,e,n),r);return s.unref?.(),{stop:()=>clearInterval(s)}}var TH,SH,bH,QS=E(()=>{"use strict";sl();sm();hl();TH=/\/(?:[^\s"'/()]+\/)+[^\s"'/()]+/g;SH="https://lmctl.ai/api/running/report",bH=45e3});import{mkdirSync as IH,readFileSync as NH,readdirSync as AH,statSync as xH,writeFileSync as RH}from"node:fs";import{dirname as OH,join as tb,sep as eb}from"node:path";function gl(t){return{s3:{async send(r){let s=r;switch(s._localfsTag){case nb:return LH(t,s.input);case rb:return CH(t,s.input);case sb:return $H(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:lm,GetObjectCommand:am,PutObjectCommand:om}}}function LH(t,e){let n=ib(t,e.Key);return IH(OH(n),{recursive:!0}),RH(n,e.Body),{}}function CH(t,e){let n=ib(t,e.Key),r;try{r=NH(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 $H(t,e){let n=e.Prefix??"";ob(n);let s=MH(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(n)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(u=>u.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.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(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function ib(t,e){return ob(e),tb(t,e)}function ob(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function MH(t){let e=[],n=(r,s)=>{let i;try{i=AH(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=tb(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=eb==="/"?a:a.split(eb).join("/");e.push({key:c,lastModified:xH(l).mtime})}}};return n(t,""),e}var nb,rb,sb,om,am,lm,cm=E(()=>{"use strict";nb="localfs-put",rb="localfs-get",sb="localfs-list",om=class{input;_localfsTag=nb;constructor(e){this.input=e}},am=class{input;_localfsTag=rb;constructor(e){this.input=e}},lm=class{input;_localfsTag=sb;constructor(e){this.input=e}}});function ab(){return{put:0,get:0,list:0}}function dm(t,e=DH){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function um(t){let e=new Date(t),n=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var DH,yl,fm=E(()=>{"use strict";DH={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};yl=class{counts=ab();record(e,n=1){this.counts[e]+=n}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=ab(),e}estimateCostUsd(e){return dm(this.counts,e)}}});function lb(t){let e=t.now??Date.now,n=t.timers??jH,r=null,s=null;async function i(){let l=e(),c=um(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=dm(m);if(r!==c&&p>=t.ceilingUsd){r=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},t.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===um(e())}}}var jH,cb=E(()=>{"use strict";fm();jH={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var mm=E(()=>{"use strict";Wa();Ba();Ba()});function PH(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}let n=e.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:e.message_id,request:r}}function FH(t){return t.reply_to!==void 0&&t.response!==void 0}function UH(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function db(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var wl,pi,ub=E(()=>{"use strict";mm();wl=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},pi=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,n){if(this.stopped)throw new wl("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=e.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=un(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:e};return new Promise((a,l)=>{let c=n?.abortSignal,u;if(c!==void 0){if(c.aborted){l(db(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(db(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let n=new wl;for(let r of e){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(e,n){let r=PH(e);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(FH(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??UH(e)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:un(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 pm(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var fb=E(()=>{"use strict"});function _m(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let n of e.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var mb=E(()=>{"use strict"});function gm(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let n of e.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(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let n=e.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 hm,pb=E(()=>{"use strict";hm="daemon:events"});function hb(t){return{kind:"prompt",prompt_id:t.prompt_id??un(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function ym(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var _b,wm=E(()=>{"use strict";mm();_b="prompt:root"});function _i(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(yb(e[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function WH(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(yb(e[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function gb(t,e=60){if(typeof t!="string"||t==="")return!0;let n=WH(t);return n===null?!0:Date.now()/1e3>=n-e}function yb(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(Math.ceil(e.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var Em=E(()=>{"use strict"});async function El(t){let e=t.fetchImpl??fetch,n=`https://cognito-idp.${t.region}.amazonaws.com/`,r=await e(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":qH},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.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 qH,Tm=E(()=>{"use strict";qH="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as wb,mkdirSync as Eb,readFileSync as Tb,writeFileSync as vb}from"node:fs";import{homedir as Sb}from"node:os";import{dirname as bb,join as kb}from"node:path";function hi(){return process.env.LMCTL_DEVICE_AUTH_PATH??kb(Sb(),".lmctl","device-auth.json")}function Ib(){return process.env.LMCTL_TOKEN_PATH??kb(Sb(),".lmctl","cli-tokens.json")}function vm(t=hi()){try{let e=JSON.parse(Tb(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function Nb(t,e=hi()){Eb(bb(e),{recursive:!0,mode:448}),vb(e,JSON.stringify(t,null,2));try{wb(e,384)}catch{}}function Sm(t,e=Ib()){let n={};try{n=JSON.parse(Tb(e,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=t.idToken,t.accessToken!==void 0&&(r.accessToken=t.accessToken),t.refreshToken!==void 0&&(r.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(r.expiresAt=t.expiresAt);let s={...n,cognito:r};Eb(bb(e),{recursive:!0,mode:448}),vb(e,JSON.stringify(s,null,2));try{wb(e,384)}catch{}}async function Ab(t){let e=t.deviceAuthPath??hi(),n=vm(e);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await El({region:t.region,clientId:t.clientId,refreshToken:n.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Sm({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},t.cliTokensPath??Ib()),{idToken:r.idToken,userId:n.userId}}var bm=E(()=>{"use strict";Tm()});import{existsSync as BH,realpathSync as HH}from"node:fs";import{dirname as XH}from"node:path";function km(t){JH(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function JH(t){let e=t.payload.root_teamfile;try{e=HH(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return rs({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=KH(e);if("error"in n)return rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:n.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=vr(t.store,{receiver_teamfile:e,receiver_alias:n.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:ZH(t.env??process.env)});if(!r.acquired){let i=zH(n.alias,r.current);return rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=Yi(i=>t.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:U_(t.env??process.env)});try{let o=await(t.chat??sn)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:n.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.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,u=a||l?"error":"ok";return u==="ok"?await VH(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,response:o.text,status:u,error_detail:null,log:t.log}):rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:u,response:u==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function rs(t){$({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:GH(t.message)})}function GH(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function KH(t){if(!BH(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let n=ht(e);return n===void 0?{error:`prompt root has no Lead: ${t}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??XH(t)}}async function VH(t,e){let n=Ob(e.message),r=e.response===null?null:Ob(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:n.text,response:r?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Ob(t){return t.length<=xb?{text:t,truncated:!1}:{text:t.slice(0,xb),truncated:!0}}function YH(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function zH(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:YH(t,e)}function ZH(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Rb;let n=Number(e);return!Number.isFinite(n)||n<=0?Rb:n}var xb,Rb,Lb=E(()=>{"use strict";mt();Vt();de();ct();xb=256*1024,Rb=30*60*1e3});import{chmodSync as Pb,existsSync as QH,mkdirSync as Fb,readFileSync as bl,writeFileSync as Ub}from"node:fs";import{dirname as Im,resolve as Tl,join as Wb}from"node:path";import{fileURLToPath as e2}from"node:url";import{homedir as qb}from"node:os";import{CognitoIdentityClient as t2,GetIdCommand as n2}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Cb}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as r2,ListObjectsV2Command as s2,PutObjectCommand as i2,S3Client as $b}from"@aws-sdk/client-s3";function yi(t={}){let e=t.env??process.env,n=t.tfstatePath!==void 0?[t.tfstatePath]:d2(t.selfUrl),r={},s;for(let I of n)if(QH(I)){r=c2(I),s=I;break}let i=(...I)=>{for(let v of I)if(typeof v=="string"&&v!=="")return v},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??o2,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??a2,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??l2,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??kl,d=[];o===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:n,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=Sl(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),_=Sl(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),y=Sl(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),g=Sl(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=i(e.LMCTL_MAILBOX_KEY),S=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},..._!==void 0?{heartbeatIdleMs:_}:{},...y!==void 0?{backoffReadIntervalMs:y}:{},...g!==void 0?{chatLogPollIntervalMs:g}:{},...w!==void 0?{mailboxKey:w}:{},...S!==void 0?{tokenPath:S}:{}},f}function c2(t){try{let e=bl(t,"utf8"),r=JSON.parse(e).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 d2(t){let e=Im(e2(t??import.meta.url));return[Tl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Tl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Tl(e,"..","..","..","infra","terraform","terraform.tfstate"),Tl(e,"..","..","infra","terraform","terraform.tfstate")]}function Sl(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function u2(t){let e=f2(t.intervalMs)??Bb,n=Math.max(1,Math.trunc(t.limit??500)),r=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return i=d.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(i,n);for(let f of d){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 t.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(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{o=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function f2(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Hb(t){let e=t.tokenPath??Wb(qb(),".lmctl","cli-tokens.json"),n=Db(t.tokenPath);if(gb(n.cognito?.idToken)&&vm()!==null)try{await Ab({region:t.region,clientId:t.cognitoClientId??kl,cliTokensPath:e}),n=Db(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let Y=A instanceof Error?A.message:String(A);t.log?.(`[mx-mailbox] device-auth refresh failed: ${Y}`)}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.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await jb({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Cb({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new $b({region:t.region,credentials:a}),c={ListObjectsV2Command:s2,GetObjectCommand:r2,PutObjectCommand:i2},u=_i(r),d=u??i,f=t.deviceId,m=Yr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(d,m);if(A!==null)h=A.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let Y=!1,J=0;for(;!Y&&J<2;){J+=1;try{let N=Fa(m,"web"),x=0,C;do{let X=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:N,MaxKeys:1e3,...C!==void 0?{ContinuationToken:C}:{}}));for(let W of X.Contents??[]){let F=Ua(W.Key??"",m,"web");F!==void 0&&F>x&&(x=F)}C=X.IsTruncated===!0?X.NextContinuationToken:void 0}while(C!==void 0);h=x,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${x} for user_id=${d}`),Y=!0}catch(N){let x=N instanceof Error?N.message:String(N);if(o&&J===1&&_2(N)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${x}); clearing + refreshing`),p2(e),o=!1,i=await jb({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}),a=Cb({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new $b({region:t.region,credentials:a}),m=Yr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${x}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let _=null,y=t.terminalSessionManager,g=t.persistentSessionManager,w=t.promptTriggerStore,S=new yl,I=new dr({bucket:t.mailboxBucket,identityId:i,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>S.record(A),onMessage:async A=>{if(y!==void 0&&pm(A.payload)){y.onInbound(A.payload);return}if(g!==void 0&&_m(A.payload)){await g.onInbound(A.payload);return}if(!gm(A.payload)){if(w!==void 0&&ym(A.payload)){km({store:w,payload:A.payload,log:t.log});return}_!==null&&await _.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});_=new pi({client:I,...t.log!==void 0?{log:t.log}:{}}),y!==void 0&&y.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),g!==void 0&&g.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let v=A=>I.putMessage({conversation_id:hm,payload:A});I.start();let M=t.chatLogTailStore===void 0?void 0:u2({store:t.chatLogTailStore,publishDaemonEvent:v,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Bb,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let D=t.deviceId??i,j=`${d}/usage/`,U;return U=t.usageStore===void 0?void 0:lb({meter:S,store:t.usageStore,userId:d,deviceId:D,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:Y,ceilingUsd:J})=>{t.log?.(`[usage] month ${A} cost $${Y.toFixed(4)} >= ceiling $${J} \u2014 blocking mailbox`),I.stop().catch(()=>{}),U?.stop()},publishOwnRollup:async(A,Y)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${j}${D}-${A}.json`,Body:JSON.stringify({...Y,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let Y={put:0,get:0,list:0},J;do{let N=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:j,MaxKeys:1e3,...J!==void 0?{ContinuationToken:J}:{}}));for(let x of N.Contents??[]){let C=x.Key??"";if(C.endsWith(`-${A}.json`))try{let X=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:C}));if(X.Body===void 0)continue;let W=JSON.parse(await X.Body.transformToString("utf-8"));Y.put+=W.put??0,Y.get+=W.get??0,Y.list+=W.list??0}catch{}}J=N.IsTruncated===!0?N.NextContinuationToken:void 0}while(J!==void 0);return Y},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:I,fetchClient:_,publishDaemonEvent:v,async stop(){M?.stop(),U!==void 0&&(await U.flushNow().catch(()=>{}),U.stop()),await _.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function Xb(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:gl(t.rootDir),n=Yr({identityId:gi,userId:gi,deviceId:Mb}),r=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new dr({bucket:"local",identityId:gi,userId:gi,deviceId:Mb,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&pm(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&_m(c.payload)){await i.onInbound(c.payload);return}if(!gm(c.payload)){if(o!==void 0&&ym(c.payload)){km({store:o,payload:c.payload,log:t.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??vl,readIntervalMs:t.readIntervalMs??vl,heartbeatIdleMs:t.heartbeatIdleMs??vl,backoffReadIntervalMs:t.backoffReadIntervalMs??vl});r=new pi({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:hm,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${n} (local-fs ${t.rootDir})`),{identityId:gi,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Db(t){let e=t??Wb(qb(),".lmctl","cli-tokens.json");try{let n=bl(e,"utf8");return JSON.parse(n)}catch{return{}}}function m2(t,e){if(e===void 0||e==="")return;let n={};try{let s=bl(t,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:e}};Fb(Im(t),{recursive:!0,mode:448}),Ub(t,JSON.stringify(r,null,2));try{Pb(t,384)}catch{}}function p2(t){let e={};try{let r=bl(t,"utf8");e=JSON.parse(r)}catch{return}if(e.cognito===void 0)return;let n={...e,cognito:{...e.cognito}};delete n.cognito.identityId,Fb(Im(t),{recursive:!0,mode:448}),Ub(t,JSON.stringify(n,null,2));try{Pb(t,384)}catch{}}async function jb(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new t2({region:t.region}).send(new n2({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{m2(t.tokenPath,n.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${t.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function _2(t){if(t===null||typeof t!="object")return!1;let e=t,n=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof e.message=="string"?e.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var Bb,vl,kl,o2,a2,l2,gi,Mb,Nm=E(()=>{"use strict";Ha();cm();fm();cb();ub();fb();mb();pb();wm();Wa();Em();bm();Lb();Bb=3e3,vl=1e3,kl="79u5jhkk46qofog661c9i0bdcs",o2="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",a2="us-east-1_4iUdFggDn",l2="lmctl-next-preview-mailbox-254332045686";gi="local",Mb="local"});import{spawn as Om}from"node:child_process";import{createInterface as Jb}from"node:readline";var Am,xm,Rm,Gb,Kb=E(()=>{"use strict";ho();de();Ls();Am=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,n){this.ctx=n;let r=Om(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=Jb({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:e.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:e.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(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let 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:e}]})).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 e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,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:e,params:n});try{this.child.stdin.write(o+`
2336
+ `),n=fetch){if(t.LMCTL_CLOUD_REPORT_APPKEY===void 0||t.LMCTL_CLOUD_REPORT_APPKEY==="")return null;let r=Number.parseInt(t.LMCTL_CLOUD_REPORT_INTERVAL_MS??"",10)||bH;zS(t,e,n);let s=setInterval(()=>void zS(t,e,n),r);return s.unref?.(),{stop:()=>clearInterval(s)}}var TH,SH,bH,QS=E(()=>{"use strict";sl();sm();hl();TH=/\/(?:[^\s"'/()]+\/)+[^\s"'/()]+/g;SH="https://lmctl.ai/api/running/report",bH=45e3});import{mkdirSync as IH,readFileSync as NH,readdirSync as AH,statSync as xH,writeFileSync as RH}from"node:fs";import{dirname as OH,join as tb,sep as eb}from"node:path";function gl(t){return{s3:{async send(r){let s=r;switch(s._localfsTag){case nb:return LH(t,s.input);case rb:return CH(t,s.input);case sb:return $H(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:lm,GetObjectCommand:am,PutObjectCommand:om}}}function LH(t,e){let n=ib(t,e.Key);return IH(OH(n),{recursive:!0}),RH(n,e.Body),{}}function CH(t,e){let n=ib(t,e.Key),r;try{r=NH(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 $H(t,e){let n=e.Prefix??"";ob(n);let s=MH(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(n)),i=e.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(u=>u.key>i));let o=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.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(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function ib(t,e){return ob(e),tb(t,e)}function ob(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function MH(t){let e=[],n=(r,s)=>{let i;try{i=AH(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=tb(r,o.name);if(o.isDirectory())n(l,a);else if(o.isFile()){let c=eb==="/"?a:a.split(eb).join("/");e.push({key:c,lastModified:xH(l).mtime})}}};return n(t,""),e}var nb,rb,sb,om,am,lm,cm=E(()=>{"use strict";nb="localfs-put",rb="localfs-get",sb="localfs-list",om=class{input;_localfsTag=nb;constructor(e){this.input=e}},am=class{input;_localfsTag=rb;constructor(e){this.input=e}},lm=class{input;_localfsTag=sb;constructor(e){this.input=e}}});function ab(){return{put:0,get:0,list:0}}function dm(t,e=DH){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function um(t){let e=new Date(t),n=e.getUTCFullYear(),r=String(e.getUTCMonth()+1).padStart(2,"0");return`${n}-${r}`}var DH,yl,fm=E(()=>{"use strict";DH={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};yl=class{counts=ab();record(e,n=1){this.counts[e]+=n}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=ab(),e}estimateCostUsd(e){return dm(this.counts,e)}}});function lb(t){let e=t.now??Date.now,n=t.timers??jH,r=null,s=null;async function i(){let l=e(),c=um(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=dm(m);if(r!==c&&p>=t.ceilingUsd){r=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=n.setInterval(()=>{o()},t.intervalMs);return{stop(){n.clearInterval(a)},flushNow(){return o()},isOverQuota(){return r!==null&&r===um(e())}}}var jH,cb=E(()=>{"use strict";fm();jH={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var mm=E(()=>{"use strict";Wa();Ba();Ba()});function PH(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:i}}let n=e.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:e.message_id,request:r}}function FH(t){return t.reply_to!==void 0&&t.response!==void 0}function UH(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function db(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let n=new Error("Aborted");return n.name="AbortError",n}}var wl,pi,ub=E(()=>{"use strict";mm();wl=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},pi=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,n){if(this.stopped)throw new wl("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let r=e.method;if(typeof r!="string"||r==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=un(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:e};return new Promise((a,l)=>{let c=n?.abortSignal,u;if(c!==void 0){if(c.aborted){l(db(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(db(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let n=new wl;for(let r of e){r.abortListener!==void 0&&r.abortSignal!==void 0&&r.abortSignal.removeEventListener("abort",r.abortListener);try{r.reject(n)}catch{}}}async handleIncoming(e,n){let r=PH(e);if(r===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(FH(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??UH(e)??r.message_id,i;try{i=await this.requestHandler(r.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:un(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 pm(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var fb=E(()=>{"use strict"});function _m(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let n of e.events)if(typeof n!="object"||n===null||Array.isArray(n)||typeof n.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var mb=E(()=>{"use strict"});function gm(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let n of e.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(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let n=e.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 hm,pb=E(()=>{"use strict";hm="daemon:events"});function hb(t){return{kind:"prompt",prompt_id:t.prompt_id??un(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function ym(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var _b,wm=E(()=>{"use strict";mm();_b="prompt:root"});function _i(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(yb(e[1]));return typeof n.sub=="string"&&n.sub!==""?n.sub:null}catch{return null}}function WH(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let n=JSON.parse(yb(e[1]));return typeof n.exp=="number"&&Number.isFinite(n.exp)?n.exp:null}catch{return null}}function gb(t,e=60){if(typeof t!="string"||t==="")return!0;let n=WH(t);return n===null?!0:Date.now()/1e3>=n-e}function yb(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),n=e.padEnd(Math.ceil(e.length/4)*4,"="),r=globalThis.Buffer;return r!==void 0?r.from(n,"base64").toString("utf8"):atob(n)}var Em=E(()=>{"use strict"});async function El(t){let e=t.fetchImpl??fetch,n=`https://cognito-idp.${t.region}.amazonaws.com/`,r=await e(n,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":qH},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.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 qH,Tm=E(()=>{"use strict";qH="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as wb,mkdirSync as Eb,readFileSync as Tb,writeFileSync as vb}from"node:fs";import{homedir as Sb}from"node:os";import{dirname as bb,join as kb}from"node:path";function hi(){return process.env.LMCTL_DEVICE_AUTH_PATH??kb(Sb(),".lmctl","device-auth.json")}function Ib(){return process.env.LMCTL_TOKEN_PATH??kb(Sb(),".lmctl","cli-tokens.json")}function vm(t=hi()){try{let e=JSON.parse(Tb(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function Nb(t,e=hi()){Eb(bb(e),{recursive:!0,mode:448}),vb(e,JSON.stringify(t,null,2));try{wb(e,384)}catch{}}function Sm(t,e=Ib()){let n={};try{n=JSON.parse(Tb(e,"utf8"))}catch{}let r={...n.cognito??{}};r.idToken=t.idToken,t.accessToken!==void 0&&(r.accessToken=t.accessToken),t.refreshToken!==void 0&&(r.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(r.expiresAt=t.expiresAt);let s={...n,cognito:r};Eb(bb(e),{recursive:!0,mode:448}),vb(e,JSON.stringify(s,null,2));try{wb(e,384)}catch{}}async function Ab(t){let e=t.deviceAuthPath??hi(),n=vm(e);if(n===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let r=await El({region:t.region,clientId:t.clientId,refreshToken:n.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return Sm({idToken:r.idToken,...r.accessToken!==void 0?{accessToken:r.accessToken}:{},refreshToken:n.refreshToken,...r.expiresAt!==void 0?{expiresAt:r.expiresAt}:{}},t.cliTokensPath??Ib()),{idToken:r.idToken,userId:n.userId}}var bm=E(()=>{"use strict";Tm()});import{existsSync as BH,realpathSync as HH}from"node:fs";import{dirname as XH}from"node:path";function km(t){JH(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function JH(t){let e=t.payload.root_teamfile;try{e=HH(t.payload.root_teamfile)}catch(i){let o=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${i instanceof Error?i.message:String(i)}`;return rs({rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"root_unavailable"}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}if(t.store.getRootTeam(e)===null){let i=`prompt root is not registered: ${e}`;return rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"root_unregistered"}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}let n=KH(e);if("error"in n)return rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,promptId:t.payload.prompt_id,detail:n.error,reason:"root_invalid"}),t.log?.(`[mailbox] ${n.error}`),{status:"error",response:null,error_detail:n.error};let r=vr(t.store,{receiver_teamfile:e,receiver_alias:n.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",ttlMs:ZH(t.env??process.env)});if(!r.acquired){let i=zH(n.alias,r.current);return rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:i,reason:"unavailable"}),t.log?.(`[mailbox] prompt rejected: ${i}`),{status:"error",response:null,error_detail:i}}let s=Yi(i=>t.store.heartbeatAgentInflight(r.lease,r.leaseId,i),{intervalMs:U_(t.env??process.env)});try{let o=await(t.chat??sn)({provider:n.provider,sessionId:n.sessionid,cwd:n.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:n.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.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,u=a||l?"error":"ok";return u==="ok"?await VH(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,response:o.text,status:u,error_detail:null,log:t.log}):rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:c??"provider failed",reason:a?"stalled":"empty_response"}),{status:u,response:u==="error"?null:o.text,error_detail:c}}catch(i){let o=i instanceof Error?i.message:String(i);return rs({rootTeamfile:e,receiverTeamfile:e,receiverAlias:n.alias,message:t.payload.text,promptId:t.payload.prompt_id,detail:o,reason:"provider_error"}),t.log?.(`[mailbox] prompt provider error: ${o}`),{status:"error",response:null,error_detail:o}}finally{clearInterval(s);try{t.store.releaseAgentInflight(r.lease,r.leaseId)}catch(i){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${i instanceof Error?i.message:String(i)}`)}}}function rs(t){M({event:"prompt_trigger_error",reason:t.reason,prompt_id:t.promptId,root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,error_detail:t.detail,message_preview:GH(t.message)})}function GH(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function KH(t){if(!BH(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Fe(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let n=ht(e);return n===void 0?{error:`prompt root has no Lead: ${t}`}:n.session===void 0||n.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:n.alias,provider:n.provider,sessionid:n.session,sessiondir:n.sessiondir??XH(t)}}async function VH(t,e){let n=Ob(e.message),r=e.response===null?null:Ob(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:n.text,response:r?.text??null,origin:"unknown",status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function Ob(t){return t.length<=xb?{text:t,truncated:!1}:{text:t.slice(0,xb),truncated:!0}}function YH(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function zH(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:YH(t,e)}function ZH(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Rb;let n=Number(e);return!Number.isFinite(n)||n<=0?Rb:n}var xb,Rb,Lb=E(()=>{"use strict";mt();Vt();de();ct();xb=256*1024,Rb=30*60*1e3});import{chmodSync as Pb,existsSync as QH,mkdirSync as Fb,readFileSync as bl,writeFileSync as Ub}from"node:fs";import{dirname as Im,resolve as Tl,join as Wb}from"node:path";import{fileURLToPath as e2}from"node:url";import{homedir as qb}from"node:os";import{CognitoIdentityClient as t2,GetIdCommand as n2}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as Cb}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as r2,ListObjectsV2Command as s2,PutObjectCommand as i2,S3Client as $b}from"@aws-sdk/client-s3";function yi(t={}){let e=t.env??process.env,n=t.tfstatePath!==void 0?[t.tfstatePath]:d2(t.selfUrl),r={},s;for(let N of n)if(QH(N)){r=c2(N),s=N;break}let i=(...N)=>{for(let S of N)if(typeof S=="string"&&S!=="")return S},o=i(e.LMCTL_NEXT_IDENTITY_POOL_ID,r.LMCTL_NEXT_IDENTITY_POOL_ID)??o2,a=i(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,r.LMCTL_NEXT_COGNITO_USER_POOL_ID)??a2,l=i(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,r.LMCTL_NEXT_MAILBOX_BUCKET,r.LMCTL_NEXT_POLICY_BUCKET)??l2,c=i(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=i(e.LMCTL_NEXT_COGNITO_CLIENT_ID,r.LMCTL_NEXT_COGNITO_CLIENT_ID)??kl,d=[];o===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:n,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=Sl(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),_=Sl(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),y=Sl(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),g=Sl(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),w=i(e.LMCTL_MAILBOX_KEY),v=i(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},..._!==void 0?{heartbeatIdleMs:_}:{},...y!==void 0?{backoffReadIntervalMs:y}:{},...g!==void 0?{chatLogPollIntervalMs:g}:{},...w!==void 0?{mailboxKey:w}:{},...v!==void 0?{tokenPath:v}:{}},f}function c2(t){try{let e=bl(t,"utf8"),r=JSON.parse(e).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 d2(t){let e=Im(e2(t??import.meta.url));return[Tl(e,"..","..","..","..","infra","terraform","terraform.tfstate"),Tl(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),Tl(e,"..","..","..","infra","terraform","terraform.tfstate"),Tl(e,"..","..","infra","terraform","terraform.tfstate")]}function Sl(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function u2(t){let e=f2(t.intervalMs)??Bb,n=Math.max(1,Math.trunc(t.limit??500)),r=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return i=d.last_pushed_id,!0}return i=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(r()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(i,n);for(let f of d){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 t.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(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{o=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function f2(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function Hb(t){let e=t.tokenPath??Wb(qb(),".lmctl","cli-tokens.json"),n=Db(t.tokenPath);if(gb(n.cognito?.idToken)&&vm()!==null)try{await Ab({region:t.region,clientId:t.cognitoClientId??kl,cliTokensPath:e}),n=Db(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(x){let j=x instanceof Error?x.message:String(x);t.log?.(`[mx-mailbox] device-auth refresh failed: ${j}`)}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.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,i=n.cognito.identityId,o=!1;i===void 0||i===""?i=await jb({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}):(o=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=Cb({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new $b({region:t.region,credentials:a}),c={ListObjectsV2Command:s2,GetObjectCommand:r2,PutObjectCommand:i2},u=_i(r),d=u??i,f=t.deviceId,m=Yr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let x=p.loadMailboxCursor(d,m);if(x!==null)h=x.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let j=!1,q=0;for(;!j&&q<2;){q+=1;try{let I=Fa(m,"web"),A=0,$;do{let G=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:I,MaxKeys:1e3,...$!==void 0?{ContinuationToken:$}:{}}));for(let B of G.Contents??[]){let W=Ua(B.Key??"",m,"web");W!==void 0&&W>A&&(A=W)}$=G.IsTruncated===!0?G.NextContinuationToken:void 0}while($!==void 0);h=A,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${A} for user_id=${d}`),j=!0}catch(I){let A=I instanceof Error?I.message:String(I);if(o&&q===1&&_2(I)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${A}); clearing + refreshing`),p2(e),o=!1,i=await jb({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:r,log:t.log}),a=Cb({identityId:i,logins:{[s]:r},clientConfig:{region:t.region}}),l=new $b({region:t.region,credentials:a}),m=Yr({identityId:i,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${A}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let _=null,y=t.terminalSessionManager,g=t.persistentSessionManager,w=t.promptTriggerStore,v=new yl,N=new dr({bucket:t.mailboxBucket,identityId:i,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:x=>v.record(x),onMessage:async x=>{if(y!==void 0&&pm(x.payload)){y.onInbound(x.payload);return}if(g!==void 0&&_m(x.payload)){await g.onInbound(x.payload);return}if(!gm(x.payload)){if(w!==void 0&&ym(x.payload)){km({store:w,payload:x.payload,log:t.log});return}_!==null&&await _.handleIncoming(x.payload,x)}},...p!==void 0?{onCursorAdvance:x=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:x,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});_=new pi({client:N,...t.log!==void 0?{log:t.log}:{}}),y!==void 0&&y.setPublish(async x=>N.putMessage({conversation_id:`terminal:${x.session_id}`,payload:x})),g!==void 0&&g.setPublish(async x=>N.putMessage({conversation_id:`provider:${x.session_id}`,payload:x}));let S=x=>N.putMessage({conversation_id:hm,payload:x});N.start();let O=t.chatLogTailStore===void 0?void 0:u2({store:t.chatLogTailStore,publishDaemonEvent:S,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??Bb,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let P=t.deviceId??i,D=`${d}/usage/`,U;return U=t.usageStore===void 0?void 0:lb({meter:v,store:t.usageStore,userId:d,deviceId:P,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:x,costUsd:j,ceilingUsd:q})=>{t.log?.(`[usage] month ${x} cost $${j.toFixed(4)} >= ceiling $${q} \u2014 blocking mailbox`),N.stop().catch(()=>{}),U?.stop()},publishOwnRollup:async(x,j)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${D}${P}-${x}.json`,Body:JSON.stringify({...j,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async x=>{let j={put:0,get:0,list:0},q;do{let I=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:D,MaxKeys:1e3,...q!==void 0?{ContinuationToken:q}:{}}));for(let A of I.Contents??[]){let $=A.Key??"";if($.endsWith(`-${x}.json`))try{let G=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:$}));if(G.Body===void 0)continue;let B=JSON.parse(await G.Body.transformToString("utf-8"));j.put+=B.put??0,j.get+=B.get??0,j.list+=B.list??0}catch{}}q=I.IsTruncated===!0?I.NextContinuationToken:void 0}while(q!==void 0);return j},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:i,mailbox:N,fetchClient:_,publishDaemonEvent:S,async stop(){O?.stop(),U!==void 0&&(await U.flushNow().catch(()=>{}),U.stop()),await _.stop().catch(()=>{}),await N.stop().catch(()=>{})}}}async function Xb(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:gl(t.rootDir),n=Yr({identityId:gi,userId:gi,deviceId:Mb}),r=null,s=t.terminalSessionManager,i=t.persistentSessionManager,o=t.promptTriggerStore,a=new dr({bucket:"local",identityId:gi,userId:gi,deviceId:Mb,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&pm(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&_m(c.payload)){await i.onInbound(c.payload);return}if(!gm(c.payload)){if(o!==void 0&&ym(c.payload)){km({store:o,payload:c.payload,log:t.log});return}r!==null&&await r.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??vl,readIntervalMs:t.readIntervalMs??vl,heartbeatIdleMs:t.heartbeatIdleMs??vl,backoffReadIntervalMs:t.backoffReadIntervalMs??vl});r=new pi({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:hm,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${n} (local-fs ${t.rootDir})`),{identityId:gi,mailbox:a,fetchClient:r,publishDaemonEvent:l,async stop(){await r.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function Db(t){let e=t??Wb(qb(),".lmctl","cli-tokens.json");try{let n=bl(e,"utf8");return JSON.parse(n)}catch{return{}}}function m2(t,e){if(e===void 0||e==="")return;let n={};try{let s=bl(t,"utf8");n=JSON.parse(s)}catch{}if(n.cognito===void 0)return;let r={...n,cognito:{...n.cognito,identityId:e}};Fb(Im(t),{recursive:!0,mode:448}),Ub(t,JSON.stringify(r,null,2));try{Pb(t,384)}catch{}}function p2(t){let e={};try{let r=bl(t,"utf8");e=JSON.parse(r)}catch{return}if(e.cognito===void 0)return;let n={...e,cognito:{...e.cognito}};delete n.cognito.identityId,Fb(Im(t),{recursive:!0,mode:448}),Ub(t,JSON.stringify(n,null,2));try{Pb(t,384)}catch{}}async function jb(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let n=await new t2({region:t.region}).send(new n2({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(n.IdentityId===void 0||n.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{m2(t.tokenPath,n.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${n.IdentityId} to ${t.tokenPath}`)}catch(r){let s=r instanceof Error?r.message:String(r);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return n.IdentityId}function _2(t){if(t===null||typeof t!="object")return!1;let e=t,n=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of n)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let r=typeof e.message=="string"?e.message:"";return!!(r.includes("NotAuthorizedException")||r.includes("Invalid identity pool configuration")||r.includes("Identity")&&r.includes("not found"))}var Bb,vl,kl,o2,a2,l2,gi,Mb,Nm=E(()=>{"use strict";Ha();cm();fm();cb();ub();fb();mb();pb();wm();Wa();Em();bm();Lb();Bb=3e3,vl=1e3,kl="79u5jhkk46qofog661c9i0bdcs",o2="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",a2="us-east-1_4iUdFggDn",l2="lmctl-next-preview-mailbox-254332045686";gi="local",Mb="local"});import{spawn as Om}from"node:child_process";import{createInterface as Jb}from"node:readline";var Am,xm,Rm,Gb,Kb=E(()=>{"use strict";ho();de();Ls();Am=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,n){this.ctx=n;let r=Om(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=r,this.rl=Jb({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:e.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:e.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(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let 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:e}]})).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 e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,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:e,params:n});try{this.child.stdin.write(o+`
2337
2337
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:e,params:n});try{this.child.stdin.write(r+`
2338
2338
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}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(e,n){if(e==="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(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:n.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof n.delta=="string"?n.delta:""}};if(e==="item/started"||e==="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:e==="item/started"?"started":"completed",item:r}}:{event_type:"notification",payload:{method:e,params:n}}}if(e==="turn/completed"){let r=n.turn;return typeof r?.id=="string"&&this.ctx?.turnMap.delete(r.id),{event_type:"turn_complete",payload:n}}if(e==="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:e,params:n}}}},xm=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,n){this.ctx=n;let r=Om(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.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(`
2339
2339
  `);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(e){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:e}});try{this.child.stdin.write(r+`
2340
- `)}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(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}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}})}},Rm=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,n){this.ctx=n;let r=e.cwd??process.cwd();if(e.provider==="opencode")try{_o(r)}catch(i){$({event:"opencode_config_install_failed",cwd:r,error_message:i instanceof Error?i.message:String(i)})}let s=Om(e.command,e.args,{cwd:r,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=Jb({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:e.cwd??process.cwd(),mcpServers:[]})).result;if(this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,e.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:e.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(e){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:e}]})).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 e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear(),this.child!==void 0&&await et(this.child)}async rpc(e,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:e,params:n});try{this.child.stdin.write(o+`
2340
+ `)}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(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}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}})}},Rm=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,n){this.ctx=n;let r=e.cwd??process.cwd();if(e.provider==="opencode")try{_o(r)}catch(i){M({event:"opencode_config_install_failed",cwd:r,error_message:i instanceof Error?i.message:String(i)})}let s=Om(e.command,e.args,{cwd:r,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=Jb({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:e.cwd??process.cwd(),mcpServers:[]})).result;if(this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,e.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 M({event:"acp_permission_mode_failed",provider:e.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(e){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:e}]})).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 e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear(),this.child!==void 0&&await et(this.child)}async rpc(e,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:e,params:n});try{this.child.stdin.write(o+`
2341
2341
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,n){if(this.child?.stdin===null||this.child===void 0)return;let r=JSON.stringify({jsonrpc:"2.0",method:e,params:n});try{this.child.stdin.write(r+`
2342
2342
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let n;try{n=JSON.parse(e)}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+`
2343
2343
  `)}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}})}}},Gb=t=>{switch(t){case"codex":return new Am;case"claude":case"qwen":return new xm;case"gemini":case"copilot":case"opencode":case"kimi":return new Rm;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{mkdirSync as h2,readFileSync as Vb,rmSync as g2,writeFileSync as y2}from"node:fs";import{dirname as Yb,join as w2}from"node:path";function Zt(t=Q()){return w2(Yb(t),"serve.pid")}function zb(t,e){let n=Zt(e);return h2(Yb(n),{recursive:!0}),y2(n,`${JSON.stringify(t,null,2)}
2344
2344
  `,"utf-8"),n}function Lm(t){let e=Zt(t),n;try{n=Vb(e,"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 ss(t){g2(Zt(t),{force:!0})}function Il(t){let e=E2(t),n=Lm(t);if(n===null)return{entry:null,running:!1,stale:!1,corrupt:e};switch(j_(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 E2(t){let e=Zt(t),n;try{n=Vb(e,"utf-8")}catch{return!1}try{let r=JSON.parse(n);return!Number.isInteger(r.pid)||(r.pid??0)<=0}catch{return!0}}function Zb(){return wc(process.pid)}var Qb=E(()=>{"use strict";Pt();We()});var mk={};oe(mk,{_resetStdoutEpipeGuardForTests:()=>I2,bootstrapAgentRestMailbox:()=>lk,installStdoutEpipeGuard:()=>sk,publishRegisteredWorkflowsOnStart:()=>ak,resolveLocalMailboxDir:()=>uk,resolveLocalWebuiDir:()=>dk,resolveServeConfig:()=>ck,runServe:()=>b2,runServeStatus:()=>ik,runServeStop:()=>ok,validateServeArgs:()=>fk});import{randomBytes as T2}from"node:crypto";import{existsSync as nk}from"node:fs";import{isIP as ek}from"node:net";import{homedir as v2}from"node:os";import{isAbsolute as rk,resolve as Cm}from"node:path";async function b2(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(S2),0;let n=t[0];return n==="status"?ik(t.slice(1),e):n==="stop"?ok(t.slice(1),e):n!=="start"?(e.stderr.write(n===void 0?tk:`error: unknown serve subcommand: ${n}
2345
2345
 
2346
2346
  ${tk.replace(/^error: [^\n]*\n\n/,"")}`),2):k2(t.slice(1),e)}async function k2(t,e){let n=fk(t,process.env);if(typeof n=="string")return e.stderr.write(`error: ${n}
2347
- `),2;let r=Be({path:Q()}),s={portCli:M2(t)},i;try{i=ck({dal:r,cli:s,env:process.env,parsed:n,io:e})}catch(v){return r.close(),e.stderr.write(`error: ${v instanceof Error?v.message:String(v)}
2347
+ `),2;let r=Be({path:Q()}),s={portCli:M2(t)},i;try{i=ck({dal:r,cli:s,env:process.env,parsed:n,io:e})}catch(S){return r.close(),e.stderr.write(`error: ${S instanceof Error?S.message:String(S)}
2348
2348
  `),2}process.env.LMCTL_API_URL=i.apiUrl,process.env.LMCTL_API_TOKEN=i.apiToken,process.env.LMCTL_API_PORT=String(i.port),fS(r);let o=pS(r);o>0&&e.stdout.write(`reconciled ${o} tracked invocation(s) with dead holders to 'aborted'
2349
2349
  `);let a=ZS(process.env);a!==null&&e.stdout.write(`running-reporter: enabled, reporting to the cloud periodically
2350
- `);let l;if(n.localWebui!==void 0){let v=dk(n.localWebui.dir,process.env);if(v===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve start --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),r.close(),2;let M=uk(process.env),{s3:D,commands:j}=gl(M);l={webuiDir:v,rootDir:M,s3:D,commands:j},e.stdout.write(`local webui: serving SPA from ${v}; mailbox store ${M}
2350
+ `);let l;if(n.localWebui!==void 0){let S=dk(n.localWebui.dir,process.env);if(S===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve start --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),r.close(),2;let O=uk(process.env),{s3:P,commands:D}=gl(O);l={webuiDir:S,rootDir:O,s3:P,commands:D},e.stdout.write(`local webui: serving SPA from ${S}; mailbox store ${O}
2351
2351
  `)}let c=n.noDaemon?void 0:dS({dal:r,intervalMs:ci()}),u=l!==void 0?{missing:[],tfstateCandidatesChecked:[]}:yi({env:process.env});u.missing.length>0&&e.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${u.missing.join(", ")}; running without cloud sync`+(u.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${u.tfstateCandidatesChecked.length} candidate path${u.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${u.tfstatePathUsed} did not supply the missing fields)`)+`
2352
- `);let d=await $2({log:v=>e.stderr.write(`${v}
2353
- `)}),f=new Va({adapterFactory:Gb,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:v=>e.stderr.write(`${v}
2354
- `)}),m=ur()?.device_id,p=eS({dal:r,daemon:c,...u.config!==void 0?{webuiRuntimeConfig:L2(u.config,m)}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:f,...l!==void 0?{localWebui:{webuiDir:l.webuiDir,localMailbox:{s3:l.s3,commands:l.commands}}}:{},authDisabled:n.insecureNoAuth}),h=process.env.LMCTL_USAGE_QUOTA_USD,_=h!==void 0&&h!==""?Number(h):NaN,y=Number.isFinite(_)&&_>0?_:void 0,g=await lk({dal:r,app:p,io:e,mailbox:u.config===void 0?void 0:{...u.config,cursorStore:r,chatLogTailStore:r,promptTriggerStore:r,usageStore:r,...y!==void 0?{usageQuotaUsd:y}:{},...m!==void 0?{deviceId:m}:{}},...l!==void 0?{localMailbox:{rootDir:l.rootDir,s3:l.s3,commands:l.commands,promptTriggerStore:r}}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:f});await ak({dal:r,mailbox:g.mailbox,io:e});let{serve:w}=await import("@hono/node-server"),S=await new Promise((v,M)=>{let D,j=U=>M(U);D=w({fetch:p.fetch,port:i.port,hostname:n.bind},()=>{D.removeListener?.("error",j),v(D)}),D.once("error",j)}).catch(async v=>(c!==void 0&&await c.stop().catch(()=>{}),await g.stop().catch(()=>{}),d!==void 0&&await d.stop().catch(()=>{}),await f.stop().catch(()=>{}),a?.stop(),r.close(),e.stderr.write(`error: could not bind ${n.bind}:${i.port}: ${v instanceof Error?v.message:String(v)}
2355
- `),null));if(S===null)return 2;e.stdout.write(`listening on ${n.bind}:${i.port}
2356
- `);let I=Q();try{let v=Il(I);v.running&&v.entry!==null&&v.entry.pid!==process.pid&&e.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${v.entry.pid}, port ${v.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
2357
- `);let M=zb({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:n.bind,dbPath:I,startToken:Zb()},I);e.stdout.write(`pidfile ${M} (pid ${process.pid})
2358
- `)}catch(v){e.stderr.write(`warning: could not write serve pidfile: ${v instanceof Error?v.message:String(v)}; \`lmctl serve status\`/\`stop\` will not find this daemon
2359
- `)}return await new Promise(v=>{let M=()=>{(async()=>{c!==void 0&&await c.stop(),S.close(),await g.stop(),d!==void 0&&await d.stop(),await f.stop(),a?.stop(),r.close();try{let D=Lm(I);D!==null&&D.pid===process.pid&&ss(I)}catch{}v()})()};process.once("SIGTERM",M),process.once("SIGINT",M)}),0}function sk(t){if(t.stdout!==process.stdout||$m)return;$m=!0;let e=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),n};process.stdout.on("error",e)}function I2(){$m=!1}async function ik(t,e){return sk(e),N2(t,e)}async function N2(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
2352
+ `);let d=await $2({log:S=>e.stderr.write(`${S}
2353
+ `)}),f=new Va({adapterFactory:Gb,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:S=>e.stderr.write(`${S}
2354
+ `)}),m=ur()?.device_id,p=eS({dal:r,daemon:c,...u.config!==void 0?{webuiRuntimeConfig:L2(u.config,m)}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:f,...l!==void 0?{localWebui:{webuiDir:l.webuiDir,localMailbox:{s3:l.s3,commands:l.commands}}}:{},authDisabled:n.insecureNoAuth}),h=process.env.LMCTL_USAGE_QUOTA_USD,_=h!==void 0&&h!==""?Number(h):NaN,y=Number.isFinite(_)&&_>0?_:void 0,g=await lk({dal:r,app:p,io:e,mailbox:u.config===void 0?void 0:{...u.config,cursorStore:r,chatLogTailStore:r,promptTriggerStore:r,usageStore:r,...y!==void 0?{usageQuotaUsd:y}:{},...m!==void 0?{deviceId:m}:{}},...l!==void 0?{localMailbox:{rootDir:l.rootDir,s3:l.s3,commands:l.commands,promptTriggerStore:r}}:{},...d!==void 0?{terminalSessionManager:d}:{},persistentSessionManager:f});await ak({dal:r,mailbox:g.mailbox,io:e});let{serve:w}=await import("@hono/node-server"),v=await new Promise((S,O)=>{let P,D=U=>O(U);P=w({fetch:p.fetch,port:i.port,hostname:n.bind},()=>{P.removeListener?.("error",D),S(P)}),P.once("error",D)}).catch(async S=>(c!==void 0&&await c.stop().catch(()=>{}),await g.stop().catch(()=>{}),d!==void 0&&await d.stop().catch(()=>{}),await f.stop().catch(()=>{}),a?.stop(),r.close(),e.stderr.write(`error: could not bind ${n.bind}:${i.port}: ${S instanceof Error?S.message:String(S)}
2355
+ `),null));if(v===null)return 2;e.stdout.write(`listening on ${n.bind}:${i.port}
2356
+ `);let N=Q();try{let S=Il(N);S.running&&S.entry!==null&&S.entry.pid!==process.pid&&e.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${S.entry.pid}, port ${S.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
2357
+ `);let O=zb({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:n.bind,dbPath:N,startToken:Zb()},N);e.stdout.write(`pidfile ${O} (pid ${process.pid})
2358
+ `)}catch(S){e.stderr.write(`warning: could not write serve pidfile: ${S instanceof Error?S.message:String(S)}; \`lmctl serve status\`/\`stop\` will not find this daemon
2359
+ `)}return await new Promise(S=>{let O=()=>{(async()=>{c!==void 0&&await c.stop(),v.close(),await g.stop(),d!==void 0&&await d.stop(),await f.stop(),a?.stop(),r.close();try{let P=Lm(N);P!==null&&P.pid===process.pid&&ss(N)}catch{}S()})()};process.once("SIGTERM",O),process.once("SIGINT",O)}),0}function sk(t){if(t.stdout!==process.stdout||$m)return;$m=!0;let e=n=>{throw n.code==="EPIPE"&&process.exit(0),process.stdout.off("error",e),n};process.stdout.on("error",e)}function I2(){$m=!1}async function ik(t,e){return sk(e),N2(t,e)}async function N2(t,e){if(t.length>0)return e.stderr.write(`error: lmctl serve status takes no arguments; got: ${t.join(" ")}
2360
2360
  `),2;let n=Q(),r=Il(n);if(r.entry===null)return e.stdout.write(`serve: not running
2361
2361
  `),e.stdout.write(r.corrupt?` unreadable pidfile at ${Zt(n)} (could not parse)
2362
2362
  run \`lmctl serve stop\` to clear it
@@ -2453,20 +2453,20 @@ unauthenticated daemon.
2453
2453
 
2454
2454
  Run 'lmctl serve --help' for details.
2455
2455
  `;$m=!1;A2=2e3;R2=100,O2=1e4});import{existsSync as P2,mkdirSync as F2,readFileSync as U2,renameSync as W2,unlinkSync as q2,writeFileSync as B2}from"node:fs";import{homedir as hk}from"node:os";import{dirname as wi,join as ze,resolve as H2}from"node:path";function os(t,e,n){let r=wi(H2(n)),s=new Set,i=new Map;for(let o of e.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())Qt(ze(o,".mcp.json"),"mcpServers",[Pn(),Fn()]),a.has("opencode")&&Qt(ze(o,".opencode","opencode.json"),"mcp",[yk(),wk()]),a.has("kimi")&&Qt(ze(o,".kimi-code","mcp.json"),"mcpServers",[Pn(),Fn()]);for(let o of s)K2(o)}function gk(t=Mm??hk()){return ze(t,".copilot","mcp-config.json")}function J2(t,e){Tt.mkdirSync(wi(t),{recursive:!0});let n=ze(wi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Tt.writeFileSync(n,`${JSON.stringify(e,null,2)}
2456
- `,"utf8"),Tt.renameSync(n,t)}catch(r){try{Tt.unlinkSync(n)}catch{}throw r}}function G2(t,e){Tt.mkdirSync(wi(t),{recursive:!0});let n=ze(wi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Tt.writeFileSync(n,e,"utf8"),Tt.renameSync(n,t)}catch(r){try{Tt.unlinkSync(n)}catch{}throw r}}function Qt(t,e,n){try{if(!Tt.existsSync(t))return;let r=JSON.parse(Tt.readFileSync(t,"utf8"));if(!is(r)||!is(r[e]))return;let s={...r[e]},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[e]=s,J2(t,r),$({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Pn(){return{name:Al,shouldRemove:nX}}function yk(){return{name:Al,shouldRemove:rX}}function Fn(){return{name:Nl,shouldRemove:eX}}function wk(){return{name:Nl,shouldRemove:tX}}function K2(t){let e=Mm??hk();switch(t){case"copilot":Qt(gk(e),"mcpServers",[Pn(),Fn()]);return;case"claude":Qt(ze(e,".claude.json"),"mcpServers",[Pn(),Fn()]);return;case"gemini":Qt(ze(e,".gemini","settings.json"),"mcpServers",[Pn(),Fn()]);return;case"qwen":Qt(ze(e,".qwen","settings.json"),"mcpServers",[Pn(),Fn()]);return;case"agy":Qt(ze(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Pn(),Fn()]);return;case"opencode":Qt(ze(e,".config","opencode","opencode.json"),"mcp",[yk(),wk()]);return;case"kimi":Qt(ze(Mm===void 0?process.env.KIMI_CODE_HOME??ze(e,".kimi-code"):ze(e,".kimi-code"),"mcp.json"),"mcpServers",[Pn(),Fn()]);return;case"codex":V2(ze(e,".codex","config.toml"));return;default:return}}function V2(t){try{if(!Tt.existsSync(t))return;let e=Tt.readFileSync(t,"utf8"),n=Y2(e);if(n===null)return;let r=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let c=Ek(l);if(c===null)return;if(c!==void 0){if(_k(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 u=Z2(l);if(u===null)return;if(u!==void 0&&_k(u,n)){i.add(u[1]);continue}s.push(l)}if(i.size===0)return;G2(t,s.join(`
2457
- `)),$({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function _k(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function Y2(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=Ek(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=z2(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Nl&&c[1]!==Al)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=Tk(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=Q2(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let r=new Set;for(let[s,i]of e.entries())s===Nl&&Sk(i.command,i.args)&&r.add(s),s===Al&&bk(i.command,i.args)&&r.add(s);return r}function z2(t,e){if(t.startsWith("mcp_servers"))return xl(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=xl(t);return n===null?null:[...e,...n]}function Ek(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:xl(e[1])}function Z2(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return xl(n)}function xl(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function Tk(t){let e=vk(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function Q2(t){let e=vk(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>Tk(s.trim()));return r.some(s=>s===null)?null:r}function vk(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function eX(t){return is(t)?t.type==="stdio"&&typeof t.command=="string"&&Sk(t.command,t.args):!1}function tX(t){return!is(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Ik(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&kk(t.command[0],[t.command[1],t.command[2]])}function nX(t){return is(t)?t.type==="stdio"&&bk(t.command,t.args):!1}function rX(t){return!is(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Nk(t.command[0])&&t.command[1]==="mcp"}function Sk(t,e){return Ik(t)&&Ak(e)||kk(t,e)}function bk(t,e){return Nk(t)&&Ak(e)}function kk(t,e){return sX(t)&&Array.isArray(e)&&e.length===2&&iX(e[0])&&e[1]==="mcp"}function Ik(t){return typeof t=="string"&&Dm(t)==="lmctl"}function Nk(t){return typeof t=="string"&&Dm(t)==="lmctl0"}function sX(t){if(typeof t!="string")return!1;let e=Dm(t).toLowerCase();return e==="node"||e==="node.exe"}function iX(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Dm(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function Ak(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function is(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Nl,Al,X2,Tt,Mm,Ei=E(()=>{"use strict";de();Nl="lmctl",Al="lmctl0",X2={existsSync:P2,mkdirSync:F2,readFileSync:U2,writeFileSync:B2,renameSync:W2,unlinkSync:q2},Tt=X2});function Ok(t){let e=xk(t.registry,t.fromTeamfile);if(e===void 0)return as(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Rk(e,t.fromAlias))return as(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let n=xk(t.registry,t.toTeamfile);return n===void 0?as(`target team is not registered in policy graph: ${t.toTeamfile}`):Rk(n,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?as(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?as(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:as(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function xk(t,e){return t.teams.find(n=>n.teamfile===e)}function Rk(t,e){return t.aliases.some(n=>n===e)}function as(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Lk=E(()=>{"use strict"});import{basename as oX}from"node:path";function Mk(t,e){let n=new Date(e.now.getTime()-ls()).toISOString(),r=Pk(t,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=dX(e.sender,r),i=uX(e.sender,r);i!==null&&i.teamfile===e.root&&!$k(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(m=>$k(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,u=c!==null&&e.now.getTime()-c<aX,d=jm(e.sender,r).length;return{stop:l.length>=1&&u&&d>=lX,chain:fX(a)}}function Dk(t,e){let n=new Date(e.now.getTime()-ls()).toISOString(),r=Pk(t,n),s=jm(e.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 ls(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Ck;let n=Number(e);return!Number.isFinite(n)||n<=0?Ck:n}function jk(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function cX(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function Pk(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(cX).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function dX(t,e,n={}){let r=new Map;for(let a of e)r.set(_r(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([_r(t)]);for(let a=0;a<64;a+=1){let l=r.get(_r(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 u=_r(l.sender);if(o.has(u))break;s.unshift(c),o.add(u),i=l.sender}return s}function jm(t,e){let n=_r(t),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 e){let c=_r(l.sender),u=_r(l.receiver);c!==a&&u!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(u)||(r.add(u),s.push(u)))}}return i.sort((o,a)=>o.at-a.at)}function uX(t,e){let n=jm(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function $k(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function _r(t){return`${t.teamfile}\0${t.alias}`}function fX(t){return t.map(e=>`${oX(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var aX,lX,Ck,Pm=E(()=>{"use strict";aX=6e4,lX=2,Ck=8*60*60*1e3});function mX(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return Fk;let n=Number(e);return!Number.isFinite(n)||n<=0?Fk:n}async function pX(t,e,n){try{let r=Me(e,n,t),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 zt(s);if(c.length!==1)return null;i=c[0]}let o=await Ne(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 Uk(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??mX(),o=await pX(t,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 Fk,Wk=E(()=>{"use strict";de();wt();yt();Fk=36e5});function _X(t){return t===null?null:Re(t)?"live":"dead"}function Fm(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:_X(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function hX(t){let e=Math.floor(t/1e3),n=Math.floor(e/3600),r=Math.floor(e%3600/60),s=e%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 Um(t){let e=[];return t.idle_ms!==null&&e.push(`active ${hX(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}var qk=E(()=>{"use strict";Pt()});import{randomUUID as gX}from"node:crypto";import{hostname as Bk,networkInterfaces as yX}from"node:os";function Hk(t){let e=(t.now??new Date).toISOString();return{lock_id:gX(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??Bk(),holder_ips:t.ips??SX(),started_at:e,last_heartbeat:e}}function Xk(t=process.env){return Jk(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,wX)}function TX(t=process.env){return Jk(t.LMCTL_TERMINAL_LOCK_STALE_MS,EX)}function Wm(t,e={}){let n=e.now??new Date,r=e.localHost??Bk(),s=e.staleMs??TX();if(t.holder_host===r)return(e.isProcessAlive??vX)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.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 qm(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function Jk(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function vX(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function SX(){let t=new Set;for(let e of Object.values(yX()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var wX,EX,Bm=E(()=>{"use strict";wX=15e3,EX=12e4});function IX(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=Be({path:Q()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&Re(a.holder_pid)),pollMs:bX,settleMs:kX,maxHoldMs:wn(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 Gk(t){let e=NX(t.newMessage,{newMessageFrom:t.newMessageFrom??AX(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=ce(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),a.holdOpen=IX(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await sn(a);return r&&$e(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs}}function NX(t,e={}){return[`--- new message (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
2458
- `)}function AX(t){return`${t.teamfile}:${t.alias}`}var Kie,bX,kX,Kk=E(()=>{"use strict";mt();de();dt();We();Pt();ct();Kie=60*60*1e3,bX=2e3,kX=5e3});async function Qk(t){let e=t.onEvent??(()=>{}),n=xX(t.io,e),r=null,s=null,i=null,o,a,l=null,c=!1,u=null,d=t.prompt;try{let f=await O(n,A=>Me(t.teamfile,t.alias,A)),m=f.teamfile,p=await O(n,A=>UX(A,t.env??process.env)),h=p.sender,_=await WX(n,{explicitRoot:t.rootFlag,sender:h,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),y=h===null?null:await qX(n,{rootTeamfile:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias});y!==null&&!y.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${y.reason}
2459
- `});let g=t.env??process.env;i=await CX(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:h,rootTeamfile:_,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin,parentInvocationId:il(g.LMCTL_INVOCATION_ID)}),o=jX(n,i),i!==null&&(g.LMCTL_INVOCATION_ID=String(i));try{os(n,Fe(m),m)}catch{}r={root_teamfile:_,sender_teamfile:h?.teamfile??null,sender_alias:h?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:y};let w=await eI(n,m,f.alias);if(w!==null){let A=qm(w);return cs(i,r,t.prompt,A,"unavailable"),u=Hm(A,null),{status:"busy",message:A,teamChatLogId:null}}let S=await RX(n,m,f.alias);if(S.busy){let A=await OX(n,m,f.alias);return A+=await LX(n,m,f.alias),cs(i,r,t.prompt,A,"unavailable"),u=Hm(A,null),{status:"busy",message:A,teamChatLogId:null}}if(h!==null&&h.teamfile!==m){let A=await O(n,Y=>Mk(Y,{root:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(A.stop){let Y=jk(A.chain);return cs(i,r,t.prompt,Y,"cycle"),u=Rl(Y,null),{status:"error",errorKind:"cycle",message:Y,teamChatLogId:null,messageId:null}}}let I=await XX(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:h?.teamfile??m,sender_alias:h?.alias??"operator",...S.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!I.acquired){let A=tI(m,f.alias,I.current);return A+=` ${Um(Fm({holderPid:I.current.holder_pid,since:I.current.started_at}))}`,cs(i,r,t.prompt,A,"unavailable"),u=Hm(A,null),{status:"busy",message:A,teamChatLogId:null}}s={row:I.lease,leaseId:I.leaseId},a=Yi(A=>O(n,Y=>Y.heartbeatAgentInflight(s.row,s.leaseId,A)),{intervalMs:Zk,onError:A=>{ce()&&$e(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:A instanceof Error?A.message:String(A)}))}});let v=await Gk({sender:h??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:h===null?"operator":`${h.teamfile}:${h.alias}`,io:n,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:A=>e({kind:"delta",chunk:A}),onProgress:A=>e({kind:"progress",alias:f.alias,event:A}),onPromptBuilt:async A=>{d=A,l===null&&(l=await GX(n,{...r,message:A}),l!==null&&(t.onAccepted?.(tn(l)),i!==null&&await DX(n,i,l))),i!==null&&await MX(n,i,A)}});d=v.prompt;let M=v.status==="stalled",D=null,j=M?`provider stalled${v.stalledAfterMs!==void 0?` after ${v.stalledAfterMs}ms`:""}`:v.status==="error"?v.error??v.receipt:r.policy?.outOfPolicy===!0?r.policy.reason:null,U=M||v.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await zk(n,l,{...r,message:d,response:v.receipt,status:U,error_detail:j}),c=!0,D=l):D=await VX(n,{...r,message:d,response:v.receipt,status:U,error_detail:j}),M){let A=j;cs(i,r,d,A,"error"),u=Rl(A,D,v.receipt)}else u=PX(v.receipt,D);return{status:M?"stalled":"ok",replyText:v.receipt,wroteDelta:v.wroteDelta,teamChatLogId:D,messageId:D===null?null:tn(D),durationMs:v.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await zk(n,l,{...r,message:d,response:null,status:"error",error_detail:m}),c=!0),cs(i,r,d,m,"error"),u=Rl(m,l),{status:"error",errorKind:f instanceof Ee?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:tn(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await KX(n,r,tn(l)),s!==null&&await JX(n,s.row,s.leaseId),i!==null&&await $X(n,i,u??Rl("chat turn exited without a terminal outcome",null))}}function xX(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function RX(t,e,n){let r=await O(t,i=>(_S(i,e,n),Sr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await O(t,i=>Uk(i,r,e,n));return{busy:!s,idleReclaim:s}}async function OX(t,e,n){let r=await eI(t,e,n);if(r!==null)return qm(r);let s=await O(t,i=>i.getAgentInflight(e,n));return s!==null?tI(e,n,s):`${n} is busy; wait and retry`}async function LX(t,e,n){let r=await O(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${Um(Fm({holderPid:r.holder_pid,since:r.started_at}))}`}async function CX(t,e){try{return(await O(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:FX(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ce()&&$e(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function $X(t,e,n){try{await O(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function MX(t,e,n){try{await O(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function DX(t,e,n){try{await O(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function jX(t,e){if(e===null)return;let n=setInterval(()=>{O(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ce()&&$e(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},Zk);return n.unref?.(),n}function PX(t,e){return{status:"done",result_summary:Ti(t),error:null,team_chat_log_id:e}}function Hm(t,e){return{status:"busy",result_summary:Ti(t),error:t,team_chat_log_id:e}}function Rl(t,e,n){return{status:"error",result_summary:Ti(n===void 0?t:n),error:t,team_chat_log_id:e}}function Ti(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function FX(t,e,n){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function UX(t,e){let n=NS(e,t);if(n.ok)return{sender:Xe(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(fn("chat"))}async function WX(t,e){if(e.explicitRoot!==void 0)return await O(t,r=>ve(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await O(t,r=>Dk(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function qX(t,e){return await O(t,n=>Ok({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:BX(n,e.sender.teamfile,e.receiverTeamfile)}))}function BX(t,e,n){return{teams:[e,n].map(s=>HX(s,t))}}function HX(t,e){let n=rt(t,e),r=ht(n);return{teamfile:t,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function XX(t,e){return await O(t,n=>{let r=ce(),s=vr(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ls(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&$e(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Yk(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&$e(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Yk(s.current)})),{acquired:!1,current:s.current})})}async function eI(t,e,n){return await O(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(Wm(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:Wm(s).live?s:null})}function Yk(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function JX(t,e,n){try{await O(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2460
- `)}}function tI(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function GX(t,e){let n=vi(e.message);try{return await O(t,r=>r.beginTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,created_at:new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
2461
- `),null}}async function zk(t,e,n){let r=vi(n.message),s=n.response===null?null:vi(n.response);try{await O(t,i=>i.finishTeamChatLog(e,{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){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
2462
- `)}}async function KX(t,e,n){if(e!==null)try{await O(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
2463
- `)}}async function VX(t,e){let n=vi(e.message),r=e.response===null?null:vi(e.response);try{return await O(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:r?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2464
- `),null}}function cs(t,e,n,r,s){t!==null||e===null||$({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:r,message_preview:Ti(n)})}function vi(t){return t.length<=Vk?{text:t,truncated:!1}:{text:t.slice(0,Vk),truncated:!0}}var Vk,Zk,nI=E(()=>{"use strict";yt();Vt();Ei();Lk();Yt();Pm();de();Ie();ct();di();Wk();qk();Bm();fi();dl();Kk();Ns();Vk=256*1024,Zk=3e4});var lI={};oe(lI,{parseIdleTimeoutMs:()=>oI,resolvePromptInput:()=>iI,runChat:()=>ZX});import{readFileSync as YX}from"node:fs";async function ZX(t,e={stdout:process.stdout,stderr:process.stderr}){let n=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${rI}
2456
+ `,"utf8"),Tt.renameSync(n,t)}catch(r){try{Tt.unlinkSync(n)}catch{}throw r}}function G2(t,e){Tt.mkdirSync(wi(t),{recursive:!0});let n=ze(wi(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{Tt.writeFileSync(n,e,"utf8"),Tt.renameSync(n,t)}catch(r){try{Tt.unlinkSync(n)}catch{}throw r}}function Qt(t,e,n){try{if(!Tt.existsSync(t))return;let r=JSON.parse(Tt.readFileSync(t,"utf8"));if(!is(r)||!is(r[e]))return;let s={...r[e]},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[e]=s,J2(t,r),M({event:"mcp_cleanup",path:t,removed:i})}catch{}}function Pn(){return{name:Al,shouldRemove:nX}}function yk(){return{name:Al,shouldRemove:rX}}function Fn(){return{name:Nl,shouldRemove:eX}}function wk(){return{name:Nl,shouldRemove:tX}}function K2(t){let e=Mm??hk();switch(t){case"copilot":Qt(gk(e),"mcpServers",[Pn(),Fn()]);return;case"claude":Qt(ze(e,".claude.json"),"mcpServers",[Pn(),Fn()]);return;case"gemini":Qt(ze(e,".gemini","settings.json"),"mcpServers",[Pn(),Fn()]);return;case"qwen":Qt(ze(e,".qwen","settings.json"),"mcpServers",[Pn(),Fn()]);return;case"agy":Qt(ze(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[Pn(),Fn()]);return;case"opencode":Qt(ze(e,".config","opencode","opencode.json"),"mcp",[yk(),wk()]);return;case"kimi":Qt(ze(Mm===void 0?process.env.KIMI_CODE_HOME??ze(e,".kimi-code"):ze(e,".kimi-code"),"mcp.json"),"mcpServers",[Pn(),Fn()]);return;case"codex":V2(ze(e,".codex","config.toml"));return;default:return}}function V2(t){try{if(!Tt.existsSync(t))return;let e=Tt.readFileSync(t,"utf8"),n=Y2(e);if(n===null)return;let r=e.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of r){let c=Ek(l);if(c===null)return;if(c!==void 0){if(_k(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 u=Z2(l);if(u===null)return;if(u!==void 0&&_k(u,n)){i.add(u[1]);continue}s.push(l)}if(i.size===0)return;G2(t,s.join(`
2457
+ `)),M({event:"mcp_cleanup",path:t,removed:[...i]})}catch{}}function _k(t,e){return t.length<2||t[0]!=="mcp_servers"?!1:e.has(t[1])}function Y2(t){let e=new Map,n;for(let s of t.split(/\n/)){let i=Ek(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=z2(a,n);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==Nl&&c[1]!==Al)continue;let u=e.get(c[1])??{};if(c[2]==="command"){let d=Tk(l);if(d===null)return null;u.command=d}else if(c[2]==="args"){let d=Q2(l);if(d===null)return null;u.args=d}e.set(c[1],u)}let r=new Set;for(let[s,i]of e.entries())s===Nl&&Sk(i.command,i.args)&&r.add(s),s===Al&&bk(i.command,i.args)&&r.add(s);return r}function z2(t,e){if(t.startsWith("mcp_servers"))return xl(t);if(e===void 0||e.length<2||e[0]!=="mcp_servers")return;let n=xl(t);return n===null?null:[...e,...n]}function Ek(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:xl(e[1])}function Z2(t){let e=t.indexOf("=");if(e<0)return;let n=t.slice(0,e).trim();if(!(n.length===0||!n.startsWith("mcp_servers")))return xl(n)}function xl(t){let e=[],n=0,r=()=>{for(;n<t.length&&/\s/.test(t[n]);)n+=1};for(;n<t.length;){if(r(),n>=t.length)return null;if(t[n]==='"'){n+=1;let s="",i=!1;for(;n<t.length;){let o=t[n];if(o==="\\"){if(n+1>=t.length)return null;s+=t[n+1],n+=2;continue}if(o==='"'){n+=1,i=!0;break}s+=o,n+=1}if(!i)return null;e.push(s)}else{let s=n;for(;n<t.length&&/[A-Za-z0-9_-]/.test(t[n]);)n+=1;if(n===s)return null;e.push(t.slice(s,n))}if(r(),n>=t.length)break;if(t[n]!==".")return null;n+=1}return e.length>0?e:null}function Tk(t){let e=vk(t).trim();if(e.startsWith('"'))try{let n=JSON.parse(e);return typeof n=="string"?n:null}catch{return null}return e.startsWith("'")&&e.endsWith("'")&&e.length>=2?e.slice(1,-1):null}function Q2(t){let e=vk(t).trim();if(!e.startsWith("[")||!e.endsWith("]"))return null;let n=e.slice(1,-1).trim();if(n.length===0)return[];let r=n.split(",").map(s=>Tk(s.trim()));return r.some(s=>s===null)?null:r}function vk(t){let e;for(let n=0;n<t.length;n+=1){let r=t[n];if(e!==void 0){if(e==='"'&&r==="\\"){n+=1;continue}r===e&&(e=void 0);continue}if(r==='"'||r==="'"){e=r;continue}if(r==="#")return t.slice(0,n)}return t}function eX(t){return is(t)?t.type==="stdio"&&typeof t.command=="string"&&Sk(t.command,t.args):!1}function tX(t){return!is(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Ik(t.command[0])&&t.command[1]==="mcp"||t.command.length===3&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&typeof t.command[2]=="string"&&kk(t.command[0],[t.command[1],t.command[2]])}function nX(t){return is(t)?t.type==="stdio"&&bk(t.command,t.args):!1}function rX(t){return!is(t)||!Array.isArray(t.command)?!1:t.command.length===2&&typeof t.command[0]=="string"&&typeof t.command[1]=="string"&&Nk(t.command[0])&&t.command[1]==="mcp"}function Sk(t,e){return Ik(t)&&Ak(e)||kk(t,e)}function bk(t,e){return Nk(t)&&Ak(e)}function kk(t,e){return sX(t)&&Array.isArray(e)&&e.length===2&&iX(e[0])&&e[1]==="mcp"}function Ik(t){return typeof t=="string"&&Dm(t)==="lmctl"}function Nk(t){return typeof t=="string"&&Dm(t)==="lmctl0"}function sX(t){if(typeof t!="string")return!1;let e=Dm(t).toLowerCase();return e==="node"||e==="node.exe"}function iX(t){if(typeof t!="string")return!1;let e=t.replace(/\\/g,"/");return e==="lmctl-cli/dist/index.js"||e.endsWith("/lmctl-cli/dist/index.js")}function Dm(t){let e=t.replace(/\\/g,"/");return e.split("/").filter(r=>r.length>0).at(-1)??e}function Ak(t){return Array.isArray(t)&&t.length===1&&t[0]==="mcp"}function is(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Nl,Al,X2,Tt,Mm,Ei=E(()=>{"use strict";de();Nl="lmctl",Al="lmctl0",X2={existsSync:P2,mkdirSync:F2,readFileSync:U2,writeFileSync:B2,renameSync:W2,unlinkSync:q2},Tt=X2});function Ok(t){let e=xk(t.registry,t.fromTeamfile);if(e===void 0)return as(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!Rk(e,t.fromAlias))return as(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let n=xk(t.registry,t.toTeamfile);return n===void 0?as(`target team is not registered in policy graph: ${t.toTeamfile}`):Rk(n,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?as(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?as(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:as(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function xk(t,e){return t.teams.find(n=>n.teamfile===e)}function Rk(t,e){return t.aliases.some(n=>n===e)}function as(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var Lk=E(()=>{"use strict"});import{basename as oX}from"node:path";function Mk(t,e){let n=new Date(e.now.getTime()-ls()).toISOString(),r=Pk(t,n).filter(m=>!m.sender.teamfile.startsWith("prompt:")),s=dX(e.sender,r),i=uX(e.sender,r);i!==null&&i.teamfile===e.root&&!$k(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,o],l=s.filter(m=>$k(m,o)),c=l.map(m=>m.at).filter(m=>m!==null).sort((m,p)=>p-m)[0]??null,u=c!==null&&e.now.getTime()-c<aX,d=jm(e.sender,r).length;return{stop:l.length>=1&&u&&d>=lX,chain:fX(a)}}function Dk(t,e){let n=new Date(e.now.getTime()-ls()).toISOString(),r=Pk(t,n),s=jm(e.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 ls(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return Ck;let n=Number(e);return!Number.isFinite(n)||n<=0?Ck:n}function jk(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function cX(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function Pk(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(cX).filter(n=>Number.isFinite(n.at)&&new Date(n.at).toISOString()>=e).sort((n,r)=>n.at-r.at)}function dX(t,e,n={}){let r=new Map;for(let a of e)r.set(_r(a.receiver),a);let s=[{...t,at:null}],i=t,o=new Set([_r(t)]);for(let a=0;a<64;a+=1){let l=r.get(_r(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 u=_r(l.sender);if(o.has(u))break;s.unshift(c),o.add(u),i=l.sender}return s}function jm(t,e){let n=_r(t),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 e){let c=_r(l.sender),u=_r(l.receiver);c!==a&&u!==a||(i.includes(l)||i.push(l),r.has(c)||(r.add(c),s.push(c)),r.has(u)||(r.add(u),s.push(u)))}}return i.sort((o,a)=>o.at-a.at)}function uX(t,e){let n=jm(t,e);if(n.length===0)return null;let r=n[0];return r.sender.teamfile.startsWith("prompt:")?r.receiver:r.sender}function $k(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function _r(t){return`${t.teamfile}\0${t.alias}`}function fX(t){return t.map(e=>`${oX(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var aX,lX,Ck,Pm=E(()=>{"use strict";aX=6e4,lX=2,Ck=8*60*60*1e3});function mX(t=process.env){let e=t.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(e===void 0||e.trim()==="")return Fk;let n=Number(e);return!Number.isFinite(n)||n<=0?Fk:n}async function pX(t,e,n){try{let r=Me(e,n,t),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 zt(s);if(c.length!==1)return null;i=c[0]}let o=await Ne(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 Uk(t,e,n,r,s){if(!e.busy||e.reason!=="in-flight")return!1;let i=s??mX(),o=await pX(t,n,r),a=o!==null&&o>=i;return a&&M({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 Fk,Wk=E(()=>{"use strict";de();wt();yt();Fk=36e5});function _X(t){return t===null?null:Re(t)?"live":"dead"}function Fm(t){let e=t.nowMs??Date.now(),n=Date.parse(t.since);return{holder_pid:t.holderPid,holder_liveness:_X(t.holderPid),since:t.since,idle_ms:Number.isFinite(n)?Math.max(0,e-n):null}}function hX(t){let e=Math.floor(t/1e3),n=Math.floor(e/3600),r=Math.floor(e%3600/60),s=e%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 Um(t){let e=[];return t.idle_ms!==null&&e.push(`active ${hX(t.idle_ms)}`),e.push(`since ${t.since}`),e.push(t.holder_pid===null?"holder_pid=unavailable":`holder_pid=${t.holder_pid}, ${t.holder_liveness}`),`(${e.join("; ")})`}var qk=E(()=>{"use strict";Pt()});import{randomUUID as gX}from"node:crypto";import{hostname as Bk,networkInterfaces as yX}from"node:os";function Hk(t){let e=(t.now??new Date).toISOString();return{lock_id:gX(),teamfile:t.teamfile,alias:t.alias,holder_pid:t.pid??process.pid,holder_host:t.host??Bk(),holder_ips:t.ips??SX(),started_at:e,last_heartbeat:e}}function Xk(t=process.env){return Jk(t.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,wX)}function TX(t=process.env){return Jk(t.LMCTL_TERMINAL_LOCK_STALE_MS,EX)}function Wm(t,e={}){let n=e.now??new Date,r=e.localHost??Bk(),s=e.staleMs??TX();if(t.holder_host===r)return(e.isProcessAlive??vX)(t.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(t.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 qm(t){return`${t.alias} is held by a terminal on ${t.holder_host} since ${t.started_at}; retry later`}function Jk(t,e){if(t===void 0||t.trim()==="")return e;let n=t.trim(),r=Number.parseInt(n,10);return!Number.isFinite(r)||r<=0||String(r)!==n?e:r}function vX(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}function SX(){let t=new Set;for(let e of Object.values(yX()))for(let n of e??[])n.internal||t.add(n.address);return[...t].sort()}var wX,EX,Bm=E(()=>{"use strict";wX=15e3,EX=12e4});function IX(t,e,n){let r=`${e.teamfile}:${e.alias}`,s=null,i=()=>t.dal!==void 0?t.dal:(s===null&&(s=Be({path:Q()})),s),o=()=>{if(s===null)return;let a=s;s=null;try{a.close()}catch{}};return{hasOutstandingWork:()=>i().listAgentInflight().some(a=>a.sender_teamfile===e.teamfile&&a.sender_alias===e.alias&&!(a.receiver_teamfile===e.teamfile&&a.receiver_alias===e.alias)&&a.holder_pid!==null&&Re(a.holder_pid)),pollMs:bX,settleMs:kX,maxHoldMs:wn(n),onHold:()=>M({event:"delivery_hold_open_started",receiver:r}),onRelease:a=>{o(),!(!a.held&&a.reason==="cleared")&&M({event:"delivery_hold_open_released",receiver:r,elapsed_ms:a.elapsedMs,held:a.held,reason:a.reason})}}}async function Gk(t){let e=NX(t.newMessage,{newMessageFrom:t.newMessageFrom??AX(t.sender)});if(e.length===0)throw new Error(`no message to deliver for ${t.sender.teamfile}:${t.sender.alias} -> ${t.receiver.teamfile}:${t.receiver.alias}`);let n=!1,r=ce(),s=0,i=0,o=0,a={provider:t.receiver.provider,sessionId:t.receiver.sessionId,cwd:t.receiver.cwd,prompt:e,permissionMode:t.permissionMode,env:t.env,onDelta:c=>{n=!0,r&&(s+=1,o=Buffer.byteLength(c,"utf8"),i+=o),t.onDelta?.(c)},onProgress:c=>t.onProgress?.(c)};t.receiver.model!==void 0&&(a.model=t.receiver.model),t.receiver.effort!==void 0&&(a.effort=t.receiver.effort),a.alias=t.receiver.alias,a.isLead=t.receiver.isLead,t.idleTimeoutMs!==void 0&&(a.timeoutMs=t.idleTimeoutMs),a.holdOpen=IX(t.io,t.receiver,t.env),await t.onPromptBuilt?.(e);let l=await sn(a);return r&&$e(JSON.stringify({event:"chat_return",alias:t.receiver.alias,provider:t.receiver.provider,streamed:n,blockCount:s,streamedBytes:i,resultTextBytes:Buffer.byteLength(l.text,"utf8"),lastChunkBytes:o,tailPreview:l.text.slice(-200)})),l.status==="stalled"?{status:"stalled",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs,stalledAfterMs:l.stalledAfterMs}:{status:"ok",receipt:l.text,prompt:e,wroteDelta:n,durationMs:l.durationMs}}function NX(t,e={}){return[`--- new message (from ${e.newMessageFrom??"operator"}) ---`,t].join(`
2458
+ `)}function AX(t){return`${t.teamfile}:${t.alias}`}var Kie,bX,kX,Kk=E(()=>{"use strict";mt();de();dt();We();Pt();ct();Kie=60*60*1e3,bX=2e3,kX=5e3});async function Qk(t){let e=t.onEvent??(()=>{}),n=xX(t.io,e),r=null,s=null,i=null,o,a,l=null,c=!1,u=null,d=t.prompt;try{let f=await L(n,j=>Me(t.teamfile,t.alias,j)),m=f.teamfile,p=await L(n,j=>UX(j,t.env??process.env)),h=p.sender,_=await WX(n,{explicitRoot:t.rootFlag,sender:h,receiverTeamfile:m,operatorOrigin:p.origin==="operator"}),y=h===null?null:await qX(n,{rootTeamfile:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias});y!==null&&!y.allowed&&e({kind:"warning",message:`warning: out-of-policy chat send: ${y.reason}
2459
+ `});let g=t.env??process.env,w=await L(n,j=>j.getRootTeam(_)?.name??null);w!==null&&(g.LMBEE_TEAM_NAME=w),i=await CX(n,{receiverTeamfile:m,receiverAlias:f.alias,sender:h,rootTeamfile:_,provider:f.provider,model:f.model,sessionId:f.sessionid,cwd:f.sessiondir,prompt:t.prompt,origin:p.origin,parentInvocationId:il(g.LMCTL_INVOCATION_ID)}),o=jX(n,i),i!==null&&(g.LMCTL_INVOCATION_ID=String(i));try{os(n,Fe(m),m)}catch{}r={root_teamfile:_,sender_teamfile:h?.teamfile??null,sender_alias:h?.alias??null,receiver_teamfile:m,receiver_alias:f.alias,receiver_provider:f.provider,receiver_session_id:f.sessionid,origin:p.origin,policy:y};let v=await eI(n,m,f.alias);if(v!==null){let j=qm(v);return cs(i,r,t.prompt,j,"unavailable"),u=Hm(j,null),{status:"busy",message:j,teamChatLogId:null}}let N=await RX(n,m,f.alias);if(N.busy){let j=await OX(n,m,f.alias);return j+=await LX(n,m,f.alias),cs(i,r,t.prompt,j,"unavailable"),u=Hm(j,null),{status:"busy",message:j,teamChatLogId:null}}if(h!==null&&h.teamfile!==m){let j=await L(n,q=>Mk(q,{root:_,sender:h,receiverTeamfile:m,receiverAlias:f.alias,now:new Date}));if(j.stop){let q=jk(j.chain);return cs(i,r,t.prompt,q,"cycle"),u=Rl(q,null),{status:"error",errorKind:"cycle",message:q,teamChatLogId:null,messageId:null}}}let S=await XX(n,{receiver_teamfile:m,receiver_alias:f.alias,sender_teamfile:h?.teamfile??m,sender_alias:h?.alias??"operator",...N.idleReclaim?{force:!0,reclaimReason:"session-idle"}:{}});if(!S.acquired){let j=tI(m,f.alias,S.current);return j+=` ${Um(Fm({holderPid:S.current.holder_pid,since:S.current.started_at}))}`,cs(i,r,t.prompt,j,"unavailable"),u=Hm(j,null),{status:"busy",message:j,teamChatLogId:null}}s={row:S.lease,leaseId:S.leaseId},a=Yi(j=>L(n,q=>q.heartbeatAgentInflight(s.row,s.leaseId,j)),{intervalMs:Zk,onError:j=>{ce()&&$e(JSON.stringify({event:"agent_inflight_heartbeat_error",receiver:{teamfile:s.row.receiver_teamfile,alias:s.row.receiver_alias},error:j instanceof Error?j.message:String(j)}))}});let O=await Gk({sender:h??{teamfile:m,alias:"operator"},receiver:{teamfile:m,alias:f.alias,provider:f.provider,sessionId:f.sessionid,cwd:f.sessiondir,...f.model!==void 0?{model:f.model}:{},...f.effort!==void 0?{effort:f.effort}:{},...f.isLead!==void 0?{isLead:f.isLead}:{}},newMessage:t.prompt,newMessageFrom:h===null?"operator":`${h.teamfile}:${h.alias}`,io:n,permissionMode:t.permissionMode,env:t.env??process.env,...t.idleTimeoutMs!==void 0?{idleTimeoutMs:t.idleTimeoutMs}:{},onDelta:j=>e({kind:"delta",chunk:j}),onProgress:j=>e({kind:"progress",alias:f.alias,event:j}),onPromptBuilt:async j=>{d=j,l===null&&(l=await GX(n,{...r,message:j}),l!==null&&(t.onAccepted?.(tn(l)),i!==null&&await DX(n,i,l))),i!==null&&await MX(n,i,j)}});d=O.prompt;let P=O.status==="stalled",D=null,U=P?`provider stalled${O.stalledAfterMs!==void 0?` after ${O.stalledAfterMs}ms`:""}`:O.status==="error"?O.error??O.receipt:r.policy?.outOfPolicy===!0?r.policy.reason:null,x=P||O.status==="error"?"error":r.policy?.outOfPolicy===!0?"out_of_policy":"ok";if(l!==null?(await zk(n,l,{...r,message:d,response:O.receipt,status:x,error_detail:U}),c=!0,D=l):D=await VX(n,{...r,message:d,response:O.receipt,status:x,error_detail:U}),P){let j=U;cs(i,r,d,j,"error"),u=Rl(j,D,O.receipt)}else u=PX(O.receipt,D);return{status:P?"stalled":"ok",replyText:O.receipt,wroteDelta:O.wroteDelta,teamChatLogId:D,messageId:D===null?null:tn(D),durationMs:O.durationMs}}catch(f){let m=f instanceof Error?f.message:String(f);return l!==null&&!c&&r!==null&&(await zk(n,l,{...r,message:d,response:null,status:"error",error_detail:m}),c=!0),cs(i,r,d,m,"error"),u=Rl(m,l),{status:"error",errorKind:f instanceof Ee?"target":"provider",message:m,teamChatLogId:l,messageId:l===null?null:tn(l)}}finally{o!==void 0&&clearInterval(o),a!==void 0&&clearInterval(a),l!==null&&await KX(n,r,tn(l)),s!==null&&await JX(n,s.row,s.leaseId),i!==null&&await $X(n,i,u??Rl("chat turn exited without a terminal outcome",null))}}function xX(t,e){return{...t,stdout:{write:()=>{}},stderr:{write:n=>{e({kind:"warning",message:n})}}}}async function RX(t,e,n){let r=await L(t,i=>(_S(i,e,n),Sr(i,e,n)));if(!r.busy)return{busy:!1,idleReclaim:!1};let s=await L(t,i=>Uk(i,r,e,n));return{busy:!s,idleReclaim:s}}async function OX(t,e,n){let r=await eI(t,e,n);if(r!==null)return qm(r);let s=await L(t,i=>i.getAgentInflight(e,n));return s!==null?tI(e,n,s):`${n} is busy; wait and retry`}async function LX(t,e,n){let r=await L(t,s=>s.getAgentInflight(e,n));return r===null?"":` ${Um(Fm({holderPid:r.holder_pid,since:r.started_at}))}`}async function CX(t,e){try{return(await L(t,r=>r.startTrackedInvocation({kind:"chat",origin:e.origin,scope_teamfile:e.receiverTeamfile,from_identity:e.sender===null?"operator":`${e.sender.teamfile}:${e.sender.alias}`,target_teamfile:e.receiverTeamfile,target_alias:e.receiverAlias,root_teamfile:e.rootTeamfile,cwd:e.cwd??null,command:FX(e.receiverTeamfile,e.receiverAlias,e.prompt),holder_pid:process.pid,request_payload:e.prompt,parent_invocation_id:e.parentInvocationId,meta:JSON.stringify({provider:e.provider,model:e.model??null,sessionid:e.sessionId??null})}))).id}catch(n){return ce()&&$e(JSON.stringify({event:"tracked_invocation_start_error",error:n instanceof Error?n.message:String(n)})),null}}async function $X(t,e,n){try{await L(t,r=>{r.finishTrackedInvocation(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_finish_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function MX(t,e,n){try{await L(t,r=>{r.updateTrackedInvocationRequestPayload(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_request_payload_error",id:e,error:r instanceof Error?r.message:String(r)}))}}async function DX(t,e,n){try{await L(t,r=>{r.linkTrackedInvocationMessage(e,n)})}catch(r){ce()&&$e(JSON.stringify({event:"tracked_invocation_message_link_error",id:e,team_chat_log_id:n,error:r instanceof Error?r.message:String(r)}))}}function jX(t,e){if(e===null)return;let n=setInterval(()=>{L(t,r=>r.heartbeatTrackedInvocation(e)).catch(r=>{ce()&&$e(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:e,error:r instanceof Error?r.message:String(r)}))})},Zk);return n.unref?.(),n}function PX(t,e){return{status:"done",result_summary:Ti(t),error:null,team_chat_log_id:e}}function Hm(t,e){return{status:"busy",result_summary:Ti(t),error:t,team_chat_log_id:e}}function Rl(t,e,n){return{status:"error",result_summary:Ti(n===void 0?t:n),error:t,team_chat_log_id:e}}function Ti(t){let e=t.replace(/\s+/gu," ").trim();return e.length<=500?e:`${e.slice(0,497)}...`}function FX(t,e,n){return`lmctl chat ${JSON.stringify(t)} ${e} ${JSON.stringify(n)}`}function UX(t,e){let n=NS(e,t);if(n.ok)return{sender:Xe(n.identity),origin:"agent"};if(n.reason==="unset")return{sender:null,origin:"operator"};throw new Error(fn("chat"))}async function WX(t,e){if(e.explicitRoot!==void 0)return await L(t,r=>ve(e.explicitRoot,r));if(e.operatorOrigin||e.sender===null)return e.receiverTeamfile;let n=e.sender;return await L(t,r=>Dk(r,{sender:n,now:new Date})??e.receiverTeamfile)}async function qX(t,e){return await L(t,n=>Ok({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:BX(n,e.sender.teamfile,e.receiverTeamfile)}))}function BX(t,e,n){return{teams:[e,n].map(s=>HX(s,t))}}function HX(t,e){let n=rt(t,e),r=ht(n);return{teamfile:t,aliases:n.members.map(s=>s.alias),leadAlias:r?.alias??null}}async function XX(t,e){return await L(t,n=>{let r=ce(),s=vr(n,{receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,ttlMs:ls(),...e.force===!0?{force:!0}:{},...e.reclaimReason===void 0?{}:{reclaimReason:e.reclaimReason}});return s.acquired?(r&&$e(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:Yk(s.previous)}})),{acquired:!0,lease:s.lease,leaseId:s.leaseId}):(r&&$e(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Yk(s.current)})),{acquired:!1,current:s.current})})}async function eI(t,e,n){return await L(t,r=>{for(let i=0;i<2;i+=1){let o=r.getTerminalLock(e,n);if(o===null)return null;if(Wm(o).live)return o;let l=r.getAgentInflight(e,n);if(r.clearTerminalLock(e,n,o.lock_id))return l!==null&&l.sender_teamfile===e&&l.sender_alias==="terminal"&&r.clearObservedTerminalAgentInflight(e,n,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=r.getTerminalLock(e,n);return s===null?null:Wm(s).live?s:null})}function Yk(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}async function JX(t,e,n){try{await L(t,r=>{r.releaseAgentInflight(e,n)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2460
+ `)}}function tI(t,e,n){return`${e} is servicing ${n.sender_alias} (${n.sender_teamfile}) since ${n.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${t}" ${e}`}async function GX(t,e){let n=vi(e.message);try{return await L(t,r=>r.beginTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:null,origin:e.origin,status:"running",error_detail:null,truncated:n.truncated?1:0,created_at:new Date().toISOString()}))}catch(r){return t.stderr.write(`warning: failed to begin chat log: ${r instanceof Error?r.message:String(r)}
2461
+ `),null}}async function zk(t,e,n){let r=vi(n.message),s=n.response===null?null:vi(n.response);try{await L(t,i=>i.finishTeamChatLog(e,{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){t.stderr.write(`warning: failed to finish chat log ${e}: ${i instanceof Error?i.message:String(i)}
2462
+ `)}}async function KX(t,e,n){if(e!==null)try{await L(t,r=>{r.clearCurrentlyHandlingMessage(e.receiver_teamfile,e.receiver_alias,n)})}catch(r){t.stderr.write(`warning: failed to clear chat causal pointer: ${r instanceof Error?r.message:String(r)}
2463
+ `)}}async function VX(t,e){let n=vi(e.message),r=e.response===null?null:vi(e.response);try{return await L(t,s=>s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,receiver_provider:e.receiver_provider,receiver_session_id:e.receiver_session_id,provider_prompt:e.message,message:n.text,response:r?.text??null,origin:e.origin,status:e.status,error_detail:e.error_detail,truncated:n.truncated||r?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2464
+ `),null}}function cs(t,e,n,r,s){t!==null||e===null||M({event:"chat_attempt_error",reason:s,root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,origin:e.origin,error_detail:r,message_preview:Ti(n)})}function vi(t){return t.length<=Vk?{text:t,truncated:!1}:{text:t.slice(0,Vk),truncated:!0}}var Vk,Zk,nI=E(()=>{"use strict";yt();Vt();Ei();Lk();Yt();Pm();de();Ie();ct();di();Wk();qk();Bm();fi();dl();Kk();Ns();Vk=256*1024,Zk=3e4});var lI={};oe(lI,{parseIdleTimeoutMs:()=>oI,resolvePromptInput:()=>iI,runChat:()=>ZX});import{readFileSync as YX}from"node:fs";async function ZX(t,e={stdout:process.stdout,stderr:process.stderr}){let n=e.env??process.env;if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${rI}
2465
2465
  `),t.length===0?2:0;let r=QX(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2466
2466
  ${rI}
2467
2467
  `),2;if(r.promptFile!==void 0){let d=await iI(r.promptFile,e);if(typeof d!="string")return e.stderr.write(`error: ${d.error}
2468
2468
  `),2;r.prompt=d}if(r.runFlag!==void 0){let d=Number.parseInt(r.runFlag,10);return!Number.isFinite(d)||d<=0||String(d)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
2469
- `),2):await O(e,async f=>{let m=f.getRun(d);if(m===null)return e.stderr.write(`error: run ${d}: not found
2469
+ `),2):await L(e,async f=>{let m=f.getRun(d);if(m===null)return e.stderr.write(`error: run ${d}: not found
2470
2470
  `),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return k(e,`run ${d}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Ya(f,d);if(p===null)return e.stderr.write(`error: run ${d}: no pending operator-answerable attention (chat --run only resumes paused runs)
2471
2471
  `),1;if(p.kind==="workflow_escalation"){if(r.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
2472
2472
  `),2;let h=f.resumeEscalation(p.attention_id,r.prompt);return h.resumed===!0?(e.stdout.write(`run ${d}: escalation resumed (decision: ${r.prompt})
@@ -2498,7 +2498,7 @@ ${rI}
2498
2498
  `}`),f.status==="stalled"?1:0}catch(d){let f=d instanceof Error?d.message:String(d);return e.stderr.write(`error: ${f}
2499
2499
  `),1}}function sI(t){return`${t}'s turn has finished and exited; resubmit \`lmctl chat\` to continue (no persistent session is left running)`}function QX(t){let e=[],n="yolo",r,s,i,o,a,l,c=!1,u=!1,d=!1;for(let _=0;_<t.length;_+=1){let y=t[_];if(y==="--permission-mode"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --permission-mode";if(g!=="plan"&&g!=="yolo")return`--permission-mode must be one of plan|yolo (got "${g}")`;n=g;continue}if(y==="--idle-timeout"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --idle-timeout";let w=oI(g);if(typeof w=="string")return w;r=w;continue}if(y==="--session"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --session";s=g;continue}if(y==="--provider"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --provider";i=g;continue}if(y==="--from"||y.startsWith("--from="))return IS("chat");if(y.startsWith("I_am="))return`unknown argument: ${y}`;if(y==="--root"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --root";o=g;continue}if(y==="--prompt-file"){let g=t[++_];if(g===void 0||g!=="-"&&g.startsWith("--"))return"missing value for --prompt-file";a=g;continue}if(y==="--force"||y.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(y==="--json"){u=!0;continue}if(y==="--verbose"){d=!0;continue}if(y==="--run"){let g=t[++_];if(g===void 0||g.startsWith("--"))return"missing value for --run";l=g;continue}if(y==="--done"){c=!0;continue}if(y.startsWith("--"))return`unknown flag: ${y}`;e.push(y)}if(l!==void 0){if(s!==void 0)return"--run is mutually exclusive with --session";if(i!==void 0)return"--run is mutually exclusive with --provider";if(o!==void 0)return"--run is mutually exclusive with --root";if(a!==void 0&&e.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&e.length===0)return"a prompt (answer) is required with --run";if(e.length>1)return`--run takes exactly one positional (the answer); got ${e.length}`;let _={prompt:a!==void 0?"":e[0],permissionMode:n,runFlag:l,done:c,json:u,verbose:d};return a!==void 0&&(_.promptFile=a),_}let f,m,p;if(a!==void 0){if(e.length===0){if(s===void 0)return"expected <teamfile>:<alias> --prompt-file <path> | <teamfile> <alias> --prompt-file <path> | --session <id> --prompt-file <path>"}else if(e.length===1)f=e[0];else if(e.length===2)f=e[0],m=e[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";p=""}else{if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';p=e[0]}else if(e.length===2)f=e[0],p=e[1];else if(e.length===3)f=e[0],m=e[1],p=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let h={prompt:p,permissionMode:n};return f!==void 0&&(h.target=f),m!==void 0&&(h.alias=m),r!==void 0&&(h.idleTimeoutMs=r),s!==void 0&&(h.sessionFlag=s),i!==void 0&&(h.providerFlag=i),o!==void 0&&(h.rootFlag=o),a!==void 0&&(h.promptFile=a),u&&(h.json=u),d&&(h.verbose=d),h}async function iI(t,e,n=process.stdin){let r;try{r=t==="-"?await eJ(n):YX(t,"utf8")}catch(i){let o=i instanceof Error?i.message:String(i);return{error:`--prompt-file ${t}: ${o}`}}let s=r.endsWith(`\r
2500
2500
  `)?r.slice(0,-2):r.endsWith(`
2501
- `)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function eJ(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function oI(t){if(t==="0")return 0;if(/^\d+$/.test(t)){let i=Number(t);return i>0&&i<1e3?`--idle-timeout ${t} means ${t}ms, not ${t}s \u2014 that's not enough time for any real provider call to make progress. Use an explicit unit, e.g. --idle-timeout ${t}s.`:i}let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms >= 1000, or 0)`;let n=Number(e[1]),r=e[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function aI(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;$({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
2501
+ `)?r.slice(0,-1):r;return s.length===0?{error:`--prompt-file ${t}: file is empty; a prompt is required`}:s}async function eJ(t){let e=[];for await(let n of t)e.push(typeof n=="string"?Buffer.from(n,"utf8"):n);return Buffer.concat(e).toString("utf8")}function oI(t){if(t==="0")return 0;if(/^\d+$/.test(t)){let i=Number(t);return i>0&&i<1e3?`--idle-timeout ${t} means ${t}ms, not ${t}s \u2014 that's not enough time for any real provider call to make progress. Use an explicit unit, e.g. --idle-timeout ${t}s.`:i}let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d), integer ms >= 1000, or 0)`;let n=Number(e[1]),r=e[2];return n*(r==="s"?1e3:r==="m"?6e4:r==="h"?36e5:864e5)}function aI(t,e,n,r=!1){if(n.kind!=="tool_use"&&n.kind!=="tool_result"&&n.kind!=="api_retry")return;let s=n.kind==="tool_use"?`[${e}] tool_use ${n.tool??"tool"}${n.summary?`: ${n.summary}`:""}`:n.kind==="tool_result"?`[${e}] tool_result${n.status?` ${n.status}`:""}${n.summary?`: ${n.summary}`:""}`:`[${e}] api_retry${n.summary?`: ${n.summary}`:""}`;M({event:"chat_progress",alias:e,progress_kind:n.kind,line:s}),r&&t.stderr.write(`${s}
2502
2502
  `)}function tJ(t,e){return t.slice(-e)}function nJ(t,e,n=!1){e.kind==="delta"?t.stdout.write(e.chunk):e.kind==="progress"?aI(t,e.alias,e.event,n):t.stderr.write(e.message)}var zX,rI,cI=E(()=>{"use strict";mt();Ie();yt();nI();fi();de();za();on();zX={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},rI=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2503
2503
  lmctl chat <teamfile> <alias> "<prompt>"
2504
2504
  lmctl chat <sessionid> "<prompt>" --provider <name>
@@ -2531,8 +2531,8 @@ Safe input (no shell involved) \u2014 use for anything non-trivial:
2531
2531
  where unconditional narration would bleed into unrelated output).
2532
2532
 
2533
2533
  Send a prompt to a team member or raw provider session, or answer a paused run.`});function Si(t,e){if(t===void 0)return{date:void 0};let n=/^(\d+)([smhd])$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2],o=i==="s"?s:i==="m"?s*60:i==="h"?s*3600:s*86400;return{date:new Date(Date.now()-o*1e3)}}let r=Date.parse(t);return Number.isFinite(r)?{date:new Date(r)}:{error:`invalid ${e} "${t}" (expected ISO8601 or duration like 24h)`}}var Xm=E(()=>{"use strict"});var hI={};oe(hI,{buildSessionInspection:()=>ki,deriveToolCalls:()=>Ol,runSession:()=>cJ});async function cJ(t,e,n=oJ){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${mI}
2534
- `),0;let r=V(t,["--session","--provider","--since","--until","--limit"],[]);if(r.error!==void 0)return lt(e,r.error,!0);let s=Si(L(r,"--since"),"--since");if("error"in s)return lt(e,s.error,!0);let i=Si(L(r,"--until"),"--until");if("error"in i)return lt(e,i.error,!0);let o=L(r,"--limit"),a;if(o!==void 0&&(a=Number.parseInt(o,10),!Number.isFinite(a)||a<1||String(a)!==o))return lt(e,`invalid --limit "${o}" (expected a positive integer)`,!0);let l=gt(rJ,{target:r.positionals[0],alias:r.positionals[1],flags:{session:L(r,"--session"),provider:L(r,"--provider")}});if(l.mode==="error")return lt(e,l.message,!0);if(l.mode==="managed")return lt(e,"session does not support managed-mode targets",!0);let c,u,d,f;try{if(l.mode==="ai-team"){f=l.teamfile;let y=l.alias??await n.resolveLeadAlias(l.teamfile,e),g=await n.resolveTeamTarget(l.teamfile,y,e);c=g.provider,u=g.sessionid,d=g.alias}else if(u=l.sessionid,l.provider!==void 0)c=l.provider;else{let y=await zt(u);if(y.length===0)return lt(e,`session "${u}" not found in any provider store`,!0);if(y.length>1)return lt(e,`session "${u}" matches multiple providers (${y.join(", ")}); pass --provider`,!0);c=y[0]}}catch(y){return y instanceof Ee?lt(e,y.message,!0):lt(e,Jm(y))}let m;try{m=await n.loadSession(u,c)}catch(y){return lt(e,`failed to load session: ${Jm(y)}`)}if(m===null)return lt(e,`session not found: ${u} (provider=${c})`);let p=s.date?.getTime(),h=i.date?.getTime(),_=[];if(f!==void 0&&d!==void 0)try{_=await n.listInvocations(f,d,{sinceMs:p,untilMs:h},e)}catch(y){return lt(e,`failed to load invocation history: ${Jm(y)}`)}return H(e,ki(m,d,{invocations:_,sinceMs:p,untilMs:h,limit:a})),0}function ki(t,e,n={}){let r=EJ(t.messages),s=TJ(r,iJ),i=_J(t,r!==null),o=Ol(t),a=e?.toLowerCase()==="lead",l=o.filter(p=>p.kind==="file_write").length,c=o.filter(p=>p.kind==="file_edit").length,u=bi[t.provider],d=e===void 0?u==="none"?"none":"partial":u,f=dJ(t.messages,n.sinceMs,n.untilMs).filter(p=>p.role==="user"||p.role==="assistant").slice(-Math.max(1,Math.trunc(n.limit??sJ))).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:p.timestamp.toISOString()})),m=n.invocations??[];return{schema_version:fI,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:s.text,lastPromptTruncated:s.truncated,handled:i.value,handledSignal:i.signal,tokens:hJ(t),toolCalls:o,messages:f,invocations:m,authorship:{alias:e??null,isLeadAlias:a,selfFileWriteCount:l,selfFileEditCount:c,flag:a&&l+c>0?"lead_self_authoring":null},coverage:{toolCalls:bi[t.provider],resultPairing:pI[t.provider],backgroundTaskCorrelation:uJ(t.provider),authorship:d,tokens:aJ[t.provider],handled:i.coverage}}}function dJ(t,e,n){return e===void 0&&n===void 0?t:t.filter(r=>{let s=r.timestamp.getTime();return!(e!==void 0&&s<e||n!==void 0&&s>n)})}function uJ(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function Ol(t){if(bi[t.provider]==="none")return[];let e=lJ[t.provider]??{},n=new Set,r=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??vJ(i.toolInput),l=o===void 0?void 0:fJ(o,a),c=pJ(t.messages,s,i.toolCallId,n,t.provider==="agy"),u=c===void 0?void 0:t.messages[c];c!==void 0&&n.add(c);let d=o===void 0?[]:mJ(o,a),f=d.length>0?d:[{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"||m.kind==="network"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:u?.timestamp.toISOString()??null,result:u===void 0?null:u.toolDetailedContent??u.content})}return r}function fJ(t,e){if(e!==void 0)for(let n of[t.inputKey,...t.fallbackInputKeys??[]]){let r=Gm(e[n]);if(r!==void 0)return r}}function mJ(t,e){if(t.multi===void 0||e===void 0)return[];let n=e[t.multi.pathsKey],r=e[t.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=Gm(n[i]),a=Gm(r[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function pJ(t,e,n,r,s){if(n===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function _J(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let n=_I(t.messages,"user");return{value:n>=0&&t.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function hJ(t){let e=t.lastTokenUsage,n=yJ(t),r=wJ(t.provider);return{lastTurn:gJ(e),aggregate:{input:n,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:r}}function gJ(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function yJ(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function wJ(t){switch(t){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"};case"dsh":return{id:"dsh-independent-counters",note:"input excludes cacheRead (verified against real sessions); reasoning is a separate counter; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function EJ(t){let e=_I(t,"user");return e<0?null:t[e].content}function _I(t,e){for(let n=t.length-1;n>=0;n-=1)if(t[n].role===e)return n;return-1}function TJ(t,e){if(t===null)return{text:null,truncated:!1};let n=Buffer.from(t,"utf8");if(n.length<=e)return{text:t,truncated:!1};let r=e;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function vJ(t){if(t!==void 0)try{let e=JSON.parse(t);return SJ(e)?e:void 0}catch{return}}function SJ(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Gm(t){return typeof t=="string"?t:void 0}function lt(t,e,n=!1){return H(t,{schema_version:fI,error:e,...n?{usage:mI}:{}}),1}function Jm(t){return t instanceof Error?t.message:String(t)}var fI,rJ,sJ,iJ,mI,oJ,bi,pI,dI,aJ,uI,lJ,Ll=E(()=>{"use strict";wt();Ie();yt();Vt();Yt();Xm();fI=2,rJ={name:"session",allowsBareTeamfile:!0,supportsRaw:!0},sJ=500,iJ=32*1024,mI=["usage: lmctl session [target] [alias] [--since <duration|ISO8601>] [--until <duration|ISO8601>]"," lmctl session --session <id> --provider <name> [--since ...] [--until ...] [--limit N]","","Inspect one native provider session through a versioned JSON contract:","conversation messages, classified tool calls (shell/file/network), token","usage, and lmctl's own dispatch history (tracked_invocation) for the","same target. A bare <teamfile> with no alias inspects that team's Lead.","--since/--until bound `messages` by timestamp and `invocations` by","start time (duration like 24h, or an absolute ISO8601 timestamp).","--limit caps `messages` to the most recent N (default 500)."].join(`
2535
- `),oJ={loadSession:Ne,resolveTeamTarget:(t,e,n)=>O(n,r=>Me(t,e,r)),resolveLeadAlias:async(t,e)=>{let n=await O(e,i=>ve(t,i)),r=Fe(n),s=ht(r);if(s===void 0)throw new Error(`${t} has no Lead member; pass <tf>:<alias>`);return s.alias},listInvocations:(t,e,n,r)=>O(r,s=>s.listTrackedInvocationsForTarget(t,e,n).map(i=>({id:i.id,kind:i.kind,origin:i.origin,status:i.status,from_identity:i.from_identity,command:i.command,started_at:i.started_at,ended_at:i.ended_at,exit_code:i.exit_code,error:i.error})))},bi={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",dsh:"full",ClaudeMock:"none"},pI={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",dsh:"full",ClaudeMock:"none"},dI={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(bi))if(dI[pI[t]]>dI[bi[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);aJ={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",dsh:"partial",ClaudeMock:"none"},uI={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"]}},lJ={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"},WebFetch:{kind:"network",inputKey:"url"},WebSearch:{kind:"network",inputKey:"query"}},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:uI,lmplayer:uI,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"}},dsh:{bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"file_path"},write:{kind:"file_write",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 Km(t){let e;try{e=$J(t)}catch{return[{kind:"mutate",note:"shell command could not be parsed"}]}let n=[],r="",s=!1;for(let i=0;i<e.length;i+=1){let a=e[i].command;if(a.argv.length===0&&a.redirects.length===0)continue;let l=TI(a.argv),c=l===a.argv?a:{...a,argv:l},u=Ii(c.argv[0]?.text??"");if(u==="cd"){let f=c.argv[1];f===void 0?s=!0:f.literal?r=kI(r,f.text):s=!0;continue}if(bJ.has(c.argv[0]?.text??"")){n.push({kind:"mutate",note:`compound shell construct not analyzed: ${Je(t)}`});break}let d=jJ(c);if(d!==null){let f=d.literal?Km(d.text):[{kind:"mutate",note:"sh -c script involves expansion; not analyzed"}];n.push(...f.map(m=>wI(m,r,s)));continue}n.push(...RJ(c,u,bI(e,i)).map(f=>wI(f,r,s)))}return n}function RJ(t,e,n){let r=[],s=t.redirects.filter(o=>o.fd===1||o.fd==="&"),i=t.redirects.filter(o=>o.fd===2);for(let o of i){let a=yI(o);a!=="ignored"&&r.push(a===null?{kind:"mutate",note:`stderr redirect target not literal: ${Je(t.raw)}`}:{kind:"mutate",path:a,note:"file receives command stderr; content not reconstructable"})}if(s.length>0){let o=vI(t,e,n);for(let a of s){let l=yI(a);l!=="ignored"&&(l===null?r.push({kind:"mutate",note:`redirect target not literal: ${Je(t.raw)}`}):o===null||t.hasSubstitution?r.push({kind:"mutate",path:l,note:`content not reconstructable from: ${Je(t.raw)}`}):r.push({kind:a.op===">>"?"append":"write",path:l,content:o}))}return r}if(r.push(...LJ(t,e,n)),r.length===0&&OJ(t,e)){let o=t.argv.slice(1).map(a=>a.text).filter(a=>a.length>0);o.length>0&&r.push({kind:"opaque",tokens:o,command:Je(t.raw)})}return r}function OJ(t,e){return e===""||xJ.has(e)?!1:NJ.has(e)?e==="find"?t.argv.some(n=>n.text==="-delete"||n.text==="-exec"||n.text==="-execdir"||n.text==="-ok"):!1:!0}function TI(t){let e=0;for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1;for(;e<t.length&&IJ.has(Ii(t[e].text));){let n=Ii(t[e].text);for(e+=1;e<t.length&&t[e].text.startsWith("-");)e+=1;if(n==="timeout"&&e<t.length&&/^\d/.test(t[e].text)&&(e+=1),n==="env")for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1}return e===0?t:t.slice(e)}function vI(t,e,n){if(t.hasSubstitution)return null;let r=t.argv.slice(1);if(e==="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?`
2534
+ `),0;let r=Y(t,["--session","--provider","--since","--until","--limit"],[]);if(r.error!==void 0)return lt(e,r.error,!0);let s=Si(C(r,"--since"),"--since");if("error"in s)return lt(e,s.error,!0);let i=Si(C(r,"--until"),"--until");if("error"in i)return lt(e,i.error,!0);let o=C(r,"--limit"),a;if(o!==void 0&&(a=Number.parseInt(o,10),!Number.isFinite(a)||a<1||String(a)!==o))return lt(e,`invalid --limit "${o}" (expected a positive integer)`,!0);let l=gt(rJ,{target:r.positionals[0],alias:r.positionals[1],flags:{session:C(r,"--session"),provider:C(r,"--provider")}});if(l.mode==="error")return lt(e,l.message,!0);if(l.mode==="managed")return lt(e,"session does not support managed-mode targets",!0);let c,u,d,f;try{if(l.mode==="ai-team"){f=l.teamfile;let y=l.alias??await n.resolveLeadAlias(l.teamfile,e),g=await n.resolveTeamTarget(l.teamfile,y,e);c=g.provider,u=g.sessionid,d=g.alias}else if(u=l.sessionid,l.provider!==void 0)c=l.provider;else{let y=await zt(u);if(y.length===0)return lt(e,`session "${u}" not found in any provider store`,!0);if(y.length>1)return lt(e,`session "${u}" matches multiple providers (${y.join(", ")}); pass --provider`,!0);c=y[0]}}catch(y){return y instanceof Ee?lt(e,y.message,!0):lt(e,Jm(y))}let m;try{m=await n.loadSession(u,c)}catch(y){return lt(e,`failed to load session: ${Jm(y)}`)}if(m===null)return lt(e,`session not found: ${u} (provider=${c})`);let p=s.date?.getTime(),h=i.date?.getTime(),_=[];if(f!==void 0&&d!==void 0)try{_=await n.listInvocations(f,d,{sinceMs:p,untilMs:h},e)}catch(y){return lt(e,`failed to load invocation history: ${Jm(y)}`)}return J(e,ki(m,d,{invocations:_,sinceMs:p,untilMs:h,limit:a})),0}function ki(t,e,n={}){let r=EJ(t.messages),s=TJ(r,iJ),i=_J(t,r!==null),o=Ol(t),a=e?.toLowerCase()==="lead",l=o.filter(p=>p.kind==="file_write").length,c=o.filter(p=>p.kind==="file_edit").length,u=bi[t.provider],d=e===void 0?u==="none"?"none":"partial":u,f=dJ(t.messages,n.sinceMs,n.untilMs).filter(p=>p.role==="user"||p.role==="assistant").slice(-Math.max(1,Math.trunc(n.limit??sJ))).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:p.timestamp.toISOString()})),m=n.invocations??[];return{schema_version:fI,provider:t.provider,sessionId:t.sessionId,modifiedAt:t.modifiedAt.toISOString(),lastPrompt:s.text,lastPromptTruncated:s.truncated,handled:i.value,handledSignal:i.signal,tokens:hJ(t),toolCalls:o,messages:f,invocations:m,authorship:{alias:e??null,isLeadAlias:a,selfFileWriteCount:l,selfFileEditCount:c,flag:a&&l+c>0?"lead_self_authoring":null},coverage:{toolCalls:bi[t.provider],resultPairing:pI[t.provider],backgroundTaskCorrelation:uJ(t.provider),authorship:d,tokens:aJ[t.provider],handled:i.coverage}}}function dJ(t,e,n){return e===void 0&&n===void 0?t:t.filter(r=>{let s=r.timestamp.getTime();return!(e!==void 0&&s<e||n!==void 0&&s>n)})}function uJ(t){return t==="claude"||t==="kimi"||t==="agy"?"full":t==="copilot"?"partial":"none"}function Ol(t){if(bi[t.provider]==="none")return[];let e=lJ[t.provider]??{},n=new Set,r=[];for(let s=0;s<t.messages.length;s+=1){let i=t.messages[s];if(i.role!=="tool_use"||!i.toolName)continue;let o=e[i.toolName],a=i.toolInputData??vJ(i.toolInput),l=o===void 0?void 0:fJ(o,a),c=pJ(t.messages,s,i.toolCallId,n,t.provider==="agy"),u=c===void 0?void 0:t.messages[c];c!==void 0&&n.add(c);let d=o===void 0?[]:mJ(o,a),f=d.length>0?d:[{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"||m.kind==="network"?{path:m.value??null}:{},callId:i.toolCallId??null,backgroundTaskId:i.backgroundTaskId??null,startedAt:i.timestamp.toISOString(),endedAt:u?.timestamp.toISOString()??null,result:u===void 0?null:u.toolDetailedContent??u.content})}return r}function fJ(t,e){if(e!==void 0)for(let n of[t.inputKey,...t.fallbackInputKeys??[]]){let r=Gm(e[n]);if(r!==void 0)return r}}function mJ(t,e){if(t.multi===void 0||e===void 0)return[];let n=e[t.multi.pathsKey],r=e[t.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=Gm(n[i]),a=Gm(r[i]),l=a===void 0?void 0:t.multi.kindByValue[a];o!==void 0&&l!==void 0&&s.push({kind:l,value:o})}return s}function pJ(t,e,n,r,s){if(n===void 0)return;let i=s?0:e+1;for(let o=i;o<t.length;o+=1){let a=t[o];if(!r.has(o)&&a.role==="tool_result"&&a.toolCallId===n)return o}}function _J(t,e){if(!e)return{value:null,signal:"unavailable",coverage:"unavailable"};if(t.turnStatus!==void 0){let s=t.provider==="claude"?"native_stop_reason":t.turnStatus==="complete"?"native_task_complete":t.turnStatus==="aborted"?"native_turn_aborted":"native_task_started";return{value:t.turnStatus==="complete",signal:s,coverage:"native"}}let n=_I(t.messages,"user");return{value:n>=0&&t.messages.slice(n+1).some(s=>s.role==="assistant"),signal:"heuristic",coverage:"heuristic"}}function hJ(t){let e=t.lastTokenUsage,n=yJ(t),r=wJ(t.provider);return{lastTurn:gJ(e),aggregate:{input:n,output:t.totalOutputTokens??null,cacheRead:t.totalCachedInputTokens??null,cacheWrite:t.totalCacheWriteInputTokens??null},normalization:r}}function gJ(t){return{input:t?.inputTokens??null,output:t?.outputTokens??null,cacheRead:t?.cachedInputTokens??null,cacheWrite:t?.cacheWriteInputTokens??null}}function yJ(t){return t.totalInputTokens===void 0?null:t.provider==="claude"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)-(t.totalCacheWriteInputTokens??0)):t.provider==="gemini"||t.provider==="qwen"?Math.max(0,t.totalInputTokens-(t.totalCachedInputTokens??0)):t.totalInputTokens}function wJ(t){switch(t){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"};case"dsh":return{id:"dsh-independent-counters",note:"input excludes cacheRead (verified against real sessions); reasoning is a separate counter; no cache-write counter exists upstream"};default:return{id:"unavailable",note:"this provider reader does not expose token usage in Phase 1"}}}function EJ(t){let e=_I(t,"user");return e<0?null:t[e].content}function _I(t,e){for(let n=t.length-1;n>=0;n-=1)if(t[n].role===e)return n;return-1}function TJ(t,e){if(t===null)return{text:null,truncated:!1};let n=Buffer.from(t,"utf8");if(n.length<=e)return{text:t,truncated:!1};let r=e;for(;r>0&&(n[r]&192)===128;)r-=1;return{text:n.subarray(0,r).toString("utf8"),truncated:!0}}function vJ(t){if(t!==void 0)try{let e=JSON.parse(t);return SJ(e)?e:void 0}catch{return}}function SJ(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Gm(t){return typeof t=="string"?t:void 0}function lt(t,e,n=!1){return J(t,{schema_version:fI,error:e,...n?{usage:mI}:{}}),1}function Jm(t){return t instanceof Error?t.message:String(t)}var fI,rJ,sJ,iJ,mI,oJ,bi,pI,dI,aJ,uI,lJ,Ll=E(()=>{"use strict";wt();Ie();yt();Vt();Yt();Xm();fI=2,rJ={name:"session",allowsBareTeamfile:!0,supportsRaw:!0},sJ=500,iJ=32*1024,mI=["usage: lmctl session [target] [alias] [--since <duration|ISO8601>] [--until <duration|ISO8601>]"," lmctl session --session <id> --provider <name> [--since ...] [--until ...] [--limit N]","","Inspect one native provider session through a versioned JSON contract:","conversation messages, classified tool calls (shell/file/network), token","usage, and lmctl's own dispatch history (tracked_invocation) for the","same target. A bare <teamfile> with no alias inspects that team's Lead.","--since/--until bound `messages` by timestamp and `invocations` by","start time (duration like 24h, or an absolute ISO8601 timestamp).","--limit caps `messages` to the most recent N (default 500)."].join(`
2535
+ `),oJ={loadSession:Ne,resolveTeamTarget:(t,e,n)=>L(n,r=>Me(t,e,r)),resolveLeadAlias:async(t,e)=>{let n=await L(e,i=>ve(t,i)),r=Fe(n),s=ht(r);if(s===void 0)throw new Error(`${t} has no Lead member; pass <tf>:<alias>`);return s.alias},listInvocations:(t,e,n,r)=>L(r,s=>s.listTrackedInvocationsForTarget(t,e,n).map(i=>({id:i.id,kind:i.kind,origin:i.origin,status:i.status,from_identity:i.from_identity,command:i.command,started_at:i.started_at,ended_at:i.ended_at,exit_code:i.exit_code,error:i.error})))},bi={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"full",kimi:"full",dsh:"full",ClaudeMock:"none"},pI={claude:"full",codex:"partial",gemini:"none",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"partial",kimi:"full",dsh:"full",ClaudeMock:"none"},dI={none:0,heuristic:1,partial:2,full:3};for(let t of Object.keys(bi))if(dI[pI[t]]>dI[bi[t]])throw new Error(`invalid session coverage for ${t}: result pairing exceeds tool-call coverage`);aJ={claude:"full",codex:"partial",gemini:"partial",copilot:"partial",opencode:"full",lmplayer:"full",qwen:"partial",agy:"none",kimi:"full",dsh:"partial",ClaudeMock:"none"},uI={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"]}},lJ={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"},WebFetch:{kind:"network",inputKey:"url"},WebSearch:{kind:"network",inputKey:"query"}},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:uI,lmplayer:uI,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"}},dsh:{bash:{kind:"shell",inputKey:"command"},read:{kind:"file_read",inputKey:"file_path"},write:{kind:"file_write",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 Km(t){let e;try{e=$J(t)}catch{return[{kind:"mutate",note:"shell command could not be parsed"}]}let n=[],r="",s=!1;for(let i=0;i<e.length;i+=1){let a=e[i].command;if(a.argv.length===0&&a.redirects.length===0)continue;let l=TI(a.argv),c=l===a.argv?a:{...a,argv:l},u=Ii(c.argv[0]?.text??"");if(u==="cd"){let f=c.argv[1];f===void 0?s=!0:f.literal?r=kI(r,f.text):s=!0;continue}if(bJ.has(c.argv[0]?.text??"")){n.push({kind:"mutate",note:`compound shell construct not analyzed: ${Je(t)}`});break}let d=jJ(c);if(d!==null){let f=d.literal?Km(d.text):[{kind:"mutate",note:"sh -c script involves expansion; not analyzed"}];n.push(...f.map(m=>wI(m,r,s)));continue}n.push(...RJ(c,u,bI(e,i)).map(f=>wI(f,r,s)))}return n}function RJ(t,e,n){let r=[],s=t.redirects.filter(o=>o.fd===1||o.fd==="&"),i=t.redirects.filter(o=>o.fd===2);for(let o of i){let a=yI(o);a!=="ignored"&&r.push(a===null?{kind:"mutate",note:`stderr redirect target not literal: ${Je(t.raw)}`}:{kind:"mutate",path:a,note:"file receives command stderr; content not reconstructable"})}if(s.length>0){let o=vI(t,e,n);for(let a of s){let l=yI(a);l!=="ignored"&&(l===null?r.push({kind:"mutate",note:`redirect target not literal: ${Je(t.raw)}`}):o===null||t.hasSubstitution?r.push({kind:"mutate",path:l,note:`content not reconstructable from: ${Je(t.raw)}`}):r.push({kind:a.op===">>"?"append":"write",path:l,content:o}))}return r}if(r.push(...LJ(t,e,n)),r.length===0&&OJ(t,e)){let o=t.argv.slice(1).map(a=>a.text).filter(a=>a.length>0);o.length>0&&r.push({kind:"opaque",tokens:o,command:Je(t.raw)})}return r}function OJ(t,e){return e===""||xJ.has(e)?!1:NJ.has(e)?e==="find"?t.argv.some(n=>n.text==="-delete"||n.text==="-exec"||n.text==="-execdir"||n.text==="-ok"):!1:!0}function TI(t){let e=0;for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1;for(;e<t.length&&IJ.has(Ii(t[e].text));){let n=Ii(t[e].text);for(e+=1;e<t.length&&t[e].text.startsWith("-");)e+=1;if(n==="timeout"&&e<t.length&&/^\d/.test(t[e].text)&&(e+=1),n==="env")for(;e<t.length&&/^[A-Za-z_][A-Za-z0-9_]*=/.test(t[e].text);)e+=1}return e===0?t:t.slice(e)}function vI(t,e,n){if(t.hasSubstitution)return null;let r=t.argv.slice(1);if(e==="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?`
2536
2536
  `:""):null}if(e==="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
2537
2537
  `?r.slice(1).map(i=>`${i.text}
2538
2538
  `).join(""):null}return e==="cat"?r.filter(i=>!i.text.startsWith("-")).length>0?null:t.heredoc!==void 0?t.heredoc.safe?t.heredoc.body:null:n!==null?n:null:e===""?"":null}function LJ(t,e,n){let r=t.argv.slice(1),s=r.filter(o=>!o.text.startsWith("-")),i=r.filter(o=>o.text.startsWith("-")).map(o=>o.text).join(" ");switch(e){case"tee":{let o=i.includes("a"),a=[],l=t.heredoc!==void 0?t.heredoc.safe?t.heredoc.body:null:n;for(let c of s)c.literal?l===null||t.hasSubstitution?a.push({kind:"mutate",path:c.text,note:`tee content not reconstructable from: ${Je(t.raw)}`}):a.push({kind:o?"append":"write",path:c.text,content:l}):a.push({kind:"mutate",note:`tee target not literal: ${Je(t.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: ${Je(t.raw)})`})}case"mv":case"cp":{let o=/[rR]/.test(i);if(s.length!==2||s.some(c=>!c.literal)||e==="cp"&&o)return[{kind:"mutate",note:`${e} form not analyzed: ${Je(t.raw)}`}];let[a,l]=[s[0].text,s[1].text];return[e==="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: ${Je(t.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: ${Je(t.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:`${e} -i with no identifiable path: ${Je(t.raw)}`}]:a.map(l=>({kind:"mutate",...l.literal?{path:l.text}:{},note:`${e} -i edit not reconstructable: ${Je(t.raw)}`}))}case"ln":case"install":case"rsync":case"patch":case"unzip":case"dd":return[{kind:"mutate",note:`${e} invocation not analyzed: ${Je(t.raw)}`}];case"tar":return/x/.test(r[0]?.text??"")?[{kind:"mutate",note:`tar extraction not analyzed: ${Je(t.raw)}`}]:[];case"git":{let o=CJ(r);return o!==void 0&&AJ.has(o)?[]:[{kind:"mutate",note:`git ${o??"command"} may modify working-tree files: ${Je(t.raw)}`}]}default:return[]}}function CJ(t){let e=new Set(["-C","-c","--git-dir","--work-tree","--namespace","--super-prefix","--config-env","--exec-path"]);for(let n=0;n<t.length;n+=1){let r=t[n].text;if(r==="--version"||r==="--help")return r;if(e.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 $J(t){let e=[],n=gI(),r=null,s="",i=!0,o=!1,a=[],l=[0],c=()=>{o&&(n.argv.push({text:s,literal:i}),s="",i=!0,o=!1)},u=(f,m)=>{c(),n.raw=t.slice(l[l.length-1],m).trim(),e.push({command:n,connector:r}),r=f,n=gI(),l.push(m+1)},d=0;for(;d<t.length;){let f=t[d];if(f==="'"){let m=t.indexOf("'",d+1);if(m===-1)throw new Error("unterminated single quote");s+=t.slice(d+1,m),o=!0,d=m+1;continue}if(f==='"'){let m=SI(t,d+1);if(m===-1)throw new Error("unterminated double quote");let p=t.slice(d+1,m);/[$`]/.test(p)&&(i=!1),s+=p.replace(/\\([$`"\\])/g,"$1"),o=!0,d=m+1;continue}if(f==="\\"){if(d+1<t.length){let m=t[d+1];if(m===`
@@ -2554,29 +2554,29 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
2554
2554
  `);t===""&&(r=[]);let s=0;for(let i of e){if(i.oldLines.length===0){if(r.length===0){r=[...i.newLines],s=r.length;continue}return null}let o=UJ(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(`
2555
2555
  `)}
2556
2556
  `}function FJ(t){let e=t.slice(2).trim();return e===""?void 0:e}function UJ(t,e,n){let r=e.scope,s=r!==void 0&&e.oldLines[0]!==r,i=s?[r,...e.oldLines]:e.oldLines,o=s?1:0,a=new Set;return AI(t,i,n,o,a),n>0&&AI(t,i,0,o,a,n),a.size!==1?-1:[...a][0]}function AI(t,e,n,r,s,i=t.length-e.length+1){let o=Math.min(i,t.length-e.length+1);e:for(let a=n;a<o;a+=1){for(let l=0;l<e.length;l+=1)if(t[a+l]!==e[l])continue e;s.add(a+r)}}var NI,PJ,OI=E(()=>{"use strict";NI="*** Begin Patch",PJ="*** End Patch"});var WI={};oe(WI,{extractRestoreOps:()=>UI,runRestore:()=>ZJ});import{existsSync as Vm,lstatSync as WJ,realpathSync as qJ}from"node:fs";import{lstat as $l,mkdir as Ym,mkdtemp as BJ,readFile as HJ,rename as XJ,rm as JJ,stat as GJ,utimes as $I,writeFile as MI}from"node:fs/promises";import{basename as DI,dirname as Ul,isAbsolute as Dl,join as KJ,relative as zm,resolve as pn}from"node:path";async function ZJ(t,e,n=zJ){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ds}
2557
- `),0;let r=V(t.filter(v=>v!=="--"),["--target","--dir"],["--force","--dry-run","--single-session","--recursive","--json"]);if(r.error!==void 0)return k(e,`${r.error}
2557
+ `),0;let r=Y(t.filter(S=>S!=="--"),["--target","--dir"],["--force","--dry-run","--single-session","--recursive","--json"]);if(r.error!==void 0)return k(e,`${r.error}
2558
2558
 
2559
- ${ds}`);let s=L(r,"--dir");if(s!==void 0)return r.positionals.length>0?k(e,`--dir targets a directory and takes no <teamfile>/<alias>
2559
+ ${ds}`);let s=C(r,"--dir");if(s!==void 0)return r.positionals.length>0?k(e,`--dir targets a directory and takes no <teamfile>/<alias>
2560
2560
 
2561
- ${ds}`):B(r,"--single-session")?k(e,"--single-session applies to <teamfile> <alias> targeting; --dir always merges every discovered session"):QJ(s,r,e,n);if(B(r,"--recursive"))return k(e,`--recursive requires --dir
2561
+ ${ds}`):X(r,"--single-session")?k(e,"--single-session applies to <teamfile> <alias> targeting; --dir always merges every discovered session"):QJ(s,r,e,n);if(X(r,"--recursive"))return k(e,`--recursive requires --dir
2562
2562
 
2563
2563
  ${ds}`);if(r.positionals.length===0)return k(e,`restore requires a <teamfile> (or --dir <path>)
2564
2564
 
2565
2565
  ${ds}`);if(r.positionals.length>2)return k(e,`unexpected argument: ${r.positionals[2]}`);let i=r.positionals[0],o=fr(i),a=o?.teamfile??i,l=r.positionals[1],c=o?.alias??l;if(o!==null&&l!==void 0)return k(e,"restore alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(c===void 0)return k(e,`restore requires an <alias>
2566
2566
 
2567
- ${ds}`);let u;try{u=await n.resolveTeamTarget(a,c,e)}catch(v){if(v instanceof Ee)return k(e,v.message);throw v}let d;try{d=await n.loadSession(u.sessionid,u.provider)}catch(v){return k(e,`failed to load session: ${Fl(v)}`)}if(d===null)return k(e,`session not found: ${u.sessionid} (provider=${u.provider})`);let f=B(r,"--dry-run"),m=B(r,"--force"),p=B(r,"--single-session")||n.resolveTeamRoster===void 0,h=L(r,"--target"),_=h===void 0?void 0:pn(h),y=p?[u]:eG([u,...await n.resolveTeamRoster(a,e)]),g=[],w=[],S=[];for(let v of y){if(v.sessionid===u.sessionid){S.push({member:v,detail:d}),w.push(gr(v,"target",0));continue}try{let M=await n.loadSession(v.sessionid,v.provider);if(M===null){w.push(gr(v,"not_found",0)),g.push(`team member ${v.alias}: session ${v.sessionid} not found \u2014 its file history is missing from this recovery`);continue}S.push({member:v,detail:M}),w.push(gr(v,"merged",0))}catch(M){w.push(gr(v,"load_error",0)),g.push(`team member ${v.alias}: session load failed (${Fl(M)}) \u2014 its file history is missing from this recovery`)}}let I={toolCalls:ki(d).coverage.toolCalls,structuredReplay:jI[d.provider],shellScan:Zm[d.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...jl[d.provider]!==void 0?{structuredNote:jl[d.provider]}:{},shellNote:PI};return FI(e,{json:B(r,"--json"),dryRun:f,force:m,absTarget:_,loaded:S,members:w,loadWarnings:g,coverage:I,mode:p?"single_session":"team",headerJson:{provider:d.provider,sessionId:d.sessionId,sessionCwd:d.cwd},describe:p?" (single session)":` from ${S.length} team session(s)`})}function CI(t){let e=pn(t),n=[];for(;;)try{return KJ(qJ(e),...n.reverse())}catch{let r=Ul(e);if(r===e)return pn(t);n.push(DI(e)),e=r}}async function QJ(t,e,n,r){if(r.discoverSessions===void 0)return k(n,"--dir is not available: session discovery is not wired in this harness");let s=CI(t),i=B(e,"--recursive"),o;try{o=await r.discoverSessions()}catch(g){return k(n,`session discovery failed: ${Fl(g)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],u=0,d=0,f=0;for(let g of o){let w=`${g.provider}:${g.sessionId}`;if(l.has(w)){f+=1;continue}if(l.add(w),typeof g.cwd!="string"||g.cwd.trim()===""){u+=1;continue}let S=CI(g.cwd);S===s||i&&S.startsWith(a)?c.push(g):d+=1}if(c.sort((g,w)=>g.createdAt.getTime()-w.createdAt.getTime()),c.length===0)return k(n,`no provider sessions recorded working directory ${s}${i?" (or its subdirectories)":""} \u2014 checked ${o.length} session(s); ${u} had no recorded cwd`);let m=[],p=[],h=[];for(let g of c){let w={teamfile:"",alias:`${g.provider}:${g.sessionId}`,provider:g.provider,sessionid:g.sessionId,sessiondir:g.cwd,isLead:!1};try{let S=await r.loadSession(g.sessionId,g.provider);if(S===null){p.push(gr(w,"not_found",0)),m.push(`session ${w.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}h.push({member:w,detail:S}),p.push(gr(w,"merged",0))}catch(S){p.push(gr(w,"load_error",0)),m.push(`session ${w.alias}: load failed (${Fl(S)}) \u2014 its file history is missing from this recovery`)}}let y={crossSession:"directory_merged",providers:[...new Set(h.map(g=>g.detail.provider))].map(g=>({provider:g,structuredReplay:jI[g],shellScan:Zm[g]!==void 0?"best_effort":"none",...jl[g]!==void 0?{structuredNote:jl[g]}:{}})),shellNote:PI};return FI(n,{json:B(e,"--json"),dryRun:B(e,"--dry-run"),force:B(e,"--force"),absTarget:L(e,"--target")===void 0?void 0:pn(L(e,"--target")),loaded:h,members:p,loadWarnings:m,coverage:y,mode:"directory",headerJson:{dir:s,recursive:i,discovery:{sessionsScanned:o.length,duplicates:f,matched:c.length,merged:h.length,excludedNoCwd:u,excludedOutsideDir:d}},describe:` from ${h.length} session(s) recorded in ${s}`})}async function FI(t,e){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=e,l=tG(i);for(let h of o)h.fileOps=l.filter(_=>_.alias===h.alias).length;let{files:c,warnings:u}=await iG(l,{dryRun:n,force:r,targetDir:s}),d=[...a,...u],f=i.flatMap(({member:h,detail:_})=>lG(_,l.filter(y=>y.alias===h.alias),h.alias)),m={files:c.length,written:c.filter(h=>h.action==="written").length,wouldWrite:c.filter(h=>h.action==="would_write").length,skipped:c.filter(h=>h.action==="skipped").length,unreplayable:c.filter(h=>h.action==="unreplayable").length,stitchedFiles:c.filter(h=>h.aliases.length>1).length,unreplayedCalls:f.length,warnings:d.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(e.json)H(t,{schema_version:VJ,...e.headerJson,target:s??null,dryRun:n,force:r,mode:e.mode,members:o,coverage:e.coverage,summary:m,files:c,unreplayedCalls:f,warnings:d});else{for(let h of c){let _=h.aliases.length>1?` [stitched: ${h.aliases.join("+")}]`:"",y=h.detail===null?"":` \u2014 ${h.detail}`;t.stdout.write(`${h.path}: ${h.action} (${h.reason})${_}${y}
2567
+ ${ds}`);let u;try{u=await n.resolveTeamTarget(a,c,e)}catch(S){if(S instanceof Ee)return k(e,S.message);throw S}let d;try{d=await n.loadSession(u.sessionid,u.provider)}catch(S){return k(e,`failed to load session: ${Fl(S)}`)}if(d===null)return k(e,`session not found: ${u.sessionid} (provider=${u.provider})`);let f=X(r,"--dry-run"),m=X(r,"--force"),p=X(r,"--single-session")||n.resolveTeamRoster===void 0,h=C(r,"--target"),_=h===void 0?void 0:pn(h),y=p?[u]:eG([u,...await n.resolveTeamRoster(a,e)]),g=[],w=[],v=[];for(let S of y){if(S.sessionid===u.sessionid){v.push({member:S,detail:d}),w.push(gr(S,"target",0));continue}try{let O=await n.loadSession(S.sessionid,S.provider);if(O===null){w.push(gr(S,"not_found",0)),g.push(`team member ${S.alias}: session ${S.sessionid} not found \u2014 its file history is missing from this recovery`);continue}v.push({member:S,detail:O}),w.push(gr(S,"merged",0))}catch(O){w.push(gr(S,"load_error",0)),g.push(`team member ${S.alias}: session load failed (${Fl(O)}) \u2014 its file history is missing from this recovery`)}}let N={toolCalls:ki(d).coverage.toolCalls,structuredReplay:jI[d.provider],shellScan:Zm[d.provider]!==void 0?"best_effort":"none",crossSession:p?"single_session":"team_merged",...jl[d.provider]!==void 0?{structuredNote:jl[d.provider]}:{},shellNote:PI};return FI(e,{json:X(r,"--json"),dryRun:f,force:m,absTarget:_,loaded:v,members:w,loadWarnings:g,coverage:N,mode:p?"single_session":"team",headerJson:{provider:d.provider,sessionId:d.sessionId,sessionCwd:d.cwd},describe:p?" (single session)":` from ${v.length} team session(s)`})}function CI(t){let e=pn(t),n=[];for(;;)try{return KJ(qJ(e),...n.reverse())}catch{let r=Ul(e);if(r===e)return pn(t);n.push(DI(e)),e=r}}async function QJ(t,e,n,r){if(r.discoverSessions===void 0)return k(n,"--dir is not available: session discovery is not wired in this harness");let s=CI(t),i=X(e,"--recursive"),o;try{o=await r.discoverSessions()}catch(g){return k(n,`session discovery failed: ${Fl(g)}`)}let a=s.endsWith("/")?s:`${s}/`,l=new Set,c=[],u=0,d=0,f=0;for(let g of o){let w=`${g.provider}:${g.sessionId}`;if(l.has(w)){f+=1;continue}if(l.add(w),typeof g.cwd!="string"||g.cwd.trim()===""){u+=1;continue}let v=CI(g.cwd);v===s||i&&v.startsWith(a)?c.push(g):d+=1}if(c.sort((g,w)=>g.createdAt.getTime()-w.createdAt.getTime()),c.length===0)return k(n,`no provider sessions recorded working directory ${s}${i?" (or its subdirectories)":""} \u2014 checked ${o.length} session(s); ${u} had no recorded cwd`);let m=[],p=[],h=[];for(let g of c){let w={teamfile:"",alias:`${g.provider}:${g.sessionId}`,provider:g.provider,sessionid:g.sessionId,sessiondir:g.cwd,isLead:!1};try{let v=await r.loadSession(g.sessionId,g.provider);if(v===null){p.push(gr(w,"not_found",0)),m.push(`session ${w.alias}: discovered but not loadable \u2014 its file history is missing from this recovery`);continue}h.push({member:w,detail:v}),p.push(gr(w,"merged",0))}catch(v){p.push(gr(w,"load_error",0)),m.push(`session ${w.alias}: load failed (${Fl(v)}) \u2014 its file history is missing from this recovery`)}}let y={crossSession:"directory_merged",providers:[...new Set(h.map(g=>g.detail.provider))].map(g=>({provider:g,structuredReplay:jI[g],shellScan:Zm[g]!==void 0?"best_effort":"none",...jl[g]!==void 0?{structuredNote:jl[g]}:{}})),shellNote:PI};return FI(n,{json:X(e,"--json"),dryRun:X(e,"--dry-run"),force:X(e,"--force"),absTarget:C(e,"--target")===void 0?void 0:pn(C(e,"--target")),loaded:h,members:p,loadWarnings:m,coverage:y,mode:"directory",headerJson:{dir:s,recursive:i,discovery:{sessionsScanned:o.length,duplicates:f,matched:c.length,merged:h.length,excludedNoCwd:u,excludedOutsideDir:d}},describe:` from ${h.length} session(s) recorded in ${s}`})}async function FI(t,e){let{dryRun:n,force:r,absTarget:s,loaded:i,members:o,loadWarnings:a}=e,l=tG(i);for(let h of o)h.fileOps=l.filter(_=>_.alias===h.alias).length;let{files:c,warnings:u}=await iG(l,{dryRun:n,force:r,targetDir:s}),d=[...a,...u],f=i.flatMap(({member:h,detail:_})=>lG(_,l.filter(y=>y.alias===h.alias),h.alias)),m={files:c.length,written:c.filter(h=>h.action==="written").length,wouldWrite:c.filter(h=>h.action==="would_write").length,skipped:c.filter(h=>h.action==="skipped").length,unreplayable:c.filter(h=>h.action==="unreplayable").length,stitchedFiles:c.filter(h=>h.aliases.length>1).length,unreplayedCalls:f.length,warnings:d.length},p=m.unreplayable>0||m.unreplayedCalls>0||m.warnings>0;if(e.json)J(t,{schema_version:VJ,...e.headerJson,target:s??null,dryRun:n,force:r,mode:e.mode,members:o,coverage:e.coverage,summary:m,files:c,unreplayedCalls:f,warnings:d});else{for(let h of c){let _=h.aliases.length>1?` [stitched: ${h.aliases.join("+")}]`:"",y=h.detail===null?"":` \u2014 ${h.detail}`;t.stdout.write(`${h.path}: ${h.action} (${h.reason})${_}${y}
2568
2568
  `)}for(let h of f)t.stdout.write(`unreplayed ${h.kind} call ${h.tool} [${h.alias}]${h.path===null?"":` ${h.path}`}: ${h.reason}
2569
2569
  `);for(let h of d)t.stdout.write(`warning: ${h}
2570
2570
  `);t.stdout.write(`Restore ${n?"planned":"replayed"} ${m.files} file(s)${e.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).
2571
2571
  `),p&&t.stdout.write(`warning: recovery is incomplete \u2014 see per-file reasons above
2572
2572
  `)}return p?1:0}function eG(t){let e=new Set,n=[];for(let r of t)e.has(r.sessionid)||(e.add(r.sessionid),n.push(r));return n}function gr(t,e,n){return{alias:t.alias,provider:t.provider,sessionId:t.sessionid,status:e,fileOps:n}}function tG(t){let e=[];for(let n=0;n<t.length;n+=1){let{member:r,detail:s}=t[n],i=UI(s);for(let o=0;o<i.length;o+=1)e.push({op:{...i[o],alias:r.alias,cwd:s.cwd},rosterIndex:n,seq:o})}return e.sort((n,r)=>n.op.timestamp.getTime()-r.op.timestamp.getTime()||n.rosterIndex-r.rosterIndex||n.seq-r.seq),e.map(n=>n.op)}function UI(t){let e=YJ[t.provider]??{},n=Zm[t.provider]??{},r=[];for(let s of t.messages){if(s.role!=="tool_use"||s.toolName===void 0)continue;let i=s.toolInputData??mG(s.toolInput);if(i===void 0)continue;let o={timestamp:s.timestamp,callId:s.toolCallId??null,tool:s.toolName},a=e[s.toolName];if(a!==void 0){let c=nG(a,i);c!==null&&r.push({effect:c,source:"structured",...o});continue}if(t.provider==="codex"&&s.toolName==="apply_patch"){r.push(...rG(i,o));continue}let l=n[s.toolName];if(l!==void 0){let c=sG(i[l]);if(c===null)continue;for(let u of Km(c))r.push({effect:u,source:"shell",...o})}}return r}function nG(t,e){let n=Ml(e,t.pathKeys);if(n===void 0)return null;if(t.op==="write"){let o=Ml(e,t.contentKeys);return o===void 0?null:{kind:"write",path:n,content:o}}let r=Ml(e,t.oldKeys),s=Ml(e,t.newKeys);if(r===void 0||s===void 0)return null;let i=t.replaceAllKeys.some(o=>e[o]===!0);return{kind:"edit",path:n,oldString:r,newString:s,replaceAll:i}}function rG(t,e){let n=typeof t.input=="string"?t.input:void 0;if(n===void 0)return[];let r=xI(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",...e}))}function sG(t){if(typeof t=="string")return t;if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))return null;let e=t,n=e.findIndex(r=>/^-[a-z]*c[a-z]*$/.test(r));return n!==-1&&n+1<e.length?e[n+1]:e.some(r=>/[\s'"$`;|&<>()]/.test(r))?null:e.join(" ")}async function iG(t,e){let n=new Map,r=[],s=new Set,i=[],o=(d,f,m)=>{let p=n.get(d);return p===void 0&&(p={state:"unknown",content:null,lastOp:m.timestamp,ops:0,sessionPath:f,sources:new Set,aliases:[]},n.set(d,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=(d,f)=>{let m=uG(d,f.cwd,e.targetDir);if(m.abs!==void 0)return m.abs;if(!s.has(d)){s.add(d);let p=m.reason==="symlink_path";r.push({path:d,sessionPath:d,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(d,f)=>{if(d.state==="known")return d.content;if(d.ops>1||!Vm(f))return null;try{return await HJ(f,"utf8")}catch{return null}},c=(d,f,m)=>{d.state="unknown",d.content=null,d.unknownReason=f,m!==void 0&&(d.unknownDetail=m)};for(let d of t){let f=d.effect;switch(f.kind){case"write":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);p.state="known",p.content=f.content,delete p.unknownReason,delete p.unknownDetail;break}case"append":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;let h=p.state==="deleted"?"":await l(p,m)??"";p.state="known",p.content=h+f.content,delete p.unknownReason,delete p.unknownDetail;break}case"edit":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"edit_mismatch","edit follows in-session delete");break}let h=await l(p,m);if(h===null){c(p,"edit_base_missing");break}let _=aG(h,f.oldString,f.newString,f.replaceAll);if(_===null){c(p,"edit_mismatch");break}p.state="known",p.content=_;break}case"hunks":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state==="unknown"&&p.ops>1)break;if(p.state==="deleted"){c(p,"patch_context_mismatch","update follows in-session delete");break}let h=await l(p,m);if(h===null){c(p,"edit_base_missing");break}let _=RI(h,f.hunks);if(_===null){c(p,"patch_context_mismatch");break}if(p.state="known",p.content=_,f.moveTo!==void 0){let y=a(f.moveTo,d);if(y!==null){let g=o(y,f.moveTo,d);g.state="known",g.content=_,p.state="deleted",p.content=null}}break}case"delete":{let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);if(p.state="deleted",p.content=null,f.recursive){let h=m.endsWith("/")?m:`${m}/`;for(let[_,y]of n)_.startsWith(h)&&(y.state="deleted",y.content=null,y.lastOp=d.timestamp,y.ops+=1)}break}case"move":case"copy":{let m=a(f.from,d),p=a(f.to,d),h=m===null?void 0:n.get(m);if(p!==null){let _=o(p,f.to,d);h!==void 0&&h.state==="known"?(_.state="known",_.content=h.content,delete _.unknownReason,delete _.unknownDetail):c(_,"move_source_unknown",`${f.kind} source ${f.from} content not tracked in this session`)}if(f.kind==="move"&&m!==null){let _=o(m,f.from,d);_.state="deleted",_.content=null}break}case"touch":{let m=a(f.path,d);if(m===null)break;let p=n.get(m);if(p?.state==="deleted"){let h=o(m,f.path,d);h.state="known",h.content="",delete h.unknownReason,delete h.unknownDetail}else if(p!==void 0)o(m,f.path,d);else if(!Vm(m)){let h=o(m,f.path,d);h.state="known",h.content=""}break}case"mutate":{if(f.path===void 0){i.push(`${d.tool} @ ${d.timestamp.toISOString()}: ${f.note}`);for(let h of n.values())h.state!=="unknown"&&(h.lastOp=d.timestamp,h.ops+=1,h.sources.add(d.source),h.aliases.includes(d.alias)||h.aliases.push(d.alias),c(h,"not_reconstructable",f.note));break}let m=a(f.path,d);if(m===null)break;let p=o(m,f.path,d);c(p,"not_reconstructable",f.note);break}case"opaque":{let m=!1;for(let[p,h]of n)h.state!=="unknown"&&cG(f.tokens,p,h.sessionPath)&&(m=!0,h.lastOp=d.timestamp,h.ops+=1,h.sources.add(d.source),h.aliases.includes(d.alias)||h.aliases.push(d.alias),c(h,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`));for(let p of dG(f.tokens)){let h=a(p,d);if(h===null||n.has(h))continue;m=!0;let _=o(h,p,d);c(_,"not_reconstructable",`possibly mutated by unrecognized command: ${f.command}`)}m||i.push(`${d.tool} @ ${d.timestamp.toISOString()}: unrecognized command may mutate files: ${f.command}`);break}}}let u=[...r];for(let[d,f]of n)u.push(await oG(d,f,e));return{files:u,warnings:i}}async function oG(t,e,n){if(n.targetDir!==void 0&&Pl(n.targetDir,t))return hr(t,e,"unreplayable","symlink_path",null,"restore target contains a symbolic link");let r=Vm(t)?await GJ(t):null,s=r?.mtime??null;if(e.state==="deleted")return hr(t,e,"skipped","deleted_in_session",s,null);if(e.state==="unknown"||e.content===null)return hr(t,e,"unreplayable",e.unknownReason??"not_reconstructable",s,e.unknownDetail??null);let i;if(r===null)i="missing_on_disk";else if(e.lastOp.getTime()>r.mtimeMs)i="session_newer";else if(n.force)i="forced";else return hr(t,e,"skipped","disk_newer_or_equal",s,null);if(n.dryRun)return hr(t,e,"would_write",i,s,null);if(n.targetDir===void 0)await Ym(Ul(t),{recursive:!0}),await MI(t,e.content,"utf8"),await $I(t,e.lastOp,e.lastOp);else try{await fG(n.targetDir,t,e.content,e.lastOp)}catch(o){if(o instanceof mn)return hr(t,e,"unreplayable","symlink_path",s,o.message);throw o}return hr(t,e,"written",i,s,null)}function aG(t,e,n,r){return e===""?t===""?n:null:t.includes(e)?r?t.split(e).join(n):t.replace(e,n):null}function lG(t,e,n){let r=new Set(e.map(o=>o.callId).filter(o=>o!==null)),s=ki(t),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 cG(t,e,n){let r=DI(e);for(let s of t)if(s===e||s===n||s.includes(e)||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 dG(t){return[...new Set(t.filter(e=>e===""||e.startsWith("-")||/[$`*?{}();]/.test(e)||/\s/.test(e)?!1:Dl(e)||e.includes("/")||/(?:^|\.)[A-Za-z0-9_-]+\.[A-Za-z0-9_-]{1,16}$/.test(e)))]}function uG(t,e,n){if(n===void 0)return Dl(t)?{abs:t}:e===""?{reason:"unresolvable_path"}:{abs:pn(e,t)};let r=Dl(t)?e===""?void 0:zm(e,t):t;if(r===void 0)return{reason:"unresolvable_path"};let s=pn(n,r),i=zm(n,s);return i===""||i.startsWith("..")||Dl(i)?{reason:"outside_target"}:Pl(n,s)?{reason:"symlink_path"}:{abs:s}}function Pl(t,e){let n=e;for(;;){try{if(WJ(n).isSymbolicLink())return!0}catch(s){if(s.code!=="ENOENT")throw s}if(n===t)return!1;let r=Ul(n);if(r===n)return!0;n=r}}async function fG(t,e,n,r){try{let l=await $l(t);if(l.isSymbolicLink()||!l.isDirectory())throw new mn(`unsafe restore root: ${t}`)}catch(l){if(l.code!=="ENOENT")throw l;await Ym(t,{recursive:!0});let c=await $l(t);if(c.isSymbolicLink()||!c.isDirectory())throw new mn(`unsafe restore root: ${t}`)}let s=zm(t,Ul(e)),i=t;for(let l of s===""?[]:s.split(/[\\/]/)){i=pn(i,l);try{let c=await $l(i);if(c.isSymbolicLink()||!c.isDirectory())throw new mn(`unsafe restore parent: ${i}`)}catch(c){if(c.code!=="ENOENT")throw c;await Ym(i);let u=await $l(i);if(u.isSymbolicLink()||!u.isDirectory())throw new mn(`unsafe restore parent: ${i}`)}}if(Pl(t,e))throw new mn(`restore target contains a symbolic link: ${e}`);let o=await BJ(pn(i,".lmctl-restore-")),a=pn(o,"content.tmp");try{if(await MI(a,n,{encoding:"utf8",flag:"wx"}),await $I(a,r,r),Pl(t,e))throw new mn(`restore target contains a symbolic link: ${e}`);await XJ(a,e)}finally{await JJ(o,{recursive:!0,force:!0})}}function hr(t,e,n,r,s,i){return{path:t,sessionPath:e.sessionPath,ops:e.ops,sources:[...e.sources],aliases:[...e.aliases],action:n,reason:r,detail:i,sessionMtime:e.lastOp.toISOString(),diskMtime:s?.toISOString()??null}}function Ml(t,e){for(let n of e){let r=t[n];if(typeof r=="string")return r}}function mG(t){if(t!==void 0)try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:void 0}catch{return}}function Fl(t){return t instanceof Error?t.message:String(t)}var VJ,ds,jI,jl,PI,LI,YJ,Zm,zJ,mn,qI=E(()=>{"use strict";wt();mt();Ll();II();OI();Ie();yt();Yt();VJ=2,ds=["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(`
2573
- `),jI={claude:"full",kimi:"full",dsh:"partial",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},jl={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",dsh:"write replays exactly (file_path+content preserved in tool/call); no edit-type tool observed in real sessions",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"},PI="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",LI={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},YJ={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},dsh:{write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:LI,lmplayer:LI,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}}},Zm={claude:{Bash:"command"},kimi:{Bash:"command"},dsh:{bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"}},zJ={loadSession:Ne,resolveTeamTarget:(t,e,n)=>O(n,r=>Me(t,e,r)),resolveTeamRoster:(t,e)=>O(e,n=>{let r=ve(t,n),s=rt(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(Me(t,o.alias,n))}catch{}return i}),discoverSessions:()=>tr({})};mn=class extends Error{}});var Ni,Boe,Qm=E(()=>{"use strict";Ni=[{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}],Boe=Ni.length});import{spawn as pG}from"node:child_process";async function HI(t,e,n){let r=hG.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of r.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return gG(r.name,s)}function gG(t,e){return t==="lmctl_chat"?yG(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function yG(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",n,r,e];return ce()&&$e(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),wG(s,process.cwd())}function wG(t,e){return new Promise(n=>{let r=!1,s,i=u=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(u))},o=pG("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=EG(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",u=>{l+=u.toString("utf8")}),o.stderr?.on("data",u=>{c+=u.toString("utf8")}),o.on("error",u=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),o.on("exit",u=>{if(u===0){ce()&&$e(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2573
+ `),jI={claude:"full",kimi:"full",dsh:"partial",opencode:"full",lmplayer:"full",codex:"partial",agy:"partial",gemini:"none",copilot:"none",qwen:"none",ClaudeMock:"none"},jl={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",dsh:"write replays exactly (file_path+content preserved in tool/call); no edit-type tool observed in real sessions",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"},PI="shell reconstruction is best-effort from command text; programmatic file writes (interpreters, unknown tools) are not detectable from transcripts",LI={write:{op:"write",pathKeys:["filePath","path","file"],contentKeys:["content"]},edit:{op:"edit",pathKeys:["filePath","path","file"],oldKeys:["oldString"],newKeys:["newString"],replaceAllKeys:["replaceAll"]}},YJ={claude:{Write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["file_path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},dsh:{write:{op:"write",pathKeys:["file_path"],contentKeys:["content"]}},kimi:{Write:{op:"write",pathKeys:["path"],contentKeys:["content"]},Edit:{op:"edit",pathKeys:["path"],oldKeys:["old_string"],newKeys:["new_string"],replaceAllKeys:["replace_all"]}},opencode:LI,lmplayer:LI,agy:{write_to_file:{op:"write",pathKeys:["TargetFile"],contentKeys:["CodeContent"]}}},Zm={claude:{Bash:"command"},kimi:{Bash:"command"},dsh:{bash:"command"},opencode:{bash:"command"},lmplayer:{bash:"command"},codex:{exec_command:"cmd"},copilot:{bash:"command"},qwen:{run_shell_command:"command"},agy:{run_command:"CommandLine"}},zJ={loadSession:Ne,resolveTeamTarget:(t,e,n)=>L(n,r=>Me(t,e,r)),resolveTeamRoster:(t,e)=>L(e,n=>{let r=ve(t,n),s=rt(r,n);if(s.parseErrors.length>0)return[];let i=[];for(let o of s.members)try{i.push(Me(t,o.alias,n))}catch{}return i}),discoverSessions:()=>tr({})};mn=class extends Error{}});var Ni,Boe,Qm=E(()=>{"use strict";Ni=[{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}],Boe=Ni.length});import{spawn as pG}from"node:child_process";async function HI(t,e,n){let r=hG.get(t);if(r===void 0)return{status:"error",code:404,message:`unknown tool: ${t}`};let s=e!==null&&typeof e=="object"&&!Array.isArray(e)?e:{};for(let i of r.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return gG(r.name,s)}function gG(t,e){return t==="lmctl_chat"?yG(e):{status:"error",code:404,message:`unknown local tool: ${t}`}}function yG(t){let e=typeof t.prompt=="string"?t.prompt:"";if(e.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let n=typeof t.team=="string"?t.team:"";if(n.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let r=typeof t.alias=="string"&&t.alias.length>0?t.alias:"Lead",s=["chat",n,r,e];return ce()&&$e(JSON.stringify({event:"mcp_chat_spawn",team:n,alias:r})),wG(s,process.cwd())}function wG(t,e){return new Promise(n=>{let r=!1,s,i=u=>{r||(r=!0,s!==void 0&&clearTimeout(s),n(u))},o=pG("lmctl",t,{cwd:e,env:process.env,stdio:["ignore","pipe","pipe"]}),a=EG(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",u=>{l+=u.toString("utf8")}),o.stderr?.on("data",u=>{c+=u.toString("utf8")}),o.on("error",u=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${u.message}`})}),o.on("exit",u=>{if(u===0){ce()&&$e(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2574
2574
  `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:u??1,message:c.trim()||`lmctl chat exited with code ${u}`})})})}function EG(t){let e=t.LMCTL_MCP_CHAT_TIMEOUT_MS;if(e===void 0||e.trim().length===0)return BI;let n=Number(e);return!Number.isFinite(n)||n<=0?BI:n}function ep(t,e=process.env){let r=t.getConfig("api.url")??(e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?e.LMCTL_API_URL:_G),s=t.getConfig("api.token"),i=e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?e.LMCTL_API_TOKEN:s;return{baseUrl:r,token:i}}var _G,BI,hG,tp=E(()=>{"use strict";Qm();de();_G="http://127.0.0.1:8787",BI=30*60*1e3,hG=new Map(Ni.map(t=>[t.name,t]))});async function bG(t,e){let n=t.id===void 0,r=t.id??null;if(t.method==="exit")return n||e.io.write(np({jsonrpc:"2.0",id:r,result:null})),{kind:"exit"};if(t.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{protocolVersion:TG,capabilities:{tools:{listChanged:!1}},serverInfo:{name:vG,version:SG}}}};if(t.method==="notifications/initialized")return{kind:"notification"};if(t.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:null}};if(t.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:r,result:{tools:Ni.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(t.method==="tools/call"){let s=t.params!==null&&typeof t.params=="object"?t.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await HI(i,o,e.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: ${t.method}`}}}}function np(t){return`${JSON.stringify(t)}
2575
2575
  `}async function XI(t,e){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(u){t.io.write(np({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(n=!0);let c=await bG(l,t);c.kind==="response"?t.io.write(np(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,o(d))},u=()=>{let d=r.indexOf(`
2576
2576
  `);for(;d!==-1;){let f=r.slice(0,d);r=r.slice(d+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),d=r.indexOf(`
2577
2577
  `)}};e.setEncoding("utf8"),e.on("data",d=>{r+=d,u()}),e.on("end",()=>{r.trim().length>0&&(a=a.then(()=>i(r))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
2578
2578
  `),a.finally(()=>c(1))})})}var TG,vG,SG,JI=E(()=>{"use strict";Qm();tp();TG="2025-06-18",vG="lmctl",SG="0.0.1"});var KI={};oe(KI,{runMcp:()=>IG});async function IG(t,e={stdout:process.stdout,stderr:process.stderr},n=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(kG),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
2579
- `),2;$({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??NG(),i=1;try{let o=s===void 0?ep({getConfig:()=>null},process.env):ep(s,process.env);return i=await XI({io:{write:l=>e.stdout.write(l),log:l=>e.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 NG(){let t=Q(),e=3;for(let n=1;n<=e;n+=1)try{return Be({path:t})}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:t,error_message:s}),n<e&&GI(s))AG(50*n);else if(!GI(s))break}}function GI(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function AG(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var kG,VI=E(()=>{"use strict";dt();tp();JI();de();We();kG=`usage: lmctl mcp
2579
+ `),2;M({event:"mcp_bridge_start",pid:process.pid});let r=e.dal===void 0,s=e.dal??NG(),i=1;try{let o=s===void 0?ep({getConfig:()=>null},process.env):ep(s,process.env);return i=await XI({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},n),i}finally{M({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),r&&s!==void 0&&s.close()}}function NG(){let t=Q(),e=3;for(let n=1;n<=e;n+=1)try{return Be({path:t})}catch(r){let s=r instanceof Error?r.message:String(r);if(M({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:n,db_path:t,error_message:s}),n<e&&GI(s))AG(50*n);else if(!GI(s))break}}function GI(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function AG(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var kG,VI=E(()=>{"use strict";dt();tp();JI();de();We();kG=`usage: lmctl mcp
2580
2580
 
2581
2581
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2582
2582
  local config, then uses stdin/stdout for JSON-RPC frames.
@@ -2610,37 +2610,37 @@ token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2610
2610
  WHERE event_type IN ('CREATE', 'RESPONSE_CREATE')
2611
2611
  AND ts >= ?
2612
2612
  ORDER BY seq ASC
2613
- `).all(e.since).map(JG),s=new Map;for(let l of r){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new Un(`${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},u=GG(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:u.message_id,parent_link:u.link,orphaned_to_root:u.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=e.cursorSeq??null,o=[...s.values()].filter(l=>eN(l,e.root)&&!KG(l,s,e.root)&&(i===null||l.seq>i)),a=o.slice(0,e.limit);return{sent:a.map(l=>tN(l,new Set)),next_seq:o.length>e.limit?a.at(-1).seq:null}}function JG(t){try{let e=JSON.parse(t.payload);if(!nN(e))throw new Un(`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Un?e:new Un(`message_event seq ${t.seq} payload is invalid JSON`)}}function GG(t){if(t.event_type==="RESPONSE_CREATE"){let r=ZI(t.payload.in_reply_to_message_id);return{message_id:r,link:r===null?null:"in_reply_to_message_id"}}let e=nN(t.payload.causation)?t.payload.causation:null,n=ZI(e?.request_message_id);return{message_id:n,link:n===null?null:"invocation_state.request_message_id"}}function eN(t,e){return e===null?t.from===null:t.from?.teamfile===e.teamfile&&t.from.alias===e.alias}function KG(t,e,n){let r=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(r.has(s))return!1;r.add(s);let i=e.get(s);if(i===void 0)return!1;if(eN(i,n))return!0;s=i.parent_message_id}return!1}function tN(t,e){let{seq:n,children:r,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:r.map(o=>tN(o,i))}}function nN(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ZI(t){return typeof t=="string"&&t.length>0?t:null}var Un,rN=E(()=>{"use strict";Un=class extends Error{errorKind="data_error"}});var fN={};oe(fN,{runMail:()=>d4});import{hostname as VG}from"node:os";async function d4(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(t4),0;let[n,...r]=t,s=_n(r);try{switch(n){case"sent":return await u4(r,e);case"history":return await f4(r,e);case"seen":return await m4(r,e);case"pending":return await p4(r,e);case"read":return await h4(r,e);case"handle":return await y4(r,e);case"ack":return await g4(r,e);case"tree":return await w4(r,e);default:return re(e,s,"invalid_command",`unknown mail command: ${n}`)}}catch(i){return i instanceof Ze||i instanceof Un?re(e,s,i.errorKind,i.message):re(e,s,"internal",i instanceof Error?i.message:String(i))}}async function u4(t,e){if(Bn(t))return e.stdout.write(n4),0;let n=_n(t),r=V(Wl(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=op(L(r,"--to"));if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=R4(L(r,"--since"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=L(r,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return re(e,n,"invalid_arguments","--status must be queued or delivered");let a=lp(L(r,"--limit"));if("error"in a)return re(e,n,"invalid_arguments",a.error);let l=uN(L(r,"--cursor"),"sent");if("error"in l)return re(e,n,"invalid_arguments",l.error);if(l.value!==null&&(L(r,"--to")!==void 0||L(r,"--since")!==void 0||o!==void 0))return re(e,n,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let c=await O(e,u=>{let d=l.value===null?Xe(ap(u,e,"mail sent")):Xe(l.value.self),f=l.value===null?s.value:l.value.to===null?null:Xe(l.value.to),m=l.value?.since??i.iso,p=l.value?.status??o??null,h=E4(u,d,f,m,p??void 0,a.value,l.value?.seq??null),_=h.next_seq===null?null:dN({v:1,kind:"sent",seq:h.next_seq,self:d.value,to:f?.value??null,since:m,status:p});return{schema_version:Wn,schema:"event-log-v1",identity:d.value,filters:{to:f?.value??null,since:m,status:p},messages:h.messages,next_cursor:_}});if(B(r,"--json"))H(e,c);else{e.stdout.write(`Messages sent from ${c.identity}
2613
+ `).all(e.since).map(JG),s=new Map;for(let l of r){if(l.receiver_teamfile===null||l.receiver_alias===null)throw new Un(`${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},u=GG(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:u.message_id,parent_link:u.link,orphaned_to_root:u.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=e.cursorSeq??null,o=[...s.values()].filter(l=>eN(l,e.root)&&!KG(l,s,e.root)&&(i===null||l.seq>i)),a=o.slice(0,e.limit);return{sent:a.map(l=>tN(l,new Set)),next_seq:o.length>e.limit?a.at(-1).seq:null}}function JG(t){try{let e=JSON.parse(t.payload);if(!nN(e))throw new Un(`message_event seq ${t.seq} payload is not an object`);return{...t,payload:e}}catch(e){throw e instanceof Un?e:new Un(`message_event seq ${t.seq} payload is invalid JSON`)}}function GG(t){if(t.event_type==="RESPONSE_CREATE"){let r=ZI(t.payload.in_reply_to_message_id);return{message_id:r,link:r===null?null:"in_reply_to_message_id"}}let e=nN(t.payload.causation)?t.payload.causation:null,n=ZI(e?.request_message_id);return{message_id:n,link:n===null?null:"invocation_state.request_message_id"}}function eN(t,e){return e===null?t.from===null:t.from?.teamfile===e.teamfile&&t.from.alias===e.alias}function KG(t,e,n){let r=new Set([t.message_id]),s=t.parent_message_id;for(;s!==null;){if(r.has(s))return!1;r.add(s);let i=e.get(s);if(i===void 0)return!1;if(eN(i,n))return!0;s=i.parent_message_id}return!1}function tN(t,e){let{seq:n,children:r,...s}=t;if(e.has(t.message_id))return{...s,children:[]};let i=new Set(e).add(t.message_id);return{...s,children:r.map(o=>tN(o,i))}}function nN(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ZI(t){return typeof t=="string"&&t.length>0?t:null}var Un,rN=E(()=>{"use strict";Un=class extends Error{errorKind="data_error"}});var fN={};oe(fN,{runMail:()=>d4});import{hostname as VG}from"node:os";async function d4(t,e){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(t4),0;let[n,...r]=t,s=_n(r);try{switch(n){case"sent":return await u4(r,e);case"history":return await f4(r,e);case"seen":return await m4(r,e);case"pending":return await p4(r,e);case"read":return await h4(r,e);case"handle":return await y4(r,e);case"ack":return await g4(r,e);case"tree":return await w4(r,e);default:return re(e,s,"invalid_command",`unknown mail command: ${n}`)}}catch(i){return i instanceof Ze||i instanceof Un?re(e,s,i.errorKind,i.message):re(e,s,"internal",i instanceof Error?i.message:String(i))}}async function u4(t,e){if(Bn(t))return e.stdout.write(n4),0;let n=_n(t),r=Y(Wl(t,["--to","--since","--status","--limit","--cursor"]),["--to","--since","--status","--limit","--cursor"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=op(C(r,"--to"));if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=R4(C(r,"--since"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=C(r,"--status");if(o!==void 0&&o!=="queued"&&o!=="delivered")return re(e,n,"invalid_arguments","--status must be queued or delivered");let a=lp(C(r,"--limit"));if("error"in a)return re(e,n,"invalid_arguments",a.error);let l=uN(C(r,"--cursor"),"sent");if("error"in l)return re(e,n,"invalid_arguments",l.error);if(l.value!==null&&(C(r,"--to")!==void 0||C(r,"--since")!==void 0||o!==void 0))return re(e,n,"invalid_arguments","--cursor cannot be combined with --to, --since, or --status; the cursor retains the original filters");let c=await L(e,u=>{let d=l.value===null?Xe(ap(u,e,"mail sent")):Xe(l.value.self),f=l.value===null?s.value:l.value.to===null?null:Xe(l.value.to),m=l.value?.since??i.iso,p=l.value?.status??o??null,h=E4(u,d,f,m,p??void 0,a.value,l.value?.seq??null),_=h.next_seq===null?null:dN({v:1,kind:"sent",seq:h.next_seq,self:d.value,to:f?.value??null,since:m,status:p});return{schema_version:Wn,schema:"event-log-v1",identity:d.value,filters:{to:f?.value??null,since:m,status:p},messages:h.messages,next_cursor:_}});if(X(r,"--json"))J(e,c);else{e.stdout.write(`Messages sent from ${c.identity}
2614
2614
  `);for(let u of c.messages)e.stdout.write(`${u.created_at} ${u.message_id} ${u.message_type} ${u.lifecycle_state} -> ${u.receiver.teamfile}:${u.receiver.alias}
2615
2615
  `);c.messages.length===0&&e.stdout.write(`(none)
2616
- `)}return 0}async function f4(t,e){if(Bn(t))return e.stdout.write(a4),0;let n=_n(t),r=V(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"history");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await O(e,a=>{let l=oN(a,s.value);return l!==null&&ts(a,l),aN(a,s.value)}),o={schema_version:Wn,schema:"event-log-v1",message_id:s.value,events:i};if(B(r,"--json"))H(e,o);else{e.stdout.write(`History for ${s.value}
2616
+ `)}return 0}async function f4(t,e){if(Bn(t))return e.stdout.write(a4),0;let n=_n(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"history");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await L(e,a=>{let l=oN(a,s.value);return l!==null&&ts(a,l),aN(a,s.value)}),o={schema_version:Wn,schema:"event-log-v1",message_id:s.value,events:i};if(X(r,"--json"))J(e,o);else{e.stdout.write(`History for ${s.value}
2617
2617
  `);for(let a of i)e.stdout.write(`${a.seq} ${a.ts} ${a.event_type} ${JSON.stringify(a.payload)}
2618
- `)}return 0}async function m4(t,e){if(Bn(t))return e.stdout.write(l4),0;let n=_n(t),r=V(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"seen");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await O(e,o=>v4(o,s.value));return B(r,"--json")?H(e,i):(e.stdout.write(`${s.value}
2618
+ `)}return 0}async function m4(t,e){if(Bn(t))return e.stdout.write(l4),0;let n=_n(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"seen");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await L(e,o=>v4(o,s.value));return X(r,"--json")?J(e,i):(e.stdout.write(`${s.value}
2619
2619
  `),e.stdout.write(` db: ${i.db.delivered?"delivered":i.db.handled?"handled":"not delivered"}
2620
2620
  `),e.stdout.write(` transcript: ${i.transcript.checked?i.transcript.found?`seen at ${i.transcript.seen_at}`:"not found":`not checked (${i.transcript.reason})`}
2621
2621
  `),e.stdout.write(` answered: ${i.answered?.via??"no evidence"}
2622
- `)),0}async function p4(t,e){if(Bn(t))return e.stdout.write(r4),0;let n=_n(t),r=V(Wl(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=op(L(r,"--receiver"));if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=lp(L(r,"--limit"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=await O(e,l=>{let c=s.value;if(c===null){let m=mr(e.env??process.env,l);if(m.ok)c=Xe(m.identity);else if(m.reason==="not-found")throw new Ze("self_identity",fn("mail pending"))}let u=c===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",d=c===null?[]:[c.teamfile,c.alias],f=l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
2622
+ `)),0}async function p4(t,e){if(Bn(t))return e.stdout.write(r4),0;let n=_n(t),r=Y(Wl(t,["--receiver","--limit"]),["--receiver","--limit"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=op(C(r,"--receiver"));if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=lp(C(r,"--limit"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=await L(e,l=>{let c=s.value;if(c===null){let m=mr(e.env??process.env,l);if(m.ok)c=Xe(m.identity);else if(m.reason==="not-found")throw new Ze("self_identity",fn("mail pending"))}let u=c===null?"":"WHERE receiver_teamfile = ? AND receiver_alias = ?",d=c===null?[]:[c.teamfile,c.alias],f=l.db.prepare(`SELECT message_id, message_type, in_reply_to, sender_teamfile, sender_alias,
2623
2623
  receiver_teamfile, receiver_alias, lifecycle_state, created_seq
2624
2624
  FROM message_pending ${u}
2625
- ORDER BY created_seq ASC LIMIT ?`).all(...d,i.value);return{receiver:c,messages:f}}),a={schema_version:Wn,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(B(r,"--json"))H(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
2625
+ ORDER BY created_seq ASC LIMIT ?`).all(...d,i.value);return{receiver:c,messages:f}}),a={schema_version:Wn,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(X(r,"--json"))J(e,a);else if(a.messages.length===0)e.stdout.write(`no pending messages
2626
2626
  `);else for(let l of a.messages){let c=l.sender===null?"operator":`${l.sender.teamfile}:${l.sender.alias}`;e.stdout.write(`${l.message_id} ${l.lifecycle_state} ${c} -> ${l.receiver.teamfile}:${l.receiver.alias}
2627
2627
  `)}return 0}function oN(t,e){let n=/^msg_tcl_(\d+)$/.exec(e);if(n===null)return null;let r=Number(n[1]);return t.db.prepare(`SELECT id, status, holder_pid, holder_host, started_at, last_heartbeat_at
2628
2628
  FROM tracked_invocation
2629
2629
  WHERE team_chat_log_id = ? AND status = 'running'
2630
2630
  ORDER BY id DESC LIMIT 1`).get(r)??null}function _4(t,e){let n=t.db.prepare(`SELECT event_type, payload FROM message_event
2631
2631
  WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE')
2632
- ORDER BY seq ASC LIMIT 1`).get(e);if(n===void 0)throw new Ze("not_found",`no such message: ${e}`);let r=JSON.parse(n.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e),i=oN(t,e),o=i===null?null:Ft(i);return{schema_version:Wn,schema:"event-log-v1",message_id:e,message_type:n.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:r.in_reply_to_message_id??null,sender:r.sender,receiver:r.receiver,content:r.content??"",pending_state:s?.lifecycle_state??null,holder_liveness:o,effective_status:o==="dead"?"aborted":null}}async function h4(t,e){if(Bn(t))return e.stdout.write(s4),0;let n=_n(t),r=V(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"read");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await O(e,o=>_4(o,s.value));if(B(r,"--json"))H(e,i);else{let o=i.sender===null?"operator":`${i.sender.teamfile}:${i.sender.alias}`;e.stdout.write(`${i.message_id} (${i.message_type}${i.in_reply_to===null?"":`, replies to ${i.in_reply_to}`})
2632
+ ORDER BY seq ASC LIMIT 1`).get(e);if(n===void 0)throw new Ze("not_found",`no such message: ${e}`);let r=JSON.parse(n.payload),s=t.db.prepare("SELECT lifecycle_state FROM message_pending WHERE message_id = ?").get(e),i=oN(t,e),o=i===null?null:Ft(i);return{schema_version:Wn,schema:"event-log-v1",message_id:e,message_type:n.event_type==="RESPONSE_CREATE"?"response":"request",in_reply_to:r.in_reply_to_message_id??null,sender:r.sender,receiver:r.receiver,content:r.content??"",pending_state:s?.lifecycle_state??null,holder_liveness:o,effective_status:o==="dead"?"aborted":null}}async function h4(t,e){if(Bn(t))return e.stdout.write(s4),0;let n=_n(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"read");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await L(e,o=>_4(o,s.value));if(X(r,"--json"))J(e,i);else{let o=i.sender===null?"operator":`${i.sender.teamfile}:${i.sender.alias}`;e.stdout.write(`${i.message_id} (${i.message_type}${i.in_reply_to===null?"":`, replies to ${i.in_reply_to}`})
2633
2633
  `),e.stdout.write(`from: ${o}
2634
2634
  `),e.stdout.write(`to: ${i.receiver.teamfile}:${i.receiver.alias}
2635
2635
  `),e.stdout.write(`state: ${i.pending_state??"terminal"}
2636
2636
  `),i.effective_status==="aborted"&&e.stdout.write(`effective_status: aborted (holder verified dead; run \`lmctl mail history ${i.message_id}\` to persist)
2637
2637
  `),e.stdout.write(`---
2638
2638
  ${i.content}
2639
- `)}return 0}async function g4(t,e){if(Bn(t))return e.stdout.write(i4),0;let n=_n(t),r=V(Wl(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"ack");if("error"in s)return re(e,n,"invalid_id",s.error);let i=L(r,"--note"),o=await O(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
2640
- WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let u=mr(e.env??process.env,l);if(!u.ok&&u.reason==="not-found")throw new Ze("self_identity",fn("mail ack"));let d=u.ok?u.identity:"operator",f=l.db.transaction(()=>{let m=Y_(l.db,{messageId:s.value,ackedBy:d,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:VG(),terminalizePending:B(r,"--terminalize-pending")});if(u.ok){let p=Xe(u.identity);l.clearCurrentlyHandlingMessage(p.teamfile,p.alias,s.value)}return m})();return{ackedBy:d,ack:f}}),a={schema_version:Wn,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return B(r,"--json")?H(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
2641
- `),0}async function y4(t,e){if(Bn(t))return e.stdout.write(o4),0;let n=_n(t),r=V(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"handle");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await O(e,a=>{if(a.db.prepare(`SELECT 1 FROM message_event
2642
- WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let c=Xe(ap(a,e,"mail handle"));return{identity:c,handling:V_(a.db,{messageId:s.value,handlingBy:c.value,handlingTeamfile:c.teamfile,handlingAlias:c.alias})}}),o={schema_version:Wn,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return B(r,"--json")?H(e,o):e.stdout.write(`${o.appended?"handling":"handling refreshed"} ${o.message_id} as ${o.handling_by} since ${o.handling_at}
2643
- `),0}async function w4(t,e){if(Bn(t))return e.stdout.write(c4),0;let n=_n(t),r=V(Wl(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=cN(L(r,"--since"),YG);if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=op(L(r,"--root"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=lp(L(r,"--limit"));if("error"in o)return re(e,n,"invalid_arguments",o.error);let a=uN(L(r,"--cursor"),"tree");if("error"in a)return re(e,n,"invalid_arguments",a.error);if(a.value!==null&&(L(r,"--root")!==void 0||L(r,"--since")!==void 0))return re(e,n,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await O(e,c=>{let u=a.value===null?i.value??Xe(ap(c,e,"mail tree")):Xe(a.value.root),d=a.value?.since??s.iso,f=a.value?.since_label??L(r,"--since")??"24h",m=QI(c,{root:{teamfile:u.teamfile,alias:u.alias},since:d,limit:o.value,cursorSeq:a.value?.seq??null}),p=m.next_seq===null?null:dN({v:1,kind:"tree",seq:m.next_seq,root:u.value,since:d,since_label:f});return{schema_version:Wn,schema:"event-log-v1",root:{teamfile:u.teamfile,alias:u.alias},since:f,since_timestamp:d,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(B(r,"--json"))H(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
2639
+ `)}return 0}async function g4(t,e){if(Bn(t))return e.stdout.write(i4),0;let n=_n(t),r=Y(Wl(t,["--note"]),["--note"],["--terminalize-pending","--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"ack");if("error"in s)return re(e,n,"invalid_id",s.error);let i=C(r,"--note"),o=await L(e,l=>{if(l.db.prepare(`SELECT 1 FROM message_event
2640
+ WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let u=mr(e.env??process.env,l);if(!u.ok&&u.reason==="not-found")throw new Ze("self_identity",fn("mail ack"));let d=u.ok?u.identity:"operator",f=l.db.transaction(()=>{let m=Y_(l.db,{messageId:s.value,ackedBy:d,...i!==void 0?{note:i}:{},holderPid:process.pid,holderHost:VG(),terminalizePending:X(r,"--terminalize-pending")});if(u.ok){let p=Xe(u.identity);l.clearCurrentlyHandlingMessage(p.teamfile,p.alias,s.value)}return m})();return{ackedBy:d,ack:f}}),a={schema_version:Wn,schema:"event-log-v1",message_id:s.value,acked_by:o.ackedBy,appended:o.ack.appended,pending_outcome:o.ack.pending_outcome};return X(r,"--json")?J(e,a):e.stdout.write(`${a.appended?"acknowledged":"already acknowledged"} ${a.message_id} as ${a.acked_by} (${a.pending_outcome})
2641
+ `),0}async function y4(t,e){if(Bn(t))return e.stdout.write(o4),0;let n=_n(t),r=Y(t,[],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);let s=xi(r.positionals,"handle");if("error"in s)return re(e,n,"invalid_id",s.error);let i=await L(e,a=>{if(a.db.prepare(`SELECT 1 FROM message_event
2642
+ WHERE stream_id = ? AND event_type IN ('CREATE', 'RESPONSE_CREATE') LIMIT 1`).get(s.value)===void 0)throw new Ze("not_found",`no such message: ${s.value}`);let c=Xe(ap(a,e,"mail handle"));return{identity:c,handling:V_(a.db,{messageId:s.value,handlingBy:c.value,handlingTeamfile:c.teamfile,handlingAlias:c.alias})}}),o={schema_version:Wn,schema:"event-log-v1",message_id:s.value,handling_by:i.identity.value,handling_at:i.handling.handling_at,appended:i.handling.appended};return X(r,"--json")?J(e,o):e.stdout.write(`${o.appended?"handling":"handling refreshed"} ${o.message_id} as ${o.handling_by} since ${o.handling_at}
2643
+ `),0}async function w4(t,e){if(Bn(t))return e.stdout.write(c4),0;let n=_n(t),r=Y(Wl(t,["--root","--since","--limit","--cursor"]),["--root","--since","--limit","--cursor"],["--json"]);if(r.error!==void 0)return re(e,n,"invalid_arguments",r.error);if(r.positionals.length>0)return re(e,n,"invalid_arguments",`unknown argument: ${r.positionals[0]}`);let s=cN(C(r,"--since"),YG);if("error"in s)return re(e,n,"invalid_arguments",s.error);let i=op(C(r,"--root"));if("error"in i)return re(e,n,"invalid_arguments",i.error);let o=lp(C(r,"--limit"));if("error"in o)return re(e,n,"invalid_arguments",o.error);let a=uN(C(r,"--cursor"),"tree");if("error"in a)return re(e,n,"invalid_arguments",a.error);if(a.value!==null&&(C(r,"--root")!==void 0||C(r,"--since")!==void 0))return re(e,n,"invalid_arguments","--cursor cannot be combined with --root or --since; the cursor retains the original filters");let l=await L(e,c=>{let u=a.value===null?i.value??Xe(ap(c,e,"mail tree")):Xe(a.value.root),d=a.value?.since??s.iso,f=a.value?.since_label??C(r,"--since")??"24h",m=QI(c,{root:{teamfile:u.teamfile,alias:u.alias},since:d,limit:o.value,cursorSeq:a.value?.seq??null}),p=m.next_seq===null?null:dN({v:1,kind:"tree",seq:m.next_seq,root:u.value,since:d,since_label:f});return{schema_version:Wn,schema:"event-log-v1",root:{teamfile:u.teamfile,alias:u.alias},since:f,since_timestamp:d,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(X(r,"--json"))J(e,l);else{e.stdout.write(`Causal mail tree for ${l.root.teamfile}:${l.root.alias} since ${l.since_timestamp}
2644
2644
  `);for(let c of l.sent)lN(e,c,0);l.sent.length===0&&e.stdout.write(`(none)
2645
2645
  `),e.stdout.write(`
2646
2646
  Note: ${l.orphan_policy}
@@ -2679,7 +2679,7 @@ Note: ${l.orphan_policy}
2679
2679
  ORDER BY response.seq ASC
2680
2680
  LIMIT 1
2681
2681
  `).get(e,e);return n===void 0?null:ip(n)}function x4(t){let e=us(t.delivered_by)?t.delivered_by:null;return{lease_id:Ai(e?.lease_id,t.lease_id),pid:M4(e?.pid,t.pid,t.holder_pid),host:Ai(e?.host,t.host,t.holder_host)}}function lN(t,e,n){let r=" ".repeat(n),s=e.from===null?"operator":`${e.from.teamfile}:${e.from.alias}`;t.stdout.write(`${r}${e.message_id} ${s} -> ${e.to.teamfile}:${e.to.alias}${e.orphaned_to_root?" [root: no causal link]":""}
2682
- `);for(let i of e.children)lN(t,i,n+1)}function xi(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let n=t[0];return ZG.test(n)?{value:n}:{error:`invalid message_id: ${n}; expected msg_<id>`}}function op(t){if(t===void 0)return{value:null};try{return{value:Xe(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function Wl(t,e){let n=new Set(e),r=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&n.has(o)?r.push(o,s.slice(i+1)):r.push(s)}return r}function R4(t){return t===void 0?{iso:null}:cN(t,null)}function cN(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let n=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2]==="m"?6e4:n[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function ap(t,e,n){let r=mr(e.env??process.env,t);if(r.ok)return r.identity;throw r.reason==="not-found"?new Ze("self_identity",fn(n)):new Ze("self_identity",Jf(n))}function Bn(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function _n(t){return t.includes("--json")}function re(t,e,n,r){return e?(H(t,{status:"error",errorKind:n,message:r}),1):k(t,r)}function lp(t){if(t===void 0)return{value:zG};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>sN?{error:`invalid --limit value: ${t}; expected 1..${sN}`}:{value:e}}function dN(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function uN(t,e){if(t===void 0)return{value:null};try{let n=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!us(n)||n.v!==1||n.kind!==e||typeof n.seq!="number"||!Number.isSafeInteger(n.seq)||n.seq<1?{error:"invalid --cursor value"}:n.kind==="sent"?typeof n.self!="string"||!sp(n.self)||!(n.to===null||typeof n.to=="string"&&sp(n.to))||!(n.since===null||typeof n.since=="string"&&Number.isFinite(Date.parse(n.since)))||!(n.status===null||n.status==="queued"||n.status==="delivered")?{error:"invalid --cursor value"}:{value:n}:typeof n.root!="string"||!sp(n.root)||typeof n.since!="string"||!Number.isFinite(Date.parse(n.since))||typeof n.since_label!="string"||n.since_label.length===0?{error:"invalid --cursor value"}:{value:n}}catch{return{error:"invalid --cursor value"}}}function sp(t){try{return Xe(t),!0}catch{return!1}}function O4(t){return QG.includes(t)}function L4(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","dsh","ClaudeMock"].includes(t)}function us(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function C4(t,e){let n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${n}(?:$|[^A-Za-z0-9_-])`).test(t)}function $4(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function Ai(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function M4(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var YG,zG,sN,Wn,ZG,QG,e4,qn,t4,n4,r4,s4,i4,o4,a4,l4,c4,Ze,mN=E(()=>{"use strict";ct();di();Ns();wt();rN();Ie();dl();fi();YG=24*60*60*1e3,zG=100,sN=1e3,Wn=1,ZG=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,QG=["CREATE","RESPONSE_CREATE"],e4=["DELIVERED","RESPONSE_DELIVERED"],qn=`schema_version is the output-contract version consumers must switch on.
2682
+ `);for(let i of e.children)lN(t,i,n+1)}function xi(t,e){if(t.length!==1)return{error:`usage: lmctl mail ${e} <message_id> [--json]`};let n=t[0];return ZG.test(n)?{value:n}:{error:`invalid message_id: ${n}; expected msg_<id>`}}function op(t){if(t===void 0)return{value:null};try{return{value:Xe(t)}}catch{return{error:`invalid agent identity: ${t}; expected <teamfile>:<alias>`}}}function Wl(t,e){let n=new Set(e),r=[];for(let s of t){let i=s.indexOf("="),o=i<0?s:s.slice(0,i);i>0&&n.has(o)?r.push(o,s.slice(i+1)):r.push(s)}return r}function R4(t){return t===void 0?{iso:null}:cN(t,null)}function cN(t,e){if(t===void 0)return e===null?{error:"missing --since value"}:{iso:new Date(Date.now()-e).toISOString()};let n=/^(\d+(?:\.\d+)?)(m|h|d)$/.exec(t);if(n!==null){let s=Number(n[1]),i=n[2]==="m"?6e4:n[2]==="h"?36e5:864e5,o=Date.now()-s*i;return!Number.isFinite(o)||s<=0?{error:`invalid --since value: ${t}`}:{iso:new Date(o).toISOString()}}let r=Date.parse(t);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${t}; use an ISO timestamp or duration such as 24h`}}function ap(t,e,n){let r=mr(e.env??process.env,t);if(r.ok)return r.identity;throw r.reason==="not-found"?new Ze("self_identity",fn(n)):new Ze("self_identity",Jf(n))}function Bn(t){return t.length===1&&(t[0]==="--help"||t[0]==="-h")}function _n(t){return t.includes("--json")}function re(t,e,n,r){return e?(J(t,{status:"error",errorKind:n,message:r}),1):k(t,r)}function lp(t){if(t===void 0)return{value:zG};if(!/^\d+$/.test(t))return{error:`invalid --limit value: ${t}; expected an integer`};let e=Number(t);return!Number.isSafeInteger(e)||e<1||e>sN?{error:`invalid --limit value: ${t}; expected 1..${sN}`}:{value:e}}function dN(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function uN(t,e){if(t===void 0)return{value:null};try{let n=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));return!us(n)||n.v!==1||n.kind!==e||typeof n.seq!="number"||!Number.isSafeInteger(n.seq)||n.seq<1?{error:"invalid --cursor value"}:n.kind==="sent"?typeof n.self!="string"||!sp(n.self)||!(n.to===null||typeof n.to=="string"&&sp(n.to))||!(n.since===null||typeof n.since=="string"&&Number.isFinite(Date.parse(n.since)))||!(n.status===null||n.status==="queued"||n.status==="delivered")?{error:"invalid --cursor value"}:{value:n}:typeof n.root!="string"||!sp(n.root)||typeof n.since!="string"||!Number.isFinite(Date.parse(n.since))||typeof n.since_label!="string"||n.since_label.length===0?{error:"invalid --cursor value"}:{value:n}}catch{return{error:"invalid --cursor value"}}}function sp(t){try{return Xe(t),!0}catch{return!1}}function O4(t){return QG.includes(t)}function L4(t){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","kimi","dsh","ClaudeMock"].includes(t)}function us(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function C4(t,e){let n=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return new RegExp(`(?:^|[^A-Za-z0-9_-])${n}(?:$|[^A-Za-z0-9_-])`).test(t)}function $4(t,e){return new RegExp(`(?:^|\\n)--- queued (?:message|response) [0-9]+ \\(mail #${e}(?:,|\\))`,"i").test(t)}function Ai(...t){for(let e of t)if(typeof e=="string"&&e.length>0)return e;return null}function M4(...t){for(let e of t)if(typeof e=="number"&&Number.isFinite(e))return e;return null}var YG,zG,sN,Wn,ZG,QG,e4,qn,t4,n4,r4,s4,i4,o4,a4,l4,c4,Ze,mN=E(()=>{"use strict";ct();di();Ns();wt();rN();Ie();dl();fi();YG=24*60*60*1e3,zG=100,sN=1e3,Wn=1,ZG=/^msg_[A-Za-z0-9][A-Za-z0-9_-]*$/,QG=["CREATE","RESPONSE_CREATE"],e4=["DELIVERED","RESPONSE_DELIVERED"],qn=`schema_version is the output-contract version consumers must switch on.
2683
2683
  schema identifies the backing event-log substrate; it is not a second output version.`,t4=`usage:
2684
2684
  lmctl mail sent [--to <teamfile:alias>] [--since <duration|ISO>] [--status queued|delivered] [--limit N] [--cursor <token>] [--json]
2685
2685
  lmctl mail history <message_id> [--json]
@@ -2884,7 +2884,7 @@ With --json, the stable external contract is:
2884
2884
  "incomplete_capture_note":"..."}
2885
2885
  ${qn}
2886
2886
  Default text output is human-readable and may change without notice.
2887
- `,Ze=class extends Error{errorKind;constructor(e,n){super(n),this.errorKind=e}}});import{existsSync as pN,mkdirSync as D4,readdirSync as j4,readFileSync as _N,writeFileSync as P4}from"node:fs";import{join as fs}from"node:path";import{fileURLToPath as F4}from"node:url";function W4(t){try{return U4.some(e=>pN(fs(t,e)))}catch{return!1}}function q4(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[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 hN(t,e){t.durable_memory_mode!=="db"?B4(t):H4(t,e)}function gN(t){let e=W4(t),n;try{n=j4(ql).filter(r=>r.endsWith(".template")).sort()}catch(r){return $({event:"bootstrap_templates_unreadable",path:ql,error_message:r instanceof Error?r.message:String(r)}),[]}return n.filter(r=>r==="skills_lmprobe.md.template"||r==="skills_lmdebug.md.template"?e:!0)}function B4(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),$({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let n=fs(e,"durable-memory");try{D4(n,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),$({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:n,error_message:i instanceof Error?i.message:String(i)});return}let r=gN(e),s=[];for(let i of r){let o=i.replace(/\.template$/,""),a=fs(n,o);if(!pN(a))try{let l=_N(fs(ql,i),"utf8");P4(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),$({event:"bootstrap_template_copy_failed",project_id:t.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 H4(t,e){let n=t.local_path??"",r=gN(n),s=[];for(let i of r){let o=fs(ql,i),a;try{a=_N(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c),$({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:c instanceof Error?c.message:String(c)});continue}let l=q4(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),$({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path:o});continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.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:t.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 ${t.name}: ${s.join(", ")}`)}var ql,U4,yN=E(()=>{"use strict";de();ql=fs(F4(import.meta.url),"../../config/durable_memory_templates"),U4=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as X4}from"node:crypto";import{existsSync as J4,mkdirSync as G4,writeFileSync as K4}from"node:fs";import{dirname as V4,join as ms}from"node:path";function cp(t){return typeof t=="string"&&t.startsWith(wN)}function tK(t){if(!cp(t))throw new Lt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(wN.length),n=e.indexOf("/");if(n<=0)throw new Lt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let r=e.slice(0,n);if(!Q4.has(r))throw new Lt(`unknown lmctl:// kind '${r}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.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 Lt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new Lt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:r,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function nK(t,e,n){if(t==="workflow")return Sa(e,n);let r=t==="mcp"?ms("templates","mcp",`${e}.json`):ms("templates","skills",e,"SKILL.md");for(let s of Vu(n)){let i=ms(s,r);if(J4(i))return i}return null}function rK(t,e,n){let r=ms(Ku(n),z4,t);return t==="skill"?ms(r,e,"SKILL.md"):ms(r,`${e}${t==="workflow"?".compound.json":".json"}`)}function sK(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let n=e.trim();if(t==="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 EN(t,e){let{kind:n,name:r,ref:s}=tK(t),i=nK(n,r,e);if(i!==null)return i;let o=`${Y4}${n}/${r}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(Z4)})}catch(u){throw new Lt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new Lt(`lmctl:// '${t}' 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 u=eK.exec(s);if(u!==null){let d=X4("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new Lt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!sK(n,l))throw new Lt(`lmctl:// '${t}' remote artifact failed shape validation for ${n} \u2014 discarded, NOT cached.`,"validation-failure");let c=rK(n,r,e);return G4(V4(c),{recursive:!0}),K4(c,l,"utf8"),c}var wN,Y4,z4,Z4,Q4,Lt,eK,TN=E(()=>{"use strict";Yu();wN="lmctl://",Y4="https://lmctl.com/templates/",z4=".cache",Z4=8e3,Q4=new Set(["workflow","mcp","skill"]),Lt=class extends Error{reason;constructor(e,n="malformed"){super(e),this.reason=n,this.name="LmctlUriError"}},eK=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as iK}from"node:child_process";import{cpSync as vN,existsSync as oK,mkdirSync as aK,mkdtempSync as lK,readFileSync as Fae,statSync as cK,writeFileSync as SN}from"node:fs";import{homedir as dK,tmpdir as uK}from"node:os";import{basename as bN,join as Ct}from"node:path";function dp(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function up(t,e,n){if(Array.isArray(t)){for(let r of t)up(r,e,n);return}if(dp(t)){t.alias===e&&(Array.isArray(t.mcp)&&n.mcp.push(...t.mcp),Array.isArray(t.skills)&&n.skills.push(...t.skills));for(let r of Object.values(t))up(r,e,n)}}function _K(t,e){let n={mcp:[],skills:[]},r=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.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(!(!dp(a)||!Array.isArray(a.steps)))for(let l of a.steps)dp(l)&&l.members!==void 0&&up(l.members,e.alias,n)}let s=i=>{let o=new Map;for(let a of i)o.set(pK(a),a);return[...o.values()]};return{mcp:s(n.mcp),skills:s(n.skills)}}function hK(t,e){return t.listProjects().find(n=>n.team_id===e.team_id)?.local_path}async function gK(t,e){let n;try{n=await fetch(t,{signal:AbortSignal.timeout(fK)})}catch(s){throw new Hn(e,`fetch ${t} failed: ${s.message}`)}if(!n.ok)throw new Hn(e,`fetch ${t} \u2192 HTTP ${n.status}`);let r=await n.text();if(r.length>kN)throw new Hn(e,`fetched ${t} exceeds ${kN} bytes`);return r}function yK(t,e,n,r){let s=iK(t,e,{cwd:n,env:Tn(void 0,n),encoding:"utf8",timeout:6e4});if(s.error)throw new Hn(r,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Hn(r,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function wK(t){if(typeof t!="string")return t.name;let e=bN(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?bN(t.replace(/\/skill\.md$/i,"")):e}async function IN(t,e,n){let r=wK(t),s=Ct(e,r);if(aK(s,{recursive:!0}),typeof t!="string")return SN(Ct(s,"SKILL.md"),t.content,"utf8"),{name:r,dir:s};if(cp(t)&&(t=await EN(t)),AN.test(t))return SN(Ct(s,"SKILL.md"),await gK(t,n),"utf8"),{name:r,dir:s};if(!oK(t))throw new Hn(n,`skill path not found: ${t}`);return cK(t).isDirectory()?(vN(t,s,{recursive:!0}),{name:r,dir:s}):(vN(t,Ct(s,"SKILL.md")),{name:r,dir:s})}async function xN(t){let{dal:e,member:n,stderr:r}=t,s=_K(e,n);if(s.mcp.length===0&&s.skills.length===0)return;let i=Qe(n),o=n.sessiondir||t.baseDir||hK(e,n)||process.cwd(),a=l=>{r.write(`[seed:${n.alias}] ${l}
2887
+ `,Ze=class extends Error{errorKind;constructor(e,n){super(n),this.errorKind=e}}});import{existsSync as pN,mkdirSync as D4,readdirSync as j4,readFileSync as _N,writeFileSync as P4}from"node:fs";import{join as fs}from"node:path";import{fileURLToPath as F4}from"node:url";function W4(t){try{return U4.some(e=>pN(fs(t,e)))}catch{return!1}}function q4(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let n=e[1],r=e[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 hN(t,e){t.durable_memory_mode!=="db"?B4(t):H4(t,e)}function gN(t){let e=W4(t),n;try{n=j4(ql).filter(r=>r.endsWith(".template")).sort()}catch(r){return M({event:"bootstrap_templates_unreadable",path:ql,error_message:r instanceof Error?r.message:String(r)}),[]}return n.filter(r=>r==="skills_lmprobe.md.template"||r==="skills_lmdebug.md.template"?e:!0)}function B4(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path"),M({event:"bootstrap_skipped_no_local_path",project_id:t.id,project_name:t.name});return}let n=fs(e,"durable-memory");try{D4(n,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i),M({event:"bootstrap_memory_dir_create_failed",project_id:t.id,path:n,error_message:i instanceof Error?i.message:String(i)});return}let r=gN(e),s=[];for(let i of r){let o=i.replace(/\.template$/,""),a=fs(n,o);if(!pN(a))try{let l=_N(fs(ql,i),"utf8");P4(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l),M({event:"bootstrap_template_copy_failed",project_id:t.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 H4(t,e){let n=t.local_path??"",r=gN(n),s=[];for(let i of r){let o=fs(ql,i),a;try{a=_N(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c),M({event:"bootstrap_template_read_failed",project_id:t.id,template:i,path:o,error_message:c instanceof Error?c.message:String(c)});continue}let l=q4(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`),M({event:"bootstrap_template_frontmatter_invalid",project_id:t.id,template:i,path:o});continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.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),M({event:"bootstrap_memory_upsert_failed",project_id:t.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 ${t.name}: ${s.join(", ")}`)}var ql,U4,yN=E(()=>{"use strict";de();ql=fs(F4(import.meta.url),"../../config/durable_memory_templates"),U4=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as X4}from"node:crypto";import{existsSync as J4,mkdirSync as G4,writeFileSync as K4}from"node:fs";import{dirname as V4,join as ms}from"node:path";function cp(t){return typeof t=="string"&&t.startsWith(wN)}function tK(t){if(!cp(t))throw new Lt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(wN.length),n=e.indexOf("/");if(n<=0)throw new Lt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let r=e.slice(0,n);if(!Q4.has(r))throw new Lt(`unknown lmctl:// kind '${r}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.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 Lt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new Lt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:r,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function nK(t,e,n){if(t==="workflow")return Sa(e,n);let r=t==="mcp"?ms("templates","mcp",`${e}.json`):ms("templates","skills",e,"SKILL.md");for(let s of Vu(n)){let i=ms(s,r);if(J4(i))return i}return null}function rK(t,e,n){let r=ms(Ku(n),z4,t);return t==="skill"?ms(r,e,"SKILL.md"):ms(r,`${e}${t==="workflow"?".compound.json":".json"}`)}function sK(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let n=e.trim();if(t==="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 EN(t,e){let{kind:n,name:r,ref:s}=tK(t),i=nK(n,r,e);if(i!==null)return i;let o=`${Y4}${n}/${r}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(Z4)})}catch(u){throw new Lt(`lmctl:// '${t}' not found locally or at the remote catalog ${o} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new Lt(`lmctl:// '${t}' 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 u=eK.exec(s);if(u!==null){let d=X4("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new Lt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!sK(n,l))throw new Lt(`lmctl:// '${t}' remote artifact failed shape validation for ${n} \u2014 discarded, NOT cached.`,"validation-failure");let c=rK(n,r,e);return G4(V4(c),{recursive:!0}),K4(c,l,"utf8"),c}var wN,Y4,z4,Z4,Q4,Lt,eK,TN=E(()=>{"use strict";Yu();wN="lmctl://",Y4="https://lmctl.com/templates/",z4=".cache",Z4=8e3,Q4=new Set(["workflow","mcp","skill"]),Lt=class extends Error{reason;constructor(e,n="malformed"){super(e),this.reason=n,this.name="LmctlUriError"}},eK=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as iK}from"node:child_process";import{cpSync as vN,existsSync as oK,mkdirSync as aK,mkdtempSync as lK,readFileSync as Fae,statSync as cK,writeFileSync as SN}from"node:fs";import{homedir as dK,tmpdir as uK}from"node:os";import{basename as bN,join as Ct}from"node:path";function dp(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function up(t,e,n){if(Array.isArray(t)){for(let r of t)up(r,e,n);return}if(dp(t)){t.alias===e&&(Array.isArray(t.mcp)&&n.mcp.push(...t.mcp),Array.isArray(t.skills)&&n.skills.push(...t.skills));for(let r of Object.values(t))up(r,e,n)}}function _K(t,e){let n={mcp:[],skills:[]},r=new Set;for(let i of t.listProjects()){if(i.team_id!==e.team_id)continue;let o=t.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(!(!dp(a)||!Array.isArray(a.steps)))for(let l of a.steps)dp(l)&&l.members!==void 0&&up(l.members,e.alias,n)}let s=i=>{let o=new Map;for(let a of i)o.set(pK(a),a);return[...o.values()]};return{mcp:s(n.mcp),skills:s(n.skills)}}function hK(t,e){return t.listProjects().find(n=>n.team_id===e.team_id)?.local_path}async function gK(t,e){let n;try{n=await fetch(t,{signal:AbortSignal.timeout(fK)})}catch(s){throw new Hn(e,`fetch ${t} failed: ${s.message}`)}if(!n.ok)throw new Hn(e,`fetch ${t} \u2192 HTTP ${n.status}`);let r=await n.text();if(r.length>kN)throw new Hn(e,`fetched ${t} exceeds ${kN} bytes`);return r}function yK(t,e,n,r){let s=iK(t,e,{cwd:n,env:Tn(void 0,n),encoding:"utf8",timeout:6e4});if(s.error)throw new Hn(r,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Hn(r,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function wK(t){if(typeof t!="string")return t.name;let e=bN(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?bN(t.replace(/\/skill\.md$/i,"")):e}async function IN(t,e,n){let r=wK(t),s=Ct(e,r);if(aK(s,{recursive:!0}),typeof t!="string")return SN(Ct(s,"SKILL.md"),t.content,"utf8"),{name:r,dir:s};if(cp(t)&&(t=await EN(t)),AN.test(t))return SN(Ct(s,"SKILL.md"),await gK(t,n),"utf8"),{name:r,dir:s};if(!oK(t))throw new Hn(n,`skill path not found: ${t}`);return cK(t).isDirectory()?(vN(t,s,{recursive:!0}),{name:r,dir:s}):(vN(t,Ct(s,"SKILL.md")),{name:r,dir:s})}async function xN(t){let{dal:e,member:n,stderr:r}=t,s=_K(e,n);if(s.mcp.length===0&&s.skills.length===0)return;let i=Qe(n),o=n.sessiondir||t.baseDir||hK(e,n)||process.cwd(),a=l=>{r.write(`[seed:${n.alias}] ${l}
2888
2888
  `)};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(mK.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=lK(Ct(uK(),`lmctl-skill-${n.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!AN.test(c)?c:(await IN(c,l,n.alias)).dir;yK(i,["skills","install",u,"--scope","user","--consent"],o,n.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(NN[i]!==void 0){let l=NN[i]();for(let c of s.skills)await IN(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 Hn,AN,fK,kN,mK,pK,Ri,NN,RN=E(()=>{"use strict";dt();TN();St();Ei();Hn=class extends Error{alias;constructor(e,n){super(`capability install failed for ${e}: ${n}`),this.alias=e,this.name="CapabilityInstallError"}},AN=/^https?:\/\//i,fK=8e3,kN=1e6,mK=new Set(["opencode"]),pK=t=>JSON.stringify(t),Ri=()=>process.env.HOME??dK();NN={claude:()=>Ct(Ri(),".claude","skills"),qwen:()=>Ct(Ri(),".qwen","skills"),codex:()=>Ct(Ri(),".codex","skills"),copilot:()=>Ct(Ri(),".copilot","skills"),kimi:()=>Ct(process.env.KIMI_CODE_HOME??Ct(Ri(),".kimi-code"),"skills")}});var fp,ON=E(()=>{"use strict";fp=`---
2889
2889
 
2890
2890
  # Durable memory \u2014 how to use it
@@ -2896,21 +2896,21 @@ ON EVERY NEW TASK:
2896
2896
  2. Pull only the chapters relevant to your current task. Don't load everything.
2897
2897
  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.
2898
2898
 
2899
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var CN={};oe(CN,{runTeam:()=>SK});import{existsSync as EK}from"node:fs";import{join as TK}from"node:path";async function SK(t,e){let[n,...r]=t;if(n==="--help"||n==="-h"||n==="help")return e.stdout.write(vK),0;try{return await O(e,async s=>{switch(n){case"create":return kK(r,e,s);case"list":return IK(r,e,s);case"show":return NK(r,e,s);case"add-member":return AK(r,e,s);case"seed":return LN(r,e,s,!1);case"refresh":return LN(r,e,s,!0);case"companion":return RK(r,e,s);case"list-roots":return bK(r,e,s);default:return k(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return Pe(e,s)}}function bK(t,e,n){let r=V(t,[]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length>0)return k(e,"usage: team list-roots [--json]");let s=n.listRootTeams().map(i=>({...i,missing_on_disk:!EK(i.teamfile_path)||void 0}));return B(r,"--json")?H(e,s):e.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(`
2899
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});var CN={};oe(CN,{runTeam:()=>SK});import{existsSync as EK}from"node:fs";import{join as TK}from"node:path";async function SK(t,e){let[n,...r]=t;if(n==="--help"||n==="-h"||n==="help")return e.stdout.write(vK),0;try{return await L(e,async s=>{switch(n){case"create":return kK(r,e,s);case"list":return IK(r,e,s);case"show":return NK(r,e,s);case"add-member":return AK(r,e,s);case"seed":return LN(r,e,s,!1);case"refresh":return LN(r,e,s,!0);case"companion":return RK(r,e,s);case"list-roots":return bK(r,e,s);default:return k(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return Pe(e,s)}}function bK(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length>0)return k(e,"usage: team list-roots [--json]");let s=n.listRootTeams().map(i=>({...i,missing_on_disk:!EK(i.teamfile_path)||void 0}));return X(r,"--json")?J(e,s):e.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(`
2900
2900
  `)+(s.length>0?`
2901
2901
  `:"")),0}function kK(t,e,n){let[r]=t;if(r===void 0)return k(e,"usage: team create <name>");let s=n.insertTeam({name:r});return e.stdout.write(`created team ${s.name}
2902
- `),0}function IK(t,e,n){let r=V(t,[]);if(r.error!==void 0)return k(e,r.error);let s=n.listTeams();return B(r,"--json")?H(e,s):e.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2902
+ `),0}function IK(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);let s=n.listTeams();return X(r,"--json")?J(e,s):e.stdout.write(`${s.map(i=>`${i.id} ${i.name}`).join(`
2903
2903
  `)}${s.length>0?`
2904
- `:""}`),0}function NK(t,e,n){let r=V(t,[]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team show <name> [--json]");let i=n.findTeamByName(s);if(i===null)return k(e,`team not found: ${s}`);let o=n.listTeamMembers(i.id);if(B(r,"--json"))H(e,{team:i,members:o});else{e.stdout.write(`team ${i.name}
2904
+ `:""}`),0}function NK(t,e,n){let r=Y(t,[]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team show <name> [--json]");let i=n.findTeamByName(s);if(i===null)return k(e,`team not found: ${s}`);let o=n.listTeamMembers(i.id);if(X(r,"--json"))J(e,{team:i,members:o});else{e.stdout.write(`team ${i.name}
2905
2905
  `);for(let a of o)e.stdout.write(`- ${a.alias} ${Qe(a)} ${a.sessionid??"(unseeded)"}
2906
- `)}return 0}function AK(t,e,n){let r=V(t,["--alias","--provider","--model","--role","--sessiondir"]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"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 k(e,`team not found: ${s}`);let o=L(r,"--alias"),a=L(r,"--provider");if(o===void 0||a===void 0)return k(e,"team add-member requires --alias and --provider");let l=n.insertTeamMember({team_id:i.id,alias:o,provider:a,model:L(r,"--model")??null,role:L(r,"--role")??"agent",sessiondir:L(r,"--sessiondir")??TK(Fi(),"sessions",i.name,o)});return B(r,"--json")?H(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
2907
- `),0}async function LN(t,e,n,r){let s=V(t,["--alias"]);if(s.error!==void 0)return k(e,s.error);let[i]=s.positionals;if(i===void 0)return k(e,r?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=n.findTeamByName(i);if(o===null)return k(e,`team not found: ${i}`);let a=L(s,"--alias");if(r&&a===void 0)return k(e,"team refresh requires --alias");if(r&&a!==void 0&&a.trim().toLowerCase()==="lead")return k(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=xK(n.listTeamMembers(o.id),a,r);if(a!==void 0&&l.length===0)return k(e,`member not found or already seeded: ${a}`);if(r&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return k(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=n.listProjects().filter(m=>m.team_id===o.id),u=new Set;for(let m of c){if(u.has(m.workflow_name))continue;u.add(m.workflow_name);let p=n.getWorkflowByName(m.workflow_name);if(p===null)continue;let h=xT(m.workflow_name,p.definition);if(h.status==="FAIL")return k(e,`cannot seed team \`${o.name}\`: workflow \`${m.workflow_name}\` failed verify-at-seed \u2014 ${h.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let m of c)hN(m,n);let d=[],f=!1;for(let m of l){let p=await Fo({member:m,dal:n}),h=n.updateTeamMemberSession(m.id,p.sessionid);if(h!==null){let _=h.role_prompt??"",y=_.length>0?`${_}
2906
+ `)}return 0}function AK(t,e,n){let r=Y(t,["--alias","--provider","--model","--role","--sessiondir"]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"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 k(e,`team not found: ${s}`);let o=C(r,"--alias"),a=C(r,"--provider");if(o===void 0||a===void 0)return k(e,"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")??TK(Fi(),"sessions",i.name,o)});return X(r,"--json")?J(e,l):e.stdout.write(`added member ${l.alias} to ${i.name}
2907
+ `),0}async function LN(t,e,n,r){let s=Y(t,["--alias"]);if(s.error!==void 0)return k(e,s.error);let[i]=s.positionals;if(i===void 0)return k(e,r?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=n.findTeamByName(i);if(o===null)return k(e,`team not found: ${i}`);let a=C(s,"--alias");if(r&&a===void 0)return k(e,"team refresh requires --alias");if(r&&a!==void 0&&a.trim().toLowerCase()==="lead")return k(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=xK(n.listTeamMembers(o.id),a,r);if(a!==void 0&&l.length===0)return k(e,`member not found or already seeded: ${a}`);if(r&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return k(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=n.listProjects().filter(m=>m.team_id===o.id),u=new Set;for(let m of c){if(u.has(m.workflow_name))continue;u.add(m.workflow_name);let p=n.getWorkflowByName(m.workflow_name);if(p===null)continue;let h=xT(m.workflow_name,p.definition);if(h.status==="FAIL")return k(e,`cannot seed team \`${o.name}\`: workflow \`${m.workflow_name}\` failed verify-at-seed \u2014 ${h.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let m of c)hN(m,n);let d=[],f=!1;for(let m of l){let p=await Fo({member:m,dal:n}),h=n.updateTeamMemberSession(m.id,p.sessionid);if(h!==null){let _=h.role_prompt??"",y=_.length>0?`${_}
2908
2908
 
2909
2909
  ${fp}`:fp;n.setMemberPromptSnapshot(m.id,y),d.push(h);let g=fl(Qe(h),p.sessionid);g!==null&&e.stderr.write(`[seeded ${h.alias}] customize/compact in its native TUI:
2910
2910
  ${g}
2911
2911
  `);try{await xN({dal:n,member:h,stderr:e.stderr})}catch(w){f=!0,e.stderr.write(`error: ${w instanceof Error?w.message:String(w)}
2912
- `)}}}return B(s,"--json")?H(e,d):e.stdout.write(`seeded ${d.length} member(s)
2913
- `),f?1:0}function xK(t,e,n){return t.filter(r=>e!==void 0&&r.alias!==e?!1:n||r.sessionid===null)}function RK(t,e,n){let r=V(t,["--interpreter","--of"]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=n.findTeamByName(s);if(i===null)return k(e,`team not found: ${s}`);let o=L(r,"--interpreter"),a=L(r,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return k(e,"team companion requires --interpreter and --of");let l=n.findTeamMemberByAlias(i.id,o);if(l===null)return k(e,`member not found: ${o}`);for(let c of a){let u=n.findTeamMemberByAlias(i.id,c);if(u===null)return k(e,`member not found: ${c}`);n.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2912
+ `)}}}return X(s,"--json")?J(e,d):e.stdout.write(`seeded ${d.length} member(s)
2913
+ `),f?1:0}function xK(t,e,n){return t.filter(r=>e!==void 0&&r.alias!==e?!1:n||r.sessionid===null)}function RK(t,e,n){let r=Y(t,["--interpreter","--of"]);if(r.error!==void 0)return k(e,r.error);let[s]=r.positionals;if(s===void 0)return k(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=n.findTeamByName(s);if(i===null)return k(e,`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 k(e,"team companion requires --interpreter and --of");let l=n.findTeamMemberByAlias(i.id,o);if(l===null)return k(e,`member not found: ${o}`);for(let c of a){let u=n.findTeamMemberByAlias(i.id,c);if(u===null)return k(e,`member not found: ${c}`);n.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
2914
2914
  `),0}var vK,$N=E(()=>{"use strict";We();lu();yN();dt();wt();RN();Ca();Ie();ON();vK=`usage: lmctl team create <name>
2915
2915
  lmctl team list [--json]
2916
2916
  lmctl team show <name> [--json]
@@ -2924,18 +2924,18 @@ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2924
2924
  refresh to create/update native provider sessions for team members.
2925
2925
  team refresh rejects Lead members (alias matching is case-insensitive).
2926
2926
  `});var BN={};oe(BN,{applyMaxBytes:()=>Xl,parseTailSince:()=>WN,renderMessage:()=>UN,runTail:()=>MK});async function MK(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${$K}
2927
- `),0;let n=V(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help","--json"]);if(n.error!==void 0)return k(e,n.error);let r=B(n,"--json"),s=L(n,"--since"),i=WN(s);if("error"in i)return k(e,i.error);let o=i.date,a=L(n,"--lines"),l=L(n,"--max-bytes");if(a!==void 0&&l!==void 0)return k(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let y=Number.parseInt(a,10);if(!Number.isFinite(y)||y<1||String(y)!==a)return k(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:y}}else{let y=l===void 0?LK:Number.parseInt(l,10);if(!Number.isFinite(y)||y<0||l!==void 0&&String(y)!==l)return k(e,`invalid --max-bytes "${l}" (expected a non-negative integer)`);r&&l!==void 0&&e.stderr.write(`warning: --max-bytes has no effect under --json (byte-truncation has no JSON analog); ignoring
2928
- `),c={kind:"bytes",maxBytes:y}}let u=B(n,"--watch"),d=L(n,"--watch-interval"),f=d===void 0?CK:Number.parseInt(d.replace(/s$/,""),10);if(!Number.isFinite(f)||f<1)return k(e,`invalid --watch-interval "${d}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let m=L(n,"--run");if(m!==void 0){if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional [target] [alias]");if(L(n,"--session")!==void 0)return k(e,"--run is mutually exclusive with --session");if(L(n,"--provider")!==void 0)return k(e,"--run is mutually exclusive with --provider");let y=Number.parseInt(m,10);if(!Number.isFinite(y)||y<=0||String(y)!==m)return k(e,`invalid --run "${m}" (expected a positive integer run id)`);try{return await O(e,async g=>DK(e,g,y,c,u,f,o,r))}catch(g){return Pe(e,g)}}let p=gt(OK,{target:n.positionals[0],alias:n.positionals[1],flags:{session:L(n,"--session"),provider:L(n,"--provider")}});if(p.mode==="error")return k(e,p.message);if(p.mode==="managed")return k(e,"tail managed mode requires --run <id>");let h;if(p.mode==="ai-team")if(p.alias===void 0){let y;try{y=await O(e,S=>ve(p.teamfile,S))}catch(S){return k(e,`tail: ${S instanceof Error?S.message:String(S)}`)}let g;try{g=Fe(y)}catch(S){return k(e,`tail: ${S instanceof Error?S.message:String(S)}`)}let w=ht(g);if(w===void 0)return k(e,`tail: ${p.teamfile} has no Lead member; pass <tf>:<alias>`);try{let S=await O(e,I=>Me(p.teamfile,w.alias,I));h={provider:S.provider,sessionId:S.sessionid,cwd:S.sessiondir}}catch(S){return S instanceof Ee?k(e,S.message):Pe(e,S)}}else try{let y=await O(e,g=>Me(p.teamfile,p.alias,g));h={provider:y.provider,sessionId:y.sessionid,cwd:y.sessiondir}}catch(y){return y instanceof Ee?k(e,y.message):Pe(e,y)}else{let y=p.sessionid,g=p.provider;if(g===void 0){let w=await zt(y);if(w.length===0)return k(e,`tail: session "${y}" not found in any provider store`);if(w.length>1)return k(e,`tail: session "${y}" matches multiple providers (${w.join(", ")}); pass --provider`);g=w[0]}h={provider:g,sessionId:y}}let _=await MN(e,h.provider,h.sessionId,c,-1,o,r);return _===Hl?1:u?await new Promise(y=>{let g=async()=>{try{let I=await MN(e,h.provider,h.sessionId,c,_,o,r);I!==Hl&&(_=I)}catch(I){e.stderr.write(`tail: ${I instanceof Error?I.message:String(I)}
2929
- `)}},w=setInterval(()=>{g()},f*1e3),S=()=>{clearInterval(w),y(0)};process.once("SIGINT",S),process.once("SIGTERM",S)}):0}async function MN(t,e,n,r,s,i,o){let a;try{a=await Ne(n,e)}catch(f){return t.stderr.write(`tail: failed to load session: ${f instanceof Error?f.message:String(f)}
2927
+ `),0;let n=Y(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run","--since"],["--watch","--help","--json"]);if(n.error!==void 0)return k(e,n.error);let r=X(n,"--json"),s=C(n,"--since"),i=WN(s);if("error"in i)return k(e,i.error);let o=i.date,a=C(n,"--lines"),l=C(n,"--max-bytes");if(a!==void 0&&l!==void 0)return k(e,"--lines and --max-bytes are mutually exclusive (choose one)");let c;if(a!==void 0){let y=Number.parseInt(a,10);if(!Number.isFinite(y)||y<1||String(y)!==a)return k(e,`invalid --lines "${a}" (expected a positive integer)`);c={kind:"lines",lines:y}}else{let y=l===void 0?LK:Number.parseInt(l,10);if(!Number.isFinite(y)||y<0||l!==void 0&&String(y)!==l)return k(e,`invalid --max-bytes "${l}" (expected a non-negative integer)`);r&&l!==void 0&&e.stderr.write(`warning: --max-bytes has no effect under --json (byte-truncation has no JSON analog); ignoring
2928
+ `),c={kind:"bytes",maxBytes:y}}let u=X(n,"--watch"),d=C(n,"--watch-interval"),f=d===void 0?CK:Number.parseInt(d.replace(/s$/,""),10);if(!Number.isFinite(f)||f<1)return k(e,`invalid --watch-interval "${d}" (expected <N>s, N\u22651)`);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let m=C(n,"--run");if(m!==void 0){if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional [target] [alias]");if(C(n,"--session")!==void 0)return k(e,"--run is mutually exclusive with --session");if(C(n,"--provider")!==void 0)return k(e,"--run is mutually exclusive with --provider");let y=Number.parseInt(m,10);if(!Number.isFinite(y)||y<=0||String(y)!==m)return k(e,`invalid --run "${m}" (expected a positive integer run id)`);try{return await L(e,async g=>DK(e,g,y,c,u,f,o,r))}catch(g){return Pe(e,g)}}let p=gt(OK,{target:n.positionals[0],alias:n.positionals[1],flags:{session:C(n,"--session"),provider:C(n,"--provider")}});if(p.mode==="error")return k(e,p.message);if(p.mode==="managed")return k(e,"tail managed mode requires --run <id>");let h;if(p.mode==="ai-team")if(p.alias===void 0){let y;try{y=await L(e,v=>ve(p.teamfile,v))}catch(v){return k(e,`tail: ${v instanceof Error?v.message:String(v)}`)}let g;try{g=Fe(y)}catch(v){return k(e,`tail: ${v instanceof Error?v.message:String(v)}`)}let w=ht(g);if(w===void 0)return k(e,`tail: ${p.teamfile} has no Lead member; pass <tf>:<alias>`);try{let v=await L(e,N=>Me(p.teamfile,w.alias,N));h={provider:v.provider,sessionId:v.sessionid,cwd:v.sessiondir}}catch(v){return v instanceof Ee?k(e,v.message):Pe(e,v)}}else try{let y=await L(e,g=>Me(p.teamfile,p.alias,g));h={provider:y.provider,sessionId:y.sessionid,cwd:y.sessiondir}}catch(y){return y instanceof Ee?k(e,y.message):Pe(e,y)}else{let y=p.sessionid,g=p.provider;if(g===void 0){let w=await zt(y);if(w.length===0)return k(e,`tail: session "${y}" not found in any provider store`);if(w.length>1)return k(e,`tail: session "${y}" matches multiple providers (${w.join(", ")}); pass --provider`);g=w[0]}h={provider:g,sessionId:y}}let _=await MN(e,h.provider,h.sessionId,c,-1,o,r);return _===Hl?1:u?await new Promise(y=>{let g=async()=>{try{let N=await MN(e,h.provider,h.sessionId,c,_,o,r);N!==Hl&&(_=N)}catch(N){e.stderr.write(`tail: ${N instanceof Error?N.message:String(N)}
2929
+ `)}},w=setInterval(()=>{g()},f*1e3),v=()=>{clearInterval(w),y(0)};process.once("SIGINT",v),process.once("SIGTERM",v)}):0}async function MN(t,e,n,r,s,i,o){let a;try{a=await Ne(n,e)}catch(f){return t.stderr.write(`tail: failed to load session: ${f instanceof Error?f.message:String(f)}
2930
2930
  `),Hl}if(a===null)return t.stderr.write(`tail: session not found: ${n} (provider=${e})
2931
- `),Hl;let l=a.messages??[],c=s<0&&r.kind==="lines"?Math.max(0,l.length-r.lines):s+1;if(s<0&&i!==void 0){let f=i.getTime(),m=l.length;for(let p=0;p<l.length;p+=1){let h=l[p].timestamp,_=h===void 0?NaN:(h instanceof Date?h:new Date(h)).getTime();if(!Number.isNaN(_)&&_>=f){m=p;break}}c=Math.max(c,m)}let u=s<0&&c>0;if(c>=l.length)return o===!0&&s<0&&H(t,{schema_version:Bl,provider:e,sessionId:n,messages:[],truncated:u}),l.length-1;if(o===!0){let f=l.slice(c).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:(p.timestamp instanceof Date?p.timestamp:new Date(p.timestamp)).toISOString()}));return H(t,{schema_version:Bl,provider:e,sessionId:n,messages:f,truncated:u}),l.length-1}let d="";for(let f=c;f<l.length;f+=1)d+=`${UN(l[f])}
2931
+ `),Hl;let l=a.messages??[],c=s<0&&r.kind==="lines"?Math.max(0,l.length-r.lines):s+1;if(s<0&&i!==void 0){let f=i.getTime(),m=l.length;for(let p=0;p<l.length;p+=1){let h=l[p].timestamp,_=h===void 0?NaN:(h instanceof Date?h:new Date(h)).getTime();if(!Number.isNaN(_)&&_>=f){m=p;break}}c=Math.max(c,m)}let u=s<0&&c>0;if(c>=l.length)return o===!0&&s<0&&J(t,{schema_version:Bl,provider:e,sessionId:n,messages:[],truncated:u}),l.length-1;if(o===!0){let f=l.slice(c).map(p=>({role:p.role,content:p.content,model:p.model??null,timestamp:(p.timestamp instanceof Date?p.timestamp:new Date(p.timestamp)).toISOString()}));return J(t,{schema_version:Bl,provider:e,sessionId:n,messages:f,truncated:u}),l.length-1}let d="";for(let f=c;f<l.length;f+=1)d+=`${UN(l[f])}
2932
2932
  `;return t.stdout.write(r.kind==="bytes"?Xl(d,r.maxBytes):d),l.length-1}function UN(t){let e=qN(t.timestamp),n=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
2933
2933
  `).replace(/\r/g,`
2934
2934
  `).split(`
2935
2935
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${n}: ${i}`:`${n}: ${i}
2936
2936
  ${o.map(a=>` ${a}`).join(`
2937
- `)}`}function DN(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function DK(t,e,n,r,s,i,o,a){if(e.getRun(n)===null)return k(t,`tail: run ${n}: not found`);let c=o===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=o.getTime()),u=r.kind==="lines"?c.slice(Math.max(0,c.length-r.lines)):c;if(a===!0)H(t,{schema_version:Bl,run_id:n,truncated:u.length<c.length,events:DN(u)});else{let f=u.map(m=>`${FN(m)}
2938
- `).join("");t.stdout.write(r.kind==="bytes"?Xl(f,r.maxBytes):f)}let d=c.length>0?c[c.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let _=e.listSessionEvents(n,d);if(_.length===0)return;for(let g of _)d=g.id;if(a===!0){H(t,{schema_version:Bl,run_id:n,truncated:!1,events:DN(_)});return}let y=_.map(g=>`${FN(g)}
2937
+ `)}`}function DN(t){return t.map(e=>({id:e.id,kind:e.kind,step_id:e.step_id,timestamp:new Date(e.timestamp_ms).toISOString(),payload:e.payload}))}async function DK(t,e,n,r,s,i,o,a){if(e.getRun(n)===null)return k(t,`tail: run ${n}: not found`);let c=o===void 0?e.listSessionEvents(n):e.listSessionEvents(n).filter(f=>f.timestamp_ms>=o.getTime()),u=r.kind==="lines"?c.slice(Math.max(0,c.length-r.lines)):c;if(a===!0)J(t,{schema_version:Bl,run_id:n,truncated:u.length<c.length,events:DN(u)});else{let f=u.map(m=>`${FN(m)}
2938
+ `).join("");t.stdout.write(r.kind==="bytes"?Xl(f,r.maxBytes):f)}let d=c.length>0?c[c.length-1].id:0;return s?await new Promise(f=>{let p=setInterval(()=>{try{let _=e.listSessionEvents(n,d);if(_.length===0)return;for(let g of _)d=g.id;if(a===!0){J(t,{schema_version:Bl,run_id:n,truncated:!1,events:DN(_)});return}let y=_.map(g=>`${FN(g)}
2939
2939
  `).join("");t.stdout.write(r.kind==="bytes"?Xl(y,r.maxBytes):y)}catch(_){t.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2940
2940
  `)}},i*1e3),h=()=>{clearInterval(p),f(0)};process.once("SIGINT",h),process.once("SIGTERM",h)}):0}function Xl(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let r=Buffer.byteLength(jN,"utf8");if(r>=e)return PN(t,e);let s=e-r,i=PN(t,s);return`${jN}${i}`}function PN(t,e){if(e<=0)return"";let n=Buffer.from(t,"utf8"),r=Math.max(0,n.length-e);for(;r<n.length&&(n[r]&192)===128;)r+=1;return n.subarray(r).toString("utf8")}function FN(t){let e=qN(new Date(t.timestamp_ms))??"",n="";try{let i=JSON.parse(t.payload);typeof i.alias=="string"&&(n=`alias=${i.alias}`),typeof i.provider=="string"&&(n+=`${n?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(n+=`${n?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(n+=`${n?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(n+=`${n?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let r=n!==""?n:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${r}`}function WN(t){return Si(t,"--since")}function qN(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let n=r=>String(r).padStart(2,"0");return`${e.getFullYear()}-${n(e.getMonth()+1)}-${n(e.getDate())} ${n(e.getHours())}:${n(e.getMinutes())}:${n(e.getSeconds())}`}var OK,LK,CK,Bl,$K,Hl,jN,HN=E(()=>{"use strict";wt();Ie();yt();Vt();Yt();Xm();OK={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},LK=4096,CK=2,Bl=1,$K=`usage: lmctl tail [target] [alias]
2941
2941
  lmctl tail --session <id> [--provider <name>]
@@ -3074,9 +3074,9 @@ CREATE TABLE IF NOT EXISTS build_lock (
3074
3074
  pid INTEGER NOT NULL
3075
3075
  );
3076
3076
  `});var cA={};oe(cA,{discoverTargets:()=>aA,indexOneSession:()=>lA,pullInvocations:()=>oA,runSessionIndex:()=>BK});import{existsSync as WK}from"node:fs";async function BK(t,e,n=mp){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${qK}
3077
- `),0;let[r]=t;if(r!=="build")return k(e,`session-index: unknown subcommand "${r??""}" (expected: build)`);let s=Q(),i=JN(),o={invocations_pulled:0,sessions_scanned:0,sessions_updated:0,sessions_skipped_unchanged:0,errors:[]};if(!WK(s))return H(e,{schema_version:1,index_db:i,state_db_found:!1,...o}),0;let a=GN(i),l=KN(s);try{zN(a);try{o.invocations_pulled=oA(l,a);let c=aA(l,a,n),u=new Map;for(let d of new Set(c.map(f=>f.provider)))u.set(d,await n.listSessions({provider:d}));for(let d of c){o.sessions_scanned+=1;try{let f=u.get(d.provider)?.find(p=>p.sessionId===d.sessionId);await lA(a,d,f,n)?o.sessions_updated+=1:o.sessions_skipped_unchanged+=1}catch(f){o.errors.push(`${d.provider}:${d.sessionId} \u2014 ${f instanceof Error?f.message:String(f)}`)}}}finally{ZN(a)}}finally{l.close(),a.close()}return H(e,{schema_version:1,index_db:i,state_db_found:!0,...o}),0}function oA(t,e){let n=VN(e,iA),r=t.prepare("SELECT id, kind, origin, target_teamfile, target_alias, from_identity, meta, command, status, started_at, ended_at, exit_code, error FROM tracked_invocation WHERE id > ? ORDER BY id ASC").all(n),s=wn(),i=n,o=0;for(let a of r){let l=null,c=null;if(a.meta!==null)try{let u=JSON.parse(a.meta);typeof u.provider=="string"&&(l=u.provider),typeof u.sessionid=="string"&&(c=u.sessionid)}catch{}if(nA(e,{id:a.id,kind:a.kind,origin:a.origin,target_teamfile:a.target_teamfile,target_alias:a.target_alias,from_identity:a.from_identity,provider:l,session_id:c,command:a.command,status:a.status,started_at:a.started_at,ended_at:a.ended_at,exit_code:a.exit_code,error:a.error}),o+=1,a.status==="running"&&Date.now()-new Date(a.started_at).getTime()<=s)break;i=a.id}return i>n&&YN(e,iA,i),o}function aA(t,e,n=mp){let r=new Map,s=t.prepare("SELECT teamfile_path FROM root_team ORDER BY teamfile_path ASC").all().map(i=>i.teamfile_path);for(let i of s){let o;try{o=n.readTeamConfig(i)}catch{continue}for(let a of o.members){if(a.session===void 0||a.session.length===0)continue;let l=`${a.provider}\0${a.session}`;r.set(l,{provider:a.provider,sessionId:a.session,teamfile:i,alias:a.alias})}}for(let{provider:i,session_id:o}of rA(e)){let a=`${i}\0${o}`;r.has(a)||r.set(a,{provider:i,sessionId:o,teamfile:null,alias:null})}return[...r.values()]}async function lA(t,e,n,r=mp){if(n===void 0)return!1;let s={modifiedAt:n.modifiedAt.toISOString(),messageCount:n.messageCount},i=eA(t,e.provider,e.sessionId);if(i!==null&&i.modified_at===s.modifiedAt&&i.message_count===s.messageCount)return!1;let o=await r.loadSessionDetail(e.sessionId,e.provider);if(o===null)return!1;let a=Ol(o);return tA(t,e.provider,e.sessionId,o.messages.filter(l=>l.role==="user"||l.role==="assistant").map((l,c)=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,seq:c,role:l.role,content:l.content,model:l.model??null,timestamp_ms:l.timestamp.getTime()})),a.map(l=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,kind:l.kind,name:l.name,command:l.command??null,path:l.path??null,started_at:l.startedAt,ended_at:l.endedAt,result:l.result}))),QN(t,{provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,modified_at:s.modifiedAt,message_count:s.messageCount,indexed_at:new Date().toISOString()}),!0}var qK,iA,mp,dA=E(()=>{"use strict";ct();Vt();mt();wt();We();Ll();sA();Ie();qK=["usage: lmctl session-index build [--db PATH]","","One-shot background aggregation into ~/.lmctl/session-index.db (a","separate file from state.db). Indexes provider session messages,","classified tool calls, and lmctl's own tracked_invocation dispatch","history for every teamfile member lmctl knows about, plus any","superseded sessions already on record. Idempotent and safe to run on","a cron/loop; not wired into `lmctl serve` in this pass."].join(`
3077
+ `),0;let[r]=t;if(r!=="build")return k(e,`session-index: unknown subcommand "${r??""}" (expected: build)`);let s=Q(),i=JN(),o={invocations_pulled:0,sessions_scanned:0,sessions_updated:0,sessions_skipped_unchanged:0,errors:[]};if(!WK(s))return J(e,{schema_version:1,index_db:i,state_db_found:!1,...o}),0;let a=GN(i),l=KN(s);try{zN(a);try{o.invocations_pulled=oA(l,a);let c=aA(l,a,n),u=new Map;for(let d of new Set(c.map(f=>f.provider)))u.set(d,await n.listSessions({provider:d}));for(let d of c){o.sessions_scanned+=1;try{let f=u.get(d.provider)?.find(p=>p.sessionId===d.sessionId);await lA(a,d,f,n)?o.sessions_updated+=1:o.sessions_skipped_unchanged+=1}catch(f){o.errors.push(`${d.provider}:${d.sessionId} \u2014 ${f instanceof Error?f.message:String(f)}`)}}}finally{ZN(a)}}finally{l.close(),a.close()}return J(e,{schema_version:1,index_db:i,state_db_found:!0,...o}),0}function oA(t,e){let n=VN(e,iA),r=t.prepare("SELECT id, kind, origin, target_teamfile, target_alias, from_identity, meta, command, status, started_at, ended_at, exit_code, error FROM tracked_invocation WHERE id > ? ORDER BY id ASC").all(n),s=wn(),i=n,o=0;for(let a of r){let l=null,c=null;if(a.meta!==null)try{let u=JSON.parse(a.meta);typeof u.provider=="string"&&(l=u.provider),typeof u.sessionid=="string"&&(c=u.sessionid)}catch{}if(nA(e,{id:a.id,kind:a.kind,origin:a.origin,target_teamfile:a.target_teamfile,target_alias:a.target_alias,from_identity:a.from_identity,provider:l,session_id:c,command:a.command,status:a.status,started_at:a.started_at,ended_at:a.ended_at,exit_code:a.exit_code,error:a.error}),o+=1,a.status==="running"&&Date.now()-new Date(a.started_at).getTime()<=s)break;i=a.id}return i>n&&YN(e,iA,i),o}function aA(t,e,n=mp){let r=new Map,s=t.prepare("SELECT teamfile_path FROM root_team ORDER BY teamfile_path ASC").all().map(i=>i.teamfile_path);for(let i of s){let o;try{o=n.readTeamConfig(i)}catch{continue}for(let a of o.members){if(a.session===void 0||a.session.length===0)continue;let l=`${a.provider}\0${a.session}`;r.set(l,{provider:a.provider,sessionId:a.session,teamfile:i,alias:a.alias})}}for(let{provider:i,session_id:o}of rA(e)){let a=`${i}\0${o}`;r.has(a)||r.set(a,{provider:i,sessionId:o,teamfile:null,alias:null})}return[...r.values()]}async function lA(t,e,n,r=mp){if(n===void 0)return!1;let s={modifiedAt:n.modifiedAt.toISOString(),messageCount:n.messageCount},i=eA(t,e.provider,e.sessionId);if(i!==null&&i.modified_at===s.modifiedAt&&i.message_count===s.messageCount)return!1;let o=await r.loadSessionDetail(e.sessionId,e.provider);if(o===null)return!1;let a=Ol(o);return tA(t,e.provider,e.sessionId,o.messages.filter(l=>l.role==="user"||l.role==="assistant").map((l,c)=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,seq:c,role:l.role,content:l.content,model:l.model??null,timestamp_ms:l.timestamp.getTime()})),a.map(l=>({provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,kind:l.kind,name:l.name,command:l.command??null,path:l.path??null,started_at:l.startedAt,ended_at:l.endedAt,result:l.result}))),QN(t,{provider:e.provider,session_id:e.sessionId,teamfile:e.teamfile,alias:e.alias,modified_at:s.modifiedAt,message_count:s.messageCount,indexed_at:new Date().toISOString()}),!0}var qK,iA,mp,dA=E(()=>{"use strict";ct();Vt();mt();wt();We();Ll();sA();Ie();qK=["usage: lmctl session-index build [--db PATH]","","One-shot background aggregation into ~/.lmctl/session-index.db (a","separate file from state.db). Indexes provider session messages,","classified tool calls, and lmctl's own tracked_invocation dispatch","history for every teamfile member lmctl knows about, plus any","superseded sessions already on record. Idempotent and safe to run on","a cron/loop; not wired into `lmctl serve` in this pass."].join(`
3078
3078
  `),iA="tracked_invocation_max_id",mp={listSessions:tr,loadSessionDetail:Ne,readTeamConfig:Fe}});function pp(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e],r=HK.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:XK(n.timestamp,s,i,o,a),reset_time:l,timezone:a,detected_at:n.timestamp.toISOString()}}return null}function XK(t,e,n,r,s){if(!Number.isFinite(t.getTime())||e<1||e>12||n<0||n>59)return null;let i=JK(e,r);try{let o=GK(t,s),a=uA(o.year,o.month,o.day,i,n,s);if(a.getTime()<=t.getTime()){let l=zK(o,1);a=uA(l.year,l.month,l.day,i,n,s)}return a.toISOString()}catch{return null}}function JK(t,e){return e==="am"?t===12?0:t:t===12?12:t+12}function GK(t,e){let n=fA(e,!1).formatToParts(t);return{year:hn(n,"year"),month:hn(n,"month"),day:hn(n,"day")}}function uA(t,e,n,r,s,i){let o=Date.UTC(t,e-1,n,r,s,0,0);for(let a=0;a<3;a+=1){let l=KK(new Date(o),i);o=Date.UTC(t,e-1,n,r,s,0,0)-l}return new Date(o)}function KK(t,e){let n=fA(e,!0).formatToParts(t);return Date.UTC(hn(n,"year"),hn(n,"month")-1,hn(n,"day"),hn(n,"hour"),hn(n,"minute"),hn(n,"second"),0)-t.getTime()}function fA(t,e){let n=e?YK:VK,r=n.get(t);if(r!==void 0)return r;let s=new Intl.DateTimeFormat("en-US",{timeZone:t,hourCycle:"h23",year:"numeric",month:"2-digit",day:"2-digit",...e?{hour:"2-digit",minute:"2-digit",second:"2-digit"}:{}});return n.set(t,s),s}function hn(t,e){let n=t.find(r=>r.type===e)?.value;if(n===void 0)throw new Error(`missing ${e}`);return Number.parseInt(n,10)}function zK(t,e){let n=new Date(Date.UTC(t.year,t.month-1,t.day+e));return{year:n.getUTCFullYear(),month:n.getUTCMonth()+1,day:n.getUTCDate()}}var HK,VK,YK,mA=E(()=>{"use strict";HK=/you['\u2019]ve hit your session limit\s*(?:\u00b7|-|:)?\s*resets\s+([0-9]{1,2})(?::([0-9]{2}))?\s*(am|pm)\s*(?:\(([^)]+)\))?/i;VK=new Map,YK=new Map});var TA={};oe(TA,{runInfo:()=>nV});import{execFileSync as _p}from"node:child_process";import{dirname as pA,resolve as ZK}from"node:path";function tV(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function nV(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${eV}
3079
- `),0;let n=V(t,["--provider","--run"],["--json","--help"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let r=B(n,"--json"),s=L(n,"--run");if(s!==void 0){if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional [target] [alias]");if(L(n,"--provider")!==void 0)return k(e,"--run is mutually exclusive with --provider");let u=Number.parseInt(s,10);if(!Number.isFinite(u)||u<=0||String(u)!==s)return k(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(e,async d=>sV(e,d,u,r))}catch(d){return Pe(e,d)}}let i=gt(QK,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:L(n,"--provider")}});if(i.mode==="error")return k(e,i.message);if(i.mode==="managed")return k(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let u;try{u=await O(e,d=>ve(i.teamfile,d))}catch(d){return k(e,`health: ${d instanceof Error?d.message:String(d)}`)}return iV(e,u,r)}let o,a,l,c;if(i.mode==="ai-team")try{let u=await O(e,d=>Me(i.teamfile,i.alias,d));o=u.provider,a=u.sessionid,l=u.alias,c={teamfile:u.teamfile,alias:u.alias}}catch(u){return u instanceof Ee?k(e,u.message):Pe(e,u)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let u=await zt(a);if(u.length===0)return k(e,`health: session "${a}" not found in any provider store`);if(u.length>1)return k(e,`health: session "${a}" matches multiple providers (${u.join(", ")}); pass --provider`);o=u[0]}return rV(e,o,a,l,r,c)}async function rV(t,e,n,r,s,i){let o;try{o=await Ne(n,e)}catch(u){return k(t,`health: failed to load session: ${u instanceof Error?u.message:String(u)}`)}if(o===null)return k(t,`health: session not found: ${n} (provider=${e})`);let a=pp(o.messages),l=i===void 0?null:await oV(t,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?(H(t,{schema_version:gp,...c}),0):(t.stdout.write(`Session: ${o.sessionId}
3079
+ `),0;let n=Y(t,["--provider","--run"],["--json","--help"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected [target] [alias]`);let r=X(n,"--json"),s=C(n,"--run");if(s!==void 0){if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional [target] [alias]");if(C(n,"--provider")!==void 0)return k(e,"--run is mutually exclusive with --provider");let u=Number.parseInt(s,10);if(!Number.isFinite(u)||u<=0||String(u)!==s)return k(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await L(e,async d=>sV(e,d,u,r))}catch(d){return Pe(e,d)}}let i=gt(QK,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:C(n,"--provider")}});if(i.mode==="error")return k(e,i.message);if(i.mode==="managed")return k(e,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let u;try{u=await L(e,d=>ve(i.teamfile,d))}catch(d){return k(e,`health: ${d instanceof Error?d.message:String(d)}`)}return iV(e,u,r)}let o,a,l,c;if(i.mode==="ai-team")try{let u=await L(e,d=>Me(i.teamfile,i.alias,d));o=u.provider,a=u.sessionid,l=u.alias,c={teamfile:u.teamfile,alias:u.alias}}catch(u){return u instanceof Ee?k(e,u.message):Pe(e,u)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let u=await zt(a);if(u.length===0)return k(e,`health: session "${a}" not found in any provider store`);if(u.length>1)return k(e,`health: session "${a}" matches multiple providers (${u.join(", ")}); pass --provider`);o=u[0]}return rV(e,o,a,l,r,c)}async function rV(t,e,n,r,s,i){let o;try{o=await Ne(n,e)}catch(u){return k(t,`health: failed to load session: ${u instanceof Error?u.message:String(u)}`)}if(o===null)return k(t,`health: session not found: ${n} (provider=${e})`);let a=pp(o.messages),l=i===void 0?null:await oV(t,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?(J(t,{schema_version:gp,...c}),0):(t.stdout.write(`Session: ${o.sessionId}
3080
3080
  `),t.stdout.write(` Provider: ${o.provider}
3081
3081
  `),r!==void 0&&t.stdout.write(` Alias: ${r}
3082
3082
  `),l!==null&&t.stdout.write(` Liveness: ${hp(l.liveness)}
@@ -3090,7 +3090,7 @@ CREATE TABLE IF NOT EXISTS build_lock (
3090
3090
  `),a!==null&&t.stdout.write(` SessionLimit: LIMITED resets_at=${gA(a)}
3091
3091
  `),t.stdout.write(` Created: ${c.createdAt}
3092
3092
  `),t.stdout.write(` Modified: ${c.modifiedAt}
3093
- `),0)}async function sV(t,e,n,r){let s=rr(e,n);if(s===null)return k(t,`health: run ${n}: not found`);let i=Fr(e,n),o=e.agentCallTokenTotals(n),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return r?(H(t,{schema_version:gp,run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
3093
+ `),0)}async function sV(t,e,n,r){let s=rr(e,n);if(s===null)return k(t,`health: run ${n}: not found`);let i=Fr(e,n),o=e.agentCallTokenTotals(n),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return r?(J(t,{schema_version:gp,run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:i?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:o.totalInputTokens,totalOutputTokens:o.totalOutputTokens,agent_call_count:o.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
3094
3094
  `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
3095
3095
  `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
3096
3096
  `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -3100,15 +3100,15 @@ CREATE TABLE IF NOT EXISTS build_lock (
3100
3100
  `),t.stdout.write(` Steps: ${s.steps.length}
3101
3101
  `),t.stdout.write(` AgentCalls: ${o.agentCallCount}
3102
3102
  `),t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
3103
- `),0)}async function iV(t,e,n){let r,s;try{let w=await O(t,S=>{let I=rt(e,S);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:_A(e,S,new Set,[])}});s=w.teamName,r=w.targets}catch(w){return k(t,`health: ${w instanceof Error?w.message:String(w)}`)}let i=yA(e),o=i.kind==="repo"?i:null,a=await hA(t,r),l=[],c=0,u=o===null?void 0:0,d=o===null?void 0:0;for(let w of r){let S=null;try{S=await Ne(w.sessionid,w.provider)}catch(j){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${j instanceof Error?j.message:String(j)}
3104
- `)}let I=S?.messageCount,v=o===null?void 0:S===null?null:wA(S,o.since),M=o===null?void 0:S===null?null:EA(S)??"n/a",D=o===null?void 0:{messageCount:v??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:I??null,model:S?.model??"(unknown)",lastContext:S?.lastInputTokens,detailLoaded:S!==null,liveness:a.get(yp(w.teamfile,w.alias))??wp(),sessionLimit:S===null?null:pp(S.messages),...o!==null?{activitySinceLastCommit:D,cumulativeTokens:M}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(v==null?u=void 0:u!==void 0&&(u+=v),M==null||M==="n/a"?d=void 0:d!==void 0&&(d+=M))}if(n)return H(t,{schema_version:gp,team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:w,cumulativeTokens:S,...I})=>({...I,lastContext:I.lastContext??null,...S!==void 0?{cumulativeTokens:S==="n/a"?null:S}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,h=Math.max(5,...l.map(w=>w.model.length))+1,_=Math.max(4,...l.map(w=>hp(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
3103
+ `),0)}async function iV(t,e,n){let r,s;try{let w=await L(t,v=>{let N=rt(e,v);if(N.parseErrors.length>0)throw new Error(N.parseErrors.join("; "));return{teamName:N.name,targets:_A(e,v,new Set,[])}});s=w.teamName,r=w.targets}catch(w){return k(t,`health: ${w instanceof Error?w.message:String(w)}`)}let i=yA(e),o=i.kind==="repo"?i:null,a=await hA(t,r),l=[],c=0,u=o===null?void 0:0,d=o===null?void 0:0;for(let w of r){let v=null;try{v=await Ne(w.sessionid,w.provider)}catch(D){t.stderr.write(`warning: failed to load session "${w.sessionid}" for ${w.reportPath} (${w.provider}): ${D instanceof Error?D.message:String(D)}
3104
+ `)}let N=v?.messageCount,S=o===null?void 0:v===null?null:wA(v,o.since),O=o===null?void 0:v===null?null:EA(v)??"n/a",P=o===null?void 0:{messageCount:S??null,tokens:null};l.push({alias:w.alias,reportPath:w.reportPath,teamfile:w.teamfile,provider:w.provider,sessionid:w.sessionid,messageCount:N??null,model:v?.model??"(unknown)",lastContext:v?.lastInputTokens,detailLoaded:v!==null,liveness:a.get(yp(w.teamfile,w.alias))??wp(),sessionLimit:v===null?null:pp(v.messages),...o!==null?{activitySinceLastCommit:P,cumulativeTokens:O}:{}}),N===void 0?c=void 0:c!==void 0&&(c+=N),o!==null&&(S==null?u=void 0:u!==void 0&&(u+=S),O==null||O==="n/a"?d=void 0:d!==void 0&&(d+=O))}if(n)return J(t,{schema_version:gp,team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(w=>({ref:w.ref,timestamp:w.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:w,cumulativeTokens:v,...N})=>({...N,lastContext:N.lastContext??null,...v!==void 0?{cumulativeTokens:v==="n/a"?null:v}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(w=>w.sessionid.length)),m=Math.max(5,...l.map(w=>w.reportPath.length))+1,p=Math.max(8,...l.map(w=>w.provider.length))+1,h=Math.max(5,...l.map(w=>w.model.length))+1,_=Math.max(4,...l.map(w=>hp(w.liveness).length))+1;if(t.stdout.write(`TEAM: ${s}
3105
3105
  `),i.kind==="repo"){t.stdout.write(`Git progress:
3106
3106
  `);for(let w of i.commits)t.stdout.write(` ${w.ref}: ${w.timestamp.toISOString()}
3107
3107
  `);t.stdout.write(` Uncommitted: ${$t(i.working.uncommittedTracked)} changed (tracked), ${$t(i.working.untracked)} untracked
3108
3108
  `)}else i.reason==="no-commits"?t.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
3109
3109
  `):t.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
3110
3110
  `);t.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(h)}${"LIVE".padEnd(_)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
3111
- `);let y=!1,g=l.filter(w=>w.sessionLimit!==null);for(let w of l){let S=cV(w.lastContext,w.detailLoaded,tV);(S==="n/a"||w.cumulativeTokens==="n/a")&&(y=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(h)}${hp(w.liveness).padEnd(_)}${$t(w.messageCount).padStart(6)} ${S.padStart(12)}`+(o!==null?` ${$t(w.activitySinceLastCommit?.messageCount).padStart(17)} ${$t(w.activitySinceLastCommit?.tokens).padStart(19)} ${lV(w.cumulativeTokens).padStart(19)}`:"")+`
3111
+ `);let y=!1,g=l.filter(w=>w.sessionLimit!==null);for(let w of l){let v=cV(w.lastContext,w.detailLoaded,tV);(v==="n/a"||w.cumulativeTokens==="n/a")&&(y=!0),t.stdout.write(` ${w.sessionid.padEnd(f)} ${w.reportPath.padEnd(m)}${w.provider.padEnd(p)}${w.model.padEnd(h)}${hp(w.liveness).padEnd(_)}${$t(w.messageCount).padStart(6)} ${v.padStart(12)}`+(o!==null?` ${$t(w.activitySinceLastCommit?.messageCount).padStart(17)} ${$t(w.activitySinceLastCommit?.tokens).padStart(19)} ${lV(w.cumulativeTokens).padStart(19)}`:"")+`
3112
3112
  `)}if(t.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(h)}${"".padEnd(_)}${$t(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${$t(u).padStart(17)} ${$t(null).padStart(19)} ${$t(d).padStart(19)}`:"")+`
3113
3113
  `),y&&t.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
3114
3114
  `),t.stdout.write(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
@@ -3117,7 +3117,7 @@ CREATE TABLE IF NOT EXISTS build_lock (
3117
3117
  small. Re-read after the next turn before concluding a compaction failed or gating on the value.
3118
3118
  `),g.length>0){t.stdout.write(`Session limits:
3119
3119
  `);for(let w of g)t.stdout.write(` ${w.reportPath}: LIMITED resets_at=${gA(w.sessionLimit)}
3120
- `)}return 0}function _A(t,e,n,r){let s=ve(t,e);if(n.has(s))return[];n.add(s);let i=rt(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(..._A(ZK(pA(s),a.teamfile),e,n,[...r,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function oV(t,e,n){let r=await hA(t,[{teamfile:e.teamfile,alias:e.alias}]),s=yA(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:n.lastInputTokens??null,liveness:r.get(yp(e.teamfile,e.alias))??wp(),...i!==null?{activitySinceLastCommit:{messageCount:wA(n,i.since),tokens:null},cumulativeTokens:EA(n)??"n/a"}:{}}}async function hA(t,e){try{let n=await O(t,r=>e.map(s=>{let i=Sr(r,s.teamfile,s.alias);return[yp(s.teamfile,s.alias),aV(i)]}));return new Map(n)}catch{return new Map}}function yp(t,e){return`${t}\0${e.toLowerCase()}`}function aV(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:wp(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function wp(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function hp(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead":"stale"})`}return"idle"}function gA(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function $t(t){return t==null?"unknown":String(t)}function lV(t){return t==="n/a"?t:$t(t)}function cV(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function yA(t){let e=pA(t),n;try{_p("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=_p("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:dV(e)}}function dV(t){let e;try{e=_p("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function wA(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function EA(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var QK,gp,eV,vA=E(()=>{"use strict";wt();Ie();yt();Yt();ct();on();mA();QK={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},gp=1,eV=`usage: lmctl health [target] [alias]
3120
+ `)}return 0}function _A(t,e,n,r){let s=ve(t,e);if(n.has(s))return[];n.add(s);let i=rt(s,e);if(i.parseErrors.length>0)throw new Error(`${s}: ${i.parseErrors.join("; ")}`);let o=[];for(let a of i.members){if(a.teamfile!==void 0){o.push(..._A(ZK(pA(s),a.teamfile),e,n,[...r,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...r,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function oV(t,e,n){let r=await hA(t,[{teamfile:e.teamfile,alias:e.alias}]),s=yA(e.teamfile),i=s.kind==="repo"?s:null;return{teamfile:e.teamfile,reportPath:e.alias,lastContext:n.lastInputTokens??null,liveness:r.get(yp(e.teamfile,e.alias))??wp(),...i!==null?{activitySinceLastCommit:{messageCount:wA(n,i.since),tokens:null},cumulativeTokens:EA(n)??"n/a"}:{}}}async function hA(t,e){try{let n=await L(t,r=>e.map(s=>{let i=Sr(r,s.teamfile,s.alias);return[yp(s.teamfile,s.alias),aV(i)]}));return new Map(n)}catch{return new Map}}function yp(t,e){return`${t}\0${e.toLowerCase()}`}function aV(t){return t.busy?t.reason==="terminal-held"?t.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:t.terminalInvocation.id,startedAt:t.terminalInvocation.started_at,lastHeartbeat:t.terminalInvocation.last_heartbeat_at,holderPid:t.terminalInvocation.holder_pid,holderHost:t.terminalInvocation.holder_host},reclaimable:null}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:t.terminalLock.started_at,lastHeartbeat:t.terminalLock.last_heartbeat,holderPid:t.terminalLock.holder_pid,holderHost:t.terminalLock.holder_host},terminalInvocation:null,reclaimable:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:t.inFlight.sender_teamfile,senderAlias:t.inFlight.sender_alias,startedAt:t.inFlight.started_at,activeCount:t.inFlight.active_count,holderPid:t.inFlight.holder_pid},terminalLock:null,terminalInvocation:null,reclaimable:null}:wp(t.reclaimable===void 0?null:{source:t.reclaimable.source,holderPid:t.reclaimable.holder_pid,holderHost:t.reclaimable.holder_host,reason:t.reclaimable.reason})}function wp(t=null){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null,reclaimable:t}}function hp(t){if(t.state!=="idle")return`busy (${t.reason})`;if(t.reclaimable!==null){let{holderPid:e,holderHost:n,reason:r}=t.reclaimable;return`idle (reclaimable lock: ${e!==null?`pid ${e}${n!==null?` on ${n}`:""}`:"holder"} ${r==="dead-pid"?"appears dead":"stale"})`}return"idle"}function gA(t){return t.resets_at!==null?t.resets_at:t.timezone!==null?`${t.reset_time} (${t.timezone})`:t.reset_time}function $t(t){return t==null?"unknown":String(t)}function lV(t){return t==="n/a"?t:$t(t)}function cV(t,e,n=String){return t!==void 0?n(t):e?"n/a":"unknown"}function yA(t){let e=pA(t),n;try{_p("git",["-C",e,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:e}}try{n=_p("git",["-C",e,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:e}}let r=n.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(r.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:e};let s=r.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:e,since:s[0].timestamp,commits:s,working:dV(e)}}function dV(t){let e;try{e=_p("git",["-C",t,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let n=0,r=0;for(let s of e.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?r+=1:n+=1);return{uncommittedTracked:n,untracked:r}}function wA(t,e){let n=e.getTime();return t.messages.filter(r=>(r.role==="user"||r.role==="assistant")&&Number.isFinite(r.timestamp.getTime())&&r.timestamp.getTime()>n).length}function EA(t){if(t===null)return null;let e=[t.totalInputTokens,t.totalCachedInputTokens,t.totalCacheWriteInputTokens,t.totalOutputTokens,t.totalReasoningOutputTokens].filter(n=>typeof n=="number"&&Number.isFinite(n));return e.length===0?null:e.reduce((n,r)=>n+r,0)}var QK,gp,eV,vA=E(()=>{"use strict";wt();Ie();yt();Yt();ct();on();mA();QK={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},gp=1,eV=`usage: lmctl health [target] [alias]
3121
3121
  lmctl health <teamfile> # team rollup
3122
3122
  lmctl health <sessionid> [--provider <name>]
3123
3123
  lmctl health --run <id> # run state, step rollup, and token totals
@@ -3127,7 +3127,7 @@ Show provider session details, team rollups, or managed run state/token totals.
3127
3127
  --json adds a schema_version field to whichever shape the target resolves
3128
3128
  to (single session / team rollup / --run) -- additive-only evolution, like
3129
3129
  \`lmctl session\`'s own JSON contract.`});import{mkdirSync as uV,readFileSync as Ep,writeFileSync as SA,existsSync as kA}from"node:fs";import{homedir as fV}from"node:os";import{dirname as IA,join as Tp,resolve as Jl}from"node:path";import{fileURLToPath as mV}from"node:url";function hV(){return Tp(fV(),".lmctl","cache","lmprice")}function NA(t){return Tp(t,"model_list.json")}function AA(t){return Tp(t,"model_list.meta.json")}function gV(t){try{let e=Ep(NA(t),"utf-8"),n=JSON.parse(e),r=null;try{r=JSON.parse(Ep(AA(t),"utf-8")).etag??null}catch{}return{catalog:n,etag:r}}catch{return null}}function yV(t,e,n){try{uV(t,{recursive:!0}),SA(NA(t),JSON.stringify(e));let r={etag:n,fetchedAt:new Date().toISOString()};SA(AA(t),JSON.stringify(r))}catch{}}function wV(t){let e=EV(t),n=e?[Jl(e,"data","price-data.json")]:[Jl(t,"..","..","data","price-data.json")];for(let r of n)if(kA(r))return r;return null}function EV(t){let e=Jl(t);for(;;){if(kA(Jl(e,"package.json")))return e;let n=IA(e);if(n===e)return null;e=n}}function TV(t){let e=t!==void 0?t:wV(IA(mV(import.meta.url)));if(e===null)return null;try{return JSON.parse(Ep(e,"utf-8"))}catch{return null}}async function xA(t={}){let e=t.fetchImpl??fetch,n=t.cacheDir??hV(),r=gV(n);try{let i=await e(bA,{method:"HEAD",signal:AbortSignal.timeout(pV)});if(i.ok){let o=i.headers.get("etag");if(r&&o!==null&&o===r.etag)return{catalog:r.catalog,source:"cache",generatedAt:r.catalog.generated_at};let a=await e(bA,{signal:AbortSignal.timeout(_V)});if(a.ok){let l=await a.json();return yV(n,l,a.headers.get("etag")),{catalog:l,source:"network",generatedAt:l.generated_at}}}}catch{}if(r)return{catalog:r.catalog,source:"cache",generatedAt:r.catalog.generated_at};let s=TV(t.bundledPath);return s?{catalog:s,source:"bundled",generatedAt:s.generated_at}:{catalog:null,source:"unavailable",generatedAt:null}}function RA(t,e){let n=e.toLowerCase(),r=t.records.find(i=>i.source_model_id.toLowerCase()===n);if(r)return r.pricing;let s=t.records.find(i=>i.source_model_id.toLowerCase().endsWith(`/${n}`));return s?s.pricing:null}function OA(t,e){if(e===null)return null;let{input_per_1m_tokens:n,output_per_1m_tokens:r,input_cache_read_per_1m_tokens:s}=e;if(n===null||r===null)return null;let i=s??n,o=t.input/1e6*n+t.output/1e6*r+t.cachedInput/1e6*i;return Number(o.toPrecision(10))}var bA,pV,_V,LA=E(()=>{"use strict";bA="https://lmctl.com/dataset/model_list.json",pV=1e3,_V=1e4});var CA={};oe(CA,{runCost:()=>kV});async function kV(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${bV}
3130
- `),0;let n=V(t,["--provider"],["--json"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected <target> [alias]`);let r=B(n,"--json"),s=gt(vV,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:L(n,"--provider")}});if(s.mode==="error")return k(e,s.message);if(s.mode==="managed")return k(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,o;if(s.mode==="ai-team")try{let g=await O(e,w=>Me(s.teamfile,s.alias,w));i=g.provider,o=g.sessionid}catch(g){if(g instanceof Ee)return k(e,g.message);throw g}else if(o=s.sessionid,s.provider!==void 0)i=s.provider;else{let g=await zt(o);if(g.length===0)return k(e,`cost: session "${o}" not found in any provider store`);if(g.length>1)return k(e,`cost: session "${o}" matches multiple providers (${g.join(", ")}); pass --provider`);i=g[0]}let a;try{a=await Ne(o,i)}catch(g){return k(e,`cost: failed to load session: ${g instanceof Error?g.message:String(g)}`)}if(a===null)return k(e,`cost: session not found: ${o} (provider=${i})`);let l=[...new Set(a.messages.map(g=>g.model).filter(g=>g!==void 0&&g!=="<synthetic>"))],c=[...a.messages].reverse().find(g=>g.model!==void 0&&g.model!=="<synthetic>")?.model,u=a.model??c??null,d=l.length>1,f={input:a.totalInputTokens??null,output:a.totalOutputTokens??null,cachedInput:a.totalCachedInputTokens??null},m=await xA(),p=u!==null&&m.catalog!==null?RA(m.catalog,u):null,h=p===null?null:{inputPer1m:p.input_per_1m_tokens,outputPer1m:p.output_per_1m_tokens,cachedInputPer1m:p.input_cache_read_per_1m_tokens},_=f.input===null||f.output===null?null:OA({input:f.input,output:f.output,cachedInput:f.cachedInput??0},p),y={schema_version:SV,provider:i,sessionId:o,model:u,modelsUsed:l,approximate:d,tokens:f,pricePerModel:h,costUsd:_,priceDataSource:m.source,priceDataGeneratedAt:m.generatedAt};return r?(H(e,y),0):(e.stdout.write(`Session: ${o}
3130
+ `),0;let n=Y(t,["--provider"],["--json"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected <target> [alias]`);let r=X(n,"--json"),s=gt(vV,{target:n.positionals[0],alias:n.positionals[1],flags:{provider:C(n,"--provider")}});if(s.mode==="error")return k(e,s.message);if(s.mode==="managed")return k(e,"cost: managed-run targets are not supported (no per-run token/model rollup exists)");let i,o;if(s.mode==="ai-team")try{let g=await L(e,w=>Me(s.teamfile,s.alias,w));i=g.provider,o=g.sessionid}catch(g){if(g instanceof Ee)return k(e,g.message);throw g}else if(o=s.sessionid,s.provider!==void 0)i=s.provider;else{let g=await zt(o);if(g.length===0)return k(e,`cost: session "${o}" not found in any provider store`);if(g.length>1)return k(e,`cost: session "${o}" matches multiple providers (${g.join(", ")}); pass --provider`);i=g[0]}let a;try{a=await Ne(o,i)}catch(g){return k(e,`cost: failed to load session: ${g instanceof Error?g.message:String(g)}`)}if(a===null)return k(e,`cost: session not found: ${o} (provider=${i})`);let l=[...new Set(a.messages.map(g=>g.model).filter(g=>g!==void 0&&g!=="<synthetic>"))],c=[...a.messages].reverse().find(g=>g.model!==void 0&&g.model!=="<synthetic>")?.model,u=a.model??c??null,d=l.length>1,f={input:a.totalInputTokens??null,output:a.totalOutputTokens??null,cachedInput:a.totalCachedInputTokens??null},m=await xA(),p=u!==null&&m.catalog!==null?RA(m.catalog,u):null,h=p===null?null:{inputPer1m:p.input_per_1m_tokens,outputPer1m:p.output_per_1m_tokens,cachedInputPer1m:p.input_cache_read_per_1m_tokens},_=f.input===null||f.output===null?null:OA({input:f.input,output:f.output,cachedInput:f.cachedInput??0},p),y={schema_version:SV,provider:i,sessionId:o,model:u,modelsUsed:l,approximate:d,tokens:f,pricePerModel:h,costUsd:_,priceDataSource:m.source,priceDataGeneratedAt:m.generatedAt};return r?(J(e,y),0):(e.stdout.write(`Session: ${o}
3131
3131
  `),e.stdout.write(` Provider: ${i}
3132
3132
  `),e.stdout.write(` Model: ${u??"(unknown)"}
3133
3133
  `),d&&e.stdout.write(` NOTE: this session used multiple models (${l.join(", ")}) -- cost below is approximate, priced at ${u}'s rate for the whole session.
@@ -3151,11 +3151,11 @@ came from (network / cache / bundled / unavailable) and
3151
3151
  strict short timeout and NEVER blocks or fails this command: any network
3152
3152
  error degrades silently to the local cache, then the bundled built-in
3153
3153
  copy, in that order.`});var DA={};oe(DA,{runLs:()=>xV});import{resolve as vp}from"node:path";function AV(t){let e=new Map;for(let n of t){let r=`${n.provider}:${n.sessionId}`,s=e.get(r);(s===void 0||n.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(r,n)}return[...e.values()]}async function xV(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${IV}
3154
- `),0;let n=V(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>0)return k(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=L(n,"--format"),s=B(n,"--json");if(B(n,"--runs")){for(let y of["--provider","--sessiondir"])if(L(n,y)!==void 0)return k(e,`--runs is mutually exclusive with ${y}`);for(let y of["--recursive","--all"])if(B(n,y))return k(e,`--runs is mutually exclusive with ${y}`);if(r==="teamfile")return k(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=L(n,"--limit"),h=NV;if(p!==void 0){let y=Number.parseInt(p,10);if(!Number.isFinite(y)||y<1||String(y)!==p)return k(e,`invalid --limit "${p}" (expected a positive integer)`);if(y>MA)return k(e,`--limit ${y} exceeds maximum (${MA})`);h=y}let _=r==="json"||s===!0?"json":"table";try{return await O(e,async y=>RV(e,y,h,_))}catch(y){return Pe(e,y)}}let o=OV(r,s);if("error"in o)return k(e,o.error);let a=o.format,l=L(n,"--provider"),c=L(n,"--sessiondir"),u=B(n,"--recursive"),d=B(n,"--all"),f;try{f=await tr(l?{provider:l}:{})}catch(p){return k(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?vp(c):vp(process.cwd());f=f.filter(h=>{let _=vp(h.cwd);return u?_===p||_.startsWith(`${p}/`):_===p})}if(f=AV(f),a==="json")return H(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
3154
+ `),0;let n=Y(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(n.error!==void 0)return k(e,n.error);if(n.positionals.length>0)return k(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let r=C(n,"--format"),s=X(n,"--json");if(X(n,"--runs")){for(let y of["--provider","--sessiondir"])if(C(n,y)!==void 0)return k(e,`--runs is mutually exclusive with ${y}`);for(let y of["--recursive","--all"])if(X(n,y))return k(e,`--runs is mutually exclusive with ${y}`);if(r==="teamfile")return k(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=C(n,"--limit"),h=NV;if(p!==void 0){let y=Number.parseInt(p,10);if(!Number.isFinite(y)||y<1||String(y)!==p)return k(e,`invalid --limit "${p}" (expected a positive integer)`);if(y>MA)return k(e,`--limit ${y} exceeds maximum (${MA})`);h=y}let _=r==="json"||s===!0?"json":"table";try{return await L(e,async y=>RV(e,y,h,_))}catch(y){return Pe(e,y)}}let o=OV(r,s);if("error"in o)return k(e,o.error);let a=o.format,l=C(n,"--provider"),c=C(n,"--sessiondir"),u=X(n,"--recursive"),d=X(n,"--all"),f;try{f=await tr(l?{provider:l}:{})}catch(p){return k(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?vp(c):vp(process.cwd());f=f.filter(h=>{let _=vp(h.cwd);return u?_===p||_.startsWith(`${p}/`):_===p})}if(f=AV(f),a==="json")return J(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
3155
3155
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
3156
3156
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
3157
3157
  `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
3158
- `)}return 0}async function RV(t,e,n,r){let s=Pr(e,{limit:n});if(r==="json")return H(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
3158
+ `)}return 0}async function RV(t,e,n,r){let s=Pr(e,{limit:n});if(r==="json")return J(t,s.map(i=>({id:i.id,job_id:i.job_id,workflow_id:i.workflow_id,team_id:i.team_id,current_state:i.current_state,terminal_state:i.terminal_state,started_at:i.started_at,ended_at:i.ended_at,paused_at:i.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
3159
3159
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
3160
3160
  `);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);t.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
3161
3161
  `)}return 0}function OV(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var IV,NV,MA,jA=E(()=>{"use strict";mt();Ie();on();IV=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
@@ -3163,27 +3163,27 @@ copy, in that order.`});var DA={};oe(DA,{runLs:()=>xV});import{resolve as vp}fro
3163
3163
  lmctl ls --runs [--limit N] [--format table|json] [--json]
3164
3164
 
3165
3165
  List native provider sessions in scope, or list recent managed runs with --runs.`,NV=50,MA=500});import{spawnSync as UA}from"node:child_process";import{existsSync as ps,readFileSync as Np}from"node:fs";import{homedir as WA}from"node:os";import{dirname as qA,resolve as Xn}from"node:path";import{fileURLToPath as LV}from"node:url";function DV(){let t=UA("agy",["models"],{encoding:"utf-8",timeout:MV});return{status:t.status,stdout:t.stdout??"",error:t.error}}function jV(t){let e=[];for(let n of t.split(/\r?\n/)){let r=n.trim(),s=r.indexOf(" ");if(s<0)continue;let i=r.slice(s+1).trim();i&&e.push(i)}return e}function PV(t){if(!t&&Sp)return Sp;let e=s=>(t||(Sp=s),s),n;try{n=(t??DV)()}catch(s){return e({available:!1,models:[],reason:`agy models could not be run: ${s instanceof Error?s.message:String(s)}`})}if(n.error)return e({available:!1,models:[],reason:`agy models could not be run: ${n.error.message}`});if(n.status!==0)return e({available:!1,models:[],reason:`agy models exited with status ${n.status??"unknown"}`});let r=jV(n.stdout);return r.length===0?e({available:!1,models:[],reason:"agy models returned no models"}):e({available:!0,models:r})}function UV(t){let e=UA("opencode",["models",t],{encoding:"utf-8",timeout:FV});return{status:e.status,stdout:e.stdout??"",error:e.error}}function WV(t,e){if(!e&&bp.has(t))return bp.get(t);let n=i=>(e||bp.set(t,i),i),r;try{r=(e??UV)(t)}catch(i){return n({available:!1,models:[],reason:`opencode models ${t} could not be run: ${i instanceof Error?i.message:String(i)}`})}if(r.error)return n({available:!1,models:[],reason:`opencode models ${t} could not be run: ${r.error.message}`});if(r.status!==0)return n({available:!1,models:[],reason:`opencode models ${t} exited with status ${r.status??"unknown"}`});let s=r.stdout.split(/\r?\n/).map(i=>i.trim()).filter(i=>i.length>0);return s.length===0?n({available:!1,models:[],reason:`opencode models ${t} returned no models`}):n({available:!0,models:s})}function Ap(t,e={}){let n=[],r=qV(e.modelSelectionDocPath);for(let s of t){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=YV(e.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 u=a.models.filter(d=>d.endsWith(`/${s.model}`));n.push(u.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${u.join(" / ")}; set model=${u[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}let l=s.model.slice(0,s.model.indexOf("/")),c=WV(l,e.opencodeModelsRunner);if(c.available&&c.models.includes(s.model))continue;if(c.available&&!c.models.includes(s.model)){n.push(`[${s.alias}] model="${s.model}" was not found in opencode's LOCALLY-VISIBLE live catalog for "${l}" (checked \`opencode models ${l}\`) -- this is unresolved, not a confirmed unavailability: it could mean opencode genuinely doesn't serve this model, OR that your local catalog/auth for "${l}" is stale/incomplete. Declaring it in opencode.json may or may not help; if it doesn't, check whether a non-opencode provider serves this model directly (e.g. \`lmctl lint\` with model= against provider=codex/claude/gemini/agy).`);continue}n.push(`[${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=KV(e.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: ${Kl(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for kimi: ${a.reason}.`);continue}if(i==="agy"){if(!s.model)continue;let a=PV(e.agyModelsRunner);a.available?a.models.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in agy's live model catalog (\`agy models\`). Valid models: ${Kl(a.models)}`):n.push(`[${s.alias}] model="${s.model}" cannot be verified for agy: ${a.reason}.`);continue}if(i==="dsh"){if(!s.model)continue;PA.includes(s.model)||n.push(`[${s.alias}] model="${s.model}" is not in dsh's built-in catalog. Valid models: ${Kl(PA)}. The catalog is patchable via dsh profile overlays \u2014 a model added that way warns here even though it may resolve.`);continue}if(!s.model)continue;i==="codex"&&s.model===FA&&n.push(`[${s.alias}] model="${FA}" is banned as a build model (operator, 2026-09-06) -- it's a fast/cheap classification model, not intended for build work, and there's no cost reason left to reach for it. Use model=gpt-5.6-sol (or leave model= unset) for build work; if this member genuinely does non-build/classification work, this warning can be ignored.`);let o=r.get(i);if(!o){n.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Vl??"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: ${Kl(o)}`)}return n}function qV(t){if(!t&&Oi)return Oi;let e=new Map,n,r=t??BV();if(!ps(r))return n=`${r} not found`,t||kp(e),t||(Oi=e),t||(Vl=n),e;let s;try{s=Np(r,"utf-8")}catch(i){return n=`${r} could not be read: ${i instanceof Error?i.message:String(i)}`,t||kp(e),t||(Oi=e),t||(Vl=n),e}for(let[i,o]of Object.entries(CV)){let a=JV(s,o),l=GV(a);l.length>0&&e.set(i,l)}return e.size===0&&(n=`${r} has no tested model rows`),!t&&e.size===0&&kp(e),t||(Oi=e),t||(Vl=n),e}function BV(){return HV(qA(LV(import.meta.url)))}function HV(t){let e=XV(t);if(e){let r=Xn(e,"durable-memory","model_selection.md");if(ps(r))return r}let n=[Xn(t,"..","..","durable-memory","model_selection.md"),Xn(t,"..","..","..","durable-memory","model_selection.md")];for(let r of n)if(ps(r))return r;return n[n.length-1]}function XV(t){let e=Xn(t);for(;;){if(ps(Xn(e,"package.json")))return e;let n=qA(e);if(n===e)return null;e=n}}function kp(t){for(let[e,n]of Object.entries($V))t.set(e,n)}function JV(t,e){let r=new RegExp(`^## ${ZV(e)}\\s*$`,"m").exec(t);if(!r)return"";let s=r.index+r[0].length,i=t.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function GV(t){let e=new Set;for(let n of t.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="&&e.add(i)}return[...e]}function KV(t){let e=process.env.KIMI_CODE_HOME||Xn(WA(),".kimi-code"),n=t??Xn(e,"config.toml");if(!ps(n))return{available:!1,models:[],reason:`${n} not found`};let r;try{r=Np(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=VV(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 VV(t){let e=[],n=0;for(;n<t.length;){for(;/\s/.test(t[n]??"");)n++;if(n>=t.length)break;let r="",s=t[n]==='"'||t[n]==="'"?t[n++]:void 0;if(s){for(;n<t.length&&t[n]!==s;)s==='"'&&t[n]==="\\"&&n+1<t.length&&n++,r+=t[n++];if(t[n]!==s)return null;n++}else{for(;n<t.length&&t[n]!==".";)r+=t[n++];r=r.trim()}if(!r)return null;for(e.push(r);/\s/.test(t[n]??"");)n++;if(n>=t.length)break;if(t[n]!==".")return null;n++}return e.length>0?e:null}function YV(t){let e=t??Xn(WA(),".config","opencode","opencode.json");if(!ps(e))return{available:!0,models:[]};let n;try{n=JSON.parse(Np(e,"utf-8"))}catch(r){return{available:!1,models:[],reason:`${e} could not be parsed: ${r instanceof Error?r.message:String(r)}`}}return{available:!0,models:zV(n)}}function zV(t){if(!Ip(t))return[];let e=Gl(t.provider)??Gl(t.providers);if(!e)return[];let n=new Set;for(let[r,s]of Object.entries(e)){if(!Ip(s))continue;let i=Gl(s.models)??Gl(s.model);if(i)for(let o of Object.keys(i))n.add(o.startsWith(`${r}/`)?o:`${r}/${o}`)}return[...n].sort()}function Gl(t){return Ip(t)?t:null}function Ip(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Kl(t){return t.length>0?t.join(", "):"(none)"}function ZV(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var CV,PA,FA,$V,MV,Sp,FV,bp,Oi,Vl,BA=E(()=>{"use strict";CV={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen"},PA=["deepseek-v4-flash","deepseek-v4-pro","deepseek-v4-flash-vision-exp"],FA="gpt-5.3-codex-spark",$V={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","claude-fable-5-1"],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","gpt-6-astra"],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"]},MV=5e3;Sp=null;FV=5e3;bp=new Map;Oi=null});import{homedir as QV}from"node:os";import{basename as e3}from"node:path";function Yl(t,e){let n=new Set;return{text:t.replace(n3,(s,i)=>{let o=i.trim(),a=t3[o];return a===void 0?(n.add(o),s):a(e)}),unknownNames:[...n].sort()}}function zl(t){return{workdir:t.workdir,teamfile:t.teamfile,date:r3(t.date)}}function r3(t){return t.toISOString().slice(0,10)}var t3,n3,xp=E(()=>{"use strict";t3={workdir:t=>t.workdir,teamfile:t=>t.teamfile,teamname:t=>{let e=e3(t.teamfile);return e.endsWith(".lmctl")?e.slice(0,-6):e},home:()=>QV(),date:t=>t.date},n3=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var $i={};oe($i,{GEMINI_PROVIDER_NOTICE:()=>GA,_setAgyModelsRunnerForTests:()=>d3,_setLintOpenCodeConfigProbeForTests:()=>m3,_setLintSessiondirFsOpsForTests:()=>f3,_setTeamfileSeedForTests:()=>u3,buildRootTeamRegistrationRow:()=>ZA,registerRootTeam:()=>QA,runHire:()=>T3,runLint:()=>E3,runRefresh:()=>v3,runSeed:()=>YA,sha256Text:()=>zA});import{createHash as s3}from"node:crypto";import{accessSync as i3,constants as HA,existsSync as o3,readFileSync as ec,realpathSync as Lp,statSync as a3,writeFileSync as Ql}from"node:fs";import{dirname as wr,resolve as JA}from"node:path";function d3(t){Dp=t??void 0}function u3(t){KA=t??(async e=>{let{seed:n}=await Promise.resolve().then(()=>(mt(),nu)),r=await n(e);return r.success?{sessionId:r.sessionId,warnings:r.warnings}:{error:r.error??"provider seed failed"}})}function f3(t){yr=t===null?Cp:{...Cp,...t}}function m3(t){VA=t??Qc}async function p3(t,e,n){let r=t.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 VA({cwd:i.sessiondir??e,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 _3(t,e){let n=wr(e),r=new Set,s=[];for(let i of t){if(i.teamfile!==void 0)continue;let o=i.sessiondir??n,a=JA(o);if(r.has(a))continue;let l=h3(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 h3(t){try{if(yr.existsSync(t)){if(!yr.statSync(t).isDirectory())return"ENOTDIR";yr.accessSync(t,HA.W_OK);return}let e=y3(t);if(e===void 0)return;if(!yr.statSync(e).isDirectory())return"ENOTDIR";yr.accessSync(e,HA.W_OK);return}catch(e){return w3(e)??"permission check failed"}}function g3(t){let e=JA(t);try{return Lp(e)}catch{return e}}function y3(t){let e=t;for(;;){try{if(yr.existsSync(e))return e}catch{return}let n=wr(e);if(n===e)return;e=n}}function w3(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function E3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(l3),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
3166
- `),2;let n=t[0],r;try{r=await O(e,c=>ve(n,c))}catch(c){return Ue(e,`${n}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(r)}catch(c){return Ue(e,`${n}: ${c instanceof Error?c.message:String(c)}`)}let i=qf(s,wr(r)),o=Ap(s.members,{agyModelsRunner:Dp}),a=ec(r,"utf8"),l=Yl(a,zl({workdir:wr(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(...Vc(s.members,wr(r))),o.push(..._3(s.members,r)),o.push(...await p3(s.members,wr(r),e.env));for(let c of i)e.stderr.write(`error: ${c.field}: ${c.message}
3166
+ `),2;let n=t[0],r;try{r=await L(e,c=>ve(n,c))}catch(c){return Ue(e,`${n}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(r)}catch(c){return Ue(e,`${n}: ${c instanceof Error?c.message:String(c)}`)}let i=qf(s,wr(r)),o=Ap(s.members,{agyModelsRunner:Dp}),a=ec(r,"utf8"),l=Yl(a,zl({workdir:wr(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(...Vc(s.members,wr(r))),o.push(..._3(s.members,r)),o.push(...await p3(s.members,wr(r),e.env));for(let c of i)e.stderr.write(`error: ${c.field}: ${c.message}
3167
3167
  `);for(let c of s.members)Mp([c],e),c.session!==void 0&&c.session.length<Li&&o.push(`${c.alias}: sessionid is shorter than ${Li} chars; run lmctl seed to refresh it`);for(let c of o)e.stderr.write(`warning: ${c}
3168
3168
  `);return i.length>0?1:(e.stdout.write(`ok
3169
3169
  `),0)}async function YA(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(c3),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
3170
- `),2;let n=t[0],r;try{r=await O(e,_=>ve(n,_))}catch(_){return Ue(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Lp(r)}catch(_){return Ue(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let i=wr(r),o;try{o=Fe(r)}catch(_){return Ue(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let l=ec(r,"utf8").split(`
3170
+ `),2;let n=t[0],r;try{r=await L(e,_=>ve(n,_))}catch(_){return Ue(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Lp(r)}catch(_){return Ue(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let i=wr(r),o;try{o=Fe(r)}catch(_){return Ue(e,`${n}: ${_ instanceof Error?_.message:String(_)}`)}let l=ec(r,"utf8").split(`
3171
3171
  `),c=k3(l),u=qf(o,i);if(u.length>0){Mp(o.members,e);for(let _ of u)e.stderr.write(`error: ${_.field}: ${_.message}
3172
3172
  `);return 1}try{os(e,o,r)}catch{}Mp(o.members,e);for(let _ of Ap(o.members,{agyModelsRunner:Dp}))e.stderr.write(`warning: ${_}
3173
3173
  `);for(let _ of Vc(o.members,i))e.stderr.write(`warning: ${_}
3174
3174
  `);let d=0,f=o.members.filter(_=>_.teamfile!==void 0?!1:_.session===void 0||_.session.length<Li);for(let _ of f)if(!ex(_.provider))return e.stderr.write(`error: ${_.alias}: invalid provider "${_.provider}"
3175
3175
  `),1;for(let _ of o.members){if(_.teamfile!==void 0)continue;if(_.session!==void 0&&_.session.length>=Li){e.stderr.write(`warning: ${_.alias}: existing sessionid preserved; skipping
3176
3176
  `);continue}let y=_.sessiondir??i,g=await KA({provider:_.provider,cwd:y,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:S3(r,l.join(`
3177
- `),o.members)}:{}});for(let v of g.warnings??[])e.stderr.write(`warning: ${_.alias}: ${v}
3178
- `);if(g.error!==void 0||g.sessionId===void 0||g.sessionId.length<Li){let v=`provider did not report a sessionid; no new session was found for ${y} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${g.error!==void 0?`: ${g.error}`:`; ${v}`}
3177
+ `),o.members)}:{}});for(let S of g.warnings??[])e.stderr.write(`warning: ${_.alias}: ${S}
3178
+ `);if(g.error!==void 0||g.sessionId===void 0||g.sessionId.length<Li){let S=`provider did not report a sessionid; no new session was found for ${y} (possible provider workspace/cwd mismatch)`;return e.stderr.write(`error: ${_.alias}: seed failed${g.error!==void 0?`: ${g.error}`:`; ${S}`}
3179
3179
  `),1}let w=c.get(_.alias.toLowerCase());if(w===void 0)return e.stderr.write(`error: ${_.alias}: could not find matching _MEMBER_ line to update
3180
- `),1;let S=g3(y),I=XA(l[w],"sessionid",g.sessionId);I=XA(I,"sessiondir",S),l[w]=I,d+=1,Ql(r,l.join(`
3181
- `),"utf8"),e.stdout.write(`${_.alias}: seeded ${g.sessionId} provider=${_.provider} sessiondir=${S}
3180
+ `),1;let v=g3(y),N=XA(l[w],"sessionid",g.sessionId);N=XA(N,"sessiondir",v),l[w]=N,d+=1,Ql(r,l.join(`
3181
+ `),"utf8"),e.stdout.write(`${_.alias}: seeded ${g.sessionId} provider=${_.provider} sessiondir=${v}
3182
3182
  `)}let m=l.join(`
3183
3183
  `),p=O3(m,Lp(r));p!==m&&Ql(r,p,"utf8"),d===0&&e.stdout.write(`no members needed seeding
3184
- `);let h=new Date().toISOString();try{await O(e,_=>{QA(_,{teamfilePath:s,name:o.name,rawText:p,now:h})})}catch(_){return Ue(e,_ instanceof Error?_.message:String(_))}return 0}async function T3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Zl),0;let n=V(t,["--provider","--sessiondir"],[]);if(n.error!==void 0)return Op(e,n.error,Zl);if(n.positionals.length!==2)return Op(e,"expected <teamfile.lmctl> and <alias>",Zl);let[r,s]=n.positionals;if(!A3(s))return Ue(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Ue(e,"hire only applies to non-Lead members");let i=L(n,"--provider");if(i===void 0)return Op(e,"missing value for --provider",Zl);if(!ex(i))return Ue(e,`invalid provider "${i}"`);let o;try{o=await O(e,d=>ve(r,d))}catch(d){return Ue(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=ec(o,"utf8")}catch(d){return Ue(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}if(N3(a,s))return Ue(e,`${s}: alias already exists in ${o}`);let l=L(n,"--sessiondir"),c=[`_MEMBER_ alias=${$p(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${$p(l)}`]].join(" "),u=R3(a,c);return Ql(o,u,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
3184
+ `);let h=new Date().toISOString();try{await L(e,_=>{QA(_,{teamfilePath:s,name:o.name,rawText:p,now:h})})}catch(_){return Ue(e,_ instanceof Error?_.message:String(_))}return 0}async function T3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Zl),0;let n=Y(t,["--provider","--sessiondir"],[]);if(n.error!==void 0)return Op(e,n.error,Zl);if(n.positionals.length!==2)return Op(e,"expected <teamfile.lmctl> and <alias>",Zl);let[r,s]=n.positionals;if(!A3(s))return Ue(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Ue(e,"hire only applies to non-Lead members");let i=C(n,"--provider");if(i===void 0)return Op(e,"missing value for --provider",Zl);if(!ex(i))return Ue(e,`invalid provider "${i}"`);let o;try{o=await L(e,d=>ve(r,d))}catch(d){return Ue(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let a;try{a=ec(o,"utf8")}catch(d){return Ue(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}if(N3(a,s))return Ue(e,`${s}: alias already exists in ${o}`);let l=C(n,"--sessiondir"),c=[`_MEMBER_ alias=${$p(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${$p(l)}`]].join(" "),u=R3(a,c);return Ql(o,u,"utf8"),e.stdout.write(`Hired ${s} (${i}) -> ${o}
3185
3185
  `),e.stdout.write(`Run: lmctl seed ${o}
3186
- `),0}async function v3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Rp),0;let n,r;if(t.length===1){let d=fr(t[0]);if(d===null)return e.stderr.write(Rp),2;n=d.teamfile,r=d.alias}else if(t.length===2)[n,r]=t;else return e.stderr.write(Rp),2;let s;try{s=await O(e,d=>ve(n,d))}catch(d){return Ue(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let i;try{i=ec(s,"utf8")}catch(d){return Ue(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let o=i.split(`
3186
+ `),0}async function v3(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Rp),0;let n,r;if(t.length===1){let d=fr(t[0]);if(d===null)return e.stderr.write(Rp),2;n=d.teamfile,r=d.alias}else if(t.length===2)[n,r]=t;else return e.stderr.write(Rp),2;let s;try{s=await L(e,d=>ve(n,d))}catch(d){return Ue(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let i;try{i=ec(s,"utf8")}catch(d){return Ue(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}let o=i.split(`
3187
3187
  `),a=I3(o,r);if(a===void 0)return Ue(e,`${r}: no active _MEMBER_ entry found`);let l=o[a];if(Ci(l,"teamfile")!==void 0)return Ue(e,`${r}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[Os],u=Ci(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Ue(e,`${r}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=x3(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Ql(s,o.join(`
3188
3188
  `),"utf8"),YA([s],e))}function zA(t){return s3("sha256").update(t).digest("hex")}function ZA(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:zA(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function QA(t,e){let n=ll(e.rawText,e.teamfilePath);Xf(t,e.teamfilePath,n);let r=ZA(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function S3(t,e,n){let r=n.filter(a=>a.alias.toLowerCase()!=="lead").map(a=>{let l=a.teamfile!==void 0?`teamfile=${a.teamfile}`:`provider=${a.provider}`;return`- ${a.alias}: ${l}`}),s=r.length>0?r.join(`
3189
3189
  `):"- (no non-Lead members)",i=n.find(a=>a.alias.toLowerCase()==="lead")?.provider??"",o=b3(i,t);return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Delegating work:",`- Blocking command shape: lmctl chat "${t}" <alias> "your task here"`,"- SAFE INPUT \u2014 use for ANYTHING non-trivial. A prompt typed into the command line is expanded by YOUR shell first,"," so backticks, $(...), $VAR and quotes are executed or stripped out of the message before lmctl sees it."," If the text contains backticks, quotes, $, newlines, or ANY relayed/pasted/quoted content, do NOT put it in the command.",` Write it to a file with your file-writing tool (NOT echo/heredoc \u2014 those are shell too), then: lmctl chat "${t}" <alias> --prompt-file <path>`,"- lmctl is foreground/background agnostic. Use your provider or host runtime for async command handling when it supports that.","- For delegation, run the lmctl chat command above. If your runtime has a tracked background mode, it may wrap that same blocking command, but check the result with --json or lmctl status.","- Busy receiver ENQUEUES. lmctl chat exits 0 for BOTH delivered and enqueued, so exit code alone CANNOT tell you a reply arrived.",'- lmctl chat ... --json is machine-readable: status="ok" is a delivered reply (with replyText); status="enqueued" (plus path="enqueued") means it was queued, and carries id/sender/receiver.',"- lmctl status shows your identity, members with busy/idle, mail queued TO and FROM you, and why a receiver is busy. Run it when you are unsure whether a delegation landed.","- For arbitrary shell work, use your provider/runtime shell tools directly; lmctl does not execute shell commands.",o,"","Delegation is an ACTION, not a plan: to hand a member a task, run the lmctl chat command above. lmctl exposes no delegation tool you should use \u2014 delegate with lmctl chat.","","Team members:",s,"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own session \u2014 run it from a different member session or a plain operator shell.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These health/recovery commands are shell commands. For delegation, use lmctl chat.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
@@ -3251,11 +3251,11 @@ Examples:
3251
3251
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
3252
3252
  lmctl clone ./backend/ ./backend-v2/backend-v2.lmctl
3253
3253
  lmctl clone https://example.com/backend.lmctl ./backend-v2/backend-v2.lmctl
3254
- `;U3=new Set([301,302,303,307,308]),rx=10});var lx,cx=E(()=>{"use strict";lx=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","ClaudeMock"])});var hx={};oe(hx,{runRestoreTeamfile:()=>tY});import{randomUUID as J3}from"node:crypto";import{existsSync as mx,linkSync as G3,lstatSync as K3,mkdirSync as V3,realpathSync as Y3,renameSync as z3,rmSync as Z3,writeFileSync as Q3}from"node:fs";import{basename as Pp,dirname as Fp,extname as eY,isAbsolute as px,resolve as Di}from"node:path";async function tY(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.length===1&&(t[0]==="--help"||t[0]==="-h"))return e.stdout.write(dx),0;let r=V(t,[],["--force","--json"]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length!==1)return k(e,dx.trimEnd());try{return await O(e,s=>nY(r.positionals[0],B(r,"--force"),B(r,"--json"),e,s,n.now?.()??new Date))}catch(s){return Pe(e,s)}}function nY(t,e,n,r,s,i){let o=r.cwd??process.cwd(),a=rY(s,o),l=sY(a,t,o);if(l.kind==="missing")return k(r,`no usage evidence found for teamfile ${JSON.stringify(t)} 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 _=l.paths.map(y=>` ${y.path} (tracked_invocations=${y.invocations.length}, team_messages=${y.chats.length})`).join(`
3254
+ `;U3=new Set([301,302,303,307,308]),rx=10});var lx,cx=E(()=>{"use strict";lx=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","kimi","dsh","ClaudeMock"])});var hx={};oe(hx,{runRestoreTeamfile:()=>tY});import{randomUUID as J3}from"node:crypto";import{existsSync as mx,linkSync as G3,lstatSync as K3,mkdirSync as V3,realpathSync as Y3,renameSync as z3,rmSync as Z3,writeFileSync as Q3}from"node:fs";import{basename as Pp,dirname as Fp,extname as eY,isAbsolute as px,resolve as Di}from"node:path";async function tY(t,e={stdout:process.stdout,stderr:process.stderr},n={}){if(t.length===1&&(t[0]==="--help"||t[0]==="-h"))return e.stdout.write(dx),0;let r=Y(t,[],["--force","--json"]);if(r.error!==void 0)return k(e,r.error);if(r.positionals.length!==1)return k(e,dx.trimEnd());try{return await L(e,s=>nY(r.positionals[0],X(r,"--force"),X(r,"--json"),e,s,n.now?.()??new Date))}catch(s){return Pe(e,s)}}function nY(t,e,n,r,s,i){let o=r.cwd??process.cwd(),a=rY(s,o),l=sY(a,t,o);if(l.kind==="missing")return k(r,`no usage evidence found for teamfile ${JSON.stringify(t)} 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 _=l.paths.map(y=>` ${y.path} (tracked_invocations=${y.invocations.length}, team_messages=${y.chats.length})`).join(`
3255
3255
  `);return k(r,`ambiguous teamfile name ${JSON.stringify(t)}; specify one exact path:
3256
3256
  ${_}`)}let c=l.path,u=c.path,d=mx(u);if(d&&!e)return k(r,`refusing to overwrite existing teamfile: ${u} (re-run with --force to reconstruct it from usage evidence)`);let f=lY(c);if(f.members.length===0)return k(r,`usage evidence exists for ${u}, 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(_=>_.line).join(`
3257
3257
  `)}
3258
- `;try{pY(u,m,e)}catch(_){if(_ instanceof ji)return k(r,_.message);if(!e&&_?.code==="EEXIST")return k(r,`refusing to overwrite teamfile created during restore: ${u} (inspect it before using --force)`);throw _}let p=fY(c),h={schema_version:1,action:"restored",restored_path:u,overwrote_existing:d,members_restored:f.members.length,bytes_written:Buffer.byteLength(m,"utf8"),latest_evidence_at:p,evidence_age_ms:mY(p,i),evidence:{source:"tracked_invocation",corroboration:"team_chat_log",tracked_invocation_count:c.invocations.length,team_chat_log_count:c.chats.length},members:f.members,ignored_aliases:f.ignored,staleness_note:"Best effort: local event history may be incomplete across lmctl versions; each emitted member uses its latest tracked invocation and unreconstructable aliases are omitted."};return n?H(r,h):_Y(r,h),0}function rY(t,e){let n=t.query(`
3258
+ `;try{pY(u,m,e)}catch(_){if(_ instanceof ji)return k(r,_.message);if(!e&&_?.code==="EEXIST")return k(r,`refusing to overwrite teamfile created during restore: ${u} (inspect it before using --force)`);throw _}let p=fY(c),h={schema_version:1,action:"restored",restored_path:u,overwrote_existing:d,members_restored:f.members.length,bytes_written:Buffer.byteLength(m,"utf8"),latest_evidence_at:p,evidence_age_ms:mY(p,i),evidence:{source:"tracked_invocation",corroboration:"team_chat_log",tracked_invocation_count:c.invocations.length,team_chat_log_count:c.chats.length},members:f.members,ignored_aliases:f.ignored,staleness_note:"Best effort: local event history may be incomplete across lmctl versions; each emitted member uses its latest tracked invocation and unreconstructable aliases are omitted."};return n?J(r,h):_Y(r,h),0}function rY(t,e){let n=t.query(`
3259
3259
  SELECT id, target_teamfile, target_alias, started_at, meta
3260
3260
  FROM tracked_invocation
3261
3261
  WHERE target_teamfile IS NOT NULL
@@ -3282,10 +3282,10 @@ Only members with usable tracked_invocation metadata are restored.
3282
3282
  This is best-effort: local event history may be incomplete across lmctl versions.
3283
3283
  Use lmctl restore to recover files from native provider sessions independently.
3284
3284
  Existing files are never overwritten unless --force is supplied.
3285
- `;ji=class extends Error{}});var Ex={};oe(Ex,{runPlan:()=>vY});import{existsSync as hY,mkdirSync as gY,writeFileSync as yY}from"node:fs";import{basename as yx,extname as wx,join as wY,resolve as EY}from"node:path";async function vY(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(TY),0;let n=V(t,["--team","--provider"],[]);if(n.error!==void 0)return e.stderr.write(`error: ${n.error}
3285
+ `;ji=class extends Error{}});var Ex={};oe(Ex,{runPlan:()=>vY});import{existsSync as hY,mkdirSync as gY,writeFileSync as yY}from"node:fs";import{basename as yx,extname as wx,join as wY,resolve as EY}from"node:path";async function vY(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(TY),0;let n=Y(t,["--team","--provider"],[]);if(n.error!==void 0)return e.stderr.write(`error: ${n.error}
3286
3286
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
3287
3287
  `),2;if(n.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
3288
- `),2;let r=EY(n.positionals[0]);gY(r,{recursive:!0});let s=L(n,"--team")??yx(r),i=L(n,"--provider")??"claude",o=wY(r,SY(s));if(hY(o))return e.stderr.write(`error: ${o} already exists.
3288
+ `),2;let r=EY(n.positionals[0]);gY(r,{recursive:!0});let s=C(n,"--team")??yx(r),i=C(n,"--provider")??"claude",o=wY(r,SY(s));if(hY(o))return e.stderr.write(`error: ${o} already exists.
3289
3289
  `),1;let a=kY({teamName:bY(s),leadProvider:i}),l=Yl(a,zl({workdir:r,teamfile:o,date:new Date}));return yY(o,l.text,"utf8"),e.stdout.write(`Created ${o}
3290
3290
  `),e.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
3291
3291
  `),e.stdout.write(`After editing, run: lmctl lint ${o}
@@ -3317,8 +3317,8 @@ Examples:
3317
3317
 
3318
3318
  # Same shape, codex for the Lead and Reviewer2
3319
3319
  lmctl plan ./backend --provider codex
3320
- `});import{execFileSync as IY}from"node:child_process";import{resolve as vx}from"node:path";function NY(t){return t.filter(e=>e.state!=="retired")}function Sx(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?k(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=IY("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return k(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=vx(s),o=e.listProjects().find(a=>vx(a.local_path)===i);return o===void 0?k(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function bx(t,e,n,r){if(r!==void 0){let i=e.findTeamByName(r);return i===null?k(t,`team not found: ${r}`):i}let s=e.getTeam(n.team_id);return s===null?k(t,`project ${n.name} has no assigned team; use --team <name>`):s}function kx(t,e,n,r){if(r!==void 0){let i=e.findTeamMemberByAlias(n.id,r);return i===null||i.state==="retired"?k(t,`member not found: ${r}`):i}let s=NY(e.listTeamMembers(n.id)).find(i=>i.role==="agent");return s===void 0?k(t,`team ${n.name} has no active agent member`):s}var Ix=E(()=>{"use strict";Ie()});var xx={};oe(xx,{SIZE_WARN_EST_TOKENS:()=>Pi,estimateTokens:()=>Ax,runTerminal:()=>OY});import{spawn as AY}from"node:child_process";import{statSync as xY}from"node:fs";async function OY(t,e){if(t.includes("--help")||t.includes("-h"))return PY(e);let n=V(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return k(e,n.error);let r=L(n,"--run");if(r!==void 0){let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<=0||String(s)!==r)return k(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?B(n,o):L(n,o)!==void 0)return k(e,`--run is mutually exclusive with ${o}`);try{return await O(e,async o=>{let a=L(n,"--alias"),l=xv(o,s,a);return"err"in l?k(e,l.err):Up(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Pe(e,o)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?B(n,l):L(n,l)!==void 0)return k(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=n.positionals[0],o=n.positionals[1],a=gt(RY,{target:i,alias:o,flags:{}});return a.mode==="error"?k(e,a.message):a.mode!=="ai-team"?k(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?k(e,"terminal: alias required for the teamfile target"):await O(e,l=>LY(e,a.teamfile,a.alias,l,B(n,"--json")))}try{return await O(e,async s=>{let i=MY(e,s,n);if(typeof i=="number")return i;let o=L(n,"--alias");return B(n,"--size")?jY(e,s,i,o,B(n,"--json")):DY(e,s,i,o)})}catch(s){return Pe(e,s)}}async function LY(t,e,n,r,s){let i;try{i=Me(e,n,r)}catch(d){return d instanceof Ee?k(t,d.message):Pe(t,d)}let o=vr(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ls()});if(!o.acquired){let d=o.current.holder_pid,f=d===null?null:Re(d)?"live":"dead",m=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(d===null?"(holder_pid=unavailable)":`(holder_pid=${d}, ${f})`);return s?(H(t,{status:"error",errorKind:"busy",message:m,holder_pid:d,holder_liveness:f}),1):k(t,m)}let a=Hk({teamfile:i.teamfile,alias:i.alias}),l=null,c=null,u=null;try{r.setTerminalLock(a),c=CY(r,i),c!==null&&(process.env.LMCTL_INVOCATION_ID=String(c)),l=setInterval(()=>{try{let d=new Date().toISOString(),f=r.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,d);f&&r.heartbeatAgentInflight(o.lease,o.leaseId,d),!f&&l!==null&&(clearInterval(l),l=null)}catch{}},Xk()),l.unref?.();try{os(t,Fe(i.teamfile),i.teamfile)}catch{}return u=await Up(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead}),u}finally{l!==null&&clearInterval(l),r.clearTerminalLock(a.teamfile,a.alias,a.lock_id),r.releaseAgentInflight(o.lease,o.leaseId),$Y(r,c,u)}}function CY(t,e){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:process.pid,launch_source:"terminal",parent_invocation_id:il(process.env.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function $Y(t,e,n){if(e!==null)try{t.finishTrackedInvocation(e,{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 Up(t,e){let{provider:n,sessionid:r,sessiondir:s,model:i}=e;if(!ul(n))return k(t,`no resume incantation for provider "${n}"`);if(!xS.test(r))return k(t,"refusing to resume: malformed sessionid");let o=Vf(n,r,{isLead:e.isLead,model:i,onModelIgnored:c=>{let u=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;t.stderr.write(`${u}
3321
- `),De({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return k(t,`no resume incantation for provider "${n}"`);let[a,...l]=o;return await new Promise(c=>{let u=AY(a,l,{stdio:"inherit",cwd:s,env:Ve(process.env,s,r,"terminal")});u.on("error",d=>{c(k(t,`failed to launch ${a}: ${d.message}`))}),u.on("exit",d=>c(d??0))})}function MY(t,e,n){let r=L(n,"--team");if(r!==void 0){let o=e.findTeamByName(r);return o===null?k(t,`team not found: ${r}`):o}let s=Sx(t,e,L(n,"--project"));return typeof s=="number"?s:bx(t,e,s,void 0)}async function DY(t,e,n,r){let s=kx(t,e,n,r);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?k(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${n.name}\` first`):Up(t,{provider:Qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function Ax(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=xY(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function jY(t,e,n,r,s){let i;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return k(t,`member not found: ${r}`);i=[a]}else i=e.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=Qe(a),u=a.model??null,d=null;ul(c)&&(d=await Ne(l,c));let f=Ax(d),m=f.est>Pi;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:u,resume_incantation:m?fl(c,l,u!==null?{model:u}:{}):null})}if(s)return H(t,{estimate:!0,legend:Nx,guide_tokens:Pi,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
3320
+ `});import{execFileSync as IY}from"node:child_process";import{resolve as vx}from"node:path";function NY(t){return t.filter(e=>e.state!=="retired")}function Sx(t,e,n){if(n!==void 0){let a=e.findProjectByName(n);return a===null?k(t,`project not found: ${n}`):a}let r=t.cwd??process.cwd(),s;try{s=IY("git",["rev-parse","--show-toplevel"],{cwd:r,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return k(t,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=vx(s),o=e.listProjects().find(a=>vx(a.local_path)===i);return o===void 0?k(t,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function bx(t,e,n,r){if(r!==void 0){let i=e.findTeamByName(r);return i===null?k(t,`team not found: ${r}`):i}let s=e.getTeam(n.team_id);return s===null?k(t,`project ${n.name} has no assigned team; use --team <name>`):s}function kx(t,e,n,r){if(r!==void 0){let i=e.findTeamMemberByAlias(n.id,r);return i===null||i.state==="retired"?k(t,`member not found: ${r}`):i}let s=NY(e.listTeamMembers(n.id)).find(i=>i.role==="agent");return s===void 0?k(t,`team ${n.name} has no active agent member`):s}var Ix=E(()=>{"use strict";Ie()});var xx={};oe(xx,{SIZE_WARN_EST_TOKENS:()=>Pi,estimateTokens:()=>Ax,runTerminal:()=>OY});import{spawn as AY}from"node:child_process";import{statSync as xY}from"node:fs";async function OY(t,e){if(t.includes("--help")||t.includes("-h"))return PY(e);let n=Y(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(n.error!==void 0)return k(e,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 k(e,`invalid --run "${r}" (expected a positive integer run id)`);if(n.positionals.length>0)return k(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?X(n,o):C(n,o)!==void 0)return k(e,`--run is mutually exclusive with ${o}`);try{return await L(e,async o=>{let a=C(n,"--alias"),l=xv(o,s,a);return"err"in l?k(e,l.err):Up(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Pe(e,o)}}if(n.positionals.length>0){let s=["--team","--project","--size","--alias"];for(let l of s)if(l==="--size"?X(n,l):C(n,l)!==void 0)return k(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(n.positionals.length>2)return k(e,`too many positionals (${n.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=n.positionals[0],o=n.positionals[1],a=gt(RY,{target:i,alias:o,flags:{}});return a.mode==="error"?k(e,a.message):a.mode!=="ai-team"?k(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?k(e,"terminal: alias required for the teamfile target"):await L(e,l=>LY(e,a.teamfile,a.alias,l,X(n,"--json")))}try{return await L(e,async s=>{let i=MY(e,s,n);if(typeof i=="number")return i;let o=C(n,"--alias");return X(n,"--size")?jY(e,s,i,o,X(n,"--json")):DY(e,s,i,o)})}catch(s){return Pe(e,s)}}async function LY(t,e,n,r,s){let i;try{i=Me(e,n,r)}catch(d){return d instanceof Ee?k(t,d.message):Pe(t,d)}let o=vr(r,{receiver_teamfile:i.teamfile,receiver_alias:i.alias,sender_teamfile:i.teamfile,sender_alias:"terminal",ttlMs:ls()});if(!o.acquired){let d=o.current.holder_pid,f=d===null?null:Re(d)?"live":"dead",m=`${i.alias} is busy/held by ${o.current.sender_alias} (${o.current.sender_teamfile}) since ${o.current.started_at} `+(d===null?"(holder_pid=unavailable)":`(holder_pid=${d}, ${f})`);return s?(J(t,{status:"error",errorKind:"busy",message:m,holder_pid:d,holder_liveness:f}),1):k(t,m)}let a=Hk({teamfile:i.teamfile,alias:i.alias}),l=null,c=null,u=null;try{r.setTerminalLock(a),c=CY(r,i),c!==null&&(process.env.LMCTL_INVOCATION_ID=String(c));let d=r.getRootTeam(i.teamfile)?.name??null;d!==null&&(process.env.LMBEE_TEAM_NAME=d),l=setInterval(()=>{try{let f=new Date().toISOString(),m=r.heartbeatTerminalLock(a.teamfile,a.alias,a.lock_id,f);m&&r.heartbeatAgentInflight(o.lease,o.leaseId,f),!m&&l!==null&&(clearInterval(l),l=null)}catch{}},Xk()),l.unref?.();try{os(t,Fe(i.teamfile),i.teamfile)}catch{}return u=await Up(t,{provider:i.provider,sessionid:i.sessionid,sessiondir:i.sessiondir,...i.model!==void 0?{model:i.model}:{},isLead:i.isLead}),u}finally{l!==null&&clearInterval(l),r.clearTerminalLock(a.teamfile,a.alias,a.lock_id),r.releaseAgentInflight(o.lease,o.leaseId),$Y(r,c,u)}}function CY(t,e){try{return t.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:e.teamfile,from_identity:`${e.teamfile}:terminal`,target_teamfile:e.teamfile,target_alias:e.alias,root_teamfile:e.teamfile,cwd:e.sessiondir,command:`lmctl terminal ${e.teamfile} ${e.alias}`,holder_pid:process.pid,launch_source:"terminal",parent_invocation_id:il(process.env.LMCTL_INVOCATION_ID),meta:JSON.stringify({provider:e.provider,sessionid:e.sessionid,...e.model!==void 0?{model:e.model}:{}})}).id}catch{return null}}function $Y(t,e,n){if(e!==null)try{t.finishTrackedInvocation(e,{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 Up(t,e){let{provider:n,sessionid:r,sessiondir:s,model:i}=e;if(!ul(n))return k(t,`no resume incantation for provider "${n}"`);if(!xS.test(r))return k(t,"refusing to resume: malformed sessionid");let o=Vf(n,r,{isLead:e.isLead,model:i,onModelIgnored:c=>{let u=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;t.stderr.write(`${u}
3321
+ `),De({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return k(t,`no resume incantation for provider "${n}"`);let[a,...l]=o;return await new Promise(c=>{let u=AY(a,l,{stdio:"inherit",cwd:s,env:Ve(process.env,s,r,"terminal")});u.on("error",d=>{c(k(t,`failed to launch ${a}: ${d.message}`))}),u.on("exit",d=>c(d??0))})}function MY(t,e,n){let r=C(n,"--team");if(r!==void 0){let o=e.findTeamByName(r);return o===null?k(t,`team not found: ${r}`):o}let s=Sx(t,e,C(n,"--project"));return typeof s=="number"?s:bx(t,e,s,void 0)}async function DY(t,e,n,r){let s=kx(t,e,n,r);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?k(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${n.name}\` first`):Up(t,{provider:Qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function Ax(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let n=t.messages.reduce((r,s)=>r+(s.content?.length??0),0);return{chars:n,est:Math.ceil(n/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let n=xY(e).size;return{chars:n,est:Math.ceil(n/4),messages:t?.messages?.length??null,bytes:n}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function jY(t,e,n,r,s){let i;if(r!==void 0){let a=e.findTeamMemberByAlias(n.id,r);if(a===null||a.state==="retired")return k(t,`member not found: ${r}`);i=[a]}else i=e.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=Qe(a),u=a.model??null,d=null;ul(c)&&(d=await Ne(l,c));let f=Ax(d),m=f.est>Pi;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:u,resume_incantation:m?fl(c,l,u!==null?{model:u}:{}):null})}if(s)return J(t,{estimate:!0,legend:Nx,guide_tokens:Pi,members:o}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
3322
3322
  `),t.stdout.write(`${Nx}
3323
3323
  `);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
3324
3324
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -3382,7 +3382,7 @@ Examples:
3382
3382
  `),0;let n=qx(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
3383
3383
  `),2;if(n.noSanitize&&(n.upload||n.internalS3||n.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
3384
3384
  `),2;if(n.upload&&n.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
3385
- `),2;let r=Ox(),s=n.outputPath??e8(r),i=n.internalS3?"internal-s3":n.upload?"hq":"local";try{return await O(e,async o=>{let a=await i_({dal:o,include:n.include,dbPath:Q(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Px({ticketId:r,data:a,outputPath:s,lmctlNextVersion:Mt(),sanitized:!n.noSanitize})}catch(d){if(d instanceof Jn)return e.stderr.write(`sanitization failed: ${d.message}
3385
+ `),2;let r=Ox(),s=n.outputPath??e8(r),i=n.internalS3?"internal-s3":n.upload?"hq":"local";try{return await L(e,async o=>{let a=await i_({dal:o,include:n.include,dbPath:Q(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await Px({ticketId:r,data:a,outputPath:s,lmctlNextVersion:Mt(),sanitized:!n.noSanitize})}catch(d){if(d instanceof Jn)return e.stderr.write(`sanitization failed: ${d.message}
3386
3386
  `),2;throw d}let c=await Ux({mode:i,bundlePath:l.outputPath,ticketId:r,hqUrl:n.hqUrl}),u={ticket_id:r,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!n.noSanitize,upload:c,manifest_files:l.manifest.files.length};return n.json?e.stdout.write(`${JSON.stringify(u,null,2)}
3387
3387
  `):(e.stdout.write(`ticket: ${r}
3388
3388
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
@@ -3396,7 +3396,7 @@ Examples:
3396
3396
  `),e.stderr.write(`${Hp()}
3397
3397
  `),2;n.push(s)}if(n.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
3398
3398
  `),e.stderr.write(`${Hp()}
3399
- `),2;let r=n[0];try{return await O(e,s=>(e.stdout.write(Jx(s,r)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
3399
+ `),2;let r=n[0];try{return await L(e,s=>(e.stdout.write(Jx(s,r)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
3400
3400
  `),1}}function Hp(){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(`
3401
3401
  `)}var Xx,Xp,Jp,zx=E(()=>{"use strict";jf();Ie();Xx=["Coder","Reviewer1","Polisher"],Xp=3e4,Jp=new Set(["attention_needed","paused","escalation"])});We();Es();de();import{pathToFileURL as i8}from"node:url";import{mkdirSync as U0,readFileSync as W0,renameSync as q0,writeFileSync as B0}from"node:fs";import{homedir as H0}from"node:os";import{dirname as X0,join as J0}from"node:path";function p_(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function P0(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function F0(t,e){return!P0(t)||p_(t)?null:`${e} must use https://: ${t}`}async function __(t,e){let n=F0(t,e.description);if(n!==null||!p_(t))throw new Error(n??`${e.description} must use https://: ${t}`);let r=e.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),r);try{let o;try{o=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw m_(t,e.description,r,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw m_(t,e.description,r,a)}}finally{clearTimeout(i)}}function m_(t,e,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 ${e} ${t}: ${i}`)}Es();var G0="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",K0=60*60*1e3,V0=1500;function Y0(){let t=process.env.HOME??H0();return J0(t,".lmctl",".update-check.json")}function z0(t){return t.isTTY===!0}function Z0(t,e){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(t),s=n(e);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 ac(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!z0(e.stderr)||t.includes("--json")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Q0(t,e){try{let n=JSON.parse(W0(t,"utf8"));if(typeof n.checkedAt=="number"&&Number.isFinite(n.checkedAt)&&typeof n.latest=="string"&&e-n.checkedAt<K0)return n.latest}catch{}return null}function eR(t,e){U0(X0(t),{recursive:!0});let n=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;B0(n,`${JSON.stringify(e)}
3402
3402
  `,"utf8"),q0(n,t)}async function tR(){let t=await __(G0,{description:"lmctl npm metadata",timeoutMs:V0}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function h_(t,e=[],n={}){try{if(ac(e,t))return;let r=n.now?.()??Date.now(),s=n.cachePath??Y0();if(Q0(s,r)!==null)return;let o=await(n.fetchLatest??tR)();try{eR(s,{checkedAt:r,latest:o})}catch{return}let a=n.currentVersion?.()??Mt();Z0(o,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest