@lmctl-ai/lmctl 0.1.167 → 0.1.168

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 +201 -201
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -13,8 +13,8 @@ var kk=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ee=(e,t)=>{f
13
13
  `)),c=[];for(let d of Vk){let u=process.env[d];if(u===void 0){c.push({key:d,value:"(unset)"});continue}c.push(Qf(d,u))}return{lmctl_next_version:t,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function tI(){return process.env.LMCTL_INTENT_LOG??Xk(Jk(),".lmctl","recent-intents.log")}async function rI(e){let t=e.intentLog??tI(),r=e.intentLogTailLines??500;try{let s=(await Za(t,"utf8")).split(`
14
14
  `).filter(o=>o.length>0),i=s.slice(Math.max(0,s.length-r));return{source_path:t,tail_lines:i.length,tail:Wn(i.join(`
15
15
  `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:t,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:t,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var ti,Vk,za,Bn=E(()=>{"use strict";ei();ti=["serve","db","runs","jobs","attentions","env","intents"];Vk=["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"];za=["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 im,appendFileSync as nI,mkdirSync as sI,existsSync as a2,readdirSync as l2,unlinkSync as c2}from"node:fs";import{join as ni,dirname as iI}from"node:path";import{homedir as oI}from"node:os";function Qa(){return ni(oI(),".lmctl")}function om(){Vr=!0,process.env.LMCTL_DEBUG="1"}function am(){return{cliDebug:Vr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function lm(e){Vr=e.cliDebug,e.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=e.lmctlDebugEnv}function ce(){if(Vr||process.env.LMCTL_DEBUG==="1")return!0;let e=Date.now();return e-sm>=aI&&(nm=dI(),sm=e),nm}function cm(){return Vr||process.env.LMCTL_DEBUG==="1"}function lI(){let e=new Date,t=e.getTimezoneOffset(),r=t<=0?"+":"-",n=String(Math.floor(Math.abs(t)/60)).padStart(2,"0"),s=String(Math.abs(t)%60).padStart(2,"0");return new Date(e.getTime()-t*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function Ae(e,t){if(t?.verbose){if(!Vr)return}else if(!t?.always&&!ce())return;try{cI();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...e};nI(ri,JSON.stringify(r)+`
16
- `)}catch{}}function cI(){if(!ri){let t=lI().slice(0,13).replace("T","-");ri=ni(Qa(),`debug-${t}.log`)}sI(iI(ri),{recursive:!0})}function Oe(...e){Ae({event:"legacy",msg:e.join(" ")})}function Tt(...e){Ae({event:"legacy",msg:e.join(" ")},{verbose:!0})}function q(e){Ae(e,{always:!0})}function dI(){return uI()||fI()}function uI(){try{let e=im(ni(Qa(),"config.toml"),"utf-8");for(let t of e.split(`
17
- `)){let r=t.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function fI(){try{let e=im(ni(Qa(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var Vr,nm,sm,aI,ri,pe=E(()=>{"use strict";Vr=!1,nm=!1,sm=0,aI=5e3;ri=null});import{existsSync as LI}from"node:fs";import{createRequire as OI}from"node:module";function $I(){return tl===null&&(tl=OI(import.meta.url)("node:sqlite").DatabaseSync),tl}function rl(e){return e.length===1&&CI(e[0])?[e[0]]:e}function CI(e){if(!il(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function il(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var tl,nl,pm,sl,hm=E(()=>{"use strict";tl=null;nl=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!LI(t))throw new Error("unable to open database file");this.name=t,this.handle=new($I())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new sl(this.handle.prepare(t))}exec(t){this.handle.exec(t),this.updateTransactionDepth(t)}pragma(t,r){let n=`PRAGMA ${t}`;if(t.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(t){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=t(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=t(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(t){let r=t.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(t.trim())&&(this.transactionDepth=0)}}},pm=nl,sl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...rl(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...rl(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...rl(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&il(t)?Object.values(t):il(t)?{...t}:t}}});import{existsSync as MI,mkdirSync as jI,readFileSync as gm}from"node:fs";import{homedir as DI}from"node:os";import{dirname as ym,join as PI,resolve as wm}from"node:path";import{fileURLToPath as FI,pathToFileURL as UI}from"node:url";function ol(e){e.dbPath!==":memory:"&&jI(ym(e.dbPath),{recursive:!0});let t=new pm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=bm(t);return r===0&&(t.exec(gm(Tm,"utf8")),t.pragma(`user_version = ${BI}`)),qI(t,r),t}function qI(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
16
+ `)}catch{}}function cI(){if(!ri){let t=lI().slice(0,13).replace("T","-");ri=ni(Qa(),`debug-${t}.log`)}sI(iI(ri),{recursive:!0})}function Oe(...e){Ae({event:"legacy",msg:e.join(" ")})}function Tt(...e){Ae({event:"legacy",msg:e.join(" ")},{verbose:!0})}function P(e){Ae(e,{always:!0})}function dI(){return uI()||fI()}function uI(){try{let e=im(ni(Qa(),"config.toml"),"utf-8");for(let t of e.split(`
17
+ `)){let r=t.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function fI(){try{let e=im(ni(Qa(),"config.json"),"utf-8"),t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)&&t.debug===!0}catch{}return!1}var Vr,nm,sm,aI,ri,me=E(()=>{"use strict";Vr=!1,nm=!1,sm=0,aI=5e3;ri=null});import{existsSync as LI}from"node:fs";import{createRequire as OI}from"node:module";function $I(){return tl===null&&(tl=OI(import.meta.url)("node:sqlite").DatabaseSync),tl}function rl(e){return e.length===1&&CI(e[0])?[e[0]]:e}function CI(e){if(!il(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function il(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var tl,nl,pm,sl,_m=E(()=>{"use strict";tl=null;nl=class{name;handle;transactionDepth=0;savepointId=0;constructor(t,r={}){if(r.fileMustExist===!0&&t!==":memory:"&&!LI(t))throw new Error("unable to open database file");this.name=t,this.handle=new($I())(t,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(t){return new sl(this.handle.prepare(t))}exec(t){this.handle.exec(t),this.updateTransactionDepth(t)}pragma(t,r){let n=`PRAGMA ${t}`;if(t.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(t){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=t(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=t(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(t){let r=t.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(t.trim())&&(this.transactionDepth=0)}}},pm=nl,sl=class{handle;rawMode=!1;constructor(t){this.handle=t,this.handle.setAllowBareNamedParameters(!0)}get(...t){let r=this.handle.get(...rl(t));return this.normalizeRow(r)}all(...t){return this.handle.all(...rl(t)).map(r=>this.normalizeRow(r))}run(...t){let r=this.handle.run(...rl(t));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(t){return t==null?t:this.rawMode&&il(t)?Object.values(t):il(t)?{...t}:t}}});import{existsSync as MI,mkdirSync as jI,readFileSync as gm}from"node:fs";import{homedir as DI}from"node:os";import{dirname as ym,join as PI,resolve as wm}from"node:path";import{fileURLToPath as FI,pathToFileURL as UI}from"node:url";function ol(e){e.dbPath!==":memory:"&&jI(ym(e.dbPath),{recursive:!0});let t=new pm(e.dbPath);t.pragma("journal_mode = WAL"),t.pragma("synchronous = NORMAL"),t.pragma("foreign_keys = ON");let r=bm(t);return r===0&&(t.exec(gm(Tm,"utf8")),t.pragma(`user_version = ${BI}`)),qI(t,r),t}function qI(e,t){let r=t;if(r<2&&r!==0&&(e.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
20
20
  team_name TEXT NOT NULL,
@@ -553,7 +553,7 @@ var kk=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ee=(e,t)=>{f
553
553
  ON agent_mailbox(sender_teamfile, sender_alias, created_at);
554
554
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_created
555
555
  ON agent_mailbox(created_at);
556
- `),e.pragma("user_version = 45"),r=45),r<46&&r!==0&&(qn(e,"team_chat_log")?_m(e):e.exec(`
556
+ `),e.pragma("user_version = 45"),r=45),r<46&&r!==0&&(qn(e,"team_chat_log")?hm(e):e.exec(`
557
557
  CREATE TABLE IF NOT EXISTS team_chat_log (
558
558
  id INTEGER PRIMARY KEY AUTOINCREMENT,
559
559
  root_teamfile TEXT NOT NULL,
@@ -572,7 +572,7 @@ var kk=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ee=(e,t)=>{f
572
572
  `),e.exec(`
573
573
  CREATE INDEX IF NOT EXISTS idx_team_chat_log_root_time
574
574
  ON team_chat_log(root_teamfile, created_at);
575
- `),e.pragma("user_version = 46"),r=46),r>=46&&qn(e,"team_chat_log")&&!re(e,"team_chat_log").has("origin")&&_m(e),r<47&&r!==0){Nr(e,"agent_mailbox"),Nr(e,"tracked_invocation");let n=re(e,"agent_mailbox");n.has("delivered_at")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),n.has("receipt")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;");let s=re(e,"tracked_invocation");s.has("notified_by")||e.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),s.has("notified_at")||e.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),e.pragma("user_version = 47"),r=47}if(r<48&&r!==0){Nr(e,"agent_mailbox");let n=re(e,"agent_mailbox");n.has("delivering_at")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),n.has("delivery_holder_pid")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),n.has("delivery_holder_host")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),n.has("waited_at")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),n.has("waited_by")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),e.exec(`
575
+ `),e.pragma("user_version = 46"),r=46),r>=46&&qn(e,"team_chat_log")&&!re(e,"team_chat_log").has("origin")&&hm(e),r<47&&r!==0){Nr(e,"agent_mailbox"),Nr(e,"tracked_invocation");let n=re(e,"agent_mailbox");n.has("delivered_at")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN delivered_at TEXT;"),n.has("receipt")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN receipt TEXT;");let s=re(e,"tracked_invocation");s.has("notified_by")||e.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_by TEXT;"),s.has("notified_at")||e.exec("ALTER TABLE tracked_invocation ADD COLUMN notified_at TEXT;"),e.pragma("user_version = 47"),r=47}if(r<48&&r!==0){Nr(e,"agent_mailbox");let n=re(e,"agent_mailbox");n.has("delivering_at")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN delivering_at TEXT;"),n.has("delivery_holder_pid")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_pid INTEGER;"),n.has("delivery_holder_host")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN delivery_holder_host TEXT;"),n.has("waited_at")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_at TEXT;"),n.has("waited_by")||e.exec("ALTER TABLE agent_mailbox ADD COLUMN waited_by TEXT;"),e.exec(`
576
576
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_sender_delivery_wait
577
577
  ON agent_mailbox(sender_teamfile, sender_alias, delivered_at, waited_at, id);
578
578
  CREATE INDEX IF NOT EXISTS idx_agent_mailbox_lane_delivery
@@ -599,7 +599,7 @@ var kk=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ee=(e,t)=>{f
599
599
  BEGIN
600
600
  SELECT RAISE(ABORT, 'agent_mailbox response requires request_mailbox_id');
601
601
  END;
602
- `),e.pragma("user_version = 51"),r=51}r<52&&r!==0&&(Nr(e,"tracked_invocation"),re(e,"tracked_invocation").has("request_payload")||e.exec("ALTER TABLE tracked_invocation ADD COLUMN request_payload TEXT;"),e.pragma("user_version = 52"),r=52),MI(WI)}function re(e,t){let r=e.prepare(`PRAGMA table_info(${t})`).all();return new Set(r.map(n=>n.name))}function qn(e,t){return e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(t)!==void 0}function Nr(e,t){if(!qn(e,t)&&(e.exec(gm(Tm,"utf8")),!qn(e,t)))throw new Error(`schema.sql did not create expected table: ${t}`)}function _m(e){let t=re(e,"team_chat_log");e.pragma("foreign_keys = OFF");try{e.exec(`
602
+ `),e.pragma("user_version = 51"),r=51}r<52&&r!==0&&(Nr(e,"tracked_invocation"),re(e,"tracked_invocation").has("request_payload")||e.exec("ALTER TABLE tracked_invocation ADD COLUMN request_payload TEXT;"),e.pragma("user_version = 52"),r=52),MI(WI)}function re(e,t){let r=e.prepare(`PRAGMA table_info(${t})`).all();return new Set(r.map(n=>n.name))}function qn(e,t){return e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(t)!==void 0}function Nr(e,t){if(!qn(e,t)&&(e.exec(gm(Tm,"utf8")),!qn(e,t)))throw new Error(`schema.sql did not create expected table: ${t}`)}function hm(e){let t=re(e,"team_chat_log");e.pragma("foreign_keys = OFF");try{e.exec(`
603
603
  DROP TABLE IF EXISTS team_chat_log_v46;
604
604
  CREATE TABLE team_chat_log_v46 (
605
605
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -628,7 +628,7 @@ var kk=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ee=(e,t)=>{f
628
628
  FROM team_chat_log;
629
629
  DROP TABLE team_chat_log;
630
630
  ALTER TABLE team_chat_log_v46 RENAME TO team_chat_log;
631
- `)}finally{e.pragma("foreign_keys = ON")}}function bm(e){let t=e.pragma("user_version",{simple:!0});return typeof t=="number"?t:0}function HI(){return process.env.LMCTL_DB??PI(DI(),".lmctl","state.db")}var Em,Tm,WI,BI,Sm=E(()=>{"use strict";hm();Em=ym(FI(import.meta.url)),Tm=wm(Em,"schema.sql"),WI=wm(Em,"migrations"),BI=52;if(process.argv[1]&&import.meta.url===UI(process.argv[1]).href){let e=ol({dbPath:process.argv[2]??HI()});try{process.stdout.write(`migrated user_version=${bm(e)}
631
+ `)}finally{e.pragma("foreign_keys = ON")}}function bm(e){let t=e.pragma("user_version",{simple:!0});return typeof t=="number"?t:0}function HI(){return process.env.LMCTL_DB??PI(DI(),".lmctl","state.db")}var Em,Tm,WI,BI,Sm=E(()=>{"use strict";_m();Em=ym(FI(import.meta.url)),Tm=wm(Em,"schema.sql"),WI=wm(Em,"migrations"),BI=52;if(process.argv[1]&&import.meta.url===UI(process.argv[1]).href){let e=ol({dbPath:process.argv[2]??HI()});try{process.stdout.write(`migrated user_version=${bm(e)}
632
632
  `)}finally{e.close()}}});function vm(e){return{getAgentInflight:e.prepare("SELECT * FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),listAgentInflight:e.prepare("SELECT * FROM agent_inflight ORDER BY started_at ASC, receiver_teamfile ASC, receiver_alias ASC"),acquireAgentInflight:e.prepare(`
633
633
  INSERT INTO agent_inflight (receiver_teamfile, receiver_alias, sender_teamfile, sender_alias, started_at, active_count, holder_pid)
634
634
  VALUES (@receiver_teamfile, @receiver_alias, @sender_teamfile, @sender_alias, @started_at, 1, @holder_pid)
@@ -1356,8 +1356,8 @@ var kk=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ee=(e,t)=>{f
1356
1356
  truncated = ?
1357
1357
  WHERE id = ?
1358
1358
  `),...Nm(e),...vm(e)}}function t0(e,t){return t===void 0?{resumed:!1,reason:e}:{resumed:!1,reason:e,valid:t}}var dl,Qe=E(()=>{"use strict";Sm();km();xm();al();Om();Vn();Yn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;recvMailboxMessagesTxn;constructor(t){t.pragma("foreign_keys = ON"),this.db=t,this.stmts=e0(t),this.claimTxn=t.transaction((r,n,s)=>{let i=this.stmts.selectClaimableJob.get(s,s,s);return i===void 0||this.stmts.claimJob.run(r,n,s,i.id,s,s,s).changes!==1?null:this.getJob(i.id)}),this.claimWithConcurrencyTxn=t.transaction((r,n,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(r,n,s,l.id,s,s,s).changes===1)return this.getJob(l.id)}return null}),this.claimByIdWithConcurrencyTxn=t.transaction((r,n,s,i,o)=>{let a=this.getJob(r);if(a===null)return{claimed:!1,reason:"not_found",job_id:r};if(a.locked_until!==null&&a.locked_until>=i)return{claimed:!1,reason:"locked",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let c=a.status==="queued"&&a.available_at<=i,d=a.status==="running"&&a.locked_until!==null&&a.locked_until<i;if(!c&&!d)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let u=o(a);if(u.concurrency_key!==null&&(a.concurrency_key_resolved!==u.concurrency_key&&this.stmts.setJobConcurrencyKey.run(u.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(u.concurrency_key,i,a.id)?.count??0)>=Math.max(1,u.concurrent_limit)))return{claimed:!1,reason:"concurrency_limit",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};if(this.stmts.claimJob.run(n,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:r,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:r}:{claimed:!0,job:m}}),this.resumeRunTxn=t.transaction((r,n,s)=>t0("state_not_found")),this.resumeInteractiveTxn=t.transaction((r,n,s,i)=>{let o=this.getInteractiveSessionByStepId(r);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,n,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(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=t.transaction((r,n,s)=>{let i=this.stmts.getAttention.get(r);if(i===void 0)return{resumed:!1,reason:"not_found"};if(i.kind!==ii)return{resumed:!1,reason:"wrong_kind"};if(i.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(i.run_id===null)return{resumed:!1,reason:"run_not_found"};let o=null,a=[];if(i.payload!==null)try{let d=JSON.parse(i.payload);d.step!==void 0&&typeof d.step.id=="string"&&d.step.id.length>0&&(o=d.step.id),Array.isArray(d.declared_outcomes)&&(a=d.declared_outcomes.filter(u=>typeof u=="string"))}catch{}if(o===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(i.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Kn&&!a.includes(n))return{resumed:!1,reason:jm};let c={};if(l.pending_escalation_decision!==null)try{let d=JSON.parse(l.pending_escalation_decision);d!==null&&typeof d=="object"&&!Array.isArray(d)&&(c=d)}catch{c={}}return c[o]=n,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,r),{resumed:!0,run:this.getRun(l.id),job:this.getJob(l.job_id)}}),this.tryAcquireAgentInflightTxn=(r,n={})=>{this.db.exec("BEGIN IMMEDIATE");try{let s=n.reclaim_observed,i=this.stmts.acquireAgentInflight.get({...r,holder_pid:process.pid,stale_before:n.stale_before??null,force:n.force===!0?1:0,reclaim_observed_sender_teamfile:s?.sender_teamfile??null,reclaim_observed_sender_alias:s?.sender_alias??null,reclaim_observed_started_at:s?.started_at??null,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),o=i!==void 0?{acquired:!0,current:i}:{acquired:!1,current:this.getAgentInflight(r.receiver_teamfile,r.receiver_alias)??(()=>{throw new Error("agent_inflight conflict row disappeared during acquire")})()};return this.db.exec("COMMIT"),o}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}},this.recvMailboxMessagesTxn=t.transaction((r,n)=>{let s=this.stmts.listAllMailboxMessagesForReceiver.all(r,n);for(let i of s)this.stmts.deleteMailboxMessage.run(i.id);return s})}close(){this.db.close()}query(t,...r){let n=t.trim().toLowerCase();if(!n.startsWith("select")&&!n.startsWith("with")&&!n.startsWith("pragma"))throw new Error("Dal.query only allows read-only SELECT/WITH/PRAGMA statements");return this.db.prepare(t).all(...r)}insertWorkflow(t){Fm(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.stmts.insertWorkflow.run(t.name,t.version??1,t.definition_schema_version??1,t.definition,$()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,t.definition,t.author??null,$());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,n.id);let i=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,t.definition),i}upsertWorkflow(t){Fm(t.name,t.definition,o=>this.getWorkflowByName(o));let r=this.getWorkflowByName(t.name);if(r===null)return this.insertWorkflow({name:t.name,definition_schema_version:t.definition_schema_version,definition:t.definition,author:t.author,source_uri:t.source_uri,source_sha256:t.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,i=this.stmts.insertWorkflowVersion.run(r.id,s,t.definition,t.author??null,$());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(i.lastInsertRowid),t.definition,t.definition_schema_version??r.definition_schema_version,s,r.id),(t.source_uri!=null||t.source_sha256!=null)&&this.stmts.setWorkflowSource.run(t.source_uri??null,t.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,t.definition),this.getWorkflow(r.id)}insertCompositionUnit(t){this.stmts.insertCompositionUnit.run(t.name,t.version,t.lang,t.source,t.source_sha,t.compiled_workflow_version_id,$())}getWorkflow(t){return this.stmts.getWorkflow.get(t)??null}getWorkflowByName(t,r){return(r===void 0?this.stmts.findWorkflowLatest.get(t):this.stmts.findWorkflowVersion.get(t,r))??null}findWorkflowByName(t,r){return this.getWorkflowByName(t,r)}insertWorkflowVersion(t,r,n){let i=(this.stmts.getLatestWorkflowVersion.get(t)?.version??0)+1,o=this.stmts.insertWorkflowVersion.run(t,i,r,n??null,$());return this.stmts.getWorkflowVersion.get(o.lastInsertRowid)}activateWorkflowVersion(t,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==t)return null;let s=1;try{let i=JSON.parse(n.definition);typeof i.definition_schema_version=="number"&&(s=i.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,t),this.syncWorkflowTriggers(t,n.definition),this.getWorkflow(t)}getWorkflowVersionById(t){return this.stmts.getWorkflowVersion.get(t)??null}listWorkflowVersions(t){return this.stmts.listWorkflowVersions.all(t)}upsertTriggerInstance(t){return this.stmts.upsertTriggerInstance.run(t.workflow_id,t.trigger_id,t.trigger_type,t.parameters,t.enabled===!1?0:1,$()),this.stmts.getTriggerInstanceByWorkflowAndId.get(t.workflow_id,t.trigger_id)}listTriggerInstancesForWorkflow(t){return this.stmts.listTriggerInstancesForWorkflow.all(t)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(t,r){return this.stmts.setTriggerCursor.run(r,$(),t),this.stmts.getTriggerInstance.get(t)??null}setTriggerFailure(t,r){return this.stmts.setTriggerFailure.run($(),r,t),this.stmts.getTriggerInstance.get(t)??null}syncWorkflowTriggers(t,r){let n;try{n=JSON.parse(r)}catch{return}if(n===null||typeof n!="object"||Array.isArray(n))return;let s=n.triggers;if(Array.isArray(s))for(let i of s){if(i===null||typeof i!="object"||Array.isArray(i))continue;let o=i;typeof o.id!="string"||o.id.length===0||typeof o.type!="string"||o.type.length===0||this.upsertTriggerInstance({workflow_id:t,trigger_id:o.id,trigger_type:o.type,parameters:JSON.stringify(o.parameters??{})})}}insertTeam(t){let r=this.stmts.insertTeam.run(t.name,$());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(t){return this.stmts.getTeam.get(t)??null}findTeamByName(t){return this.stmts.findTeamByName.get(t)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(t){let r=this.stmts.insertTeamMember.run(t.team_id,t.alias,t.role??"agent",t.provider,t.model??null,t.sessionid??null,t.sessiondir,$());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(t){return this.stmts.listTeamMembers.all(t)}findTeamMemberByAlias(t,r){return this.stmts.findTeamMemberByAlias.get(t,r)??null}updateTeamMemberSession(t,r){return this.stmts.updateTeamMemberSession.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberState(t,r,n){return this.stmts.setMemberState.run(r,n??null,$(),t),this.stmts.getTeamMember.get(t)??null}listMembersInState(t){return this.stmts.listMembersInState.all(t)}setMemberPromptSnapshot(t,r){return this.stmts.setMemberPromptSnapshot.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberProviderResolved(t,r){return this.stmts.setMemberProviderResolved.run(r,t),this.stmts.getTeamMember.get(t)??null}setMemberRolePrompt(t,r){return this.stmts.setMemberRolePrompt.run(r,t),this.stmts.getTeamMember.get(t)??null}updateTeamMemberMeta(t,r){let n=this.stmts.getTeamMember.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),i=Object.prototype.hasOwnProperty.call(r,"model"),o=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,i?r.model??null:n.model,o?r.provider??n.provider:n.provider,t),this.stmts.getTeamMember.get(t)??null}insertTeamMemberCompanion(t){let r=this.stmts.insertTeamMemberCompanion.run(t.interpreter_id,t.companion_id,$());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(t){let r=this.stmts.insertProject.run(t.name,t.description??null,t.local_path,t.workflow_name,t.team_id,t.default_branch??null,t.intake_config??null,t.test_argv??null,t.test_command??null,t.durable_memory_mode??"folder",$());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(t){return this.stmts.getProject.get(t)??null}findProjectByName(t){return this.stmts.findProjectByName.get(t)??null}setProjectIntakeConfig(t,r){return this.stmts.setProjectIntakeConfig.run(r,t),this.stmts.getProject.get(t)??null}updateProjectSettings(t,r){let n=this.stmts.getProject.get(t);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),i=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),o=Object.prototype.hasOwnProperty.call(r,"default_branch"),a=Object.prototype.hasOwnProperty.call(r,"intake_config");return this.stmts.updateProjectSettings.run(s?r.local_path:n.local_path,i?r.durable_memory_mode:n.durable_memory_mode,o?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,t),this.stmts.getProject.get(t)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(t=>{if(t.intake_config===null)return!1;try{let r=JSON.parse(t.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(t){return this.stmts.getProjectByJob.get(t)??null}insertProjectWorkflow(t){let r=t.condition??null,n=this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(t.project_id,t.workflow_id,r,t.parameters_override??null,t.enabled===!1?0:1,t.priority??100,$());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(t.project_id,t.workflow_id,r)}getProjectWorkflow(t){return this.stmts.getProjectWorkflow.get(t)??null}listProjectWorkflows(t,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(t):this.stmts.listProjectWorkflows.all(t)}removeProjectWorkflow(t){return this.stmts.removeProjectWorkflow.run(t).changes>0}setProjectWorkflowEnabled(t,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,t),this.getProjectWorkflow(t)}createIssue(t){let r=$(),n=this.stmts.createIssue.run(t.project_id,t.title,t.body,t.severity??"medium",t.labels??null,t.ai_test_path??null,t.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(t){return this.stmts.getIssue.get(t)??null}listIssues(t,r={}){return this.stmts.listIssuesForProject.all(t).filter(n=>!(r.status!==void 0&&!r.status.includes(n.status)||r.severity!==void 0&&!r.severity.includes(n.severity)||r.ai_test_path!==void 0&&n.ai_test_path!==r.ai_test_path))}claimNextIssue(t,r){return this.stmts.claimNextIssue.get(r,$(),t)??null}claimIssue(t,r){return this.stmts.claimIssue.get(r,$(),t)??null}closeIssue(t,r,n){let s=$(),i=this.stmts.closeIssue.get(r,n??null,s,s,t);if(i===void 0)throw new Error(`issue not found: ${t}`);return i}reopenIssue(t,r){let n=this.stmts.reopenIssue.get(r,$(),t);if(n===void 0)throw this.getIssue(t)===null?new Error(`issue not found: ${t}`):new Error(`issue ${t} is not closed`);return n}updateIssue(t,r){let n=this.getIssue(t);if(n===null)throw new Error(`issue not found: ${t}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),i=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),o=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,i?r.ai_test_path??null:n.ai_test_path,$(),t);if(o===void 0)throw new Error(`issue not found: ${t}`);return o}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(t,r){let n=this.stmts.getWebuiSession.get(t);if(n!==void 0)return n;let s=$();return this.stmts.insertWebuiSession.run(t,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(t)}getWebuiSession(t){return this.stmts.getWebuiSession.get(t)??null}updateWebuiSessionTransition(t,r,n,s,i){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,i,$(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}setWebuiSessionChatbot(t,r){if(this.stmts.setWebuiSessionChatbot.run(r,$(),t).changes===0)throw new Error(`webui_session not found: ${t}`);return this.stmts.getWebuiSession.get(t)}createChatbotSession(t,r){let n=Pm(),s=$();return this.stmts.insertChatbotSession.run(n,t,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(t){return this.stmts.getChatbotSession.get(t)??null}listChatbotSessions(t){return this.stmts.listChatbotSessionsForUser.all(t)}appendChatbotMessage(t,r,n,s){let i=$(),o=this.stmts.insertChatbotMessage.run(t,r,n,s??null,i);return this.stmts.touchChatbotSession.run(i,t),this.stmts.getChatbotMessage.get(o.lastInsertRowid)}listChatbotMessages(t){return this.stmts.listChatbotMessages.all(t)}getConfig(t){return this.stmts.getConfig.get(t)?.value??null}setConfig(t,r){this.stmts.upsertConfig.run(t,r,$())}getConfigAll(){let t=this.stmts.listConfig.all(),r={};for(let n of t)r[n.key]=n.value;return r}enqueueJob(t){let r=this.stmts.insertJob.run(t.project_id,t.workflow_id_override??null,t.source,t.source_ref??null,t.payload??null,t.priority??0,t.available_at??$(),t.dedupe_key??null,t.concurrency_key??null,$());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(t.dedupe_key===void 0||t.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(t.source,t.dedupe_key)}claimNextJob(t){let r=$(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimTxn(t.worker_id,n,r)}claimNextJobWithConcurrency(t){let r=$(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimWithConcurrencyTxn(t.worker_id,n,r,t.evaluator)}claimJobByIdWithConcurrency(t){let r=$(),n=new Date(Date.now()+t.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(t.job_id,t.worker_id,n,r,t.evaluator)}releaseJob(t,r,n){let s=r==="queued"||r==="running"?null:$();return this.stmts.releaseJob.run(r,n??null,s,t),this.getJob(t)}getJob(t){return this.stmts.getJob.get(t)??null}findJobBySourceAndDedupe(t,r){return this.stmts.findJobByDedupe.get(t,r)??null}insertRun(t){let r=this.getWorkflow(t.workflow_id);if(r===null)throw new Error(`workflow not found: ${t.workflow_id}`);let n=this.stmts.insertRun.run(t.job_id,t.workflow_id,t.team_id,t.current_state??null,r.active_version_id,t.parent_run_id??null,$()),s=this.stmts.getRun.get(n.lastInsertRowid);return(t.parent_run_id===void 0||t.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,t.job_id),s}setJobRun(t,r){return this.stmts.setJobRun.run(r,t),this.getJob(t)}insertPromptDispatch(t){return this.stmts.insertPromptDispatch.run(t.prompt_id,t.project_id,t.job_id,t.text,t.context_json??null,$()),this.stmts.getPromptDispatch.get(t.prompt_id)}getPromptDispatch(t){return this.stmts.getPromptDispatch.get(t)??null}setPromptDispatchCompleted(t,r){return this.stmts.setPromptDispatchCompleted.run(r??$(),t),this.getPromptDispatch(t)}getWorkspace(t){return this.stmts.getWorkspace.get(t)??null}ensureWorkspace(t={}){let r=t.id??"default";this.stmts.ensureWorkspace.run(r,t.name??"Default workspace",t.idleThresholdMs??6e5,$());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(t){return this.stmts.listWebProjectsActive.all(t)}getWebProject(t){return this.stmts.getWebProject.get(t)??null}insertWebProject(t){let r=$(),n=this.stmts.insertWebProject.run(t.workspace_id,t.name,t.repo_path,t.config_json??null,t.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),i=this.getWebProject(s);if(i===null)throw new Error(`web_project ${s} missing after insert`);return i}updateWebProject(t){let r=this.getWebProject(t.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(t.name??r.name,t.config_json===void 0?r.config_json:t.config_json,$(),t.id),this.getWebProject(t.id))}softDeleteWebProject(t){return this.stmts.softDeleteWebProject.run($(),t).changes===1}loadMailboxCursor(t,r){return this.stmts.loadMailboxCursor.get(t,r)??null}saveMailboxCursor(t){this.stmts.saveMailboxCursor.run(t.user_id,t.mailbox_key,t.last_processed_version_id,t.last_processed_seq??null,t.last_processed_at)}addUsage(t){this.stmts.addUsage.run(t.user_id,t.device_id,t.period,t.put,t.get,t.list,t.updated_at)}loadUsage(t,r,n){return this.stmts.loadUsage.get(t,r,n)??null}sumUsageForPeriod(t,r){let n=this.stmts.sumUsageForPeriod.get(t,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(t){this.stmts.upsertRootTeam.run(t.teamfile_path,t.name,t.raw_text,t.raw_sha256,t.registered_at,t.last_seeded_at)}getRootTeam(t){return this.stmts.getRootTeam.get(t)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(t){let r=this.stmts.insertTeamChatLog.run(t.root_teamfile,t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias,t.message,t.response,t.origin,t.status,t.error_detail,t.truncated,t.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(t){return this.stmts.listTeamChatLog.all(t)}listTeamChatLogSinceId(t,r=500){return this.stmts.listTeamChatLogSinceId.all(t,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(t){return this.stmts.loadTeamChatLogCursor.get(t)??null}saveTeamChatLogCursor(t){this.stmts.saveTeamChatLogCursor.run(t.cursor_key,t.last_pushed_id,t.updated_at)}startTrackedInvocation(t){let r=t.started_at??$(),n=t.holder_host??zn(),s=t.last_heartbeat_at??r,i=this.stmts.insertTrackedInvocation.run(t.kind,t.origin,t.scope_teamfile??null,t.from_identity,t.target_teamfile??null,t.target_alias??null,t.root_teamfile??null,t.cwd??null,Ft(t.command),r,t.holder_pid??null,n,s,Ft(t.meta),t.launch_source??t.kind,t.request_payload??null);return this.getTrackedInvocation(Number(i.lastInsertRowid))}getTrackedInvocation(t){return this.stmts.getTrackedInvocation.get(t)??null}listAllRunningTrackedInvocations(){return this.stmts.listAllRunningTrackedInvocations.all()}finishTrackedInvocation(t,r){let n=r.ended_at??$();return this.stmts.finishTrackedInvocation.run(r.status,n,r.exit_code??null,r.signal??null,Ft(r.result_summary),Ft(r.error),r.team_chat_log_id??null,Ft(r.meta),n,t).changes!==1?null:this.getTrackedInvocation(t)}reclaimTrackedInvocationIfUnchanged(t,r,n){let s=n.ended_at??$();return this.stmts.reclaimTrackedInvocationIfUnchanged.run(n.status,s,n.exit_code??null,n.signal??null,Ft(n.result_summary),Ft(n.error),n.team_chat_log_id??null,Ft(n.meta),s,t,r.holder_pid,r.holder_host,r.started_at,r.last_heartbeat_at).changes!==1?null:this.getTrackedInvocation(t)}heartbeatTrackedInvocation(t,r=$()){return this.stmts.heartbeatTrackedInvocation.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}updateTrackedInvocationRequestPayload(t,r){return this.stmts.updateTrackedInvocationRequestPayload.run(r,t).changes!==1?null:this.getTrackedInvocation(t)}listClaimableTerminalTrackedInvocations(t){let r=["status IN ('done', 'error', 'busy', 'cancelled')","ended_at IS NOT NULL","notified_by IS NULL"],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));return n.push(s),this.db.prepare(`SELECT * FROM tracked_invocation WHERE ${r.join(" AND ")} ORDER BY ended_at ASC, id ASC LIMIT ?`).all(...n)}claimTrackedInvocationNotification(t,r,n=$()){return this.stmts.claimTrackedInvocationNotification.run(r,n,t).changes!==1?null:this.getTrackedInvocation(t)}listTrackedInvocations(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile)),t.status!==void 0&&(r.push("status = ?"),n.push(t.status)),t.kind!==void 0&&(r.push("kind = ?"),n.push(t.kind)),t.origin!==void 0&&(r.push("origin = ?"),n.push(t.origin));let s=Math.max(1,Math.min(1e3,Math.trunc(t.limit??100)));n.push(s);let i=r.length===0?"":` WHERE ${r.join(" AND ")}`;return this.db.prepare(`SELECT * FROM tracked_invocation${i} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...n)}maxTrackedInvocationId(t={}){let r=[],n=[];t.from!==void 0&&(r.push("from_identity = ?"),n.push(t.from)),t.scope_teamfile!==void 0&&(r.push("scope_teamfile = ?"),n.push(t.scope_teamfile));let s=r.length===0?"":` WHERE ${r.join(" AND ")}`,i=this.db.prepare(`SELECT COALESCE(MAX(id), 0) AS max_id FROM tracked_invocation${s}`).get(...n);return Number(i?.max_id??0)}listRunningTrackedInvocations(t={}){return this.listTrackedInvocations({...t,status:"running"})}enqueueMail(t){return this.sendMailboxMessage(t)}sendMailboxMessage(t){let r=this.stmts.insertMailboxMessage.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile??null,t.sender_alias??null,t.root_teamfile??null,Hn(t.payload),t.created_at??$(),t.remote_transport??null,t.remote_message_id??null,t.remote_thread_id??null,t.meta??null,t.message_type??"request",t.reply_mode??"pull",t.request_mailbox_id??null);return this.getMailboxMessage(Number(r.lastInsertRowid))}listEnqueuedRequestMailFromSender(t,r,n,s){return this.stmts.listEnqueuedRequestMailFromSender.all(t,r,n,s)}listEnqueuedResponseMailFromSender(t,r,n,s){return this.stmts.listEnqueuedResponseMailFromSender.all(t,r,n,s)}listRelayMailboxLanes(t){return this.stmts.listRelayMailboxLanes.all(Math.max(1,Math.trunc(t)))}markMailDelivered(t,r,n){let s=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(s.length===0)return 0;let i=Hn(r);this.db.exec("BEGIN IMMEDIATE");try{let o=0;for(let a of s)o+=this.stmts.markMailboxMessageDelivered.run(n,i,a).changes;return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}markRelayRequestDelivered(t,r,n){let s=Hn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0;for(let o of t)this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,o.id,o.delivering_at,o.delivery_holder_pid,o.delivery_holder_host).changes===1&&(i+=1);return this.db.exec("COMMIT"),i}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}markRelayRequestDeliveredAndEnqueueResponses(t,r,n){let s=Hn(r);this.db.exec("BEGIN IMMEDIATE");try{let i=0,o=0;for(let a of t){if(this.stmts.markMailboxMessageDeliveredIfUnchanged.run(n,s,a.id,a.delivering_at,a.delivery_holder_pid,a.delivery_holder_host).changes!==1||(i+=1,a.sender_teamfile===null||a.sender_alias===null))continue;let c=this.stmts.insertMailboxResponseIfAbsent.run(a.sender_teamfile,a.sender_alias,a.receiver_teamfile,a.receiver_alias,a.root_teamfile,s,n,null,null,null,null,a.reply_mode,a.id);o+=c.changes}return this.db.exec("COMMIT"),{marked:i,responses:o}}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}claimMailForDelivery(t,r,n=process.pid,s=zn()){let i=[...new Set(t.map(o=>Math.trunc(o)).filter(o=>Number.isInteger(o)&&o>0))];if(i.length===0)return[];this.db.exec("BEGIN IMMEDIATE");try{let o=[];for(let a of i)if(this.stmts.claimMailboxMessageDelivery.run(r,n,s,a).changes===1){let c=this.getMailboxMessage(a);c!==null&&o.push(c)}return this.db.exec("COMMIT"),o}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearMailDelivery(t){let r=[...new Set(t.map(n=>Math.trunc(n)).filter(n=>Number.isInteger(n)&&n>0))];if(r.length===0)return 0;this.db.exec("BEGIN IMMEDIATE");try{let n=0;for(let s of r)n+=this.stmts.clearMailboxMessageDelivery.run(s).changes;return this.db.exec("COMMIT"),n}catch(n){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),n}}reclaimMailboxDeliveryIfUnchanged(t){return this.stmts.clearMailboxMessageDeliveryIfUnchanged.run(t.id,t.delivering_at,t.delivery_holder_pid,t.delivery_holder_host).changes!==1?null:this.getMailboxMessage(t.id)}reclaimStaleMailboxDeliveries(t){let r=this.stmts.listInFlightMailboxDeliveries.all(),n=[];this.db.exec("BEGIN IMMEDIATE");try{for(let s of r){if(!ZI(s,t))continue;let i=this.reclaimMailboxDeliveryIfUnchanged(s);i!==null&&n.push(i)}return this.db.exec("COMMIT"),n}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}listDeliveredReceiptsForSender(t,r){return this.stmts.listDeliveredReceiptsForSender.all(t,r)}listOutboundPendingForSender(t,r){return this.stmts.listOutboundPendingForSender.all(t,r)}getMailboxMessage(t){return this.stmts.getMailboxMessage.get(t)??null}peekMailboxMessages(t,r=1e3){return this.stmts.listMailboxMessagesForReceiver.all(t.receiver_teamfile,t.receiver_alias,Math.max(1,Math.min(1e3,Math.trunc(r))))}recvMailboxMessages(t){return this.recvMailboxMessagesTxn(t.receiver_teamfile,t.receiver_alias)}updateTeamChatLogResponse(t,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,t)}getAgentInflight(t,r){return this.stmts.getAgentInflight.get(t,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(t,r){return this.tryAcquireAgentInflightTxn(t,r)}clearAgentInflight(t,r){this.stmts.clearAgentInflight.run(t,r)}clearObservedTerminalAgentInflight(t,r,n){return this.stmts.clearObservedTerminalAgentInflight.run({receiver_teamfile:t,receiver_alias:r,observed_sender_teamfile:n.sender_teamfile,observed_sender_alias:n.sender_alias,observed_started_at:n.started_at,observed_holder_pid:n.holder_pid}).changes===1}releaseAgentInflight(t){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(t.receiver_teamfile,t.receiver_alias);if(r===null||r.sender_teamfile!==t.sender_teamfile||r.sender_alias!==t.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(t.receiver_teamfile,t.receiver_alias,t.sender_teamfile,t.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(t){return this.stmts.clearAgentInflightOlderThan.run(t).changes}getTerminalLock(t,r){let n=this.stmts.getRuntimeState.get(Jn,Gn(t,r),Xn);return n===void 0?null:Lm(n.data)}setTerminalLock(t){this.stmts.upsertRuntimeState.run(Jn,Gn(t.teamfile,t.alias),Xn,JSON.stringify(t),t.last_heartbeat)}heartbeatTerminalLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getTerminalLock(t,r);if(i===null||i.lock_id!==n)return this.db.exec("COMMIT"),!1;let o={...i,last_heartbeat:s};return this.stmts.upsertRuntimeState.run(Jn,Gn(t,r),Xn,JSON.stringify(o),s),this.db.exec("COMMIT"),!0}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}clearTerminalLock(t,r,n){this.db.exec("BEGIN IMMEDIATE");try{let s=this.getTerminalLock(t,r);if(s===null||s.lock_id!==n)return this.db.exec("COMMIT"),!1;let i=this.stmts.deleteRuntimeState.run(Jn,Gn(t,r),Xn);return this.db.exec("COMMIT"),i.changes===1}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}getRuntimeProcessLock(t,r,n){let s=this.stmts.getRuntimeState.get(t,r,n);return s===void 0?null:YI(s.data)}tryAcquireRuntimeProcessLock(t,r,n,s,i=$()){this.db.exec("BEGIN IMMEDIATE");try{let o=this.getRuntimeProcessLock(t,r,n);if(o!==null&&!zI(o,s))return this.db.exec("COMMIT"),{acquired:!1,current:o};let a={lock_id:Pm(),holder_pid:process.pid,holder_host:zn(),started_at:i,last_heartbeat:i};return this.stmts.upsertRuntimeState.run(t,r,n,JSON.stringify(a),i),this.db.exec("COMMIT"),{acquired:!0,lock:a,previous:o}}catch(o){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),o}}clearRuntimeProcessLock(t,r,n,s){this.db.exec("BEGIN IMMEDIATE");try{let i=this.getRuntimeProcessLock(t,r,n);if(i===null||i.lock_id!==s)return this.db.exec("COMMIT"),!1;let o=this.stmts.deleteRuntimeState.run(t,r,n);return this.db.exec("COMMIT"),o.changes===1}catch(i){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),i}}getRun(t){return this.stmts.getRun.get(t)??null}setRunCurrentState(t,r){return this.stmts.setRunCurrentState.run(r,t),this.stmts.getRun.get(t)??null}setRunPausedState(t,r,n){return this.stmts.setRunPausedState.run(r,n,t),this.stmts.getRun.get(t)??null}setRunPendingEscalationDecision(t,r){return this.stmts.setRunPendingEscalationDecision.run(r,t),this.stmts.getRun.get(t)??null}setRunTerminalState(t,r){return this.stmts.setRunTerminalState.run(r,$(),t),this.stmts.getRun.get(t)??null}pauseJob(t){return this.stmts.pauseJob.run(t),this.getJob(t)}resumeRun(t,r){return this.resumeRunTxn(t,r,$())}insertStep(t){let r=this.stmts.insertStep.run(t.run_id,t.parent_step_id??null,t.state_name,t.outcome??null,t.status_detail??null,$());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(t,r,n){return this.stmts.finishStep.run(r??null,n??null,$(),t),this.stmts.getStep.get(t)??null}listStepsForRun(t){return this.stmts.listStepsForRun.all(t)}listLatestStepOutcomesByState(t){let r=this.stmts.listLatestStepOutcomesByState.all(t),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(t){let r=this.stmts.insertSubmittedPr.run(t.repo,t.pr_url,t.issue_url??null,t.local_path??null,t.branch??null,t.head_sha??null,t.status??"watching",t.submitted_at??$(),t.last_known_state??null,t.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(t){return t?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(t.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(t){return this.stmts.getSubmittedPr.get(t)??null}findSubmittedPrByUrl(t){return this.stmts.findSubmittedPrByUrl.get(t)??null}insertStepArtifact(t){let r=this.stmts.insertStepArtifact.run(t.step_id,t.kind,t.path??null,t.content??null,t.sha??null,t.provider_call_mode??null,$());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(t){let n=this.stmts.insertExternalObject.run(t.type,t.provider,t.project_id,t.run_id??null,t.external_id,t.url??null,t.status??null,t.metadata??null,t.last_seen_at??null,$()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(t.provider,t.type,t.external_id),inserted:n}}insertExternalSignal(t){let r=this.stmts.insertExternalSignal.run(t.object_id,t.kind,t.source??null,t.occurred_at??null,t.payload??null,t.signal_hash??null,null,$()),n=r.changes===1;return{row:t.signal_hash===void 0||t.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(t.object_id,t.kind,t.signal_hash),inserted:n}}raiseAttention(t){let r=this.stmts.insertAttention.run(t.kind,t.severity??"warn",t.project_id??null,t.run_id??null,t.external_object_id??null,t.requires_user===!0?1:0,t.payload??null,$());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(t){return this.stmts.ackAttention.run($(),t),this.stmts.getAttention.get(t)??null}upsertDurableMemory(t){let r=$();return this.stmts.upsertDurableMemory.run(t.project_id,t.type,t.name,t.description??null,t.body,r,r),this.stmts.getDurableMemoryByName.get(t.project_id,t.name)}getDurableMemoryByName(t,r){return this.stmts.getDurableMemoryByName.get(t,r)??null}deleteDurableMemory(t,r){return this.stmts.deleteDurableMemory.run(t,r).changes>0}listDurableMemory(t,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(t,r):this.stmts.listDurableMemory.all(t)}indexDurableMemory(t,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(t).filter(s=>r.includes(s.type)).map(({name:s,description:i,type:o,updated_at:a})=>({name:s,description:i,type:o,updated_at:a})):this.stmts.listDurableMemory.all(t).map(({name:n,description:s,type:i,updated_at:o})=>({name:n,description:s,type:i,updated_at:o}))}recordSessionSize(t){let r=this.stmts.insertSessionSize.run(t.team_name,t.alias,t.sessionid,t.input_tokens??null,t.cache_tokens??null,t.output_tokens??null,t.total_tokens??null,t.observed_at??$());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(t,r,n=20){return this.stmts.sessionSizeHistory.all(t,r,n)}insertSessionEvent(t){let r=this.stmts.insertSessionEvent.run(t.run_id,t.step_id??null,t.kind,t.timestamp_ms,t.payload,t.payload_truncated??0,t.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(t,r){return r!==void 0?this.stmts.listSessionEventsSince.all(t,r):this.stmts.listSessionEvents.all(t)}listSessionEventsSince(t,r=1e3){return this.stmts.listAllEventsSince.all(t,r)}latestAgentCall(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(t);if(r===void 0)return null;try{let n=JSON.parse(r.payload);return typeof n.alias!="string"||typeof n.provider!="string"?null:{alias:n.alias,provider:n.provider,...typeof n.model=="string"?{model:n.model}:{}}}catch{return null}}agentCallTokenTotals(t){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(t),n=0,s=0,i=0;for(let o of r)try{let a=JSON.parse(o.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),i+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:i}}addRollupValue(t){this.stmts.upsertRollupStat.run(t.run_id,t.step_id??null,t.metric_kind,t.value,t.bucket_start_ms,t.bucket_end_ms,t.updated_at)}listRollupStats(t){return this.stmts.listRollupStats.all(t)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(t){this.stmts.setRollupCursor.run("last_event_id",t)}insertDriftSignal(t){let r=this.stmts.insertDriftSignal.run(t.team_member_id,t.project_id??null,t.signal_kind,t.severity,t.description,t.detected_at,t.expires_at??null,t.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(t={}){return t.team_member_id!==void 0&&t.unacked?this.stmts.listUnackedDriftByMember.all(t.team_member_id):t.team_member_id!==void 0?this.stmts.listDriftByMember.all(t.team_member_id):t.project_id!==void 0?this.stmts.listDriftByProject.all(t.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(t,r,n){return this.stmts.findUnackedDrift.get(t,r??null,n)!==void 0}acknowledgeDriftSignal(t){return this.stmts.ackDriftSignal.run(Date.now(),t),this.stmts.getDriftSignal.get(t)??null}insertInteractiveSession(t){let r=Date.now();return this.stmts.insertInteractiveSession.run(t.run_id,t.step_id,t.state_name,t.status,r,r),this.stmts.getInteractiveSessionByStepId.get(t.step_id)}getInteractiveSessionByStepId(t){return this.stmts.getInteractiveSessionByStepId.get(t)??null}getInteractiveSessionByRunAndState(t,r){return this.stmts.getInteractiveSessionByRunAndState.get(t,r)??null}setInteractiveAgentOutput(t,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),t)}resumeInteractive(t,r,n){return this.resumeInteractiveTxn(t,r,n,$())}resumeEscalation(t,r){return this.resumeEscalationTxn(t,r,$())}}});import{realpathSync as r0}from"node:fs";import{resolve as n0}from"node:path";function ul(e){let t=n0(e);try{return r0(t)}catch{return t}}var Wm=E(()=>{"use strict"});import{platform as Bm}from"node:os";function bt(e){let t=new Zn;for(let r of e)t.registerAdapter(r);return t}var Zn,fl=E(()=>{"use strict";Wm();Zn=class{providers=[];adapters=new Map;register(t){this.providers.push(t)}async listAll(t){let r=[],n=t?.provider?this.providers.filter(o=>o.name===t.provider):this.providers,s=await Promise.all(n.map(o=>o.discoverSessions()));for(let o of s)r.push(...o);let i=r;if(t?.workspace){let o=ul(t.workspace);i=i.filter(a=>ul(a.cwd)===o)}if(t?.from){let o=t.from.getTime();i=i.filter(a=>a.modifiedAt.getTime()>=o)}if(t?.to){let o=t.to.getTime();i=i.filter(a=>a.modifiedAt.getTime()<=o)}return i.sort((o,a)=>a.modifiedAt.getTime()-o.modifiedAt.getTime()),t?.limit&&(i=i.slice(0,t.limit)),i}async getSession(t,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let i=await s.loadSession(t);if(i)return i}return null}async resolveSession(t,r){let n=await this.resolveSessions(t,r);return n.length===1?n[0]:null}async resolveSessions(t,r){let n=r?this.providers.filter(i=>i.name===r):this.providers,s=[];for(let i of n){let o=await i.resolveSessionPath(t);o&&s.push({provider:i,filePath:o})}return s}getWatchTargets(){let t=Bm()==="darwin"||Bm()==="win32",r=[];for(let n of this.providers)if(typeof n.getWatchPaths=="function")for(let s of n.getWatchPaths())r.push({provider:n.name,directory:s.directory,recursive:t,filePattern:s.filePattern});return r}async deleteSession(t,r){let n=await this.resolveSession(t,r);return n?n.provider.deleteSession(t):!1}registerAdapter(t){this.adapters.set(t.name,t),this.providers.push({name:t.name,discoverSessions:()=>t.discover(),loadSession:r=>t.load(r),resolveSessionPath:r=>t.resolvePath(r),deleteSession:r=>t.delete(r),getWatchPaths:()=>t.getWatchPaths?.()??[]})}getAdapter(t){return this.adapters.get(t)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as qm}from"node:fs";import{createInterface as Hm}from"node:readline";import{stat as s0}from"node:fs/promises";import{homedir as i0}from"node:os";async function*He(e){let t=qm(e,{encoding:"utf-8"}),r=Hm({input:t,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{t.destroy()}}async function Me(e,t){let r=[],n=qm(e,{encoding:"utf-8"}),s=Hm({input:n,crlfDelay:1/0});try{for await(let i of s){let o=i.trim();if(o){try{r.push(JSON.parse(o))}catch{}if(r.length>=t)break}}}finally{s.close(),n.destroy()}return r}async function Ne(e){let t=await s0(e);return{createdAt:t.birthtime,modifiedAt:t.mtime}}function ue(e){return e.replace(/\\n/g,`
1359
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function J(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var Se,tr=E(()=>{"use strict";Se=i0()});import{readdir as ai,stat as Jm,unlink as o0}from"node:fs/promises";import{join as Yr,basename as Xm}from"node:path";function a0(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function l0(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return ue(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function Gm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of He(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let _=u+f+m;_&&(o=_),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var li,Vm=E(()=>{"use strict";tr();li=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Yr(Se,".claude"),this.projectsDir=Yr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ai(this.projectsDir)}catch{return t}for(let n of r){let s=Yr(this.projectsDir,n);if(!(await Jm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ai(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Xm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Yr(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,r){let n=await Me(t,50),s=await Ne(t),i="",o,a,l,c,d,u;for(let m of n)if(!a0(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=J(p.trim(),80)),d=J(p.trim(),80)}}if(!i)return null;let f=await Gm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let _ of He(r))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:l0(_)});continue}if(_.type==="user"&&_.message){if(_.isMeta)continue;let g=new Date(_.timestamp||0),h=_.message.content;if(typeof h=="string"){if(h.includes("<command-name>")||h.includes("<local-command-"))continue;d||(d=J(h.trim(),80)),u=J(h.trim(),80),s.push({role:"user",timestamp:g,content:ue(h.trim())})}else if(Array.isArray(h)){for(let y of h)if(y.type==="tool_result"){let T=typeof y.content=="string"?ue(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:T,toolCallId:y.tool_use_id})}}}if(_.type==="assistant"&&_.message){_.message.model&&(l=_.message.model);let g=new Date(_.timestamp||0),h=_.message.content;if(Array.isArray(h))for(let y of h)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:ue(y.text),model:_.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:_.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;let p=await Gm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await o0(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ai(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Yr(this.projectsDir,o);if(!(await Jm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ai(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Xm(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Yr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Me(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function ci(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function d0(e,t,r){if(!r)return"";let n=e.tools[t]??ml[t],s=n?.profiles?.[r]?.flags??ml[t]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${t}"`)}function Km(e,t){return!!e.tools[t]}function Ym(e,t,r,n,s){let i=e.tools[t]??ml[t],o;if(i?.agent){let l=ci(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=c0[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ci).join(" ");o=`printf '%s\\n' ${ci(n)} | ${d}`}else o=c.map(ci).join(" ")}let a=d0(e,t,s);return a&&(o+=" "+a),o}var ml,c0,zm=E(()=>{"use strict";ml={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:""}}}},c0={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"]}}});function Zm(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let r=Number(t);return!Number.isFinite(r)||r<=0?6e5:r}var Qm=E(()=>{"use strict"});var u0,ge,di,St=E(()=>{"use strict";u0="ACK: waiting for explicit lmctl task.",ge=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${u0}`,di=`send this exact lmctl seed instruction: "${ge}"`});function rr(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function m0(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Qn]:t}}function je(e,t,r,n="chat"){return{...m0(rr(e,t),r),[f0]:n}}var Qn,f0,at=E(()=>{"use strict";Qn="LMCTL_SELF_SESSIONID",f0="LMCTL_LAUNCH_SOURCE"});import{spawn as ep}from"node:child_process";import{mkdirSync as p0}from"node:fs";var pl,xe,Ut=E(()=>{"use strict";zm();Qm();St();at();pl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===ge?r:n)}seed(t,r){return p0(t,{recursive:!0}),new Promise(n=>{let s;try{s=ep(this.binary,this.seedArgsFor(r),{cwd:t,env:rr(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
- `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:di,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&Km(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new pl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Ym(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Zm(r.env),c=ep(s,{shell:!0,cwd:r.cwd,env:je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",_=>{let g=_.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",_=>{p+=_.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",_=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):_===0||_===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${_}`))}),c.on("error",_=>{d||(d=!0,clearTimeout(f),a(_))})})}}});function fi(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new Bt(e,r,t)}var et,ye,Wt,ui,Bt,zr=E(()=>{"use strict";et=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},ye=class extends et{},Wt=class extends et{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},ui=class extends et{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},Bt=class extends et{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as _l from"node:child_process";function _0(e){if(typeof _l.spawnSync=="function")try{_l.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function tp(e){return e.exitCode!==null||e.signalCode!==null}function hl(e,t){return tp(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function tt(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??_0;if(tp(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await hl(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await hl(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await hl(e,h0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var h0,mi=E(()=>{"use strict";h0=1e3});function rp(e){ce()&&Ae({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function nr(e,t){let r=y0[e];if(r)return r[t]??r.yolo}function E0(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function lt(e,t,r="yolo"){if(w0.has(e)){rp(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?nr(e,"plan"):g0[e];if(!n){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw q({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new ye(s)}if(!E0(t,n)){let s=n.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw q({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new ye(i)}rp(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var g0,y0,w0,Zr=E(()=>{"use strict";zr();pe();g0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},y0={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"]}};w0=new Set(["codex","opencode"])});function np(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let r=0;r<e.length;r++)r===0?t.push(e[r]):t.push(`
1359
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function J(e,t){return e.length<=t?e:e.slice(0,t-3)+"..."}var Se,tr=E(()=>{"use strict";Se=i0()});import{readdir as ai,stat as Jm,unlink as o0}from"node:fs/promises";import{join as Yr,basename as Xm}from"node:path";function a0(e){return e==="file-history-snapshot"||e==="progress"||e==="system"||e==="queue-operation"}function l0(e){if(e.type==="system"){let t=e.message?.content;if(typeof t=="string"&&t.trim())return ue(t.trim());if(t!==void 0)return JSON.stringify(t,null,2)}return e.type==="progress"&&e.data!==void 0?JSON.stringify(e.data,null,2):JSON.stringify(e,null,2)}async function Gm(e){let t=0,r=0,n=0,s=0,i=0,o=0,a;for await(let l of He(e))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;t++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let u of c)u.type==="text"&&t++;let d=l.message.usage;if(d){let u=d.input_tokens||0,f=d.cache_creation_input_tokens||0,m=d.cache_read_input_tokens||0,p=d.output_tokens||0;r+=u+f+m,n+=m,s+=f,i+=p;let h=u+f+m;h&&(o=h),a={inputTokens:u,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:t,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:i,lastInputTokens:o,lastTokenUsage:a}}var li,Vm=E(()=>{"use strict";tr();li=class{name="claude";claudeDir;projectsDir;constructor(t={}){this.claudeDir=t.claudeDir||Yr(Se,".claude"),this.projectsDir=Yr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await ai(this.projectsDir)}catch{return t}for(let n of r){let s=Yr(this.projectsDir,n);if(!(await Jm(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ai(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Xm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Yr(s,a);try{let d=await this.extractSummary(c,l);d&&t.push(d)}catch{}}}return t}async extractSummary(t,r){let n=await Me(t,50),s=await Ne(t),i="",o,a,l,c,d,u;for(let m of n)if(!a0(m.type)&&(!i&&m.cwd&&(i=m.cwd),!o&&m.slug&&(o=m.slug),!a&&m.version&&(a=m.version),!u&&m.timestamp&&(u=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=J(p.trim(),80)),d=J(p.trim(),80)}}if(!i)return null;let f=await Gm(t);return{provider:"claude",sessionId:r,slug:o,cwd:i,createdAt:u||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:d,messageCount:f.messageCount,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u,f,m=t;for await(let h of He(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!i&&h.cwd&&(i=h.cwd),!o&&h.slug&&(o=h.slug),!a&&h.version&&(a=h.version),!c&&h.gitBranch&&(c=h.gitBranch),!f&&h.timestamp&&(f=new Date(h.timestamp)),h.sessionId&&(m=h.sessionId),h.type==="system"||h.type==="progress"||h.type==="queue-operation"){s.push({role:"system",timestamp:new Date(h.timestamp||0),content:l0(h)});continue}if(h.type==="user"&&h.message){if(h.isMeta)continue;let g=new Date(h.timestamp||0),_=h.message.content;if(typeof _=="string"){if(_.includes("<command-name>")||_.includes("<local-command-"))continue;d||(d=J(_.trim(),80)),u=J(_.trim(),80),s.push({role:"user",timestamp:g,content:ue(_.trim())})}else if(Array.isArray(_)){for(let y of _)if(y.type==="tool_result"){let T=typeof y.content=="string"?ue(y.content):JSON.stringify(y.content);s.push({role:"tool_result",timestamp:g,content:T,toolCallId:y.tool_use_id})}}}if(h.type==="assistant"&&h.message){h.message.model&&(l=h.message.model);let g=new Date(h.timestamp||0),_=h.message.content;if(Array.isArray(_))for(let y of _)y.type==="text"&&y.text?s.push({role:"assistant",timestamp:g,content:ue(y.text),model:h.message.model}):y.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:y.name||"unknown tool",toolName:y.name,toolInput:JSON.stringify(y.input,null,2),toolCallId:y.id,model:h.message.model}):y.type==="thinking"&&y.thinking&&s.push({role:"thinking",timestamp:g,content:y.thinking})}}if(!i)return null;let p=await Gm(r);return{provider:"claude",sessionId:m,slug:o,cwd:i,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:d,lastUserMessage:u,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:p.totalCacheWriteInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,lastInputTokens:p.lastInputTokens||void 0,lastTokenUsage:p.lastTokenUsage,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await o0(r),!0):!1}async resolveSessionFile(t){let r;try{r=await ai(this.projectsDir)}catch{return null}let n=[];for(let o of r){let a=Yr(this.projectsDir,o);if(!(await Jm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await ai(a)}catch{continue}for(let d of c){if(!d.endsWith(".jsonl"))continue;let u=Xm(d,".jsonl");/^[0-9a-f]{8}-/.test(u)&&n.push({filePath:Yr(a,d),fileSessionId:u})}}let s=n.find(o=>o.fileSessionId===t);if(s)return s.filePath;let i=n.filter(o=>o.fileSessionId.startsWith(t));if(i.length===1)return i[0].filePath;for(let o of n){let a=await Me(o.filePath,20);for(let l of a)if(l.slug&&l.slug===t)return o.filePath}return null}}});function ci(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function d0(e,t,r){if(!r)return"";let n=e.tools[t]??ml[t],s=n?.profiles?.[r]?.flags??ml[t]?.profiles?.[r]?.flags;if(s!==void 0)return s.trim();if(n?.profile_flag)return n.profile_flag.replace(/\{\{profile\}\}/g,r).trim();throw new Error(`Profile "${r}" is not configured for tool "${t}"`)}function Km(e,t){return!!e.tools[t]}function Ym(e,t,r,n,s){let i=e.tools[t]??ml[t],o;if(i?.agent){let l=ci(n);o=i.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=c0[t];if(!l)throw new Error(`No agent command configured for tool "${t}"`);let c=l.argv.map(d=>d.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let d=c.map(ci).join(" ");o=`printf '%s\\n' ${ci(n)} | ${d}`}else o=c.map(ci).join(" ")}let a=d0(e,t,s);return a&&(o+=" "+a),o}var ml,c0,zm=E(()=>{"use strict";ml={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:""}}}},c0={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"]}}});function Zm(e=process.env){let t=e.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!t)return 6e5;let r=Number(t);return!Number.isFinite(r)||r<=0?6e5:r}var Qm=E(()=>{"use strict"});var u0,ge,di,St=E(()=>{"use strict";u0="ACK: waiting for explicit lmctl task.",ge=`lmctl seed initial connection only. Create or pin this provider session, then stop. Do not inspect files, run commands, infer a task, delegate, edit, or begin work. Reply exactly: ${u0}`,di=`send this exact lmctl seed instruction: "${ge}"`});function rr(e,t){let r={...e??process.env,PWD:t};return delete r.OLDPWD,r}function m0(e,t){return t===void 0||t.length===0?e:{...e??process.env,[Qn]:t}}function je(e,t,r,n="chat"){return{...m0(rr(e,t),r),[f0]:n}}var Qn,f0,at=E(()=>{"use strict";Qn="LMCTL_SELF_SESSIONID",f0="LMCTL_LAUNCH_SOURCE"});import{spawn as ep}from"node:child_process";import{mkdirSync as p0}from"node:fs";var pl,xe,Ut=E(()=>{"use strict";zm();Qm();St();at();pl=class e extends Error{cancelReason;constructor(t,r){super(t),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,e.prototype)}},xe=class e{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(t){this.name=t.provider.name,this.provider=t.provider,this.capabilities=t.capabilities,this.injection=t.injection,this.binary=t.binary,this.seedArgs=t.seedArgs,this.seedStdin=t.seedStdin,this.resumeTemplate=t.resumeTemplate,this.startTemplate=t.startTemplate,this.transportFn=t.transport}discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(t){let r=t?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===ge?r:n)}seed(t,r){return p0(t,{recursive:!0}),new Promise(n=>{let s;try{s=ep(this.binary,this.seedArgsFor(r),{cwd:t,env:rr(void 0,t),stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let i="";s.stderr?.on("data",a=>{i+=a.toString()});let o=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
1360
+ `:this.seedStdin;o&&s.stdin?.write(o),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:i.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(t,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,t)}startCommand(t){return this.startTemplate}manualSeedHint(t){return{launchCommand:`cd ${t} && ${this.binary}`,postLaunchNote:di,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${t}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(t,r){if(r.userConfig&&Km(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(t,r,s.agent)}let n=r.timeoutMs??e.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(t,{...r,binary:this.binary}):this.withTimeouts(n,t,r)}withTimeouts(t,r,n){let s=new AbortController,i,o,a="",l,c=()=>{t<=0||(clearTimeout(i),i=setTimeout(()=>{n.onIdleWarning?.(t),d(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:t,status:"stalled",stalledAfterMs:t})},t))},d=()=>{clearTimeout(i)};n.signal&&(n.signal.aborted?(o="external",s.abort()):n.signal.addEventListener("abort",()=>{o="external",s.abort()},{once:!0})),c();let u={...n,binary:this.binary,signal:s.signal,onDelta:p=>{a+=p,c(),n.onDelta?.(p)},onProgress:p=>{p.kind!=="api_retry"&&c(),n.onProgress?.(p)}},f=this.transportFn(r,u).then(p=>(d(),{...p,status:"ok"})).catch(p=>{throw d(),o==="external"?new pl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(t,r,n){let s=Ym(r.userConfig,this.name,r.sessionId,t,r.profile),i=Date.now();return new Promise((o,a)=>{let l=Zm(r.env),c=ep(s,{shell:!0,cwd:r.cwd,env:je(r.env,r.cwd,r.sessionId),stdio:["pipe","pipe","pipe"]}),d=!1,u=!1,f=setTimeout(()=>{u=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let g=h.toString();m+=g,r.onDelta?.(g)}),c.stderr?.on("data",h=>{p+=h.toString()}),r.signal){if(r.signal.aborted)return clearTimeout(f),c.kill(),a(new Error("Aborted"));r.signal.addEventListener("abort",()=>c.kill(),{once:!0})}c.on("exit",h=>{if(d)return;d=!0,clearTimeout(f);let g=Date.now()-i;u?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?o({text:m.trim(),sessionId:r.sessionId,durationMs:g}):a(new Error(p.trim().slice(0,200)||`Agent command exited with code ${h}`))}),c.on("error",h=>{d||(d=!0,clearTimeout(f),a(h))})})}}});function fi(e,t){let r;if(t&&typeof t=="object"){let n=t.code;typeof n=="number"&&(r=n)}return new Bt(e,r,t)}var et,ye,Wt,ui,Bt,zr=E(()=>{"use strict";et=class extends Error{constructor(t,r){super(t,r),this.name=this.constructor.name}},ye=class extends et{},Wt=class extends et{exitCode;signal;stderr;constructor(t,r,n=null,s){super(t),this.exitCode=r,this.signal=n,this.stderr=s}},ui=class extends et{line;constructor(t,r,n){super(t,{cause:n}),this.line=r}},Bt=class extends et{rpcCode;rpcData;constructor(t,r,n){super(t),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as hl from"node:child_process";function h0(e){if(typeof hl.spawnSync=="function")try{hl.spawnSync("taskkill",["/T","/F","/PID",String(e)],{windowsHide:!0})}catch{}}function tp(e){return e.exitCode!==null||e.signalCode!==null}function _l(e,t){return tp(e)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(i),r(!0))},i=setTimeout(()=>{n||(n=!0,e.removeListener("exit",s),r(!1))},t);e.once("exit",s)})}async function tt(e,t={}){let r=Date.now(),n=t.stdinEnd!==!1,s=t.softDelayMs??5e3,i=t.killDelayMs??5e3,o=t.platform??process.platform,a=t.runTaskkill??h0;if(tp(e))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&e.stdin&&!e.stdin.destroyed)try{e.stdin.end()}catch{}if(await _l(e,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(o==="win32"&&typeof e.pid=="number")a(e.pid);else try{e.kill("SIGTERM")}catch{}if(await _l(e,i))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(o!=="win32")try{e.kill("SIGKILL")}catch{}return await _l(e,_0)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var _0,mi=E(()=>{"use strict";_0=1e3});function rp(e){ce()&&Ae({event:"legacy",msg:`[debug] ${e}`},{always:!0})}function nr(e,t){let r=y0[e];if(r)return r[t]??r.yolo}function E0(e,t){if(t.length===0)return!0;for(let r=0;r+t.length<=e.length;r++){let n=!0;for(let s=0;s<t.length;s++)if(e[r+s]!==t[s]){n=!1;break}if(n)return!0}return!1}function lt(e,t,r="yolo"){if(w0.has(e)){rp(`YOLO ${e} [mode=${r}]: ${e==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:e==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?nr(e,"plan"):g0[e];if(!n){let s=`unknown provider "${e}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw P({event:"yolo_assert_failed",provider:e,reason:"unconfigured_provider",args:t.join(" "),message:s}),new ye(s)}if(!E0(t,n)){let s=n.join(" "),i=`${e} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${t.map(o=>JSON.stringify(o)).join(", ")}]`;throw P({event:"yolo_assert_failed",provider:e,reason:"flag_missing",required_flag:s,mode:r,args:t.join(" "),message:i}),new ye(i)}rp(`YOLO ${e} [mode=${r}]: argv flag '${n.join(" ")}'`)}var g0,y0,w0,Zr=E(()=>{"use strict";zr();me();g0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"],lmplayer:["--dangerously-skip-permissions"]},y0={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"]}};w0=new Set(["codex","opencode"])});function np(e){if(e.length===0)return"";if(e.length===1)return e[0];let t=[];for(let r=0;r<e.length;r++)r===0?t.push(e[r]):t.push(`
1361
1361
 
1362
1362
  --- additional response (turn ${r+1} of ${e.length}; likely an injected mid-call notification) ---
1363
1363
 
@@ -1365,49 +1365,49 @@ var kk=Object.defineProperty;var E=(e,t)=>()=>(e&&(t=e(e=0)),t);var Ee=(e,t)=>{f
1365
1365
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return t?`Original provider error:
1366
1366
  ${t}
1367
1367
 
1368
- ${r}`:r}function ip(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||S0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=nr(s,a)??k0[s]??["--dangerously-skip-permissions"];o.push(...l);try{lt(s,o,a)}catch(g){return n(g)}if(t.cwd&&!b0(t.cwd))return q({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=T0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:je(t.env,t.cwd,t.sessionId)}),d=!1;if(t.signal){if(t.signal.aborted)return d=!0,q({event:"transport_abort",provider:s,phase:"pre_spawn"}),tt(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,q({event:"transport_abort",provider:s}),tt(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=gl({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let h=u.sawResult();u.processLine(g),!h&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let h=f.split(`
1369
- `);f=h.pop()||"";for(let y of h)m(y)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{q({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let h=u.finalize();h?(Tt(`stream-json: result ${h.result.slice(0,80)}${h.result.length>80?"...":""} (${h.durationMs}ms)`),r({...h,exitCode:g})):(q({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(v0({tool:s,exitCode:g,stderr:p}))))});let _=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(_+`
1370
- `),Tt(`stream-json: prompt sent (${e.length} chars)`)})}var S0,k0,op=E(()=>{"use strict";zr();mi();Zr();pe();at();yl();yl();S0={claude:"claude",qwen:"qwen"};k0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function pi(e={}){return[]}var wl=E(()=>{"use strict"});function El(e){return e==="plan"?"read-only":"danger-full-access"}function ap(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function Tl(){return{agentItems:new Map,resultText:""}}function hi(e,t,r,n){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function bl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function lp(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Sl(){return{pendingCodexError:null}}function vl(e,t){let r=lp(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function kl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.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 Il=E(()=>{"use strict"});import{spawn as I0}from"node:child_process";import{createInterface as N0}from"node:readline";import{existsSync as x0,readFileSync as A0}from"node:fs";import{fileURLToPath as R0}from"node:url";function O0(){return ap(L0)}function sr(e,t){Tt(`[codex:${e}] ${JSON.stringify(t)}`)}function $0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
1368
+ ${r}`:r}function ip(e,t){return new Promise((r,n)=>{let s=t.tool||"claude",i=t.binaryPath||S0[s]||"claude",o=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&o.push("--verbose"),t.sessionId&&o.push("--resume",t.sessionId),t.model&&o.push("--model",t.model);let a=t.permissionMode??"yolo",l=nr(s,a)??k0[s]??["--dangerously-skip-permissions"];o.push(...l);try{lt(s,o,a)}catch(g){return n(g)}if(t.cwd&&!b0(t.cwd))return P({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=T0(i,o,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:je(t.env,t.cwd,t.sessionId)}),d=!1;if(t.signal){if(t.signal.aborted)return d=!0,P({event:"transport_abort",provider:s,phase:"pre_spawn"}),tt(c).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{d=!0,P({event:"transport_abort",provider:s}),tt(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let u=gl({onEvent:t.onEvent,onText:t.onText}),f="";function m(g){let _=u.sawResult();u.processLine(g),!_&&u.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
1369
+ `);f=_.pop()||"";for(let y of _)m(y)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{P({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${i}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(d)return;f.trim()&&m(f);let _=u.finalize();_?(Tt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(P({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(v0({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:e}});c.stdin?.write(h+`
1370
+ `),Tt(`stream-json: prompt sent (${e.length} chars)`)})}var S0,k0,op=E(()=>{"use strict";zr();mi();Zr();me();at();yl();yl();S0={claude:"claude",qwen:"qwen"};k0={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});function pi(e={}){return[]}var wl=E(()=>{"use strict"});function El(e){return e==="plan"?"read-only":"danger-full-access"}function ap(e="0.0.0"){return{clientInfo:{name:"lmctl",title:"lmctl",version:e},capabilities:{experimentalApi:!1}}}function Tl(){return{agentItems:new Map,resultText:""}}function _i(e,t,r,n){let s=e.method;if(!s)return!1;let i=e.params;if(s==="turn/started")return t.agentItems.clear(),t.resultText="",!1;if(s==="item/started"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=typeof o.phase=="string"?o.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return t.agentItems.set(o.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let o=i?.delta||"",a=typeof i?.itemId=="string"?i.itemId:void 0;if(!o)return!0;let l=a?t.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=o),r?.(o),l.phase&&i&&(i._lmctlItemPhase=l.phase)):(t.resultText+=o,r?.(o)),!0}if(s==="item/completed"){let o=i?.item;if(o?.type==="agentMessage"&&typeof o.id=="string"){let a=t.agentItems.get(o.id);if(a){if(a.phase!=="commentary"){let l=typeof o.text=="string"?o.text:a.buffer;if(n&&typeof o.text=="string"&&o.text!==a.buffer){let c=typeof i?.threadId=="string"?i.threadId:void 0,d=typeof i?.turnId=="string"?i.turnId:void 0;n({itemId:o.id,threadId:c,turnId:d,expectedFromItemText:o.text,gotFromBuffer:a.buffer})}t.resultText+=l}t.agentItems.delete(o.id)}return!0}return!1}return!1}function bl(e){for(let[,t]of e.agentItems.entries())t.phase!=="commentary"&&t.buffer&&(e.resultText+=t.buffer);e.agentItems.clear()}function lp(e){let t=e.params,r=t?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return t?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function Sl(){return{pendingCodexError:null}}function vl(e,t){let r=lp(e);return r.willRetry||(t.pendingCodexError=r.turnError),r}function kl(e,t){if(t.pendingCodexError){let i=t.pendingCodexError;return t.pendingCodexError=null,{shouldReject:!0,turnError:i}}let n=e.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let i=n?.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 Il=E(()=>{"use strict"});import{spawn as I0}from"node:child_process";import{createInterface as N0}from"node:readline";import{existsSync as x0,readFileSync as A0}from"node:fs";import{fileURLToPath as R0}from"node:url";function O0(){return ap(L0)}function sr(e,t){Tt(`[codex:${e}] ${JSON.stringify(t)}`)}function $0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${e.exitCode} before completing the turn.
1371
1371
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return t?`Original provider error:
1372
1372
  ${t}
1373
1373
 
1374
- ${r}`:r}function cp(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?pi():[];i.push(...a),ce()&&Oe(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=El(l);try{lt("codex",i,l)}catch(U){return n(U)}if(t.cwd&&!x0(t.cwd))return q({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),n(new ye(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=I0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:je(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,q({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),tt(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,q({event:"transport_abort",provider:"codex"}),tt(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=N0({input:d.stdout}),m=new Map,p=1,_=t.threadId||"",g="",h=!1,y=!1,T=Date.now(),b=Tl(),I=Sl();function x(U,M={}){return new Promise((A,ee)=>{let W=p++;m.set(W,{resolve:A,reject:ee});let k=JSON.stringify({jsonrpc:"2.0",id:W,method:U,params:M});d.stdin?.write(k+`
1374
+ ${r}`:r}function cp(e,t){return new Promise((r,n)=>{let s=t.binaryPath||"codex",i=["app-server","--listen","stdio://"];t.model&&i.push("-c",`model=${JSON.stringify(t.model)}`);let o=t.isLead??t.alias?.toLowerCase()==="lead",a=o?pi():[];i.push(...a),ce()&&Oe(JSON.stringify({event:"codex_mcp_inject",alias:t.alias??null,isLead:o,injected:a.length>0}));let l=t.permissionMode??"yolo",c=El(l);try{lt("codex",i,l)}catch(U){return n(U)}if(t.cwd&&!x0(t.cwd))return P({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`}),n(new ye(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let d=I0(s,i,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:je(t.env,t.cwd,t.threadId)}),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,P({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),tt(d).catch(()=>{}),n(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,P({event:"transport_abort",provider:"codex"}),tt(d).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let f=N0({input:d.stdout}),m=new Map,p=1,h=t.threadId||"",g="",_=!1,y=!1,T=Date.now(),b=Tl(),I=Sl();function x(U,M={}){return new Promise((A,ee)=>{let B=p++;m.set(B,{resolve:A,reject:ee});let k=JSON.stringify({jsonrpc:"2.0",id:B,method:U,params:M});d.stdin?.write(k+`
1375
1375
  `)})}function H(U,M={}){let A=JSON.stringify({jsonrpc:"2.0",method:U,params:M});d.stdin?.write(A+`
1376
- `)}f.on("line",U=>{let M;try{M=JSON.parse(U)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let W=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);W.reject(fi(`codex app-server error: ${N}`,k))}else W.resolve(M);t.onEvent?.(M);return}let A=M.method;if(!A){t.onEvent?.(M);return}if(A==="thread/started"){let k=M.params?.thread;k?.id&&(_=k.id)}let ee=ce()?W=>{sr("item.text/buffer-mismatch",{itemId:W.itemId,threadId:W.threadId??null,turnId:W.turnId??null,expectedFromItemText:W.expectedFromItemText,gotFromBuffer:W.gotFromBuffer,expectedLen:W.expectedFromItemText.length,gotLen:W.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let W=M.params,k=W?.turn;k?.id&&(g=k.id),hi(M,b,t.onDelta,ee),ce()&&sr("turn/started",{params:W??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let W=M.params;W?.item?.type==="agentMessage"&&sr(A,{params:W??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let W=M.params;ce()&&sr("agentMessage/delta",{params:W??null})}hi(M,b,t.onDelta,ee)}if(A==="turn/completed"){let W=M.params;if(ce())for(let[N,L]of b.agentItems.entries())L.buffer&&sr("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});bl(b),ce()&&sr("turn/completed",{params:W??null});let k=kl(M,I);k.shouldReject?(ce()&&sr("turn/completed/terminal-reject",{message:k.turnError.message}),y=!0,h=!0,d.stdin?.end(),n(k.turnError)):(h=!0,d.stdin?.end())}if(A==="error"){let W=vl(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";sr(W.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:W.willRetry,params:k??null})}}t.onEvent?.(M)});let me="";d.stderr?.on("data",U=>{me+=U.toString()}),d.on("error",U=>{q({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:U.message}),n(new ye(`Failed to spawn codex app-server: ${U.message}`,{cause:U}))}),d.on("exit",U=>{if(!u&&!y){if(h){r({result:b.resultText,threadId:_,turnId:g,durationMs:Date.now()-T,exitCode:U});return}if(I.pendingCodexError){n(I.pendingCodexError);return}q({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:U,stderr_tail:me.slice(0,500)}),n(new Error($0({exitCode:U,stderr:me})))}}),(async()=>{try{if(await x("initialize",O0()),H("initialized",{}),t.threadId)try{let U=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([U,M]),_=t.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
- `);let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(_=M.id)}await x("turn/start",{threadId:_,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(U){tt(d).catch(()=>{}),n(U instanceof Error?U:new Error(String(U)))}})()})}var L0,dp=E(()=>{"use strict";pe();pe();zr();mi();Zr();wl();pe();at();Il();Il();L0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(A0(R0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as mp,mkdirSync as C0,readFileSync as pp,writeFileSync as up}from"node:fs";import{join as es,resolve as M0}from"node:path";function hp(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Nl(e,t,r={existsSync:mp,readFileSync:pp}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=M0(t,s.sessiondir??t);for(let o of j0(i)){let a=D0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(hp(a.permission)||n.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 n}function j0(e){return[es(e,".opencode","opencode.jsonc"),es(e,"opencode.jsonc"),es(e,"opencode.json")]}function D0(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(P0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function P0(e){let t="",r=!1,n="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(r){t+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
1378
- `;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function _i(e,t={}){let r=es(e,".opencode"),n=es(r,"opencode.json");if(!mp(n)){C0(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return up(n,o+`
1379
- `,"utf-8"),!0}let s;try{s=JSON.parse(pp(n,"utf-8"))}catch{return console.log(fp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(fp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),hp(s.permission)||q({event:"opencode_yolo_override",provider:"opencode",config_path:n,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&&up(n,JSON.stringify(s,null,2)+`
1380
- `,"utf-8"),i}var fp,gi=E(()=>{"use strict";pe();fp={yellow:e=>e}});function yp(e){let t=[...e.matchAll(F0)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return _p(e.slice(n).trimStart())}return _p(H0(e.replace(U0,"")))}function H0(e){let t=W0.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(B0)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function _p(e){let t=[...e.matchAll(q0)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function Qr(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function wp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function xl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?yp(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=wp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,e.onDelta?.(u)),!0},finalize(){return s?o():null}}}var gp,F0,U0,W0,B0,q0,Al=E(()=>{"use strict";gp="(?:png|jpe?g|webp|heic|pdf)",F0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${gp}\\s*`,"gi"),U0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${gp}\\s*`,"i"),W0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,B0=/^STANCE:\s+\S+\s*$/gim,q0=/\[Thought:\s*true\]\s*/gi});import{spawn as Ep}from"node:child_process";import{existsSync as J0}from"node:fs";import{createInterface as X0}from"node:readline";function G0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
1376
+ `)}f.on("line",U=>{let M;try{M=JSON.parse(U)}catch{return}if(typeof M.id=="number"&&m.has(M.id)){let B=m.get(M.id);if(m.delete(M.id),M.error){let k=M.error,N=typeof k?.message=="string"&&k.message.length>0?k.message:JSON.stringify(M.error);B.reject(fi(`codex app-server error: ${N}`,k))}else B.resolve(M);t.onEvent?.(M);return}let A=M.method;if(!A){t.onEvent?.(M);return}if(A==="thread/started"){let k=M.params?.thread;k?.id&&(h=k.id)}let ee=ce()?B=>{sr("item.text/buffer-mismatch",{itemId:B.itemId,threadId:B.threadId??null,turnId:B.turnId??null,expectedFromItemText:B.expectedFromItemText,gotFromBuffer:B.gotFromBuffer,expectedLen:B.expectedFromItemText.length,gotLen:B.gotFromBuffer.length})}:void 0;if(A==="turn/started"){let B=M.params,k=B?.turn;k?.id&&(g=k.id),_i(M,b,t.onDelta,ee),ce()&&sr("turn/started",{params:B??null})}if(ce()&&(A==="item/started"||A==="item/completed")){let B=M.params;B?.item?.type==="agentMessage"&&sr(A,{params:B??null})}if(A==="item/started"||A==="item/agentMessage/delta"||A==="item/completed"){if(A==="item/agentMessage/delta"){let B=M.params;ce()&&sr("agentMessage/delta",{params:B??null})}_i(M,b,t.onDelta,ee)}if(A==="turn/completed"){let B=M.params;if(ce())for(let[N,L]of b.agentItems.entries())L.buffer&&sr("turn/completed/unflushed-item",{itemId:N,phase:L.phase,bufferLen:L.buffer.length});bl(b),ce()&&sr("turn/completed",{params:B??null});let k=kl(M,I);k.shouldReject?(ce()&&sr("turn/completed/terminal-reject",{message:k.turnError.message}),y=!0,_=!0,d.stdin?.end(),n(k.turnError)):(_=!0,d.stdin?.end())}if(A==="error"){let B=vl(M,I);if(ce()){let k=M.params,N=k?.error,L=typeof N?.message=="string"?N.message:"(no message)";sr(B.willRetry?"error/retry":"error/terminal-deferred",{message:L,willRetry:B.willRetry,params:k??null})}}t.onEvent?.(M)});let pe="";d.stderr?.on("data",U=>{pe+=U.toString()}),d.on("error",U=>{P({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:U.message}),n(new ye(`Failed to spawn codex app-server: ${U.message}`,{cause:U}))}),d.on("exit",U=>{if(!u&&!y){if(_){r({result:b.resultText,threadId:h,turnId:g,durationMs:Date.now()-T,exitCode:U});return}if(I.pendingCodexError){n(I.pendingCodexError);return}P({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:U,stderr_tail:pe.slice(0,500)}),n(new Error($0({exitCode:U,stderr:pe})))}}),(async()=>{try{if(await x("initialize",O0()),H("initialized",{}),t.threadId)try{let U=x("thread/resume",{threadId:t.threadId,sandbox:c,approvalPolicy:"never",...t.model?{model:t.model}:{}}),M=new Promise((A,ee)=>setTimeout(()=>ee(new Error("resume timeout")),5e3));await Promise.race([U,M]),h=t.threadId}catch(U){process.stderr.write(`[codex] thread/resume failed, creating new thread
1377
+ `),P({event:"codex_thread_resume_fallback",provider:"codex",thread_id:t.threadId,error_message:U instanceof Error?U.message:String(U)});let A=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;A?.id&&(h=A.id)}else{let M=(await x("thread/start",{cwd:t.cwd,approvalPolicy:"never",sandbox:c,...t.model?{model:t.model}:{}})).result?.thread;M?.id&&(h=M.id)}await x("turn/start",{threadId:h,input:[{type:"text",text:e}],...t.model?{model:t.model}:{}})}catch(U){tt(d).catch(()=>{}),n(U instanceof Error?U:new Error(String(U)))}})()})}var L0,dp=E(()=>{"use strict";me();me();zr();mi();Zr();wl();me();at();Il();Il();L0=(()=>{try{let e=new URL("../../../package.json",import.meta.url),t=JSON.parse(A0(R0(e),"utf8"));return typeof t.version=="string"?t.version:"0.0.0"}catch{return"0.0.0"}})()});import{existsSync as mp,mkdirSync as C0,readFileSync as pp,writeFileSync as up}from"node:fs";import{join as es,resolve as M0}from"node:path";function _p(e){if(e==="allow")return!0;if(e&&typeof e=="object"&&!Array.isArray(e)){let t=Object.entries(e);if(t.length===1&&t[0][0]==="*"&&t[0][1]==="allow")return!0}return!1}function Nl(e,t,r={existsSync:mp,readFileSync:pp}){let n=[];for(let s of e){if(s.provider.trim().toLowerCase()!=="opencode")continue;let i=M0(t,s.sessiondir??t);for(let o of j0(i)){let a=D0(o,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(_p(a.permission)||n.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 n}function j0(e){return[es(e,".opencode","opencode.jsonc"),es(e,"opencode.jsonc"),es(e,"opencode.json")]}function D0(e,t){try{if(!t.existsSync(e))return;let r=t.readFileSync(e,"utf-8"),n=JSON.parse(P0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function P0(e){let t="",r=!1,n="",s=!1;for(let i=0;i<e.length;i+=1){let o=e[i],a=e[i+1];if(r){t+=o,s?s=!1:o==="\\"?s=!0:o===n&&(r=!1,n="");continue}if(o==='"'||o==="'"){r=!0,n=o,t+=o;continue}if(o==="/"&&a==="/"){for(;i<e.length&&e[i]!==`
1378
+ `;)i+=1;i<e.length&&(t+=e[i]);continue}if(o==="/"&&a==="*"){for(i+=2;i<e.length&&!(e[i]==="*"&&e[i+1]==="/");)i+=1;i+=1;continue}t+=o}return t.replace(/,\s*([}\]])/g,"$1")}function hi(e,t={}){let r=es(e,".opencode"),n=es(r,"opencode.json");if(!mp(n)){C0(r,{recursive:!0});let o=JSON.stringify({permission:"allow"},null,2);return up(n,o+`
1379
+ `,"utf-8"),!0}let s;try{s=JSON.parse(pp(n,"utf-8"))}catch{return console.log(fp.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(fp.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let i=!1;return s.permission===void 0&&(s.permission="allow",i=!0),_p(s.permission)||P({event:"opencode_yolo_override",provider:"opencode",config_path:n,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&&up(n,JSON.stringify(s,null,2)+`
1380
+ `,"utf-8"),i}var fp,gi=E(()=>{"use strict";me();fp={yellow:e=>e}});function yp(e){let t=[...e.matchAll(F0)];if(t.length>0){let r=t[t.length-1],n=(r.index??0)+r[0].length;return hp(e.slice(n).trimStart())}return hp(H0(e.replace(U0,"")))}function H0(e){let t=W0.exec(e);if(t===null)return e;let r=e.slice(t[0].length),n=[...r.matchAll(B0)];if(n.length<2)return e;let s=n[0],i=(s.index??0)+s[0].length;return r.slice(i).trimStart()}function hp(e){let t=[...e.matchAll(q0)];if(t.length===0)return e;let r=t[t.length-1],n=(r.index??0)+r[0].length;return e.slice(n).trimStart()}function Qr(e,t=""){let r=e.result;return typeof r?.sessionId=="string"&&r.sessionId.length>0?r.sessionId:t}function wp(e){let t=e.result;return typeof t?.stopReason=="string"?t.stopReason:""}function xl(e={}){let t="",r="",n="",s=!1,i=!1,o=()=>({result:e.tool==="gemini"?yp(r):r,sessionId:t,stopReason:n});return{setSessionId(a){t=a},beginTurn(){r="",n="",s=!1,i=!0},completeTurn(a){return n=wp(a),s=!0,i=!1,o()},processMessage(a){if(a.method!=="session/update")return!1;let c=a.params?.update;if(c?.sessionUpdate!=="agent_message_chunk")return!1;let d=c.content,u=typeof d?.text=="string"?d.text:"";return u&&i&&(r+=u,e.onDelta?.(u)),!0},finalize(){return s?o():null}}}var gp,F0,U0,W0,B0,q0,Al=E(()=>{"use strict";gp="(?:png|jpe?g|webp|heic|pdf)",F0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${gp}\\s*`,"gi"),U0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${gp}\\s*`,"i"),W0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,B0=/^STANCE:\s+\S+\s*$/gim,q0=/\[Thought:\s*true\]\s*/gi});import{spawn as Ep}from"node:child_process";import{existsSync as J0}from"node:fs";import{createInterface as X0}from"node:readline";function G0(e){let t=e.stderr.trim().slice(0,500),r=`lmctl: ${e.tool} ACP process exited with code ${e.exitCode} before completing the prompt.
1381
1381
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return t?`Original provider error:
1382
1382
  ${t}
1383
1383
 
1384
1384
  ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Promise((l,c)=>{let d=V0++;n.set(d,{resolve:l,reject:c});let u=JSON.stringify({jsonrpc:"2.0",id:d,method:o,params:a});Ae({event:"acp_send",direction:"SEND",provider:t.provider,method:o,id:d,params:a}),e.stdin?.write(`${u}
1385
1385
  `)}),i=(o,a={})=>{e.stdin?.write(`${JSON.stringify({jsonrpc:"2.0",method:o,params:a})}
1386
- `)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Ae({event:"acp_recv",direction:"RECV",provider:t.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),t.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let c=n.get(a.id);if(n.delete(a.id),a.error){let d=a.error,u=typeof d?.message=="string"&&d.message.length>0?d.message:JSON.stringify(a.error);c.reject(fi(`ACP RPC error: ${u}`,d))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){q({event:"acp_unhandled_request",provider:t.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Ae({event:"acp_send",direction:"SEND",provider:t.provider,replyTo:a.id,error:"method not found"}),e.stdin?.write(`${c}
1387
- `);return}t.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new ye("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ll(e){let t;try{t=Ep(e.binaryPath??Rl.opencode.binary,Rl.opencode.args,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:je(e.env,e.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=Tp(t,{provider:"opencode"}),n=e.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),t.removeListener("error",a),t.removeListener("exit",l),r.close(),!u){s(d);return}tt(t,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};t.once("error",a),t.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let d=await r.sendRpc("session/new",{cwd:e.cwd,mcpServers:[]}),u=Qr(d);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:e.model})}catch(f){o({status:"rejected",option:"model",value:e.model,error:f instanceof Error?f.message:String(f)});return}if(e.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:e.effort})}catch(f){o({status:"rejected",option:"effort",value:e.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function bp(e,t){let r=Rl[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{_i(t.cwd)}catch(y){q({event:"opencode_config_install_failed",cwd:t.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=t.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(t.tool==="gemini"){let y=nr("gemini","plan"),T=nr("gemini","yolo");a=a.filter(b=>!(T??[]).includes(b)),y&&a.push(...y)}else t.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1388
- `);t.model&&t.tool==="gemini"&&a.push("--model",t.model);let l=t.tool==="copilot"?"yolo":o;try{lt(t.tool,a,l)}catch(y){return s(y)}if(t.model&&t.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1389
- `),t.cwd&&!J0(t.cwd))return q({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new ye(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Ep(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:je(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,q({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),tt(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,q({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),tt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=t.sessionId||"",m=xl({tool:t.tool,onDelta:t.onDelta});m.setSessionId(f);let p=Tp(c,{provider:t.tool,onEvent:t.onEvent,onNotification:y=>m.processMessage(y)}),{sendRpc:_,sendNotification:g}=p,h="";c.stderr?.on("data",y=>{h+=y.toString()}),c.on("error",y=>{p.close(y),q({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(p.close(new ye(`ACP process exited with code ${String(y)}`)),u)return;let T=m.finalize();T!==null?n({result:T.result,sessionId:T.sessionId,durationMs:Date.now()-d,stopReason:T.stopReason,exitCode:y}):(q({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:h.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(G0({tool:t.tool,exitCode:y,stderr:h}))))}),(async()=>{try{if(await _("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),g("notifications/initialized"),t.sessionId)try{let b=await _("session/load",{sessionId:t.sessionId,cwd:t.cwd,mcpServers:[]});f=Qr(b,t.sessionId),m.setSessionId(f)}catch(b){if(t.requireResume)throw new Error(`Cannot resume session ${t.sessionId} via ACP: ${b instanceof Error?b.message:String(b)}`);process.stderr.write(`[acp] session/load failed for ${t.sessionId}, creating new session
1390
- `);let I=await _("session/new",{cwd:t.cwd,mcpServers:[]});f=Qr(I),m.setSessionId(f)}else{let b=await _("session/new",{cwd:t.cwd,mcpServers:[]});f=Qr(b),m.setSessionId(f)}if(t.model&&t.tool==="opencode")try{await _("session/set_config_option",{sessionId:f,configId:"model",value:t.model}),Tt(`acp: set_config_option(model=${t.model}) ok`)}catch(b){let I=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(model=${t.model}) failed: ${I}
1391
- `)}if(t.effort&&t.tool==="opencode")try{await _("session/set_config_option",{sessionId:f,configId:"effort",value:t.effort}),Tt(`acp: set_config_option(effort=${t.effort}) ok`)}catch(b){let I=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(effort=${t.effort}) failed: ${I}
1392
- `)}m.beginTurn(),Tt(`acp: prompt sent (${e.length} chars)`);let y=await _("session/prompt",{sessionId:f,prompt:[{type:"text",text:e}]}),T=m.completeTurn(y);Tt(`acp: result received (${T.result.length} chars, stopReason=${T.stopReason})`),c.stdin?.end()}catch(y){tt(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var Rl,V0,Ol=E(()=>{"use strict";pe();zr();mi();Zr();gi();pe();at();Al();Al();Rl={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},V0=1});function he(e,t=120){let r=e.replace(/\s+/g," ").trim();return r.length>t?r.slice(0,t-1)+"\u2026":r}function Sp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=K0){let n=e.keys().next().value;n!==void 0&&e.delete(n)}e.set(r.id,Date.now()),t(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=e.get(r.id);if(n!==void 0){t({...r,elapsedMs:Date.now()-n}),e.delete(r.id);return}}t(r)}}function Y0(){let e=new Map;return(t,r)=>{z0(t,Sp(e,r))}}function z0(e,t){let r=e.type;if(r==="system"){let n=e.subtype;if(n==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let d=c.length>0?c.join(", "):n;t({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(he(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:n||"system",raw:e});return}if(r==="assistant"||r==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:he(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=he(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:he(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:he(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1386
+ `)};return r.on("line",o=>{let a;try{a=JSON.parse(o)}catch{return}if(Ae({event:"acp_recv",direction:"RECV",provider:t.provider,id:typeof a.id=="number"?a.id:void 0,method:typeof a.method=="string"?a.method:void 0,preview:JSON.stringify(a).slice(0,300)}),t.onEvent?.(a),typeof a.id=="number"&&n.has(a.id)){let c=n.get(a.id);if(n.delete(a.id),a.error){let d=a.error,u=typeof d?.message=="string"&&d.message.length>0?d.message:JSON.stringify(a.error);c.reject(fi(`ACP RPC error: ${u}`,d))}else c.resolve(a);return}let l=a.method;if(l){if(typeof a.id=="number"){P({event:"acp_unhandled_request",provider:t.provider,method:l,id:a.id,params:a.params});let c=JSON.stringify({jsonrpc:"2.0",id:a.id,error:{code:-32601,message:`Method not found: ${l} (lmctl does not implement server-side ACP methods)`}});Ae({event:"acp_send",direction:"SEND",provider:t.provider,replyTo:a.id,error:"method not found"}),e.stdin?.write(`${c}
1387
+ `);return}t.onNotification?.(a)}}),{sendRpc:s,sendNotification:i,close(o=new ye("ACP RPC channel closed")){r.close();for(let a of n.values())a.reject(o);n.clear()}}}function Ll(e){let t;try{t=Ep(e.binaryPath??Rl.opencode.binary,Rl.opencode.args,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:je(e.env,e.cwd,void 0,"unknown")})}catch(s){return Promise.resolve({status:"unavailable",reason:"spawn",error:s instanceof Error?s.message:String(s)})}let r=Tp(t,{provider:"opencode"}),n=e.timeoutMs??5e3;return new Promise(s=>{let i=!1,o=(d,u=!0)=>{if(!i){if(i=!0,clearTimeout(c),t.removeListener("error",a),t.removeListener("exit",l),r.close(),!u){s(d);return}tt(t,{softDelayMs:100,killDelayMs:100}).finally(()=>s(d))}},a=d=>{o({status:"unavailable",reason:"spawn",error:d.message},!1)},l=(d,u)=>{o({status:"unavailable",reason:"handshake",error:`opencode ACP exited before verification (code=${String(d)}, signal=${String(u)})`},!1)};t.once("error",a),t.once("exit",l);let c=setTimeout(()=>{o({status:"unavailable",reason:"timeout"})},n);(async()=>{try{await r.sendRpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),r.sendNotification("notifications/initialized");let d=await r.sendRpc("session/new",{cwd:e.cwd,mcpServers:[]}),u=Qr(d);try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"model",value:e.model})}catch(f){o({status:"rejected",option:"model",value:e.model,error:f instanceof Error?f.message:String(f)});return}if(e.effort!==void 0)try{await r.sendRpc("session/set_config_option",{sessionId:u,configId:"effort",value:e.effort})}catch(f){o({status:"rejected",option:"effort",value:e.effort,error:f instanceof Error?f.message:String(f)});return}o({status:"verified"})}catch(d){o({status:"unavailable",reason:"handshake",error:d instanceof Error?d.message:String(d)})}})()})}function bp(e,t){let r=Rl[t.tool];return r?new Promise((n,s)=>{let i=t.binaryPath||r.binary;if(t.tool==="opencode")try{hi(t.cwd)}catch(y){P({event:"opencode_config_install_failed",cwd:t.cwd,error_message:y instanceof Error?y.message:String(y)})}let o=t.permissionMode??"yolo",a=[...r.args];if(o==="plan")if(t.tool==="gemini"){let y=nr("gemini","plan"),T=nr("gemini","yolo");a=a.filter(b=>!(T??[]).includes(b)),y&&a.push(...y)}else t.tool==="copilot"&&(process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
1388
+ `),P({event:"acp_plan_mode_unsupported",provider:t.tool,requested_mode:"plan",effective_mode:"yolo"}));t.model&&t.tool==="gemini"&&a.push("--model",t.model);let l=t.tool==="copilot"?"yolo":o;try{lt(t.tool,a,l)}catch(y){return s(y)}if(t.model&&t.tool==="copilot"&&(process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${t.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
1389
+ `),P({event:"acp_model_unsupported",provider:t.tool,model:t.model})),t.cwd&&!J0(t.cwd))return P({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${t.cwd}`,elapsed_ms:0}),s(new ye(`sessiondir missing: ${t.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Ep(i,a,{cwd:t.cwd,stdio:["pipe","pipe","pipe"],env:je(t.env,t.cwd,t.sessionId)}),d=Date.now(),u=!1;if(t.signal){if(t.signal.aborted)return u=!0,P({event:"transport_abort",provider:t.tool,phase:"pre_spawn"}),tt(c).catch(()=>{}),s(new Error("Aborted"));t.signal.addEventListener("abort",()=>{u=!0,P({event:"transport_abort",provider:t.tool,elapsed_ms:Date.now()-d}),tt(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=t.sessionId||"",m=xl({tool:t.tool,onDelta:t.onDelta});m.setSessionId(f);let p=Tp(c,{provider:t.tool,onEvent:t.onEvent,onNotification:y=>m.processMessage(y)}),{sendRpc:h,sendNotification:g}=p,_="";c.stderr?.on("data",y=>{_+=y.toString()}),c.on("error",y=>{p.close(y),P({event:"transport_error",provider:t.tool,error_class:"TransportConnectionError",error_message:y.message,elapsed_ms:Date.now()-d}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${y.message}`,{cause:y}))}),c.on("exit",y=>{if(p.close(new ye(`ACP process exited with code ${String(y)}`)),u)return;let T=m.finalize();T!==null?n({result:T.result,sessionId:T.sessionId,durationMs:Date.now()-d,stopReason:T.stopReason,exitCode:y}):(P({event:"transport_error",provider:t.tool,error_class:"Error",reason:"provider_no_result",exit_code:y,stderr_tail:_.slice(0,500),elapsed_ms:Date.now()-d}),s(new Error(G0({tool:t.tool,exitCode:y,stderr:_}))))}),(async()=>{try{if(await h("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),g("notifications/initialized"),t.sessionId)try{let b=await h("session/load",{sessionId:t.sessionId,cwd:t.cwd,mcpServers:[]});f=Qr(b,t.sessionId),m.setSessionId(f)}catch(b){if(t.requireResume)throw new Error(`Cannot resume session ${t.sessionId} via ACP: ${b instanceof Error?b.message:String(b)}`);process.stderr.write(`[acp] session/load failed for ${t.sessionId}, creating new session
1390
+ `),P({event:"acp_session_resume_fallback",provider:t.tool,session_id:t.sessionId,error_message:b instanceof Error?b.message:String(b)});let I=await h("session/new",{cwd:t.cwd,mcpServers:[]});f=Qr(I),m.setSessionId(f)}else{let b=await h("session/new",{cwd:t.cwd,mcpServers:[]});f=Qr(b),m.setSessionId(f)}if(t.model&&t.tool==="opencode")try{await h("session/set_config_option",{sessionId:f,configId:"model",value:t.model}),Tt(`acp: set_config_option(model=${t.model}) ok`)}catch(b){let I=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(model=${t.model}) failed: ${I}
1391
+ `),P({event:"acp_config_option_failed",provider:t.tool,config_id:"model",value:t.model,error_message:I})}if(t.effort&&t.tool==="opencode")try{await h("session/set_config_option",{sessionId:f,configId:"effort",value:t.effort}),Tt(`acp: set_config_option(effort=${t.effort}) ok`)}catch(b){let I=b instanceof Error?b.message:String(b);process.stderr.write(`[acp] set_config_option(effort=${t.effort}) failed: ${I}
1392
+ `),P({event:"acp_config_option_failed",provider:t.tool,config_id:"effort",value:t.effort,error_message:I})}m.beginTurn(),Tt(`acp: prompt sent (${e.length} chars)`);let y=await h("session/prompt",{sessionId:f,prompt:[{type:"text",text:e}]}),T=m.completeTurn(y);Tt(`acp: result received (${T.result.length} chars, stopReason=${T.stopReason})`),c.stdin?.end()}catch(y){tt(c).catch(()=>{}),s(y instanceof Error?y:new Error(String(y)))}})()}):Promise.reject(new Error(`No ACP config for tool "${t.tool}"`))}var Rl,V0,Ol=E(()=>{"use strict";me();zr();mi();Zr();gi();me();at();Al();Al();Rl={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},V0=1});function _e(e,t=120){let r=e.replace(/\s+/g," ").trim();return r.length>t?r.slice(0,t-1)+"\u2026":r}function Sp(e,t){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(e.size>=K0){let n=e.keys().next().value;n!==void 0&&e.delete(n)}e.set(r.id,Date.now()),t(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=e.get(r.id);if(n!==void 0){t({...r,elapsedMs:Date.now()-n}),e.delete(r.id);return}}t(r)}}function Y0(){let e=new Map;return(t,r)=>{z0(t,Sp(e,r))}}function z0(e,t){let r=e.type;if(r==="system"){let n=e.subtype;if(n==="api_retry"){let s=typeof e.attempt=="number"?e.attempt:void 0,i=typeof e.max_retries=="number"?e.max_retries:void 0,o=typeof e.error_status=="number"?e.error_status:void 0,a=typeof e.error=="string"?e.error:void 0,l=typeof e.retry_delay_ms=="number"?e.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(i!==void 0?`attempt ${s}/${i}`:`attempt ${s}`),o!==void 0&&c.push(`HTTP ${o}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(_e(a,60));let d=c.length>0?c.join(", "):n;t({kind:"api_retry",summary:d});return}if(n==="api_error"){let s=typeof e.error_status=="number"?e.error_status:void 0,i=typeof e.error=="string"?e.error:void 0,o=["api_error"];s!==void 0&&o.push(`HTTP ${s}`),i&&o.push(_e(i,80)),t({kind:"other",summary:o.join(": "),raw:e});return}t({kind:"system",summary:n||"system",raw:e});return}if(r==="assistant"||r==="user"){let s=e.message?.content;if(!Array.isArray(s))return;for(let i of s){let o=i.type;if(o==="text"){let a=i.text||"";a&&t({kind:"text",summary:_e(a),raw:i})}else if(o==="tool_use"){let a=i.name||"tool",l=typeof i.id=="string"?i.id:void 0,c=i.input,d="";c&&(typeof c.command=="string"?d=c.command:typeof c.file_path=="string"?d=c.file_path:typeof c.path=="string"?d=c.path:typeof c.pattern=="string"?d=c.pattern:typeof c.url=="string"?d=c.url:d=_e(JSON.stringify(c))),t({kind:"tool_use",tool:a,summary:_e(d),id:l,raw:i})}else if(o==="thinking"){let a=i.thinking||"";t({kind:"thinking",summary:_e(a),raw:i})}else if(o==="tool_result"){let l=i.is_error===!0?"error":"ok",c=typeof i.tool_use_id=="string"?i.tool_use_id:void 0,d,u=i.content;if(typeof u=="string")d=`${u.split(`
1393
1393
  `).length} lines, ${u.length} chars`;else if(Array.isArray(u)){let f=u.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(d=`${f.split(`
1394
- `).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(r==="result"){t({kind:"system",summary:"result",raw:e});return}}async function yi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?Y0():void 0,s=await ip(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:r,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function Z0(){let e=new Map;return(t,r)=>{Q0(t,Sp(e,r))}}function Q0(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:he(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";t({kind:"thinking",summary:he(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=he(JSON.stringify(c))),t({kind:"tool_use",tool:o,summary:he(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")t({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${he(c,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:i})}}async function en(e,t){let r=t.acpTool||t.binary;t.model&&r==="copilot"&&Ae({event:"model_ignored",provider:r,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let n=t.onProgress?Z0():void 0,s=await bp(e,{tool:r,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function eN(e,t){let r=e.method;if(!r)return;let n=e.params;if(r==="turn/started"){t({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${he(o,120)}`}:{kind:"other",summary:`codex error: ${he(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)t({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";t({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;t(i==="commentary"?{kind:"thinking",summary:he(s)}:{kind:"text",summary:he(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&t({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1395
- `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${he(o,60)}`:he(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let i=s.split(`
1396
- `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${he(o,60)}`:he(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){t({kind:"other",summary:r.slice(5)});return}}async function vp(e,t){let r=await cp(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?n=>eN(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var K0,xr=E(()=>{"use strict";op();dp();Ol();pe();K0=256});function Cl(e){return new $l(e)}var $l,Ml=E(()=>{"use strict";Vm();Ut();xr();St();$l=class extends xe{constructor(t){super({provider:new li(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:yi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as tN,stat as kp,unlink as rN}from"node:fs/promises";import{join as ts,basename as nN}from"node:path";function sN(e,t,r){return`${e}|${t.toISOString()}|${r}`}function rs(e,t,r){let n=sN(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function Ip(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function iN(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function wi(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return wi(r)}).filter(r=>r.length>0).join(`
1397
- `);try{return JSON.stringify(e)}catch{return String(e)}}async function Np(e){let t=0,r=0,n=0,s=0,i=0,o,a;for await(let l of He(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=iN(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var Ei,xp=E(()=>{"use strict";tr();Ei=class{name="codex";codexDirs;constructor(t={}){let r=[ts(Se,".codex"),ts(Se,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let n=[t.codexDir||r[0],t.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:ts(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let r of this.codexDirs){let n=ts(r,"sessions");try{await kp(n),t.push(n)}catch{}}return t}async discoverSessions(){let t=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&t.push(o)}catch{}}return t}async findSessionFiles(t){let r=[],n;try{n=await tN(t)}catch{return r}for(let s of n){let i=ts(t,s),o=await kp(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(t){let r=nN(t,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(t){let r=await Me(t,30),n=await Ne(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let _=p.payload.message||p.payload.text;_&&(c||(c=J(_.trim(),80)),d=J(_.trim(),80))}if(p.type==="response_item"&&p.payload?.type==="message"&&p.payload.role==="user"&&p.payload.content){let _=p.payload.content.find(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof _?.text=="string"&&(c||(c=J(_.text.trim(),80)),d=J(_.text.trim(),80))}}if(!i)return null;let m=await Np(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:Ip(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u=t,f,m=new Set;for await(let _ of He(r)){let g=_.timestamp?new Date(_.timestamp):new Date;if(_.type==="session_meta"&&_.payload){_.payload.id&&(u=_.payload.id),_.payload.cwd&&(i=_.payload.cwd),_.payload.cli_version&&(o=_.payload.cli_version),_.payload.timestamp&&(l=new Date(_.payload.timestamp)),f=Ip(_.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 h=_.payload;if(h.type==="message"){if(h.role==="user"&&h.content){for(let y of h.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let T=y.text.trim();c||(c=J(T,80)),d=J(T,80),rs(s,m,{role:"user",timestamp:g,content:ue(T)})}continue}if(h.role==="assistant"&&h.content){for(let y of h.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&rs(s,m,{role:"assistant",timestamp:g,content:ue(y.text),model:a});continue}if(h.role!=="user"&&h.role!=="assistant"&&h.content){for(let y of h.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&rs(s,m,{role:"system",timestamp:g,content:ue(y.text.trim())});continue}}if(h.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:h.name||"unknown tool",toolName:h.name,toolInput:h.arguments!==void 0?ue(wi(h.arguments)):void 0,toolCallId:h.call_id});continue}if(h.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ue(wi(h.output)),toolCallId:h.call_id});continue}if(h.type==="reasoning"&&h.summary){let y=h.summary.map(T=>wi(T.text)).join(`
1398
- `);y.trim()&&rs(s,m,{role:"thinking",timestamp:g,content:ue(y)});continue}}if(_.type==="event_msg"&&_.payload&&_.payload.type==="agent_reasoning"){let h=_.payload.message||_.payload.text;h&&rs(s,m,{role:"thinking",timestamp:g,content:ue(h)})}}if(!i)return null;let p=await Np(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await rN(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Me(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Dl(e){return new jl(e)}var jl,Pl=E(()=>{"use strict";xp();Ut();xr();St();jl=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${ge}
1394
+ `).length} lines, ${f.length} chars`)}t({kind:"tool_result",status:l,summary:d,id:c,raw:i})}else o&&t({kind:"other",summary:o,raw:i})}return}if(r==="result"){t({kind:"system",summary:"result",raw:e});return}}async function yi(e,t){let r=t.binary==="qwen"?"qwen":"claude",n=t.onProgress?Y0():void 0,s=await ip(e,{sessionId:t.sessionId,cwd:t.cwd,env:t.env,tool:r,binaryPath:t.progPath,model:t.model,permissionMode:t.permissionMode,onText:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function Z0(){let e=new Map;return(t,r)=>{Q0(t,Sp(e,r))}}function Q0(e,t){if(e.method!=="session/update")return;let s=e.params?.update;if(!s)return;let i=s.sessionUpdate;if(i){if(i==="agent_message_chunk"){let a=s.content?.text||"";a&&t({kind:"text",summary:_e(a)});return}if(i==="agent_thought_chunk"){let a=s.content?.text||"";t({kind:"thinking",summary:_e(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=_e(JSON.stringify(c))),t({kind:"tool_use",tool:o,summary:_e(l),id:a});return}if(i==="tool_call_update"){let o=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(o==="completed"||o==="failed")t({kind:"tool_result",summary:o,status:o==="failed"?"error":"ok",id:a});else if(o==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",d=c?`running\u2026 ${_e(c,80)}`:"running\u2026";t({kind:"other",summary:d,id:a})}return}t({kind:"other",summary:i})}}async function en(e,t){let r=t.acpTool||t.binary;t.model&&r==="copilot"&&Ae({event:"model_ignored",provider:r,model:t.model,reason:"copilot --acp does not implement per-session model selection"});let n=t.onProgress?Z0():void 0,s=await bp(e,{tool:r,sessionId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,effort:t.effort,alias:t.alias,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:n?i=>n(i,t.onProgress):void 0,signal:t.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function eN(e,t){let r=e.method;if(!r)return;let n=e.params;if(r==="turn/started"){t({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){t({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,i=typeof s?.message=="string"?s.message:void 0,o=i&&i.length>0?i:"(no message)",a=n?.willRetry===!0;t(a?{kind:"api_retry",summary:`codex retry: ${_e(o,120)}`}:{kind:"other",summary:`codex error: ${_e(o,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let i=s.type,o=r==="item/started";switch(i){case"commandExecution":{let a=typeof s.id=="string"?s.id:void 0,l=s.command,c=Array.isArray(l)?l.join(" "):typeof l=="string"?l:"";if(o)t({kind:"tool_use",tool:"Bash",summary:_e(c||"(command)"),id:a});else{let d=s.exitCode,u=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof d=="number"?`exit ${d}`:u||"done",p=[];typeof d=="number"?p.push(`exit ${d}`):u&&p.push(u),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),t({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(o){let l=s.changes,c=Array.isArray(l)?l.map(d=>d.path||"").filter(Boolean).join(", "):"";t({kind:"tool_use",tool:"FileChange",summary:_e(c||"(edit)"),id:a})}else{let l=s.status||"done";t({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(o)t({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let d=s.status||"done";t({kind:"tool_result",summary:d,status:d,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;t(o?{kind:"tool_use",tool:"WebSearch",summary:_e(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{o&&t({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{i&&t({kind:o?"tool_use":"tool_result",tool:i,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let i=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;t(i==="commentary"?{kind:"thinking",summary:_e(s)}:{kind:"text",summary:_e(s)})}return}if(r==="item/reasoning/summaryTextDelta"||r==="item/reasoning/textDelta"){let s=n?.delta||"";s&&t({kind:"thinking",summary:_e(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let i=s.split(`
1395
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${_e(o,60)}`:_e(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r==="item/commandExecution/terminalInteraction"||r==="item/commandExecution/outputChunk"||r==="item/commandExecution/output"){let s=(typeof n?.stdin=="string"?n.stdin:"")||(typeof n?.delta=="string"?n.delta:"")||(typeof n?.output=="string"?n.output:"")||(typeof n?.text=="string"?n.text:"")||(typeof n?.content=="string"?n.content:"")||(typeof n?.chunk=="string"?n.chunk:"")||"";if(s){let i=s.split(`
1396
+ `).filter(l=>l.length>0),o=i[i.length-1]||"",a=i.length>1?`${i.length} lines: ${_e(o,60)}`:_e(s,80);t({kind:"other",summary:`running\u2026 ${a}`})}else t({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){t({kind:"other",summary:r.slice(5)});return}}async function vp(e,t){let r=await cp(e,{threadId:t.sessionId,cwd:t.cwd,env:t.env,binaryPath:t.progPath,model:t.model,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode,onDelta:t.onDelta,onEvent:t.onProgress?n=>eN(n,t.onProgress):void 0,signal:t.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var K0,xr=E(()=>{"use strict";op();dp();Ol();me();K0=256});function Cl(e){return new $l(e)}var $l,Ml=E(()=>{"use strict";Vm();Ut();xr();St();$l=class extends xe{constructor(t){super({provider:new li(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",ge,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:yi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as tN,stat as kp,unlink as rN}from"node:fs/promises";import{join as ts,basename as nN}from"node:path";function sN(e,t,r){return`${e}|${t.toISOString()}|${r}`}function rs(e,t,r){let n=sN(r.role,r.timestamp,r.content);t.has(n)||(t.add(n),e.push(r))}function Ip(e,t){return t==="exec"||e==="codex_exec"?"codex exec":"codex"}function iN(e){if(!e)return;let t=e.cached_input_tokens??e.cache_read_input_tokens;return{inputTokens:e.input_tokens,cachedInputTokens:t,outputTokens:e.output_tokens,reasoningOutputTokens:e.reasoning_output_tokens,totalTokens:e.total_tokens}}function wi(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number"||typeof e=="boolean")return String(e);if(Array.isArray(e))return e.map(r=>{if(typeof r=="string")return r;if(r&&typeof r=="object"){let n=r;if(typeof n.text=="string")return n.text;if(typeof n.image_url=="string")return"[input_image]";if(typeof n.type=="string")return`[${n.type}]`}return wi(r)}).filter(r=>r.length>0).join(`
1397
+ `);try{return JSON.stringify(e)}catch{return String(e)}}async function Np(e){let t=0,r=0,n=0,s=0,i=0,o,a;for await(let l of He(e)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let d of c.content)d.type==="input_text"&&typeof d.text=="string"&&d.text&&t++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let d of c.content)d.type==="output_text"&&typeof d.text=="string"&&d.text&&t++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,i=c.reasoning_output_tokens??i;let d=iN(l.payload.info.last_token_usage);d&&(o=d),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:t,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:i,lastTokenUsage:o,modelContextWindow:a}}var Ei,xp=E(()=>{"use strict";tr();Ei=class{name="codex";codexDirs;constructor(t={}){let r=[ts(Se,".codex"),ts(Se,".code")];if(t.codexDirs&&t.codexDirs.length>0){this.codexDirs=[...new Set(t.codexDirs)];return}let n=[t.codexDir||r[0],t.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(t=>({directory:ts(t,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let t=[];for(let r of this.codexDirs){let n=ts(r,"sessions");try{await kp(n),t.push(n)}catch{}}return t}async discoverSessions(){let t=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let i of s)try{let o=await this.extractSummary(i);o&&t.push(o)}catch{}}return t}async findSessionFiles(t){let r=[],n;try{n=await tN(t)}catch{return r}for(let s of n){let i=ts(t,s),o=await kp(i).catch(()=>null);if(o)if(o.isDirectory()){let a=await this.findSessionFiles(i);r.push(...a)}else s.endsWith(".jsonl")&&r.push(i)}return r}extractSessionIdFromFilename(t){let r=nN(t,".jsonl"),n=r.match(/rollout-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async extractSummary(t){let r=await Me(t,30),n=await Ne(t),s=this.extractSessionIdFromFilename(t),i="",o,a,l,c,d,u,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(i=p.payload.cwd),p.payload.cli_version&&(o=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(u=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!i&&p.payload.cwd&&(i=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=J(h.trim(),80)),d=J(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(g=>g.type==="input_text"&&typeof g.text=="string"&&g.text);typeof h?.text=="string"&&(c||(c=J(h.text.trim(),80)),d=J(h.text.trim(),80))}}if(!i)return null;let m=await Np(t);return{provider:"codex",sessionId:s,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:Ip(u,f),firstUserMessage:c,lastUserMessage:d,messageCount:m.messageCount,filePath:t,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n=await Ne(r),s=[],i="",o,a,l,c,d,u=t,f,m=new Set;for await(let h of He(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(u=h.payload.id),h.payload.cwd&&(i=h.payload.cwd),h.payload.cli_version&&(o=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=Ip(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!i&&h.payload.cwd&&(i=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let y of _.content)if(y.type==="input_text"&&typeof y.text=="string"&&y.text){let T=y.text.trim();c||(c=J(T,80)),d=J(T,80),rs(s,m,{role:"user",timestamp:g,content:ue(T)})}continue}if(_.role==="assistant"&&_.content){for(let y of _.content)y.type==="output_text"&&typeof y.text=="string"&&y.text&&rs(s,m,{role:"assistant",timestamp:g,content:ue(y.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let y of _.content)(y.type==="input_text"||y.type==="output_text")&&typeof y.text=="string"&&y.text&&rs(s,m,{role:"system",timestamp:g,content:ue(y.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?ue(wi(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:ue(wi(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let y=_.summary.map(T=>wi(T.text)).join(`
1398
+ `);y.trim()&&rs(s,m,{role:"thinking",timestamp:g,content:ue(y)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&rs(s,m,{role:"thinking",timestamp:g,content:ue(_)})}}if(!i)return null;let p=await Np(r);return{provider:"codex",sessionId:u,cwd:i,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:o,startCommand:f,firstUserMessage:c,lastUserMessage:d,messageCount:p.messageCount,filePath:r,totalInputTokens:p.totalInputTokens||void 0,totalCachedInputTokens:p.totalCachedInputTokens||void 0,totalOutputTokens:p.totalOutputTokens||void 0,totalReasoningOutputTokens:p.totalReasoningOutputTokens||void 0,lastInputTokens:p.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:p.lastTokenUsage,modelContextWindow:p.modelContextWindow,messages:s}}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await rN(r),!0):!1}async resolveSessionFile(t){let r=await this.getSessionsDirs(),n=[];for(let i of r){let o=await this.findSessionFiles(i);n.push(...o)}for(let i of n)if(this.extractSessionIdFromFilename(i)===t)return i;let s=[];for(let i of n)this.extractSessionIdFromFilename(i).startsWith(t)&&s.push(i);if(s.length===1)return s[0];for(let i of n){let o=await Me(i,1);if(o.length>0&&o[0].type==="session_meta"){let a=o[0].payload?.id;if(a===t||a&&a.startsWith(t))return i}}return null}}});function Dl(e){return new jl(e)}var jl,Pl=E(()=>{"use strict";xp();Ut();xr();St();jl=class extends xe{constructor(t){super({provider:new Ei(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${ge}
1399
1399
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:vp})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r.slice(0,-1),"--model",t.model,r[r.length-1]]:r}}});function ns(e){if(!e.trim())return"unknown";let t=e.split(/\r?\n/).filter(n=>n.trim().length>0);if(t.length>1)try{let n=JSON.parse(t[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(e)}catch{return"unknown"}if(r!==null&&typeof r=="object"&&!Array.isArray(r)){let n=r;if(Array.isArray(n.messages))return"json";if("kind"in n)return"jsonl"}return"unknown"}function Ti(e){let t=ns(e);if(t==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(t==="json"){let a=JSON.parse(e);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=e.split(`
1400
1400
  `).map(a=>a).filter(a=>a.trim().length>0);if(r.length===0)throw new Error("gemini session file is empty");let n=r[0],s;try{s=JSON.parse(n)}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<r.length;a++){let l;try{l=JSON.parse(r[a])}catch{continue}if(l===null||typeof l!="object")continue;let c=l;if("$set"in c&&c.$set&&typeof c.$set=="object"){Object.assign(s,c.$set);continue}if(typeof c.id=="string"||typeof c.type=="string"){let d=c;if(typeof d.id=="string"){let u=o.get(d.id);u?oN(u,d):(i.push(d),o.set(d.id,d))}else i.push(d)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:i}}function oN(e,t){for(let[r,n]of Object.entries(t))if(n!==void 0){if(r==="tokens"&&Ap(e.tokens)&&Ap(n)){e.tokens={...e.tokens,...n};continue}e[r]=n}}function Ap(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Rp(e,t){if(t==="json")return JSON.stringify(e,null,2);let{messages:r,...n}=e,s=[JSON.stringify(n)];for(let i of r)s.push(JSON.stringify(i));return s.join(`
1401
1401
  `)+`
1402
- `}var Fl=E(()=>{"use strict"});import{createHash as aN}from"node:crypto";import{readdir as ss,readFile as Lp,stat as bi,unlink as lN}from"node:fs/promises";import{join as Xe,basename as cN,dirname as dN}from"node:path";import{cwd as uN}from"node:process";function Op(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function $p(e){return e==="user"}function Ul(e){return e==="gemini"||e==="assistant"}function Ar(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function fN(e){return`${e.sessionId}\0${e.cwd}`}function mN(e,t){let r=e.filePaths??[e.filePath],n=t.filePaths??[t.filePath],s=[...new Set([...r,...n])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function Si(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Cp(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!Ul(a.type)||!a.tokens)continue;let l=Si(a.tokens.input),c=Si(a.tokens.cached),d=Math.max(l-c,0),u=Si(a.tokens.output),f=Si(a.tokens.thoughts);t+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function pN(e){return aN("sha256").update(e).digest("hex")}function is(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=dN(r);if(n===r)break;r=n}}var vi,Mp=E(()=>{"use strict";tr();Fl();pe();vi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Xe(Se,".gemini");this.geminiProjectsFile=Xe(r,"projects.json"),this.geminiTmpDir=Xe(r,"tmp");let n=t.claudeDir||Xe(Se,".claude");this.claudeProjectsDir=Xe(n,"projects");let s=[Xe(Se,".codex"),Xe(Se,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Xe(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=fN(s),o=r.get(i);r.set(i,o?mN(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let h=Ar(g.timestamp),y=g.type,T=ue(Op(g.content));if($p(y)){let I=T.trim();I&&(d||(d=J(I,80)),u=J(I,80)),i.push({role:"user",timestamp:h,content:I||T});continue}if(Ul(y)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
- `).trim();x&&i.push({role:"thinking",timestamp:Ar(I.timestamp,h),content:ue(x)})}i.push({role:"assistant",timestamp:h,content:T,model:g.model});continue}let b=y?`[${y}] `:"";i.push({role:"system",timestamp:h,content:`${b}${T}`.trim()})}let m=Ar(n.startTime,s.createdAt),p=Ar(n.lastUpdated,s.modifiedAt),_=Cp(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,totalInputTokens:_.totalInputTokens||void 0,totalCachedInputTokens:_.totalCachedInputTokens||void 0,totalOutputTokens:_.totalOutputTokens||void 0,totalReasoningOutputTokens:_.totalReasoningOutputTokens||void 0,lastInputTokens:_.lastInputTokens||void 0,lastTokenUsage:_.lastTokenUsage,messages:i}}async extractSummary(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if($p(m.type)){u++;let p=Op(m.content).trim();p&&(l||(l=J(ue(p),80)),c=J(ue(p),80))}else Ul(m.type)&&(u++,m.model&&(d=m.model));let f=Cp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Ar(r.startTime,n.createdAt),modifiedAt:Ar(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let r=await Lp(t,"utf-8");if(ns(r)==="unknown")return q({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:r.slice(0,120),message:`gemini session file at ${t} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Ti(r)}catch{return null}}extractSessionIdFromFilename(t){let r=cN(t).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let t=[],r;try{r=await ss(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Xe(this.geminiTmpDir,n,"chats");if(!(await bi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ss(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Xe(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await lN(r),!0):!1}async resolveSessionFile(t){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Ar(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;is(t,uN());for(let n of this.extraWorkspacePaths)is(t,n);for(let n of await this.collectGeminiProjectPaths())is(t,n);for(let n of await this.collectCodexCwds())is(t,n);for(let n of await this.collectClaudeCwds())is(t,n);let r=new Map;for(let n of t)r.set(pN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await Lp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Me(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ss(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Xe(this.claudeProjectsDir,n);if(!(await bi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ss(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Xe(s,a),d=(await Me(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await bi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ss(t)}catch{return r}for(let i of s){let o=Xe(t,i),a=await bi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as hN,writeFileSync as _N,mkdirSync as gN}from"node:fs";import{join as yN,dirname as wN}from"node:path";import{randomUUID as EN}from"node:crypto";function Bl(e){return new Wl(e)}var Wl,ql=E(()=>{"use strict";Mp();Ut();xr();St();Fl();Wl=class extends xe{constructor(t){super({provider:new vi(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>en(r,{...n,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1404
- `)}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:di,lsCommand:`lmctl ls --provider gemini --sessiondir ${t}`}}async fork(t,r){let n=await this.resolvePath(t);if(!n)return{success:!1,error:`Session file not found for ${t}`};try{let s=hN(n,"utf-8"),i=ns(s),o=Ti(s),a=EN();o.sessionId=a,o.kind="main";let l=wN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=yN(l,u);return gN(l,{recursive:!0}),_N(f,Rp(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 jp,readFile as TN,rm as bN,stat as tn}from"node:fs/promises";import{basename as SN,join as ct}from"node:path";function vN(e){let t={};for(let r of e.split(`
1405
- `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function Rr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function kN(e){let t=0;for await(let r of He(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var ki,Dp=E(()=>{"use strict";tr();ki=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||ct(Se,".copilot");this.sessionStateDir=ct(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await jp(this.sessionStateDir)}catch{return t}for(let n of r){let s=ct(this.sessionStateDir,n);if((await tn(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=ct(r,"events.jsonl"),i=await tn(s).catch(()=>null),o=i?s:ct(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,_,g=n?.id||SN(r)||t;if(i)for await(let h of He(s)){let y=Rr(h.timestamp)||a.modifiedAt;if(h.type==="session.start"&&h.data){h.data.sessionId&&(g=h.data.sessionId),h.data.copilotVersion&&(u=h.data.copilotVersion),h.data.startTime&&(_=Rr(h.data.startTime)),h.data.selectedModel&&(d=h.data.selectedModel),h.data.context&&(h.data.context.cwd&&(c=h.data.context.cwd),h.data.context.branch&&(f=h.data.context.branch));continue}if(h.type==="session.model_change"&&h.data?.newModel){d=h.data.newModel;continue}if(h.type==="user.message"&&h.data){let T=h.data.content||"",b=T.trim();b&&(m||(m=J(b,80)),p=J(b,80)),l.push({role:"user",timestamp:y,content:ue(b||T)});continue}if(h.type==="assistant.message"&&h.data){let T=(h.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:y,content:ue(T),model:d}),h.data.toolRequests)for(let b of h.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolCallId:b.toolCallId});continue}if(h.type==="tool.execution_complete"&&h.data){let T=h.data.result?.content||"",b=h.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:ue(T),toolDetailedContent:b?ue(b):void 0,toolCallId:h.data.toolCallId});continue}if(h.type==="assistant.reasoning"&&h.data?.content){l.push({role:"thinking",timestamp:y,content:ue(h.data.content)});continue}if(h.type==="session.error"||h.type==="session.warning"||h.type==="session.info"||h.type==="system.message"){let T=h.data?.message||"";T.trim()&&l.push({role:"system",timestamp:y,content:ue(T)});continue}}if(!m){let h=(n?.summary||"").trim();h&&(m=J(h,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:_??Rr(n?.created_at)??a.createdAt,modifiedAt:Rr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(h=>h.role==="user"||h.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=ct(t,"events.jsonl"),i=await tn(s).catch(()=>null),o=i?s:ct(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await Me(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,_;for(let h of l)if(h.type==="session.start"&&h.data&&(h.data.sessionId&&(c=h.data.sessionId),h.data.copilotVersion&&(f=h.data.copilotVersion),h.data.startTime&&(m=Rr(h.data.startTime)),h.data.selectedModel&&(u=h.data.selectedModel),h.data.context?.cwd&&(d=h.data.context.cwd)),h.type==="session.model_change"&&h.data?.newModel&&(u||(u=h.data.newModel)),h.type==="user.message"&&h.data){let y=(h.data.content||"").trim();y&&(p||(p=J(y,80)),_=J(y,80))}if(!p){let h=(n?.summary||"").trim();h&&(p=J(h,80))}let g=i?await kN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??Rr(n?.created_at)??a.createdAt,modifiedAt:Rr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:_,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=ct(t,"workspace.yaml");try{let n=await TN(r,"utf-8");return vN(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await bN(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await jp(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=ct(this.sessionStateDir,t);if((await tn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=ct(this.sessionStateDir,s);(await tn(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=ct(this.sessionStateDir,s);if(!(await tn(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Jl(e){return new Hl(e)}var Hl,Xl=E(()=>{"use strict";Dp();Ut();xr();pe();St();Hl=class extends xe{constructor(t){super({provider:new ki(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>en(r,{...n,acpTool:"copilot"})})}async seed(t,r){let n=await super.seed(t,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Ae({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Pp,readdirSync as IN,statSync as Fp}from"node:fs";import{join as ir}from"node:path";import{createRequire as NN}from"node:module";function Up(){return Gl===null&&(Gl=NN(import.meta.url)("node:sqlite").DatabaseSync),Gl}function xN(){let e=process.env.XDG_DATA_HOME||ir(Se,".local","share"),t=process.env.XDG_CONFIG_HOME||ir(Se,".config");return[ir(e,"opencode","opencode.db"),ir(t,"opencode","opencode.db")]}function AN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||ir(Se,".local","share"),t=ir(e,"lmplayer"),r=ir(t,"opencode-local.db"),n=[r];try{let s=IN(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>ir(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Fp(o).mtimeMs-Fp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function RN(e){return e==="lmplayer"?AN():xN()}var Gl,rn,Vl=E(()=>{"use strict";tr();Gl=null;rn=class{name;startCommand;dbPaths;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=RN(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Pp(t))}openDb(t){return Pp(t)?new(Up())(t,{open:!0,readOnly:!0}):null}async discoverSessions(){let t=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1402
+ `}var Fl=E(()=>{"use strict"});import{createHash as aN}from"node:crypto";import{readdir as ss,readFile as Lp,stat as bi,unlink as lN}from"node:fs/promises";import{join as Xe,basename as cN,dirname as dN}from"node:path";import{cwd as uN}from"node:process";function Op(e){return e?typeof e=="string"?e:Array.isArray(e)?e.map(t=>t.text||"").join(""):"":""}function $p(e){return e==="user"}function Ul(e){return e==="gemini"||e==="assistant"}function Ar(e,t=new Date(0)){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function fN(e){return`${e.sessionId}\0${e.cwd}`}function mN(e,t){let r=e.filePaths??[e.filePath],n=t.filePaths??[t.filePath],s=[...new Set([...r,...n])],i=t.modifiedAt.getTime()>=e.modifiedAt.getTime()?t:e;return{...i,createdAt:e.createdAt.getTime()<=t.createdAt.getTime()?e.createdAt:t.createdAt,modifiedAt:i.modifiedAt,filePath:i.filePath,filePaths:s}}function Si(e){let t=Number(e??0);return Number.isFinite(t)?Math.max(0,Math.round(t)):0}function Cp(e){let t=0,r=0,n=0,s=0,i=0,o;for(let a of e){if(!Ul(a.type)||!a.tokens)continue;let l=Si(a.tokens.input),c=Si(a.tokens.cached),d=Math.max(l-c,0),u=Si(a.tokens.output),f=Si(a.tokens.thoughts);t+=l,r+=c,n+=u,s+=f,i=l,o={inputTokens:d,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:u,reasoningOutputTokens:f,totalTokens:l+u+f}}return{totalInputTokens:t,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:i,lastTokenUsage:o}}function pN(e){return aN("sha256").update(e).digest("hex")}function is(e,t){let r=t;for(;r&&!e.has(r);){e.add(r);let n=dN(r);if(n===r)break;r=n}}var vi,Mp=E(()=>{"use strict";tr();Fl();me();vi=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(t={}){let r=t.geminiDir||Xe(Se,".gemini");this.geminiProjectsFile=Xe(r,"projects.json"),this.geminiTmpDir=Xe(r,"tmp");let n=t.claudeDir||Xe(Se,".claude");this.claudeProjectsDir=Xe(n,"projects");let s=[Xe(Se,".codex"),Xe(Se,".code")],i=t.codexDirs&&t.codexDirs.length>0?t.codexDirs:[t.codexDir||s[0],t.codeDir||s[1]];this.codexSessionDirs=[...new Set(i)].map(o=>Xe(o,"sessions")),this.extraWorkspacePaths=t.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let t=await this.findSessionFiles(),r=new Map;for(let n of t)try{let s=await this.extractSummary(n);if(!s)continue;let i=fN(s),o=r.get(i);r.set(i,o?mN(o,s):s)}catch{}return[...r.values()]}async loadSession(t){let r=await this.resolveSessionFile(t);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),i=[],o=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),d,u,f;for(let g of o){let _=Ar(g.timestamp),y=g.type,T=ue(Op(g.content));if($p(y)){let I=T.trim();I&&(d||(d=J(I,80)),u=J(I,80)),i.push({role:"user",timestamp:_,content:I||T});continue}if(Ul(y)){g.model&&(f=g.model);for(let I of g.thoughts||[]){let x=[I.subject,I.description].filter(Boolean).join(`
1403
+ `).trim();x&&i.push({role:"thinking",timestamp:Ar(I.timestamp,_),content:ue(x)})}i.push({role:"assistant",timestamp:_,content:T,model:g.model});continue}let b=y?`[${y}] `:"";i.push({role:"system",timestamp:_,content:`${b}${T}`.trim()})}let m=Ar(n.startTime,s.createdAt),p=Ar(n.lastUpdated,s.modifiedAt),h=Cp(o);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:d,lastUserMessage:u,messageCount:i.filter(g=>g.role==="user"||g.role==="assistant").length,filePath:r,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(t){let r=await this.readSessionFile(t);if(!r)return null;let n=await Ne(t),s=r.messages||[],i=r.sessionId||this.extractSessionIdFromFilename(t),o=r.projectHash||"",a=await this.resolveWorkspace(o),l,c,d,u=0;for(let m of s)if($p(m.type)){u++;let p=Op(m.content).trim();p&&(l||(l=J(ue(p),80)),c=J(ue(p),80))}else Ul(m.type)&&(u++,m.model&&(d=m.model));let f=Cp(s);return{provider:"gemini",sessionId:i,cwd:a,createdAt:Ar(r.startTime,n.createdAt),modifiedAt:Ar(r.lastUpdated,n.modifiedAt),model:d,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:t,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(t){let r=await Lp(t,"utf-8");if(ns(r)==="unknown")return P({event:"gemini_session_format_unknown",provider:"gemini",file:t,preview:r.slice(0,120),message:`gemini session file at ${t} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return Ti(r)}catch{return null}}extractSessionIdFromFilename(t){let r=cN(t).replace(/\.jsonl?$/,""),n=r.match(/session-\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-(.+)$/);return n?n[1]:r}async findSessionFiles(){let t=[],r;try{r=await ss(this.geminiTmpDir)}catch{return t}for(let n of r){let s=Xe(this.geminiTmpDir,n,"chats");if(!(await bi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ss(s)}catch{continue}for(let a of o)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||t.push(Xe(s,a)))}return t}async resolveSessionPath(t){return this.resolveSessionFile(t)}async deleteSession(t){let r=await this.resolveSessionFile(t);return r?(await lN(r),!0):!1}async resolveSessionFile(t){let r=await this.findSessionFiles(),n=[];for(let s of r){let i=await this.readSessionFile(s).catch(()=>null),o=this.extractSessionIdFromFilename(s),a=i?.sessionId||o,l=a===t||a.startsWith(t),c=o===t||o.startsWith(t)||o.length>=8&&t.startsWith(o);if(!l&&!c)continue;let d=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Ar(i?.lastUpdated,d.modifiedAt)})}return n.sort((s,i)=>{let o=i.modifiedAt.getTime()-s.modifiedAt.getTime();return o!==0?o:i.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(t){return t?(await this.getWorkspaceHashMap()).get(t)||`[hash:${t.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let t=new Set;is(t,uN());for(let n of this.extraWorkspacePaths)is(t,n);for(let n of await this.collectGeminiProjectPaths())is(t,n);for(let n of await this.collectCodexCwds())is(t,n);for(let n of await this.collectClaudeCwds())is(t,n);let r=new Map;for(let n of t)r.set(pN(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let t;try{t=await Lp(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(t).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let t=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let o=(await Me(s,1).catch(()=>[]))[0]?.payload?.cwd;o&&t.add(o)}}return[...t]}async collectClaudeCwds(){let t=new Set,r;try{r=await ss(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=Xe(this.claudeProjectsDir,n);if(!(await bi(s).catch(()=>null))?.isDirectory())continue;let o;try{o=await ss(s)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=Xe(s,a),d=(await Me(l,1).catch(()=>[]))[0]?.cwd;d&&t.add(d)}}return[...t]}async findJsonlFiles(t){let r=[];if(!(await bi(t).catch(()=>null))?.isDirectory())return r;let s;try{s=await ss(t)}catch{return r}for(let i of s){let o=Xe(t,i),a=await bi(o).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(o);r.push(...l)}else i.endsWith(".jsonl")&&r.push(o)}return r}}});import{readFileSync as _N,writeFileSync as hN,mkdirSync as gN}from"node:fs";import{join as yN,dirname as wN}from"node:path";import{randomUUID as EN}from"node:crypto";function Bl(e){return new Wl(e)}var Wl,ql=E(()=>{"use strict";Mp();Ut();xr();St();Fl();Wl=class extends xe{constructor(t){super({provider:new vi(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",ge,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>en(r,{...n,acpTool:"gemini"})})}forkHint(t){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1404
+ `)}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}manualSeedHint(t){return{launchCommand:`cd ${t} && gemini --skip-trust`,postLaunchNote:di,lsCommand:`lmctl ls --provider gemini --sessiondir ${t}`}}async fork(t,r){let n=await this.resolvePath(t);if(!n)return{success:!1,error:`Session file not found for ${t}`};try{let s=_N(n,"utf-8"),i=ns(s),o=Ti(s),a=EN();o.sessionId=a,o.kind="main";let l=wN(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),d=i==="jsonl"?".jsonl":".json",u=`session-${c}-${a.slice(0,8)}${d}`,f=yN(l,u);return gN(l,{recursive:!0}),hN(f,Rp(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 jp,readFile as TN,rm as bN,stat as tn}from"node:fs/promises";import{basename as SN,join as ct}from"node:path";function vN(e){let t={};for(let r of e.split(`
1405
+ `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(t[n[1]]=n[2].trim())}return{id:t.id,cwd:t.cwd,summary_count:t.summary_count?parseInt(t.summary_count,10):void 0,created_at:t.created_at,updated_at:t.updated_at,summary:t.summary}}function Rr(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}async function kN(e){let t=0;for await(let r of He(e))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&t++;return t}var ki,Dp=E(()=>{"use strict";tr();ki=class{name="copilot";sessionStateDir;constructor(t={}){let r=t.copilotDir||ct(Se,".copilot");this.sessionStateDir=ct(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let t=[],r;try{r=await jp(this.sessionStateDir)}catch{return t}for(let n of r){let s=ct(this.sessionStateDir,n);if((await tn(s).catch(()=>null))?.isDirectory())try{let o=await this.extractSummary(s,n);o&&t.push(o)}catch{}}return t}async loadSession(t){let r=await this.resolveSessionDir(t);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=ct(r,"events.jsonl"),i=await tn(s).catch(()=>null),o=i?s:ct(r,"workspace.yaml"),a=await Ne(i?s:r),l=[],c=n?.cwd||"(unknown workspace)",d,u,f,m,p,h,g=n?.id||SN(r)||t;if(i)for await(let _ of He(s)){let y=Rr(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(u=_.data.copilotVersion),_.data.startTime&&(h=Rr(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context&&(_.data.context.cwd&&(c=_.data.context.cwd),_.data.context.branch&&(f=_.data.context.branch));continue}if(_.type==="session.model_change"&&_.data?.newModel){d=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let T=_.data.content||"",b=T.trim();b&&(m||(m=J(b,80)),p=J(b,80)),l.push({role:"user",timestamp:y,content:ue(b||T)});continue}if(_.type==="assistant.message"&&_.data){let T=(_.data.content||"").trim();if(T&&l.push({role:"assistant",timestamp:y,content:ue(T),model:d}),_.data.toolRequests)for(let b of _.data.toolRequests)l.push({role:"tool_use",timestamp:y,content:b.name||"unknown tool",toolName:b.name,toolInput:b.arguments?JSON.stringify(b.arguments,null,2):void 0,toolCallId:b.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let T=_.data.result?.content||"",b=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:y,content:ue(T),toolDetailedContent:b?ue(b):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:y,content:ue(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let T=_.data?.message||"";T.trim()&&l.push({role:"system",timestamp:y,content:ue(T)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=J(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??Rr(n?.created_at)??a.createdAt,modifiedAt:Rr(n?.updated_at)??a.modifiedAt,model:d,cliVersion:u,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:o,messages:l}}async extractSummary(t,r){let n=await this.readWorkspaceYaml(t),s=ct(t,"events.jsonl"),i=await tn(s).catch(()=>null),o=i?s:ct(t,"workspace.yaml"),a=await Ne(i?s:t),l=i?await Me(s,20):[],c=n?.id||r,d=n?.cwd||"(unknown workspace)",u,f,m,p,h;for(let _ of l)if(_.type==="session.start"&&_.data&&(_.data.sessionId&&(c=_.data.sessionId),_.data.copilotVersion&&(f=_.data.copilotVersion),_.data.startTime&&(m=Rr(_.data.startTime)),_.data.selectedModel&&(u=_.data.selectedModel),_.data.context?.cwd&&(d=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(u||(u=_.data.newModel)),_.type==="user.message"&&_.data){let y=(_.data.content||"").trim();y&&(p||(p=J(y,80)),h=J(y,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=J(_,80))}let g=i?await kN(s):0;return{provider:"copilot",sessionId:c,cwd:d,createdAt:m??Rr(n?.created_at)??a.createdAt,modifiedAt:Rr(n?.updated_at)??a.modifiedAt,model:u,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:o}}async readWorkspaceYaml(t){let r=ct(t,"workspace.yaml");try{let n=await TN(r,"utf-8");return vN(n)}catch{return null}}async resolveSessionPath(t){return this.resolveSessionDir(t)}async deleteSession(t){let r=await this.resolveSessionDir(t);return r?(await bN(r,{recursive:!0}),!0):!1}async resolveSessionDir(t){let r;try{r=await jp(this.sessionStateDir)}catch{return null}if(r.includes(t)){let s=ct(this.sessionStateDir,t);if((await tn(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(t)){let i=ct(this.sessionStateDir,s);(await tn(i).catch(()=>null))?.isDirectory()&&n.push(i)}if(n.length===1)return n[0];for(let s of r){let i=ct(this.sessionStateDir,s);if(!(await tn(i).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(i);if(a&&(a.id===t||a.id?.startsWith(t)))return i}return null}}});function Jl(e){return new Hl(e)}var Hl,Xl=E(()=>{"use strict";Dp();Ut();xr();me();St();Hl=class extends xe{constructor(t){super({provider:new ki(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",ge,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(r,n)=>en(r,{...n,acpTool:"copilot"})})}async seed(t,r){let n=await super.seed(t,r);if(r?.model===void 0||r.model.trim().length===0)return n;let s="copilot seed does not implement per-session model selection";return Ae({event:"model_ignored",provider:"copilot",model:r.model,reason:s}),{...n,warnings:[...n.warnings??[],`copilot seed ignored model=${r.model}: ${s}`]}}}});import{existsSync as Pp,readdirSync as IN,statSync as Fp}from"node:fs";import{join as ir}from"node:path";import{createRequire as NN}from"node:module";function Up(){return Gl===null&&(Gl=NN(import.meta.url)("node:sqlite").DatabaseSync),Gl}function xN(){let e=process.env.XDG_DATA_HOME||ir(Se,".local","share"),t=process.env.XDG_CONFIG_HOME||ir(Se,".config");return[ir(e,"opencode","opencode.db"),ir(t,"opencode","opencode.db")]}function AN(){if(process.env.OPENCODE_DB)return[process.env.OPENCODE_DB];let e=process.env.XDG_DATA_HOME||ir(Se,".local","share"),t=ir(e,"lmplayer"),r=ir(t,"opencode-local.db"),n=[r];try{let s=IN(t).filter(i=>/^opencode.*\.db$/u.test(i)).map(i=>ir(t,i)).filter(i=>i!==r).sort((i,o)=>{try{return Fp(o).mtimeMs-Fp(i).mtimeMs}catch{return 0}});n.push(...s)}catch{}return n}function RN(e){return e==="lmplayer"?AN():xN()}var Gl,rn,Vl=E(()=>{"use strict";tr();Gl=null;rn=class{name;startCommand;dbPaths;constructor(t){this.name=t?.providerName??"opencode",this.startCommand=t?.startCommand??this.name,t?.dbPath?this.dbPaths=[t.dbPath]:this.dbPaths=RN(this.name)}existingDbPaths(){return this.dbPaths.filter(t=>Pp(t))}openDb(t){return Pp(t)?new(Up())(t,{open:!0,readOnly:!0}):null}async discoverSessions(){let t=[];for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=new Map,i=n.prepare("SELECT id, worktree, name FROM project").all();for(let a of i)s.set(a.id,a);let o=n.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1406
1406
  s.time_created, s.time_updated
1407
1407
  FROM session s
1408
1408
  ORDER BY s.time_updated DESC`).all();for(let a of o){let l=s.get(a.project_id),c=a.directory||l?.worktree||"(unknown)",d=n.prepare(`SELECT m.id, m.data, m.time_created FROM message m
1409
- WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,_=[];for(let h of d){let y;try{y=JSON.parse(h.data)}catch{continue}p||(p=y.model?.modelID||y.modelID),(y.role==="user"||y.role==="assistant")&&u++,y.role==="user"&&_.push(h.id)}let g=[..._.length>0?[_[0]]:[],..._.length>1?[_[_.length-1]]:[]];for(let h of g){let y=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(h),T=this.extractText(y);T&&(f||(f=J(T,80)),m=J(T,80))}t.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:u,filePath:r})}}catch{}finally{n.close()}}return t.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(t){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,t);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(t,r,n){let s=t.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),i=r.directory||s?.worktree||"(unknown)",o=t.prepare(`SELECT id, session_id, time_created, time_updated, data
1410
- FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=0,c,d,u;for(let f of o){let m;try{m=JSON.parse(f.data)}catch{continue}c||(c=m.model?.modelID||m.modelID);let p=m.model?.modelID||m.modelID,_=new Date(m.time?.created||f.time_created),g=t.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(m.role==="user"){let h=this.extractText(g);h&&(d||(d=J(h,80)),u=J(h,80)),a.push({role:"user",timestamp:_,content:h||"(empty)"}),l++}else if(m.role==="assistant"){for(let h of g){let y;try{y=JSON.parse(h.data)}catch{continue}y.type==="text"&&y.text?a.push({role:"assistant",timestamp:_,content:y.text,model:p}):y.type==="reasoning"&&y.text?a.push({role:"thinking",timestamp:_,content:y.text}):y.type==="tool"&&y.tool&&(a.push({role:"tool_use",timestamp:_,content:`${y.tool}`,toolName:y.tool,toolCallId:y.callID,toolInput:y.state?.input?JSON.stringify(y.state.input):void 0}),(y.state?.output||y.state?.error)&&a.push({role:"tool_result",timestamp:_,content:y.state.error||y.state.output||"",toolCallId:y.callID}))}l++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:i,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:d,lastUserMessage:u,messageCount:l,filePath:n,messages:a}}extractText(t){let r=[];for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
1409
+ WHERE m.session_id = ? ORDER BY m.time_created ASC`).all(a.id),u=0,f,m,p,h=[];for(let _ of d){let y;try{y=JSON.parse(_.data)}catch{continue}p||(p=y.model?.modelID||y.modelID),(y.role==="user"||y.role==="assistant")&&u++,y.role==="user"&&h.push(_.id)}let g=[...h.length>0?[h[0]]:[],...h.length>1?[h[h.length-1]]:[]];for(let _ of g){let y=n.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(_),T=this.extractText(y);T&&(f||(f=J(T,80)),m=J(T,80))}t.push({provider:this.name,sessionId:a.id,slug:a.slug,cwd:c,createdAt:new Date(a.time_created),modifiedAt:new Date(a.time_updated),model:p,startCommand:this.startCommand,firstUserMessage:f,lastUserMessage:m,messageCount:u,filePath:r})}}catch{}finally{n.close()}}return t.sort((r,n)=>n.modifiedAt.getTime()-r.modifiedAt.getTime())}async loadSession(t){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{let s=this.findSessionRow(n,t);if(!s)continue;return this.buildSessionDetail(n,s,r)}catch{}finally{n.close()}}return null}buildSessionDetail(t,r,n){let s=t.prepare("SELECT id, worktree, name FROM project WHERE id = ?").get(r.project_id),i=r.directory||s?.worktree||"(unknown)",o=t.prepare(`SELECT id, session_id, time_created, time_updated, data
1410
+ FROM message WHERE session_id = ? ORDER BY time_created ASC`).all(r.id),a=[],l=0,c,d,u;for(let f of o){let m;try{m=JSON.parse(f.data)}catch{continue}c||(c=m.model?.modelID||m.modelID);let p=m.model?.modelID||m.modelID,h=new Date(m.time?.created||f.time_created),g=t.prepare("SELECT id, data FROM part WHERE message_id = ? ORDER BY time_created ASC").all(f.id);if(m.role==="user"){let _=this.extractText(g);_&&(d||(d=J(_,80)),u=J(_,80)),a.push({role:"user",timestamp:h,content:_||"(empty)"}),l++}else if(m.role==="assistant"){for(let _ of g){let y;try{y=JSON.parse(_.data)}catch{continue}y.type==="text"&&y.text?a.push({role:"assistant",timestamp:h,content:y.text,model:p}):y.type==="reasoning"&&y.text?a.push({role:"thinking",timestamp:h,content:y.text}):y.type==="tool"&&y.tool&&(a.push({role:"tool_use",timestamp:h,content:`${y.tool}`,toolName:y.tool,toolCallId:y.callID,toolInput:y.state?.input?JSON.stringify(y.state.input):void 0}),(y.state?.output||y.state?.error)&&a.push({role:"tool_result",timestamp:h,content:y.state.error||y.state.output||"",toolCallId:y.callID}))}l++}}return{provider:this.name,sessionId:r.id,slug:r.slug,cwd:i,createdAt:new Date(r.time_created),modifiedAt:new Date(r.time_updated),model:c,startCommand:this.startCommand,firstUserMessage:d,lastUserMessage:u,messageCount:l,filePath:n,messages:a}}extractText(t){let r=[];for(let n of t){let s;try{s=JSON.parse(n.data)}catch{continue}s.type==="text"&&s.text&&r.push(s.text)}return r.join(`
1411
1411
  `).trim()}async resolveSessionPath(t){for(let r of this.existingDbPaths()){let n=this.openDb(r);if(n)try{if(this.findSessionRow(n,t))return r}catch{}finally{n.close()}}return null}async deleteSession(t){for(let r of this.existingDbPaths()){let n=new(Up())(r,{open:!0});try{let s=this.findSessionRow(n,t);if(!s)continue;return n.prepare("DELETE FROM session WHERE id = ?").run(s.id).changes>0}catch{}finally{n.close()}}return!1}findSessionRow(t,r){let n=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1412
1412
  s.time_created, s.time_updated
1413
1413
  FROM session s WHERE s.id = ?`).get(r);if(n)return n;let s=t.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
@@ -1415,12 +1415,12 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1415
1415
  FROM session s
1416
1416
  WHERE s.id LIKE ?
1417
1417
  ORDER BY s.time_updated DESC
1418
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Yl(){return new Kl}var Kl,zl=E(()=>{"use strict";Vl();Ut();xr();St();Kl=class extends xe{constructor(){super({provider:new rn,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",ge],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,r)=>en(t,{...r,acpTool:"opencode"})})}seedArgsFor(t){let r=["run"];return t?.model&&r.push("--model",t.model),t?.effort&&r.push("--variant",t.effort),r.push(t?.prompt??ge),r}}});import{spawn as LN}from"node:child_process";import{mkdirSync as ON}from"node:fs";function Ql(e){return new Zl(e)}async function $N(e,t){let r=Date.now(),n=Wp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});lt("lmplayer",n,t.permissionMode??"yolo");let s=await Bp(t.binary,n,{cwd:t.cwd,env:je(t.env,t.cwd,t.sessionId),signal:t.signal,onText:i=>{t.onProgress?.({kind:"text",summary:i.slice(0,120)}),t.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-r}}function Wp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...nr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Bp(e,t,r){return new Promise((n,s)=>{let i;try{i=LN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},_=g=>{let h=g.trim();if(!h)return;let y;try{y=JSON.parse(h)}catch{u.push(g),r.onText?.(g);return}if(!Ni(y))return;let T=Ii(y,!1);c===void 0&&T!==void 0&&(c=T),d=Ii(y,!0)??d;let b=qp(y);b&&(u.push(b),r.onText?.(b))};i.stdout?.on("data",g=>{let h=g.toString("utf8");o+=h,l+=h;let y=l.indexOf(`
1419
- `);for(;y>=0;){let T=l.slice(0,y);l=l.slice(y+1),_(T),y=l.indexOf(`
1420
- `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&_(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function qp(e){for(let t of["text","content","delta","output","message"]){let r=e[t];if(typeof r=="string")return r}for(let t of["data","event","payload","part"]){let r=e[t];if(Ni(r)){let n=qp(r);if(n)return n}}}function Ii(e,t){for(let n of["sessionID","sessionId","session_id"]){let s=e[n];if(typeof s=="string"&&s.length>0)return s}let r=e.session;if(typeof r=="string"&&r.length>0)return r;if(Ni(r)){let n=Ii(r,t);if(n!==void 0)return n}if(t){let n=e.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=e[n];if(Ni(s)){let i=Ii(s,t);if(i!==void 0)return i}}}function Ni(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Zl,ec=E(()=>{"use strict";Vl();Ut();St();Zr();at();Zl=class extends xe{constructor(t){super({provider:new rn({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:$N})}seedArgsFor(t){return Wp({prompt:t?.prompt??ge,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){ON(t,{recursive:!0});let n=this.seedArgsFor(r);lt("lmplayer",n);try{let s=await Bp(this.binary,n,{cwd:t,env:rr(void 0,t),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as xi,readFile as CN,rm as MN}from"node:fs/promises";import{basename as Hp,join as or}from"node:path";function Jp(e){return e.type==="user"||e.message?.role==="user"}function Xp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function Gp(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1418
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Yl(){return new Kl}var Kl,zl=E(()=>{"use strict";Vl();Ut();xr();St();Kl=class extends xe{constructor(){super({provider:new rn,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",ge],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(t,r)=>en(t,{...r,acpTool:"opencode"})})}seedArgsFor(t){let r=["run"];return t?.model&&r.push("--model",t.model),t?.effort&&r.push("--variant",t.effort),r.push(t?.prompt??ge),r}}});import{spawn as LN}from"node:child_process";import{mkdirSync as ON}from"node:fs";function Ql(e){return new Zl(e)}async function $N(e,t){let r=Date.now(),n=Wp({prompt:e,sessionId:t.sessionId,model:t.model,effort:t.effort,formatJson:!0,permissionMode:t.permissionMode??"yolo"});lt("lmplayer",n,t.permissionMode??"yolo");let s=await Bp(t.binary,n,{cwd:t.cwd,env:je(t.env,t.cwd,t.sessionId),signal:t.signal,onText:i=>{t.onProgress?.({kind:"text",summary:i.slice(0,120)}),t.onDelta?.(i)}});if(s.code!==0&&s.code!==null)throw new Error(s.stderr.trim().slice(0,200)||`lmplayer exited with code ${s.code}`);return{text:s.text.trim(),sessionId:s.sessionId??t.sessionId,durationMs:Date.now()-r}}function Wp(e){let t=["run"];return e.model&&t.push("--model",e.model),e.sessionId&&t.push("--session",e.sessionId),e.formatJson&&t.push("--format","json"),e.effort&&t.push("--effort",e.effort),t.push(...nr("lmplayer",e.permissionMode)??[]),t.push(e.prompt),t}function Bp(e,t,r){return new Promise((n,s)=>{let i;try{i=LN(e,t,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(g){s(g);return}let o="",a="",l="",c,d,u=[],f=!1,m=r.timeoutMs===void 0?void 0:setTimeout(()=>{f||(f=!0,i.kill(),p(),s(new Error(`lmplayer seed timed out after ${r.timeoutMs}ms`)))},r.timeoutMs),p=()=>{m!==void 0&&clearTimeout(m)},h=g=>{let _=g.trim();if(!_)return;let y;try{y=JSON.parse(_)}catch{u.push(g),r.onText?.(g);return}if(!Ni(y))return;let T=Ii(y,!1);c===void 0&&T!==void 0&&(c=T),d=Ii(y,!0)??d;let b=qp(y);b&&(u.push(b),r.onText?.(b))};i.stdout?.on("data",g=>{let _=g.toString("utf8");o+=_,l+=_;let y=l.indexOf(`
1419
+ `);for(;y>=0;){let T=l.slice(0,y);l=l.slice(y+1),h(T),y=l.indexOf(`
1420
+ `)}}),i.stderr?.on("data",g=>{a+=g.toString("utf8")}),r.signal&&(r.signal.aborted?i.kill():r.signal.addEventListener("abort",()=>i.kill(),{once:!0})),i.on("exit",g=>{f||(f=!0,p(),l.length>0&&h(l),n({code:g,stdout:o,stderr:a,sessionId:c??d,text:u.join("")}))}),i.on("error",g=>{f||(f=!0,p(),s(g))})})}function qp(e){for(let t of["text","content","delta","output","message"]){let r=e[t];if(typeof r=="string")return r}for(let t of["data","event","payload","part"]){let r=e[t];if(Ni(r)){let n=qp(r);if(n)return n}}}function Ii(e,t){for(let n of["sessionID","sessionId","session_id"]){let s=e[n];if(typeof s=="string"&&s.length>0)return s}let r=e.session;if(typeof r=="string"&&r.length>0)return r;if(Ni(r)){let n=Ii(r,t);if(n!==void 0)return n}if(t){let n=e.id;if(typeof n=="string"&&n.length>0)return n}for(let n of["data","event","payload","part"]){let s=e[n];if(Ni(s)){let i=Ii(s,t);if(i!==void 0)return i}}}function Ni(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Zl,ec=E(()=>{"use strict";Vl();Ut();St();Zr();at();Zl=class extends xe{constructor(t){super({provider:new rn({providerName:"lmplayer",startCommand:"lmplayer",dbPath:t?.lmplayerDbPath}),capabilities:{canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!0},injection:{leaderMode:"none"},binary:"lmplayer",seedArgs:["run","--format","json","--dangerously-skip-permissions",ge],resumeTemplate:"lmplayer run --session {{session_id}} --dangerously-skip-permissions",startTemplate:"lmplayer run --dangerously-skip-permissions",transport:$N})}seedArgsFor(t){return Wp({prompt:t?.prompt??ge,model:t?.model,effort:t?.effort,formatJson:!0,permissionMode:"yolo"})}async seed(t,r){ON(t,{recursive:!0});let n=this.seedArgsFor(r);lt("lmplayer",n);try{let s=await Bp(this.binary,n,{cwd:t,env:rr(void 0,t),timeoutMs:6e4});return s.code!==0&&s.code!==null?{success:!1,error:s.stderr.trim().slice(0,200)||`exit code ${s.code}`}:s.sessionId?{success:!0,sessionId:s.sessionId}:{success:!1,error:"lmplayer seed failed; provider did not report a sessionID"}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}manualSeedHint(t){return{launchCommand:`cd ${t} && lmplayer run --format json --dangerously-skip-permissions "${ge}"`,postLaunchNote:"Copy the sessionID reported by lmplayer into this member's sessionid= field.",lsCommand:`lmctl ls --provider lmplayer --sessiondir ${t}`}}}});import{readdir as xi,readFile as CN,rm as MN}from"node:fs/promises";import{basename as Hp,join as or}from"node:path";function Jp(e){return e.type==="user"||e.message?.role==="user"}function Xp(e){return e.type==="assistant"||e.message?.role==="assistant"||e.message?.role==="model"}function Gp(e){let t=e.message;return t?typeof t.content=="string"?t.content:Array.isArray(t.content)?t.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1421
1421
  `):Array.isArray(t.parts)?t.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1422
- `):"":""}function Vp(e){return e.model||e.message?.model}var Ai,Kp=E(()=>{"use strict";tr();Ai=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||or(Se,".qwen")}async discoverSessions(){let t=or(this.baseDir,"projects"),r;try{r=await xi(t)}catch{return[]}let n=[];for(let s of r){let i=or(t,s,"chats"),o;try{o=await xi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=or(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await Me(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Jp(u)){let f=Gp(u).trim();f&&(l||(l=J(f,80)),c=J(f,80)),d++}if(Xp(u)){let f=Vp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Hp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(t,r){let n=await Ne(t),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of He(t)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Jp(f)){let _=Gp(f);_.trim()&&(c||(c=J(_.trim(),80)),d=J(_.trim(),80)),u.push({role:"user",timestamp:p,content:_})}else if(Xp(f)){let _=Vp(f);if(_&&(i=_),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:_}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:_});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let h=g.thinking||g.text;h&&u.push({role:"thinking",timestamp:p,content:h})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:_})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=or(this.baseDir,"projects");try{let n=await xi(r),s=[];for(let i of n){let o=or(r,i,"chats",`${t}.jsonl`);try{return await CN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=or(r,i,"chats"),a;try{a=await xi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Hp(l,".jsonl").startsWith(t)&&s.push(or(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await MN(r),!0}catch{return!1}}}});function rc(){return new tc}var tc,nc=E(()=>{"use strict";Kp();Ut();xr();St();tc=class extends xe{constructor(){super({provider:new Ai,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:yi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as Yp,readFile as jN,rm as zp,stat as Zp}from"node:fs/promises";import{basename as sc,join as qt}from"node:path";async function DN(e){let t=await Promise.all(e.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...t.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(r=>r.modifiedAt.getTime())))}}function PN(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Qp(e){return e.type==="USER_INPUT"}function eh(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function FN(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function th(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function rh(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function UN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function WN(e){for await(let t of He(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=BN(s);if(i)return i}let n=qN(t.content);if(n)return n}return null}function BN(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=t.Cwd??t.cwd??t.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function qN(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function nh(e){if(e.endsWith(".db"))return sc(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var Ri,sh=E(()=>{"use strict";tr();Ri=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||qt(Se,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=qt(this.baseDir,"conversations"),r;try{r=await Yp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=sc(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return qt(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return qt(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Zp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await DN([r,n].filter(Boolean)),o=await this.resolveCwd(t,n),a,l,c,d=0;if(n){let u=await Me(n,80);for(let f of u){let m=rh(f.content);if(m&&(a=m),Qp(f)){let p=th(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else eh(f)&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=nh(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of He(i)){let u=PN(d.created_at,s.modifiedAt),f=rh(d.content);if(f&&(a=f),Qp(d)){let m=th(d.content),p=m.trim();p&&(l||(l=J(p,80)),c=J(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:UN(m.args),toolName:m.name||"tool"});eh(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):FN(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(t){let r=this.conversationPath(t);try{return await Zp(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let i of await Yp(n)){if(!i.endsWith(".db"))continue;sc(i,".db").startsWith(t)&&s.push(qt(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;let n=nh(r);return n?(await zp(this.conversationPath(n),{force:!0}),await zp(qt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,r){let n=await this.cwdFromLastConversationCache(t);if(n)return n;if(r){let s=await WN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await jN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as HN}from"node:child_process";function oc(e){return new ic(e)}async function JN(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",GN(t.timeoutMs)];t.model&&n.push("--model",t.model),lt("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await XN(t.binary,n,{cwd:t.cwd,env:je(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-r}}function XN(e,t,r){return new Promise((n,s)=>{let i;try{i=HN(e,t,{cwd:r.cwd,env:r.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(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function GN(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var ic,ac=E(()=>{"use strict";sh();Ut();St();at();Zr();ic=class extends xe{constructor(t){super({provider:new Ri(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:JN})}seedArgsFor(t){let r=[...super.seedArgsFor(t)];return t?.model&&r.push("--model",t.model),r}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as VN}from"node:crypto";import{existsSync as KN,mkdirSync as YN,readFileSync as zN,renameSync as ZN,writeFileSync as QN}from"node:fs";import{dirname as ch,join as ih,resolve as lc}from"node:path";function ex(e){return VN("sha256").update(e).digest("hex").slice(0,8)}function tx(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function rx(e,t){let r=t?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function dh(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Li(e){return Math.max(1,Math.ceil(e.length/4))}function sn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return lc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?ih(ch(lc(r)),".lmctl-claude-mock","sessions.json"):ih(lc(e),".lmctl-claude-mock","sessions.json")}function oh(){return{schemaVersion:1,sessions:{}}}function os(e){if(!KN(e))return oh();try{let t=JSON.parse(zN(e,"utf8")),r=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},n=typeof t.script=="object"&&t.script!==null?t.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return oh()}}function uh(e,t){YN(ch(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;QN(r,`${JSON.stringify(t,null,2)}
1423
- `,"utf8"),ZN(r,e)}function nx(e){return{...e,timestamp:e.timestamp.toISOString()}}function sx(e){return{...e,timestamp:new Date(e.timestamp)}}function ix(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(nx)}}function fh(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(sx)}}function Oi(e,t=process.cwd()){let r=nn.get(e);if(r!==void 0)return r;let s=os(sn(t)).sessions[e];if(s===void 0)return;let i=fh(s);return nn.set(i.sessionId,i),i}function ah(e){nn.set(e.sessionId,e);let t=sn(e.cwd),r=os(t);r.sessions[e.sessionId]=ix({...e,filePath:t}),uh(t,r)}function ox(){let e=os(sn()),t=Object.values(e.sessions).map(fh);for(let r of t)nn.set(r.sessionId,r);return t}function ax(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[dh(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function lh(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function uc(){return new dc}var nn,cc,dc,fc=E(()=>{"use strict";nn=new Map;cc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of ox())t.set(r.sessionId,r);for(let r of nn.values())t.set(r.sessionId,r);return[...t.values()].map(lh)}async loadSession(t){let r=Oi(t);return r===void 0?null:{...lh(r),messages:r.messages.slice()}}async resolveSessionPath(t){return Oi(t)?.filePath??null}async deleteSession(t){let r=nn.delete(t),n=sn(),s=os(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&uh(n,s),r||i}},dc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new cc;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,r){let n=tx(rx(t,r)),s=`mock-${n}-${ex(`${t}:${n}`)}`,i=new Date,o=sn(t),a=Oi(s,t),l=r?.prompt??"ClaudeMock seed",c=Li(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Li("ACK: ClaudeMock seeded"),ah(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=Oi(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=os(sn(r.cwd)),a=ax(t,o)??`ClaudeMock ack: ${dh(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Li(t),s.totalOutputTokens+=Li(a),ah(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function vt(e){let t=[Cl({claudeDir:e?.claudeDir}),Dl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Bl({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Jl({copilotDir:e?.copilotDir}),Yl(),Ql({lmplayerDbPath:e?.lmplayerDbPath}),rc(),oc({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(uc()),t}var mc=E(()=>{"use strict";Ml();Pl();ql();Xl();zl();ec();nc();ac();fc();Ml();Pl();ql();Xl();zl();ec();nc();ac();fc()});var gc={};Ee(gc,{ProviderRegistry:()=>Zn,TransportConnectionError:()=>ye,TransportError:()=>et,TransportJsonError:()=>ui,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>lx,chat:()=>kt,countTokens:()=>_c,createAdapterRegistry:()=>bt,createAllAdapters:()=>vt,listSessions:()=>hc,seed:()=>pc});function Ci(){return $i===null&&($i=bt(vt())),$i}function lx(){$i=null}function ph(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function kt(e){let t=e.registry??Ci(),r=ph(t,e.provider),n={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode},s=await r.sendTurn(e.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function pc(e){let t=e.registry??Ci(),r=ph(t,e.provider),n=await mh(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await mh(t,e.provider,e.cwd),a=cx(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function mh(e,t,r){let n=await e.listAll({provider:t,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function cx(e,t){let r=[];for(let n of t.keys())e.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function hc(e={}){return(e.registry??Ci()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function _c(e){let r=await(e.registry??Ci()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var $i,It=E(()=>{"use strict";fl();mc();fl();mc();zr();$i=null});function dx(){return yc===null&&(yc=bt(vt())),yc}async function Mi(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await fx(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)on.delete(r),t.setMemberState(r,"idle");else{let o=ux(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function ux(e,t){if(!(e instanceof ve))return on.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let r=(on.get(t)??0)+1;return r>=3?(on.delete(t),"consecutive_timeouts"):(on.set(t,r),null)}return on.delete(t),null}async function fx(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=dx(),s;try{let d=await n.resolveSession(e.sessionid);if(!d)return Promise.reject(new ve("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,wc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${hh(d)}`,wc(e.sessionid,e.sessiondir,"unresolved")))}let i=wc(e.sessionid,e.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await kt({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new ve("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new ve("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):mx(d,i)}finally{a!==null&&clearTimeout(a)}}function wc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function hh(e){return e instanceof Error?e.message:String(e)}function mx(e,t){if(e instanceof ve)return e;if(e instanceof ye){let r=e.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,e.message,t):r?.code==="ENOENT"?new ve("enoent",null,e.message,t):new ve("other",null,e.message,t)}return e instanceof Wt?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof et?new ve("other",null,e.message,t):new ve("other",null,hh(e),t)}var ve,yc,on,ji=E(()=>{"use strict";It();ve=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},yc=null;on=new Map});function _h(){return Ec===null&&(Ec=bt(vt())),Ec}function hx(e,t){if(!px.test(e))return e;let r=t.getConfig(`workspace.${e}`);if(r===null||r.length===0)throw new Ie("other",null,`workspace has no mapping for ${e}; run \`lmctl workspace init\` (or set workspace.${e} in lmctl_config)`,["<library>","seed","--provider",e]);return r}async function Di(e){let t=hx(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await _x({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function _x(e){let t=e.member.provider,r=e.member.sessiondir,n=Tc("seed",r,t);try{let s=await pc({provider:t,cwd:r,registry:_h()});if(!s.success)throw yx(s.error,n);if(!s.sessionId)throw new Ie("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ie?s:bc(s,n)}}async function gh(e){return gx(e)}async function gx(e){let t=_h(),r=Tc("tokens",e.sessionid,"unresolved"),n;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new Ie("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Ie?i:bc(i,r)}let s=Tc("tokens",e.sessionid,n);try{let i=await _c({sessionId:e.sessionid,provider:n,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ie?i:bc(i,s)}}function Tc(e,t,r){return["<library>",e,t,"--provider",r]}function yx(e,t){let r=e??"";if(/\bENOENT\b/i.test(r))return new Ie("enoent",null,r,t);if(/timed?\s*out/i.test(r))return new Ie("timeout",null,r,t);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Ie("nonzero_exit",Number(n[1]),r,t)}return new Ie("other",null,r,t)}function bc(e,t){return e instanceof Ie?e:e instanceof ye?e.cause?.code==="ENOENT"?new Ie("enoent",null,e.message,t):new Ie("other",null,e.message,t):e instanceof Wt?new Ie("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new Ie("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof et?new Ie("other",null,e.message,t):new Ie("other",null,e instanceof Error?e.message:String(e),t)}var Ie,Ec,px,Sc=E(()=>{"use strict";It();Ie=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},Ec=null;px=/^provider[123]$/});function Pi(e){return Buffer.from(e,"utf8").toString("base64url")}function ls(e){return Buffer.from(e,"base64url").toString("utf8")}async function yh(e,t=r=>gh({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of wx(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function wh(e,t,r){let n=Eh(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new as(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Mi({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:Th(e,t,r)}}catch(s){throw e.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function vc(e,t,r){let n=Eh(e,t,r);if(n===null)throw new Error("session member not found");let s=await Di({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Th(e,t,r)}}function wx(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function Eh(e,t,r){let n=e.findTeamByName(t);if(n===null)return null;let s=e.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function Th(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var as,Fi=E(()=>{"use strict";ji();Sc();as=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function kc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??Tx(t),s=r-n,i=t.query(`
1422
+ `):"":""}function Vp(e){return e.model||e.message?.model}var Ai,Kp=E(()=>{"use strict";tr();Ai=class{name="qwen";baseDir;constructor(t){this.baseDir=t?.qwenDir||or(Se,".qwen")}async discoverSessions(){let t=or(this.baseDir,"projects"),r;try{r=await xi(t)}catch{return[]}let n=[];for(let s of r){let i=or(t,s,"chats"),o;try{o=await xi(i)}catch{continue}for(let a of o){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=or(i,a);try{let d=await this.extractSummary(c,l);d&&n.push(d)}catch{}}}return n}async extractSummary(t,r){let n=await Me(t,30);if(n.length===0)return null;let s=await Ne(t),i="(unknown)",o,a,l,c,d=0;for(let u of n){if(u.cwd&&(i=u.cwd,u.version&&(a=u.version)),u.type==="system"&&u.cwd&&(i=u.cwd,u.version&&(a=u.version),u.model&&(o=u.model)),Jp(u)){let f=Gp(u).trim();f&&(l||(l=J(f,80)),c=J(f,80)),d++}if(Xp(u)){let f=Vp(u);f&&(o=f),d++}}return{provider:"qwen",sessionId:r,cwd:i,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:o,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:t}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=Hp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(t,r){let n=await Ne(t),s="(unknown)",i,o,a,l,c,d,u=[];for await(let f of He(t)){if(f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(o=f.version),f.model&&(i=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(Jp(f)){let h=Gp(f);h.trim()&&(c||(c=J(h.trim(),80)),d=J(h.trim(),80)),u.push({role:"user",timestamp:p,content:h})}else if(Xp(f)){let h=Vp(f);if(h&&(i=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?u.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&u.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")u.push({role:"assistant",timestamp:p,content:m.content,model:h});else if(Array.isArray(m.parts))for(let g of m.parts)if(g.thought||g.type==="thinking"){let _=g.thinking||g.text;_&&u.push({role:"thinking",timestamp:p,content:_})}else g.text&&u.push({role:"assistant",timestamp:p,content:g.text,model:h})}}return{provider:"qwen",sessionId:r,slug:l,cwd:s,createdAt:n.createdAt,modifiedAt:n.modifiedAt,model:i,cliVersion:o,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:d,messageCount:u.length,filePath:t,messages:u}}async resolveSessionPath(t){let r=or(this.baseDir,"projects");try{let n=await xi(r),s=[];for(let i of n){let o=or(r,i,"chats",`${t}.jsonl`);try{return await CN(o,{flag:"r"}),o}catch{continue}}for(let i of n){let o=or(r,i,"chats"),a;try{a=await xi(o)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;Hp(l,".jsonl").startsWith(t)&&s.push(or(o,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;try{return await MN(r),!0}catch{return!1}}}});function rc(){return new tc}var tc,nc=E(()=>{"use strict";Kp();Ut();xr();St();tc=class extends xe{constructor(){super({provider:new Ai,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",ge,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:yi})}seedArgsFor(t){let r=super.seedArgsFor(t);return t?.model?[...r,"--model",t.model]:r}}});import{readdir as Yp,readFile as jN,rm as zp,stat as Zp}from"node:fs/promises";import{basename as sc,join as qt}from"node:path";async function DN(e){let t=await Promise.all(e.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...t.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...t.map(r=>r.modifiedAt.getTime())))}}function PN(e,t){if(!e)return t;let r=new Date(e);return Number.isNaN(r.getTime())?t:r}function Qp(e){return e.type==="USER_INPUT"}function e_(e){return e.source==="MODEL"&&e.type==="PLANNER_RESPONSE"}function FN(e){return e.source==="MODEL"&&e.type!=="PLANNER_RESPONSE"}function t_(e){if(!e)return"";let t=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(e);return t?t[1]:e}function r_(e){if(!e)return;let t=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(e);if(t)return t[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function UN(e){if(e===void 0)return"";try{return JSON.stringify(e)}catch{return String(e)}}async function WN(e){for await(let t of He(e)){let r=t.tool_calls?.map(s=>s.args)??[];for(let s of r){let i=BN(s);if(i)return i}let n=qN(t.content);if(n)return n}return null}function BN(e){if(!e||typeof e!="object"||Array.isArray(e))return null;let t=e,r=t.Cwd??t.cwd??t.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function qN(e){return e?/"Cwd":"([^"]+)"/.exec(e)?.[1]??null:null}function n_(e){if(e.endsWith(".db"))return sc(e,".db");let t="/brain/",r=e.indexOf(t);return r===-1?null:e.slice(r+t.length).split("/")[0]||null}var Ri,s_=E(()=>{"use strict";tr();Ri=class{name="agy";baseDir;constructor(t={}){this.baseDir=t.agyDir||qt(Se,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:qt(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let t=qt(this.baseDir,"conversations"),r;try{r=await Yp(t)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let i=sc(s,".db");try{let o=await this.extractSummary(i);o&&n.push(o)}catch{}}return n}conversationPath(t){return qt(this.baseDir,"conversations",`${t}.db`)}transcriptPath(t){return qt(this.baseDir,"brain",t,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(t){let r=this.transcriptPath(t);try{return await Zp(r),r}catch{return null}}async extractSummary(t){let r=this.conversationPath(t),n=await this.existingTranscriptPath(t),s=n??r,i=await DN([r,n].filter(Boolean)),o=await this.resolveCwd(t,n),a,l,c,d=0;if(n){let u=await Me(n,80);for(let f of u){let m=r_(f.content);if(m&&(a=m),Qp(f)){let p=t_(f.content).trim();p&&(l||(l=J(p,80)),c=J(p,80)),d++}else e_(f)&&d++}}return{provider:"agy",sessionId:t,cwd:o,createdAt:i.createdAt,modifiedAt:i.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(t){let r=await this.resolveSessionPath(t);if(!r)return null;let n=n_(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let i=await this.existingTranscriptPath(n),o=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(i)for await(let d of He(i)){let u=PN(d.created_at,s.modifiedAt),f=r_(d.content);if(f&&(a=f),Qp(d)){let m=t_(d.content),p=m.trim();p&&(l||(l=J(p,80)),c=J(p,80)),o.push({role:"user",timestamp:u,content:m});continue}if(Array.isArray(d.tool_calls))for(let m of d.tool_calls)o.push({role:"tool_use",timestamp:u,content:UN(m.args),toolName:m.name||"tool"});e_(d)&&d.content?o.push({role:"assistant",timestamp:u,content:d.content,model:a}):FN(d)&&d.content&&o.push({role:"tool_result",timestamp:u,content:d.content,toolName:d.type?.toLowerCase()}),d.thinking&&o.push({role:"thinking",timestamp:u,content:d.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:o.length,messages:o}}async resolveSessionPath(t){let r=this.conversationPath(t);try{return await Zp(r),r}catch{}let n=qt(this.baseDir,"conversations");try{let s=[];for(let i of await Yp(n)){if(!i.endsWith(".db"))continue;sc(i,".db").startsWith(t)&&s.push(qt(n,i))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(t){let r=await this.resolveSessionPath(t);if(!r)return!1;let n=n_(r);return n?(await zp(this.conversationPath(n),{force:!0}),await zp(qt(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(t,r){let n=await this.cwdFromLastConversationCache(t);if(n)return n;if(r){let s=await WN(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(t){let r=qt(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await jN(r,"utf8"));for(let[s,i]of Object.entries(n))if(i===t)return s}catch{}return null}}});import{spawn as HN}from"node:child_process";function oc(e){return new ic(e)}async function JN(e,t){let r=Date.now(),n=["--conversation",t.sessionId,"-p",e,"--dangerously-skip-permissions","--print-timeout",GN(t.timeoutMs)];t.model&&n.push("--model",t.model),lt("agy",n,t.permissionMode??"yolo"),t.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await XN(t.binary,n,{cwd:t.cwd,env:je(t.env,t.cwd,t.sessionId),signal:t.signal});return t.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:t.sessionId,durationMs:Date.now()-r}}function XN(e,t,r){return new Promise((n,s)=>{let i;try{i=HN(e,t,{cwd:r.cwd,env:r.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(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}i.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),i.on("exit",(c,d)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:o,stderr:a});return}let u=d?`signal ${d}`:`exit code ${c}`,f=a.trim()||o.trim();s(new Error(`agy failed (${u})${f?`: ${f}`:""}`))})})}function GN(e){return!e||e<=0?"8h":`${Math.max(1,Math.ceil(e/1e3))}s`}var ic,ac=E(()=>{"use strict";s_();Ut();St();at();Zr();ic=class extends xe{constructor(t){super({provider:new Ri(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",ge,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:JN})}seedArgsFor(t){let r=[...super.seedArgsFor(t)];return t?.model&&r.push("--model",t.model),r}manualSeedHint(t){return{launchCommand:`cd ${t} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${t}`}}}});import{createHash as VN}from"node:crypto";import{existsSync as KN,mkdirSync as YN,readFileSync as zN,renameSync as ZN,writeFileSync as QN}from"node:fs";import{dirname as c_,join as i_,resolve as lc}from"node:path";function ex(e){return VN("sha256").update(e).digest("hex").slice(0,8)}function tx(e){let t=e.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"session"}function rx(e,t){let r=t?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:e.split(/[\\/]/).filter(Boolean).pop()??"session"}function d_(e){return e.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Li(e){return Math.max(1,Math.ceil(e.length/4))}function sn(e=process.cwd()){let t=process.env.LMCTL_CLAUDE_MOCK_STORE;if(t!==void 0&&t.trim().length>0)return lc(t);let r=process.env.LMCTL_DB;return r!==void 0&&r.trim().length>0?i_(c_(lc(r)),".lmctl-claude-mock","sessions.json"):i_(lc(e),".lmctl-claude-mock","sessions.json")}function o_(){return{schemaVersion:1,sessions:{}}}function os(e){if(!KN(e))return o_();try{let t=JSON.parse(zN(e,"utf8")),r=typeof t.sessions=="object"&&t.sessions!==null?t.sessions:{},n=typeof t.script=="object"&&t.script!==null?t.script:void 0;return{schemaVersion:1,sessions:r,...n!==void 0?{script:n}:{}}}catch{return o_()}}function u_(e,t){YN(c_(e),{recursive:!0});let r=`${e}.${process.pid}.${Date.now()}.tmp`;QN(r,`${JSON.stringify(t,null,2)}
1423
+ `,"utf8"),ZN(r,e)}function nx(e){return{...e,timestamp:e.timestamp.toISOString()}}function sx(e){return{...e,timestamp:new Date(e.timestamp)}}function ix(e){return{...e,createdAt:e.createdAt.toISOString(),modifiedAt:e.modifiedAt.toISOString(),messages:e.messages.map(nx)}}function f_(e){return{...e,createdAt:new Date(e.createdAt),modifiedAt:new Date(e.modifiedAt),messages:e.messages.map(sx)}}function Oi(e,t=process.cwd()){let r=nn.get(e);if(r!==void 0)return r;let s=os(sn(t)).sessions[e];if(s===void 0)return;let i=f_(s);return nn.set(i.sessionId,i),i}function a_(e){nn.set(e.sessionId,e);let t=sn(e.cwd),r=os(t);r.sessions[e.sessionId]=ix({...e,filePath:t}),u_(t,r)}function ox(){let e=os(sn()),t=Object.values(e.sessions).map(f_);for(let r of t)nn.set(r.sessionId,r);return t}function ax(e,t){let r=t.script;if(r===void 0)return;let n=r[e],s=r[d_(e)],i=n??s;if(typeof i=="string")return i;if(i!==void 0&&typeof i.text=="string")return i.text}function l_(e){return{provider:"ClaudeMock",sessionId:e.sessionId,cwd:e.cwd,createdAt:e.createdAt,modifiedAt:e.modifiedAt,messageCount:e.messages.length,filePath:e.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:e.totalInputTokens,totalOutputTokens:e.totalOutputTokens,lastTokenUsage:{totalTokens:e.totalInputTokens+e.totalOutputTokens}}}function uc(){return new dc}var nn,cc,dc,fc=E(()=>{"use strict";nn=new Map;cc=class{name="ClaudeMock";async discoverSessions(){let t=new Map;for(let r of ox())t.set(r.sessionId,r);for(let r of nn.values())t.set(r.sessionId,r);return[...t.values()].map(l_)}async loadSession(t){let r=Oi(t);return r===void 0?null:{...l_(r),messages:r.messages.slice()}}async resolveSessionPath(t){return Oi(t)?.filePath??null}async deleteSession(t){let r=nn.delete(t),n=sn(),s=os(n),i=s.sessions[t]!==void 0;return delete s.sessions[t],i&&u_(n,s),r||i}},dc=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new cc;discover(){return this.provider.discoverSessions()}load(t){return this.provider.loadSession(t)}resolvePath(t){return this.provider.resolveSessionPath(t)}delete(t){return this.provider.deleteSession(t)}getWatchPaths(){return[]}async seed(t,r){let n=tx(rx(t,r)),s=`mock-${n}-${ex(`${t}:${n}`)}`,i=new Date,o=sn(t),a=Oi(s,t),l=r?.prompt??"ClaudeMock seed",c=Li(l),d={sessionId:s,cwd:t,filePath:o,createdAt:a?.createdAt??i,modifiedAt:i,messages:a?.messages.slice()??[],totalInputTokens:a?.totalInputTokens??0,totalOutputTokens:a?.totalOutputTokens??0};return d.messages.push({role:"user",timestamp:i,content:l}),d.messages.push({role:"assistant",timestamp:i,content:"ACK: ClaudeMock seeded"}),d.totalInputTokens+=c,d.totalOutputTokens+=Li("ACK: ClaudeMock seeded"),a_(d),{success:!0,sessionId:s}}resumeCommand(t){return`ClaudeMock --resume ${t}`}startCommand(){return"ClaudeMock"}manualSeedHint(t){return{launchCommand:`cd ${t} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${t}`}}forkHint(t){return"ClaudeMock does not support fork."}async fork(t,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(t,r){let n=Date.now(),s=Oi(r.sessionId,r.cwd);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let i=new Date,o=os(sn(r.cwd)),a=ax(t,o)??`ClaudeMock ack: ${d_(t)}`;return s.messages.push({role:"user",timestamp:i,content:t}),s.messages.push({role:"assistant",timestamp:i,content:a,model:r.model??"claude-mock"}),s.modifiedAt=i,s.totalInputTokens+=Li(t),s.totalOutputTokens+=Li(a),a_(s),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:a,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function vt(e){let t=[Cl({claudeDir:e?.claudeDir}),Dl({codexDir:e?.codexDir,codeDir:e?.codeDir}),Bl({geminiDir:e?.geminiDir,claudeDir:e?.claudeDir,codexDir:e?.codexDir,codeDir:e?.codeDir}),Jl({copilotDir:e?.copilotDir}),Yl(),Ql({lmplayerDbPath:e?.lmplayerDbPath}),rc(),oc({agyDir:e?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&t.push(uc()),t}var mc=E(()=>{"use strict";Ml();Pl();ql();Xl();zl();ec();nc();ac();fc();Ml();Pl();ql();Xl();zl();ec();nc();ac();fc()});var gc={};Ee(gc,{ProviderRegistry:()=>Zn,TransportConnectionError:()=>ye,TransportError:()=>et,TransportJsonError:()=>ui,TransportProcessError:()=>Wt,TransportRpcError:()=>Bt,_resetDefaultRegistryForTests:()=>lx,chat:()=>kt,countTokens:()=>hc,createAdapterRegistry:()=>bt,createAllAdapters:()=>vt,listSessions:()=>_c,seed:()=>pc});function Ci(){return $i===null&&($i=bt(vt())),$i}function lx(){$i=null}function p_(e,t){let r=e.getAdapter(t);if(!r)throw new Error(`provider "${t}" is not registered in this registry`);return r}async function kt(e){let t=e.registry??Ci(),r=p_(t,e.provider),n={sessionId:e.sessionId,cwd:e.cwd,env:e.env,onDelta:e.onDelta,onProgress:e.onProgress,signal:e.signal,timeoutMs:e.timeoutMs,model:e.model,effort:e.effort,progPath:e.progPath,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode},s=await r.sendTurn(e.prompt,n);return{text:s.text,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason,numTurns:s.numTurns,status:s.status,stalledAfterMs:s.stalledAfterMs}}async function pc(e){let t=e.registry??Ci(),r=p_(t,e.provider),n=await m_(t,e.provider,e.cwd),s=await r.seed(e.cwd,{model:e.model,effort:e.effort,prompt:e.prompt}),i=s.warnings!==void 0&&s.warnings.length>0?{warnings:s.warnings}:{};if(!s.success)return{success:!1,error:s.error,...i};if(s.sessionId)return{success:!0,sessionId:s.sessionId,...i};let o=await m_(t,e.provider,e.cwd),a=cx(n,o);return a?{success:!0,sessionId:a,...i}:{success:!0,...i}}async function m_(e,t,r){let n=await e.listAll({provider:t,workspace:r}),s=new Map;for(let i of n)s.set(i.sessionId,i.modifiedAt);return s}function cx(e,t){let r=[];for(let n of t.keys())e.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function _c(e={}){return(e.registry??Ci()).listAll({provider:e.provider,workspace:e.workspace,limit:e.limit,from:e.from,to:e.to})}async function hc(e){let r=await(e.registry??Ci()).getSession(e.sessionId,e.provider);if(!r)throw new Error(`session "${e.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,i=r.totalCacheWriteInputTokens??0,o=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:i,output:o,reasoningOutput:a,total:n+s+i+o+a,lastTurn:r.lastTokenUsage}}var $i,It=E(()=>{"use strict";fl();mc();fl();mc();zr();$i=null});function dx(){return yc===null&&(yc=bt(vt())),yc}async function Mi(e){let{dal:t,team_member_id:r}=e,n=t!==void 0&&r!==void 0;n&&t.setMemberState(r,"in_chat");let s=!1,i;try{return await fx(e)}catch(o){throw s=!0,i=o,o}finally{if(n)if(!s)on.delete(r),t.setMemberState(r,"idle");else{let o=ux(i,r);t.setMemberState(r,o!==null?"attention_needed":"idle",o)}}}function ux(e,t){if(!(e instanceof ve))return on.delete(t),null;if(e.kind==="sessiondir_missing")return"sessiondir_missing";if(e.kind==="enoent")return"binary_missing";if(e.kind==="nonzero_exit"&&(e.exit_status===137||e.exit_status===139))return"oom_exit";if(e.kind==="timeout"){let r=(on.get(t)??0)+1;return r>=3?(on.delete(t),"consecutive_timeouts"):(on.set(t,r),null)}return on.delete(t),null}async function fx(e){let t=e.timeoutMs,r=typeof t=="number"&&t>0,n=dx(),s;try{let d=await n.resolveSession(e.sessionid);if(!d)return Promise.reject(new ve("other",null,`library: sessionid "${e.sessionid}" matched no registered provider`,wc(e.sessionid,e.sessiondir,"unresolved")));s=d.provider.name}catch(d){return Promise.reject(new ve("other",null,`library: session resolution failed: ${__(d)}`,wc(e.sessionid,e.sessiondir,"unresolved")))}let i=wc(e.sessionid,e.sessiondir,s),o=new AbortController,a=r?setTimeout(()=>o.abort(),t):null,l=!1;o.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let d=await kt({provider:s,sessionId:e.sessionid,cwd:e.sessiondir,prompt:e.prompt,timeoutMs:0,signal:o.signal,registry:n,onProgress:e.onProgress,permissionMode:e.permissionMode});if(d.status==="stalled")throw new ve("timeout",null,`library: stalled after ${d.stalledAfterMs??0}ms`,i);return{text:d.text,ms:Date.now()-c,exit_status:0,argv:i}}catch(d){throw l?new ve("timeout",null,`library: wall-clock timeout after ${t??0}ms`,i):mx(d,i)}finally{a!==null&&clearTimeout(a)}}function wc(e,t,r){return["<library>","chat",e,t,"--provider",r]}function __(e){return e instanceof Error?e.message:String(e)}function mx(e,t){if(e instanceof ve)return e;if(e instanceof ye){let r=e.cause;return r?.code==="ENOENT_CWD"?new ve("sessiondir_missing",null,e.message,t):r?.code==="ENOENT"?new ve("enoent",null,e.message,t):new ve("other",null,e.message,t)}return e instanceof Wt?new ve("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new ve("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof et?new ve("other",null,e.message,t):new ve("other",null,__(e),t)}var ve,yc,on,ji=E(()=>{"use strict";It();ve=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl chat failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},yc=null;on=new Map});function h_(){return Ec===null&&(Ec=bt(vt())),Ec}function _x(e,t){if(!px.test(e))return e;let r=t.getConfig(`workspace.${e}`);if(r===null||r.length===0)throw new Ie("other",null,`workspace has no mapping for ${e}; run \`lmctl workspace init\` (or set workspace.${e} in lmctl_config)`,["<library>","seed","--provider",e]);return r}async function Di(e){let t=_x(e.member.provider,e.dal),r=t===e.member.provider?e.member:{...e.member,provider:t},n=await hx({member:r});return e.dal.setMemberProviderResolved(e.member.id,t),{sessionid:n.sessionid,provider_resolved:t}}async function hx(e){let t=e.member.provider,r=e.member.sessiondir,n=Tc("seed",r,t);try{let s=await pc({provider:t,cwd:r,registry:h_()});if(!s.success)throw yx(s.error,n);if(!s.sessionId)throw new Ie("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof Ie?s:bc(s,n)}}async function g_(e){return gx(e)}async function gx(e){let t=h_(),r=Tc("tokens",e.sessionid,"unresolved"),n;try{let i=await t.resolveSession(e.sessionid);if(!i)throw new Ie("parse",0,`library: sessionid "${e.sessionid}" matched no registered provider`,r);n=i.provider.name}catch(i){throw i instanceof Ie?i:bc(i,r)}let s=Tc("tokens",e.sessionid,n);try{let i=await hc({sessionId:e.sessionid,provider:n,registry:t});return{input_tokens:i.input,cache_tokens:i.cachedInput+i.cacheWriteInput,output_tokens:i.output,total_tokens:i.total}}catch(i){throw i instanceof Ie?i:bc(i,s)}}function Tc(e,t,r){return["<library>",e,t,"--provider",r]}function yx(e,t){let r=e??"";if(/\bENOENT\b/i.test(r))return new Ie("enoent",null,r,t);if(/timed?\s*out/i.test(r))return new Ie("timeout",null,r,t);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new Ie("nonzero_exit",Number(n[1]),r,t)}return new Ie("other",null,r,t)}function bc(e,t){return e instanceof Ie?e:e instanceof ye?e.cause?.code==="ENOENT"?new Ie("enoent",null,e.message,t):new Ie("other",null,e.message,t):e instanceof Wt?new Ie("nonzero_exit",e.exitCode??null,e.stderr??e.message,t):e instanceof Bt?new Ie("nonzero_exit",e.rpcCode??null,e.message,t):e instanceof et?new Ie("other",null,e.message,t):new Ie("other",null,e instanceof Error?e.message:String(e),t)}var Ie,Ec,px,Sc=E(()=>{"use strict";It();Ie=class extends Error{kind;exit_status;stderr;argv;constructor(t,r,n,s){super(`lmctl seed failed: ${t}`),this.kind=t,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},Ec=null;px=/^provider[123]$/});function Pi(e){return Buffer.from(e,"utf8").toString("base64url")}function ls(e){return Buffer.from(e,"base64url").toString("utf8")}async function y_(e,t=r=>g_({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of wx(e)){let i=s.member.sessionid;if(i!==null)try{let o=await t(i);e.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:i,...o}),r+=1}catch(o){n+=1;try{e.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:i,error:o instanceof Error?o.message:String(o)})})}catch{}}}return{recorded:r,failed:n}}async function w_(e,t,r){let n=E_(e,t,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new as(r,n.member.state);e.setMemberState(n.member.id,"in_chat","compacting");try{return await Mi({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),e.setMemberState(n.member.id,"idle",null),{ok:!0,row:T_(e,t,r)}}catch(s){throw e.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function vc(e,t,r){let n=E_(e,t,r);if(n===null)throw new Error("session member not found");let s=await Di({member:n.member,dal:e});return e.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:T_(e,t,r)}}function wx(e){return e.listTeams().flatMap(t=>e.listTeamMembers(t.id).filter(r=>r.sessionid!==null).map(r=>({team_name:t.name,member:r})))}function E_(e,t,r){let n=e.findTeamByName(t);if(n===null)return null;let s=e.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function T_(e,t,r){return e.sessionSizeHistory(t,r,1)[0]??null}var as,Fi=E(()=>{"use strict";ji();Sc();as=class extends Error{constructor(t,r){super(`member ${t} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function kc(e){let t=e.dal,r=e.nowMs??Date.now(),n=e.thresholdMs??Tx(t),s=r-n,i=t.query(`
1424
1424
  SELECT
1425
1425
  isess.id AS interactive_session_id,
1426
1426
  isess.run_id,
@@ -1446,16 +1446,16 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1446
1446
  JOIN step s ON s.id = isess.step_id
1447
1447
  WHERE isess.status = 'waiting_agent'
1448
1448
  AND r.terminal_state IS NULL
1449
- `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=vx(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=bx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:qe(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,Sx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function Tx(e){return bh(e.getConfig(Ui),Ex)*1e3}function Ic(e,t){return bh(e.getConfig(Wi),t)}function bh(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function bx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function Sx(e,t,r,n){return e.query(`SELECT * FROM attention
1449
+ `),o={scanned:i.length,hung_detected:0,attentions_created:0,duplicates_suppressed:0};for(let a of i){let l=vx(a.workflow_definition,a.session_state_name,a.step_state_name);if(l===null)continue;let c=bx(t,a.team_id,l);if(c===null||c.sessionid===null)continue;let d=c.alias.toLowerCase()!=="lead",u=a.last_activity_at<s&&(a.last_event_at===null||a.last_event_at<s),f=a.started_at<s;if(!d||!u||!f)continue;let m={session_id:c.sessionid,step_id:a.step_id,member_alias:c.alias,provider:qe(c),last_activity_at:a.last_activity_at,elapsed_ms:r-a.started_at,session_state:a.session_status,factors:{leaf:!0,no_activity:!0,elapsed:!0}};if(o.hung_detected+=1,Sx(t,a.run_id,a.step_id,c.sessionid)){o.duplicates_suppressed+=1;continue}let p={run_id:a.run_id,project_id:a.project_id,payload:m};t.raiseAttention({kind:"session_hung",severity:"warn",project_id:a.project_id,run_id:a.run_id,requires_user:!0,payload:JSON.stringify(m)}),o.attentions_created+=1,e.enableKillHook===!0&&e.killHook!==void 0&&await e.killHook(p)}return o}function Tx(e){return b_(e.getConfig(Ui),Ex)*1e3}function Ic(e,t){return b_(e.getConfig(Wi),t)}function b_(e,t){if(e===null||e.trim().length===0)return t;let r=Number(e);return Number.isFinite(r)&&r>0?Math.floor(r):t}function bx(e,t,r){return e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,r)[0]??null}function Sx(e,t,r,n){return e.query(`SELECT * FROM attention
1450
1450
  WHERE kind = 'session_hung'
1451
1451
  AND run_id = ?
1452
- AND acknowledged_at IS NULL`,t).some(i=>{let o=Sh(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function vx(e,t,r){let n=Sh(e);return n===null?null:kx(n,t,r)??Ix(n,t,r)}function kx(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(Nx),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Lr(s.members)?s.members:null,o=i!==null&&Lr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function Ix(e,t,r){if(!Lr(e.states))return null;let n=e.states[t]??e.states[r];if(!Lr(n))return null;let s=n;if(!Lr(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function Nx(e){return Lr(e)}function Sh(e){if(e===null)return null;try{let t=JSON.parse(e);return Lr(t)?t:null}catch{return null}}function Lr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Ui,Wi,Ex,Nc=E(()=>{"use strict";Qe();Ui="monitor.session_hung.elapsed_threshold_seconds",Wi="monitor.session_hung.check_interval_ms",Ex=600});function qi(e){let t=e.query(`
1452
+ AND acknowledged_at IS NULL`,t).some(i=>{let o=S_(i.payload);return o!==null&&o.step_id===r&&o.session_id===n})}function vx(e,t,r){let n=S_(e);return n===null?null:kx(n,t,r)??Ix(n,t,r)}function kx(e,t,r){if(!Array.isArray(e.steps))return null;let n=e.steps.filter(Nx),s=n.find(a=>a.id===t)??n.find(a=>a.name===t)??n.find(a=>a.name===r);if(s===void 0||s.type!=="lmctl/interactive")return null;let i=Lr(s.members)?s.members:null,o=i!==null&&Lr(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}function Ix(e,t,r){if(!Lr(e.states))return null;let n=e.states[t]??e.states[r];if(!Lr(n))return null;let s=n;if(!Lr(s.agent))return null;let i=s.agent;return typeof i.alias=="string"?i.alias:null}function Nx(e){return Lr(e)}function S_(e){if(e===null)return null;try{let t=JSON.parse(e);return Lr(t)?t:null}catch{return null}}function Lr(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Ui,Wi,Ex,Nc=E(()=>{"use strict";Qe();Ui="monitor.session_hung.elapsed_threshold_seconds",Wi="monitor.session_hung.check_interval_ms",Ex=600});function qi(e){let t=e.query(`
1453
1453
  SELECT status, COUNT(*) AS count FROM job GROUP BY status
1454
1454
  `),r={queued:Bi(t,"queued"),running:Bi(t,"running"),done:Bi(t,"done"),failed:Bi(t,"failed"),total:Ac(t)},n=e.query(`
1455
1455
  SELECT terminal_state, COUNT(*) AS count FROM run GROUP BY terminal_state
1456
1456
  `),s=e.query(`
1457
1457
  SELECT acknowledged_at, COUNT(*) AS count FROM attention GROUP BY acknowledged_at IS NOT NULL
1458
- `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:Ac(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:Ac(s)},projects:xc(e,"project"),teams:xc(e,"team"),workflows:xc(e,"workflow")}}function Hi(e){return e.listProjects()}function Ih(e){return e.listTeams().map(t=>({...t,members:e.listTeamMembers(t.id)}))}function Ji(e){return e.query(`
1458
+ `);return{generated_at:new Date().toISOString(),jobs:r,runs:{active:n.filter(i=>i.terminal_state===null).reduce((i,o)=>i+o.count,0),terminal:n.filter(i=>i.terminal_state!==null).reduce((i,o)=>i+o.count,0),total:Ac(n)},attentions:{unacked:s.filter(i=>i.acknowledged_at===null).reduce((i,o)=>i+o.count,0),total:Ac(s)},projects:xc(e,"project"),teams:xc(e,"team"),workflows:xc(e,"workflow")}}function Hi(e){return e.listProjects()}function I_(e){return e.listTeams().map(t=>({...t,members:e.listTeamMembers(t.id)}))}function Ji(e){return e.query(`
1459
1459
  SELECT w.*
1460
1460
  FROM workflow w
1461
1461
  JOIN (
@@ -1464,10 +1464,10 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1464
1464
  GROUP BY name
1465
1465
  ) latest ON latest.name = w.name AND latest.version = w.version
1466
1466
  ORDER BY w.name ASC
1467
- `)}function Nh(e,t={}){return t.status!==void 0?e.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",t.status):e.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function xh(e,t={}){if(t.pr_url!==void 0){let r=e.findSubmittedPrByUrl(t.pr_url);return r===null?[]:[r]}return e.listSubmittedPrs({status:t.status})}function Ah(e,t){return e.getSubmittedPr(t)}function Xi(e,t){return e.query("SELECT * FROM job WHERE id = ?",t)[0]??null}function an(e,t={}){return e.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",t.limit??100)}function Or(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];return r===void 0?null:{...r,job:Xi(e,r.job_id),workflow:e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:e.getTeam(r.team_id),steps:xx(e,r.id)}}function xx(e,t){return e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t).map(r=>({...r,artifacts:Rh(e,r.id)}))}function Rc(e,t,r){let n=e.query("SELECT * FROM step WHERE run_id = ? AND id = ?",t,r)[0];return n===void 0?null:{...n,artifacts:Rh(e,n.id)}}function Rh(e,t){return e.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",t)}function $r(e,t,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?e.query(n,t):e.query(n,t,r)}function Lh(e,t,r){let n=Rc(e,t,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function Oh(e,t={}){return t.type!==void 0?e.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",t.type):e.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function $h(e,t={}){return t.unhandled===!0?e.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function lr(e,t={}){return t.unacked===!0?e.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function Gi(e,t={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return t.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),t.project!==void 0&&(n+=" AND p.name = ?",r.push(t.project)),t.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(t.since)),e.query(`${Ch}
1467
+ `)}function N_(e,t={}){return t.status!==void 0?e.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",t.status):e.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function x_(e,t={}){if(t.pr_url!==void 0){let r=e.findSubmittedPrByUrl(t.pr_url);return r===null?[]:[r]}return e.listSubmittedPrs({status:t.status})}function A_(e,t){return e.getSubmittedPr(t)}function Xi(e,t){return e.query("SELECT * FROM job WHERE id = ?",t)[0]??null}function an(e,t={}){return e.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",t.limit??100)}function Or(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];return r===void 0?null:{...r,job:Xi(e,r.job_id),workflow:e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:e.getTeam(r.team_id),steps:xx(e,r.id)}}function xx(e,t){return e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t).map(r=>({...r,artifacts:R_(e,r.id)}))}function Rc(e,t,r){let n=e.query("SELECT * FROM step WHERE run_id = ? AND id = ?",t,r)[0];return n===void 0?null:{...n,artifacts:R_(e,n.id)}}function R_(e,t){return e.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",t)}function $r(e,t,r){let n=r===void 0?"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? ORDER BY sa.id ASC":"SELECT sa.*, s.state_name FROM step_artifact sa JOIN step s ON sa.step_id = s.id WHERE s.run_id = ? AND sa.kind = ? ORDER BY sa.id ASC";return r===void 0?e.query(n,t):e.query(n,t,r)}function L_(e,t,r){let n=Rc(e,t,r);return n===null?null:(n.artifacts.find(i=>i.kind===`${n.state_name}_transcript`)??n.artifacts.find(i=>i.content!==null))?.content??null}function O_(e,t={}){return t.type!==void 0?e.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",t.type):e.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function $_(e,t={}){return t.unhandled===!0?e.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function lr(e,t={}){return t.unacked===!0?e.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):e.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function Gi(e,t={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return t.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),t.project!==void 0&&(n+=" AND p.name = ?",r.push(t.project)),t.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(t.since)),e.query(`${C_}
1468
1468
  WHERE ${n}
1469
- ORDER BY a.created_at DESC`,...r).map(Mh)}function Nt(e,t){let n=e.query(`${Ch}
1470
- WHERE a.id = ?`,t)[0];return n===void 0?null:Mh(n)}function Mh(e){let{payload_json:t,...r}=e,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(t==null)return n;let s;try{s=JSON.parse(t)}catch{return n}if(s===null||typeof s!="object")return n;let i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function jh(e){return e.query(`
1469
+ ORDER BY a.created_at DESC`,...r).map(M_)}function Nt(e,t){let n=e.query(`${C_}
1470
+ WHERE a.id = ?`,t)[0];return n===void 0?null:M_(n)}function M_(e){let{payload_json:t,...r}=e,n={...r,node_path:null,expected_response:null,transcript_tail:null,paused_at:null,created_run_inputs:null,workflow_version_id:null,workflow_step:null,escalation_tier:null,escalation_token:null,escalation_reason:null,declared_outcomes:null,agent_output:null};if(t==null)return n;let s;try{s=JSON.parse(t)}catch{return n}if(s===null||typeof s!="object")return n;let i=s;if(Array.isArray(i.node_path)&&i.node_path.every(o=>typeof o=="string")&&(n.node_path=i.node_path),i.expected_response!==null&&typeof i.expected_response=="object"){let o=i.expected_response;if(typeof o.kind=="string"){let a=Array.isArray(o.choices)&&o.choices.every(l=>typeof l=="string")?o.choices:null;n.expected_response={kind:o.kind,choices:a}}}if(Array.isArray(i.transcript_tail)&&i.transcript_tail.every(o=>typeof o=="string")&&(n.transcript_tail=i.transcript_tail),typeof i.paused_at=="string"&&(n.paused_at=i.paused_at),i.created_run_inputs!==null&&typeof i.created_run_inputs=="object"&&!Array.isArray(i.created_run_inputs)&&(n.created_run_inputs=i.created_run_inputs),typeof i.workflow_version_id=="number"?n.workflow_version_id=i.workflow_version_id:i.workflow_version_id===null&&(n.workflow_version_id=null),i.step!==null&&typeof i.step=="object"&&!Array.isArray(i.step)){let o=i.step;typeof o.id=="string"&&o.id.length>0&&(n.workflow_step={id:o.id,name:typeof o.name=="string"?o.name:null,type:typeof o.type=="string"?o.type:null})}return typeof i.tier=="string"&&(n.escalation_tier=i.tier),typeof i.token=="string"&&(n.escalation_token=i.token),typeof i.reason=="string"&&(n.escalation_reason=i.reason),Array.isArray(i.declared_outcomes)&&i.declared_outcomes.every(o=>typeof o=="string")&&(n.declared_outcomes=i.declared_outcomes),typeof i.agent_output=="string"&&(n.agent_output=i.agent_output),n}function j_(e){return e.query(`
1471
1471
  SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
1472
1472
  FROM run r
1473
1473
  JOIN workflow w ON w.id = r.workflow_id
@@ -1490,14 +1490,14 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1490
1490
  JOIN job j ON j.id = r.job_id
1491
1491
  WHERE j.project_id = ? AND s.ended_at IS NULL
1492
1492
  ${n!==null?"AND r.started_at >= ?":""}
1493
- GROUP BY s.state_name`,...f),p=new Map;for(let T of u){let b=p.get(T.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},I=T.duration_ms;I<3e5?b.lt5++:I<9e5?b.btw5_15++:I<36e5?b.btw15_60++:b.gt60++,p.set(T.state_name,b)}for(let T of m){let b=p.get(T.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};b.noEnd+=T.cnt,p.set(T.state_name,b)}let _=[...p.entries()].map(([T,b])=>({state_name:T,lt_5min:b.lt5,btw_5_15min:b.btw5_15,btw_15_60min:b.btw15_60,gt_60min:b.gt60,no_end:b.noEnd})),g=e.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1493
+ GROUP BY s.state_name`,...f),p=new Map;for(let T of u){let b=p.get(T.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0},I=T.duration_ms;I<3e5?b.lt5++:I<9e5?b.btw5_15++:I<36e5?b.btw15_60++:b.gt60++,p.set(T.state_name,b)}for(let T of m){let b=p.get(T.state_name)??{lt5:0,btw5_15:0,btw15_60:0,gt60:0,noEnd:0};b.noEnd+=T.cnt,p.set(T.state_name,b)}let h=[...p.entries()].map(([T,b])=>({state_name:T,lt_5min:b.lt5,btw_5_15min:b.btw5_15,btw_15_60min:b.btw15_60,gt_60min:b.gt60,no_end:b.noEnd})),g=e.query(`SELECT s.state_name, s.run_id, COUNT(*) AS attempt_count
1494
1494
  FROM step s
1495
1495
  JOIN run r ON r.id = s.run_id
1496
1496
  JOIN job j ON j.id = r.job_id
1497
1497
  WHERE j.project_id = ?
1498
1498
  ${n!==null?"AND r.started_at >= ?":""}
1499
1499
  GROUP BY s.run_id, s.state_name
1500
- HAVING COUNT(*) > 1`,...s),h=new Map;for(let T of g){let b=h.get(T.state_name)??{runs:0,total_attempts:0};b.runs++,b.total_attempts+=T.attempt_count,h.set(T.state_name,b)}let y=[...h.entries()].map(([T,b])=>({state_name:T,retried_runs:b.runs,avg_retries:b.runs>0?Number((b.total_attempts/b.runs).toFixed(2)):0}));return{request_changes_rate:d,step_duration_histogram:_,retry_counts:y}}function Oc(e,t={}){let r=t.since_days!==void 0?Date.now()-Math.trunc(t.since_days)*864e5:0,n=t.project_id!==void 0?e.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1500
+ HAVING COUNT(*) > 1`,...s),_=new Map;for(let T of g){let b=_.get(T.state_name)??{runs:0,total_attempts:0};b.runs++,b.total_attempts+=T.attempt_count,_.set(T.state_name,b)}let y=[..._.entries()].map(([T,b])=>({state_name:T,retried_runs:b.runs,avg_retries:b.runs>0?Number((b.total_attempts/b.runs).toFixed(2)):0}));return{request_changes_rate:d,step_duration_histogram:h,retry_counts:y}}function Oc(e,t={}){let r=t.since_days!==void 0?Date.now()-Math.trunc(t.since_days)*864e5:0,n=t.project_id!==void 0?e.query(`SELECT json_extract(se.payload, '$.tool') AS tool_name, COUNT(*) AS cnt
1501
1501
  FROM session_event se
1502
1502
  JOIN run r ON r.id = se.run_id
1503
1503
  JOIN job j ON j.id = r.job_id
@@ -1537,22 +1537,22 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1537
1537
  AND json_extract(payload, '$.elapsedMs') > 0
1538
1538
  AND payload_truncated = 0
1539
1539
  ORDER BY json_extract(payload, '$.tool') ASC,
1540
- json_extract(payload, '$.elapsedMs') ASC`,r),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 n.map(l=>{let c=a.get(l.tool_name)??0,d=o.get(l.tool_name)??[],u=d.length>0?d.reduce((p,_)=>p+_,0)/d.length:null,f=d.length>0?d[Math.floor(d.length*.5)]??null:null,m=d.length>0?d[Math.floor(d.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:u!==null?Math.round(u):null,p50_latency_ms:f,p95_latency_ms:m}})}function Dh(e){try{let t=JSON.parse(e);if(t.schema_version==="lmctl/v3"&&Array.isArray(t.steps)){let r=[],n=new Map,s=new Map;for(let i of t.steps){let o=typeof i.id=="string"?i.id:null;o!==null&&(r.push(o),typeof i.type=="string"&&s.set(o,i.type),typeof i.name=="string"&&i.name.length>0&&n.set(i.name,o))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(t.states!==null&&typeof t.states=="object"){let r=t.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let d=c.type;typeof d=="string"&&n.set(l,d)}let s=typeof t.start_at=="string"?t.start_at:null,i=Object.keys(r),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,a=t.terminals!==null&&typeof t.terminals=="object"?Object.keys(t.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...o,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function ln(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(r===void 0)return null;let n=e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=e.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:e.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),i=n!==null?Dh(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},o=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),a=g=>i.schema==="v3"&&i.nameToId.has(g)?i.nameToId.get(g):g,l=new Map;for(let g of o)l.set(a(g.state_name),g);let c=e.query(`SELECT state_name, status, last_agent_output
1540
+ json_extract(payload, '$.elapsedMs') ASC`,r),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 n.map(l=>{let c=a.get(l.tool_name)??0,d=o.get(l.tool_name)??[],u=d.length>0?d.reduce((p,h)=>p+h,0)/d.length:null,f=d.length>0?d[Math.floor(d.length*.5)]??null:null,m=d.length>0?d[Math.floor(d.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:u!==null?Math.round(u):null,p50_latency_ms:f,p95_latency_ms:m}})}function D_(e){try{let t=JSON.parse(e);if(t.schema_version==="lmctl/v3"&&Array.isArray(t.steps)){let r=[],n=new Map,s=new Map;for(let i of t.steps){let o=typeof i.id=="string"?i.id:null;o!==null&&(r.push(o),typeof i.type=="string"&&s.set(o,i.type),typeof i.name=="string"&&i.name.length>0&&n.set(i.name,o))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(t.states!==null&&typeof t.states=="object"){let r=t.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let d=c.type;typeof d=="string"&&n.set(l,d)}let s=typeof t.start_at=="string"?t.start_at:null,i=Object.keys(r),o=s!==null&&i.includes(s)?[s,...i.filter(l=>l!==s)]:i,a=t.terminals!==null&&typeof t.terminals=="object"?Object.keys(t.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...o,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function ln(e,t){let r=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(r===void 0)return null;let n=e.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=e.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:e.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),i=n!==null?D_(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},o=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),a=g=>i.schema==="v3"&&i.nameToId.has(g)?i.nameToId.get(g):g,l=new Map;for(let g of o)l.set(a(g.state_name),g);let c=e.query(`SELECT state_name, status, last_agent_output
1541
1541
  FROM interactive_session
1542
1542
  WHERE run_id = ? AND status = 'waiting_operator'
1543
- ORDER BY id DESC LIMIT 1`,t)[0],d=c!==void 0?a(c.state_name):null,u=d,f=c?.last_agent_output??null;if(u===null){let g=o.find(h=>h.ended_at===null);g!==void 0?u=a(g.state_name):o.length>0?u=a(o[o.length-1].state_name):u=r.current_state}r.terminal_state!==null&&(u=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let g of o){let h=a(g.state_name);!i.nodes.includes(h)&&!p.includes(h)&&p.push(h)}u!==null&&!p.includes(u)&&p.push(u);let _=[];for(let g of p){if(m.has(g))continue;m.add(g);let h=g===u,y=l.get(g),T="pending",b=null;if(g.startsWith("@terminal:"))T=r.terminal_state===g.slice(10)?"done":"pending";else if(y!==void 0&&(y.ended_at===null?T=h&&d===g?"paused":"running":y.outcome===null?T="failed":T="done",y.ended_at!==null)){let I=Date.parse(y.started_at),x=Date.parse(y.ended_at);!Number.isNaN(I)&&!Number.isNaN(x)&&(b=x-I)}h&&d===g&&(T="paused"),_.push({id:g,status:T,is_current:h,elapsed_ms:b,prompt:h&&T==="paused"?f:null,expected:h&&T==="paused"?"free_text":null})}return{run_id:t,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:u,nodes:_}}function Vi(e){let t=[],r=e.workflow_name??"?",n=e.workflow_version!==null?`v${e.workflow_version}`:"v?",s=e.terminal_state!==null?`terminal:${e.terminal_state}`:e.paused?"paused":"running";t.push(`run: ${e.run_id} (${r}, ${n}) - ${s}`),e.project!==null&&t.push(`project: ${e.project}`),t.push(""),t.push("workflow tree:");for(let i of e.nodes)t.push(...Ax(i));return`${t.join(`
1543
+ ORDER BY id DESC LIMIT 1`,t)[0],d=c!==void 0?a(c.state_name):null,u=d,f=c?.last_agent_output??null;if(u===null){let g=o.find(_=>_.ended_at===null);g!==void 0?u=a(g.state_name):o.length>0?u=a(o[o.length-1].state_name):u=r.current_state}r.terminal_state!==null&&(u=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...i.nodes];for(let g of o){let _=a(g.state_name);!i.nodes.includes(_)&&!p.includes(_)&&p.push(_)}u!==null&&!p.includes(u)&&p.push(u);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===u,y=l.get(g),T="pending",b=null;if(g.startsWith("@terminal:"))T=r.terminal_state===g.slice(10)?"done":"pending";else if(y!==void 0&&(y.ended_at===null?T=_&&d===g?"paused":"running":y.outcome===null?T="failed":T="done",y.ended_at!==null)){let I=Date.parse(y.started_at),x=Date.parse(y.ended_at);!Number.isNaN(I)&&!Number.isNaN(x)&&(b=x-I)}_&&d===g&&(T="paused"),h.push({id:g,status:T,is_current:_,elapsed_ms:b,prompt:_&&T==="paused"?f:null,expected:_&&T==="paused"?"free_text":null})}return{run_id:t,workflow_name:n?.name??null,workflow_version:n?.version??null,workflow_version_id:r.workflow_version_id,project:s,paused:r.paused_at!==null&&r.terminal_state===null,terminal_state:r.terminal_state,current_state:u,nodes:h}}function Vi(e){let t=[],r=e.workflow_name??"?",n=e.workflow_version!==null?`v${e.workflow_version}`:"v?",s=e.terminal_state!==null?`terminal:${e.terminal_state}`:e.paused?"paused":"running";t.push(`run: ${e.run_id} (${r}, ${n}) - ${s}`),e.project!==null&&t.push(`project: ${e.project}`),t.push(""),t.push("workflow tree:");for(let i of e.nodes)t.push(...Ax(i));return`${t.join(`
1544
1544
  `)}
1545
- `}function Ax(e){let t=[],r=Rx(e.status),n=[];e.status==="done"&&e.elapsed_ms!==null?n.push(`done, ${(e.elapsed_ms/1e3).toFixed(1)}s`):e.status==="failed"?n.push("failed"):e.status==="paused"?n.push("paused, waiting for operator input"):e.status==="running"?n.push("running"):e.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",i=e.is_current?" <- CURRENT":"",o=e.id.padEnd(28);if(t.push(` ${r} ${o} ${s}${i}`.trimEnd()),e.is_current&&e.status==="paused"&&e.prompt!==null){let a=e.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;t.push(` \u2514 prompt: "${l}"`),e.expected!==null&&t.push(` \u2514 expected: ${e.expected}`)}return t}function Rx(e){switch(e){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Ki(e,t,r={}){let n=r.nowMs??Date.now(),s=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(s===void 0)return null;let i=e.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=s.workflow_version_id===null?null:e.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=e.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:e.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=i!==null?Dh(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},d=I=>c.schema==="v3"&&c.nameToId.has(I)?c.nameToId.get(I):I,u=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),f=new Map;for(let I of u)f.set(d(I.state_name),I);let m=e.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",t),p=new Map;for(let I of m)p.set(d(I.state_name),I);let _=new Map,g=e.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",t)[0]?.timestamp_ms??null;for(let I of e.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1545
+ `}function Ax(e){let t=[],r=Rx(e.status),n=[];e.status==="done"&&e.elapsed_ms!==null?n.push(`done, ${(e.elapsed_ms/1e3).toFixed(1)}s`):e.status==="failed"?n.push("failed"):e.status==="paused"?n.push("paused, waiting for operator input"):e.status==="running"?n.push("running"):e.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",i=e.is_current?" <- CURRENT":"",o=e.id.padEnd(28);if(t.push(` ${r} ${o} ${s}${i}`.trimEnd()),e.is_current&&e.status==="paused"&&e.prompt!==null){let a=e.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;t.push(` \u2514 prompt: "${l}"`),e.expected!==null&&t.push(` \u2514 expected: ${e.expected}`)}return t}function Rx(e){switch(e){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Ki(e,t,r={}){let n=r.nowMs??Date.now(),s=e.query("SELECT * FROM run WHERE id = ?",t)[0];if(s===void 0)return null;let i=e.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,o=s.workflow_version_id===null?null:e.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=e.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:e.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=i!==null?D_(i.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},d=I=>c.schema==="v3"&&c.nameToId.has(I)?c.nameToId.get(I):I,u=e.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",t),f=new Map;for(let I of u)f.set(d(I.state_name),I);let m=e.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",t),p=new Map;for(let I of m)p.set(d(I.state_name),I);let h=new Map,g=e.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",t)[0]?.timestamp_ms??null;for(let I of e.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1546
1546
  FROM session_event
1547
1547
  WHERE run_id = ? AND step_id IS NOT NULL
1548
- GROUP BY step_id`,t))I.step_id!==null&&_.set(I.step_id,I.timestamp_ms);let h=Lx(c,u,d),y=Ox(s.current_state),T=e.query(`SELECT kind, severity, payload
1548
+ GROUP BY step_id`,t))I.step_id!==null&&h.set(I.step_id,I.timestamp_ms);let _=Lx(c,u,d),y=Ox(s.current_state),T=e.query(`SELECT kind, severity, payload
1549
1549
  FROM attention
1550
1550
  WHERE run_id = ?
1551
1551
  AND kind = 'session_hung'
1552
1552
  AND acknowledged_at IS NULL
1553
- ORDER BY id ASC`,t).map(I=>({kind:I.kind,severity:I.severity,payload:Fx(I.payload)})),b=h.map(I=>{let x=f.get(I),H=p.get(I),me=$x(s,I,y,x,H),U=x===void 0?null:Date.parse(x.started_at),M=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN(U??NaN)?null:M!==null&&!Number.isNaN(M)?M-U:me==="running"||me==="paused"?n-U:null,ee=x===void 0?null:_.get(x.id)??null,W=Ux(H?.last_activity_at??null,ee,g),k=i===null||H===void 0?void 0:jx(e,s.team_id,i.definition,H.state_name,x?.state_name??I);return{step_id:x?.id??null,state_id:I,status:me,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:W,elapsed_ms:A,...k!==void 0?{member:k}:{},...H!==void 0?{interactive_session:{id:H.id,status:H.status,turn_count:H.turn_count,state_name:H.state_name}}:{}}});return{run_id:t,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:Mx(s,a,b),submitted_at:a?.enqueued_at??s.started_at,nodes:b,current_node_index:Cx(b,s.terminal_state!==null),related_attentions:T}}function Yi(e,t={}){let r=t.nowMs??Date.now(),n=[],s=e.workflow_name??"?",i=e.workflow_version!==null?`v${e.workflow_version}`:"v?";n.push(`run ${e.run_id} - ${s}, ${i} - ${e.status}`);let o=`${e.submitted_at} (${kh(Date.parse(e.submitted_at),r)} ago)`;n.push(`project: ${e.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${vh(e.submitted_at,e.submitted_at)} submit`);for(let a of e.nodes){let l=a.started_at===null?"[ ]":vh(e.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${zi(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${d}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${kh(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(e.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of e.related_attentions)n.push(`- ${a.kind}${Wx(a.payload)}`)}return`${n.join(`
1553
+ ORDER BY id ASC`,t).map(I=>({kind:I.kind,severity:I.severity,payload:Fx(I.payload)})),b=_.map(I=>{let x=f.get(I),H=p.get(I),pe=$x(s,I,y,x,H),U=x===void 0?null:Date.parse(x.started_at),M=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),A=x===void 0||Number.isNaN(U??NaN)?null:M!==null&&!Number.isNaN(M)?M-U:pe==="running"||pe==="paused"?n-U:null,ee=x===void 0?null:h.get(x.id)??null,B=Ux(H?.last_activity_at??null,ee,g),k=i===null||H===void 0?void 0:jx(e,s.team_id,i.definition,H.state_name,x?.state_name??I);return{step_id:x?.id??null,state_id:I,status:pe,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:B,elapsed_ms:A,...k!==void 0?{member:k}:{},...H!==void 0?{interactive_session:{id:H.id,status:H.status,turn_count:H.turn_count,state_name:H.state_name}}:{}}});return{run_id:t,workflow_name:i?.name??null,workflow_version:o?.version??i?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:Mx(s,a,b),submitted_at:a?.enqueued_at??s.started_at,nodes:b,current_node_index:Cx(b,s.terminal_state!==null),related_attentions:T}}function Yi(e,t={}){let r=t.nowMs??Date.now(),n=[],s=e.workflow_name??"?",i=e.workflow_version!==null?`v${e.workflow_version}`:"v?";n.push(`run ${e.run_id} - ${s}, ${i} - ${e.status}`);let o=`${e.submitted_at} (${k_(Date.parse(e.submitted_at),r)} ago)`;n.push(`project: ${e.project??"?"} | submitted: ${o}`),n.push(""),n.push("timeline:"),n.push(`${v_(e.submitted_at,e.submitted_at)} submit`);for(let a of e.nodes){let l=a.started_at===null?"[ ]":v_(e.submitted_at,a.started_at),c=a.status.padEnd(7),d=a.elapsed_ms===null?"":` elapsed ${zi(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${d}`.trimEnd()),a.interactive_session!==void 0){let u=a.last_activity_at===null?"last activity unknown":`last activity ${k_(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${u}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(e.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of e.related_attentions)n.push(`- ${a.kind}${Wx(a.payload)}`)}return`${n.join(`
1554
1554
  `)}
1555
- `}function Lx(e,t,r){let n=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function Ox(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function $x(e,t,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&r===t?"paused":"running":n.outcome===null?"failed":"done"}function Cx(e,t){if(e.length===0)return null;let r=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let n=e.findIndex(s=>s.status==="pending");return n>=0?n:e.length-1}function Mx(e,t,r){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function jx(e,t,r,n,s){let i=Dx(r,n,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:qe(o)}}function Dx(e,t,r){let n=Px(e);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>ar(a)?a.id===t||a.name===t||a.name===r:!1),i=ar(s?.members)?s.members:null,o=i!==null&&ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(ar(n.states)){let s=n.states[t]??n.states[r];if(!ar(s))return null;let i=ar(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function Px(e){try{let t=JSON.parse(e);return ar(t)?t:null}catch{return null}}function Fx(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function ar(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ux(...e){let t=e.filter(r=>r!==null&&Number.isFinite(r));return t.length===0?null:Math.max(...t)}function vh(e,t){let r=Date.parse(e),n=Date.parse(t);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${zi(Math.max(0,n-r)).padEnd(6)}]`}function kh(e,t){return Number.isNaN(e)?"?":zi(Math.max(0,t-e))}function zi(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60),n=t%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function Wx(e){if(!ar(e))return"";let t=typeof e.step_id=="number"?` on step ${e.step_id}`:"",r=typeof e.member_alias=="string"?e.member_alias:null,n=typeof e.provider=="string"?e.provider:null,s=typeof e.elapsed_ms=="number"?`, ${zi(e.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${t}${i}`}var Ch,Ht=E(()=>{"use strict";Qe();Ch=`SELECT a.id AS attention_id,
1555
+ `}function Lx(e,t,r){let n=e.nodes.filter(s=>s.startsWith("@terminal:")?!1:e.nodeTypes.get(s)!=="lmctl/terminal"&&e.nodeTypes.get(s)!=="Terminal");for(let s of t){let i=r(s.state_name);n.includes(i)||n.push(i)}return n}function Ox(e){return e===null?null:e.startsWith("__paused__:")?e.slice(11):e}function $x(e,t,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||e.paused_at!==null&&r===t?"paused":"running":n.outcome===null?"failed":"done"}function Cx(e,t){if(e.length===0)return null;let r=e.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(t){for(let s=e.length-1;s>=0;s-=1)if(e[s].status==="done")return s}let n=e.findIndex(s=>s.status==="pending");return n>=0?n:e.length-1}function Mx(e,t,r){return e.terminal_state!==null?e.terminal_state:e.paused_at!==null?"paused":t?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function jx(e,t,r,n,s){let i=Dx(r,n,s);if(i===null)return;let o=e.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",t,i)[0];return o===void 0?void 0:{alias:o.alias,provider:qe(o)}}function Dx(e,t,r){let n=Px(e);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>ar(a)?a.id===t||a.name===t||a.name===r:!1),i=ar(s?.members)?s.members:null,o=i!==null&&ar(i.agent)?i.agent:null;return typeof o?.alias=="string"?o.alias:null}if(ar(n.states)){let s=n.states[t]??n.states[r];if(!ar(s))return null;let i=ar(s.agent)?s.agent:null;return typeof i?.alias=="string"?i.alias:null}return null}function Px(e){try{let t=JSON.parse(e);return ar(t)?t:null}catch{return null}}function Fx(e){if(e===null)return null;try{return JSON.parse(e)}catch{return e}}function ar(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Ux(...e){let t=e.filter(r=>r!==null&&Number.isFinite(r));return t.length===0?null:Math.max(...t)}function v_(e,t){let r=Date.parse(e),n=Date.parse(t);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${zi(Math.max(0,n-r)).padEnd(6)}]`}function k_(e,t){return Number.isNaN(e)?"?":zi(Math.max(0,t-e))}function zi(e){let t=Math.max(0,Math.round(e/1e3));if(t<60)return`${t}s`;let r=Math.floor(t/60),n=t%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),i=r%60;return i===0?`${s}h`:`${s}h${i}m`}function Wx(e){if(!ar(e))return"";let t=typeof e.step_id=="number"?` on step ${e.step_id}`:"",r=typeof e.member_alias=="string"?e.member_alias:null,n=typeof e.provider=="string"?e.provider:null,s=typeof e.elapsed_ms=="number"?`, ${zi(e.elapsed_ms)} elapsed`:"",i=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${t}${i}`}var C_,Ht=E(()=>{"use strict";Qe();C_=`SELECT a.id AS attention_id,
1556
1556
  a.kind AS kind,
1557
1557
  a.severity AS severity,
1558
1558
  a.created_at AS created_at,
@@ -1574,11 +1574,11 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1574
1574
  ON isess.run_id = a.run_id
1575
1575
  AND isess.id = (
1576
1576
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1577
- )`});var Qh={};Ee(Qh,{parseApiArgs:()=>Bh,readApiClientConfig:()=>ds,runApi:()=>Gx});import{readFileSync as Bx}from"node:fs";import{basename as qx,extname as Hx}from"node:path";async function Gx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Xx),0;if(e[0]==="config")return Kx(e.slice(1),t);let r=zh(e,"--direct");if(r.rest[0]==="escalations")return Yx(r.rest.slice(1),t,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&eo(r.rest.slice(2)))return t.stdout.write(`${eA}
1577
+ )`});var Q_={};Ee(Q_,{parseApiArgs:()=>B_,readApiClientConfig:()=>ds,runApi:()=>Gx});import{readFileSync as Bx}from"node:fs";import{basename as qx,extname as Hx}from"node:path";async function Gx(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Xx),0;if(e[0]==="config")return Kx(e.slice(1),t);let r=z_(e,"--direct");if(r.rest[0]==="escalations")return Yx(r.rest.slice(1),t,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&eo(r.rest.slice(2)))return t.stdout.write(`${eA}
1578
1578
  `),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(t.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
1579
1579
  `),2):VA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="where"&&eo(r.rest.slice(2)))return t.stdout.write(`${Zx}
1580
1580
  `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&eo(r.rest.slice(2)))return t.stdout.write(`${Qx}
1581
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?HA(r.rest.slice(2),t):JA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?XA(r.rest.slice(2),t):GA(r.rest.slice(2),t);if(r.present)return AA(r.rest,t);let n=Bh(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
1581
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?HA(r.rest.slice(2),t):JA(r.rest.slice(2),t);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?XA(r.rest.slice(2),t):GA(r.rest.slice(2),t);if(r.present)return AA(r.rest,t);let n=B_(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
1582
1582
  `),2;let s=Cr(t),i=s.baseUrl,o=cr(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=lA(n.upload.filePath,n.upload.project)}catch(c){return t.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1583
1583
  `),2}else n.body!==void 0&&n.contentType!==void 0?o["Content-Type"]=n.contentType:n.body!==void 0&&(o["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,i),{method:n.method,headers:o,body:a})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1584
1584
  `),2}if(!l.ok)return t.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
@@ -1589,7 +1589,7 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1589
1589
  `):t.stdout.write(`${JSON.stringify(f)}
1590
1590
  `)}else n.json?t.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1591
1591
  `):(t.stdout.write(await l.text()),t.stdout.write(`
1592
- `));return 0}function Bh(e){let t=Jh(e);if(typeof t=="string")return t;let r=t.args,n=t.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Qi(i,"/api/status",n):s==="projects"?Qi(i,"/api/projects",n):s==="teams"?Qi(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?yA(i.slice(1),t.format):Qi(i,"/api/workflows",n):s==="workflow"?gA(i,n):s==="upload"?hA(i,n):s==="submit-job"?_A(i,n):s==="issues"?pA(i,n):s==="jobs"?cs(i,"--status","/api/jobs","status",n):s==="job"?mA(i,n):s==="project"?wA(i,n):s==="artifact"?bA(i,n):s==="runs"?cs(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?cs(i,"--type","/api/external-objects","type",n):s==="external-signals"?Fh(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?SA(i,n):Fh(i,"--unacked","/api/attentions","unacked",n):s==="stats"?vA(i,n):s==="daemon"?kA(i,n):s==="intake"?IA(i,n):s==="session"?NA(i,n):s==="run"?xA(i,t.format):s==="prs"?cs(i,"--status","/api/submitted-prs","status",n):s==="pr"?uA(i,n):`unknown subcommand: ${s}`}function cr(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Cr(e){if(e.dal!==void 0)return ds(e.dal,process.env,e);let t=ke({path:Z()});try{return ds(t,process.env,e)}finally{t.close()}}function ds(e,t,r){let n=[],s=e.getConfig("api.url"),i;s!==null?i=s:t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?(i=t.LMCTL_API_URL,n.push("api.url")):i=Jx;let o=e.getConfig("api.token"),a;t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,o===null?n.push("api.token"):o!==a&&r.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
1592
+ `));return 0}function B_(e){let t=J_(e);if(typeof t=="string")return t;let r=t.args,n=t.format!=="text",[s,...i]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Qi(i,"/api/status",n):s==="projects"?Qi(i,"/api/projects",n):s==="teams"?Qi(i,"/api/teams",n):s==="workflows"?i[0]==="verify"?yA(i.slice(1),t.format):Qi(i,"/api/workflows",n):s==="workflow"?gA(i,n):s==="upload"?_A(i,n):s==="submit-job"?hA(i,n):s==="issues"?pA(i,n):s==="jobs"?cs(i,"--status","/api/jobs","status",n):s==="job"?mA(i,n):s==="project"?wA(i,n):s==="artifact"?bA(i,n):s==="runs"?cs(i,"--limit","/api/runs","limit",n,!0):s==="external-objects"?cs(i,"--type","/api/external-objects","type",n):s==="external-signals"?F_(i,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?i[0]==="ack"?SA(i,n):F_(i,"--unacked","/api/attentions","unacked",n):s==="stats"?vA(i,n):s==="daemon"?kA(i,n):s==="intake"?IA(i,n):s==="session"?NA(i,n):s==="run"?xA(i,t.format):s==="prs"?cs(i,"--status","/api/submitted-prs","status",n):s==="pr"?uA(i,n):`unknown subcommand: ${s}`}function cr(e,t){let r={Accept:e};return t!==null&&t.length>0&&(r.Authorization=`Bearer ${t}`),r}function Cr(e){if(e.dal!==void 0)return ds(e.dal,process.env,e);let t=ke({path:Z()});try{return ds(t,process.env,e)}finally{t.close()}}function ds(e,t,r){let n=[],s=e.getConfig("api.url"),i;s!==null?i=s:t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?(i=t.LMCTL_API_URL,n.push("api.url")):i=Jx;let o=e.getConfig("api.token"),a;t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?(a=t.LMCTL_API_TOKEN,o===null?n.push("api.token"):o!==a&&r.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this API request.
1593
1593
  `)):o!==null?a=o:a=null;for(let l of n)r.stderr.write(`note: ${Vx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1594
1594
  `);return{baseUrl:i,token:a}}function Vx(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function Kx(e,t){let[r,...n]=e;if(r===void 0)return t.stderr.write(`usage: lmctl api config <get|set|list>
1595
1595
  `),2;let s=t.dal===void 0,i=t.dal??ke({path:Z()});try{if(r==="get"){if(n.length!==1)return t.stderr.write(`usage: lmctl api config get <key>
@@ -1599,18 +1599,18 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1599
1599
  `),0)}if(r==="set"){if(n.length!==2)return t.stderr.write(`usage: lmctl api config set <key> <value>
1600
1600
  `),2;let[o,a]=n;if(!Zi.has(o))return t.stderr.write(`error: unsupported config key: ${o} (Phase A keys: ${[...Zi].join(", ")})
1601
1601
  `),2;let l=aA(o,a);return l!==null?(t.stderr.write(`error: ${l}
1602
- `),2):(i.setConfig(o,a),t.stdout.write(`${o} = ${Ph(o,a,!1)}
1602
+ `),2):(i.setConfig(o,a),t.stdout.write(`${o} = ${P_(o,a,!1)}
1603
1603
  `),0)}if(r==="list"){let o=!1;for(let c of n){if(c==="--show-secrets"){o=!0;continue}return t.stderr.write(`error: unknown flag: ${c}
1604
1604
  `),2}let a=i.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return t.stdout.write(`(no config rows)
1605
- `),0;for(let c of l)t.stdout.write(`${c} = ${Ph(c,a[c],o)}
1605
+ `),0;for(let c of l)t.stdout.write(`${c} = ${P_(c,a[c],o)}
1606
1606
  `);return 0}return t.stderr.write(`error: unknown api config verb: ${r}
1607
1607
  `),2}finally{s&&i.close()}}async function Yx(e,t,r){if(eo(e))return t.stdout.write(`${zx}
1608
- `),0;let n=zh(e,"--direct"),s=r||n.present,i=n.rest,[o,...a]=i;return o===void 0?(t.stderr.write(`usage: lmctl api escalations <list|show|respond>
1608
+ `),0;let n=z_(e,"--direct"),s=r||n.present,i=n.rest,[o,...a]=i;return o===void 0?(t.stderr.write(`usage: lmctl api escalations <list|show|respond>
1609
1609
  `),2):s?tA(o,a,t):o==="list"?nA(a,t):o==="show"?iA(a,t):o==="respond"?oA(a,t):(t.stderr.write(`error: unknown api escalations verb: ${o}
1610
- `),2)}function eo(e){return e.some(t=>t==="--help"||t==="-h")}function tA(e,t,r){let n=r.dal===void 0,s=r.dal??ke({path:Z()});try{return Zh(s,[e,...t],r)}finally{n&&s.close()}}function qh(e){let t,r=!1,n=!1,s;for(let o=0;o<e.length;o+=1){let a=e[o];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";t=l;continue}if(a==="--since"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=rA(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ne(a)}let i={json:r,all:n};return t!==void 0&&(i.project=t),s!==void 0&&(i.since=s),i}function rA(e){let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isNaN(r)?{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function nA(e,t){let r=qh(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1610
+ `),2)}function eo(e){return e.some(t=>t==="--help"||t==="-h")}function tA(e,t,r){let n=r.dal===void 0,s=r.dal??ke({path:Z()});try{return Z_(s,[e,...t],r)}finally{n&&s.close()}}function q_(e){let t,r=!1,n=!1,s;for(let o=0;o<e.length;o+=1){let a=e[o];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --project";t=l;continue}if(a==="--since"){let l=e[++o];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=rA(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ne(a)}let i={json:r,all:n};return t!==void 0&&(i.project=t),s!==void 0&&(i.since=s),i}function rA(e){let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isNaN(r)?{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function nA(e,t){let r=q_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1611
1611
  `),2;let n=Cr(t),s=cr("application/json",n.token),i=new URLSearchParams;r.project!==void 0&&i.set("project",r.project),r.all&&i.set("all","true"),r.since!==void 0&&i.set("since",r.since);let o=i.toString().length>0?`?${i.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${o}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return t.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1612
1612
  `),1}if(!a.ok)return t.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1613
- `),a.status===400?2:1;let l=await a.json();return Hh(l,r.json,t)}function Hh(e,t,r){if(t)return r.stdout.write(`${JSON.stringify(e,null,2)}
1613
+ `),a.status===400?2:1;let l=await a.json();return H_(l,r.json,t)}function H_(e,t,r){if(t)return r.stdout.write(`${JSON.stringify(e,null,2)}
1614
1614
  `),0;if(e.length===0)return r.stdout.write(`No pending escalations.
1615
1615
  `),0;r.stdout.write(`${e.length} pending escalation${e.length===1?"":"s"}:
1616
1616
 
@@ -1633,32 +1633,32 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1633
1633
  `),1;if(!d.ok){let f=await d.text();return t.stderr.write(`error: HTTP ${d.status}: ${f}
1634
1634
  `),d.status===400?2:1}let u=await d.json();return r?t.stdout.write(`${JSON.stringify(u,null,2)}
1635
1635
  `):t.stdout.write(`ok: attention ${i} acknowledged; step ${u.step_id} resumed (session_status=${String(u.session_status)})
1636
- `),0}function Ph(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function aA(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let r=Number(t);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===Ui||e===Wi){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function lA(e,t){let r=Bx(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:cA(e)}),qx(e)),t!==void 0&&s.append("project",t),s}function cA(e){switch(Hx(e).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function dA(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function uA(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return cs(n,"--status","/api/submitted-prs","status",t);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function Jh(e){let t=[],r="json";for(let n of e)n==="--json"?r="json":n==="--text"?r="text":t.push(n);return{args:t,format:r}}function Qi(e,t,r){return e.length>0?ne(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function cs(e,t,r,n,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return ne(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Fh(e,t,r,n,s){let i=!1;for(let o of e){if(o!==t)return ne(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function fA(e,t,r){if(e.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(e[0],"id");return typeof n=="string"?n:{method:"GET",path:`${t}/${n}`,accept:"application/json",json:!0}}function mA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return fA([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=$c(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function pA(e,t){let[r,...n]=e;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return ne(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return r==="create"?Xh(n,t):r==="claim"?Gh(n,t):r==="claim-next"?Vh(n,t):r==="close"?Kh(n,t):r==="reopen"?Yh(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Xh(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=$c(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ne(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Gh(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return ne(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Vh(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:t,body:JSON.stringify(s)}}function Kh(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Yh(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function hA(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return ne(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:r,project:s}}}function _A(e,t){let r,n,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function $c(e){try{return JSON.parse(e)}catch{return e}}function gA(e,t){let[r,n]=e;return r!=="show"||n===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function yA(e,t){for(let r of e)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function wA(e,t){let[r,n,...s]=e;return r==="workflow"?EA([n,...s].filter(i=>i!==void 0),t):r!=="show"||n===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function EA(e,t){let[r,...n]=e;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=se(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(r==="add"){let s=TA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function TA(e){let[t,r,...n]=e;if(t===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=$c(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(o)}return{project:t,body:s}}function bA(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function SA(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let r=se(e[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:t?"application/json":"text/html",json:t}}function vA(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function kA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function IA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function NA(e,t){let r=e[0];if(r==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(r==="history"||r==="compact"||r==="refresh"){if(e.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Pi(e[1]),s=encodeURIComponent(e[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function xA(e,t){let[r,n,s,i]=e;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=se(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=se(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return ne(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=se(n,"run_id");if(typeof o=="string")return o;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=se(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return ne(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function ne(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function zh(e,t){let r=[],n=!1;for(let s of e){if(s===t){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function AA(e,t){let r=Jh(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1636
+ `),0}function P_(e,t,r){return e!=="api.token"||r?t:t.length<=8?"***":`${t.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function aA(e,t){if(t.length===0)return`${e} value must be non-empty`;if(e==="api.port"){let r=Number(t);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${t}`}if(e==="api.url")try{new URL(t)}catch{return`invalid api.url: ${t}`}if(e===Ui||e===Wi){let r=Number(t);if(!Number.isInteger(r)||r<=0)return`invalid ${e}: ${t}`}return null}function lA(e,t){let r=Bx(e),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:cA(e)}),qx(e)),t!==void 0&&s.append("project",t),s}function cA(e){switch(Hx(e).toLowerCase()){case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".webp":return"image/webp";case".heic":return"image/heic";case".pdf":return"application/pdf";default:return"application/octet-stream"}}function dA(e){if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let t=e.id;return typeof t=="number"&&Number.isInteger(t)?t:null}return null}function uA(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return cs(n,"--status","/api/submitted-prs","status",t);if(r==="get"){let[s]=n;return s===void 0?"usage: api pr get <id-or-url>":/^\d+$/.test(s)?{method:"GET",path:`/api/submitted-prs/${s}`,accept:"application/json",json:t}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:t}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:t}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function J_(e){let t=[],r="json";for(let n of e)n==="--json"?r="json":n==="--text"?r="text":t.push(n);return{args:t,format:r}}function Qi(e,t,r){return e.length>0?ne(e[0]):{method:"GET",path:t,accept:r?"application/json":"text/html",json:r}}function cs(e,t,r,n,s,i=!1){let o;for(let l=0;l<e.length;l+=1){let c=e[l];if(c!==t)return ne(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${t}`;if(i&&(!/^\d+$/.test(d)||Number(d)<=0))return`invalid ${t}: ${d}`;o=d}let a=o===void 0?"":`?${n}=${encodeURIComponent(o)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function F_(e,t,r,n,s){let i=!1;for(let o of e){if(o!==t)return ne(o);i=!0}return{method:"GET",path:`${r}${i?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function fA(e,t,r){if(e.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(e[0],"id");return typeof n=="string"?n:{method:"GET",path:`${t}/${n}`,accept:"application/json",json:!0}}function mA(e,t){let[r,...n]=e;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return fA([r],"/api/jobs","job");if(r==="enqueue"){let s,i,o="manual",a,l,c;for(let u=0;u<n.length;u+=1){let f=n[u],m=n[++u];if(m===void 0||m.startsWith("--"))return`missing value for ${f}`;if(f==="--project")s=m;else if(f==="--project-id"){let p=Number(m);if(!Number.isInteger(p))return`invalid --project-id: ${m}`;i=p}else if(f==="--source")o=m;else if(f==="--payload")a=m;else if(f==="--dedupe-key")l=m;else if(f==="--priority"){let p=Number(m);if(!Number.isInteger(p))return`invalid --priority: ${m}`;c=p}else return ne(f)}if(s===void 0&&i===void 0)return"usage: lmctl api job enqueue (--project NAME | --project-id ID) [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let d={source:o};return s!==void 0&&(d.project=s),i!==void 0&&(d.project_id=i),a!==void 0&&(d.payload=$c(a)),l!==void 0&&(d.dedupe_key=l),c!==void 0&&(d.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(d)}}if(r==="run"){if(n.length!==1)return"usage: lmctl api job run <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"POST",path:`/api/jobs/${s}/run`,accept:"application/json",json:t}}return"usage: lmctl api job <id|enqueue|run>"}function pA(e,t){let[r,...n]=e;if(r==="list"){let[s,...i]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]";let o=new URLSearchParams;for(let l=0;l<i.length;l+=1){let c=i[l],d=i[++l];if(d===void 0||d.startsWith("--"))return`missing value for ${c}`;if(c==="--status")o.set("status",d);else if(c==="--severity")o.set("severity",d);else if(c==="--ai-test-path")o.set("ai_test_path",d);else return ne(c)}let a=o.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:t?"application/json":"text/html",json:t}}if(r==="show"){if(n.length!==1)return"usage: lmctl api issues show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/issues/${s}`,accept:"application/json",json:t}}return r==="create"?X_(n,t):r==="claim"?G_(n,t):r==="claim-next"?V_(n,t):r==="close"?K_(n,t):r==="reopen"?Y_(n,t):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function X_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues create <project> --title T --body B [--severity S] [--labels JSON] [--ai-test-path P]";let s=new Set(["--title","--body"]),i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")i.title=l;else if(a==="--body")i.body=l;else if(a==="--severity")i.severity=l;else if(a==="--labels")i.labels=$c(l);else if(a==="--ai-test-path")i.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ne(a)}return typeof i.title!="string"?"missing value for --title":typeof i.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:t,body:JSON.stringify(i)}}function G_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues claim <id> --assigned-run-id RUN";let s=se(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--assigned-run-id"){let c=se(l,"--assigned-run-id");if(typeof c=="string")return c;i.assigned_run_id=c}else return ne(a)}return typeof i.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:t,body:JSON.stringify(i)}}function V_(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(o)}return typeof s.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues/claim-next`,accept:"application/json",json:t,body:JSON.stringify(s)}}function K_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues close <id> [--commit-hash SHA] [--closed-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")i.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;i.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:t,body:JSON.stringify(i)}}function Y_(e,t){let[r,...n]=e;if(r===void 0)return"usage: lmctl api issues reopen <id> [--source-run-id RUN]";let s=se(r,"id");if(typeof s=="string")return s;let i={};for(let o=0;o<n.length;o+=1){let a=n[o],l=n[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;i.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:t,body:JSON.stringify(i)}}function _A(e,t){let[r,...n]=e;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let i=0;i<n.length;i+=1){let o=n[i];if(o!=="--project")return ne(o);let a=n[++i];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:t,upload:{filePath:r,project:s}}}function hA(e,t){let r,n,s,i;for(let a=0;a<e.length;a+=1){let l=e[a],c=e[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let d=Number(c);if(!Number.isInteger(d)||d<=0)return`invalid --workflow-id-override: ${c}`;n=d}else if(l==="--project")s=c;else if(l==="--inputs")try{let d=JSON.parse(c);if(d===null||typeof d!="object"||Array.isArray(d))return"--inputs must be a JSON object";i=d}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(i===void 0)return"missing value for --inputs";let o={source:"api-submit-job",payload:i};return r!==void 0&&(o.workflow=r),n!==void 0&&(o.workflow_id_override=n),s!==void 0&&(o.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:t,body:JSON.stringify(o),runAfterSubmit:!0}}function $c(e){try{return JSON.parse(e)}catch{return e}}function gA(e,t){let[r,n]=e;return r!=="show"||n===void 0||e.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function yA(e,t){for(let r of e)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}function wA(e,t){let[r,n,...s]=e;return r==="workflow"?EA([n,...s].filter(i=>i!==void 0),t):r!=="show"||n===void 0||e.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:t}}function EA(e,t){let[r,...n]=e;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:t?"application/json":"text/html",json:t};if(r==="show"){if(n.length!==1)return"usage: lmctl api project workflow show <id>";let s=se(n[0],"id");return typeof s=="string"?s:{method:"GET",path:`/api/projects/workflows/${s}`,accept:t?"application/json":"text/html",json:t}}if(r==="remove"||r==="enable"||r==="disable"){if(n.length!==1)return`usage: lmctl api project workflow ${r} <id>`;let s=se(n[0],"id");if(typeof s=="string")return s;let i=r==="remove"?"DELETE":"POST",o=r==="remove"?"":`/${r}`;return{method:i,path:`/api/projects/workflows/${s}${o}`,accept:"application/json",json:t}}if(r==="add"){let s=TA(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:t,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function TA(e){let[t,r,...n]=e;if(t===void 0||r===void 0)return"usage: lmctl api project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]";let s={workflow:r};for(let i=0;i<n.length;i+=1){let o=n[i],a=n[++i];if(a===void 0||a.startsWith("--"))return`missing value for ${o}`;if(o==="--condition")s.condition=a;else if(o==="--params")s.params=$c(a);else if(o==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(o)}return{project:t,body:s}}function bA(e,t){if(e[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let o=1;o<e.length;o+=1){let a=e[o];if(a==="--raw"){s=!0;continue}let l=e[++o];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--run"){let c=se(l,"run");if(typeof c=="string")return c;r=c}else if(a==="--kind")n=l;else return ne(a)}return r===void 0||n===void 0?"usage: lmctl api artifact get --run R --kind K [--raw]":{method:"GET",path:`/api/runs/${r}/artifacts/${encodeURIComponent(n)}${s?"?raw=true":""}`,accept:s?"text/plain":"application/json",json:!s&&t}}function SA(e,t){if(e[0]!=="ack"||e.length!==2)return"usage: lmctl api attention ack <id>";let r=se(e[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:t?"application/json":"text/html",json:t}}function vA(e,t){return e.length!==1||e[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:t?"application/json":"text/html",json:t}}function kA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:e[0]==="cycle"?"POST":"GET",path:e[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:t?"application/json":"text/html",json:t}}function IA(e,t){return e.length!==1||e[0]!=="state"&&e[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:e[0]==="scan"?"POST":"GET",path:e[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:t?"application/json":"text/html",json:t}}function NA(e,t){let r=e[0];if(r==="list")return e.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:t?"application/json":"text/html",json:t};if(r==="history"||r==="compact"||r==="refresh"){if(e.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=Pi(e[1]),s=encodeURIComponent(e[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:t?"application/json":"text/html",json:t}}return"usage: lmctl api session <list|history|compact|refresh>"}function xA(e,t){let[r,n,s,i]=e;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let o=se(r,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let o=se(n,"run_id");if(typeof o=="string")return o;let a;for(let l=2;l<e.length;l+=1){let c=e[l];if(c!=="--outcome")return ne(c);let d=e[++l];if(d===void 0||d.startsWith("--"))return"missing value for --outcome";a=d}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${o}/resume?outcome=${encodeURIComponent(a)}`,accept:t==="text"?"text/html":"application/json",json:t!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}`,accept:"application/json",json:t!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||i!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let o=se(n,"run_id");if(typeof o=="string")return o;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&t==="text";return{method:"GET",path:`/api/runs/${o}/steps/${a}${l}`,accept:c?"text/plain":"application/json",json:!c}}if(r==="artifacts"){if(n===void 0)return"usage: lmctl api run artifacts <run_id> [--kind K]";let o=se(n,"run_id");if(typeof o=="string")return o;let a;for(let c=2;c<e.length;c+=1){let d=e[c];if(d!=="--kind")return ne(d);let u=e[++c];if(u===void 0)return"missing value for --kind";a=u}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${o}/artifacts${l}`,accept:"application/json",json:t!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/where`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let o=se(n,"run_id");return typeof o=="string"?o:{method:"GET",path:`/api/runs/${o}/timeline`,accept:t==="text"?"text/plain":"application/json",json:t!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(e,t){return e===void 0||e.startsWith("--")?`missing value for ${t}`:!/^\d+$/.test(e)||Number(e)<=0?`invalid ${t}: ${e}`:Number(e)}function ne(e){return e.startsWith("--")?`unknown flag: ${e}`:`unknown argument: ${e}`}function z_(e,t){let r=[],n=!1;for(let s of e){if(s===t){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function AA(e,t){let r=J_(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
1637
1637
  `),2;let n=r.args,s=r.format!=="text",[i,...o]=n;if(i===void 0)return t.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1638
1638
  `),2;let a=t.dal===void 0,l=t.dal??ke({path:Z()});try{if(i==="issues"){let[c,...d]=o;return c===void 0?(t.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1639
1639
  `),2):c==="create"?RA(l,d,t,s):c==="claim"?LA(l,d,t,s):c==="claim-next"?OA(l,d,t,s):c==="close"?$A(l,d,t,s):c==="reopen"?CA(l,d,t,s):c==="list"?PA(l,d,t,s):c==="show"?FA(l,d,t,s):(t.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1640
- `),2)}return i==="status"?UA(l,o,t,s):i==="projects"?WA(l,o,t,s):i==="workflows"?BA(l,o,t,s):i==="runs"?qA(l,o,t,s):i==="attentions"||i==="attention"?KA(l,o,t,s):i==="escalations"?Zh(l,o,t):(t.stderr.write(`error: --direct is not supported for: ${i} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1640
+ `),2)}return i==="status"?UA(l,o,t,s):i==="projects"?WA(l,o,t,s):i==="workflows"?BA(l,o,t,s):i==="runs"?qA(l,o,t,s):i==="attentions"||i==="attention"?KA(l,o,t,s):i==="escalations"?Z_(l,o,t):(t.stderr.write(`error: --direct is not supported for: ${i} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1641
1641
  `),2)}catch(c){return t.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1642
1642
  `),1}finally{a&&l.close()}}function Ge(e,t,r){e.stdout.write(`${r?JSON.stringify(t,null,2):JSON.stringify(t)}
1643
- `)}function RA(e,t,r,n){let s=Xh(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1643
+ `)}function RA(e,t,r,n){let s=X_(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1644
1644
  `),2;let i=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues$/,"")),o=e.findProjectByName(i);if(o===null)return r.stderr.write(`error: project not found: ${i}
1645
1645
  `),1;let a=JSON.parse(s.body),l=MA(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
1646
1646
  `),2;let c=jA(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
1647
- `),2;let d=e.createIssue({project_id:o.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Ge(r,d,n),0}function LA(e,t,r,n){let s=Gh(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1647
+ `),2;let d=e.createIssue({project_id:o.id,title:a.title,body:a.body,...l!==void 0?{severity:l}:{},labels:c,ai_test_path:typeof a.ai_test_path=="string"?a.ai_test_path:null,source_run_id:typeof a.source_run_id=="number"?a.source_run_id:null});return Ge(r,d,n),0}function LA(e,t,r,n){let s=G_(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1648
1648
  `),2;let i=Number(s.path.match(/\/api\/issues\/(\d+)\/claim$/)[1]),o=JSON.parse(s.body),a=e.getIssue(i);if(a===null)return r.stderr.write(`error: issue not found: ${i}
1649
1649
  `),1;let l=e.claimIssue(i,o.assigned_run_id);return l===null?(r.stderr.write(`error: issue ${i} is not in a claimable state (status=${a.status})
1650
- `),1):(Ge(r,l,n),0)}function OA(e,t,r,n){let s=Vh(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1650
+ `),1):(Ge(r,l,n),0)}function OA(e,t,r,n){let s=V_(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1651
1651
  `),2;let i=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues\/claim-next$/,"")),o=e.findProjectByName(i);if(o===null)return r.stderr.write(`error: project not found: ${i}
1652
- `),1;let a=JSON.parse(s.body),l=e.claimNextIssue(o.id,a.assigned_run_id);return l===null?(Ge(r,{status:"queue_empty"},n),1):(Ge(r,l,n),0)}function $A(e,t,r,n){let s=Kh(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1652
+ `),1;let a=JSON.parse(s.body),l=e.claimNextIssue(o.id,a.assigned_run_id);return l===null?(Ge(r,{status:"queue_empty"},n),1):(Ge(r,l,n),0)}function $A(e,t,r,n){let s=K_(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1653
1653
  `),2;let i=Number(s.path.match(/\/api\/issues\/(\d+)\/close$/)[1]),o=JSON.parse(s.body),a=e.getIssue(i);if(a===null)return r.stderr.write(`error: issue not found: ${i}
1654
1654
  `),1;let l=typeof o.closed_run_id=="number"?o.closed_run_id:a.assigned_run_id;if(l===null)return r.stderr.write(`error: missing closed_run_id
1655
- `),2;let c=e.closeIssue(i,l,typeof o.commit_hash=="string"?o.commit_hash:null);return Ge(r,c,n),0}function CA(e,t,r,n){let s=Yh(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1655
+ `),2;let c=e.closeIssue(i,l,typeof o.commit_hash=="string"?o.commit_hash:null);return Ge(r,c,n),0}function CA(e,t,r,n){let s=Y_(t,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1656
1656
  `),2;let i=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),o=JSON.parse(s.body),a=e.getIssue(i);if(a===null)return r.stderr.write(`error: issue not found: ${i}
1657
1657
  `),1;let l=typeof o.source_run_id=="number"?o.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return r.stderr.write(`error: missing source_run_id
1658
- `),2;let c=e.reopenIssue(i,l);return Ge(r,c,n),0}function MA(e){if(e!=null)return typeof e=="string"&&Wh.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function jA(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function PA(e,t,r,n){let[s,...i]=t;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1658
+ `),2;let c=e.reopenIssue(i,l);return Ge(r,c,n),0}function MA(e){if(e!=null)return typeof e=="string"&&W_.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function jA(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function PA(e,t,r,n){let[s,...i]=t;if(s===void 0||s.startsWith("--"))return r.stderr.write(`error: usage: lmctl api --direct issues list <project> [--status STATUS] [--severity SEVERITY] [--ai-test-path P]
1659
1659
  `),2;let o,a,l;for(let u=0;u<i.length;u+=1){let f=i[u],m=i[++u];if(m===void 0||m.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
1660
- `),2;if(f==="--status"){let p=Uh(m,DA);if(typeof p=="string")return r.stderr.write(`error: ${p}
1661
- `),2;o=p}else if(f==="--severity"){let p=Uh(m,Wh);if(typeof p=="string")return r.stderr.write(`error: ${p}
1660
+ `),2;if(f==="--status"){let p=U_(m,DA);if(typeof p=="string")return r.stderr.write(`error: ${p}
1661
+ `),2;o=p}else if(f==="--severity"){let p=U_(m,W_);if(typeof p=="string")return r.stderr.write(`error: ${p}
1662
1662
  `),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${ne(f)}
1663
1663
  `),2}let c=e.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
1664
1664
  `),1;let d=e.listIssues(c.id,{...o!==void 0?{status:o}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Ge(r,d,n),0}function FA(e,t,r,n){if(t.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
@@ -1700,9 +1700,9 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1700
1700
  `):(t.stdout.write(await o.text()),o.headers.get("content-type")?.includes("text/plain")||t.stdout.write(`
1701
1701
  `)),0):(t.stderr.write(`error: HTTP ${o.status}: ${await o.text()}
1702
1702
  `),o.status===400?2:1)}function KA(e,t,r,n){let s=!1;for(let i of t){if(i==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${ne(i)}
1703
- `),2}return Ge(r,lr(e,{unacked:s}),n),0}function Zh(e,t,r){let[n,...s]=t;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1704
- `),2;if(n==="list"){let i=qh(s);if(typeof i=="string")return r.stderr.write(`error: ${i}
1705
- `),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=Gi(e,o);return Hh(a,i.json,r)}if(n==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1703
+ `),2}return Ge(r,lr(e,{unacked:s}),n),0}function Z_(e,t,r){let[n,...s]=t;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1704
+ `),2;if(n==="list"){let i=q_(s);if(typeof i=="string")return r.stderr.write(`error: ${i}
1705
+ `),2;let o={all:i.all};i.project!==void 0&&(o.project=i.project),i.since!==void 0&&(o.since=i.since);let a=Gi(e,o);return H_(a,i.json,r)}if(n==="show"){let i=s.filter(l=>l!=="--json"&&l!=="--text");if(i.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1706
1706
  `),2;let o=se(i[0],"attention_id");if(typeof o=="string")return r.stderr.write(`error: ${o}
1707
1707
  `),2;let a=Nt(e,o);return a===null?(r.stderr.write(`error: escalation not found: ${o}
1708
1708
  `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
@@ -1712,7 +1712,7 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1712
1712
  `),2;let a=i[1],l=Nt(e,o);if(l===null)return r.stderr.write(`error: escalation not found: ${o}
1713
1713
  `),1;let c=lr(e).find(m=>m.id===o);if(c===void 0)return r.stderr.write(`error: escalation not found: ${o}
1714
1714
  `),1;if(c.kind==="workflow_escalation"){let m=e.resumeEscalation(o,a);if(!m.resumed)return r.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${o})
1715
- `),2;let p=lr(e).find(g=>g.id===o),_={ok:!0,attention_id:o,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(_,null,2)}
1715
+ `),2;let p=lr(e).find(g=>g.id===o),h={ok:!0,attention_id:o,run_id:m.run.id,decision:a,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(h,null,2)}
1716
1716
  `):r.stdout.write(`ok: attention ${o} acknowledged; run ${m.run.id} resumed with decision "${a}"
1717
1717
  `),0}if(c.kind!=="interactive_waiting_operator")return r.stderr.write(`error: attention ${o} is kind=${c.kind}, not interactive_waiting_operator
1718
1718
  `),2;if(c.acknowledged_at!==null)return r.stderr.write(`error: attention ${o} is already acknowledged (${c.acknowledged_at})
@@ -1720,7 +1720,7 @@ ${r}`:r}function Tp(e,t){let r=X0({input:e.stdout}),n=new Map,s=(o,a={})=>new Pr
1720
1720
  `),2;let d=e.resumeInteractive(l.step_id,a,s);if(!d.resumed)return r.stderr.write(`error: interactive respond failed: ${d.reason} (step_id=${l.step_id})
1721
1721
  `),2;let u=e.acknowledgeAttention(o),f={ok:!0,attention_id:o,step_id:l.step_id,session_status:d.session.status,acknowledged_at:u?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1722
1722
  `):r.stdout.write(`ok: attention ${o} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1723
- `),0}function Uh(e,t){let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${e}`;for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}var Jx,Xx,Wh,Zi,zx,Zx,Qx,eA,DA,Cc=E(()=>{"use strict";Qe();Be();Fi();Nc();Ht();Jx="http://127.0.0.1:8787",Xx=`usage: lmctl api [--direct] <subcommand> ...
1723
+ `),0}function U_(e,t){let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${e}`;for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}var Jx,Xx,W_,Zi,zx,Zx,Qx,eA,DA,Cc=E(()=>{"use strict";Qe();Be();Fi();Nc();Ht();Jx="http://127.0.0.1:8787",Xx=`usage: lmctl api [--direct] <subcommand> ...
1724
1724
 
1725
1725
  Call the lmctl HTTP API using the configured daemon URL/token (see
1726
1726
  \`api config\`). Most subcommands require a running \`lmctl serve\`.
@@ -1834,7 +1834,7 @@ Call the lmctl HTTP API using the configured daemon URL/token (see
1834
1834
  Per-subcommand help: \`lmctl api run where --help\`,
1835
1835
  \`lmctl api run timeline --help\`, \`lmctl api workflows verify --help\`,
1836
1836
  and \`lmctl api escalations\` (no args) print detailed usage.
1837
- `,Wh=["low","medium","high","critical"];Zi=new Set(["api.url","api.port","api.token","project.docroot",Ui,Wi]);zx=`usage: lmctl api escalations <list|show|respond>
1837
+ `,W_=["low","medium","high","critical"];Zi=new Set(["api.url","api.port","api.token","project.docroot",Ui,Wi]);zx=`usage: lmctl api escalations <list|show|respond>
1838
1838
 
1839
1839
  list [--project P] [--all] [--since DURATION] [--json]
1840
1840
  Print pending operator escalations (interactive_waiting_operator
@@ -1859,27 +1859,27 @@ and \`lmctl api escalations\` (no args) print detailed usage.
1859
1859
 
1860
1860
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1861
1861
  and report the first step that would be started. Default output is the TTY
1862
- table; --json emits the structured WorkflowVerifyReport payload.`;DA=["open","assigned","closed","reopened"]});import e_ from"jexl";function cn(e){e_.compile(t_(e))}async function Mr(e,t){return e_.eval(t_(e),t)}function t_(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var us=E(()=>{"use strict"});import{z as w}from"zod";function Wc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var zA,r_,Mc,jc,Dc,Pc,Fc,Uc,n_,ZA,QA,eR,fs,tR,to,ro,no,so,io,s_,rR,nR,sR,iR,oo,dn=E(()=>{"use strict";us();zA=w.object({kind:w.enum(["success","neutral","failure"])}),r_=w.enum(["string","number","boolean","object","array"]),Mc=w.object({name:w.string().min(1),type:r_,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),jc=w.object({name:w.string().min(1),type:r_,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Dc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Pc="__failure__",Fc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Uc=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),n_=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),ZA=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),QA=w.union([w.string().min(1),ZA]),eR=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),fs=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(QA).optional(),skills:w.array(eR).optional()}),tR=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),to=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:fs,pre_checks:w.array(tR).optional(),reviewers:w.array(fs.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),ro=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(fs.extend({topic:w.string().min(1)})).optional(),consolidator:fs,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),no=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:fs.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),so=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),io=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),s_=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((e,t)=>{for(let[r,n]of e.branches.entries())try{cn(Wc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),rR=w.discriminatedUnion("type",[n_,to,ro,no,so,io,s_]),nR=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:rR,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((e,t)=>{try{cn(Wc(e.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),sR=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((e,t)=>{for(let[r,n]of Object.entries(e.inputs??{}))try{cn(Wc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),iR=w.discriminatedUnion("type",[n_,to,ro,no,so,io,s_,nR,sR]),oo=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),iR),terminals:w.record(w.string().min(1),zA),errors:Uc,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(Mc).optional(),outputs:w.array(jc).optional(),triggers:w.array(Dc).optional(),read_only:w.boolean().optional(),requires:Fc}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as K}from"zod";var oR,ao,aR,lR,cR,xt,un=E(()=>{"use strict";dn();oR=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ao=K.string().regex(oR),aR=K.object({step_id:ao,type:K.literal("main"),index:K.number().int().min(0)}),lR=K.record(ao,K.record(K.string().min(1),K.array(K.array(aR)))),cR=K.object({id:ao,name:K.string().min(1),type:K.string().min(1),typeVersion:K.number().int().positive().default(1),parameters:K.record(K.string(),K.unknown()).default({}),members:K.record(K.string(),K.unknown()).optional(),estimated_duration_ms:K.number().int().nonnegative().optional()}),xt=K.object({schema_version:K.literal("lmctl/v3"),definition_schema_version:K.literal(3),name:K.string().min(1),version:K.number().int().positive(),description:K.string().optional(),estimated_duration_ms:K.number().int().nonnegative().optional(),default_task_timeout_ms:K.number().int().positive().max(216e5).optional(),concurrency_key:K.string().min(1).optional(),concurrent_limit:K.number().int().positive().optional(),errors:Uc,inputs:K.array(Mc).optional(),outputs:K.array(jc).optional(),steps:K.array(cR).min(1),connections:lR.default({}),entry_step_id:ao,triggers:K.array(Dc).optional(),read_only:K.boolean().optional(),requires:Fc}).superRefine((e,t)=>{let r=new Set;for(let[n,s]of e.steps.entries())r.has(s.id)&&t.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[n,s]of Object.entries(e.connections)){r.has(n)||t.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||t.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function lo(e){return qc(e)}function qc(e){if(Array.isArray(e))return e.map(qc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=qc(t[n]);if(typeof r.type=="string"){let n=uR[r.type];n!==void 0&&(r.type=n)}return r}var Bc,dR,uR,Hc=E(()=>{"use strict";Bc="lmctl.builtin.",dR={Review:`${Bc}Review`,Research:`${Bc}Research`,Consolidate:`${Bc}Consolidate`},uR=Object.fromEntries(Object.entries(dR).map(([e,t])=>[t,e]))});import{readFileSync as fR}from"node:fs";function a_(e){return mR(e)}function mR(e){let t=lo(_R(e));if(hR(t),l_(t)===3)return pR(t);let r=oo.safeParse(t);if(!r.success)throw new Jt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=gR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function pR(e){let t=xt.safeParse(e);if(!t.success)throw new Jt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function hR(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=l_(e);if(!(t===null||i_.includes(t)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${i_.join(", ")}`}]})}function l_(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function _R(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1863
- `)||t.startsWith("{")||t.startsWith("[")?o_(e,"$"):t.endsWith(".json")?o_(fR(t,"utf8"),t):e}function o_(e,t){try{return JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Jt({errors:[{path:t,message:`invalid JSON: ${n}`}]})}}function gR(e){let t=[],r=[],n=new Set(Object.keys(e.states));n.has(e.start_at)||r.push({state:"$",ref:e.start_at,kind:"next"}),yR(e,n,r);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:r}}function yR(e,t,r){let n=e.errors?.on_unhandled_failure_state;n!==void 0&&(t.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var i_,Jt,c_=E(()=>{"use strict";dn();un();Hc();i_=[1,2,3],Jt=class extends Error{errors;unresolvedRefs;constructor(t){super(t.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=t.errors??[],this.unresolvedRefs=t.unresolvedRefs??[]}}});import{createHash as wR}from"node:crypto";function d_(e,t){let r=ER(t),n=wR("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function ER(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var u_=E(()=>{"use strict";un()});function SR(e,t){let r=bR[e]??[],n={},s={};for(let[i,o]of Object.entries(t))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function h_(e){let t=[],r=(k,N)=>{throw new fn([{line:k,message:N}])},n=e.split(`
1864
- `),s=[];for(let k=0;k<n.length;k+=1){let L=IR(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,_=new Map,g=new Map,h=(k,N,L,F,j,C)=>{l.has(k)&&r(F,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(F,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:F,isTerminal:j,...C?{members:C}:{}}),d.push(k)},y=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let F=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(F===null)break;N.push({label:F[1],dst:F[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],F=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=dr(j[1],N,r);for(let z of Object.keys(C))m_.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...m_].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(F==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=j[1],z=j[2],_e=j[3],oe=f_[z];oe===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(f_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:Mt}=SR(oe,dr(_e,N,r));h(C,oe,be,N,!1,Object.keys(Mt).length>0?Mt:void 0);continue}if(F==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=j[1],z=j[2],_e=j[3],oe=p_[z];oe===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(p_).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:dr(_e,N,r)});continue}if(F==="mcp"||F==="skill"){let j=new RegExp(`^${F}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${F}\` decl (expected \`${F} <name> = {json} | ${F} <name> = "<file|url>"\`): ${L}`),C=j[1],z=j[2].trim(),_e=F==="mcp"?_:g;_e.has(C)&&r(N,`duplicate ${F} declaration: ${C}`);let oe;if(z.startsWith("{")){let be=dr(z,N,r);F==="mcp"?oe={...be,name:C}:((typeof be.content!="string"||be.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:C,content:be.content})}else{let be=__(z);(typeof be!="string"||be.length===0)&&r(N,`\`${F} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=be}_e.set(C,oe);continue}if(F==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);h(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},N,!0);continue}if(F==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let _e=C[z],oe=C[z+1],be=C[z+2],Mt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:_e,port:Mt,dstDeclId:be,line:N})}continue}if(F==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],_e,oe=k+1;for(;oe<s.length;oe+=1){let be=s[oe].text,Mt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Mt!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Fn=Mt[2];z.push({when:Mt[1].trim(),next:`@terminal:${Fn}`}),c.push({srcDeclId:C,port:Fn,dstDeclId:Mt[3],line:s[oe].n});continue}let Ga=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Ga!==null){_e!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let Fn=Ga[1];_e=`@terminal:${Fn}`,c.push({srcDeclId:C,port:Fn,dstDeclId:Ga[2],line:s[oe].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),h(C,"lmctl/choice",{branches:z,..._e!==void 0?{default_next:_e}:{}},N,!1),k=oe-1;continue}if(F==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);h(j[1],"lmctl/loop",dr(j[2],N,r),N,!1);continue}if(F==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=dr(j[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),h(j[1],"lmctl/foreach",C,N,!1);continue}if(F==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=j[1],z=dr(j[2],N,r),_e=z.workflow;(typeof _e!="string"||_e.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...be}=z;h(C,"lmctl/subflow",{workflow_name:_e,...be},N,!1),u.push({declId:C,target:_e,line:N});continue}if(F==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=j[1],z=dr(j[2],N,r),{branches:_e,nextIdx:oe}=y(k);_e.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),h(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let be of _e)c.push({srcDeclId:C,port:be.label,dstDeclId:be.dst,line:N});k=oe;continue}if(F==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=j[1];continue}r(N,`unknown statement \`${F}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let T=k=>{if(Array.isArray(k)){for(let L of k)T(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,F]of[["mcp",_],["skills",g]]){let j=N[L];Array.isArray(j)&&(N[L]=j.map(C=>typeof C=="string"&&F.has(C)?structuredClone(F.get(C)):C))}for(let L of Object.values(N))T(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&T(N.members)}let b=k=>d_(o,k),I=d.map(k=>{let N=l.get(k);return{id:b(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=b(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:b(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);vR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.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 H=new Map;for(let k of c){let N=H.get(k.srcDeclId);N===void 0?H.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let F=H.get(k);F===void 0?H.set(k,[L]):F.push(L)}}let me=new Set([f]),U=[f];for(;U.length>0;){let k=U.shift();for(let N of H.get(k)??[])me.has(N)||(me.add(N),U.push(N))}for(let k of d)me.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let M=new Map;for(let k of c){let N=M.get(k.srcDeclId);N===void 0&&(N=new Set,M.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=M.get(k)??new Set;if(N.type==="lmctl/review"){let j=[...L].some(C=>!A.has(C));!L.has("approve")&&!j&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -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 F=kR[N.type];if(F!==void 0)for(let j of F)L.has(j)||r(N.line,`uncovered outcome: required outcome \`${j}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${j}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=TR[N.type];if(L===void 0)continue;let F={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(F);if(!j.success){let C=j.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let ee={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:b(f)},W=xt.safeParse(ee);if(!W.success)throw new fn(W.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return W.data}function IR(e){let t=null;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==null){if(n==="\\"){r+=1;continue}n===t&&(t=null);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function dr(e,t,r){let n=e.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(t,"structured args must be a JSON object"),i}let s={};for(let i of NR(n)){let o=i.indexOf("=");o===-1&&r(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(t,`invalid arg name: ${a}`),s[a]=__(l)}return s}function NR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function __(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var TR,bR,f_,fn,vR,kR,m_,p_,g_=E(()=>{"use strict";un();u_();dn();TR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:to},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:ro},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:no},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:so},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:io}},bR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};f_={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"},fn=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
1862
+ table; --json emits the structured WorkflowVerifyReport payload.`;DA=["open","assigned","closed","reopened"]});import eh from"jexl";function cn(e){eh.compile(th(e))}async function Mr(e,t){return eh.eval(th(e),t)}function th(e){return e.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var us=E(()=>{"use strict"});import{z as w}from"zod";function Wc(e){let t=e.trim();return t.startsWith("={{")&&t.endsWith("}}")?t.slice(3,-2).trim():e}var zA,rh,Mc,jc,Dc,Pc,Fc,Uc,nh,ZA,QA,eR,fs,tR,to,ro,no,so,io,sh,rR,nR,sR,iR,oo,dn=E(()=>{"use strict";us();zA=w.object({kind:w.enum(["success","neutral","failure"])}),rh=w.enum(["string","number","boolean","object","array"]),Mc=w.object({name:w.string().min(1),type:rh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),jc=w.object({name:w.string().min(1),type:rh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Dc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Pc="__failure__",Fc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Uc=w.object({on_unhandled_failure:w.object({attention_kind:w.string().min(1).default("workflow_failed"),severity:w.enum(["warn","error","critical"]).default("warn"),capture_evidence:w.boolean().default(!0),recommend_recovery:w.string().min(1).optional()}).optional(),on_unhandled_failure_state:w.string().min(1).optional()}).optional(),nh=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),ZA=w.object({name:w.string().min(1),command:w.string().min(1).optional(),args:w.array(w.string()).optional(),env:w.record(w.string(),w.string()).optional(),type:w.enum(["stdio","http","sse"]).optional(),url:w.string().min(1).optional(),headers:w.record(w.string(),w.string()).optional()}).strict(),QA=w.union([w.string().min(1),ZA]),eR=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),fs=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(QA).optional(),skills:w.array(eR).optional()}),tR=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),to=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:fs,pre_checks:w.array(tR).optional(),reviewers:w.array(fs.extend({rubric_artifact:w.string().optional()})).optional(),outcomes:w.object({approve:w.string().min(1),request_changes:w.string().optional(),fail_pre_check:w.string().optional(),max_loops_exceeded:w.string().optional()}),writes_to_project_path:w.boolean().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional(),max_loops:w.number().int().positive().default(5),loop_feedback_artifact:w.string().optional(),outcomes_from_stance:w.record(w.string(),w.string().min(1)).optional()}).superRefine((e,t)=>{(e.reviewers??[]).length>0&&e.outcomes_from_stance!==void 0&&t.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),ro=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(fs.extend({topic:w.string().min(1)})).optional(),consolidator:fs,outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),research_artifact_prefix:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),no=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:fs.extend({initial_prompt_template:w.string().min(1)}),termination:w.object({operator_signal:w.boolean().default(!0),agent_signal:w.string().optional(),max_turns:w.number().int().positive().default(20),timeout_seconds:w.number().int().positive().optional()}),outcomes:w.object({done:w.string().min(1),timeout:w.string().optional()}),artifact_name:w.string().optional(),durable_memory_tags:w.array(w.string().min(1)).optional(),write_back_durable_memory:w.union([w.boolean(),w.string().min(1)]).optional()}),so=w.object({type:w.literal("Loop"),state_name:w.string().min(1),over:w.string().min(1),item_var:w.string().min(1),body:w.string().min(1),outcomes:w.object({ok:w.string().min(1),error:w.string().optional()}),stop_on_error:w.boolean().default(!0),max_items:w.number().int().positive().default(1e3)}),io=w.object({type:w.literal("ShellStep"),state_name:w.string().min(1),command:w.string().min(1),outcomes_from_exit:w.record(w.string(),w.string().min(1)),timeout_ms:w.number().int().nonnegative().optional(),capture_output_to:w.string().optional(),writes_to_project_path:w.boolean().optional()}),sh=w.object({type:w.literal("Choice"),state_name:w.string().min(1),branches:w.array(w.object({when:w.string().min(1),next:w.string().min(1)})).default([]),default_next:w.string().min(1).optional()}).superRefine((e,t)=>{for(let[r,n]of e.branches.entries())try{cn(Wc(n.when))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${i}`})}}),rR=w.discriminatedUnion("type",[nh,to,ro,no,so,io,sh]),nR=w.object({type:w.literal("ForEach"),state_name:w.string().min(1),items_from:w.string().min(1),mode:w.enum(["sequential","parallel"]).default("sequential"),max_concurrency:w.number().int().positive().default(1),on_item_failure:w.enum(["continue","stop"]).default("stop"),body:rR,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((e,t)=>{try{cn(Wc(e.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";t.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),sR=w.object({type:w.literal("Subflow"),state_name:w.string().min(1),workflow_name:w.string().min(1),inputs:w.record(w.string(),w.string().min(1)).optional(),outcomes:w.record(w.string(),w.string().min(1))}).superRefine((e,t)=>{for(let[r,n]of Object.entries(e.inputs??{}))try{cn(Wc(n))}catch(s){let i=s instanceof Error?s.message:"invalid expression";t.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${i}`})}}),iR=w.discriminatedUnion("type",[nh,to,ro,no,so,io,sh,nR,sR]),oo=w.object({name:w.string().min(1),version:w.number().int().positive(),definition_schema_version:w.union([w.literal(1),w.literal(2)]),description:w.string().optional(),estimated_duration_ms:w.number().int().nonnegative().optional(),primitive_version:w.union([w.literal(1),w.literal(2)]).default(1),start_at:w.string().min(1),states:w.record(w.string().min(1),iR),terminals:w.record(w.string().min(1),zA),errors:Uc,concurrency_key:w.string().min(1).optional(),concurrent_limit:w.number().int().positive().optional(),default_task_timeout_ms:w.number().int().positive().max(216e5).optional(),inputs:w.array(Mc).optional(),outputs:w.array(jc).optional(),triggers:w.array(Dc).optional(),read_only:w.boolean().optional(),requires:Fc}).superRefine((e,t)=>{e.definition_schema_version===1&&e.errors!==void 0&&t.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.concurrency_key!==void 0&&t.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),e.definition_schema_version===1&&e.default_task_timeout_ms!==void 0&&t.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as K}from"zod";var oR,ao,aR,lR,cR,xt,un=E(()=>{"use strict";dn();oR=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,ao=K.string().regex(oR),aR=K.object({step_id:ao,type:K.literal("main"),index:K.number().int().min(0)}),lR=K.record(ao,K.record(K.string().min(1),K.array(K.array(aR)))),cR=K.object({id:ao,name:K.string().min(1),type:K.string().min(1),typeVersion:K.number().int().positive().default(1),parameters:K.record(K.string(),K.unknown()).default({}),members:K.record(K.string(),K.unknown()).optional(),estimated_duration_ms:K.number().int().nonnegative().optional()}),xt=K.object({schema_version:K.literal("lmctl/v3"),definition_schema_version:K.literal(3),name:K.string().min(1),version:K.number().int().positive(),description:K.string().optional(),estimated_duration_ms:K.number().int().nonnegative().optional(),default_task_timeout_ms:K.number().int().positive().max(216e5).optional(),concurrency_key:K.string().min(1).optional(),concurrent_limit:K.number().int().positive().optional(),errors:Uc,inputs:K.array(Mc).optional(),outputs:K.array(jc).optional(),steps:K.array(cR).min(1),connections:lR.default({}),entry_step_id:ao,triggers:K.array(Dc).optional(),read_only:K.boolean().optional(),requires:Fc}).superRefine((e,t)=>{let r=new Set;for(let[n,s]of e.steps.entries())r.has(s.id)&&t.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(e.entry_step_id)||t.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${e.entry_step_id}`});for(let[n,s]of Object.entries(e.connections)){r.has(n)||t.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[i,o]of Object.entries(s))for(let[a,l]of o.entries())for(let[c,d]of l.entries())r.has(d.step_id)||t.addIssue({code:"custom",path:["connections",n,i,a,c,"step_id"],message:`connection target does not reference an existing step: ${d.step_id}`})}})});function lo(e){return qc(e)}function qc(e){if(Array.isArray(e))return e.map(qc);if(e===null||typeof e!="object")return e;let t=e,r={};for(let n of Object.keys(t))r[n]=qc(t[n]);if(typeof r.type=="string"){let n=uR[r.type];n!==void 0&&(r.type=n)}return r}var Bc,dR,uR,Hc=E(()=>{"use strict";Bc="lmctl.builtin.",dR={Review:`${Bc}Review`,Research:`${Bc}Research`,Consolidate:`${Bc}Consolidate`},uR=Object.fromEntries(Object.entries(dR).map(([e,t])=>[t,e]))});import{readFileSync as fR}from"node:fs";function ah(e){return mR(e)}function mR(e){let t=lo(hR(e));if(_R(t),lh(t)===3)return pR(t);let r=oo.safeParse(t);if(!r.success)throw new Jt({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=gR(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Jt(n);return r.data}function pR(e){let t=xt.safeParse(e);if(!t.success)throw new Jt({errors:t.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return t.data}function _R(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return;let t=lh(e);if(!(t===null||ih.includes(t)))throw new Jt({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${t}; supported versions: ${ih.join(", ")}`}]})}function lh(e){if(typeof e!="object"||e===null||!("definition_schema_version"in e))return null;let t=e.definition_schema_version;return typeof t=="number"?t:null}function hR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1863
+ `)||t.startsWith("{")||t.startsWith("[")?oh(e,"$"):t.endsWith(".json")?oh(fR(t,"utf8"),t):e}function oh(e,t){try{return JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Jt({errors:[{path:t,message:`invalid JSON: ${n}`}]})}}function gR(e){let t=[],r=[],n=new Set(Object.keys(e.states));n.has(e.start_at)||r.push({state:"$",ref:e.start_at,kind:"next"}),yR(e,n,r);for(let[s,i]of Object.entries(e.states))new Set(Object.keys(e.terminals));return{errors:t,unresolvedRefs:r}}function yR(e,t,r){let n=e.errors?.on_unhandled_failure_state;n!==void 0&&(t.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var ih,Jt,ch=E(()=>{"use strict";dn();un();Hc();ih=[1,2,3],Jt=class extends Error{errors;unresolvedRefs;constructor(t){super(t.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=t.errors??[],this.unresolvedRefs=t.unresolvedRefs??[]}}});import{createHash as wR}from"node:crypto";function dh(e,t){let r=ER(t),n=wR("sha1").update(`${e}:${t}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function ER(e){let t=e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return t.length>0?t:"step"}var uh=E(()=>{"use strict";un()});function SR(e,t){let r=bR[e]??[],n={},s={};for(let[i,o]of Object.entries(t))r.includes(i)?s[i]=o:n[i]=o;return{params:n,members:s}}function _h(e){let t=[],r=(k,N)=>{throw new fn([{line:k,message:N}])},n=e.split(`
1864
+ `),s=[];for(let k=0;k<n.length;k+=1){let L=IR(n[k]).trim();L.length>0&&s.push({n:k+1,text:L})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let i=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),o=i[1],a=Number.parseInt(i[2],10),l=new Map,c=[],d=[],u=[],f,m={},p=new Map,h=new Map,g=new Map,_=(k,N,L,W,j,C)=>{l.has(k)&&r(W,`duplicate step/terminal id: ${k}`),/^[A-Za-z][\w-]*$/.test(k)||r(W,`invalid id (must start with a letter): ${k}`),l.set(k,{declId:k,type:N,params:L,line:W,isTerminal:j,...C?{members:C}:{}}),d.push(k)},y=k=>{let N=[],L=k+1;for(;L<s.length;L+=1){let W=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[L].text);if(W===null)break;N.push({label:W[1],dst:W[2]})}return{branches:N,nextIdx:L-1}};for(let k=1;k<s.length;k+=1){let{n:N,text:L}=s[k],W=L.split(/\s+/,1)[0];if(/^meta\s*\(/.test(L)){k!==1&&r(N,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let j=/^meta\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${L}`),C=dr(j[1],N,r);for(let z of Object.keys(C))mh.has(z)||r(N,`unknown \`meta\` key \`${z}\` \u2014 only workflow-level runtime metadata is allowed: ${[...mh].join(", ")} (no grammar inflation; bounded)`);m=C;continue}if(W==="step"){let j=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${L}`),C=j[1],z=j[2],he=j[3],oe=fh[z];oe===void 0&&r(N,`unknown step type: ${z} (supported \`step\` archetypes: ${Object.keys(fh).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:be,members:Mt}=SR(oe,dr(he,N,r));_(C,oe,be,N,!1,Object.keys(Mt).length>0?Mt:void 0);continue}if(W==="trigger"){let j=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${L}`),C=j[1],z=j[2],he=j[3],oe=ph[z];oe===void 0&&r(N,`unknown trigger type: ${z} (registered trigger archetypes: ${Object.keys(ph).join(", ")})`),p.has(C)&&r(N,`duplicate trigger id: ${C}`),p.set(C,{id:C,type:oe,parameters:dr(he,N,r)});continue}if(W==="mcp"||W==="skill"){let j=new RegExp(`^${W}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(L)??r(N,`malformed \`${W}\` decl (expected \`${W} <name> = {json} | ${W} <name> = "<file|url>"\`): ${L}`),C=j[1],z=j[2].trim(),he=W==="mcp"?h:g;he.has(C)&&r(N,`duplicate ${W} declaration: ${C}`);let oe;if(z.startsWith("{")){let be=dr(z,N,r);W==="mcp"?oe={...be,name:C}:((typeof be.content!="string"||be.content.length===0)&&r(N,`\`skill ${C}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),oe={name:C,content:be.content})}else{let be=hh(z);(typeof be!="string"||be.length===0)&&r(N,`\`${W} ${C}\`: string form must be a non-empty file path or http(s) URL`),oe=be}he.set(C,oe);continue}if(W==="terminal"){let j=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(L)??r(N,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${L}`);_(j[1],"lmctl/terminal",{name:j[2],kind:j[3]??"neutral"},N,!0);continue}if(W==="seq"){let C=L.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(z=>z.trim()).filter(z=>z.length>0);(C.length<3||C.length%2===0)&&r(N,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${L}`);for(let z=0;z+2<C.length+1&&!(z+2>C.length-1);z+=2){let he=C[z],oe=C[z+1],be=C[z+2],Mt=oe==="->"?"main":oe.slice(1,-2);c.push({srcDeclId:he,port:Mt,dstDeclId:be,line:N})}continue}if(W==="choice"){let C=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(L)??r(N,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${L}`))[1],z=[],he,oe=k+1;for(;oe<s.length;oe+=1){let be=s[oe].text,Mt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Mt!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let Fn=Mt[2];z.push({when:Mt[1].trim(),next:`@terminal:${Fn}`}),c.push({srcDeclId:C,port:Fn,dstDeclId:Mt[3],line:s[oe].n});continue}let Ga=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(be);if(Ga!==null){he!==void 0&&r(s[oe].n,`\`choice ${C}\` has more than one \`default\``);let Fn=Ga[1];he=`@terminal:${Fn}`,c.push({srcDeclId:C,port:Fn,dstDeclId:Ga[2],line:s[oe].n});continue}break}z.length===0&&r(N,`\`choice ${C}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(C,"lmctl/choice",{branches:z,...he!==void 0?{default_next:he}:{}},N,!1),k=oe-1;continue}if(W==="loop"){let j=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${L}`);_(j[1],"lmctl/loop",dr(j[2],N,r),N,!1);continue}if(W==="foreach"){let j=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${L}`),C=dr(j[2],N,r);"mode"in C&&r(N,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(j[1],"lmctl/foreach",C,N,!1);continue}if(W==="call"){let j=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(L)??r(N,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${L}`),C=j[1],z=dr(j[2],N,r),he=z.workflow;(typeof he!="string"||he.length===0)&&r(N,`\`call ${C}\` requires a \`workflow=<name>\` argument`);let{workflow:oe,...be}=z;_(C,"lmctl/subflow",{workflow_name:he,...be},N,!1),u.push({declId:C,target:he,line:N});continue}if(W==="decide"){let j=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(L)??r(N,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${L}`),C=j[1],z=dr(j[2],N,r),{branches:he,nextIdx:oe}=y(k);he.length===0&&r(N,`\`decide ${C}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(C,"lmctl/interactive",{termination:{operator_signal:!0}},N,!1,{agent:z});for(let be of he)c.push({srcDeclId:C,port:be.label,dstDeclId:be.dst,line:N});k=oe;continue}if(W==="entry"){let j=/^entry\s+([A-Za-z][\w-]*)$/.exec(L)??r(N,`malformed \`entry\` (expected \`entry <id>\`): ${L}`);f!==void 0&&r(N,`duplicate \`entry\` (already set to ${f})`),f=j[1];continue}r(N,`unknown statement \`${W}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}d.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=d[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let T=k=>{if(Array.isArray(k)){for(let L of k)T(L);return}if(typeof k!="object"||k===null)return;let N=k;if(typeof N.alias=="string")for(let[L,W]of[["mcp",h],["skills",g]]){let j=N[L];Array.isArray(j)&&(N[L]=j.map(C=>typeof C=="string"&&W.has(C)?structuredClone(W.get(C)):C))}for(let L of Object.values(N))T(L)};for(let k of d){let N=l.get(k);N.members!==void 0&&T(N.members)}let b=k=>dh(o,k),I=d.map(k=>{let N=l.get(k);return{id:b(k),name:k,type:N.type,typeVersion:1,parameters:N.params,...N.members?{members:N.members}:{}}}),x={};for(let k of c){l.has(k.srcDeclId)||r(k.line,`edge source references undeclared step: ${k.srcDeclId}`),l.has(k.dstDeclId)||r(k.line,`dangling edge target: ${k.dstDeclId} is not declared`),l.get(k.srcDeclId).isTerminal&&r(k.line,`terminal \`${k.srcDeclId}\` cannot have an outgoing edge`);let N=b(k.srcDeclId);x[N]??={},x[N][k.port]!==void 0&&r(k.line,`duplicate edge port \`${k.port}\` on step \`${k.srcDeclId}\``),x[N][k.port]=[[{step_id:b(k.dstDeclId),type:"main",index:0}]]}for(let k of d){let N=l.get(k);vR.has(N.type)||r(N.line,`unknown archetype \`${N.type}\` for step \`${k}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let k of u)k.target===o&&r(k.line,`subflow cycle: \`call ${k.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 H=new Map;for(let k of c){let N=H.get(k.srcDeclId);N===void 0?H.set(k.srcDeclId,[k.dstDeclId]):N.push(k.dstDeclId)}for(let k of d){let N=l.get(k);if(N.type!=="lmctl/loop")continue;let L=N.params.body;if(typeof L=="string"&&l.has(L)){let W=H.get(k);W===void 0?H.set(k,[L]):W.push(L)}}let pe=new Set([f]),U=[f];for(;U.length>0;){let k=U.shift();for(let N of H.get(k)??[])pe.has(N)||(pe.add(N),U.push(N))}for(let k of d)pe.has(k)||r(l.get(k).line,`step \`${k}\` is unreachable from entry \`${f}\``);let M=new Map;for(let k of c){let N=M.get(k.srcDeclId);N===void 0&&(N=new Set,M.set(k.srcDeclId,N)),N.add(k.port)}let A=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let k of d){let N=l.get(k);if(N.isTerminal)continue;let L=M.get(k)??new Set;if(N.type==="lmctl/review"){let j=[...L].some(C=>!A.has(C));!L.has("approve")&&!j&&r(N.line,`uncovered outcome: review step \`${k}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${k} -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 W=kR[N.type];if(W!==void 0)for(let j of W)L.has(j)||r(N.line,`uncovered outcome: required outcome \`${j}\` of step \`${k}\` (\`${N.type}\`) has no connection \u2014 route it (\`seq ${k} -${j}-> <target|terminal>\`)`);else L.size===0&&r(N.line,`uncovered outcome: non-terminal step \`${k}\` (\`${N.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let k of d){let N=l.get(k),L=TR[N.type];if(L===void 0)continue;let W={...N.params,...N.members??{},type:L.v2type,state_name:k,...Object.keys(L.outcomes).length>0?{outcomes:L.outcomes}:{}},j=L.schema.safeParse(W);if(!j.success){let C=j.error.issues[0],z=C.path.length===0?"$":C.path.map(String).join(".");r(N.line,`step \`${k}\` (\`${N.type}\`) has invalid params for archetype \`${L.v2type}\` at \`${z}\`: ${C.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${k} = ${N.type.replace("lmctl/","")}({ ... })\``)}}let ee={schema_version:"lmctl/v3",definition_schema_version:3,name:o,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:I,connections:x,entry_step_id:b(f)},B=xt.safeParse(ee);if(!B.success)throw new fn(B.error.issues.map(k=>({line:s[0].n,message:`emitted V3 invalid at ${k.path.length===0?"$":k.path.map(String).join(".")}: ${k.message}`})));return B.data}function IR(e){let t=null;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==null){if(n==="\\"){r+=1;continue}n===t&&(t=null);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function dr(e,t,r){let n=e.trim();if(n.length===0)return{};if(n.startsWith("{")){let i;try{i=JSON.parse(n)}catch(o){r(t,`malformed structured args (expected a single-line JSON object): ${o.message}`)}return(i===null||typeof i!="object"||Array.isArray(i))&&r(t,"structured args must be a JSON object"),i}let s={};for(let i of NR(n)){let o=i.indexOf("=");o===-1&&r(t,`malformed arg (expected k=v): ${i}`);let a=i.slice(0,o).trim(),l=i.slice(o+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(t,`invalid arg name: ${a}`),s[a]=hh(l)}return s}function NR(e){return e.split(",").map(t=>t.trim()).filter(t=>t.length>0)}function hh(e){return e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'")?e.slice(1,-1):e==="true"?!0:e==="false"?!1:/^-?\d+$/.test(e)?Number.parseInt(e,10):/^-?\d*\.\d+$/.test(e)?Number.parseFloat(e):e}var TR,bR,fh,fn,vR,kR,mh,ph,gh=E(()=>{"use strict";un();uh();dn();TR={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:to},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:ro},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:no},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:so},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:io}},bR={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};fh={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"},fn=class extends Error{issues;constructor(t){super(`composition DSL compile failed:
1865
1865
  ${t.map(r=>` line ${r.line}: ${r.message}`).join(`
1866
- `)}`),this.issues=t,this.name="DslCompileError"}},vR=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"]),kR={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},m_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),p_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as xR}from"node:fs";function AR(){let e=process.env.LMCTL_DSL;return e===void 0?!0:!["0","false","off"].includes(e.trim().toLowerCase())}function RR(e){for(let t of e.split(`
1867
- `)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function dt(e){if(typeof e=="string"&&AR()&&RR(e)){let r;try{r=h_(e)}catch(s){throw s instanceof fn?new Xt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=xt.safeParse(r);if(!n.success)throw new Xt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=lo(OR(e));if($R(t)&&t.definition_schema_version===3){let r=xt.safeParse(t);if(!r.success)throw new Xt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return LR(t)}function LR(e){let t=oo.safeParse(e);if(!t.success)throw new Xt(t.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=t.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(r.states))if(n.has(i.type))throw new Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return a_(r)}catch(s){throw s instanceof Jt?new Jc(s):s}}function OR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1868
- `)||t.startsWith("{")||t.startsWith("[")?y_(e):t.endsWith(".json")?y_(xR(t,"utf8")):e}function y_(e){return JSON.parse(e)}function $R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Jc,Xt,ms=E(()=>{"use strict";dn();c_();Hc();un();g_();Jc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function co(e){let t=e.workflow?.concurrent_limit??1,r=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:CR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:jR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function CR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=MR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function MR(e,t){let r=e;for(let n of t.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function jR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Xc=E(()=>{"use strict"});var w_={};Ee(w_,{enqueueFromAgentOutput:()=>PR,enqueueFromGitHubIssue:()=>Gc,enqueueManual:()=>DR,enqueueScheduled:()=>FR});function Gc(e,t){return fo(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:uo(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function DR(e,t){return fo(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:uo(t.payload),concurrency_key:t.concurrency_key})}function PR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return fo(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:t.available_at,payload:uo(t.payload),concurrency_key:t.concurrency_key})}function FR(e,t){return fo(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:uo(t.payload),concurrency_key:t.concurrency_key})}function uo(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function fo(e,t){let r=t.concurrency_key;if(r!==void 0)return e.enqueueJob({...t,concurrency_key:r});let n=e.getProject(t.project_id),s=n===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name);if(n===null||s===null)return e.enqueueJob(t);try{let i=dt(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=co({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Vc=E(()=>{"use strict";ms();Xc()});async function T_(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return E_(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let r={event:{kind:"github_issue",issue:e.issue}},n=[],s=0;for(let i of t){if(!await UR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...WR(i.parameters_override)},l=E_(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function E_(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Gc(e,{project_id:t,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function UR(e,t){if(e===null||e.trim().length===0)return!0;try{return await Mr(e,t)===!0}catch{return!1}}function WR(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var b_=E(()=>{"use strict";us();Vc()});import{spawnSync as BR}from"node:child_process";async function qR(e){let t=e.labels??["bug"],r=e.state??"open",n=["issue","list","--repo",e.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&n.splice(4,0,"--label",t.join(","));let s=BR(e.binary??"gh",n,{encoding:"utf8",timeout:e.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!JR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await T_({dal:e.dal,project:e.project,issue:XR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function mo(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=HR(r.intake_config);try{let s=await qR({dal:e,project:r,labels:n.labels,state:n.state});t.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return t}function HR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Kc(t))return{};let r=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,n=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function JR(e){return Array.isArray(e)&&e.every(t=>{if(!Kc(t))return!1;let r=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Kc(n)&&typeof n.name=="string"))})}function XR(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=e;return t===void 0?n:{...n,labels:t}}function Kc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Yc=E(()=>{"use strict";b_()});function v_(e){return async t=>VR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function VR(e,t,r={}){let n=KR(t.path),s={"content-type":"application/json",...t.headers??{},[po]:zc},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(n,i),a=Date.now();try{let l=await e.fetch(o),c=await YR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${S_(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${S_(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function S_(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function KR(e){let t=e.startsWith("/")?e:`/${e}`;return`${GR}${t}`}async function YR(e){let t=await e.text(),r;if(t==="")r=void 0;else try{r=JSON.parse(t)}catch{r=t}let n={};e.headers.forEach((i,o)=>{o.toLowerCase()!==po&&(n[o]=i)});let s={status:e.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var po,zc,GR,Zc=E(()=>{"use strict";po="x-mailbox-channel",zc="1",GR="http://mailbox.local"});import{createHash as k_,createHmac as zR,timingSafeEqual as ZR}from"node:crypto";function I_(e={}){return async(t,r)=>{if(e.disabled===!0){await r();return}let n=N_();if(n===null||nL(t.req.path)){await r();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(po)===zc){await r();return}let s=t.req.query("token");if(s!==void 0&&ho(s,n)){ed(t,n),await r();return}if(rL(t,n)){await r();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function N_(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function x_(e){let t=N_();return t!==null&&ho(e,t)}function ed(e,t,r=new Date){e.header("Set-Cookie",`${Qc}=${eL(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function A_(e){e.header("Set-Cookie",`${Qc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function eL(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+QR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${R_(e,n)}`,"utf8").toString("base64url")}function tL(e,t,r=new Date){let n;try{n=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:ho(s[2],R_(t,`${s[0]}|${s[1]}`))}function ho(e,t){return ZR(k_("sha256").update(e).digest(),k_("sha256").update(t).digest())}function rL(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&ho(r,t))return!0;let n=sL(e.req.header("cookie")??"")[Qc];return n!==void 0&&tL(n,t)}function nL(e){return e==="/login"||e==="/logout"}function sL(e){let t={};for(let r of e.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(t[n]=s.join("="))}return t}function R_(e,t){return zR("sha256",e).update(t).digest("hex")}var Qc,QR,L_=E(()=>{"use strict";Zc();Qc="lmctl_next_session",QR=30});import{existsSync as mn,mkdirSync as iL,readdirSync as oL,readFileSync as _o,unlinkSync as aL,writeFileSync as nd}from"node:fs";import{join as jr}from"node:path";function rt(e){if(!lL.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function $_(e,t){let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return fL(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:O_,updated_at:O_}:null}function cL(e,t,r,n){let s=r!==null?`
1866
+ `)}`),this.issues=t,this.name="DslCompileError"}},vR=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"]),kR={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},mh=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),ph={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as xR}from"node:fs";function AR(){let e=process.env.LMCTL_DSL;return e===void 0?!0:!["0","false","off"].includes(e.trim().toLowerCase())}function RR(e){for(let t of e.split(`
1867
+ `)){let r=t.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function dt(e){if(typeof e=="string"&&AR()&&RR(e)){let r;try{r=_h(e)}catch(s){throw s instanceof fn?new Xt(s.issues.map(i=>({path:`dsl:${i.line}`,message:i.message}))):s}let n=xt.safeParse(r);if(!n.success)throw new Xt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let t=lo(OR(e));if($R(t)&&t.definition_schema_version===3){let r=xt.safeParse(t);if(!r.success)throw new Xt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return LR(t)}function LR(e){let t=oo.safeParse(e);if(!t.success)throw new Xt(t.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=t.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,i]of Object.entries(r.states))if(n.has(i.type))throw new Xt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${i.type}`}]);try{return ah(r)}catch(s){throw s instanceof Jt?new Jc(s):s}}function OR(e){if(typeof e!="string")return e;let t=e.trim();return e.includes(`
1868
+ `)||t.startsWith("{")||t.startsWith("[")?yh(e):t.endsWith(".json")?yh(xR(t,"utf8")):e}function yh(e){return JSON.parse(e)}function $R(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Jc,Xt,ms=E(()=>{"use strict";dn();ch();Hc();un();gh();Jc=class extends Error{causeError;constructor(t){super("compiler emitted invalid atomic workflow"),this.causeError=t,this.name="CompilerInvariantError"}},Xt=class extends Error{issues;constructor(t){super("compound workflow validation failed"),this.issues=t,this.name="CompilerValidationError"}}});function co(e){let t=e.workflow?.concurrent_limit??1,r=e.job.concurrency_key_resolved??e.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:t}:{concurrency_key:CR(r,{job:{id:e.job.id,kind:e.job.source,source:e.job.source,source_ref:e.job.source_ref,payload:jR(e.job.payload)},project:e.project===null?null:{id:e.project.id,name:e.project.name}}),concurrent_limit:t}}function CR(e,t){return e.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=MR(t,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function MR(e,t){let r=e;for(let n of t.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function jR(e){if(e===null||e.trim().length===0)return null;try{return JSON.parse(e)}catch{return e}}var Xc=E(()=>{"use strict"});var wh={};Ee(wh,{enqueueFromAgentOutput:()=>PR,enqueueFromGitHubIssue:()=>Gc,enqueueManual:()=>DR,enqueueScheduled:()=>FR});function Gc(e,t){return fo(e,{project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:"gh_issue",source_ref:t.issue_url,dedupe_key:t.dedupe_key??t.issue_url,payload:uo(t.payload),concurrency_key:t.concurrency_key,priority:t.priority})}function DR(e,t){return fo(e,{project_id:t.project_id,workflow_id_override:null,source:"manual",source_ref:t.source_ref??null,dedupe_key:t.source_ref??null,payload:uo(t.payload),concurrency_key:t.concurrency_key})}function PR(e,t){let r=t.sequence===void 0?`run:${t.parent_run_id}`:`run:${t.parent_run_id}:${t.sequence}`;return fo(e,{project_id:t.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:t.available_at,payload:uo(t.payload),concurrency_key:t.concurrency_key})}function FR(e,t){return fo(e,{project_id:t.project_id,workflow_id_override:null,source:"schedule",source_ref:t.source_ref,dedupe_key:t.source_ref,available_at:t.available_at,payload:uo(t.payload),concurrency_key:t.concurrency_key})}function uo(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function fo(e,t){let r=t.concurrency_key;if(r!==void 0)return e.enqueueJob({...t,concurrency_key:r});let n=e.getProject(t.project_id),s=n===null?null:t.workflow_id_override!==void 0&&t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(n.workflow_name);if(n===null||s===null)return e.enqueueJob(t);try{let i=dt(s.definition),o={id:-1,project_id:t.project_id,workflow_id_override:t.workflow_id_override??null,source:t.source,source_ref:t.source_ref??null,payload:t.payload??null,status:"queued",priority:t.priority??0,available_at:t.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:t.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=co({workflow:i,job:o,project:n});return e.enqueueJob({...t,concurrency_key:a.concurrency_key})}catch{return e.enqueueJob(t)}}var Vc=E(()=>{"use strict";ms();Xc()});async function Th(e){let t=e.dal.listProjectWorkflows(e.project.id,{enabled_only:!0});if(t.length===0)return Eh(e.dal,e.project.id,e.issue,e.issue.url,null,e.issue,void 0);let r={event:{kind:"github_issue",issue:e.issue}},n=[],s=0;for(let i of t){if(!await UR(i.condition,r))continue;let o=`${e.issue.url}#workflow:${i.workflow_id}`,a={issue:e.issue,...WR(i.parameters_override)},l=Eh(e.dal,e.project.id,e.issue,o,i.workflow_id,a,-i.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function Eh(e,t,r,n,s,i,o){let a=e.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[Gc(e,{project_id:t,issue_url:r.url,payload:i,workflow_id_override:s,dedupe_key:n,priority:o})],new_jobs:a===null?1:0}}async function UR(e,t){if(e===null||e.trim().length===0)return!0;try{return await Mr(e,t)===!0}catch{return!1}}function WR(e){if(e===null||e.trim().length===0)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}var bh=E(()=>{"use strict";us();Vc()});import{spawnSync as BR}from"node:child_process";async function qR(e){let t=e.labels??["bug"],r=e.state??"open",n=["issue","list","--repo",e.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];t.length>0&&n.splice(4,0,"--label",t.join(","));let s=BR(e.binary??"gh",n,{encoding:"utf8",timeout:e.timeoutMs??6e4,maxBuffer:10*1024*1024});if(s.error!==void 0)throw s.error;if(s.status!==0)throw new Error(`gh issue list failed: ${s.stderr??""}`.trim());let i;try{i=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!JR(i))throw new Error("gh issue list returned unexpected JSON shape");let o=0;for(let a of i){let l=await Th({dal:e.dal,project:e.project,issue:XR(a)});o+=l.new_jobs}return{scanned:i.length,new_jobs:o}}async function mo(e){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let t=[];for(let r of e.listProjectsWithIntakeEnabled()){let n=HR(r.intake_config);try{let s=await qR({dal:e,project:r,labels:n.labels,state:n.state});t.push({project_id:r.id,project_name:r.name,...s})}catch(s){let i=s instanceof Error?s.message:String(s);t.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:i});try{e.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:i})})}catch{}}}return t}function HR(e){if(e===null)return{};try{let t=JSON.parse(e);if(!Kc(t))return{};let r=t.state==="open"||t.state==="closed"||t.state==="all"?t.state:void 0,n=Array.isArray(t.labels)?t.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:t.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function JR(e){return Array.isArray(e)&&e.every(t=>{if(!Kc(t))return!1;let r=t.labels;return typeof t.number=="number"&&typeof t.title=="string"&&typeof t.url=="string"&&(typeof t.body=="string"||t.body===null||t.body===void 0)&&(t.state===void 0||typeof t.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:Kc(n)&&typeof n.name=="string"))})}function XR(e){let t=e.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=e;return t===void 0?n:{...n,labels:t}}function Kc(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}var Yc=E(()=>{"use strict";bh()});function vh(e){return async t=>VR(e.app,t,e.log!==void 0?{log:e.log}:{})}async function VR(e,t,r={}){let n=KR(t.path),s={"content-type":"application/json",...t.headers??{},[po]:zc},i={method:t.method,headers:s};t.body!==void 0&&t.method!=="GET"&&t.method!=="DELETE"&&(i.body=typeof t.body=="string"?t.body:JSON.stringify(t.body));let o=new Request(n,i),a=Date.now();try{let l=await e.fetch(o),c=await YR(l);if(r.log!==void 0){let d=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${Sh(t.path)} \u2192 ${c.status} (${d}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${t.method} ${Sh(t.path)} \u2192 ERR (${c}ms)`)}throw l}}function Sh(e){let t=e.startsWith("/")?e:`/${e}`,r=t.search(/[?#]/);return r===-1?t:t.slice(0,r)}function KR(e){let t=e.startsWith("/")?e:`/${e}`;return`${GR}${t}`}async function YR(e){let t=await e.text(),r;if(t==="")r=void 0;else try{r=JSON.parse(t)}catch{r=t}let n={};e.headers.forEach((i,o)=>{o.toLowerCase()!==po&&(n[o]=i)});let s={status:e.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var po,zc,GR,Zc=E(()=>{"use strict";po="x-mailbox-channel",zc="1",GR="http://mailbox.local"});import{createHash as kh,createHmac as zR,timingSafeEqual as ZR}from"node:crypto";function Ih(e={}){return async(t,r)=>{if(e.disabled===!0){await r();return}let n=Nh();if(n===null||nL(t.req.path)){await r();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(po)===zc){await r();return}let s=t.req.query("token");if(s!==void 0&&_o(s,n)){ed(t,n),await r();return}if(rL(t,n)){await r();return}return t.req.path.startsWith("/api/")||t.req.path.startsWith("/mailbox/")?t.json({error:"API requires auth; set LMCTL_API_TOKEN"},401):t.redirect("/login",302)}}function Nh(){let e=process.env.LMCTL_API_TOKEN;return e&&e.length>0?e:null}function xh(e){let t=Nh();return t!==null&&_o(e,t)}function ed(e,t,r=new Date){e.header("Set-Cookie",`${Qc}=${eL(t,r)}; Path=/; HttpOnly; SameSite=Lax`)}function Ah(e){e.header("Set-Cookie",`${Qc}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function eL(e,t=new Date){let n=`auth=ok|${new Date(t.getTime()+QR*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${Rh(e,n)}`,"utf8").toString("base64url")}function tL(e,t,r=new Date){let n;try{n=Buffer.from(e,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let i=new Date(s[1]);return Number.isNaN(i.getTime())||i.getTime()<=r.getTime()?!1:_o(s[2],Rh(t,`${s[0]}|${s[1]}`))}function _o(e,t){return ZR(kh("sha256").update(e).digest(),kh("sha256").update(t).digest())}function rL(e,t){let r=/^Bearer\s+(.+)$/i.exec(e.req.header("authorization")??"")?.[1];if(r!==void 0&&_o(r,t))return!0;let n=sL(e.req.header("cookie")??"")[Qc];return n!==void 0&&tL(n,t)}function nL(e){return e==="/login"||e==="/logout"}function sL(e){let t={};for(let r of e.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(t[n]=s.join("="))}return t}function Rh(e,t){return zR("sha256",e).update(t).digest("hex")}var Qc,QR,Lh=E(()=>{"use strict";Zc();Qc="lmctl_next_session",QR=30});import{existsSync as mn,mkdirSync as iL,readdirSync as oL,readFileSync as ho,unlinkSync as aL,writeFileSync as nd}from"node:fs";import{join as jr}from"node:path";function rt(e){if(!lL.test(e))throw new Error(`invalid memory name "${e}": only alphanumeric characters, underscores, and hyphens are allowed`)}function $h(e,t){let r=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),i=n.match(/^type:\s*(.+)$/m),o=n.match(/^description:\s*(.+)$/m),a=i?.[1]?.trim()??"";return fL(a)?{name:e,type:a,description:o?.[1]?.trim()??null,body:s,created_at:Oh,updated_at:Oh}:null}function cL(e,t,r,n){let s=r!==null?`
1869
1869
  description: ${r}`:"";return`---
1870
1870
  name: ${e}${s}
1871
1871
  type: ${t}
1872
1872
  ---
1873
- ${n}`}function dL(e,t,r,n){let s=jr(e,sd),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=mn(s)?_o(s,"utf8"):"",a=new RegExp(`^- \\[${C_(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1873
+ ${n}`}function dL(e,t,r,n){let s=jr(e,sd),i=`- [${t}.md](${t}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,o=mn(s)?ho(s,"utf8"):"",a=new RegExp(`^- \\[${Ch(t)}\\.md\\].*$`,"m");a.test(o)?o=o.replace(a,i):o=o.length>0&&!o.endsWith(`
1874
1874
  `)?`${o}
1875
1875
  ${i}
1876
1876
  `:`${o}${i}
1877
- `,nd(s,o,"utf8")}function uL(e,t){let r=jr(e,sd);if(!mn(r))return;let n=_o(r,"utf8"),s=new RegExp(`^- \\[${C_(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&nd(r,n.replace(s,""),"utf8")}function C_(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function fL(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function ut(e,t){return e.durable_memory_mode==="db"?new rd(t,e.id):new td(e.local_path)}var lL,sd,O_,td,rd,id=E(()=>{"use strict";lL=/^[a-zA-Z0-9_-]+$/;sd="MEMORY.md",O_="1970-01-01T00:00:00.000Z",td=class{dir;constructor(t){this.dir=jr(t,"durable-memory")}read(t){rt(t);let r=jr(this.dir,`${t}.md`);if(!mn(r))return null;let n=_o(r,"utf8");return $_(t,n)}write(t){rt(t.name),iL(this.dir,{recursive:!0});let r=jr(this.dir,`${t.name}.md`),n=!mn(r),s=cL(t.name,t.type,t.description??null,t.body);return nd(r,s,"utf8"),dL(this.dir,t.name,t.type,t.description??null),{created:n}}index(t){return this.listFiles().filter(r=>t===void 0||t.length===0||t.includes(r.type)).map(({name:r,type:n,description:s,updated_at:i})=>({name:r,type:n,description:s,updated_at:i}))}list(t){return this.listFiles().filter(r=>t===void 0||r.type===t).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(t){rt(t);let r=jr(this.dir,`${t}.md`);return mn(r)?(aL(r),uL(this.dir,t),!0):!1}listFiles(){if(!mn(this.dir))return[];let t=oL(this.dir).filter(n=>n.endsWith(".md")&&n!==sd),r=[];for(let n of t){let s=n.slice(0,-3),i=_o(jr(this.dir,n),"utf8"),o=$_(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};rd=class{dal;projectId;constructor(t,r){this.dal=t,this.projectId=r}read(t){rt(t);let r=this.dal.getDurableMemoryByName(this.projectId,t);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(t){rt(t.name);let r=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:r===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(t){return rt(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function j_(e,t){let{dal:r}=t;e.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ut(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),e.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=ut(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),e.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.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,d=typeof o.description=="string"?o.description:null;if(a===null||!M_.has(a))return n.json({error:`invalid type: must be one of ${[...M_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=ut(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),e.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ut(i,r),a=n.req.query("type");return n.json(o.list(a))})}var M_,D_=E(()=>{"use strict";id();M_=new Set(["user","feedback","project","reference"])});function pL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(mL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function hL(e){let t=Math.max(1980,e.getFullYear()),r=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,n=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:r,date:n}}function P_(e,t=new Date){let{time:r,date:n}=hL(t),s=[],i=[],o=0,a=new TextEncoder;for(let _ of e){let g=a.encode(_.name),h=pL(_.data),y=_.data.length,T=new Uint8Array(30+g.length),b=new DataView(T.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,r,!0),b.setUint16(12,n,!0),b.setUint32(14,h,!0),b.setUint32(18,y,!0),b.setUint32(22,y,!0),b.setUint16(26,g.length,!0),b.setUint16(28,0,!0),T.set(g,30),s.push(T,_.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,h,!0),x.setUint32(20,y,!0),x.setUint32(24,y,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=T.length+_.data.length}let l=o,c=0;for(let _ of i)c+=_.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.length,m=new Uint8Array(f),p=0;for(let _ of s)m.set(_,p),p+=_.length;for(let _ of i)m.set(_,p),p+=_.length;return m.set(d,p),m}var mL,F_=E(()=>{"use strict";mL=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e})()});import{existsSync as wo,mkdirSync as _L,readdirSync as gL,readFileSync as B_,statSync as yL,unlinkSync as wL,writeFileSync as EL}from"node:fs";import{join as _s}from"node:path";function q_(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await ft(n);if(typeof s=="string")return R(n,s,400);let i=ae(s,"name"),o=ae(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(d,201)}),e.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,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(n,"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(n,'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(n,"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(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),e.post("/api/teams",async n=>{let s=await ft(n);if(typeof s=="string")return R(n,s,400);let i=ae(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),e.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"alias"),a=ae(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=ae(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=ae(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),e.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await ft(n);if(typeof o=="string")return R(n,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(n,"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(n,"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(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),e.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r);return n.json(i.index())}),e.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"name"),a=ae(i,"body"),l=ae(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!go.includes(l))return R(n,`invalid type: must be one of ${go.join("|")}`,400);try{rt(o)}catch(u){return R(n,u.message,400)}let c=ut(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:ae(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),e.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),e.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await ft(n);if(typeof o=="string")return R(n,o,400);let a=ut(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=ae(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?ae(o,"description"):l.description,u=ae(o,"type")??l.type;if(!go.includes(u))return R(n,`invalid type: must be one of ${go.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),e.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(bL(s.local_path))}),e.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"name"),a=ae(i,"body"),l=ae(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!yo.has(l))return R(n,`invalid type: must be one of ${[...yo].join("|")}`,400);try{rt(o)}catch(f){return R(n,f.message,400)}let c=ps(s.local_path),d=_s(c,`${o}.md`);if(wo(d))return R(n,`chapter already exists: ${o}`,409);_L(c,{recursive:!0}),W_(d,o,l,ae(i,"description"),a);let u=hs(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),e.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{rt(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=hs(ps(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),e.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{rt(i)}catch(m){return R(n,m.message,400)}let o=ps(s.local_path),a=hs(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ft(n);if(typeof l=="string")return R(n,l,400);let c=ae(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,u=ae(l,"type")??a.type;if(!yo.has(u))return R(n,`invalid type: must be one of ${[...yo].join("|")}`,400);W_(_s(o,`${i}.md`),i,u,d,c);let f=hs(o,i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{rt(i)}catch(a){return R(n,a.message,400)}let o=_s(ps(s.local_path),`${i}.md`);return wo(o)?(wL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),e.get("/api/tokens",n=>n.json([])),e.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",n=>n.json({})),e.patch("/api/settings",async n=>{let s=await ft(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),e.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(U_))),e.post("/api/chat/sessions",async n=>{let s=await TL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?ae(s,"title"):null,o=r.createChatbotSession(U_,i);return n.json(o,201)}),e.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),e.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"role"),a=ae(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),e.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=$r(r,s),a=[];for(let c of o){let d=vL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=B_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=P_(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(e,t,r){return e.json({error:t},r)}async function ft(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function TL(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let r=JSON.parse(t);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(e,t){let r=e[t];return typeof r!="string"?null:r}function ps(e){return _s(e,"ai-test")}function hs(e,t){let r=_s(e,`${t}.md`);if(!wo(r))return null;let n=B_(r,"utf8"),s=SL(n),i=yL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function bL(e){let t=ps(e);return wo(t)?gL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=hs(t,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function W_(e,t,r,n,s){let i=n!==null&&n.length>0?`
1877
+ `,nd(s,o,"utf8")}function uL(e,t){let r=jr(e,sd);if(!mn(r))return;let n=ho(r,"utf8"),s=new RegExp(`^- \\[${Ch(t)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&nd(r,n.replace(s,""),"utf8")}function Ch(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function fL(e){return e==="user"||e==="feedback"||e==="project"||e==="reference"}function ut(e,t){return e.durable_memory_mode==="db"?new rd(t,e.id):new td(e.local_path)}var lL,sd,Oh,td,rd,id=E(()=>{"use strict";lL=/^[a-zA-Z0-9_-]+$/;sd="MEMORY.md",Oh="1970-01-01T00:00:00.000Z",td=class{dir;constructor(t){this.dir=jr(t,"durable-memory")}read(t){rt(t);let r=jr(this.dir,`${t}.md`);if(!mn(r))return null;let n=ho(r,"utf8");return $h(t,n)}write(t){rt(t.name),iL(this.dir,{recursive:!0});let r=jr(this.dir,`${t.name}.md`),n=!mn(r),s=cL(t.name,t.type,t.description??null,t.body);return nd(r,s,"utf8"),dL(this.dir,t.name,t.type,t.description??null),{created:n}}index(t){return this.listFiles().filter(r=>t===void 0||t.length===0||t.includes(r.type)).map(({name:r,type:n,description:s,updated_at:i})=>({name:r,type:n,description:s,updated_at:i}))}list(t){return this.listFiles().filter(r=>t===void 0||r.type===t).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(t){rt(t);let r=jr(this.dir,`${t}.md`);return mn(r)?(aL(r),uL(this.dir,t),!0):!1}listFiles(){if(!mn(this.dir))return[];let t=oL(this.dir).filter(n=>n.endsWith(".md")&&n!==sd),r=[];for(let n of t){let s=n.slice(0,-3),i=ho(jr(this.dir,n),"utf8"),o=$h(s,i);o!==null&&r.push(o)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};rd=class{dal;projectId;constructor(t,r){this.dal=t,this.projectId=r}read(t){rt(t);let r=this.dal.getDurableMemoryByName(this.projectId,t);return r===null?null:{name:r.name,type:r.type,description:r.description,body:r.body,created_at:r.created_at,updated_at:r.updated_at}}write(t){rt(t.name);let r=this.dal.getDurableMemoryByName(this.projectId,t.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:t.type,name:t.name,description:t.description??null,body:t.body}),{created:r===null}}index(t){return this.dal.indexDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(t){return this.dal.listDurableMemory(this.projectId,t).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(t){return rt(t),this.dal.deleteDurableMemory(this.projectId,t)}}});function jh(e,t){let{dal:r}=t;e.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ut(i,r),a=n.req.query("types"),l=a!==void 0&&a.length>0?a.split(",").map(c=>c.trim()).filter(Boolean):void 0;return n.json(o.index(l))}),e.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),i=n.req.param("name"),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let a=ut(o,r),l;try{l=a.read(i)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${i}`},404):n.json(l)}),e.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o;try{o=await n.req.json()}catch{return n.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,d=typeof o.description=="string"?o.description:null;if(a===null||!Mh.has(a))return n.json({error:`invalid type: must be one of ${[...Mh].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let u=ut(i,r),f;try{({created:f}=u.write({type:a,name:l,description:d,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),e.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let o=ut(i,r),a=n.req.query("type");return n.json(o.list(a))})}var Mh,Dh=E(()=>{"use strict";id();Mh=new Set(["user","feedback","project","reference"])});function pL(e){let t=4294967295;for(let r=0;r<e.length;r+=1)t=(mL[(t^e[r])&255]^t>>>8)>>>0;return(t^4294967295)>>>0}function _L(e){let t=Math.max(1980,e.getFullYear()),r=(e.getHours()&31)<<11|(e.getMinutes()&63)<<5|Math.floor(e.getSeconds()/2)&31,n=(t-1980&127)<<9|(e.getMonth()+1&15)<<5|e.getDate()&31;return{time:r,date:n}}function Ph(e,t=new Date){let{time:r,date:n}=_L(t),s=[],i=[],o=0,a=new TextEncoder;for(let h of e){let g=a.encode(h.name),_=pL(h.data),y=h.data.length,T=new Uint8Array(30+g.length),b=new DataView(T.buffer);b.setUint32(0,67324752,!0),b.setUint16(4,20,!0),b.setUint16(6,0,!0),b.setUint16(8,0,!0),b.setUint16(10,r,!0),b.setUint16(12,n,!0),b.setUint32(14,_,!0),b.setUint32(18,y,!0),b.setUint32(22,y,!0),b.setUint16(26,g.length,!0),b.setUint16(28,0,!0),T.set(g,30),s.push(T,h.data);let I=new Uint8Array(46+g.length),x=new DataView(I.buffer);x.setUint32(0,33639248,!0),x.setUint16(4,20,!0),x.setUint16(6,20,!0),x.setUint16(8,0,!0),x.setUint16(10,0,!0),x.setUint16(12,r,!0),x.setUint16(14,n,!0),x.setUint32(16,_,!0),x.setUint32(20,y,!0),x.setUint32(24,y,!0),x.setUint16(28,g.length,!0),x.setUint16(30,0,!0),x.setUint16(32,0,!0),x.setUint16(34,0,!0),x.setUint16(36,0,!0),x.setUint32(38,0,!0),x.setUint32(42,o,!0),I.set(g,46),i.push(I),o+=T.length+h.data.length}let l=o,c=0;for(let h of i)c+=h.length;let d=new Uint8Array(22),u=new DataView(d.buffer);u.setUint32(0,101010256,!0),u.setUint16(4,0,!0),u.setUint16(6,0,!0),u.setUint16(8,e.length,!0),u.setUint16(10,e.length,!0),u.setUint32(12,c,!0),u.setUint32(16,l,!0),u.setUint16(20,0,!0);let f=l+c+d.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(d,p),m}var mL,Fh=E(()=>{"use strict";mL=(()=>{let e=new Uint32Array(256);for(let t=0;t<256;t+=1){let r=t;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;e[t]=r>>>0}return e})()});import{existsSync as wo,mkdirSync as hL,readdirSync as gL,readFileSync as Bh,statSync as yL,unlinkSync as wL,writeFileSync as EL}from"node:fs";import{join as hs}from"node:path";function qh(e,t){let{dal:r}=t;e.post("/api/projects",async n=>{let s=await ft(n);if(typeof s=="string")return R(n,s,400);let i=ae(s,"name"),o=ae(s,"local_path");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(o===null||o.length===0)return R(n,"missing or empty local_path",400);if(r.findProjectByName(i)!==null)return R(n,`project already exists: ${i}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let u=r.findTeamByName(c);if(u===null)return R(n,`team not found: ${c}`,404);l=u.id}else{let u=r.listTeams();if(u.length===0)return R(n,"no teams exist; create a team first",400);l=u[0].id}let d=r.insertProject({name:i,local_path:o,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(d,201)}),e.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,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(n,"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(n,'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(n,"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(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,o);return a===null?R(n,"project not found",404):n.json(a)}),e.post("/api/teams",async n=>{let s=await ft(n);if(typeof s=="string")return R(n,s,400);let i=ae(s,"name");if(i===null||i.length===0)return R(n,"missing or empty name",400);if(r.findTeamByName(i)!==null)return R(n,`team already exists: ${i}`,409);let o=r.insertTeam({name:i});return n.json(o,201)}),e.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"alias"),a=ae(i,"provider");if(o===null||o.length===0)return R(n,"missing or empty alias",400);if(a===null||a.length===0)return R(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,o)!==null)return R(n,`member already exists: ${o}`,409);let l=ae(i,"model"),c=r.insertTeamMember({team_id:s.id,alias:o,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${o}`}),d=ae(i,"role_prompt");d!==null&&r.setMemberRolePrompt(c.id,d);let u=r.findTeamMemberByAlias(s.id,o);return n.json(u??c,201)}),e.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return R(n,"team not found",404);let i=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(i===null)return R(n,"member not found",404);let o=await ft(n);if(typeof o=="string")return R(n,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(n,"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(n,"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(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return R(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(i.id,a);return l===null?R(n,"member not found",404):n.json(l)}),e.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r);return n.json(i.index())}),e.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"name"),a=ae(i,"body"),l=ae(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!go.includes(l))return R(n,`invalid type: must be one of ${go.join("|")}`,400);try{rt(o)}catch(u){return R(n,u.message,400)}let c=ut(s,r);try{if(c.read(o)!==null)return R(n,`chapter already exists: ${o}`,409)}catch(u){return R(n,u.message,400)}try{c.write({type:l,name:o,description:ae(i,"description"),body:a})}catch(u){return R(n,u.message,400)}let d=c.read(o);return d===null?R(n,"chapter created but unreadable",500):n.json(d,201)}),e.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r),o;try{o=i.read(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o===null?R(n,"chapter not found",404):n.json(o)}),e.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter"),o=await ft(n);if(typeof o=="string")return R(n,o,400);let a=ut(s,r),l;try{l=a.read(i)}catch(m){return R(n,m.message,400)}if(l===null)return R(n,"chapter not found",404);let c=ae(o,"body")??l.body,d=Object.prototype.hasOwnProperty.call(o,"description")?ae(o,"description"):l.description,u=ae(o,"type")??l.type;if(!go.includes(u))return R(n,`invalid type: must be one of ${go.join("|")}`,400);try{a.write({type:u,name:i,description:d,body:c})}catch(m){return R(n,m.message,400)}let f=a.read(i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=ut(s,r),o;try{o=i.delete(n.req.param("chapter"))}catch(a){return R(n,a.message,400)}return o?n.json({removed:!0}):R(n,"chapter not found",404)}),e.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?R(n,"project not found",404):n.json(bL(s.local_path))}),e.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"name"),a=ae(i,"body"),l=ae(i,"type");if(o===null||o.length===0)return R(n,"missing or empty name",400);if(a===null)return R(n,"missing body",400);if(l===null||!yo.has(l))return R(n,`invalid type: must be one of ${[...yo].join("|")}`,400);try{rt(o)}catch(f){return R(n,f.message,400)}let c=ps(s.local_path),d=hs(c,`${o}.md`);if(wo(d))return R(n,`chapter already exists: ${o}`,409);hL(c,{recursive:!0}),Wh(d,o,l,ae(i,"description"),a);let u=_s(c,o);return u===null?R(n,"chapter created but unreadable",500):n.json(u,201)}),e.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);try{rt(n.req.param("chapter"))}catch(o){return R(n,o.message,400)}let i=_s(ps(s.local_path),n.req.param("chapter"));return i===null?R(n,"chapter not found",404):n.json(i)}),e.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{rt(i)}catch(m){return R(n,m.message,400)}let o=ps(s.local_path),a=_s(o,i);if(a===null)return R(n,"chapter not found",404);let l=await ft(n);if(typeof l=="string")return R(n,l,400);let c=ae(l,"body")??a.body,d=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,u=ae(l,"type")??a.type;if(!yo.has(u))return R(n,`invalid type: must be one of ${[...yo].join("|")}`,400);Wh(hs(o,`${i}.md`),i,u,d,c);let f=_s(o,i);return f===null?R(n,"chapter updated but unreadable",500):n.json(f)}),e.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return R(n,"project not found",404);let i=n.req.param("chapter");try{rt(i)}catch(a){return R(n,a.message,400)}let o=hs(ps(s.local_path),`${i}.md`);return wo(o)?(wL(o),n.json({removed:!0})):R(n,"chapter not found",404)}),e.get("/api/tokens",n=>n.json([])),e.post("/api/tokens",n=>R(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),e.get("/api/settings",n=>n.json({})),e.patch("/api/settings",async n=>{let s=await ft(n);return typeof s=="string"?R(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),e.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(Uh))),e.post("/api/chat/sessions",async n=>{let s=await TL(n);if(typeof s=="string")return R(n,s,400);let i=s!==null?ae(s,"title"):null,o=r.createChatbotSession(Uh,i);return n.json(o,201)}),e.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?R(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),e.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return R(n,"chat session not found",404);let i=await ft(n);if(typeof i=="string")return R(n,i,400);let o=ae(i,"role"),a=ae(i,"content");if(o===null||o!=="user"&&o!=="assistant"&&o!=="tool")return R(n,"role must be one of user|assistant|tool",400);if(a===null)return R(n,"missing content",400);let l=r.appendChatbotMessage(s,o,a);return n.json(l,201)}),e.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return R(n,"invalid run id",400);if(r.getRun(s)===null)return R(n,"run not found",404);let o=$r(r,s),a=[];for(let c of o){let d=vL(c),u=null;if(c.content!==null&&c.content!==void 0)u=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=Bh(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);u=new Uint8Array(m)}catch{u=new Uint8Array(0)}u!==null&&a.push({name:d,data:u})}let l=Ph(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(e,t,r){return e.json({error:t},r)}async function ft(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}async function TL(e){let t=await e.req.text().catch(()=>"");if(t.trim().length===0)return null;try{let r=JSON.parse(t);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(e,t){let r=e[t];return typeof r!="string"?null:r}function ps(e){return hs(e,"ai-test")}function _s(e,t){let r=hs(e,`${t}.md`);if(!wo(r))return null;let n=Bh(r,"utf8"),s=SL(n),i=yL(r).mtime.toISOString();return{name:t,type:s.type,description:s.description,body:s.body,updated_at:i}}function bL(e){let t=ps(e);return wo(t)?gL(t).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=_s(t,r);if(n===null)return null;let{name:s,type:i,description:o,updated_at:a}=n;return{name:s,type:i,description:o,updated_at:a}}).filter(r=>r!==null):[]}function Wh(e,t,r,n,s){let i=n!==null&&n.length>0?`
1878
1878
  description: ${n}`:"",o=`---
1879
1879
  name: ${t}${i}
1880
1880
  type: ${r}
1881
1881
  ---
1882
- ${s}`;EL(e,o,"utf8")}function SL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return{type:"scenario",description:null,body:e};let r=t[1],n=t[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function vL(e){let t=e.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=e.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=e.path!==null?kL(e.path):IL(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function kL(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function IL(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var go,yo,U_,H_=E(()=>{"use strict";Ht();F_();id();go=["user","feedback","project","reference"],yo=new Set(["smoke","integration","vision","scenario","regression"]),U_="operator"});function Re(e,t){return`<!doctype html>
1882
+ ${s}`;EL(e,o,"utf8")}function SL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return{type:"scenario",description:null,body:e};let r=t[1],n=t[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:i?.[1]?.trim()??null,body:n}}function vL(e){let t=e.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=e.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=e.path!==null?kL(e.path):IL(e.kind);return`step-${e.step_id}-${t}/${e.id}-${r}${n}`}function kL(e){let t=e.lastIndexOf(".");if(t<0)return"";let r=e.slice(t);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function IL(e){return e.endsWith("_md")||e.includes("markdown")?".md":e.endsWith("_json")||e.includes("json")?".json":".txt"}var go,yo,Uh,Hh=E(()=>{"use strict";Ht();Fh();id();go=["user","feedback","project","reference"],yo=new Set(["smoke","integration","vision","scenario","regression"]),Uh="operator"});function Re(e,t){return`<!doctype html>
1883
1883
  <html lang="en">
1884
1884
  <head>
1885
1885
  <meta charset="utf-8">
@@ -1940,47 +1940,47 @@ ${s}`;EL(e,o,"utf8")}function SL(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1940
1940
  </nav>
1941
1941
  <main>${t}</main>
1942
1942
  </body>
1943
- </html>`}function S(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function fe(e,t){let r=e.map(s=>`<th>${S(s)}</th>`).join(""),n=t.length===0?`<tr><td colspan="${e.length}"><span class="muted">(empty)</span></td></tr>`:t.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(e){return`<pre>${S(JSON.stringify(e,null,2))}</pre>`}var od=E(()=>{"use strict"});import{createHash as NL}from"node:crypto";import{existsSync as gs,mkdirSync as X_,readFileSync as ys,readdirSync as xL,renameSync as AL,statSync as RL,unlinkSync as LL,writeFileSync as Eo}from"node:fs";import{homedir as OL}from"node:os";import{dirname as ad,isAbsolute as J_,join as mt,relative as $L,resolve as pn}from"node:path";import{fileURLToPath as CL}from"node:url";function V_(e){let t=pn(e);for(;;){let r=mt(t,ld);try{if(RL(r).isDirectory())return r}catch{}let n=ad(t);if(n===t)return null;t=n}}function cd(e=process.cwd()){let t=process.env.LMCTL_HOME;if(t!==void 0&&t.trim().length>0)return pn(t);let r=V_(e);return r!==null?r:mt(G_(),ld)}function K_(){return pn(ad(CL(import.meta.url)),"..","..","workflows")}function ML(e){let t=mt(e,Y_);try{let r=JSON.parse(ys(t,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function jL(e,t){X_(e,{recursive:!0});let r=mt(e,Y_),n=`${r}.tmp-${process.pid}`;Eo(n,`${JSON.stringify(t,null,2)}
1944
- `,"utf8"),AL(n,r)}function DL(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string")return t}}function PL(e,t,r,n,s){let i=`${t}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=mt(e,a);try{return Eo(l,n,{flag:"wx"}),a}catch(c){if(DL(c)!=="EEXIST")throw c;if(To(ys(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${t}`)}function FL(e,t){if(J_(t)||ad(t)!=="workflows")return null;let r=t.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=pn(e,"templates","workflows"),s=pn(e,"templates",t),i=$L(n,s);return i.length===0||i.startsWith("..")||J_(i)||i.includes("/")||i.includes("\\")?null:s}function UL(e,t,r){for(let[n,s]of Object.entries(t.files)){if(r.has(n))continue;let i=FL(e,n);if(i===null){delete t.files[n];continue}if(!gs(i)){delete t.files[n];continue}try{if(To(ys(i))!==s)continue;LL(i),delete t.files[n]}catch{}}}function z_(e={}){let t=cd(e.cwd),r=mt(t,"templates","workflows"),n=K_(),s={basedir:t,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=gs(n)?xL(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;X_(r,{recursive:!0});let o=ML(t),a=Et(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=ys(mt(n,c)),f=To(u),m=mt(r,c);if(!gs(m)){try{Eo(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=To(ys(m));if(p===f){o.files[d]=f;continue}let _=o.files[d];if(_!==void 0&&p===_)Eo(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=PL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}UL(t,o,l),jL(t,{version:a,files:o.files})}catch(i){if(e.swallow!==!0)throw i}return s}function dd(e){let t=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&t.push(pn(r));let n=V_(e??process.cwd());return n!==null&&t.push(n),t.push(mt(G_(),ld)),t}function bo(e,t){let r=dd(t),n=[`${e}.compound.json`,`${e}.lmctl`];for(let s of r)for(let i of n){let o=mt(s,"templates","workflows",i);if(gs(o))return o}for(let s of n){let i=mt(K_(),s);if(gs(i))return i}return null}var ld,G_,To,Y_,ud=E(()=>{"use strict";Bn();ld=".lmctl",G_=()=>process.env.HOME??OL(),To=e=>NL("sha256").update(e).digest("hex");Y_=".dist-manifest.json"});function Z_(e,t){if(t.query(`SELECT sa.id FROM step_artifact sa
1943
+ </html>`}function S(e){return String(e??"").replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function fe(e,t){let r=e.map(s=>`<th>${S(s)}</th>`).join(""),n=t.length===0?`<tr><td colspan="${e.length}"><span class="muted">(empty)</span></td></tr>`:t.map(s=>`<tr>${s.map(i=>`<td>${i}</td>`).join("")}</tr>`).join("");return`<table><thead><tr>${r}</tr></thead><tbody>${n}</tbody></table>`}function de(e){return`<pre>${S(JSON.stringify(e,null,2))}</pre>`}var od=E(()=>{"use strict"});import{createHash as NL}from"node:crypto";import{existsSync as gs,mkdirSync as Xh,readFileSync as ys,readdirSync as xL,renameSync as AL,statSync as RL,unlinkSync as LL,writeFileSync as Eo}from"node:fs";import{homedir as OL}from"node:os";import{dirname as ad,isAbsolute as Jh,join as mt,relative as $L,resolve as pn}from"node:path";import{fileURLToPath as CL}from"node:url";function Vh(e){let t=pn(e);for(;;){let r=mt(t,ld);try{if(RL(r).isDirectory())return r}catch{}let n=ad(t);if(n===t)return null;t=n}}function cd(e=process.cwd()){let t=process.env.LMCTL_HOME;if(t!==void 0&&t.trim().length>0)return pn(t);let r=Vh(e);return r!==null?r:mt(Gh(),ld)}function Kh(){return pn(ad(CL(import.meta.url)),"..","..","workflows")}function ML(e){let t=mt(e,Yh);try{let r=JSON.parse(ys(t,"utf8"));if(r&&typeof r=="object"&&r.files&&typeof r.files=="object")return{version:String(r.version??""),files:r.files}}catch{}return{version:"",files:{}}}function jL(e,t){Xh(e,{recursive:!0});let r=mt(e,Yh),n=`${r}.tmp-${process.pid}`;Eo(n,`${JSON.stringify(t,null,2)}
1944
+ `,"utf8"),AL(n,r)}function DL(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string")return t}}function PL(e,t,r,n,s){let i=`${t}.dist-${r}`;for(let o=0;o<1e3;o+=1){let a=o===0?i:`${i}-${o}`,l=mt(e,a);try{return Eo(l,n,{flag:"wx"}),a}catch(c){if(DL(c)!=="EEXIST")throw c;if(To(ys(l))===s)return a}}throw new Error(`could not find available dist shadow path for ${t}`)}function FL(e,t){if(Jh(t)||ad(t)!=="workflows")return null;let r=t.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=pn(e,"templates","workflows"),s=pn(e,"templates",t),i=$L(n,s);return i.length===0||i.startsWith("..")||Jh(i)||i.includes("/")||i.includes("\\")?null:s}function UL(e,t,r){for(let[n,s]of Object.entries(t.files)){if(r.has(n))continue;let i=FL(e,n);if(i===null){delete t.files[n];continue}if(!gs(i)){delete t.files[n];continue}try{if(To(ys(i))!==s)continue;LL(i),delete t.files[n]}catch{}}}function zh(e={}){let t=cd(e.cwd),r=mt(t,"templates","workflows"),n=Kh(),s={basedir:t,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let i=gs(n)?xL(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(i.length===0)return s;Xh(r,{recursive:!0});let o=ML(t),a=Et(),l=new Set(i.map(c=>`workflows/${c}`));for(let c of i){let d=`workflows/${c}`,u=ys(mt(n,c)),f=To(u),m=mt(r,c);if(!gs(m)){try{Eo(m,u,{flag:"wx"}),s.copied.push(c)}catch{}o.files[d]=f;continue}let p=To(ys(m));if(p===f){o.files[d]=f;continue}let h=o.files[d];if(h!==void 0&&p===h)Eo(m,u),o.files[d]=f,s.refreshed.push(c);else{let g=PL(r,c,a,u,f);s.preserved.push(c),s.shadowed.push(g)}}UL(t,o,l),jL(t,{version:a,files:o.files})}catch(i){if(e.swallow!==!0)throw i}return s}function dd(e){let t=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&t.push(pn(r));let n=Vh(e??process.cwd());return n!==null&&t.push(n),t.push(mt(Gh(),ld)),t}function bo(e,t){let r=dd(t),n=[`${e}.compound.json`,`${e}.lmctl`];for(let s of r)for(let i of n){let o=mt(s,"templates","workflows",i);if(gs(o))return o}for(let s of n){let i=mt(Kh(),s);if(gs(i))return i}return null}var ld,Gh,To,Yh,ud=E(()=>{"use strict";Bn();ld=".lmctl",Gh=()=>process.env.HOME??OL(),To=e=>NL("sha256").update(e).digest("hex");Yh=".dist-manifest.json"});function Zh(e,t){if(t.query(`SELECT sa.id FROM step_artifact sa
1945
1945
  JOIN step s ON s.id = sa.step_id
1946
1946
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,e).length>0)return;let n=t.getRun(e);if(n===null)return;let s=t.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e);if(s.length===0)return;let i=s[0].id,o=t.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",e),a=t.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1947
1947
  JOIN step s ON s.id = sa.step_id
1948
- WHERE s.run_id = ? ORDER BY sa.id ASC`,e),l=new Map;for(let A of a){let ee=l.get(A.step_id)??[];ee.push({kind:A.kind,id:A.id}),l.set(A.step_id,ee)}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)??[]})),d=t.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",e),u=t.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",e),f=0;for(let A of u)try{let ee=JSON.parse(A.payload);typeof ee.elapsedMs=="number"&&ee.elapsedMs>0&&(f+=ee.elapsedMs)}catch{}let m=d.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"),_=[...new Set(p.map(A=>A.state_name))],g=new Date(n.started_at).getTime(),h=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),T=t.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,b=T!==null?t.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1949
- WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,T,g,h):[],x=t.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1950
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],H=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",me=t.getWorkflow(n.workflow_id),U=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:e,workflow_name:me?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:U,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:_},drift_signals:b,token_totals:H};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(M)})}var Q_=E(()=>{"use strict"});import{spawnSync as tg}from"node:child_process";function fd(e){return WL[e]??`no install hint; ensure '${e}' is on PATH`}function BL(e){switch(e){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 eg(e){return tg("which",[e],{encoding:"utf8"}).status===0}function rg(e){if(e===void 0)return null;for(let t of e.tools??[])if(!eg(t)){let r=fd(t);return{kind:"missing_tool",tool:t,install_hint:r,message:`missing dependency: ${t}; ${r}`}}for(let t of e.auth??[]){if(!eg(t)){let s=fd(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let r=BL(t);if(r===null)continue;let n=tg(t,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:t,install_hint:fd(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var WL,ng=E(()=>{"use strict";WL={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"}});import{existsSync as qL,readdirSync as HL,readFileSync as JL}from"node:fs";import{join as sg}from"node:path";function XL(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return[];let r=t[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1951
- `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function ig(e,t){let r=e.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${t}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function og(e,t){if(t.length===0)return null;let r=sg(e,"durable-memory");if(!qL(r))return null;let n;try{n=HL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=JL(sg(r,i),"utf8");if(XL(o).some(l=>t.includes(l))){let l=ig(o,"name")??i.replace(".md",""),c=ig(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 ag=E(()=>{"use strict"});function hd(e){let t=e.trim().replace(GL,"").trim();for(let r=0;r<4;r+=1){let n=VL.exec(t);if(n===null)break;t=n[2].trim()}return t}function lg(e){let t=e.trim(),r=KL.exec(t);if(r!==null)return r[2];let n=YL.exec(t);return n!==null?n[0]:null}function ws(e,t){let r=e.split(`
1952
- `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=hd(r[o]),l=md.exec(a);if(l===null)continue;let c=l[1].trim();if(pd.test(c))continue;let d=lg(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!t.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=hd(r[o]),l=md.exec(a);if(l===null)break;let c=pd.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function cg(e){let t=e.split(`
1953
- `),r=null;for(let n=0;n<t.length;n+=1){let s=hd(t[n]),i=md.exec(s);if(i===null)continue;let o=i[1].trim();if(pd.test(o))continue;let a=lg(o);if(a===null||!Kr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var GL,VL,md,pd,KL,YL,_d=E(()=>{"use strict";Yn();GL=/^#{1,6}\s+/,VL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,md=/^STANCE:\s+(.+)$/,pd=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,KL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,YL=/^[A-Za-z0-9_-]+/});function dg(e,t,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){e.insertSessionEvent({run_id:t,step_id:s,kind:n.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 d=e.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else e.insertSessionEvent({run_id:t,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var ug=E(()=>{"use strict"});import{readFileSync as zL}from"node:fs";import{dirname as ZL,join as QL}from"node:path";import{fileURLToPath as eO}from"node:url";function nO(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function aO(e){let t=[],r=[];for(let n of e)tO.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function lO(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&rO.test(e[r]);)r+=1;if(r>=e.length)return{matched:!1};let n=e[r],s=e.slice(r+1);for(let i of t)if(n===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 cO(e,t){if(e.length===0)return{matched:!1};let r=aO(e);for(let n of r){let s=lO(n,t);if(s.matched)return s}return{matched:!1}}function gd(e){return cO(e,oO)}function dO(e){return e.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,t=>` ${t} `).replace(/(?<!\d)<{1,2}/g,t=>` ${t} `).replace(/\s+/g," ").trim()}function yd(e){return dO(e).split(" ").filter(t=>t.length>0)}var tO,rO,sO,iO,oO,fg=E(()=>{"use strict";tO=new Set(["&&","||",";","|",">",">>","<","<<"]),rO=/^[A-Za-z_][A-Za-z0-9_]*=/;sO=ZL(eO(import.meta.url)),iO=JSON.parse(zL(QL(sO,"side_effect_classifier.json"),"utf-8")),oO=nO(iO)});function So(e){return{context:{outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index},outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index}}async function mg(e,t){try{return await Mr(wd(e)??e,So(t))===!0}catch{return!1}}async function vo(e,t){try{return await Mr(wd(e)??e,So(t))}catch{return}}async function pg(e,t){if(typeof e!="string")return e;let r=wd(e);if(r===null)return e;try{return await Mr(r,So(t))}catch{return}}async function hg(e,t){let r=Array.from(e.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return e;let n="",s=0;for(let i of r){let o=i.index??0;n+=e.slice(s,o);let a=i[1]?.trim()??"";try{n+=uO(await Mr(a,So(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function wd(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function uO(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var Es=E(()=>{"use strict";us()});import{existsSync as _g,readdirSync as gg,readFileSync as fO,statSync as yg}from"node:fs";import{join as Io}from"node:path";function wg(e,t,r,n){return Object.assign(e,{stateId:t,state:r,displayName:n})}function B(e,t){return e.dal.insertStep({...t,parent_step_id:e.parent_step_id})}function X(e,t){return t.startsWith("@terminal:")?{kind:"terminal",terminal:t.slice(10)}:e.states[t]===void 0?{kind:"escalate",token:t,reason:`unknown state ref '${t}'`}:{kind:"state",state:t}}function nt(e,t,r,n,s={}){let i=$(),o=B(e,{run_id:e.run_id,state_name:t.name});e.steps_executed+=1,e.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),e.dal.setRunPausedState(e.run_id,`${Ts}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Kr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ii,severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify({run_id:e.run_id,step_id:o.id,project_id:e.project.id,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:t.id,name:t.name,type:t.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:mO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function mO(e){return e.length>8e3?`${e.slice(0,8e3)}
1954
- \u2026[truncated ${e.length-8e3} chars]`:e}function G(e,t,r,n){e.outcomes[t]=n,r!==t&&(e.outcomes[r]=n)}function Y(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function Eg(e,t){let r=t.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=ur(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ve(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=ur(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=ur(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=pO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return hg(n,t)}function pO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function ur(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function bs(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=dg(t.dal,t.run_id,()=>i),c=Ed(t,r),d={violation:null},u=y=>{if(l(y),d.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let T=yd(y.summary),b=gd(T);b.matched&&!c&&(d.violation={summary:y.summary,kind:b.kind})}},f=new Date(Date.now()-1),m=0,p=0,_=y=>{u(y),hO(y,(T,b)=>{m+=T,p+=b})},g=await Mi({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:_});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:qe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),_O(t.project,t.dal,f);let h=d.violation;return h!==null?{kind:"g3_violation",summary:h.summary,violationKind:h.kind}:!a&&t.project.local_path.trim().length>0&&Td(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function hO(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=ko(s.input_tokens),a=ko(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=ko(i.input_tokens),a=ko(i.output_tokens);(o>0||a>0)&&t(o,a)}}function ko(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Gt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=B(e,{run_id:e.run_id,state_name:s});e.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} 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 bs({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function hn(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=B(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Dm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ve(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1955
-
1956
- `);try{let p=await bs({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let _=ws(p.text,s);return e.dal.finishStep(d.id,_.outcome,_.outcome!==null?`chat_ms=${p.ms}`:_.reason),_.outcome!==null&&(e.outcomes[t]=_.outcome),{outcome:_.outcome,text:p.text,status_detail:_.outcome!==null?`chat_ms=${p.ms}`:_.reason}}catch(p){let _=p instanceof ve?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,_),{outcome:null,text:"",status_detail:_}}}function _n(e,t){return(t?.length??0)>0?og(e.project.local_path,t):null}function Tg(e){return gd(yd(e))}function Ed(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
1948
+ WHERE s.run_id = ? ORDER BY sa.id ASC`,e),l=new Map;for(let A of a){let ee=l.get(A.step_id)??[];ee.push({kind:A.kind,id:A.id}),l.set(A.step_id,ee)}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)??[]})),d=t.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",e),u=t.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",e),f=0;for(let A of u)try{let ee=JSON.parse(A.payload);typeof ee.elapsedMs=="number"&&ee.elapsedMs>0&&(f+=ee.elapsedMs)}catch{}let m=d.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))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),T=t.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,b=T!==null?t.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1949
+ WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,T,g,_):[],x=t.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1950
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],H=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",pe=t.getWorkflow(n.workflow_id),U=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,M={run_id:e,workflow_name:pe?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:U,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:b,token_totals:H};t.insertStepArtifact({step_id:i,kind:"run_report",content:JSON.stringify(M)})}var Qh=E(()=>{"use strict"});import{spawnSync as tg}from"node:child_process";function fd(e){return WL[e]??`no install hint; ensure '${e}' is on PATH`}function BL(e){switch(e){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 eg(e){return tg("which",[e],{encoding:"utf8"}).status===0}function rg(e){if(e===void 0)return null;for(let t of e.tools??[])if(!eg(t)){let r=fd(t);return{kind:"missing_tool",tool:t,install_hint:r,message:`missing dependency: ${t}; ${r}`}}for(let t of e.auth??[]){if(!eg(t)){let s=fd(t);return{kind:"missing_tool",tool:t,install_hint:s,message:`missing dependency: ${t}; ${s}`}}let r=BL(t);if(r===null)continue;let n=tg(t,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:t,install_hint:fd(t),message:`${t} not authenticated; run \`${t} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var WL,ng=E(()=>{"use strict";WL={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"}});import{existsSync as qL,readdirSync as HL,readFileSync as JL}from"node:fs";import{join as sg}from"node:path";function XL(e){let t=e.match(/^---\n([\s\S]*?)\n---/);if(!t)return[];let r=t[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(i=>i.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1951
+ `).map(i=>i.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function ig(e,t){let r=e.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${t}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function og(e,t){if(t.length===0)return null;let r=sg(e,"durable-memory");if(!qL(r))return null;let n;try{n=HL(r).filter(i=>i.endsWith(".md")&&i!=="index.md")}catch{return null}let s=[];for(let i of n)try{let o=JL(sg(r,i),"utf8");if(XL(o).some(l=>t.includes(l))){let l=ig(o,"name")??i.replace(".md",""),c=ig(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 ag=E(()=>{"use strict"});function _d(e){let t=e.trim().replace(GL,"").trim();for(let r=0;r<4;r+=1){let n=VL.exec(t);if(n===null)break;t=n[2].trim()}return t}function lg(e){let t=e.trim(),r=KL.exec(t);if(r!==null)return r[2];let n=YL.exec(t);return n!==null?n[0]:null}function ws(e,t){let r=e.split(`
1952
+ `),n=null,s=-1;for(let o=0;o<r.length;o+=1){let a=_d(r[o]),l=md.exec(a);if(l===null)continue;let c=l[1].trim();if(pd.test(c))continue;let d=lg(c);d!==null&&(n=d,s=o)}if(n===null)return{outcome:null,reason:"no_stance"};if(!t.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let i={};for(let o=s-1;o>=0;o-=1){let a=_d(r[o]),l=md.exec(a);if(l===null)break;let c=pd.exec(l[1].trim());if(c===null)break;i[c[1]]=c[2].trim()}return{outcome:n,evidence:i}}function cg(e){let t=e.split(`
1953
+ `),r=null;for(let n=0;n<t.length;n+=1){let s=_d(t[n]),i=md.exec(s);if(i===null)continue;let o=i[1].trim();if(pd.test(o))continue;let a=lg(o);if(a===null||!Kr(a))continue;let c=o.slice(o.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var GL,VL,md,pd,KL,YL,hd=E(()=>{"use strict";Yn();GL=/^#{1,6}\s+/,VL=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,md=/^STANCE:\s+(.+)$/,pd=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,KL=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,YL=/^[A-Za-z0-9_-]+/});function dg(e,t,r){return n=>{let s=r(),i=Date.now(),o=JSON.stringify({kind:n.kind,tool:n.tool??null,summary:n.summary??null,id:n.id??null,elapsedMs:n.elapsedMs??null,status:n.status??null}),a=Buffer.byteLength(o,"utf8");if(a<=262144){e.insertSessionEvent({run_id:t,step_id:s,kind:n.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 d=e.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:o});e.insertSessionEvent({run_id:t,step_id:s,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:d.id})}else e.insertSessionEvent({run_id:t,step_id:null,kind:n.kind,timestamp_ms:i,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var ug=E(()=>{"use strict"});import{readFileSync as zL}from"node:fs";import{dirname as ZL,join as QL}from"node:path";import{fileURLToPath as eO}from"node:url";function nO(e){return e.rules.map(t=>({command:t.command,subcommands:t.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:t.kind}))}function aO(e){let t=[],r=[];for(let n of e)tO.has(n)?(r.length>0&&t.push(r),r=[]):r.push(n);return r.length>0&&t.push(r),t}function lO(e,t){if(e.length===0)return{matched:!1};let r=0;for(;r<e.length&&rO.test(e[r]);)r+=1;if(r>=e.length)return{matched:!1};let n=e[r],s=e.slice(r+1);for(let i of t)if(n===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 cO(e,t){if(e.length===0)return{matched:!1};let r=aO(e);for(let n of r){let s=lO(n,t);if(s.matched)return s}return{matched:!1}}function gd(e){return cO(e,oO)}function dO(e){return e.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,t=>` ${t} `).replace(/(?<!\d)<{1,2}/g,t=>` ${t} `).replace(/\s+/g," ").trim()}function yd(e){return dO(e).split(" ").filter(t=>t.length>0)}var tO,rO,sO,iO,oO,fg=E(()=>{"use strict";tO=new Set(["&&","||",";","|",">",">>","<","<<"]),rO=/^[A-Za-z_][A-Za-z0-9_]*=/;sO=ZL(eO(import.meta.url)),iO=JSON.parse(zL(QL(sO,"side_effect_classifier.json"),"utf-8")),oO=nO(iO)});function So(e){return{context:{outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index},outcomes:e.outcomes,inputs:e.inputs,item:e.iteration?.item,index:e.iteration?.index}}async function mg(e,t){try{return await Mr(wd(e)??e,So(t))===!0}catch{return!1}}async function vo(e,t){try{return await Mr(wd(e)??e,So(t))}catch{return}}async function pg(e,t){if(typeof e!="string")return e;let r=wd(e);if(r===null)return e;try{return await Mr(r,So(t))}catch{return}}async function _g(e,t){let r=Array.from(e.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return e;let n="",s=0;for(let i of r){let o=i.index??0;n+=e.slice(s,o);let a=i[1]?.trim()??"";try{n+=uO(await Mr(a,So(t)))}catch{n+=""}s=o+i[0].length}return n+=e.slice(s),n}function wd(e){let t=e.trim();return!t.startsWith("={{")||!t.endsWith("}}")?null:t.slice(3,-2).trim()}function uO(e){return e==null?"":typeof e=="string"?e:JSON.stringify(e)}var Es=E(()=>{"use strict";us()});import{existsSync as hg,readdirSync as gg,readFileSync as fO,statSync as yg}from"node:fs";import{join as Io}from"node:path";function wg(e,t,r,n){return Object.assign(e,{stateId:t,state:r,displayName:n})}function q(e,t){return e.dal.insertStep({...t,parent_step_id:e.parent_step_id})}function X(e,t){return t.startsWith("@terminal:")?{kind:"terminal",terminal:t.slice(10)}:e.states[t]===void 0?{kind:"escalate",token:t,reason:`unknown state ref '${t}'`}:{kind:"state",state:t}}function nt(e,t,r,n,s={}){let i=$(),o=q(e,{run_id:e.run_id,state_name:t.name});e.steps_executed+=1,e.dal.finishStep(o.id,null,`escalation:${n}`.slice(0,480)),e.dal.setRunPausedState(e.run_id,`${Ts}${t.id}`,i);let a=e.dal.getRun(e.run_id),l=Kr(r)?"generic":"unhandled";return e.dal.raiseAttention({kind:ii,severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify({run_id:e.run_id,step_id:o.id,project_id:e.project.id,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:t.id,name:t.name,type:t.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:mO(s.agent_output??n),paused_at:i,created_at:i})}),e.dal.pauseJob(e.job.id),{kind:"paused"}}function mO(e){return e.length>8e3?`${e.slice(0,8e3)}
1954
+ \u2026[truncated ${e.length-8e3} chars]`:e}function G(e,t,r,n){e.outcomes[t]=n,r!==t&&(e.outcomes[r]=n)}function Y(e){return e.terminals.aborted?.kind==="failure"?"aborted":Object.entries(e.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(e.terminals)[0]??"aborted"}function Eg(e,t){let r=t.trim();if(r.startsWith("[")){try{let n=JSON.parse(r);if(Array.isArray(n)&&n.every(s=>typeof s=="string"))return n}catch{return null}return null}if(r.startsWith("job.payload.")){let n=r.slice(12);if(n.length===0)return null;let i=ur(e.job.payload)?.[n];if(Array.isArray(i)&&i.every(o=>typeof o=="string"))return i}return null}async function Ve(e,t,r){let n=e.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,i)=>{if(i==="run_id")return String(t.run_id);if(i==="state_id")return r;if(i==="item")return t.iteration?.item??"";if(i==="index")return t.iteration===null?"":String(t.iteration.index);if(i.startsWith("project.")){let o=i.slice(8);if(o==="id")return String(t.project.id);if(o==="name")return t.project.name;if(o==="local_path")return t.project.local_path;if(o==="default_branch")return t.project.default_branch??"";if(o==="owner"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(0,a):""}if(o==="repo"){let a=t.project.name.indexOf("/");return a>0?t.project.name.slice(a+1):t.project.name}if(o==="test_command"){let a=t.project.test_command;return a===null||a===""?"npm test":a}return""}if(i==="job_payload"){let o=ur(t.job.payload);return o===null?"":JSON.stringify(o)}if(i.startsWith("job_payload.")){let o=i.slice(12),l=ur(t.job.payload)?.[o];return l==null?"":String(l)}if(i.startsWith("outcomes.")){let o=pO(t.outcomes,i.slice(9));return o==null?"":typeof o=="string"?o:JSON.stringify(o)}return""});return _g(n,t)}function pO(e,t){let r=e;for(let n of t.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function ur(e){if(e===null)return null;try{let t=JSON.parse(e);return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}async function bs(e){let{context:t,stateId:r,member:n,prompt:s,stepId:i,timeoutMs:o,writesToProjectPath:a}=e,l=dg(t.dal,t.run_id,()=>i),c=Ed(t,r),d={violation:null},u=y=>{if(l(y),d.violation===null&&y.kind==="tool_use"&&y.tool==="Bash"&&y.summary){let T=yd(y.summary),b=gd(T);b.matched&&!c&&(d.violation={summary:y.summary,kind:b.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=y=>{u(y),_O(y,(T,b)=>{m+=T,p+=b})},g=await Mi({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:o,dal:t.dal,team_member_id:n.id,onProgress:h});t.dal.insertSessionEvent({run_id:t.run_id,step_id:i,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:qe(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),hO(t.project,t.dal,f);let _=d.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&t.project.local_path.trim().length>0&&Td(t.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function _O(e,t){let r=e.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let o=ko(s.input_tokens),a=ko(s.output_tokens);(o>0||a>0)&&t(o,a);return}let i=r.usage;if(i!==void 0){let o=ko(i.input_tokens),a=ko(i.output_tokens);(o>0||a>0)&&t(o,a)}}function ko(e){return typeof e=="number"&&Number.isFinite(e)&&e>=0?e:0}async function Gt(e,t,r,n){if(r.sessionid===null)return;let s=`${t}:write_back`,i=q(e,{run_id:e.run_id,state_name:s});e.steps_executed+=1;let a=`This state completed successfully.${typeof n=="string"?` Category hint: "${n}".`:""} 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 bs({context:e,stateId:s,member:r,prompt:a,stepId:i.id,timeoutMs:e.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){e.dal.insertStepArtifact({step_id:i.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");e.dal.finishStep(i.id,c?"wrote_back":"no_writeback","write_back_turn")}else e.dal.finishStep(i.id,null,`write_back_${l.kind}`)}catch{e.dal.finishStep(i.id,null,"write_back_error")}}async function _n(e,t,r,n,s,i,o,a=!1,l){let c=e.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let d=q(e,{run_id:e.run_id,state_name:t});e.steps_executed+=1;let u=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&u.push(c.prompt_snapshot),i&&u.push(Dm(s)),l!=null&&l.length>0&&u.push(l);let f=r.prompt_template!==void 0?await Ve(r.prompt_template,e,t):"";f.length>0&&u.push(f),n!==null&&n.length>0&&u.push(n);let m=u.join(`
1955
+
1956
+ `);try{let p=await bs({context:e,stateId:t,member:c,prompt:m,stepId:d.id,timeoutMs:o,writesToProjectPath:a});if(p.kind==="g3_violation"||p.kind==="g2_violation"){let g=p.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${p.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:t,kind:p.violationKind,command_summary:p.summary,message:`State ${t} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:t,message:`State ${t} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,g),{outcome:null,text:"",status_detail:g}}if(e.dal.insertStepArtifact({step_id:d.id,kind:`${t}_transcript`,content:p.text}),e.transcripts[t]=p.text,!i)return e.dal.finishStep(d.id,"done",`chat_ms=${p.ms}`),e.outcomes[t]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=ws(p.text,s);return e.dal.finishStep(d.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(e.outcomes[t]=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 ve?`chat_${p.kind}`:"chat_other";return e.dal.finishStep(d.id,null,h),{outcome:null,text:"",status_detail:h}}}function hn(e,t){return(t?.length??0)>0?og(e.project.local_path,t):null}function Tg(e){return gd(yd(e))}function Ed(e,t){let r=e.dal.query(`SELECT state_name, outcome FROM step
1957
1957
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1958
- ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(r.length===0)return!1;let n=r[0];return e.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Td(e,t){if(!_g(e))return!1;let r=Io(e,"durable-memory");function n(s){let i;try{i=gg(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=Io(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(yg(a).mtime>t)return!0}catch{}}return!1}return n(e)}function _O(e,t,r){let n=Io(e.local_path,"durable-memory");if(!_g(n))return;let s;try{s=gg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=Io(n,i),a;try{a=yg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=fO(o,"utf8")}catch{continue}let c=yO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1959
- `);continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function yO(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!gO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Ts,gO,Je=E(()=>{"use strict";Qe();dn();ji();ag();_d();Yn();ug();fg();Es();Ts="__paused__:";gO=new Set(["user","feedback","project","reference"])});import{spawnSync as bg}from"node:child_process";function wO(e,t){let r=e.stateId,n=e.displayName,s=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=bg("git",["diff","--quiet"],{cwd:i}).status!==0,a=bg("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),G(e,r,n,Pc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),G(e,r,n,"clean"),X(e.workflow,t.next)}var Sg,vg=E(()=>{"use strict";Je();Sg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:e=>wO(e,e.state)}});async function EO(e,t){let r=e.stateId,n=e.displayName,s=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;for(let i of t.branches)if(await mg(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),G(e,r,n,"matched"),X(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),G(e,r,n,"no_match"),t.default_next!==void 0?X(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var kg,Ig=E(()=>{"use strict";Je();Es();kg={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async e=>EO(e,e.state)}});async function TO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=_n(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let _=`${n}:researcher_${m.alias}[${p}]`,g=await hn(e,_,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1958
+ ORDER BY started_at DESC, id DESC LIMIT 1`,e.run_id,t);if(r.length===0)return!1;let n=r[0];return e.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Td(e,t){if(!hg(e))return!1;let r=Io(e,"durable-memory");function n(s){let i;try{i=gg(s,{withFileTypes:!0})}catch{return!1}for(let o of i){if(o.name===".git")continue;let a=Io(s,o.name);if(a!==r)if(o.isDirectory()){if(n(a))return!0}else try{if(yg(a).mtime>t)return!0}catch{}}return!1}return n(e)}function hO(e,t,r){let n=Io(e.local_path,"durable-memory");if(!hg(n))return;let s;try{s=gg(n)}catch{return}for(let i of s){if(!i.endsWith(".md")||i==="MEMORY.md")continue;let o=Io(n,i),a;try{a=yg(o).mtime}catch{continue}if(a<=r)continue;let l;try{l=fO(o,"utf8")}catch{continue}let c=yO(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${i} has no valid frontmatter, skipping
1959
+ `),P({event:"durable_memory_frontmatter_invalid",project_id:e.id,file:i,path:o});continue}if(e.durable_memory_mode==="db")try{t.upsertDurableMemory({project_id:e.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function yO(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=i?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!gO.has(l)?null:{name:a,type:l,description:o?.[1]?.trim()??null,body:n}}var Ts,gO,Je=E(()=>{"use strict";Qe();dn();ji();ag();hd();Yn();ug();me();fg();Es();Ts="__paused__:";gO=new Set(["user","feedback","project","reference"])});import{spawnSync as bg}from"node:child_process";function wO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.project.local_path,o=bg("git",["diff","--quiet"],{cwd:i}).status!==0,a=bg("git",["diff","--cached","--quiet"],{cwd:i}).status!==0;if(o||a){let l=t.fail_message??"repository has uncommitted changes";return e.dal.finishStep(s.id,null,l),G(e,r,n,Pc),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.finishStep(s.id,"clean","repo_clean"),G(e,r,n,"clean"),X(e.workflow,t.next)}var Sg,vg=E(()=>{"use strict";Je();Sg={description:{displayName:"Assert Repo Clean",name:"assert-repo-clean",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:e=>wO(e,e.state)}});async function EO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;for(let i of t.branches)if(await mg(i.when,e))return e.dal.finishStep(s.id,"matched",i.when),G(e,r,n,"matched"),X(e.workflow,i.next);return e.dal.finishStep(s.id,"no_match","choice_no_match"),G(e,r,n,"no_match"),t.default_next!==void 0?X(e.workflow,t.default_next):{kind:"terminal",terminal:e.workflow.terminals.no_match?"no_match":Y(e.workflow)}}var kg,Ig=E(()=>{"use strict";Je();Es();kg={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async e=>EO(e,e.state)}});async function TO(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms,i=t.researchers??[],o=hn(e,t.durable_memory_tags),a=new Array(i.length).fill(null);await Promise.all(i.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await _n(e,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,o);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${i[p]?.topic??""}
1960
1960
  ${m}`:null).filter(m=>m!==null).join(`
1961
1961
 
1962
- `),c=`${n}:consolidator`,d=await hn(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=B(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&G(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?X(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=t.research_artifact_prefix??n;if(e.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),e.dal.finishStep(u.id,"ok","consolidated"),G(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Gt(e,n,m,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.ok)}var Ng,xg=E(()=>{"use strict";Je();Ng={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>TO(e,e.state)}});async function bO(e,t){let r=e.stateId,n=e.displayName,s=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.progress_step_id;e.progress_step_id=s.id;try{let o=await vo(t.items_from,e),a=IO(o);if(a===null){e.dal.finishStep(s.id,null,`foreach_invalid_items:${t.items_from}`);let f=t.outcomes.any_failed;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await vO(e,t,s.id,a,l):await SO(e,t,s.id,a,l);if(l.routed!==null)return e.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(e.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),G(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function SO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await Rg(e,t,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&t.on_item_failure==="stop"))break}return i}async function vO(e,t,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(t.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await Rg(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function Rg(e,t,r,n,s,i){let o=e.iteration;e.iteration={item:n,index:s};let a=`${e.displayName}[${s}]`;e.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await e.dispatchState(a,t.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{e.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&e.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":kO(e.outcomes[a]);return e.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:d}}),{index:s,value:n,outcome:d}}function kO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function IO(e){if(!Array.isArray(e))return null;let t=[];for(let r of e)if(typeof r=="string")t.push(r);else if(typeof r=="number"||typeof r=="boolean")t.push(String(r));else return null;return t}var Ag,Lg=E(()=>{"use strict";Je();Es();Ag={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>bO(e,e.state)}});async function NO(e,t){let r=e.stateId,n=e.displayName,s=t.termination.timeout_seconds!==void 0?t.termination.timeout_seconds*1e3:void 0,i=e.membersByAlias.get(t.agent.alias);if(i===void 0||i.sessionid===null){let f=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(f.id,null,`missing_agent:${t.agent.alias}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=_n(e,t.durable_memory_tags),a=e.dal.getInteractiveSessionByRunAndState(e.run_id,r);if(a!==null){if(a.status==="done")return e.dal.finishStep(a.step_id,"done","operator_done"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=t.termination.max_turns){e.dal.finishStep(a.step_id,"timeout",`max_turns=${t.termination.max_turns}`),G(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?X(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await bs({context:e,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),G(e,r,n,"done"),t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(Og({context:e,state:t,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof ve?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}}return{kind:"paused"}}let l=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await Ve(t.agent.initial_prompt_template,e,n),u=o?`${o}
1962
+ `),c=`${n}:consolidator`,d=await _n(e,c,t.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,o),u=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,d.outcome===null||d.outcome==="error"){e.dal.finishStep(u.id,d.outcome,d.status_detail),d.outcome==="error"&&G(e,r,n,"error");let m=t.outcomes.error;return m!==void 0?X(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=t.research_artifact_prefix??n;if(e.dal.insertStepArtifact({step_id:u.id,kind:`${f}_consolidated`,content:d.text}),e.dal.finishStep(u.id,"ok","consolidated"),G(e,r,n,"ok"),t.write_back_durable_memory){let m=e.membersByAlias.get(t.consolidator.alias);m!==void 0&&await Gt(e,n,m,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.ok)}var Ng,xg=E(()=>{"use strict";Je();Ng={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>TO(e,e.state)}});async function bO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.progress_step_id;e.progress_step_id=s.id;try{let o=await vo(t.items_from,e),a=IO(o);if(a===null){e.dal.finishStep(s.id,null,`foreach_invalid_items:${t.items_from}`);let f=t.outcomes.any_failed;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let l={routed:null},c=t.mode==="parallel"?await vO(e,t,s.id,a,l):await SO(e,t,s.id,a,l);if(l.routed!==null)return e.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let d=c.some(f=>f.outcome===null||f.outcome==="__failure__"),u=d?"any_failed":"all_ok";if(e.dal.finishStep(s.id,u,JSON.stringify({iterations:c,count:a.length})),G(e,r,n,u),d){let f=t.outcomes.any_failed;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.all_ok)}finally{e.progress_step_id=i}}async function SO(e,t,r,n,s){let i=[];for(let o=0;o<n.length;o+=1){let a=await Rg(e,t,r,n[o],o,s);if(s.routed!==null||(i.push(a),(a.outcome===null||a.outcome==="__failure__")&&t.on_item_failure==="stop"))break}return i}async function vO(e,t,r,n,s){let i=new Array(n.length),o=0,a=Array.from({length:Math.min(t.max_concurrency,n.length)},async()=>{for(;o<n.length&&s.routed===null;){let l=o;o+=1,i[l]=await Rg(e,t,r,n[l],l,s)}});return await Promise.all(a),i}async function Rg(e,t,r,n,s,i){let o=e.iteration;e.iteration={item:n,index:s};let a=`${e.displayName}[${s}]`;e.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await e.dispatchState(a,t.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{e.iteration=o}(l.kind==="paused"||l.kind==="escalate")&&i.routed===null&&(i.routed=l);let d=l.kind==="terminal"&&e.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":kO(e.outcomes[a]);return e.emit_progress?.({kind:d===null||d==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:d}}),{index:s,value:n,outcome:d}}function kO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}function IO(e){if(!Array.isArray(e))return null;let t=[];for(let r of e)if(typeof r=="string")t.push(r);else if(typeof r=="number"||typeof r=="boolean")t.push(String(r));else return null;return t}var Ag,Lg=E(()=>{"use strict";Je();Es();Ag={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async e=>bO(e,e.state)}});async function NO(e,t){let r=e.stateId,n=e.displayName,s=t.termination.timeout_seconds!==void 0?t.termination.timeout_seconds*1e3:void 0,i=e.membersByAlias.get(t.agent.alias);if(i===void 0||i.sessionid===null){let f=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(f.id,null,`missing_agent:${t.agent.alias}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=hn(e,t.durable_memory_tags),a=e.dal.getInteractiveSessionByRunAndState(e.run_id,r);if(a!==null){if(a.status==="done")return e.dal.finishStep(a.step_id,"done","operator_done"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=t.termination.max_turns){e.dal.finishStep(a.step_id,"timeout",`max_turns=${t.termination.max_turns}`),G(e,r,n,"timeout");let m=t.outcomes.timeout;return m!==void 0?X(e.workflow,m):{kind:"terminal",terminal:Y(e.workflow)}}let f=a.last_operator_input??"";try{let m=await bs({context:e,stateId:n,member:i,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return e.dal.insertSessionEvent({run_id:e.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:n,kind:m.violationKind,command_summary:m.summary,message:`State ${n} ran a classified side-effect command (${m.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),t.termination.agent_signal!==void 0&&m.text.includes(t.termination.agent_signal)?(t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:a.step_id,kind:t.artifact_name,content:m.text}),e.dal.finishStep(a.step_id,"done","agent_signal"),G(e,r,n,"done"),t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(Og({context:e,state:t,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof ve?`chat_${m.kind}`:"chat_other";return e.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:Y(e.workflow)}}}return{kind:"paused"}}let l=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let c=e.dal.insertInteractiveSession({run_id:e.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),d=await Ve(t.agent.initial_prompt_template,e,n),u=o?`${o}
1963
1963
 
1964
- ${d}`:d;try{let f=await bs({context:e,stateId:n,member:i,prompt:u,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 e.dal.insertSessionEvent({run_id:e.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:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:l.id,kind:t.artifact_name,content:f.text}),t.termination.agent_signal!==void 0&&f.text.includes(t.termination.agent_signal)?(e.dal.finishStep(l.id,"done","agent_signal"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(Og({context:e,state:t,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof ve?`chat_${f.kind}`:"chat_other";return e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}}function Og(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=$();t.dal.setRunPausedState(t.run_id,`${Ts}${n}`,a),t.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify(xO({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function xO(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=AO(t,r),c={kind:"free_text",choices:null};return{run_id:t.run_id,step_id:s,state_name:r,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:RO(i,3),paused_at:o,created_run_inputs:ur(t.job.payload)}}function AO(e,t){let r=[],s=e.dal.getRun(e.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=e.dal.getRun(s);if(o===null)break;o.current_state!==null&&r.unshift(o.current_state),s=o.parent_run_id}return r.push(t),r}function RO(e,t){if(typeof e!="string"||e.length===0)return[];let r=e.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-t)}var $g,Cg=E(()=>{"use strict";ji();Je();$g={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 e=>NO(e,e.state)}});async function LO(e,t){let r=e.stateId,n=e.displayName,s=Eg(e,t.over);if(s===null){let u=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_invalid_items:${t.over}`);let f=t.outcomes.error;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let i=e.workflow.states[t.body];if(i===void 0){let u=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_body_not_found:${t.body}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=s.slice(0,t.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let f=o[u],m=`${n}[${u}]`,p=e.iteration;e.iteration={item:f,index:u};let _;try{_=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(_.kind==="paused"||_.kind==="escalate")return _;let g=OO(e.outcomes[m]);if(a.push({index:u,value:f,outcome:g}),g===null&&t.stop_on_error){l=!0;break}}let c=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let d=l?"error":"ok";if(e.dal.finishStep(c.id,d,JSON.stringify({iterations:a,count:o.length})),G(e,r,n,d),l){let u=t.outcomes.error;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.ok)}function OO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Mg,jg=E(()=>{"use strict";Je();Mg={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>LO(e,e.state)}});import{createHash as $O}from"node:crypto";import{existsSync as CO,mkdirSync as MO,readFileSync as jO,writeFileSync as DO}from"node:fs";import{dirname as PO,isAbsolute as Pg,normalize as FO,resolve as Ss}from"node:path";import{Document as UO,ExternalHyperlink as WO,HeadingLevel as gn,LevelFormat as BO,Packer as qO,Paragraph as pt,Table as HO,TableCell as JO,TableRow as XO,TextRun as ht,WidthType as GO}from"docx";import{marked as VO}from"marked";async function KO(e,t){let r=e.stateId,n=e.displayName,s=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await YO(e,t,n),o=await zO(e,t),a=await ZO(e,t.title),l=await n$(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return MO(PO(o),{recursive:!0}),DO(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:$O("sha256").update(l).digest("hex"),provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${o}`),G(e,r,n,{output_path:o,path:o,bytes:l.length}),X(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function YO(e,t,r){if(typeof t.markdown_source!="string"||t.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ve(t.markdown_source,e,r)).trim(),i=(n.length===0?r$(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=e$(e.project.local_path,i);if(o!==null){if(!CO(o))throw new Error(`markdown_source file not found: ${o}`);return No(jO(o,"utf8"))}return No(i)}async function zO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=QO(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function ZO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ve(t,e,e.stateId)).trim();return r.length===0?null:r}function QO(e,t){let r=Ss(e);return FO(Pg(t)?Ss(t):Ss(r,t))}function e$(e,t){return t$(t)?Pg(t)?Ss(t):Ss(e,t):null}function t$(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function r$(e,t){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(t)?.[1];if(n===void 0)return null;let s=Object.entries(e.transcripts).filter(([o])=>o.startsWith(`${n}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return No(s);let i=e.dal.query(`SELECT sa.content
1964
+ ${d}`:d;try{let f=await bs({context:e,stateId:n,member:i,prompt:u,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 e.dal.insertSessionEvent({run_id:e.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:n,kind:f.violationKind,command_summary:f.summary,message:`State ${n} ran a classified side-effect command (${f.violationKind}) without a preceding approved gate`}:{violation:"writes_to_project_path",state_id:n,message:`State ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}return e.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),t.artifact_name!==void 0&&e.dal.insertStepArtifact({step_id:l.id,kind:t.artifact_name,content:f.text}),t.termination.agent_signal!==void 0&&f.text.includes(t.termination.agent_signal)?(e.dal.finishStep(l.id,"done","agent_signal"),e.outcomes[n]="done",t.write_back_durable_memory&&await Gt(e,n,i,t.write_back_durable_memory),X(e.workflow,t.outcomes.done)):(Og({context:e,state:t,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof ve?`chat_${f.kind}`:"chat_other";return e.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:Y(e.workflow)}}}function Og(e){let{context:t,state:r,stateId:n,displayName:s,stepId:i,agentText:o}=e,a=$();t.dal.setRunPausedState(t.run_id,`${Ts}${n}`,a),t.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify(xO({context:t,stateId:s,state:r,stepId:i,agentText:o,pausedAt:a}))}),t.dal.pauseJob(t.job.id)}function xO(e){let{context:t,stateId:r,state:n,stepId:s,agentText:i,pausedAt:o}=e,a=t.dal.getRun(t.run_id),l=AO(t,r),c={kind:"free_text",choices:null};return{run_id:t.run_id,step_id:s,state_name:r,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:i,expected_response:c,transcript_tail:RO(i,3),paused_at:o,created_run_inputs:ur(t.job.payload)}}function AO(e,t){let r=[],s=e.dal.getRun(e.run_id)?.parent_run_id??null;for(let i=0;i<32&&s!==null;i+=1){let o=e.dal.getRun(s);if(o===null)break;o.current_state!==null&&r.unshift(o.current_state),s=o.parent_run_id}return r.push(t),r}function RO(e,t){if(typeof e!="string"||e.length===0)return[];let r=e.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-t)}var $g,Cg=E(()=>{"use strict";ji();Je();$g={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 e=>NO(e,e.state)}});async function LO(e,t){let r=e.stateId,n=e.displayName,s=Eg(e,t.over);if(s===null){let u=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_invalid_items:${t.over}`);let f=t.outcomes.error;return f!==void 0?X(e.workflow,f):{kind:"terminal",terminal:Y(e.workflow)}}let i=e.workflow.states[t.body];if(i===void 0){let u=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(u.id,null,`loop_body_not_found:${t.body}`),{kind:"terminal",terminal:Y(e.workflow)}}let o=s.slice(0,t.max_items),a=[],l=!1;for(let u=0;u<o.length;u+=1){let f=o[u],m=`${n}[${u}]`,p=e.iteration;e.iteration={item:f,index:u};let h;try{h=await e.dispatchState(m,i,{iteration:{item:f,index:u}})}finally{e.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=OO(e.outcomes[m]);if(a.push({index:u,value:f,outcome:g}),g===null&&t.stop_on_error){l=!0;break}}let c=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let d=l?"error":"ok";if(e.dal.finishStep(c.id,d,JSON.stringify({iterations:a,count:o.length})),G(e,r,n,d),l){let u=t.outcomes.error;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}return X(e.workflow,t.outcomes.ok)}function OO(e){return e==null?null:typeof e=="string"?e:JSON.stringify(e)}var Mg,jg=E(()=>{"use strict";Je();Mg={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async e=>LO(e,e.state)}});import{createHash as $O}from"node:crypto";import{existsSync as CO,mkdirSync as MO,readFileSync as jO,writeFileSync as DO}from"node:fs";import{dirname as PO,isAbsolute as Pg,normalize as FO,resolve as Ss}from"node:path";import{Document as UO,ExternalHyperlink as WO,HeadingLevel as gn,LevelFormat as BO,Packer as qO,Paragraph as pt,Table as HO,TableCell as JO,TableRow as XO,TextRun as _t,WidthType as GO}from"docx";import{marked as VO}from"marked";async function KO(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await YO(e,t,n),o=await zO(e,t),a=await ZO(e,t.title),l=await n$(i,a??e.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return MO(PO(o),{recursive:!0}),DO(o,l),e.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:o,sha:$O("sha256").update(l).digest("hex"),provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${o}`),G(e,r,n,{output_path:o,path:o,bytes:l.length}),X(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function YO(e,t,r){if(typeof t.markdown_source!="string"||t.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Ve(t.markdown_source,e,r)).trim(),i=(n.length===0?r$(e,t.markdown_source):null)??n;if(i.length===0)throw new Error("markdown_source resolved empty");let o=e$(e.project.local_path,i);if(o!==null){if(!CO(o))throw new Error(`markdown_source file not found: ${o}`);return No(jO(o,"utf8"))}return No(i)}async function zO(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=QO(e.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function ZO(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ve(t,e,e.stateId)).trim();return r.length===0?null:r}function QO(e,t){let r=Ss(e);return FO(Pg(t)?Ss(t):Ss(r,t))}function e$(e,t){return t$(t)?Pg(t)?Ss(t):Ss(e,t):null}function t$(e){return e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function r$(e,t){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(t)?.[1];if(n===void 0)return null;let s=Object.entries(e.transcripts).filter(([o])=>o.startsWith(`${n}:coder[`)).sort(([o],[a])=>a.localeCompare(o))[0]?.[1];if(s!==void 0)return No(s);let i=e.dal.query(`SELECT sa.content
1965
1965
  FROM step_artifact sa
1966
1966
  JOIN step s ON s.id = sa.step_id
1967
1967
  WHERE s.run_id = ?
1968
1968
  AND s.state_name LIKE ?
1969
1969
  AND sa.content IS NOT NULL
1970
1970
  ORDER BY sa.id DESC
1971
- LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:No(i[0].content)}function No(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function n$(e,t){let r=Ug(VO.lexer(e,{gfm:!0})),n=new UO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:BO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new pt("")]:r}]});return qO.toBuffer(n)}function Ug(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new pt({heading:d$(r.depth),children:mr(fr(r))}));break;case"paragraph":t.push(new pt({children:mr(fr(r))}));break;case"text":t.push(new pt({children:fr(r).length===0?[new ht(r.text)]:mr(fr(r))}));break;case"blockquote":t.push(...Ug(fr(r)).map(n=>n instanceof pt?n:new pt({children:[new ht(r.text)]})));break;case"list":a$(r)&&t.push(...s$(r));break;case"table":l$(r)&&t.push(i$(r));break;case"code":c$(r)&&t.push(...o$(r));break;case"hr":t.push(new pt(""));break;case"html":r.text.trim().length>0&&t.push(new pt({children:[new ht(r.text)]}));break;default:break}return t}function mr(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new ht({text:n.text,...bd(t)}));break;case"strong":r.push(...mr(fr(n),{...t,bold:!0}));break;case"em":r.push(...mr(fr(n),{...t,italics:!0}));break;case"codespan":r.push(new ht({text:n.text,...bd({...t,code:!0})}));break;case"link":r.push(new WO({link:n.href,children:mr(fr(n),{...t})}));break;case"br":r.push(new ht({text:"",break:1}));break;case"image":r.push(new ht({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new ht({text:n.text,strike:!0}));break;default:r.push(new ht({text:n.raw,...bd(t)}));break}return r.length===0?[new ht("")]:r}function bd(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function s$(e){return e.items.map(t=>new pt({children:mr(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Dg(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Dg(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Dg(e){return e.task?`[${e.checked?"x":" "}] `:""}function i$(e){let t=[e.header,...e.rows].map(r=>new XO({children:r.map(n=>new JO({children:[new pt({children:mr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new HO({width:{size:100,type:GO.PERCENTAGE},rows:t})}function o$(e){return e.text.split(`
1972
- `).map(r=>new pt({children:[new ht({text:r.length===0?" ":r,font:"Courier New"})]}))}function fr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function a$(e){return e.type==="list"&&Array.isArray(e.items)}function l$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function c$(e){return e.type==="code"&&typeof e.text=="string"}function d$(e){switch(e){case 1:return gn.HEADING_1;case 2:return gn.HEADING_2;case 3:return gn.HEADING_3;case 4:return gn.HEADING_4;case 5:return gn.HEADING_5;default:return gn.HEADING_6}}var Fg,Wg=E(()=>{"use strict";Je();Fg={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 e=>KO(e,e.state)}});import{createHash as u$}from"node:crypto";import{existsSync as f$,mkdirSync as m$,readFileSync as Bg,statSync as p$}from"node:fs";import{dirname as h$,isAbsolute as qg,normalize as _$,resolve as vs}from"node:path";import{marked as g$}from"marked";import y$ from"write-excel-file/node";async function w$(e,t){let r=e.stateId,n=e.displayName,s=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await E$(e,t),o=T$(t.input_format),a=await b$(e,t),l=await S$(e,t.title),c=o==="markdown"?O$(i):N$(i);await $$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=p$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=u$("sha256").update(Bg(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),G(e,r,n,{output_path:a,path:a,bytes:d}),X(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function E$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ve(t.source,e,e.stateId)).trim(),n=k$(e.project.local_path,r);if(n!==null){if(!f$(n))throw new Error(`source file not found: ${n}`);return Bg(n,"utf8")}return r}function T$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function b$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=v$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function S$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ve(t,e,e.stateId)).trim();return r.length===0?null:r}function v$(e,t){let r=vs(e);return _$(qg(t)?vs(t):vs(r,t))}function k$(e,t){return I$(t)?qg(t)?vs(t):vs(e,t):null}function I$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function N$(e){if(e.trim().length===0)return[];let t;try{t=JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!xo(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>x$(r,n))}function x$(e,t){if(!xo(e))throw new Error(`sheets[${t}] must be an object`);let r=A$(e.headers,`sheets[${t}].headers`),n=R$(e.rows,`sheets[${t}].rows`);return{name:typeof e.name=="string"&&e.name.trim().length>0?e.name:`Sheet${t+1}`,headers:r,rows:n,headerStyle:L$(e.styles)}}function A$(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))throw new Error(`${t} must be an array of strings`);return e}function R$(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new Error(`${t} must be an array`);return e.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${t}[${n}] must be an array`);return r.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${t}[${n}][${i}] must be string, number, boolean, or null`)})})}function L$(e){if(!xo(e)||!xo(e.headers))return;let t={};return e.headers.bold===!0&&(t.bold=!0),typeof e.headers.fill=="string"&&(t.fill=e.headers.fill),Object.keys(t).length===0?void 0:t}function O$(e){let t=g$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(U$(s)){n=s.text;continue}W$(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function $$(e){m$(h$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:D$(n.name,t),data:C$(n),columns:j$(n)}));await y$(r).toFile(e.outputPath)}function C$(e){let t=[];if(e.headers.length>0){let r=F$(e.headerStyle?.fill);t.push(e.headers.map(n=>({value:n,type:String,fontWeight:e.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of e.rows)t.push(r.map(M$));return t.length===0?[[{}]]:t}function M$(e){return e===null?{}:typeof e=="string"?{value:e,type:String}:typeof e=="number"?{value:e,type:Number}:typeof e=="boolean"?{value:e,type:Boolean}:{}}function j$(e){let t=Math.max(e.headers.length,...e.rows.map(n=>n.length),1),r=[];for(let n=1;n<=t;n+=1){let s=[e.headers[n-1],...e.rows.map(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function D$(e,t){let r=P$(e),n=r,s=2;for(;t.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return t.add(n.toLowerCase()),n}function P$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function F$(e){if(e===void 0)return null;let t=e.startsWith("#")?e.slice(1):e;return/^[0-9a-fA-F]{6}$/.test(t)?`#${t.toUpperCase()}`:null}function U$(e){return e.type==="heading"&&typeof e.text=="string"}function W$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function xo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Hg,Jg=E(()=>{"use strict";Je();Hg={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 e=>w$(e,e.state)}});import{spawnSync as B$}from"node:child_process";async function H$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(B$("sh",["-c",f.command],{cwd:e.project.local_path}).status!==0){let p=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),G(e,r,n,"fail_pre_check");let _=t.outcomes.fail_pre_check;return _!==void 0?X(e.workflow,_):{kind:"terminal",terminal:Y(e.workflow)}}let i=_n(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await hn(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1973
- ${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=cg(p.text);if(g!==null){let h=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(h.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let y=Object.keys(t.outcomes_from_stance),T=ws(p.text,y);if(T.outcome===null){let I=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(I.id,null,`unhandled_stance:${T.reason}`),{kind:"escalate",token:"",reason:`no_stance:${T.reason}`}}let b=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(b.id,T.outcome,"outcomes_from_stance"),G(e,r,n,T.outcome),X(e.workflow,t.outcomes_from_stance[T.outcome])}let g=ws(p.text,q$);if(g.outcome!==null){let y=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(y.id,g.outcome,"default_failure_stance"),G(e,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let h=B(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(h.id,"approve","no_reviewers"),G(e,r,n,"approve"),t.write_back_durable_memory){let y=e.membersByAlias.get(t.coder.alias);y!==void 0&&await Gt(e,n,y,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}let _=await Promise.all(o.map(g=>hn(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1974
- ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(_.every(g=>g.outcome==="approve")){let g=B(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve",`loop=${f}`),G(e,r,n,"approve"),t.write_back_durable_memory){let h=e.membersByAlias.get(t.coder.alias);h!==void 0&&await Gt(e,n,h,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}if(a=_.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1971
+ LIMIT 1`,e.run_id,`${n}:coder[%`);return i[0]?.content===void 0?null:No(i[0].content)}function No(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function n$(e,t){let r=Ug(VO.lexer(e,{gfm:!0})),n=new UO({title:t,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:BO.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new pt("")]:r}]});return qO.toBuffer(n)}function Ug(e){let t=[];for(let r of e)switch(r.type){case"space":break;case"heading":t.push(new pt({heading:d$(r.depth),children:mr(fr(r))}));break;case"paragraph":t.push(new pt({children:mr(fr(r))}));break;case"text":t.push(new pt({children:fr(r).length===0?[new _t(r.text)]:mr(fr(r))}));break;case"blockquote":t.push(...Ug(fr(r)).map(n=>n instanceof pt?n:new pt({children:[new _t(r.text)]})));break;case"list":a$(r)&&t.push(...s$(r));break;case"table":l$(r)&&t.push(i$(r));break;case"code":c$(r)&&t.push(...o$(r));break;case"hr":t.push(new pt(""));break;case"html":r.text.trim().length>0&&t.push(new pt({children:[new _t(r.text)]}));break;default:break}return t}function mr(e,t){let r=[];for(let n of e)switch(n.type){case"text":case"escape":r.push(new _t({text:n.text,...bd(t)}));break;case"strong":r.push(...mr(fr(n),{...t,bold:!0}));break;case"em":r.push(...mr(fr(n),{...t,italics:!0}));break;case"codespan":r.push(new _t({text:n.text,...bd({...t,code:!0})}));break;case"link":r.push(new WO({link:n.href,children:mr(fr(n),{...t})}));break;case"br":r.push(new _t({text:"",break:1}));break;case"image":r.push(new _t({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new _t({text:n.text,strike:!0}));break;default:r.push(new _t({text:n.raw,...bd(t)}));break}return r.length===0?[new _t("")]:r}function bd(e){return{...e?.bold===!0?{bold:!0}:{},...e?.italics===!0?{italics:!0}:{},...e?.code===!0?{font:"Courier New"}:{}}}function s$(e){return e.items.map(t=>new pt({children:mr(t.tokens.length===1&&t.tokens[0]?.type==="text"?[{...t.tokens[0],text:Dg(t)+t.tokens[0].text}]:[{type:"text",raw:t.text,text:Dg(t)+t.text}]),...e.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function Dg(e){return e.task?`[${e.checked?"x":" "}] `:""}function i$(e){let t=[e.header,...e.rows].map(r=>new XO({children:r.map(n=>new JO({children:[new pt({children:mr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new HO({width:{size:100,type:GO.PERCENTAGE},rows:t})}function o$(e){return e.text.split(`
1972
+ `).map(r=>new pt({children:[new _t({text:r.length===0?" ":r,font:"Courier New"})]}))}function fr(e){let t=e.tokens;return Array.isArray(t)?t:[]}function a$(e){return e.type==="list"&&Array.isArray(e.items)}function l$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function c$(e){return e.type==="code"&&typeof e.text=="string"}function d$(e){switch(e){case 1:return gn.HEADING_1;case 2:return gn.HEADING_2;case 3:return gn.HEADING_3;case 4:return gn.HEADING_4;case 5:return gn.HEADING_5;default:return gn.HEADING_6}}var Fg,Wg=E(()=>{"use strict";Je();Fg={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 e=>KO(e,e.state)}});import{createHash as u$}from"node:crypto";import{existsSync as f$,mkdirSync as m$,readFileSync as Bg,statSync as p$}from"node:fs";import{dirname as _$,isAbsolute as qg,normalize as h$,resolve as vs}from"node:path";import{marked as g$}from"marked";import y$ from"write-excel-file/node";async function w$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;try{let i=await E$(e,t),o=T$(t.input_format),a=await b$(e,t),l=await S$(e,t.title),c=o==="markdown"?O$(i):N$(i);await $$({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??e.workflow.name});let d=p$(a).size;if(d===0)throw new Error("rendered XLSX file was empty");let u=u$("sha256").update(Bg(a)).digest("hex");return e.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:u,provider_call_mode:"library"}),e.dal.finishStep(s.id,"done",`wrote:${a}`),G(e,r,n,{output_path:a,path:a,bytes:d}),X(e.workflow,t.outcomes?.done??"@terminal:done")}catch(i){let o=i instanceof Error?i.message:String(i);return e.dal.finishStep(s.id,"error",o),G(e,r,n,{error:o}),X(e.workflow,t.outcomes?.error??"@terminal:error")}}async function E$(e,t){if(typeof t.source!="string"||t.source.trim().length===0)return"";let r=(await Ve(t.source,e,e.stateId)).trim(),n=k$(e.project.local_path,r);if(n!==null){if(!f$(n))throw new Error(`source file not found: ${n}`);return Bg(n,"utf8")}return r}function T$(e){if(e==null||e==="")return"json";if(e==="json"||e==="markdown")return e;throw new Error(`unsupported input_format: ${String(e)}`)}async function b$(e,t){if(typeof t.output_path!="string"||t.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Ve(t.output_path,e,e.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=v$(e.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function S$(e,t){if(typeof t!="string"||t.trim().length===0)return null;let r=(await Ve(t,e,e.stateId)).trim();return r.length===0?null:r}function v$(e,t){let r=vs(e);return h$(qg(t)?vs(t):vs(r,t))}function k$(e,t){return I$(t)?qg(t)?vs(t):vs(e,t):null}function I$(e){return e.endsWith(".json")||e.endsWith(".md")||e.endsWith(".markdown")||e.startsWith("./")||e.startsWith("../")||e.startsWith("/")}function N$(e){if(e.trim().length===0)return[];let t;try{t=JSON.parse(e)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!xo(t)||!Array.isArray(t.sheets))throw new Error("JSON source must be an object with sheets[]");return t.sheets.map((r,n)=>x$(r,n))}function x$(e,t){if(!xo(e))throw new Error(`sheets[${t}] must be an object`);let r=A$(e.headers,`sheets[${t}].headers`),n=R$(e.rows,`sheets[${t}].rows`);return{name:typeof e.name=="string"&&e.name.trim().length>0?e.name:`Sheet${t+1}`,headers:r,rows:n,headerStyle:L$(e.styles)}}function A$(e,t){if(e===void 0)return[];if(!Array.isArray(e)||!e.every(r=>typeof r=="string"))throw new Error(`${t} must be an array of strings`);return e}function R$(e,t){if(e===void 0)return[];if(!Array.isArray(e))throw new Error(`${t} must be an array`);return e.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${t}[${n}] must be an array`);return r.map((s,i)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${t}[${n}][${i}] must be string, number, boolean, or null`)})})}function L$(e){if(!xo(e)||!xo(e.headers))return;let t={};return e.headers.bold===!0&&(t.bold=!0),typeof e.headers.fill=="string"&&(t.fill=e.headers.fill),Object.keys(t).length===0?void 0:t}function O$(e){let t=g$.lexer(e,{gfm:!0}),r=[],n=null;for(let s of t){if(U$(s)){n=s.text;continue}W$(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(i=>i.text),rows:s.rows.map(i=>i.map(o=>o.text)),headerStyle:{bold:!0}}),n=null)}return r}async function $$(e){m$(_$(e.outputPath),{recursive:!0});let t=new Set,r=e.sheets.map(n=>({sheet:D$(n.name,t),data:C$(n),columns:j$(n)}));await y$(r).toFile(e.outputPath)}function C$(e){let t=[];if(e.headers.length>0){let r=F$(e.headerStyle?.fill);t.push(e.headers.map(n=>({value:n,type:String,fontWeight:e.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of e.rows)t.push(r.map(M$));return t.length===0?[[{}]]:t}function M$(e){return e===null?{}:typeof e=="string"?{value:e,type:String}:typeof e=="number"?{value:e,type:Number}:typeof e=="boolean"?{value:e,type:Boolean}:{}}function j$(e){let t=Math.max(e.headers.length,...e.rows.map(n=>n.length),1),r=[];for(let n=1;n<=t;n+=1){let s=[e.headers[n-1],...e.rows.map(o=>o[n-1])],i=Math.min(60,Math.max(10,...s.map(o=>String(o??"").length+2)));r.push({width:i})}return r}function D$(e,t){let r=P$(e),n=r,s=2;for(;t.has(n.toLowerCase());){let i=` ${s}`;n=`${r.slice(0,31-i.length)}${i}`,s+=1}return t.add(n.toLowerCase()),n}function P$(e){let t=e.replace(/[\[\]:*?/\\]/g," ").trim();return(t.length===0?"Sheet":t).slice(0,31)}function F$(e){if(e===void 0)return null;let t=e.startsWith("#")?e.slice(1):e;return/^[0-9a-fA-F]{6}$/.test(t)?`#${t.toUpperCase()}`:null}function U$(e){return e.type==="heading"&&typeof e.text=="string"}function W$(e){let t=e;return e.type==="table"&&Array.isArray(t.header)&&Array.isArray(t.rows)}function xo(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var Hg,Jg=E(()=>{"use strict";Je();Hg={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 e=>w$(e,e.state)}});import{spawnSync as B$}from"node:child_process";async function H$(e,t){let r=e.stateId,n=e.displayName,s=e.workflow.default_task_timeout_ms;for(let f of t.pre_checks??[])if(B$("sh",["-c",f.command],{cwd:e.project.local_path}).status!==0){let p=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),G(e,r,n,"fail_pre_check");let h=t.outcomes.fail_pre_check;return h!==void 0?X(e.workflow,h):{kind:"terminal",terminal:Y(e.workflow)}}let i=hn(e,t.durable_memory_tags),o=t.reviewers??[],a=null,l=o.length===0&&t.outcomes_from_stance!==void 0,c=l?Object.keys(t.outcomes_from_stance):[];for(let f=0;f<t.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await _n(e,m,t.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1973
+ ${a}`:null,c,l,s,t.writes_to_project_path===!0,i);if(l){let g=cg(p.text);if(g!==null){let _=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(_.id,null,`escalation_vocab:${g.token}`),{kind:"escalate",token:g.token,reason:g.reason.length>0?`${g.token}: ${g.reason}`:g.token}}}if(p.outcome===null){let g=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(o.length===0){if(t.outcomes_from_stance!==void 0){let y=Object.keys(t.outcomes_from_stance),T=ws(p.text,y);if(T.outcome===null){let I=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(I.id,null,`unhandled_stance:${T.reason}`),{kind:"escalate",token:"",reason:`no_stance:${T.reason}`}}let b=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(b.id,T.outcome,"outcomes_from_stance"),G(e,r,n,T.outcome),X(e.workflow,t.outcomes_from_stance[T.outcome])}let g=ws(p.text,q$);if(g.outcome!==null){let y=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(y.id,g.outcome,"default_failure_stance"),G(e,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(_.id,"approve","no_reviewers"),G(e,r,n,"approve"),t.write_back_durable_memory){let y=e.membersByAlias.get(t.coder.alias);y!==void 0&&await Gt(e,n,y,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}let h=await Promise.all(o.map(g=>_n(e,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1974
+ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=q(e,{run_id:e.run_id,state_name:n});if(e.steps_executed+=1,e.dal.finishStep(g.id,"approve",`loop=${f}`),G(e,r,n,"approve"),t.write_back_durable_memory){let _=e.membersByAlias.get(t.coder.alias);_!==void 0&&await Gt(e,n,_,t.write_back_durable_memory)}return X(e.workflow,t.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1975
1975
 
1976
- `),t.loop_feedback_artifact!==void 0){let g=B(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),G(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var q$,Xg,Gg=E(()=>{"use strict";_d();Je();q$=["blocked","failed","aborted"],Xg={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 e=>H$(e,e.state)}});import{spawnSync as J$}from"node:child_process";async function X$(e,t){let r=e.stateId,n=e.displayName,s=await Ve(t.command,e,n),i=Ed(e,n),o=Tg(s);if(o.matched&&!i){let _=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:_.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(_.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=J$("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&Td(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let _=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:_})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),G(e,r,n,m),X(e.workflow,p))}var Vg,Kg=E(()=>{"use strict";Je();Vg={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 e=>X$(e,e.state)}});async function G$(e,t){let r=e.stateId,n=e.displayName,s=B(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=dt(i.definition),a=await V$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};G(e,r,n,K$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:X(e.workflow,d)}async function V$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await pg(s,e);r[n]=i===s?await vo(s,e):i}return r}function K$(e,t,r){let n={};for(let s of r)n[s.name]=Y$(e,t,s);return n}function Y$(e,t,r){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,r.source_step_id)[0];if(s===void 0)return null;let i=z$(s,r.source_field);if(i.found)return i.value;let a=e.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function z$(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Yg,zg=E(()=>{"use strict";ms();Je();Es();Yg={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 e=>G$(e,e.state)}});function Z$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=B(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),G(e,r,n,s),{kind:"terminal",terminal:s}}var Zg,Qg=E(()=>{"use strict";Je();Zg={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:e=>Z$(e,e.state)}});async function Q$(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",r=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${t}/${r}/issues`);n.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&n.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&n.searchParams.set("since",e.parameters.since);let s=await fetch(n);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=eC(e.cursor),a=i.filter(tC).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:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function eC(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function tC(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var ey,ty=E(()=>{"use strict";ey={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 e=>Q$(e)}});async function rC(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===r?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:t}]}}var ry,ny=E(()=>{"use strict";ry={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 e=>rC(e)}});function sy(e){e.register(Sg),e.register(Xg),e.register(Ng),e.register($g),e.register(Mg),e.register(Fg),e.register(Hg),e.register(Vg),e.register(kg),e.register(Ag),e.register(Yg),e.register(Zg),e.register(ry),e.register(ey)}var iy=E(()=>{"use strict";vg();Ig();xg();Lg();Cg();jg();Wg();Jg();Gg();Kg();zg();Qg();ty();ny()});function oy(){return Ao===null&&(Ao=new Sd,sy(Ao)),Ao}var nC,Sd,Ao,ay=E(()=>{"use strict";iy();nC={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"},Sd=class{types=new Map;register(t){let r=`${t.description.namespace}/${t.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,t)}get(t){let r=t.includes("/")?t:nC[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Ao=null});async function dy(e){hy(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let r=e.dal.getProjectByJob(e.job.id);if(r===null)throw new Error(`job ${e.job.id} has no project`);let n=iC(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=ks(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=rg(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.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(e.members.map(m=>[m.alias,m]));if(ks(n)){let m=vd({dal:e.dal,workflow:Lo(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:ur(e.job.payload)??{},team_id:e.team.id}),p=await fy(n,m,o.current_state??n.entry_step_id);return cy(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=vd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:ur(e.job.payload)??{},team_id:e.team.id}),f=await uy(u,o.current_state??n.start_at);return cy(e.dal,r.id,o.id,n.name,f),f}function cy(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.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 g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let h=g.parameters;if(h.name===i&&(h.kind==="success"||h.kind==="failure"||h.kind==="neutral")){o=h.kind;break}}}let _=f.errors;if(_!==null&&typeof _=="object"){let g=_;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function vd(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.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(r,n,s)=>{let i=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await kd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{hy(n);let i=ks(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=vd({dal:e.dal,workflow:ks(n)?Lo(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return ks(n)?fy(n,a,o.current_state??n.entry_step_id):uy(a,o.current_state??n.start_at)}};return t}async function uy(e,t){let r=t;if(r.startsWith(Ts))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Vt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=Ro(e,Y(e.workflow));if(l.kind==="paused")return De(e);if(l.kind==="escalate")return nt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),De(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}let o,a=py(e,r);if(a!==null){let l=B(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),G(e,r,r,a),a===Kn)return Vt(e,cl);let c=i.outcomes?.[a];o=c!==void 0?X(e.workflow,c):nt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await kd(e,r,i);if(o.kind==="paused")return De(e);if(o.kind==="escalate")return nt(e,{id:r,name:r,type:i.type},o.token,o.reason),De(e);if(o.kind==="terminal"){let l=Ro(e,o.terminal);if(l.kind==="paused")return De(e);if(l.kind==="escalate")return nt(e,{id:r,name:r,type:i.type},l.token,l.reason),De(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}r=o.state}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})});let n=Ro(e,Y(e.workflow));return n.kind==="terminal"?Vt(e,n.terminal):Vt(e,Y(e.workflow))}async function fy(e,t,r){let n=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=n.get(i);if(a===void 0)return nt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),De(t);let l=py(t,a.id);if(l!==null){let m=B(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),G(t,a.id,a.name,l),l===Kn)return Vt(t,cl);let p=Object.keys(e.connections[a.id]??{}),_=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(_===void 0)return nt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),De(t);i=_;continue}let c=await sC(t,e,a);if(c.kind==="paused")return De(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return nt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),De(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=Lo(e,a);try{let p=Ro(t,u);if(p.kind==="paused")return De(t);if(p.kind==="escalate")return nt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),De(t);if(p.kind==="terminal")return Vt(t,p.terminal);let _=s.get(p.state);if(_===void 0)return nt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),De(t);i=_.id;continue}finally{t.workflow=m}}if(Kr(u))return nt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),De(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return nt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),De(t);i=f}return 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})}),Vt(t,"aborted")}async function sC(e,t,r){let n=my(t,r),s=e.workflow;e.workflow=Lo(t,r);try{return await kd(e,r.id,n,r.name)}finally{e.workflow=s}}function my(e,t){let r=t.parameters,n=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.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",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,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",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:t.type,...r}}}async function kd(e,t,r,n){let s=oy().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?lC(e,s):void 0,e.progress_step_id=null;try{return await s.execute(wg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function iC(e,t){try{let r=JSON.parse(e);if(aC(r)&&r.definition_schema_version===3)return xt.parse(r)}catch{return t}return t}function ks(e){return e.definition_schema_version===3}function Lo(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=my(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:oC(t.parameters.kind)}),n.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:n,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function oC(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function aC(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function lC(e,t){let r=`progress.${t.description.namespace}/${t.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Vt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Z_(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function De(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function py(e,t){let n=e.dal.getRun(e.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function Ro(e,t){if(!cC(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let r=e.workflow.errors;return r===void 0?{kind:"terminal",terminal:t}:(e.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&dC(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function cC(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function dC(e,t,r){let n=uC(e),s=r.capture_evidence&&n!==null?fC(e,n.id):[];e.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function uC(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function fC(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(n=>n.path)}function hy(e){if(!ly.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${ly.join(", ")}`)}var ly,_y=E(()=>{"use strict";un();Q_();ng();Je();ay();Yn();ly=[1,2,3]});import{readFileSync as mC,readdirSync as pC}from"node:fs";import{basename as hC,join as _C,resolve as gC}from"node:path";function wy(e={}){let t=gC(e.workflowsDir??"workflows"),r=pC(t).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:r.map(n=>yC(_C(t,n)))}}function yC(e){let t=hC(e);try{let r=mC(e,"utf8"),n=dt(r);return by(t,n)}catch(r){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Sy(r)}}}function Ey(e,t){try{let r=dt(t);return by(e,r)}catch(r){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Sy(r)}}}function Ty(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.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})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
1976
+ `),t.loop_feedback_artifact!==void 0){let g=q(e,{run_id:e.run_id,state_name:`${n}:feedback[${f}]`});e.steps_executed+=1,e.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),e.dal.insertStepArtifact({step_id:g.id,kind:t.loop_feedback_artifact,content:a})}}let d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1,e.dal.finishStep(d.id,"max_loops_exceeded",`loops=${t.max_loops}`),G(e,r,n,"max_loops_exceeded");let u=t.outcomes.max_loops_exceeded;return u!==void 0?X(e.workflow,u):{kind:"terminal",terminal:Y(e.workflow)}}var q$,Xg,Gg=E(()=>{"use strict";hd();Je();q$=["blocked","failed","aborted"],Xg={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 e=>H$(e,e.state)}});import{spawnSync as J$}from"node:child_process";async function X$(e,t){let r=e.stateId,n=e.displayName,s=await Ve(t.command,e,n),i=Ed(e,n),o=Tg(s);if(o.matched&&!i){let h=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.insertSessionEvent({run_id:e.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:o.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${o.kind}) without a preceding approved gate`})}),e.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${o.kind}`),{kind:"terminal",terminal:Y(e.workflow)}}let a=new Date(Date.now()-1),l=typeof t.timeout_ms=="number"&&t.timeout_ms>0,c=J$("sh",["-c",s],{cwd:e.project.local_path,...l?{timeout:t.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),d=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let u=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((u.length>0||f!==void 0)&&e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:u,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(e.dal.finishStep(d.id,null,`timeout:${t.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(e.dal.finishStep(d.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:Y(e.workflow)});if(t.writes_to_project_path!==!0&&e.project.local_path.trim().length>0&&Td(e.project.local_path,a))return e.dal.insertSessionEvent({run_id:e.run_id,step_id:d.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),e.dal.finishStep(d.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:Y(e.workflow)};if(t.capture_output_to!==void 0){let h=c.stdout??"";e.dal.insertStepArtifact({step_id:d.id,kind:t.capture_output_to,content:h})}let m=String(c.status),p=t.outcomes_from_exit[m]??t.outcomes_from_exit.default;return p===void 0?(e.dal.insertStepArtifact({step_id:d.id,kind:"unhandled_exit",content:m}),e.dal.finishStep(d.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(e.dal.finishStep(d.id,m,`exit=${c.status}`),G(e,r,n,m),X(e.workflow,p))}var Vg,Kg=E(()=>{"use strict";Je();Vg={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 e=>X$(e,e.state)}});async function G$(e,t){let r=e.stateId,n=e.displayName,s=q(e,{run_id:e.run_id,state_name:n});e.steps_executed+=1;let i=e.dal.getWorkflowByName(t.workflow_name);if(i===null)return e.dal.finishStep(s.id,null,`subflow_missing_workflow:${t.workflow_name}`),{kind:"terminal",terminal:Y(e.workflow)};let o=dt(i.definition),a=await V$(e,t),l=await e.runChildWorkflow(i,o,a);if(l.paused===!0)return e.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return e.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:Y(e.workflow)};G(e,r,n,K$(e,l.run_id,o.outputs??[])),e.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let d=t.outcomes[c]??t.outcomes.default;return d===void 0?{kind:"terminal",terminal:Y(e.workflow)}:X(e.workflow,d)}async function V$(e,t){let r={};for(let[n,s]of Object.entries(t.inputs??{})){let i=await pg(s,e);r[n]=i===s?await vo(s,e):i}return r}function K$(e,t,r){let n={};for(let s of r)n[s.name]=Y$(e,t,s);return n}function Y$(e,t,r){let s=e.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",t,r.source_step_id)[0];if(s===void 0)return null;let i=z$(s,r.source_field);if(i.found)return i.value;let a=e.dal.query("SELECT * FROM step_artifact WHERE step_id = ? AND kind = ? ORDER BY id DESC LIMIT 1",s.id,r.source_field)[0];return a===void 0?null:a.content??a.path??a.sha??null}function z$(e,t){switch(t){case"id":return{found:!0,value:e.id};case"run_id":return{found:!0,value:e.run_id};case"parent_step_id":return{found:!0,value:e.parent_step_id};case"state_name":return{found:!0,value:e.state_name};case"outcome":return{found:!0,value:e.outcome};case"status_detail":return{found:!0,value:e.status_detail};case"started_at":return{found:!0,value:e.started_at};case"ended_at":return{found:!0,value:e.ended_at};default:return{found:!1}}}var Yg,zg=E(()=>{"use strict";ms();Je();Es();Yg={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 e=>G$(e,e.state)}});function Z$(e,t){let r=e.stateId,n=e.displayName,s=t.name??n,i=q(e,{run_id:e.run_id,state_name:n});return e.steps_executed+=1,e.dal.finishStep(i.id,s,t.kind??"neutral"),G(e,r,n,s),{kind:"terminal",terminal:s}}var Zg,Qg=E(()=>{"use strict";Je();Zg={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:e=>Z$(e,e.state)}});async function Q$(e){let t=typeof e.parameters.org=="string"?e.parameters.org:"",r=typeof e.parameters.repo=="string"?e.parameters.repo:"";if(t.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${t}/${r}/issues`);n.searchParams.set("state","open"),typeof e.parameters.label=="string"&&e.parameters.label.length>0&&n.searchParams.set("labels",e.parameters.label),typeof e.parameters.since=="string"&&e.parameters.since.length>0&&n.searchParams.set("since",e.parameters.since);let s=await fetch(n);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=eC(e.cursor),a=i.filter(tC).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:e.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function eC(e){if(e===void 0)return 0;let t=Number(e);return Number.isFinite(t)?t:0}function tC(e){if(e===null||typeof e!="object"||Array.isArray(e))return!1;let t=e;return typeof t.id=="number"&&typeof t.number=="number"&&typeof t.html_url=="string"&&typeof t.title=="string"}var ey,ty=E(()=>{"use strict";ey={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 e=>Q$(e)}});async function rC(e){let t=typeof e.parameters.cron=="string"?e.parameters.cron.trim():"";if(t.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return e.cursor===r?null:{main:[{trigger_id:e.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:t}]}}var ry,ny=E(()=>{"use strict";ry={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 e=>rC(e)}});function sy(e){e.register(Sg),e.register(Xg),e.register(Ng),e.register($g),e.register(Mg),e.register(Fg),e.register(Hg),e.register(Vg),e.register(kg),e.register(Ag),e.register(Yg),e.register(Zg),e.register(ry),e.register(ey)}var iy=E(()=>{"use strict";vg();Ig();xg();Lg();Cg();jg();Wg();Jg();Gg();Kg();zg();Qg();ty();ny()});function oy(){return Ao===null&&(Ao=new Sd,sy(Ao)),Ao}var nC,Sd,Ao,ay=E(()=>{"use strict";iy();nC={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"},Sd=class{types=new Map;register(t){let r=`${t.description.namespace}/${t.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,t)}get(t){let r=t.includes("/")?t:nC[t];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Ao=null});async function dy(e){_y(e.workflow);let t=e.workflowRow??e.dal.getWorkflowByName(e.workflow.name,e.workflow.version);if(t===null)throw new Error(`workflow ${e.workflow.name}@${e.workflow.version} is not registered`);let r=e.dal.getProjectByJob(e.job.id);if(r===null)throw new Error(`job ${e.job.id} has no project`);let n=iC(t.definition,e.workflow),s=e.job.run_id===null?null:e.dal.getRun(e.job.run_id),i=ks(n)?n.entry_step_id:n.start_at,o=s?.terminal_state===null?s:e.dal.insertRun({job_id:e.job.id,workflow_id:t.id,team_id:e.team.id,current_state:i}),a=n.requires,l=rg(a);if(l!==null)return e.dal.setRunTerminalState(o.id,"aborted"),e.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:o.id,payload:JSON.stringify({run_id:o.id,workflow_name:n.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(e.members.map(m=>[m.alias,m]));if(ks(n)){let m=vd({dal:e.dal,workflow:Lo(n),job:e.job,project:r,run:o,membersByAlias:c,outcomes:s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},inputs:ur(e.job.payload)??{},team_id:e.team.id}),p=await fy(n,m,o.current_state??n.entry_step_id);return cy(e.dal,r.id,o.id,n.name,p),p}let d=s!==null&&o===s?e.dal.listLatestStepOutcomesByState(o.id):{},u=vd({dal:e.dal,workflow:n,job:e.job,project:r,run:o,membersByAlias:c,outcomes:d,inputs:ur(e.job.payload)??{},team_id:e.team.id}),f=await uy(u,o.current_state??n.start_at);return cy(e.dal,r.id,o.id,n.name,f),f}function cy(e,t,r,n,s){if(s.paused===!0)return;let i=s.terminal_state;if(i===null)return;let o="unknown",a=!1;try{let d=e.getRun(r);if(d!==null){let u=e.getWorkflow(d.workflow_id);if(u!==null){let f=JSON.parse(u.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 g of f.steps)if(g.type==="lmctl/terminal"&&g.parameters!==null&&typeof g.parameters=="object"){let _=g.parameters;if(_.name===i&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){o=_.kind;break}}}let h=f.errors;if(h!==null&&typeof h=="object"){let g=h;(g.on_unhandled_failure!==void 0||g.on_unhandled_failure_state!==void 0)&&(a=!0)}}}}catch{}if(o==="success"||o==="failure"&&a)return;let l=null;try{l=e.query("SELECT status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",r)[0]?.status_detail??null}catch{l=null}let c=o==="failure"?"workflow_failed":"workflow_has_issues";e.raiseAttention({kind:c,severity:o==="failure"?"error":"warn",project_id:t,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:i,terminal_kind:o,last_error:l})})}function vd(e){let t={dal:e.dal,workflow:e.workflow,job:e.job,project:e.project,run_id:e.run.id,membersByAlias:e.membersByAlias,inputs:e.inputs,outcomes:e.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(r,n,s)=>{let i=t.parent_step_id,o=t.iteration;t.parent_step_id=s?.parent_step_id??i,t.iteration=s?.iteration??o;try{return await kd(t,r,n,s?.display_name??r)}finally{t.parent_step_id=i,t.iteration=o}},runChildWorkflow:async(r,n,s)=>{_y(n);let i=ks(n)?n.entry_step_id:n.start_at,o=e.dal.insertRun({job_id:e.job.id,workflow_id:r.id,team_id:e.team_id,current_state:i,parent_run_id:t.run_id}),a=vd({dal:e.dal,workflow:ks(n)?Lo(n):n,job:e.job,project:e.project,run:o,membersByAlias:e.membersByAlias,outcomes:{},inputs:s,team_id:e.team_id});return ks(n)?fy(n,a,o.current_state??n.entry_step_id):uy(a,o.current_state??n.start_at)}};return t}async function uy(e,t){let r=t;if(r.startsWith(Ts))return{run_id:e.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Vt(e,r.slice(10));e.dal.setRunCurrentState(e.run_id,r),e.last_state_id=r;let i=e.workflow.states[r];if(i===void 0){let l=Ro(e,Y(e.workflow));if(l.kind==="paused")return De(e);if(l.kind==="escalate")return nt(e,{id:r,name:r,type:"unknown"},l.token,l.reason),De(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}let o,a=py(e,r);if(a!==null){let l=q(e,{run_id:e.run_id,state_name:r});if(e.steps_executed+=1,e.dal.finishStep(l.id,a,"escalation_resume"),G(e,r,r,a),a===Kn)return Vt(e,cl);let c=i.outcomes?.[a];o=c!==void 0?X(e.workflow,c):nt(e,{id:r,name:r,type:i.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else o=await kd(e,r,i);if(o.kind==="paused")return De(e);if(o.kind==="escalate")return nt(e,{id:r,name:r,type:i.type},o.token,o.reason),De(e);if(o.kind==="terminal"){let l=Ro(e,o.terminal);if(l.kind==="paused")return De(e);if(l.kind==="escalate")return nt(e,{id:r,name:r,type:i.type},l.token,l.reason),De(e);if(l.kind==="terminal")return Vt(e,l.terminal);r=l.state;continue}r=o.state}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})});let n=Ro(e,Y(e.workflow));return n.kind==="terminal"?Vt(e,n.terminal):Vt(e,Y(e.workflow))}async function fy(e,t,r){let n=new Map(e.steps.map(o=>[o.id,o])),s=new Map(e.steps.map(o=>[o.name,o])),i=r;for(let o=0;o<1e3;o+=1){t.dal.setRunCurrentState(t.run_id,i);let a=n.get(i);if(a===void 0)return nt(t,{id:i,name:i,type:"unknown"},"",`internal:unknown v3 step '${i}'`),De(t);let l=py(t,a.id);if(l!==null){let m=q(t,{run_id:t.run_id,state_name:a.name});if(t.steps_executed+=1,t.dal.finishStep(m.id,l,"escalation_resume"),G(t,a.id,a.name,l),l===Kn)return Vt(t,cl);let p=Object.keys(e.connections[a.id]??{}),h=e.connections[a.id]?.[l]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return nt(t,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),De(t);i=h;continue}let c=await sC(t,e,a);if(c.kind==="paused")return De(t);let d=Object.keys(e.connections[a.id]??{});if(c.kind==="escalate")return nt(t,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:d}),De(t);let u=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=t.workflow;t.workflow=Lo(e,a);try{let p=Ro(t,u);if(p.kind==="paused")return De(t);if(p.kind==="escalate")return nt(t,{id:a.id,name:a.name,type:a.type},p.token,p.reason),De(t);if(p.kind==="terminal")return Vt(t,p.terminal);let h=s.get(p.state);if(h===void 0)return nt(t,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),De(t);i=h.id;continue}finally{t.workflow=m}}if(Kr(u))return nt(t,{id:a.id,name:a.name,type:a.type},u,`generic escalation '${u}' from step '${a.id}'`,{declared_outcomes:d}),De(t);let f=e.connections[a.id]?.[u]?.[0]?.[0]?.step_id??e.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return nt(t,{id:a.id,name:a.name,type:a.type},u,`no declared edge for outcome '${u}' from step '${a.id}'`,{declared_outcomes:d}),De(t);i=f}return 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})}),Vt(t,"aborted")}async function sC(e,t,r){let n=my(t,r),s=e.workflow;e.workflow=Lo(t,r);try{return await kd(e,r.id,n,r.name)}finally{e.workflow=s}}function my(e,t){let r=t.parameters,n=t.members??{},s=Object.keys(e.connections[t.id]??{}),i=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),o={state_name:t.name};switch(t.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...o,type:"Review",...r,coder:n.coder,reviewers:n.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",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/interactive":return{...o,type:"Interactive",...r,agent:n.agent,outcomes:{done:i.done??"@terminal:done",...i.timeout!==void 0?{timeout:i.timeout}:{}}};case"lmctl/loop":return{...o,type:"Loop",...r,outcomes:{ok:i.ok??"@terminal:ok",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-docx":return{...o,type:"lmctl/render-docx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/render-xlsx":return{...o,type:"lmctl/render-xlsx",...r,outcomes:{done:i.done??"@terminal:done",...i.error!==void 0?{error:i.error}:{}}};case"lmctl/shell-step":return{...o,type:"ShellStep",...r,outcomes_from_exit:r.outcomes_from_exit??Object.fromEntries(s.map(a=>[a.slice(5),`@terminal:${a}`]))};case"lmctl/assert-repo-clean":return{...o,type:"AssertRepoClean",...r,next:i.main??"@terminal:main"};case"lmctl/choice":return{...o,type:"Choice",...r};case"lmctl/foreach":return{...o,type:"ForEach",...r,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",...r,outcomes:i};case"lmctl/terminal":return{...o,type:"Terminal",name:r.name,kind:r.kind};default:return{...o,type:t.type,...r}}}async function kd(e,t,r,n){let s=oy().get(r.type);if(s===void 0)throw new Error(`unknown archetype: ${r.type}`);if(s.execute===void 0)throw new Error(`archetype ${r.type} has no execute() - is it a trigger-only archetype used as a step?`);let i=e.emit_progress,o=e.progress_step_id;e.emit_progress=s.description.emits_progress===!0?lC(e,s):void 0,e.progress_step_id=null;try{return await s.execute(wg(e,t,r,n??t))}finally{e.emit_progress=i,e.progress_step_id=o}}function iC(e,t){try{let r=JSON.parse(e);if(aC(r)&&r.definition_schema_version===3)return xt.parse(r)}catch{return t}return t}function ks(e){return e.definition_schema_version===3}function Lo(e,t){let r=t===void 0?[]:Object.keys(e.connections[t.id]??{}),n=Object.fromEntries(r.map(i=>[i,{kind:i==="aborted"?"failure":"neutral"}])),s={};if(t?.type==="lmctl/loop"&&typeof t.parameters.body=="string"){let i=e.steps.find(o=>o.name===t.parameters.body);i!==void 0&&(s[t.parameters.body]=my(e,i))}return t?.type==="lmctl/terminal"&&typeof t.parameters.name=="string"&&(n[t.parameters.name]={kind:oC(t.parameters.kind)}),n.aborted??={kind:"failure"},{name:e.name,version:e.version,definition_schema_version:2,primitive_version:2,start_at:t?.name??e.entry_step_id,states:s,terminals:n,...e.default_task_timeout_ms!==void 0?{default_task_timeout_ms:e.default_task_timeout_ms}:{},...e.concurrency_key!==void 0?{concurrency_key:e.concurrency_key}:{},...e.concurrent_limit!==void 0?{concurrent_limit:e.concurrent_limit}:{},...e.errors!==void 0?{errors:e.errors}:{}}}function oC(e){return e==="success"||e==="failure"||e==="neutral"?e:"neutral"}function aC(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function lC(e,t){let r=`progress.${t.description.namespace}/${t.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;e.dal.insertSessionEvent({run_id:e.run_id,step_id:e.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let i=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${i}`)}}}function Vt(e,t){e.dal.setRunTerminalState(e.run_id,t);try{Zh(e.run_id,e.dal)}catch{}return{run_id:e.run_id,terminal_state:t,steps_executed:e.steps_executed}}function De(e){return{run_id:e.run_id,terminal_state:null,steps_executed:e.steps_executed,paused:!0}}function py(e,t){let n=e.dal.getRun(e.run_id)?.pending_escalation_decision??null;if(n===null)return null;let s;try{let a=JSON.parse(n);if(a===null||typeof a!="object"||Array.isArray(a))return null;s=a}catch{return null}let i=s[t];if(typeof i!="string")return null;delete s[t];let o=Object.keys(s).length>0?JSON.stringify(s):null;return e.dal.setRunPendingEscalationDecision(e.run_id,o),i}function Ro(e,t){if(!cC(e.workflow,t)||e.errors_block_fired)return{kind:"terminal",terminal:t};let r=e.workflow.errors;return r===void 0?{kind:"terminal",terminal:t}:(e.errors_block_fired=!0,r.on_unhandled_failure_state!==void 0?{kind:"state",state:r.on_unhandled_failure_state}:(r.on_unhandled_failure!==void 0&&dC(e,t,r.on_unhandled_failure),{kind:"terminal",terminal:t}))}function cC(e,t){return e.definition_schema_version===2&&e.terminals[t]?.kind==="failure"}function dC(e,t,r){let n=uC(e),s=r.capture_evidence&&n!==null?fC(e,n.id):[];e.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id,terminal_state:t,current_state:e.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function uC(e){return e.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",e.run_id)[0]??null}function fC(e,t){return e.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",t).map(n=>n.path)}function _y(e){if(!ly.includes(e.definition_schema_version))throw new Error(`unsupported definition_schema_version ${e.definition_schema_version}; supported versions: ${ly.join(", ")}`)}var ly,hy=E(()=>{"use strict";un();Qh();ng();Je();ay();Yn();ly=[1,2,3]});import{readFileSync as mC,readdirSync as pC}from"node:fs";import{basename as _C,join as hC,resolve as gC}from"node:path";function wy(e={}){let t=gC(e.workflowsDir??"workflows"),r=pC(t).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:t,rows:r.map(n=>yC(hC(t,n)))}}function yC(e){let t=_C(e);try{let r=mC(e,"utf8"),n=dt(r);return by(t,n)}catch(r){return{file:t,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Sy(r)}}}function Ey(e,t){try{let r=dt(t);return by(e,r)}catch(r){return{file:e,workflow_name:e,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:Sy(r)}}}function Ty(e){let t=[];t.push(`workflow verification - ${e.generated_at}`),t.push(`dir: ${e.workflows_dir}`),t.push(""),t.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),t.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let i of e.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})`}`;t.push(`${i.status.padEnd(17)} ${o} ${a.slice(0,52).padEnd(52)} ${i.note}`)}let r=e.rows.filter(i=>i.status==="PASS").length,n=e.rows.filter(i=>i.status==="PASS_NEEDS_INPUTS").length,s=e.rows.filter(i=>i.status==="FAIL").length;return t.push(""),t.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${t.join(`
1977
1977
  `)}
1978
1978
  `}function by(e,t){let r=EC(t),n=TC(t);if(r===null||n===null)return{file:e,workflow_name:t.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=wC(t.inputs);return s.length>0?{file:e,workflow_name:t.name,status:"PASS_NEEDS_INPUTS",first_step_id:r,first_step_type:n,first_step_disposition:`needs_inputs:${n}`,note:`load ok; graph ok; entry step is ${r}; requires inputs: ${s.join(", ")}`}:{file:e,workflow_name:t.name,status:"PASS",first_step_id:r,first_step_type:n,first_step_disposition:`ready:${n}`,note:"load ok; graph ok; first step entered without inputs"}}function wC(e){return(e??[]).filter(t=>t.required===!0&&t.default===void 0).map(t=>t.name)}function EC(e){return Id(e)?e.entry_step_id:e.start_at}function TC(e){return Id(e)?e.steps.find(t=>t.id===e.entry_step_id)?.type??null:e.states[e.start_at]?.type??null}function Id(e){return e.definition_schema_version===3}function Sy(e){return e instanceof Xt?e.issues.map(t=>`${t.path}: ${t.message}`).join("; "):e instanceof SyntaxError?`JSON parse failed: ${e.message}`:e instanceof Error?e.message:String(e)}function vy(e){let t=new Set;if(Id(e))for(let r of e.steps){let n=r.members??{};gy(n,t)}else for(let r of Object.values(e.states))gy(r,t);return[...t].sort()}function gy(e,t){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let i=e[s],o=yy(i);o!==null&&t.add(o)}for(let s of n){let i=e[s];if(Array.isArray(i))for(let o of i){let a=yy(o);a!==null&&t.add(a)}}}function yy(e){if(e===null||typeof e!="object")return null;let t=e.alias;return typeof t=="string"&&t.length>0?t:null}var Oo=E(()=>{"use strict";ms()});function bC({dal:e}){let t=e.listProjects();for(let r of t){let s=e.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,$o)[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}=SC(e,r,o);if(a<20)continue;let c=o??"initial",d=`${Is}:${r.id}:${c}`;e.enqueueJob({project_id:r.id,source:$o,source_ref:Is,payload:JSON.stringify({kind:Is,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:o}),dedupe_key:d})}}function SC(e,t,r){let n=e.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1979
1979
  FROM run r
1980
1980
  JOIN job j ON j.id = r.job_id
1981
1981
  WHERE j.project_id = ?
1982
1982
  AND r.terminal_state IS NOT NULL
1983
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[t.id,r]:[t.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function ky(e){for(let t of vC)try{t(e)}catch{}}var $o,Is,vC,Nd=E(()=>{"use strict";$o="memory_policy",Is="memory_consolidation_request";vC=[bC]});var Ly={};Ee(Ly,{getOrInsertConsolidationWorkflow:()=>Ny,runJobById:()=>AC,runOnce:()=>Pr,startWorker:()=>RC});import{createHash as kC}from"node:crypto";import{readFileSync as IC}from"node:fs";import{pathToFileURL as NC}from"node:url";function Ny(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{z_({swallow:!0});let n=bo(t);if(n===null)return null;let s=IC(n,"utf8"),i=dt(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:NC(n).href,source_sha256:kC("sha256").update(s).digest("hex")})}catch{return null}}async function Pr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??Iy,evaluator:n=>Ay(e.dal,n)}),r===null?null:await xy(e.dal,r,t)}catch(n){if(r!==null)return pr(e.dal,r,"worker_run_failed",Dr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Co(Dr(n))})})}catch{}return null}finally{e.max_concurrent}}async function AC(e){let t=Date.now(),r=null;try{let n=e.dal.claimJobByIdWithConcurrency({job_id:e.job_id,worker_id:e.worker_id,lease_ms:e.lease_ms??Iy,evaluator:s=>Ay(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await xy(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,...pr(e.dal,r,"worker_run_failed",Dr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Co(Dr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function xy(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return pr(e,t,"worker_project_missing","project_not_found",r);let s=t.source===$o&&t.source_ref===Is,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=Ny(e):o=Ry(e,t,n),o===null)return pr(e,t,"worker_workflow_missing","workflow_not_found",r,n);let a=e.getTeam(i?.team_id??n.team_id),l=a===null?[]:e.listTeamMembers(a.id);if(a===null||l.length===0)return pr(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=dt(o.definition)}catch(u){return pr(e,t,"worker_workflow_invalid",Dr(u),r,n)}let d=LC(c,l);if(d.length>0)return pr(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await dy({dal:e,job:t,workflow:c,team:a,members:l,workflowRow:o});return e.setJobRun(t.id,u.run_id),u.paused===!0?{job_id:t.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(e.releaseJob(t.id,"done",null),{job_id:t.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return pr(e,t,"worker_run_failed",Dr(u),r,n,a)}}function Ay(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=Ry(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=dt(n.definition)}catch{s=null}return co({workflow:s,job:t,project:r})}function Ry(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function RC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await Pr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Co(Dr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??xC))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function pr(e,t,r,n,s,i,o){let a=Co(n);return e.releaseJob(t.id,"failed",a),e.raiseAttention({kind:r,severity:"error",project_id:i?.id??t.project_id,payload:JSON.stringify({job_id:t.id,team_id:o?.id??null,error:a})}),{job_id:t.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Dr(e){return e instanceof Error?e.message:String(e)}function Co(e){return e.length>4096?e.slice(0,4096):e}function LC(e,t){let r=vy(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Iy,xC,Mo=E(()=>{"use strict";ud();_y();ms();Oo();Xc();Nd();Iy=6e5,xC=5e3});import{existsSync as OC,readFileSync as $C}from"node:fs";import{marked as CC}from"marked";function My(e,t){e.get("/layman",r=>r.html(Re("Layman Home",MC(t.dal)))),e.get("/api/layman",r=>r.json(Fy(t.dal))),e.get("/layman/start/:workflow",r=>{let n=Cy(r);return n===null?r.notFound():r.html(Re(`Start ${yn(n)}`,PC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=Cy(r);return n===null?r.notFound():n==="newspaper"?Oy(r,t.dal):FC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Or(t.dal,jo(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,BC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Or(t.dal,jo(r,"id"));return n===null?r.notFound():r.json(QC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>HC(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",zC(t.dal)))),e.post("/layman/newspaper",r=>Oy(r,t.dal)),e.delete("/layman/newspaper/:id",r=>$y(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>$y(r,t.dal))}function MC(e){let t=Fy(e);return`<section class="layman-home">
1983
+ ${r!==null?"AND r.id > ?":""}`,...r!==null?[t.id,r]:[t.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function ky(e){for(let t of vC)try{t(e)}catch{}}var $o,Is,vC,Nd=E(()=>{"use strict";$o="memory_policy",Is="memory_consolidation_request";vC=[bC]});var Ly={};Ee(Ly,{getOrInsertConsolidationWorkflow:()=>Ny,runJobById:()=>AC,runOnce:()=>Pr,startWorker:()=>RC});import{createHash as kC}from"node:crypto";import{readFileSync as IC}from"node:fs";import{pathToFileURL as NC}from"node:url";function Ny(e,t="durable-memory-consolidation-v2"){let r=e.getWorkflowByName(t);if(r!==null)return r;try{zh({swallow:!0});let n=bo(t);if(n===null)return null;let s=IC(n,"utf8"),i=dt(s);return e.insertWorkflow({name:t,version:i.version,definition_schema_version:i.definition_schema_version,definition:s,source_uri:NC(n).href,source_sha256:kC("sha256").update(s).digest("hex")})}catch{return null}}async function Pr(e){let t=Date.now(),r=null;try{return r=e.dal.claimNextJobWithConcurrency({worker_id:e.worker_id,lease_ms:e.lease_ms??Iy,evaluator:n=>Ay(e.dal,n)}),r===null?null:await xy(e.dal,r,t)}catch(n){if(r!==null)return pr(e.dal,r,"worker_run_failed",Dr(n),t);try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Co(Dr(n))})})}catch{}return null}finally{e.max_concurrent}}async function AC(e){let t=Date.now(),r=null;try{let n=e.dal.claimJobByIdWithConcurrency({job_id:e.job_id,worker_id:e.worker_id,lease_ms:e.lease_ms??Iy,evaluator:s=>Ay(e.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await xy(e.dal,r,t)}):n}catch(n){if(r!==null)return{claimed:!0,...pr(e.dal,r,"worker_run_failed",Dr(n),t)};try{e.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Co(Dr(n)),job_id:e.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:e.job_id}}finally{e.max_concurrent}}async function xy(e,t,r){let n=e.getProjectByJob(t.id);if(n===null)return pr(e,t,"worker_project_missing","project_not_found",r);let s=t.source===$o&&t.source_ref===Is,i=t.run_id===null?null:e.getRun(t.run_id),o;if(i!==null?o=e.getWorkflow(i.workflow_id):s?o=Ny(e):o=Ry(e,t,n),o===null)return pr(e,t,"worker_workflow_missing","workflow_not_found",r,n);let a=e.getTeam(i?.team_id??n.team_id),l=a===null?[]:e.listTeamMembers(a.id);if(a===null||l.length===0)return pr(e,t,"worker_team_missing","team_not_found",r,n);let c;try{c=dt(o.definition)}catch(u){return pr(e,t,"worker_workflow_invalid",Dr(u),r,n)}let d=LC(c,l);if(d.length>0)return pr(e,t,"worker_team_missing_aliases",`missing_aliases:${d.join(",")}`,r,n,a);try{let u=await dy({dal:e,job:t,workflow:c,team:a,members:l,workflowRow:o});return e.setJobRun(t.id,u.run_id),u.paused===!0?{job_id:t.id,run_id:u.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(e.releaseJob(t.id,"done",null),{job_id:t.id,run_id:u.run_id,status:"done",terminal_state:u.terminal_state,ms:Date.now()-r})}catch(u){return pr(e,t,"worker_run_failed",Dr(u),r,n,a)}}function Ay(e,t){let r=e.getProjectByJob(t.id);if(r===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let n=Ry(e,t,r);if(n===null)return{concurrency_key:t.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=dt(n.definition)}catch{s=null}return co({workflow:s,job:t,project:r})}function Ry(e,t,r){return t.workflow_id_override!==null?e.getWorkflow(t.workflow_id_override):e.getWorkflowByName(r.workflow_name)}async function RC(e){let t=!1,r=null,n=Promise.resolve(),s=async()=>{if(!t){try{let i;do i=await Pr(e);while(!t&&i!==null)}catch(i){try{e.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Co(Dr(i))})})}catch{}}t||(r=setTimeout(()=>{n=s()},e.poll_interval_ms??xC))}};return n=s(),{stop:async()=>{t=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function pr(e,t,r,n,s,i,o){let a=Co(n);return e.releaseJob(t.id,"failed",a),e.raiseAttention({kind:r,severity:"error",project_id:i?.id??t.project_id,payload:JSON.stringify({job_id:t.id,team_id:o?.id??null,error:a})}),{job_id:t.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Dr(e){return e instanceof Error?e.message:String(e)}function Co(e){return e.length>4096?e.slice(0,4096):e}function LC(e,t){let r=vy(e);if(r.length===0)return[];let n=new Set(t.map(s=>s.alias));return r.filter(s=>!n.has(s))}var Iy,xC,Mo=E(()=>{"use strict";ud();hy();ms();Oo();Xc();Nd();Iy=6e5,xC=5e3});import{existsSync as OC,readFileSync as $C}from"node:fs";import{marked as CC}from"marked";function My(e,t){e.get("/layman",r=>r.html(Re("Layman Home",MC(t.dal)))),e.get("/api/layman",r=>r.json(Fy(t.dal))),e.get("/layman/start/:workflow",r=>{let n=Cy(r);return n===null?r.notFound():r.html(Re(`Start ${yn(n)}`,PC(t.dal,n)))}),e.post("/layman/start/:workflow",async r=>{let n=Cy(r);return n===null?r.notFound():n==="newspaper"?Oy(r,t.dal):FC(r,t.dal,n)}),e.get("/layman/run/:id",r=>{let n=Or(t.dal,jo(r,"id"));return n===null?r.notFound():r.html(Re(`Run ${n.id}`,BC(t.dal,n)))}),e.get("/api/layman/run/:id",r=>{let n=Or(t.dal,jo(r,"id"));return n===null?r.notFound():r.json(QC(t.dal,n))}),e.post("/layman/run/:id/respond",async r=>HC(r,t.dal)),e.get("/layman/newspaper",r=>r.html(Re("Newspaper Subscriptions",zC(t.dal)))),e.post("/layman/newspaper",r=>Oy(r,t.dal)),e.delete("/layman/newspaper/:id",r=>$y(r,t.dal)),e.post("/layman/newspaper/:id/delete",r=>$y(r,t.dal))}function MC(e){let t=Fy(e);return`<section class="layman-home">
1984
1984
  <h1>Welcome</h1>
1985
1985
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1986
1986
  <div class="grid">${Do.map(jC).join("")}</div>
@@ -2059,19 +2059,19 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
2059
2059
  WHERE w.name = ?
2060
2060
  ORDER BY pw.id DESC`,"newspaper")}function Wy(e,t){for(let r of[...t.steps].reverse()){let n=e.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function By(e,t){let r=Number(Ke(t.project_id));return Number.isInteger(r)?e.getProject(r):null}function tM(e){let t=Ke(e.schedule)||"daily";return t==="weekly"?{preset:t,cron:"0 6 * * 1"}:t==="custom"?{preset:t,cron:Ke(e.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function Cy(e){let t=e.req.param("workflow");return Rd.includes(t)?t:null}function yn(e){return Do.find(t=>t.name===e)?.title??e}function rM(e){return e.split(/[_:-]/).filter(Boolean).map(t=>`${t[0]?.toUpperCase()??""}${t.slice(1)}`).join(" ")}function Od(e){return CC.parse(e,{async:!1})}function nM(e){return e==="done"||e==="pr_ready"||e==="merged"}function sM(e){return e.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function iM(e,t){return e.split(`
2061
2061
  `).slice(0,t).join(`
2062
- `)}function oM(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ke(e){return typeof e=="string"?e:""}function aM(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function Ad(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function jo(e,t){return Number(e.req.param(t))}var Do,Rd,qy=E(()=>{"use strict";Mo();Ht();od();Do=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Rd=Do.map(e=>e.name)});function cM(e){return e.replace(/^\/+/,"")}function Hy(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function wn(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=cM(e.mailboxKey),r=t.lastIndexOf("/");return(r>=0?t.slice(r+1):t).includes(".")&&(t=r>=0?t.slice(0,r+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return Hy(e.userId)&&Hy(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${lM}/${e.identityId}/`}function uM(e){return String(Math.max(0,Math.floor(e))).padStart(dM,"0")}function $d(e,t,r){return`${e}${t}${uM(r)}.json`}function Po(e,t){return`${e}${t}`}function Fo(e,t,r){let n=`${t}${r}`;if(!e.startsWith(n))return;let s=e.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var lM,dM,Uo=E(()=>{"use strict";lM="mailbox";dM=12});function Kt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=Wo[s&15]+n,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=Wo[a&15]+o,a=a>>4;let l=Wo[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=Wo[Math.floor(t()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Wo,Bo=E(()=>{"use strict";Wo="0123456789abcdef"});function Md(e,t){return!Number.isFinite(e)||e<=0?t:e}function jd(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function Ky(e){return e.conversation_id===Vy&&pM(e.payload)}function pM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function hM(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:Ky(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var Jy,Xy,Gy,fM,Vy,mM,Cd,Fr,qo=E(()=>{"use strict";Uo();Bo();Jy=3e3,Xy=1e4,Gy=12e3,fM=1e3,Vy="__lmctl_heartbeat__",mM={kind:"heartbeat"},Cd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},Fr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(t){this.opts=t,this.basePrefix=wn({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=Md(t.readIntervalMs??t.pollIntervalMs??Jy,Jy),this.heartbeatIdleMs=Md(t.heartbeatIdleMs??Xy,Xy),this.backoffReadIntervalMs=Md(t.backoffReadIntervalMs??t.pollIntervalMs??Gy,Gy)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let t=this.opts.timers??Cd;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let r=Po(this.basePrefix,t),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:fM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Fo(o.Key??"",this.basePrefix,t);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(t,r){let n=this.writeChain.then(()=>this.doPut(t,r));return this.writeChain=n.catch(()=>{}),n}async doPut(t,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:Kt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:r},o=(this.ownSeq??0)+1,a=$d(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(t){if(this.stopRequested)return;let r=this.opts.timers??Cd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let t=(this.cursor??0)+1,r=$d(this.basePrefix,this.peerStream,t),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(t);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(jd(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(t);continue}if(this.recordPeerHeartbeat(s),Ky(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let r=hM(t);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let r=this.opts.timers??Cd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=t-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Vy,mM)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(r){this.emitError(r,"handle")}}emitError(t,r){if(this.opts.onError!==void 0)try{this.opts.onError(t,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,t)}}});import{getConnInfo as _M}from"@hono/node-server/conninfo";function Yy(e,t){let r=t.bucket??gM,n=t.remoteAddressOf??(i=>wM(i)),s=i=>{let o=n(i);return EM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Dd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return jd(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Pd(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Dd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await t.s3.send(new t.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Pd(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Dd(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=yM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Pd(u)},500)}})}function Dd(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let r=e.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function yM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function wM(e){try{return _M(e).remote.address}catch{return}}function EM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Pd(e){return e instanceof Error?e.message:String(e)}var gM,zy=E(()=>{"use strict";qo();gM="local"});function Zy(e,t){e.get("/mailbox/workspace",r=>SM(r,t)),e.get("/mailbox/projects",r=>vM(r,t)),e.get("/mailbox/projects/:id",r=>kM(r,t)),e.post("/mailbox/projects",r=>IM(r,t)),e.patch("/mailbox/projects/:id",r=>NM(r,t)),e.delete("/mailbox/projects/:id",r=>xM(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>AM(r,t)),e.get("/mailbox/prompts/:id",r=>RM(r,t))}function SM(e,t){t.dal.ensureWorkspace({id:Tn,name:Fd});let r=Qy(t.dal),n={id:Tn,name:Fd,created_at:bM,projects:r};return e.json({workspace:n})}function vM(e,t){return e.json({projects:Qy(t.dal)})}function kM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(En)){let s=Ud(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Xo(s)})}let n=tw(t.dal,r);return n===null?e.json({project:null},404):e.json({project:ew(n)})}async function IM(e,t){let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:Tn,name:Fd});let s=t.dal.insertWebProject({workspace_id:Tn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return e.json({project:Xo(s)},201)}async function NM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(En)){let i=Ud(t.dal,r);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=t.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?e.json({error:"project_not_found",message:`project not found: ${r}`},404):e.json({project:Xo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function xM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(En)){let n=Ud(t.dal,r);if(n===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(n.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function AM(e,t){let r=e.req.param("project_id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=tw(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${TM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await LM({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Jo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function RM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"prompt id required"},400);let n=OM(t.dal,r);return e.json({result:n})}function Qy(e){let t=e.listProjects().map(ew),r=e.listWebProjectsActive(Tn).map(Xo);return[...t,...r].sort(BM)}function ew(e){return{id:`${Jo}${e.id}`,workspace_id:Tn,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Xo(e){let t={};if(e.config_json!==null)try{let r=JSON.parse(e.config_json);r!==null&&typeof r=="object"&&(t=r)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${En}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function Ud(e,t){if(!t.startsWith(En))return null;let r=t.slice(En.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:e.getWebProject(n)}function tw(e,t){if(t.startsWith(Jo)){let n=t.slice(Jo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return e.getProject(s)}let r=Number.parseInt(t,10);return Number.isFinite(r)&&String(r)===t?e.getProject(r):null}async function LM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Vc(),w_));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function OM(e,t){let r=e.getPromptDispatch(t);if(r===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=e.getJob(r.job_id);if(n===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:e.getRun(n.run_id),i=e.getProject(r.project_id),o=FM(e,i?.team_id??null),a=PM(s),l=UM(n,a,o.length>0),c=WM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:$M(e,i.workflow_name),u=d.totalEstimatedMs,f=rw(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,_=s===null?[]:CM(e,s.id),g=MM(s,a,_,d.perStep,o),h=jM(_,d.perStep),y=DM(g,h,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Ho(u,f),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&e.setPromptDispatchCompleted(t),{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Ho(u,f),...y},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:o,...Ho(u,f),...y},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Ho(u,f),...y},errors_json:null,duration_ms:c}}function $M(e,t){let r={totalEstimatedMs:void 0,perStep:new Map},n=e.getWorkflowByName(t);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function CM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function MM(e,t,r,n,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??e.paused_at??e.started_at,l=n.get(i),c=l?.name??i,d=rw(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function jM(e,t){let r=[];for(let n of e){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=t.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function DM(e,t,r,n,s,i){let o={completed_steps:t,total_elapsed_ms:n};return e!==void 0&&(o.current_step=e),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function rw(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Ho(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function PM(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let r="__paused__:";return t.startsWith(r)?t.slice(r.length):null}function FM(e,t){if(t===null)return[];let r;try{r=e.listTeamMembers(t)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function UM(e,t,r){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||r||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function WM(e,t){let r=Date.parse(e);if(Number.isNaN(r))return null;let n=t?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function BM(e,t){let r=Date.parse(e.last_active_at??""),n=Date.parse(t.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?e.name.localeCompare(t.name):s}var Jo,En,TM,Tn,Fd,bM,nw=E(()=>{"use strict";Jo="project:",En="web_project:",TM="prompt:",Tn="default",Fd="Default workspace",bM=new Date(0).toISOString()});import{Buffer as sw}from"node:buffer";function iw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function ow(e){return JM[e]}function aw(e){let t=e.trim();if(t==="")return;let r=t.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var qM,HM,Go,JM,Wd=E(()=>{"use strict";qM=1e4,HM=256*1024,Go=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=iw(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,qM),this.pushByteCap=iw(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,HM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let r=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),n={session_id:t.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${r.pid} cmd=${t.command}`),{pid:r.pid}}endSession(t){let r=this.sessions.get(t);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{r.pty.write(t.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,r){if(!t.closed){if(t.pendingOutput.push(r),t.pendingBytes+=sw.byteLength(r,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let n=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${t.session_id} reason=${r} bytes=${sw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,r){if(t.closed)return;await this.flush(t,"pty_exit");let n=`\r
2062
+ `)}function oM(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ke(e){return typeof e=="string"?e:""}function aM(e){if(e===null)return{};try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return t}catch{return{}}return{}}function Ad(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function jo(e,t){return Number(e.req.param(t))}var Do,Rd,qy=E(()=>{"use strict";Mo();Ht();od();Do=[{name:"info-qa",title:"Ask a Question",description:"Get a grounded answer from multiple researchers and one consolidator."},{name:"document-creation",title:"Create a Document",description:"Draft, review, and render a polished document with an interactive wizard."},{name:"newspaper",title:"Daily Newspaper",description:"Subscribe to recurring digests for topics you care about."}],Rd=Do.map(e=>e.name)});function cM(e){return e.replace(/^\/+/,"")}function Hy(e){return typeof e=="string"&&e!==""&&!e.includes("/")&&!e.includes("\\")}function wn(e){if(e.mailboxKey!==void 0&&e.mailboxKey!==null&&e.mailboxKey!==""){let t=cM(e.mailboxKey),r=t.lastIndexOf("/");return(r>=0?t.slice(r+1):t).includes(".")&&(t=r>=0?t.slice(0,r+1):""),t!==""&&!t.endsWith("/")&&(t+="/"),t}return Hy(e.userId)&&Hy(e.deviceId)?`${e.userId}/${e.deviceId}/`:`${lM}/${e.identityId}/`}function uM(e){return String(Math.max(0,Math.floor(e))).padStart(dM,"0")}function $d(e,t,r){return`${e}${t}${uM(r)}.json`}function Po(e,t){return`${e}${t}`}function Fo(e,t,r){let n=`${t}${r}`;if(!e.startsWith(n))return;let s=e.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let i=Number(s[1]);return Number.isSafeInteger(i)?i:void 0}var lM,dM,Uo=E(()=>{"use strict";lM="mailbox";dM=12});function Kt(e,t){let r=Math.floor(e),n="",s=r;for(let d=0;d<12;d++)n=Wo[s&15]+n,s=Math.floor(s/16);let i=Math.floor(t()*4096)&4095,o="",a=i;for(let d=0;d<3;d++)o=Wo[a&15]+o,a=a>>4;let l=Wo[8|Math.floor(t()*4)&3],c="";for(let d=0;d<15;d++)c+=Wo[Math.floor(t()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+o+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Wo,Bo=E(()=>{"use strict";Wo="0123456789abcdef"});function Md(e,t){return!Number.isFinite(e)||e<=0?t:e}function jd(e){if(e===null||typeof e!="object")return!1;let t=e;return t.name==="NoSuchKey"||t.name==="NotFound"||t.Code==="NoSuchKey"||t.code==="NoSuchKey"||t.$metadata!==void 0&&t.$metadata.httpStatusCode===404}function Ky(e){return e.conversation_id===Vy&&pM(e.payload)}function pM(e){return typeof e=="object"&&e!==null&&e.kind==="heartbeat"}function _M(e){let t=typeof e.hb=="string"&&e.hb!==""?e.hb:Ky(e)?e.timestamp:void 0;if(t===void 0)return;let r=Date.parse(t);return Number.isFinite(r)?r:void 0}var Jy,Xy,Gy,fM,Vy,mM,Cd,Fr,qo=E(()=>{"use strict";Uo();Bo();Jy=3e3,Xy=1e4,Gy=12e3,fM=1e3,Vy="__lmctl_heartbeat__",mM={kind:"heartbeat"},Cd={setTimeout:(e,t)=>setTimeout(e,t),clearTimeout:e=>clearTimeout(e)},Fr=class{opts;basePrefix;ownStream;peerStream;cursor;ownSeq;bootstrapped=!1;bootstrapInFlight=null;bootstrapPromise=null;writeChain=Promise.resolve();readIntervalMs;heartbeatIdleMs;backoffReadIntervalMs;running=!1;stopped=!1;stopRequested=!1;timerHandle=null;heartbeatTimerHandle=null;lastWriteMs;lastPeerHeartbeatMs;tickInFlight=null;constructor(t){this.opts=t,this.basePrefix=wn({identityId:t.identityId,userId:t.userId,deviceId:t.deviceId,mailboxKey:t.mailboxKey}),this.ownStream=t.selfRole==="agent"?"local":"web",this.peerStream=t.selfRole==="agent"?"web":"local",this.cursor=t.cursor,this.readIntervalMs=Md(t.readIntervalMs??t.pollIntervalMs??Jy,Jy),this.heartbeatIdleMs=Md(t.heartbeatIdleMs??Xy,Xy),this.backoffReadIntervalMs=Md(t.backoffReadIntervalMs??t.pollIntervalMs??Gy,Gy)}start(){if(this.stopped)throw new Error("SequentialMailboxClient: cannot start after stop()");this.running||(this.running=!0,this.bootstrapInFlight=this.bootstrapThenRun())}async stop(){this.stopped=!0,this.stopRequested=!0;let t=this.opts.timers??Cd;if(this.timerHandle!==null&&(t.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(t.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=null),this.bootstrapInFlight!==null)try{await this.bootstrapInFlight}catch{}if(this.tickInFlight!==null)try{await this.tickInFlight}catch{}this.running=!1}async putMessage(t){return this.putEnvelope(t.conversation_id,t.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(t){if(!Number.isFinite(t)||t<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${t}`);this.readIntervalMs=t}isPeerOn(){return this.peerIsOn((this.opts.now??Date.now)())}async bootstrapThenRun(){if(await this.ensureBootstrapped(),this.stopRequested){this.running=!1;return}this.runTick(),this.writeHeartbeat()}ensureBootstrapped(){return this.bootstrapped?Promise.resolve():(this.bootstrapPromise===null&&(this.bootstrapPromise=this.runColdStart()),this.bootstrapPromise)}async runColdStart(){try{let t=await this.maxSeq(this.ownStream);this.ownSeq=t,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(t){throw this.bootstrapPromise=null,this.emitError(t,"list"),t}}async maxSeq(t){let r=Po(this.basePrefix,t),n=0,s;do{let i=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:fM,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let o of i.Contents??[]){let a=Fo(o.Key??"",this.basePrefix,t);a!==void 0&&a>n&&(n=a)}s=i.IsTruncated===!0?i.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(t,r){let n=this.writeChain.then(()=>this.doPut(t,r));return this.writeChain=n.catch(()=>{}),n}async doPut(t,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),i={message_id:Kt(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:t,payload:r},o=(this.ownSeq??0)+1,a=$d(this.basePrefix,this.ownStream,o);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(i),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=o,this.recordWrite(n),a}scheduleNextTick(t){if(this.stopRequested)return;let r=this.opts.timers??Cd;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},t)}runTick(){this.stopRequested||(this.tickInFlight=(async()=>{try{await this.pollOnce()}finally{this.tickInFlight=null,this.stopRequested||this.scheduleNextTick(this.nextReadDelayMs())}})())}async pollOnce(){for(;!this.stopRequested;){let t=(this.cursor??0)+1,r=$d(this.basePrefix,this.peerStream,t),n;try{let i=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),i.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(t);continue}n=await i.Body.transformToString("utf-8")}catch(i){if(jd(i)){this.opts.onS3Op?.("get");return}this.emitError(i,"get");return}let s;try{s=JSON.parse(n)}catch(i){this.emitError(i,"get"),this.advanceCursor(t);continue}if(this.recordPeerHeartbeat(s),Ky(s)){this.advanceCursor(t);continue}try{await this.opts.onMessage(s)}catch(i){this.emitError(i,"handle");return}this.advanceCursor(t)}}advanceCursor(t){this.cursor=t,this.notifyCursorAdvance(t)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(t){return this.lastPeerHeartbeatMs!==void 0&&t-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(t){let r=_M(t);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(t){this.lastWriteMs=t,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(t){if(this.stopRequested)return;let r=this.opts.timers??Cd;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},t)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let t=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=t-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Vy,mM)}catch(t){this.emitError(t,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(t){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(t)}catch(r){this.emitError(r,"handle")}}emitError(t,r){if(this.opts.onError!==void 0)try{this.opts.onError(t,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,t)}}});import{getConnInfo as hM}from"@hono/node-server/conninfo";function Yy(e,t){let r=t.bucket??gM,n=t.remoteAddressOf??(i=>wM(i)),s=i=>{let o=n(i);return EM(o)?null:i.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};e.get("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Dd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);try{let l=await t.s3.send(new t.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return i.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return i.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return jd(l)?i.json({error:"not_found"},404):i.json({error:"internal",message:Pd(l)},500)}}),e.put("/local-mailbox/object",async i=>{let o=s(i);if(o!==null)return o;let a=Dd(i.req.query("key"));if(typeof a!="string")return i.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await i.req.arrayBuffer());try{return await t.s3.send(new t.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),i.json({ok:!0})}catch(c){return i.json({error:"internal",message:Pd(c)},500)}}),e.get("/local-mailbox/list",async i=>{let o=s(i);if(o!==null)return o;let a=i.req.query("prefix")??"",l=Dd(a,{allowEmpty:!0});if(typeof l!="string")return i.json({error:"bad_request",message:l.error},400);let c=yM(i.req.query("maxKeys")),d=i.req.query("token");try{let u=await t.s3.send(new t.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...d!==void 0&&d!==""?{ContinuationToken:d}:{}}));return i.json({Contents:(u.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:u.IsTruncated??!1,...u.NextContinuationToken!==void 0?{NextContinuationToken:u.NextContinuationToken}:{}})}catch(u){return i.json({error:"internal",message:Pd(u)},500)}})}function Dd(e,t={}){if(e===void 0||e==="")return t.allowEmpty===!0?"":{error:"key required"};let r=e.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function yM(e){if(e===void 0||e==="")return;let t=Number(e);return Number.isInteger(t)&&t>0?t:void 0}function wM(e){try{return hM(e).remote.address}catch{return}}function EM(e){return e===void 0||e===""?!1:!!(e==="127.0.0.1"||e==="::1"||e.startsWith("::ffff:127.")||e.startsWith("127."))}function Pd(e){return e instanceof Error?e.message:String(e)}var gM,zy=E(()=>{"use strict";qo();gM="local"});function Zy(e,t){e.get("/mailbox/workspace",r=>SM(r,t)),e.get("/mailbox/projects",r=>vM(r,t)),e.get("/mailbox/projects/:id",r=>kM(r,t)),e.post("/mailbox/projects",r=>IM(r,t)),e.patch("/mailbox/projects/:id",r=>NM(r,t)),e.delete("/mailbox/projects/:id",r=>xM(r,t)),e.post("/mailbox/projects/:project_id/prompts",r=>AM(r,t)),e.get("/mailbox/prompts/:id",r=>RM(r,t))}function SM(e,t){t.dal.ensureWorkspace({id:Tn,name:Fd});let r=Qy(t.dal),n={id:Tn,name:Fd,created_at:bM,projects:r};return e.json({workspace:n})}function vM(e,t){return e.json({projects:Qy(t.dal)})}function kM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(En)){let s=Ud(t.dal,r);return s===null||s.deleted_at!==null?e.json({project:null},404):e.json({project:Xo(s)})}let n=tw(t.dal,r);return n===null?e.json({project:null},404):e.json({project:ew(n)})}async function IM(e,t){let r;try{r=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return e.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return e.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return e.json({error:"bad_request",message:"input.repo_path is required"},400);t.dal.ensureWorkspace({id:Tn,name:Fd});let s=t.dal.insertWebProject({workspace_id:Tn,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return e.json({project:Xo(s)},201)}async function NM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(En)){let i=Ud(t.dal,r);if(i===null||i.deleted_at!==null)return e.json({error:"project_not_found",message:`project not found: ${r}`},404);let o=t.dal.updateWebProject({id:i.id,name:s.name===void 0?void 0:s.name,config_json:s.config_json===void 0?void 0:JSON.stringify(s.config_json)});return o===null?e.json({error:"project_not_found",message:`project not found: ${r}`},404):e.json({project:Xo(o)})}return e.json({error:"project_not_found",message:`project not found: ${r}`},404)}function xM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(En)){let n=Ud(t.dal,r);if(n===null)return e.json({deleted:!1});let s=t.dal.softDeleteWebProject(n.id);return e.json({deleted:s})}return e.json({deleted:!1})}async function AM(e,t){let r=e.req.param("project_id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return e.json({error:"bad_request",message:"input is required"},400);let i=s.project_id??r;if(typeof s.text!="string"||s.text==="")return e.json({error:"bad_request",message:"input.text is required"},400);let o=tw(t.dal,i);if(o===null)return e.json({error:"project_not_found",message:`project not found: ${i}`},404);if(t.dal.getWorkflowByName(o.workflow_name)===null)return e.json({error:"workflow_not_registered",message:`project ${o.name} has no registered workflow "${o.workflow_name}"`},400);let l=`${TM}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},d;t.enqueueProjectJob!==void 0?d=t.enqueueProjectJob({dal:t.dal,project_id:o.id,source_ref:l,payload:c}):d=await LM({dal:t.dal,project_id:o.id,source_ref:l,payload:c}),t.dal.insertPromptDispatch({prompt_id:l,project_id:o.id,job_id:d.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let u={id:l,project_id:`${Jo}${o.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return e.json({prompt:u},201)}function RM(e,t){let r=e.req.param("id");if(r===void 0||r==="")return e.json({error:"bad_request",message:"prompt id required"},400);let n=OM(t.dal,r);return e.json({result:n})}function Qy(e){let t=e.listProjects().map(ew),r=e.listWebProjectsActive(Tn).map(Xo);return[...t,...r].sort(BM)}function ew(e){return{id:`${Jo}${e.id}`,workspace_id:Tn,name:e.name,repo_path:e.local_path,config_json:{workflow_name:e.workflow_name,team_id:e.team_id,durable_memory_mode:e.durable_memory_mode},last_active_at:null,created_at:e.created_at}}function Xo(e){let t={};if(e.config_json!==null)try{let r=JSON.parse(e.config_json);r!==null&&typeof r=="object"&&(t=r)}catch{}return e.linked_v4_project_id!==null&&(t={...t,linked_v4_project_id:e.linked_v4_project_id}),{id:`${En}${e.id}`,workspace_id:e.workspace_id,name:e.name,repo_path:e.repo_path,config_json:t,last_active_at:e.last_active_at,created_at:e.created_at}}function Ud(e,t){if(!t.startsWith(En))return null;let r=t.slice(En.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:e.getWebProject(n)}function tw(e,t){if(t.startsWith(Jo)){let n=t.slice(Jo.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return e.getProject(s)}let r=Number.parseInt(t,10);return Number.isFinite(r)&&String(r)===t?e.getProject(r):null}async function LM(e){let{enqueueManual:t}=await Promise.resolve().then(()=>(Vc(),wh));return{id:t(e.dal,{project_id:e.project_id,source_ref:e.source_ref,payload:e.payload}).id}}function OM(e,t){let r=e.getPromptDispatch(t);if(r===null)return{prompt_id:t,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=e.getJob(r.job_id);if(n===null)return{prompt_id:t,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:e.getRun(n.run_id),i=e.getProject(r.project_id),o=FM(e,i?.team_id??null),a=PM(s),l=UM(n,a,o.length>0),c=WM(r.created_at,s),d=i===null?{totalEstimatedMs:void 0,perStep:new Map}:$M(e,i.workflow_name),u=d.totalEstimatedMs,f=rw(r.created_at),m=i?.workflow_name,p=d.perStep.size>0?d.perStep.size:void 0,h=s===null?[]:CM(e,s.id),g=MM(s,a,h,d.perStep,o),_=jM(h,d.perStep),y=DM(g,_,u,f,m,p);return l==="error"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Ho(u,f),...y},errors_json:{error:n.last_error??"job_failed",job_id:n.id,run_id:s?.id??null},duration_ms:c}:l==="done"?(r.completed_at===null&&e.setPromptDispatchCompleted(t),{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,terminal_state:s?.terminal_state??null,text:r.text,...Ho(u,f),...y},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,paused_step:a,attention_needed:o,...Ho(u,f),...y},errors_json:null,duration_ms:c}:{prompt_id:t,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Ho(u,f),...y},errors_json:null,duration_ms:c}}function $M(e,t){let r={totalEstimatedMs:void 0,perStep:new Map},n=e.getWorkflowByName(t);if(n===null)return r;let s;try{s=JSON.parse(n.definition)}catch{return r}if(s===null||typeof s!="object")return r;let i=s,o=typeof i.estimated_duration_ms=="number"&&Number.isFinite(i.estimated_duration_ms)&&i.estimated_duration_ms>=0?i.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(i.steps))for(let l of i.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let d=typeof c.name=="string"&&c.name.length>0?c.name:c.id,u=typeof c.estimated_duration_ms=="number"&&Number.isFinite(c.estimated_duration_ms)&&c.estimated_duration_ms>=0?c.estimated_duration_ms:void 0;a.set(c.id,u===void 0?{name:d}:{name:d,estimated_duration_ms:u})}if(i.steps===void 0&&i.states!==null&&typeof i.states=="object")for(let[l,c]of Object.entries(i.states)){if(c===null||typeof c!="object")continue;let d=c,u=typeof d.estimated_duration_ms=="number"&&Number.isFinite(d.estimated_duration_ms)&&d.estimated_duration_ms>=0?d.estimated_duration_ms:void 0;a.set(l,u===void 0?{name:l}:{name:l,estimated_duration_ms:u})}return{totalEstimatedMs:o,perStep:a}}function CM(e,t){try{return e.listStepsForRun(t)}catch{return[]}}function MM(e,t,r,n,s){if(e===null||e.terminal_state!==null)return;let i=t!==null?t:e.current_state;if(i===null||i.length===0)return;let a=[...r].reverse().find(f=>f.state_name===i&&f.ended_at===null)?.started_at??e.paused_at??e.started_at,l=n.get(i),c=l?.name??i,d=rw(a),u={id:i,name:c,started_at:a,elapsed_ms:d};return l?.estimated_duration_ms!==void 0&&(u.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(u.attention_needed=s),u}function jM(e,t){let r=[];for(let n of e){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),i=Date.parse(n.ended_at),o=Number.isFinite(s)&&Number.isFinite(i)?Math.max(0,i-s):0,a=t.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:o,status:l})}return r}function DM(e,t,r,n,s,i){let o={completed_steps:t,total_elapsed_ms:n};return e!==void 0&&(o.current_step=e),r!==void 0&&(o.total_estimated_ms=r),s!==void 0&&s.length>0&&(o.workflow_name=s),i!==void 0&&(o.total_steps=i),o}function rw(e){let t=Date.parse(e);return Number.isNaN(t)?0:Math.max(0,Date.now()-t)}function Ho(e,t){return e===void 0?{elapsed_ms:t}:{elapsed_ms:t,estimated_duration_ms:e}}function PM(e){if(e===null)return null;let t=e.current_state;if(t===null)return null;let r="__paused__:";return t.startsWith(r)?t.slice(r.length):null}function FM(e,t){if(t===null)return[];let r;try{r=e.listTeamMembers(t)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function UM(e,t,r){return e.status==="queued"?"pending":e.status==="done"?"done":e.status==="failed"?"error":t!==null||r||e.status==="paused"?"paused":e.status==="running"?"running":"error"}function WM(e,t){let r=Date.parse(e);if(Number.isNaN(r))return null;let n=t?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function BM(e,t){let r=Date.parse(e.last_active_at??""),n=Date.parse(t.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?e.name.localeCompare(t.name):s}var Jo,En,TM,Tn,Fd,bM,nw=E(()=>{"use strict";Jo="project:",En="web_project:",TM="prompt:",Tn="default",Fd="Default workspace",bM=new Date(0).toISOString()});import{Buffer as sw}from"node:buffer";function iw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function ow(e){return JM[e]}function aw(e){let t=e.trim();if(t==="")return;let r=t.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var qM,HM,Go,JM,Wd=E(()=>{"use strict";qM=1e4,HM=256*1024,Go=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=iw(t.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,qM),this.pushByteCap=iw(t.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,HM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(t){if(this.sessions.has(t.session_id))throw new Error(`terminal_session_already_exists: ${t.session_id}`);let r=this.opts.pty.spawn(t.command,t.args,{name:"xterm-256color",cols:t.cols??120,rows:t.rows??30,cwd:t.cwd??process.cwd(),env:t.env??process.env}),n={session_id:t.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(t.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${t.session_id} started pid=${r.pid} cmd=${t.command}`),{pid:r.pid}}endSession(t){let r=this.sessions.get(t);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${t.session_id}; dropping`);return}try{r.pty.write(t.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${t.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,pid:t.pty.pid}))}pendingBytesFor(t){return this.sessions.get(t)?.pendingBytes}async stop(){for(let t of Array.from(this.sessions.values()))try{t.pty.kill()}catch{}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}onPtyData(t,r){if(!t.closed){if(t.pendingOutput.push(r),t.pendingBytes+=sw.byteLength(r,"utf8"),t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingOutput.length===0)return;let n=t.pendingOutput.join("");t.pendingOutput=[],t.pendingBytes=0;let s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-2] flushed session=${t.session_id} reason=${r} bytes=${sw.byteLength(n,"utf8")}`)}catch(i){this.opts.log?.(`[dt-2] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}async onPtyExit(t,r){if(t.closed)return;await this.flush(t,"pty_exit");let n=`\r
2063
2063
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
2064
- `,s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${t.session_id}: ${i instanceof Error?i.message:String(i)}`)}t.closed=!0,this.sessions.delete(t.session_id)}};JM={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function cw(e,t){e.post("/mailbox/terminal/launch",r=>XM(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>GM(r,t)),e.get("/mailbox/terminal/sessions",r=>VM(r,t))}async function XM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!lw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=aw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ow(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?e.json({error:"session_exists",message:l},409):e.json({error:"spawn_failed",message:l},500)}}function GM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!lw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),e.json({session_id:n,ended:!0}))}function VM(e,t){let r=t.terminalSessionManager;return r===void 0?e.json({sessions:[],note:"terminal session manager not configured"}):e.json({sessions:r.listSessions()})}var lw,dw=E(()=>{"use strict";Wd();lw=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as KM}from"node:buffer";function ZM(e){try{return KM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function uw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function fw(e){return QM[e]}function mw(e){let t=e.trim();if(t==="")return;let r=[],n=0;for(;n<t.length;){let i=t[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<t.length&&t[a]!=='"';)l+=t[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<t.length&&t[o]!==" "&&t[o]!==" ";)o+=1;r.push(t.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var YM,zM,Vo,QM,Bd=E(()=>{"use strict";YM=2e3,zM=64*1024,Vo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=uw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,YM),this.pushByteCap=uw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,zM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(t){if(this.sessions.has(t.session_id))throw new Error(`persistent_session_already_exists: ${t.session_id}`);let r=this.opts.adapterFactory(t.provider),n={session_id:t.session_id,provider:t.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(t.session_id,n);let s=this.makeAdapterContext(n);try{let i=await r.start(t,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${t.session_id} started provider=${t.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(t.session_id),i}}async endSession(t){let r=this.sessions.get(t);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(t)}}async onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${t.session_id}; dropping`);return}let n=t.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${t.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,provider:t.provider,pid:t.child?.pid}))}pendingEventCountFor(t){return this.sessions.get(t)?.pendingEvents.length}generationFor(t){return this.sessions.get(t)?.generation}_testBumpGeneration(t){let r=this.sessions.get(t);r!==void 0&&(r.generation+=1)}async stop(){for(let t of Array.from(this.sessions.values())){t.generation+=1;try{await t.adapter.stop()}catch{}if(t.child!==void 0)try{t.child.kill("SIGTERM")}catch{}}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}makeAdapterContext(t){let r=t.generation,n=this;return{generation:r,currentGeneration(){return t.generation},emit(s){r===t.generation&&(t.closed||n.appendEvent(t,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:t.turnMap}}appendEvent(t,r){t.pendingEvents.push(r);let n=ZM(r);if(t.pendingBytes+=n,t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingEvents.length===0)return;let n=t.pendingEvents;t.pendingEvents=[],t.pendingBytes=0;let s={kind:"provider",session_id:t.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${t.session_id} reason=${r} events=${n.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(t,r){let n=t.generation;r.on("exit",(s,i)=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(t,"child_exit"),t.closed=!0))}),r.on("error",s=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(t,"child_exit")))})}};QM={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function hw(e,t){e.post("/mailbox/chat/launch",r=>ej(r,t)),e.post("/mailbox/chat/end/:session_id",r=>tj(r,t)),e.get("/mailbox/chat/sessions",r=>rj(r,t))}async function ej(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!pw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=mw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=fw(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?e.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?e.json({error:"no_adapter",message:l},400):e.json({error:"spawn_failed",message:l},500)}}async function tj(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!pw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),e.json({session_id:n,ended:!0}))}function rj(e,t){let r=t.persistentSessionManager;return r===void 0?e.json({sessions:[],note:"persistent session manager not configured"}):e.json({sessions:r.listSessions()})}var pw,_w=E(()=>{"use strict";Bd();pw=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{readFileSync as nj}from"node:fs";function yw(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return gw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=nj(t.path,{encoding:"utf8"});return gw(r)}catch{return[]}}function gw(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);return t.length===0?[]:t.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var ww=E(()=>{"use strict"});function Ew(e,t,r){let n=e.getRun(t);if(n===null)return{err:`run ${t}: not found`};if(r!==void 0){let l=e.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${t}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=e.latestAgentCall(t);if(s!==null){let l=e.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${t}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let o=e.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${t}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${t}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Ko(e,t){let r=e.query(`SELECT id, kind FROM attention
2064
+ `,s={kind:"terminal",session_id:t.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(i){this.opts.log?.(`[dt-2] publish (exit) failed session=${t.session_id}: ${i instanceof Error?i.message:String(i)}`)}t.closed=!0,this.sessions.delete(t.session_id)}};JM={claude:{cmd:"claude",args:["--dangerously-skip-permissions"]},codex:{cmd:"codex",args:["--yolo","--sandbox","danger-full-access"]},gemini:{cmd:"gemini",args:["-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--yolo"]},qwen:{cmd:"qwen",args:["--approval-mode","yolo"]},opencode:{cmd:"opencode",args:[]}}});function cw(e,t){e.post("/mailbox/terminal/launch",r=>XM(r,t)),e.post("/mailbox/terminal/end/:session_id",r=>GM(r,t)),e.get("/mailbox/terminal/sessions",r=>VM(r,t))}async function XM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!lw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=aw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=ow(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?e.json({error:"session_exists",message:l},409):e.json({error:"spawn_failed",message:l},500)}}function GM(e,t){let r=t.terminalSessionManager;if(r===void 0)return e.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!lw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),e.json({session_id:n,ended:!0}))}function VM(e,t){let r=t.terminalSessionManager;return r===void 0?e.json({sessions:[],note:"terminal session manager not configured"}):e.json({sessions:r.listSessions()})}var lw,dw=E(()=>{"use strict";Wd();lw=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{Buffer as KM}from"node:buffer";function ZM(e){try{return KM.byteLength(JSON.stringify(e),"utf8")}catch{return 256}}function uw(e,t,r){if(typeof e=="number"&&Number.isFinite(e)&&e>0)return e;if(t!==void 0&&t!==""){let n=Number(t);if(Number.isFinite(n)&&n>0)return n}return r}function fw(e){return QM[e]}function mw(e){let t=e.trim();if(t==="")return;let r=[],n=0;for(;n<t.length;){let i=t[n];if(i===" "||i===" "){n+=1;continue}if(i==='"'){let a=n+1,l="";for(;a<t.length&&t[a]!=='"';)l+=t[a],a+=1;r.push(l),n=a+1;continue}let o=n;for(;o<t.length&&t[o]!==" "&&t[o]!==" ";)o+=1;r.push(t.slice(n,o)),n=o}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var YM,zM,Vo,QM,Bd=E(()=>{"use strict";YM=2e3,zM=64*1024,Vo=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(t){this.opts=t,this.pushWindowMs=uw(t.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,YM),this.pushByteCap=uw(t.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,zM),this.timers=t.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(t){if(this.sessions.has(t.session_id))throw new Error(`persistent_session_already_exists: ${t.session_id}`);let r=this.opts.adapterFactory(t.provider),n={session_id:t.session_id,provider:t.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(t.session_id,n);let s=this.makeAdapterContext(n);try{let i=await r.start(t,s);return n.child=i,this.wireChildExit(n,i),this.opts.log?.(`[dt-3] persistent session ${t.session_id} started provider=${t.provider} pid=${i.pid??"?"}`),{pid:i.pid}}catch(i){throw this.sessions.delete(t.session_id),i}}async endSession(t){let r=this.sessions.get(t);if(r!==void 0){r.generation+=1;try{await r.adapter.stop()}catch{}if(r.child!==void 0)try{r.child.kill("SIGTERM")}catch{}await this.flush(r,"session_end"),r.closed=!0,this.sessions.delete(t)}}async onInbound(t){if(t.direction!=="user_to_agent")return;let r=this.sessions.get(t.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${t.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${t.session_id}; dropping`);return}let n=t.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let i=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${t.session_id}: ${i}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${i}`}})}}setPublish(t){this.opts={...this.opts,publish:t}}listSessions(){return Array.from(this.sessions.values()).map(t=>({session_id:t.session_id,provider:t.provider,pid:t.child?.pid}))}pendingEventCountFor(t){return this.sessions.get(t)?.pendingEvents.length}generationFor(t){return this.sessions.get(t)?.generation}_testBumpGeneration(t){let r=this.sessions.get(t);r!==void 0&&(r.generation+=1)}async stop(){for(let t of Array.from(this.sessions.values())){t.generation+=1;try{await t.adapter.stop()}catch{}if(t.child!==void 0)try{t.child.kill("SIGTERM")}catch{}}for(let t of Array.from(this.sessions.values()))t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0)}makeAdapterContext(t){let r=t.generation,n=this;return{generation:r,currentGeneration(){return t.generation},emit(s){r===t.generation&&(t.closed||n.appendEvent(t,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:t.turnMap}}appendEvent(t,r){t.pendingEvents.push(r);let n=ZM(r);if(t.pendingBytes+=n,t.pendingBytes>=this.pushByteCap){this.flush(t,"byte_cap");return}t.pushTimer===void 0&&(t.pushTimer=this.timers.setTimeout(()=>{this.flush(t,"window_idle")},this.pushWindowMs))}async flush(t,r){if(t.pushTimer!==void 0&&(this.timers.clearTimeout(t.pushTimer),t.pushTimer=void 0),t.pendingEvents.length===0)return;let n=t.pendingEvents;t.pendingEvents=[],t.pendingBytes=0;let s={kind:"provider",session_id:t.session_id,direction:"agent_to_user",events:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s),this.opts.log?.(`[dt-3] flushed session=${t.session_id} reason=${r} events=${n.length}`)}catch(i){this.opts.log?.(`[dt-3] publish failed session=${t.session_id} reason=${r}: ${i instanceof Error?i.message:String(i)}`)}}wireChildExit(t,r){let n=t.generation;r.on("exit",(s,i)=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${i??""}; session ended. Click Reset to start a new chat.`}}),this.flush(t,"child_exit"),t.closed=!0))}),r.on("error",s=>{n===t.generation&&(t.closed||(this.appendEvent(t,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(t,"child_exit")))})}};QM={codex:{cmd:"codex",args:["app-server","--listen","stdio://"]},claude:{cmd:"claude",args:["-p","","--output-format","stream-json","--input-format","stream-json","--verbose","--dangerously-skip-permissions"]},gemini:{cmd:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{cmd:"copilot",args:["--acp","--yolo"]},opencode:{cmd:"opencode",args:["acp"]},qwen:{cmd:"qwen",args:["-p","","--output-format","stream-json","--input-format","stream-json","--approval-mode","yolo"]}}});function _w(e,t){e.post("/mailbox/chat/launch",r=>ej(r,t)),e.post("/mailbox/chat/end/:session_id",r=>tj(r,t)),e.get("/mailbox/chat/sessions",r=>rj(r,t))}async function ej(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await e.req.json()}catch{return e.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!pw.test(s))return e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let i=n.provider;if(typeof i!="string"||i==="")return e.json({error:"bad_request",message:"provider is required"},400);let o;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(o=mw(n.command_line),o===void 0)return e.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=fw(i);if(a===void 0)return e.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${i}"`},400);o={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:i,command:o.cmd,args:o.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return e.json({session_id:s,provider:i,pid:a,command:o.cmd,args:o.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?e.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?e.json({error:"no_adapter",message:l},400):e.json({error:"spawn_failed",message:l},500)}}async function tj(e,t){let r=t.persistentSessionManager;if(r===void 0)return e.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=e.req.param("session_id");return n===void 0||!pw.test(n)?e.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),e.json({session_id:n,ended:!0}))}function rj(e,t){let r=t.persistentSessionManager;return r===void 0?e.json({sessions:[],note:"persistent session manager not configured"}):e.json({sessions:r.listSessions()})}var pw,hw=E(()=>{"use strict";Bd();pw=/^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i});import{readFileSync as nj}from"node:fs";function yw(e){let t=e.artifacts.find(r=>r.kind===`${e.state_name}_transcript`);if(t?.content!==void 0&&t.content!==null)return gw(t.content);if(t?.path===void 0||t.path===null)return[];try{let r=nj(t.path,{encoding:"utf8"});return gw(r)}catch{return[]}}function gw(e){let t=e.split(/\r?\n/).filter(r=>r.trim().length>0);return t.length===0?[]:t.map(r=>{let n=/^(user|assistant|system|tool)\s*:\s*(.*)$/i.exec(r);return n===null?{role:"transcript",text:r}:{role:n[1].toLowerCase(),text:n[2]}})}var ww=E(()=>{"use strict"});function Ew(e,t,r){let n=e.getRun(t);if(n===null)return{err:`run ${t}: not found`};if(r!==void 0){let l=e.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${t}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=e.latestAgentCall(t);if(s!==null){let l=e.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${t}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${t}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let o=e.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(o.length===0)return{err:`run ${t}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(o.length>1){let l=o.map(c=>c.alias).join(", ");return{err:`run ${t}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=o[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function Ko(e,t){let r=e.query(`SELECT id, kind FROM attention
2065
2065
  WHERE run_id = ?
2066
2066
  AND acknowledged_at IS NULL
2067
2067
  AND requires_user = 1
2068
- ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Yo=E(()=>{"use strict"});function Rw(e,t){e.all("/runtime/*",r=>sj(r.req.raw,t))}async function sj(e,t){try{return Response.json(await ij(e,t))}catch(r){if(r instanceof ie)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function ij(e,t){let r=new URL(e.url),n=fj(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return qd(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return zo(e,n.id,s[2]),oj(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){zo(e,n.id,s[2]);let i=bw(t.dal,s[4]);return Tw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return qd(e),t.dal.listTeams().map(i=>uj(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Sw(t.dal,vw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new ie(400,"runtime lead chat body does not match route team");return Iw(e,n.id,o.context),kw(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Sw(t.dal,vw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new ie(400,"runtime lead message body does not match route team");Iw(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return kw(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){zo(e,n.id,s[2]);let i=bw(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return cj(t.dal,i,a),Tw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ns(e,n.id),t.dal.listWorkflows().map(i=>mj(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ns(e,n.id);let i=hj(t.dal,s[2]);return pj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ns(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return _j(t.dal,i,o).map(l=>xw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ns(e,n.id);let i=Nw(t.dal,s[2]);return xw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ns(e,n.id);let i=Nw(t.dal,s[2]),o=yj(t.dal,i);return{runId:Vd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function oj(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>Lw(e,t,r))}}function Tw(e,t,r){let n=Lw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:aj(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:lj(e,r)}}function Lw(e,t,r){let n=Ow(e,r.id),s=Jd(n);return{id:r.name,workspaceId:t.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function aj(e,t){let r=Ow(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Jd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function lj(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function cj(e,t,r){let n=dj(e,t.id);if(n!==null){let s=Ko(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new ie(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Nt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new ie(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Ow(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function dj(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",t)[0]??null}function Jd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function bw(e,t){let r=e.findProjectByName(t);if(r===null)throw new ie(404,`project not found: ${t}`);return r}function Sw(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new ie(404,`team not found: ${t}`);return r}function vw(e){return e.startsWith("team:")?e.slice(5):e}function uj(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function kw(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Aw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function fj(e){let t=e.workspaceName??Pt()??kr.default;return{id:t,name:t}}function qd(e){if(e.headers.get("x-lmctl-workspace-id")!==Aw)throw new ie(400,"runtime request requires global-admin workspace identity")}function zo(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new ie(400,"runtime workspace identity does not match route")}function Ns(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==t)throw new ie(400,"runtime workspace identity does not match server workspace")}function Iw(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");zo(e,t,r.workspaceId);return}qd(e)}function Xd(e){return`${bn}${Gd(e.name)}`}function Gd(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Vd(e){return`${Hd}${e.id}`}function mj(e){let t=Zo(e.definition);return{id:Xd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function pj(e){let t=Zo(e.definition);return{id:Xd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Zo(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function hj(e,t){if(!t.startsWith(bn))throw new ie(404,`template not found: ${t}`);let r=t.slice(bn.length),n=e.listWorkflows().filter(s=>Gd(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new ie(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Nw(e,t){if(!t.startsWith(Hd))throw new ie(404,`run not found: ${t}`);let r=t.slice(Hd.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new ie(404,`run not found: ${t}`);return s}function _j(e,t,r){if(r!==null){if(!r.startsWith(bn))return[];let s=r.slice(bn.length),i=e.listWorkflows().filter(a=>Gd(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function xw(e,t){let r=e.getWorkflow(t.workflow_id),n=Jd(t),s=gj(r,t);return{id:Vd(t),templateId:r===null?`${bn}unknown`:Xd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function gj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Zo(e.definition).nameToId.get(r)??r]}function yj(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Zo(r.definition),s=c=>n.nameToId.get(c)??c,i=Vd(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=wj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function wj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Aw,bn,Hd,ie,$w=E(()=>{"use strict";Be();Yo();Ht();Aw="global-admin";bn="template:",Hd="run:";ie=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as Ej,writeFileSync as Tj}from"node:fs";import{randomUUID as Cw}from"node:crypto";import{dirname as bj,resolve as Qo,sep as Mw}from"node:path";async function Dw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!Nj(n))return e.text("missing image file",400);if(n.size>Sj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=xj(s);if(i===null||!(i in jw))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=vj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Qo(Ij()):Qo(o.local_path),l=Qo(a,"uploads",Cw()),c=Qo(l,`${Cw()}${jw[i]}`);if(!kj(c,a))return e.text("invalid upload path",400);Ej(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);Tj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function vj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function kj(e,t){let r=t.endsWith(Mw)?t:`${t}${Mw}`;return e.startsWith(r)}function Ij(){return bj(Z())}function Nj(e){return typeof File<"u"&&e instanceof File}function xj(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var Sj,jw,Pw=E(()=>{"use strict";Be();Sj=10*1024*1024,jw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ea}from"node:fs";import{basename as Aj,dirname as Rj,extname as Lj,isAbsolute as Oj,join as $j,relative as Cj}from"node:path";import{fileURLToPath as Mj}from"node:url";import{Hono as jj}from"hono";import{serveStatic as At}from"@hono/node-server/serve-static";function Jw(e){let t=new jj,r=[],n=e.localWebui!==void 0?Yd(e.localWebui.webuiDir):Dj();if(e.localWebui!==void 0&&Yy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=Pj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,At({root:n})),t.use("/vendor/*",s,At({root:n})),t.use("/src/*",s,At({root:n})),t.get("/",s,At({root:n,path:"index.html"})),t.get("/admin",s,At({root:n,path:"index.html"})),t.get("/admin/*",s,At({root:n,path:"index.html"})),t.get("/terminal",s,At({root:n,path:"index.html"})),t.get("/terminal/*",s,At({root:n,path:"index.html"})),t.get("/chat",s,At({root:n,path:"index.html"})),t.get("/chat/*",s,At({root:n,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",I_({disabled:e.authDisabled})),t.get("/login",s=>s.html(Re("Login",`
2068
+ ORDER BY id DESC LIMIT 1`,t);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var Yo=E(()=>{"use strict"});function Rw(e,t){e.all("/runtime/*",r=>sj(r.req.raw,t))}async function sj(e,t){try{return Response.json(await ij(e,t))}catch(r){if(r instanceof ie)return Response.json({error:r.message},{status:r.status});let n=r instanceof Error?r.message:String(r);return Response.json({error:n},{status:500})}}async function ij(e,t){let r=new URL(e.url),n=fj(t),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(e.method==="GET"&&r.pathname==="/runtime/workspaces")return qd(e),[{id:n.id,name:n.name}];if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return zo(e,n.id,s[2]),oj(t.dal,n);if(e.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){zo(e,n.id,s[2]);let i=bw(t.dal,s[4]);return Tw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/lead-teams")return qd(e),t.dal.listTeams().map(i=>uj(i));if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let i=Sw(t.dal,vw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new ie(400,"runtime lead chat body does not match route team");return Iw(e,n.id,o.context),kw(i,o.context)}if(e.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let i=Sw(t.dal,vw(s[2])),o=await e.json();if(o.teamId!==`team:${i.name}`)throw new ie(400,"runtime lead message body does not match route team");Iw(e,n.id,o.context);let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime lead message requires draft.body");return kw(i,o.context,a)}if(e.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){zo(e,n.id,s[2]);let i=bw(t.dal,s[4]),o=await e.json();if(o.workspaceId!==n.id||o.projectId!==i.name)throw new ie(400,"runtime request body does not match route workspace/project");let a=o.draft?.body;if(typeof a!="string"||a.length===0)throw new ie(400,"runtime workflow message requires draft.body");return cj(t.dal,i,a),Tw(t.dal,n,i)}if(e.method==="GET"&&r.pathname==="/runtime/templates")return Ns(e,n.id),t.dal.listWorkflows().map(i=>mj(i));if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){Ns(e,n.id);let i=_j(t.dal,s[2]);return pj(i)}if(e.method==="GET"&&r.pathname==="/runtime/runs"){Ns(e,n.id);let i=r.searchParams.get("project"),o=r.searchParams.get("template");if(i!==null&&o!==null)throw new ie(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return hj(t.dal,i,o).map(l=>xw(t.dal,l))}if(e.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){Ns(e,n.id);let i=Nw(t.dal,s[2]);return xw(t.dal,i)}if(e.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){Ns(e,n.id);let i=Nw(t.dal,s[2]),o=yj(t.dal,i);return{runId:Vd(i),events:o,...o.length>0?{cursor:o[o.length-1].id}:{}}}throw new ie(404,`unknown runtime request: ${e.method} ${r.pathname}`)}function oj(e,t){return{id:t.id,name:t.name,projects:e.listProjects().map(r=>Lw(e,t,r))}}function Tw(e,t,r){let n=Lw(e,t,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:aj(e,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:lj(e,r)}}function Lw(e,t,r){let n=Ow(e,r.id),s=Jd(n);return{id:r.name,workspaceId:t.id,name:r.name,...r.description===null?{}:{description:r.description},status:s,managedWorkflow:{templateId:`template:${r.workflow_name}`,templateName:r.workflow_name,runId:n===null?`project:${r.id}:no-run`:`run:${n.id}`,status:s}}}function aj(e,t){let r=Ow(e,t.id),n=r?.current_state??null;return{id:r===null?`project:${t.id}:no-run`:`run:${r.id}`,templateId:`template:${t.workflow_name}`,label:t.workflow_name,status:Jd(r),currentStepIds:n===null?[]:[n],...r?.started_at===void 0?{}:{createdAt:r.started_at},...r?.ended_at===null||r?.ended_at===void 0?{}:{updatedAt:r.ended_at}}}function lj(e,t){return e.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",t.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function cj(e,t,r){let n=dj(e,t.id);if(n!==null){let s=Ko(e,n.id);if(s?.kind==="workflow_escalation"){let i=e.resumeEscalation(s.attention_id,r);if(!i.resumed)throw new ie(409,`workflow escalation resume failed: ${i.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let i=Nt(e,s.attention_id);if(i?.step_id===null||i?.step_id===void 0)throw new ie(409,"interactive resume failed: missing step");let o=e.resumeInteractive(i.step_id,r,!0);if(!o.resumed)throw new ie(409,`interactive resume failed: ${o.reason}`);return}}e.enqueueJob({project_id:t.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function Ow(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 1",t)[0]??null}function dj(e,t){return e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",t)[0]??null}function Jd(e){return e===null?"queued":e.terminal_state===null?"running":e.terminal_state==="done"||e.terminal_state==="success"?"succeeded":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"cancelled":"failed"}function bw(e,t){let r=e.findProjectByName(t);if(r===null)throw new ie(404,`project not found: ${t}`);return r}function Sw(e,t){let r=e.listTeams().find(n=>n.name===t);if(r===void 0)throw new ie(404,`team not found: ${t}`);return r}function vw(e){return e.startsWith("team:")?e.slice(5):e}function uj(e){return{id:`team:${e.name}`,name:e.name,teamfile:"",hasLead:!0,kind:e.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function kw(e,t,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${e.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${e.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${e.name}:${t?.scope??"global-admin"}:${t?.workspaceId??Aw}`,teamId:`team:${e.name}`,title:`${e.name} Lead`,messages:s,...t===void 0?{}:{context:t}}}function fj(e){let t=e.workspaceName??Pt()??kr.default;return{id:t,name:t}}function qd(e){if(e.headers.get("x-lmctl-workspace-id")!==Aw)throw new ie(400,"runtime request requires global-admin workspace identity")}function zo(e,t,r){let n=e.headers.get("x-lmctl-workspace-id");if(n===null)throw new ie(400,"runtime request requires workspace identity");if(r!==t||n!==t)throw new ie(400,"runtime workspace identity does not match route")}function Ns(e,t){let r=e.headers.get("x-lmctl-workspace-id");if(r===null)throw new ie(400,"runtime request requires workspace identity");if(r!==t)throw new ie(400,"runtime workspace identity does not match server workspace")}function Iw(e,t,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new ie(400,"workspace manager context requires workspace identity");zo(e,t,r.workspaceId);return}qd(e)}function Xd(e){return`${bn}${Gd(e.name)}`}function Gd(e){return e.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function Vd(e){return`${Hd}${e.id}`}function mj(e){let t=Zo(e.definition);return{id:Xd(e),name:e.name,...t.description===null?{}:{description:t.description}}}function pj(e){let t=Zo(e.definition);return{id:Xd(e),name:e.name,...t.description===null?{}:{description:t.description},graph:t.graph}}function Zo(e){let t;try{t=JSON.parse(e)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(t===null||typeof t!="object")return{description:null,graph:t,stepIds:[],nameToId:new Map};let r=t,n=typeof r.description=="string"?r.description:null,s=[],i=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let o=typeof r.entry_step_id=="string"?r.entry_step_id:null;for(let a of r.steps){let l=typeof a.id=="string"?a.id:null;l!==null&&(s.push(l),typeof a.name=="string"&&a.name.length>0&&i.set(a.name,l))}o!==null&&s.includes(o)&&s.sort((a,l)=>a===o?-1:l===o?1:0)}return{description:n,graph:t,stepIds:s,nameToId:i}}function _j(e,t){if(!t.startsWith(bn))throw new ie(404,`template not found: ${t}`);let r=t.slice(bn.length),n=e.listWorkflows().filter(s=>Gd(s.name)===r);if(n.length===0)throw new ie(404,`template not found: ${t}`);if(n.length>1){let s=n.map(i=>i.name).join(", ");throw new ie(409,`template_id_ambiguous: ${t} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function Nw(e,t){if(!t.startsWith(Hd))throw new ie(404,`run not found: ${t}`);let r=t.slice(Hd.length);if(!/^[1-9]\d*$/.test(r))throw new ie(404,`run not found: ${t}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new ie(404,`run not found: ${t}`);let s=e.getRun(n);if(s===null)throw new ie(404,`run not found: ${t}`);return s}function hj(e,t,r){if(r!==null){if(!r.startsWith(bn))return[];let s=r.slice(bn.length),i=e.listWorkflows().filter(a=>Gd(a.name)===s).map(a=>a.id);if(i.length===0)return[];let o=i.map(()=>"?").join(", ");return e.query(`SELECT * FROM run WHERE workflow_id IN (${o}) ORDER BY id DESC LIMIT 200`,...i)}if(t===null)return e.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=e.findProjectByName(t);return n===null?[]:e.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? ORDER BY r.id DESC LIMIT 200",n.id)}function xw(e,t){let r=e.getWorkflow(t.workflow_id),n=Jd(t),s=gj(r,t);return{id:Vd(t),templateId:r===null?`${bn}unknown`:Xd(r),label:r===null?`run ${t.id}`:`${r.name} #${t.id}`,status:n,createdAt:t.started_at,...t.ended_at===null?{}:{updatedAt:t.ended_at},currentStepIds:s}}function gj(e,t){if(t.current_state===null)return[];let r=t.current_state.startsWith("__paused__:")?t.current_state.slice(11):t.current_state;return e===null?[r]:[Zo(e.definition).nameToId.get(r)??r]}function yj(e,t){let r=e.getWorkflow(t.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:Zo(r.definition),s=c=>n.nameToId.get(c)??c,i=Vd(t),o=[];o.push({timestamp:t.started_at,type:"run.started",message:"Run started"});let a=e.listStepsForRun(t.id);for(let c of a){let d=s(c.state_name);if(o.push({timestamp:c.started_at,type:"step.started",stepId:d,message:`step ${c.state_name} started`}),c.ended_at!==null){let u=wj(c);o.push({timestamp:c.ended_at,type:u,stepId:d,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else t.paused_at!==null&&c.id===a[a.length-1]?.id&&o.push({timestamp:t.paused_at,type:"step.paused",stepId:d})}let l=e.listSessionEvents(t.id);for(let c of l){let d=c.step_id===null?void 0:(()=>{let m=a.find(p=>p.id===c.step_id);return m===void 0?void 0:s(m.state_name)})(),u=new Date(c.timestamp_ms).toISOString(),f={kind:c.kind,session_event_id:c.id};if(c.payload.length>0)try{let m=JSON.parse(c.payload);m!==null&&typeof m=="object"&&!Array.isArray(m)&&(f={...f,...m})}catch{}o.push({timestamp:u,type:"message",...d===void 0?{}:{stepId:d},payload:f})}if(t.terminal_state!==null){let c=t.terminal_state==="done"||t.terminal_state==="success"?"run.completed":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"run.cancelled":"run.failed";o.push({timestamp:t.ended_at??t.started_at,type:c,message:t.terminal_state})}return o.sort((c,d)=>c.timestamp.localeCompare(d.timestamp)),o.map((c,d)=>({id:`${i}:evt:${d+1}`,runId:i,sequence:d+1,timestamp:c.timestamp,type:c.type,...c.stepId===void 0?{}:{stepId:c.stepId},...c.message===void 0?{}:{message:c.message},...c.payload===void 0?{}:{payload:c.payload}}))}function wj(e){if(e.outcome===null)return"step.failed";let t=e.status_detail;return t==="failed"||t==="error"||t==="aborted"?"step.failed":"step.completed"}var Aw,bn,Hd,ie,$w=E(()=>{"use strict";Be();Yo();Ht();Aw="global-admin";bn="template:",Hd="run:";ie=class extends Error{status;constructor(t,r){super(r),this.status=t}}});import{mkdirSync as Ej,writeFileSync as Tj}from"node:fs";import{randomUUID as Cw}from"node:crypto";import{dirname as bj,resolve as Qo,sep as Mw}from"node:path";async function Dw(e,t){let r;try{r=await e.req.parseBody({all:!1})}catch{return e.text("invalid multipart body",400)}let n=r.image;if(!Nj(n))return e.text("missing image file",400);if(n.size>Sj)return e.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),i=xj(s);if(i===null||!(i in jw))return e.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==i)return e.text("upload MIME type does not match file content",415);let o=vj(t,r.project);if(typeof o=="string")return e.text(o,404);let a=o===null?Qo(Ij()):Qo(o.local_path),l=Qo(a,"uploads",Cw()),c=Qo(l,`${Cw()}${jw[i]}`);if(!kj(c,a))return e.text("invalid upload path",400);Ej(l,{recursive:!0});let d=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);Tj(c,d);let u={path:c,size:s.byteLength,mime:i,project:o?.name??null};return e.json(u)}function vj(e,t){return t==null||t===""?null:typeof t!="string"?"invalid project":e.findProjectByName(t)??`project not found: ${t}`}function kj(e,t){let r=t.endsWith(Mw)?t:`${t}${Mw}`;return e.startsWith(r)}function Ij(){return bj(Z())}function Nj(e){return typeof File<"u"&&e instanceof File}function xj(e){return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71&&e[4]===13&&e[5]===10&&e[6]===26&&e[7]===10?"image/png":e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255?"image/jpeg":e.length>=12&&e.subarray(0,4).toString("ascii")==="RIFF"&&e.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":e.length>=12&&e.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(e.subarray(8,12).toString("ascii"))?"image/heic":e.length>=5&&e.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var Sj,jw,Pw=E(()=>{"use strict";Be();Sj=10*1024*1024,jw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ea}from"node:fs";import{basename as Aj,dirname as Rj,extname as Lj,isAbsolute as Oj,join as $j,relative as Cj}from"node:path";import{fileURLToPath as Mj}from"node:url";import{Hono as jj}from"hono";import{serveStatic as At}from"@hono/node-server/serve-static";function Jw(e){let t=new jj,r=[],n=e.localWebui!==void 0?Yd(e.localWebui.webuiDir):Dj();if(e.localWebui!==void 0&&Yy(t,{s3:e.localWebui.localMailbox.s3,commands:e.localWebui.localMailbox.commands}),n!==null){let s=Pj();e.localWebui!==void 0?t.get("/config.json",s,i=>i.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):e.webuiRuntimeConfig!==void 0&&t.get("/config.json",s,i=>i.json(e.webuiRuntimeConfig)),t.use("/dist/*",s,At({root:n})),t.use("/vendor/*",s,At({root:n})),t.use("/src/*",s,At({root:n})),t.get("/",s,At({root:n,path:"index.html"})),t.get("/admin",s,At({root:n,path:"index.html"})),t.get("/admin/*",s,At({root:n,path:"index.html"})),t.get("/terminal",s,At({root:n,path:"index.html"})),t.get("/terminal/*",s,At({root:n,path:"index.html"})),t.get("/chat",s,At({root:n,path:"index.html"})),t.get("/chat/*",s,At({root:n,path:"index.html"}))}else t.get("/",s=>s.html('<!doctype html><meta charset="utf-8"><title>lmctl</title><body style="font-family:system-ui;max-width:40rem;margin:4rem auto;padding:0 1rem;line-height:1.5"><h1>lmctl daemon</h1><p>This build does not bundle the local web console; the HTTP API is running on this port.</p><p>Open the hosted console at <a href="https://lmctl.ai/">https://lmctl.ai/</a> \u2014 it connects to this daemon via the cloud mailbox.</p></body>'));return t.use("*",Ih({disabled:e.authDisabled})),t.get("/login",s=>s.html(Re("Login",`
2069
2069
  <h1>Login</h1>
2070
2070
  <form method="post" action="/login">
2071
2071
  <label>Token <input name="token" type="password"></label>
2072
2072
  <button type="submit">Login</button>
2073
2073
  </form>
2074
- `))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return x_(o)?(ed(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(A_(s),s.redirect("/login",302))),My(t,{dal:e.dal}),Rw(t,{dal:e.dal}),Zy(t,{dal:e.dal}),cw(t,{terminalSessionManager:e.terminalSessionManager}),hw(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=ls(s.req.param("team_name")),o=e.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=e.dal.db.transaction(()=>{let f=e.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)e.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 d=[],u=[];for(let f of a)try{await vc(e.dal,i,f.alias),e.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);e.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return D(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),j_(t,{dal:e.dal}),q_(t,{dal:e.dal}),t.get("/api/status",s=>D(s,qi(e.dal),Jj)),t.get("/api/projects",s=>D(s,Hi(e.dal),Xj)),t.get("/api/teams",s=>D(s,Ih(e.dal),Kj)),t.get("/api/workflows",s=>D(s,Ji(e.dal),Yj)),t.get("/api/workflows/verify",s=>{let i=wy();return s.req.header("accept")?.includes("text/plain")?s.text(Ty(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,Nh(e.dal,{status:s.req.query("status")}),zj)),t.post("/api/uploads",s=>Dw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Xi(e.dal,te(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.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=e.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=e.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=e.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,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=e.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return D(s,u,de)}),t.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Mo(),Ly)),o=Xi(e.dal,te(s,"id"));if(o===null)return s.notFound();let a=await i({dal:e.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)}),t.get("/api/workflows/:name",s=>{let i=e.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/workflows",s=>{let i=e.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():D(s,e.dal.listProjectWorkflows(i.id),Gj)}),t.post("/api/projects/:name/workflows",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Sn(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?e.dal.getWorkflow(l):a!==null?e.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{cn(d)}catch{return s.text("invalid condition",400)}let u=Wj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=e.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return D(s,m,de)}),t.get("/api/projects/workflows/:id",s=>{let i=e.dal.getProjectWorkflow(te(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.delete("/api/projects/workflows/:id",s=>e.dal.removeProjectWorkflow(te(s,"id"))?D(s,{removed:!0},de):s.notFound()),t.post("/api/projects/workflows/:id/enable",s=>{let i=e.dal.setProjectWorkflowEnabled(te(s,"id"),!0);return i===null?s.notFound():D(s,i,de)}),t.post("/api/projects/workflows/:id/disable",s=>{let i=e.dal.setProjectWorkflowEnabled(te(s,"id"),!1);return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/issues",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Uw(s.req.query("status"),Bj);if(typeof o=="string")return s.text(o,400);let a=Uw(s.req.query("severity"),Gw);return typeof a=="string"?s.text(a,400):D(s,e.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")}:{}}),Vj)}),t.post("/api/projects/:name/issues",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Sn(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=qj(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Hj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=e.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,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 D(s,u,de)}),t.get("/api/issues/:id",s=>{let i=e.dal.getIssue(te(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/issues/:id/claim",async s=>{let i=te(s,"id"),o=e.dal.getIssue(i);if(o===null)return s.notFound();let a=await Sn(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=e.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):D(s,c,de)}),t.post("/api/projects/:name/issues/claim-next",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Sn(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=e.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):D(s,l,de)}),t.post("/api/issues/:id/close",async s=>{let i=e.dal.getIssue(te(s,"id"));if(i===null)return s.notFound();let o=await Sn(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 D(s,e.dal.closeIssue(te(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.post("/api/issues/:id/reopen",async s=>{let i=e.dal.getIssue(te(s,"id"));if(i===null)return s.notFound();let o=await Sn(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 D(s,e.dal.reopenIssue(te(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.get("/api/projects/:name",s=>{let i=e.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 D(s,{...i,owner:a,repo:l},de)}),t.get("/api/runs/:run_id/artifacts",s=>{let i=te(s,"run_id"),o=s.req.query("kind"),a=$r(e.dal,i,o);return D(s,a,de)}),t.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=te(s,"run_id"),o=s.req.param("kind"),a=$r(e.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):D(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=Fj(l.path);if(Uj(u)){let _=d(l.path,"utf8");return s.body(_,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=Aj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return D(s,l,de)}return D(s,l,de)}),t.get("/api/runs",s=>D(s,an(e.dal,{limit:Kd(s,"limit")??100}),Zj)),t.get("/api/runs/:id",s=>{let i=Or(e.dal,te(s,"id"));return i===null?s.notFound():D(s,i,Qj)}),t.get("/api/runs/:id/where",s=>{let i=ln(e.dal,te(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Vi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Ki(e.dal,te(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Yi(i)):s.json(i)}),t.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=e.dal.resumeRun(te(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(ta(e.daemon),D(s,o,Ww)):D(s,o,Ww,400)}),t.post("/api/interactive/:step_id/respond",async s=>{let i=te(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=e.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(ta(e.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),t.get("/api/runs/:id/steps/:step_id",s=>Fw(s,e.dal,i=>D(s,i,tD))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=Lh(e.dal,te(s,"id"),te(s,"step_id"));return i===null?s.notFound():Xw(s)?s.html(`<pre>${S(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),t.get("/api/runs/:id/steps/:step_id/messages",s=>Fw(s,e.dal,i=>{let o=yw(i);return D(s,o,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),t.get("/api/external-objects",s=>D(s,Oh(e.dal,{type:s.req.query("type")}),rD)),t.get("/api/external-signals",s=>D(s,$h(e.dal,{unhandled:s.req.query("unhandled")==="true"}),nD)),t.get("/api/attentions",s=>D(s,lr(e.dal,{unacked:s.req.query("unacked")==="true"}),sD)),t.post("/api/attentions/:id/ack",s=>{let i=e.dal.acknowledgeAttention(te(s,"id"));return i===null?s.notFound():D(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),t.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=Gi(e.dal,l);return D(s,c,d=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[S(u.attention_id),S(u.project),S(u.run_id),S(u.workflow_name),S(u.state_name),S((u.prompt??"").slice(0,120))]))}`)}),t.get("/api/escalations/:id",s=>{let i=Nt(e.dal,te(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/escalations/:id/respond",async s=>{let i=te(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=Nt(e.dal,i);if(c===null)return s.notFound();let d=lr(e.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=e.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ta(e.daemon);let p=lr(e.dal).find(_=>_.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(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.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 u=e.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=e.dal.acknowledgeAttention(i);return ta(e.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),t.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=xh(e.dal,{status:o,pr_url:i});return D(s,a,iD)}),t.get("/api/submitted-prs/:id",s=>{let i=te(s,"id"),o=Ah(e.dal,i);return o===null?s.notFound():D(s,o,oD)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),Bw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=ls(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),Bw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=ls(s.req.param("team_name"));try{let o=await wh(e.dal,i,s.req.param("alias"));return D(s,o,a=>qw("compacted",a.row))}catch(o){if(o instanceof as)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=ls(s.req.param("team_name")),o=await vc(e.dal,i,s.req.param("alias"));return D(s,o,a=>qw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,Hw)),t.post("/api/intake/scan",async s=>(r=await mo(e.dal),D(s,r,Hw))),t.get("/api/stats/run-throughput",s=>D(s,jh(e.dal),aD)),t.get("/api/daemon/state",s=>D(s,e.daemon?.state??null,lD)),t.post("/api/daemon/cycle",async s=>{if(e.daemon===void 0)return D(s,{disabled:!0},de);let i=await e.daemon.runCycle();return D(s,{state:e.daemon.state,result:i},de)}),t.get("/metrics/:project_id",s=>{let i=te(s,"project_id"),o=e.dal.getProject(i);if(o===null)return s.notFound();let a=Lc(e.dal,i),l=Oc(e.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,cD(o.name,a,l)))}),t.get("/api/metrics/reviewer/:project_id",s=>{let i=te(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Kd(s,"since_days");return s.json(Lc(e.dal,i,o))}),t.get("/api/metrics/tools/:project_id",s=>{let i=te(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Kd(s,"since_days");return s.json(Oc(e.dal,{project_id:i,since_days:o}))}),t.post("/api/drift/:id/ack",s=>{let i=e.dal.acknowledgeDriftSignal(te(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),t}function Fw(e,t,r){let n=Rc(t,te(e,"id"),te(e,"step_id"));return n===null?e.notFound():r(n)}function ta(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return Xw(e)?n===200?e.html(r(t)):e.html(r(t),400):new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Xw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function Dj(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return ea(`${e}/index.html`)?Yd(e):null;let t="src/serve/webui-dist";if(ea(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(ea(`${r}/index.html`))return r;let n=$j(Rj(Mj(import.meta.url)),"webui-dist");return ea(`${n}/index.html`)?Yd(n):null}function Yd(e){if(!Oj(e))return e;let t=Cj(process.cwd(),e);return t.length===0?".":t}function Pj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function te(e,t){return Number(e.req.param(t))}function Kd(e,t){let r=e.req.query(t);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function Fj(e){switch(Lj(e).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 Uj(e){return!!(e.startsWith("text/")||e.startsWith("application/json")||e.startsWith("application/xml"))}async function Sn(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}function Wj(e){if(e==null)return null;if(typeof e=="string"){try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return JSON.stringify(t)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof e=="object"&&!Array.isArray(e)?JSON.stringify(e):"error:parameters_override must be a JSON object"}function Uw(e,t){if(e===void 0||e.length===0)return;let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}}function qj(e){if(e!=null)return typeof e=="string"&&Gw.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Hj(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function Jj(e){return`<h1>Status</h1><div class="grid">
2074
+ `))),t.post("/login",async s=>{let i=await s.req.parseBody(),o=typeof i.token=="string"?i.token:"";return xh(o)?(ed(s,o),s.redirect("/",302)):s.html(Re("Login","<p>Invalid token</p>"),401)}),t.post("/logout",s=>(Ah(s),s.redirect("/login",302))),My(t,{dal:e.dal}),Rw(t,{dal:e.dal}),Zy(t,{dal:e.dal}),cw(t,{terminalSessionManager:e.terminalSessionManager}),_w(t,{persistentSessionManager:e.persistentSessionManager}),t.post("/api/teams/:team_name/refresh",async s=>{let i=ls(s.req.param("team_name")),o=e.dal.findTeamByName(i);if(o===null)return s.notFound();let a=[],c=e.dal.db.transaction(()=>{let f=e.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)e.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 d=[],u=[];for(let f of a)try{await vc(e.dal,i,f.alias),e.dal.setMemberState(f.id,"idle",null),d.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);e.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),u.push({alias:f.alias,error:p})}return D(s,{team:i,seeded:d,failed:u},f=>`<p>refreshed team ${S(f.team)}: seeded [${f.seeded.map(m=>S(m)).join(", ")}]${f.failed.length>0?` failed [${f.failed.map(m=>`${S(m.alias)}: ${S(m.error)}`).join(", ")}]`:""}</p>`)}),jh(t,{dal:e.dal}),qh(t,{dal:e.dal}),t.get("/api/status",s=>D(s,qi(e.dal),Jj)),t.get("/api/projects",s=>D(s,Hi(e.dal),Xj)),t.get("/api/teams",s=>D(s,I_(e.dal),Kj)),t.get("/api/workflows",s=>D(s,Ji(e.dal),Yj)),t.get("/api/workflows/verify",s=>{let i=wy();return s.req.header("accept")?.includes("text/plain")?s.text(Ty(i)):s.json(i)}),t.get("/api/jobs",s=>D(s,N_(e.dal,{status:s.req.query("status")}),zj)),t.post("/api/uploads",s=>Dw(s,e.dal)),t.get("/api/jobs/:id",s=>{let i=Xi(e.dal,te(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.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=e.dal.findProjectByName(i.project);if(f===null)return s.text(`project not found: ${i.project}`,404);o=f.id}else{let f=e.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=e.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,d=c==null?null:typeof c=="string"?c:JSON.stringify(c),u=e.dal.enqueueJob({project_id:o,workflow_id_override:a,source:l,source_ref:typeof i.source_ref=="string"?i.source_ref:null,payload:d,priority:typeof i.priority=="number"?i.priority:0,dedupe_key:typeof i.dedupe_key=="string"?i.dedupe_key:null});return D(s,u,de)}),t.post("/api/jobs/:id/run",async s=>{let{runJobById:i}=await Promise.resolve().then(()=>(Mo(),Ly)),o=Xi(e.dal,te(s,"id"));if(o===null)return s.notFound();let a=await i({dal:e.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)}),t.get("/api/workflows/:name",s=>{let i=e.dal.getWorkflowByName(s.req.param("name"));return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/workflows",s=>{let i=e.dal.findProjectByName(s.req.param("name"));return i===null?s.notFound():D(s,e.dal.listProjectWorkflows(i.id),Gj)}),t.post("/api/projects/:name/workflows",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Sn(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?e.dal.getWorkflow(l):a!==null?e.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let d=typeof o.condition=="string"&&o.condition.length>0?o.condition:null;if(d!==null)try{cn(d)}catch{return s.text("invalid condition",400)}let u=Wj(o.parameters_override??o.params);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let f=typeof o.priority=="number"&&Number.isInteger(o.priority)?o.priority:100,m=e.dal.insertProjectWorkflow({project_id:i.id,workflow_id:c.id,condition:d,parameters_override:u,priority:f});return D(s,m,de)}),t.get("/api/projects/workflows/:id",s=>{let i=e.dal.getProjectWorkflow(te(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.delete("/api/projects/workflows/:id",s=>e.dal.removeProjectWorkflow(te(s,"id"))?D(s,{removed:!0},de):s.notFound()),t.post("/api/projects/workflows/:id/enable",s=>{let i=e.dal.setProjectWorkflowEnabled(te(s,"id"),!0);return i===null?s.notFound():D(s,i,de)}),t.post("/api/projects/workflows/:id/disable",s=>{let i=e.dal.setProjectWorkflowEnabled(te(s,"id"),!1);return i===null?s.notFound():D(s,i,de)}),t.get("/api/projects/:name/issues",s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=Uw(s.req.query("status"),Bj);if(typeof o=="string")return s.text(o,400);let a=Uw(s.req.query("severity"),Gw);return typeof a=="string"?s.text(a,400):D(s,e.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")}:{}}),Vj)}),t.post("/api/projects/:name/issues",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.notFound();let o=await Sn(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=qj(o.severity);if(typeof c=="object")return s.text(c.error,400);let d=Hj(o.labels);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let u=e.dal.createIssue({project_id:i.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:d,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 D(s,u,de)}),t.get("/api/issues/:id",s=>{let i=e.dal.getIssue(te(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/issues/:id/claim",async s=>{let i=te(s,"id"),o=e.dal.getIssue(i);if(o===null)return s.notFound();let a=await Sn(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=e.dal.claimIssue(i,l);return c===null?s.json({error:`issue ${i} is not in a claimable state (status=${o.status})`},400):D(s,c,de)}),t.post("/api/projects/:name/issues/claim-next",async s=>{let i=e.dal.findProjectByName(s.req.param("name"));if(i===null)return s.json({error:"project_not_found"},404);let o=await Sn(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=e.dal.claimNextIssue(i.id,a);return l===null?s.json({status:"queue_empty"},404):D(s,l,de)}),t.post("/api/issues/:id/close",async s=>{let i=e.dal.getIssue(te(s,"id"));if(i===null)return s.notFound();let o=await Sn(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 D(s,e.dal.closeIssue(te(s,"id"),a,typeof o.commit_hash=="string"?o.commit_hash:null),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.post("/api/issues/:id/reopen",async s=>{let i=e.dal.getIssue(te(s,"id"));if(i===null)return s.notFound();let o=await Sn(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 D(s,e.dal.reopenIssue(te(s,"id"),a),de)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),t.get("/api/projects/:name",s=>{let i=e.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 D(s,{...i,owner:a,repo:l},de)}),t.get("/api/runs/:run_id/artifacts",s=>{let i=te(s,"run_id"),o=s.req.query("kind"),a=$r(e.dal,i,o);return D(s,a,de)}),t.get("/api/runs/:run_id/artifacts/:kind",async s=>{let i=te(s,"run_id"),o=s.req.param("kind"),a=$r(e.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):D(s,l,de);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:d}=await import("node:fs"),u=Fj(l.path);if(Uj(u)){let h=d(l.path,"utf8");return s.body(h,200,{"Content-Type":u})}let f=d(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=Aj(l.path);return s.body(m,200,{"Content-Type":u,"Content-Disposition":`attachment; filename="${p}"`})}catch(d){return s.text(`failed to read artifact path: ${d.message}`,500)}return D(s,l,de)}return D(s,l,de)}),t.get("/api/runs",s=>D(s,an(e.dal,{limit:Kd(s,"limit")??100}),Zj)),t.get("/api/runs/:id",s=>{let i=Or(e.dal,te(s,"id"));return i===null?s.notFound():D(s,i,Qj)}),t.get("/api/runs/:id/where",s=>{let i=ln(e.dal,te(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Vi(i)):s.json(i)}),t.get("/api/runs/:id/timeline",s=>{let i=Ki(e.dal,te(s,"id"));return i===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Yi(i)):s.json(i)}),t.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=e.dal.resumeRun(te(s,"id"),i);return!o.resumed&&o.reason==="run_not_found"?s.notFound():o.resumed?(ta(e.daemon),D(s,o,Ww)):D(s,o,Ww,400)}),t.post("/api/interactive/:step_id/respond",async s=>{let i=te(s,"step_id"),o,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let d=await s.req.json();typeof d.input=="string"&&(o=d.input),d.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let d=await s.req.parseBody().catch(()=>({}));typeof d.input=="string"&&(o=d.input),(d.done==="true"||d.done===!0)&&(a=!0)}if(o===void 0)return s.text("missing input",400);let c=e.dal.resumeInteractive(i,o,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(ta(e.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),t.get("/api/runs/:id/steps/:step_id",s=>Fw(s,e.dal,i=>D(s,i,tD))),t.get("/api/runs/:id/steps/:step_id/transcript",s=>{let i=L_(e.dal,te(s,"id"),te(s,"step_id"));return i===null?s.notFound():Xw(s)?s.html(`<pre>${S(i)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(i):s.json({transcript:i})}),t.get("/api/runs/:id/steps/:step_id/messages",s=>Fw(s,e.dal,i=>{let o=yw(i);return D(s,o,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),t.get("/api/external-objects",s=>D(s,O_(e.dal,{type:s.req.query("type")}),rD)),t.get("/api/external-signals",s=>D(s,$_(e.dal,{unhandled:s.req.query("unhandled")==="true"}),nD)),t.get("/api/attentions",s=>D(s,lr(e.dal,{unacked:s.req.query("unacked")==="true"}),sD)),t.post("/api/attentions/:id/ack",s=>{let i=e.dal.acknowledgeAttention(te(s,"id"));return i===null?s.notFound():D(s,i,o=>`<p>acknowledged attention ${S(o.id)}</p>`)}),t.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=Gi(e.dal,l);return D(s,c,d=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],d.map(u=>[S(u.attention_id),S(u.project),S(u.run_id),S(u.workflow_name),S(u.state_name),S((u.prompt??"").slice(0,120))]))}`)}),t.get("/api/escalations/:id",s=>{let i=Nt(e.dal,te(s,"id"));return i===null?s.notFound():D(s,i,de)}),t.post("/api/escalations/:id/respond",async s=>{let i=te(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=Nt(e.dal,i);if(c===null)return s.notFound();let d=lr(e.dal).find(m=>m.id===i);if(d===void 0)return s.notFound();if(d.kind==="workflow_escalation"){let m=e.dal.resumeEscalation(i,o);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ta(e.daemon);let p=lr(e.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(d.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:d.kind},400);if(d.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 u=e.dal.resumeInteractive(c.step_id,o,a);if(!u.resumed)return s.json({ok:!1,reason:u.reason,step_id:c.step_id},400);let f=e.dal.acknowledgeAttention(i);return ta(e.daemon),s.json({ok:!0,attention_id:i,step_id:c.step_id,session_status:u.session.status,acknowledged_at:f?.acknowledged_at??null})}),t.get("/api/submitted-prs",s=>{let i=s.req.query("pr_url"),o=s.req.query("status"),a=x_(e.dal,{status:o,pr_url:i});return D(s,a,iD)}),t.get("/api/submitted-prs/:id",s=>{let i=te(s,"id"),o=A_(e.dal,i);return o===null?s.notFound():D(s,o,oD)}),t.get("/api/sessions",s=>D(s,e.dal.latestSessionSizes(),Bw)),t.get("/api/sessions/:team_name/:alias/history",s=>{let i=ls(s.req.param("team_name"));return D(s,e.dal.sessionSizeHistory(i,s.req.param("alias")),Bw)}),t.post("/api/sessions/:team_name/:alias/compact",async s=>{let i=ls(s.req.param("team_name"));try{let o=await w_(e.dal,i,s.req.param("alias"));return D(s,o,a=>qw("compacted",a.row))}catch(o){if(o instanceof as)return s.text(o.message,409);throw o}}),t.post("/api/sessions/:team_name/:alias/refresh",async s=>{let i=ls(s.req.param("team_name")),o=await vc(e.dal,i,s.req.param("alias"));return D(s,o,a=>qw(`refreshed ${a.sessionid}`,a.row))}),t.get("/api/intake/state",s=>D(s,r,Hw)),t.post("/api/intake/scan",async s=>(r=await mo(e.dal),D(s,r,Hw))),t.get("/api/stats/run-throughput",s=>D(s,j_(e.dal),aD)),t.get("/api/daemon/state",s=>D(s,e.daemon?.state??null,lD)),t.post("/api/daemon/cycle",async s=>{if(e.daemon===void 0)return D(s,{disabled:!0},de);let i=await e.daemon.runCycle();return D(s,{state:e.daemon.state,result:i},de)}),t.get("/metrics/:project_id",s=>{let i=te(s,"project_id"),o=e.dal.getProject(i);if(o===null)return s.notFound();let a=Lc(e.dal,i),l=Oc(e.dal,{project_id:i});return s.html(Re(`Metrics \u2014 ${o.name}`,cD(o.name,a,l)))}),t.get("/api/metrics/reviewer/:project_id",s=>{let i=te(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Kd(s,"since_days");return s.json(Lc(e.dal,i,o))}),t.get("/api/metrics/tools/:project_id",s=>{let i=te(s,"project_id");if(e.dal.getProject(i)===null)return s.notFound();let o=Kd(s,"since_days");return s.json(Oc(e.dal,{project_id:i,since_days:o}))}),t.post("/api/drift/:id/ack",s=>{let i=e.dal.acknowledgeDriftSignal(te(s,"id"));return i===null?s.notFound():s.json({id:i.id,acknowledged_at:i.acknowledged_at})}),t}function Fw(e,t,r){let n=Rc(t,te(e,"id"),te(e,"step_id"));return n===null?e.notFound():r(n)}function ta(e){e!==void 0&&e.runCycle().catch(()=>{})}function D(e,t,r,n=200){return Xw(e)?n===200?e.html(r(t)):e.html(r(t),400):new Response(JSON.stringify(t),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function Xw(e){let t=e.req.header("accept")??"";return t.includes("text/html")&&!t.includes("application/json")}function Dj(){let e=process.env.LMCTL_WEBUI_DIST;if(e!==void 0)return ea(`${e}/index.html`)?Yd(e):null;let t="src/serve/webui-dist";if(ea(`${t}/index.html`))return t;let r="dist/serve/webui-dist";if(ea(`${r}/index.html`))return r;let n=$j(Rj(Mj(import.meta.url)),"webui-dist");return ea(`${n}/index.html`)?Yd(n):null}function Yd(e){if(!Oj(e))return e;let t=Cj(process.cwd(),e);return t.length===0?".":t}function Pj(){return async(e,t)=>{await t(),e.header("Cache-Control","no-store")}}function te(e,t){return Number(e.req.param(t))}function Kd(e,t){let r=e.req.query(t);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function Fj(e){switch(Lj(e).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 Uj(e){return!!(e.startsWith("text/")||e.startsWith("application/json")||e.startsWith("application/xml"))}async function Sn(e){try{let t=await e.req.json();return t!==null&&typeof t=="object"&&!Array.isArray(t)?t:"invalid JSON body"}catch{return"invalid JSON body"}}function Wj(e){if(e==null)return null;if(typeof e=="string"){try{let t=JSON.parse(e);if(t!==null&&typeof t=="object"&&!Array.isArray(t))return JSON.stringify(t)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof e=="object"&&!Array.isArray(e)?JSON.stringify(e):"error:parameters_override must be a JSON object"}function Uw(e,t){if(e===void 0||e.length===0)return;let r=e.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!t.includes(n))return`invalid value: ${n}`;return r}}function qj(e){if(e!=null)return typeof e=="string"&&Gw.includes(e)?e:{error:`invalid severity: ${String(e)}`}}function Hj(e){if(e==null)return null;if(typeof e=="string")try{let t=JSON.parse(e);return Array.isArray(t)&&t.every(r=>typeof r=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(e)&&e.every(t=>typeof t=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}function Jj(e){return`<h1>Status</h1><div class="grid">
2075
2075
  <div class="metric"><strong>${e.jobs.queued}</strong><br>queued jobs</div>
2076
2076
  <div class="metric"><strong>${e.jobs.done}</strong><br>done jobs</div>
2077
2077
  <div class="metric"><strong>${e.runs.active}</strong><br>active runs</div>
@@ -2114,23 +2114,23 @@ ${p.text}`,["approve","request_changes"],!0,s,t.writes_to_project_path===!0)));i
2114
2114
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
2115
2115
  ${fe(["state","retried runs","avg attempts"],o)}
2116
2116
  <h2>Tool efficacy</h2>
2117
- ${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Bj,Gw,Vw=E(()=>{"use strict";Yc();us();L_();D_();H_();Ht();od();qy();zy();nw();dw();_w();ww();$w();Fi();Pw();Oo();Bj=["open","assigned","closed","reopened"],Gw=["low","medium","high","critical"]});function dD(e){return Math.floor(e/6e4)*6e4}function uD(e){e.db.transaction(()=>{let t=e.getRollupCursor(),r=e.listSessionEventsSince(t);if(r.length!==0){for(let n of r)fD(e,n);e.setRollupCursor(r[r.length-1].id)}})()}function fD(e,t){let r=Date.now(),n=dD(t.timestamp_ms),s=n+6e4;if(t.kind==="tool_use"){e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="tool_result"){let i={};try{i=JSON.parse(t.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="text"){let i=Buffer.byteLength(t.payload,"utf8");e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Kw(e,t=250){let r=setInterval(()=>{try{uD(e)}catch{}},t);return{stop(){clearInterval(r)}}}var Yw=E(()=>{"use strict"});function pD({dal:e}){let t=e.listProjects();for(let r of t){let n=e.query(`SELECT r.id, r.team_id
2117
+ ${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var Bj,Gw,Vw=E(()=>{"use strict";Yc();us();Lh();Dh();Hh();Ht();od();qy();zy();nw();dw();hw();ww();$w();Fi();Pw();Oo();Bj=["open","assigned","closed","reopened"],Gw=["low","medium","high","critical"]});function dD(e){return Math.floor(e/6e4)*6e4}function uD(e){e.db.transaction(()=>{let t=e.getRollupCursor(),r=e.listSessionEventsSince(t);if(r.length!==0){for(let n of r)fD(e,n);e.setRollupCursor(r[r.length-1].id)}})()}function fD(e,t){let r=Date.now(),n=dD(t.timestamp_ms),s=n+6e4;if(t.kind==="tool_use"){e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="tool_result"){let i={};try{i=JSON.parse(t.payload)}catch{}let o=typeof i.elapsedMs=="number"&&i.elapsedMs>0?i.elapsedMs:0;o>0&&e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"time_in_tool_use_ms",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(t.kind==="text"){let i=Buffer.byteLength(t.payload,"utf8");e.addRollupValue({run_id:t.run_id,step_id:t.step_id,metric_kind:"message_delta_bytes",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Kw(e,t=250){let r=setInterval(()=>{try{uD(e)}catch{}},t);return{stop(){clearInterval(r)}}}var Yw=E(()=>{"use strict"});function pD({dal:e}){let t=e.listProjects();for(let r of t){let n=e.query(`SELECT r.id, r.team_id
2118
2118
  FROM run r
2119
2119
  JOIN job j ON j.id = r.job_id
2120
2120
  WHERE j.project_id = ?
2121
2121
  AND r.terminal_state IS NOT NULL
2122
2122
  ORDER BY r.id DESC
2123
- LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>e.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,mD).length>0))continue;let i=n[0].team_id,o=e.listTeamMembers(i),a=o.find(l=>l.alias.toLowerCase().includes("coder"))??o[0];a!==void 0&&(e.hasUnackedDriftSignal(a.id,r.id,zw)||e.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:zw,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function Zw(e){for(let t of hD)try{t(e)}catch{}}var mD,zw,hD,Qw=E(()=>{"use strict";mD="request_changes",zw="reviewer_rejection_rate_high";hD=[pD]});import{hostname as zd}from"node:os";function hr(e,t){let r=new Date().toISOString(),n=new Date(Date.now()-t.ttlMs).toISOString(),s={receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,started_at:r},i=e.getAgentInflight(t.receiver_teamfile,t.receiver_alias),o=i===null||i.holder_pid===null,a=e.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:t.force});if(a.acquired){let c=i===null?null:t.force===!0?"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:i,reclaimReason:c}}if(!nE(a.current,n))return{acquired:!1,current:a.current};let l=e.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function ra(e){return e.status!=="running"?null:e.holder_host===zd()&&e.holder_pid!==null&&e.holder_pid>0?ot(e.holder_pid)?"live":"dead":"unknown"}function Yt(e,t,r){let n=e.getTerminalLock(t,r);if(n!==null&&_D(n))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:n};let s=gD(e,t,r);if(s!==null)return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:s};let i=e.getAgentInflight(t,r);if(i===null)return{busy:!1};let o=new Date(Date.now()-sE()).toISOString();return nE(i,o)?{busy:!1}:{busy:!0,reason:"in-flight",inFlight:i}}function _D(e){if(e.holder_host===zd())return ot(e.holder_pid);let t=Date.parse(e.last_heartbeat);return Number.isFinite(t)?Date.now()-t<=yD():!1}function gD(e,t,r){let s=e.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
2123
+ LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>e.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,mD).length>0))continue;let i=n[0].team_id,o=e.listTeamMembers(i),a=o.find(l=>l.alias.toLowerCase().includes("coder"))??o[0];a!==void 0&&(e.hasUnackedDriftSignal(a.id,r.id,zw)||e.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:zw,severity:"high",description:`3+ consecutive reviewer rejections (request_changes) for project ${r.name}`,detected_at:Date.now(),payload:JSON.stringify({run_ids:n.map(l=>l.id),consecutive_threshold:3})}))}}function Zw(e){for(let t of _D)try{t(e)}catch{}}var mD,zw,_D,Qw=E(()=>{"use strict";mD="request_changes",zw="reviewer_rejection_rate_high";_D=[pD]});import{hostname as zd}from"node:os";function _r(e,t){let r=new Date().toISOString(),n=new Date(Date.now()-t.ttlMs).toISOString(),s={receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,started_at:r},i=e.getAgentInflight(t.receiver_teamfile,t.receiver_alias),o=i===null||i.holder_pid===null,a=e.tryAcquireAgentInflight(s,{...o?{stale_before:n}:{},force:t.force});if(a.acquired){let c=i===null?null:t.force===!0?"force":i.holder_pid===null&&i.started_at<n?"stale":null;return{acquired:!0,lease:a.current??s,previous:i,reclaimReason:c}}if(!nE(a.current,n))return{acquired:!1,current:a.current};let l=e.tryAcquireAgentInflight(s,a.current.holder_pid===null?{stale_before:n}:{reclaim_observed:{sender_teamfile:a.current.sender_teamfile,sender_alias:a.current.sender_alias,started_at:a.current.started_at,holder_pid:a.current.holder_pid}});return l.acquired?{acquired:!0,lease:l.current??s,previous:a.current,reclaimReason:a.current.holder_pid===null?"stale":"dead-pid"}:{acquired:!1,current:l.current}}function ra(e){return e.status!=="running"?null:e.holder_host===zd()&&e.holder_pid!==null&&e.holder_pid>0?ot(e.holder_pid)?"live":"dead":"unknown"}function Yt(e,t,r){let n=e.getTerminalLock(t,r);if(n!==null&&hD(n))return{busy:!0,reason:"terminal-held",source:"terminal-lock",terminalLock:n};let s=gD(e,t,r);if(s!==null)return{busy:!0,reason:"terminal-held",source:"terminal-invocation",terminalInvocation:s};let i=e.getAgentInflight(t,r);if(i===null)return{busy:!1};let o=new Date(Date.now()-sE()).toISOString();return nE(i,o)?{busy:!1}:{busy:!0,reason:"in-flight",inFlight:i}}function hD(e){if(e.holder_host===zd())return ot(e.holder_pid);let t=Date.parse(e.last_heartbeat);return Number.isFinite(t)?Date.now()-t<=yD():!1}function gD(e,t,r){let s=e.query(`SELECT id, started_at, last_heartbeat_at, holder_pid, holder_host
2124
2124
  FROM tracked_invocation
2125
2125
  WHERE target_teamfile = ?
2126
2126
  AND target_alias = ?
2127
2127
  AND status = 'running'
2128
2128
  AND launch_source = 'terminal'
2129
2129
  ORDER BY started_at DESC, id DESC
2130
- LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===zd())?ot(s.holder_pid)?s:null:rE(s)?s:null}function rE(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=sE():!1}function nE(e,t){return e.holder_pid===null?e.started_at<t:!ot(e.holder_pid)}function sE(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return eE;let r=Number(t);return!Number.isFinite(r)||r<=0?eE:r}function yD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return tE;let r=Number(t);return!Number.isFinite(r)||r<=0?tE:r}var eE,tE,Ur=E(()=>{"use strict";Vn();eE=8*60*60*1e3,tE=12e4});async function O(e,t){if(e.dal!==void 0)return t(e.dal);let r=ke({path:Z()});try{return await t(r)}finally{r.close()}}function Q(e,t,r=["--json"]){let n=new Set(t),s=new Set(r),i=[],o={};for(let a=0;a<e.length;a+=1){let l=e[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=e[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function P(e,t){let r=e.flags[t];return typeof r=="string"?r:void 0}function V(e,t){return e.flags[t]===!0}function le(e,t){e.stdout.write(`${JSON.stringify(t,null,2)}
2130
+ LIMIT 1`,t,r)[0];return s===void 0?null:s.holder_pid!==null&&(s.holder_host===null||s.holder_host===zd())?ot(s.holder_pid)?s:null:rE(s)?s:null}function rE(e){let t=Date.parse(e.last_heartbeat_at??e.started_at);return Number.isFinite(t)?Date.now()-t<=sE():!1}function nE(e,t){return e.holder_pid===null?e.started_at<t:!ot(e.holder_pid)}function sE(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return eE;let r=Number(t);return!Number.isFinite(r)||r<=0?eE:r}function yD(e=process.env){let t=e.LMCTL_TERMINAL_LOCK_STALE_MS;if(t===void 0||t.trim()==="")return tE;let r=Number(t);return!Number.isFinite(r)||r<=0?tE:r}var eE,tE,Ur=E(()=>{"use strict";Vn();eE=8*60*60*1e3,tE=12e4});async function O(e,t){if(e.dal!==void 0)return t(e.dal);let r=ke({path:Z()});try{return await t(r)}finally{r.close()}}function Q(e,t,r=["--json"]){let n=new Set(t),s=new Set(r),i=[],o={};for(let a=0;a<e.length;a+=1){let l=e[a];if(!l.startsWith("--")){i.push(l);continue}if(s.has(l)){o[l]=!0;continue}if(!n.has(l))return{positionals:i,flags:o,error:`unknown flag: ${l}`};let c=e[a+1];if(c===void 0||c.startsWith("--"))return{positionals:i,flags:o,error:`missing value for ${l}`};o[l]=c,a+=1}return{positionals:i,flags:o}}function F(e,t){let r=e.flags[t];return typeof r=="string"?r:void 0}function V(e,t){return e.flags[t]===!0}function le(e,t){e.stdout.write(`${JSON.stringify(t,null,2)}
2131
2131
  `)}function v(e,t){return e.stderr.write(`error: ${t}
2132
2132
  `),1}function Pe(e,t){let r=t instanceof Error?t.message:String(t);return e.stderr.write(`internal error: ${r}
2133
- `),2}var Le=E(()=>{"use strict";Qe();Be()});import{hostname as aE}from"node:os";async function sa(e){let t=e.finalize??"auto";await uE(e.io,e.env);let r=await O(e.io,m=>m.listEnqueuedRequestMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),n=r.length===0?[]:await O(e.io,m=>m.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,aE())),s=wD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??dE(e.sender)});if(s.length===0)throw new Error(`no queued mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);await e.onPromptBuilt?.(s);let i=!1,o=ce(),a=0,l=0,c=0,d={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:s,permissionMode:e.permissionMode,env:e.env,onDelta:m=>{i=!0,o&&(a+=1,c=Buffer.byteLength(m,"utf8"),l+=c),e.onDelta?.(m)},onProgress:m=>e.onProgress?.(m)};e.receiver.model!==void 0&&(d.model=e.receiver.model),e.receiver.effort!==void 0&&(d.effort=e.receiver.effort),d.alias=e.receiver.alias,d.isLead=e.receiver.isLead,e.idleTimeoutMs!==void 0&&(d.timeoutMs=e.idleTimeoutMs);let u;try{u=await kt(d)}catch(m){t==="auto"&&await oE(e.io,n.map(_=>_.id));let p=m instanceof Error?m.message:String(m);if(t==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw m}if(o&&Oe(JSON.stringify({event:"chat_return",alias:e.receiver.alias,provider:e.receiver.provider,streamed:i,blockCount:a,streamedBytes:l,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:c,tailPreview:u.text.slice(-200)})),u.status==="stalled")return t==="auto"&&await oE(e.io,n.map(m=>m.id)),{status:"stalled",receipt:u.text,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let f=n.map(m=>m.id);return t==="auto"&&await na(e.io,f,u.text),{status:"ok",receipt:u.text,prompt:s,queued:n,deliveredIds:f,wroteDelta:i,durationMs:u.durationMs}}async function lE(e){await uE(e.io,e.env);let t=await O(e.io,i=>i.listEnqueuedResponseMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),r=t.length===0?[]:await O(e.io,i=>i.claimMailForDelivery(t.map(o=>o.id),new Date().toISOString(),process.pid,aE())),n=ED(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let s={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:n,permissionMode:e.permissionMode,env:e.env,alias:e.receiver.alias,isLead:e.receiver.isLead};e.receiver.model!==void 0&&(s.model=e.receiver.model),e.receiver.effort!==void 0&&(s.effort=e.receiver.effort),e.idleTimeoutMs!==void 0&&(s.timeoutMs=e.idleTimeoutMs);try{let i=await kt(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
2133
+ `),2}var Le=E(()=>{"use strict";Qe();Be()});import{hostname as aE}from"node:os";async function sa(e){let t=e.finalize??"auto";await uE(e.io,e.env);let r=await O(e.io,m=>m.listEnqueuedRequestMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),n=r.length===0?[]:await O(e.io,m=>m.claimMailForDelivery(r.map(p=>p.id),new Date().toISOString(),process.pid,aE())),s=wD(n,e.newMessage,{newMessageFrom:e.newMessageFrom??dE(e.sender)});if(s.length===0)throw new Error(`no queued mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);await e.onPromptBuilt?.(s);let i=!1,o=ce(),a=0,l=0,c=0,d={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:s,permissionMode:e.permissionMode,env:e.env,onDelta:m=>{i=!0,o&&(a+=1,c=Buffer.byteLength(m,"utf8"),l+=c),e.onDelta?.(m)},onProgress:m=>e.onProgress?.(m)};e.receiver.model!==void 0&&(d.model=e.receiver.model),e.receiver.effort!==void 0&&(d.effort=e.receiver.effort),d.alias=e.receiver.alias,d.isLead=e.receiver.isLead,e.idleTimeoutMs!==void 0&&(d.timeoutMs=e.idleTimeoutMs);let u;try{u=await kt(d)}catch(m){t==="auto"&&await oE(e.io,n.map(h=>h.id));let p=m instanceof Error?m.message:String(m);if(t==="caller")return{status:"error",receipt:p,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,error:p};throw m}if(o&&Oe(JSON.stringify({event:"chat_return",alias:e.receiver.alias,provider:e.receiver.provider,streamed:i,blockCount:a,streamedBytes:l,resultTextBytes:Buffer.byteLength(u.text,"utf8"),lastChunkBytes:c,tailPreview:u.text.slice(-200)})),u.status==="stalled")return t==="auto"&&await oE(e.io,n.map(m=>m.id)),{status:"stalled",receipt:u.text,prompt:s,queued:n,deliveredIds:[],wroteDelta:i,durationMs:u.durationMs,stalledAfterMs:u.stalledAfterMs};let f=n.map(m=>m.id);return t==="auto"&&await na(e.io,f,u.text),{status:"ok",receipt:u.text,prompt:s,queued:n,deliveredIds:f,wroteDelta:i,durationMs:u.durationMs}}async function lE(e){await uE(e.io,e.env);let t=await O(e.io,i=>i.listEnqueuedResponseMailFromSender(e.sender.teamfile,e.sender.alias,e.receiver.teamfile,e.receiver.alias)),r=t.length===0?[]:await O(e.io,i=>i.claimMailForDelivery(t.map(o=>o.id),new Date().toISOString(),process.pid,aE())),n=ED(r);if(n.length===0)throw new Error(`no queued response mail to deliver for ${e.sender.teamfile}:${e.sender.alias} -> ${e.receiver.teamfile}:${e.receiver.alias}`);let s={provider:e.receiver.provider,sessionId:e.receiver.sessionId,cwd:e.receiver.cwd,prompt:n,permissionMode:e.permissionMode,env:e.env,alias:e.receiver.alias,isLead:e.receiver.isLead};e.receiver.model!==void 0&&(s.model=e.receiver.model),e.receiver.effort!==void 0&&(s.effort=e.receiver.effort),e.idleTimeoutMs!==void 0&&(s.timeoutMs=e.idleTimeoutMs);try{let i=await kt(s);if(i.status==="stalled"){let a=`response delivery error: provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}
2134
2134
  ${i.text}`;return await na(e.io,r.map(l=>l.id),a),{status:"stalled",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),durationMs:i.durationMs,stalledAfterMs:i.stalledAfterMs}}let o="response delivered; recipient output discarded";return await na(e.io,r.map(a=>a.id),o),{status:"ok",receipt:o,prompt:n,queued:r,deliveredIds:r.map(a=>a.id),durationMs:i.durationMs}}catch(i){let o=i instanceof Error?i.message:String(i),a=`response delivery error: ${o}`;return await na(e.io,r.map(l=>l.id),a),{status:"error",receipt:a,prompt:n,queued:r,deliveredIds:r.map(l=>l.id),error:o}}}function wD(e,t,r={}){let n=e.map((s,i)=>[`--- queued message ${i+1} (mail #${s.id}, from ${cE(s)}, sent ${s.created_at}) ---`,s.payload].join(`
2135
2135
  `));return t!==void 0&&n.push([`--- new message (from ${r.newMessageFrom??"operator"}) ---`,t].join(`
2136
2136
  `)),n.join(`
@@ -2140,8 +2140,8 @@ ${i.text}`;return await na(e.io,r.map(l=>l.id),a),{status:"stalled",receipt:a,pr
2140
2140
 
2141
2141
  `)}function cE(e){return e.sender_teamfile===null||e.sender_alias===null?"operator":dE({teamfile:e.sender_teamfile,alias:e.sender_alias})}function dE(e){return`${e.teamfile}:${e.alias}`}async function na(e,t,r){if(t.length!==0)try{await O(e,n=>{n.markMailDelivered(t,r,new Date().toISOString())})}catch(n){e.stderr.write(`warning: failed to mark queued mailbox mail delivered: ${n instanceof Error?n.message:String(n)}
2142
2142
  `)}}async function oE(e,t){if(t.length!==0)try{await O(e,r=>{r.clearMailDelivery(t)})}catch(r){e.stderr.write(`warning: failed to clear queued mailbox delivery marker: ${r instanceof Error?r.message:String(r)}
2143
- `)}}async function uE(e,t){try{await O(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-TD(t)).toISOString())})}catch{}}function TD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return iE;let r=Number(t);return!Number.isFinite(r)||r<=0?iE:r}var iE,Zd=E(()=>{"use strict";It();pe();Le();iE=8*60*60*1e3});import{basename as bD}from"node:path";function pE(e,t){let r=new Date(t.now.getTime()-_r()).toISOString(),n=gE(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=kD(t.sender,n),i=ID(t.sender,n);i!==null&&i.teamfile===t.root&&!mE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,o],l=s.filter(f=>mE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&t.now.getTime()-c<SD;return{stop:l.length>=1&&d,chain:ND(a)}}function hE(e,t){let r=new Date(t.now.getTime()-_r()).toISOString(),n=gE(e,r),s=yE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function _r(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return fE;let r=Number(t);return!Number.isFinite(r)||r<=0?fE:r}function _E(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function vD(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function gE(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(vD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function kD(e,t,r={}){let n=new Map;for(let a of t)n.set(Wr(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Wr(e)]);for(let a=0;a<64;a+=1){let l=n.get(Wr(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:")&&r.includePromptSender!==!0)break;let d=Wr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function yE(e,t){let r=Wr(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Wr(l.sender),d=Wr(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function ID(e,t){let r=yE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function mE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Wr(e){return`${e.teamfile}\0${e.alias}`}function ND(e){return e.map(t=>`${bD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var SD,fE,ia=E(()=>{"use strict";SD=6e4,fE=8*60*60*1e3});function wE(e){if(e.length===0||!e.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2144
- `);if(t[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!xD.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${oa.join(", ")}`);r[c]=d}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of oa)if(r[o]===void 0)throw new Rt(`missing required frontmatter key "${o}" \u2014 required: ${oa.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var oa,xD,Rt,EE=E(()=>{"use strict";oa=["title","description","members"],xD=new Set(oa),Rt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as AD,writeFileSync as w8,renameSync as E8,existsSync as bE}from"node:fs";import{basename as RD,resolve as vn,dirname as Qd}from"node:path";function OD(e){let t={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(e))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];t[s]=i}return t}function $D(e){return/^\s*_MEMBER_\s+\S/.test(e)}function CD(e){return/^\s*_SESSION_\s+\S/.test(e)}function MD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function aa(e){let t=RD(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function Fe(e){let t=AD(e,"utf-8"),r=Qd(vn(e)),n=tu(t,aa(e),{baseDir:r,sourcePath:vn(e)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=vn(r,s.sessiondir));return n}function tu(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2143
+ `)}}async function uE(e,t){try{await O(e,r=>{r.reclaimStaleMailboxDeliveries(new Date(Date.now()-TD(t)).toISOString())})}catch{}}function TD(e){let t=e.LMCTL_MAILBOX_DELIVERY_STALE_MS;if(t===void 0||t.trim()==="")return iE;let r=Number(t);return!Number.isFinite(r)||r<=0?iE:r}var iE,Zd=E(()=>{"use strict";It();me();Le();iE=8*60*60*1e3});import{basename as bD}from"node:path";function pE(e,t){let r=new Date(t.now.getTime()-hr()).toISOString(),n=gE(e,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=kD(t.sender,n),i=ID(t.sender,n);i!==null&&i.teamfile===t.root&&!mE(s[0],i)&&s.unshift({...i,at:null});let o={teamfile:t.receiverTeamfile,alias:t.receiverAlias,at:t.now.getTime()},a=[...s,o],l=s.filter(f=>mE(f,o)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,d=c!==null&&t.now.getTime()-c<SD;return{stop:l.length>=1&&d,chain:ND(a)}}function _E(e,t){let r=new Date(t.now.getTime()-hr()).toISOString(),n=gE(e,r),s=yE(t.sender,n);if(s.length===0)return null;let i=s[0];return i.sender.teamfile.startsWith("prompt:")?i.receiver.teamfile:i.sender.teamfile}function hr(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return fE;let r=Number(t);return!Number.isFinite(r)||r<=0?fE:r}function hE(e){return`cross-team cycle detected (${e}); stopping to prevent a runaway loop.`}function vD(e){return{sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},at:Date.parse(e.started_at)}}function gE(e,t){return e.clearAgentInflightOlderThan(t),e.listAgentInflight().map(vD).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=t).sort((r,n)=>r.at-n.at)}function kD(e,t,r={}){let n=new Map;for(let a of t)n.set(Wr(a.receiver),a);let s=[{...e,at:null}],i=e,o=new Set([Wr(e)]);for(let a=0;a<64;a+=1){let l=n.get(Wr(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:")&&r.includePromptSender!==!0)break;let d=Wr(l.sender);if(o.has(d))break;s.unshift(c),o.add(d),i=l.sender}return s}function yE(e,t){let r=Wr(e),n=new Set([r]),s=[r],i=[];for(let o=0;s.length>0&&o<128;o+=1){let a=s.shift();for(let l of t){let c=Wr(l.sender),d=Wr(l.receiver);c!==a&&d!==a||(i.includes(l)||i.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(d)||(n.add(d),s.push(d)))}}return i.sort((o,a)=>o.at-a.at)}function ID(e,t){let r=yE(e,t);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function mE(e,t){return e.teamfile===t.teamfile&&e.alias===t.alias}function Wr(e){return`${e.teamfile}\0${e.alias}`}function ND(e){return e.map(t=>`${bD(t.teamfile)}:${t.alias}`).join(" \u2192 ")}var SD,fE,ia=E(()=>{"use strict";SD=6e4,fE=8*60*60*1e3});function wE(e){if(e.length===0||!e.startsWith("---"))throw new Rt("frontmatter must start at line 1 with `---` on its own line");let t=e.split(`
2144
+ `);if(t[0]!=="---")throw new Rt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let o=1;o<t.length;o++){let a=t[o];if(a==="---"){n=o;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new Rt(`malformed frontmatter line ${o+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],d=l[2].trim();if(!xD.has(c))throw new Rt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${oa.join(", ")}`);r[c]=d}if(n===-1)throw new Rt("frontmatter not closed (missing trailing `---` on its own line)");for(let o of oa)if(r[o]===void 0)throw new Rt(`missing required frontmatter key "${o}" \u2014 required: ${oa.join(", ")}`);let s=0;for(let o=0;o<=n;o++)s+=t[o].length+1;s>e.length&&(s=e.length);let i=r.members.split(",").map(o=>o.trim()).filter(Boolean);return{title:r.title,description:r.description,members:i,bodyOffset:s}}var oa,xD,Rt,EE=E(()=>{"use strict";oa=["title","description","members"],xD=new Set(oa),Rt=class extends Error{constructor(t){super(t),this.name="FrontmatterError"}}});import{readFileSync as AD,writeFileSync as E8,renameSync as T8,existsSync as bE}from"node:fs";import{basename as RD,resolve as vn,dirname as Qd}from"node:path";function OD(e){let t={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(e))!==null;){let s=n[1],i=n[2]!==void 0?n[2]:n[3];t[s]=i}return t}function $D(e){return/^\s*_MEMBER_\s+\S/.test(e)}function CD(e){return/^\s*_SESSION_\s+\S/.test(e)}function MD(e){return/^\s*_SKILL_(?:\s|$)/.test(e)}function aa(e){let t=RD(e);return t.endsWith(".lmctl")?t.slice(0,-6):t}function Fe(e){let t=AD(e,"utf-8"),r=Qd(vn(e)),n=tu(t,aa(e),{baseDir:r,sourcePath:vn(e)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=vn(r,s.sessiondir));return n}function tu(e,t,r={}){let n=[],s=[];r.sourcePath,r.baseDir;let i=e;if(i.startsWith("#teamfile:")){let l=i.indexOf(`
2145
2145
  `);i=l>=0?i.slice(l+1):""}let o=null;if(i.startsWith("---"))try{o=wE(i)}catch(l){if(l instanceof Rt)s.push(`frontmatter: ${l.message}`);else throw l}let a=e.split(`
2146
2146
  `);for(let l=0;l<a.length;l++){let c=a[l],d=l+1;if(CD(c))throw new Error(`line ${d}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${c.trim()})`);if(MD(c)||!$D(c))continue;let u=OD(c);for(let p of Object.keys(u))if(!TE.includes(p))throw new Error(`line ${d}: unknown key "${p}" on _MEMBER_ line: ${c.trim()}
2147
2147
  allowed keys: ${TE.join(", ")}`);if(!u.provider&&!u.teamfile){s.push(`line ${d}: member line missing provider (or teamfile): ${c.trim()}`);continue}let m={alias:u.alias||`member${n.length+1}`,provider:u.provider||"",extra:{}};u.sessionid&&(m.session=u.sessionid),Object.prototype.hasOwnProperty.call(u,"sessiondir")&&(m.sessiondir=u.sessiondir),u.teamfile&&(m.teamfile=u.teamfile),u.model&&(m.model=u.model),u.effort&&(m.effort=u.effort),n.push(m)}return{name:t,members:n,rawText:e,parseErrors:s,frontmatter:o}}function ru(e,t){let r=[];for(let i of e.parseErrors)r.push({field:"session",message:i});let n=e.members.filter(i=>i.alias.toLowerCase()===eu.toLowerCase());n.length>1&&r.push({field:eu,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let i of e.members){let o=i.alias.toLowerCase();if(s.has(o)&&r.push({field:i.alias,message:`Duplicate alias "${i.alias}" (case-insensitive)`}),s.add(o),i.teamfile){let a=t?vn(t,i.teamfile):vn(i.teamfile);if(!bE(a))r.push({field:i.alias,message:`Teamfile not found: ${a}`});else{let l=Fe(a),c=Lt(l);c?c.session||r.push({field:i.alias,message:`Team at ${i.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:i.alias,message:`Team at ${i.teamfile} has no lead session`})}}else LD.has(i.provider)||r.push({field:i.alias,message:`Invalid provider "${i.provider}"`});i.sessiondir!==void 0&&i.sessiondir===""&&r.push({field:i.alias,message:"sessiondir is empty"})}return r}function Lt(e){return e.members.find(t=>t.alias.toLowerCase()===eu.toLowerCase())}function nu(e,t,r,n={}){let s=n.requireSession??!0;if(!e.teamfile)throw new Error(`Member "${e.alias}" is not a team reference`);let i=vn(t,e.teamfile),o=r??new Set;if(o.has(i))throw new Error(`Circular team reference: ${e.alias} \u2192 ${i} (already visited: ${[...o].join(" \u2192 ")})`);if(o.add(i),!bE(i))throw new Error(`Teamfile not found: ${i} (referenced by alias "${e.alias}")`);let a=Fe(i),l=Lt(a);if(!l)throw new Error(`Team at ${i} has no lead session`);if(l.teamfile)return nu(l,Qd(i),o,n);if(s&&!l.session)throw new Error(`Team at ${i} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Qd(i),alias:e.alias,resolvedFrom:i,model:l.model,effort:l.effort}}function la(e,t){return e.members.find(r=>r.alias===t)??e.members.find(r=>r.alias.toLowerCase()===t.toLowerCase())}var eu,LD,TE,zt=E(()=>{"use strict";EE();eu="Lead",LD=new Set(["claude","codex","opencode","lmplayer","gemini","copilot","qwen","agy","ClaudeMock"]);TE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{createHash as jD}from"node:crypto";import{existsSync as xs,mkdirSync as DD,readFileSync as kE,realpathSync as PD,writeFileSync as FD}from"node:fs";import{basename as SE,dirname as IE,resolve as NE}from"node:path";function Te(e,t){let r=NE(e);if(xs(r))return PD(r);if(t!==void 0){let n=BD(e,r,t);if(n!==null)return n}return r}function vE(e,t){let r=IE(t),n=tu(e,aa(t),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=NE(r,s.sessiondir));return n}function Ue(e,t){let r=Te(e,WD(t)?t:void 0);if(t!==void 0){let n=t.getRootTeam(r);if(n!==null)return!xs(r)&&"upsertRootTeam"in t&&(DD(IE(r),{recursive:!0}),FD(r,n.raw_text,"utf8")),vE(n.raw_text,r);if(xs(r)){let s=kE(r,"utf8"),i=vE(s,r);return"upsertRootTeam"in t&&qD(i)&&HD(t,r,i,s),i}throw new Error(`teamfile not found: ${e}`)}if(!xs(r))throw new Error(`teamfile not found: ${e}`);return Fe(r)}function xE(e,t,r){let n=Te(e,t),s=t.getRootTeam(n);s===null||!xs(n)||kE(n,"utf8")===s.raw_text||r(`warning: ${n} differs from the last seeded DB snapshot; runtime is using the seeded snapshot. Run: lmctl seed ${n}`)}function WD(e){return typeof e=="object"&&e!==null&&"getRootTeam"in e&&"listRootTeams"in e}function BD(e,t,r){let n=r.getRootTeam(e)??r.getRootTeam(t);if(n!==null)return n.teamfile_path;let s=SE(e),i=aa(e),o=r.listRootTeams().filter(l=>SE(l.teamfile_path)===s||l.name===i);if(o.length===0)return null;if(o.length===1)return o[0].teamfile_path;let a=o.map(l=>l.teamfile_path).join(", ");throw new Error(`ambiguous teamfile "${e}" in root-team registry: ${a}; pass an absolute path`)}function qD(e){return e.parseErrors.length>0?!1:e.members.every(t=>t.teamfile!==void 0?!0:t.session!==void 0&&t.session.length>=UD)}function HD(e,t,r,n){let s=new Date().toISOString(),i={teamfile_path:t,name:r.name,raw_text:n,raw_sha256:jD("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};e.upsertRootTeam(i)}var UD,Ot=E(()=>{"use strict";zt();UD=5});import{existsSync as JD}from"node:fs";import{dirname as AE}from"node:path";function VD(e){return XD.test(e)||GD.test(e)}function RE(e){return ca.test(e)}function Br(e){if(!e.includes(":"))return null;let t=e.lastIndexOf(":"),r=e.slice(0,t),n=e.slice(t+1);return!r.endsWith(".lmctl")||!ca.test(n)?null:{teamfile:r,alias:n}}function $e(e,t,r){if(!e.endsWith(".lmctl"))throw new we(`lmctl: "${e}" doesn't look like a teamfile (expected .lmctl extension).`);if(!RE(t))throw new we(`lmctl: "${t}" is not a valid alias (must match ${ca.source}).`);let n=Te(e,r);if(r===void 0&&!JD(n))throw new we(`lmctl: teamfile not found: ${e}`);let s;try{s=Ue(n,r)}catch(o){throw new we(`lmctl: ${e}: ${o instanceof Error?o.message:String(o)}`)}if(s.parseErrors.length>0)throw new we(`lmctl: ${e}: ${s.parseErrors.join("; ")}`);let i=la(s,t);if(i===void 0){let o=s.members.map(a=>a.alias).join(", ")||"(none)";throw new we(`lmctl: alias "${t}" not found in ${e}.
@@ -2150,17 +2150,17 @@ ${i.text}`;return await na(e.io,r.map(l=>l.id),a),{status:"stalled",receipt:a,pr
2150
2150
  Use: lmctl ${e.name} ${r}:<alias> or lmctl ${e.name} ${r} <alias>`};if(VD(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: "${r}" is a bare sessionid, but ${e.name} is teamfile-only (a sessionid carries no provider resume incantation).`};let a={mode:"ai-team-raw",sessionid:r};return s.provider!==void 0&&(a.provider=s.provider),a}return n!==void 0?{mode:"error",message:`lmctl ${e.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
2151
2151
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${e.name}: can't infer target type from "${r}".
2152
2152
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!e.supportsRaw)return{mode:"error",message:`lmctl ${e.name}: --session (raw mode) is not supported by ${e.name}.`};let o={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(o.provider=s.provider),o}return{mode:"error",message:`lmctl ${e.name}: a target is required.
2153
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var we,XD,GD,ca,_t=E(()=>{"use strict";zt();Ot();we=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},XD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,GD=/^ses_[A-Za-z0-9_-]+$/,ca=/^[A-Za-z][A-Za-z0-9_-]*$/});function da(e){return YD.has(e)}function iu(){return su===null&&(su=bt(vt())),su}function ou(e,t,r={}){if(!da(e))return null;try{let n=iu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?pi({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?KD[e]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:e,model:r.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...LE[e]??[]]}catch{return null}}function ua(e,t,r={}){let n=ou(e,t,r);return n===null?null:n.join(" ")}function Ye(e,t){return iu().getSession(e,t)}async function kn(e){return(await iu().resolveSessions(e)).map(r=>r.provider.name)}var LE,KD,YD,OE,su,yr=E(()=>{"use strict";It();wl();LE={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},KD={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e]},YD=new Set(Object.keys(LE)),OE=/^[\w.:-]+$/;su=null});function zD(e=process.env){let t=e.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(t===void 0||t.trim()==="")return $E;let r=Number(t);return!Number.isFinite(r)||r<=0?$E:r}async function ZD(e,t,r){try{let n=$e(t,r,e),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let c=await kn(s);if(c.length!==1)return null;i=c[0]}let o=await Ye(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 fa(e,t,r,n,s){if(!t.busy||t.reason!=="in-flight")return!1;let i=s??zD(),o=await ZD(e,r,n),a=o!==null&&o>=i;return a&&q({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,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 $E,au=E(()=>{"use strict";pe();yr();_t();$E=36e5});function QD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return CE;let r=Number(t);return!Number.isFinite(r)||r<=0?CE:Math.max(1,Math.trunc(r))}async function jE(e){let t=e.env??process.env,r=e.maxBatches??QD(t),n=oP(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};iP(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(ME(l)));if(o===void 0)break;i.add(ME(o)),s.scanned+=1;let a=await eP(e.dal,n,t,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function ME(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function eP(e,t,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Yt(e,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await fa(e,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null;try{let l=$e(n.receiver_teamfile,n.receiver_alias,e),c=hr(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:_r(),...o?{force:!0}:{}});if(!c.acquired)return{...s,skipped_busy:1};if(a=c.lease,n.message_type==="response"){let u=await lE({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:r});return nP(u)}let d=await sa({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:r,finalize:"caller"});return rP(e,d)}catch(l){return tP(e,n,`relay delivery error: ${l instanceof Error?l.message:String(l)}`)}finally{if(a!==null)try{e.releaseAgentInflight(a)}catch{}}}function tP(e,t,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=t.message_type==="response"?e.listEnqueuedResponseMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias):e.listEnqueuedRequestMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias),i=t.message_type==="response"?e.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):e.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function rP(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=sP(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function nP(e){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:e.deliveredIds.length,errors:e.status==="ok"?0:1}}function sP(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
2154
- ${e.receipt}`:`relay delivery error: ${e.error}`}function iP(e,t){let r=t.LMCTL_MAILBOX_DELIVERY_STALE_MS,n=r===void 0||r.trim()===""?NaN:Number(r),s=Number.isFinite(n)&&n>0?n:8*60*60*1e3;e.reclaimStaleMailboxDeliveries(new Date(Date.now()-s).toISOString())}function oP(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var CE,DE=E(()=>{"use strict";Ur();Zd();ia();_t();au();CE=10});function As(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function lP(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let r=new Set;for(let n of t.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(PE);aP.has(s)&&r.add(s)}}return r}function FE(e){let t=e.intervalMs??As(),r=e.runOnceFn??Pr,n=new Set(e.features??lP()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Kw)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=UE(e.dal,n,e.monitorSessionActivityFn??kc,t,s).finally(()=>{l=null})),l.finally(()=>u(Ic(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=cP(e.dal,r,e.collectSessionSizesFn??yh,e.scanIntakeFn??mo,e.monitorSessionActivityFn??kc,e.mailboxRelayFn??jE,e.worker_id??"daemon",t,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),n.has("session-monitor")&&u(m)}return f}async function cP(e,t,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,_=dP();try{if(l.has("durable-memory-policies")&&ky({dal:e}),l.has("drift-detectors")&&Zw({dal:e}),l.has("intake")&&(m=await n(e)),l.has("job-worker"))for(;;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(_=await i({dal:e})),l.has("session-size")){let g=await r(e);u=g.recorded,f=g.failed}l.has("session-monitor")&&(p=await UE(e,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((g,h)=>g+h.scanned,0),c.last_intake_new_jobs=m.reduce((g,h)=>g+h.new_jobs,0),c.last_intake_failures=m.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=_.scanned,c.last_mailbox_relay_delivered=_.delivered,c.last_mailbox_relay_errors=_.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:_}}function dP(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function UE(e,t,r,n,s){if(!t.has("session-monitor"))return null;let i=Ic(e,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var PE,aP,lu=E(()=>{"use strict";Yc();Mo();Nd();Fi();Yw();Qw();Nc();DE();PE=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],aP=new Set(PE)});function WE(e){let t=e.listMembersInState("in_chat");for(let r of t)e.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var BE=E(()=>{"use strict"});import{mkdirSync as uP,readFileSync as fP,readdirSync as mP,statSync as pP,writeFileSync as hP}from"node:fs";import{dirname as _P,join as HE,sep as qE}from"node:path";function ma(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case JE:return gP(e,s.input);case XE:return yP(e,s.input);case GE:return wP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:uu,GetObjectCommand:du,PutObjectCommand:cu}}}function gP(e,t){let r=VE(e,t.Key);return uP(_P(r),{recursive:!0}),hP(r,t.Body),{}}function yP(e,t){let r=VE(e,t.Key),n;try{n=fP(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function wP(e,t){let r=t.Prefix??"";KE(r);let s=EP(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function VE(e,t){return KE(t),HE(e,t)}function KE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function EP(e){let t=[],r=(n,s)=>{let i;try{i=mP(n,{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=HE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=qE==="/"?a:a.split(qE).join("/");t.push({key:c,lastModified:pP(l).mtime})}}};return r(e,""),t}var JE,XE,GE,cu,du,uu,fu=E(()=>{"use strict";JE="localfs-put",XE="localfs-get",GE="localfs-list",cu=class{input;_localfsTag=JE;constructor(t){this.input=t}},du=class{input;_localfsTag=XE;constructor(t){this.input=t}},uu=class{input;_localfsTag=GE;constructor(t){this.input=t}}});function YE(){return{put:0,get:0,list:0}}function mu(e,t=TP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function pu(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var TP,pa,hu=E(()=>{"use strict";TP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};pa=class{counts=YE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=YE(),t}estimateCostUsd(t){return mu(this.counts,t)}}});function zE(e){let t=e.now??Date.now,r=e.timers??bP,n=null,s=null;async function i(){let l=t(),c=pu(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(_){e.log?.(`[usage] publish rollup failed: ${_ instanceof Error?_.message:String(_)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(_){e.log?.(`[usage] read user total failed: ${_ instanceof Error?_.message:String(_)}`),m=f}let p=mu(m);if(n!==c&&p>=e.ceilingUsd){n=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(_){e.log?.(`[usage] onQuotaExceeded threw: ${_ instanceof Error?_.message:String(_)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===pu(t())}}}var bP,ZE=E(()=>{"use strict";hu();bP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var _u=E(()=>{"use strict";Uo();Bo();Bo()});function SP(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let r=t.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:t.message_id,request:n}}function vP(e){return e.reply_to!==void 0&&e.response!==void 0}function kP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function QE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var ha,Rs,eT=E(()=>{"use strict";_u();ha=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Rs=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new ha("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Kt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(QE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(QE(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let r=new ha;for(let n of t){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(t,r){let n=SP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(vP(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??kP(t)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Kt(this.now(),this.random),reply_to:n.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=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function gu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var tT=E(()=>{"use strict"});function yu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let r of t.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var rT=E(()=>{"use strict"});function Eu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let r of t.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let r=t.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var wu,nT=E(()=>{"use strict";wu="daemon:events"});function iT(e){return{kind:"prompt",prompt_id:e.prompt_id??Kt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function Tu(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var sT,bu=E(()=>{"use strict";_u();sT="prompt:root"});function Ls(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(aT(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function IP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(aT(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function oT(e,t=60){if(typeof e!="string"||e==="")return!0;let r=IP(e);return r===null?!0:Date.now()/1e3>=r-t}function aT(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var Su=E(()=>{"use strict"});async function _a(e){let t=e.fetchImpl??fetch,r=`https://cognito-idp.${e.region}.amazonaws.com/`,n=await t(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":NP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let 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 NP,vu=E(()=>{"use strict";NP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as lT,mkdirSync as cT,readFileSync as dT,writeFileSync as uT}from"node:fs";import{homedir as fT}from"node:os";import{dirname as mT,join as pT}from"node:path";function Os(){return process.env.LMCTL_DEVICE_AUTH_PATH??pT(fT(),".lmctl","device-auth.json")}function hT(){return process.env.LMCTL_TOKEN_PATH??pT(fT(),".lmctl","cli-tokens.json")}function ku(e=Os()){try{let t=JSON.parse(dT(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function _T(e,t=Os()){cT(mT(t),{recursive:!0,mode:448}),uT(t,JSON.stringify(e,null,2));try{lT(t,384)}catch{}}function Iu(e,t=hT()){let r={};try{r=JSON.parse(dT(t,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=e.idToken,e.accessToken!==void 0&&(n.accessToken=e.accessToken),e.refreshToken!==void 0&&(n.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(n.expiresAt=e.expiresAt);let s={...r,cognito:n};cT(mT(t),{recursive:!0,mode:448}),uT(t,JSON.stringify(s,null,2));try{lT(t,384)}catch{}}async function gT(e){let t=e.deviceAuthPath??Os(),r=ku(t);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await _a({region:e.region,clientId:e.clientId,refreshToken:r.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return Iu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??hT()),{idToken:n.idToken,userId:r.userId}}var Nu=E(()=>{"use strict";vu()});import{existsSync as xP,realpathSync as AP}from"node:fs";import{dirname as RP}from"node:path";function xu(e){LP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function LP(e){let t=e.payload.root_teamfile;try{t=AP(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return In({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unavailable"}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"root_unregistered"}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=$P(t);if("error"in r)return In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:r.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=hr(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:DP(e.env??process.env)});if(!n.acquired){let s=jP(r.alias,n.current);return In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"unavailable"}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??kt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return c==="ok"?await CP(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:i.text,status:c,error_detail:null,log:e.log}):In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"provider_error"}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function In(e){q({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:OP(e.message)})}function OP(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function $P(e){if(!xP(e))return{error:`prompt root missing/unreadable: ${e}`};let t=Fe(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let r=Lt(t);return r===void 0?{error:`prompt root has no Lead: ${e}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??RP(e)}}async function CP(e,t){let r=ET(t.message),n=t.response===null?null:ET(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function ET(e){return e.length<=yT?{text:e,truncated:!1}:{text:e.slice(0,yT),truncated:!0}}function MP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function jP(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:MP(e,t)}function DP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return wT;let r=Number(t);return!Number.isFinite(r)||r<=0?wT:r}var yT,wT,TT=E(()=>{"use strict";It();zt();pe();Ur();yT=256*1024,wT=30*60*1e3});import{chmodSync as NT,existsSync as PP,mkdirSync as xT,readFileSync as Ea,writeFileSync as AT}from"node:fs";import{dirname as Au,resolve as ga,join as RT}from"node:path";import{fileURLToPath as FP}from"node:url";import{homedir as LT}from"node:os";import{CognitoIdentityClient as UP,GetIdCommand as WP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as bT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as BP,ListObjectsV2Command as qP,PutObjectCommand as HP,S3Client as ST}from"@aws-sdk/client-s3";function Cs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:KP(e.selfUrl),n={},s;for(let I of r)if(PP(I)){n=VP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??JP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??XP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??GP,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ta,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,_=wa(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=wa(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),h=wa(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=wa(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),T=i(t.LMCTL_MAILBOX_KEY),b=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},..._!==void 0?{readIntervalMs:_}:{},...g!==void 0?{heartbeatIdleMs:g}:{},...h!==void 0?{backoffReadIntervalMs:h}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...T!==void 0?{mailboxKey:T}:{},...b!==void 0?{tokenPath:b}:{}},f}function VP(e){try{let t=Ea(e,"utf8"),n=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function KP(e){let t=Au(FP(e??import.meta.url));return[ga(t,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(t,"..","..","..","infra","terraform","terraform.tfstate"),ga(t,"..","..","infra","terraform","terraform.tfstate")]}function wa(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function YP(e){let t=zP(e.intervalMs)??OT,r=Math.max(1,Math.trunc(e.limit??500)),n=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function zP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function $T(e){let t=e.tokenPath??RT(LT(),".lmctl","cli-tokens.json"),r=kT(e.tokenPath);if(oT(r.cognito?.idToken)&&ku()!==null)try{await gT({region:e.region,clientId:e.cognitoClientId??Ta,cliTokensPath:t}),r=kT(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let ee=A instanceof Error?A.message:String(A);e.log?.(`[mx-mailbox] device-auth refresh failed: ${ee}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await IT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=bT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new ST({region:e.region,credentials:a}),c={ListObjectsV2Command:qP,GetObjectCommand:BP,PutObjectCommand:HP},d=Ls(n),u=d??i,f=e.deviceId,m=wn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,_;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)_=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${_??"(sentinel)"} for user_id=${u}`);else{let ee=!1,W=0;for(;!ee&&W<2;){W+=1;try{let k=Po(m,"web"),N=0,L;do{let F=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of F.Contents??[]){let C=Fo(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=F.IsTruncated===!0?F.NextContinuationToken:void 0}while(L!==void 0);_=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),ee=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&W===1&&eF(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),QP(t),o=!1,i=await IT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=bT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new ST({region:e.region,credentials:a}),m=wn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:_??null,last_processed_at:new Date().toISOString()})}}let g=null,h=e.terminalSessionManager,y=e.persistentSessionManager,T=e.promptTriggerStore,b=new pa,I=new Fr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>b.record(A),onMessage:async A=>{if(h!==void 0&&gu(A.payload)){h.onInbound(A.payload);return}if(y!==void 0&&yu(A.payload)){await y.onInbound(A.payload);return}if(!Eu(A.payload)){if(T!==void 0&&Tu(A.payload)){xu({store:T,payload:A.payload,log:e.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},..._!==void 0?{cursor:_}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Rs({client:I,...e.log!==void 0?{log:e.log}:{}}),h!==void 0&&h.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),y!==void 0&&y.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:wu,payload:A});I.start();let H=e.chatLogTailStore===void 0?void 0:YP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??OT,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let me=e.deviceId??i,U=`${u}/usage/`,M;return M=e.usageStore===void 0?void 0:zE({meter:b,store:e.usageStore,userId:u,deviceId:me,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:ee,ceilingUsd:W})=>{e.log?.(`[usage] month ${A} cost $${ee.toFixed(4)} >= ceiling $${W} \u2014 blocking mailbox`),I.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(A,ee)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${U}${me}-${A}.json`,Body:JSON.stringify({...ee,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let ee={put:0,get:0,list:0},W;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:U,MaxKeys:1e3,...W!==void 0?{ContinuationToken:W}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let F=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:L}));if(F.Body===void 0)continue;let j=JSON.parse(await F.Body.transformToString("utf-8"));ee.put+=j.put??0,ee.get+=j.get??0,ee.list+=j.list??0}catch{}}W=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(W!==void 0);return ee},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){H?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function CT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ma(e.rootDir),r=wn({identityId:$s,userId:$s,deviceId:vT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Fr({bucket:"local",identityId:$s,userId:$s,deviceId:vT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&gu(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&yu(c.payload)){await i.onInbound(c.payload);return}if(!Eu(c.payload)){if(o!==void 0&&Tu(c.payload)){xu({store:o,payload:c.payload,log:e.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??ya,readIntervalMs:e.readIntervalMs??ya,heartbeatIdleMs:e.heartbeatIdleMs??ya,backoffReadIntervalMs:e.backoffReadIntervalMs??ya});n=new Rs({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:wu,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:$s,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function kT(e){let t=e??RT(LT(),".lmctl","cli-tokens.json");try{let r=Ea(t,"utf8");return JSON.parse(r)}catch{return{}}}function ZP(e,t){if(t===void 0||t==="")return;let r={};try{let s=Ea(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};xT(Au(e),{recursive:!0,mode:448}),AT(e,JSON.stringify(n,null,2));try{NT(e,384)}catch{}}function QP(e){let t={};try{let n=Ea(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,xT(Au(e),{recursive:!0,mode:448}),AT(e,JSON.stringify(r,null,2));try{NT(e,384)}catch{}}async function IT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new UP({region:e.region}).send(new WP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{ZP(e.tokenPath,r.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${e.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function eF(e){if(e===null||typeof e!="object")return!1;let t=e,r=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof t.message=="string"?t.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var OT,ya,Ta,JP,XP,GP,$s,vT,Ru=E(()=>{"use strict";qo();fu();hu();ZE();eT();tT();rT();nT();bu();Uo();Su();Nu();TT();OT=3e3,ya=1e3,Ta="79u5jhkk46qofog661c9i0bdcs",JP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",XP="us-east-1_4iUdFggDn",GP="lmctl-next-preview-mailbox-254332045686";$s="local",vT="local"});import{spawn as Cu}from"node:child_process";import{createInterface as MT}from"node:readline";var Lu,Ou,$u,jT,DT=E(()=>{"use strict";gi();pe();Lu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,r){this.ctx=r;let n=Cu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=MT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.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"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2153
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var we,XD,GD,ca,ht=E(()=>{"use strict";zt();Ot();we=class extends Error{constructor(t){super(t),this.name="ChatTargetError"}},XD=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,GD=/^ses_[A-Za-z0-9_-]+$/,ca=/^[A-Za-z][A-Za-z0-9_-]*$/});function da(e){return YD.has(e)}function iu(){return su===null&&(su=bt(vt())),su}function ou(e,t,r={}){if(!da(e))return null;try{let n=iu().getAdapter?.(e);if(n===void 0)return null;let s=n.resumeCommand(t).trim();if(s.length===0)return null;let i=s.split(/\s+/),o=e==="codex"&&r.isLead===!0?pi({warn:()=>{}}):[],a=r.model!==void 0&&r.model.trim().length>0?KD[e]?.(r.model):void 0;return r.model!==void 0&&r.model.trim().length>0&&a===void 0&&r.onModelIgnored?.({provider:e,model:r.model,reason:`${e} terminal resume does not implement per-session model selection`}),[...i,...a??[],...o,...LE[e]??[]]}catch{return null}}function ua(e,t,r={}){let n=ou(e,t,r);return n===null?null:n.join(" ")}function Ye(e,t){return iu().getSession(e,t)}async function kn(e){return(await iu().resolveSessions(e)).map(r=>r.provider.name)}var LE,KD,YD,OE,su,yr=E(()=>{"use strict";It();wl();LE={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[],lmplayer:[]},KD={claude:e=>["--model",e],codex:e=>["--model",e],gemini:e=>["--model",e],opencode:e=>["--model",e],qwen:e=>["--model",e],agy:e=>["--model",e],lmplayer:e=>["--model",e]},YD=new Set(Object.keys(LE)),OE=/^[\w.:-]+$/;su=null});function zD(e=process.env){let t=e.LMCTL_SESSION_IDLE_TIMEOUT_MS;if(t===void 0||t.trim()==="")return $E;let r=Number(t);return!Number.isFinite(r)||r<=0?$E:r}async function ZD(e,t,r){try{let n=$e(t,r,e),s=n.sessionid;if(typeof s!="string"||s.trim()===""||s===".")return null;let i;if(typeof n.provider=="string"&&n.provider.trim()!=="")i=n.provider;else{let c=await kn(s);if(c.length!==1)return null;i=c[0]}let o=await Ye(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 fa(e,t,r,n,s){if(!t.busy||t.reason!=="in-flight")return!1;let i=s??zD(),o=await ZD(e,r,n),a=o!==null&&o>=i;return a&&P({event:"session_idle_reclaim",receiver_teamfile:r,receiver_alias:n,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 $E,au=E(()=>{"use strict";me();yr();ht();$E=36e5});function QD(e=process.env){let t=e.LMCTL_DAEMON_MAILBOX_RELAY_MAX_BATCHES;if(t===void 0||t.trim()==="")return CE;let r=Number(t);return!Number.isFinite(r)||r<=0?CE:Math.max(1,Math.trunc(r))}async function jE(e){let t=e.env??process.env,r=e.maxBatches??QD(t),n=oP(e.dal),s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};iP(e.dal,t);let i=new Set;for(;s.scanned<r;){let o=e.dal.listRelayMailboxLanes(r).find(l=>!i.has(ME(l)));if(o===void 0)break;i.add(ME(o)),s.scanned+=1;let a=await eP(e.dal,n,t,o);s.delivered+=a.delivered,s.skipped_busy+=a.skipped_busy,s.skipped_terminal+=a.skipped_terminal,s.errors+=a.errors}return s}function ME(e){return JSON.stringify([e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias])}async function eP(e,t,r,n){let s={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},i=Yt(e,n.receiver_teamfile,n.receiver_alias),o=!1;if(i.busy){if(!await fa(e,i,n.receiver_teamfile,n.receiver_alias))return i.reason==="terminal-held"?{...s,skipped_terminal:1}:{...s,skipped_busy:1};o=!0}let a=null;try{let l=$e(n.receiver_teamfile,n.receiver_alias,e),c=_r(e,{receiver_teamfile:n.receiver_teamfile,receiver_alias:n.receiver_alias,sender_teamfile:n.sender_teamfile,sender_alias:n.sender_alias,ttlMs:hr(),...o?{force:!0}:{}});if(!c.acquired)return{...s,skipped_busy:1};if(a=c.lease,n.message_type==="response"){let u=await lE({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:r});return nP(u)}let d=await sa({sender:{teamfile:n.sender_teamfile,alias:n.sender_alias},receiver:{teamfile:n.receiver_teamfile,alias:n.receiver_alias,provider:l.provider,sessionId:l.sessionid,cwd:l.sessiondir,...l.model!==void 0?{model:l.model}:{},...l.effort!==void 0?{effort:l.effort}:{},...l.isLead!==void 0?{isLead:l.isLead}:{}},io:t,permissionMode:"yolo",env:r,finalize:"caller"});return rP(e,d)}catch(l){return tP(e,n,`relay delivery error: ${l instanceof Error?l.message:String(l)}`)}finally{if(a!==null)try{e.releaseAgentInflight(a)}catch{}}}function tP(e,t,r){let n={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0};try{let s=t.message_type==="response"?e.listEnqueuedResponseMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias):e.listEnqueuedRequestMailFromSender(t.sender_teamfile,t.sender_alias,t.receiver_teamfile,t.receiver_alias),i=t.message_type==="response"?e.markMailDelivered(s.map(o=>o.id),r,new Date().toISOString()):e.markRelayRequestDeliveredAndEnqueueResponses(s,r,new Date().toISOString()).marked;return{...n,delivered:i,errors:1}}catch{return{...n,errors:1}}}function rP(e,t){let r={scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},n=sP(t),s=new Date().toISOString(),{marked:i}=e.markRelayRequestDeliveredAndEnqueueResponses(t.queued,n,s);return{...r,delivered:i,errors:t.status==="ok"?0:1}}function nP(e){return{...{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0},delivered:e.deliveredIds.length,errors:e.status==="ok"?0:1}}function sP(e){return e.status==="ok"?e.receipt:e.status==="stalled"?`relay delivery error: provider stalled${e.stalledAfterMs!==void 0?` after ${e.stalledAfterMs}ms`:""}
2154
+ ${e.receipt}`:`relay delivery error: ${e.error}`}function iP(e,t){let r=t.LMCTL_MAILBOX_DELIVERY_STALE_MS,n=r===void 0||r.trim()===""?NaN:Number(r),s=Number.isFinite(n)&&n>0?n:8*60*60*1e3;e.reclaimStaleMailboxDeliveries(new Date(Date.now()-s).toISOString())}function oP(e){return{stdout:{write:()=>{}},stderr:{write:()=>{}},dal:e}}var CE,DE=E(()=>{"use strict";Ur();Zd();ia();ht();au();CE=10});function As(){let e=process.env.LMCTL_DAEMON_INTERVAL_MS;if(e===void 0||e.trim().length===0)return 5e3;let t=Number(e);return Number.isFinite(t)&&t>0?t:5e3}function lP(e=process.env){let t=e.LMCTL_DAEMON_FEATURES;if(t===void 0)return new Set(["mailbox-relay"]);if(t.trim()==="")return new Set;let r=new Set;for(let n of t.split(",")){let s=n.trim();if(s!==""){if(s==="all")return new Set(PE);aP.has(s)&&r.add(s)}}return r}function FE(e){let t=e.intervalMs??As(),r=e.runOnceFn??Pr,n=new Set(e.features??lP()),s={running:e.autoStart!==!1,in_flight:!1,interval_ms:t,enabled_features:[...n].sort(),cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null,last_mailbox_relay_scanned:0,last_mailbox_relay_delivered:0,last_mailbox_relay_errors:0},i=null,o=null,a=null,l=null,c=null;n.has("rollup-updater")&&e.startRollupUpdaterFn!==!1&&(c=(e.startRollupUpdaterFn??Kw)(e.dal));let d=m=>{s.running&&(i=setTimeout(()=>{f.runCycle().finally(()=>d(t))},m))},u=m=>{s.running&&(o=setTimeout(()=>{l===null&&(l=UE(e.dal,n,e.monitorSessionActivityFn??kc,t,s).finally(()=>{l=null})),l.finally(()=>u(Ic(e.dal,t)))},m))},f={state:s,runCycle:async()=>(a!==null||(a=cP(e.dal,r,e.collectSessionSizesFn??y_,e.scanIntakeFn??mo,e.monitorSessionActivityFn??kc,e.mailboxRelayFn??jE,e.worker_id??"daemon",t,n,s).finally(()=>{a=null})),a),stop:async()=>{s.running=!1,i!==null&&clearTimeout(i),o!==null&&clearTimeout(o),c?.stop(),a!==null&&await a.catch(()=>{}),l!==null&&await l.catch(()=>{})}};if(s.running){let m=e.firstDelayMs??5e3;d(m),n.has("session-monitor")&&u(m)}return f}async function cP(e,t,r,n,s,i,o,a,l,c){c.in_flight=!0,c.last_started_at=new Date().toISOString(),c.last_error=null;let d=[],u=0,f=0,m=[],p=null,h=dP();try{if(l.has("durable-memory-policies")&&ky({dal:e}),l.has("drift-detectors")&&Zw({dal:e}),l.has("intake")&&(m=await n(e)),l.has("job-worker"))for(;;){let g=await t({dal:e,worker_id:o,lease_ms:6e5});if(g===null)break;d.push(g)}if(l.has("mailbox-relay")&&(h=await i({dal:e})),l.has("session-size")){let g=await r(e);u=g.recorded,f=g.failed}l.has("session-monitor")&&(p=await UE(e,l,s,a,c))}catch(g){c.last_error=g instanceof Error?g.message:String(g);try{e.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:c.last_error})})}catch{}}finally{c.in_flight=!1,c.cycles+=1,c.last_jobs_processed=d.length,c.last_session_sizes_recorded=u,c.last_session_size_failures=f,c.last_intake_scanned=m.reduce((g,_)=>g+_.scanned,0),c.last_intake_new_jobs=m.reduce((g,_)=>g+_.new_jobs,0),c.last_intake_failures=m.filter(g=>g.error!==void 0).length,c.last_session_hung_detected=p?.hung_detected??0,c.last_mailbox_relay_scanned=h.scanned,c.last_mailbox_relay_delivered=h.delivered,c.last_mailbox_relay_errors=h.errors,c.jobs_processed+=d.length,c.last_finished_at=new Date().toISOString()}return{jobs_processed:d.length,outcomes:d,session_sizes_recorded:u,session_size_failures:f,intake:m,session_monitor:p,mailbox_relay:h}}function dP(){return{scanned:0,delivered:0,skipped_busy:0,skipped_terminal:0,errors:0}}async function UE(e,t,r,n,s){if(!t.has("session-monitor"))return null;let i=Ic(e,n),o=Date.now();if(s.last_session_monitor_checked_at!==null){let a=Date.parse(s.last_session_monitor_checked_at);if(Number.isFinite(a)&&o-a<i)return null}s.last_session_monitor_checked_at=new Date(o).toISOString(),s.last_session_monitor_error=null;try{return await r({dal:e,nowMs:o})}catch(a){s.last_session_monitor_error=a instanceof Error?a.message:String(a);try{e.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:s.last_session_monitor_error})})}catch{}return null}}var PE,aP,lu=E(()=>{"use strict";Yc();Mo();Nd();Fi();Yw();Qw();Nc();DE();PE=["durable-memory-policies","drift-detectors","intake","job-worker","mailbox-relay","session-size","session-monitor","rollup-updater"],aP=new Set(PE)});function WE(e){let t=e.listMembersInState("in_chat");for(let r of t)e.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return t.length}var BE=E(()=>{"use strict"});import{mkdirSync as uP,readFileSync as fP,readdirSync as mP,statSync as pP,writeFileSync as _P}from"node:fs";import{dirname as hP,join as HE,sep as qE}from"node:path";function ma(e){return{s3:{async send(n){let s=n;switch(s._localfsTag){case JE:return gP(e,s.input);case XE:return yP(e,s.input);case GE:return wP(e,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:uu,GetObjectCommand:du,PutObjectCommand:cu}}}function gP(e,t){let r=VE(e,t.Key);return uP(hP(r),{recursive:!0}),_P(r,t.Body),{}}function yP(e,t){let r=VE(e,t.Key),n;try{n=fP(r)}catch(i){throw i.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):i}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function wP(e,t){let r=t.Prefix??"";KE(r);let s=EP(e).sort((d,u)=>d.key<u.key?-1:d.key>u.key?1:0).filter(d=>d.key.startsWith(r)),i=t.ContinuationToken;i!==void 0&&i!==""&&(s=s.filter(d=>d.key>i));let o=typeof t.MaxKeys=="number"&&Number.isFinite(t.MaxKeys)&&t.MaxKeys>0?Math.floor(t.MaxKeys):void 0,a=s,l=!1;o!==void 0&&s.length>o&&(a=s.slice(0,o),l=!0);let c={Contents:a.map(d=>({Key:d.key,LastModified:d.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function VE(e,t){return KE(t),HE(e,t)}function KE(e){if(e.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${e}`)}function EP(e){let t=[],r=(n,s)=>{let i;try{i=mP(n,{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=HE(n,o.name);if(o.isDirectory())r(l,a);else if(o.isFile()){let c=qE==="/"?a:a.split(qE).join("/");t.push({key:c,lastModified:pP(l).mtime})}}};return r(e,""),t}var JE,XE,GE,cu,du,uu,fu=E(()=>{"use strict";JE="localfs-put",XE="localfs-get",GE="localfs-list",cu=class{input;_localfsTag=JE;constructor(t){this.input=t}},du=class{input;_localfsTag=XE;constructor(t){this.input=t}},uu=class{input;_localfsTag=GE;constructor(t){this.input=t}}});function YE(){return{put:0,get:0,list:0}}function mu(e,t=TP){return e.put*t.putUsd+e.get*t.getUsd+e.list*t.listUsd}function pu(e){let t=new Date(e),r=t.getUTCFullYear(),n=String(t.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var TP,pa,_u=E(()=>{"use strict";TP={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};pa=class{counts=YE();record(t,r=1){this.counts[t]+=r}peek(){return{...this.counts}}drain(){let t={...this.counts};return this.counts=YE(),t}estimateCostUsd(t){return mu(this.counts,t)}}});function zE(e){let t=e.now??Date.now,r=e.timers??bP,n=null,s=null;async function i(){let l=t(),c=pu(l),d=e.meter.drain();(d.put>0||d.get>0||d.list>0)&&e.store.addUsage({user_id:e.userId,device_id:e.deviceId,period:c,put:d.put,get:d.get,list:d.list,updated_at:new Date(l).toISOString()});let u=e.store.loadUsage(e.userId,e.deviceId,c),f=u?{put:u.put_count,get:u.get_count,list:u.list_count}:{put:0,get:0,list:0};if(e.publishOwnRollup!==void 0)try{await e.publishOwnRollup(c,f)}catch(h){e.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(e.readUserTotal!==void 0)try{m=await e.readUserTotal(c)}catch(h){e.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=mu(m);if(n!==c&&p>=e.ceilingUsd){n=c,e.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${e.ceilingUsd}`);try{e.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:e.ceilingUsd})}catch(h){e.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function o(){return s=(s??Promise.resolve()).then(()=>i()).catch(()=>{}),s}let a=r.setInterval(()=>{o()},e.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return o()},isOverQuota(){return n!==null&&n===pu(t())}}}var bP,ZE=E(()=>{"use strict";_u();bP={setInterval:(e,t)=>setInterval(e,t),clearInterval:e=>clearInterval(e)}});var hu=E(()=>{"use strict";Uo();Bo();Bo()});function SP(e){if(typeof e!="object"||e===null||Array.isArray(e))return null;let t=e;if(typeof t.message_id!="string"||t.message_id==="")return null;if(typeof t.reply_to=="string"&&t.reply_to!==""){let s=t.response;if(typeof s!="object"||s===null)return null;let i=s;return typeof i.status!="number"?null:{message_id:t.message_id,reply_to:t.reply_to,response:i}}let r=t.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:t.message_id,request:n}}function vP(e){return e.reply_to!==void 0&&e.response!==void 0}function kP(e){if(typeof e!="object"||e===null)return;let t=e.conversation_id;return typeof t=="string"?t:void 0}function QE(e){let t=e.reason;if(t!==void 0)return t;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var _a,Rs,eT=E(()=>{"use strict";hu();_a=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(t="MailboxFetchClient stopped before a response arrived"){super(t)}},Rs=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(t){this.client=t.client,this.log=t.log??(()=>{}),this.now=t.now??Date.now,this.random=t.random??Math.random}onRequest(t){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=t}async fetch(t,r){if(this.stopped)throw new _a("MailboxFetchClient.fetch after stop()");if(typeof t.path!="string"||t.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=t.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Kt(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let i=r?.conversationId??s,o={message_id:s,request:t};return new Promise((a,l)=>{let c=r?.abortSignal,d;if(c!==void 0){if(c.aborted){l(QE(c));return}d=()=>{this.pending.has(s)&&(this.pending.delete(s),l(QE(c)))},c.addEventListener("abort",d,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...d!==void 0?{abortListener:d}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:i,payload:o}).catch(u=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(u))})})}async stop(){if(this.stopped)return;this.stopped=!0;let t=Array.from(this.pending.values());this.pending.clear();let r=new _a;for(let n of t){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(t,r){let n=SP(t);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(vP(n)){let l=this.pending.get(n.reply_to);if(l===void 0){this.log(`MailboxFetchClient: dropping response for unknown reply_to=${n.reply_to}`);return}this.pending.delete(n.reply_to),l.abortListener!==void 0&&l.abortSignal!==void 0&&l.abortSignal.removeEventListener("abort",l.abortListener),l.resolve(n.response);return}if(this.requestHandler===null){this.log(`MailboxFetchClient: no handler registered; dropping request message_id=${n.message_id}`);return}let s=r?.conversation_id??kP(t)??n.message_id,i;try{i=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),d=typeof l.code=="string"?l.code:"INTERNAL_ERROR";i={status:500,headers:{"content-type":"application/json"},body:{error:d,message:c}}}let a={message_id:Kt(this.now(),this.random),reply_to:n.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=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function gu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;return!(t.kind!=="terminal"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.data!="string"||typeof t.ts!="number")}var tT=E(()=>{"use strict"});function yu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="provider"||typeof t.session_id!="string"||t.session_id===""||t.direction!=="agent_to_user"&&t.direction!=="user_to_agent"||typeof t.ts!="number")return!1;if(t.direction==="agent_to_user"){if(!Array.isArray(t.events))return!1;for(let r of t.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof t.user_input!="string")return!1;return!0}var rT=E(()=>{"use strict"});function Eu(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=e;if(t.kind!=="daemon_event"||typeof t.event!="string"||t.event===""||typeof t.ts!="number")return!1;if(t.event==="workflows"){if(!Array.isArray(t.workflows))return!1;for(let r of t.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(t.event==="chat_log"){if(typeof t.entry!="object"||t.entry===null||Array.isArray(t.entry))return!1;let r=t.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||r.sender_teamfile!==null&&(typeof r.sender_teamfile!="string"||r.sender_teamfile==="")||r.sender_alias!==null&&(typeof r.sender_alias!="string"||r.sender_alias==="")||typeof r.receiver_teamfile!="string"||r.receiver_teamfile===""||typeof r.receiver_alias!="string"||r.receiver_alias===""||typeof r.message!="string"||r.response!==null&&typeof r.response!="string"||typeof r.status!="string"||r.status===""||typeof r.created_at!="string"||r.created_at==="")return!1}return!0}var wu,nT=E(()=>{"use strict";wu="daemon:events"});function iT(e){return{kind:"prompt",prompt_id:e.prompt_id??Kt(e.now?.()??Date.now(),e.random??Math.random),root_teamfile:e.root_teamfile,text:e.text}}function Tu(e){if(e===null||typeof e!="object")return!1;let t=e;return t.kind==="prompt"&&typeof t.prompt_id=="string"&&t.prompt_id.length>0&&typeof t.root_teamfile=="string"&&t.root_teamfile.length>0&&typeof t.text=="string"}var sT,bu=E(()=>{"use strict";hu();sT="prompt:root"});function Ls(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(aT(t[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function IP(e){let t=e.split(".");if(t.length<2||t[1]===void 0||t[1]==="")return null;try{let r=JSON.parse(aT(t[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function oT(e,t=60){if(typeof e!="string"||e==="")return!0;let r=IP(e);return r===null?!0:Date.now()/1e3>=r-t}function aT(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),r=t.padEnd(Math.ceil(t.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var Su=E(()=>{"use strict"});async function ha(e){let t=e.fetchImpl??fetch,r=`https://cognito-idp.${e.region}.amazonaws.com/`,n=await t(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":NP},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:e.clientId,AuthParameters:{REFRESH_TOKEN:e.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let 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 NP,vu=E(()=>{"use strict";NP="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as lT,mkdirSync as cT,readFileSync as dT,writeFileSync as uT}from"node:fs";import{homedir as fT}from"node:os";import{dirname as mT,join as pT}from"node:path";function Os(){return process.env.LMCTL_DEVICE_AUTH_PATH??pT(fT(),".lmctl","device-auth.json")}function _T(){return process.env.LMCTL_TOKEN_PATH??pT(fT(),".lmctl","cli-tokens.json")}function ku(e=Os()){try{let t=JSON.parse(dT(e,"utf8"));return typeof t.userId!="string"||t.userId===""||typeof t.refreshToken!="string"||t.refreshToken===""?null:{userId:t.userId,refreshToken:t.refreshToken}}catch{return null}}function hT(e,t=Os()){cT(mT(t),{recursive:!0,mode:448}),uT(t,JSON.stringify(e,null,2));try{lT(t,384)}catch{}}function Iu(e,t=_T()){let r={};try{r=JSON.parse(dT(t,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=e.idToken,e.accessToken!==void 0&&(n.accessToken=e.accessToken),e.refreshToken!==void 0&&(n.refreshToken=e.refreshToken),e.expiresAt!==void 0&&(n.expiresAt=e.expiresAt);let s={...r,cognito:n};cT(mT(t),{recursive:!0,mode:448}),uT(t,JSON.stringify(s,null,2));try{lT(t,384)}catch{}}async function gT(e){let t=e.deviceAuthPath??Os(),r=ku(t);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await ha({region:e.region,clientId:e.clientId,refreshToken:r.refreshToken,...e.fetchImpl!==void 0?{fetchImpl:e.fetchImpl}:{}});return Iu({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},e.cliTokensPath??_T()),{idToken:n.idToken,userId:r.userId}}var Nu=E(()=>{"use strict";vu()});import{existsSync as xP,realpathSync as AP}from"node:fs";import{dirname as RP}from"node:path";function xu(e){LP(e).catch(t=>{e.log?.(`[mailbox] prompt trigger failed: ${t instanceof Error?t.message:String(t)}`)})}async function LP(e){let t=e.payload.root_teamfile;try{t=AP(e.payload.root_teamfile)}catch(s){let i=`prompt root missing/unreadable: ${e.payload.root_teamfile}: ${s instanceof Error?s.message:String(s)}`;return In({rootTeamfile:e.payload.root_teamfile,receiverTeamfile:e.payload.root_teamfile,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"root_unavailable"}),e.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(e.store.getRootTeam(t)===null){let s=`prompt root is not registered: ${t}`;return In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"root_unregistered"}),e.log?.(`[mailbox] ${s}`),{status:"error",response:null,error_detail:s}}let r=$P(t);if("error"in r)return In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:"Lead",message:e.payload.text,promptId:e.payload.prompt_id,detail:r.error,reason:"root_invalid"}),e.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n=_r(e.store,{receiver_teamfile:t,receiver_alias:r.alias,sender_teamfile:`prompt:${e.payload.prompt_id}`,sender_alias:"operator",ttlMs:DP(e.env??process.env)});if(!n.acquired){let s=jP(r.alias,n.current);return In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:s,reason:"unavailable"}),e.log?.(`[mailbox] prompt rejected: ${s}`),{status:"error",response:null,error_detail:s}}try{let i=await(e.chat??kt)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:e.payload.text,env:e.env??process.env,alias:r.alias,permissionMode:"yolo",...e.timeoutMs!==void 0?{timeoutMs:e.timeoutMs}:{}}),o=i.status==="stalled",a=!o&&i.text.trim()==="",l=o?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:a?"provider returned empty response":null,c=o||a?"error":"ok";return c==="ok"?await CP(e.store,{rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,response:i.text,status:c,error_detail:null,log:e.log}):In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:l??"provider failed",reason:o?"stalled":"empty_response"}),{status:c,response:c==="error"?null:i.text,error_detail:l}}catch(s){let i=s instanceof Error?s.message:String(s);return In({rootTeamfile:t,receiverTeamfile:t,receiverAlias:r.alias,message:e.payload.text,promptId:e.payload.prompt_id,detail:i,reason:"provider_error"}),e.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{e.store.releaseAgentInflight(n.lease)}catch(s){e.log?.(`[mailbox] failed to release prompt in-flight slot: ${s instanceof Error?s.message:String(s)}`)}}}function In(e){P({event:"prompt_trigger_error",reason:e.reason,prompt_id:e.promptId,root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,error_detail:e.detail,message_preview:OP(e.message)})}function OP(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function $P(e){if(!xP(e))return{error:`prompt root missing/unreadable: ${e}`};let t=Fe(e);if(t.parseErrors.length>0)return{error:`prompt root parse error: ${t.parseErrors.join("; ")}`};let r=Lt(t);return r===void 0?{error:`prompt root has no Lead: ${e}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${e}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??RP(e)}}async function CP(e,t){let r=ET(t.message),n=t.response===null?null:ET(t.response);try{e.insertTeamChatLog({root_teamfile:t.rootTeamfile,sender_teamfile:t.rootTeamfile,sender_alias:"operator",receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,message:r.text,response:n?.text??null,origin:"unknown",status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){t.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function ET(e){return e.length<=yT?{text:e,truncated:!1}:{text:e.slice(0,yT),truncated:!0}}function MP(e,t){return`${e} is servicing ${t.sender_alias} (${t.sender_teamfile}) since ${t.started_at}`}function jP(e,t){return t.sender_teamfile.startsWith("prompt:")?`${e} is busy servicing another prompt since ${t.started_at}`:MP(e,t)}function DP(e=process.env){let t=e.LMCTL_INFLIGHT_TTL_MS;if(t===void 0||t.trim()==="")return wT;let r=Number(t);return!Number.isFinite(r)||r<=0?wT:r}var yT,wT,TT=E(()=>{"use strict";It();zt();me();Ur();yT=256*1024,wT=30*60*1e3});import{chmodSync as NT,existsSync as PP,mkdirSync as xT,readFileSync as Ea,writeFileSync as AT}from"node:fs";import{dirname as Au,resolve as ga,join as RT}from"node:path";import{fileURLToPath as FP}from"node:url";import{homedir as LT}from"node:os";import{CognitoIdentityClient as UP,GetIdCommand as WP}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as bT}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as BP,ListObjectsV2Command as qP,PutObjectCommand as HP,S3Client as ST}from"@aws-sdk/client-s3";function Cs(e={}){let t=e.env??process.env,r=e.tfstatePath!==void 0?[e.tfstatePath]:KP(e.selfUrl),n={},s;for(let I of r)if(PP(I)){n=VP(I),s=I;break}let i=(...I)=>{for(let x of I)if(typeof x=="string"&&x!=="")return x},o=i(t.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??JP,a=i(t.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??XP,l=i(t.LMCTL_NEXT_MAILBOX_BUCKET,t.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??GP,c=i(t.AWS_REGION,t.AWS_DEFAULT_REGION)??"us-east-1",d=i(t.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??Ta,u=[];o===void 0&&u.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&u.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&u.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:u,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(u.length>0)return f;let m=t.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=wa(t.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=wa(t.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=wa(t.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),y=wa(t.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),T=i(t.LMCTL_MAILBOX_KEY),b=i(t.LMCTL_TOKEN_PATH);return f.config={identityPoolId:o,cognitoUserPoolId:a,cognitoClientId:d,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...y!==void 0?{chatLogPollIntervalMs:y}:{},...T!==void 0?{mailboxKey:T}:{},...b!==void 0?{tokenPath:b}:{}},f}function VP(e){try{let t=Ea(e,"utf8"),n=JSON.parse(t).outputs??{},s={};for(let[i,o]of Object.entries(n))o!==null&&typeof o=="object"&&typeof o.value=="string"&&(s[i]=o.value);return s}catch{return{}}}function KP(e){let t=Au(FP(e??import.meta.url));return[ga(t,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(t,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(t,"..","..","..","infra","terraform","terraform.tfstate"),ga(t,"..","..","infra","terraform","terraform.tfstate")]}function wa(e){if(e===void 0||e==="")return;let t=Number(e);if(!(!Number.isFinite(t)||t<=0))return t*1e3}function YP(e){let t=zP(e.intervalMs)??OT,r=Math.max(1,Math.trunc(e.limit??500)),n=e.now??Date.now,s=e.cursorKey!==void 0&&e.store.loadTeamChatLogCursor!==void 0&&e.store.saveTeamChatLogCursor!==void 0?{key:e.cursorKey,load:e.store.loadTeamChatLogCursor.bind(e.store),save:e.store.saveTeamChatLogCursor.bind(e.store)}:null,i,o=!1,a=!1,l=()=>{try{if(s!==null){let u=s.load(s.key);if(u!==null)return i=u.last_pushed_id,!0}return i=e.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:i,updated_at:new Date(n()).toISOString()}),!0}catch(u){return e.log?.(`[mailbox] daemon_event chat_log seed failed: ${u instanceof Error?u.message:String(u)}`),!1}};l();let c=async()=>{if(!(a||o)){o=!0;try{if(i===void 0&&!l())return;let u=e.store.listTeamChatLogSinceId(i,r);for(let f of u){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await e.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),i=Math.max(i,f.id)}}catch(u){e.log?.(`[mailbox] daemon_event chat_log tail failed: ${u instanceof Error?u.message:String(u)}`)}finally{o=!1}}},d=setInterval(()=>{c()},t);return typeof d.unref=="function"&&d.unref(),{pollNow:c,stop(){a=!0,clearInterval(d)}}}function zP(e){return typeof e=="number"&&Number.isFinite(e)&&e>0?e:void 0}async function $T(e){let t=e.tokenPath??RT(LT(),".lmctl","cli-tokens.json"),r=kT(e.tokenPath);if(oT(r.cognito?.idToken)&&ku()!==null)try{await gT({region:e.region,clientId:e.cognitoClientId??Ta,cliTokensPath:t}),r=kT(e.tokenPath),e.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(A){let ee=A instanceof Error?A.message:String(A);e.log?.(`[mx-mailbox] device-auth refresh failed: ${ee}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${e.region}.amazonaws.com/${e.cognitoUserPoolId}`,i=r.cognito.identityId,o=!1;i===void 0||i===""?i=await IT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}):(o=!0,e.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${i}`));let a=bT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new ST({region:e.region,credentials:a}),c={ListObjectsV2Command:qP,GetObjectCommand:BP,PutObjectCommand:HP},d=Ls(n),u=d??i,f=e.deviceId,m=wn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey}),p=e.cursorStore,h;if(p!==void 0){let A=p.loadMailboxCursor(u,m);if(A!==null)h=A.last_processed_seq??void 0,e.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${u}`);else{let ee=!1,B=0;for(;!ee&&B<2;){B+=1;try{let k=Po(m,"web"),N=0,L;do{let W=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:k,MaxKeys:1e3,...L!==void 0?{ContinuationToken:L}:{}}));for(let j of W.Contents??[]){let C=Fo(j.Key??"",m,"web");C!==void 0&&C>N&&(N=C)}L=W.IsTruncated===!0?W.NextContinuationToken:void 0}while(L!==void 0);h=N,e.log?.(`[mx-mailbox] cold start: seeded seq cursor=${N} for user_id=${u}`),ee=!0}catch(k){let N=k instanceof Error?k.message:String(k);if(o&&B===1&&eF(k)){e.log?.(`[mx-mailbox] cached identityId rejected by cognito (${N}); clearing + refreshing`),QP(t),o=!1,i=await IT({tokenPath:t,region:e.region,identityPoolId:e.identityPoolId,idpProvider:s,idToken:n,log:e.log}),a=bT({identityId:i,logins:{[s]:n},clientConfig:{region:e.region}}),l=new ST({region:e.region,credentials:a}),m=wn({identityId:i,userId:d,deviceId:f,mailboxKey:e.mailboxKey});continue}e.log?.(`[mx-mailbox] cold start seq probe failed: ${N}`);break}}p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=e.terminalSessionManager,y=e.persistentSessionManager,T=e.promptTriggerStore,b=new pa,I=new Fr({bucket:e.mailboxBucket,identityId:i,...d!==null?{userId:d}:{},...f!==void 0?{deviceId:f}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:A=>b.record(A),onMessage:async A=>{if(_!==void 0&&gu(A.payload)){_.onInbound(A.payload);return}if(y!==void 0&&yu(A.payload)){await y.onInbound(A.payload);return}if(!Eu(A.payload)){if(T!==void 0&&Tu(A.payload)){xu({store:T,payload:A.payload,log:e.log});return}g!==null&&await g.handleIncoming(A.payload,A)}},...p!==void 0?{onCursorAdvance:A=>{p.saveMailboxCursor({user_id:u,mailbox_key:m,last_processed_version_id:null,last_processed_seq:A,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...e.pollIntervalMs!==void 0?{pollIntervalMs:e.pollIntervalMs}:{},...e.readIntervalMs!==void 0?{readIntervalMs:e.readIntervalMs}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleMs:e.heartbeatIdleMs}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:e.backoffReadIntervalMs}:{}});g=new Rs({client:I,...e.log!==void 0?{log:e.log}:{}}),_!==void 0&&_.setPublish(async A=>I.putMessage({conversation_id:`terminal:${A.session_id}`,payload:A})),y!==void 0&&y.setPublish(async A=>I.putMessage({conversation_id:`provider:${A.session_id}`,payload:A}));let x=A=>I.putMessage({conversation_id:wu,payload:A});I.start();let H=e.chatLogTailStore===void 0?void 0:YP({store:e.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:e.chatLogPollIntervalMs??e.readIntervalMs??e.pollIntervalMs??OT,log:e.log});e.log?.(`[mx-mailbox] agent polling ${m} (bucket=${e.mailboxBucket})`);let pe=e.deviceId??i,U=`${u}/usage/`,M;return M=e.usageStore===void 0?void 0:zE({meter:b,store:e.usageStore,userId:u,deviceId:pe,ceilingUsd:e.usageQuotaUsd??1/0,onQuotaExceeded:({period:A,costUsd:ee,ceilingUsd:B})=>{e.log?.(`[usage] month ${A} cost $${ee.toFixed(4)} >= ceiling $${B} \u2014 blocking mailbox`),I.stop().catch(()=>{}),M?.stop()},publishOwnRollup:async(A,ee)=>{await l.send(new c.PutObjectCommand({Bucket:e.mailboxBucket,Key:`${U}${pe}-${A}.json`,Body:JSON.stringify({...ee,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async A=>{let ee={put:0,get:0,list:0},B;do{let k=await l.send(new c.ListObjectsV2Command({Bucket:e.mailboxBucket,Prefix:U,MaxKeys:1e3,...B!==void 0?{ContinuationToken:B}:{}}));for(let N of k.Contents??[]){let L=N.Key??"";if(L.endsWith(`-${A}.json`))try{let W=await l.send(new c.GetObjectCommand({Bucket:e.mailboxBucket,Key:L}));if(W.Body===void 0)continue;let j=JSON.parse(await W.Body.transformToString("utf-8"));ee.put+=j.put??0,ee.get+=j.get??0,ee.list+=j.list??0}catch{}}B=k.IsTruncated===!0?k.NextContinuationToken:void 0}while(B!==void 0);return ee},intervalMs:e.usageFlushIntervalMs??36e5,...e.log!==void 0?{log:e.log}:{}}),{identityId:i,mailbox:I,fetchClient:g,publishDaemonEvent:x,async stop(){H?.stop(),M!==void 0&&(await M.flushNow().catch(()=>{}),M.stop()),await g.stop().catch(()=>{}),await I.stop().catch(()=>{})}}}async function CT(e){let t=e.s3!==void 0&&e.commands!==void 0?{s3:e.s3,commands:e.commands}:ma(e.rootDir),r=wn({identityId:$s,userId:$s,deviceId:vT}),n=null,s=e.terminalSessionManager,i=e.persistentSessionManager,o=e.promptTriggerStore,a=new Fr({bucket:"local",identityId:$s,userId:$s,deviceId:vT,s3:t.s3,commands:t.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&gu(c.payload)){s.onInbound(c.payload);return}if(i!==void 0&&yu(c.payload)){await i.onInbound(c.payload);return}if(!Eu(c.payload)){if(o!==void 0&&Tu(c.payload)){xu({store:o,payload:c.payload,log:e.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:e.pollIntervalMs??ya,readIntervalMs:e.readIntervalMs??ya,heartbeatIdleMs:e.heartbeatIdleMs??ya,backoffReadIntervalMs:e.backoffReadIntervalMs??ya});n=new Rs({client:a,...e.log!==void 0?{log:e.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),i!==void 0&&i.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:wu,payload:c});return a.start(),e.log?.(`[local-webui] agent polling ${r} (local-fs ${e.rootDir})`),{identityId:$s,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function kT(e){let t=e??RT(LT(),".lmctl","cli-tokens.json");try{let r=Ea(t,"utf8");return JSON.parse(r)}catch{return{}}}function ZP(e,t){if(t===void 0||t==="")return;let r={};try{let s=Ea(e,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:t}};xT(Au(e),{recursive:!0,mode:448}),AT(e,JSON.stringify(n,null,2));try{NT(e,384)}catch{}}function QP(e){let t={};try{let n=Ea(e,"utf8");t=JSON.parse(n)}catch{return}if(t.cognito===void 0)return;let r={...t,cognito:{...t.cognito}};delete r.cognito.identityId,xT(Au(e),{recursive:!0,mode:448}),AT(e,JSON.stringify(r,null,2));try{NT(e,384)}catch{}}async function IT(e){e.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new UP({region:e.region}).send(new WP({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{ZP(e.tokenPath,r.IdentityId),e.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${e.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);e.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function eF(e){if(e===null||typeof e!="object")return!1;let t=e,r=[typeof t.name=="string"?t.name:void 0,typeof t.Code=="string"?t.Code:void 0,typeof t.__type=="string"?t.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof t.message=="string"?t.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var OT,ya,Ta,JP,XP,GP,$s,vT,Ru=E(()=>{"use strict";qo();fu();_u();ZE();eT();tT();rT();nT();bu();Uo();Su();Nu();TT();OT=3e3,ya=1e3,Ta="79u5jhkk46qofog661c9i0bdcs",JP="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",XP="us-east-1_4iUdFggDn",GP="lmctl-next-preview-mailbox-254332045686";$s="local",vT="local"});import{spawn as Cu}from"node:child_process";import{createInterface as MT}from"node:readline";var Lu,Ou,$u,jT,DT=E(()=>{"use strict";gi();me();Lu=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(t){this.threadId=t}async start(t,r){this.ctx=r;let n=Cu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=MT({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.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"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}else{let i=(await this.rpc("thread/start",{cwd:t.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,o=typeof i?.id=="string"?i.id:void 0;this.threadId=o,r.emit({event_type:"thread_started",payload:{thread_id:o,resumed:!1}})}return n}async sendTurn(t){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:t}]})).result?.turn,i=typeof s?.id=="string"?s.id:void 0;if(i!==void 0){let o=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),o!==void 0&&this.ctx?.turnMap.set(i,o)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2155
2155
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
2156
2156
  `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let o=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let a=r.error,l=typeof a?.message=="string"&&a.message!==""?a.message:JSON.stringify(r.error);o.reject(new Error(`codex_rpc_error: ${l}`))}else o.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},i=this.normalizeNotification(n,s);i!==void 0&&this.ctx?.emit(i)}normalizeNotification(t,r){if(t==="thread/started"){let n=r.thread;return typeof n?.id=="string"&&(this.threadId=n.id),{event_type:"thread_started",payload:{thread_id:this.threadId,raw:r}}}if(t==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(t==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(t==="item/started"||t==="item/completed"){let n=r.item;return n?.type!==void 0&&n.type!=="agentMessage"&&n.type!=="userMessage"?{event_type:"tool_call",payload:{name:n.name??n.type,status:t==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:t,params:r}}}if(t==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(t==="error"){let n=r.error;return{event_type:"error",payload:{message:typeof n?.message=="string"?n.message:JSON.stringify(r),raw:r}}}return{event_type:"notification",payload:{method:t,params:r}}}},Ou=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(t,r){this.ctx=r;let n=Cu(t.command,t.args,{cwd:t.cwd??process.cwd(),env:t.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=i;let o=this.buffer.split(`
2157
2157
  `);this.buffer=o.pop()??"";for(let a of o)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let i=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:i}})}),n}async sendTurn(t){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:t}});try{this.child.stdin.write(n+`
2158
- `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let i=r.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(n==="result"){let s=typeof r.session_id=="string"?r.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:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},$u=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{_i(n)}catch(a){q({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Cu(t.command,t.args,{cwd:n,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=MT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(t){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:t}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2158
+ `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let i=r.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(n==="result"){let s=typeof r.session_id=="string"?r.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:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},$u=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(t,r){this.ctx=r;let n=t.cwd??process.cwd();if(t.provider==="opencode")try{hi(n)}catch(a){P({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Cu(t.command,t.args,{cwd:n,env:t.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=MT({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let o=(await this.rpc("session/new",{cwd:t.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof o?.sessionId=="string"?o.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:o}}),s}async sendTurn(t){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:t}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let t of this.pending.values())t.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(t,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let i=this.nextRpcId++;this.pending.set(i,{resolve:n,reject:s});let o=JSON.stringify({jsonrpc:"2.0",id:i,method:t,params:r});try{this.child.stdin.write(o+`
2159
2159
  `)}catch(a){this.pending.delete(i),s(a instanceof Error?a:new Error(String(a)))}})}notify(t,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:t,params:r});try{this.child.stdin.write(n+`
2160
2160
  `)}catch{}}handleLine(t){if(t.trim()==="")return;let r;try{r=JSON.parse(t)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let i=r.error,o=typeof i?.message=="string"&&i.message!==""?i.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${o}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
2161
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,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:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},jT=e=>{switch(e){case"codex":return new Lu;case"claude":case"qwen":return new Ou;case"gemini":case"copilot":case"opencode":return new $u;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as tF}from"node:crypto";import{existsSync as c6,mkdirSync as rF,readFileSync as nF,writeFileSync as sF}from"node:fs";import{homedir as iF}from"node:os";import{dirname as oF,join as aF}from"node:path";function ba(){return process.env.LMCTL_DEVICE_FILE??aF(iF(),".lmctl","device.json")}function qr(e=ba()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(nF(e,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Mu(e=ba()){let t=qr(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:tF(),created_at:new Date().toISOString()};return rF(oF(e),{recursive:!0}),sF(e,`${JSON.stringify(r,null,2)}
2161
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,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:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},jT=e=>{switch(e){case"codex":return new Lu;case"claude":case"qwen":return new Ou;case"gemini":case"copilot":case"opencode":return new $u;default:throw new Error(`no_persistent_adapter_for_provider: ${e}`)}}});import{randomUUID as tF}from"node:crypto";import{existsSync as d6,mkdirSync as rF,readFileSync as nF,writeFileSync as sF}from"node:fs";import{homedir as iF}from"node:os";import{dirname as oF,join as aF}from"node:path";function ba(){return process.env.LMCTL_DEVICE_FILE??aF(iF(),".lmctl","device.json")}function qr(e=ba()){let t=process.env.LMCTL_DEVICE_ID;if(t!==void 0&&t!=="")return{device_id:t,created_at:"env"};try{let r=JSON.parse(nF(e,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Mu(e=ba()){let t=qr(e);if(t!==null&&t.created_at!=="env")return t;let r={device_id:tF(),created_at:new Date().toISOString()};return rF(oF(e),{recursive:!0}),sF(e,`${JSON.stringify(r,null,2)}
2162
2162
  `,{encoding:"utf8",mode:384}),r}var ju=E(()=>{"use strict"});import{mkdirSync as lF,readFileSync as PT,rmSync as cF,writeFileSync as dF}from"node:fs";import{dirname as FT,join as uF}from"node:path";function $t(e=Z()){return uF(FT(e),"serve.pid")}function UT(e,t){let r=$t(t);return lF(FT(r),{recursive:!0}),dF(r,`${JSON.stringify(e,null,2)}
2163
- `,"utf-8"),r}function Du(e){let t=$t(e),r;try{r=PT(t,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function Nn(e){cF($t(e),{force:!0})}function Sa(e){let t=fF(e),r=Du(e);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:t};switch(Cm(r.pid,r.startToken??null)){case"same":return{entry:r,running:!0,stale:!1,corrupt:!1};case"different":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:r,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function fF(e){let t=$t(e),r;try{r=PT(t,"utf-8")}catch{return!1}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0}catch{return!0}}function WT(){return ll(process.pid)}var BT=E(()=>{"use strict";Vn();Be()});var eb={};Ee(eb,{_resetStdoutEpipeGuardForTests:()=>wF,bootstrapAgentRestMailbox:()=>KT,installStdoutEpipeGuard:()=>JT,publishRegisteredWorkflowsOnStart:()=>VT,resolveLocalMailboxDir:()=>ZT,resolveLocalWebuiDir:()=>zT,resolveServeConfig:()=>YT,runServe:()=>gF,runServeStatus:()=>XT,runServeStop:()=>GT,validateServeArgs:()=>QT});import{randomBytes as mF}from"node:crypto";import{existsSync as pF}from"node:fs";import{homedir as hF}from"node:os";import{isAbsolute as HT,resolve as Pu}from"node:path";async function gF(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(_F),0;let r=e[0];return r==="status"?XT(e.slice(1),t):r==="stop"?GT(e.slice(1),t):r!=="start"?(t.stderr.write(r===void 0?qT:`error: unknown serve subcommand: ${r}
2163
+ `,"utf-8"),r}function Du(e){let t=$t(e),r;try{r=PT(t,"utf-8")}catch{return null}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0?null:{pid:n.pid,startedAt:typeof n.startedAt=="string"?n.startedAt:"unknown",port:Number.isInteger(n.port)?n.port:0,bind:typeof n.bind=="string"?n.bind:"unknown",dbPath:typeof n.dbPath=="string"?n.dbPath:"unknown",startToken:typeof n.startToken=="string"?n.startToken:null}}catch{return null}}function Nn(e){cF($t(e),{force:!0})}function Sa(e){let t=fF(e),r=Du(e);if(r===null)return{entry:null,running:!1,stale:!1,corrupt:t};switch(Cm(r.pid,r.startToken??null)){case"same":return{entry:r,running:!0,stale:!1,corrupt:!1};case"different":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"pid-reused"};case"gone":return{entry:r,running:!1,stale:!0,corrupt:!1,staleReason:"process-gone"};case"unverified":default:return{entry:r,running:!0,stale:!1,corrupt:!1,unverified:!0}}}function fF(e){let t=$t(e),r;try{r=PT(t,"utf-8")}catch{return!1}try{let n=JSON.parse(r);return!Number.isInteger(n.pid)||(n.pid??0)<=0}catch{return!0}}function WT(){return ll(process.pid)}var BT=E(()=>{"use strict";Vn();Be()});var eb={};Ee(eb,{_resetStdoutEpipeGuardForTests:()=>wF,bootstrapAgentRestMailbox:()=>KT,installStdoutEpipeGuard:()=>JT,publishRegisteredWorkflowsOnStart:()=>VT,resolveLocalMailboxDir:()=>ZT,resolveLocalWebuiDir:()=>zT,resolveServeConfig:()=>YT,runServe:()=>gF,runServeStatus:()=>XT,runServeStop:()=>GT,validateServeArgs:()=>QT});import{randomBytes as mF}from"node:crypto";import{existsSync as pF}from"node:fs";import{homedir as _F}from"node:os";import{isAbsolute as HT,resolve as Pu}from"node:path";async function gF(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(hF),0;let r=e[0];return r==="status"?XT(e.slice(1),t):r==="stop"?GT(e.slice(1),t):r!=="start"?(t.stderr.write(r===void 0?qT:`error: unknown serve subcommand: ${r}
2164
2164
 
2165
2165
  ${qT.replace(/^error: [^\n]*\n\n/,"")}`),2):yF(e.slice(1),t)}async function yF(e,t){let r=QT(e,process.env);if(typeof r=="string")return t.stderr.write(`error: ${r}
2166
2166
  `),2;let n=ke({path:Z()}),s={portCli:xF(e)},i;try{i=YT({dal:n,cli:s,env:process.env,parsed:r,io:t})}catch(b){return n.close(),t.stderr.write(`error: ${b instanceof Error?b.message:String(b)}
@@ -2168,7 +2168,7 @@ ${qT.replace(/^error: [^\n]*\n\n/,"")}`),2):yF(e.slice(1),t)}async function yF(e
2168
2168
  `)}let a=r.noDaemon?void 0:FE({dal:n,intervalMs:As()}),l=o!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Cs({env:process.env});l.missing.length>0&&t.stderr.write(`[lmctl-next-agent] mailbox transport not configured: missing ${l.missing.join(", ")}; running without cloud sync`+(l.tfstatePathUsed===void 0?` (no terraform.tfstate found; checked ${l.tfstateCandidatesChecked.length} candidate path${l.tfstateCandidatesChecked.length===1?"":"s"})`:` (terraform.tfstate at ${l.tfstatePathUsed} did not supply the missing fields)`)+`
2169
2169
  `);let c=await NF({log:b=>t.stderr.write(`${b}
2170
2170
  `)}),d=new Vo({adapterFactory:jT,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:b=>t.stderr.write(`${b}
2171
- `)}),u=qr()?.device_id,f=Jw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:kF(l.config,u)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{},authDisabled:r.insecureNoAuth}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,_=Number.isFinite(p)&&p>0?p:void 0,g=await KT({dal:n,app:f,io:t,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,..._!==void 0?{usageQuotaUsd:_}:{},...u!==void 0?{deviceId:u}:{}},...o!==void 0?{localMailbox:{rootDir:o.rootDir,s3:o.s3,commands:o.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d});await VT({dal:n,mailbox:g.mailbox,io:t});let{serve:h}=await import("@hono/node-server"),y=await new Promise((b,I)=>{let x,H=me=>I(me);x=h({fetch:f.fetch,port:i.port,hostname:r.bind},()=>{x.removeListener?.("error",H),b(x)}),x.once("error",H)}).catch(async b=>(a!==void 0&&await a.stop().catch(()=>{}),await g.stop().catch(()=>{}),c!==void 0&&await c.stop().catch(()=>{}),await d.stop().catch(()=>{}),n.close(),t.stderr.write(`error: could not bind ${r.bind}:${i.port}: ${b instanceof Error?b.message:String(b)}
2171
+ `)}),u=qr()?.device_id,f=Jw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:kF(l.config,u)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d,...o!==void 0?{localWebui:{webuiDir:o.webuiDir,localMailbox:{s3:o.s3,commands:o.commands}}}:{},authDisabled:r.insecureNoAuth}),m=process.env.LMCTL_USAGE_QUOTA_USD,p=m!==void 0&&m!==""?Number(m):NaN,h=Number.isFinite(p)&&p>0?p:void 0,g=await KT({dal:n,app:f,io:t,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...u!==void 0?{deviceId:u}:{}},...o!==void 0?{localMailbox:{rootDir:o.rootDir,s3:o.s3,commands:o.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:d});await VT({dal:n,mailbox:g.mailbox,io:t});let{serve:_}=await import("@hono/node-server"),y=await new Promise((b,I)=>{let x,H=pe=>I(pe);x=_({fetch:f.fetch,port:i.port,hostname:r.bind},()=>{x.removeListener?.("error",H),b(x)}),x.once("error",H)}).catch(async b=>(a!==void 0&&await a.stop().catch(()=>{}),await g.stop().catch(()=>{}),c!==void 0&&await c.stop().catch(()=>{}),await d.stop().catch(()=>{}),n.close(),t.stderr.write(`error: could not bind ${r.bind}:${i.port}: ${b instanceof Error?b.message:String(b)}
2172
2172
  `),null));if(y===null)return 2;t.stdout.write(`listening on ${r.bind}:${i.port}
2173
2173
  `);let T=Z();try{let b=Sa(T);b.running&&b.entry!==null&&b.entry.pid!==process.pid&&t.stderr.write(`note: replacing pidfile for a still-running daemon (pid ${b.entry.pid}, port ${b.entry.port}); \`lmctl serve stop\` will now target pid ${process.pid}
2174
2174
  `);let I=UT({pid:process.pid,startedAt:new Date().toISOString(),port:i.port,bind:r.bind,dbPath:T,startToken:WT()},T);t.stdout.write(`pidfile ${I} (pid ${process.pid})
@@ -2208,12 +2208,12 @@ ${qT.replace(/^error: [^\n]*\n\n/,"")}`),2):yF(e.slice(1),t)}async function yF(e
2208
2208
  `),1}function kF(e,t){return{identityPoolId:e.identityPoolId,cognitoUserPoolId:e.cognitoUserPoolId,cognitoRegion:e.region,mailboxBucket:e.mailboxBucket,workspaceFetchMode:"mailbox",...t!==void 0?{deviceId:t}:{},...e.mailboxKey!==void 0?{mailboxKey:e.mailboxKey}:{},mailboxPolling:{...e.readIntervalMs!==void 0?{readIntervalSeconds:e.readIntervalMs/1e3}:{},...e.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:e.heartbeatIdleMs/1e3}:{},...e.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:e.backoffReadIntervalMs/1e3}:{}}}}async function VT(e){if(e.mailbox===void 0)return;let t={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:e.dal.listRootTeams().map(r=>({teamfile_path:r.teamfile_path,name:r.name,registered_at:r.registered_at,last_seeded_at:r.last_seeded_at}))};try{await e.mailbox.publishDaemonEvent(t)}catch(r){e.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
2209
2209
  `)}}async function KT(e){let t;if(e.mailbox!==void 0||e.localMailbox!==void 0)try{t=e.localMailbox!==void 0?await CT({...e.localMailbox,log:r=>e.io?.stderr.write(`${r}
2210
2210
  `),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}):await $T({...e.mailbox,log:r=>e.io?.stderr.write(`${r}
2211
- `),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}),t.fetchClient.onRequest(v_({app:e.app,log:r=>e.io?.stderr.write(`${r}
2211
+ `),...e.terminalSessionManager!==void 0?{terminalSessionManager:e.terminalSessionManager}:{},...e.persistentSessionManager!==void 0?{persistentSessionManager:e.persistentSessionManager}:{}}),t.fetchClient.onRequest(vh({app:e.app,log:r=>e.io?.stderr.write(`${r}
2212
2212
  `)})),e.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${t.identityId})
2213
2213
  `)}catch(r){let n=r instanceof Error?r.message:String(r);e.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
2214
2214
  `)}return{...t!==void 0?{mailbox:t}:{},async stop(){t!==void 0&&await t.stop()}}}function YT(e){let{dal:t,cli:r,env:n,parsed:s,io:i}=e,o=[],a,l=t.getConfig("api.port");if(r.portCli!==void 0)a=r.portCli;else if(l!==null){let m=Number(l);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid api.port in lmctl_config: ${l}`);a=m}else if(n.LMCTL_API_PORT!==void 0&&n.LMCTL_API_PORT.length>0){let m=Number(n.LMCTL_API_PORT);if(!Number.isInteger(m)||m<=0||m>65535)throw new Error(`invalid LMCTL_API_PORT: ${n.LMCTL_API_PORT}`);a=m,o.push("api.port")}else a=s.port;let c,d=t.getConfig("api.token");n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,d===null?o.push("api.token"):d!==c&&i.stderr.write(`note: LMCTL_API_TOKEN env var overrides lmctl_config api.token for this serve process.
2215
2215
  `)):d!==null?c=d:(c=mF(32).toString("hex"),t.setConfig("api.token",c),i.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let u,f=t.getConfig("api.url");f!==null?u=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(u=n.LMCTL_API_URL,o.push("api.url")):(u=`http://127.0.0.1:${a}`,t.setConfig("api.url",u));for(let m of o)i.stderr.write(`note: ${IF(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
2216
- `);return{port:a,apiUrl:u,apiToken:c}}function IF(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function NF(e){let t;try{t=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);e.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new Go({pty:{spawn:t.spawn.bind(t)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:e.log})}function zT(e,t){let r=e!==void 0&&e!==""?e:t.LMCTL_LOCAL_WEBUI_DIR!==void 0&&t.LMCTL_LOCAL_WEBUI_DIR!==""?t.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=HT(r)?r:Pu(process.cwd(),r);return pF(`${n}/index.html`)?n:null}function ZT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?HT(t)?t:Pu(process.cwd(),t):Pu(hF(),".lmctl","local-mailbox")}function xF(e){for(let t=0;t<e.length;t+=1)if(e[t]==="--port"){let r=e[t+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function QT(e,t=process.env){let r=AF(e);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!t.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN or pass --insecure-no-auth":r}function AF(e){let t={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--port"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;t.port=i;continue}if(n==="--bind"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";t.bind=s;continue}if(n==="--no-daemon"){t.noDaemon=!0;continue}if(n==="--insecure-no-auth"){t.insecureNoAuth=!0;continue}if(n==="--webui"){let s=e[r+1];s!==void 0&&!s.startsWith("--")?(t.localWebui={dir:s},r+=1):t.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return t}var _F,qT,Fu,TF,SF,vF,tb=E(()=>{"use strict";Qe();Vw();lu();BE();Zc();Ru();fu();Wd();Bd();DT();ju();Be();Vn();Cc();BT();_F=`usage: lmctl serve <start|status|stop> [options]
2216
+ `);return{port:a,apiUrl:u,apiToken:c}}function IF(e){switch(e){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${e.replaceAll(".","_").toUpperCase()}`}}async function NF(e){let t;try{t=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);e.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new Go({pty:{spawn:t.spawn.bind(t)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:e.log})}function zT(e,t){let r=e!==void 0&&e!==""?e:t.LMCTL_LOCAL_WEBUI_DIR!==void 0&&t.LMCTL_LOCAL_WEBUI_DIR!==""?t.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=HT(r)?r:Pu(process.cwd(),r);return pF(`${n}/index.html`)?n:null}function ZT(e){let t=e.LMCTL_LOCAL_MAILBOX_DIR;return t!==void 0&&t!==""?HT(t)?t:Pu(process.cwd(),t):Pu(_F(),".lmctl","local-mailbox")}function xF(e){for(let t=0;t<e.length;t+=1)if(e[t]==="--port"){let r=e[t+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function QT(e,t=process.env){let r=AF(e);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!t.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN or pass --insecure-no-auth":r}function AF(e){let t={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<e.length;r+=1){let n=e[r];if(n==="--port"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let i=Number(s);if(!Number.isInteger(i)||i<=0||i>65535)return`invalid --port: ${s}`;t.port=i;continue}if(n==="--bind"){let s=e[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";t.bind=s;continue}if(n==="--no-daemon"){t.noDaemon=!0;continue}if(n==="--insecure-no-auth"){t.insecureNoAuth=!0;continue}if(n==="--webui"){let s=e[r+1];s!==void 0&&!s.startsWith("--")?(t.localWebui={dir:s},r+=1):t.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return t}var hF,qT,Fu,TF,SF,vF,tb=E(()=>{"use strict";Qe();Vw();lu();BE();Zc();Ru();fu();Wd();Bd();DT();ju();Be();Vn();Cc();BT();hF=`usage: lmctl serve <start|status|stop> [options]
2217
2217
 
2218
2218
  Manage the local lmctl daemon: HTTP API, web UI, queue daemon, terminal
2219
2219
  manager, and agent services. A subcommand is REQUIRED \u2014 bare \`lmctl serve\`
@@ -2269,18 +2269,18 @@ unauthenticated daemon.
2269
2269
 
2270
2270
  Run 'lmctl serve --help' for details.
2271
2271
  `;Fu=!1;TF=2e3;SF=100,vF=1e4});import{existsSync as RF,mkdirSync as LF,readFileSync as OF,renameSync as $F,unlinkSync as CF,writeFileSync as MF}from"node:fs";import{homedir as nb}from"node:os";import{dirname as Ms,join as gt,resolve as jF}from"node:path";function Ln(e,t,r){let n=Ms(jF(r)),s=new Set,i=new Map;for(let o of t.members){if(s.add(o.provider),o.teamfile!==void 0)continue;let a=o.sessiondir??n,l=i.get(a)??new Set;l.add(o.provider),i.set(a,l)}for(let[o,a]of i.entries())wr(gt(o,".mcp.json"),"mcpServers",[xn(),An()]),a.has("opencode")&&wr(gt(o,".opencode","opencode.json"),"mcp",[ob(),ab()]);for(let o of s)UF(o)}function ib(e=sb??nb()){return gt(e,".copilot","mcp-config.json")}function PF(e,t){st.mkdirSync(Ms(e),{recursive:!0});let r=gt(Ms(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{st.writeFileSync(r,`${JSON.stringify(t,null,2)}
2272
- `,"utf8"),st.renameSync(r,e)}catch(n){try{st.unlinkSync(r)}catch{}throw n}}function FF(e,t){st.mkdirSync(Ms(e),{recursive:!0});let r=gt(Ms(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{st.writeFileSync(r,t,"utf8"),st.renameSync(r,e)}catch(n){try{st.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!st.existsSync(e))return;let n=JSON.parse(st.readFileSync(e,"utf8"));if(!Rn(n)||!Rn(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,PF(e,n),q({event:"mcp_cleanup",path:e,removed:i})}catch{}}function xn(){return{name:ka,shouldRemove:VF}}function ob(){return{name:ka,shouldRemove:KF}}function An(){return{name:va,shouldRemove:XF}}function ab(){return{name:va,shouldRemove:GF}}function UF(e){let t=sb??nb();switch(e){case"copilot":wr(ib(t),"mcpServers",[xn(),An()]);return;case"claude":wr(gt(t,".claude.json"),"mcpServers",[xn(),An()]);return;case"gemini":wr(gt(t,".gemini","settings.json"),"mcpServers",[xn(),An()]);return;case"qwen":wr(gt(t,".qwen","settings.json"),"mcpServers",[xn(),An()]);return;case"agy":wr(gt(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[xn(),An()]);return;case"opencode":wr(gt(t,".config","opencode","opencode.json"),"mcp",[ob(),ab()]);return;case"codex":WF(gt(t,".codex","config.toml"));return;default:return}}function WF(e){try{if(!st.existsSync(e))return;let t=st.readFileSync(e,"utf8"),r=BF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=lb(l);if(c===null)return;if(c!==void 0){if(rb(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=HF(l);if(d===null)return;if(d!==void 0&&rb(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;FF(e,s.join(`
2273
- `)),q({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function rb(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function BF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=lb(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=qF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==va&&c[1]!==ka)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=cb(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=JF(l);if(u===null)return null;d.args=u}t.set(c[1],d)}let n=new Set;for(let[s,i]of t.entries())s===va&&ub(i.command,i.args)&&n.add(s),s===ka&&fb(i.command,i.args)&&n.add(s);return n}function qF(e,t){if(e.startsWith("mcp_servers"))return Ia(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let r=Ia(e);return r===null?null:[...t,...r]}function lb(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:Ia(t[1])}function HF(e){let t=e.indexOf("=");if(t<0)return;let r=e.slice(0,t).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Ia(r)}function Ia(e){let t=[],r=0,n=()=>{for(;r<e.length&&/\s/.test(e[r]);)r+=1};for(;r<e.length;){if(n(),r>=e.length)return null;if(e[r]==='"'){r+=1;let s="",i=!1;for(;r<e.length;){let o=e[r];if(o==="\\"){if(r+1>=e.length)return null;s+=e[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;t.push(s)}else{let s=r;for(;r<e.length&&/[A-Za-z0-9_-]/.test(e[r]);)r+=1;if(r===s)return null;t.push(e.slice(s,r))}if(n(),r>=e.length)break;if(e[r]!==".")return null;r+=1}return t.length>0?t:null}function cb(e){let t=db(e).trim();if(t.startsWith('"'))try{let r=JSON.parse(t);return typeof r=="string"?r:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function JF(e){let t=db(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let r=t.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>cb(s.trim()));return n.some(s=>s===null)?null:n}function db(e){let t;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==void 0){if(t==='"'&&n==="\\"){r+=1;continue}n===t&&(t=void 0);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function XF(e){return Rn(e)?e.type==="stdio"&&typeof e.command=="string"&&ub(e.command,e.args):!1}function GF(e){return!Rn(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&pb(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&mb(e.command[0],[e.command[1],e.command[2]])}function VF(e){return Rn(e)?e.type==="stdio"&&fb(e.command,e.args):!1}function KF(e){return!Rn(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&hb(e.command[0])&&e.command[1]==="mcp"}function ub(e,t){return pb(e)&&_b(t)||mb(e,t)}function fb(e,t){return hb(e)&&_b(t)}function mb(e,t){return YF(e)&&Array.isArray(t)&&t.length===2&&zF(t[0])&&t[1]==="mcp"}function pb(e){return typeof e=="string"&&Uu(e)==="lmctl"}function hb(e){return typeof e=="string"&&Uu(e)==="lmctl0"}function YF(e){if(typeof e!="string")return!1;let t=Uu(e).toLowerCase();return t==="node"||t==="node.exe"}function zF(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function Uu(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function _b(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function Rn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var va,ka,DF,st,sb,js=E(()=>{"use strict";pe();va="lmctl",ka="lmctl0",DF={existsSync:RF,mkdirSync:LF,readFileSync:OF,writeFileSync:MF,renameSync:$F,unlinkSync:CF},st=DF});function wb(e){let t=gb(e.registry,e.fromTeamfile);if(t===void 0)return On(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!yb(t,e.fromAlias))return On(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=gb(e.registry,e.toTeamfile);return r===void 0?On(`target team is not registered in policy graph: ${e.toTeamfile}`):yb(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?On(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?On(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:On(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function gb(e,t){return e.teams.find(r=>r.teamfile===t)}function yb(e,t){return e.aliases.some(r=>r===t)}function On(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var Eb=E(()=>{"use strict"});import{randomUUID as ZF}from"node:crypto";import{hostname as Tb,networkInterfaces as QF}from"node:os";function bb(e){let t=(e.now??new Date).toISOString();return{lock_id:ZF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??Tb(),holder_ips:e.ips??s1(),started_at:t,last_heartbeat:t}}function Sb(e=process.env){return vb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,e1)}function r1(e=process.env){return vb(e.LMCTL_TERMINAL_LOCK_STALE_MS,t1)}function Wu(e,t={}){let r=t.now??new Date,n=t.localHost??Tb(),s=t.staleMs??r1();if(e.holder_host===n)return(t.isProcessAlive??n1)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(e.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Bu(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function vb(e,t){if(e===void 0||e.trim()==="")return t;let r=e.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?t:n}function n1(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}function s1(){let e=new Set;for(let t of Object.values(QF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var e1,t1,qu=E(()=>{"use strict";e1=15e3,t1=12e4});function i1(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2272
+ `,"utf8"),st.renameSync(r,e)}catch(n){try{st.unlinkSync(r)}catch{}throw n}}function FF(e,t){st.mkdirSync(Ms(e),{recursive:!0});let r=gt(Ms(e),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{st.writeFileSync(r,t,"utf8"),st.renameSync(r,e)}catch(n){try{st.unlinkSync(r)}catch{}throw n}}function wr(e,t,r){try{if(!st.existsSync(e))return;let n=JSON.parse(st.readFileSync(e,"utf8"));if(!Rn(n)||!Rn(n[t]))return;let s={...n[t]},i=[];for(let{name:o,shouldRemove:a}of r)Object.prototype.hasOwnProperty.call(s,o)&&a(s[o])&&(delete s[o],i.push(o));if(i.length===0)return;n[t]=s,PF(e,n),P({event:"mcp_cleanup",path:e,removed:i})}catch{}}function xn(){return{name:ka,shouldRemove:VF}}function ob(){return{name:ka,shouldRemove:KF}}function An(){return{name:va,shouldRemove:XF}}function ab(){return{name:va,shouldRemove:GF}}function UF(e){let t=sb??nb();switch(e){case"copilot":wr(ib(t),"mcpServers",[xn(),An()]);return;case"claude":wr(gt(t,".claude.json"),"mcpServers",[xn(),An()]);return;case"gemini":wr(gt(t,".gemini","settings.json"),"mcpServers",[xn(),An()]);return;case"qwen":wr(gt(t,".qwen","settings.json"),"mcpServers",[xn(),An()]);return;case"agy":wr(gt(t,".gemini","antigravity-cli","settings.json"),"mcpServers",[xn(),An()]);return;case"opencode":wr(gt(t,".config","opencode","opencode.json"),"mcp",[ob(),ab()]);return;case"codex":WF(gt(t,".codex","config.toml"));return;default:return}}function WF(e){try{if(!st.existsSync(e))return;let t=st.readFileSync(e,"utf8"),r=BF(t);if(r===null)return;let n=t.split(/\n/),s=[],i=new Set,o=!1,a;for(let l of n){let c=lb(l);if(c===null)return;if(c!==void 0){if(rb(c,r)){o=!0,a=c[1],i.add(a);continue}o=!1,a=void 0,s.push(l);continue}if(o){if(/^\s*(?:#.*)?$/.test(l)){s.push(l);continue}a!==void 0&&i.add(a);continue}let d=HF(l);if(d===null)return;if(d!==void 0&&rb(d,r)){i.add(d[1]);continue}s.push(l)}if(i.size===0)return;FF(e,s.join(`
2273
+ `)),P({event:"mcp_cleanup",path:e,removed:[...i]})}catch{}}function rb(e,t){return e.length<2||e[0]!=="mcp_servers"?!1:t.has(e[1])}function BF(e){let t=new Map,r;for(let s of e.split(/\n/)){let i=lb(s);if(i===null)return null;if(i!==void 0){r=i;continue}let o=s.indexOf("=");if(o<0)continue;let a=s.slice(0,o).trim(),l=s.slice(o+1).trim(),c=qF(a,r);if(c===null)return null;if(c===void 0||c.length!==3||c[0]!=="mcp_servers"||c[1]!==va&&c[1]!==ka)continue;let d=t.get(c[1])??{};if(c[2]==="command"){let u=cb(l);if(u===null)return null;d.command=u}else if(c[2]==="args"){let u=JF(l);if(u===null)return null;d.args=u}t.set(c[1],d)}let n=new Set;for(let[s,i]of t.entries())s===va&&ub(i.command,i.args)&&n.add(s),s===ka&&fb(i.command,i.args)&&n.add(s);return n}function qF(e,t){if(e.startsWith("mcp_servers"))return Ia(e);if(t===void 0||t.length<2||t[0]!=="mcp_servers")return;let r=Ia(e);return r===null?null:[...t,...r]}function lb(e){if(!/^\s*\[/.test(e))return;let t=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(e);return t===null?null:Ia(t[1])}function HF(e){let t=e.indexOf("=");if(t<0)return;let r=e.slice(0,t).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Ia(r)}function Ia(e){let t=[],r=0,n=()=>{for(;r<e.length&&/\s/.test(e[r]);)r+=1};for(;r<e.length;){if(n(),r>=e.length)return null;if(e[r]==='"'){r+=1;let s="",i=!1;for(;r<e.length;){let o=e[r];if(o==="\\"){if(r+1>=e.length)return null;s+=e[r+1],r+=2;continue}if(o==='"'){r+=1,i=!0;break}s+=o,r+=1}if(!i)return null;t.push(s)}else{let s=r;for(;r<e.length&&/[A-Za-z0-9_-]/.test(e[r]);)r+=1;if(r===s)return null;t.push(e.slice(s,r))}if(n(),r>=e.length)break;if(e[r]!==".")return null;r+=1}return t.length>0?t:null}function cb(e){let t=db(e).trim();if(t.startsWith('"'))try{let r=JSON.parse(t);return typeof r=="string"?r:null}catch{return null}return t.startsWith("'")&&t.endsWith("'")&&t.length>=2?t.slice(1,-1):null}function JF(e){let t=db(e).trim();if(!t.startsWith("[")||!t.endsWith("]"))return null;let r=t.slice(1,-1).trim();if(r.length===0)return[];let n=r.split(",").map(s=>cb(s.trim()));return n.some(s=>s===null)?null:n}function db(e){let t;for(let r=0;r<e.length;r+=1){let n=e[r];if(t!==void 0){if(t==='"'&&n==="\\"){r+=1;continue}n===t&&(t=void 0);continue}if(n==='"'||n==="'"){t=n;continue}if(n==="#")return e.slice(0,r)}return e}function XF(e){return Rn(e)?e.type==="stdio"&&typeof e.command=="string"&&ub(e.command,e.args):!1}function GF(e){return!Rn(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&pb(e.command[0])&&e.command[1]==="mcp"||e.command.length===3&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&typeof e.command[2]=="string"&&mb(e.command[0],[e.command[1],e.command[2]])}function VF(e){return Rn(e)?e.type==="stdio"&&fb(e.command,e.args):!1}function KF(e){return!Rn(e)||!Array.isArray(e.command)?!1:e.command.length===2&&typeof e.command[0]=="string"&&typeof e.command[1]=="string"&&_b(e.command[0])&&e.command[1]==="mcp"}function ub(e,t){return pb(e)&&hb(t)||mb(e,t)}function fb(e,t){return _b(e)&&hb(t)}function mb(e,t){return YF(e)&&Array.isArray(t)&&t.length===2&&zF(t[0])&&t[1]==="mcp"}function pb(e){return typeof e=="string"&&Uu(e)==="lmctl"}function _b(e){return typeof e=="string"&&Uu(e)==="lmctl0"}function YF(e){if(typeof e!="string")return!1;let t=Uu(e).toLowerCase();return t==="node"||t==="node.exe"}function zF(e){if(typeof e!="string")return!1;let t=e.replace(/\\/g,"/");return t==="lmctl-cli/dist/index.js"||t.endsWith("/lmctl-cli/dist/index.js")}function Uu(e){let t=e.replace(/\\/g,"/");return t.split("/").filter(n=>n.length>0).at(-1)??t}function hb(e){return Array.isArray(e)&&e.length===1&&e[0]==="mcp"}function Rn(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var va,ka,DF,st,sb,js=E(()=>{"use strict";me();va="lmctl",ka="lmctl0",DF={existsSync:RF,mkdirSync:LF,readFileSync:OF,writeFileSync:MF,renameSync:$F,unlinkSync:CF},st=DF});function wb(e){let t=gb(e.registry,e.fromTeamfile);if(t===void 0)return On(`sender team is not registered in policy graph: ${e.fromTeamfile}`);if(!yb(t,e.fromAlias))return On(`sender alias "${e.fromAlias}" not found in ${e.fromTeamfile}`);let r=gb(e.registry,e.toTeamfile);return r===void 0?On(`target team is not registered in policy graph: ${e.toTeamfile}`):yb(r,e.toAlias)?e.toTeamfile===e.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:t.leadAlias===null?On(`sender team has no Lead: ${e.fromTeamfile}`):e.fromAlias!==t.leadAlias?On(`cross-team sends may only originate from Lead; got "${e.fromAlias}" in ${e.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:On(`target alias "${e.toAlias}" not found in ${e.toTeamfile}`)}function gb(e,t){return e.teams.find(r=>r.teamfile===t)}function yb(e,t){return e.aliases.some(r=>r===t)}function On(e){return{allowed:!1,outOfPolicy:!0,reason:e}}var Eb=E(()=>{"use strict"});import{randomUUID as ZF}from"node:crypto";import{hostname as Tb,networkInterfaces as QF}from"node:os";function bb(e){let t=(e.now??new Date).toISOString();return{lock_id:ZF(),teamfile:e.teamfile,alias:e.alias,holder_pid:e.pid??process.pid,holder_host:e.host??Tb(),holder_ips:e.ips??s1(),started_at:t,last_heartbeat:t}}function Sb(e=process.env){return vb(e.LMCTL_TERMINAL_LOCK_HEARTBEAT_MS,e1)}function r1(e=process.env){return vb(e.LMCTL_TERMINAL_LOCK_STALE_MS,t1)}function Wu(e,t={}){let r=t.now??new Date,n=t.localHost??Tb(),s=t.staleMs??r1();if(e.holder_host===n)return(t.isProcessAlive??n1)(e.holder_pid)?{live:!0,reason:"local-pid-alive"}:{live:!1,reason:"dead-pid"};let i=Date.parse(e.last_heartbeat);return Number.isFinite(i)?r.getTime()-i<=s?{live:!0,reason:"remote-heartbeat-fresh"}:{live:!1,reason:"stale-heartbeat"}:{live:!1,reason:"stale-heartbeat"}}function Bu(e){return`${e.alias} is held by a terminal on ${e.holder_host} since ${e.started_at}; retry later`}function vb(e,t){if(e===void 0||e.trim()==="")return t;let r=e.trim(),n=Number.parseInt(r,10);return!Number.isFinite(n)||n<=0||String(n)!==r?t:n}function n1(e){if(!Number.isInteger(e)||e<=0)return!1;try{return process.kill(e,0),!0}catch(t){return(t!==null&&typeof t=="object"&&"code"in t?t.code:void 0)!=="ESRCH"}}function s1(){let e=new Set;for(let t of Object.values(QF()))for(let r of t??[])r.internal||e.add(r.address);return[...e].sort()}var e1,t1,qu=E(()=>{"use strict";e1=15e3,t1=12e4});function i1(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is not set \u2014 it looks like you are running lmctl
2274
2274
  manually, outside a member session that lmctl started. Running lmctl this way is
2275
2275
  not officially supported.
2276
2276
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function Ds(e){return`lmctl ${e}: LMCTL_SELF_SESSIONID is set but does not match any member of a registered team.
2277
2277
  The session marker may be stale or the team may not be registered in this lmctl database.
2278
2278
  Consulted ${Qs(Pt(),Z())}
2279
2279
  To experiment with it manually: https://lmctl.com/lmctl/docs/manual-invocation`}function kb(e){return`unknown option --from
2280
- ${i1(e)}`}function Ib(e,t){let r=Hu(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Hu(e,t){let r=e[Qn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=Ue(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];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 Na=E(()=>{"use strict";at();Be();Ot()});function Hr(e){let t=Br(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Ju=E(()=>{"use strict";_t()});async function Ra(e){let t=e.onEvent??(()=>{}),r=a1(e.io,t),n=null,s=null,i=null,o,a=null,l=e.prompt;try{let c=await O(r,I=>$e(e.teamfile,e.alias,I)),d=c.teamfile,u=await O(r,I=>h1(I,e.env??process.env)),f=u.sender,m=await _1(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await g1(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2281
- `}),i=await d1(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:e.prompt,origin:u.origin}),o=m1(r,i);try{Ln(r,Fe(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let _=await Rb(r,d,c.alias);if(_!==null){let I=Bu(_);if(f!==null){let x=await Xu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=xa(`enqueued mailbox message ${x.id}`,null),Gu(x.id,f,d,c.alias)}return $n(i,n,e.prompt,I,"unavailable"),a=Vu(I,null),{status:"busy",message:I,teamChatLogId:null}}let g=await l1(r,d,c.alias);if(g.busy){if(f!==null){let x=await Xu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=xa(`enqueued mailbox message ${x.id}`,null),Gu(x.id,f,d,c.alias)}let I=await c1(r,d,c.alias);return $n(i,n,e.prompt,I,"unavailable"),a=Vu(I,null),{status:"busy",message:I,teamChatLogId:null}}if(f!==null&&f.teamfile!==d){let I=await O(r,x=>pE(x,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(I.stop){let x=_E(I.chain);return $n(i,n,e.prompt,x,"cycle"),a=Aa(x,null),{status:"error",errorKind:"cycle",message:x,teamChatLogId:null}}}let h=await E1(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator",...g.idleReclaim?{force:!0}:{}});if(!h.acquired){let I=Lb(d,c.alias,h.current);if(f!==null){let x=await Xu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=xa(`enqueued mailbox message ${x.id}`,null),Gu(x.id,f,d,c.alias)}return $n(i,n,e.prompt,I,"unavailable"),a=Vu(I,null),{status:"busy",message:I,teamChatLogId:null}}s=h.lease;let y=await sa({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:e.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:I=>t({kind:"delta",chunk:I}),onProgress:I=>t({kind:"progress",alias:c.alias,event:I}),onPromptBuilt:I=>{if(l=I,i!==null)return f1(r,i,I)}});l=y.prompt;let T=y.status==="stalled",b=null;if(T){let I=`provider stalled${y.stalledAfterMs!==void 0?` after ${y.stalledAfterMs}ms`:""}`;$n(i,n,l,I,"error"),a=Aa(I,null,y.receipt)}else b=await b1(r,{...n,message:l,response:y.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=xa(y.receipt,b);return{status:T?"stalled":"ok",replyText:y.receipt,wroteDelta:y.wroteDelta,teamChatLogId:b,durationMs:y.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return $n(i,n,l,d,"error"),a=Aa(d,null),{status:"error",errorKind:c instanceof we?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await T1(r,s),i!==null&&await u1(r,i,a??Aa("chat turn exited without a terminal outcome",null))}}function a1(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function l1(e,t,r){let n=await O(e,i=>Yt(i,t,r));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(e,i=>fa(i,n,t,r));return{busy:!s,idleReclaim:s}}async function c1(e,t,r){let n=await Rb(e,t,r);if(n!==null)return Bu(n);let s=await O(e,i=>i.getAgentInflight(t,r));return s!==null?Lb(t,r,s):`${r} is busy; wait and retry`}async function Xu(e,t){return await O(e,r=>r.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,payload:t.payload}))}function Gu(e,t,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:e,message:`mailbox message ${e} enqueued to ${s}`,teamChatLogId:null,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function d1(e,t){try{return(await O(e,n=>n.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:p1(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(r){return ce()&&Oe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function u1(e,t,r){try{await O(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function f1(e,t,r){try{await O(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function m1(e,t){if(t===null)return;let r=setInterval(()=>{O(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&Oe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},o1);return r.unref?.(),r}function xa(e,t){return{status:"done",result_summary:Ps(e),error:null,team_chat_log_id:t}}function Vu(e,t){return{status:"busy",result_summary:Ps(e),error:e,team_chat_log_id:t}}function Aa(e,t,r){return{status:"error",result_summary:Ps(r===void 0?e:r),error:e,team_chat_log_id:t}}function Ps(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function p1(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function h1(e,t){let r=Ib(t,e);if(r.ok)return{sender:Hr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Ds("chat"))}async function _1(e,t){if(t.explicitRoot!==void 0)return await O(e,n=>Te(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await O(e,n=>hE(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function g1(e,t){return await O(e,r=>wb({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:y1(r,t.sender.teamfile,t.receiverTeamfile)}))}function y1(e,t,r){return{teams:[t,r].map(s=>w1(s,e))}}function w1(e,t){let r=Ue(e,t),n=Lt(r);return{teamfile:e,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function E1(e,t){return await O(e,r=>{let n=ce(),s=hr(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:_r(),...t.force===!0?{force:!0}:{}});return s.acquired?(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:xb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:xb(s.current)})),{acquired:!1,current:s.current})})}async function Rb(e,t,r){return await O(e,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(t,r);if(o===null)return null;if(Wu(o).live)return o;let l=n.getAgentInflight(t,r);if(n.clearTerminalLock(t,r,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(t,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(t,r);return s===null?null:Wu(s).live?s:null})}function xb(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function T1(e,t){try{await O(e,r=>{r.releaseAgentInflight(t)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2280
+ ${i1(e)}`}function Ib(e,t){let r=Hu(e,t);return r.ok?{ok:!0,identity:r.identity,source:"session"}:r}function Hu(e,t){let r=e[Qn];if(r===void 0||r.length===0)return{ok:!1,reason:"unset"};let n=[];for(let i of t.listRootTeams()){let o=Ue(i.teamfile_path,t);for(let a of o.members)a.teamfile===void 0&&a.session===r&&n.push(`${i.teamfile_path}:${a.alias}`)}let s=[...new Set(n)];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 Na=E(()=>{"use strict";at();Be();Ot()});function Hr(e){let t=Br(e);if(t===null)throw new Error(`invalid agent identity: ${e}`);return{teamfile:t.teamfile,alias:t.alias,value:e}}var Ju=E(()=>{"use strict";ht()});async function Ra(e){let t=e.onEvent??(()=>{}),r=a1(e.io,t),n=null,s=null,i=null,o,a=null,l=e.prompt;try{let c=await O(r,I=>$e(e.teamfile,e.alias,I)),d=c.teamfile,u=await O(r,I=>_1(I,e.env??process.env)),f=u.sender,m=await h1(r,{explicitRoot:e.rootFlag,sender:f,receiverTeamfile:d,operatorOrigin:u.origin==="operator"}),p=f===null?null:await g1(r,{rootTeamfile:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias});p!==null&&!p.allowed&&t({kind:"warning",message:`warning: out-of-policy chat send: ${p.reason}
2281
+ `}),i=await d1(r,{receiverTeamfile:d,receiverAlias:c.alias,sender:f,rootTeamfile:m,provider:c.provider,model:c.model,sessionId:c.sessionid,cwd:c.sessiondir,prompt:e.prompt,origin:u.origin}),o=m1(r,i);try{Ln(r,Fe(d),d)}catch{}n={root_teamfile:m,sender_teamfile:f?.teamfile??null,sender_alias:f?.alias??null,receiver_teamfile:d,receiver_alias:c.alias,origin:u.origin,policy:p};let h=await Rb(r,d,c.alias);if(h!==null){let I=Bu(h);if(f!==null){let x=await Xu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=xa(`enqueued mailbox message ${x.id}`,null),Gu(x.id,f,d,c.alias)}return $n(i,n,e.prompt,I,"unavailable"),a=Vu(I,null),{status:"busy",message:I,teamChatLogId:null}}let g=await l1(r,d,c.alias);if(g.busy){if(f!==null){let x=await Xu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=xa(`enqueued mailbox message ${x.id}`,null),Gu(x.id,f,d,c.alias)}let I=await c1(r,d,c.alias);return $n(i,n,e.prompt,I,"unavailable"),a=Vu(I,null),{status:"busy",message:I,teamChatLogId:null}}if(f!==null&&f.teamfile!==d){let I=await O(r,x=>pE(x,{root:m,sender:f,receiverTeamfile:d,receiverAlias:c.alias,now:new Date}));if(I.stop){let x=hE(I.chain);return $n(i,n,e.prompt,x,"cycle"),a=Aa(x,null),{status:"error",errorKind:"cycle",message:x,teamChatLogId:null}}}let _=await E1(r,{receiver_teamfile:d,receiver_alias:c.alias,sender_teamfile:f?.teamfile??d,sender_alias:f?.alias??"operator",...g.idleReclaim?{force:!0}:{}});if(!_.acquired){let I=Lb(d,c.alias,_.current);if(f!==null){let x=await Xu(r,{sender:f,receiverTeamfile:d,receiverAlias:c.alias,rootTeamfile:m,payload:e.prompt});return a=xa(`enqueued mailbox message ${x.id}`,null),Gu(x.id,f,d,c.alias)}return $n(i,n,e.prompt,I,"unavailable"),a=Vu(I,null),{status:"busy",message:I,teamChatLogId:null}}s=_.lease;let y=await sa({sender:f??{teamfile:d,alias:"operator"},receiver:{teamfile:d,alias:c.alias,provider:c.provider,sessionId:c.sessionid,cwd:c.sessiondir,...c.model!==void 0?{model:c.model}:{},...c.effort!==void 0?{effort:c.effort}:{},...c.isLead!==void 0?{isLead:c.isLead}:{}},newMessage:e.prompt,newMessageFrom:f===null?"operator":`${f.teamfile}:${f.alias}`,io:r,permissionMode:e.permissionMode,env:e.env??process.env,...e.idleTimeoutMs!==void 0?{idleTimeoutMs:e.idleTimeoutMs}:{},onDelta:I=>t({kind:"delta",chunk:I}),onProgress:I=>t({kind:"progress",alias:c.alias,event:I}),onPromptBuilt:I=>{if(l=I,i!==null)return f1(r,i,I)}});l=y.prompt;let T=y.status==="stalled",b=null;if(T){let I=`provider stalled${y.stalledAfterMs!==void 0?` after ${y.stalledAfterMs}ms`:""}`;$n(i,n,l,I,"error"),a=Aa(I,null,y.receipt)}else b=await b1(r,{...n,message:l,response:y.receipt,status:n.policy?.outOfPolicy===!0?"out_of_policy":"ok",error_detail:n.policy?.outOfPolicy===!0?n.policy.reason:null}),a=xa(y.receipt,b);return{status:T?"stalled":"ok",replyText:y.receipt,wroteDelta:y.wroteDelta,teamChatLogId:b,durationMs:y.durationMs}}catch(c){let d=c instanceof Error?c.message:String(c);return $n(i,n,l,d,"error"),a=Aa(d,null),{status:"error",errorKind:c instanceof we?"target":"provider",message:d,teamChatLogId:null}}finally{o!==void 0&&clearInterval(o),s!==null&&await T1(r,s),i!==null&&await u1(r,i,a??Aa("chat turn exited without a terminal outcome",null))}}function a1(e,t){return{...e,stdout:{write:()=>{}},stderr:{write:r=>{t({kind:"warning",message:r})}}}}async function l1(e,t,r){let n=await O(e,i=>Yt(i,t,r));if(!n.busy)return{busy:!1,idleReclaim:!1};let s=await O(e,i=>fa(i,n,t,r));return{busy:!s,idleReclaim:s}}async function c1(e,t,r){let n=await Rb(e,t,r);if(n!==null)return Bu(n);let s=await O(e,i=>i.getAgentInflight(t,r));return s!==null?Lb(t,r,s):`${r} is busy; wait and retry`}async function Xu(e,t){return await O(e,r=>r.enqueueMail({sender_teamfile:t.sender.teamfile,sender_alias:t.sender.alias,receiver_teamfile:t.receiverTeamfile,receiver_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,payload:t.payload}))}function Gu(e,t,r,n){let s=`${r}:${n}`;return{status:"enqueued",id:e,message:`mailbox message ${e} enqueued to ${s}`,teamChatLogId:null,sender:`${t.teamfile}:${t.alias}`,receiver:s}}async function d1(e,t){try{return(await O(e,n=>n.startTrackedInvocation({kind:"chat",origin:t.origin,scope_teamfile:t.receiverTeamfile,from_identity:t.sender===null?"operator":`${t.sender.teamfile}:${t.sender.alias}`,target_teamfile:t.receiverTeamfile,target_alias:t.receiverAlias,root_teamfile:t.rootTeamfile,cwd:t.cwd??null,command:p1(t.receiverTeamfile,t.receiverAlias,t.prompt),holder_pid:process.pid,request_payload:t.prompt,meta:JSON.stringify({provider:t.provider,model:t.model??null,sessionid:t.sessionId??null})}))).id}catch(r){return ce()&&Oe(JSON.stringify({event:"tracked_invocation_start_error",error:r instanceof Error?r.message:String(r)})),null}}async function u1(e,t,r){try{await O(e,n=>{n.finishTrackedInvocation(t,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_finish_error",id:t,error:n instanceof Error?n.message:String(n)}))}}async function f1(e,t,r){try{await O(e,n=>{n.updateTrackedInvocationRequestPayload(t,r)})}catch(n){ce()&&Oe(JSON.stringify({event:"tracked_invocation_request_payload_error",id:t,error:n instanceof Error?n.message:String(n)}))}}function m1(e,t){if(t===null)return;let r=setInterval(()=>{O(e,n=>n.heartbeatTrackedInvocation(t)).catch(n=>{ce()&&Oe(JSON.stringify({event:"tracked_invocation_heartbeat_error",id:t,error:n instanceof Error?n.message:String(n)}))})},o1);return r.unref?.(),r}function xa(e,t){return{status:"done",result_summary:Ps(e),error:null,team_chat_log_id:t}}function Vu(e,t){return{status:"busy",result_summary:Ps(e),error:e,team_chat_log_id:t}}function Aa(e,t,r){return{status:"error",result_summary:Ps(r===void 0?e:r),error:e,team_chat_log_id:t}}function Ps(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=500?t:`${t.slice(0,497)}...`}function p1(e,t,r){return`lmctl chat ${JSON.stringify(e)} ${t} ${JSON.stringify(r)}`}function _1(e,t){let r=Ib(t,e);if(r.ok)return{sender:Hr(r.identity),origin:"agent"};if(r.reason==="unset")return{sender:null,origin:"operator"};throw new Error(Ds("chat"))}async function h1(e,t){if(t.explicitRoot!==void 0)return await O(e,n=>Te(t.explicitRoot,n));if(t.operatorOrigin||t.sender===null)return t.receiverTeamfile;let r=t.sender;return await O(e,n=>_E(n,{sender:r,now:new Date})??t.receiverTeamfile)}async function g1(e,t){return await O(e,r=>wb({rootTeamfile:t.rootTeamfile,fromTeamfile:t.sender.teamfile,fromAlias:t.sender.alias,toTeamfile:t.receiverTeamfile,toAlias:t.receiverAlias,registry:y1(r,t.sender.teamfile,t.receiverTeamfile)}))}function y1(e,t,r){return{teams:[t,r].map(s=>w1(s,e))}}function w1(e,t){let r=Ue(e,t),n=Lt(r);return{teamfile:e,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function E1(e,t){return await O(e,r=>{let n=ce(),s=_r(r,{receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,ttlMs:hr(),...t.force===!0?{force:!0}:{}});return s.acquired?(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:s.reclaimReason===null?"acquired":"reclaimed",...s.reclaimReason===null?{}:{reclaim_reason:s.reclaimReason,holder:xb(s.previous)}})),{acquired:!0,lease:s.lease}):(n&&Oe(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},result:"rejected",holder:xb(s.current)})),{acquired:!1,current:s.current})})}async function Rb(e,t,r){return await O(e,n=>{for(let i=0;i<2;i+=1){let o=n.getTerminalLock(t,r);if(o===null)return null;if(Wu(o).live)return o;let l=n.getAgentInflight(t,r);if(n.clearTerminalLock(t,r,o.lock_id))return l!==null&&l.sender_teamfile===t&&l.sender_alias==="terminal"&&n.clearObservedTerminalAgentInflight(t,r,{sender_teamfile:l.sender_teamfile,sender_alias:l.sender_alias,started_at:l.started_at,holder_pid:l.holder_pid}),null}let s=n.getTerminalLock(t,r);return s===null?null:Wu(s).live?s:null})}function xb(e){return e===null?null:{sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,holder_pid:e.holder_pid,started_at:e.started_at}}async function T1(e,t){try{await O(e,r=>{r.releaseAgentInflight(t)})}catch(r){e.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
2282
2282
  `)}}function Lb(e,t,r){return`${t} is servicing ${r.sender_alias} (${r.sender_teamfile}) since ${r.started_at} \u2014 wait and retry, or inspect without waking it: lmctl tail "${e}" ${t}`}async function b1(e,t){let r=Ab(t.message),n=t.response===null?null:Ab(t.response);try{return await O(e,s=>s.insertTeamChatLog({root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,message:r.text,response:n?.text??null,origin:t.origin,status:t.status,error_detail:t.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()}))}catch(s){return e.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
2283
- `),null}}function $n(e,t,r,n,s){e!==null||t===null||q({event:"chat_attempt_error",reason:s,root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,origin:t.origin,error_detail:n,message_preview:Ps(r)})}function Ab(e){return e.length<=Nb?{text:e,truncated:!1}:{text:e.slice(0,Nb),truncated:!0}}var Nb,o1,Ku=E(()=>{"use strict";_t();zt();js();Eb();Ot();ia();pe();Le();Ur();au();qu();Na();Ju();Zd();Nb=256*1024,o1=3e4});var Db={};Ee(Db,{parseIdleTimeoutMs:()=>Mb,resolvePromptInput:()=>Cb,runChat:()=>k1});import{readFileSync as S1}from"node:fs";async function k1(e,t={stdout:process.stdout,stderr:process.stderr}){let r=t.env??process.env;if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(`${$b}
2283
+ `),null}}function $n(e,t,r,n,s){e!==null||t===null||P({event:"chat_attempt_error",reason:s,root_teamfile:t.root_teamfile,sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,receiver_teamfile:t.receiver_teamfile,receiver_alias:t.receiver_alias,origin:t.origin,error_detail:n,message_preview:Ps(r)})}function Ab(e){return e.length<=Nb?{text:e,truncated:!1}:{text:e.slice(0,Nb),truncated:!0}}var Nb,o1,Ku=E(()=>{"use strict";ht();zt();js();Eb();Ot();ia();me();Le();Ur();au();qu();Na();Ju();Zd();Nb=256*1024,o1=3e4});var Db={};Ee(Db,{parseIdleTimeoutMs:()=>Mb,resolvePromptInput:()=>Cb,runChat:()=>k1});import{readFileSync as S1}from"node:fs";async function k1(e,t={stdout:process.stdout,stderr:process.stderr}){let r=t.env??process.env;if(e.length===0||e[0]==="--help"||e[0]==="-h")return t.stdout.write(`${$b}
2284
2284
  `),e.length===0?2:0;let n=I1(e);if(typeof n=="string")return t.stderr.write(`error: ${n}
2285
2285
  ${$b}
2286
2286
  `),2;if(n.promptFile!==void 0){let u=await Cb(n.promptFile,t);if(typeof u!="string")return t.stderr.write(`error: ${u.error}
@@ -2288,10 +2288,10 @@ ${$b}
2288
2288
  `),2):await O(t,async f=>{let m=f.getRun(u);if(m===null)return t.stderr.write(`error: run ${u}: not found
2289
2289
  `),1;if(m.terminal_state!==null&&m.terminal_state.length>0)return v(t,`run ${u}: already terminal (${m.terminal_state}); chat --run cannot resume a terminated run`);let p=Ko(f,u);if(p===null)return t.stderr.write(`error: run ${u}: no pending operator-answerable attention (chat --run only resumes paused runs)
2290
2290
  `),1;if(p.kind==="workflow_escalation"){if(n.done)return t.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
2291
- `),2;let _=f.resumeEscalation(p.attention_id,n.prompt);return _.resumed===!0?(t.stdout.write(`run ${u}: escalation resumed (decision: ${n.prompt})
2292
- `),0):(t.stderr.write(`error: run ${u}: resumeEscalation failed (${_.reason})
2293
- `),1)}if(p.kind==="interactive_waiting_operator"){let _=Nt(f,p.attention_id);if(_===null||_.step_id===null)return t.stderr.write(`error: run ${u}: pending interactive_waiting_operator attention has no associated interactive step
2294
- `),1;let g=f.resumeInteractive(_.step_id,n.prompt,n.done===!0);return g.resumed===!0?(t.stdout.write(`run ${u}: interactive resumed (step ${_.step_id}${n.done===!0?", done":""})
2291
+ `),2;let h=f.resumeEscalation(p.attention_id,n.prompt);return h.resumed===!0?(t.stdout.write(`run ${u}: escalation resumed (decision: ${n.prompt})
2292
+ `),0):(t.stderr.write(`error: run ${u}: resumeEscalation failed (${h.reason})
2293
+ `),1)}if(p.kind==="interactive_waiting_operator"){let h=Nt(f,p.attention_id);if(h===null||h.step_id===null)return t.stderr.write(`error: run ${u}: pending interactive_waiting_operator attention has no associated interactive step
2294
+ `),1;let g=f.resumeInteractive(h.step_id,n.prompt,n.done===!0);return g.resumed===!0?(t.stdout.write(`run ${u}: interactive resumed (step ${h.step_id}${n.done===!0?", done":""})
2295
2295
  `),0):(t.stderr.write(`error: run ${u}: resumeInteractive failed (${g.reason})
2296
2296
  `),1)}return t.stderr.write(`error: run ${u}: pending attention kind "${p.kind}" is not operator-answerable
2297
2297
  `),1})}let s=gr(v1,{target:n.target,alias:n.alias,flags:{session:n.sessionFlag,provider:n.providerFlag}});if(s.mode==="error")return t.stderr.write(`error: ${s.message}
@@ -2315,7 +2315,7 @@ ${$b}
2315
2315
  `):t.stdout.write(`${f.text}${f.text.endsWith(`
2316
2316
  `)?"":`
2317
2317
  `}`),f.status==="stalled"?1:0}catch(u){let f=u instanceof Error?u.message:String(u);return t.stderr.write(`error: ${f}
2318
- `),1}}function I1(e){let t=[],r="yolo",n,s,i,o,a,l,c=!1,d=!1;for(let _=0;_<e.length;_+=1){let g=e[_];if(g==="--permission-mode"){let h=e[++_];if(h===void 0||h.startsWith("--"))return"missing value for --permission-mode";if(h!=="plan"&&h!=="yolo")return`--permission-mode must be one of plan|yolo (got "${h}")`;r=h;continue}if(g==="--idle-timeout"){let h=e[++_];if(h===void 0||h.startsWith("--"))return"missing value for --idle-timeout";let y=Mb(h);if(typeof y=="string")return y;n=y;continue}if(g==="--session"){let h=e[++_];if(h===void 0||h.startsWith("--"))return"missing value for --session";s=h;continue}if(g==="--provider"){let h=e[++_];if(h===void 0||h.startsWith("--"))return"missing value for --provider";i=h;continue}if(g==="--from"||g.startsWith("--from="))return kb("chat");if(g.startsWith("I_am="))return`unknown argument: ${g}`;if(g==="--root"){let h=e[++_];if(h===void 0||h.startsWith("--"))return"missing value for --root";o=h;continue}if(g==="--prompt-file"){let h=e[++_];if(h===void 0||h!=="-"&&h.startsWith("--"))return"missing value for --prompt-file";a=h;continue}if(g==="--force"||g.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(g==="--json"){d=!0;continue}if(g==="--run"){let h=e[++_];if(h===void 0||h.startsWith("--"))return"missing value for --run";l=h;continue}if(g==="--done"){c=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;t.push(g)}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&&t.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&t.length===0)return"a prompt (answer) is required with --run";if(t.length>1)return`--run takes exactly one positional (the answer); got ${t.length}`;let _={prompt:a!==void 0?"":t[0],permissionMode:r,runFlag:l,done:c,json:d};return a!==void 0&&(_.promptFile=a),_}let u,f,m;if(a!==void 0){if(t.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(t.length===1)u=t[0];else if(t.length===2)u=t[0],f=t[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";m=""}else{if(t.length===0)return"a prompt is required";if(t.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=t[0]}else if(t.length===2)u=t[0],m=t[1];else if(t.length===3)u=t[0],f=t[1],m=t[2];else return`too many positionals (${t.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let p={prompt:m,permissionMode:r};return u!==void 0&&(p.target=u),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),i!==void 0&&(p.providerFlag=i),o!==void 0&&(p.rootFlag=o),a!==void 0&&(p.promptFile=a),d&&(p.json=d),p}async function Cb(e,t,r=process.stdin){let n;try{n=e==="-"?await N1(r):S1(e,"utf8")}catch(o){let a=o instanceof Error?o.message:String(o);return{error:`--prompt-file ${e}: ${a}`}}let s=n.endsWith(`\r
2318
+ `),1}}function I1(e){let t=[],r="yolo",n,s,i,o,a,l,c=!1,d=!1;for(let h=0;h<e.length;h+=1){let g=e[h];if(g==="--permission-mode"){let _=e[++h];if(_===void 0||_.startsWith("--"))return"missing value for --permission-mode";if(_!=="plan"&&_!=="yolo")return`--permission-mode must be one of plan|yolo (got "${_}")`;r=_;continue}if(g==="--idle-timeout"){let _=e[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let y=Mb(_);if(typeof y=="string")return y;n=y;continue}if(g==="--session"){let _=e[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=e[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";i=_;continue}if(g==="--from"||g.startsWith("--from="))return kb("chat");if(g.startsWith("I_am="))return`unknown argument: ${g}`;if(g==="--root"){let _=e[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";o=_;continue}if(g==="--prompt-file"){let _=e[++h];if(_===void 0||_!=="-"&&_.startsWith("--"))return"missing value for --prompt-file";a=_;continue}if(g==="--force"||g.startsWith("--force="))return"unknown option --force (a dead holder auto-reclaims; for a live holder use lmctl chat)";if(g==="--json"){d=!0;continue}if(g==="--run"){let _=e[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";l=_;continue}if(g==="--done"){c=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;t.push(g)}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&&t.length>0)return"--prompt-file is mutually exclusive with a positional answer; pass one or the other";if(a===void 0&&t.length===0)return"a prompt (answer) is required with --run";if(t.length>1)return`--run takes exactly one positional (the answer); got ${t.length}`;let h={prompt:a!==void 0?"":t[0],permissionMode:r,runFlag:l,done:c,json:d};return a!==void 0&&(h.promptFile=a),h}let u,f,m;if(a!==void 0){if(t.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(t.length===1)u=t[0];else if(t.length===2)u=t[0],f=t[1];else return"--prompt-file is mutually exclusive with a positional prompt; pass one or the other";m=""}else{if(t.length===0)return"a prompt is required";if(t.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=t[0]}else if(t.length===2)u=t[0],m=t[1];else if(t.length===3)u=t[0],f=t[1],m=t[2];else return`too many positionals (${t.length}); expected at most <teamfile> <alias> <prompt>`}if(c)return"--done requires --run";let p={prompt:m,permissionMode:r};return u!==void 0&&(p.target=u),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),i!==void 0&&(p.providerFlag=i),o!==void 0&&(p.rootFlag=o),a!==void 0&&(p.promptFile=a),d&&(p.json=d),p}async function Cb(e,t,r=process.stdin){let n;try{n=e==="-"?await N1(r):S1(e,"utf8")}catch(o){let a=o instanceof Error?o.message:String(o);return{error:`--prompt-file ${e}: ${a}`}}let s=n.endsWith(`\r
2319
2319
  `)?n.slice(0,-2):n.endsWith(`
2320
2320
  `)?n.slice(0,-1):n;if(s.length===0)return{error:`--prompt-file ${e}: file is empty; a prompt is required`};let i=Buffer.byteLength(s,"utf8");return i>65536&&t.stderr.write(`warning: prompt is ${i} bytes, over the ${65536}-byte mailbox payload cap.
2321
2321
  It sends intact to an idle receiver, but if the receiver is BUSY the message is queued and
@@ -2323,7 +2323,7 @@ ${$b}
2323
2323
  `),s}async function N1(e){let t=[];for await(let r of e)t.push(typeof r=="string"?Buffer.from(r,"utf8"):r);return Buffer.concat(t).toString("utf8")}function Mb(e){if(e==="0")return 0;if(/^\d+$/.test(e))return Number(e);let t=/^(\d+)([smhd])$/.exec(e);if(t===null)return`invalid --idle-timeout "${e}" (expected <n>(s|m|h|d), integer ms, or 0)`;let r=Number(t[1]),n=t[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function jb(e,t,r){r.kind==="tool_use"?e.stderr.write(`[${t}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
2324
2324
  `):r.kind==="tool_result"?e.stderr.write(`[${t}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
2325
2325
  `):r.kind==="api_retry"&&e.stderr.write(`[${t}] api_retry${r.summary?`: ${r.summary}`:""}
2326
- `)}function x1(e,t){return e.slice(-t)}function A1(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?jb(e,t.alias,t.event):e.stderr.write(t.message)}var v1,$b,Pb=E(()=>{"use strict";It();al();Le();_t();Ku();Na();pe();Yo();Ht();v1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},$b=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2326
+ `)}function x1(e,t){return e.slice(-t)}function A1(e,t){t.kind==="delta"?e.stdout.write(t.chunk):t.kind==="progress"?jb(e,t.alias,t.event):e.stderr.write(t.message)}var v1,$b,Pb=E(()=>{"use strict";It();al();Le();ht();Ku();Na();me();Yo();Ht();v1={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},$b=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
2327
2327
  lmctl chat <teamfile> <alias> "<prompt>"
2328
2328
  lmctl chat <sessionid> "<prompt>" --provider <name>
2329
2329
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -2348,30 +2348,30 @@ ${zu}`);if(n.positionals.length===0)return v(t,`recover requires a <teamfile>
2348
2348
 
2349
2349
  ${zu}`);if(n.positionals.length>2)return v(t,`unexpected argument: ${n.positionals[2]}`);let s=n.positionals[0],i=Br(s),o=i?.teamfile??s,a=n.positionals[1],l=i?.alias??a;if(i!==null&&a!==void 0)return v(t,"recover alias was provided twice; use either <teamfile>:<alias> or <teamfile> <alias>");if(V(n,"--all")&&l!==void 0)return v(t,"recover --all is mutually exclusive with <alias>");let c;try{c=await U1(t,o,l)}catch(p){if(p instanceof we)return v(t,p.message);throw p}let d=r.now??new Date,u=V(n,"--dry-run"),f=[];for(let p of c)f.push(await W1(t,p,{now:d,dryRun:u}));let m={checked:f.length,recovered:f.filter(p=>p.action==="recovered").length,wouldRecover:f.filter(p=>p.action==="would_recover").length,skipped:f.filter(p=>p.action!=="recovered"&&p.action!=="would_recover").length,errors:f.filter(p=>p.action==="load_error"||p.action==="send_error").length};if(V(n,"--json"))le(t,{dryRun:u,now:d.toISOString(),summary:m,members:f});else{for(let p of f)t.stdout.write(B1(p));t.stdout.write(`Recover checked ${m.checked}: ${u?`${m.wouldRecover} would recover`:`${m.recovered} recovered`}, ${m.skipped} skipped, ${m.errors} error(s).
2350
2350
  `)}return m.errors>0?1:0}async function U1(e,t,r){return await O(e,n=>{let s=Te(t,n);if(r!==void 0){let i=Ue(s,n);if(i.parseErrors.length>0)throw new we(`lmctl: ${t}: ${i.parseErrors.join("; ")}`);let o=la(i,r);return o?.teamfile!==void 0?Zu(Bb(Wb(s),o.teamfile),n,new Set):[$e(t,r,n)]}return Zu(s,n,new Set)})}function Zu(e,t,r){let n=Te(e,t);if(r.has(n))return[];r.add(n);let s=Ue(n,t);if(s.parseErrors.length>0)throw new we(`lmctl: ${n}: ${s.parseErrors.join("; ")}`);let i=[];for(let o of s.members){if(o.teamfile!==void 0){i.push(...Zu(Bb(Wb(n),o.teamfile),t,r));continue}o.session!==void 0&&i.push($e(n,o.alias,t))}return i}async function W1(e,t,r){let n;try{let a=await Ye(t.sessionid,t.provider);if(a===null)return Ct(t,"session_not_found",null,"session detail not found");n=Fs(a.messages)}catch(a){return Ct(t,"load_error",null,a instanceof Error?a.message:String(a))}if(n===null)return Ct(t,"not_limited",null,"no current session-limit marker");if(n.resets_at===null)return Ct(t,"unknown_reset",n,"reset time could not be parsed");let s=Date.parse(n.resets_at);if(!Number.isFinite(s))return Ct(t,"unknown_reset",n,"reset time could not be parsed");if(s>r.now.getTime())return Ct(t,"not_due",n,`resets_at ${n.resets_at} is in the future`);let i=await O(e,a=>a.getAgentInflight(t.teamfile,t.alias));if(i!==null)return Ct(t,"busy",n,`in-flight since ${i.started_at}`);if(r.dryRun)return Ct(t,"would_recover",n,null);let o=await Ra({teamfile:t.teamfile,alias:t.alias,prompt:P1,permissionMode:"yolo",io:e,env:process.env});return o.status==="ok"||o.status==="stalled"?Ct(t,"recovered",n,null):Ct(t,o.status==="busy"?"busy":"send_error",n,o.message)}function Ct(e,t,r,n){return{alias:e.alias,teamfile:e.teamfile,provider:e.provider,sessionid:e.sessionid,action:t,sessionLimit:r,reason:n}}function B1(e){let t=e.sessionLimit?.resets_at??"unknown",r=e.reason===null?"":` (${e.reason})`;return`${e.alias}: ${e.action} resets_at=${t}${r}
2351
- `}var P1,zu,Hb=E(()=>{"use strict";Yu();yr();zt();Ot();_t();Ku();Le();P1="Your session limit reset time has passed. Continue your work from the last actionable point.",zu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<alias> [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2352
- `)});var Us,O5,Qu=E(()=>{"use strict";Us=[{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}],O5=Us.length});import{spawn as q1}from"node:child_process";async function Xb(e,t,r){let n=J1.get(e);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return X1(n.name,s)}function X1(e,t){return e==="lmctl_chat"?G1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function G1(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof e.team=="string"?e.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",r,n,t];return ce()&&Oe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),V1(s,process.cwd())}function V1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=q1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=K1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Oe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2353
- `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function K1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Jb;let r=Number(t);return!Number.isFinite(r)||r<=0?Jb:r}function ef(e,t=process.env){let n=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:H1),s=e.getConfig("api.token"),i=t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var H1,Jb,J1,tf=E(()=>{"use strict";Qu();pe();H1="http://127.0.0.1:8787",Jb=30*60*1e3,J1=new Map(Us.map(e=>[e.name,e]))});async function Q1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(rf({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:Y1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:z1,version:Z1}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Us.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Xb(i,o,t.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${e.method}`}}}}function rf(e){return`${JSON.stringify(e)}
2351
+ `}var P1,zu,Hb=E(()=>{"use strict";Yu();yr();zt();Ot();ht();Ku();Le();P1="Your session limit reset time has passed. Continue your work from the last actionable point.",zu=["usage: lmctl recover <teamfile> [--all|<alias>] [--dry-run] [--json]"," lmctl recover <teamfile>:<alias> [--dry-run] [--json]","","Wake team members whose latest provider output is a session-limit message","and whose resets_at time has passed. Defaults to the full teamfile report","subtree. A busy/in-flight member is skipped."].join(`
2352
+ `)});var Us,$5,Qu=E(()=>{"use strict";Us=[{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}],$5=Us.length});import{spawn as q1}from"node:child_process";async function Xb(e,t,r){let n=J1.get(e);if(n===void 0)return{status:"error",code:404,message:`unknown tool: ${e}`};let s=t!==null&&typeof t=="object"&&!Array.isArray(t)?t:{};for(let i of n.inputSchema.required??[])if(s[i]===void 0)return{status:"error",code:400,message:`missing required parameter: ${i}`};return X1(n.name,s)}function X1(e,t){return e==="lmctl_chat"?G1(t):{status:"error",code:404,message:`unknown local tool: ${e}`}}function G1(e){let t=typeof e.prompt=="string"?e.prompt:"";if(t.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: prompt"});let r=typeof e.team=="string"?e.team:"";if(r.length===0)return Promise.resolve({status:"error",code:400,message:"missing required parameter: team"});let n=typeof e.alias=="string"&&e.alias.length>0?e.alias:"Lead",s=["chat",r,n,t];return ce()&&Oe(JSON.stringify({event:"mcp_chat_spawn",team:r,alias:n})),V1(s,process.cwd())}function V1(e,t){return new Promise(r=>{let n=!1,s,i=d=>{n||(n=!0,s!==void 0&&clearTimeout(s),r(d))},o=q1("lmctl",e,{cwd:t,env:process.env,stdio:["ignore","pipe","pipe"]}),a=K1(process.env);s=setTimeout(()=>{try{o.kill("SIGTERM")}catch{}i({status:"error",code:124,message:`lmctl chat timed out after ${a}ms`})},a),s.unref?.();let l="",c="";o.stdout?.on("data",d=>{l+=d.toString("utf8")}),o.stderr?.on("data",d=>{c+=d.toString("utf8")}),o.on("error",d=>{i({status:"error",code:1,message:`failed to spawn lmctl chat: ${d.message}`})}),o.on("exit",d=>{if(d===0){ce()&&Oe(JSON.stringify({event:"mcp_chat_payload",bytes:Buffer.byteLength(l,"utf8"),lines:l.split(`
2353
+ `).length})),i({status:"ok",data:{text:l.trim()||"(empty response)"}});return}i({status:"error",code:d??1,message:c.trim()||`lmctl chat exited with code ${d}`})})})}function K1(e){let t=e.LMCTL_MCP_CHAT_TIMEOUT_MS;if(t===void 0||t.trim().length===0)return Jb;let r=Number(t);return!Number.isFinite(r)||r<=0?Jb:r}function ef(e,t=process.env){let n=e.getConfig("api.url")??(t.LMCTL_API_URL!==void 0&&t.LMCTL_API_URL.length>0?t.LMCTL_API_URL:H1),s=e.getConfig("api.token"),i=t.LMCTL_API_TOKEN!==void 0&&t.LMCTL_API_TOKEN.length>0?t.LMCTL_API_TOKEN:s;return{baseUrl:n,token:i}}var H1,Jb,J1,tf=E(()=>{"use strict";Qu();me();H1="http://127.0.0.1:8787",Jb=30*60*1e3,J1=new Map(Us.map(e=>[e.name,e]))});async function Q1(e,t){let r=e.id===void 0,n=e.id??null;if(e.method==="exit")return r||t.io.write(rf({jsonrpc:"2.0",id:n,result:null})),{kind:"exit"};if(e.method==="initialize")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{protocolVersion:Y1,capabilities:{tools:{listChanged:!1}},serverInfo:{name:z1,version:Z1}}}};if(e.method==="notifications/initialized")return{kind:"notification"};if(e.method==="shutdown")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:null}};if(e.method==="tools/list")return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{tools:Us.map(s=>({name:s.name,description:s.description,inputSchema:s.inputSchema}))}}};if(e.method==="tools/call"){let s=e.params!==null&&typeof e.params=="object"?e.params:{},i=typeof s.name=="string"?s.name:"",o=s.arguments,a=await Xb(i,o,t.dispatch),l=i==="lmctl_chat"&&a.status==="ok"&&a.data!==null&&typeof a.data=="object"&&typeof a.data.text=="string"?a.data.text:JSON.stringify(a);return{kind:"response",message:{jsonrpc:"2.0",id:n,result:{isError:a.status==="error",content:[{type:"text",text:l}]}}}}return r?{kind:"notification"}:{kind:"response",message:{jsonrpc:"2.0",id:n,error:{code:-32601,message:`method not found: ${e.method}`}}}}function rf(e){return`${JSON.stringify(e)}
2354
2354
  `}async function Gb(e,t){let r=!1,n="",s=!1,i=async o=>{let a=o.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(d){e.io.write(rf({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${d instanceof Error?d.message:String(d)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await Q1(l,e);c.kind==="response"?e.io.write(rf(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(o=>{let a=Promise.resolve(),l=!1,c=u=>{l||(l=!0,o(u))},d=()=>{let u=n.indexOf(`
2355
2355
  `);for(;u!==-1;){let f=n.slice(0,u);n=n.slice(u+1),a=a.then(()=>i(f)).then(()=>{s&&c(0)}),u=n.indexOf(`
2356
2356
  `)}};t.setEncoding("utf8"),t.on("data",u=>{n+=u,d()}),t.on("end",()=>{n.trim().length>0&&(a=a.then(()=>i(n))),a.finally(()=>c(0))}),t.on("error",u=>{e.io.log?.(`mcp: stdin error: ${u.message}
2357
2357
  `),a.finally(()=>c(1))})})}var Y1,z1,Z1,Vb=E(()=>{"use strict";Qu();tf();Y1="2025-06-18",z1="lmctl",Z1="0.0.1"});var Yb={};Ee(Yb,{runMcp:()=>tU});async function tU(e,t={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(eU),0;if(e.length>0)return t.stderr.write(`usage: lmctl mcp
2358
- `),2;q({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??rU(),i=1;try{let o=s===void 0?ef({getConfig:()=>null},process.env):ef(s,process.env);return i=await Gb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{q({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function rU(){let e=Z(),t=3;for(let r=1;r<=t;r+=1)try{return ke({path:e})}catch(n){let s=n instanceof Error?n.message:String(n);if(q({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Kb(s))nU(50*r);else if(!Kb(s))break}}function Kb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function nU(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var eU,zb=E(()=>{"use strict";Qe();tf();Vb();pe();Be();eU=`usage: lmctl mcp
2358
+ `),2;P({event:"mcp_bridge_start",pid:process.pid});let n=t.dal===void 0,s=t.dal??rU(),i=1;try{let o=s===void 0?ef({getConfig:()=>null},process.env):ef(s,process.env);return i=await Gb({io:{write:l=>t.stdout.write(l),log:l=>t.stderr.write(l)},dispatch:{config:o,...s!==void 0?{dal:s}:{}}},r),i}finally{P({event:"mcp_bridge_exit",pid:process.pid,exit_code:i}),n&&s!==void 0&&s.close()}}function rU(){let e=Z(),t=3;for(let r=1;r<=t;r+=1)try{return ke({path:e})}catch(n){let s=n instanceof Error?n.message:String(n);if(P({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:e,error_message:s}),r<t&&Kb(s))nU(50*r);else if(!Kb(s))break}}function Kb(e){return/SQLITE_BUSY|database is locked|database is busy/i.test(e)}function nU(e){let t=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(t,0,0,e)}var eU,zb=E(()=>{"use strict";Qe();tf();Vb();me();Be();eU=`usage: lmctl mcp
2359
2359
 
2360
2360
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
2361
2361
  local config, then uses stdin/stdout for JSON-RPC frames.
2362
2362
  `});var Zb={};Ee(Zb,{runDevice:()=>pU});import{readFileSync as sU}from"node:fs";import{homedir as iU}from"node:os";import{join as oU}from"node:path";import{CognitoIdentityClient as aU,GetIdCommand as lU}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as cU}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as dU,ListObjectsV2Command as uU,PutObjectCommand as fU,S3Client as mU}from"@aws-sdk/client-s3";async function pU(e,t={stdout:process.stdout,stderr:process.stderr}){let[r]=e;if(r===void 0||r==="--help"||r==="-h"||r==="help")return t.stdout.write(nf),0;if(r==="init"){let n=Mu();return t.stdout.write(`${n.device_id}
2363
2363
  `),0}if(r==="id"){let n=qr();return n===null?(t.stderr.write(`error: no device id initialized at ${ba()}; run 'lmctl device init'
2364
2364
  `),1):(t.stdout.write(`${n.device_id}
2365
- `),0)}return r==="login"?await hU(e.slice(1),t):r==="prompt"?await gU(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
2366
- `),1)}async function hU(e,t){let r=_U(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2365
+ `),0)}return r==="login"?await _U(e.slice(1),t):r==="prompt"?await gU(e.slice(1),t):(t.stderr.write(`usage: lmctl device <id|init|login|prompt>
2366
+ `),1)}async function _U(e,t){let r=hU(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2367
2367
  ${nf}`),2;let n=Cs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2368
- `),1;_T({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await _a({region:n.config.region,clientId:n.config.cognitoClientId??Ta,refreshToken:r.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return t.stderr.write(`error: could not authenticate access key: ${d}
2368
+ `),1;hT({userId:r.userId,refreshToken:r.accessKey});let s,i,o;try{let c=await ha({region:n.config.region,clientId:n.config.cognitoClientId??Ta,refreshToken:r.accessKey});s=c.idToken,i=c.accessToken,o=c.expiresAt}catch(c){let d=c instanceof Error?c.message:String(c);return t.stderr.write(`error: could not authenticate access key: ${d}
2369
2369
  `),1}let a=Ls(s);if(a!==null&&a!==r.userId)return t.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
2370
2370
  `),1;Iu({idToken:s,...i!==void 0?{accessToken:i}:{},refreshToken:r.accessKey,...o!==void 0?{expiresAt:o}:{}});let l=qr()??Mu();return t.stdout.write(`logged in as ${r.userId}
2371
2371
  device id: ${l.device_id}
2372
2372
  mailbox prefix: ${r.userId}/${l.device_id}/
2373
2373
  access key stored at ${Os()}
2374
- `),0}function _U(e){let t,r;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--user-id"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";t=i;continue}if(s==="--access-key"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;continue}return`unknown argument: ${s}`}return t===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:t,accessKey:r}}async function gU(e,t){let r=yU(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2374
+ `),0}function hU(e){let t,r;for(let n=0;n<e.length;n+=1){let s=e[n];if(s==="--user-id"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --user-id";t=i;continue}if(s==="--access-key"){let i=e[++n];if(i===void 0||i.startsWith("--"))return"missing value for --access-key";r=i;continue}return`unknown argument: ${s}`}return t===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:t,accessKey:r}}async function gU(e,t){let r=yU(e);if(typeof r=="string")return t.stderr.write(`error: ${r}
2375
2375
  ${nf}`),2;let n=Cs();if(n.config===void 0)return t.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
2376
2376
  `),1;let s=EU();if(s===null)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=s.cognito?.idToken;if(typeof i!="string"||i.length===0)return t.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await wU({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:o,idToken:i}),l=cU({identityId:a,logins:{[o]:i},clientConfig:{region:n.config.region}}),c=n.config.deviceId??qr()?.device_id,d=Ls(i)??void 0,u=new Fr({bucket:n.config.mailboxBucket,identityId:a,...d!==void 0?{userId:d}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new mU({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:uU,GetObjectCommand:dU,PutObjectCommand:fU},selfRole:"browser",onMessage:async()=>{}}),f=iT({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await u.putMessage({conversation_id:sT,payload:f});return t.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:u.getMailboxBasePrefix(),object_key:m},null,2)+`
2377
2377
  `),0}function yU(e){let t,r,n;for(let s=0;s<e.length;s+=1){let i=e[s];if(i==="--root"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --root";t=o;continue}if(i==="--text"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --text";r=o;continue}if(i==="--prompt-id"){let o=e[++s];if(o===void 0||o.startsWith("--"))return"missing value for --prompt-id";n=o;continue}return`unknown argument: ${i}`}return t===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:t,text:r,...n!==void 0?{promptId:n}:{}}}async function wU(e){let r=await new aU({region:e.region}).send(new lU({IdentityPoolId:e.identityPoolId,Logins:{[e.idpProvider]:e.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function EU(e=process.env.LMCTL_TOKEN_PATH??oU(iU(),".lmctl","cli-tokens.json")){try{return JSON.parse(sU(e,"utf8"))}catch{return null}}var nf,Qb=E(()=>{"use strict";ju();Ru();qo();bu();Su();Nu();vu();nf=`usage: lmctl device <id|init|login|prompt>
@@ -2384,8 +2384,8 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
2384
2384
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
2385
2385
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
2386
2386
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
2387
- `});import{existsSync as eS,mkdirSync as TU,readdirSync as bU,readFileSync as tS,writeFileSync as SU}from"node:fs";import{join as Cn}from"node:path";import{fileURLToPath as vU}from"node:url";function IU(e){try{return kU.some(t=>eS(Cn(e,t)))}catch{return!1}}function NU(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.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:n}}function rS(e,t){e.durable_memory_mode!=="db"?xU(e):AU(e,t)}function nS(e){let t=IU(e),r;try{r=bU(sf).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function xU(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Cn(t,"durable-memory");try{TU(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=nS(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Cn(r,o);if(!eS(a))try{let l=tS(Cn(sf,i),"utf8");SU(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function AU(e,t){let r=e.local_path??"",n=nS(r),s=[];for(let i of n){let o=Cn(sf,i),a;try{a=tS(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=NU(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var sf,kU,sS=E(()=>{"use strict";sf=Cn(vU(import.meta.url),"../../config/durable_memory_templates"),kU=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as RU}from"node:crypto";import{existsSync as LU,mkdirSync as OU,writeFileSync as $U}from"node:fs";import{dirname as CU,join as Mn}from"node:path";function of(e){return typeof e=="string"&&e.startsWith(iS)}function UU(e){if(!of(e))throw new yt(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(iS.length),r=t.indexOf("/");if(r<=0)throw new yt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${e}`,"malformed");let n=t.slice(0,r);if(!PU.has(n))throw new yt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${e}`,"malformed");let s=t.slice(r+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 yt(`empty name in lmctl:// URI: ${e}`,"malformed");if(/[\\/]|\.\./.test(a))throw new yt(`invalid name in lmctl:// URI (no path separators): ${e}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function WU(e,t,r){if(e==="workflow")return bo(t,r);let n=e==="mcp"?Mn("templates","mcp",`${t}.json`):Mn("templates","skills",t,"SKILL.md");for(let s of dd(r)){let i=Mn(s,n);if(LU(i))return i}return null}function BU(e,t,r){let n=Mn(cd(r),jU,e);return e==="skill"?Mn(n,t,"SKILL.md"):Mn(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function qU(e,t){if(t.trim().length===0)return!1;if(e==="skill")return!0;let r=t.trim();if(e==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function oS(e,t){let{kind:r,name:n,ref:s}=UU(e),i=WU(r,n,t);if(i!==null)return i;let o=`${MU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(DU)})}catch(d){throw new yt(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new yt(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=FU.exec(s);if(d!==null){let u=RU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new yt(`lmctl:// '${e}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!qU(r,l))throw new yt(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=BU(r,n,t);return OU(CU(c),{recursive:!0}),$U(c,l,"utf8"),c}var iS,MU,jU,DU,PU,yt,FU,aS=E(()=>{"use strict";ud();iS="lmctl://",MU="https://lmctl.com/templates/",jU=".cache",DU=8e3,PU=new Set(["workflow","mcp","skill"]),yt=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},FU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as HU}from"node:child_process";import{cpSync as lS,existsSync as JU,mkdirSync as XU,mkdtempSync as GU,readFileSync as g9,statSync as VU,writeFileSync as cS}from"node:fs";import{homedir as KU,tmpdir as YU}from"node:os";import{basename as dS,join as Qt}from"node:path";function af(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function lf(e,t,r){if(Array.isArray(e)){for(let n of e)lf(n,t,r);return}if(af(e)){e.alias===t&&(Array.isArray(e.mcp)&&r.mcp.push(...e.mcp),Array.isArray(e.skills)&&r.skills.push(...e.skills));for(let n of Object.values(e))lf(n,t,r)}}function eW(e,t){let r={mcp:[],skills:[]},n=new Set;for(let i of e.listProjects()){if(i.team_id!==t.team_id)continue;let o=e.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!af(a)||!Array.isArray(a.steps)))for(let l of a.steps)af(l)&&l.members!==void 0&&lf(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(QU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function tW(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function rW(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(zU)})}catch(s){throw new Er(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new Er(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>uS)throw new Er(t,`fetched ${e} exceeds ${uS} bytes`);return n}function nW(e,t,r,n){let s=HU(e,t,{cwd:r,env:rr(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new Er(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new Er(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function sW(e){if(typeof e!="string")return e.name;let t=dS(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?dS(e.replace(/\/skill\.md$/i,"")):t}async function fS(e,t,r){let n=sW(e),s=Qt(t,n);if(XU(s,{recursive:!0}),typeof e!="string")return cS(Qt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(of(e)&&(e=await oS(e)),pS.test(e))return cS(Qt(s,"SKILL.md"),await rW(e,r),"utf8"),{name:n,dir:s};if(!JU(e))throw new Er(r,`skill path not found: ${e}`);return VU(e).isDirectory()?(lS(e,s,{recursive:!0}),{name:n,dir:s}):(lS(e,Qt(s,"SKILL.md")),{name:n,dir:s})}async function hS(e){let{dal:t,member:r,stderr:n}=e,s=eW(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=qe(r),o=r.sessiondir||e.baseDir||tW(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2388
- `)};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(ZU.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=GU(Qt(YU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!pS.test(c)?c:(await fS(c,l,r.alias)).dir;nW(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(mS[i]!==void 0){let l=mS[i]();for(let c of s.skills)await fS(c,l,r.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 Er,pS,zU,uS,ZU,QU,La,mS,_S=E(()=>{"use strict";Qe();aS();at();js();Er=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},pS=/^https?:\/\//i,zU=8e3,uS=1e6,ZU=new Set(["opencode"]),QU=e=>JSON.stringify(e),La=()=>process.env.HOME??KU();mS={claude:()=>Qt(La(),".claude","skills"),qwen:()=>Qt(La(),".qwen","skills"),codex:()=>Qt(La(),".codex","skills"),copilot:()=>Qt(La(),".copilot","skills")}});var cf,gS=E(()=>{"use strict";cf=`---
2387
+ `});import{existsSync as eS,mkdirSync as TU,readdirSync as bU,readFileSync as tS,writeFileSync as SU}from"node:fs";import{join as Cn}from"node:path";import{fileURLToPath as vU}from"node:url";function IU(e){try{return kU.some(t=>eS(Cn(e,t)))}catch{return!1}}function NU(e){let t=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(t===null)return null;let r=t[1],n=t[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),i=r.match(/^type:\s*(.+)$/m),o=r.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:n}}function rS(e,t){e.durable_memory_mode!=="db"?xU(e):AU(e,t)}function nS(e){let t=IU(e),r;try{r=bU(sf).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?t:!0)}function xU(e){let t=e.local_path;if(!t){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Cn(t,"durable-memory");try{TU(r,{recursive:!0})}catch(i){console.error("[bootstrap] failed to create durable-memory directory:",i);return}let n=nS(t),s=[];for(let i of n){let o=i.replace(/\.template$/,""),a=Cn(r,o);if(!eS(a))try{let l=tS(Cn(sf,i),"utf8");SU(a,l,"utf8"),s.push(o)}catch(l){console.error(`[bootstrap] failed to copy ${i}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function AU(e,t){let r=e.local_path??"",n=nS(r),s=[];for(let i of n){let o=Cn(sf,i),a;try{a=tS(o,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${i}:`,c);continue}let l=NU(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${i}`);continue}if(t.getDurableMemoryByName(e.id,l.name)===null)try{t.upsertDurableMemory({project_id:e.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${e.name}: ${s.join(", ")}`)}var sf,kU,sS=E(()=>{"use strict";sf=Cn(vU(import.meta.url),"../../config/durable_memory_templates"),kU=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{createHash as RU}from"node:crypto";import{existsSync as LU,mkdirSync as OU,writeFileSync as $U}from"node:fs";import{dirname as CU,join as Mn}from"node:path";function of(e){return typeof e=="string"&&e.startsWith(iS)}function UU(e){if(!of(e))throw new yt(`not an lmctl:// URI: ${e}`,"malformed");let t=e.slice(iS.length),r=t.indexOf("/");if(r<=0)throw new yt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${e}`,"malformed");let n=t.slice(0,r);if(!PU.has(n))throw new yt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${e}`,"malformed");let s=t.slice(r+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 yt(`empty name in lmctl:// URI: ${e}`,"malformed");if(/[\\/]|\.\./.test(a))throw new yt(`invalid name in lmctl:// URI (no path separators): ${e}`,"malformed");return{kind:n,name:a,...i!==void 0&&i.length>0?{ref:i}:{}}}function WU(e,t,r){if(e==="workflow")return bo(t,r);let n=e==="mcp"?Mn("templates","mcp",`${t}.json`):Mn("templates","skills",t,"SKILL.md");for(let s of dd(r)){let i=Mn(s,n);if(LU(i))return i}return null}function BU(e,t,r){let n=Mn(cd(r),jU,e);return e==="skill"?Mn(n,t,"SKILL.md"):Mn(n,`${t}${e==="workflow"?".compound.json":".json"}`)}function qU(e,t){if(t.trim().length===0)return!1;if(e==="skill")return!0;let r=t.trim();if(e==="mcp")try{let n=JSON.parse(r);return n!==null&&typeof n=="object"}catch{return!1}if(r.startsWith("{")||r.startsWith("["))try{return JSON.parse(r),!0}catch{return!1}return!0}async function oS(e,t){let{kind:r,name:n,ref:s}=UU(e),i=WU(r,n,t);if(i!==null)return i;let o=`${MU}${r}/${n}`,a;try{a=await fetch(o,{signal:AbortSignal.timeout(DU)})}catch(d){throw new yt(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (${d instanceof Error?d.message:String(d)}). Failing closed.`,"missing")}if(!a.ok)throw new yt(`lmctl:// '${e}' not found locally or at the remote catalog ${o} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let d=FU.exec(s);if(d!==null){let u=RU("sha256").update(l).digest("hex");if(u.toLowerCase()!==d[1].toLowerCase())throw new yt(`lmctl:// '${e}' remote artifact FAILED integrity pin (expected sha256 ${d[1]}, got ${u}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!qU(r,l))throw new yt(`lmctl:// '${e}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=BU(r,n,t);return OU(CU(c),{recursive:!0}),$U(c,l,"utf8"),c}var iS,MU,jU,DU,PU,yt,FU,aS=E(()=>{"use strict";ud();iS="lmctl://",MU="https://lmctl.com/templates/",jU=".cache",DU=8e3,PU=new Set(["workflow","mcp","skill"]),yt=class extends Error{reason;constructor(t,r="malformed"){super(t),this.reason=r,this.name="LmctlUriError"}},FU=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{spawnSync as HU}from"node:child_process";import{cpSync as lS,existsSync as JU,mkdirSync as XU,mkdtempSync as GU,readFileSync as y9,statSync as VU,writeFileSync as cS}from"node:fs";import{homedir as KU,tmpdir as YU}from"node:os";import{basename as dS,join as Qt}from"node:path";function af(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function lf(e,t,r){if(Array.isArray(e)){for(let n of e)lf(n,t,r);return}if(af(e)){e.alias===t&&(Array.isArray(e.mcp)&&r.mcp.push(...e.mcp),Array.isArray(e.skills)&&r.skills.push(...e.skills));for(let n of Object.values(e))lf(n,t,r)}}function eW(e,t){let r={mcp:[],skills:[]},n=new Set;for(let i of e.listProjects()){if(i.team_id!==t.team_id)continue;let o=e.getWorkflowByName(i.workflow_name);if(o===null||n.has(o.id))continue;n.add(o.id);let a;try{a=JSON.parse(o.definition)}catch{continue}if(!(!af(a)||!Array.isArray(a.steps)))for(let l of a.steps)af(l)&&l.members!==void 0&&lf(l.members,t.alias,r)}let s=i=>{let o=new Map;for(let a of i)o.set(QU(a),a);return[...o.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}function tW(e,t){return e.listProjects().find(r=>r.team_id===t.team_id)?.local_path}async function rW(e,t){let r;try{r=await fetch(e,{signal:AbortSignal.timeout(zU)})}catch(s){throw new Er(t,`fetch ${e} failed: ${s.message}`)}if(!r.ok)throw new Er(t,`fetch ${e} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>uS)throw new Er(t,`fetched ${e} exceeds ${uS} bytes`);return n}function nW(e,t,r,n){let s=HU(e,t,{cwd:r,env:rr(void 0,r),encoding:"utf8",timeout:6e4});if(s.error)throw new Er(n,`spawn ${e} failed: ${s.error.message}`);if(s.status!==0)throw new Er(n,`${e} ${t.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function sW(e){if(typeof e!="string")return e.name;let t=dS(e.replace(/\/+$/,""));return t.toLowerCase()==="skill.md"?dS(e.replace(/\/skill\.md$/i,"")):t}async function fS(e,t,r){let n=sW(e),s=Qt(t,n);if(XU(s,{recursive:!0}),typeof e!="string")return cS(Qt(s,"SKILL.md"),e.content,"utf8"),{name:n,dir:s};if(of(e)&&(e=await oS(e)),pS.test(e))return cS(Qt(s,"SKILL.md"),await rW(e,r),"utf8"),{name:n,dir:s};if(!JU(e))throw new Er(r,`skill path not found: ${e}`);return VU(e).isDirectory()?(lS(e,s,{recursive:!0}),{name:n,dir:s}):(lS(e,Qt(s,"SKILL.md")),{name:n,dir:s})}async function _S(e){let{dal:t,member:r,stderr:n}=e,s=eW(t,r);if(s.mcp.length===0&&s.skills.length===0)return;let i=qe(r),o=r.sessiondir||e.baseDir||tW(t,r)||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
2388
+ `)};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(ZU.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=GU(Qt(YU(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let d=typeof c=="string"&&!pS.test(c)?c:(await fS(c,l,r.alias)).dir;nW(i,["skills","install",d,"--scope","user","--consent"],o,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${i} skills install --scope user\` (idempotent).`)}else if(mS[i]!==void 0){let l=mS[i]();for(let c of s.skills)await fS(c,l,r.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 Er,pS,zU,uS,ZU,QU,La,mS,hS=E(()=>{"use strict";Qe();aS();at();js();Er=class extends Error{alias;constructor(t,r){super(`capability install failed for ${t}: ${r}`),this.alias=t,this.name="CapabilityInstallError"}},pS=/^https?:\/\//i,zU=8e3,uS=1e6,ZU=new Set(["opencode"]),QU=e=>JSON.stringify(e),La=()=>process.env.HOME??KU();mS={claude:()=>Qt(La(),".claude","skills"),qwen:()=>Qt(La(),".qwen","skills"),codex:()=>Qt(La(),".codex","skills"),copilot:()=>Qt(La(),".copilot","skills")}});var cf,gS=E(()=>{"use strict";cf=`---
2389
2389
 
2390
2390
  # Durable memory \u2014 how to use it
2391
2391
 
@@ -2403,15 +2403,15 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
2403
2403
  `)}${s.length>0?`
2404
2404
  `:""}`),0}function uW(e,t,r){let n=Q(e,[]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team show <name> [--json]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=r.listTeamMembers(i.id);if(V(n,"--json"))le(t,{team:i,members:o});else{t.stdout.write(`team ${i.name}
2405
2405
  `);for(let a of o)t.stdout.write(`- ${a.alias} ${qe(a)} ${a.sessionid??"(unseeded)"}
2406
- `)}return 0}function fW(e,t,r){let n=Q(e,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--alias"),a=P(n,"--provider");if(o===void 0||a===void 0)return v(t,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:P(n,"--model")??null,role:P(n,"--role")??"agent",sessiondir:P(n,"--sessiondir")??iW(vr(),"sessions",i.name,o)});return V(n,"--json")?le(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
2407
- `),0}async function yS(e,t,r,n){let s=Q(e,["--alias"]);if(s.error!==void 0)return v(t,s.error);let[i]=s.positionals;if(i===void 0)return v(t,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return v(t,`team not found: ${i}`);let a=P(s,"--alias");if(n&&a===void 0)return v(t,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=mW(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return v(t,`member not found or already seeded: ${a}`);if(n&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=r.listProjects().filter(m=>m.team_id===o.id),d=new Set;for(let m of c){if(d.has(m.workflow_name))continue;d.add(m.workflow_name);let p=r.getWorkflowByName(m.workflow_name);if(p===null)continue;let _=Ey(m.workflow_name,p.definition);if(_.status==="FAIL")return v(t,`cannot seed team \`${o.name}\`: workflow \`${m.workflow_name}\` failed verify-at-seed \u2014 ${_.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let m of c)rS(m,r);let u=[],f=!1;for(let m of l){let p=await Di({member:m,dal:r}),_=r.updateTeamMemberSession(m.id,p.sessionid);if(_!==null){let g=_.role_prompt??"",h=g.length>0?`${g}
2406
+ `)}return 0}function fW(e,t,r){let n=Q(e,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=F(n,"--alias"),a=F(n,"--provider");if(o===void 0||a===void 0)return v(t,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:i.id,alias:o,provider:a,model:F(n,"--model")??null,role:F(n,"--role")??"agent",sessiondir:F(n,"--sessiondir")??iW(vr(),"sessions",i.name,o)});return V(n,"--json")?le(t,l):t.stdout.write(`added member ${l.alias} to ${i.name}
2407
+ `),0}async function yS(e,t,r,n){let s=Q(e,["--alias"]);if(s.error!==void 0)return v(t,s.error);let[i]=s.positionals;if(i===void 0)return v(t,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let o=r.findTeamByName(i);if(o===null)return v(t,`team not found: ${i}`);let a=F(s,"--alias");if(n&&a===void 0)return v(t,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=mW(r.listTeamMembers(o.id),a,n);if(a!==void 0&&l.length===0)return v(t,`member not found or already seeded: ${a}`);if(n&&l.some(m=>m.alias.toLowerCase()==="lead"||m.role==="lead"))return v(t,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=r.listProjects().filter(m=>m.team_id===o.id),d=new Set;for(let m of c){if(d.has(m.workflow_name))continue;d.add(m.workflow_name);let p=r.getWorkflowByName(m.workflow_name);if(p===null)continue;let h=Ey(m.workflow_name,p.definition);if(h.status==="FAIL")return v(t,`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)rS(m,r);let u=[],f=!1;for(let m of l){let p=await Di({member:m,dal:r}),h=r.updateTeamMemberSession(m.id,p.sessionid);if(h!==null){let g=h.role_prompt??"",_=g.length>0?`${g}
2408
2408
 
2409
- ${cf}`:cf;r.setMemberPromptSnapshot(m.id,h),u.push(_);let y=ua(qe(_),p.sessionid);y!==null&&t.stderr.write(`[seeded ${_.alias}] customize/compact in its native TUI:
2409
+ ${cf}`:cf;r.setMemberPromptSnapshot(m.id,_),u.push(h);let y=ua(qe(h),p.sessionid);y!==null&&t.stderr.write(`[seeded ${h.alias}] customize/compact in its native TUI:
2410
2410
  ${y}
2411
- `);try{await hS({dal:r,member:_,stderr:t.stderr})}catch(T){f=!0,t.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
2411
+ `);try{await _S({dal:r,member:h,stderr:t.stderr})}catch(T){f=!0,t.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
2412
2412
  `)}}}return V(s,"--json")?le(t,u):t.stdout.write(`seeded ${u.length} member(s)
2413
- `),f?1:0}function mW(e,t,r){return e.filter(n=>t!==void 0&&n.alias!==t?!1:r||n.sessionid===null)}function pW(e,t,r){let n=Q(e,["--interpreter","--of"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=P(n,"--interpreter"),a=P(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(t,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(t,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(t,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
2414
- `),0}var oW,ES=E(()=>{"use strict";Be();Sc();sS();Qe();yr();_S();Oo();Le();gS();oW=`usage: lmctl team create <name>
2413
+ `),f?1:0}function mW(e,t,r){return e.filter(n=>t!==void 0&&n.alias!==t?!1:r||n.sessionid===null)}function pW(e,t,r){let n=Q(e,["--interpreter","--of"]);if(n.error!==void 0)return v(t,n.error);let[s]=n.positionals;if(s===void 0)return v(t,"usage: team companion <team-name> --interpreter A --of B[,C]");let i=r.findTeamByName(s);if(i===null)return v(t,`team not found: ${s}`);let o=F(n,"--interpreter"),a=F(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(o===void 0||a===void 0||a.length===0)return v(t,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(i.id,o);if(l===null)return v(t,`member not found: ${o}`);for(let c of a){let d=r.findTeamMemberByAlias(i.id,c);if(d===null)return v(t,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:d.id})}return t.stdout.write(`recorded ${a.length} companion link(s)
2414
+ `),0}var oW,ES=E(()=>{"use strict";Be();Sc();sS();Qe();yr();hS();Oo();Le();gS();oW=`usage: lmctl team create <name>
2415
2415
  lmctl team list [--json]
2416
2416
  lmctl team show <name> [--json]
2417
2417
  lmctl team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D] [--json]
@@ -2424,8 +2424,8 @@ Manage DB-backed teams, members, and provider session lifecycle. Use seed or
2424
2424
  refresh to create/update native provider sessions for team members.
2425
2425
  team refresh rejects Lead members (alias matching is case-insensitive).
2426
2426
  `});var NS={};Ee(NS,{applyMaxBytes:()=>Oa,renderMessage:()=>kS,runTail:()=>wW});async function wW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${yW}
2427
- `),0;let r=Q(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--lines"),s=P(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(t,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?_W:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return v(t,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=V(r,"--watch"),a=P(r,"--watch-interval"),l=a===void 0?gW:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return v(t,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=P(r,"--run");if(c!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--session")!==void 0)return v(t,"--run is mutually exclusive with --session");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return v(t,`invalid --run "${c}" (expected a positive integer run id)`);try{return await O(t,async p=>EW(t,p,m,i,o,l))}catch(p){return Pe(t,p)}}let d=gr(hW,{target:r.positionals[0],alias:r.positionals[1],flags:{session:P(r,"--session"),provider:P(r,"--provider")}});if(d.mode==="error")return v(t,d.message);if(d.mode==="managed")return v(t,"tail managed mode requires --run <id>");let u;if(d.mode==="ai-team")if(d.alias===void 0){let m;try{m=await O(t,g=>Te(d.teamfile,g))}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Fe(m)}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let _=Lt(p);if(_===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(t,h=>$e(d.teamfile,_.alias,h));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof we?v(t,g.message):Pe(t,g)}}else try{let m=await O(t,p=>$e(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof we?v(t,m.message):Pe(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let _=await kn(m);if(_.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(_.length>1)return v(t,`tail: session "${m}" matches multiple providers (${_.join(", ")}); pass --provider`);p=_[0]}u={provider:p,sessionId:m}}let f=await TS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let h=await TS(t,u.provider,u.sessionId,i,f);h>=0&&(f=h)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2428
- `)}},_=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(_),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function TS(e,t,r,n,s){let i;try{i=await Ye(r,t)}catch(c){return e.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2427
+ `),0;let r=Q(e,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return v(t,r.error);let n=F(r,"--lines"),s=F(r,"--max-bytes");if(n!==void 0&&s!==void 0)return v(t,"--lines and --max-bytes are mutually exclusive (choose one)");let i;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return v(t,`invalid --lines "${n}" (expected a positive integer)`);i={kind:"lines",lines:m}}else{let m=s===void 0?hW:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return v(t,`invalid --max-bytes "${s}" (expected a non-negative integer)`);i={kind:"bytes",maxBytes:m}}let o=V(r,"--watch"),a=F(r,"--watch-interval"),l=a===void 0?gW:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return v(t,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=F(r,"--run");if(c!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(F(r,"--session")!==void 0)return v(t,"--run is mutually exclusive with --session");if(F(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return v(t,`invalid --run "${c}" (expected a positive integer run id)`);try{return await O(t,async p=>EW(t,p,m,i,o,l))}catch(p){return Pe(t,p)}}let d=gr(_W,{target:r.positionals[0],alias:r.positionals[1],flags:{session:F(r,"--session"),provider:F(r,"--provider")}});if(d.mode==="error")return v(t,d.message);if(d.mode==="managed")return v(t,"tail managed mode requires --run <id>");let u;if(d.mode==="ai-team")if(d.alias===void 0){let m;try{m=await O(t,g=>Te(d.teamfile,g))}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let p;try{p=Fe(m)}catch(g){return v(t,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=Lt(p);if(h===void 0)return v(t,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=await O(t,_=>$e(d.teamfile,h.alias,_));u={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof we?v(t,g.message):Pe(t,g)}}else try{let m=await O(t,p=>$e(d.teamfile,d.alias,p));u={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof we?v(t,m.message):Pe(t,m)}else{let m=d.sessionid,p=d.provider;if(p===void 0){let h=await kn(m);if(h.length===0)return v(t,`tail: session "${m}" not found in any provider store`);if(h.length>1)return v(t,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}u={provider:p,sessionId:m}}let f=await TS(t,u.provider,u.sessionId,i,-1);return f<0?1:o?await new Promise(m=>{let p=async()=>{try{let _=await TS(t,u.provider,u.sessionId,i,f);_>=0&&(f=_)}catch(_){t.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2428
+ `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function TS(e,t,r,n,s){let i;try{i=await Ye(r,t)}catch(c){return e.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
2429
2429
  `),-1}if(i===null)return e.stderr.write(`tail: session not found: ${r} (provider=${t})
2430
2430
  `),-1;let o=i.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,o.length-n.lines):s+1;if(a>=o.length)return o.length-1;let l="";for(let c=a;c<o.length;c+=1)l+=`${kS(o[c])}
2431
2431
  `;return e.stdout.write(n.kind==="bytes"?Oa(l,n.maxBytes):l),o.length-1}function kS(e){let t=IS(e.timestamp),r=t?`${t} ${e.role}`:e.role,s=(e.content??"").replace(/\r\n/g,`
@@ -2434,9 +2434,9 @@ team refresh rejects Lead members (alias matching is case-insensitive).
2434
2434
  `),i=s[0]??"",o=s.slice(1);return o.length===0?`${r}: ${i}`:`${r}: ${i}
2435
2435
  ${o.map(a=>` ${a}`).join(`
2436
2436
  `)}`}async function EW(e,t,r,n,s,i){if(t.getRun(r)===null)return v(e,`tail: run ${r}: not found`);let a=t.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(u=>`${vS(u)}
2437
- `).join("");e.stdout.write(n.kind==="bytes"?Oa(c,n.maxBytes):c);let d=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let m=setInterval(()=>{try{let _=t.listSessionEvents(r,d),g="";for(let h of _)g+=`${vS(h)}
2438
- `,d=h.id;g.length>0&&e.stdout.write(n.kind==="bytes"?Oa(g,n.maxBytes):g)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
2439
- `)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Oa(e,t){if(t===0||Buffer.byteLength(e,"utf8")<=t)return e;let n=Buffer.byteLength(bS,"utf8");if(n>=t)return SS(e,t);let s=t-n,i=SS(e,s);return`${bS}${i}`}function SS(e,t){if(t<=0)return"";let r=Buffer.from(e,"utf8"),n=Math.max(0,r.length-t);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function vS(e){let t=IS(new Date(e.timestamp_ms))??"",r="";try{let i=JSON.parse(e.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:e.payload.slice(0,200),s=e.step_id===null?"":` step=${e.step_id}`;return`${t} ${e.kind}${s}: ${n}`}function IS(e){if(e===void 0)return;let t=e instanceof Date?e:new Date(e);if(Number.isNaN(t.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())} ${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}var hW,_W,gW,yW,bS,xS=E(()=>{"use strict";yr();Le();_t();zt();Ot();hW={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},_W=4096,gW=2,yW=`usage: lmctl tail [target] [alias]
2437
+ `).join("");e.stdout.write(n.kind==="bytes"?Oa(c,n.maxBytes):c);let d=a.length>0?a[a.length-1].id:0;return s?await new Promise(u=>{let m=setInterval(()=>{try{let h=t.listSessionEvents(r,d),g="";for(let _ of h)g+=`${vS(_)}
2438
+ `,d=_.id;g.length>0&&e.stdout.write(n.kind==="bytes"?Oa(g,n.maxBytes):g)}catch(h){e.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
2439
+ `)}},i*1e3),p=()=>{clearInterval(m),u(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Oa(e,t){if(t===0||Buffer.byteLength(e,"utf8")<=t)return e;let n=Buffer.byteLength(bS,"utf8");if(n>=t)return SS(e,t);let s=t-n,i=SS(e,s);return`${bS}${i}`}function SS(e,t){if(t<=0)return"";let r=Buffer.from(e,"utf8"),n=Math.max(0,r.length-t);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function vS(e){let t=IS(new Date(e.timestamp_ms))??"",r="";try{let i=JSON.parse(e.payload);typeof i.alias=="string"&&(r=`alias=${i.alias}`),typeof i.provider=="string"&&(r+=`${r?" ":""}provider=${i.provider}`),typeof i.tool=="string"&&(r+=`${r?" ":""}tool=${i.tool}`),typeof i.status=="string"&&(r+=`${r?" ":""}status=${i.status}`),(typeof i.tokens_in=="number"||typeof i.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${i.tokens_in??0}/${i.tokens_out??0}`)}catch{}let n=r!==""?r:e.payload.slice(0,200),s=e.step_id===null?"":` step=${e.step_id}`;return`${t} ${e.kind}${s}: ${n}`}function IS(e){if(e===void 0)return;let t=e instanceof Date?e:new Date(e);if(Number.isNaN(t.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${t.getFullYear()}-${r(t.getMonth()+1)}-${r(t.getDate())} ${r(t.getHours())}:${r(t.getMinutes())}:${r(t.getSeconds())}`}var _W,hW,gW,yW,bS,xS=E(()=>{"use strict";yr();Le();ht();zt();Ot();_W={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},hW=4096,gW=2,yW=`usage: lmctl tail [target] [alias]
2440
2440
  lmctl tail --session <id> [--provider <name>]
2441
2441
  lmctl tail --run <id>
2442
2442
  [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
@@ -2445,7 +2445,7 @@ Print or watch provider session messages, or follow a managed run timeline.
2445
2445
  A bare <teamfile> with no alias tails that team's Lead member.
2446
2446
  --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;bS=`\u2026 [truncated older output \u2014 raise with --max-bytes]
2447
2447
  `});var jS={};Ee(jS,{runInfo:()=>kW});import{execFileSync as df}from"node:child_process";import{dirname as AS,resolve as TW}from"node:path";function vW(e){return e>=1e6?`${(e/1e6).toFixed(1)}M`:e>=1e3?`${Math.round(e/1e3)}K`:String(e)}async function kW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${SW}
2448
- `),0;let r=Q(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=V(r,"--json"),s=P(r,"--run");if(s!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(P(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return v(t,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(t,async u=>NW(t,u,d,n))}catch(u){return Pe(t,u)}}let i=gr(bW,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:P(r,"--provider")}});if(i.mode==="error")return v(t,i.message);if(i.mode==="managed")return v(t,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await O(t,u=>Te(i.teamfile,u))}catch(u){return v(t,`health: ${u instanceof Error?u.message:String(u)}`)}return xW(t,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await O(t,u=>$e(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof we?v(t,d.message):Pe(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await kn(a);if(d.length===0)return v(t,`health: session "${a}" not found in any provider store`);if(d.length>1)return v(t,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return IW(t,o,a,l,n,c)}async function IW(e,t,r,n,s,i){let o;try{o=await Ye(r,t)}catch(d){return v(e,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return v(e,`health: session not found: ${r} (provider=${t})`);let a=Fs(o.messages),l=i===void 0?null:await AW(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...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?(le(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
2448
+ `),0;let r=Q(e,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=V(r,"--json"),s=F(r,"--run");if(s!==void 0){if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional [target] [alias]");if(F(r,"--provider")!==void 0)return v(t,"--run is mutually exclusive with --provider");let d=Number.parseInt(s,10);if(!Number.isFinite(d)||d<=0||String(d)!==s)return v(t,`invalid --run "${s}" (expected a positive integer run id)`);try{return await O(t,async u=>NW(t,u,d,n))}catch(u){return Pe(t,u)}}let i=gr(bW,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:F(r,"--provider")}});if(i.mode==="error")return v(t,i.message);if(i.mode==="managed")return v(t,"health managed mode requires --run <id>");if(i.mode==="ai-team"&&i.alias===void 0){let d;try{d=await O(t,u=>Te(i.teamfile,u))}catch(u){return v(t,`health: ${u instanceof Error?u.message:String(u)}`)}return xW(t,d,n)}let o,a,l,c;if(i.mode==="ai-team")try{let d=await O(t,u=>$e(i.teamfile,i.alias,u));o=d.provider,a=d.sessionid,l=d.alias,c={teamfile:d.teamfile,alias:d.alias}}catch(d){return d instanceof we?v(t,d.message):Pe(t,d)}else if(a=i.sessionid,i.provider!==void 0)o=i.provider;else{let d=await kn(a);if(d.length===0)return v(t,`health: session "${a}" not found in any provider store`);if(d.length>1)return v(t,`health: session "${a}" matches multiple providers (${d.join(", ")}); pass --provider`);o=d[0]}return IW(t,o,a,l,n,c)}async function IW(e,t,r,n,s,i){let o;try{o=await Ye(r,t)}catch(d){return v(e,`health: failed to load session: ${d instanceof Error?d.message:String(d)}`)}if(o===null)return v(e,`health: session not found: ${r} (provider=${t})`);let a=Fs(o.messages),l=i===void 0?null:await AW(e,i,o),c={provider:o.provider,sessionId:o.sessionId,sessionid:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},...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?(le(e,c),0):(e.stdout.write(`Session: ${o.sessionId}
2449
2449
  `),e.stdout.write(` Provider: ${o.provider}
2450
2450
  `),n!==void 0&&e.stdout.write(` Alias: ${n}
2451
2451
  `),l!==null&&e.stdout.write(` Liveness: ${uf(l.liveness)}
@@ -2470,33 +2470,33 @@ A bare <teamfile> with no alias tails that team's Lead member.
2470
2470
  `),e.stdout.write(` AgentCalls: ${o.agentCallCount}
2471
2471
  `),e.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out
2472
2472
  `),0)}async function xW(e,t,r){let n,s;try{let T=await O(e,b=>{let I=Ue(t,b);if(I.parseErrors.length>0)throw new Error(I.parseErrors.join("; "));return{teamName:I.name,targets:RS(t,b,new Set,[])}});s=T.teamName,n=T.targets}catch(T){return v(e,`health: ${T instanceof Error?T.message:String(T)}`)}let i=$S(t),o=i.kind==="repo"?i:null,a=await LS(e,n),l=[],c=0,d=o===null?void 0:0,u=o===null?void 0:0;for(let T of n){let b=null;try{b=await Ye(T.sessionid,T.provider)}catch(U){e.stderr.write(`warning: failed to load session "${T.sessionid}" for ${T.reportPath} (${T.provider}): ${U instanceof Error?U.message:String(U)}
2473
- `)}let I=b?.messageCount,x=o===null?void 0:b===null?null:CS(b,o.since),H=o===null?void 0:b===null?null:MS(b)??"n/a",me=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:T.alias,reportPath:T.reportPath,teamfile:T.teamfile,provider:T.provider,sessionid:T.sessionid,messageCount:I??null,model:b?.model??"(unknown)",lastContext:b?.lastInputTokens,detailLoaded:b!==null,liveness:a.get(ff(T.teamfile,T.alias))??mf(),sessionLimit:b===null?null:Fs(b.messages),...o!==null?{activitySinceLastCommit:me,cumulativeTokens:H}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(x==null?d=void 0:d!==void 0&&(d+=x),H==null||H==="n/a"?u=void 0:u!==void 0&&(u+=H))}if(r)return le(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(T=>({ref:T.ref,timestamp:T.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:T,cumulativeTokens:b,...I})=>({...I,lastContext:I.lastContext??null,...b!==void 0?{cumulativeTokens:b==="n/a"?null:b}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(T=>T.sessionid.length)),m=Math.max(5,...l.map(T=>T.reportPath.length))+1,p=Math.max(8,...l.map(T=>T.provider.length))+1,_=Math.max(5,...l.map(T=>T.model.length))+1,g=Math.max(4,...l.map(T=>uf(T.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
2473
+ `)}let I=b?.messageCount,x=o===null?void 0:b===null?null:CS(b,o.since),H=o===null?void 0:b===null?null:MS(b)??"n/a",pe=o===null?void 0:{messageCount:x??null,tokens:null};l.push({alias:T.alias,reportPath:T.reportPath,teamfile:T.teamfile,provider:T.provider,sessionid:T.sessionid,messageCount:I??null,model:b?.model??"(unknown)",lastContext:b?.lastInputTokens,detailLoaded:b!==null,liveness:a.get(ff(T.teamfile,T.alias))??mf(),sessionLimit:b===null?null:Fs(b.messages),...o!==null?{activitySinceLastCommit:pe,cumulativeTokens:H}:{}}),I===void 0?c=void 0:c!==void 0&&(c+=I),o!==null&&(x==null?d=void 0:d!==void 0&&(d+=x),H==null||H==="n/a"?u=void 0:u!==void 0&&(u+=H))}if(r)return le(e,{team:s,git:o===null?null:{teamDir:o.teamDir,commits:o.commits.map(T=>({ref:T.ref,timestamp:T.timestamp.toISOString()})),since:o.since.toISOString(),working:o.working},members:l.map(({detailLoaded:T,cumulativeTokens:b,...I})=>({...I,lastContext:I.lastContext??null,...b!==void 0?{cumulativeTokens:b==="n/a"?null:b}:{}})),total:{messageCount:c??null}}),0;let f=Math.max(7,...l.map(T=>T.sessionid.length)),m=Math.max(5,...l.map(T=>T.reportPath.length))+1,p=Math.max(8,...l.map(T=>T.provider.length))+1,h=Math.max(5,...l.map(T=>T.model.length))+1,g=Math.max(4,...l.map(T=>uf(T.liveness).length))+1;if(e.stdout.write(`TEAM: ${s}
2474
2474
  `),i.kind==="repo"){e.stdout.write(`Git progress:
2475
2475
  `);for(let T of i.commits)e.stdout.write(` ${T.ref}: ${T.timestamp.toISOString()}
2476
2476
  `);e.stdout.write(` Uncommitted: ${wt(i.working.uncommittedTracked)} changed (tracked), ${wt(i.working.untracked)} untracked
2477
2477
  `)}else i.reason==="no-commits"?e.stdout.write(`Git progress: git repository in ${i.teamDir} has no commits (no commit-based progress to report)
2478
2478
  `):e.stdout.write(`Git progress: no git repository in ${i.teamDir} (no commit-based progress to report)
2479
- `);e.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(_)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2480
- `);let h=!1,y=l.filter(T=>T.sessionLimit!==null);for(let T of l){let b=OW(T.lastContext,T.detailLoaded,vW);(b==="n/a"||T.cumulativeTokens==="n/a")&&(h=!0),e.stdout.write(` ${T.sessionid.padEnd(f)} ${T.reportPath.padEnd(m)}${T.provider.padEnd(p)}${T.model.padEnd(_)}${uf(T.liveness).padEnd(g)}${wt(T.messageCount).padStart(6)} ${b.padStart(12)}`+(o!==null?` ${wt(T.activitySinceLastCommit?.messageCount).padStart(17)} ${wt(T.activitySinceLastCommit?.tokens).padStart(19)} ${LW(T.cumulativeTokens).padStart(19)}`:"")+`
2481
- `)}if(e.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(_)}${"".padEnd(g)}${wt(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${wt(d).padStart(17)} ${wt(null).padStart(19)} ${wt(u).padStart(19)}`:"")+`
2482
- `),h&&e.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2479
+ `);e.stdout.write(` ${"SESSION".padEnd(f)} ${"ALIAS".padEnd(m)}${"PROVIDER".padEnd(p)}${"MODEL".padEnd(h)}${"LIVE".padEnd(g)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}`+(o!==null?` ${"MSGS SINCE COMMIT".padStart(17)} ${"TOKENS SINCE COMMIT".padStart(19)} ${"TOKENS (cumulative)".padStart(19)}`:"")+`
2480
+ `);let _=!1,y=l.filter(T=>T.sessionLimit!==null);for(let T of l){let b=OW(T.lastContext,T.detailLoaded,vW);(b==="n/a"||T.cumulativeTokens==="n/a")&&(_=!0),e.stdout.write(` ${T.sessionid.padEnd(f)} ${T.reportPath.padEnd(m)}${T.provider.padEnd(p)}${T.model.padEnd(h)}${uf(T.liveness).padEnd(g)}${wt(T.messageCount).padStart(6)} ${b.padStart(12)}`+(o!==null?` ${wt(T.activitySinceLastCommit?.messageCount).padStart(17)} ${wt(T.activitySinceLastCommit?.tokens).padStart(19)} ${LW(T.cumulativeTokens).padStart(19)}`:"")+`
2481
+ `)}if(e.stdout.write(` ${"TOTAL".padEnd(f)} ${"".padEnd(m)}${"".padEnd(p)}${"".padEnd(h)}${"".padEnd(g)}${wt(c).padStart(6)}`+(o!==null?` ${"".padStart(12)} ${wt(d).padStart(17)} ${wt(null).padStart(19)} ${wt(u).padStart(19)}`:"")+`
2482
+ `),_&&e.stdout.write(`n/a = this provider does not expose a context/token total; absence is not a health signal.
2483
2483
  `),e.stdout.write(`LAST CONTEXT = prompt size of the LAST COMPLETED turn, so it LAGS BY ONE TURN.
2484
2484
  Right after a compaction the last completed turn IS the summarisation request, which carried the
2485
2485
  full pre-compaction prompt \u2014 so this reads the OLD large number while the live context is already
2486
2486
  small. Re-read after the next turn before concluding a compaction failed or gating on the value.
2487
2487
  `),y.length>0){e.stdout.write(`Session limits:
2488
2488
  `);for(let T of y)e.stdout.write(` ${T.reportPath}: LIMITED resets_at=${OS(T.sessionLimit)}
2489
- `)}return 0}function RS(e,t,r,n){let s=Te(e,t);if(r.has(s))return[];r.add(s);let i=Ue(s,t);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(...RS(TW(AS(s),a.teamfile),t,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function AW(e,t,r){let n=await LS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=$S(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(ff(t.teamfile,t.alias))??mf(),...i!==null?{activitySinceLastCommit:{messageCount:CS(r,i.since),tokens:null},cumulativeTokens:MS(r)??"n/a"}:{}}}async function LS(e,t){try{let r=await O(e,n=>t.map(s=>{let i=Yt(n,s.teamfile,s.alias);return[ff(s.teamfile,s.alias),RW(i)]}));return new Map(r)}catch{return new Map}}function ff(e,t){return`${e}\0${t.toLowerCase()}`}function RW(e){return e.busy?e.reason==="terminal-held"?e.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:e.terminalInvocation.id,startedAt:e.terminalInvocation.started_at,lastHeartbeat:e.terminalInvocation.last_heartbeat_at,holderPid:e.terminalInvocation.holder_pid,holderHost:e.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:e.terminalLock.started_at,lastHeartbeat:e.terminalLock.last_heartbeat,holderPid:e.terminalLock.holder_pid,holderHost:e.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:e.inFlight.sender_teamfile,senderAlias:e.inFlight.sender_alias,startedAt:e.inFlight.started_at,activeCount:e.inFlight.active_count,holderPid:e.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:mf()}function mf(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function uf(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function OS(e){return e.resets_at!==null?e.resets_at:e.timezone!==null?`${e.reset_time} (${e.timezone})`:e.reset_time}function wt(e){return e==null?"unknown":String(e)}function LW(e){return e==="n/a"?e:wt(e)}function OW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function $S(e){let t=AS(e),r;try{df("git",["-C",t,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:t}}try{r=df("git",["-C",t,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:t}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:t};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:t,since:s[0].timestamp,commits:s,working:$W(t)}}function $W(e){let t;try{t=df("git",["-C",e,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of t.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function CS(e,t){let r=t.getTime();return e.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function MS(e){if(e===null)return null;let t=[e.totalInputTokens,e.totalCachedInputTokens,e.totalCacheWriteInputTokens,e.totalOutputTokens,e.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return t.length===0?null:t.reduce((r,n)=>r+n,0)}var bW,SW,DS=E(()=>{"use strict";yr();Le();_t();Ot();Ur();Ht();Yu();bW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},SW=`usage: lmctl health [target] [alias]
2489
+ `)}return 0}function RS(e,t,r,n){let s=Te(e,t);if(r.has(s))return[];r.add(s);let i=Ue(s,t);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(...RS(TW(AS(s),a.teamfile),t,r,[...n,a.alias]));continue}a.session===void 0||a.session.length===0||o.push({teamfile:s,alias:a.alias,reportPath:[...n,a.alias].join("/"),provider:a.provider,sessionid:a.session})}return o}async function AW(e,t,r){let n=await LS(e,[{teamfile:t.teamfile,alias:t.alias}]),s=$S(t.teamfile),i=s.kind==="repo"?s:null;return{teamfile:t.teamfile,reportPath:t.alias,lastContext:r.lastInputTokens??null,liveness:n.get(ff(t.teamfile,t.alias))??mf(),...i!==null?{activitySinceLastCommit:{messageCount:CS(r,i.since),tokens:null},cumulativeTokens:MS(r)??"n/a"}:{}}}async function LS(e,t){try{let r=await O(e,n=>t.map(s=>{let i=Yt(n,s.teamfile,s.alias);return[ff(s.teamfile,s.alias),RW(i)]}));return new Map(r)}catch{return new Map}}function ff(e,t){return`${e}\0${t.toLowerCase()}`}function RW(e){return e.busy?e.reason==="terminal-held"?e.source==="terminal-invocation"?{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:null,terminalInvocation:{id:e.terminalInvocation.id,startedAt:e.terminalInvocation.started_at,lastHeartbeat:e.terminalInvocation.last_heartbeat_at,holderPid:e.terminalInvocation.holder_pid,holderHost:e.terminalInvocation.holder_host}}:{state:"busy",reason:"terminal-held",inFlight:null,terminalLock:{startedAt:e.terminalLock.started_at,lastHeartbeat:e.terminalLock.last_heartbeat,holderPid:e.terminalLock.holder_pid,holderHost:e.terminalLock.holder_host},terminalInvocation:null}:{state:"busy",reason:"in-flight",inFlight:{senderTeamfile:e.inFlight.sender_teamfile,senderAlias:e.inFlight.sender_alias,startedAt:e.inFlight.started_at,activeCount:e.inFlight.active_count,holderPid:e.inFlight.holder_pid},terminalLock:null,terminalInvocation:null}:mf()}function mf(){return{state:"idle",reason:null,inFlight:null,terminalLock:null,terminalInvocation:null}}function uf(e){return e.state==="idle"?"idle":`busy (${e.reason})`}function OS(e){return e.resets_at!==null?e.resets_at:e.timezone!==null?`${e.reset_time} (${e.timezone})`:e.reset_time}function wt(e){return e==null?"unknown":String(e)}function LW(e){return e==="n/a"?e:wt(e)}function OW(e,t,r=String){return e!==void 0?r(e):t?"n/a":"unknown"}function $S(e){let t=AS(e),r;try{df("git",["-C",t,"rev-parse","--is-inside-work-tree"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-repo",teamDir:t}}try{r=df("git",["-C",t,"log","-2","--format=%ct"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{kind:"unavailable",reason:"no-commits",teamDir:t}}let n=r.split(/\r?\n/).map(i=>Number.parseInt(i.trim(),10)).filter(i=>Number.isFinite(i)&&i>0);if(n.length===0)return{kind:"unavailable",reason:"no-commits",teamDir:t};let s=n.slice(0,2).map((i,o)=>({ref:o===0?"HEAD":`HEAD~${o}`,timestamp:new Date(i*1e3)}));return{kind:"repo",teamDir:t,since:s[0].timestamp,commits:s,working:$W(t)}}function $W(e){let t;try{t=df("git",["-C",e,"status","--porcelain"],{encoding:"utf8",stdio:["ignore","pipe","ignore"]})}catch{return{uncommittedTracked:null,untracked:null}}let r=0,n=0;for(let s of t.split(/\r?\n/))s.trim().length!==0&&(s.startsWith("??")?n+=1:r+=1);return{uncommittedTracked:r,untracked:n}}function CS(e,t){let r=t.getTime();return e.messages.filter(n=>(n.role==="user"||n.role==="assistant")&&Number.isFinite(n.timestamp.getTime())&&n.timestamp.getTime()>r).length}function MS(e){if(e===null)return null;let t=[e.totalInputTokens,e.totalCachedInputTokens,e.totalCacheWriteInputTokens,e.totalOutputTokens,e.totalReasoningOutputTokens].filter(r=>typeof r=="number"&&Number.isFinite(r));return t.length===0?null:t.reduce((r,n)=>r+n,0)}var bW,SW,DS=E(()=>{"use strict";yr();Le();ht();Ot();Ur();Ht();Yu();bW={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},SW=`usage: lmctl health [target] [alias]
2490
2490
  lmctl health <teamfile> # team rollup
2491
2491
  lmctl health <sessionid> [--provider <name>]
2492
2492
  lmctl health --run <id> # run state, step rollup, and token totals
2493
2493
  [--json]
2494
2494
 
2495
2495
  Show provider session details, team rollups, or managed run state/token totals.`});var FS={};Ee(FS,{runLs:()=>DW});import{resolve as pf}from"node:path";function jW(e){let t=new Map;for(let r of e){let n=`${r.provider}:${r.sessionId}`,s=t.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&t.set(n,r)}return[...t.values()]}async function DW(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(`${CW}
2496
- `),0;let r=Q(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=P(r,"--format"),s=V(r,"--json");if(V(r,"--runs")){for(let h of["--provider","--sessiondir"])if(P(r,h)!==void 0)return v(t,`--runs is mutually exclusive with ${h}`);for(let h of["--recursive","--all"])if(V(r,h))return v(t,`--runs is mutually exclusive with ${h}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=P(r,"--limit"),_=MW;if(p!==void 0){let h=Number.parseInt(p,10);if(!Number.isFinite(h)||h<1||String(h)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(h>PS)return v(t,`--limit ${h} exceeds maximum (${PS})`);_=h}let g=n==="json"||s===!0?"json":"table";try{return await O(t,async h=>PW(t,h,_,g))}catch(h){return Pe(t,h)}}let o=FW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=P(r,"--provider"),c=P(r,"--sessiondir"),d=V(r,"--recursive"),u=V(r,"--all"),f;try{f=await hc(l?{provider:l}:{})}catch(p){return v(t,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?pf(c):pf(process.cwd());f=f.filter(_=>{let g=pf(_.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=jW(f),a==="json")return le(t,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),_=d?"under":"in";t.stdout.write(`No native sessions found ${_} ${p}.
2496
+ `),0;let r=Q(e,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length>0)return v(t,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=F(r,"--format"),s=V(r,"--json");if(V(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(F(r,_)!==void 0)return v(t,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(V(r,_))return v(t,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return v(t,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=F(r,"--limit"),h=MW;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return v(t,`invalid --limit "${p}" (expected a positive integer)`);if(_>PS)return v(t,`--limit ${_} exceeds maximum (${PS})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await O(t,async _=>PW(t,_,h,g))}catch(_){return Pe(t,_)}}let o=FW(n,s);if("error"in o)return v(t,o.error);let a=o.format,l=F(r,"--provider"),c=F(r,"--sessiondir"),d=V(r,"--recursive"),u=V(r,"--all"),f;try{f=await _c(l?{provider:l}:{})}catch(p){return v(t,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!u){let p=c!==void 0?pf(c):pf(process.cwd());f=f.filter(h=>{let g=pf(h.cwd);return d?g===p||g.startsWith(`${p}/`):g===p})}if(f=jW(f),a==="json")return le(t,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=u?"(all)":c??process.cwd(),h=d?"under":"in";t.stdout.write(`No native sessions found ${h} ${p}.
2497
2497
  `)}return 0}if(a==="teamfile"){for(let p of f)t.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
2498
2498
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));t.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
2499
- `);for(let p of f){let _=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;t.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${_.padEnd(36)} ${p.modifiedAt.toISOString()}
2499
+ `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;t.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
2500
2500
  `)}return 0}async function PW(e,t,r,n){let s=an(t,{limit:r});if(n==="json")return le(e,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 e.stdout.write(`No runs found.
2501
2501
  `),0;e.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
2502
2502
  `);for(let i of s){let o=(i.current_state??"").padEnd(20),a=(i.terminal_state??"").padEnd(20);e.stdout.write(`${String(i.id).padEnd(8)} ${String(i.workflow_id).padEnd(8)} ${String(i.team_id).padEnd(8)} ${o} ${a} ${i.started_at}
@@ -2504,27 +2504,27 @@ Show provider session details, team rollups, or managed run state/token totals.`
2504
2504
  [--recursive] [--all] [--format table|teamfile|json] [--json]
2505
2505
  lmctl ls --runs [--limit N] [--format table|json] [--json]
2506
2506
 
2507
- List native provider sessions in scope, or list recent managed runs with --runs.`,MW=50,PS=500});import{existsSync as Bs,readFileSync as WS}from"node:fs";import{homedir as UW}from"node:os";import{dirname as BS,resolve as jn}from"node:path";import{fileURLToPath as WW}from"node:url";function gf(e,t={}){let r=[],n=HW(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=YW(t.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ca??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${ZW(o)}`)}return r}function HW(e){if(!e&&Ws)return Ws;let t=new Map,r,n=e??JW();if(!Bs(n))return r=`${n} not found`,e||hf(t),e||(Ws=t),e||(Ca=r),t;let s;try{s=WS(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||hf(t),e||(Ws=t),e||(Ca=r),t}for(let[i,o]of Object.entries(BW)){let a=VW(s,o),l=KW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&hf(t),e||(Ws=t),e||(Ca=r),t}function JW(){return XW(BS(WW(import.meta.url)))}function XW(e){let t=GW(e);if(t){let n=jn(t,"durable-memory","model_selection.md");if(Bs(n))return n}let r=[jn(e,"..","..","durable-memory","model_selection.md"),jn(e,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Bs(n))return n;return r[r.length-1]}function GW(e){let t=jn(e);for(;;){if(Bs(jn(t,"package.json")))return t;let r=BS(t);if(r===t)return null;t=r}}function hf(e){for(let[t,r]of Object.entries(qW))e.set(t,r)}function VW(e,t){let n=new RegExp(`^## ${QW(t)}\\s*$`,"m").exec(e);if(!n)return"";let s=n.index+n[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function KW(e){let t=new Set;for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function YW(e){let t=e??jn(UW(),".config","opencode","opencode.json");if(!Bs(t))return{available:!0,models:[]};let r;try{r=JSON.parse(WS(t,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${t} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:zW(r)}}function zW(e){if(!_f(e))return[];let t=$a(e.provider)??$a(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!_f(s))continue;let i=$a(s.models)??$a(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function $a(e){return _f(e)?e:null}function _f(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ZW(e){return e.length>0?e.join(", "):"(none)"}function QW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var BW,qW,Ws,Ca,qS=E(()=>{"use strict";BW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},qW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["Gemini 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},Ws=null});import{homedir as eB}from"node:os";import{basename as tB}from"node:path";function Ma(e,t){let r=new Set;return{text:e.replace(nB,(s,i)=>{let o=i.trim(),a=rB[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function ja(e){return{workdir:e.workdir,teamfile:e.teamfile,date:sB(e.date)}}function sB(e){return e.toISOString().slice(0,10)}var rB,nB,yf=E(()=>{"use strict";rB={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=tB(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>eB(),date:e=>e.date},nB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Js={};Ee(Js,{GEMINI_PROVIDER_NOTICE:()=>GS,_setLintOpenCodeConfigProbeForTests:()=>mB,_setLintSessiondirFsOpsForTests:()=>fB,_setTeamfileSeedForTests:()=>uB,buildRootTeamRegistrationRow:()=>QS,registerRootTeam:()=>ev,runHire:()=>bB,runLint:()=>TB,runRefresh:()=>SB,runSeed:()=>zS,sha256Text:()=>ZS});import{createHash as iB}from"node:crypto";import{accessSync as oB,constants as HS,existsSync as aB,readFileSync as Fa,realpathSync as Tf,statSync as lB,writeFileSync as Pa}from"node:fs";import{dirname as Tr,resolve as XS}from"node:path";function uB(e){VS=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(It(),gc)),n=await r(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function fB(e){Jr=e===null?bf:{...bf,...e}}function mB(e){KS=e??Ll}async function pB(e,t,r){let n=e.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await KS({cwd:i.sessiondir??t,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function hB(e,t){let r=Tr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=XS(o);if(n.has(a))continue;let l=_B(a);l!==void 0&&(n.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 _B(e){try{if(Jr.existsSync(e)){if(!Jr.statSync(e).isDirectory())return"ENOTDIR";Jr.accessSync(e,HS.W_OK);return}let t=wB(e);if(t===void 0)return;if(!Jr.statSync(t).isDirectory())return"ENOTDIR";Jr.accessSync(t,HS.W_OK);return}catch(t){return EB(t)??"permission check failed"}}function gB(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||YS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function yB(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!YS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=tv(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function YS(e,t){return JS(e)===JS(t)}function JS(e){let t=XS(e);try{return Tf(t)}catch{return t}}function wB(e){let t=e;for(;;){try{if(Jr.existsSync(t))return t}catch{return}let r=Tr(t);if(r===t)return;t=r}}function EB(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function TB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(cB),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2508
- `),2;let r=e[0],n;try{n=await O(t,c=>Te(r,c))}catch(c){return Ce(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(n)}catch(c){return Ce(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=ru(s,Tr(n)),o=gf(s.members),a=Fa(n,"utf8"),l=Ma(a,ja({workdir:Tr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Nl(s.members,Tr(n))),o.push(...hB(s.members,n)),o.push(...gB(s.members,Tr(n))),o.push(...await pB(s.members,Tr(n),t.env));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2507
+ List native provider sessions in scope, or list recent managed runs with --runs.`,MW=50,PS=500});import{existsSync as Bs,readFileSync as WS}from"node:fs";import{homedir as UW}from"node:os";import{dirname as BS,resolve as jn}from"node:path";import{fileURLToPath as WW}from"node:url";function gf(e,t={}){let r=[],n=HW(t.modelSelectionDocPath);for(let s of e){let i=s.provider.trim().toLowerCase();if(s.effort&&i!=="opencode"&&i!=="lmplayer"&&i!=="qwen"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode and lmplayer.`),i==="qwen"&&s.effort&&r.push(`[${s.alias}] effort="${s.effort}" is not a qwen CLI flag: Qwen Code does not expose reasoning-effort selection. Use a thinking/effort model id in model= instead.`),i==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(i==="lmplayer"&&!s.model){r.push(`[${s.alias}] provider=lmplayer has no model= \u2014 lmplayer will choose its own default model, which may not be visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}if(i==="lmplayer")continue;if(i==="opencode"){if(s.effort&&!s.model&&r.push(`[${s.alias}] effort="${s.effort}" has no effect without model= on an opencode member.`),!s.model){r.push(`[${s.alias}] provider=opencode has no model= \u2014 opencode will choose its own default model, which may not be servable and isn't visible in the teamfile. Set model= explicitly (e.g. github-copilot/gpt-5.4).`);continue}let a=YW(t.opencodeConfigPath);if(!a.available){r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(a.models.includes(s.model)||/^github-copilot\/(gpt|gemini|o[0-9])/.test(s.model))continue;if(!s.model.includes("/")){let l=a.models.filter(c=>c.endsWith(`/${s.model}`));r.push(l.length>0?`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model>. Your opencode.json declares it as ${l.join(" / ")}; set model=${l[0]}.`:`[${s.alias}] model="${s.model}" has no provider prefix \u2014 opencode model ids are <provider>/<model> (e.g. github-copilot/${s.model}). Declare it in ~/.config/opencode/opencode.json (see https://lmctl.com/examples/opencode.json).`);continue}r.push(`[${s.alias}] model="${s.model}" is not declared in your opencode.json. opencode resolves github-copilot GPT/Gemini config-free, but copilot Claude and custom providers must be declared \u2014 copy https://lmctl.com/examples/opencode.json to ~/.config/opencode/opencode.json and adjust for your account.`);continue}if(!s.model)continue;let o=n.get(i);if(!o){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${i}": `+(Ca??"no tested models found in durable-memory/model_selection.md"));continue}o.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${i}". Valid tested models: ${ZW(o)}`)}return r}function HW(e){if(!e&&Ws)return Ws;let t=new Map,r,n=e??JW();if(!Bs(n))return r=`${n} not found`,e||_f(t),e||(Ws=t),e||(Ca=r),t;let s;try{s=WS(n,"utf-8")}catch(i){return r=`${n} could not be read: ${i instanceof Error?i.message:String(i)}`,e||_f(t),e||(Ws=t),e||(Ca=r),t}for(let[i,o]of Object.entries(BW)){let a=VW(s,o),l=KW(a);l.length>0&&t.set(i,l)}return t.size===0&&(r=`${n} has no tested model rows`),!e&&t.size===0&&_f(t),e||(Ws=t),e||(Ca=r),t}function JW(){return XW(BS(WW(import.meta.url)))}function XW(e){let t=GW(e);if(t){let n=jn(t,"durable-memory","model_selection.md");if(Bs(n))return n}let r=[jn(e,"..","..","durable-memory","model_selection.md"),jn(e,"..","..","..","durable-memory","model_selection.md")];for(let n of r)if(Bs(n))return n;return r[r.length-1]}function GW(e){let t=jn(e);for(;;){if(Bs(jn(t,"package.json")))return t;let r=BS(t);if(r===t)return null;t=r}}function _f(e){for(let[t,r]of Object.entries(qW))e.set(t,r)}function VW(e,t){let n=new RegExp(`^## ${QW(t)}\\s*$`,"m").exec(e);if(!n)return"";let s=n.index+n[0].length,i=e.slice(s),o=/^##\s+/m.exec(i);return o?i.slice(0,o.index):i}function KW(e){let t=new Set;for(let r of e.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let i=s[1].trim();i&&i!=="Configured `model="&&t.add(i)}return[...t]}function YW(e){let t=e??jn(UW(),".config","opencode","opencode.json");if(!Bs(t))return{available:!0,models:[]};let r;try{r=JSON.parse(WS(t,"utf-8"))}catch(n){return{available:!1,models:[],reason:`${t} could not be parsed: ${n instanceof Error?n.message:String(n)}`}}return{available:!0,models:zW(r)}}function zW(e){if(!hf(e))return[];let t=$a(e.provider)??$a(e.providers);if(!t)return[];let r=new Set;for(let[n,s]of Object.entries(t)){if(!hf(s))continue;let i=$a(s.models)??$a(s.model);if(i)for(let o of Object.keys(i))r.add(o.startsWith(`${n}/`)?o:`${n}/${o}`)}return[...r].sort()}function $a(e){return hf(e)?e:null}function hf(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function ZW(e){return e.length>0?e.join(", "):"(none)"}function QW(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var BW,qW,Ws,Ca,qS=E(()=>{"use strict";BW={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},qW={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-sonnet-5","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.6-sol","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["Gemini 3.5 Flash (Medium)","Gemini 3.5 Flash (High)","Gemini 3.5 Flash (Low)","Gemini 3.1 Pro (Low)","Gemini 3.1 Pro (High)","Claude Sonnet 4.6 (Thinking)","Claude Opus 4.6 (Thinking)","GPT-OSS 120B (Medium)"]},Ws=null});import{homedir as eB}from"node:os";import{basename as tB}from"node:path";function Ma(e,t){let r=new Set;return{text:e.replace(nB,(s,i)=>{let o=i.trim(),a=rB[o];return a===void 0?(r.add(o),s):a(t)}),unknownNames:[...r].sort()}}function ja(e){return{workdir:e.workdir,teamfile:e.teamfile,date:sB(e.date)}}function sB(e){return e.toISOString().slice(0,10)}var rB,nB,yf=E(()=>{"use strict";rB={workdir:e=>e.workdir,teamfile:e=>e.teamfile,teamname:e=>{let t=tB(e.teamfile);return t.endsWith(".lmctl")?t.slice(0,-6):t},home:()=>eB(),date:e=>e.date},nB=/{{\s*([A-Za-z0-9_-]+)\s*}}/g});var Js={};Ee(Js,{GEMINI_PROVIDER_NOTICE:()=>GS,_setLintOpenCodeConfigProbeForTests:()=>mB,_setLintSessiondirFsOpsForTests:()=>fB,_setTeamfileSeedForTests:()=>uB,buildRootTeamRegistrationRow:()=>QS,registerRootTeam:()=>ev,runHire:()=>bB,runLint:()=>TB,runRefresh:()=>SB,runSeed:()=>zS,sha256Text:()=>ZS});import{createHash as iB}from"node:crypto";import{accessSync as oB,constants as HS,existsSync as aB,readFileSync as Fa,realpathSync as Tf,statSync as lB,writeFileSync as Pa}from"node:fs";import{dirname as Tr,resolve as XS}from"node:path";function uB(e){VS=e??(async t=>{let{seed:r}=await Promise.resolve().then(()=>(It(),gc)),n=await r(t);return n.success?{sessionId:n.sessionId,warnings:n.warnings}:{error:n.error??"provider seed failed"}})}function fB(e){Jr=e===null?bf:{...bf,...e}}function mB(e){KS=e??Ll}async function pB(e,t,r){let n=e.filter(i=>i.teamfile===void 0&&i.provider.trim().toLowerCase()==="opencode"&&i.model!==void 0&&i.model.length>0);return(await Promise.all(n.map(async i=>({member:i,result:await KS({cwd:i.sessiondir??t,model:i.model,...i.effort!==void 0?{effort:i.effort}:{},...r!==void 0?{env:r}:{}})})))).flatMap(({member:i,result:o})=>o.status==="rejected"?[`[${i.alias}] ${o.option}="${o.value}" rejected by opencode: ${o.error}`]:[])}function _B(e,t){let r=Tr(t),n=new Set,s=[];for(let i of e){if(i.teamfile!==void 0)continue;let o=i.sessiondir??r,a=XS(o);if(n.has(a))continue;let l=hB(a);l!==void 0&&(n.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 hB(e){try{if(Jr.existsSync(e)){if(!Jr.statSync(e).isDirectory())return"ENOTDIR";Jr.accessSync(e,HS.W_OK);return}let t=wB(e);if(t===void 0)return;if(!Jr.statSync(t).isDirectory())return"ENOTDIR";Jr.accessSync(t,HS.W_OK);return}catch(t){return EB(t)??"permission check failed"}}function gB(e,t){let r=[];for(let n of e)n.teamfile!==void 0||n.sessiondir===void 0||YS(n.sessiondir,t)&&r.push(`${n.alias}: sessiondir equals the teamfile directory and is redundant; lmctl seed will remove it`);return r}function yB(e,t,r,n){let s=!1;for(let i of e){if(i.teamfile!==void 0||i.sessiondir===void 0||!YS(i.sessiondir,n))continue;let o=r.get(i.alias.toLowerCase());if(o===void 0)continue;let a=tv(t[o],"sessiondir");a!==t[o]&&(t[o]=a,s=!0),i.sessiondir=void 0}return s}function YS(e,t){return JS(e)===JS(t)}function JS(e){let t=XS(e);try{return Tf(t)}catch{return t}}function wB(e){let t=e;for(;;){try{if(Jr.existsSync(t))return t}catch{return}let r=Tr(t);if(r===t)return;t=r}}function EB(e){if(typeof e=="object"&&e!==null&&"code"in e){let t=e.code;if(typeof t=="string"&&t.length>0)return t}}async function TB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(cB),0;if(e.length!==1)return t.stderr.write(`usage: lmctl lint <teamfile.lmctl>
2508
+ `),2;let r=e[0],n;try{n=await O(t,c=>Te(r,c))}catch(c){return Ce(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let s;try{s=Fe(n)}catch(c){return Ce(t,`${r}: ${c instanceof Error?c.message:String(c)}`)}let i=ru(s,Tr(n)),o=gf(s.members),a=Fa(n,"utf8"),l=Ma(a,ja({workdir:Tr(n),teamfile:n,date:new Date})).unknownNames;l.length>0&&o.push(`unknown template placeholder${l.length===1?"":"s"}: ${l.map(c=>`{{${c}}}`).join(", ")}`),o.push(...Nl(s.members,Tr(n))),o.push(..._B(s.members,n)),o.push(...gB(s.members,Tr(n))),o.push(...await pB(s.members,Tr(n),t.env));for(let c of i)t.stderr.write(`error: ${c.field}: ${c.message}
2509
2509
  `);for(let c of s.members)vf([c],t),c.session!==void 0&&c.session.length<qs&&o.push(`${c.alias}: sessionid is shorter than ${qs} chars; run lmctl seed to refresh it`);for(let c of o)t.stderr.write(`warning: ${c}
2510
2510
  `);return await O(t,c=>{xE(n,c,d=>t.stderr.write(`${d}
2511
2511
  `))}),i.length>0?1:(t.stdout.write(`ok
2512
2512
  `),0)}async function zS(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(dB),0;if(e.length!==1)return t.stderr.write(`usage: lmctl seed <teamfile.lmctl>
2513
- `),2;let r=e[0],n;try{n=await O(t,h=>Te(r,h))}catch(h){return Ce(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let s;try{s=Tf(n)}catch(h){return Ce(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let i=Tr(n),o;try{o=Fe(n)}catch(h){return Ce(t,`${r}: ${h instanceof Error?h.message:String(h)}`)}let l=Fa(n,"utf8").split(`
2514
- `),c=IB(l),d=yB(o.members,l,c,i),u=ru(o,i);if(u.length>0){vf(o.members,t);for(let h of u)t.stderr.write(`error: ${h.field}: ${h.message}
2515
- `);return 1}try{Ln(t,o,n)}catch{}vf(o.members,t);for(let h of gf(o.members))t.stderr.write(`warning: ${h}
2516
- `);for(let h of Nl(o.members,i))t.stderr.write(`warning: ${h}
2517
- `);let f=0,m=o.members.filter(h=>h.teamfile!==void 0?!1:h.session===void 0||h.session.length<qs);for(let h of m)if(!rv(h.provider))return t.stderr.write(`error: ${h.alias}: invalid provider "${h.provider}"
2518
- `),1;for(let h of o.members){if(h.teamfile!==void 0)continue;if(h.session!==void 0&&h.session.length>=qs){t.stderr.write(`warning: ${h.alias}: existing sessionid preserved; skipping
2519
- `);continue}let y=h.sessiondir??i,T=await VS({provider:h.provider,cwd:y,...h.model!==void 0?{model:h.model}:{},...h.effort!==void 0?{effort:h.effort}:{},...h.alias.toLowerCase()==="lead"?{prompt:vB(n,l.join(`
2520
- `),o.members)}:{}});for(let x of T.warnings??[])t.stderr.write(`warning: ${h.alias}: ${x}
2521
- `);if(T.error!==void 0||T.sessionId===void 0||T.sessionId.length<qs){let x=`provider did not report a sessionid; no new session was found for ${y} (possible provider workspace/cwd mismatch)`;return t.stderr.write(`error: ${h.alias}: seed failed${T.error!==void 0?`: ${T.error}`:`; ${x}`}
2522
- `),1}let b=c.get(h.alias.toLowerCase());if(b===void 0)return t.stderr.write(`error: ${h.alias}: could not find matching _MEMBER_ line to update
2513
+ `),2;let r=e[0],n;try{n=await O(t,_=>Te(r,_))}catch(_){return Ce(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let s;try{s=Tf(n)}catch(_){return Ce(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let i=Tr(n),o;try{o=Fe(n)}catch(_){return Ce(t,`${r}: ${_ instanceof Error?_.message:String(_)}`)}let l=Fa(n,"utf8").split(`
2514
+ `),c=IB(l),d=yB(o.members,l,c,i),u=ru(o,i);if(u.length>0){vf(o.members,t);for(let _ of u)t.stderr.write(`error: ${_.field}: ${_.message}
2515
+ `);return 1}try{Ln(t,o,n)}catch{}vf(o.members,t);for(let _ of gf(o.members))t.stderr.write(`warning: ${_}
2516
+ `);for(let _ of Nl(o.members,i))t.stderr.write(`warning: ${_}
2517
+ `);let f=0,m=o.members.filter(_=>_.teamfile!==void 0?!1:_.session===void 0||_.session.length<qs);for(let _ of m)if(!rv(_.provider))return t.stderr.write(`error: ${_.alias}: invalid provider "${_.provider}"
2518
+ `),1;for(let _ of o.members){if(_.teamfile!==void 0)continue;if(_.session!==void 0&&_.session.length>=qs){t.stderr.write(`warning: ${_.alias}: existing sessionid preserved; skipping
2519
+ `);continue}let y=_.sessiondir??i,T=await VS({provider:_.provider,cwd:y,..._.model!==void 0?{model:_.model}:{},..._.effort!==void 0?{effort:_.effort}:{},..._.alias.toLowerCase()==="lead"?{prompt:vB(n,l.join(`
2520
+ `),o.members)}:{}});for(let x of T.warnings??[])t.stderr.write(`warning: ${_.alias}: ${x}
2521
+ `);if(T.error!==void 0||T.sessionId===void 0||T.sessionId.length<qs){let x=`provider did not report a sessionid; no new session was found for ${y} (possible provider workspace/cwd mismatch)`;return t.stderr.write(`error: ${_.alias}: seed failed${T.error!==void 0?`: ${T.error}`:`; ${x}`}
2522
+ `),1}let b=c.get(_.alias.toLowerCase());if(b===void 0)return t.stderr.write(`error: ${_.alias}: could not find matching _MEMBER_ line to update
2523
2523
  `),1;let I=RB(l[b],"sessionid",T.sessionId);l[b]=I,f+=1,Pa(n,l.join(`
2524
- `),"utf8"),t.stdout.write(`${h.alias}: seeded ${T.sessionId} provider=${h.provider} sessiondir=${y}
2524
+ `),"utf8"),t.stdout.write(`${_.alias}: seeded ${T.sessionId} provider=${_.provider} sessiondir=${y}
2525
2525
  `)}let p=l.join(`
2526
- `),_=OB(p,Tf(n));(_!==p||d)&&Pa(n,_,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2527
- `);let g=new Date().toISOString();return await O(t,h=>{ev(h,{teamfilePath:s,name:o.name,rawText:_,now:g})}),0}async function bB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Da),0;let r=Q(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Ef(t,r.error,Da);if(r.positionals.length!==2)return Ef(t,"expected <teamfile.lmctl> and <alias>",Da);let[n,s]=r.positionals;if(!AB(s))return Ce(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Ce(t,"hire only applies to non-Lead members");let i=P(r,"--provider");if(i===void 0)return Ef(t,"missing value for --provider",Da);if(!rv(i))return Ce(t,`invalid provider "${i}"`);let o;try{o=await O(t,u=>Te(n,u))}catch(u){return Ce(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Fa(o,"utf8")}catch(u){return Ce(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(xB(a,s))return Ce(t,`${s}: alias already exists in ${o}`);let l=P(r,"--sessiondir"),c=[`_MEMBER_ alias=${Sf(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Sf(l)}`]].join(" "),d=LB(a,c);return Pa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2526
+ `),h=OB(p,Tf(n));(h!==p||d)&&Pa(n,h,"utf8"),f===0&&t.stdout.write(`no members needed seeding
2527
+ `);let g=new Date().toISOString();return await O(t,_=>{ev(_,{teamfilePath:s,name:o.name,rawText:h,now:g})}),0}async function bB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(Da),0;let r=Q(e,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Ef(t,r.error,Da);if(r.positionals.length!==2)return Ef(t,"expected <teamfile.lmctl> and <alias>",Da);let[n,s]=r.positionals;if(!AB(s))return Ce(t,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Ce(t,"hire only applies to non-Lead members");let i=F(r,"--provider");if(i===void 0)return Ef(t,"missing value for --provider",Da);if(!rv(i))return Ce(t,`invalid provider "${i}"`);let o;try{o=await O(t,u=>Te(n,u))}catch(u){return Ce(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}let a;try{a=Fa(o,"utf8")}catch(u){return Ce(t,`${n}: ${u instanceof Error?u.message:String(u)}`)}if(xB(a,s))return Ce(t,`${s}: alias already exists in ${o}`);let l=F(r,"--sessiondir"),c=[`_MEMBER_ alias=${Sf(s)} provider=${i}`,...l===void 0?[]:[`sessiondir=${Sf(l)}`]].join(" "),d=LB(a,c);return Pa(o,d,"utf8"),t.stdout.write(`Hired ${s} (${i}) -> ${o}
2528
2528
  `),t.stdout.write(`Run: lmctl seed ${o}
2529
2529
  `),0}async function SB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e[0]==="--help"||e[0]==="-h"||e[0]==="help")return t.stdout.write(wf),0;let r,n;if(e.length===1){let u=Br(e[0]);if(u===null)return t.stderr.write(wf),2;r=u.teamfile,n=u.alias}else if(e.length===2)[r,n]=e;else return t.stderr.write(wf),2;let s;try{s=await O(t,u=>Te(r,u))}catch(u){return Ce(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let i;try{i=Fa(s,"utf8")}catch(u){return Ce(t,`${r}: ${u instanceof Error?u.message:String(u)}`)}let o=i.split(`
2530
2530
  `),a=NB(o,n);if(a===void 0)return Ce(t,`${n}: no active _MEMBER_ entry found`);let l=o[a];if(Hs(l,"teamfile")!==void 0)return Ce(t,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(t.env??process.env)[Qn],d=Hs(l,"sessionid");return c!==void 0&&c.length>0&&d===c?Ce(t,`${n}: cannot refresh its own running session \u2014 run this refresh from a different member session or a plain operator shell.`):(o[a]=tv(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(o[a-1])&&o.splice(a-1,1),Pa(s,o.join(`
@@ -2548,7 +2548,7 @@ ${e}`:`${r}
2548
2548
  `),1}function Ef(e,t,r){return e.stderr.write(`error: ${t}
2549
2549
  ${r}`),2}function vf(e,t){for(let r of e)r.teamfile!==void 0&&t.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2550
2550
  `),r.provider==="gemini"&&t.stderr.write(`${GS.replace("%s",r.alias)}
2551
- `)}var qs,cB,dB,Da,wf,GS,bf,VS,Jr,KS,Xs=E(()=>{"use strict";zt();qS();gi();at();Ol();Le();Ot();_t();Ot();yf();js();qs=5,cB=`usage: lmctl lint <teamfile.lmctl>
2551
+ `)}var qs,cB,dB,Da,wf,GS,bf,VS,Jr,KS,Xs=E(()=>{"use strict";zt();qS();gi();at();Ol();Le();Ot();ht();Ot();yf();js();qs=5,cB=`usage: lmctl lint <teamfile.lmctl>
2552
2552
 
2553
2553
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2554
2554
  For opencode members with model=, lint also asks the local ACP provider to
@@ -2594,7 +2594,7 @@ Examples:
2594
2594
  `});var uv={};Ee(uv,{runPlan:()=>zB});import{existsSync as JB,mkdirSync as XB,writeFileSync as GB}from"node:fs";import{basename as cv,extname as dv,join as VB,resolve as KB}from"node:path";async function zB(e,t={stdout:process.stdout,stderr:process.stderr}){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(YB),0;let r=Q(e,["--team","--provider"],[]);if(r.error!==void 0)return t.stderr.write(`error: ${r.error}
2595
2595
  `),t.stderr.write(`usage: lmctl plan [options] <directory>
2596
2596
  `),2;if(r.positionals.length!==1)return t.stderr.write(`usage: lmctl plan [options] <directory>
2597
- `),2;let n=KB(r.positionals[0]);XB(n,{recursive:!0});let s=P(r,"--team")??cv(n),i=P(r,"--provider")??"claude",o=VB(n,ZB(s));if(JB(o))return t.stderr.write(`error: ${o} already exists.
2597
+ `),2;let n=KB(r.positionals[0]);XB(n,{recursive:!0});let s=F(r,"--team")??cv(n),i=F(r,"--provider")??"claude",o=VB(n,ZB(s));if(JB(o))return t.stderr.write(`error: ${o} already exists.
2598
2598
  `),1;let a=eq({teamName:QB(s),leadProvider:i}),l=Ma(a,ja({workdir:n,teamfile:o,date:new Date}));return GB(o,l.text,"utf8"),t.stdout.write(`Created ${o}
2599
2599
  `),t.stdout.write(`Edit ${o}; only _MEMBER_ lines are parsed, everything else is free-form.
2600
2600
  `),t.stdout.write(`After editing, run: lmctl lint ${o}
@@ -2626,8 +2626,8 @@ Examples:
2626
2626
 
2627
2627
  # Same shape, codex for the Lead and Reviewer2
2628
2628
  lmctl plan ./backend --provider codex
2629
- `});import{execFileSync as tq}from"node:child_process";import{resolve as mv}from"node:path";function rq(e){return e.filter(t=>t.state!=="retired")}function pv(e,t,r){if(r!==void 0){let a=t.findProjectByName(r);return a===null?v(e,`project not found: ${r}`):a}let n=e.cwd??process.cwd(),s;try{s=tq("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=mv(s),o=t.listProjects().find(a=>mv(a.local_path)===i);return o===void 0?v(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function hv(e,t,r,n){if(n!==void 0){let i=t.findTeamByName(n);return i===null?v(e,`team not found: ${n}`):i}let s=t.getTeam(r.team_id);return s===null?v(e,`project ${r.name} has no assigned team; use --team <name>`):s}function _v(e,t,r,n){if(n!==void 0){let i=t.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(e,`member not found: ${n}`):i}let s=rq(t.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(e,`team ${r.name} has no active agent member`):s}var gv=E(()=>{"use strict";Le()});var Ev={};Ee(Ev,{SIZE_WARN_EST_TOKENS:()=>Gs,estimateTokens:()=>wv,runTerminal:()=>oq});import{spawn as nq}from"node:child_process";import{statSync as sq}from"node:fs";async function oq(e,t){if(e.includes("--help")||e.includes("-h"))return mq(t);let r=Q(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(t,r.error);let n=P(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(t,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?V(r,o):P(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await O(t,async o=>{let a=P(r,"--alias"),l=Ew(o,s,a);return"err"in l?v(t,l.err):If(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Pe(t,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?V(r,l):P(r,l)!==void 0)return v(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=gr(iq,{target:i,alias:o,flags:{}});return a.mode==="error"?v(t,a.message):a.mode!=="ai-team"?v(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(t,"terminal: alias required for the teamfile target"):await O(t,l=>aq(t,a.teamfile,a.alias,l))}try{return await O(t,async s=>{let i=dq(t,s,r);if(typeof i=="number")return i;let o=P(r,"--alias");return V(r,"--size")?fq(t,s,i,o,V(r,"--json")):uq(t,s,i,o)})}catch(s){return Pe(t,s)}}async function aq(e,t,r,n){let s;try{s=$e(t,r,n)}catch(d){return d instanceof we?v(e,d.message):Pe(e,d)}let i=hr(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:_r()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=bb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=lq(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Sb()),a.unref?.();try{Ln(e,Fe(s.teamfile),s.teamfile)}catch{}return c=await If(e,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),cq(n,l,c)}}function lq(e,t){try{return e.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:t.teamfile,from_identity:`${t.teamfile}:terminal`,target_teamfile:t.teamfile,target_alias:t.alias,root_teamfile:t.teamfile,cwd:t.sessiondir,command:`lmctl terminal ${t.teamfile} ${t.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:t.provider,sessionid:t.sessionid,...t.model!==void 0?{model:t.model}:{}})}).id}catch{return null}}function cq(e,t,r){if(t!==null)try{e.finishTrackedInvocation(t,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function If(e,t){let{provider:r,sessionid:n,sessiondir:s,model:i}=t;if(!da(r))return v(e,`no resume incantation for provider "${r}"`);if(!OE.test(n))return v(e,"refusing to resume: malformed sessionid");let o=ou(r,n,{isLead:t.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;e.stderr.write(`${d}
2630
- `),Ae({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return v(e,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(c=>{let d=nq(a,l,{stdio:"inherit",cwd:s,env:je(process.env,s,n,"terminal")});d.on("error",u=>{c(v(e,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function dq(e,t,r){let n=P(r,"--team");if(n!==void 0){let o=t.findTeamByName(n);return o===null?v(e,`team not found: ${n}`):o}let s=pv(e,t,P(r,"--project"));return typeof s=="number"?s:hv(e,t,s,void 0)}async function uq(e,t,r,n){let s=_v(e,t,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?v(e,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):If(e,{provider:qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function wv(e){if(e&&Array.isArray(e.messages)&&e.messages.length>0){let r=e.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:e.messages.length,bytes:null}}let t=e?.filePath;if(t!==void 0)try{let r=sq(t).size;return{chars:r,est:Math.ceil(r/4),messages:e?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function fq(e,t,r,n,s){let i;if(n!==void 0){let a=t.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return v(e,`member not found: ${n}`);i=[a]}else i=t.listTeamMembers(r.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),d=a.model??null,u=null;da(c)&&(u=await Ye(l,c));let f=wv(u),m=f.est>Gs;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?ua(c,l,d!==null?{model:d}:{}):null})}if(s)return le(e,{estimate:!0,legend:yv,guide_tokens:Gs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2629
+ `});import{execFileSync as tq}from"node:child_process";import{resolve as mv}from"node:path";function rq(e){return e.filter(t=>t.state!=="retired")}function pv(e,t,r){if(r!==void 0){let a=t.findProjectByName(r);return a===null?v(e,`project not found: ${r}`):a}let n=e.cwd??process.cwd(),s;try{s=tq("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return v(e,"terminal cannot infer a member from cwd because this directory is not in a git repo; use `lmctl terminal <teamfile> <alias>`")}let i=mv(s),o=t.listProjects().find(a=>mv(a.local_path)===i);return o===void 0?v(e,`terminal cannot infer a member from cwd ${i}; use \`lmctl terminal <teamfile> <alias>\``):o}function _v(e,t,r,n){if(n!==void 0){let i=t.findTeamByName(n);return i===null?v(e,`team not found: ${n}`):i}let s=t.getTeam(r.team_id);return s===null?v(e,`project ${r.name} has no assigned team; use --team <name>`):s}function hv(e,t,r,n){if(n!==void 0){let i=t.findTeamMemberByAlias(r.id,n);return i===null||i.state==="retired"?v(e,`member not found: ${n}`):i}let s=rq(t.listTeamMembers(r.id)).find(i=>i.role==="agent");return s===void 0?v(e,`team ${r.name} has no active agent member`):s}var gv=E(()=>{"use strict";Le()});var Ev={};Ee(Ev,{SIZE_WARN_EST_TOKENS:()=>Gs,estimateTokens:()=>wv,runTerminal:()=>oq});import{spawn as nq}from"node:child_process";import{statSync as sq}from"node:fs";async function oq(e,t){if(e.includes("--help")||e.includes("-h"))return mq(t);let r=Q(e,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return v(t,r.error);let n=F(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return v(t,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return v(t,"--run is mutually exclusive with positional <teamfile>[:alias]");let i=["--team","--project","--size","--json"];for(let o of i)if(o==="--size"||o==="--json"?V(r,o):F(r,o)!==void 0)return v(t,`--run is mutually exclusive with ${o}`);try{return await O(t,async o=>{let a=F(r,"--alias"),l=Ew(o,s,a);return"err"in l?v(t,l.err):If(t,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir,...l.ok.model!==void 0?{model:l.ok.model}:{}})})}catch(o){return Pe(t,o)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?V(r,l):F(r,l)!==void 0)return v(t,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return v(t,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let i=r.positionals[0],o=r.positionals[1],a=gr(iq,{target:i,alias:o,flags:{}});return a.mode==="error"?v(t,a.message):a.mode!=="ai-team"?v(t,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?v(t,"terminal: alias required for the teamfile target"):await O(t,l=>aq(t,a.teamfile,a.alias,l))}try{return await O(t,async s=>{let i=dq(t,s,r);if(typeof i=="number")return i;let o=F(r,"--alias");return V(r,"--size")?fq(t,s,i,o,V(r,"--json")):uq(t,s,i,o)})}catch(s){return Pe(t,s)}}async function aq(e,t,r,n){let s;try{s=$e(t,r,n)}catch(d){return d instanceof we?v(e,d.message):Pe(e,d)}let i=_r(n,{receiver_teamfile:s.teamfile,receiver_alias:s.alias,sender_teamfile:s.teamfile,sender_alias:"terminal",ttlMs:hr()});if(!i.acquired)return v(e,`${s.alias} is busy/held by ${i.current.sender_alias} (${i.current.sender_teamfile}) since ${i.current.started_at}`);let o=bb({teamfile:s.teamfile,alias:s.alias}),a=null,l=null,c=null;try{n.setTerminalLock(o),l=lq(n,s),a=setInterval(()=>{try{!n.heartbeatTerminalLock(o.teamfile,o.alias,o.lock_id,new Date().toISOString())&&a!==null&&(clearInterval(a),a=null)}catch{}},Sb()),a.unref?.();try{Ln(e,Fe(s.teamfile),s.teamfile)}catch{}return c=await If(e,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,...s.model!==void 0?{model:s.model}:{},isLead:s.isLead}),c}finally{a!==null&&clearInterval(a),n.clearTerminalLock(o.teamfile,o.alias,o.lock_id),n.releaseAgentInflight(i.lease),cq(n,l,c)}}function lq(e,t){try{return e.startTrackedInvocation({kind:"exec",origin:"operator",scope_teamfile:t.teamfile,from_identity:`${t.teamfile}:terminal`,target_teamfile:t.teamfile,target_alias:t.alias,root_teamfile:t.teamfile,cwd:t.sessiondir,command:`lmctl terminal ${t.teamfile} ${t.alias}`,holder_pid:process.pid,launch_source:"terminal",meta:JSON.stringify({provider:t.provider,sessionid:t.sessionid,...t.model!==void 0?{model:t.model}:{}})}).id}catch{return null}}function cq(e,t,r){if(t!==null)try{e.finishTrackedInvocation(t,{status:r===0?"done":"error",exit_code:r,result_summary:r===0?"terminal session ended":null,error:r===0?null:`terminal exited with code ${r??"unknown"}`})}catch{}}async function If(e,t){let{provider:r,sessionid:n,sessiondir:s,model:i}=t;if(!da(r))return v(e,`no resume incantation for provider "${r}"`);if(!OE.test(n))return v(e,"refusing to resume: malformed sessionid");let o=ou(r,n,{isLead:t.isLead,model:i,onModelIgnored:c=>{let d=`warning: ${c.provider} terminal ignored model=${c.model}: ${c.reason}`;e.stderr.write(`${d}
2630
+ `),Ae({event:"model_ignored",provider:c.provider,model:c.model,reason:c.reason})}});if(o===null||o.length===0)return v(e,`no resume incantation for provider "${r}"`);let[a,...l]=o;return await new Promise(c=>{let d=nq(a,l,{stdio:"inherit",cwd:s,env:je(process.env,s,n,"terminal")});d.on("error",u=>{c(v(e,`failed to launch ${a}: ${u.message}`))}),d.on("exit",u=>c(u??0))})}function dq(e,t,r){let n=F(r,"--team");if(n!==void 0){let o=t.findTeamByName(n);return o===null?v(e,`team not found: ${n}`):o}let s=pv(e,t,F(r,"--project"));return typeof s=="number"?s:_v(e,t,s,void 0)}async function uq(e,t,r,n){let s=hv(e,t,r,n);if(typeof s=="number")return s;let i=s.sessionid;return i===null||i.trim().length===0?v(e,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):If(e,{provider:qe(s),sessionid:i,sessiondir:s.sessiondir,...s.model!==null&&s.model!==void 0?{model:s.model}:{}})}function wv(e){if(e&&Array.isArray(e.messages)&&e.messages.length>0){let r=e.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:e.messages.length,bytes:null}}let t=e?.filePath;if(t!==void 0)try{let r=sq(t).size;return{chars:r,est:Math.ceil(r/4),messages:e?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function fq(e,t,r,n,s){let i;if(n!==void 0){let a=t.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return v(e,`member not found: ${n}`);i=[a]}else i=t.listTeamMembers(r.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),d=a.model??null,u=null;da(c)&&(u=await Ye(l,c));let f=wv(u),m=f.est>Gs;o.push({alias:a.alias,provider:c,sessionid:l,messages:f.messages,bytes:f.bytes,est_tokens:f.est,estimate:!0,over_guide:m,model:d,resume_incantation:m?ua(c,l,d!==null?{model:d}:{}):null})}if(s)return le(e,{estimate:!0,legend:yv,guide_tokens:Gs,members:o}),0;e.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2631
2631
  `),e.stdout.write(`${yv}
2632
2632
  `);for(let a of o){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);e.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2633
2633
  `),a.over_guide&&e.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2666,27 +2666,27 @@ Examples:
2666
2666
  tokens it surfaces the resume incantation so YOU can
2667
2667
  open & self-compact. Nothing is ever changed
2668
2668
  automatically; ${Gs} is a guide, not a gate.
2669
- `),0}var iq,Gs,yv,Tv=E(()=>{"use strict";Qe();yr();Le();gv();_t();zt();at();js();Ur();ia();qu();Yo();pe();iq={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Gs=2e5,yv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function Nf(e,t){let r=pq[e],n=t("which",[e]);return n.status===0&&(n.stdout??"").toString().trim()!==""?t(e,["--version"]).status===0?{provider:e,status:"ok",detail:"installed, --version OK"}:{provider:e,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:e,status:"skipped",detail:"not installed"}:{provider:e,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var pq,bv=E(()=>{"use strict";pq={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var Av={};Ee(Av,{initWorkspace:()=>Nv,runWorkspace:()=>Tq,setWorkspaceProvider:()=>xv});import{copyFileSync as hq,cpSync as _q,existsSync as We,mkdirSync as br,readdirSync as Af,renameSync as gq,rmSync as Ua,statSync as Wa,writeFileSync as yq}from"node:fs";import{spawnSync as wq}from"node:child_process";import{homedir as Sv}from"node:os";import{dirname as Rf,join as Vs}from"node:path";async function Tq(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(Eq),0;switch(r){case"list":return bq(n,t);case"create":return Sq(n,t);case"use":return vq(n,t);case"show":return kq(n,t);case"delete":return Iq(n,t);case"migrate":return Nq(n,t);case"init":return Nv(n,t);case"set-provider":return xv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function kv(){let e=Zs(),t=[],r=new Set,n=kr.default,s=We(Ys()),i=We(Dt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Sr(n):Ys(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),We(Gr())){let o;try{o=Af(Gr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!Ze(a))continue;let l=!1;try{l=Wa(Dt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Sr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function bq(e,t){let r=Q(e,[]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length!==0)return v(t,"usage: lmctl workspace list");let n=kv();if(V(r,"--json"))return le(t,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";t.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2670
- `)}return 0}function Sq(e,t){let r=Q(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Dt(n);if(We(s))return v(t,`workspace already exists: ${n} (${s})`);let i=P(r,"--docroot")??Va(n);br(s,{recursive:!0}),br(i,{recursive:!0});let o=Sr(n);br(Rf(o),{recursive:!0});let a=ke({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return V(r,"--json")?le(t,l):t.stdout.write(`created workspace ${n} at ${s}
2669
+ `),0}var iq,Gs,yv,Tv=E(()=>{"use strict";Qe();yr();Le();gv();ht();zt();at();js();Ur();ia();qu();Yo();me();iq={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Gs=2e5,yv="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});function Nf(e,t){let r=pq[e],n=t("which",[e]);return n.status===0&&(n.stdout??"").toString().trim()!==""?t(e,["--version"]).status===0?{provider:e,status:"ok",detail:"installed, --version OK"}:{provider:e,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:e,status:"skipped",detail:"not installed"}:{provider:e,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var pq,bv=E(()=>{"use strict";pq={claude:{install_hint:"https://docs.claude.com/en/docs/claude-code",optional:!1,install_remediation:"see https://docs.claude.com/en/docs/claude-code"},codex:{install_hint:"https://github.com/openai/codex",optional:!1,install_remediation:"see https://github.com/openai/codex"},gemini:{install_hint:"https://github.com/google/generative-ai-cli",optional:!1,install_remediation:"npm i -g @google/gemini-cli"},opencode:{install_hint:"https://opencode.ai",optional:!0,install_remediation:"see https://opencode.ai"},lmplayer:{install_hint:"Install lmplayer and ensure the lmplayer binary is on PATH.",optional:!0,install_remediation:"install lmplayer and ensure the lmplayer binary is on PATH"},qwen:{install_hint:"https://github.com/QwenLM/qwen-code",optional:!0,install_remediation:"npm i -g @qwen-code/qwen-code"},copilot:{install_hint:"https://docs.github.com/copilot/cli",optional:!0,install_remediation:"see https://docs.github.com/copilot/cli"},agy:{install_hint:"https://antigravity.google",optional:!0,install_remediation:"see https://antigravity.google"}}});var Av={};Ee(Av,{initWorkspace:()=>Nv,runWorkspace:()=>Tq,setWorkspaceProvider:()=>xv});import{copyFileSync as _q,cpSync as hq,existsSync as We,mkdirSync as br,readdirSync as Af,renameSync as gq,rmSync as Ua,statSync as Wa,writeFileSync as yq}from"node:fs";import{spawnSync as wq}from"node:child_process";import{homedir as Sv}from"node:os";import{dirname as Rf,join as Vs}from"node:path";async function Tq(e,t){let[r,...n]=e;if(r==="--help"||r==="-h"||r==="help")return t.stdout.write(Eq),0;switch(r){case"list":return bq(n,t);case"create":return Sq(n,t);case"use":return vq(n,t);case"show":return kq(n,t);case"delete":return Iq(n,t);case"migrate":return Nq(n,t);case"init":return Nv(n,t);case"set-provider":return xv(n,t);default:return v(t,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function kv(){let e=Zs(),t=[],r=new Set,n=kr.default,s=We(Ys()),i=We(Dt(n));if((s||i||e===null||e===n)&&(t.push({name:n,db_path:i?Sr(n):Ys(),active:e===null||e===n,legacy:!i&&s}),r.add(n)),We(Gr())){let o;try{o=Af(Gr())}catch{o=[]}for(let a of o.sort()){if(r.has(a)||!Ze(a))continue;let l=!1;try{l=Wa(Dt(a)).isDirectory()}catch{l=!1}l&&(t.push({name:a,db_path:Sr(a),active:e===a,legacy:!1}),r.add(a))}}return t}function bq(e,t){let r=Q(e,[]);if(r.error!==void 0)return v(t,r.error);if(r.positionals.length!==0)return v(t,"usage: lmctl workspace list");let n=kv();if(V(r,"--json"))return le(t,n),0;for(let s of n){let i=s.active?"*":" ",o=s.legacy?" (legacy)":"";t.stdout.write(`${i} ${s.name} ${s.db_path}${o}
2670
+ `)}return 0}function Sq(e,t){let r=Q(e,["--docroot"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace create <name> [--docroot PATH]");if(!Ze(n))return v(t,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=Dt(n);if(We(s))return v(t,`workspace already exists: ${n} (${s})`);let i=F(r,"--docroot")??Va(n);br(s,{recursive:!0}),br(i,{recursive:!0});let o=Sr(n);br(Rf(o),{recursive:!0});let a=ke({path:o});try{a.setConfig("project.docroot",i)}finally{a.close()}let l={name:n,dir:s,db_path:o,docroot:i};return V(r,"--json")?le(t,l):t.stdout.write(`created workspace ${n} at ${s}
2671
2671
  `),0}function vq(e,t){let r=Q(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace use <name>");if(!Ze(n))return v(t,`invalid workspace name: ${n}`);if(n!==kr.default&&!We(Dt(n)))return v(t,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=zs();return br(Rf(s),{recursive:!0}),yq(s,`${n}
2672
2672
  `),V(r,"--json")?le(t,{active:n,path:s}):t.stdout.write(`active workspace set to ${n}
2673
2673
  `),0}function kq(e,t){let r=Q(e,[]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace show <name>");if(!Ze(n))return v(t,`invalid workspace name: ${n}`);let s=kv().find(d=>d.name===n);if(s===void 0)return v(t,`workspace not found: ${n}`);let i=0;try{i=We(s.db_path)?Wa(s.db_path).size:0}catch{i=0}let o=0,a=null,l={};if(We(s.db_path)){let d=ke({path:s.db_path});try{o=d.listProjects().length,l=d.getConfigAll(),a=l["project.docroot"]??null}finally{d.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:i,docroot:a,project_count:o,config_keys:Object.keys(l).sort()};return V(r,"--json")?le(t,c):t.stdout.write(`${JSON.stringify(c,null,2)}
2674
2674
  `),0}function Iq(e,t){let r=Q(e,[],["--json","--confirm","--force"]);if(r.error!==void 0)return v(t,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return v(t,"usage: lmctl workspace delete <name> --confirm [--force]");if(!Ze(n))return v(t,`invalid workspace name: ${n}`);if(!V(r,"--confirm"))return v(t,`refusing to delete workspace ${n} without --confirm`);if(n===kr.default&&!V(r,"--force"))return v(t,"refusing to delete the default workspace without --force");if(Zs()===n&&!V(r,"--force"))return v(t,`refusing to delete the active workspace (${n}) without --force`);let i=Dt(n);return We(i)?(Ua(i,{recursive:!0,force:!0}),V(r,"--json")?le(t,{deleted:n,dir:i}):t.stdout.write(`deleted workspace ${n}
2675
2675
  `),0):v(t,`workspace not found: ${n}`)}function xf(e,t,r){try{gq(e,t);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${e} -> ${t} then removing source
2676
- `),Wa(e).isDirectory()?_q(e,t,{recursive:!0}):hq(e,t),!We(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Ua(e,{recursive:!0,force:!0})}function Nq(e,t){let r=Q(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=V(r,"--json"),s=Ka(),i=Gr(),o=[],a=(f,m)=>{if(n)le(t,{migrated:f,reason:m??null,actions:o});else{for(let p of o)t.stdout.write(`${p}
2676
+ `),Wa(e).isDirectory()?hq(e,t,{recursive:!0}):_q(e,t),!We(t))throw new Error(`migration copy verification failed: ${t} not present after copy`);Ua(e,{recursive:!0,force:!0})}function Nq(e,t){let r=Q(e,[],["--json"]);if(r.error!==void 0)return v(t,r.error);let n=V(r,"--json"),s=Ka(),i=Gr(),o=[],a=(f,m)=>{if(n)le(t,{migrated:f,reason:m??null,actions:o});else{for(let p of o)t.stdout.write(`${p}
2677
2677
  `);t.stdout.write(f?`migration complete
2678
2678
  `:`${m??"nothing to migrate"}
2679
2679
  `)}return 0};if(!We(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=Af(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Wa(Vs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)Ua(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`);else if(!We(i))xf(s,i,t),o.push(`renamed ${s} -> ${i}`);else{let f=c.filter(m=>We(Vs(i,m)));if(f.length>0)return v(t,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);br(i,{recursive:!0});for(let m of c)xf(Vs(s,m),Vs(i,m),t),o.push(`moved ${m} -> workspaces/${m}`);try{Af(s).length===0&&(Ua(s,{recursive:!0,force:!0}),o.push(`removed empty ${s}`))}catch{}}let d=Kf(),u=zs();return We(d)&&(We(u)?o.push("left active-profile in place (active-workspace already exists; not clobbering)"):(xf(d,u,t),o.push("renamed active-profile -> active-workspace"))),a(!0)}function Iv(e,t){return wq(e,t,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function Rq(e){return process.stderr.write(e),new Promise(t=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}t(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function vv(e){return e==="~"?Sv():e.startsWith("~/")?Vs(Sv(),e.slice(2)):e}async function Nv(e,t,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${Dn.join(", ")}.`].join(`
2680
2680
  `)+`
2681
2681
  `),0;let s=Q(e,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return v(t,s.error);if(s.positionals.length!==0)return v(t,n);let i=r.spawn??Iv,a=Dn.map(x=>Nf(x,i)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return t.stderr.write(`error: no provider CLI found on PATH; install/auth ${Dn.join("|")} first
2682
2682
  `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??Rq,d=r.promptLine!==void 0||l,u=x=>(t.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2683
- `),2),f,m=P(s,"--name");if(m!==void 0){if(!Ze(m))return t.stderr.write(`error: invalid workspace name: ${m}
2683
+ `),2),f,m=F(s,"--name");if(m!==void 0){if(!Ze(m))return t.stderr.write(`error: invalid workspace name: ${m}
2684
2684
  `),2;f=m}else{if(!d)return u("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),H=x.length===0?"default":x;if(Ze(H)){f=H;break}t.stderr.write(`invalid workspace name: ${H} (letters/digits/.-_, start alnum, \u226464)
2685
2685
  `)}}let p=Dt(f);if(We(p))return t.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2686
- `),2;let _,g=P(s,"--basedir"),h=Va(f);if(g!==void 0)_=vv(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${h}]: `)).trim();_=x.length===0?h:vv(x)}let y={};for(let x of["provider1","provider2","provider3"]){let H=P(s,`--${x}`),me=xq[x],U=a.includes(me)?me:a[0];if(H!==void 0){if(!a.includes(H))return t.stderr.write(`error: --${x} ${H} is not an available provider (available: ${a.join(", ")})
2686
+ `),2;let h,g=F(s,"--basedir"),_=Va(f);if(g!==void 0)h=vv(g);else{if(!d)return u("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:vv(x)}let y={};for(let x of["provider1","provider2","provider3"]){let H=F(s,`--${x}`),pe=xq[x],U=a.includes(pe)?pe:a[0];if(H!==void 0){if(!a.includes(H))return t.stderr.write(`error: --${x} ${H} is not an available provider (available: ${a.join(", ")})
2687
2687
  `),2;y[x]=H;continue}if(!d)return u(`--${x}`);for(;;){let M=(await c(`${x} (${Aq[x]}) [${U}]: `)).trim(),A=M.length===0?U:M;if(a.includes(A)){y[x]=A;break}t.stderr.write(`not an available provider: ${A} (available: ${a.join(", ")})
2688
- `)}}br(p,{recursive:!0}),br(_,{recursive:!0});let T=Sr(f);br(Rf(T),{recursive:!0});let b=ke({path:T});try{b.setConfig("project.docroot",_),b.setConfig("workspace.provider1",y.provider1),b.setConfig("workspace.provider2",y.provider2),b.setConfig("workspace.provider3",y.provider3)}finally{b.close()}let I={name:f,dir:p,db_path:T,basedir:_,providers:{...y}};return V(s,"--json")?le(t,I):(t.stdout.write(`created workspace ${f} at ${p}
2689
- `),t.stdout.write(` basedir: ${_}
2688
+ `)}}br(p,{recursive:!0}),br(h,{recursive:!0});let T=Sr(f);br(Rf(T),{recursive:!0});let b=ke({path:T});try{b.setConfig("project.docroot",h),b.setConfig("workspace.provider1",y.provider1),b.setConfig("workspace.provider2",y.provider2),b.setConfig("workspace.provider3",y.provider3)}finally{b.close()}let I={name:f,dir:p,db_path:T,basedir:h,providers:{...y}};return V(s,"--json")?le(t,I):(t.stdout.write(`created workspace ${f} at ${p}
2689
+ `),t.stdout.write(` basedir: ${h}
2690
2690
  `),t.stdout.write(` provider1=${y.provider1} provider2=${y.provider2} provider3=${y.provider3}
2691
2691
  `),t.stdout.write(`activate it with: lmctl workspace use ${f}
2692
2692
  `)),0}async function xv(e,t,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(e.includes("--help")||e.includes("-h"))return t.stdout.write([n,"","Remaps an abstract provider slot for the selected workspace. The next","`team seed` resolves that slot to the new concrete; already-seeded",`members keep their frozen provider_resolved. Scanned providers: ${Dn.join(", ")}.`].join(`
@@ -2747,7 +2747,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
2747
2747
  `),2;let n=r[0];try{return await O(t,s=>(t.stdout.write(Xv(s,n)),0))}catch(s){return t.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2748
2748
  `),1}}function Cf(){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(`
2749
2749
  `)}var Jv,Mf,jf,zv=E(()=>{"use strict";lu();Le();Jv=["Coder","Reviewer1","Polisher"],Mf=3e4,jf=new Set(["attention_needed","paused","escalation"])});var Ek={};Ee(Ek,{appendIntent:()=>uk,resolveIntentLogPath:()=>dk,runStatus:()=>aH});import{appendFileSync as zq,mkdirSync as Zq}from"node:fs";import{homedir as Qq,hostname as Zv}from"node:os";import{basename as eH,dirname as ck,isAbsolute as tH,join as rH,resolve as nH}from"node:path";function dk(){return process.env.LMCTL_INTENT_LOG??rH(Qq(),".lmctl","recent-intents.log")}function uk(e){try{let t=dk();Zq(ck(t),{recursive:!0});let r=JSON.stringify({ts:e.ts??new Date().toISOString(),cwd:e.cwd??process.cwd(),verb:e.verb,args:[...e.args]});zq(t,`${r}
2750
- `)}catch{}}async function aH(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(sH),0;let r=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(t,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Q(e,["--since"],["--json"]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,`unknown argument: ${n.positionals[0]}`);let s=V(n,"--json"),i=PH(P(n,"--since"));if("error"in i)return v(t,i.error);try{let o=t.env??process.env;if(s){let a=await O(t,l=>nk(l,o));le(t,a)}else{let a=await O(t,async l=>vH(await nk(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return uk({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}async function nk(e,t){let r=Hu(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error(Ds("status"));return await cH(e)}return await lH(e,r.identity)}async function lH(e,t){let r=Hr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error(Ds("status"));let s=Ue(n.teamfile_path,e),i=Pf(qa(e,{from:r.value})),o=Pf(qa(e,{target_teamfile:r.teamfile,target_alias:r.alias})),a=mH([...Df(e,{from:r.value}),...Df(e,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...fk(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>uH(e,n.teamfile_path,l)),activity:{from_me:i.map(l=>Ff(l,e)),to_me:o.map(l=>Ff(l,e))},transcript_harvest:await pk(a),mailbox:{outbound:Ha(pH(e,r.teamfile,r.alias),"outbound"),inbound_pending:Ha(hH(e,r.teamfile,r.alias),"inbound")},waiting_on:_H(e,r.teamfile,r.alias).map(l=>mk(l,e))}}function fk(){return{workspace:Pt(),db_path:Z()}}async function cH(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...fk(),teams:t.map(r=>dH(e,r)),activity:Pf(qa(e)).map(r=>Ff(r,e)),transcript_harvest:await pk(Df(e)),mailbox:{pending_outbound:Ha(sk(e,"sender"),"outbound"),pending_inbound:Ha(sk(e,"receiver"),"inbound")},waiting_on:gH(e).map(r=>mk(r,e))}}function dH(e,t){let r=0;try{r=Ue(t.teamfile_path,e).members.length}catch{r=0}return{name:t.name,teamfile:t.teamfile_path,member_count:r,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at}}function uH(e,t,r){let n=r.teamfile===void 0?null:Te(tH(r.teamfile)?r.teamfile:nH(ck(t),r.teamfile),e),s=Yt(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?fH(e,t,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:t,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function fH(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2750
+ `)}catch{}}async function aH(e,t){if(e.includes("--help")||e.includes("-h"))return t.stdout.write(sH),0;let r=e.find(o=>o==="--project"||o.startsWith("--project=")||o==="--web");if(r!==void 0)return v(t,`unknown option ${r}; lmctl status is team/SELF scoped now`);let n=Q(e,["--since"],["--json"]);if(n.error!==void 0)return v(t,n.error);if(n.positionals.length>0)return v(t,`unknown argument: ${n.positionals[0]}`);let s=V(n,"--json"),i=PH(F(n,"--since"));if("error"in i)return v(t,i.error);try{let o=t.env??process.env;if(s){let a=await O(t,l=>nk(l,o));le(t,a)}else{let a=await O(t,async l=>vH(await nk(l,o),{sinceIso:i.iso}));t.stdout.write(a)}return uk({verb:"status",args:e}),0}catch(o){return v(t,o instanceof Error?o.message:String(o))}}async function nk(e,t){let r=Hu(t,e);if(!r.ok){if(r.reason==="not-found")throw new Error(Ds("status"));return await cH(e)}return await lH(e,r.identity)}async function lH(e,t){let r=Hr(t),n=e.getRootTeam(r.teamfile);if(n===null)throw new Error(Ds("status"));let s=Ue(n.teamfile_path,e),i=Pf(qa(e,{from:r.value})),o=Pf(qa(e,{target_teamfile:r.teamfile,target_alias:r.alias})),a=mH([...Df(e,{from:r.value}),...Df(e,{target_teamfile:r.teamfile,target_alias:r.alias})]);return{scope:"self",identity:r.value,...fk(),team:{name:s.name,teamfile:n.teamfile_path},members:s.members.map(l=>uH(e,n.teamfile_path,l)),activity:{from_me:i.map(l=>Ff(l,e)),to_me:o.map(l=>Ff(l,e))},transcript_harvest:await pk(a),mailbox:{outbound:Ha(pH(e,r.teamfile,r.alias),"outbound"),inbound_pending:Ha(_H(e,r.teamfile,r.alias),"inbound")},waiting_on:hH(e,r.teamfile,r.alias).map(l=>mk(l,e))}}function fk(){return{workspace:Pt(),db_path:Z()}}async function cH(e){let t=e.listRootTeams();return{scope:"workspace",identity:null,...fk(),teams:t.map(r=>dH(e,r)),activity:Pf(qa(e)).map(r=>Ff(r,e)),transcript_harvest:await pk(Df(e)),mailbox:{pending_outbound:Ha(sk(e,"sender"),"outbound"),pending_inbound:Ha(sk(e,"receiver"),"inbound")},waiting_on:gH(e).map(r=>mk(r,e))}}function dH(e,t){let r=0;try{r=Ue(t.teamfile_path,e).members.length}catch{r=0}return{name:t.name,teamfile:t.teamfile_path,member_count:r,registered_at:t.registered_at,last_seeded_at:t.last_seeded_at}}function uH(e,t,r){let n=r.teamfile===void 0?null:Te(tH(r.teamfile)?r.teamfile:nH(ck(t),r.teamfile),e),s=Yt(e,t,r.alias),i=s.busy&&s.reason==="in-flight"?fH(e,t,r.alias,s.inFlight):null;return{alias:r.alias,provider:r.provider,model:r.model??null,teamfile:t,referenced_teamfile:n,sessionid:r.session??null,sessiondir:r.sessiondir??null,state:s.busy?"busy":"idle",reason:s.busy?s.reason:null,handling:i}}function fH(e,t,r,n){let s=n.sender_alias==="operator"?"operator":`${n.sender_teamfile}:${n.sender_alias}`,o=e.db.prepare(`
2751
2751
  SELECT * FROM tracked_invocation
2752
2752
  WHERE kind = 'chat'
2753
2753
  AND status = 'running'
@@ -2768,7 +2768,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
2768
2768
  AND delivered_at IS NULL
2769
2769
  AND delivering_at IS NULL
2770
2770
  ORDER BY receiver_teamfile ASC, receiver_alias ASC, id ASC
2771
- `).all(t,r)}function hH(e,t,r){return e.db.prepare(`
2771
+ `).all(t,r)}function _H(e,t,r){return e.db.prepare(`
2772
2772
  SELECT * FROM agent_mailbox
2773
2773
  WHERE receiver_teamfile = ?
2774
2774
  AND receiver_alias = ?
@@ -2780,7 +2780,7 @@ delete requires --confirm; deleting default or active workspaces also requires -
2780
2780
  WHERE delivered_at IS NULL
2781
2781
  AND delivering_at IS NULL
2782
2782
  ORDER BY ${r}
2783
- `).all()}function _H(e,t,r){return e.db.prepare(`
2783
+ `).all()}function hH(e,t,r){return e.db.prepare(`
2784
2784
  SELECT * FROM agent_mailbox
2785
2785
  WHERE sender_teamfile = ?
2786
2786
  AND sender_alias = ?
@@ -2826,9 +2826,9 @@ delete requires --confirm; deleting default or active workspaces also requires -
2826
2826
  id ASC
2827
2827
  `).all()}function Pf(e){return e.filter(t=>ra(t)!=="dead")}function mk(e,t){let r=e.delivered_at!==null&&(e.receipt===null||e.receipt==="");return{id:e.id,state:r?"no reply":"queued",sender:e.sender_teamfile===null||e.sender_alias===null?null:`${e.sender_teamfile}:${e.sender_alias}`,receiver:`${e.receiver_teamfile}:${e.receiver_alias}`,message_type:e.message_type,payload:e.payload,payload_preview:wk(e.payload),receiver_availability:yH(Yt(t,e.receiver_teamfile,e.receiver_alias)),age_basis_at:r?e.delivered_at:e.created_at,created_at:e.created_at,delivered_at:e.delivered_at}}function yH(e){if(!e.busy)return{state:"idle",reason:null,detail:"receiver idle now"};if(e.reason==="in-flight"){let s=e.inFlight.sender_alias==="operator"?"operator":`${e.inFlight.sender_teamfile}:${e.inFlight.sender_alias}`,i=e.inFlight.holder_pid===null?"":`, holder pid ${e.inFlight.holder_pid}`;return{state:"busy",reason:"in-flight",detail:`receiver busy now (in-flight: ${ze(s)} since ${e.inFlight.started_at}${i})`}}if(e.source==="terminal-lock"){let s=e.terminalLock,i=s.holder_host===Zv()?"this host":s.holder_host;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: holder pid ${s.holder_pid} alive on ${i})`}}let t=e.terminalInvocation,r=t.holder_host===null?"unknown host":t.holder_host===Zv()?"this host":t.holder_host,n=t.holder_pid===null?"":` holder pid ${t.holder_pid}`;return{state:"busy",reason:"terminal-held",detail:`receiver busy now (terminal: invocation #${t.id}${n} alive on ${r})`}}async function pk(e){let t=[];for(let r of e)t.push(await wH(r));return t}async function wH(e){let t=e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,r={tracked_invocation_id:e.id,from_identity:e.from_identity,target:t??"(unknown)",started_at:e.started_at,tail_hint:t===null?"":`lmctl tail "${e.target_teamfile}" ${e.target_alias}`};if(t===null)return Xr(r,"missing-target",null,null);if(e.request_payload===null||e.request_payload.length===0)return Xr(r,"missing-request-payload",null,null);let n=EH(e.meta);if(n.provider===null||n.sessionid===null)return Xr(r,"missing-session-metadata",n.provider,n.sessionid);if(!TH(n.provider))return Xr(r,"unsupported-provider",n.provider,n.sessionid);let s;try{s=await Ye(n.sessionid,n.provider)}catch{return Xr(r,"read-error",n.provider,n.sessionid)}if(s===null)return Xr(r,"session-not-found",n.provider,n.sessionid);let i=bH(e.request_payload,s.messages);return i.state!=="completed"?Xr(r,i.reason,n.provider,n.sessionid):{...r,state:"completed",reason:null,provider:n.provider,session_id:n.sessionid,result_payload:i.result,result_preview:yk(i.result),assistant_timestamp:i.assistantTimestamp,matched_user_index:i.userIndex}}function Xr(e,t,r,n){return{...e,state:"unreconciled",reason:t,provider:r,session_id:n,result_payload:null,result_preview:null,assistant_timestamp:null,matched_user_index:null}}function EH(e){if(e===null||e.trim()==="")return{provider:null,sessionid:null};try{let t=JSON.parse(e);return{provider:typeof t.provider=="string"&&t.provider.length>0?t.provider:null,sessionid:typeof t.sessionid=="string"&&t.sessionid.length>0?t.sessionid:null}}catch{return{provider:null,sessionid:null}}}function TH(e){return["claude","codex","gemini","copilot","opencode","lmplayer","qwen","agy","ClaudeMock"].includes(e)}function bH(e,t){let r=t.map((i,o)=>({message:i,index:o})).filter(({message:i})=>i.role==="user"&&i.content===e);if(r.length===0)return{state:"unreconciled",reason:"request-not-found"};if(r.length>1)return{state:"unreconciled",reason:"duplicate-request"};let n=r[0].index,s=[];for(let i of t.slice(n+1)){if(i.role==="user")break;i.role==="assistant"&&i.content.trim().length>0&&s.push(i)}return s.length===0?{state:"unreconciled",reason:"no-assistant-response"}:{state:"completed",userIndex:n,result:s.map(i=>i.content).join(`
2828
2828
 
2829
- `),assistantTimestamp:SH(s[s.length-1]?.timestamp)}}function SH(e){if(e===void 0)return null;let t=e.getTime();return Number.isFinite(t)?e.toISOString():null}function Ff(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,holder_liveness:ra(e),mailbox_delivery:null,from_identity:e.from_identity,target:e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,started_at:e.started_at,ended_at:e.ended_at,result:lk(e.result_summary),error:lk(e.error)};return r.mailbox_delivery=OH(r,t),r}function Ha(e,t){let r=new Map;for(let n of e){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=t==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function vH(e,t){return e.scope==="self"?kH(e,t):IH(e,t)}function kH(e,t){let r=[];r.push(`identity: ${e.identity}`),r.push(`team: ${e.team.name}`),r.push(`teamfile: ${e.team.teamfile}`),r.push(""),r.push("members:"),e.members.length===0&&r.push(" none");for(let n of e.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),_k(r,e.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),gk(r,e.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),Uf(r,Wf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Uf(r,Wf(e.activity.to_me,t.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Xa(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Xa(r,e.mailbox.inbound_pending),r.push(""),r.push(hk(e)),r.join(`
2830
- `)}function IH(e,t){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),e.teams.length===0&&r.push(" none");for(let n of e.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),_k(r,e.waiting_on,"workspace"),r.push(""),r.push("transcript harvest:"),gk(r,e.transcript_harvest,"workspace"),r.push(""),r.push("recent activity:"),Uf(r,Wf(e.activity,t.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),Xa(r,e.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Xa(r,e.mailbox.pending_inbound),r.push(""),r.push(hk(e)),r.join(`
2831
- `)}function hk(e){return Qs(e.workspace,e.db_path)}function Uf(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(ak).sort(RH),s=n.length===0?t:t.filter(i=>!ak(i));for(let i of n.slice(0,Qv))ok(e,i,r);Ja(e,n.length,Qv,"more open delegations");for(let i of s.slice(0,Ba))ok(e,i,r);Ja(e,s.length,Ba,"older")}function _k(e,t,r){if(t.length===0){e.push(" none");return}let n=NH(t,iH);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${ze(s.sender)} -> ${ze(s.receiver)}`:ze(s.receiver);e.push(` ${i} - ${s.state} ${DH(s.age_basis_at)} (#${s.id}, ${s.message_type})`),e.push(` "${s.payload_preview}"`),e.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}AH(e,t,n)}function gk(e,t,r){if(t.length===0){e.push(" none");return}for(let n of t.slice(0,Ba)){let s=r==="workspace"?` from ${ze(n.from_identity)} -> ${ze(n.target)}`:` -> ${ze(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;e.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else e.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&e.push(` inspect: ${n.tail_hint}`)}Ja(e,t.length,Ba,"more transcript harvest rows")}function NH(e,t){let r=[...e].sort(ik);if(r.length<=t)return r;let n=r.slice(0,t),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=xH(n);a>=0&&(n[a]=o)}return n.sort(ik)}function xH(e){let t=new Map;for(let r of e)t.set(r.state,(t.get(r.state)??0)+1);for(let r=e.length-1;r>=0;r-=1)if((t.get(e[r].state)??0)>1)return r;return-1}function AH(e,t,r){let n=new Set(r.map(l=>l.id)),s=t.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);e.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function ik(e,t){let r=Date.parse(e.age_basis_at),n=Date.parse(t.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:e.id-t.id}function Wf(e,t){let r=Date.parse(t);return Number.isFinite(r)?e.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):e}function ok(e,t,r){let n=jH(t,r),s=t.status==="running"?`since ${t.started_at}`:`ended ${t.ended_at??t.started_at}`,i=t.error??t.result,o=i===null?"":` "${yk(i)}"`;e.push(` #${t.id} ${LH(t)} ${t.kind}${n} ${s}${o}`)}function ak(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function RH(e,t){let r=Date.parse(e.started_at)-Date.parse(t.started_at);return Number.isFinite(r)&&r!==0?r:e.id-t.id}function LH(e){return e.status==="running"&&e.holder_liveness==="unknown"?"RUNNING_UNKNOWN":e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function OH(e,t){let r=$H(e,t);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function $H(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=Hr(e.from_identity),n=Hr(e.target)}catch{return null}for(let s of CH(e.result)){let i=t.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&MH(i,e))return i}return null}function CH(e){let t=new Set,r=[];for(let n of e.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||t.has(s)||(t.add(s),r.push(s))}return r}function MH(e,t){let r=Date.parse(t.started_at),n=Date.parse(t.ended_at??t.started_at),s=Date.parse(e.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function jH(e,t){if(t==="from-me")return e.target===null?"":` -> ${ze(e.target)}`;if(t==="to-me")return` from ${ze(e.from_identity)}`;let r=e.target===null?"":` -> ${ze(e.target)}`;return` from ${ze(e.from_identity)}${r}`}function Ja(e,t,r,n){let s=t-r;s>0&&e.push(` (+${s} ${n} -- use --json)`)}function Xa(e,t){if(t.length===0){e.push(" none");return}for(let r of t.slice(0,ek)){let n=r.sender??"operator";e.push(` ${ze(n)} -> ${ze(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ja(e,t.length,ek,"more lanes")}function lk(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function yk(e){let t=e.replace(/\s+/g," ").trim();return t.length<=tk?t:`${t.slice(0,tk-3)}...`}function wk(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=rk?t:`${t.slice(0,rk-3)}...`}function DH(e){let t=Date.parse(e);if(!Number.isFinite(t))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function ze(e){if(e==="operator")return e;try{let t=Hr(e);return`${eH(t.teamfile)}:${t.alias}`}catch{return e}}function PH(e){if(e===void 0)return{iso:new Date(Date.now()-oH).toISOString()};let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}}var sH,Ba,Qv,ek,iH,oH,tk,rk,Tk=E(()=>{"use strict";Ur();Le();Ju();Be();Na();Ot();yr();sH=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2829
+ `),assistantTimestamp:SH(s[s.length-1]?.timestamp)}}function SH(e){if(e===void 0)return null;let t=e.getTime();return Number.isFinite(t)?e.toISOString():null}function Ff(e,t){let r={id:e.id,kind:e.kind,origin:e.origin,status:e.status,holder_liveness:ra(e),mailbox_delivery:null,from_identity:e.from_identity,target:e.target_teamfile===null||e.target_alias===null?null:`${e.target_teamfile}:${e.target_alias}`,started_at:e.started_at,ended_at:e.ended_at,result:lk(e.result_summary),error:lk(e.error)};return r.mailbox_delivery=OH(r,t),r}function Ha(e,t){let r=new Map;for(let n of e){let s=n.sender_teamfile===null||n.sender_alias===null?"operator":`${n.sender_teamfile}:${n.sender_alias}`,i=`${n.receiver_teamfile}:${n.receiver_alias}`,o=t==="outbound"?`${s}\0${i}`:`${i}\0${s}`,a=r.get(o);a===void 0?r.set(o,[n]):a.push(n)}return[...r.values()].map(n=>{let s=n[0],i=n.map(o=>o.created_at).sort();return{sender:s.sender_teamfile===null||s.sender_alias===null?null:`${s.sender_teamfile}:${s.sender_alias}`,receiver:`${s.receiver_teamfile}:${s.receiver_alias}`,message_types:[...new Set(n.map(o=>o.message_type))].sort(),pending_count:n.length,oldest_created_at:i[0],newest_created_at:i[i.length-1],ids:n.map(o=>o.id)}})}function vH(e,t){return e.scope==="self"?kH(e,t):IH(e,t)}function kH(e,t){let r=[];r.push(`identity: ${e.identity}`),r.push(`team: ${e.team.name}`),r.push(`teamfile: ${e.team.teamfile}`),r.push(""),r.push("members:"),e.members.length===0&&r.push(" none");for(let n of e.members){let s=n.model===null?"":` model=${n.model}`,i=n.sessionid===null?"":` session=${n.sessionid}`,o=n.state==="idle"?"idle":`busy (${n.reason})`,a=n.handling===null?"":` handling="${n.handling.request_preview}"`;r.push(` ${n.alias}: ${o} provider=${n.provider}${s}${i}${a}`)}return r.push(""),r.push("Waiting on:"),hk(r,e.waiting_on,"self"),r.push(""),r.push("transcript harvest:"),gk(r,e.transcript_harvest,"self"),r.push(""),r.push("activity from me:"),Uf(r,Wf(e.activity.from_me,t.sinceIso),"from-me"),r.push(""),r.push("activity to me:"),Uf(r,Wf(e.activity.to_me,t.sinceIso),"to-me"),r.push(""),r.push("mailbox outbound:"),Xa(r,e.mailbox.outbound),r.push(""),r.push("mailbox inbound pending:"),Xa(r,e.mailbox.inbound_pending),r.push(""),r.push(_k(e)),r.join(`
2830
+ `)}function IH(e,t){let r=[];r.push("scope: workspace"),r.push("identity: none"),r.push(""),r.push("teams:"),e.teams.length===0&&r.push(" none");for(let n of e.teams){let s=n.name===null?"(unnamed)":n.name;r.push(` ${s}: ${n.teamfile} (${n.member_count} members)`)}return r.push(""),r.push("Waiting on:"),hk(r,e.waiting_on,"workspace"),r.push(""),r.push("transcript harvest:"),gk(r,e.transcript_harvest,"workspace"),r.push(""),r.push("recent activity:"),Uf(r,Wf(e.activity,t.sinceIso),"workspace"),r.push(""),r.push("mailbox pending outbound:"),Xa(r,e.mailbox.pending_outbound),r.push(""),r.push("mailbox pending inbound:"),Xa(r,e.mailbox.pending_inbound),r.push(""),r.push(_k(e)),r.join(`
2831
+ `)}function _k(e){return Qs(e.workspace,e.db_path)}function Uf(e,t,r){if(t.length===0){e.push(" none");return}let n=t.filter(ak).sort(RH),s=n.length===0?t:t.filter(i=>!ak(i));for(let i of n.slice(0,Qv))ok(e,i,r);Ja(e,n.length,Qv,"more open delegations");for(let i of s.slice(0,Ba))ok(e,i,r);Ja(e,s.length,Ba,"older")}function hk(e,t,r){if(t.length===0){e.push(" none");return}let n=NH(t,iH);for(let s of n){let i=r==="workspace"&&s.sender!==null?`${ze(s.sender)} -> ${ze(s.receiver)}`:ze(s.receiver);e.push(` ${i} - ${s.state} ${DH(s.age_basis_at)} (#${s.id}, ${s.message_type})`),e.push(` "${s.payload_preview}"`),e.push(` ${s.receiver_availability.detail}; lane key: sender+receiver, another sender's chat will not flush this queued mail`)}AH(e,t,n)}function gk(e,t,r){if(t.length===0){e.push(" none");return}for(let n of t.slice(0,Ba)){let s=r==="workspace"?` from ${ze(n.from_identity)} -> ${ze(n.target)}`:` -> ${ze(n.target)}`;if(n.state==="completed"){let i=n.result_preview===null?"":` "${n.result_preview}"`;e.push(` #${n.tracked_invocation_id} completed in transcript; lmctl DB not finalized${s} since ${n.started_at}${i}`)}else e.push(` #${n.tracked_invocation_id} unreconciled${s} since ${n.started_at} (${n.reason??"unknown"})`);n.tail_hint.length>0&&e.push(` inspect: ${n.tail_hint}`)}Ja(e,t.length,Ba,"more transcript harvest rows")}function NH(e,t){let r=[...e].sort(ik);if(r.length<=t)return r;let n=r.slice(0,t),s=new Set(r.map(i=>i.state));for(let i of s){if(n.some(l=>l.state===i))continue;let o=r.find(l=>l.state===i);if(o===void 0)continue;let a=xH(n);a>=0&&(n[a]=o)}return n.sort(ik)}function xH(e){let t=new Map;for(let r of e)t.set(r.state,(t.get(r.state)??0)+1);for(let r=e.length-1;r>=0;r-=1)if((t.get(e[r].state)??0)>1)return r;return-1}function AH(e,t,r){let n=new Set(r.map(l=>l.id)),s=t.filter(l=>!n.has(l.id));if(s.length===0)return;let i=s.filter(l=>l.state==="queued").length,o=s.filter(l=>l.state==="no reply").length,a=[i>0?`${i} queued`:null,o>0?`${o} no reply`:null].filter(l=>l!==null);e.push(` (+${s.length} older: ${a.join(", ")} -- use --json)`)}function ik(e,t){let r=Date.parse(e.age_basis_at),n=Date.parse(t.age_basis_at);return Number.isFinite(r)&&Number.isFinite(n)&&r!==n?r-n:Number.isFinite(r)!==Number.isFinite(n)?Number.isFinite(r)?-1:1:e.id-t.id}function Wf(e,t){let r=Date.parse(t);return Number.isFinite(r)?e.filter(n=>{let s=Date.parse(n.ended_at??n.started_at);return Number.isFinite(s)&&s>=r}):e}function ok(e,t,r){let n=jH(t,r),s=t.status==="running"?`since ${t.started_at}`:`ended ${t.ended_at??t.started_at}`,i=t.error??t.result,o=i===null?"":` "${yk(i)}"`;e.push(` #${t.id} ${LH(t)} ${t.kind}${n} ${s}${o}`)}function ak(e){return e.mailbox_delivery?.state==="queued"||e.mailbox_delivery?.state==="delivering"}function RH(e,t){let r=Date.parse(e.started_at)-Date.parse(t.started_at);return Number.isFinite(r)&&r!==0?r:e.id-t.id}function LH(e){return e.status==="running"&&e.holder_liveness==="unknown"?"RUNNING_UNKNOWN":e.mailbox_delivery===null?e.status.toUpperCase():e.mailbox_delivery.state.toUpperCase()}function OH(e,t){let r=$H(e,t);return r===null?null:{mailbox_id:r.id,state:r.delivered_at!==null?"delivered":r.delivering_at!==null?"delivering":"queued",delivered_at:r.delivered_at,delivering_at:r.delivering_at}}function $H(e,t){if(e.kind!=="chat"||e.status!=="done"||e.target===null||e.result===null)return null;let r,n;try{r=Hr(e.from_identity),n=Hr(e.target)}catch{return null}for(let s of CH(e.result)){let i=t.getMailboxMessage(s);if(i!==null&&!(i.sender_teamfile!==r.teamfile||i.sender_alias!==r.alias)&&!(i.receiver_teamfile!==n.teamfile||i.receiver_alias!==n.alias)&&MH(i,e))return i}return null}function CH(e){let t=new Set,r=[];for(let n of e.matchAll(/\d+/g)){let s=Number(n[0]);!Number.isSafeInteger(s)||s<=0||t.has(s)||(t.add(s),r.push(s))}return r}function MH(e,t){let r=Date.parse(t.started_at),n=Date.parse(t.ended_at??t.started_at),s=Date.parse(e.created_at);return!Number.isFinite(r)||!Number.isFinite(n)||!Number.isFinite(s)?!1:s>=r&&s<=n}function jH(e,t){if(t==="from-me")return e.target===null?"":` -> ${ze(e.target)}`;if(t==="to-me")return` from ${ze(e.from_identity)}`;let r=e.target===null?"":` -> ${ze(e.target)}`;return` from ${ze(e.from_identity)}${r}`}function Ja(e,t,r,n){let s=t-r;s>0&&e.push(` (+${s} ${n} -- use --json)`)}function Xa(e,t){if(t.length===0){e.push(" none");return}for(let r of t.slice(0,ek)){let n=r.sender??"operator";e.push(` ${ze(n)} -> ${ze(r.receiver)}: ${r.pending_count} pending ${r.message_types.join("+")} (oldest ${r.oldest_created_at})`)}Ja(e,t.length,ek,"more lanes")}function lk(e){return e===null||e.length===0?null:e.replace(/\s+/g," ").trim()}function yk(e){let t=e.replace(/\s+/g," ").trim();return t.length<=tk?t:`${t.slice(0,tk-3)}...`}function wk(e){let t=e.replace(/\s+/gu," ").trim();return t.length<=rk?t:`${t.slice(0,rk-3)}...`}function DH(e){let t=Date.parse(e);if(!Number.isFinite(t))return"unknown age";let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return`${r}s`;let n=Math.floor(r/60);if(n<60)return`${n}m`;let s=Math.floor(n/60);return s<48?`${s}h`:`${Math.floor(s/24)}d`}function ze(e){if(e==="operator")return e;try{let t=Hr(e);return`${eH(t.teamfile)}:${t.alias}`}catch{return e}}function PH(e){if(e===void 0)return{iso:new Date(Date.now()-oH).toISOString()};let t=/^(\d+)([smhd])$/.exec(e);if(t!==null){let n=Number(t[1]),s=t[2],i=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-i*1e3).toISOString()}}let r=Date.parse(e);return Number.isFinite(r)?{iso:new Date(r).toISOString()}:{error:`invalid --since value: ${e} (expected ISO8601 or duration like 24h)`}}var sH,Ba,Qv,ek,iH,oH,tk,rk,Tk=E(()=>{"use strict";Ur();Le();Ju();Be();Na();Ot();yr();sH=`usage: lmctl status [--json] [--since <duration|ISO8601>]
2832
2832
 
2833
2833
  Show this member's team, busy/idle roster, recent tracked activity, and mailbox
2834
2834
  state. From a plain operator shell, show a workspace-level team/activity summary.
@@ -2836,7 +2836,7 @@ state. From a plain operator shell, show a workspace-level team/activity summary
2836
2836
  Text output shows recent activity from the last 24h by default. Use --since 7d
2837
2837
  or an ISO timestamp to widen the investigation window. --json returns complete,
2838
2838
  uncapped data.
2839
- `,Ba=5,Qv=5,ek=5,iH=5,oH=24*60*60*1e3,tk=72,rk=80});Be();Bn();pe();import{pathToFileURL as FH}from"node:url";import{mkdirSync as hI,readFileSync as _I,renameSync as gI,writeFileSync as yI}from"node:fs";import{homedir as wI}from"node:os";import{dirname as EI,join as TI}from"node:path";function um(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function mI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function pI(e,t){return!mI(e)||um(e)?null:`${t} must use https://: ${e}`}async function fm(e,t){let r=pI(e,t.description);if(r!==null||!um(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw dm(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw dm(e,t.description,n,a)}}finally{clearTimeout(i)}}function dm(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Bn();var bI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",SI=60*60*1e3,vI=1500;function kI(){let e=process.env.HOME??wI();return TI(e,".lmctl",".update-check.json")}function II(e){return e.isTTY===!0}function NI(e,t){let r=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},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function el(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!II(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function xI(e,t){try{let r=JSON.parse(_I(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<SI)return r.latest}catch{}return null}function AI(e,t){hI(EI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;yI(r,`${JSON.stringify(t)}
2839
+ `,Ba=5,Qv=5,ek=5,iH=5,oH=24*60*60*1e3,tk=72,rk=80});Be();Bn();me();import{pathToFileURL as FH}from"node:url";import{mkdirSync as _I,readFileSync as hI,renameSync as gI,writeFileSync as yI}from"node:fs";import{homedir as wI}from"node:os";import{dirname as EI,join as TI}from"node:path";function um(e){try{return new URL(e).protocol==="https:"}catch{return!1}}function mI(e){return/^[A-Za-z]:[\\/]/.test(e)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(e)}function pI(e,t){return!mI(e)||um(e)?null:`${t} must use https://: ${e}`}async function fm(e,t){let r=pI(e,t.description);if(r!==null||!um(e))throw new Error(r??`${t.description} must use https://: ${e}`);let n=t.timeoutMs??15e3,s=new AbortController,i=setTimeout(()=>s.abort(),n);try{let o;try{o=await fetch(e,{signal:s.signal,redirect:"manual"})}catch(a){throw dm(e,t.description,n,a)}if(o.type==="opaqueredirect"||o.status>=300&&o.status<400)throw new Error(`refusing to follow redirect from ${t.description} ${e} (https-only: the URL must serve the content directly, not redirect)`);if(!o.ok)throw new Error(`failed to fetch ${t.description} ${e}: HTTP ${o.status}${o.statusText?` ${o.statusText}`:""}`);try{return Buffer.from(await o.arrayBuffer())}catch(a){throw dm(e,t.description,n,a)}}finally{clearTimeout(i)}}function dm(e,t,r,n){let i=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${t} ${e}: ${i}`)}Bn();var bI="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",SI=60*60*1e3,vI=1500;function kI(){let e=process.env.HOME??wI();return TI(e,".lmctl",".update-check.json")}function II(e){return e.isTTY===!0}function NI(e,t){let r=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},n=r(e),s=r(t);if(n===null||s===null)return 0;for(let i=0;i<3;i+=1){if(n[i]>s[i])return 1;if(n[i]<s[i])return-1}return 0}function el(e,t){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!II(t.stderr)||e.includes("--json")||e.includes("--help")||e.includes("-h")||e[0]==="help"||e[0]==="mcp")}function xI(e,t){try{let r=JSON.parse(hI(e,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&t-r.checkedAt<SI)return r.latest}catch{}return null}function AI(e,t){_I(EI(e),{recursive:!0});let r=`${e}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;yI(r,`${JSON.stringify(t)}
2840
2840
  `,"utf8"),gI(r,e)}async function RI(){let e=await fm(bI,{description:"lmctl npm metadata",timeoutMs:vI}),t=JSON.parse(e.toString("utf8"));if(typeof t.version!="string"||t.version.trim()==="")throw new Error("registry response missing version");return t.version}async function mm(e,t=[],r={}){try{if(el(t,e))return;let n=r.now?.()??Date.now(),s=r.cachePath??kI();if(xI(s,n)!==null)return;let o=await(r.fetchLatest??RI)();try{AI(s,{checkedAt:n,latest:o})}catch{return}let a=r.currentVersion?.()??Et();NI(o,a)>0&&e.stderr.write(`update available: ${a} \u2192 ${o} run: npm i -g @lmctl-ai/lmctl@latest
2841
2841
  `)}catch{}}var Pn=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2842
2842
  `,Bf=`${Pn}
@@ -2892,7 +2892,7 @@ ${Pn}Run 'lmctl help' for usage.
2892
2892
  `),0;if(n==="--help"||n==="-h"||n===void 0)return t.stdout.write(Bf),0;if(n==="help"){let[a,...l]=r.slice(1);return a===void 0||a==="--help"||a==="-h"?(t.stdout.write(Bf),0):bk.has(a)?Sk(a,[...l,"--help"],t):vk(t,a)}Vf(Z(),t.stderr),Yf(t.stderr);let[s,...i]=r;if(s===void 0)return t.stdout.write(Bf),0;let o=Date.now();Hf(s,i,{phase:"start",started_at:new Date(o).toISOString()});try{let a=await Sk(s,i,t);return Hf(s,i,{phase:"finish",outcome:a===0?"ok":"error",exit_code:a,duration_ms:Date.now()-o}),bk.has(s)&&!el(r,t)&&await mm(t,r),a}catch(a){let l=a instanceof Error?a:new Error(String(a));return Hf(s,i,{phase:"fatal",outcome:"fatal",exit_code:1,duration_ms:Date.now()-o,error_class:l.name,error_message:l.message,error_stack:l.stack??null,causes:qH(l)}),BH(a,s,i,t)}}function Hf(e,t,r){Ae({event:e,record_kind:"cli_action",command:e,argv:t,cwd:process.cwd(),db_path:Z(),workspace:process.env.LMCTL_WORKSPACE??null,lmctl_version:Et(),node_version:process.version,...r})}function BH(e,t,r,n){let s=e instanceof Error?e:new Error(String(e));return n.stderr.write(`error: ${s.message}
2893
2893
  `),cm()?(n.stderr.write(`(debug details written to ~/.lmctl/debug-*.log)
2894
2894
  `),1):(n.stderr.write(`(re-run with --debug for the full stack trace and context in ~/.lmctl/debug-*.log)
2895
- `),1)}function qH(e){let t=[],r=e.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));t.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return t}async function Sk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Cc(),Qh));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(tb(),eb));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Pb(),Db));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(Hb(),qb));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(zb(),Yb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Qb(),Zb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(ES(),wS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(xS(),NS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(DS(),jS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(US(),FS));return n(t,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(t,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(t,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(t,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(t,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(lv(),av));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(fv(),uv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Tv(),Ev));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Rv(),Av));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Hv(),qv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(zv(),Yv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(Tk(),Ek));return n(t,r)}case"db":return HH(t,r);default:return vk(r,e)}}function HH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2895
+ `),1)}function qH(e){let t=[],r=e.cause,n=0;for(;r!=null&&n<8;){let s=r instanceof Error?r:new Error(String(r));t.push({error_class:s.name,error_message:s.message,error_stack:s.stack??null}),r=s.cause,n+=1}return t}async function Sk(e,t,r){switch(e){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(Cc(),Q_));return n(t,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(tb(),eb));return n(t,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Pb(),Db));return n(t,r)}case"recover":{let{runRecover:n}=await Promise.resolve().then(()=>(Hb(),qb));return n(t,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>(zb(),Yb));return n(t,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Qb(),Zb));return n(t,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(ES(),wS));return n(t,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(xS(),NS));return n(t,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(DS(),jS));return n(t,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(US(),FS));return n(t,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(t,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(t,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(t,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Xs(),Js));return n(t,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(lv(),av));return n(t,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>(fv(),uv));return n(t,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(Tv(),Ev));return n(t,r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(Rv(),Av));return n(t,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(Hv(),qv));return n(t,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>(zv(),Yv));return n(t,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(Tk(),Ek));return n(t,r)}case"db":return HH(t,r);default:return vk(r,e)}}function HH(e,t){let[r,...n]=e;return r==="--help"||r==="-h"||r==="help"?(t.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2896
2896
 
2897
2897
  Database utilities. The downgrade command is currently a documented stub;
2898
2898
  restore from backup for rollback and use normal migrations for forward changes.