@lmctl-ai/lmctl 0.1.51 → 0.1.53

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 +317 -328
  2. package/package.json +1 -1
package/dist/cli/index.js CHANGED
@@ -12,9 +12,9 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
12
12
  FROM attention WHERE acknowledged_at IS NULL ORDER BY created_at DESC LIMIT 100`);return{unacked:qt(r)}}async function pk(t){let e=st(),r=process.version,n=Ka("uname",["-a"],{encoding:"utf8"}),s=Ln((n.stdout??"").trim()),o=[],i=t.dbPath??process.env.LMCTL_DB;if(i!==void 0)try{await Ff(i);let u=Ka("du",["-sh",i],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let a=t.sessiondir??process.env.LMCTL_SESSIONDIR;if(a!==void 0)try{await Ff(a);let u=Ka("du",["-sh",a],{encoding:"utf8"});u.status===0&&o.push(u.stdout.trim())}catch{}let l=o.length===0?"(no paths configured)":Ln(o.join(`
13
13
  `)),c=[];for(let u of lk){let d=process.env[u];if(d===void 0){c.push({key:u,value:"(unset)"});continue}c.push(Df(u,d))}return{lmctl_next_version:e,node_version:r,os_info:s,disk_usage:l,env_keys_present:c}}function hk(){return process.env.LMCTL_INTENT_LOG??ik(ok(),".lmctl","recent-intents.log")}async function _k(t){let e=t.intentLog??hk(),r=t.intentLogTailLines??500;try{let s=(await za(e,"utf8")).split(`
14
14
  `).filter(i=>i.length>0),o=s.slice(Math.max(0,s.length-r));return{source_path:e,tail_lines:o.length,tail:Ln(o.join(`
15
- `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Gs,lk,Ya,Cn=b(()=>{"use strict";Xs();Gs=["serve","db","runs","jobs","attentions","env","intents"];lk=["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"];Ya=["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 qf,appendFileSync as gk,mkdirSync as wk,existsSync as e2,readdirSync as t2,unlinkSync as r2}from"node:fs";import{join as Ks,dirname as yk}from"node:path";import{homedir as Ek}from"node:os";function Za(){return Ks(Ek(),".lmctl")}function Hf(){Fr=!0,process.env.LMCTL_DEBUG="1"}function Jf(){return{cliDebug:Fr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Xf(t){Fr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function Se(){if(Fr)return!0;let t=Date.now();return t-Bf>=bk&&(Wf=kk(),Bf=t),Wf}function Qa(){return Fr||process.env.LMCTL_DEBUG==="1"}function Sk(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function It(t,e){if(e?.verbose){if(!Fr)return}else if(!e?.always&&!Se())return;try{Tk();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t};gk(Vs,JSON.stringify(r)+`
16
- `)}catch{}}function Tk(){if(!Vs){let e=Sk().slice(0,13).replace("T","-");Vs=Ks(Za(),`debug-${e}.log`)}wk(yk(Vs),{recursive:!0})}function ot(...t){It({event:"legacy",msg:t.join(" ")})}function pt(...t){It({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Z(t){It(t,{always:!0})}function kk(){return vk()||Ik()}function vk(){try{let t=qf(Ks(Za(),"config.toml"),"utf-8");for(let e of t.split(`
17
- `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Ik(){try{let t=qf(Ks(Za(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Fr,Wf,Bf,bk,Vs,je=b(()=>{"use strict";Fr=!1,Wf=!1,Bf=0,bk=5e3;Vs=null});function ht(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Ht(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Mn(t,e){return!Ht(t)||ht(t)?null:`${e} must use https://: ${t}`}async function wr(t,e){let r=Mn(t,e.description);if(r!==null||!ht(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Gf(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw Gf(t,e.description,n,a)}}finally{clearTimeout(o)}}function Gf(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Ys=b(()=>{"use strict"});import{existsSync as qk}from"node:fs";import{createRequire as Hk}from"node:module";function Jk(){return tl===null&&(tl=Hk(import.meta.url)("node:sqlite").DatabaseSync),tl}function rl(t){return t.length===1&&Xk(t[0])?[t[0]]:t}function Xk(t){if(!ol(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ol(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tl,nl,zs,sl,il=b(()=>{"use strict";tl=null;nl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!qk(e))throw new Error("unable to open database file");this.name=e,this.handle=new(Jk())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new sl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},zs=nl,sl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...rl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...rl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...rl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&ol(e)?Object.values(e):ol(e)?{...e}:e}}});import{existsSync as Gk,mkdirSync as Vk,readFileSync as Kk}from"node:fs";import{homedir as Yk}from"node:os";import{dirname as Kf,join as zk,resolve as Yf}from"node:path";import{fileURLToPath as Zk,pathToFileURL as Qk}from"node:url";function ll(t){t.dbPath!==":memory:"&&Vk(Kf(t.dbPath),{recursive:!0});let e=new zs(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Zf(e);return r===0&&(e.exec(Kk(ev,"utf8")),e.pragma(`user_version = ${al}`)),rv(e,r),e}function rv(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
15
+ `)),note:null}}catch(n){return n.code==="ENOENT"?{source_path:e,tail_lines:0,tail:"",note:"no intent log present (status never run on this host)"}:{source_path:e,tail_lines:0,tail:"",note:`intent log unreadable: ${n instanceof Error?n.message:String(n)}`}}}var Gs,lk,Ya,Cn=b(()=>{"use strict";Xs();Gs=["serve","db","runs","jobs","attentions","env","intents"];lk=["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"];Ya=["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 qf,appendFileSync as gk,mkdirSync as yk,existsSync as QB,readdirSync as e2,unlinkSync as t2}from"node:fs";import{join as Ks,dirname as wk}from"node:path";import{homedir as Ek}from"node:os";function Za(){return Ks(Ek(),".lmctl")}function Hf(){Fr=!0,process.env.LMCTL_DEBUG="1"}function Jf(){return{cliDebug:Fr,lmctlDebugEnv:process.env.LMCTL_DEBUG}}function Xf(t){Fr=t.cliDebug,t.lmctlDebugEnv===void 0?delete process.env.LMCTL_DEBUG:process.env.LMCTL_DEBUG=t.lmctlDebugEnv}function Se(){if(Fr)return!0;let t=Date.now();return t-Bf>=bk&&(Wf=kk(),Bf=t),Wf}function Qa(){return Fr||process.env.LMCTL_DEBUG==="1"}function Sk(){let t=new Date,e=t.getTimezoneOffset(),r=e<=0?"+":"-",n=String(Math.floor(Math.abs(e)/60)).padStart(2,"0"),s=String(Math.abs(e)%60).padStart(2,"0");return new Date(t.getTime()-e*6e4).toISOString().replace("Z",`${r}${n}:${s}`)}function It(t,e){if(e?.verbose){if(!Fr)return}else if(!e?.always&&!Se())return;try{Tk();let r={ts:new Date().toISOString(),pid:process.pid,vti:process.env.LMCTL_VTI??null,autocode_run_id:process.env.LMCTL_AUTOCODE_RUN_ID??void 0,...t};gk(Vs,JSON.stringify(r)+`
16
+ `)}catch{}}function Tk(){if(!Vs){let e=Sk().slice(0,13).replace("T","-");Vs=Ks(Za(),`debug-${e}.log`)}yk(wk(Vs),{recursive:!0})}function ot(...t){It({event:"legacy",msg:t.join(" ")})}function pt(...t){It({event:"legacy",msg:t.join(" ")},{verbose:!0})}function Z(t){It(t,{always:!0})}function kk(){return vk()||Ik()}function vk(){try{let t=qf(Ks(Za(),"config.toml"),"utf-8");for(let e of t.split(`
17
+ `)){let r=e.trim();if(!r||r.startsWith("#"))continue;if(r.startsWith("["))break;let n=/^debug\s*=\s*(.+)$/.exec(r);if(n){let s=n[1].trim().toLowerCase().replace(/^["']|["']$/g,"");return s==="true"||s==="1"}}}catch{}return!1}function Ik(){try{let t=qf(Ks(Za(),"config.json"),"utf-8"),e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)&&e.debug===!0}catch{}return!1}var Fr,Wf,Bf,bk,Vs,je=b(()=>{"use strict";Fr=!1,Wf=!1,Bf=0,bk=5e3;Vs=null});function ht(t){try{return new URL(t).protocol==="https:"}catch{return!1}}function Ht(t){return/^[A-Za-z]:[\\/]/.test(t)?!1:/^[A-Za-z][A-Za-z0-9+.-]*:/.test(t)}function Mn(t,e){return!Ht(t)||ht(t)?null:`${e} must use https://: ${t}`}async function yr(t,e){let r=Mn(t,e.description);if(r!==null||!ht(t))throw new Error(r??`${e.description} must use https://: ${t}`);let n=e.timeoutMs??15e3,s=new AbortController,o=setTimeout(()=>s.abort(),n);try{let i;try{i=await fetch(t,{signal:s.signal,redirect:"manual"})}catch(a){throw Gf(t,e.description,n,a)}if(i.type==="opaqueredirect"||i.status>=300&&i.status<400)throw new Error(`refusing to follow redirect from ${e.description} ${t} (https-only: the URL must serve the content directly, not redirect)`);if(!i.ok)throw new Error(`failed to fetch ${e.description} ${t}: HTTP ${i.status}${i.statusText?` ${i.statusText}`:""}`);try{return Buffer.from(await i.arrayBuffer())}catch(a){throw Gf(t,e.description,n,a)}}finally{clearTimeout(o)}}function Gf(t,e,r,n){let o=n instanceof Error&&n.name==="AbortError"?`timed out after ${r}ms`:n instanceof Error?n.message:String(n);return new Error(`failed to fetch ${e} ${t}: ${o}`)}var Ys=b(()=>{"use strict"});import{existsSync as qk}from"node:fs";import{createRequire as Hk}from"node:module";function Jk(){return tl===null&&(tl=Hk(import.meta.url)("node:sqlite").DatabaseSync),tl}function rl(t){return t.length===1&&Xk(t[0])?[t[0]]:t}function Xk(t){if(!ol(t))return!1;let e=Object.getPrototypeOf(t);return e===Object.prototype||e===null}function ol(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var tl,nl,zs,sl,il=b(()=>{"use strict";tl=null;nl=class{name;handle;transactionDepth=0;savepointId=0;constructor(e,r={}){if(r.fileMustExist===!0&&e!==":memory:"&&!qk(e))throw new Error("unable to open database file");this.name=e,this.handle=new(Jk())(e,{readOnly:r.readonly===!0}),this.exec("PRAGMA busy_timeout = 5000")}prepare(e){return new sl(this.handle.prepare(e))}exec(e){this.handle.exec(e),this.updateTransactionDepth(e)}pragma(e,r){let n=`PRAGMA ${e}`;if(e.includes("=")){this.exec(n);return}let s=this.prepare(n).get();return r?.simple===!0?s===void 0?void 0:Object.values(s)[0]:s}transaction(e){return(...r)=>{if(this.transactionDepth===0){this.exec("BEGIN");try{let s=e(...r);return this.exec("COMMIT"),s}catch(s){throw this.inTransaction&&this.exec("ROLLBACK"),s}}let n=`lmctl_sp_${this.savepointId+=1}`;this.exec(`SAVEPOINT ${n}`);try{let s=e(...r);return this.exec(`RELEASE ${n}`),s}catch(s){throw this.inTransaction&&(this.exec(`ROLLBACK TO ${n}`),this.exec(`RELEASE ${n}`)),s}}}get inTransaction(){return this.transactionDepth>0}close(){this.handle.close()}updateTransactionDepth(e){let r=e.trim().match(/^([A-Za-z]+)/)?.[1]?.toUpperCase();if(r!==void 0){if(r==="BEGIN"||r==="SAVEPOINT"){this.transactionDepth+=1;return}if(r==="COMMIT"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}if(r==="RELEASE"){this.transactionDepth=Math.max(0,this.transactionDepth-1);return}r==="ROLLBACK"&&!/^ROLLBACK\s+TO\b/i.test(e.trim())&&(this.transactionDepth=0)}}},zs=nl,sl=class{handle;rawMode=!1;constructor(e){this.handle=e,this.handle.setAllowBareNamedParameters(!0)}get(...e){let r=this.handle.get(...rl(e));return this.normalizeRow(r)}all(...e){return this.handle.all(...rl(e)).map(r=>this.normalizeRow(r))}run(...e){let r=this.handle.run(...rl(e));return{changes:Number(r.changes),lastInsertRowid:Number(r.lastInsertRowid)}}raw(){return this.rawMode=!0,this}normalizeRow(e){return e==null?e:this.rawMode&&ol(e)?Object.values(e):ol(e)?{...e}:e}}});import{existsSync as Gk,mkdirSync as Vk,readFileSync as Kk}from"node:fs";import{homedir as Yk}from"node:os";import{dirname as Kf,join as zk,resolve as Yf}from"node:path";import{fileURLToPath as Zk,pathToFileURL as Qk}from"node:url";function ll(t){t.dbPath!==":memory:"&&Vk(Kf(t.dbPath),{recursive:!0});let e=new zs(t.dbPath);e.pragma("journal_mode = WAL"),e.pragma("synchronous = NORMAL"),e.pragma("foreign_keys = ON");let r=Zf(e);return r===0&&(e.exec(Kk(ev,"utf8")),e.pragma(`user_version = ${al}`)),rv(e,r),e}function rv(t,e){let r=e;if(r<2&&r!==0&&(t.exec(`
18
18
  CREATE TABLE IF NOT EXISTS session_size (
19
19
  id INTEGER PRIMARY KEY AUTOINCREMENT,
20
20
  team_name TEXT NOT NULL,
@@ -862,10 +862,8 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
862
862
  AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
863
863
  AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
864
864
  AND agent_inflight.started_at = @reclaim_observed_started_at
865
- AND (
866
- (@reclaim_observed_holder_is_null = 1 AND agent_inflight.holder_pid IS NULL)
867
- OR (@reclaim_observed_holder_pid IS NOT NULL AND agent_inflight.holder_pid = @reclaim_observed_holder_pid)
868
- )
865
+ AND @reclaim_observed_holder_pid IS NOT NULL
866
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
869
867
  )
870
868
  THEN excluded.sender_teamfile
871
869
  ELSE agent_inflight.sender_teamfile
@@ -878,10 +876,8 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
878
876
  AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
879
877
  AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
880
878
  AND agent_inflight.started_at = @reclaim_observed_started_at
881
- AND (
882
- (@reclaim_observed_holder_is_null = 1 AND agent_inflight.holder_pid IS NULL)
883
- OR (@reclaim_observed_holder_pid IS NOT NULL AND agent_inflight.holder_pid = @reclaim_observed_holder_pid)
884
- )
879
+ AND @reclaim_observed_holder_pid IS NOT NULL
880
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
885
881
  )
886
882
  THEN excluded.sender_alias
887
883
  ELSE agent_inflight.sender_alias
@@ -894,10 +890,8 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
894
890
  AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
895
891
  AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
896
892
  AND agent_inflight.started_at = @reclaim_observed_started_at
897
- AND (
898
- (@reclaim_observed_holder_is_null = 1 AND agent_inflight.holder_pid IS NULL)
899
- OR (@reclaim_observed_holder_pid IS NOT NULL AND agent_inflight.holder_pid = @reclaim_observed_holder_pid)
900
- )
893
+ AND @reclaim_observed_holder_pid IS NOT NULL
894
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
901
895
  )
902
896
  THEN excluded.started_at
903
897
  ELSE agent_inflight.started_at
@@ -910,10 +904,8 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
910
904
  AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
911
905
  AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
912
906
  AND agent_inflight.started_at = @reclaim_observed_started_at
913
- AND (
914
- (@reclaim_observed_holder_is_null = 1 AND agent_inflight.holder_pid IS NULL)
915
- OR (@reclaim_observed_holder_pid IS NOT NULL AND agent_inflight.holder_pid = @reclaim_observed_holder_pid)
916
- )
907
+ AND @reclaim_observed_holder_pid IS NOT NULL
908
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
917
909
  )
918
910
  THEN 1
919
911
  ELSE agent_inflight.active_count
@@ -926,10 +918,8 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
926
918
  AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
927
919
  AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
928
920
  AND agent_inflight.started_at = @reclaim_observed_started_at
929
- AND (
930
- (@reclaim_observed_holder_is_null = 1 AND agent_inflight.holder_pid IS NULL)
931
- OR (@reclaim_observed_holder_pid IS NOT NULL AND agent_inflight.holder_pid = @reclaim_observed_holder_pid)
932
- )
921
+ AND @reclaim_observed_holder_pid IS NOT NULL
922
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
933
923
  )
934
924
  THEN excluded.holder_pid
935
925
  ELSE agent_inflight.holder_pid
@@ -941,10 +931,8 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
941
931
  AND agent_inflight.sender_teamfile = @reclaim_observed_sender_teamfile
942
932
  AND agent_inflight.sender_alias = @reclaim_observed_sender_alias
943
933
  AND agent_inflight.started_at = @reclaim_observed_started_at
944
- AND (
945
- (@reclaim_observed_holder_is_null = 1 AND agent_inflight.holder_pid IS NULL)
946
- OR (@reclaim_observed_holder_pid IS NOT NULL AND agent_inflight.holder_pid = @reclaim_observed_holder_pid)
947
- )
934
+ AND @reclaim_observed_holder_pid IS NOT NULL
935
+ AND agent_inflight.holder_pid = @reclaim_observed_holder_pid
948
936
  )
949
937
  RETURNING *
950
938
  `),clearAgentInflight:t.prepare("DELETE FROM agent_inflight WHERE receiver_teamfile = ? AND receiver_alias = ?"),clearAgentInflightIfSender:t.prepare(`
@@ -961,10 +949,10 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
961
949
  AND sender_teamfile = ?
962
950
  AND sender_alias = ?
963
951
  AND active_count > 1
964
- `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dl,Pe=b(()=>{"use strict";cl();Pn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cv(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(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=e.transaction((r,n,s,o,i)=>{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>=o)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<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.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,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"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=e.transaction((r,n,s)=>uv("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.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(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==Qs)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Dn&&!a.includes(n))return{resumed:!1,reason:em};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,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,o=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_is_null:s?.holder_pid===null?1:0,reclaim_observed_holder_pid:typeof s?.holder_pid=="number"?s.holder_pid:null}),i=o!==void 0?{acquired:!0,current:o}:{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"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...r){let n=e.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(e).all(...r)}insertWorkflow(e){rm(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,P()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,P());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){rm(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,P());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,P())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,P());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,P()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(P(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,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 o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,P());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,P());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,P(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,P());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",P());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=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,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,P());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=P(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).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(e,r){return this.stmts.claimNextIssue.get(r,P(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,P(),e)??null}closeIssue(e,r,n){let s=P(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,P(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,P(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=P();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=iv(),s=P();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=P(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,P())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??P(),e.dedupe_key??null,e.concurrency_key??null,P());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:P();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,P()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,P()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??P(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,P());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=P(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,P(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(P(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,P(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,P())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,P());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,P(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??P(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,P());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,P()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,P()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,P());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=P();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??P());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);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(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,P())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,P())}}});import{realpathSync as dv}from"node:fs";import{resolve as fv}from"node:path";function ml(t){let e=fv(t);try{return dv(e)}catch{return e}}var sm=b(()=>{"use strict"});import{platform as om}from"node:os";function _t(t){let e=new Fn;for(let r of t)e.registerAdapter(r);return e}var Fn,pl=b(()=>{"use strict";sm();Fn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=ml(e.workspace);o=o.filter(a=>ml(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=om()==="darwin"||om()==="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:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as im}from"node:fs";import{createInterface as am}from"node:readline";import{stat as mv}from"node:fs/promises";import{homedir as pv}from"node:os";async function*Fe(t){let e=im(t,{encoding:"utf-8"}),r=am({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Le(t,e){let r=[],n=im(t,{encoding:"utf-8"}),s=am({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function Ne(t){let e=await mv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
965
- `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Jt=b(()=>{"use strict";Te=pv()});import{readdir as eo,stat as lm,unlink as hv}from"node:fs/promises";import{join as Wr,basename as cm}from"node:path";function _v(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function um(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var to,dm=b(()=>{"use strict";Jt();to=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Wr(Te,".claude"),this.projectsDir=Wr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await eo(this.projectsDir)}catch{return e}for(let n of r){let s=Wr(this.projectsDir,n);if(!(await lm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await eo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=cm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Wr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await Ne(e),o="",i,a,l,c,u,d;for(let m of n)if(!_v(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await um(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Ne(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Fe(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=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:gv(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;u||(u=V(_.trim(),80)),d=V(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let E=typeof T.content=="string"?de(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:T.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 T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:de(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await um(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,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(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await hv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await eo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Wr(this.projectsDir,i);if(!(await lm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await eo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=cm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Wr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ro(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function yv(t,e,r){if(!r)return"";let n=t.tools[e]??hl[e],s=n?.profiles?.[r]?.flags??hl[e]?.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 "${e}"`)}function fm(t,e){return!!t.tools[e]}function mm(t,e,r,n,s){let o=t.tools[e]??hl[e],i;if(o?.agent){let l=ro(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=wv[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(ro).join(" ");i=`printf '%s\\n' ${ro(n)} | ${u}`}else i=c.map(ro).join(" ")}let a=yv(t,e,s);return a&&(i+=" "+a),i}var hl,wv,pm=b(()=>{"use strict";hl={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:""}}}},wv={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 hm(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var _m=b(()=>{"use strict"});var Ev,xe,no,Nt=b(()=>{"use strict";Ev="ACK: waiting for explicit lmctl task.",xe=`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: ${Ev}`,no=`send this exact lmctl seed instruction: "${xe}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[_l]:e}}var _l,Xt=b(()=>{"use strict";_l="LMCTL_SELF_SESSIONID"});import{spawn as gm}from"node:child_process";import{mkdirSync as bv}from"node:fs";var gl,Oe,Gt=b(()=>{"use strict";pm();_m();Nt();Xt();gl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===xe?r:n)}seed(e,r){return bv(e,{recursive:!0}),new Promise(n=>{let s;try{s=gm(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
966
- `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&fm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...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,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new gl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=mm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=hm(r.env),c=gm(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let 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(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({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=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function oo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,ye,xt,so,$t,Br=b(()=>{"use strict";Ye=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},ye=class extends Ye{},xt=class extends Ye{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},so=class extends Ye{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},$t=class extends Ye{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as yl from"node:child_process";function Tv(t){if(typeof yl.spawnSync=="function")try{yl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function wm(t){return t.exitCode!==null||t.signalCode!==null}function wl(t,e){return wm(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function it(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??Tv;if(wm(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await wl(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await wl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await wl(t,Sv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Sv,io=b(()=>{"use strict";Sv=1e3});function ym(t){Se()&&process.stderr.write(`[debug] ${t}
967
- `)}function qr(t,e){let r=vv[t];if(r)return r[e]??r.yolo}function Nv(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Vt(t,e,r="yolo"){if(Iv.has(t)){ym(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?qr(t,"plan"):kv[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw Z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new ye(s)}if(!Nv(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw Z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new ye(o)}ym(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var kv,vv,Iv,Un=b(()=>{"use strict";Br();je();kv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},vv={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"]}};Iv=new Set(["codex","opencode"])});import{spawn as xv}from"node:child_process";import{existsSync as $v}from"node:fs";function Av(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
952
+ `),clearAgentInflightOlderThan:t.prepare("DELETE FROM agent_inflight WHERE started_at < ?")}}function uv(t,e){return e===void 0?{resumed:!1,reason:t}:{resumed:!1,reason:t,valid:e}}var dl,Pe=b(()=>{"use strict";cl();Pn();dl=class{db;stmts;claimTxn;claimWithConcurrencyTxn;claimByIdWithConcurrencyTxn;resumeRunTxn;resumeInteractiveTxn;resumeEscalationTxn;tryAcquireAgentInflightTxn;constructor(e){e.pragma("foreign_keys = ON"),this.db=e,this.stmts=cv(e),this.claimTxn=e.transaction((r,n,s)=>{let o=this.stmts.selectClaimableJob.get(s,s,s);return o===void 0||this.stmts.claimJob.run(r,n,s,o.id,s,s,s).changes!==1?null:this.getJob(o.id)}),this.claimWithConcurrencyTxn=e.transaction((r,n,s,o)=>{let i=this.stmts.selectClaimableJobs.all(s,s,s);for(let a of i){let l=this.getJob(a.id);if(l===null)continue;let c=o(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=e.transaction((r,n,s,o,i)=>{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>=o)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<=o,u=a.status==="running"&&a.locked_until!==null&&a.locked_until<o;if(!c&&!u)return{claimed:!1,reason:"not_claimable",job_id:r,status:a.status,locked_by:a.locked_by,locked_until:a.locked_until};let d=i(a);if(d.concurrency_key!==null&&(a.concurrency_key_resolved!==d.concurrency_key&&this.stmts.setJobConcurrencyKey.run(d.concurrency_key,a.id),(this.stmts.countRunningByConcurrencyKey.get(d.concurrency_key,o,a.id)?.count??0)>=Math.max(1,d.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,o,a.id,o,o,o).changes!==1){let p=this.getJob(a.id);return{claimed:!1,reason:p?.locked_until!==null&&p?.locked_until!==void 0&&p.locked_until>=o?"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=e.transaction((r,n,s)=>uv("state_not_found")),this.resumeInteractiveTxn=e.transaction((r,n,s,o)=>{let i=this.getInteractiveSessionByStepId(r);if(i===null)return{resumed:!1,reason:"not_found"};if(i.status!=="waiting_operator")return{resumed:!1,reason:"not_waiting_operator"};let a=this.getRun(i.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(),i.id),this.stmts.resumeRunState.run(i.state_name,a.id),this.stmts.requeuePausedJob.run(o,a.job_id),{resumed:!0,session:this.getInteractiveSessionByStepId(r),run:this.getRun(a.id),job:this.getJob(a.job_id)}}),this.resumeEscalationTxn=e.transaction((r,n,s)=>{let o=this.stmts.getAttention.get(r);if(o===void 0)return{resumed:!1,reason:"not_found"};if(o.kind!==Qs)return{resumed:!1,reason:"wrong_kind"};if(o.acknowledged_at!==null)return{resumed:!1,reason:"already_acked"};if(o.run_id===null)return{resumed:!1,reason:"run_not_found"};let i=null,a=[];if(o.payload!==null)try{let u=JSON.parse(o.payload);u.step!==void 0&&typeof u.step.id=="string"&&u.step.id.length>0&&(i=u.step.id),Array.isArray(u.declared_outcomes)&&(a=u.declared_outcomes.filter(d=>typeof d=="string"))}catch{}if(i===null)return{resumed:!1,reason:"no_step"};let l=this.getRun(o.run_id);if(l===null)return{resumed:!1,reason:"run_not_found"};if(n!==Dn&&!a.includes(n))return{resumed:!1,reason:em};let c={};if(l.pending_escalation_decision!==null)try{let u=JSON.parse(l.pending_escalation_decision);u!==null&&typeof u=="object"&&!Array.isArray(u)&&(c=u)}catch{c={}}return c[i]=n,this.stmts.setRunPendingEscalationDecision.run(JSON.stringify(c),l.id),this.stmts.resumeRunState.run(i,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,o=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}),i=o!==void 0?{acquired:!0,current:o}:{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"),i}catch(s){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),s}}}close(){this.db.close()}query(e,...r){let n=e.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(e).all(...r)}insertWorkflow(e){rm(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.stmts.insertWorkflow.run(e.name,e.version??1,e.definition_schema_version??1,e.definition,P()),n=this.getWorkflow(Number(r.lastInsertRowid)),s=this.stmts.insertWorkflowVersion.run(n.id,n.version,e.definition,e.author??null,P());this.stmts.updateWorkflowActiveVersion.run(s.lastInsertRowid,n.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,n.id);let o=this.getWorkflow(n.id);return this.syncWorkflowTriggers(n.id,e.definition),o}upsertWorkflow(e){rm(e.name,e.definition,i=>this.getWorkflowByName(i));let r=this.getWorkflowByName(e.name);if(r===null)return this.insertWorkflow({name:e.name,definition_schema_version:e.definition_schema_version,definition:e.definition,author:e.author,source_uri:e.source_uri,source_sha256:e.source_sha256});let s=(this.stmts.getLatestWorkflowVersion.get(r.id)?.version??r.version)+1,o=this.stmts.insertWorkflowVersion.run(r.id,s,e.definition,e.author??null,P());return this.stmts.updateWorkflowActiveVersionDefinitionAndVersion.run(Number(o.lastInsertRowid),e.definition,e.definition_schema_version??r.definition_schema_version,s,r.id),(e.source_uri!=null||e.source_sha256!=null)&&this.stmts.setWorkflowSource.run(e.source_uri??null,e.source_sha256??null,r.id),this.syncWorkflowTriggers(r.id,e.definition),this.getWorkflow(r.id)}insertCompositionUnit(e){this.stmts.insertCompositionUnit.run(e.name,e.version,e.lang,e.source,e.source_sha,e.compiled_workflow_version_id,P())}getWorkflow(e){return this.stmts.getWorkflow.get(e)??null}getWorkflowByName(e,r){return(r===void 0?this.stmts.findWorkflowLatest.get(e):this.stmts.findWorkflowVersion.get(e,r))??null}findWorkflowByName(e,r){return this.getWorkflowByName(e,r)}insertWorkflowVersion(e,r,n){let o=(this.stmts.getLatestWorkflowVersion.get(e)?.version??0)+1,i=this.stmts.insertWorkflowVersion.run(e,o,r,n??null,P());return this.stmts.getWorkflowVersion.get(i.lastInsertRowid)}activateWorkflowVersion(e,r){let n=this.getWorkflowVersionById(r);if(n===null||n.workflow_id!==e)return null;let s=1;try{let o=JSON.parse(n.definition);typeof o.definition_schema_version=="number"&&(s=o.definition_schema_version)}catch{}return this.stmts.updateWorkflowActiveVersionAndDefinition.run(r,n.definition,s,e),this.syncWorkflowTriggers(e,n.definition),this.getWorkflow(e)}getWorkflowVersionById(e){return this.stmts.getWorkflowVersion.get(e)??null}listWorkflowVersions(e){return this.stmts.listWorkflowVersions.all(e)}upsertTriggerInstance(e){return this.stmts.upsertTriggerInstance.run(e.workflow_id,e.trigger_id,e.trigger_type,e.parameters,e.enabled===!1?0:1,P()),this.stmts.getTriggerInstanceByWorkflowAndId.get(e.workflow_id,e.trigger_id)}listTriggerInstancesForWorkflow(e){return this.stmts.listTriggerInstancesForWorkflow.all(e)}listEnabledTriggerInstances(){return this.stmts.listEnabledTriggerInstances.all()}setTriggerCursor(e,r){return this.stmts.setTriggerCursor.run(r,P(),e),this.stmts.getTriggerInstance.get(e)??null}setTriggerFailure(e,r){return this.stmts.setTriggerFailure.run(P(),r,e),this.stmts.getTriggerInstance.get(e)??null}syncWorkflowTriggers(e,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 o of s){if(o===null||typeof o!="object"||Array.isArray(o))continue;let i=o;typeof i.id!="string"||i.id.length===0||typeof i.type!="string"||i.type.length===0||this.upsertTriggerInstance({workflow_id:e,trigger_id:i.id,trigger_type:i.type,parameters:JSON.stringify(i.parameters??{})})}}insertTeam(e){let r=this.stmts.insertTeam.run(e.name,P());return this.stmts.getTeam.get(r.lastInsertRowid)}getTeam(e){return this.stmts.getTeam.get(e)??null}findTeamByName(e){return this.stmts.findTeamByName.get(e)??null}listTeams(){return this.stmts.listTeams.all()}insertTeamMember(e){let r=this.stmts.insertTeamMember.run(e.team_id,e.alias,e.role??"agent",e.provider,e.model??null,e.sessionid??null,e.sessiondir,P());return this.stmts.getTeamMember.get(r.lastInsertRowid)}listTeamMembers(e){return this.stmts.listTeamMembers.all(e)}findTeamMemberByAlias(e,r){return this.stmts.findTeamMemberByAlias.get(e,r)??null}updateTeamMemberSession(e,r){return this.stmts.updateTeamMemberSession.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberState(e,r,n){return this.stmts.setMemberState.run(r,n??null,P(),e),this.stmts.getTeamMember.get(e)??null}listMembersInState(e){return this.stmts.listMembersInState.all(e)}setMemberPromptSnapshot(e,r){return this.stmts.setMemberPromptSnapshot.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberProviderResolved(e,r){return this.stmts.setMemberProviderResolved.run(r,e),this.stmts.getTeamMember.get(e)??null}setMemberRolePrompt(e,r){return this.stmts.setMemberRolePrompt.run(r,e),this.stmts.getTeamMember.get(e)??null}updateTeamMemberMeta(e,r){let n=this.stmts.getTeamMember.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"role_prompt"),o=Object.prototype.hasOwnProperty.call(r,"model"),i=Object.prototype.hasOwnProperty.call(r,"provider");return this.stmts.updateTeamMemberMeta.run(s?r.role_prompt??null:n.role_prompt,o?r.model??null:n.model,i?r.provider??n.provider:n.provider,e),this.stmts.getTeamMember.get(e)??null}insertTeamMemberCompanion(e){let r=this.stmts.insertTeamMemberCompanion.run(e.interpreter_id,e.companion_id,P());return this.stmts.getTeamMemberCompanion.get(r.lastInsertRowid)}insertProject(e){let r=this.stmts.insertProject.run(e.name,e.description??null,e.local_path,e.workflow_name,e.team_id,e.default_branch??null,e.intake_config??null,e.test_argv??null,e.test_command??null,e.durable_memory_mode??"folder",P());return this.stmts.getProject.get(r.lastInsertRowid)}listProjects(){return this.stmts.listProjects.all()}getProject(e){return this.stmts.getProject.get(e)??null}findProjectByName(e){return this.stmts.findProjectByName.get(e)??null}setProjectIntakeConfig(e,r){return this.stmts.setProjectIntakeConfig.run(r,e),this.stmts.getProject.get(e)??null}updateProjectSettings(e,r){let n=this.stmts.getProject.get(e);if(n===void 0)return null;let s=Object.prototype.hasOwnProperty.call(r,"local_path"),o=Object.prototype.hasOwnProperty.call(r,"durable_memory_mode"),i=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,o?r.durable_memory_mode:n.durable_memory_mode,i?r.default_branch??null:n.default_branch,a?r.intake_config??null:n.intake_config,e),this.stmts.getProject.get(e)??null}listProjectsWithIntakeEnabled(){return this.stmts.listProjectsWithIntakeConfig.all().filter(e=>{if(e.intake_config===null)return!1;try{let r=JSON.parse(e.intake_config);return typeof r=="object"&&r!==null&&!Array.isArray(r)&&r.scan_github_issues===!0}catch{return!1}})}getProjectByJob(e){return this.stmts.getProjectByJob.get(e)??null}insertProjectWorkflow(e){let r=e.condition??null,n=this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r);if(n!==void 0)return n;let s=this.stmts.insertProjectWorkflow.run(e.project_id,e.workflow_id,r,e.parameters_override??null,e.enabled===!1?0:1,e.priority??100,P());return s.changes===1?this.stmts.getProjectWorkflow.get(s.lastInsertRowid):this.stmts.findProjectWorkflowUnique.get(e.project_id,e.workflow_id,r)}getProjectWorkflow(e){return this.stmts.getProjectWorkflow.get(e)??null}listProjectWorkflows(e,r={}){return r.enabled_only===!0?this.stmts.listEnabledProjectWorkflows.all(e):this.stmts.listProjectWorkflows.all(e)}removeProjectWorkflow(e){return this.stmts.removeProjectWorkflow.run(e).changes>0}setProjectWorkflowEnabled(e,r){return this.stmts.setProjectWorkflowEnabled.run(r?1:0,e),this.getProjectWorkflow(e)}createIssue(e){let r=P(),n=this.stmts.createIssue.run(e.project_id,e.title,e.body,e.severity??"medium",e.labels??null,e.ai_test_path??null,e.source_run_id??null,r,r);return this.stmts.getIssue.get(n.lastInsertRowid)}getIssue(e){return this.stmts.getIssue.get(e)??null}listIssues(e,r={}){return this.stmts.listIssuesForProject.all(e).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(e,r){return this.stmts.claimNextIssue.get(r,P(),e)??null}claimIssue(e,r){return this.stmts.claimIssue.get(r,P(),e)??null}closeIssue(e,r,n){let s=P(),o=this.stmts.closeIssue.get(r,n??null,s,s,e);if(o===void 0)throw new Error(`issue not found: ${e}`);return o}reopenIssue(e,r){let n=this.stmts.reopenIssue.get(r,P(),e);if(n===void 0)throw this.getIssue(e)===null?new Error(`issue not found: ${e}`):new Error(`issue ${e} is not closed`);return n}updateIssue(e,r){let n=this.getIssue(e);if(n===null)throw new Error(`issue not found: ${e}`);let s=Object.prototype.hasOwnProperty.call(r,"labels"),o=Object.prototype.hasOwnProperty.call(r,"ai_test_path"),i=this.stmts.updateIssue.get(r.title??n.title,r.body??n.body,r.severity??n.severity,s?r.labels??null:n.labels,o?r.ai_test_path??null:n.ai_test_path,P(),e);if(i===void 0)throw new Error(`issue not found: ${e}`);return i}listWorkflows(){return this.stmts.listWorkflows.all()}getOrCreateWebuiSession(e,r){let n=this.stmts.getWebuiSession.get(e);if(n!==void 0)return n;let s=P();return this.stmts.insertWebuiSession.run(e,r,"N1",null,null,null,null,"authenticated",s,s),this.stmts.getWebuiSession.get(e)}getWebuiSession(e){return this.stmts.getWebuiSession.get(e)??null}updateWebuiSessionTransition(e,r,n,s,o){if(this.stmts.updateWebuiSessionTransition.run(r,n,s,o,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}setWebuiSessionChatbot(e,r){if(this.stmts.setWebuiSessionChatbot.run(r,P(),e).changes===0)throw new Error(`webui_session not found: ${e}`);return this.stmts.getWebuiSession.get(e)}createChatbotSession(e,r){let n=iv(),s=P();return this.stmts.insertChatbotSession.run(n,e,r??null,s,s,"active"),this.stmts.getChatbotSession.get(n)}getChatbotSession(e){return this.stmts.getChatbotSession.get(e)??null}listChatbotSessions(e){return this.stmts.listChatbotSessionsForUser.all(e)}appendChatbotMessage(e,r,n,s){let o=P(),i=this.stmts.insertChatbotMessage.run(e,r,n,s??null,o);return this.stmts.touchChatbotSession.run(o,e),this.stmts.getChatbotMessage.get(i.lastInsertRowid)}listChatbotMessages(e){return this.stmts.listChatbotMessages.all(e)}getConfig(e){return this.stmts.getConfig.get(e)?.value??null}setConfig(e,r){this.stmts.upsertConfig.run(e,r,P())}getConfigAll(){let e=this.stmts.listConfig.all(),r={};for(let n of e)r[n.key]=n.value;return r}enqueueJob(e){let r=this.stmts.insertJob.run(e.project_id,e.workflow_id_override??null,e.source,e.source_ref??null,e.payload??null,e.priority??0,e.available_at??P(),e.dedupe_key??null,e.concurrency_key??null,P());if(r.changes===1)return this.stmts.getJob.get(r.lastInsertRowid);if(e.dedupe_key===void 0||e.dedupe_key===null)throw new Error("job insert ignored without dedupe key");return this.stmts.findJobByDedupe.get(e.source,e.dedupe_key)}claimNextJob(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimTxn(e.worker_id,n,r)}claimNextJobWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimWithConcurrencyTxn(e.worker_id,n,r,e.evaluator)}claimJobByIdWithConcurrency(e){let r=P(),n=new Date(Date.now()+e.lease_ms).toISOString();return this.claimByIdWithConcurrencyTxn(e.job_id,e.worker_id,n,r,e.evaluator)}releaseJob(e,r,n){let s=r==="queued"||r==="running"?null:P();return this.stmts.releaseJob.run(r,n??null,s,e),this.getJob(e)}getJob(e){return this.stmts.getJob.get(e)??null}findJobBySourceAndDedupe(e,r){return this.stmts.findJobByDedupe.get(e,r)??null}insertRun(e){let r=this.getWorkflow(e.workflow_id);if(r===null)throw new Error(`workflow not found: ${e.workflow_id}`);let n=this.stmts.insertRun.run(e.job_id,e.workflow_id,e.team_id,e.current_state??null,r.active_version_id,e.parent_run_id??null,P()),s=this.stmts.getRun.get(n.lastInsertRowid);return(e.parent_run_id===void 0||e.parent_run_id===null)&&this.stmts.setJobRun.run(s.id,e.job_id),s}setJobRun(e,r){return this.stmts.setJobRun.run(r,e),this.getJob(e)}insertPromptDispatch(e){return this.stmts.insertPromptDispatch.run(e.prompt_id,e.project_id,e.job_id,e.text,e.context_json??null,P()),this.stmts.getPromptDispatch.get(e.prompt_id)}getPromptDispatch(e){return this.stmts.getPromptDispatch.get(e)??null}setPromptDispatchCompleted(e,r){return this.stmts.setPromptDispatchCompleted.run(r??P(),e),this.getPromptDispatch(e)}getWorkspace(e){return this.stmts.getWorkspace.get(e)??null}ensureWorkspace(e={}){let r=e.id??"default";this.stmts.ensureWorkspace.run(r,e.name??"Default workspace",e.idleThresholdMs??6e5,P());let n=this.getWorkspace(r);if(n===null)throw new Error(`workspace ${r} missing after upsert`);return n}listWebProjectsActive(e){return this.stmts.listWebProjectsActive.all(e)}getWebProject(e){return this.stmts.getWebProject.get(e)??null}insertWebProject(e){let r=P(),n=this.stmts.insertWebProject.run(e.workspace_id,e.name,e.repo_path,e.config_json??null,e.linked_v4_project_id??null,r,r),s=Number(n.lastInsertRowid),o=this.getWebProject(s);if(o===null)throw new Error(`web_project ${s} missing after insert`);return o}updateWebProject(e){let r=this.getWebProject(e.id);return r===null||r.deleted_at!==null?null:(this.stmts.updateWebProject.run(e.name??r.name,e.config_json===void 0?r.config_json:e.config_json,P(),e.id),this.getWebProject(e.id))}softDeleteWebProject(e){return this.stmts.softDeleteWebProject.run(P(),e).changes===1}loadMailboxCursor(e,r){return this.stmts.loadMailboxCursor.get(e,r)??null}saveMailboxCursor(e){this.stmts.saveMailboxCursor.run(e.user_id,e.mailbox_key,e.last_processed_version_id,e.last_processed_seq??null,e.last_processed_at)}addUsage(e){this.stmts.addUsage.run(e.user_id,e.device_id,e.period,e.put,e.get,e.list,e.updated_at)}loadUsage(e,r,n){return this.stmts.loadUsage.get(e,r,n)??null}sumUsageForPeriod(e,r){let n=this.stmts.sumUsageForPeriod.get(e,r);return{put:n?.put??0,get:n?.get??0,list:n?.list??0}}upsertRootTeam(e){this.stmts.upsertRootTeam.run(e.teamfile_path,e.name,e.raw_text,e.raw_sha256,e.registered_at,e.last_seeded_at)}getRootTeam(e){return this.stmts.getRootTeam.get(e)??null}listRootTeams(){return this.stmts.listRootTeams.all()}insertTeamChatLog(e){let r=this.stmts.insertTeamChatLog.run(e.root_teamfile,e.sender_teamfile,e.sender_alias,e.receiver_teamfile,e.receiver_alias,e.message,e.response,e.status,e.error_detail,e.truncated,e.created_at);return Number(r.lastInsertRowid)}listTeamChatLog(e){return this.stmts.listTeamChatLog.all(e)}listTeamChatLogSinceId(e,r=500){return this.stmts.listTeamChatLogSinceId.all(e,Math.max(1,Math.trunc(r)))}getMaxTeamChatLogId(){return this.stmts.getMaxTeamChatLogId.get()?.max_id??0}loadTeamChatLogCursor(e){return this.stmts.loadTeamChatLogCursor.get(e)??null}saveTeamChatLogCursor(e){this.stmts.saveTeamChatLogCursor.run(e.cursor_key,e.last_pushed_id,e.updated_at)}updateTeamChatLogResponse(e,r){this.stmts.updateTeamChatLogResponse.run(r.response,r.status,r.error_detail,r.truncated,e)}getAgentInflight(e,r){return this.stmts.getAgentInflight.get(e,r)??null}listAgentInflight(){return this.stmts.listAgentInflight.all()}tryAcquireAgentInflight(e,r){return this.tryAcquireAgentInflightTxn(e,r)}clearAgentInflight(e,r){this.stmts.clearAgentInflight.run(e,r)}releaseAgentInflight(e){this.db.exec("BEGIN IMMEDIATE");try{let r=this.getAgentInflight(e.receiver_teamfile,e.receiver_alias);if(r===null||r.sender_teamfile!==e.sender_teamfile||r.sender_alias!==e.sender_alias)return this.db.exec("COMMIT"),!1;if(r.active_count<=1)return this.stmts.clearAgentInflightIfSender.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias),this.db.exec("COMMIT"),!0;let n=this.stmts.decrementAgentInflight.run(e.receiver_teamfile,e.receiver_alias,e.sender_teamfile,e.sender_alias);return this.db.exec("COMMIT"),n.changes===1}catch(r){throw this.db.inTransaction&&this.db.exec("ROLLBACK"),r}}clearAgentInflightOlderThan(e){return this.stmts.clearAgentInflightOlderThan.run(e).changes}getRun(e){return this.stmts.getRun.get(e)??null}setRunCurrentState(e,r){return this.stmts.setRunCurrentState.run(r,e),this.stmts.getRun.get(e)??null}setRunPausedState(e,r,n){return this.stmts.setRunPausedState.run(r,n,e),this.stmts.getRun.get(e)??null}setRunPendingEscalationDecision(e,r){return this.stmts.setRunPendingEscalationDecision.run(r,e),this.stmts.getRun.get(e)??null}setRunTerminalState(e,r){return this.stmts.setRunTerminalState.run(r,P(),e),this.stmts.getRun.get(e)??null}pauseJob(e){return this.stmts.pauseJob.run(e),this.getJob(e)}resumeRun(e,r){return this.resumeRunTxn(e,r,P())}insertStep(e){let r=this.stmts.insertStep.run(e.run_id,e.parent_step_id??null,e.state_name,e.outcome??null,e.status_detail??null,P());return this.stmts.getStep.get(r.lastInsertRowid)}finishStep(e,r,n){return this.stmts.finishStep.run(r??null,n??null,P(),e),this.stmts.getStep.get(e)??null}listStepsForRun(e){return this.stmts.listStepsForRun.all(e)}listLatestStepOutcomesByState(e){let r=this.stmts.listLatestStepOutcomesByState.all(e),n={};for(let s of r)n[s.state_name]=s.outcome;return n}insertSubmittedPr(e){let r=this.stmts.insertSubmittedPr.run(e.repo,e.pr_url,e.issue_url??null,e.local_path??null,e.branch??null,e.head_sha??null,e.status??"watching",e.submitted_at??P(),e.last_known_state??null,e.created_by_run_id??null);return this.stmts.getSubmittedPr.get(r.lastInsertRowid)}listSubmittedPrs(e){return e?.status!==void 0?this.stmts.listSubmittedPrsByStatus.all(e.status):this.stmts.listSubmittedPrs.all()}getSubmittedPr(e){return this.stmts.getSubmittedPr.get(e)??null}findSubmittedPrByUrl(e){return this.stmts.findSubmittedPrByUrl.get(e)??null}insertStepArtifact(e){let r=this.stmts.insertStepArtifact.run(e.step_id,e.kind,e.path??null,e.content??null,e.sha??null,e.provider_call_mode??null,P());return this.stmts.getStepArtifact.get(r.lastInsertRowid)}insertExternalObject(e){let n=this.stmts.insertExternalObject.run(e.type,e.provider,e.project_id,e.run_id??null,e.external_id,e.url??null,e.status??null,e.metadata??null,e.last_seen_at??null,P()).changes===1;return{row:this.stmts.findExternalObjectByUnique.get(e.provider,e.type,e.external_id),inserted:n}}insertExternalSignal(e){let r=this.stmts.insertExternalSignal.run(e.object_id,e.kind,e.source??null,e.occurred_at??null,e.payload??null,e.signal_hash??null,null,P()),n=r.changes===1;return{row:e.signal_hash===void 0||e.signal_hash===null?this.stmts.getExternalSignal.get(r.lastInsertRowid):this.stmts.findExternalSignalByUnique.get(e.object_id,e.kind,e.signal_hash),inserted:n}}raiseAttention(e){let r=this.stmts.insertAttention.run(e.kind,e.severity??"warn",e.project_id??null,e.run_id??null,e.external_object_id??null,e.requires_user===!0?1:0,e.payload??null,P());return this.stmts.getAttention.get(r.lastInsertRowid)}acknowledgeAttention(e){return this.stmts.ackAttention.run(P(),e),this.stmts.getAttention.get(e)??null}upsertDurableMemory(e){let r=P();return this.stmts.upsertDurableMemory.run(e.project_id,e.type,e.name,e.description??null,e.body,r,r),this.stmts.getDurableMemoryByName.get(e.project_id,e.name)}getDurableMemoryByName(e,r){return this.stmts.getDurableMemoryByName.get(e,r)??null}deleteDurableMemory(e,r){return this.stmts.deleteDurableMemory.run(e,r).changes>0}listDurableMemory(e,r){return r!==void 0?this.stmts.listDurableMemoryByType.all(e,r):this.stmts.listDurableMemory.all(e)}indexDurableMemory(e,r){return r!==void 0&&r.length>0?this.stmts.listDurableMemory.all(e).filter(s=>r.includes(s.type)).map(({name:s,description:o,type:i,updated_at:a})=>({name:s,description:o,type:i,updated_at:a})):this.stmts.listDurableMemory.all(e).map(({name:n,description:s,type:o,updated_at:i})=>({name:n,description:s,type:o,updated_at:i}))}recordSessionSize(e){let r=this.stmts.insertSessionSize.run(e.team_name,e.alias,e.sessionid,e.input_tokens??null,e.cache_tokens??null,e.output_tokens??null,e.total_tokens??null,e.observed_at??P());return this.stmts.getSessionSize.get(r.lastInsertRowid)}latestSessionSizes(){return this.stmts.latestSessionSizes.all()}sessionSizeHistory(e,r,n=20){return this.stmts.sessionSizeHistory.all(e,r,n)}insertSessionEvent(e){let r=this.stmts.insertSessionEvent.run(e.run_id,e.step_id??null,e.kind,e.timestamp_ms,e.payload,e.payload_truncated??0,e.overflow_artifact_id??null);return this.stmts.getSessionEvent.get(r.lastInsertRowid)}listSessionEvents(e,r){return r!==void 0?this.stmts.listSessionEventsSince.all(e,r):this.stmts.listSessionEvents.all(e)}listSessionEventsSince(e,r=1e3){return this.stmts.listAllEventsSince.all(e,r)}latestAgentCall(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call' ORDER BY id DESC LIMIT 1").get(e);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(e){let r=this.db.prepare("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'agent_call'").all(e),n=0,s=0,o=0;for(let i of r)try{let a=JSON.parse(i.payload);typeof a.tokens_in=="number"&&(n+=a.tokens_in),typeof a.tokens_out=="number"&&(s+=a.tokens_out),o+=1}catch{}return{totalInputTokens:n,totalOutputTokens:s,agentCallCount:o}}addRollupValue(e){this.stmts.upsertRollupStat.run(e.run_id,e.step_id??null,e.metric_kind,e.value,e.bucket_start_ms,e.bucket_end_ms,e.updated_at)}listRollupStats(e){return this.stmts.listRollupStats.all(e)}getRollupCursor(){return this.stmts.getRollupCursor.get("last_event_id")?.value??0}setRollupCursor(e){this.stmts.setRollupCursor.run("last_event_id",e)}insertDriftSignal(e){let r=this.stmts.insertDriftSignal.run(e.team_member_id,e.project_id??null,e.signal_kind,e.severity,e.description,e.detected_at,e.expires_at??null,e.payload??null);return this.stmts.getDriftSignal.get(r.lastInsertRowid)}listDriftSignals(e={}){return e.team_member_id!==void 0&&e.unacked?this.stmts.listUnackedDriftByMember.all(e.team_member_id):e.team_member_id!==void 0?this.stmts.listDriftByMember.all(e.team_member_id):e.project_id!==void 0?this.stmts.listDriftByProject.all(e.project_id):this.stmts.listAllDrift.all()}hasUnackedDriftSignal(e,r,n){return this.stmts.findUnackedDrift.get(e,r??null,n)!==void 0}acknowledgeDriftSignal(e){return this.stmts.ackDriftSignal.run(Date.now(),e),this.stmts.getDriftSignal.get(e)??null}insertInteractiveSession(e){let r=Date.now();return this.stmts.insertInteractiveSession.run(e.run_id,e.step_id,e.state_name,e.status,r,r),this.stmts.getInteractiveSessionByStepId.get(e.step_id)}getInteractiveSessionByStepId(e){return this.stmts.getInteractiveSessionByStepId.get(e)??null}getInteractiveSessionByRunAndState(e,r){return this.stmts.getInteractiveSessionByRunAndState.get(e,r)??null}setInteractiveAgentOutput(e,r,n){this.stmts.setInteractiveAgentOutput.run(r,n,Date.now(),e)}resumeInteractive(e,r,n){return this.resumeInteractiveTxn(e,r,n,P())}resumeEscalation(e,r){return this.resumeEscalationTxn(e,r,P())}}});import{realpathSync as dv}from"node:fs";import{resolve as fv}from"node:path";function ml(t){let e=fv(t);try{return dv(e)}catch{return e}}var sm=b(()=>{"use strict"});import{platform as om}from"node:os";function _t(t){let e=new Fn;for(let r of t)e.registerAdapter(r);return e}var Fn,pl=b(()=>{"use strict";sm();Fn=class{providers=[];adapters=new Map;register(e){this.providers.push(e)}async listAll(e){let r=[],n=e?.provider?this.providers.filter(i=>i.name===e.provider):this.providers,s=await Promise.all(n.map(i=>i.discoverSessions()));for(let i of s)r.push(...i);let o=r;if(e?.workspace){let i=ml(e.workspace);o=o.filter(a=>ml(a.cwd)===i)}if(e?.from){let i=e.from.getTime();o=o.filter(a=>a.modifiedAt.getTime()>=i)}if(e?.to){let i=e.to.getTime();o=o.filter(a=>a.modifiedAt.getTime()<=i)}return o.sort((i,a)=>a.modifiedAt.getTime()-i.modifiedAt.getTime()),e?.limit&&(o=o.slice(0,e.limit)),o}async getSession(e,r){let n=r?this.providers.filter(s=>s.name===r):this.providers;for(let s of n){let o=await s.loadSession(e);if(o)return o}return null}async resolveSession(e,r){let n=await this.resolveSessions(e,r);return n.length===1?n[0]:null}async resolveSessions(e,r){let n=r?this.providers.filter(o=>o.name===r):this.providers,s=[];for(let o of n){let i=await o.resolveSessionPath(e);i&&s.push({provider:o,filePath:i})}return s}getWatchTargets(){let e=om()==="darwin"||om()==="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:e,filePattern:s.filePattern});return r}async deleteSession(e,r){let n=await this.resolveSession(e,r);return n?n.provider.deleteSession(e):!1}registerAdapter(e){this.adapters.set(e.name,e),this.providers.push({name:e.name,discoverSessions:()=>e.discover(),loadSession:r=>e.load(r),resolveSessionPath:r=>e.resolvePath(r),deleteSession:r=>e.delete(r),getWatchPaths:()=>e.getWatchPaths?.()??[]})}getAdapter(e){return this.adapters.get(e)}getAllAdapters(){return[...this.adapters.values()]}}});import{createReadStream as im}from"node:fs";import{createInterface as am}from"node:readline";import{stat as mv}from"node:fs/promises";import{homedir as pv}from"node:os";async function*Fe(t){let e=im(t,{encoding:"utf-8"}),r=am({input:e,crlfDelay:1/0});try{for await(let n of r){let s=n.trim();if(s)try{yield JSON.parse(s)}catch{}}}finally{e.destroy()}}async function Le(t,e){let r=[],n=im(t,{encoding:"utf-8"}),s=am({input:n,crlfDelay:1/0});try{for await(let o of s){let i=o.trim();if(i){try{r.push(JSON.parse(i))}catch{}if(r.length>=e)break}}}finally{s.close(),n.destroy()}return r}async function xe(t){let e=await mv(t);return{createdAt:e.birthtime,modifiedAt:e.mtime}}function de(t){return t.replace(/\\n/g,`
953
+ `).replace(/\\t/g," ").replace(/\\r/g,"\r")}function V(t,e){return t.length<=e?t:t.slice(0,e-3)+"..."}var Te,Jt=b(()=>{"use strict";Te=pv()});import{readdir as eo,stat as lm,unlink as hv}from"node:fs/promises";import{join as Wr,basename as cm}from"node:path";function _v(t){return t==="file-history-snapshot"||t==="progress"||t==="system"||t==="queue-operation"}function gv(t){if(t.type==="system"){let e=t.message?.content;if(typeof e=="string"&&e.trim())return de(e.trim());if(e!==void 0)return JSON.stringify(e,null,2)}return t.type==="progress"&&t.data!==void 0?JSON.stringify(t.data,null,2):JSON.stringify(t,null,2)}async function um(t){let e=0,r=0,n=0,s=0,o=0,i=0,a;for await(let l of Fe(t))if(!l.isSidechain){if(l.type==="user"&&!l.isMeta&&l.message){let c=l.message.content;if(typeof c=="string"){if(c.includes("<command-name>")||c.includes("<local-command-"))continue;e++}}else if(l.type==="assistant"&&l.message){let c=l.message.content;if(Array.isArray(c))for(let d of c)d.type==="text"&&e++;let u=l.message.usage;if(u){let d=u.input_tokens||0,f=u.cache_creation_input_tokens||0,m=u.cache_read_input_tokens||0,p=u.output_tokens||0;r+=d+f+m,n+=m,s+=f,o+=p;let h=d+f+m;h&&(i=h),a={inputTokens:d,cacheWriteInputTokens:f,cachedInputTokens:m,outputTokens:p}}}}return{messageCount:e,totalInputTokens:r,totalCacheReadInputTokens:n,totalCacheWriteInputTokens:s,totalOutputTokens:o,lastInputTokens:i,lastTokenUsage:a}}var to,dm=b(()=>{"use strict";Jt();to=class{name="claude";claudeDir;projectsDir;constructor(e={}){this.claudeDir=e.claudeDir||Wr(Te,".claude"),this.projectsDir=Wr(this.claudeDir,"projects")}getWatchPaths(){return[{directory:this.projectsDir,filePattern:/\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await eo(this.projectsDir)}catch{return e}for(let n of r){let s=Wr(this.projectsDir,n);if(!(await lm(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await eo(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=cm(a,".jsonl");if(!/^[0-9a-f]{8}-/.test(l))continue;let c=Wr(s,a);try{let u=await this.extractSummary(c,l);u&&e.push(u)}catch{}}}return e}async extractSummary(e,r){let n=await Le(e,50),s=await xe(e),o="",i,a,l,c,u,d;for(let m of n)if(!_v(m.type)&&(!o&&m.cwd&&(o=m.cwd),!i&&m.slug&&(i=m.slug),!a&&m.version&&(a=m.version),!d&&m.timestamp&&(d=new Date(m.timestamp)),m.type==="assistant"&&m.message?.model&&(l=m.message.model),m.type==="user"&&!m.isMeta&&m.message)){let p=m.message.content;if(typeof p=="string"){if(p.includes("<command-name>")||p.includes("<local-command-"))continue;c||(c=V(p.trim(),80)),u=V(p.trim(),80)}}if(!o)return null;let f=await um(e);return{provider:"claude",sessionId:r,slug:i,cwd:o,createdAt:d||s.createdAt,modifiedAt:s.modifiedAt,model:l,cliVersion:a,startCommand:"claude",firstUserMessage:c,lastUserMessage:u,messageCount:f.messageCount,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCacheReadInputTokens||void 0,totalCacheWriteInputTokens:f.totalCacheWriteInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await xe(r),s=[],o="",i,a,l,c,u,d,f,m=e;for await(let h of Fe(r))if(h.type!=="file-history-snapshot"&&!h.isSidechain){if(!o&&h.cwd&&(o=h.cwd),!i&&h.slug&&(i=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:gv(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;u||(u=V(_.trim(),80)),d=V(_.trim(),80),s.push({role:"user",timestamp:g,content:de(_.trim())})}else if(Array.isArray(_)){for(let T of _)if(T.type==="tool_result"){let E=typeof T.content=="string"?de(T.content):JSON.stringify(T.content);s.push({role:"tool_result",timestamp:g,content:E,toolCallId:T.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 T of _)T.type==="text"&&T.text?s.push({role:"assistant",timestamp:g,content:de(T.text),model:h.message.model}):T.type==="tool_use"?s.push({role:"tool_use",timestamp:g,content:T.name||"unknown tool",toolName:T.name,toolInput:JSON.stringify(T.input,null,2),toolCallId:T.id,model:h.message.model}):T.type==="thinking"&&T.thinking&&s.push({role:"thinking",timestamp:g,content:T.thinking})}}if(!o)return null;let p=await um(r);return{provider:"claude",sessionId:m,slug:i,cwd:o,createdAt:f||n.createdAt,modifiedAt:n.modifiedAt,model:l,cliVersion:a,startCommand:"claude",gitBranch:c,firstUserMessage:u,lastUserMessage:d,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(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await hv(r),!0):!1}async resolveSessionFile(e){let r;try{r=await eo(this.projectsDir)}catch{return null}let n=[];for(let i of r){let a=Wr(this.projectsDir,i);if(!(await lm(a).catch(()=>null))?.isDirectory())continue;let c;try{c=await eo(a)}catch{continue}for(let u of c){if(!u.endsWith(".jsonl"))continue;let d=cm(u,".jsonl");/^[0-9a-f]{8}-/.test(d)&&n.push({filePath:Wr(a,u),fileSessionId:d})}}let s=n.find(i=>i.fileSessionId===e);if(s)return s.filePath;let o=n.filter(i=>i.fileSessionId.startsWith(e));if(o.length===1)return o[0].filePath;for(let i of n){let a=await Le(i.filePath,20);for(let l of a)if(l.slug&&l.slug===e)return i.filePath}return null}}});function ro(t){return"'"+t.replace(/'/g,"'\\''")+"'"}function wv(t,e,r){if(!r)return"";let n=t.tools[e]??hl[e],s=n?.profiles?.[r]?.flags??hl[e]?.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 "${e}"`)}function fm(t,e){return!!t.tools[e]}function mm(t,e,r,n,s){let o=t.tools[e]??hl[e],i;if(o?.agent){let l=ro(n);i=o.agent.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,l)}else{let l=yv[e];if(!l)throw new Error(`No agent command configured for tool "${e}"`);let c=l.argv.map(u=>u.replace(/\{\{session_id\}\}/g,r).replace(/\{\{prompt\}\}/g,n));if(l.mode==="stdin"){let u=c.map(ro).join(" ");i=`printf '%s\\n' ${ro(n)} | ${u}`}else i=c.map(ro).join(" ")}let a=wv(t,e,s);return a&&(i+=" "+a),i}var hl,yv,pm=b(()=>{"use strict";hl={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:""}}}},yv={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 hm(t=process.env){let e=t.LMCTL_ONE_SHOT_TIMEOUT_MS;if(!e)return 6e5;let r=Number(e);return!Number.isFinite(r)||r<=0?6e5:r}var _m=b(()=>{"use strict"});var Ev,Ne,no,xt=b(()=>{"use strict";Ev="ACK: waiting for explicit lmctl task.",Ne=`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: ${Ev}`,no=`send this exact lmctl seed instruction: "${Ne}"`});function Ke(t,e){return e===void 0||e.length===0?t:{...t??process.env,[_l]:e}}var _l,Xt=b(()=>{"use strict";_l="LMCTL_SELF_SESSIONID"});import{spawn as gm}from"node:child_process";import{mkdirSync as bv}from"node:fs";var gl,Oe,Gt=b(()=>{"use strict";pm();_m();xt();Xt();gl=class t extends Error{cancelReason;constructor(e,r){super(e),this.name="TurnAbortError",this.cancelReason=r,Object.setPrototypeOf(this,t.prototype)}},Oe=class t{name;capabilities;injection;provider;binary;seedArgs;seedStdin;resumeTemplate;startTemplate;transportFn;constructor(e){this.name=e.provider.name,this.provider=e.provider,this.capabilities=e.capabilities,this.injection=e.injection,this.binary=e.binary,this.seedArgs=e.seedArgs,this.seedStdin=e.seedStdin,this.resumeTemplate=e.resumeTemplate,this.startTemplate=e.startTemplate,this.transportFn=e.transport}discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return this.provider.getWatchPaths?.()??[]}seedArgsFor(e){let r=e?.prompt;return r===void 0?this.seedArgs:this.seedArgs.map(n=>n===Ne?r:n)}seed(e,r){return bv(e,{recursive:!0}),new Promise(n=>{let s;try{s=gm(this.binary,this.seedArgsFor(r),{cwd:e,stdio:["pipe","pipe","pipe"],timeout:6e4})}catch(a){return n({success:!1,error:a instanceof Error?a.message:String(a)})}let o="";s.stderr?.on("data",a=>{o+=a.toString()});let i=r?.prompt!==void 0&&this.seedStdin!==void 0?`${r.prompt}
954
+ `:this.seedStdin;i&&s.stdin?.write(i),s.stdin?.end(),s.on("exit",a=>{n(a===0||a===null?{success:!0}:{success:!1,error:o.trim().slice(0,200)||`exit code ${a}`})}),s.on("error",a=>{n({success:!1,error:a.message})})})}resumeCommand(e,r){return this.resumeTemplate.replace(/\{\{session_id\}\}/g,e)}startCommand(e){return this.startTemplate}manualSeedHint(e){return{launchCommand:`cd ${e} && ${this.binary}`,postLaunchNote:no,lsCommand:`lmctl ls --provider ${this.name} --sessiondir ${e}`}}static DEFAULT_IDLE_TIMEOUT_MS=8*60*60*1e3;sendTurn(e,r){if(r.userConfig&&fm(r.userConfig,this.name)){let s=r.userConfig.tools[this.name];if(s?.agent)return this.runOneShotAgent(e,r,s.agent)}let n=r.timeoutMs??t.DEFAULT_IDLE_TIMEOUT_MS;return n<=0&&!r.signal?this.transportFn(e,{...r,binary:this.binary}):this.withTimeouts(n,e,r)}withTimeouts(e,r,n){let s=new AbortController,o,i,a="",l,c=()=>{e<=0||(clearTimeout(o),o=setTimeout(()=>{n.onIdleWarning?.(e),u(),s.abort(),l&&l({text:a,sessionId:n.sessionId,durationMs:e,status:"stalled",stalledAfterMs:e})},e))},u=()=>{clearTimeout(o)};n.signal&&(n.signal.aborted?(i="external",s.abort()):n.signal.addEventListener("abort",()=>{i="external",s.abort()},{once:!0})),c();let d={...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,d).then(p=>(u(),{...p,status:"ok"})).catch(p=>{throw u(),i==="external"?new gl("Turn cancelled","external"):p}),m=new Promise(p=>{l=p});return Promise.race([f,m])}runOneShotAgent(e,r,n){let s=mm(r.userConfig,this.name,r.sessionId,e,r.profile),o=Date.now();return new Promise((i,a)=>{let l=hm(r.env),c=gm(s,{shell:!0,cwd:r.cwd,env:Ke(r.env,r.sessionId),stdio:["pipe","pipe","pipe"]}),u=!1,d=!1,f=setTimeout(()=>{d=!0,c.kill()},l),m="",p="";if(c.stdout?.on("data",h=>{let 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(u)return;u=!0,clearTimeout(f);let g=Date.now()-o;d?a(new Error(`Agent command timed out after ${l}ms`)):h===0||h===null?i({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=>{u||(u=!0,clearTimeout(f),a(h))})})}}});function oo(t,e){let r;if(e&&typeof e=="object"){let n=e.code;typeof n=="number"&&(r=n)}return new $t(t,r,e)}var Ye,we,Nt,so,$t,Br=b(()=>{"use strict";Ye=class extends Error{constructor(e,r){super(e,r),this.name=this.constructor.name}},we=class extends Ye{},Nt=class extends Ye{exitCode;signal;stderr;constructor(e,r,n=null,s){super(e),this.exitCode=r,this.signal=n,this.stderr=s}},so=class extends Ye{line;constructor(e,r,n){super(e,{cause:n}),this.line=r}},$t=class extends Ye{rpcCode;rpcData;constructor(e,r,n){super(e),r!==void 0&&(this.rpcCode=r),n!==void 0&&(this.rpcData=n)}}});import*as wl from"node:child_process";function Tv(t){if(typeof wl.spawnSync=="function")try{wl.spawnSync("taskkill",["/T","/F","/PID",String(t)],{windowsHide:!0})}catch{}}function ym(t){return t.exitCode!==null||t.signalCode!==null}function yl(t,e){return ym(t)?Promise.resolve(!0):new Promise(r=>{let n=!1,s=()=>{n||(n=!0,clearTimeout(o),r(!0))},o=setTimeout(()=>{n||(n=!0,t.removeListener("exit",s),r(!1))},e);t.once("exit",s)})}async function it(t,e={}){let r=Date.now(),n=e.stdinEnd!==!1,s=e.softDelayMs??5e3,o=e.killDelayMs??5e3,i=e.platform??process.platform,a=e.runTaskkill??Tv;if(ym(t))return{signal:"natural",elapsedMs:Date.now()-r};if(n&&t.stdin&&!t.stdin.destroyed)try{t.stdin.end()}catch{}if(await yl(t,s))return{signal:"stdin",elapsedMs:Date.now()-r};if(i==="win32"&&typeof t.pid=="number")a(t.pid);else try{t.kill("SIGTERM")}catch{}if(await yl(t,o))return{signal:"SIGTERM",elapsedMs:Date.now()-r};if(i!=="win32")try{t.kill("SIGKILL")}catch{}return await yl(t,Sv)?{signal:"SIGKILL",elapsedMs:Date.now()-r}:{signal:"abandoned",elapsedMs:Date.now()-r}}var Sv,io=b(()=>{"use strict";Sv=1e3});function wm(t){Se()&&process.stderr.write(`[debug] ${t}
955
+ `)}function qr(t,e){let r=vv[t];if(r)return r[e]??r.yolo}function xv(t,e){if(e.length===0)return!0;for(let r=0;r+e.length<=t.length;r++){let n=!0;for(let s=0;s<e.length;s++)if(t[r+s]!==e[s]){n=!1;break}if(n)return!0}return!1}function Vt(t,e,r="yolo"){if(Iv.has(t)){wm(`YOLO ${t} [mode=${r}]: ${t==="codex"?`JSON-RPC params (approvalPolicy=never, sandbox=${r==="plan"?"read-only":"danger-full-access"})`:t==="opencode"?".opencode/opencode.json (permission=allow)":"protocol/config (out-of-band)"} \u2014 no argv flag`);return}let n=r==="plan"?qr(t,"plan"):kv[t];if(!n){let s=`unknown provider "${t}" \u2014 YOLO contract not configured. Add an entry to YOLO_FLAGS in src/providers/yolo-contract.ts before spawning this provider.`;throw Z({event:"yolo_assert_failed",provider:t,reason:"unconfigured_provider",args:e.join(" "),message:s}),new we(s)}if(!xv(e,n)){let s=n.join(" "),o=`${t} spawn missing YOLO flag '${s}' \u2014 YOLO is mandatory for every provider; see src/providers/yolo-contract.ts. Got argv: [${e.map(i=>JSON.stringify(i)).join(", ")}]`;throw Z({event:"yolo_assert_failed",provider:t,reason:"flag_missing",required_flag:s,mode:r,args:e.join(" "),message:o}),new we(o)}wm(`YOLO ${t} [mode=${r}]: argv flag '${n.join(" ")}'`)}var kv,vv,Iv,Un=b(()=>{"use strict";Br();je();kv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"],gemini:["-y"],copilot:["--yolo"],agy:["--dangerously-skip-permissions"]},vv={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"]}};Iv=new Set(["codex","opencode"])});import{spawn as Nv}from"node:child_process";import{existsSync as $v}from"node:fs";function Av(t){if(t.length===0)return"";if(t.length===1)return t[0];let e=[];for(let r=0;r<t.length;r++)r===0?e.push(t[r]):e.push(`
968
956
 
969
957
  --- additional response (turn ${r+1} of ${t.length}; likely an injected mid-call notification) ---
970
958
 
@@ -972,44 +960,44 @@ var PT=Object.defineProperty;var b=(t,e)=>()=>(t&&(e=t(t=0)),e);var ce=(t,e)=>{f
972
960
  One possible cause: the provider stream ended before a complete response was delivered; for Claude Code this can appear as "API Error: Stream idle timeout - partial response received".`;return e?`Original provider error:
973
961
  ${e}
974
962
 
975
- ${r}`:r}function Em(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||jv[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=qr(s,a)??Cv[s]??["--dangerously-skip-permissions"];i.push(...l);try{Vt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!$v(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=xv(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:s}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Rv({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
976
- `);f=_.pop()||"";for(let T of _)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new ye(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(pt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(Z({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(Lv({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
963
+ ${r}`:r}function Em(t,e){return new Promise((r,n)=>{let s=e.tool||"claude",o=e.binaryPath||jv[s]||"claude",i=["-p","","--output-format","stream-json","--input-format","stream-json"];s==="claude"&&i.push("--verbose"),e.sessionId&&i.push("--resume",e.sessionId),e.model&&i.push("--model",e.model);let a=e.permissionMode??"yolo",l=qr(s,a)??Cv[s]??["--dangerously-skip-permissions"];i.push(...l);try{Vt(s,i,a)}catch(g){return n(g)}if(e.cwd&&!$v(e.cwd))return Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Nv(o,i,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:s,phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:s}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Rv({onEvent:e.onEvent,onText:e.onText}),f="";function m(g){let _=d.sawResult();d.processLine(g),!_&&d.sawResult()&&c.stdin?.end()}c.stdout?.on("data",g=>{f+=g.toString();let _=f.split(`
964
+ `);f=_.pop()||"";for(let T of _)m(T)});let p="";c.stderr?.on("data",g=>{p+=g.toString()}),c.on("error",g=>{Z({event:"transport_error",provider:s,error_class:"TransportConnectionError",error_message:g.message}),n(new we(`Failed to spawn ${o}: ${g.message}`,{cause:g}))}),c.on("exit",g=>{if(u)return;f.trim()&&m(f);let _=d.finalize();_?(pt(`stream-json: result ${_.result.slice(0,80)}${_.result.length>80?"...":""} (${_.durationMs}ms)`),r({..._,exitCode:g})):(Z({event:"transport_error",provider:s,error_class:"Error",reason:"provider_no_result",exit_code:g,stderr_tail:p.slice(0,500)}),n(new Error(Lv({tool:s,exitCode:g,stderr:p}))))});let h=JSON.stringify({type:"user",message:{role:"user",content:t}});c.stdin?.write(h+`
977
965
  `),pt(`stream-json: prompt sent (${t.length} chars)`)})}var jv,Cv,bm=b(()=>{"use strict";Br();io();Un();je();Xt();jv={claude:"claude",qwen:"qwen"};Cv={claude:["--dangerously-skip-permissions"],qwen:["--approval-mode","yolo"]}});import{accessSync as Mv,constants as Dv}from"node:fs";import{delimiter as Pv,join as Fv}from"node:path";function Uv(t,e=process.env){let r=e.PATH??"";for(let n of r.split(Pv))if(n)try{return Mv(Fv(n,t),Dv.X_OK),!0}catch{}return!1}function Wv(t,e){return` MCP warning: ${e} is configured to run \`${t} mcp\`, but \`${t}\` was not found on PATH. Provider MCP calls may fail until PATH is fixed.`}function Hr(t,e,r={}){if(Uv(t,r.env))return;(r.warn??console.warn)(Wv(t,e))}var ao=b(()=>{"use strict"});function lo(t={}){return Hr("lmctl","lmctl_chat",t),["-c",'mcp_servers.lmctl.command="lmctl"',"-c",'mcp_servers.lmctl.args=["mcp"]',"-c",`mcp_servers.lmctl.tool_timeout_sec=${qv}`]}var Bv,qv,El=b(()=>{"use strict";ao();Bv=864e5,qv=Bv/1e3});import{spawn as Hv}from"node:child_process";import{createInterface as Jv}from"node:readline";import{existsSync as Xv,readFileSync as Gv}from"node:fs";import{fileURLToPath as Vv}from"node:url";function Kv(t){return t==="plan"?"read-only":"danger-full-access"}function zv(){return{clientInfo:{name:"lmctl",title:"lmctl",version:Yv},capabilities:{experimentalApi:!1}}}function Kt(t,e){pt(`[codex:${t}] ${JSON.stringify(e)}`)}function Zv(){return{agentItems:new Map,resultText:""}}function Sm(t,e,r,n){let s=t.method;if(!s)return!1;let o=t.params;if(s==="turn/started")return e.agentItems.clear(),e.resultText="",!1;if(s==="item/started"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=typeof i.phase=="string"?i.phase:void 0,l=a==="commentary"||a==="final_answer"?a:void 0;return e.agentItems.set(i.id,{phase:l,buffer:""}),!0}return!1}if(s==="item/agentMessage/delta"){let i=o?.delta||"",a=typeof o?.itemId=="string"?o.itemId:void 0;if(!i)return!0;let l=a?e.agentItems.get(a):void 0;return l?(l.phase==="commentary"||(l.buffer+=i),r?.(i),l.phase&&o&&(o._lmctlItemPhase=l.phase)):(e.resultText+=i,r?.(i)),!0}if(s==="item/completed"){let i=o?.item;if(i?.type==="agentMessage"&&typeof i.id=="string"){let a=e.agentItems.get(i.id);if(a){if(a.phase!=="commentary"){let l=typeof i.text=="string"?i.text:a.buffer;if(n&&typeof i.text=="string"&&i.text!==a.buffer){let c=typeof o?.threadId=="string"?o.threadId:void 0,u=typeof o?.turnId=="string"?o.turnId:void 0;n({itemId:i.id,threadId:c,turnId:u,expectedFromItemText:i.text,gotFromBuffer:a.buffer})}e.resultText+=l}e.agentItems.delete(i.id)}return!0}return!1}return!1}function Qv(t){for(let[,e]of t.agentItems.entries())e.phase!=="commentary"&&e.buffer&&(t.resultText+=e.buffer);t.agentItems.clear()}function e0(t){let e=t.params,r=e?.error,n=typeof r?.message=="string"?r.message:void 0,s=n&&n.length>0?n:"(no message)";return e?.willRetry===!0?{willRetry:!0}:{willRetry:!1,turnError:new Error(`Turn errored: ${s}`)}}function t0(){return{pendingCodexError:null}}function r0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: codex app-server exited with code ${t.exitCode} before completing the turn.
978
966
  One possible cause: Codex stopped before delivering a terminal turn/completed event.`;return e?`Original provider error:
979
967
  ${e}
980
968
 
981
- ${r}`:r}function n0(t,e){let r=e0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function s0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Tm(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead";i&&o.push(...lo()),Se()&&ot(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=Kv(a);try{Vt("codex",o,a)}catch(D){return n(D)}if(e.cwd&&!Xv(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Hv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Jv({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),E=Zv(),k=t0();function $(D,C={}){return new Promise((H,R)=>{let U=m++;f.set(U,{resolve:H,reject:R});let z=JSON.stringify({jsonrpc:"2.0",id:U,method:D,params:C});c.stdin?.write(z+`
982
- `)})}function N(D,C={}){let H=JSON.stringify({jsonrpc:"2.0",method:D,params:C});c.stdin?.write(H+`
983
- `)}d.on("line",D=>{let C;try{C=JSON.parse(D)}catch{return}if(typeof C.id=="number"&&f.has(C.id)){let U=f.get(C.id);if(f.delete(C.id),C.error){let z=C.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(C.error);U.reject(oo(`codex app-server error: ${v}`,z))}else U.resolve(C);e.onEvent?.(C);return}let H=C.method;if(!H){e.onEvent?.(C);return}if(H==="thread/started"){let z=C.params?.thread;z?.id&&(p=z.id)}let R=Se()?U=>{Kt("item.text/buffer-mismatch",{itemId:U.itemId,threadId:U.threadId??null,turnId:U.turnId??null,expectedFromItemText:U.expectedFromItemText,gotFromBuffer:U.gotFromBuffer,expectedLen:U.expectedFromItemText.length,gotLen:U.gotFromBuffer.length})}:void 0;if(H==="turn/started"){let U=C.params,z=U?.turn;z?.id&&(h=z.id),Sm(C,E,e.onDelta,R),Se()&&Kt("turn/started",{params:U??null})}if(Se()&&(H==="item/started"||H==="item/completed")){let U=C.params;U?.item?.type==="agentMessage"&&Kt(H,{params:U??null})}if(H==="item/started"||H==="item/agentMessage/delta"||H==="item/completed"){if(H==="item/agentMessage/delta"){let U=C.params;Se()&&Kt("agentMessage/delta",{params:U??null})}Sm(C,E,e.onDelta,R)}if(H==="turn/completed"){let U=C.params;if(Se())for(let[v,I]of E.agentItems.entries())I.buffer&&Kt("turn/completed/unflushed-item",{itemId:v,phase:I.phase,bufferLen:I.buffer.length});Qv(E),Se()&&Kt("turn/completed",{params:U??null});let z=s0(C,k);z.shouldReject?(Se()&&Kt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(H==="error"){let U=n0(C,k);if(Se()){let z=C.params,v=z?.error,I=typeof v?.message=="string"?v.message:"(no message)";Kt(U.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:U.willRetry,params:z??null})}}e.onEvent?.(C)});let A="";c.stderr?.on("data",D=>{A+=D.toString()}),c.on("error",D=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),n(new ye(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),c.on("exit",D=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-T,exitCode:D});return}if(k.pendingCodexError){n(k.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:A.slice(0,500)}),n(new Error(r0({exitCode:D,stderr:A})))}}),(async()=>{try{if(await $("initialize",zv()),N("initialized",{}),e.threadId)try{let D=$("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((H,R)=>setTimeout(()=>R(new Error("resume timeout")),5e3));await Promise.race([D,C]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
984
- `);let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}else{let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(D){it(c).catch(()=>{}),n(D instanceof Error?D:new Error(String(D)))}})()})}var Yv,km=b(()=>{"use strict";je();je();Br();io();Un();El();je();Xt();Yv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Gv(Vv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Yt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function bl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:vm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Im.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(Nm.map(t=>[t,{name:t}]))}})}function xm(){return[...Object.keys(vm).map(t=>`github-copilot/${t}`),...Im.map(t=>`deepseek/${t}`),...Nm.map(t=>`openrouter/${t}`)].sort()}var vm,Im,Nm,Sl=b(()=>{"use strict";vm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Yt("GPT-5 mini",["high"]),"gpt-5.2":Yt("GPT-5.2"),"gpt-5.2-codex":Yt("GPT-5.2 Codex"),"gpt-5.3-codex":Yt("GPT-5.3 Codex"),"gpt-5.4":Yt("GPT-5.4"),"gpt-5.4-mini":Yt("GPT-5.4 mini"),"gpt-5.4-nano":Yt("GPT-5.4 nano"),"gpt-5.5":Yt("GPT-5.5")},Im=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],Nm=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as Rm,mkdirSync as o0,readFileSync as Om,writeFileSync as $m}from"node:fs";import{join as Wn,resolve as i0}from"node:path";function Am(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:a0}}function l0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function co(t){return structuredClone(t)}function Lm(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Tl(t,e,r={existsSync:Rm,readFileSync:Om}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=i0(e,s.sessiondir??e);for(let i of c0(o)){let a=u0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Lm(a.permission)||n.push(`[${s.alias}] ${i} 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 c0(t){return[Wn(t,".opencode","opencode.jsonc"),Wn(t,"opencode.jsonc"),Wn(t,"opencode.json")]}function u0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(d0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function d0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
969
+ ${r}`:r}function n0(t,e){let r=e0(t);return r.willRetry||(e.pendingCodexError=r.turnError),r}function s0(t,e){if(e.pendingCodexError){let o=e.pendingCodexError;return e.pendingCodexError=null,{shouldReject:!0,turnError:o}}let n=t.params?.turn;if((typeof n?.status=="string"?n.status:void 0)==="failed"){let o=n?.error,i=typeof o?.message=="string"?o.message:void 0,a=i&&i.length>0?i:"(no message)";return{shouldReject:!0,turnError:new Error(`Turn errored: ${a}`)}}return{shouldReject:!1}}function Tm(t,e){return new Promise((r,n)=>{let s=e.binaryPath||"codex",o=["app-server","--listen","stdio://"];e.model&&o.push("-c",`model=${JSON.stringify(e.model)}`);let i=e.isLead??e.alias?.toLowerCase()==="lead";i&&o.push(...lo()),Se()&&ot(JSON.stringify({event:"codex_mcp_inject",alias:e.alias??null,isLead:i,injected:i}));let a=e.permissionMode??"yolo",l=Kv(a);try{Vt("codex",o,a)}catch(D){return n(D)}if(e.cwd&&!Xv(e.cwd))return Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`}),n(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=Hv(s,o,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.threadId)}),u=!1;if(e.signal){if(e.signal.aborted)return u=!0,Z({event:"transport_abort",provider:"codex",phase:"pre_spawn"}),it(c).catch(()=>{}),n(new Error("Aborted"));e.signal.addEventListener("abort",()=>{u=!0,Z({event:"transport_abort",provider:"codex"}),it(c).catch(()=>{}),n(new Error("Aborted"))},{once:!0})}let d=Jv({input:c.stdout}),f=new Map,m=1,p=e.threadId||"",h="",g=!1,_=!1,T=Date.now(),E=Zv(),k=t0();function $(D,C={}){return new Promise((H,R)=>{let U=m++;f.set(U,{resolve:H,reject:R});let z=JSON.stringify({jsonrpc:"2.0",id:U,method:D,params:C});c.stdin?.write(z+`
970
+ `)})}function x(D,C={}){let H=JSON.stringify({jsonrpc:"2.0",method:D,params:C});c.stdin?.write(H+`
971
+ `)}d.on("line",D=>{let C;try{C=JSON.parse(D)}catch{return}if(typeof C.id=="number"&&f.has(C.id)){let U=f.get(C.id);if(f.delete(C.id),C.error){let z=C.error,v=typeof z?.message=="string"&&z.message.length>0?z.message:JSON.stringify(C.error);U.reject(oo(`codex app-server error: ${v}`,z))}else U.resolve(C);e.onEvent?.(C);return}let H=C.method;if(!H){e.onEvent?.(C);return}if(H==="thread/started"){let z=C.params?.thread;z?.id&&(p=z.id)}let R=Se()?U=>{Kt("item.text/buffer-mismatch",{itemId:U.itemId,threadId:U.threadId??null,turnId:U.turnId??null,expectedFromItemText:U.expectedFromItemText,gotFromBuffer:U.gotFromBuffer,expectedLen:U.expectedFromItemText.length,gotLen:U.gotFromBuffer.length})}:void 0;if(H==="turn/started"){let U=C.params,z=U?.turn;z?.id&&(h=z.id),Sm(C,E,e.onDelta,R),Se()&&Kt("turn/started",{params:U??null})}if(Se()&&(H==="item/started"||H==="item/completed")){let U=C.params;U?.item?.type==="agentMessage"&&Kt(H,{params:U??null})}if(H==="item/started"||H==="item/agentMessage/delta"||H==="item/completed"){if(H==="item/agentMessage/delta"){let U=C.params;Se()&&Kt("agentMessage/delta",{params:U??null})}Sm(C,E,e.onDelta,R)}if(H==="turn/completed"){let U=C.params;if(Se())for(let[v,I]of E.agentItems.entries())I.buffer&&Kt("turn/completed/unflushed-item",{itemId:v,phase:I.phase,bufferLen:I.buffer.length});Qv(E),Se()&&Kt("turn/completed",{params:U??null});let z=s0(C,k);z.shouldReject?(Se()&&Kt("turn/completed/terminal-reject",{message:z.turnError.message}),_=!0,g=!0,c.stdin?.end(),n(z.turnError)):(g=!0,c.stdin?.end())}if(H==="error"){let U=n0(C,k);if(Se()){let z=C.params,v=z?.error,I=typeof v?.message=="string"?v.message:"(no message)";Kt(U.willRetry?"error/retry":"error/terminal-deferred",{message:I,willRetry:U.willRetry,params:z??null})}}e.onEvent?.(C)});let A="";c.stderr?.on("data",D=>{A+=D.toString()}),c.on("error",D=>{Z({event:"transport_error",provider:"codex",error_class:"TransportConnectionError",error_message:D.message}),n(new we(`Failed to spawn codex app-server: ${D.message}`,{cause:D}))}),c.on("exit",D=>{if(!u&&!_){if(g){r({result:E.resultText,threadId:p,turnId:h,durationMs:Date.now()-T,exitCode:D});return}if(k.pendingCodexError){n(k.pendingCodexError);return}Z({event:"transport_error",provider:"codex",error_class:"Error",reason:"provider_no_result",exit_code:D,stderr_tail:A.slice(0,500)}),n(new Error(r0({exitCode:D,stderr:A})))}}),(async()=>{try{if(await $("initialize",zv()),x("initialized",{}),e.threadId)try{let D=$("thread/resume",{threadId:e.threadId,sandbox:l,approvalPolicy:"never",...e.model?{model:e.model}:{}}),C=new Promise((H,R)=>setTimeout(()=>R(new Error("resume timeout")),5e3));await Promise.race([D,C]),p=e.threadId}catch{process.stderr.write(`[codex] thread/resume failed, creating new thread
972
+ `);let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}else{let C=(await $("thread/start",{cwd:e.cwd,approvalPolicy:"never",sandbox:l,...e.model?{model:e.model}:{}})).result?.thread;C?.id&&(p=C.id)}await $("turn/start",{threadId:p,input:[{type:"text",text:t}],...e.model?{model:e.model}:{}})}catch(D){it(c).catch(()=>{}),n(D instanceof Error?D:new Error(String(D)))}})()})}var Yv,km=b(()=>{"use strict";je();je();Br();io();Un();El();je();Xt();Yv=(()=>{try{let t=new URL("../../../package.json",import.meta.url),e=JSON.parse(Gv(Vv(t),"utf8"));return typeof e.version=="string"?e.version:"0.0.0"}catch{return"0.0.0"}})()});function Yt(t,e=["high","xhigh"]){return{name:t,reasoning:!0,provider:{npm:"@ai-sdk/github-copilot"},variants:Object.fromEntries(e.map(r=>[r,{reasoningEffort:r,reasoningSummary:"auto",include:["reasoning.encrypted_content"]}]))}}function bl(){return structuredClone({"github-copilot":{npm:"@ai-sdk/openai-compatible",name:"GitHub Copilot",options:{baseURL:"https://api.githubcopilot.com"},models:vm},deepseek:{npm:"@ai-sdk/openai-compatible",name:"DeepSeek",options:{baseURL:"https://api.deepseek.com/v1",apiKey:"{env:DEEPSEEK_API_KEY}"},models:Object.fromEntries(Im.map(t=>[t,{name:t}]))},openrouter:{npm:"@ai-sdk/openai-compatible",name:"OpenRouter",options:{baseURL:"https://openrouter.ai/api/v1",apiKey:"{env:OPENROUTER_API_KEY}"},models:Object.fromEntries(xm.map(t=>[t,{name:t}]))}})}function Nm(){return[...Object.keys(vm).map(t=>`github-copilot/${t}`),...Im.map(t=>`deepseek/${t}`),...xm.map(t=>`openrouter/${t}`)].sort()}var vm,Im,xm,Sl=b(()=>{"use strict";vm={"gpt-4.1":{name:"GPT-4.1"},"gpt-4.1-2025-04-14":{name:"GPT-4.1 (2025-04-14)"},"gpt-4o-mini":{name:"GPT-4o mini"},"gpt-4o-mini-2024-07-18":{name:"GPT-4o mini (2024-07-18)"},"gpt-5-mini":Yt("GPT-5 mini",["high"]),"gpt-5.2":Yt("GPT-5.2"),"gpt-5.2-codex":Yt("GPT-5.2 Codex"),"gpt-5.3-codex":Yt("GPT-5.3 Codex"),"gpt-5.4":Yt("GPT-5.4"),"gpt-5.4-mini":Yt("GPT-5.4 mini"),"gpt-5.4-nano":Yt("GPT-5.4 nano"),"gpt-5.5":Yt("GPT-5.5")},Im=["deepseek-chat","deepseek-reasoner","deepseek-v4-flash","deepseek-v4-pro"],xm=["qwen/qwen3-coder","qwen/qwen3-coder-plus","qwen/qwen3-coder-flash","qwen/qwen3.5-9b","qwen/qwen3.5-397b-a17b","qwen/qwen3.5-plus-20260420","qwen/qwen3.6-flash","qwen/qwen3.6-plus","qwen/qwen3.6-max-preview","qwen/qwen3.7-plus"]});import{existsSync as Rm,mkdirSync as o0,readFileSync as Om,writeFileSync as $m}from"node:fs";import{join as Wn,resolve as i0}from"node:path";function Am(){return{type:"local",command:["lmctl","mcp"],enabled:!0,timeout:a0}}function l0(t,e){return JSON.stringify(t)===JSON.stringify(e)}function co(t){return structuredClone(t)}function Lm(t){if(t==="allow")return!0;if(t&&typeof t=="object"&&!Array.isArray(t)){let e=Object.entries(t);if(e.length===1&&e[0][0]==="*"&&e[0][1]==="allow")return!0}return!1}function Tl(t,e,r={existsSync:Rm,readFileSync:Om}){let n=[];for(let s of t){if(s.provider.trim().toLowerCase()!=="opencode")continue;let o=i0(e,s.sessiondir??e);for(let i of c0(o)){let a=u0(i,r);a!==void 0&&Object.prototype.hasOwnProperty.call(a,"permission")&&(Lm(a.permission)||n.push(`[${s.alias}] ${i} 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 c0(t){return[Wn(t,".opencode","opencode.jsonc"),Wn(t,"opencode.jsonc"),Wn(t,"opencode.json")]}function u0(t,e){try{if(!e.existsSync(t))return;let r=e.readFileSync(t,"utf-8"),n=JSON.parse(d0(r));return n===null||typeof n!="object"||Array.isArray(n)?void 0:n}catch{return}}function d0(t){let e="",r=!1,n="",s=!1;for(let o=0;o<t.length;o+=1){let i=t[o],a=t[o+1];if(r){e+=i,s?s=!1:i==="\\"?s=!0:i===n&&(r=!1,n="");continue}if(i==='"'||i==="'"){r=!0,n=i,e+=i;continue}if(i==="/"&&a==="/"){for(;o<t.length&&t[o]!==`
985
973
  `;)o+=1;o<t.length&&(e+=t[o]);continue}if(i==="/"&&a==="*"){for(o+=2;o<t.length&&!(t[o]==="*"&&t[o+1]==="/");)o+=1;o+=1;continue}e+=i}return e.replace(/,\s*([}\]])/g,"$1")}function uo(t,e={}){let r=Wn(t,".opencode"),n=Wn(r,"opencode.json");if(Hr("lmctl","lmctl_chat",e),!Rm(n)){o0(r,{recursive:!0});let l=JSON.stringify({permission:"allow",provider:bl(),mcp:{lmctl:Am()}},null,2);return $m(n,l+`
986
974
  `,"utf-8"),!0}let s;try{s=JSON.parse(Om(n,"utf-8"))}catch{return console.log(jm.yellow(` .opencode/opencode.json at ${n} is malformed \u2014 skipping opencode config install.`)),!1}if(typeof s!="object"||s===null)return console.log(jm.yellow(` .opencode/opencode.json at ${n} is not an object \u2014 skipping opencode config install.`)),!1;let o=!1;s.permission===void 0&&(s.permission="allow",o=!0),Lm(s.permission)||Z({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.`}),f0(s)&&(o=!0);let i=s.mcp&&typeof s.mcp=="object"&&!Array.isArray(s.mcp)?{...s.mcp}:{},a=Am();return l0(i.lmctl,a)||(i.lmctl=a,s.mcp=i,o=!0),o&&$m(n,JSON.stringify(s,null,2)+`
987
975
  `,"utf-8"),o}function f0(t){let e=bl(),r=jt(t.provider)?t.provider:{},n=!jt(t.provider);for(let[s,o]of Object.entries(e)){let i=r[s];if(i===void 0){r[s]=co(o),n=!0;continue}if(!jt(i))continue;let a={...i};a.npm===void 0&&(a.npm=o.npm,n=!0),a.name===void 0&&(a.name=o.name,n=!0);let l=jt(a.options)?{...a.options}:{};for(let[u,d]of Object.entries(o.options))l[u]===void 0&&(l[u]=co(d),n=!0);a.options=l;let c=jt(a.models)?{...a.models}:{};for(let[u,d]of Object.entries(o.models)){if(c[u]===void 0){c[u]=co(d),n=!0;continue}let f=c[u];if(jt(f)&&jt(d)){let m={...f};Cm(m,d)&&(c[u]=m,n=!0)}}a.models=c,r[s]=a}return n&&(t.provider=r),n}function jt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Cm(t,e){let r=!1;for(let[n,s]of Object.entries(e)){if(t[n]===void 0){t[n]=co(s),r=!0;continue}jt(t[n])&&jt(s)&&Cm(t[n],s)&&(r=!0)}return r}var jm,a0,fo=b(()=>{"use strict";je();Sl();ao();jm={yellow:t=>t},a0=864e5});import{spawn as m0}from"node:child_process";import{existsSync as p0}from"node:fs";import{createInterface as h0}from"node:readline";function _0(t){let e=t.stderr.trim().slice(0,500),r=`lmctl: ${t.tool} ACP process exited with code ${t.exitCode} before completing the prompt.
988
976
  One possible cause: the provider process failed before a complete ACP response was delivered.`;return e?`Original provider error:
989
977
  ${e}
990
978
 
991
- ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Mm(t.slice(n).trimStart())}return Mm(v0(t.replace(E0,"")))}function v0(t){let e=b0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(S0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Mm(t){let e=[...t.matchAll(T0)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function Pm(t,e){let r=g0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{uo(e.cwd)}catch(N){Z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:N instanceof Error?N.message:String(N)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let N=qr("gemini","plan"),A=qr("gemini","yolo");a=a.filter(D=>!(A??[]).includes(D)),N&&a.push(...N)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
992
- `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Vt(e.tool,a,l)}catch(N){return s(N)}if(e.model&&e.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
993
- `),e.cwd&&!p0(e.cwd))return Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new ye(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=m0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),it(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),it(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=h0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,T=!1;function E(N,A={}){return new Promise((D,C)=>{let H=w0++;m.set(H,{resolve:D,reject:C});let R=JSON.stringify({jsonrpc:"2.0",id:H,method:N,params:A});It({event:"acp_send",direction:"SEND",provider:e.tool,method:N,id:H,params:A}),c.stdin?.write(R+`
994
- `)})}f.on("line",N=>{let A;try{A=JSON.parse(N)}catch{return}if(It({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof A.id=="number"?A.id:void 0,method:typeof A.method=="string"?A.method:void 0,preview:JSON.stringify(A).slice(0,300)}),e.onEvent?.(A),typeof A.id=="number"&&m.has(A.id)){let C=m.get(A.id);if(m.delete(A.id),A.error){let H=A.error,R=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(A.error);C.reject(oo(`ACP RPC error: ${R}`,H))}else C.resolve(A);return}let D=A.method;if(D){if(typeof A.id=="number"){Z({event:"acp_unhandled_request",provider:e.tool,method:D,id:A.id,params:A.params});let C=JSON.stringify({jsonrpc:"2.0",id:A.id,error:{code:-32601,message:`Method not found: ${D} (lmctl does not implement server-side ACP methods)`}});It({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:A.id,error:"method not found"}),c.stdin?.write(C+`
995
- `);return}if(D==="session/update"){let H=A.params?.update;if(H?.sessionUpdate==="agent_message_chunk"){let U=H.content?.text||"";U&&T&&(h+=U,e.onDelta?.(U))}}}});let k="";c.stderr?.on("data",N=>{k+=N.toString()}),c.on("error",N=>{Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:N.message,elapsed_ms:Date.now()-u}),s(new ye(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${N.message}`,{cause:N}))}),c.on("exit",N=>{d||(_?n({result:e.tool==="gemini"?k0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:N}):(Z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:N,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(_0({tool:e.tool,exitCode:N,stderr:k})))))});function $(N,A={}){let D=JSON.stringify({jsonrpc:"2.0",method:N,params:A});c.stdin?.write(D+`
979
+ ${r}`:r}function k0(t){let e=[...t.matchAll(w0)];if(e.length>0){let r=e[e.length-1],n=(r.index??0)+r[0].length;return Mm(t.slice(n).trimStart())}return Mm(v0(t.replace(E0,"")))}function v0(t){let e=b0.exec(t);if(e===null)return t;let r=t.slice(e[0].length),n=[...r.matchAll(S0)];if(n.length<2)return t;let s=n[0],o=(s.index??0)+s[0].length;return r.slice(o).trimStart()}function Mm(t){let e=[...t.matchAll(T0)];if(e.length===0)return t;let r=e[e.length-1],n=(r.index??0)+r[0].length;return t.slice(n).trimStart()}function Pm(t,e){let r=g0[e.tool];return r?new Promise((n,s)=>{let o=e.binaryPath||r.binary;if(e.tool==="opencode")try{uo(e.cwd)}catch(x){Z({event:"opencode_config_install_failed",cwd:e.cwd,error_message:x instanceof Error?x.message:String(x)})}let i=e.permissionMode??"yolo",a=[...r.args];if(i==="plan")if(e.tool==="gemini"){let x=qr("gemini","plan"),A=qr("gemini","yolo");a=a.filter(D=>!(A??[]).includes(D)),x&&a.push(...x)}else e.tool==="copilot"&&process.stderr.write(`[acp] copilot has no plan-mode flag in --acp mode; --permission-mode plan is not honored (running yolo). See src/providers/yolo-contract.ts.
980
+ `);e.model&&e.tool==="gemini"&&a.push("--model",e.model);let l=e.tool==="copilot"?"yolo":i;try{Vt(e.tool,a,l)}catch(x){return s(x)}if(e.model&&e.tool==="copilot"&&process.stderr.write(`[acp] copilot does not support per-session model selection in --acp mode (model="${e.model}" ignored). Set the default via copilot's /model slash command in an interactive \`lmctl terminal\` session.
981
+ `),e.cwd&&!p0(e.cwd))return Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:`sessiondir missing: ${e.cwd}`,elapsed_ms:0}),s(new we(`sessiondir missing: ${e.cwd}`,{cause:Object.assign(new Error("cwd missing"),{code:"ENOENT_CWD"})}));let c=m0(o,a,{cwd:e.cwd,stdio:["pipe","pipe","pipe"],env:Ke(e.env,e.sessionId)}),u=Date.now(),d=!1;if(e.signal){if(e.signal.aborted)return d=!0,Z({event:"transport_abort",provider:e.tool,phase:"pre_spawn"}),it(c).catch(()=>{}),s(new Error("Aborted"));e.signal.addEventListener("abort",()=>{d=!0,Z({event:"transport_abort",provider:e.tool,elapsed_ms:Date.now()-u}),it(c).catch(()=>{}),s(new Error("Aborted"))},{once:!0})}let f=h0({input:c.stdout}),m=new Map,p=e.sessionId||"",h="",g="",_=!1,T=!1;function E(x,A={}){return new Promise((D,C)=>{let H=y0++;m.set(H,{resolve:D,reject:C});let R=JSON.stringify({jsonrpc:"2.0",id:H,method:x,params:A});It({event:"acp_send",direction:"SEND",provider:e.tool,method:x,id:H,params:A}),c.stdin?.write(R+`
982
+ `)})}f.on("line",x=>{let A;try{A=JSON.parse(x)}catch{return}if(It({event:"acp_recv",direction:"RECV",provider:e.tool,id:typeof A.id=="number"?A.id:void 0,method:typeof A.method=="string"?A.method:void 0,preview:JSON.stringify(A).slice(0,300)}),e.onEvent?.(A),typeof A.id=="number"&&m.has(A.id)){let C=m.get(A.id);if(m.delete(A.id),A.error){let H=A.error,R=typeof H?.message=="string"&&H.message.length>0?H.message:JSON.stringify(A.error);C.reject(oo(`ACP RPC error: ${R}`,H))}else C.resolve(A);return}let D=A.method;if(D){if(typeof A.id=="number"){Z({event:"acp_unhandled_request",provider:e.tool,method:D,id:A.id,params:A.params});let C=JSON.stringify({jsonrpc:"2.0",id:A.id,error:{code:-32601,message:`Method not found: ${D} (lmctl does not implement server-side ACP methods)`}});It({event:"acp_send",direction:"SEND",provider:e.tool,replyTo:A.id,error:"method not found"}),c.stdin?.write(C+`
983
+ `);return}if(D==="session/update"){let H=A.params?.update;if(H?.sessionUpdate==="agent_message_chunk"){let U=H.content?.text||"";U&&T&&(h+=U,e.onDelta?.(U))}}}});let k="";c.stderr?.on("data",x=>{k+=x.toString()}),c.on("error",x=>{Z({event:"transport_error",provider:e.tool,error_class:"TransportConnectionError",error_message:x.message,elapsed_ms:Date.now()-u}),s(new we(`Failed to spawn ${r.binary} ${r.args.join(" ")}: ${x.message}`,{cause:x}))}),c.on("exit",x=>{d||(_?n({result:e.tool==="gemini"?k0(h):h,sessionId:p,durationMs:Date.now()-u,stopReason:g,exitCode:x}):(Z({event:"transport_error",provider:e.tool,error_class:"Error",reason:"provider_no_result",exit_code:x,stderr_tail:k.slice(0,500),elapsed_ms:Date.now()-u}),s(new Error(_0({tool:e.tool,exitCode:x,stderr:k})))))});function $(x,A={}){let D=JSON.stringify({jsonrpc:"2.0",method:x,params:A});c.stdin?.write(D+`
996
984
  `)}(async()=>{try{if(await E("initialize",{protocolVersion:1,clientInfo:{name:"lmctl",version:"0.1.0"},clientCapabilities:{}}),$("notifications/initialized"),e.sessionId)try{p=(await E("session/load",{sessionId:e.sessionId,cwd:e.cwd,mcpServers:[]})).result?.sessionId||e.sessionId}catch(A){if(e.requireResume)throw new Error(`Cannot resume session ${e.sessionId} via ACP: ${A instanceof Error?A.message:String(A)}`);process.stderr.write(`[acp] session/load failed for ${e.sessionId}, creating new session
997
985
  `),p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||""}else p=(await E("session/new",{cwd:e.cwd,mcpServers:[]})).result?.sessionId||"";if(e.model&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"model",value:e.model}),pt(`acp: set_config_option(model=${e.model}) ok`)}catch(A){let D=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(model=${e.model}) failed: ${D}
998
986
  `)}if(e.effort&&e.tool==="opencode")try{await E("session/set_config_option",{sessionId:p,configId:"effort",value:e.effort}),pt(`acp: set_config_option(effort=${e.effort}) ok`)}catch(A){let D=A instanceof Error?A.message:String(A);process.stderr.write(`[acp] set_config_option(effort=${e.effort}) failed: ${D}
999
- `)}h="",T=!0,pt(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,pt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(N){it(c).catch(()=>{}),s(N instanceof Error?N:new Error(String(N)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var g0,w0,Dm,y0,E0,b0,S0,T0,Fm=b(()=>{"use strict";je();Br();io();Un();fo();je();Xt();g0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},w0=1,Dm="(?:png|jpe?g|webp|heic|pdf)",y0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Dm}\\s*`,"gi"),E0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Dm}\\s*`,"i"),b0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,S0=/^STANCE:\s+\S+\s*$/gim,T0=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Um(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=I0){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function N0(){let t=new Map;return(e,r)=>{x0(e,Um(t,r))}}function x0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
987
+ `)}h="",T=!0,pt(`acp: prompt sent (${t.length} chars)`),g=(await E("session/prompt",{sessionId:p,prompt:[{type:"text",text:t}]})).result?.stopReason||"",_=!0,pt(`acp: result received (${h.length} chars, stopReason=${g})`),c.stdin?.end()}catch(x){it(c).catch(()=>{}),s(x instanceof Error?x:new Error(String(x)))}})()}):Promise.reject(new Error(`No ACP config for tool "${e.tool}"`))}var g0,y0,Dm,w0,E0,b0,S0,T0,Fm=b(()=>{"use strict";je();Br();io();Un();fo();je();Xt();g0={gemini:{binary:"gemini",args:["--acp","-y","--skip-trust"]},copilot:{binary:"copilot",args:["--acp","--yolo"]},opencode:{binary:"opencode",args:["acp"]}},y0=1,Dm="(?:png|jpe?g|webp|heic|pdf)",w0=new RegExp(`\\bSTANCE:\\s*\\S+_\\d{6,}\\.${Dm}\\s*`,"gi"),E0=new RegExp(`^ACK:\\s*waiting for explicit lmctl task\\.\\d{6,}\\.${Dm}\\s*`,"i"),b0=/^ACK:\s*waiting for explicit lmctl task[._]?\s*/i,S0=/^STANCE:\s+\S+\s*$/gim,T0=/\[Thought:\s*true\]\s*/gi});function he(t,e=120){let r=t.replace(/\s+/g," ").trim();return r.length>e?r.slice(0,e-1)+"\u2026":r}function Um(t,e){return r=>{if(r.kind==="tool_use"&&typeof r.id=="string"){if(t.size>=I0){let n=t.keys().next().value;n!==void 0&&t.delete(n)}t.set(r.id,Date.now()),e(r);return}if(r.kind==="tool_result"&&typeof r.id=="string"&&r.elapsedMs===void 0){let n=t.get(r.id);if(n!==void 0){e({...r,elapsedMs:Date.now()-n}),t.delete(r.id);return}}e(r)}}function x0(){let t=new Map;return(e,r)=>{N0(e,Um(t,r))}}function N0(t,e){let r=t.type;if(r==="system"){let n=t.subtype;if(n==="api_retry"){let s=typeof t.attempt=="number"?t.attempt:void 0,o=typeof t.max_retries=="number"?t.max_retries:void 0,i=typeof t.error_status=="number"?t.error_status:void 0,a=typeof t.error=="string"?t.error:void 0,l=typeof t.retry_delay_ms=="number"?t.retry_delay_ms:void 0,c=[];s!==void 0&&c.push(o!==void 0?`attempt ${s}/${o}`:`attempt ${s}`),i!==void 0&&c.push(`HTTP ${i}`),l!==void 0&&c.push(`retry in ${Math.round(l/1e3)}s`),a&&c.push(he(a,60));let u=c.length>0?c.join(", "):n;e({kind:"api_retry",summary:u});return}if(n==="api_error"){let s=typeof t.error_status=="number"?t.error_status:void 0,o=typeof t.error=="string"?t.error:void 0,i=["api_error"];s!==void 0&&i.push(`HTTP ${s}`),o&&i.push(he(o,80)),e({kind:"other",summary:i.join(": "),raw:t});return}e({kind:"system",summary:n||"system",raw:t});return}if(r==="assistant"||r==="user"){let s=t.message?.content;if(!Array.isArray(s))return;for(let o of s){let i=o.type;if(i==="text"){let a=o.text||"";a&&e({kind:"text",summary:he(a),raw:o})}else if(i==="tool_use"){let a=o.name||"tool",l=typeof o.id=="string"?o.id:void 0,c=o.input,u="";c&&(typeof c.command=="string"?u=c.command:typeof c.file_path=="string"?u=c.file_path:typeof c.path=="string"?u=c.path:typeof c.pattern=="string"?u=c.pattern:typeof c.url=="string"?u=c.url:u=he(JSON.stringify(c))),e({kind:"tool_use",tool:a,summary:he(u),id:l,raw:o})}else if(i==="thinking"){let a=o.thinking||"";e({kind:"thinking",summary:he(a),raw:o})}else if(i==="tool_result"){let l=o.is_error===!0?"error":"ok",c=typeof o.tool_use_id=="string"?o.tool_use_id:void 0,u,d=o.content;if(typeof d=="string")u=`${d.split(`
1000
988
  `).length} lines, ${d.length} chars`;else if(Array.isArray(d)){let f=d.map(m=>typeof m=="object"&&m&&"text"in m?m.text:"").filter(Boolean).join("");f&&(u=`${f.split(`
1001
- `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function mo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?N0():void 0,s=await Em(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function $0(){let t=new Map;return(e,r)=>{j0(e,Um(t,r))}}function j0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=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))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Jr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&It({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?$0():void 0,s=await Pm(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function A0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){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(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="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&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
989
+ `).length} lines, ${f.length} chars`)}e({kind:"tool_result",status:l,summary:u,id:c,raw:o})}else i&&e({kind:"other",summary:i,raw:o})}return}if(r==="result"){e({kind:"system",summary:"result",raw:t});return}}async function mo(t,e){let r=e.binary==="qwen"?"qwen":"claude",n=e.onProgress?x0():void 0,s=await Em(t,{sessionId:e.sessionId,cwd:e.cwd,env:e.env,tool:r,binaryPath:e.progPath,model:e.model,permissionMode:e.permissionMode,onText:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,numTurns:s.numTurns}}function $0(){let t=new Map;return(e,r)=>{j0(e,Um(t,r))}}function j0(t,e){if(t.method!=="session/update")return;let s=t.params?.update;if(!s)return;let o=s.sessionUpdate;if(o){if(o==="agent_message_chunk"){let a=s.content?.text||"";a&&e({kind:"text",summary:he(a)});return}if(o==="agent_thought_chunk"){let a=s.content?.text||"";e({kind:"thinking",summary:he(a)});return}if(o==="tool_call"){let i=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))),e({kind:"tool_use",tool:i,summary:he(l),id:a});return}if(o==="tool_call_update"){let i=s.status||"",a=typeof s.toolCallId=="string"?s.toolCallId:void 0;if(i==="completed"||i==="failed")e({kind:"tool_result",summary:i,status:i==="failed"?"error":"ok",id:a});else if(i==="in_progress"){let l=s.content,c=typeof l=="string"?l:typeof l?.text=="string"?l.text:"",u=c?`running\u2026 ${he(c,80)}`:"running\u2026";e({kind:"other",summary:u,id:a})}return}e({kind:"other",summary:o})}}async function Jr(t,e){let r=e.acpTool||e.binary;e.model&&r==="copilot"&&It({event:"model_ignored",provider:r,model:e.model,reason:"copilot --acp does not implement per-session model selection"});let n=e.onProgress?$0():void 0,s=await Pm(t,{tool:r,sessionId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,effort:e.effort,alias:e.alias,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:n?o=>n(o,e.onProgress):void 0,signal:e.signal});return{text:s.result,sessionId:s.sessionId,durationMs:s.durationMs,stopReason:s.stopReason}}function A0(t,e){let r=t.method;if(!r)return;let n=t.params;if(r==="turn/started"){e({kind:"system",summary:"turn started"});return}if(r==="turn/completed"){e({kind:"system",summary:"turn completed"});return}if(r==="error"){let s=n?.error,o=typeof s?.message=="string"?s.message:void 0,i=o&&o.length>0?o:"(no message)",a=n?.willRetry===!0;e(a?{kind:"api_retry",summary:`codex retry: ${he(i,120)}`}:{kind:"other",summary:`codex error: ${he(i,120)}`});return}if(r==="item/started"||r==="item/completed"){let s=n?.item;if(!s)return;let o=s.type,i=r==="item/started";switch(o){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(i)e({kind:"tool_use",tool:"Bash",summary:he(c||"(command)"),id:a});else{let u=s.exitCode,d=s.status||"",f=typeof s.durationMs=="number"?s.durationMs:void 0,m=typeof u=="number"?`exit ${u}`:d||"done",p=[];typeof u=="number"?p.push(`exit ${u}`):d&&p.push(d),typeof f=="number"&&p.push(`${Math.round(f/1e3)}s`),e({kind:"tool_result",summary:p.join(", ")||"done",status:m,elapsedMs:f,id:a})}return}case"fileChange":{let a=typeof s.id=="string"?s.id:void 0;if(i){let l=s.changes,c=Array.isArray(l)?l.map(u=>u.path||"").filter(Boolean).join(", "):"";e({kind:"tool_use",tool:"FileChange",summary:he(c||"(edit)"),id:a})}else{let l=s.status||"done";e({kind:"tool_result",summary:l,status:l,id:a})}return}case"mcpToolCall":{let a=typeof s.id=="string"?s.id:void 0,l=s.server||"mcp",c=s.tool||"tool";if(i)e({kind:"tool_use",tool:`${l}/${c}`,summary:"",id:a});else{let u=s.status||"done";e({kind:"tool_result",summary:u,status:u,id:a})}return}case"webSearch":{let a=typeof s.id=="string"?s.id:void 0;e(i?{kind:"tool_use",tool:"WebSearch",summary:he(s.query||""),id:a}:{kind:"tool_result",summary:"done",status:"done",id:a});return}case"reasoning":{i&&e({kind:"thinking",summary:""});return}case"agentMessage":case"userMessage":return;default:{o&&e({kind:i?"tool_use":"tool_result",tool:o,summary:""});return}}}if(r==="item/agentMessage/delta"){let s=n?.delta||"";if(s){let o=typeof n?._lmctlItemPhase=="string"?n._lmctlItemPhase:void 0;e(o==="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&&e({kind:"thinking",summary:he(s)});return}if(r==="item/commandExecution/outputDelta"){let s=(typeof n?.delta=="string"?n.delta:"")||"";if(s){let o=s.split(`
1002
990
  `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({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 o=s.split(`
1003
- `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Wm(t,e){let r=await Tm(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>A0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var I0,yr=b(()=>{"use strict";bm();km();Fm();je();I0=256});function vl(t){return new kl(t)}var kl,Il=b(()=>{"use strict";dm();Gt();yr();Nt();kl=class extends Oe{constructor(e){super({provider:new to(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",xe,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:mo})}}});import{readdir as R0,stat as Bm,unlink as O0}from"node:fs/promises";import{join as Bn,basename as L0}from"node:path";function C0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function qn(t,e,r){let n=C0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function qm(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function M0(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function po(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(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 po(r)}).filter(r=>r.length>0).join(`
1004
- `);try{return JSON.stringify(t)}catch{return String(t)}}async function Hm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Fe(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=M0(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var ho,Jm=b(()=>{"use strict";Jt();ho=class{name="codex";codexDirs;constructor(e={}){let r=[Bn(Te,".codex"),Bn(Te,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Bn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Bn(r,"sessions");try{await Bm(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await R0(e)}catch{return r}for(let s of n){let o=Bn(e,s),i=await Bm(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=L0(e,".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(e){let r=await Le(e,30),n=await Ne(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=V(h.trim(),80)),u=V(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=V(h.text.trim(),80)),u=V(h.text.trim(),80))}}if(!o)return null;let m=await Hm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:qm(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await Ne(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Fe(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=qm(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let E=T.text.trim();c||(c=V(E,80)),u=V(E,80),qn(s,m,{role:"user",timestamp:g,content:de(E)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&qn(s,m,{role:"assistant",timestamp:g,content:de(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&qn(s,m,{role:"system",timestamp:g,content:de(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?de(po(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(po(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(E=>po(E.text)).join(`
1005
- `);T.trim()&&qn(s,m,{role:"thinking",timestamp:g,content:de(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&qn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await Hm(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,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(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await O0(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Le(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function xl(t){return new Nl(t)}var Nl,$l=b(()=>{"use strict";Jm();Gt();yr();Nt();Nl=class extends Oe{constructor(e){super({provider:new ho(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${xe}
991
+ `).filter(l=>l.length>0),i=o[o.length-1]||"",a=o.length>1?`${o.length} lines: ${he(i,60)}`:he(s,80);e({kind:"other",summary:`running\u2026 ${a}`})}else e({kind:"other",summary:"running\u2026"});return}if(r.startsWith("item/")){e({kind:"other",summary:r.slice(5)});return}}async function Wm(t,e){let r=await Tm(t,{threadId:e.sessionId,cwd:e.cwd,env:e.env,binaryPath:e.progPath,model:e.model,alias:e.alias,isLead:e.isLead,permissionMode:e.permissionMode,onDelta:e.onDelta,onEvent:e.onProgress?n=>A0(n,e.onProgress):void 0,signal:e.signal});return{text:r.result,sessionId:r.threadId,durationMs:r.durationMs}}var I0,wr=b(()=>{"use strict";bm();km();Fm();je();I0=256});function vl(t){return new kl(t)}var kl,Il=b(()=>{"use strict";dm();Gt();wr();xt();kl=class extends Oe{constructor(e){super({provider:new to(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"claude",seedArgs:["-p",Ne,"--dangerously-skip-permissions"],resumeTemplate:"claude --resume {{session_id}}",startTemplate:"claude",transport:mo})}}});import{readdir as R0,stat as Bm,unlink as O0}from"node:fs/promises";import{join as Bn,basename as L0}from"node:path";function C0(t,e,r){return`${t}|${e.toISOString()}|${r}`}function qn(t,e,r){let n=C0(r.role,r.timestamp,r.content);e.has(n)||(e.add(n),t.push(r))}function qm(t,e){return e==="exec"||t==="codex_exec"?"codex exec":"codex"}function M0(t){if(!t)return;let e=t.cached_input_tokens??t.cache_read_input_tokens;return{inputTokens:t.input_tokens,cachedInputTokens:e,outputTokens:t.output_tokens,reasoningOutputTokens:t.reasoning_output_tokens,totalTokens:t.total_tokens}}function po(t){if(t==null)return"";if(typeof t=="string")return t;if(typeof t=="number"||typeof t=="boolean")return String(t);if(Array.isArray(t))return t.map(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 po(r)}).filter(r=>r.length>0).join(`
992
+ `);try{return JSON.stringify(t)}catch{return String(t)}}async function Hm(t){let e=0,r=0,n=0,s=0,o=0,i,a;for await(let l of Fe(t)){if(l.type==="response_item"&&l.payload){let c=l.payload;if(c.type==="message"&&c.role==="user"&&c.content)for(let u of c.content)u.type==="input_text"&&typeof u.text=="string"&&u.text&&e++;else if(c.type==="message"&&c.role==="assistant"&&c.content)for(let u of c.content)u.type==="output_text"&&typeof u.text=="string"&&u.text&&e++}if(l.payload&&typeof l.payload.model_context_window=="number"&&(a=l.payload.model_context_window),l.type==="event_msg"&&l.payload?.type==="token_count"&&l.payload.info?.total_token_usage){let c=l.payload.info.total_token_usage;r=c.input_tokens??r,n=c.cached_input_tokens??c.cache_read_input_tokens??n,s=c.output_tokens??s,o=c.reasoning_output_tokens??o;let u=M0(l.payload.info.last_token_usage);u&&(i=u),typeof l.payload.info.model_context_window=="number"&&(a=l.payload.info.model_context_window)}}return{messageCount:e,totalInputTokens:r,totalCachedInputTokens:n,totalOutputTokens:s,totalReasoningOutputTokens:o,lastTokenUsage:i,modelContextWindow:a}}var ho,Jm=b(()=>{"use strict";Jt();ho=class{name="codex";codexDirs;constructor(e={}){let r=[Bn(Te,".codex"),Bn(Te,".code")];if(e.codexDirs&&e.codexDirs.length>0){this.codexDirs=[...new Set(e.codexDirs)];return}let n=[e.codexDir||r[0],e.codeDir||r[1]];this.codexDirs=[...new Set(n)]}getWatchPaths(){return this.codexDirs.map(e=>({directory:Bn(e,"sessions"),filePattern:/\.jsonl$/}))}async getSessionsDirs(){let e=[];for(let r of this.codexDirs){let n=Bn(r,"sessions");try{await Bm(n),e.push(n)}catch{}}return e}async discoverSessions(){let e=[],r=await this.getSessionsDirs();for(let n of r){let s=await this.findSessionFiles(n);for(let o of s)try{let i=await this.extractSummary(o);i&&e.push(i)}catch{}}return e}async findSessionFiles(e){let r=[],n;try{n=await R0(e)}catch{return r}for(let s of n){let o=Bn(e,s),i=await Bm(o).catch(()=>null);if(i)if(i.isDirectory()){let a=await this.findSessionFiles(o);r.push(...a)}else s.endsWith(".jsonl")&&r.push(o)}return r}extractSessionIdFromFilename(e){let r=L0(e,".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(e){let r=await Le(e,30),n=await xe(e),s=this.extractSessionIdFromFilename(e),o="",i,a,l,c,u,d,f;for(let p of r){if(p.type==="session_meta"&&p.payload&&(p.payload.id&&(s=p.payload.id),p.payload.cwd&&(o=p.payload.cwd),p.payload.cli_version&&(i=p.payload.cli_version),p.payload.timestamp&&(l=new Date(p.payload.timestamp)),p.payload.originator&&(d=p.payload.originator),p.payload.source&&(f=p.payload.source)),p.type==="turn_context"&&p.payload&&(p.payload.model&&(a=p.payload.model),!o&&p.payload.cwd&&(o=p.payload.cwd)),p.type==="event_msg"&&p.payload?.type==="user_message"){let h=p.payload.message||p.payload.text;h&&(c||(c=V(h.trim(),80)),u=V(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=V(h.text.trim(),80)),u=V(h.text.trim(),80))}}if(!o)return null;let m=await Hm(e);return{provider:"codex",sessionId:s,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:qm(d,f),firstUserMessage:c,lastUserMessage:u,messageCount:m.messageCount,filePath:e,totalInputTokens:m.totalInputTokens||void 0,totalCachedInputTokens:m.totalCachedInputTokens||void 0,totalOutputTokens:m.totalOutputTokens||void 0,totalReasoningOutputTokens:m.totalReasoningOutputTokens||void 0,lastInputTokens:m.lastTokenUsage?.inputTokens||void 0,lastTokenUsage:m.lastTokenUsage,modelContextWindow:m.modelContextWindow}}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n=await xe(r),s=[],o="",i,a,l,c,u,d=e,f,m=new Set;for await(let h of Fe(r)){let g=h.timestamp?new Date(h.timestamp):new Date;if(h.type==="session_meta"&&h.payload){h.payload.id&&(d=h.payload.id),h.payload.cwd&&(o=h.payload.cwd),h.payload.cli_version&&(i=h.payload.cli_version),h.payload.timestamp&&(l=new Date(h.payload.timestamp)),f=qm(h.payload.originator,h.payload.source);continue}if(h.type==="turn_context"&&h.payload){h.payload.model&&(a=h.payload.model),!o&&h.payload.cwd&&(o=h.payload.cwd);continue}if(h.type==="response_item"&&h.payload){let _=h.payload;if(_.type==="message"){if(_.role==="user"&&_.content){for(let T of _.content)if(T.type==="input_text"&&typeof T.text=="string"&&T.text){let E=T.text.trim();c||(c=V(E,80)),u=V(E,80),qn(s,m,{role:"user",timestamp:g,content:de(E)})}continue}if(_.role==="assistant"&&_.content){for(let T of _.content)T.type==="output_text"&&typeof T.text=="string"&&T.text&&qn(s,m,{role:"assistant",timestamp:g,content:de(T.text),model:a});continue}if(_.role!=="user"&&_.role!=="assistant"&&_.content){for(let T of _.content)(T.type==="input_text"||T.type==="output_text")&&typeof T.text=="string"&&T.text&&qn(s,m,{role:"system",timestamp:g,content:de(T.text.trim())});continue}}if(_.type==="function_call"){s.push({role:"tool_use",timestamp:g,content:_.name||"unknown tool",toolName:_.name,toolInput:_.arguments!==void 0?de(po(_.arguments)):void 0,toolCallId:_.call_id});continue}if(_.type==="function_call_output"){s.push({role:"tool_result",timestamp:g,content:de(po(_.output)),toolCallId:_.call_id});continue}if(_.type==="reasoning"&&_.summary){let T=_.summary.map(E=>po(E.text)).join(`
993
+ `);T.trim()&&qn(s,m,{role:"thinking",timestamp:g,content:de(T)});continue}}if(h.type==="event_msg"&&h.payload&&h.payload.type==="agent_reasoning"){let _=h.payload.message||h.payload.text;_&&qn(s,m,{role:"thinking",timestamp:g,content:de(_)})}}if(!o)return null;let p=await Hm(r);return{provider:"codex",sessionId:d,cwd:o,createdAt:l||n.createdAt,modifiedAt:n.modifiedAt,model:a,cliVersion:i,startCommand:f,firstUserMessage:c,lastUserMessage:u,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(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await O0(r),!0):!1}async resolveSessionFile(e){let r=await this.getSessionsDirs(),n=[];for(let o of r){let i=await this.findSessionFiles(o);n.push(...i)}for(let o of n)if(this.extractSessionIdFromFilename(o)===e)return o;let s=[];for(let o of n)this.extractSessionIdFromFilename(o).startsWith(e)&&s.push(o);if(s.length===1)return s[0];for(let o of n){let i=await Le(o,1);if(i.length>0&&i[0].type==="session_meta"){let a=i[0].payload?.id;if(a===e||a&&a.startsWith(e))return o}}return null}}});function Nl(t){return new xl(t)}var xl,$l=b(()=>{"use strict";Jm();Gt();wr();xt();xl=class extends Oe{constructor(e){super({provider:new ho(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append"},binary:"codex",seedArgs:["exec","--dangerously-bypass-approvals-and-sandbox","--skip-git-repo-check","-"],seedStdin:`${Ne}
1006
994
  `,resumeTemplate:"codex resume {{session_id}}",startTemplate:"codex",transport:Wm})}seedArgsFor(e){let r=super.seedArgsFor(e);return e?.model?[...r.slice(0,-1),"--model",e.model,r[r.length-1]]:r}}});function Hn(t){if(!t.trim())return"unknown";let e=t.split(/\r?\n/).filter(n=>n.trim().length>0);if(e.length>1)try{let n=JSON.parse(e[0]);if(n!==null&&typeof n=="object"&&!Array.isArray(n)&&"kind"in n)return"jsonl"}catch{}let r;try{r=JSON.parse(t)}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 _o(t){let e=Hn(t);if(e==="unknown")throw new Error("gemini session content matches neither known format (old .json with messages[] or new .jsonl with kind metadata)");if(e==="json"){let a=JSON.parse(t);return{sessionId:a.sessionId,projectHash:a.projectHash,startTime:a.startTime,lastUpdated:a.lastUpdated,kind:a.kind,messages:Array.isArray(a.messages)?a.messages:[]}}let r=t.split(`
1007
995
  `).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 o=[],i=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 u=c;if(typeof u.id=="string"){let d=i.get(u.id);d?D0(d,u):(o.push(u),i.set(u.id,u))}else o.push(u)}}return{sessionId:typeof s.sessionId=="string"?s.sessionId:void 0,projectHash:typeof s.projectHash=="string"?s.projectHash:void 0,startTime:typeof s.startTime=="string"?s.startTime:void 0,lastUpdated:typeof s.lastUpdated=="string"?s.lastUpdated:void 0,kind:typeof s.kind=="string"?s.kind:void 0,messages:o}}function D0(t,e){for(let[r,n]of Object.entries(e))if(n!==void 0){if(r==="tokens"&&Xm(t.tokens)&&Xm(n)){t.tokens={...t.tokens,...n};continue}t[r]=n}}function Xm(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Gm(t,e){if(e==="json")return JSON.stringify(t,null,2);let{messages:r,...n}=t,s=[JSON.stringify(n)];for(let o of r)s.push(JSON.stringify(o));return s.join(`
1008
996
  `)+`
1009
- `}var jl=b(()=>{"use strict"});import{createHash as P0}from"node:crypto";import{readdir as Jn,readFile as Vm,stat as go,unlink as F0}from"node:fs/promises";import{join as He,basename as U0,dirname as W0}from"node:path";import{cwd as B0}from"node:process";function Km(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ym(t){return t==="user"}function Al(t){return t==="gemini"||t==="assistant"}function Er(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function q0(t){return`${t.sessionId}\0${t.cwd}`}function H0(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function wo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function zm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Al(a.type)||!a.tokens)continue;let l=wo(a.tokens.input),c=wo(a.tokens.cached),u=Math.max(l-c,0),d=wo(a.tokens.output),f=wo(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function J0(t){return P0("sha256").update(t).digest("hex")}function Xn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=W0(r);if(n===r)break;r=n}}var yo,Zm=b(()=>{"use strict";Jt();jl();je();yo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>He(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=q0(s),i=r.get(o);r.set(o,i?H0(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await Ne(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=Er(g.timestamp),T=g.type,E=de(Km(g.content));if(Ym(T)){let $=E.trim();$&&(u||(u=V($,80)),d=V($,80)),o.push({role:"user",timestamp:_,content:$||E});continue}if(Al(T)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let N=[$.subject,$.description].filter(Boolean).join(`
1010
- `).trim();N&&o.push({role:"thinking",timestamp:Er($.timestamp,_),content:de(N)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=Er(n.startTime,s.createdAt),p=Er(n.lastUpdated,s.modifiedAt),h=zm(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.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:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await Ne(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(Ym(m.type)){d++;let p=Km(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else Al(m.type)&&(d++,m.model&&(u=m.model));let f=zm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Er(r.startTime,n.createdAt),modifiedAt:Er(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await Vm(e,"utf-8");if(Hn(r)==="unknown")return Z({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return _o(r)}catch{return null}}extractSessionIdFromFilename(e){let r=U0(e).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 e=[],r;try{r=await Jn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await F0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await Ne(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Er(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Xn(e,B0());for(let n of this.extraWorkspacePaths)Xn(e,n);for(let n of await this.collectGeminiProjectPaths())Xn(e,n);for(let n of await this.collectCodexCwds())Xn(e,n);for(let n of await this.collectClaudeCwds())Xn(e,n);let r=new Map;for(let n of e)r.set(J0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Vm(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Jn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await go(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Jn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await go(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as X0,writeFileSync as G0,mkdirSync as V0}from"node:fs";import{join as K0,dirname as Y0}from"node:path";import{randomUUID as z0}from"node:crypto";function Ol(t){return new Rl(t)}var Rl,Ll=b(()=>{"use strict";Zm();Gt();yr();Nt();jl();Rl=class extends Oe{constructor(e){super({provider:new yo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",xe,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Jr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
997
+ `}var jl=b(()=>{"use strict"});import{createHash as P0}from"node:crypto";import{readdir as Jn,readFile as Vm,stat as go,unlink as F0}from"node:fs/promises";import{join as He,basename as U0,dirname as W0}from"node:path";import{cwd as B0}from"node:process";function Km(t){return t?typeof t=="string"?t:Array.isArray(t)?t.map(e=>e.text||"").join(""):"":""}function Ym(t){return t==="user"}function Al(t){return t==="gemini"||t==="assistant"}function Er(t,e=new Date(0)){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function q0(t){return`${t.sessionId}\0${t.cwd}`}function H0(t,e){let r=t.filePaths??[t.filePath],n=e.filePaths??[e.filePath],s=[...new Set([...r,...n])],o=e.modifiedAt.getTime()>=t.modifiedAt.getTime()?e:t;return{...o,createdAt:t.createdAt.getTime()<=e.createdAt.getTime()?t.createdAt:e.createdAt,modifiedAt:o.modifiedAt,filePath:o.filePath,filePaths:s}}function yo(t){let e=Number(t??0);return Number.isFinite(e)?Math.max(0,Math.round(e)):0}function zm(t){let e=0,r=0,n=0,s=0,o=0,i;for(let a of t){if(!Al(a.type)||!a.tokens)continue;let l=yo(a.tokens.input),c=yo(a.tokens.cached),u=Math.max(l-c,0),d=yo(a.tokens.output),f=yo(a.tokens.thoughts);e+=l,r+=c,n+=d,s+=f,o=l,i={inputTokens:u,cachedInputTokens:c,cacheWriteInputTokens:0,outputTokens:d,reasoningOutputTokens:f,totalTokens:l+d+f}}return{totalInputTokens:e,totalCachedInputTokens:r,totalOutputTokens:n,totalReasoningOutputTokens:s,lastInputTokens:o,lastTokenUsage:i}}function J0(t){return P0("sha256").update(t).digest("hex")}function Xn(t,e){let r=e;for(;r&&!t.has(r);){t.add(r);let n=W0(r);if(n===r)break;r=n}}var wo,Zm=b(()=>{"use strict";Jt();jl();je();wo=class{name="gemini";workspaceHashMap;geminiProjectsFile;geminiTmpDir;claudeProjectsDir;codexSessionDirs;extraWorkspacePaths;constructor(e={}){let r=e.geminiDir||He(Te,".gemini");this.geminiProjectsFile=He(r,"projects.json"),this.geminiTmpDir=He(r,"tmp");let n=e.claudeDir||He(Te,".claude");this.claudeProjectsDir=He(n,"projects");let s=[He(Te,".codex"),He(Te,".code")],o=e.codexDirs&&e.codexDirs.length>0?e.codexDirs:[e.codexDir||s[0],e.codeDir||s[1]];this.codexSessionDirs=[...new Set(o)].map(i=>He(i,"sessions")),this.extraWorkspacePaths=e.extraWorkspacePaths||[]}getWatchPaths(){return[{directory:this.geminiTmpDir,filePattern:/\.jsonl?$/}]}async discoverSessions(){let e=await this.findSessionFiles(),r=new Map;for(let n of e)try{let s=await this.extractSummary(n);if(!s)continue;let o=q0(s),i=r.get(o);r.set(o,i?H0(i,s):s)}catch{}return[...r.values()]}async loadSession(e){let r=await this.resolveSessionFile(e);if(!r)return null;let n;try{n=await this.readSessionFile(r)}catch{return null}if(!n)return null;let s=await xe(r),o=[],i=n.messages||[],a=n.sessionId||this.extractSessionIdFromFilename(r),l=n.projectHash||"",c=await this.resolveWorkspace(l),u,d,f;for(let g of i){let _=Er(g.timestamp),T=g.type,E=de(Km(g.content));if(Ym(T)){let $=E.trim();$&&(u||(u=V($,80)),d=V($,80)),o.push({role:"user",timestamp:_,content:$||E});continue}if(Al(T)){g.model&&(f=g.model);for(let $ of g.thoughts||[]){let x=[$.subject,$.description].filter(Boolean).join(`
998
+ `).trim();x&&o.push({role:"thinking",timestamp:Er($.timestamp,_),content:de(x)})}o.push({role:"assistant",timestamp:_,content:E,model:g.model});continue}let k=T?`[${T}] `:"";o.push({role:"system",timestamp:_,content:`${k}${E}`.trim()})}let m=Er(n.startTime,s.createdAt),p=Er(n.lastUpdated,s.modifiedAt),h=zm(i);return{provider:"gemini",sessionId:a,cwd:c,createdAt:m,modifiedAt:p,model:f,startCommand:"gemini",firstUserMessage:u,lastUserMessage:d,messageCount:o.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:o}}async extractSummary(e){let r=await this.readSessionFile(e);if(!r)return null;let n=await xe(e),s=r.messages||[],o=r.sessionId||this.extractSessionIdFromFilename(e),i=r.projectHash||"",a=await this.resolveWorkspace(i),l,c,u,d=0;for(let m of s)if(Ym(m.type)){d++;let p=Km(m.content).trim();p&&(l||(l=V(de(p),80)),c=V(de(p),80))}else Al(m.type)&&(d++,m.model&&(u=m.model));let f=zm(s);return{provider:"gemini",sessionId:o,cwd:a,createdAt:Er(r.startTime,n.createdAt),modifiedAt:Er(r.lastUpdated,n.modifiedAt),model:u,startCommand:"gemini",firstUserMessage:l,lastUserMessage:c,messageCount:d,filePath:e,totalInputTokens:f.totalInputTokens||void 0,totalCachedInputTokens:f.totalCachedInputTokens||void 0,totalOutputTokens:f.totalOutputTokens||void 0,totalReasoningOutputTokens:f.totalReasoningOutputTokens||void 0,lastInputTokens:f.lastInputTokens||void 0,lastTokenUsage:f.lastTokenUsage}}async readSessionFile(e){let r=await Vm(e,"utf-8");if(Hn(r)==="unknown")return Z({event:"gemini_session_format_unknown",provider:"gemini",file:e,preview:r.slice(0,120),message:`gemini session file at ${e} matches neither old (.json with messages[]) nor new (.jsonl with kind metadata) format. Skipping; lmctl ls / audit / stats will not see this session.`}),null;try{return _o(r)}catch{return null}}extractSessionIdFromFilename(e){let r=U0(e).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 e=[],r;try{r=await Jn(this.geminiTmpDir)}catch{return e}for(let n of r){let s=He(this.geminiTmpDir,n,"chats");if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i)a.startsWith("session-")&&(!a.endsWith(".json")&&!a.endsWith(".jsonl")||e.push(He(s,a)))}return e}async resolveSessionPath(e){return this.resolveSessionFile(e)}async deleteSession(e){let r=await this.resolveSessionFile(e);return r?(await F0(r),!0):!1}async resolveSessionFile(e){let r=await this.findSessionFiles(),n=[];for(let s of r){let o=await this.readSessionFile(s).catch(()=>null),i=this.extractSessionIdFromFilename(s),a=o?.sessionId||i,l=a===e||a.startsWith(e),c=i===e||i.startsWith(e)||i.length>=8&&e.startsWith(i);if(!l&&!c)continue;let u=await xe(s).catch(()=>({createdAt:new Date(0),modifiedAt:new Date(0)}));n.push({filePath:s,modifiedAt:Er(o?.lastUpdated,u.modifiedAt)})}return n.sort((s,o)=>{let i=o.modifiedAt.getTime()-s.modifiedAt.getTime();return i!==0?i:o.filePath.localeCompare(s.filePath)}),n[0]?.filePath??null}async resolveWorkspace(e){return e?(await this.getWorkspaceHashMap()).get(e)||`[hash:${e.slice(0,16)}]`:"(unknown workspace)"}async getWorkspaceHashMap(){if(this.workspaceHashMap)return this.workspaceHashMap;let e=new Set;Xn(e,B0());for(let n of this.extraWorkspacePaths)Xn(e,n);for(let n of await this.collectGeminiProjectPaths())Xn(e,n);for(let n of await this.collectCodexCwds())Xn(e,n);for(let n of await this.collectClaudeCwds())Xn(e,n);let r=new Map;for(let n of e)r.set(J0(n),n);return this.workspaceHashMap=r,r}async collectGeminiProjectPaths(){let e;try{e=await Vm(this.geminiProjectsFile,"utf-8")}catch{return[]}try{let n=JSON.parse(e).projects;return!n||typeof n!="object"||Array.isArray(n)?[]:Object.keys(n)}catch{return[]}}async collectCodexCwds(){let e=new Set;for(let r of this.codexSessionDirs){let n=await this.findJsonlFiles(r);for(let s of n){let i=(await Le(s,1).catch(()=>[]))[0]?.payload?.cwd;i&&e.add(i)}}return[...e]}async collectClaudeCwds(){let e=new Set,r;try{r=await Jn(this.claudeProjectsDir)}catch{return[]}for(let n of r){let s=He(this.claudeProjectsDir,n);if(!(await go(s).catch(()=>null))?.isDirectory())continue;let i;try{i=await Jn(s)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=He(s,a),u=(await Le(l,1).catch(()=>[]))[0]?.cwd;u&&e.add(u)}}return[...e]}async findJsonlFiles(e){let r=[];if(!(await go(e).catch(()=>null))?.isDirectory())return r;let s;try{s=await Jn(e)}catch{return r}for(let o of s){let i=He(e,o),a=await go(i).catch(()=>null);if(a)if(a.isDirectory()){let l=await this.findJsonlFiles(i);r.push(...l)}else o.endsWith(".jsonl")&&r.push(i)}return r}}});import{readFileSync as X0,writeFileSync as G0,mkdirSync as V0}from"node:fs";import{join as K0,dirname as Y0}from"node:path";import{randomUUID as z0}from"node:crypto";function Ol(t){return new Rl(t)}var Rl,Ll=b(()=>{"use strict";Zm();Gt();wr();xt();jl();Rl=class extends Oe{constructor(e){super({provider:new wo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!0,forkSupport:"automatic",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"skill-file",leaderSetupHint:"Place skill files in the project's .gemini/ directory"},binary:"gemini",seedArgs:["-p",Ne,"-y","--skip-trust"],resumeTemplate:"gemini --resume {{session_id}} --skip-trust",startTemplate:"gemini --skip-trust",transport:(r,n)=>Jr(r,{...n,acpTool:"gemini"})})}forkHint(e){return["Gemini fork: copies the session file with a new ID.","The forked session has the same conversation history","but diverges from that point forward."].join(`
1011
999
  `)}manualSeedHint(e){return{launchCommand:`cd ${e} && gemini --skip-trust`,postLaunchNote:no,lsCommand:`lmctl ls --provider gemini --sessiondir ${e}`}}async fork(e,r){let n=await this.resolvePath(e);if(!n)return{success:!1,error:`Session file not found for ${e}`};try{let s=X0(n,"utf-8"),o=Hn(s),i=_o(s),a=z0();i.sessionId=a,i.kind="main";let l=Y0(n),c=new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),u=o==="jsonl"?".jsonl":".json",d=`session-${c}-${a.slice(0,8)}${u}`,f=K0(l,d);return V0(l,{recursive:!0}),G0(f,Gm(i,o),"utf-8"),{success:!0,sessionId:a,filePath:f}}catch(s){return{success:!1,error:s instanceof Error?s.message:String(s)}}}}});import{readdir as Qm,readFile as Z0,rm as Q0,stat as Xr}from"node:fs/promises";import{basename as eI,join as at}from"node:path";function tI(t){let e={};for(let r of t.split(`
1012
- `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function br(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function rI(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Eo,ep=b(()=>{"use strict";Jt();Eo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||at(Te,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qm(this.sessionStateDir)}catch{return e}for(let n of r){let s=at(this.sessionStateDir,n);if((await Xr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=at(r,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(r,"workspace.yaml"),a=await Ne(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||eI(r)||e;if(o)for await(let _ of Fe(s)){let T=br(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=br(_.data.startTime)),_.data.selectedModel&&(u=_.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){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",k=E.trim();k&&(m||(m=V(k,80)),p=V(k,80)),l.push({role:"user",timestamp:T,content:de(k||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:T,content:de(E),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let E=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:de(E),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:T,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=V(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=at(e,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(e,"workspace.yaml"),a=await Ne(o?s:e),l=o?await Le(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,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=br(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=V(T,80)),h=V(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=V(_,80))}let g=o?await rI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=at(e,"workspace.yaml");try{let n=await Z0(r,"utf-8");return tI(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Q0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Qm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=at(this.sessionStateDir,e);if((await Xr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=at(this.sessionStateDir,s);(await Xr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=at(this.sessionStateDir,s);if(!(await Xr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function Cl(t){return new Oe({provider:new Eo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",xe,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Jr(e,{...r,acpTool:"copilot"})})}var Ml=b(()=>{"use strict";ep();Gt();yr();Nt()});import{existsSync as tp}from"node:fs";import{join as bo}from"node:path";import{createRequire as nI}from"node:module";function rp(){return Dl===null&&(Dl=nI(import.meta.url)("node:sqlite").DatabaseSync),Dl}function sI(){let t=process.env.XDG_DATA_HOME||bo(Te,".local","share"),e=process.env.XDG_CONFIG_HOME||bo(Te,".config");return[bo(t,"opencode","opencode.db"),bo(e,"opencode","opencode.db")]}var Dl,So,np=b(()=>{"use strict";Jt();Dl=null;So=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=sI().find(r=>tp(r))??null}openDb(){return!this.dbPath||!tp(this.dbPath)?null:new(rp())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1000
+ `)){let n=r.match(/^(\w+):\s*(.*)$/);n&&(e[n[1]]=n[2].trim())}return{id:e.id,cwd:e.cwd,summary_count:e.summary_count?parseInt(e.summary_count,10):void 0,created_at:e.created_at,updated_at:e.updated_at,summary:e.summary}}function br(t){if(!t)return;let e=new Date(t);return Number.isNaN(e.getTime())?void 0:e}async function rI(t){let e=0;for await(let r of Fe(t))(r.type==="user.message"||r.type==="assistant.message"&&(r.data?.content||"").trim())&&e++;return e}var Eo,ep=b(()=>{"use strict";Jt();Eo=class{name="copilot";sessionStateDir;constructor(e={}){let r=e.copilotDir||at(Te,".copilot");this.sessionStateDir=at(r,"session-state")}getWatchPaths(){return[{directory:this.sessionStateDir,filePattern:/events\.jsonl$/}]}async discoverSessions(){let e=[],r;try{r=await Qm(this.sessionStateDir)}catch{return e}for(let n of r){let s=at(this.sessionStateDir,n);if((await Xr(s).catch(()=>null))?.isDirectory())try{let i=await this.extractSummary(s,n);i&&e.push(i)}catch{}}return e}async loadSession(e){let r=await this.resolveSessionDir(e);if(!r)return null;let n=await this.readWorkspaceYaml(r),s=at(r,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(r,"workspace.yaml"),a=await xe(o?s:r),l=[],c=n?.cwd||"(unknown workspace)",u,d,f,m,p,h,g=n?.id||eI(r)||e;if(o)for await(let _ of Fe(s)){let T=br(_.timestamp)||a.modifiedAt;if(_.type==="session.start"&&_.data){_.data.sessionId&&(g=_.data.sessionId),_.data.copilotVersion&&(d=_.data.copilotVersion),_.data.startTime&&(h=br(_.data.startTime)),_.data.selectedModel&&(u=_.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){u=_.data.newModel;continue}if(_.type==="user.message"&&_.data){let E=_.data.content||"",k=E.trim();k&&(m||(m=V(k,80)),p=V(k,80)),l.push({role:"user",timestamp:T,content:de(k||E)});continue}if(_.type==="assistant.message"&&_.data){let E=(_.data.content||"").trim();if(E&&l.push({role:"assistant",timestamp:T,content:de(E),model:u}),_.data.toolRequests)for(let k of _.data.toolRequests)l.push({role:"tool_use",timestamp:T,content:k.name||"unknown tool",toolName:k.name,toolInput:k.arguments?JSON.stringify(k.arguments,null,2):void 0,toolCallId:k.toolCallId});continue}if(_.type==="tool.execution_complete"&&_.data){let E=_.data.result?.content||"",k=_.data.result?.detailedContent||"";l.push({role:"tool_result",timestamp:T,content:de(E),toolDetailedContent:k?de(k):void 0,toolCallId:_.data.toolCallId});continue}if(_.type==="assistant.reasoning"&&_.data?.content){l.push({role:"thinking",timestamp:T,content:de(_.data.content)});continue}if(_.type==="session.error"||_.type==="session.warning"||_.type==="session.info"||_.type==="system.message"){let E=_.data?.message||"";E.trim()&&l.push({role:"system",timestamp:T,content:de(E)});continue}}if(!m){let _=(n?.summary||"").trim();_&&(m=V(_,80))}return{provider:"copilot",sessionId:g,cwd:c,createdAt:h??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:u,cliVersion:d,startCommand:"copilot",gitBranch:f,firstUserMessage:m,lastUserMessage:p,messageCount:l.filter(_=>_.role==="user"||_.role==="assistant").length,filePath:i,messages:l}}async extractSummary(e,r){let n=await this.readWorkspaceYaml(e),s=at(e,"events.jsonl"),o=await Xr(s).catch(()=>null),i=o?s:at(e,"workspace.yaml"),a=await xe(o?s:e),l=o?await Le(s,20):[],c=n?.id||r,u=n?.cwd||"(unknown workspace)",d,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=br(_.data.startTime)),_.data.selectedModel&&(d=_.data.selectedModel),_.data.context?.cwd&&(u=_.data.context.cwd)),_.type==="session.model_change"&&_.data?.newModel&&(d||(d=_.data.newModel)),_.type==="user.message"&&_.data){let T=(_.data.content||"").trim();T&&(p||(p=V(T,80)),h=V(T,80))}if(!p){let _=(n?.summary||"").trim();_&&(p=V(_,80))}let g=o?await rI(s):0;return{provider:"copilot",sessionId:c,cwd:u,createdAt:m??br(n?.created_at)??a.createdAt,modifiedAt:br(n?.updated_at)??a.modifiedAt,model:d,cliVersion:f,startCommand:"copilot",firstUserMessage:p,lastUserMessage:h,messageCount:g,filePath:i}}async readWorkspaceYaml(e){let r=at(e,"workspace.yaml");try{let n=await Z0(r,"utf-8");return tI(n)}catch{return null}}async resolveSessionPath(e){return this.resolveSessionDir(e)}async deleteSession(e){let r=await this.resolveSessionDir(e);return r?(await Q0(r,{recursive:!0}),!0):!1}async resolveSessionDir(e){let r;try{r=await Qm(this.sessionStateDir)}catch{return null}if(r.includes(e)){let s=at(this.sessionStateDir,e);if((await Xr(s).catch(()=>null))?.isDirectory())return s}let n=[];for(let s of r)if(s.startsWith(e)){let o=at(this.sessionStateDir,s);(await Xr(o).catch(()=>null))?.isDirectory()&&n.push(o)}if(n.length===1)return n[0];for(let s of r){let o=at(this.sessionStateDir,s);if(!(await Xr(o).catch(()=>null))?.isDirectory())continue;let a=await this.readWorkspaceYaml(o);if(a&&(a.id===e||a.id?.startsWith(e)))return o}return null}}});function Cl(t){return new Oe({provider:new Eo(t),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"copilot",seedArgs:["-p",Ne,"--yolo"],resumeTemplate:"copilot --resume={{session_id}}",startTemplate:"copilot",transport:(e,r)=>Jr(e,{...r,acpTool:"copilot"})})}var Ml=b(()=>{"use strict";ep();Gt();wr();xt()});import{existsSync as tp}from"node:fs";import{join as bo}from"node:path";import{createRequire as nI}from"node:module";function rp(){return Dl===null&&(Dl=nI(import.meta.url)("node:sqlite").DatabaseSync),Dl}function sI(){let t=process.env.XDG_DATA_HOME||bo(Te,".local","share"),e=process.env.XDG_CONFIG_HOME||bo(Te,".config");return[bo(t,"opencode","opencode.db"),bo(e,"opencode","opencode.db")]}var Dl,So,np=b(()=>{"use strict";Jt();Dl=null;So=class{name="opencode";dbPath;constructor(e){e?.dbPath?this.dbPath=e.dbPath:this.dbPath=sI().find(r=>tp(r))??null}openDb(){return!this.dbPath||!tp(this.dbPath)?null:new(rp())(this.dbPath,{open:!0,readOnly:!0})}async discoverSessions(){let e=this.openDb();if(!e)return[];try{let r=new Map,n=e.prepare("SELECT id, worktree, name FROM project").all();for(let i of n)r.set(i.id,i);let s=e.prepare(`SELECT s.id, s.project_id, s.slug, s.directory, s.title, s.version,
1013
1001
  s.time_created, s.time_updated
1014
1002
  FROM session s
1015
1003
  ORDER BY s.time_updated DESC`).all(),o=[];for(let i of s){let a=r.get(i.project_id),l=i.directory||a?.worktree||"(unknown)",c=e.prepare(`SELECT m.id, m.data, m.time_created FROM message m
@@ -1022,9 +1010,9 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
1022
1010
  FROM session s
1023
1011
  WHERE s.id LIKE ?
1024
1012
  ORDER BY s.time_updated DESC
1025
- LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Fl(){return new Pl}var Pl,Ul=b(()=>{"use strict";np();Gt();yr();Nt();Pl=class extends Oe{constructor(){super({provider:new So,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",xe],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Jr(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??xe),r}}});import{readdir as To,readFile as oI,rm as iI}from"node:fs/promises";import{basename as sp,join as zt}from"node:path";function op(t){return t.type==="user"||t.message?.role==="user"}function ip(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ap(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1013
+ LIMIT 2`).all(`${r}%`);return s.length!==1?null:s[0]}}});function Fl(){return new Pl}var Pl,Ul=b(()=>{"use strict";np();Gt();wr();xt();Pl=class extends Oe{constructor(){super({provider:new So,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",Ne],resumeTemplate:"opencode --session {{session_id}}",startTemplate:"opencode",transport:(e,r)=>Jr(e,{...r,acpTool:"opencode"})})}seedArgsFor(e){let r=["run"];return e?.model&&r.push("--model",e.model),e?.effort&&r.push("--variant",e.effort),r.push(e?.prompt??Ne),r}}});import{readdir as To,readFile as oI,rm as iI}from"node:fs/promises";import{basename as sp,join as zt}from"node:path";function op(t){return t.type==="user"||t.message?.role==="user"}function ip(t){return t.type==="assistant"||t.message?.role==="assistant"||t.message?.role==="model"}function ap(t){let e=t.message;return e?typeof e.content=="string"?e.content:Array.isArray(e.content)?e.content.filter(r=>r.type==="text").map(r=>r.text||"").join(`
1026
1014
  `):Array.isArray(e.parts)?e.parts.filter(r=>!r.thought&&r.type!=="thinking").map(r=>r.text||"").join(`
1027
- `):"":""}function lp(t){return t.model||t.message?.model}var ko,cp=b(()=>{"use strict";Jt();ko=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||zt(Te,".qwen")}async discoverSessions(){let e=zt(this.baseDir,"projects"),r;try{r=await To(e)}catch{return[]}let n=[];for(let s of r){let o=zt(e,s,"chats"),i;try{i=await To(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=zt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await Ne(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),op(d)){let f=ap(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(ip(d)){let f=lp(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=sp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await Ne(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Fe(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(op(f)){let h=ap(f);h.trim()&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ip(f)){let h=lp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.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;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.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:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=zt(this.baseDir,"projects");try{let n=await To(r),s=[];for(let o of n){let i=zt(r,o,"chats",`${e}.jsonl`);try{return await oI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=zt(r,o,"chats"),a;try{a=await To(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;sp(l,".jsonl").startsWith(e)&&s.push(zt(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await iI(r),!0}catch{return!1}}}});function Bl(){return new Wl}var Wl,ql=b(()=>{"use strict";cp();Gt();yr();Nt();Wl=class extends Oe{constructor(){super({provider:new ko,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",xe,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mo})}}});import{readdir as up,readFile as aI,rm as dp,stat as fp}from"node:fs/promises";import{basename as Hl,join as At}from"node:path";async function lI(t){let e=await Promise.all(t.map(r=>Ne(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function cI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function mp(t){return t.type==="USER_INPUT"}function pp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function uI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function hp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function _p(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function dI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function fI(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=mI(s);if(o)return o}let n=pI(e.content);if(n)return n}return null}function mI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function pI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function gp(t){if(t.endsWith(".db"))return Hl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var vo,wp=b(()=>{"use strict";Jt();vo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||At(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:At(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=At(this.baseDir,"conversations"),r;try{r=await up(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Hl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return At(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return At(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await fp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await lI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=_p(f.content);if(m&&(a=m),mp(f)){let p=hp(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else pp(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=gp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Fe(o)){let d=cI(u.created_at,s.modifiedAt),f=_p(u.content);if(f&&(a=f),mp(u)){let m=hp(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:dI(m.args),toolName:m.name||"tool"});pp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):uI(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await fp(r),r}catch{}let n=At(this.baseDir,"conversations");try{let s=[];for(let o of await up(n)){if(!o.endsWith(".db"))continue;Hl(o,".db").startsWith(e)&&s.push(At(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=gp(r);return n?(await dp(this.conversationPath(n),{force:!0}),await dp(At(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await fI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=At(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await aI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as hI}from"node:child_process";function Xl(t){return new Jl(t)}async function _I(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",wI(e.timeoutMs)];e.model&&n.push("--model",e.model),Vt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await gI(e.binary,n,{cwd:e.cwd,env:Ke(e.env,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function gI(t,e,r){return new Promise((n,s)=>{let o;try{o=hI(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function wI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Jl,Gl=b(()=>{"use strict";wp();Gt();Nt();Xt();Un();Jl=class extends Oe{constructor(e){super({provider:new vo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",xe,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:_I})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as yI}from"node:crypto";import{join as EI}from"node:path";function bI(t){return yI("sha256").update(t).digest("hex").slice(0,8)}function SI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function TI(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function kI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Io(t){return Math.max(1,Math.ceil(t.length/4))}function yp(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Yl(){return new Kl}var Sr,Vl,Kl,zl=b(()=>{"use strict";Sr=new Map;Vl=class{name="ClaudeMock";async discoverSessions(){return[...Sr.values()].map(yp)}async loadSession(e){let r=Sr.get(e);return r===void 0?null:{...yp(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Sr.get(e)?.filePath??null}async deleteSession(e){return Sr.delete(e)}},Kl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Vl;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=SI(TI(e,r)),s=`mock-${n}-${bI(`${e}:${n}`)}`,o=new Date,i=Sr.get(s),a=r?.prompt??"ClaudeMock seed",l=Io(a),c={sessionId:s,cwd:e,filePath:EI(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Io("ACK: ClaudeMock seeded"),Sr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Sr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${kI(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Io(e),s.totalOutputTokens+=Io(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function gt(t){let e=[vl({claudeDir:t?.claudeDir}),xl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ol({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Cl({copilotDir:t?.copilotDir}),Fl(),Bl(),Xl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Yl()),e}var Zl=b(()=>{"use strict";Il();$l();Ll();Ml();Ul();ql();Gl();zl();Il();$l();Ll();Ml();Ul();ql();Gl();zl()});var rc={};ce(rc,{ProviderRegistry:()=>Fn,TransportConnectionError:()=>ye,TransportError:()=>Ye,TransportJsonError:()=>so,TransportProcessError:()=>xt,TransportRpcError:()=>$t,_resetDefaultRegistryForTests:()=>vI,chat:()=>Tr,countTokens:()=>tc,createAdapterRegistry:()=>_t,createAllAdapters:()=>gt,listSessions:()=>ec,seed:()=>Ql});function xo(){return No===null&&(No=_t(gt())),No}function vI(){No=null}function bp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Tr(t){let e=t.registry??xo(),r=bp(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.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 Ql(t){let e=t.registry??xo(),r=bp(e,t.provider),n=await Ep(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await Ep(e,t.provider,t.cwd),i=II(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Ep(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function II(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ec(t={}){return(t.registry??xo()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function tc(t){let r=await(t.registry??xo()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var No,Rt=b(()=>{"use strict";pl();Zl();pl();Zl();Br();No=null});function NI(){return nc===null&&(nc=_t(gt())),nc}async function Vr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await $I(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Gr.delete(r),e.setMemberState(r,"idle");else{let i=xI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function xI(t,e){if(!(t instanceof Ee))return Gr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Gr.get(e)??0)+1;return r>=3?(Gr.delete(e),"consecutive_timeouts"):(Gr.set(e,r),null)}return Gr.delete(e),null}async function $I(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=NI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,sc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Sp(u)}`,sc(t.sessionid,t.sessiondir,"unresolved")))}let o=sc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Tr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):jI(u,o)}finally{a!==null&&clearTimeout(a)}}function sc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Sp(t){return t instanceof Error?t.message:String(t)}function jI(t,e){if(t instanceof Ee)return t;if(t instanceof ye){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof xt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new Ee("other",null,t.message,e):new Ee("other",null,Sp(t),e)}var Ee,nc,Gr,Gn=b(()=>{"use strict";Rt();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},nc=null;Gr=new Map});function Tp(){return oc===null&&(oc=_t(gt())),oc}function RI(t,e){if(!AI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Kr(t){let e=RI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await OI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function OI(t){let e=t.member.provider,r=t.member.sessiondir,n=ic("seed",r,e);try{let s=await Ql({provider:e,cwd:r,registry:Tp()});if(!s.success)throw CI(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:ac(s,n)}}async function kp(t){return LI(t)}async function LI(t){let e=Tp(),r=ic("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new ke("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof ke?o:ac(o,r)}let s=ic("tokens",t.sessionid,n);try{let o=await tc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof ke?o:ac(o,s)}}function ic(t,e,r){return["<library>",t,e,"--provider",r]}function CI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,e)}return new ke("other",null,r,e)}function ac(t,e){return t instanceof ke?t:t instanceof ye?t.cause?.code==="ENOENT"?new ke("enoent",null,t.message,e):new ke("other",null,t.message,e):t instanceof xt?new ke("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new ke("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new ke("other",null,t.message,e):new ke("other",null,t instanceof Error?t.message:String(t),e)}var ke,oc,AI,$o=b(()=>{"use strict";Rt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},oc=null;AI=/^provider[123]$/});function jo(t){return Buffer.from(t,"utf8").toString("base64url")}function Kn(t){return Buffer.from(t,"base64url").toString("utf8")}async function vp(t,e=r=>kp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of MI(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Ip(t,e,r){let n=Np(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Vn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Vr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:xp(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function lc(t,e,r){let n=Np(t,e,r);if(n===null)throw new Error("session member not found");let s=await Kr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:xp(t,e,r)}}function MI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function Np(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function xp(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Vn,Ao=b(()=>{"use strict";Gn();$o();Vn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function cc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??PI(e),s=r-n,o=e.query(`
1015
+ `):"":""}function lp(t){return t.model||t.message?.model}var ko,cp=b(()=>{"use strict";Jt();ko=class{name="qwen";baseDir;constructor(e){this.baseDir=e?.qwenDir||zt(Te,".qwen")}async discoverSessions(){let e=zt(this.baseDir,"projects"),r;try{r=await To(e)}catch{return[]}let n=[];for(let s of r){let o=zt(e,s,"chats"),i;try{i=await To(o)}catch{continue}for(let a of i){if(!a.endsWith(".jsonl"))continue;let l=a.replace(/\.jsonl$/,""),c=zt(o,a);try{let u=await this.extractSummary(c,l);u&&n.push(u)}catch{}}}return n}async extractSummary(e,r){let n=await Le(e,30);if(n.length===0)return null;let s=await xe(e),o="(unknown)",i,a,l,c,u=0;for(let d of n){if(d.cwd&&(o=d.cwd,d.version&&(a=d.version)),d.type==="system"&&d.cwd&&(o=d.cwd,d.version&&(a=d.version),d.model&&(i=d.model)),op(d)){let f=ap(d).trim();f&&(l||(l=V(f,80)),c=V(f,80)),u++}if(ip(d)){let f=lp(d);f&&(i=f),u++}}return{provider:"qwen",sessionId:r,cwd:o,createdAt:s.createdAt,modifiedAt:s.modifiedAt,model:i,cliVersion:a,startCommand:"qwen",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:e}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=sp(r,".jsonl");return this.loadFromFile(r,n)}async loadFromFile(e,r){let n=await xe(e),s="(unknown)",o,i,a,l,c,u,d=[];for await(let f of Fe(e)){if(f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.gitBranch&&(a=f.gitBranch)),f.type==="system"&&f.cwd&&(s=f.cwd,f.version&&(i=f.version),f.model&&(o=f.model),f.gitBranch&&(a=f.gitBranch)),!f.message)continue;let m=f.message,p=f.timestamp?new Date(f.timestamp):n.modifiedAt;if(op(f)){let h=ap(f);h.trim()&&(c||(c=V(h.trim(),80)),u=V(h.trim(),80)),d.push({role:"user",timestamp:p,content:h})}else if(ip(f)){let h=lp(f);if(h&&(o=h),Array.isArray(m.content))for(let g of m.content)g.type==="text"&&g.text?d.push({role:"assistant",timestamp:p,content:g.text,model:h}):g.type==="thinking"&&g.thinking&&d.push({role:"thinking",timestamp:p,content:g.thinking});else if(typeof m.content=="string")d.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;_&&d.push({role:"thinking",timestamp:p,content:_})}else g.text&&d.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:o,cliVersion:i,gitBranch:a,startCommand:"qwen",firstUserMessage:c,lastUserMessage:u,messageCount:d.length,filePath:e,messages:d}}async resolveSessionPath(e){let r=zt(this.baseDir,"projects");try{let n=await To(r),s=[];for(let o of n){let i=zt(r,o,"chats",`${e}.jsonl`);try{return await oI(i,{flag:"r"}),i}catch{continue}}for(let o of n){let i=zt(r,o,"chats"),a;try{a=await To(i)}catch{continue}for(let l of a){if(!l.endsWith(".jsonl"))continue;sp(l,".jsonl").startsWith(e)&&s.push(zt(i,l))}}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;try{return await iI(r),!0}catch{return!1}}}});function Bl(){return new Wl}var Wl,ql=b(()=>{"use strict";cp();Gt();wr();xt();Wl=class extends Oe{constructor(){super({provider:new ko,capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!0,canCancel:!0},injection:{leaderMode:"prompt-append"},binary:"qwen",seedArgs:["-p",Ne,"--approval-mode","yolo"],resumeTemplate:"qwen --resume {{session_id}}",startTemplate:"qwen",transport:mo})}}});import{readdir as up,readFile as aI,rm as dp,stat as fp}from"node:fs/promises";import{basename as Hl,join as At}from"node:path";async function lI(t){let e=await Promise.all(t.map(r=>xe(r)));return{createdAt:new Date(Math.min(...e.map(r=>r.createdAt.getTime()))),modifiedAt:new Date(Math.max(...e.map(r=>r.modifiedAt.getTime())))}}function cI(t,e){if(!t)return e;let r=new Date(t);return Number.isNaN(r.getTime())?e:r}function mp(t){return t.type==="USER_INPUT"}function pp(t){return t.source==="MODEL"&&t.type==="PLANNER_RESPONSE"}function uI(t){return t.source==="MODEL"&&t.type!=="PLANNER_RESPONSE"}function hp(t){if(!t)return"";let e=/<USER_REQUEST>\n?([\s\S]*?)\n?<\/USER_REQUEST>/.exec(t);return e?e[1]:t}function _p(t){if(!t)return;let e=/Model Selection` from [^\n]+? to ([^\n]+)/.exec(t);if(e)return e[1].replace(/\. No need\b[\s\S]*$/,"").replace(/\. If reporting\b[\s\S]*$/,"").replace(/\.\s*$/,"").trim()}function dI(t){if(t===void 0)return"";try{return JSON.stringify(t)}catch{return String(t)}}async function fI(t){for await(let e of Fe(t)){let r=e.tool_calls?.map(s=>s.args)??[];for(let s of r){let o=mI(s);if(o)return o}let n=pI(e.content);if(n)return n}return null}function mI(t){if(!t||typeof t!="object"||Array.isArray(t))return null;let e=t,r=e.Cwd??e.cwd??e.DirectoryPath;return typeof r!="string"?null:r.replace(/^"|"$/g,"")}function pI(t){return t?/"Cwd":"([^"]+)"/.exec(t)?.[1]??null:null}function gp(t){if(t.endsWith(".db"))return Hl(t,".db");let e="/brain/",r=t.indexOf(e);return r===-1?null:t.slice(r+e.length).split("/")[0]||null}var vo,yp=b(()=>{"use strict";Jt();vo=class{name="agy";baseDir;constructor(e={}){this.baseDir=e.agyDir||At(Te,".gemini","antigravity-cli")}getWatchPaths(){return[{directory:At(this.baseDir,"conversations"),filePattern:/\.db$/}]}async discoverSessions(){let e=At(this.baseDir,"conversations"),r;try{r=await up(e)}catch{return[]}let n=[];for(let s of r){if(!s.endsWith(".db"))continue;let o=Hl(s,".db");try{let i=await this.extractSummary(o);i&&n.push(i)}catch{}}return n}conversationPath(e){return At(this.baseDir,"conversations",`${e}.db`)}transcriptPath(e){return At(this.baseDir,"brain",e,".system_generated","logs","transcript.jsonl")}async existingTranscriptPath(e){let r=this.transcriptPath(e);try{return await fp(r),r}catch{return null}}async extractSummary(e){let r=this.conversationPath(e),n=await this.existingTranscriptPath(e),s=n??r,o=await lI([r,n].filter(Boolean)),i=await this.resolveCwd(e,n),a,l,c,u=0;if(n){let d=await Le(n,80);for(let f of d){let m=_p(f.content);if(m&&(a=m),mp(f)){let p=hp(f.content).trim();p&&(l||(l=V(p,80)),c=V(p,80)),u++}else pp(f)&&u++}}return{provider:"agy",sessionId:e,cwd:i,createdAt:o.createdAt,modifiedAt:o.modifiedAt,model:a,startCommand:"agy",firstUserMessage:l,lastUserMessage:c,messageCount:u,filePath:s,filePaths:n?[r,n]:[r]}}async loadSession(e){let r=await this.resolveSessionPath(e);if(!r)return null;let n=gp(r);if(!n)return null;let s=await this.extractSummary(n);if(!s)return null;let o=await this.existingTranscriptPath(n),i=[],a=s.model,l=s.firstUserMessage,c=s.lastUserMessage;if(o)for await(let u of Fe(o)){let d=cI(u.created_at,s.modifiedAt),f=_p(u.content);if(f&&(a=f),mp(u)){let m=hp(u.content),p=m.trim();p&&(l||(l=V(p,80)),c=V(p,80)),i.push({role:"user",timestamp:d,content:m});continue}if(Array.isArray(u.tool_calls))for(let m of u.tool_calls)i.push({role:"tool_use",timestamp:d,content:dI(m.args),toolName:m.name||"tool"});pp(u)&&u.content?i.push({role:"assistant",timestamp:d,content:u.content,model:a}):uI(u)&&u.content&&i.push({role:"tool_result",timestamp:d,content:u.content,toolName:u.type?.toLowerCase()}),u.thinking&&i.push({role:"thinking",timestamp:d,content:u.thinking})}return{...s,model:a,firstUserMessage:l,lastUserMessage:c,messageCount:i.length,messages:i}}async resolveSessionPath(e){let r=this.conversationPath(e);try{return await fp(r),r}catch{}let n=At(this.baseDir,"conversations");try{let s=[];for(let o of await up(n)){if(!o.endsWith(".db"))continue;Hl(o,".db").startsWith(e)&&s.push(At(n,o))}if(s.length===1)return s[0]}catch{}return null}async deleteSession(e){let r=await this.resolveSessionPath(e);if(!r)return!1;let n=gp(r);return n?(await dp(this.conversationPath(n),{force:!0}),await dp(At(this.baseDir,"brain",n),{recursive:!0,force:!0}),!0):!1}async resolveCwd(e,r){let n=await this.cwdFromLastConversationCache(e);if(n)return n;if(r){let s=await fI(r);if(s)return s}return"(unknown)"}async cwdFromLastConversationCache(e){let r=At(this.baseDir,"cache","last_conversations.json");try{let n=JSON.parse(await aI(r,"utf8"));for(let[s,o]of Object.entries(n))if(o===e)return s}catch{}return null}}});import{spawn as hI}from"node:child_process";function Xl(t){return new Jl(t)}async function _I(t,e){let r=Date.now(),n=["--conversation",e.sessionId,"-p",t,"--dangerously-skip-permissions","--print-timeout",yI(e.timeoutMs)];e.model&&n.push("--model",e.model),Vt("agy",n,e.permissionMode??"yolo"),e.onProgress?.({kind:"system",summary:"agy -p one-shot started (no streaming events)"});let{stdout:s}=await gI(e.binary,n,{cwd:e.cwd,env:Ke(e.env,e.sessionId),signal:e.signal});return e.onProgress?.({kind:"system",summary:"agy -p one-shot completed"}),{text:s.trimEnd(),sessionId:e.sessionId,durationMs:Date.now()-r}}function gI(t,e,r){return new Promise((n,s)=>{let o;try{o=hI(t,e,{cwd:r.cwd,env:r.env,stdio:["ignore","pipe","pipe"]})}catch(c){s(c);return}let i="",a="";o.stdout?.on("data",c=>{i+=c.toString()}),o.stderr?.on("data",c=>{a+=c.toString()});let l=()=>{o.kill("SIGTERM"),s(new Error("agy turn aborted"))};if(r.signal){if(r.signal.aborted){l();return}r.signal.addEventListener("abort",l,{once:!0})}o.on("error",c=>{r.signal?.removeEventListener("abort",l),s(c)}),o.on("exit",(c,u)=>{if(r.signal?.removeEventListener("abort",l),c===0){n({stdout:i,stderr:a});return}let d=u?`signal ${u}`:`exit code ${c}`,f=a.trim()||i.trim();s(new Error(`agy failed (${d})${f?`: ${f}`:""}`))})})}function yI(t){return!t||t<=0?"8h":`${Math.max(1,Math.ceil(t/1e3))}s`}var Jl,Gl=b(()=>{"use strict";yp();Gt();xt();Xt();Un();Jl=class extends Oe{constructor(e){super({provider:new vo(e),capabilities:{canCreate:!0,canResumeInteractive:!0,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1},injection:{leaderMode:"prompt-append",leaderSetupHint:"Antigravity uses one-shot print turns; no streaming events are available."},binary:"agy",seedArgs:["-p",Ne,"--dangerously-skip-permissions","--print-timeout","2m"],resumeTemplate:"agy --conversation {{session_id}} --dangerously-skip-permissions",startTemplate:"agy --dangerously-skip-permissions",transport:_I})}seedArgsFor(e){let r=[...super.seedArgsFor(e)];return e?.model&&r.push("--model",e.model),r}manualSeedHint(e){return{launchCommand:`cd ${e} && agy --dangerously-skip-permissions`,postLaunchNote:"Send the lmctl seed instruction, wait for the conversation to write, then exit.",lsCommand:`lmctl ls --provider agy --sessiondir ${e}`}}}});import{createHash as wI}from"node:crypto";import{join as EI}from"node:path";function bI(t){return wI("sha256").update(t).digest("hex").slice(0,8)}function SI(t){let e=t.trim().toLowerCase().replace(/[^a-z0-9_-]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"session"}function TI(t,e){let r=e?.prompt??"",n=/\bYou are alias\s+([A-Za-z][A-Za-z0-9_-]*)\b/.exec(r);return n!==null?n[1]:t.split(/[\\/]/).filter(Boolean).pop()??"session"}function kI(t){return t.split(/\r?\n/,1)[0]?.trim()||"(empty prompt)"}function Io(t){return Math.max(1,Math.ceil(t.length/4))}function wp(t){return{provider:"ClaudeMock",sessionId:t.sessionId,cwd:t.cwd,createdAt:t.createdAt,modifiedAt:t.modifiedAt,messageCount:t.messages.length,filePath:t.filePath,cliVersion:"ClaudeMock/0",model:"claude-mock",totalInputTokens:t.totalInputTokens,totalOutputTokens:t.totalOutputTokens,lastTokenUsage:{totalTokens:t.totalInputTokens+t.totalOutputTokens}}}function Yl(){return new Kl}var Sr,Vl,Kl,zl=b(()=>{"use strict";Sr=new Map;Vl=class{name="ClaudeMock";async discoverSessions(){return[...Sr.values()].map(wp)}async loadSession(e){let r=Sr.get(e);return r===void 0?null:{...wp(r),messages:r.messages.slice()}}async resolveSessionPath(e){return Sr.get(e)?.filePath??null}async deleteSession(e){return Sr.delete(e)}},Kl=class{name="ClaudeMock";capabilities={canCreate:!0,canResumeInteractive:!1,canFork:!1,forkSupport:"manual",canStructuredTurn:!0,canStreamDeltas:!1,canCancel:!1};injection={leaderMode:"none"};provider=new Vl;discover(){return this.provider.discoverSessions()}load(e){return this.provider.loadSession(e)}resolvePath(e){return this.provider.resolveSessionPath(e)}delete(e){return this.provider.deleteSession(e)}getWatchPaths(){return[]}async seed(e,r){let n=SI(TI(e,r)),s=`mock-${n}-${bI(`${e}:${n}`)}`,o=new Date,i=Sr.get(s),a=r?.prompt??"ClaudeMock seed",l=Io(a),c={sessionId:s,cwd:e,filePath:EI(e,".lmctl-claude-mock",`${s}.json`),createdAt:i?.createdAt??o,modifiedAt:o,messages:i?.messages.slice()??[],totalInputTokens:i?.totalInputTokens??0,totalOutputTokens:i?.totalOutputTokens??0};return c.messages.push({role:"user",timestamp:o,content:a}),c.messages.push({role:"assistant",timestamp:o,content:"ACK: ClaudeMock seeded"}),c.totalInputTokens+=l,c.totalOutputTokens+=Io("ACK: ClaudeMock seeded"),Sr.set(s,c),{success:!0}}resumeCommand(e){return`ClaudeMock --resume ${e}`}startCommand(){return"ClaudeMock"}manualSeedHint(e){return{launchCommand:`cd ${e} && ClaudeMock`,postLaunchNote:"ClaudeMock is a hermetic test provider; no manual seed is required.",lsCommand:`lmctl ls --provider ClaudeMock --sessiondir ${e}`}}forkHint(e){return"ClaudeMock does not support fork."}async fork(e,r){return{success:!1,error:"ClaudeMock does not support fork."}}async sendTurn(e,r){let n=Date.now(),s=Sr.get(r.sessionId);if(s===void 0)throw new Error(`ClaudeMock session not found: ${r.sessionId}`);let o=new Date,i=`ClaudeMock ack: ${kI(e)}`;return s.messages.push({role:"user",timestamp:o,content:e}),s.messages.push({role:"assistant",timestamp:o,content:i,model:r.model??"claude-mock"}),s.modifiedAt=o,s.totalInputTokens+=Io(e),s.totalOutputTokens+=Io(i),r.onProgress?.({kind:"text",summary:"ClaudeMock deterministic reply"}),{text:i,sessionId:r.sessionId,durationMs:Math.max(1,Date.now()-n),stopReason:"mock_stop",numTurns:1,status:"ok"}}}});function gt(t){let e=[vl({claudeDir:t?.claudeDir}),Nl({codexDir:t?.codexDir,codeDir:t?.codeDir}),Ol({geminiDir:t?.geminiDir,claudeDir:t?.claudeDir,codexDir:t?.codexDir,codeDir:t?.codeDir}),Cl({copilotDir:t?.copilotDir}),Fl(),Bl(),Xl({agyDir:t?.agyDir})];return process.env.LMCTL_ENABLE_MOCK_PROVIDER==="1"&&e.push(Yl()),e}var Zl=b(()=>{"use strict";Il();$l();Ll();Ml();Ul();ql();Gl();zl();Il();$l();Ll();Ml();Ul();ql();Gl();zl()});var rc={};ce(rc,{ProviderRegistry:()=>Fn,TransportConnectionError:()=>we,TransportError:()=>Ye,TransportJsonError:()=>so,TransportProcessError:()=>Nt,TransportRpcError:()=>$t,_resetDefaultRegistryForTests:()=>vI,chat:()=>Tr,countTokens:()=>tc,createAdapterRegistry:()=>_t,createAllAdapters:()=>gt,listSessions:()=>ec,seed:()=>Ql});function No(){return xo===null&&(xo=_t(gt())),xo}function vI(){xo=null}function bp(t,e){let r=t.getAdapter(e);if(!r)throw new Error(`provider "${e}" is not registered in this registry`);return r}async function Tr(t){let e=t.registry??No(),r=bp(e,t.provider),n={sessionId:t.sessionId,cwd:t.cwd,env:t.env,onDelta:t.onDelta,onProgress:t.onProgress,signal:t.signal,timeoutMs:t.timeoutMs,model:t.model,effort:t.effort,progPath:t.progPath,alias:t.alias,isLead:t.isLead,permissionMode:t.permissionMode},s=await r.sendTurn(t.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 Ql(t){let e=t.registry??No(),r=bp(e,t.provider),n=await Ep(e,t.provider,t.cwd),s=await r.seed(t.cwd,{model:t.model,effort:t.effort,prompt:t.prompt});if(!s.success)return{success:!1,error:s.error};let o=await Ep(e,t.provider,t.cwd),i=II(n,o);return i?{success:!0,sessionId:i}:{success:!0}}async function Ep(t,e,r){let n=await t.listAll({provider:e,workspace:r}),s=new Map;for(let o of n)s.set(o.sessionId,o.modifiedAt);return s}function II(t,e){let r=[];for(let n of e.keys())t.has(n)||r.push(n);return r.length===1?r[0]:void 0}async function ec(t={}){return(t.registry??No()).listAll({provider:t.provider,workspace:t.workspace,limit:t.limit,from:t.from,to:t.to})}async function tc(t){let r=await(t.registry??No()).getSession(t.sessionId,t.provider);if(!r)throw new Error(`session "${t.sessionId}" not found`);let n=r.totalInputTokens??0,s=r.totalCachedInputTokens??0,o=r.totalCacheWriteInputTokens??0,i=r.totalOutputTokens??0,a=r.totalReasoningOutputTokens??0;return{provider:r.provider,sessionId:r.sessionId,input:n,cachedInput:s,cacheWriteInput:o,output:i,reasoningOutput:a,total:n+s+o+i+a,lastTurn:r.lastTokenUsage}}var xo,Rt=b(()=>{"use strict";pl();Zl();pl();Zl();Br();xo=null});function xI(){return nc===null&&(nc=_t(gt())),nc}async function Vr(t){let{dal:e,team_member_id:r}=t,n=e!==void 0&&r!==void 0;n&&e.setMemberState(r,"in_chat");let s=!1,o;try{return await $I(t)}catch(i){throw s=!0,o=i,i}finally{if(n)if(!s)Gr.delete(r),e.setMemberState(r,"idle");else{let i=NI(o,r);e.setMemberState(r,i!==null?"attention_needed":"idle",i)}}}function NI(t,e){if(!(t instanceof Ee))return Gr.delete(e),null;if(t.kind==="sessiondir_missing")return"sessiondir_missing";if(t.kind==="enoent")return"binary_missing";if(t.kind==="nonzero_exit"&&(t.exit_status===137||t.exit_status===139))return"oom_exit";if(t.kind==="timeout"){let r=(Gr.get(e)??0)+1;return r>=3?(Gr.delete(e),"consecutive_timeouts"):(Gr.set(e,r),null)}return Gr.delete(e),null}async function $I(t){let e=t.timeoutMs,r=typeof e=="number"&&e>0,n=xI(),s;try{let u=await n.resolveSession(t.sessionid);if(!u)return Promise.reject(new Ee("other",null,`library: sessionid "${t.sessionid}" matched no registered provider`,sc(t.sessionid,t.sessiondir,"unresolved")));s=u.provider.name}catch(u){return Promise.reject(new Ee("other",null,`library: session resolution failed: ${Sp(u)}`,sc(t.sessionid,t.sessiondir,"unresolved")))}let o=sc(t.sessionid,t.sessiondir,s),i=new AbortController,a=r?setTimeout(()=>i.abort(),e):null,l=!1;i.signal.addEventListener("abort",()=>{l=!0},{once:!0});let c=Date.now();try{let u=await Tr({provider:s,sessionId:t.sessionid,cwd:t.sessiondir,prompt:t.prompt,timeoutMs:0,signal:i.signal,registry:n,onProgress:t.onProgress,permissionMode:t.permissionMode});if(u.status==="stalled")throw new Ee("timeout",null,`library: stalled after ${u.stalledAfterMs??0}ms`,o);return{text:u.text,ms:Date.now()-c,exit_status:0,argv:o}}catch(u){throw l?new Ee("timeout",null,`library: wall-clock timeout after ${e??0}ms`,o):jI(u,o)}finally{a!==null&&clearTimeout(a)}}function sc(t,e,r){return["<library>","chat",t,e,"--provider",r]}function Sp(t){return t instanceof Error?t.message:String(t)}function jI(t,e){if(t instanceof Ee)return t;if(t instanceof we){let r=t.cause;return r?.code==="ENOENT_CWD"?new Ee("sessiondir_missing",null,t.message,e):r?.code==="ENOENT"?new Ee("enoent",null,t.message,e):new Ee("other",null,t.message,e)}return t instanceof Nt?new Ee("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new Ee("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new Ee("other",null,t.message,e):new Ee("other",null,Sp(t),e)}var Ee,nc,Gr,Gn=b(()=>{"use strict";Rt();Ee=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl chat failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="ChatError"}},nc=null;Gr=new Map});function Tp(){return oc===null&&(oc=_t(gt())),oc}function RI(t,e){if(!AI.test(t))return t;let r=e.getConfig(`workspace.${t}`);if(r===null||r.length===0)throw new ke("other",null,`workspace has no mapping for ${t}; run \`lmctl workspace init\` (or set workspace.${t} in lmctl_config)`,["<library>","seed","--provider",t]);return r}async function Kr(t){let e=RI(t.member.provider,t.dal),r=e===t.member.provider?t.member:{...t.member,provider:e},n=await OI({member:r});return t.dal.setMemberProviderResolved(t.member.id,e),{sessionid:n.sessionid,provider_resolved:e}}async function OI(t){let e=t.member.provider,r=t.member.sessiondir,n=ic("seed",r,e);try{let s=await Ql({provider:e,cwd:r,registry:Tp()});if(!s.success)throw CI(s.error,n);if(!s.sessionId)throw new ke("parse",0,"",n);return{sessionid:s.sessionId}}catch(s){throw s instanceof ke?s:ac(s,n)}}async function kp(t){return LI(t)}async function LI(t){let e=Tp(),r=ic("tokens",t.sessionid,"unresolved"),n;try{let o=await e.resolveSession(t.sessionid);if(!o)throw new ke("parse",0,`library: sessionid "${t.sessionid}" matched no registered provider`,r);n=o.provider.name}catch(o){throw o instanceof ke?o:ac(o,r)}let s=ic("tokens",t.sessionid,n);try{let o=await tc({sessionId:t.sessionid,provider:n,registry:e});return{input_tokens:o.input,cache_tokens:o.cachedInput+o.cacheWriteInput,output_tokens:o.output,total_tokens:o.total}}catch(o){throw o instanceof ke?o:ac(o,s)}}function ic(t,e,r){return["<library>",t,e,"--provider",r]}function CI(t,e){let r=t??"";if(/\bENOENT\b/i.test(r))return new ke("enoent",null,r,e);if(/timed?\s*out/i.test(r))return new ke("timeout",null,r,e);if(/\bexit code\s+(-?\d+)\b/i.test(r)){let n=/\bexit code\s+(-?\d+)\b/i.exec(r);return new ke("nonzero_exit",Number(n[1]),r,e)}return new ke("other",null,r,e)}function ac(t,e){return t instanceof ke?t:t instanceof we?t.cause?.code==="ENOENT"?new ke("enoent",null,t.message,e):new ke("other",null,t.message,e):t instanceof Nt?new ke("nonzero_exit",t.exitCode??null,t.stderr??t.message,e):t instanceof $t?new ke("nonzero_exit",t.rpcCode??null,t.message,e):t instanceof Ye?new ke("other",null,t.message,e):new ke("other",null,t instanceof Error?t.message:String(t),e)}var ke,oc,AI,$o=b(()=>{"use strict";Rt();ke=class extends Error{kind;exit_status;stderr;argv;constructor(e,r,n,s){super(`lmctl seed failed: ${e}`),this.kind=e,this.exit_status=r,this.stderr=n,this.argv=s,this.name="SeedError"}},oc=null;AI=/^provider[123]$/});function jo(t){return Buffer.from(t,"utf8").toString("base64url")}function Kn(t){return Buffer.from(t,"base64url").toString("utf8")}async function vp(t,e=r=>kp({sessionid:r})){if(process.env.LMCTL_SESSION_SIZE_DISABLED==="1")return{recorded:0,failed:0};let r=0,n=0;for(let s of MI(t)){let o=s.member.sessionid;if(o!==null)try{let i=await e(o);t.recordSessionSize({team_name:s.team_name,alias:s.member.alias,sessionid:o,...i}),r+=1}catch(i){n+=1;try{t.raiseAttention({kind:"daemon_session_size_failed",severity:"warn",payload:JSON.stringify({team_name:s.team_name,alias:s.member.alias,sessionid:o,error:i instanceof Error?i.message:String(i)})})}catch{}}}return{recorded:r,failed:n}}async function Ip(t,e,r){let n=xp(t,e,r);if(n===null||n.member.sessionid===null)throw new Error("session member not found");if(n.member.state!=="idle")throw new Vn(r,n.member.state);t.setMemberState(n.member.id,"in_chat","compacting");try{return await Vr({sessionid:n.member.sessionid,sessiondir:n.member.sessiondir,prompt:"/compact"}),t.setMemberState(n.member.id,"idle",null),{ok:!0,row:Np(t,e,r)}}catch(s){throw t.setMemberState(n.member.id,"attention_needed",`compact failed: ${s instanceof Error?s.message:String(s)}`),s}}async function lc(t,e,r){let n=xp(t,e,r);if(n===null)throw new Error("session member not found");let s=await Kr({member:n.member,dal:t});return t.updateTeamMemberSession(n.member.id,s.sessionid),{ok:!0,sessionid:s.sessionid,row:Np(t,e,r)}}function MI(t){return t.listTeams().flatMap(e=>t.listTeamMembers(e.id).filter(r=>r.sessionid!==null).map(r=>({team_name:e.name,member:r})))}function xp(t,e,r){let n=t.findTeamByName(e);if(n===null)return null;let s=t.findTeamMemberByAlias(n.id,r);return s===null?null:{team_name:n.name,member:s}}function Np(t,e,r){return t.sessionSizeHistory(e,r,1)[0]??null}var Vn,Ao=b(()=>{"use strict";Gn();$o();Vn=class extends Error{constructor(e,r){super(`member ${e} is currently ${r}; cannot compact while busy`),this.name="MemberBusyError"}}});async function cc(t){let e=t.dal,r=t.nowMs??Date.now(),n=t.thresholdMs??PI(e),s=r-n,o=e.query(`
1028
1016
  SELECT
1029
1017
  isess.id AS interactive_session_id,
1030
1018
  isess.run_id,
@@ -1070,7 +1058,7 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
1070
1058
  ORDER BY w.name ASC
1071
1059
  `)}function Lp(t,e={}){return e.status!==void 0?t.query("SELECT * FROM job WHERE status = ? ORDER BY priority DESC, id ASC",e.status):t.query("SELECT * FROM job ORDER BY priority DESC, id ASC LIMIT 100")}function Cp(t,e={}){if(e.pr_url!==void 0){let r=t.findSubmittedPrByUrl(e.pr_url);return r===null?[]:[r]}return t.listSubmittedPrs({status:e.status})}function Mp(t,e){return t.getSubmittedPr(e)}function Po(t,e){return t.query("SELECT * FROM job WHERE id = ?",e)[0]??null}function Yr(t,e={}){return t.query("SELECT * FROM run ORDER BY id DESC LIMIT ?",e.limit??100)}function vr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];return r===void 0?null:{...r,job:Po(t,r.job_id),workflow:t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,team:t.getTeam(r.team_id),steps:JI(t,r.id)}}function JI(t,e){return t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e).map(r=>({...r,artifacts:Dp(t,r.id)}))}function pc(t,e,r){let n=t.query("SELECT * FROM step WHERE run_id = ? AND id = ?",e,r)[0];return n===void 0?null:{...n,artifacts:Dp(t,n.id)}}function Dp(t,e){return t.query("SELECT * FROM step_artifact WHERE step_id = ? ORDER BY id ASC",e)}function Ir(t,e,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?t.query(n,e):t.query(n,e,r)}function Pp(t,e,r){let n=pc(t,e,r);return n===null?null:(n.artifacts.find(o=>o.kind===`${n.state_name}_transcript`)??n.artifacts.find(o=>o.content!==null))?.content??null}function Fp(t,e={}){return e.type!==void 0?t.query("SELECT * FROM external_object WHERE type = ? ORDER BY id DESC",e.type):t.query("SELECT * FROM external_object ORDER BY id DESC LIMIT 100")}function Up(t,e={}){return e.unhandled===!0?t.query("SELECT * FROM external_signal WHERE handled_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM external_signal ORDER BY id DESC LIMIT 100")}function Qt(t,e={}){return e.unacked===!0?t.query("SELECT * FROM attention WHERE acknowledged_at IS NULL ORDER BY id DESC"):t.query("SELECT * FROM attention ORDER BY id DESC LIMIT 100")}function Fo(t,e={}){let r=[],n="a.kind IN ('interactive_waiting_operator', 'workflow_escalation')";return e.all!==!0&&(n+=" AND a.acknowledged_at IS NULL"),e.project!==void 0&&(n+=" AND p.name = ?",r.push(e.project)),e.since!==void 0&&(n+=" AND a.created_at >= ?",r.push(e.since)),t.query(`${Wp}
1072
1060
  WHERE ${n}
1073
- ORDER BY a.created_at DESC`,...r).map(Bp)}function wt(t,e){let n=t.query(`${Wp}
1061
+ ORDER BY a.created_at DESC`,...r).map(Bp)}function yt(t,e){let n=t.query(`${Wp}
1074
1062
  WHERE a.id = ?`,e)[0];return n===void 0?null:Bp(n)}function Bp(t){let{payload_json:e,...r}=t,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(e==null)return n;let s;try{s=JSON.parse(e)}catch{return n}if(s===null||typeof s!="object")return n;let o=s;if(Array.isArray(o.node_path)&&o.node_path.every(i=>typeof i=="string")&&(n.node_path=o.node_path),o.expected_response!==null&&typeof o.expected_response=="object"){let i=o.expected_response;if(typeof i.kind=="string"){let a=Array.isArray(i.choices)&&i.choices.every(l=>typeof l=="string")?i.choices:null;n.expected_response={kind:i.kind,choices:a}}}if(Array.isArray(o.transcript_tail)&&o.transcript_tail.every(i=>typeof i=="string")&&(n.transcript_tail=o.transcript_tail),typeof o.paused_at=="string"&&(n.paused_at=o.paused_at),o.created_run_inputs!==null&&typeof o.created_run_inputs=="object"&&!Array.isArray(o.created_run_inputs)&&(n.created_run_inputs=o.created_run_inputs),typeof o.workflow_version_id=="number"?n.workflow_version_id=o.workflow_version_id:o.workflow_version_id===null&&(n.workflow_version_id=null),o.step!==null&&typeof o.step=="object"&&!Array.isArray(o.step)){let i=o.step;typeof i.id=="string"&&i.id.length>0&&(n.workflow_step={id:i.id,name:typeof i.name=="string"?i.name:null,type:typeof i.type=="string"?i.type:null})}return typeof o.tier=="string"&&(n.escalation_tier=o.tier),typeof o.token=="string"&&(n.escalation_token=o.token),typeof o.reason=="string"&&(n.escalation_reason=o.reason),Array.isArray(o.declared_outcomes)&&o.declared_outcomes.every(i=>typeof i=="string")&&(n.declared_outcomes=o.declared_outcomes),typeof o.agent_output=="string"&&(n.agent_output=o.agent_output),n}function qp(t){return t.query(`
1075
1063
  SELECT w.name AS workflow_name, r.terminal_state, COUNT(*) AS count
1076
1064
  FROM run r
@@ -1144,7 +1132,7 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
1144
1132
  json_extract(payload, '$.elapsedMs') ASC`,r),i=new Map;for(let l of o){let c=i.get(l.tool_name)??[];c.push(l.elapsed_ms),i.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,u=i.get(l.tool_name)??[],d=u.length>0?u.reduce((p,h)=>p+h,0)/u.length:null,f=u.length>0?u[Math.floor(u.length*.5)]??null:null,m=u.length>0?u[Math.floor(u.length*.95)]??null:null;return{tool_name:l.tool_name,invocations:l.cnt,successes:c,hit_rate_pct:l.cnt>0?`${(c/l.cnt*100).toFixed(1)}%`:"0.0%",avg_latency_ms:d!==null?Math.round(d):null,p50_latency_ms:f,p95_latency_ms:m}})}function Hp(t){try{let e=JSON.parse(t);if(e.schema_version==="lmctl/v3"&&Array.isArray(e.steps)){let r=[],n=new Map,s=new Map;for(let o of e.steps){let i=typeof o.id=="string"?o.id:null;i!==null&&(r.push(i),typeof o.type=="string"&&s.set(i,o.type),typeof o.name=="string"&&o.name.length>0&&n.set(o.name,i))}return{schema:"v3",nodes:r,nodeTypes:s,nameToId:n}}if(e.states!==null&&typeof e.states=="object"){let r=e.states,n=new Map;for(let[l,c]of Object.entries(r))if(c!==null&&typeof c=="object"){let u=c.type;typeof u=="string"&&n.set(l,u)}let s=typeof e.start_at=="string"?e.start_at:null,o=Object.keys(r),i=s!==null&&o.includes(s)?[s,...o.filter(l=>l!==s)]:o,a=e.terminals!==null&&typeof e.terminals=="object"?Object.keys(e.terminals).map(l=>`@terminal:${l}`):[];for(let l of a)n.set(l,"Terminal");return{schema:"v2",nodes:[...i,...a],nodeTypes:n,nameToId:new Map}}}catch{}return{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map}}function zr(t,e){let r=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(r===void 0)return null;let n=t.query("SELECT * FROM workflow WHERE id = ?",r.workflow_id)[0]??null,s=(()=>{let g=t.query("SELECT * FROM job WHERE id = ?",r.job_id)[0];return g===void 0?null:t.query("SELECT * FROM project WHERE id = ?",g.project_id)[0]?.name??null})(),o=n!==null?Hp(n.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},i=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),a=g=>o.schema==="v3"&&o.nameToId.has(g)?o.nameToId.get(g):g,l=new Map;for(let g of i)l.set(a(g.state_name),g);let c=t.query(`SELECT state_name, status, last_agent_output
1145
1133
  FROM interactive_session
1146
1134
  WHERE run_id = ? AND status = 'waiting_operator'
1147
- ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),E="pending",k=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?E=_&&u===g?"paused":"running":T.outcome===null?E="failed":E="done",T.ended_at!==null)){let $=Date.parse(T.started_at),N=Date.parse(T.ended_at);!Number.isNaN($)&&!Number.isNaN(N)&&(k=N-$)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:k,prompt:_&&E==="paused"?f:null,expected:_&&E==="paused"?"free_text":null})}return{run_id:e,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:d,nodes:h}}function Uo(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...XI(o));return`${e.join(`
1135
+ ORDER BY id DESC LIMIT 1`,e)[0],u=c!==void 0?a(c.state_name):null,d=u,f=c?.last_agent_output??null;if(d===null){let g=i.find(_=>_.ended_at===null);g!==void 0?d=a(g.state_name):i.length>0?d=a(i[i.length-1].state_name):d=r.current_state}r.terminal_state!==null&&(d=`@terminal:${r.terminal_state}`,f=null);let m=new Set,p=[...o.nodes];for(let g of i){let _=a(g.state_name);!o.nodes.includes(_)&&!p.includes(_)&&p.push(_)}d!==null&&!p.includes(d)&&p.push(d);let h=[];for(let g of p){if(m.has(g))continue;m.add(g);let _=g===d,T=l.get(g),E="pending",k=null;if(g.startsWith("@terminal:"))E=r.terminal_state===g.slice(10)?"done":"pending";else if(T!==void 0&&(T.ended_at===null?E=_&&u===g?"paused":"running":T.outcome===null?E="failed":E="done",T.ended_at!==null)){let $=Date.parse(T.started_at),x=Date.parse(T.ended_at);!Number.isNaN($)&&!Number.isNaN(x)&&(k=x-$)}_&&u===g&&(E="paused"),h.push({id:g,status:E,is_current:_,elapsed_ms:k,prompt:_&&E==="paused"?f:null,expected:_&&E==="paused"?"free_text":null})}return{run_id:e,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:d,nodes:h}}function Uo(t){let e=[],r=t.workflow_name??"?",n=t.workflow_version!==null?`v${t.workflow_version}`:"v?",s=t.terminal_state!==null?`terminal:${t.terminal_state}`:t.paused?"paused":"running";e.push(`run: ${t.run_id} (${r}, ${n}) - ${s}`),t.project!==null&&e.push(`project: ${t.project}`),e.push(""),e.push("workflow tree:");for(let o of t.nodes)e.push(...XI(o));return`${e.join(`
1148
1136
  `)}
1149
1137
  `}function XI(t){let e=[],r=GI(t.status),n=[];t.status==="done"&&t.elapsed_ms!==null?n.push(`done, ${(t.elapsed_ms/1e3).toFixed(1)}s`):t.status==="failed"?n.push("failed"):t.status==="paused"?n.push("paused, waiting for operator input"):t.status==="running"?n.push("running"):t.status==="pending"&&n.push("pending");let s=n.length>0?`(${n.join(", ")})`:"",o=t.is_current?" <- CURRENT":"",i=t.id.padEnd(28);if(e.push(` ${r} ${i} ${s}${o}`.trimEnd()),t.is_current&&t.status==="paused"&&t.prompt!==null){let a=t.prompt.split(/\r?\n/)[0]??"",l=a.length>80?`${a.slice(0,80)}...`:a;e.push(` \u2514 prompt: "${l}"`),t.expected!==null&&e.push(` \u2514 expected: ${t.expected}`)}return e}function GI(t){switch(t){case"done":return"[x]";case"failed":return"[!]";case"paused":return"[*]";case"running":return"[>]";case"pending":return"[ ]";default:return" "}}function Wo(t,e,r={}){let n=r.nowMs??Date.now(),s=t.query("SELECT * FROM run WHERE id = ?",e)[0];if(s===void 0)return null;let o=t.query("SELECT * FROM workflow WHERE id = ?",s.workflow_id)[0]??null,i=s.workflow_version_id===null?null:t.query("SELECT version FROM workflow_version WHERE id = ?",s.workflow_version_id)[0]??null,a=t.query("SELECT * FROM job WHERE id = ?",s.job_id)[0]??null,l=a===null?null:t.query("SELECT * FROM project WHERE id = ?",a.project_id)[0]??null,c=o!==null?Hp(o.definition):{schema:"unknown",nodes:[],nodeTypes:new Map,nameToId:new Map},u=$=>c.schema==="v3"&&c.nameToId.has($)?c.nameToId.get($):$,d=t.query("SELECT * FROM step WHERE run_id = ? ORDER BY id ASC",e),f=new Map;for(let $ of d)f.set(u($.state_name),$);let m=t.query("SELECT * FROM interactive_session WHERE run_id = ? ORDER BY id ASC",e),p=new Map;for(let $ of m)p.set(u($.state_name),$);let h=new Map,g=t.query("SELECT MAX(timestamp_ms) AS timestamp_ms FROM session_event WHERE run_id = ? AND step_id IS NULL",e)[0]?.timestamp_ms??null;for(let $ of t.query(`SELECT step_id, MAX(timestamp_ms) AS timestamp_ms
1150
1138
  FROM session_event
@@ -1154,9 +1142,9 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
1154
1142
  WHERE run_id = ?
1155
1143
  AND kind = 'session_hung'
1156
1144
  AND acknowledged_at IS NULL
1157
- ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:rN($.payload)})),k=_.map($=>{let N=f.get($),A=p.get($),D=YI(s,$,T,N,A),C=N===void 0?null:Date.parse(N.started_at),H=N?.ended_at===null||N===void 0?null:Date.parse(N.ended_at),R=N===void 0||Number.isNaN(C??NaN)?null:H!==null&&!Number.isNaN(H)?H-C:D==="running"||D==="paused"?n-C:null,U=N===void 0?null:h.get(N.id)??null,z=nN(A?.last_activity_at??null,U,g),v=o===null||A===void 0?void 0:QI(t,s.team_id,o.definition,A.state_name,N?.state_name??$);return{step_id:N?.id??null,state_id:$,status:D,started_at:N?.started_at??null,ended_at:N?.ended_at??null,last_activity_at:z,elapsed_ms:R,...v!==void 0?{member:v}:{},...A!==void 0?{interactive_session:{id:A.id,status:A.status,turn_count:A.turn_count,state_name:A.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:ZI(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:zI(k,s.terminal_state!==null),related_attentions:E}}function Bo(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${Rp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Ap(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Ap(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${qo(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${Rp(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${sN(a.payload)}`)}return`${n.join(`
1145
+ ORDER BY id ASC`,e).map($=>({kind:$.kind,severity:$.severity,payload:rx($.payload)})),k=_.map($=>{let x=f.get($),A=p.get($),D=YI(s,$,T,x,A),C=x===void 0?null:Date.parse(x.started_at),H=x?.ended_at===null||x===void 0?null:Date.parse(x.ended_at),R=x===void 0||Number.isNaN(C??NaN)?null:H!==null&&!Number.isNaN(H)?H-C:D==="running"||D==="paused"?n-C:null,U=x===void 0?null:h.get(x.id)??null,z=nx(A?.last_activity_at??null,U,g),v=o===null||A===void 0?void 0:QI(t,s.team_id,o.definition,A.state_name,x?.state_name??$);return{step_id:x?.id??null,state_id:$,status:D,started_at:x?.started_at??null,ended_at:x?.ended_at??null,last_activity_at:z,elapsed_ms:R,...v!==void 0?{member:v}:{},...A!==void 0?{interactive_session:{id:A.id,status:A.status,turn_count:A.turn_count,state_name:A.state_name}}:{}}});return{run_id:e,workflow_name:o?.name??null,workflow_version:i?.version??o?.version??null,workflow_version_id:s.workflow_version_id,project:l?.name??null,status:ZI(s,a,k),submitted_at:a?.enqueued_at??s.started_at,nodes:k,current_node_index:zI(k,s.terminal_state!==null),related_attentions:E}}function Bo(t,e={}){let r=e.nowMs??Date.now(),n=[],s=t.workflow_name??"?",o=t.workflow_version!==null?`v${t.workflow_version}`:"v?";n.push(`run ${t.run_id} - ${s}, ${o} - ${t.status}`);let i=`${t.submitted_at} (${Rp(Date.parse(t.submitted_at),r)} ago)`;n.push(`project: ${t.project??"?"} | submitted: ${i}`),n.push(""),n.push("timeline:"),n.push(`${Ap(t.submitted_at,t.submitted_at)} submit`);for(let a of t.nodes){let l=a.started_at===null?"[ ]":Ap(t.submitted_at,a.started_at),c=a.status.padEnd(7),u=a.elapsed_ms===null?"":` elapsed ${qo(a.elapsed_ms)}`;if(n.push(`${l} ${a.state_id.padEnd(24)} ${c}${u}`.trimEnd()),a.interactive_session!==void 0){let d=a.last_activity_at===null?"last activity unknown":`last activity ${Rp(a.last_activity_at,r)} ago`,f=a.member!==void 0?`${a.member.alias} member`:"interactive member";n.push(` ${" ".repeat(24)} ${d}`),n.push(` ${" ".repeat(24)} ${f}, ${a.interactive_session.status}`)}}if(t.related_attentions.length>0){n.push(""),n.push("attentions:");for(let a of t.related_attentions)n.push(`- ${a.kind}${sx(a.payload)}`)}return`${n.join(`
1158
1146
  `)}
1159
- `}function VI(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function KI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function YI(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function zI(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function ZI(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function QI(t,e,r,n,s){let o=eN(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Ie(i)}}function eN(t,e,r){let n=tN(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Zt(a)?a.id===e||a.name===e||a.name===r:!1),o=Zt(s?.members)?s.members:null,i=o!==null&&Zt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Zt(n.states)){let s=n.states[e]??n.states[r];if(!Zt(s))return null;let o=Zt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function tN(t){try{let e=JSON.parse(t);return Zt(e)?e:null}catch{return null}}function rN(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Zt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nN(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Ap(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${qo(Math.max(0,n-r)).padEnd(6)}]`}function Rp(t,e){return Number.isNaN(t)?"?":qo(Math.max(0,e-t))}function qo(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function sN(t){if(!Zt(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${qo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Wp,Ot=b(()=>{"use strict";Pe();Wp=`SELECT a.id AS attention_id,
1147
+ `}function VI(t,e,r){let n=t.nodes.filter(s=>s.startsWith("@terminal:")?!1:t.nodeTypes.get(s)!=="lmctl/terminal"&&t.nodeTypes.get(s)!=="Terminal");for(let s of e){let o=r(s.state_name);n.includes(o)||n.push(o)}return n}function KI(t){return t===null?null:t.startsWith("__paused__:")?t.slice(11):t}function YI(t,e,r,n,s){return n===void 0?"pending":n.ended_at===null?s?.status==="waiting_operator"||t.paused_at!==null&&r===e?"paused":"running":n.outcome===null?"failed":"done"}function zI(t,e){if(t.length===0)return null;let r=t.findIndex(s=>s.status==="running"||s.status==="paused"||s.status==="failed");if(r>=0)return r;if(e){for(let s=t.length-1;s>=0;s-=1)if(t[s].status==="done")return s}let n=t.findIndex(s=>s.status==="pending");return n>=0?n:t.length-1}function ZI(t,e,r){return t.terminal_state!==null?t.terminal_state:t.paused_at!==null?"paused":e?.status==="failed"||r.some(n=>n.status==="failed")?"failed":"running"}function QI(t,e,r,n,s){let o=ex(r,n,s);if(o===null)return;let i=t.query("SELECT * FROM team_member WHERE team_id = ? AND lower(alias) = lower(?) LIMIT 1",e,o)[0];return i===void 0?void 0:{alias:i.alias,provider:Ie(i)}}function ex(t,e,r){let n=tx(t);if(n===null)return null;if(Array.isArray(n.steps)){let s=n.steps.find(a=>Zt(a)?a.id===e||a.name===e||a.name===r:!1),o=Zt(s?.members)?s.members:null,i=o!==null&&Zt(o.agent)?o.agent:null;return typeof i?.alias=="string"?i.alias:null}if(Zt(n.states)){let s=n.states[e]??n.states[r];if(!Zt(s))return null;let o=Zt(s.agent)?s.agent:null;return typeof o?.alias=="string"?o.alias:null}return null}function tx(t){try{let e=JSON.parse(t);return Zt(e)?e:null}catch{return null}}function rx(t){if(t===null)return null;try{return JSON.parse(t)}catch{return t}}function Zt(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function nx(...t){let e=t.filter(r=>r!==null&&Number.isFinite(r));return e.length===0?null:Math.max(...e)}function Ap(t,e){let r=Date.parse(t),n=Date.parse(e);return Number.isNaN(r)||Number.isNaN(n)?"[+? ]":`[+${qo(Math.max(0,n-r)).padEnd(6)}]`}function Rp(t,e){return Number.isNaN(t)?"?":qo(Math.max(0,e-t))}function qo(t){let e=Math.max(0,Math.round(t/1e3));if(e<60)return`${e}s`;let r=Math.floor(e/60),n=e%60;if(r<60)return n===0?`${r}m`:`${r}m${n}s`;let s=Math.floor(r/60),o=r%60;return o===0?`${s}h`:`${s}h${o}m`}function sx(t){if(!Zt(t))return"";let e=typeof t.step_id=="number"?` on step ${t.step_id}`:"",r=typeof t.member_alias=="string"?t.member_alias:null,n=typeof t.provider=="string"?t.provider:null,s=typeof t.elapsed_ms=="number"?`, ${qo(t.elapsed_ms)} elapsed`:"",o=r===null?"":` (${r}${n===null?"":` ${n}`}${s})`;return`${e}${o}`}var Wp,Ot=b(()=>{"use strict";Pe();Wp=`SELECT a.id AS attention_id,
1160
1148
  a.kind AS kind,
1161
1149
  a.severity AS severity,
1162
1150
  a.created_at AS created_at,
@@ -1178,141 +1166,141 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
1178
1166
  ON isess.run_id = a.run_id
1179
1167
  AND isess.id = (
1180
1168
  SELECT MAX(id) FROM interactive_session WHERE run_id = a.run_id
1181
- )`});var ih={};ce(ih,{parseApiArgs:()=>Kp,readApiClientConfig:()=>zn,runApi:()=>uN});import{readFileSync as oN}from"node:fs";import{basename as iN,extname as aN}from"node:path";async function uN(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(cN),0;if(t[0]==="config")return fN(t.slice(1),e);let r=sh(t,"--direct");if(r.rest[0]==="escalations")return mN(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Xo(r.rest.slice(2)))return e.stdout.write(`${gN}
1169
+ )`});var ih={};ce(ih,{parseApiArgs:()=>Kp,readApiClientConfig:()=>zn,runApi:()=>ux});import{readFileSync as ox}from"node:fs";import{basename as ix,extname as ax}from"node:path";async function ux(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(cx),0;if(t[0]==="config")return fx(t.slice(1),e);let r=sh(t,"--direct");if(r.rest[0]==="escalations")return mx(r.rest.slice(1),e,r.present);if(r.rest[0]==="workflows"&&r.rest[1]==="verify"&&Xo(r.rest.slice(2)))return e.stdout.write(`${gx}
1182
1170
  `),0;if(r.rest[0]==="workflows"&&r.rest[1]==="verify")return r.present?(e.stderr.write(`error: --direct is not supported for workflows verify; use the HTTP api route
1183
- `),2):dx(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Xo(r.rest.slice(2)))return e.stdout.write(`${hN}
1184
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Xo(r.rest.slice(2)))return e.stdout.write(`${_N}
1185
- `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?ax(r.rest.slice(2),e):lx(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?cx(r.rest.slice(2),e):ux(r.rest.slice(2),e);if(r.present)return XN(r.rest,e);let n=Kp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1186
- `),2;let s=Nr(e),o=s.baseUrl,i=er(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=vN(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1171
+ `),2):dN(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="where"&&Xo(r.rest.slice(2)))return e.stdout.write(`${hx}
1172
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="timeline"&&Xo(r.rest.slice(2)))return e.stdout.write(`${_x}
1173
+ `),0;if(r.rest[0]==="run"&&r.rest[1]==="where")return r.present?aN(r.rest.slice(2),e):lN(r.rest.slice(2),e);if(r.rest[0]==="run"&&r.rest[1]==="timeline")return r.present?cN(r.rest.slice(2),e):uN(r.rest.slice(2),e);if(r.present)return Xx(r.rest,e);let n=Kp(t);if(typeof n=="string")return e.stderr.write(`error: ${n}
1174
+ `),2;let s=xr(e),o=s.baseUrl,i=er(n.accept,s.token),a=n.body;if(n.upload!==void 0)try{a=vx(n.upload.filePath,n.upload.project)}catch(c){return e.stderr.write(`error: upload failed: ${c instanceof Error?c.message:String(c)}
1187
1175
  `),2}else n.body!==void 0&&n.contentType!==void 0?i["Content-Type"]=n.contentType:n.body!==void 0&&(i["Content-Type"]="application/json");let l;try{l=await fetch(new URL(n.path,o),{method:n.method,headers:i,body:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1188
1176
  `),2}if(!l.ok)return e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1189
- `),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=NN(c);if(u===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
1177
+ `),l.status===400?2:1;if(n.runAfterSubmit){let c=await l.json(),u=xx(c);if(u===null)return e.stderr.write(`error: submit-job response did not include a numeric job id
1190
1178
  `),2;let d;try{d=await fetch(new URL(`/api/jobs/${u}/run`,o),{method:"POST",headers:er("application/json",s.token)})}catch(m){return e.stderr.write(`error: network failure: ${m instanceof Error?m.message:String(m)}
1191
1179
  `),2}if(!d.ok)return e.stderr.write(`error: HTTP ${d.status}: ${await d.text()}
1192
1180
  `),d.status===400?2:1;let f=await d.json();n.json?e.stdout.write(`${JSON.stringify(f,null,2)}
1193
1181
  `):e.stdout.write(`${JSON.stringify(f)}
1194
1182
  `)}else n.json?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1195
1183
  `):(e.stdout.write(await l.text()),e.stdout.write(`
1196
- `));return 0}function Kp(t){let e=Zp(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Jo(o,"/api/status",n):s==="projects"?Jo(o,"/api/projects",n):s==="teams"?Jo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?CN(o.slice(1),e.format):Jo(o,"/api/workflows",n):s==="workflow"?LN(o,n):s==="upload"?RN(o,n):s==="submit-job"?ON(o,n):s==="issues"?AN(o,n):s==="jobs"?Yn(o,"--status","/api/jobs","status",n):s==="job"?jN(o,n):s==="project"?MN(o,n):s==="artifact"?FN(o,n):s==="runs"?Yn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Yn(o,"--type","/api/external-objects","type",n):s==="external-signals"?Xp(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?UN(o,n):Xp(o,"--unacked","/api/attentions","unacked",n):s==="stats"?WN(o,n):s==="daemon"?BN(o,n):s==="intake"?qN(o,n):s==="session"?HN(o,n):s==="run"?JN(o,e.format):s==="prs"?Yn(o,"--status","/api/submitted-prs","status",n):s==="pr"?xN(o,n):`unknown subcommand: ${s}`}function er(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function Nr(t){if(t.dal!==void 0)return zn(t.dal,process.env,t);let e=pe({path:ue()});try{return zn(e,process.env,t)}finally{e.close()}}function zn(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=lN;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${dN(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1197
- `);return{baseUrl:o,token:a}}function dN(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function fN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1184
+ `));return 0}function Kp(t){let e=Zp(t);if(typeof e=="string")return e;let r=e.args,n=e.format!=="text",[s,...o]=r;return s===void 0?"usage: lmctl api <subcommand>":s==="status"?Jo(o,"/api/status",n):s==="projects"?Jo(o,"/api/projects",n):s==="teams"?Jo(o,"/api/teams",n):s==="workflows"?o[0]==="verify"?Cx(o.slice(1),e.format):Jo(o,"/api/workflows",n):s==="workflow"?Lx(o,n):s==="upload"?Rx(o,n):s==="submit-job"?Ox(o,n):s==="issues"?Ax(o,n):s==="jobs"?Yn(o,"--status","/api/jobs","status",n):s==="job"?jx(o,n):s==="project"?Mx(o,n):s==="artifact"?Fx(o,n):s==="runs"?Yn(o,"--limit","/api/runs","limit",n,!0):s==="external-objects"?Yn(o,"--type","/api/external-objects","type",n):s==="external-signals"?Xp(o,"--unhandled","/api/external-signals","unhandled",n):s==="attentions"||s==="attention"?o[0]==="ack"?Ux(o,n):Xp(o,"--unacked","/api/attentions","unacked",n):s==="stats"?Wx(o,n):s==="daemon"?Bx(o,n):s==="intake"?qx(o,n):s==="session"?Hx(o,n):s==="run"?Jx(o,e.format):s==="prs"?Yn(o,"--status","/api/submitted-prs","status",n):s==="pr"?Nx(o,n):`unknown subcommand: ${s}`}function er(t,e){let r={Accept:t};return e!==null&&e.length>0&&(r.Authorization=`Bearer ${e}`),r}function xr(t){if(t.dal!==void 0)return zn(t.dal,process.env,t);let e=pe({path:ue()});try{return zn(e,process.env,t)}finally{e.close()}}function zn(t,e,r){let n=[],s=t.getConfig("api.url"),o;s!==null?o=s:e.LMCTL_API_URL!==void 0&&e.LMCTL_API_URL.length>0?(o=e.LMCTL_API_URL,n.push("api.url")):o=lx;let i=t.getConfig("api.token"),a;i!==null?a=i:e.LMCTL_API_TOKEN!==void 0&&e.LMCTL_API_TOKEN.length>0?(a=e.LMCTL_API_TOKEN,n.push("api.token")):a=null;for(let l of n)r.stderr.write(`note: ${dx(l)} env var read; consider \`lmctl api config set ${l} ...\` to make this DB-canonical.
1185
+ `);return{baseUrl:o,token:a}}function dx(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function fx(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`usage: lmctl api config <get|set|list>
1198
1186
  `),2;let s=e.dal===void 0,o=e.dal??pe({path:ue()});try{if(r==="get"){if(n.length!==1)return e.stderr.write(`usage: lmctl api config get <key>
1199
1187
  `),2;let i=n[0];if(!Ho.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Ho].join(", ")})
1200
1188
  `),2;let a=o.getConfig(i);return a===null?(e.stderr.write(`error: ${i} is not set
1201
1189
  `),1):(e.stdout.write(`${a}
1202
1190
  `),0)}if(r==="set"){if(n.length!==2)return e.stderr.write(`usage: lmctl api config set <key> <value>
1203
1191
  `),2;let[i,a]=n;if(!Ho.has(i))return e.stderr.write(`error: unsupported config key: ${i} (Phase A keys: ${[...Ho].join(", ")})
1204
- `),2;let l=kN(i,a);return l!==null?(e.stderr.write(`error: ${l}
1192
+ `),2;let l=kx(i,a);return l!==null?(e.stderr.write(`error: ${l}
1205
1193
  `),2):(o.setConfig(i,a),e.stdout.write(`${i} = ${Jp(i,a,!1)}
1206
1194
  `),0)}if(r==="list"){let i=!1;for(let c of n){if(c==="--show-secrets"){i=!0;continue}return e.stderr.write(`error: unknown flag: ${c}
1207
1195
  `),2}let a=o.getConfigAll(),l=Object.keys(a).sort();if(l.length===0)return e.stdout.write(`(no config rows)
1208
1196
  `),0;for(let c of l)e.stdout.write(`${c} = ${Jp(c,a[c],i)}
1209
1197
  `);return 0}return e.stderr.write(`error: unknown api config verb: ${r}
1210
- `),2}finally{s&&o.close()}}async function mN(t,e,r){if(Xo(t))return e.stdout.write(`${pN}
1198
+ `),2}finally{s&&o.close()}}async function mx(t,e,r){if(Xo(t))return e.stdout.write(`${px}
1211
1199
  `),0;let n=sh(t,"--direct"),s=r||n.present,o=n.rest,[i,...a]=o;return i===void 0?(e.stderr.write(`usage: lmctl api escalations <list|show|respond>
1212
- `),2):s?wN(i,a,e):i==="list"?EN(a,e):i==="show"?SN(a,e):i==="respond"?TN(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1213
- `),2)}function Xo(t){return t.some(e=>e==="--help"||e==="-h")}function wN(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ue()});try{return oh(s,[t,...e],r)}finally{n&&s.close()}}function Yp(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=yN(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ne(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function yN(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function EN(t,e){let r=Yp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1214
- `),2;let n=Nr(e),s=er("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1200
+ `),2):s?yx(i,a,e):i==="list"?Ex(a,e):i==="show"?Sx(a,e):i==="respond"?Tx(a,e):(e.stderr.write(`error: unknown api escalations verb: ${i}
1201
+ `),2)}function Xo(t){return t.some(e=>e==="--help"||e==="-h")}function yx(t,e,r){let n=r.dal===void 0,s=r.dal??pe({path:ue()});try{return oh(s,[t,...e],r)}finally{n&&s.close()}}function Yp(t){let e,r=!1,n=!1,s;for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--json"){r=!0;continue}if(a==="--all"){n=!0;continue}if(a==="--project"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --project";e=l;continue}if(a==="--since"){let l=t[++i];if(l===void 0||l.startsWith("--"))return"missing value for --since";let c=wx(l);if(typeof c=="object"&&"error"in c)return c.error;s=c.iso;continue}return ne(a)}let o={json:r,all:n};return e!==void 0&&(o.project=e),s!==void 0&&(o.since=s),o}function wx(t){let e=/^(\d+)([smhd])$/.exec(t);if(e!==null){let n=Number(e[1]),s=e[2],o=s==="s"?n:s==="m"?n*60:s==="h"?n*3600:n*86400;return{iso:new Date(Date.now()-o*1e3).toISOString()}}let r=Date.parse(t);return Number.isNaN(r)?{error:`invalid --since value: ${t} (expected ISO8601 or duration like 24h)`}:{iso:new Date(r).toISOString()}}async function Ex(t,e){let r=Yp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1202
+ `),2;let n=xr(e),s=er("application/json",n.token),o=new URLSearchParams;r.project!==void 0&&o.set("project",r.project),r.all&&o.set("all","true"),r.since!==void 0&&o.set("since",r.since);let i=o.toString().length>0?`?${o.toString()}`:"",a;try{a=await fetch(new URL(`/api/escalations${i}`,n.baseUrl),{method:"GET",headers:s})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1215
1203
  `),1}if(!a.ok)return e.stderr.write(`error: HTTP ${a.status}: ${await a.text()}
1216
1204
  `),a.status===400?2:1;let l=await a.json();return zp(l,r.json,e)}function zp(t,e,r){if(e)return r.stdout.write(`${JSON.stringify(t,null,2)}
1217
1205
  `),0;if(t.length===0)return r.stdout.write(`No pending escalations.
1218
1206
  `),0;r.stdout.write(`${t.length} pending escalation${t.length===1?"":"s"}:
1219
1207
 
1220
1208
  `);for(let n of t){if(n.run_id===null){r.stderr.write(`warning: attention #${n.attention_id} has no run_id; skipping
1221
- `);continue}let s=n.project??"<unknown-project>",o=n.workflow_name??"<unknown-workflow>",i=n.state_name??"<unknown-state>",a=bN(n.created_at);if(r.stdout.write(`#${n.attention_id} ${s} run ${n.run_id} ${o}:${i} (paused ${a})
1209
+ `);continue}let s=n.project??"<unknown-project>",o=n.workflow_name??"<unknown-workflow>",i=n.state_name??"<unknown-state>",a=bx(n.created_at);if(r.stdout.write(`#${n.attention_id} ${s} run ${n.run_id} ${o}:${i} (paused ${a})
1222
1210
  `),n.prompt!==null&&n.prompt.length>0){let l=n.prompt.replaceAll(`
1223
1211
  `," ").trim(),c=l.length>240?`${l.slice(0,240)}\u2026`:l;r.stdout.write(` Q: ${JSON.stringify(c)}
1224
1212
  `)}r.stdout.write(` Respond: lmctl api escalations respond ${n.attention_id} "<answer>" [--done to end chat]
1225
1213
  `),r.stdout.write(`
1226
- `)}return 0}function bN(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function SN(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
1214
+ `)}return 0}function bx(t){let e=Date.parse(t);if(Number.isNaN(e))return"recently";let r=Math.max(0,Math.round((Date.now()-e)/1e3));if(r<60)return`${r}s ago`;let n=Math.round(r/60);if(n<60)return`${n}m ago`;let s=Math.round(n/60);return s<24?`${s}h ago`:`${Math.round(s/24)}d ago`}async function Sx(t,e){let r=t.filter(a=>a!=="--json"&&a!=="--text");if(r.length!==1)return e.stderr.write(`usage: lmctl api escalations show <attention_id> [--json|--text]
1227
1215
  `),2;let n=se(r[0],"attention_id");if(typeof n=="string")return e.stderr.write(`error: ${n}
1228
- `),2;let s=Nr(e),o=er("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1216
+ `),2;let s=xr(e),o=er("application/json",s.token),i;try{i=await fetch(new URL(`/api/escalations/${n}`,s.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1229
1217
  `),1}return i.status===404?(e.stderr.write(`error: escalation not found: ${n}
1230
1218
  `),1):i.ok?(e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1231
1219
  `),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1232
- `),i.status===400?2:1)}async function TN(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
1220
+ `),i.status===400?2:1)}async function Tx(t,e){let r=!1,n=!1,s=[];for(let f=0;f<t.length;f+=1){let m=t[f];if(m==="--json"){r=!0;continue}if(m==="--done"){n=!0;continue}s.push(m)}if(s.length!==2)return e.stderr.write(`usage: lmctl api escalations respond <attention_id> "<answer>" [--done] [--json]
1233
1221
  `),2;let o=se(s[0],"attention_id");if(typeof o=="string")return e.stderr.write(`error: ${o}
1234
- `),2;let i=s[1],a=Nr(e),l=er("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
1222
+ `),2;let i=s[1],a=xr(e),l=er("application/json",a.token);l["Content-Type"]="application/json";let c={input:i};n&&(c.done=!0);let u;try{u=await fetch(new URL(`/api/escalations/${o}/respond`,a.baseUrl),{method:"POST",headers:l,body:JSON.stringify(c)})}catch(f){return e.stderr.write(`error: network failure: ${f instanceof Error?f.message:String(f)}
1235
1223
  `),1}if(u.status===404)return e.stderr.write(`error: escalation not found: ${o}
1236
1224
  `),1;if(!u.ok){let f=await u.text();return e.stderr.write(`error: HTTP ${u.status}: ${f}
1237
1225
  `),u.status===400?2:1}let d=await u.json();return r?e.stdout.write(`${JSON.stringify(d,null,2)}
1238
1226
  `):e.stdout.write(`ok: attention ${o} acknowledged; step ${d.step_id} resumed (session_status=${String(d.session_status)})
1239
- `),0}function Jp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function kN(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Ro||t===Oo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function vN(t,e){let r=oN(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:IN(t)}),iN(t)),e!==void 0&&s.append("project",e),s}function IN(t){switch(aN(t).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 NN(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function xN(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Yn(n,"--status","/api/submitted-prs","status",e);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:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function Zp(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function Jo(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Yn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Xp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function $N(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function jN(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return $N([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];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}`;o=p}else if(f==="--source")i=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&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=gc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}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:e}}return"usage: lmctl api job <id|enqueue|run>"}function AN(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return ne(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}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:e}}return r==="create"?Qp(n,e):r==="claim"?eh(n,e):r==="claim-next"?th(n,e):r==="close"?rh(n,e):r==="reopen"?nh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Qp(t,e){let[r,...n]=t;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"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=gc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function eh(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];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;o.assigned_run_id=c}else return ne(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function th(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(i)}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:e,body:JSON.stringify(s)}}function rh(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function nh(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];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;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function RN(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function ON(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function gc(t){try{return JSON.parse(t)}catch{return t}}function LN(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function CN(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function MN(t,e){let[r,n,...s]=t;return r==="workflow"?DN([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function DN(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};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:e?"application/json":"text/html",json:e}}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 o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=PN(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function PN(t){let[e,r,...n]=t;if(e===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 o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=gc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function FN(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];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&&e}}function UN(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function WN(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function BN(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function qN(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function HN(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=jo(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function JN(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=se(n,"run_id");if(typeof i=="string")return i;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/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 i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return ne(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function sh(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function XN(t,e){let r=Zp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1227
+ `),0}function Jp(t,e,r){return t!=="api.token"||r?e:e.length<=8?"***":`${e.slice(0,8)}\u2026(masked; use --show-secrets to reveal)`}function kx(t,e){if(e.length===0)return`${t} value must be non-empty`;if(t==="api.port"){let r=Number(e);if(!Number.isInteger(r)||r<=0||r>65535)return`invalid api.port: ${e}`}if(t==="api.url")try{new URL(e)}catch{return`invalid api.url: ${e}`}if(t===Ro||t===Oo){let r=Number(e);if(!Number.isInteger(r)||r<=0)return`invalid ${t}: ${e}`}return null}function vx(t,e){let r=ox(t),n=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength),s=new FormData;return s.append("image",new Blob([n],{type:Ix(t)}),ix(t)),e!==void 0&&s.append("project",e),s}function Ix(t){switch(ax(t).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 xx(t){if(t!==null&&typeof t=="object"&&!Array.isArray(t)){let e=t.id;return typeof e=="number"&&Number.isInteger(e)?e:null}return null}function Nx(t,e){let[r,...n]=t;if(r===void 0)return"usage: lmctl api pr <id|list|get>";if(r==="list")return Yn(n,"--status","/api/submitted-prs","status",e);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:e}:{method:"GET",path:`/api/submitted-prs?pr_url=${encodeURIComponent(s)}`,accept:"application/json",json:e}}return/^\d+$/.test(r)?{method:"GET",path:`/api/submitted-prs/${r}`,accept:"application/json",json:e}:`usage: lmctl api pr <id|list|get>; got: ${r}`}function Zp(t){let e=[],r="json";for(let n of t)n==="--json"?r="json":n==="--text"?r="text":e.push(n);return{args:e,format:r}}function Jo(t,e,r){return t.length>0?ne(t[0]):{method:"GET",path:e,accept:r?"application/json":"text/html",json:r}}function Yn(t,e,r,n,s,o=!1){let i;for(let l=0;l<t.length;l+=1){let c=t[l];if(c!==e)return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${e}`;if(o&&(!/^\d+$/.test(u)||Number(u)<=0))return`invalid ${e}: ${u}`;i=u}let a=i===void 0?"":`?${n}=${encodeURIComponent(i)}`;return{method:"GET",path:`${r}${a}`,accept:s?"application/json":"text/html",json:s}}function Xp(t,e,r,n,s){let o=!1;for(let i of t){if(i!==e)return ne(i);o=!0}return{method:"GET",path:`${r}${o?`?${n}=true`:""}`,accept:s?"application/json":"text/html",json:s}}function $x(t,e,r){if(t.length!==1)return`usage: lmctl api ${r} <id>`;let n=se(t[0],"id");return typeof n=="string"?n:{method:"GET",path:`${e}/${n}`,accept:"application/json",json:!0}}function jx(t,e){let[r,...n]=t;if(r!==void 0&&n.length===0&&r!=="enqueue"&&r!=="run")return $x([r],"/api/jobs","job");if(r==="enqueue"){let s,o,i="manual",a,l,c;for(let d=0;d<n.length;d+=1){let f=n[d],m=n[++d];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}`;o=p}else if(f==="--source")i=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&&o===void 0)return"usage: lmctl api job enqueue --project NAME [--source S] [--payload JSON] [--dedupe-key K] [--priority N]";let u={source:i};return s!==void 0&&(u.project=s),o!==void 0&&(u.project_id=o),a!==void 0&&(u.payload=gc(a)),l!==void 0&&(u.dedupe_key=l),c!==void 0&&(u.priority=c),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(u)}}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:e}}return"usage: lmctl api job <id|enqueue|run>"}function Ax(t,e){let[r,...n]=t;if(r==="list"){let[s,...o]=n;if(s===void 0||s.startsWith("--"))return"usage: lmctl api issues list <project> [--status STATUS] [--severity SEVERITY]";let i=new URLSearchParams;for(let l=0;l<o.length;l+=1){let c=o[l],u=o[++l];if(u===void 0||u.startsWith("--"))return`missing value for ${c}`;if(c==="--status")i.set("status",u);else if(c==="--severity")i.set("severity",u);else if(c==="--ai-test-path")i.set("ai_test_path",u);else return ne(c)}let a=i.toString();return{method:"GET",path:`/api/projects/${encodeURIComponent(s)}/issues${a.length>0?`?${a}`:""}`,accept:e?"application/json":"text/html",json:e}}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:e}}return r==="create"?Qp(n,e):r==="claim"?eh(n,e):r==="claim-next"?th(n,e):r==="close"?rh(n,e):r==="reopen"?nh(n,e):"usage: lmctl api issues <list|show|create|claim|claim-next|close|reopen>"}function Qp(t,e){let[r,...n]=t;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"]),o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0)return`missing value for ${a}`;if(!s.has(a)&&l.startsWith("--"))return`missing value for ${a}`;if(a==="--title")o.title=l;else if(a==="--body")o.body=l;else if(a==="--severity")o.severity=l;else if(a==="--labels")o.labels=gc(l);else if(a==="--ai-test-path")o.ai_test_path=l;else if(a==="--source-run-id"){let c=se(l,"--source-run-id");if(typeof c=="string")return c;o.source_run_id=c}else return ne(a)}return typeof o.title!="string"?"missing value for --title":typeof o.body!="string"?"missing value for --body":{method:"POST",path:`/api/projects/${encodeURIComponent(r)}/issues`,accept:"application/json",json:e,body:JSON.stringify(o)}}function eh(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];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;o.assigned_run_id=c}else return ne(a)}return typeof o.assigned_run_id!="number"?"missing value for --assigned-run-id":{method:"POST",path:`/api/issues/${s}/claim`,accept:"application/json",json:e,body:JSON.stringify(o)}}function th(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api issues claim-next <project> --assigned-run-id RUN";let s={};for(let o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--assigned-run-id"){let l=se(a,"--assigned-run-id");if(typeof l=="string")return l;s.assigned_run_id=l}else return ne(i)}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:e,body:JSON.stringify(s)}}function rh(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];if(l===void 0||l.startsWith("--"))return`missing value for ${a}`;if(a==="--commit-hash")o.commit_hash=l;else if(a==="--closed-run-id"){let c=se(l,"--closed-run-id");if(typeof c=="string")return c;o.closed_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/close`,accept:"application/json",json:e,body:JSON.stringify(o)}}function nh(t,e){let[r,...n]=t;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 o={};for(let i=0;i<n.length;i+=1){let a=n[i],l=n[++i];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;o.source_run_id=c}else return ne(a)}return{method:"POST",path:`/api/issues/${s}/reopen`,accept:"application/json",json:e,body:JSON.stringify(o)}}function Rx(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return"usage: lmctl api upload <file> [--project NAME] [--json]";let s;for(let o=0;o<n.length;o+=1){let i=n[o];if(i!=="--project")return ne(i);let a=n[++o];if(a===void 0||a.startsWith("--"))return"missing value for --project";s=a}return{method:"POST",path:"/api/uploads",accept:"application/json",json:e,upload:{filePath:r,project:s}}}function Ox(t,e){let r,n,s,o;for(let a=0;a<t.length;a+=1){let l=t[a],c=t[++a];if(c===void 0||c.startsWith("--"))return`missing value for ${l}`;if(l==="--workflow")r=c;else if(l==="--workflow-id-override"){let u=Number(c);if(!Number.isInteger(u)||u<=0)return`invalid --workflow-id-override: ${c}`;n=u}else if(l==="--project")s=c;else if(l==="--inputs")try{let u=JSON.parse(c);if(u===null||typeof u!="object"||Array.isArray(u))return"--inputs must be a JSON object";o=u}catch{return"invalid --inputs JSON"}else return ne(l)}if(r===void 0&&n===void 0)return"missing value for --workflow";if(o===void 0)return"missing value for --inputs";let i={source:"api-submit-job",payload:o};return r!==void 0&&(i.workflow=r),n!==void 0&&(i.workflow_id_override=n),s!==void 0&&(i.project=s),{method:"POST",path:"/api/jobs",accept:"application/json",json:e,body:JSON.stringify(i),runAfterSubmit:!0}}function gc(t){try{return JSON.parse(t)}catch{return t}}function Lx(t,e){let[r,n]=t;return r!=="show"||n===void 0||t.length!==2?"usage: lmctl api workflow show <name>":{method:"GET",path:`/api/workflows/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Cx(t,e){for(let r of t)if(!(r==="--json"||r==="--text"))return ne(r);return{method:"GET",path:"/api/workflows/verify",accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}function Mx(t,e){let[r,n,...s]=t;return r==="workflow"?Dx([n,...s].filter(o=>o!==void 0),e):r!=="show"||n===void 0||t.length!==2?"usage: lmctl api project <show|workflow>":{method:"GET",path:`/api/projects/${encodeURIComponent(n)}`,accept:"application/json",json:e}}function Dx(t,e){let[r,...n]=t;if(r==="list")return n.length!==1?"usage: lmctl api project workflow list <project>":{method:"GET",path:`/api/projects/${encodeURIComponent(n[0])}/workflows`,accept:e?"application/json":"text/html",json:e};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:e?"application/json":"text/html",json:e}}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 o=r==="remove"?"DELETE":"POST",i=r==="remove"?"":`/${r}`;return{method:o,path:`/api/projects/workflows/${s}${i}`,accept:"application/json",json:e}}if(r==="add"){let s=Px(n);return typeof s=="string"?s:{method:"POST",path:`/api/projects/${encodeURIComponent(s.project)}/workflows`,accept:"application/json",json:e,body:JSON.stringify(s.body)}}return"usage: lmctl api project workflow <add|list|show|remove|enable|disable>"}function Px(t){let[e,r,...n]=t;if(e===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 o=0;o<n.length;o+=1){let i=n[o],a=n[++o];if(a===void 0||a.startsWith("--"))return`missing value for ${i}`;if(i==="--condition")s.condition=a;else if(i==="--params")s.params=gc(a);else if(i==="--priority"){let l=Number(a);if(!Number.isInteger(l))return`invalid --priority: ${a}`;s.priority=l}else return ne(i)}return{project:e,body:s}}function Fx(t,e){if(t[0]!=="get")return"usage: lmctl api artifact get --run R --kind K [--raw]";let r,n,s=!1;for(let i=1;i<t.length;i+=1){let a=t[i];if(a==="--raw"){s=!0;continue}let l=t[++i];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&&e}}function Ux(t,e){if(t[0]!=="ack"||t.length!==2)return"usage: lmctl api attention ack <id>";let r=se(t[1],"id");return typeof r=="string"?r:{method:"POST",path:`/api/attentions/${r}/ack`,accept:e?"application/json":"text/html",json:e}}function Wx(t,e){return t.length!==1||t[0]!=="run-throughput"?"usage: lmctl api stats run-throughput":{method:"GET",path:"/api/stats/run-throughput",accept:e?"application/json":"text/html",json:e}}function Bx(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="cycle"?"usage: lmctl api daemon <state|cycle>":{method:t[0]==="cycle"?"POST":"GET",path:t[0]==="cycle"?"/api/daemon/cycle":"/api/daemon/state",accept:e?"application/json":"text/html",json:e}}function qx(t,e){return t.length!==1||t[0]!=="state"&&t[0]!=="scan"?"usage: lmctl api intake <state|scan>":{method:t[0]==="scan"?"POST":"GET",path:t[0]==="scan"?"/api/intake/scan":"/api/intake/state",accept:e?"application/json":"text/html",json:e}}function Hx(t,e){let r=t[0];if(r==="list")return t.length!==1?"usage: lmctl api session list":{method:"GET",path:"/api/sessions",accept:e?"application/json":"text/html",json:e};if(r==="history"||r==="compact"||r==="refresh"){if(t.length!==3)return`usage: lmctl api session ${r} <team_name> <alias>`;let n=jo(t[1]),s=encodeURIComponent(t[2]);return{method:r==="history"?"GET":"POST",path:`/api/sessions/${n}/${s}/${r}`,accept:e?"application/json":"text/html",json:e}}return"usage: lmctl api session <list|history|compact|refresh>"}function Jx(t,e){let[r,n,s,o]=t;if(r!==void 0&&/^\d+$/.test(r)&&n===void 0){let i=se(r,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="resume"){if(n===void 0)return"usage: lmctl api run resume <run_id> --outcome <value>";let i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let l=2;l<t.length;l+=1){let c=t[l];if(c!=="--outcome")return ne(c);let u=t[++l];if(u===void 0||u.startsWith("--"))return"missing value for --outcome";a=u}return a===void 0?"missing value for --outcome":{method:"POST",path:`/api/runs/${i}/resume?outcome=${encodeURIComponent(a)}`,accept:e==="text"?"text/html":"application/json",json:e!=="text"}}if(r==="get"){if(n===void 0||s!==void 0)return"usage: lmctl api run get <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}`,accept:"application/json",json:e!=="text"}}if(r==="step"||r==="transcript"||r==="messages"){if(n===void 0||s===void 0||o!==void 0)return`usage: lmctl api run ${r} <run_id> <step_id>`;let i=se(n,"run_id");if(typeof i=="string")return i;let a=se(s,"step_id");if(typeof a=="string")return a;let l=r==="step"?"":`/${r}`,c=r==="transcript"&&e==="text";return{method:"GET",path:`/api/runs/${i}/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 i=se(n,"run_id");if(typeof i=="string")return i;let a;for(let c=2;c<t.length;c+=1){let u=t[c];if(u!=="--kind")return ne(u);let d=t[++c];if(d===void 0)return"missing value for --kind";a=d}let l=a===void 0?"":`?kind=${encodeURIComponent(a)}`;return{method:"GET",path:`/api/runs/${i}/artifacts${l}`,accept:"application/json",json:e!=="text"}}if(r==="where"){if(n===void 0||s!==void 0)return"usage: lmctl api run where <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/where`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}if(r==="timeline"){if(n===void 0||s!==void 0)return"usage: lmctl api run timeline <run_id>";let i=se(n,"run_id");return typeof i=="string"?i:{method:"GET",path:`/api/runs/${i}/timeline`,accept:e==="text"?"text/plain":"application/json",json:e!=="text"}}return"usage: lmctl api run <id|get|step|transcript|messages|resume|artifacts|where|timeline>"}function se(t,e){return t===void 0||t.startsWith("--")?`missing value for ${e}`:!/^\d+$/.test(t)||Number(t)<=0?`invalid ${e}: ${t}`:Number(t)}function ne(t){return t.startsWith("--")?`unknown flag: ${t}`:`unknown argument: ${t}`}function sh(t,e){let r=[],n=!1;for(let s of t){if(s===e){n=!0;continue}r.push(s)}return{rest:r,present:n}}async function Xx(t,e){let r=Zp(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1240
1228
  `),2;let n=r.args,s=r.format!=="text",[o,...i]=n;if(o===void 0)return e.stderr.write(`error: --direct requires a subcommand (issues|status|projects|workflows|runs|attentions)
1241
1229
  `),2;let a=e.dal===void 0,l=e.dal??pe({path:ue()});try{if(o==="issues"){let[c,...u]=i;return c===void 0?(e.stderr.write(`error: --direct issues requires a subcommand (list|show|create|claim|claim-next|close|reopen)
1242
- `),2):c==="create"?GN(l,u,e,s):c==="claim"?VN(l,u,e,s):c==="claim-next"?KN(l,u,e,s):c==="close"?YN(l,u,e,s):c==="reopen"?zN(l,u,e,s):c==="list"?tx(l,u,e,s):c==="show"?rx(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1243
- `),2)}return o==="status"?nx(l,i,e,s):o==="projects"?sx(l,i,e,s):o==="workflows"?ox(l,i,e,s):o==="runs"?ix(l,i,e,s):o==="attentions"||o==="attention"?fx(l,i,e,s):o==="escalations"?oh(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1230
+ `),2):c==="create"?Gx(l,u,e,s):c==="claim"?Vx(l,u,e,s):c==="claim-next"?Kx(l,u,e,s):c==="close"?Yx(l,u,e,s):c==="reopen"?zx(l,u,e,s):c==="list"?tN(l,u,e,s):c==="show"?rN(l,u,e,s):(e.stderr.write(`error: --direct does not support: issues ${c} (supported: list, show, create, claim, claim-next, close, reopen)
1231
+ `),2)}return o==="status"?nN(l,i,e,s):o==="projects"?sN(l,i,e,s):o==="workflows"?oN(l,i,e,s):o==="runs"?iN(l,i,e,s):o==="attentions"||o==="attention"?fN(l,i,e,s):o==="escalations"?oh(l,i,e):(e.stderr.write(`error: --direct is not supported for: ${o} (supported: issues, status, projects, workflows, runs, attentions, escalations, run where, run timeline)
1244
1232
  `),2)}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
1245
1233
  `),1}finally{a&&l.close()}}function Je(t,e,r){t.stdout.write(`${r?JSON.stringify(e,null,2):JSON.stringify(e)}
1246
- `)}function GN(t,e,r,n){let s=Qp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1234
+ `)}function Gx(t,e,r,n){let s=Qp(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1247
1235
  `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1248
- `),1;let a=JSON.parse(s.body),l=ZN(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
1249
- `),2;let c=QN(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
1250
- `),2;let u=t.createIssue({project_id:i.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 Je(r,u,n),0}function VN(t,e,r,n){let s=eh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1236
+ `),1;let a=JSON.parse(s.body),l=Zx(a.severity);if(typeof l=="object"&&l!==null&&"error"in l)return r.stderr.write(`error: ${l.error}
1237
+ `),2;let c=Qx(a.labels);if(typeof c=="string"&&c.startsWith("error:"))return r.stderr.write(`error: ${c.slice(6)}
1238
+ `),2;let u=t.createIssue({project_id:i.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 Je(r,u,n),0}function Vx(t,e,r,n){let s=eh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1251
1239
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/claim$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1252
1240
  `),1;let l=t.claimIssue(o,i.assigned_run_id);return l===null?(r.stderr.write(`error: issue ${o} is not in a claimable state (status=${a.status})
1253
- `),1):(Je(r,l,n),0)}function KN(t,e,r,n){let s=th(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1241
+ `),1):(Je(r,l,n),0)}function Kx(t,e,r,n){let s=th(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1254
1242
  `),2;let o=decodeURIComponent(s.path.replace(/^\/api\/projects\//,"").replace(/\/issues\/claim-next$/,"")),i=t.findProjectByName(o);if(i===null)return r.stderr.write(`error: project not found: ${o}
1255
- `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Je(r,{status:"queue_empty"},n),1):(Je(r,l,n),0)}function YN(t,e,r,n){let s=rh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1243
+ `),1;let a=JSON.parse(s.body),l=t.claimNextIssue(i.id,a.assigned_run_id);return l===null?(Je(r,{status:"queue_empty"},n),1):(Je(r,l,n),0)}function Yx(t,e,r,n){let s=rh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1256
1244
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/close$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1257
1245
  `),1;let l=typeof i.closed_run_id=="number"?i.closed_run_id:a.assigned_run_id;if(l===null)return r.stderr.write(`error: missing closed_run_id
1258
- `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Je(r,c,n),0}function zN(t,e,r,n){let s=nh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1246
+ `),2;let c=t.closeIssue(o,l,typeof i.commit_hash=="string"?i.commit_hash:null);return Je(r,c,n),0}function zx(t,e,r,n){let s=nh(e,!0);if(typeof s=="string")return r.stderr.write(`error: ${s}
1259
1247
  `),2;let o=Number(s.path.match(/\/api\/issues\/(\d+)\/reopen$/)[1]),i=JSON.parse(s.body),a=t.getIssue(o);if(a===null)return r.stderr.write(`error: issue not found: ${o}
1260
1248
  `),1;let l=typeof i.source_run_id=="number"?i.source_run_id:a.closed_run_id??a.source_run_id;if(l===null)return r.stderr.write(`error: missing source_run_id
1261
- `),2;let c=t.reopenIssue(o,l);return Je(r,c,n),0}function ZN(t){if(t!=null)return typeof t=="string"&&Vp.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function QN(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function tx(t,e,r,n){let[s,...o]=e;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]
1249
+ `),2;let c=t.reopenIssue(o,l);return Je(r,c,n),0}function Zx(t){if(t!=null)return typeof t=="string"&&Vp.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function Qx(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function tN(t,e,r,n){let[s,...o]=e;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]
1262
1250
  `),2;let i,a,l;for(let d=0;d<o.length;d+=1){let f=o[d],m=o[++d];if(m===void 0||m.startsWith("--"))return r.stderr.write(`error: missing value for ${f}
1263
- `),2;if(f==="--status"){let p=Gp(m,ex);if(typeof p=="string")return r.stderr.write(`error: ${p}
1251
+ `),2;if(f==="--status"){let p=Gp(m,eN);if(typeof p=="string")return r.stderr.write(`error: ${p}
1264
1252
  `),2;i=p}else if(f==="--severity"){let p=Gp(m,Vp);if(typeof p=="string")return r.stderr.write(`error: ${p}
1265
1253
  `),2;a=p}else if(f==="--ai-test-path")l=m;else return r.stderr.write(`error: ${ne(f)}
1266
1254
  `),2}let c=t.findProjectByName(s);if(c===null)return r.stderr.write(`error: project not found: ${s}
1267
- `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Je(r,u,n),0}function rx(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
1255
+ `),1;let u=t.listIssues(c.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...l!==void 0?{ai_test_path:l}:{}});return Je(r,u,n),0}function rN(t,e,r,n){if(e.length!==1)return r.stderr.write(`error: usage: lmctl api --direct issues show <id>
1268
1256
  `),2;let s=se(e[0],"id");if(typeof s=="string")return r.stderr.write(`error: ${s}
1269
1257
  `),2;let o=t.getIssue(s);return o===null?(r.stderr.write(`error: issue not found: ${s}
1270
- `),1):(Je(r,o,n),0)}function nx(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1271
- `),2):(Je(r,Co(t),n),0)}function sx(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1272
- `),2):(Je(r,Mo(t),n),0)}function ox(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1273
- `),2):(Je(r,Do(t),n),0)}function ix(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1258
+ `),1):(Je(r,o,n),0)}function nN(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1259
+ `),2):(Je(r,Co(t),n),0)}function sN(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1260
+ `),2):(Je(r,Mo(t),n),0)}function oN(t,e,r,n){return e.length>0?(r.stderr.write(`error: ${ne(e[0])}
1261
+ `),2):(Je(r,Do(t),n),0)}function iN(t,e,r,n){let s;for(let o=0;o<e.length;o+=1){let i=e[o],a=e[++o];if(a===void 0||a.startsWith("--"))return r.stderr.write(`error: missing value for ${i}
1274
1262
  `),2;if(i==="--limit"){if(!/^\d+$/.test(a)||Number(a)<=0)return r.stderr.write(`error: invalid --limit: ${a}
1275
1263
  `),2;s=Number(a)}else return r.stderr.write(`error: ${ne(i)}
1276
- `),2}return Je(r,Yr(t,s!==void 0?{limit:s}:{}),n),0}function ax(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1264
+ `),2}return Je(r,Yr(t,s!==void 0?{limit:s}:{}),n),0}function aN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run where <run_id> [--json]
1277
1265
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1278
1266
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}return e.stderr.write(`error: ${ne(a)}
1279
1267
  `),2}let o=e.dal===void 0,i=e.dal??pe({path:ue()});try{let a=zr(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1280
1268
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1281
- `):e.stdout.write(Uo(a)),0)}finally{o&&i.close()}}async function lx(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1269
+ `):e.stdout.write(Uo(a)),0)}finally{o&&i.close()}}async function lN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run where <run_id> [--json]
1282
1270
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1283
1271
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${ne(c)}
1284
- `),2}let o=Nr(e),a=er(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1272
+ `),2}let o=xr(e),a=er(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/where`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1285
1273
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1286
1274
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1287
1275
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1288
- `),l.status===404?1:l.status===400?2:1)}function cx(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1276
+ `),l.status===404?1:l.status===400?2:1)}function cN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api --direct run timeline <run_id> [--json]
1289
1277
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1290
1278
  `),2;let s=!1;for(let a of n){if(a==="--json"){s=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ne(a)}
1291
1279
  `),2}let o=e.dal===void 0,i=e.dal??pe({path:ue()});try{let a=Wo(i,Number(r));return a===null?(e.stderr.write(`error: run not found: ${r}
1292
1280
  `),1):(s?e.stdout.write(`${JSON.stringify(a,null,2)}
1293
- `):e.stdout.write(Bo(a)),0)}finally{o&&i.close()}}async function ux(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1281
+ `):e.stdout.write(Bo(a)),0)}finally{o&&i.close()}}async function uN(t,e){let[r,...n]=t;if(r===void 0)return e.stderr.write(`error: usage: lmctl api run timeline <run_id> [--json]
1294
1282
  `),2;if(!/^\d+$/.test(r)||Number(r)<=0)return e.stderr.write(`error: invalid run_id: ${r}
1295
1283
  `),2;let s=!1;for(let c of n){if(c==="--json"){s=!0;continue}if(c!=="--text")return e.stderr.write(`error: ${ne(c)}
1296
- `),2}let o=Nr(e),a=er(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1284
+ `),2}let o=xr(e),a=er(s?"application/json":"text/plain",o.token),l;try{l=await fetch(new URL(`/api/runs/${r}/timeline`,o.baseUrl),{method:"GET",headers:a})}catch(c){return e.stderr.write(`error: network failure: ${c instanceof Error?c.message:String(c)}
1297
1285
  `),2}return l.ok?(s?e.stdout.write(`${JSON.stringify(await l.json(),null,2)}
1298
1286
  `):(e.stdout.write(await l.text()),l.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1299
1287
  `)),0):(e.stderr.write(`error: HTTP ${l.status}: ${await l.text()}
1300
- `),l.status===404?1:l.status===400?2:1)}async function dx(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ne(a)}
1301
- `),2}let n=Nr(e),o=er(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1288
+ `),l.status===404?1:l.status===400?2:1)}async function dN(t,e){let r=!1;for(let a of t){if(a==="--json"){r=!0;continue}if(a!=="--text")return e.stderr.write(`error: ${ne(a)}
1289
+ `),2}let n=xr(e),o=er(r?"application/json":"text/plain",n.token),i;try{i=await fetch(new URL("/api/workflows/verify",n.baseUrl),{method:"GET",headers:o})}catch(a){return e.stderr.write(`error: network failure: ${a instanceof Error?a.message:String(a)}
1302
1290
  `),2}return i.ok?(r?e.stdout.write(`${JSON.stringify(await i.json(),null,2)}
1303
1291
  `):(e.stdout.write(await i.text()),i.headers.get("content-type")?.includes("text/plain")||e.stdout.write(`
1304
1292
  `)),0):(e.stderr.write(`error: HTTP ${i.status}: ${await i.text()}
1305
- `),i.status===400?2:1)}function fx(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${ne(o)}
1293
+ `),i.status===400?2:1)}function fN(t,e,r,n){let s=!1;for(let o of e){if(o==="--unacked"){s=!0;continue}return r.stderr.write(`error: ${ne(o)}
1306
1294
  `),2}return Je(r,Qt(t,{unacked:s}),n),0}function oh(t,e,r){let[n,...s]=e;if(n===void 0)return r.stderr.write(`error: --direct escalations requires a subcommand (list|show|respond)
1307
1295
  `),2;if(n==="list"){let o=Yp(s);if(typeof o=="string")return r.stderr.write(`error: ${o}
1308
1296
  `),2;let i={all:o.all};o.project!==void 0&&(i.project=o.project),o.since!==void 0&&(i.since=o.since);let a=Fo(t,i);return zp(a,o.json,r)}if(n==="show"){let o=s.filter(l=>l!=="--json"&&l!=="--text");if(o.length!==1)return r.stderr.write(`usage: lmctl api --direct escalations show <attention_id> [--json|--text]
1309
1297
  `),2;let i=se(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1310
- `),2;let a=wt(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1298
+ `),2;let a=yt(t,i);return a===null?(r.stderr.write(`error: escalation not found: ${i}
1311
1299
  `),1):(r.stdout.write(`${JSON.stringify(a,null,2)}
1312
- `),0)}return n==="respond"?mx(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
1313
- `),2)}function mx(t,e,r){let n=!1,s=!1,o=[];for(let m of e){if(m==="--json"){n=!0;continue}if(m==="--done"){s=!0;continue}o.push(m)}if(o.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
1300
+ `),0)}return n==="respond"?mN(t,s,r):(r.stderr.write(`error: --direct escalations does not support: ${n} (supported: list, show, respond)
1301
+ `),2)}function mN(t,e,r){let n=!1,s=!1,o=[];for(let m of e){if(m==="--json"){n=!0;continue}if(m==="--done"){s=!0;continue}o.push(m)}if(o.length!==2)return r.stderr.write(`usage: lmctl api --direct escalations respond <attention_id> "<answer>" [--done] [--json]
1314
1302
  `),2;let i=se(o[0],"attention_id");if(typeof i=="string")return r.stderr.write(`error: ${i}
1315
- `),2;let a=o[1],l=wt(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
1303
+ `),2;let a=o[1],l=yt(t,i);if(l===null)return r.stderr.write(`error: escalation not found: ${i}
1316
1304
  `),1;let c=Qt(t).find(m=>m.id===i);if(c===void 0)return r.stderr.write(`error: escalation not found: ${i}
1317
1305
  `),1;if(c.kind==="workflow_escalation"){let m=t.resumeEscalation(i,a);if(!m.resumed)return r.stderr.write(`error: escalation resume failed: ${m.reason} (attention=${i})
1318
1306
  `),2;let p=Qt(t).find(g=>g.id===i),h={ok:!0,attention_id:i,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)}
@@ -1323,12 +1311,12 @@ ${r}`:r}function k0(t){let e=[...t.matchAll(y0)];if(e.length>0){let r=e[e.length
1323
1311
  `),2;let u=t.resumeInteractive(l.step_id,a,s);if(!u.resumed)return r.stderr.write(`error: interactive respond failed: ${u.reason} (step_id=${l.step_id})
1324
1312
  `),2;let d=t.acknowledgeAttention(i),f={ok:!0,attention_id:i,step_id:l.step_id,session_status:u.session.status,acknowledged_at:d?.acknowledged_at??null};return n?r.stdout.write(`${JSON.stringify(f,null,2)}
1325
1313
  `):r.stdout.write(`ok: attention ${i} acknowledged; step ${l.step_id} resumed (session_status=${f.session_status})
1326
- `),0}function Gp(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var lN,cN,Vp,Ho,pN,hN,_N,gN,ex,wc=b(()=>{"use strict";Pe();Ve();Ao();dc();Ot();lN="http://127.0.0.1:8787",cN=`usage: lmctl api [--direct] <subcommand> ...
1314
+ `),0}function Gp(t,e){let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length===0)return`invalid value: ${t}`;for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}var lx,cx,Vp,Ho,px,hx,_x,gx,eN,yc=b(()=>{"use strict";Pe();Ve();Ao();dc();Ot();lx="http://127.0.0.1:8787",cx=`usage: lmctl api [--direct] <subcommand> ...
1327
1315
 
1328
1316
  Call the lmctl HTTP API using the configured daemon URL/token. Some
1329
1317
  workflow shellstep-safe commands also support --direct to use the local DAL
1330
1318
  without an HTTP round trip.
1331
- `,Vp=["low","medium","high","critical"];Ho=new Set(["api.url","api.port","api.token","project.docroot",Ro,Oo]);pN=`usage: lmctl api escalations <list|show|respond>
1319
+ `,Vp=["low","medium","high","critical"];Ho=new Set(["api.url","api.port","api.token","project.docroot",Ro,Oo]);px=`usage: lmctl api escalations <list|show|respond>
1332
1320
 
1333
1321
  list [--project P] [--all] [--since DURATION] [--json]
1334
1322
  Print pending operator escalations (interactive_waiting_operator
@@ -1340,20 +1328,20 @@ without an HTTP round trip.
1340
1328
  single-record output is always JSON.
1341
1329
 
1342
1330
  respond <attention_id> "<answer>" [--done] [--json]
1343
- Reply to an interactive escalation. --done ends the chat.`,hN=`usage: lmctl api run where <run_id> [--json|--text]
1331
+ Reply to an interactive escalation. --done ends the chat.`,hx=`usage: lmctl api run where <run_id> [--json|--text]
1344
1332
 
1345
1333
  Print the workflow-position view (which state of which workflow the run is
1346
1334
  at, and any pending operator prompt). Default output is the TTY tree; --json
1347
1335
  emits the structured RunWhereDetail payload. Pair with --direct to bypass
1348
- HTTP for in-workflow shellsteps.`,_N=`usage: lmctl api run timeline <run_id> [--json|--text]
1336
+ HTTP for in-workflow shellsteps.`,_x=`usage: lmctl api run timeline <run_id> [--json|--text]
1349
1337
 
1350
1338
  Print the time-ordered run progression view. Default output is the TTY
1351
1339
  timeline; --json emits the structured RunTimeline payload. Pair with
1352
- --direct to bypass HTTP for in-workflow shellsteps.`,gN=`usage: lmctl api workflows verify [--json|--text]
1340
+ --direct to bypass HTTP for in-workflow shellsteps.`,gx=`usage: lmctl api workflows verify [--json|--text]
1353
1341
 
1354
1342
  Verify every workflows/*.compound.json file: load/validate the workflow graph
1355
1343
  and report the first step that would be started. Default output is the TTY
1356
- table; --json emits the structured WorkflowVerifyReport payload.`;ex=["open","assigned","closed","reopened"]});import{existsSync as ah,mkdirSync as px,readdirSync as hx,readFileSync as lh,writeFileSync as _x}from"node:fs";import{join as Zr}from"node:path";import{fileURLToPath as gx}from"node:url";function Zn(t){try{return wx.some(e=>ah(Zr(t,e)))}catch{return!1}}function yx(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function Go(t,e){t.durable_memory_mode!=="db"?Ex(t):bx(t,e)}function ch(t){let e=Zn(t),r;try{r=hx(yc).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function Ex(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Zr(e,"durable-memory");try{px(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=ch(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Zr(r,i);if(!ah(a))try{let l=lh(Zr(yc,o),"utf8");_x(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function bx(t,e){let r=t.local_path??"",n=ch(r),s=[];for(let o of n){let i=Zr(yc,o),a;try{a=lh(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=yx(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var yc,wx,Qn=b(()=>{"use strict";yc=Zr(gx(import.meta.url),"../../config/durable_memory_templates"),wx=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as Sx,mkdirSync as Tx,readdirSync as kx,readFileSync as vx,writeFileSync as Ix}from"node:fs";import{join as Vo}from"node:path";import{fileURLToPath as Nx}from"node:url";function Ko(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Zn(e))return;let r=Vo(e,"ai-test");try{Tx(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of xx()){let o=s.replace(/\.template$/,""),i=Vo(r,o);if(!Sx(i))try{Ix(i,$x(s),"utf8"),n.push(o)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function xx(){try{return kx(uh).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function $x(t){try{return vx(Vo(uh,t),"utf8")}catch{return jx(t)}}function jx(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1344
+ table; --json emits the structured WorkflowVerifyReport payload.`;eN=["open","assigned","closed","reopened"]});import{existsSync as ah,mkdirSync as pN,readdirSync as hN,readFileSync as lh,writeFileSync as _N}from"node:fs";import{join as Zr}from"node:path";import{fileURLToPath as gN}from"node:url";function Zn(t){try{return yN.some(e=>ah(Zr(t,e)))}catch{return!1}}function wN(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return!a||!l?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}function Go(t,e){t.durable_memory_mode!=="db"?EN(t):bN(t,e)}function ch(t){let e=Zn(t),r;try{r=hN(wc).filter(n=>n.endsWith(".template")).sort()}catch{return[]}return r.filter(n=>n==="skills_lmprobe.md.template"||n==="skills_lmdebug.md.template"?e:!0)}function EN(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping: project has no local_path");return}let r=Zr(e,"durable-memory");try{pN(r,{recursive:!0})}catch(o){console.error("[bootstrap] failed to create durable-memory directory:",o);return}let n=ch(e),s=[];for(let o of n){let i=o.replace(/\.template$/,""),a=Zr(r,i);if(!ah(a))try{let l=lh(Zr(wc,o),"utf8");_N(a,l,"utf8"),s.push(i)}catch(l){console.error(`[bootstrap] failed to copy ${o}:`,l)}}s.length>0&&console.log(`[bootstrap] filled durable-memory stubs at ${r}: ${s.join(", ")}`)}function bN(t,e){let r=t.local_path??"",n=ch(r),s=[];for(let o of n){let i=Zr(wc,o),a;try{a=lh(i,"utf8")}catch(c){console.error(`[bootstrap] failed to read ${o}:`,c);continue}let l=wN(a);if(l===null){console.error(`[bootstrap] failed to parse frontmatter in ${o}`);continue}if(e.getDurableMemoryByName(t.id,l.name)===null)try{e.upsertDurableMemory({project_id:t.id,type:l.type,name:l.name,description:l.description,body:l.body}),s.push(l.name)}catch(c){console.error(`[bootstrap] failed to upsert ${l.name}:`,c)}}s.length>0&&console.log(`[bootstrap] filled durable-memory DB stubs for project ${t.name}: ${s.join(", ")}`)}var wc,yN,Qn=b(()=>{"use strict";wc=Zr(gN(import.meta.url),"../../config/durable_memory_templates"),yN=[".git","package.json","Cargo.toml","pyproject.toml","go.mod","Gemfile","pom.xml","build.gradle","composer.json","Pipfile"]});import{existsSync as SN,mkdirSync as TN,readdirSync as kN,readFileSync as vN,writeFileSync as IN}from"node:fs";import{join as Vo}from"node:path";import{fileURLToPath as xN}from"node:url";function Ko(t){let e=t.local_path;if(!e){console.warn("[bootstrap] skipping ai-test: project has no local_path");return}if(!Zn(e))return;let r=Vo(e,"ai-test");try{TN(r,{recursive:!0})}catch(s){console.error("[bootstrap] failed to create ai-test directory:",s);return}let n=[];for(let s of NN()){let o=s.replace(/\.template$/,""),i=Vo(r,o);if(!SN(i))try{IN(i,$N(s),"utf8"),n.push(o)}catch(a){console.error(`[bootstrap] failed to copy ai-test ${s}:`,a)}}n.length>0&&console.log(`[bootstrap] filled ai-test stubs at ${r}: ${n.join(", ")}`)}function NN(){try{return kN(uh).filter(t=>t.endsWith(".template")).sort()}catch{return["example-test.md.template","index.md.template"]}}function $N(t){try{return vN(Vo(uh,t),"utf8")}catch{return jN(t)}}function jN(t){let e=t.replace(/\.template$/,"");return e==="index.md"?`# AI Test Suite - index
1357
1345
 
1358
1346
  Add test chapters in this directory.
1359
1347
  `:`---
@@ -1375,7 +1363,7 @@ last_run_id: 0
1375
1363
  ## Expected
1376
1364
 
1377
1365
  ## Cleanup
1378
- `}var uh,Ec=b(()=>{"use strict";Qn();uh=Vo(Nx(import.meta.url),"../../config/ai_test_templates")});var Qr,bc=b(()=>{"use strict";Qr=`---
1366
+ `}var uh,Ec=b(()=>{"use strict";Qn();uh=Vo(xN(import.meta.url),"../../config/ai_test_templates")});var Qr,bc=b(()=>{"use strict";Qr=`---
1379
1367
 
1380
1368
  # Durable memory \u2014 how to use it
1381
1369
 
@@ -1386,34 +1374,34 @@ ON EVERY NEW TASK:
1386
1374
  2. Pull only the chapters relevant to your current task. Don't load everything.
1387
1375
  3. If you learn something durable (a project convention, a decision, a fact worth preserving), write it back: create/update \`<project>/durable-memory/<descriptive-name>.md\` with YAML frontmatter (name/description/type) + body. The engine syncs the write automatically.
1388
1376
 
1389
- Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Yo(t){return Ax.has(t)}function Tc(){return Sc===null&&(Sc=_t(gt())),Sc}function kc(t,e,r={}){if(!Yo(t))return null;try{let n=Tc().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?lo({warn:()=>{}}):[];return[...o,...i,...dh[t]??[]]}catch{return null}}function en(t,e){let r=kc(t,e);return r===null?null:r.join(" ")}function xr(t,e){return Tc().getSession(t,e)}async function zo(t){return(await Tc().resolveSessions(t)).map(r=>r.provider.name)}var dh,Ax,fh,Sc,tn=b(()=>{"use strict";Rt();El();dh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},Ax=new Set(Object.keys(dh)),fh=/^[\w.:-]+$/;Sc=null});import{createHash as Rx}from"node:crypto";import{existsSync as es,mkdirSync as ph,readFileSync as Qo,readdirSync as Ox,renameSync as Lx,statSync as Cx,unlinkSync as Mx,writeFileSync as Zo}from"node:fs";import{homedir as Dx}from"node:os";import{dirname as Ic,isAbsolute as mh,join as ze,relative as Px,resolve as rn}from"node:path";import{fileURLToPath as Fx}from"node:url";function _h(t){let e=rn(t);for(;;){let r=ze(e,Nc);try{if(Cx(r).isDirectory())return r}catch{}let n=Ic(e);if(n===e)return null;e=n}}function ei(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return rn(e);let r=_h(t);return r!==null?r:ze(hh(),Nc)}function gh(t){return ze(ei(t),"templates","workflows")}function wh(){return rn(Ic(Fx(import.meta.url)),"..","..","workflows")}function Ux(t){let e=ze(t,yh);try{let r=JSON.parse(Qo(e,"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 Wx(t,e){ph(t,{recursive:!0});let r=ze(t,yh),n=`${r}.tmp-${process.pid}`;Zo(n,`${JSON.stringify(e,null,2)}
1390
- `,"utf8"),Lx(n,r)}function Bx(t,e){if(mh(e)||Ic(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=rn(t,"templates","workflows"),s=rn(t,"templates",e),o=Px(n,s);return o.length===0||o.startsWith("..")||mh(o)||o.includes("/")||o.includes("\\")?null:s}function qx(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=Bx(t,n);if(o===null){delete e.files[n];continue}if(!es(o)){delete e.files[n];continue}try{if(vc(Qo(o))!==s)continue;Mx(o),delete e.files[n]}catch{}}}function ti(t={}){let e=ei(t.cwd),r=ze(e,"templates","workflows"),n=wh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=es(n)?Ox(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;ph(r,{recursive:!0});let i=Ux(e),a=st(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Qo(ze(n,c)),f=vc(d),m=ze(r,c);if(!es(m)){try{Zo(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=vc(Qo(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)Zo(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=ze(r,`${c}.dist-${a}`);Zo(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}qx(e,i,l),Wx(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function xc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(rn(r));let n=_h(t??process.cwd());return n!==null&&e.push(n),e.push(ze(hh(),Nc)),e}function ri(t,e){let r=xc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=ze(s,"templates","workflows",o);if(es(i))return i}for(let s of n){let o=ze(wh(),s);if(es(o))return o}return null}var Nc,hh,vc,yh,ni=b(()=>{"use strict";Cn();Nc=".lmctl",hh=()=>process.env.HOME??Dx(),vc=t=>Rx("sha256").update(t).digest("hex");yh=".dist-manifest.json"});import{createHash as Hx}from"node:crypto";import{existsSync as Jx,mkdirSync as Xx,writeFileSync as Gx}from"node:fs";import{dirname as Vx,join as nn}from"node:path";function tr(t){return typeof t=="string"&&t.startsWith(Eh)}function e$(t){if(!tr(t))throw new lt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Eh.length),r=e.indexOf("/");if(r<=0)throw new lt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!Zx.has(n))throw new lt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new lt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new lt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function t$(t,e,r){if(t==="workflow")return ri(e,r);let n=t==="mcp"?nn("templates","mcp",`${e}.json`):nn("templates","skills",e,"SKILL.md");for(let s of xc(r)){let o=nn(s,n);if(Jx(o))return o}return null}function r$(t,e,r){let n=nn(ei(r),Yx,t);return t==="skill"?nn(n,e,"SKILL.md"):nn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function n$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="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 ts(t,e){let{kind:r,name:n,ref:s}=e$(t),o=t$(r,n,e);if(o!==null)return o;let i=`${Kx}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(zx)})}catch(u){throw new lt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new lt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=Qx.exec(s);if(u!==null){let d=Hx("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new lt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!n$(r,l))throw new lt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=r$(r,n,e);return Xx(Vx(c),{recursive:!0}),Gx(c,l,"utf8"),c}var Eh,Kx,Yx,zx,Zx,lt,Qx,$c=b(()=>{"use strict";ni();Eh="lmctl://",Kx="https://lmctl.com/templates/",Yx=".cache",zx=8e3,Zx=new Set(["workflow","mcp","skill"]),lt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},Qx=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as s$,mkdirSync as o$,readFileSync as i$,renameSync as a$,unlinkSync as l$,writeFileSync as c$}from"node:fs";import{homedir as Th}from"node:os";import{dirname as rs,join as Ue,resolve as u$}from"node:path";function Ac(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function f$(t){let e=Ue(t,".mcp.json"),r=Ac();if(!be.existsSync(e))return be.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1377
+ Don't dump all of durable-memory into your context. The pattern is index-first, chapter-on-demand.`});function Yo(t){return AN.has(t)}function Tc(){return Sc===null&&(Sc=_t(gt())),Sc}function kc(t,e,r={}){if(!Yo(t))return null;try{let n=Tc().getAdapter?.(t);if(n===void 0)return null;let s=n.resumeCommand(e).trim();if(s.length===0)return null;let o=s.split(/\s+/),i=t==="codex"&&r.isLead===!0?lo({warn:()=>{}}):[];return[...o,...i,...dh[t]??[]]}catch{return null}}function en(t,e){let r=kc(t,e);return r===null?null:r.join(" ")}function Nr(t,e){return Tc().getSession(t,e)}async function zo(t){return(await Tc().resolveSessions(t)).map(r=>r.provider.name)}var dh,AN,fh,Sc,tn=b(()=>{"use strict";Rt();El();dh={claude:["--dangerously-skip-permissions"],codex:["--dangerously-bypass-approvals-and-sandbox"],gemini:["-y"],copilot:["--yolo"],opencode:[],qwen:["--approval-mode","yolo"],agy:[]},AN=new Set(Object.keys(dh)),fh=/^[\w.:-]+$/;Sc=null});import{createHash as RN}from"node:crypto";import{existsSync as es,mkdirSync as ph,readFileSync as Qo,readdirSync as ON,renameSync as LN,statSync as CN,unlinkSync as MN,writeFileSync as Zo}from"node:fs";import{homedir as DN}from"node:os";import{dirname as Ic,isAbsolute as mh,join as ze,relative as PN,resolve as rn}from"node:path";import{fileURLToPath as FN}from"node:url";function _h(t){let e=rn(t);for(;;){let r=ze(e,xc);try{if(CN(r).isDirectory())return r}catch{}let n=Ic(e);if(n===e)return null;e=n}}function ei(t=process.cwd()){let e=process.env.LMCTL_HOME;if(e!==void 0&&e.trim().length>0)return rn(e);let r=_h(t);return r!==null?r:ze(hh(),xc)}function gh(t){return ze(ei(t),"templates","workflows")}function yh(){return rn(Ic(FN(import.meta.url)),"..","..","workflows")}function UN(t){let e=ze(t,wh);try{let r=JSON.parse(Qo(e,"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 WN(t,e){ph(t,{recursive:!0});let r=ze(t,wh),n=`${r}.tmp-${process.pid}`;Zo(n,`${JSON.stringify(e,null,2)}
1378
+ `,"utf8"),LN(n,r)}function BN(t,e){if(mh(e)||Ic(e)!=="workflows")return null;let r=e.slice(10);if(r.length===0||r.includes("/")||r.includes("\\")||r.includes(".."))return null;let n=rn(t,"templates","workflows"),s=rn(t,"templates",e),o=PN(n,s);return o.length===0||o.startsWith("..")||mh(o)||o.includes("/")||o.includes("\\")?null:s}function qN(t,e,r){for(let[n,s]of Object.entries(e.files)){if(r.has(n))continue;let o=BN(t,n);if(o===null){delete e.files[n];continue}if(!es(o)){delete e.files[n];continue}try{if(vc(Qo(o))!==s)continue;MN(o),delete e.files[n]}catch{}}}function ti(t={}){let e=ei(t.cwd),r=ze(e,"templates","workflows"),n=yh(),s={basedir:e,copied:[],refreshed:[],preserved:[],shadowed:[]};try{let o=es(n)?ON(n).filter(c=>c.endsWith(".compound.json")||c.endsWith(".lmctl")||c==="index.jsonl"):[];if(o.length===0)return s;ph(r,{recursive:!0});let i=UN(e),a=st(),l=new Set(o.map(c=>`workflows/${c}`));for(let c of o){let u=`workflows/${c}`,d=Qo(ze(n,c)),f=vc(d),m=ze(r,c);if(!es(m)){try{Zo(m,d,{flag:"wx"}),s.copied.push(c)}catch{}i.files[u]=f;continue}let p=vc(Qo(m));if(p===f){i.files[u]=f;continue}let h=i.files[u];if(h!==void 0&&p===h)Zo(m,d),i.files[u]=f,s.refreshed.push(c);else{let g=ze(r,`${c}.dist-${a}`);Zo(g,d),s.preserved.push(c),s.shadowed.push(`${c}.dist-${a}`)}}qN(e,i,l),WN(e,{version:a,files:i.files})}catch(o){if(t.swallow!==!0)throw o}return s}function Nc(t){let e=[],r=process.env.LMCTL_HOME;r!==void 0&&r.trim().length>0&&e.push(rn(r));let n=_h(t??process.cwd());return n!==null&&e.push(n),e.push(ze(hh(),xc)),e}function ri(t,e){let r=Nc(e),n=[`${t}.compound.json`,`${t}.lmctl`];for(let s of r)for(let o of n){let i=ze(s,"templates","workflows",o);if(es(i))return i}for(let s of n){let o=ze(yh(),s);if(es(o))return o}return null}var xc,hh,vc,wh,ni=b(()=>{"use strict";Cn();xc=".lmctl",hh=()=>process.env.HOME??DN(),vc=t=>RN("sha256").update(t).digest("hex");wh=".dist-manifest.json"});import{createHash as HN}from"node:crypto";import{existsSync as JN,mkdirSync as XN,writeFileSync as GN}from"node:fs";import{dirname as VN,join as nn}from"node:path";function tr(t){return typeof t=="string"&&t.startsWith(Eh)}function e$(t){if(!tr(t))throw new lt(`not an lmctl:// URI: ${t}`,"malformed");let e=t.slice(Eh.length),r=e.indexOf("/");if(r<=0)throw new lt(`malformed lmctl:// URI (expected lmctl://<workflow|mcp|skill>/<name>): ${t}`,"malformed");let n=e.slice(0,r);if(!ZN.has(n))throw new lt(`unknown lmctl:// kind '${n}' (expected workflow|mcp|skill): ${t}`,"malformed");let s=e.slice(r+1),o,i=s.indexOf("@");i>=0&&(o=s.slice(i+1).trim(),s=s.slice(0,i));let a=s.trim();if(a.length===0)throw new lt(`empty name in lmctl:// URI: ${t}`,"malformed");if(/[\\/]|\.\./.test(a))throw new lt(`invalid name in lmctl:// URI (no path separators): ${t}`,"malformed");return{kind:n,name:a,...o!==void 0&&o.length>0?{ref:o}:{}}}function t$(t,e,r){if(t==="workflow")return ri(e,r);let n=t==="mcp"?nn("templates","mcp",`${e}.json`):nn("templates","skills",e,"SKILL.md");for(let s of Nc(r)){let o=nn(s,n);if(JN(o))return o}return null}function r$(t,e,r){let n=nn(ei(r),YN,t);return t==="skill"?nn(n,e,"SKILL.md"):nn(n,`${e}${t==="workflow"?".compound.json":".json"}`)}function n$(t,e){if(e.trim().length===0)return!1;if(t==="skill")return!0;let r=e.trim();if(t==="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 ts(t,e){let{kind:r,name:n,ref:s}=e$(t),o=t$(r,n,e);if(o!==null)return o;let i=`${KN}${r}/${n}`,a;try{a=await fetch(i,{signal:AbortSignal.timeout(zN)})}catch(u){throw new lt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (${u instanceof Error?u.message:String(u)}). Failing closed.`,"missing")}if(!a.ok)throw new lt(`lmctl:// '${t}' not found locally or at the remote catalog ${i} (HTTP ${a.status}). Failing closed.`,"missing");let l=await a.text();if(s!==void 0){let u=QN.exec(s);if(u!==null){let d=HN("sha256").update(l).digest("hex");if(d.toLowerCase()!==u[1].toLowerCase())throw new lt(`lmctl:// '${t}' remote artifact FAILED integrity pin (expected sha256 ${u[1]}, got ${d}) \u2014 discarded, NOT cached.`,"validation-failure")}}if(!n$(r,l))throw new lt(`lmctl:// '${t}' remote artifact failed shape validation for ${r} \u2014 discarded, NOT cached.`,"validation-failure");let c=r$(r,n,e);return XN(VN(c),{recursive:!0}),GN(c,l,"utf8"),c}var Eh,KN,YN,zN,ZN,lt,QN,$c=b(()=>{"use strict";ni();Eh="lmctl://",KN="https://lmctl.com/templates/",YN=".cache",zN=8e3,ZN=new Set(["workflow","mcp","skill"]),lt=class extends Error{reason;constructor(e,r="malformed"){super(e),this.reason=r,this.name="LmctlUriError"}},QN=/^(?:sha256[:-])?([0-9a-f]{64})$/i});import{existsSync as s$,mkdirSync as o$,readFileSync as i$,renameSync as a$,unlinkSync as l$,writeFileSync as c$}from"node:fs";import{homedir as Th}from"node:os";import{dirname as rs,join as Ue,resolve as u$}from"node:path";function Ac(){return{type:"stdio",command:"lmctl",args:["mcp"]}}function f$(t){let e=Ue(t,".mcp.json"),r=Ac();if(!be.existsSync(e))return be.writeFileSync(e,JSON.stringify({mcpServers:{lmctl:r}},null,2)+`
1391
1379
  `,"utf8"),!0;let n;try{n=JSON.parse(be.readFileSync(e,"utf8"))}catch{return!1}if(n===null||typeof n!="object"||Array.isArray(n))return!1;let s=ct(n.mcpServers)?{...n.mcpServers}:{},o=ct(s.lmctl)?s.lmctl:void 0;return o!==void 0&&o.type===r.type&&o.command===r.command&&JSON.stringify(o.args)===JSON.stringify(r.args)?!1:(s.lmctl=r,n.mcpServers=s,be.writeFileSync(e,JSON.stringify(n,null,2)+`
1392
1380
  `,"utf8"),!0)}function Rc(t,e){if(t==="copilot"){let n=m$();return n.present&&h$(e,ns),n}if(t==="codex")return{scope:"codex-cli-flags",path:"codex app-server -c mcp_servers.lmctl.*",changed:!1,present:!1};let r=Ue(e,".mcp.json");try{let n=f$(e);return{scope:"workspace",path:r,changed:n,present:bh(e)}}catch(n){return{scope:"workspace",path:r,changed:!1,present:bh(e),error:n instanceof Error?n.message:String(n)}}}function oi(t,e,r,n,s){if(!e)return;let o=Rc(n,s);o.error!==void 0&&t.stderr.write(`warning: MCP bridge self-heal failed: ${o.error}
1393
1381
  `),Z({event:"lead_mcp_precheck",alias:r,provider:n,cwd:s,mcp_scope:o.scope,mcp_path:o.path,mcp_present:o.present,mcp_json_exists:o.present}),!o.present&&o.scope!=="codex-cli-flags"&&t.stderr.write(`warning: Lead MCP bridge config missing after self-heal: ${o.path}
1394
- `)}function ii(t,e,r){let n=rs(u$(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([rr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ns),nr(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)_$(i)}function m$(){let t=ai();try{let{changed:e}=Oc(t,{[ns]:Ac()});return{scope:"copilot-user",path:t,changed:e,present:jc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:jc(t),error:e instanceof Error?e.message:String(e)}}}function ai(t=kh??Th()){return Ue(t,".copilot","mcp-config.json")}function Oc(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(o))throw new Error(`${t} is not a JSON object`);r=o}let n=ct(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=ct(n[o])?n[o]:void 0;Nh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,vh(t,r),{changed:!0}):{changed:!1}}function vh(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,`${JSON.stringify(e,null,2)}
1395
- `,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function p$(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function bh(t){return jc(Ue(t,".mcp.json"))}function h$(t,e){let r=Ue(t,".mcp.json");nr(r,"mcpServers",[e])}function nr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(n)||!ct(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,vh(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function _$(t){let e=kh??Th();switch(t){case"copilot":nr(ai(e),"mcpServers",[rr]);return;case"claude":nr(Ue(e,".claude.json"),"mcpServers",[rr]);return;case"gemini":nr(Ue(e,".gemini","settings.json"),"mcpServers",[rr]);return;case"qwen":nr(Ue(e,".qwen","settings.json"),"mcpServers",[rr]);return;case"agy":nr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[rr]);return;case"opencode":nr(Ue(e,".config","opencode","opencode.json"),"mcp",[rr]);return;case"codex":g$(Ue(e,".codex","config.toml"),rr);return;default:return}}function g$(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=w$(a);if(l===null)return;if(l!==void 0){if(Sh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=y$(a);if(c===null)return;if(c!==void 0&&Sh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;p$(t,s.join(`
1396
- `)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Sh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function w$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Ih(e[1])}function y$(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Ih(r)}function Ih(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function jc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(e)||!ct(e.mcpServers))return!1;let r=ct(e.mcpServers[ns])?e.mcpServers[ns]:void 0;return Nh(r,Ac())}catch{return!1}}function Nh(t,e){return t!==void 0&&si(t)===si(e)}function si(t){return Array.isArray(t)?`[${t.map(e=>si(e)).join(",")}]`:ct(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${si(t[e])}`).join(",")}}`:JSON.stringify(t)}function ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ns,rr,d$,be,kh,ss=b(()=>{"use strict";je();ns="lmctl",rr="lmctl0",d$={existsSync:s$,mkdirSync:o$,readFileSync:i$,writeFileSync:c$,renameSync:a$,unlinkSync:l$},be=d$});import{spawnSync as Oh}from"node:child_process";import{cpSync as xh,existsSync as Mc,mkdirSync as Lh,mkdtempSync as E$,readFileSync as Ch,statSync as b$,writeFileSync as Lc}from"node:fs";import{homedir as S$,tmpdir as T$}from"node:os";import{basename as $h,join as Ze}from"node:path";function Lt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Cc(t,e,r){if(Array.isArray(t)){for(let n of t)Cc(n,e,r);return}if(Lt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Cc(n,e,r)}}function N$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Lt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Lt(l)&&l.members!==void 0&&Cc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(I$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Mh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(k$)})}catch(s){throw new Qe(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Qe(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>jh)throw new Qe(e,`fetched ${t} exceeds ${jh} bytes`);return n}async function x$(t,e){if(typeof t!="string")return[t];tr(t)&&(t=await ts(t));let r;if(Dc.test(t))r=await Mh(t,e);else{if(!Mc(t))throw new Qe(e,`mcp file not found: ${t}`);r=Ch(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Qe(e,`mcp source is not JSON: ${t}`)}if(Lt(n)&&Lt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Lt(o)?o:{}}));if(Lt(n)&&typeof n.name=="string")return[n];throw new Qe(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function ci(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function li(t,e,r,n){let s=Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Qe(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Qe(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function $$(t,e,r){Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function j$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function A$(t){let e=["mcp","add"];if(ci(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function R$(t){if(ci(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function O$(t){let e=Ze(process.env.XDG_CONFIG_HOME??Ze(sn(),".config"),"opencode"),r=Ze(e,"opencode.json"),n={};if(Mc(r))try{let o=JSON.parse(Ch(r,"utf8"));Lt(o)&&(n=o)}catch{}let s=Lt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=ci(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),Lh(e,{recursive:!0}),Lc(r,`${JSON.stringify(n,null,2)}
1397
- `,"utf8")}function L$(t,e){let r={};for(let n of t)r[n.name]=ci(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Oc(ai(sn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function C$(t){if(typeof t!="string")return t.name;let e=$h(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?$h(t.replace(/\/skill\.md$/i,"")):e}async function Ah(t,e,r){let n=C$(t),s=Ze(e,n);if(Lh(s,{recursive:!0}),typeof t!="string")return Lc(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(tr(t)&&(t=await ts(t)),Dc.test(t))return Lc(Ze(s,"SKILL.md"),await Mh(t,r),"utf8"),{name:n,dir:s};if(!Mc(t))throw new Qe(r,`skill path not found: ${t}`);return b$(t).isDirectory()?(xh(t,s,{recursive:!0}),{name:n,dir:s}):(xh(t,Ze(s,"SKILL.md")),{name:n,dir:s})}async function ui(t){let{dal:e,member:r,stderr:n}=t,s=N$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ie(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1398
- `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await x$(c,r.alias));if(o==="opencode")O$(l);else if(o==="copilot")L$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if($$(o,j$(o,c.name),i),o==="claude"){let{name:u,...d}=c;li("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?li("codex",R$(c),i,r.alias):li(o,A$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(v$.has(o))a(`skills for ${o} 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(o==="gemini"||o==="agy"){let l=E$(Ze(T$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Dc.test(c)?c:(await Ah(c,l,r.alias)).dir;li(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(Rh[o]!==void 0){let l=Rh[o]();for(let c of s.skills)await Ah(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Qe,Dc,k$,jh,v$,I$,sn,Rh,Pc=b(()=>{"use strict";Pe();$c();ss();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Dc=/^https?:\/\//i,k$=8e3,jh=1e6,v$=new Set(["opencode"]),I$=t=>JSON.stringify(t),sn=()=>process.env.HOME??S$();Rh={claude:()=>Ze(sn(),".claude","skills"),qwen:()=>Ze(sn(),".qwen","skills"),codex:()=>Ze(sn(),".codex","skills"),copilot:()=>Ze(sn(),".copilot","skills")}});async function G(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function F(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function x(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function q(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1399
- `)}function w(t,e){return t.stderr.write(`error: ${e}
1382
+ `)}function ii(t,e,r){let n=rs(u$(r)),s=new Set,o=new Map;for(let i of e.members){if(s.add(i.provider),i.teamfile!==void 0)continue;let a=i.sessiondir??n,l=o.get(a)??new Set;l.add(i.provider),o.set(a,l)}for(let[i,a]of o.entries()){let l=new Set([rr]),c=a.has("copilot"),u=[...a].some(d=>d!=="copilot");c&&!u&&l.add(ns),nr(Ue(i,".mcp.json"),"mcpServers",[...l])}for(let i of s)_$(i)}function m$(){let t=ai();try{let{changed:e}=Oc(t,{[ns]:Ac()});return{scope:"copilot-user",path:t,changed:e,present:jc(t)}}catch(e){return{scope:"copilot-user",path:t,changed:!1,present:jc(t),error:e instanceof Error?e.message:String(e)}}}function ai(t=kh??Th()){return Ue(t,".copilot","mcp-config.json")}function Oc(t,e){let r={};if(be.existsSync(t)){let o=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(o))throw new Error(`${t} is not a JSON object`);r=o}let n=ct(r.mcpServers)?{...r.mcpServers}:{},s=!1;for(let[o,i]of Object.entries(e)){let a=ct(n[o])?n[o]:void 0;xh(a,i)||(n[o]=i,s=!0)}return s?(r.mcpServers=n,vh(t,r),{changed:!0}):{changed:!1}}function vh(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,`${JSON.stringify(e,null,2)}
1383
+ `,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function p$(t,e){be.mkdirSync(rs(t),{recursive:!0});let r=Ue(rs(t),`.mcp-config.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`);try{be.writeFileSync(r,e,"utf8"),be.renameSync(r,t)}catch(n){try{be.unlinkSync(r)}catch{}throw n}}function bh(t){return jc(Ue(t,".mcp.json"))}function h$(t,e){let r=Ue(t,".mcp.json");nr(r,"mcpServers",[e])}function nr(t,e,r){try{if(!be.existsSync(t))return;let n=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(n)||!ct(n[e]))return;let s={...n[e]},o=[];for(let i of r)Object.prototype.hasOwnProperty.call(s,i)&&(delete s[i],o.push(i));if(o.length===0)return;n[e]=s,vh(t,n),Z({event:"mcp_cleanup",path:t,removed:o})}catch{}}function _$(t){let e=kh??Th();switch(t){case"copilot":nr(ai(e),"mcpServers",[rr]);return;case"claude":nr(Ue(e,".claude.json"),"mcpServers",[rr]);return;case"gemini":nr(Ue(e,".gemini","settings.json"),"mcpServers",[rr]);return;case"qwen":nr(Ue(e,".qwen","settings.json"),"mcpServers",[rr]);return;case"agy":nr(Ue(e,".gemini","antigravity-cli","settings.json"),"mcpServers",[rr]);return;case"opencode":nr(Ue(e,".config","opencode","opencode.json"),"mcp",[rr]);return;case"codex":g$(Ue(e,".codex","config.toml"),rr);return;default:return}}function g$(t,e){try{if(!be.existsSync(t))return;let n=be.readFileSync(t,"utf8").split(/\n/),s=[],o=new Set,i=!1;for(let a of n){let l=y$(a);if(l===null)return;if(l!==void 0){if(Sh(l,e)){i=!0,o.add(e);continue}i=!1,s.push(a);continue}if(i){if(/^\s*(?:#.*)?$/.test(a)){s.push(a);continue}o.add(e);continue}let c=w$(a);if(c===null)return;if(c!==void 0&&Sh(c,e)){o.add(e);continue}s.push(a)}if(o.size===0)return;p$(t,s.join(`
1384
+ `)),Z({event:"mcp_cleanup",path:t,removed:[...o]})}catch{}}function Sh(t,e){return t.length>=2&&t[0]==="mcp_servers"&&t[1]===e}function y$(t){if(!/^\s*\[/.test(t))return;let e=/^\s*\[([^\]\r\n]+)\]\s*(?:#.*)?$/.exec(t);return e===null?null:Ih(e[1])}function w$(t){let e=t.indexOf("=");if(e<0)return;let r=t.slice(0,e).trim();if(!(r.length===0||!r.startsWith("mcp_servers")))return Ih(r)}function Ih(t){let e=[],r=0,n=()=>{for(;r<t.length&&/\s/.test(t[r]);)r+=1};for(;r<t.length;){if(n(),r>=t.length)return null;if(t[r]==='"'){r+=1;let s="",o=!1;for(;r<t.length;){let i=t[r];if(i==="\\"){if(r+1>=t.length)return null;s+=t[r+1],r+=2;continue}if(i==='"'){r+=1,o=!0;break}s+=i,r+=1}if(!o)return null;e.push(s)}else{let s=r;for(;r<t.length&&/[A-Za-z0-9_-]/.test(t[r]);)r+=1;if(r===s)return null;e.push(t.slice(s,r))}if(n(),r>=t.length)break;if(t[r]!==".")return null;r+=1}return e.length>0?e:null}function jc(t){try{if(!be.existsSync(t))return!1;let e=JSON.parse(be.readFileSync(t,"utf8"));if(!ct(e)||!ct(e.mcpServers))return!1;let r=ct(e.mcpServers[ns])?e.mcpServers[ns]:void 0;return xh(r,Ac())}catch{return!1}}function xh(t,e){return t!==void 0&&si(t)===si(e)}function si(t){return Array.isArray(t)?`[${t.map(e=>si(e)).join(",")}]`:ct(t)?`{${Object.keys(t).sort().map(e=>`${JSON.stringify(e)}:${si(t[e])}`).join(",")}}`:JSON.stringify(t)}function ct(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var ns,rr,d$,be,kh,ss=b(()=>{"use strict";je();ns="lmctl",rr="lmctl0",d$={existsSync:s$,mkdirSync:o$,readFileSync:i$,writeFileSync:c$,renameSync:a$,unlinkSync:l$},be=d$});import{spawnSync as Oh}from"node:child_process";import{cpSync as Nh,existsSync as Mc,mkdirSync as Lh,mkdtempSync as E$,readFileSync as Ch,statSync as b$,writeFileSync as Lc}from"node:fs";import{homedir as S$,tmpdir as T$}from"node:os";import{basename as $h,join as Ze}from"node:path";function Lt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Cc(t,e,r){if(Array.isArray(t)){for(let n of t)Cc(n,e,r);return}if(Lt(t)){t.alias===e&&(Array.isArray(t.mcp)&&r.mcp.push(...t.mcp),Array.isArray(t.skills)&&r.skills.push(...t.skills));for(let n of Object.values(t))Cc(n,e,r)}}function x$(t,e){let r={mcp:[],skills:[]},n=new Set;for(let o of t.listProjects()){if(o.team_id!==e.team_id)continue;let i=t.getWorkflowByName(o.workflow_name);if(i===null||n.has(i.id))continue;n.add(i.id);let a;try{a=JSON.parse(i.definition)}catch{continue}if(!(!Lt(a)||!Array.isArray(a.steps)))for(let l of a.steps)Lt(l)&&l.members!==void 0&&Cc(l.members,e.alias,r)}let s=o=>{let i=new Map;for(let a of o)i.set(I$(a),a);return[...i.values()]};return{mcp:s(r.mcp),skills:s(r.skills)}}async function Mh(t,e){let r;try{r=await fetch(t,{signal:AbortSignal.timeout(k$)})}catch(s){throw new Qe(e,`fetch ${t} failed: ${s.message}`)}if(!r.ok)throw new Qe(e,`fetch ${t} \u2192 HTTP ${r.status}`);let n=await r.text();if(n.length>jh)throw new Qe(e,`fetched ${t} exceeds ${jh} bytes`);return n}async function N$(t,e){if(typeof t!="string")return[t];tr(t)&&(t=await ts(t));let r;if(Dc.test(t))r=await Mh(t,e);else{if(!Mc(t))throw new Qe(e,`mcp file not found: ${t}`);r=Ch(t,"utf8")}let n;try{n=JSON.parse(r)}catch{throw new Qe(e,`mcp source is not JSON: ${t}`)}if(Lt(n)&&Lt(n.mcpServers))return Object.entries(n.mcpServers).map(([s,o])=>({name:s,...Lt(o)?o:{}}));if(Lt(n)&&typeof n.name=="string")return[n];throw new Qe(e,`mcp source ${t} is neither {mcpServers:{\u2026}} nor a {name,\u2026} server`)}function ci(t){return t.type==="http"||t.type==="sse"||t.url!==void 0&&t.command===void 0}function li(t,e,r,n){let s=Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4});if(s.error)throw new Qe(n,`spawn ${t} failed: ${s.error.message}`);if(s.status!==0)throw new Qe(n,`${t} ${e.slice(0,3).join(" ")} exited ${s.status}: ${(s.stderr??"").trim().slice(0,200)}`)}function $$(t,e,r){Oh(t,e,{cwd:r,encoding:"utf8",timeout:6e4})}function j$(t,e){return t==="claude"?["mcp","remove",e,"--scope","user"]:["mcp","remove",e]}function A$(t){let e=["mcp","add"];if(ci(t)){e.push("-t",t.type==="sse"?"sse":"http");for(let[r,n]of Object.entries(t.headers??{}))e.push("-H",`${r}: ${n}`);e.push(t.name,t.url??"")}else{for(let[r,n]of Object.entries(t.env??{}))e.push("-e",`${r}=${n}`);e.push(t.name,t.command??"",...t.args??[])}return e}function R$(t){if(ci(t))return["mcp","add",t.name,"--url",t.url??""];let e=["mcp","add",t.name];for(let[r,n]of Object.entries(t.env??{}))e.push("--env",`${r}=${n}`);return e.push("--",t.command??"",...t.args??[]),e}function O$(t){let e=Ze(process.env.XDG_CONFIG_HOME??Ze(sn(),".config"),"opencode"),r=Ze(e,"opencode.json"),n={};if(Mc(r))try{let o=JSON.parse(Ch(r,"utf8"));Lt(o)&&(n=o)}catch{}let s=Lt(n.mcp)?{...n.mcp}:{};for(let o of t){let{name:i,...a}=o;s[i]=ci(o)?{type:"remote",url:a.url,enabled:!0,...a.headers?{headers:a.headers}:{}}:{type:"local",command:[a.command??"",...a.args??[]],enabled:!0,...a.env?{environment:a.env}:{}}}n.mcp=s,n.permission===void 0&&(n.permission="allow"),Lh(e,{recursive:!0}),Lc(r,`${JSON.stringify(n,null,2)}
1385
+ `,"utf8")}function L$(t,e){let r={};for(let n of t)r[n.name]=ci(n)?{type:n.type==="sse"?"sse":"http",url:n.url,...n.headers?{headers:n.headers}:{}}:{type:"stdio",command:n.command,args:n.args??[],...n.env?{env:n.env}:{}};try{Oc(ai(sn()),r)}catch(n){throw new Qe(e,`copilot MCP config install failed: ${n instanceof Error?n.message:String(n)}`)}}function C$(t){if(typeof t!="string")return t.name;let e=$h(t.replace(/\/+$/,""));return e.toLowerCase()==="skill.md"?$h(t.replace(/\/skill\.md$/i,"")):e}async function Ah(t,e,r){let n=C$(t),s=Ze(e,n);if(Lh(s,{recursive:!0}),typeof t!="string")return Lc(Ze(s,"SKILL.md"),t.content,"utf8"),{name:n,dir:s};if(tr(t)&&(t=await ts(t)),Dc.test(t))return Lc(Ze(s,"SKILL.md"),await Mh(t,r),"utf8"),{name:n,dir:s};if(!Mc(t))throw new Qe(r,`skill path not found: ${t}`);return b$(t).isDirectory()?(Nh(t,s,{recursive:!0}),{name:n,dir:s}):(Nh(t,Ze(s,"SKILL.md")),{name:n,dir:s})}async function ui(t){let{dal:e,member:r,stderr:n}=t,s=x$(e,r);if(s.mcp.length===0&&s.skills.length===0)return;let o=Ie(r),i=r.sessiondir||process.cwd(),a=l=>{n.write(`[seed:${r.alias}] ${l}
1386
+ `)};if(s.mcp.length>0){let l=[];for(let c of s.mcp)l.push(...await N$(c,r.alias));if(o==="opencode")O$(l);else if(o==="copilot")L$(l,r.alias);else if(o==="claude"||o==="gemini"||o==="qwen"||o==="agy"||o==="codex")for(let c of l)if($$(o,j$(o,c.name),i),o==="claude"){let{name:u,...d}=c;li("claude",["mcp","add-json",u,JSON.stringify(d),"--scope","user"],i,r.alias)}else o==="codex"?li("codex",R$(c),i,r.alias):li(o,A$(c),i,r.alias);else a(`provider ${o} has no known MCP install mechanism \u2014 ${l.length} declared server(s) NOT installed.`);["opencode","claude","gemini","qwen","agy","codex","copilot"].includes(o)&&a(`installed ${l.length} MCP server(s) into ${o} (idempotent).`)}if(s.skills.length>0)if(v$.has(o))a(`skills for ${o} 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(o==="gemini"||o==="agy"){let l=E$(Ze(T$(),`lmctl-skill-${r.alias}-`));for(let c of s.skills){let u=typeof c=="string"&&!Dc.test(c)?c:(await Ah(c,l,r.alias)).dir;li(o,["skills","install",u,"--scope","user","--consent"],i,r.alias)}a(`installed ${s.skills.length} skill(s) via \`${o} skills install --scope user\` (idempotent).`)}else if(Rh[o]!==void 0){let l=Rh[o]();for(let c of s.skills)await Ah(c,l,r.alias);a(`installed ${s.skills.length} skill(s) \u2192 ${l}/<name>/SKILL.md (idempotent overwrite).`)}else a(`provider ${o} has no verified skills mechanism \u2014 ${s.skills.length} declared skill(s) NOT installed.`)}var Qe,Dc,k$,jh,v$,I$,sn,Rh,Pc=b(()=>{"use strict";Pe();$c();ss();Qe=class extends Error{alias;constructor(e,r){super(`capability install failed for ${e}: ${r}`),this.alias=e,this.name="CapabilityInstallError"}},Dc=/^https?:\/\//i,k$=8e3,jh=1e6,v$=new Set(["opencode"]),I$=t=>JSON.stringify(t),sn=()=>process.env.HOME??S$();Rh={claude:()=>Ze(sn(),".claude","skills"),qwen:()=>Ze(sn(),".qwen","skills"),codex:()=>Ze(sn(),".codex","skills"),copilot:()=>Ze(sn(),".copilot","skills")}});async function G(t,e){if(t.dal!==void 0)return e(t.dal);let r=pe({path:ue()});try{return await e(r)}finally{r.close()}}function F(t,e,r=["--json"]){let n=new Set(e),s=new Set(r),o=[],i={};for(let a=0;a<t.length;a+=1){let l=t[a];if(!l.startsWith("--")){o.push(l);continue}if(s.has(l)){i[l]=!0;continue}if(!n.has(l))return{positionals:o,flags:i,error:`unknown flag: ${l}`};let c=t[a+1];if(c===void 0||c.startsWith("--"))return{positionals:o,flags:i,error:`missing value for ${l}`};i[l]=c,a+=1}return{positionals:o,flags:i}}function N(t,e){let r=t.flags[e];return typeof r=="string"?r:void 0}function M(t,e){return t.flags[e]===!0}function q(t,e){t.stdout.write(`${JSON.stringify(e,null,2)}
1387
+ `)}function y(t,e){return t.stderr.write(`error: ${e}
1400
1388
  `),1}function me(t,e){let r=e instanceof Error?e.message:String(e);return t.stderr.write(`internal error: ${r}
1401
- `),2}var $e=b(()=>{"use strict";Pe();Ve()});var Wh={};ce(Wh,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>mi,resolveProject:()=>di,resolveTeam:()=>fi,runCode:()=>P$});import{execFileSync as M$}from"node:child_process";import{basename as D$,resolve as Dh}from"node:path";import*as Uc from"node:readline";import{setTimeout as Fc}from"node:timers/promises";async function P$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return F$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Fh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return V$(e);try{return await G(e,async s=>{switch(r){case"team":return U$(n,e,s);case"chat":return J$(n,e,s);case"spec":return X$(n,e,s);default:return w(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function F$(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1402
- `)),0}function U$(t,e,r){let[n,...s]=t;switch(n){case"add":return W$(s,e,r);case"list":return B$(s,e,r);case"show":return q$(s,e,r);case"rm":return H$(s,e,r);default:return w(e,"usage: lmctl code team <add|list|show|rm>")}}function W$(t,e,r){let n=F(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=x(n,"--provider");if(o===void 0)return w(e,"code team add requires --provider");let i=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?q(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1403
- `),0}function B$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=Uh(r.listTeamMembers(s.team.id));if(M(n,"--json"))q(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ie(i)} ${i.sessionid??"(unseeded)"}
1404
- `);return 0}function q$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team show <alias>");let o=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?w(e,`member not found: ${s}`):(M(n,"--json")?q(e,i):(e.stdout.write(`member ${i.alias}
1389
+ `),2}var $e=b(()=>{"use strict";Pe();Ve()});var Wh={};ce(Wh,{defaultTeamNameForProject:()=>ej,resolveAlias:()=>mi,resolveProject:()=>di,resolveTeam:()=>fi,runCode:()=>P$});import{execFileSync as M$}from"node:child_process";import{basename as D$,resolve as Dh}from"node:path";import*as Uc from"node:readline";import{setTimeout as Fc}from"node:timers/promises";async function P$(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r===void 0)return F$(e);if(r==="chat"&&(n.includes("--help")||n.includes("-h")))return Fh(e);if(r==="spec"&&(n.includes("--help")||n.includes("-h")))return V$(e);try{return await G(e,async s=>{switch(r){case"team":return U$(n,e,s);case"chat":return J$(n,e,s);case"spec":return X$(n,e,s);default:return y(e,"usage: lmctl code <team|chat|spec> ...")}})}catch(s){return me(e,s)}}function F$(t){return t.stdout.write(["usage: lmctl code <team|chat> ..."," lmctl code spec <task-description> [options]","","Manage the active project code team, chat with a code agent, or start","spec-driven code work.","","subcommands:"," team add <alias> --provider P [--model M] [--role R]"," team list"," team show <alias>"," team rm <alias>"," chat [--alias A]"," spec <task-description> [--slug S] [--template W]",""].join(`
1390
+ `)),0}function U$(t,e,r){let[n,...s]=t;switch(n){case"add":return W$(s,e,r);case"list":return B$(s,e,r);case"show":return q$(s,e,r);case"rm":return H$(s,e,r);default:return y(e,"usage: lmctl code team <add|list|show|rm>")}}function W$(t,e,r){let n=F(t,["--project","--team","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team add <alias> --provider P [--model M] [--role R]");let o=N(n,"--provider");if(o===void 0)return y(e,"code team add requires --provider");let i=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof i=="number")return i;let a=r.insertTeamMember({team_id:i.team.id,alias:s,provider:o,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??i.project.local_path});return M(n,"--json")?q(e,a):e.stdout.write(`added member ${a.alias} to ${i.team.name}
1391
+ `),0}function B$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=Uh(r.listTeamMembers(s.team.id));if(M(n,"--json"))q(e,o);else for(let i of o)e.stdout.write(`${i.alias} ${i.role} ${Ie(i)} ${i.sessionid??"(unseeded)"}
1392
+ `);return 0}function q$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team show <alias>");let o=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);return i===null||i.state==="retired"?y(e,`member not found: ${s}`):(M(n,"--json")?q(e,i):(e.stdout.write(`member ${i.alias}
1405
1393
  `),e.stdout.write(`role: ${i.role}
1406
1394
  `),e.stdout.write(`provider: ${Ie(i)}
1407
1395
  `),e.stdout.write(`model: ${i.model??"(default)"}
1408
1396
  `),e.stdout.write(`sessionid: ${i.sessionid??"(unseeded)"}
1409
1397
  `),e.stdout.write(`sessiondir: ${i.sessiondir}
1410
- `)),0)}function H$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: code team rm <alias>");let o=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return w(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?q(e,a):e.stdout.write(`retired member ${i.alias}
1411
- `),0}async function J$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Fh(e);let n=F(t,["--project","--team","--alias"]);if(n.error!==void 0)return w(e,n.error);let s=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof s=="number")return s;let o=mi(e,r,s.team,x(n,"--alias"));if(typeof o=="number")return o;let i=await Q$(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1398
+ `)),0)}function H$(t,e,r){let n=F(t,["--project","--team"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: code team rm <alias>");let o=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=r.findTeamMemberByAlias(o.team.id,s);if(i===null||i.state==="retired")return y(e,`member not found: ${s}`);let a=r.setMemberState(i.id,"retired","removed via code team rm");return M(n,"--json")?q(e,a):e.stdout.write(`retired member ${i.alias}
1399
+ `),0}async function J$(t,e,r){if(t.includes("--help")||t.includes("-h"))return Fh(e);let n=F(t,["--project","--team","--alias"]);if(n.error!==void 0)return y(e,n.error);let s=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof s=="number")return s;let o=mi(e,r,s.team,N(n,"--alias"));if(typeof o=="number")return o;let i=await Q$(e,r,s.project,o);e.stdout.write(`[${i.alias}@${s.project.name}] type /help for commands
1412
1400
  `);let a=e.stdin??process.stdin,l=Uc.createInterface({input:a,terminal:!1}),c=i;os(e,c,s.project);try{for await(let u of l){let d=u.trim();if(d.length===0){os(e,c,s.project);continue}if(d==="/exit")return e.stdout.write(`[bye]
1413
1401
  `),0;if(d==="/help"){Z$(e),os(e,c,s.project);continue}if(d.startsWith("/")){e.stderr.write(`unknown command: ${d}
1414
1402
  `),os(e,c,s.project);continue}e.stdout.write(`[${c.alias}@${s.project.name}] (thinking...)
1415
1403
  `);let f=await Vr({sessionid:c.sessionid,sessiondir:c.sessiondir,prompt:d,dal:r,team_member_id:c.id});e.stdout.write(`${f.text.trimEnd()}
1416
- `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),os(e,c,s.project)}}finally{l.close()}return 0}async function X$(t,e,r){let n=F(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return w(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return w(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=on(e,r,x(n,"--project"),x(n,"--team"));if(typeof o=="number")return o;let i=x(n,"--template")??Ph,a=r.getWorkflowByName(i);if(a===null)return w(e,`workflow not found: ${i}`);let l=x(n,"--slug")??z$(s),c={task_description:s,slug:l},u=x(n,"--from-requirement"),d=x(n,"--from-plan"),f=x(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=G$(r,e),p=await is(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1404
+ `);let m=r.findTeamMemberByAlias(s.team.id,c.alias);m!==null&&(c=m),os(e,c,s.project)}}finally{l.close()}return 0}async function X$(t,e,r){let n=F(t,["--slug","--template","--from-requirement","--from-plan","--from-design","--project","--team"]);if(n.error!==void 0)return y(e,n.error);let s=n.positionals.join(" ").trim();if(s.length===0)return y(e,"usage: code spec <task-description> [--slug S] [--template W]");let o=on(e,r,N(n,"--project"),N(n,"--team"));if(typeof o=="number")return o;let i=N(n,"--template")??Ph,a=r.getWorkflowByName(i);if(a===null)return y(e,`workflow not found: ${i}`);let l=N(n,"--slug")??z$(s),c={task_description:s,slug:l},u=N(n,"--from-requirement"),d=N(n,"--from-plan"),f=N(n,"--from-design");u!==void 0&&(c.from_requirement=u),d!==void 0&&(c.from_plan=d),f!==void 0&&(c.from_design=f);let m=G$(r,e),p=await is(m,"/api/jobs","POST",{project:o.project.name,source:"code_spec",source_ref:l,payload:c,dedupe_key:`code_spec:${o.project.name}:${l}`,workflow_id_override:a.id});return e.stderr.write(`[code spec] enqueued job ${p.id} for ${o.project.name}/${l}
1417
1405
  `),K$(e,m,p.id)}function G$(t,e){let r=zn(t,process.env,e);return process.env.LMCTL_API_URL=r.baseUrl,r.token!==null&&r.token.length>0&&(process.env.LMCTL_API_TOKEN=r.token),r}function V$(t){return t.stdout.write(["usage: lmctl code spec <task-description> [options]","","options:"," --slug S default: slugified task description",` --template W default: ${Ph}`," --from-requirement PATH skip requirement stage"," --from-plan PATH skip plan stage"," --from-design PATH skip design stage"," --project NAME override cwd project resolution"," --team NAME override project team","","interactive commands while paused:"," /done mark current Interactive stage done"," /exit leave the run paused and exit",""].join(`
1418
1406
  `)),0}async function K$(t,e,r){let n=null;for(let s=0;s<1e3;s+=1){let o=await is(e,`/api/jobs/${r}/run`,"POST");if(o.run_id!==null&&(n=o.run_id),o.status==="done")return t.stdout.write(`code spec complete: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
1419
1407
  `),o.terminal_state==="done"?0:1;if(o.status==="failed")return t.stderr.write(`code spec failed: run ${o.run_id??n??"(unknown)"} terminal=${o.terminal_state??"(none)"}
@@ -1424,32 +1412,32 @@ Don't dump all of durable-memory into your context. The pattern is index-first,
1424
1412
  `);let a=Uc.createInterface({input:t.stdin??process.stdin,terminal:!1});try{for await(let l of a){let c=l.trim();if(c==="/exit")return t.stdout.write(`code spec paused: job ${r}, run ${n}, stage ${o}
1425
1413
  `),0;if(c==="/done")return await is(e,`/api/interactive/${i.id}/respond`,"POST",{input:"",done:!0}),"continue";if(c.length!==0)return await is(e,`/api/interactive/${i.id}/respond`,"POST",{input:c,done:!1}),"continue"}}finally{a.close()}return 0}async function is(t,e,r,n){let s=new URL(e,t.baseUrl),o={Accept:"application/json"};t.token!==null&&t.token.length>0&&(o.Authorization=`Bearer ${t.token}`);let i;n!==void 0&&(i=JSON.stringify(n),o["Content-Type"]="application/json");let a=await fetch(s,{method:r,headers:o,body:i});if(!a.ok)throw new Error(`HTTP ${a.status}: ${await a.text()}`);return await a.json()}function z$(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,60);return e.length>0?e:"spec-task"}function Fh(t){return t.stdout.write(["usage: lmctl code chat [--project P] [--team T] [--alias A]","","slash commands:"," /help show this help"," /exit exit the REPL",""].join(`
1426
1414
  `)),0}function Z$(t){t.stderr.write(`commands: /help, /exit
1427
- `)}function os(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function di(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?w(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=M$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return w(t,"not in a git repo; use --project <name>")}let o=Dh(s),i=e.listProjects().find(a=>Dh(a.local_path)===o);return i===void 0?w(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function fi(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?w(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?w(t,`project ${r.name} has no assigned team; use --team <name>`):s}function mi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?w(t,`member not found: ${n}`):o}let s=Uh(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?w(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function on(t,e,r,n){let s=di(t,e,r);if(typeof s=="number")return s;let o=fi(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Uh(t){return t.filter(e=>e.state!=="retired")}async function Q$(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1415
+ `)}function os(t,e,r){t.stdout.write(`[${e.alias}@${r.name}] > `)}function di(t,e,r){if(r!==void 0){let a=e.findProjectByName(r);return a===null?y(t,`project not found: ${r}`):a}let n=t.cwd??process.cwd(),s;try{s=M$("git",["rev-parse","--show-toplevel"],{cwd:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim()}catch{return y(t,"not in a git repo; use --project <name>")}let o=Dh(s),i=e.listProjects().find(a=>Dh(a.local_path)===o);return i===void 0?y(t,"no lmctl project for this directory; create via `lmctl project create` or use --project <name>"):i}function fi(t,e,r,n){if(n!==void 0){let o=e.findTeamByName(n);return o===null?y(t,`team not found: ${n}`):o}let s=e.getTeam(r.team_id);return s===null?y(t,`project ${r.name} has no assigned team; use --team <name>`):s}function mi(t,e,r,n){if(n!==void 0){let o=e.findTeamMemberByAlias(r.id,n);return o===null||o.state==="retired"?y(t,`member not found: ${n}`):o}let s=Uh(e.listTeamMembers(r.id)).find(o=>o.role==="agent");return s===void 0?y(t,`team ${r.name} has no active agent member; add one with \`lmctl code team add <alias> --provider <provider>\``):s}function on(t,e,r,n){let s=di(t,e,r);if(typeof s=="number")return s;let o=fi(t,e,s,n);return typeof o=="number"?o:{project:s,team:o}}function Uh(t){return t.filter(e=>e.state!=="retired")}async function Q$(t,e,r,n){if(n.sessionid!==null&&n.sessionid.trim().length>0)return n;t.stderr.write(`[seeding ${n.alias}...]
1428
1416
  `),Go(r,e),Ko(r);let s=await Kr({member:n,dal:e}),o=e.updateTeamMemberSession(n.id,s.sessionid);if(o===null)throw new Error(`member disappeared during seed: ${n.alias}`);let i=en(Ie(o),s.sessionid);i!==null&&t.stderr.write(`[seeded ${o.alias}] customize/compact in its native TUI:
1429
1417
  ${i}
1430
1418
  `),await ui({dal:e,member:o,stderr:t.stderr});let a=o.role_prompt??"",l=a.length>0?`${a}
1431
1419
 
1432
- ${Qr}`:Qr;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${D$(t.local_path)}-code`}var Ph,Wc=b(()=>{"use strict";Gn();$o();Qn();Ec();bc();Pe();tn();Pc();$e();wc();Ph="spec-driven-task"});import Bh from"jexl";function sr(t){Bh.compile(qh(t))}async function $r(t,e){return Bh.eval(qh(t),e)}function qh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var an=b(()=>{"use strict"});import{z as y}from"zod";function Vc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,Hh,Bc,qc,Hc,Jc,Xc,Gc,Jh,rj,nj,sj,as,oj,pi,hi,_i,gi,wi,Xh,ij,aj,lj,cj,yi,ln=b(()=>{"use strict";an();tj=y.object({kind:y.enum(["success","neutral","failure"])}),Hh=y.enum(["string","number","boolean","object","array"]),Bc=y.object({name:y.string().min(1),type:Hh,required:y.boolean().optional(),default:y.unknown().optional(),description:y.string().optional()}),qc=y.object({name:y.string().min(1),type:Hh,source_step_id:y.string().min(1),source_field:y.string().min(1),description:y.string().optional()}),Hc=y.object({id:y.string().min(1),type:y.string().min(1),parameters:y.record(y.string(),y.unknown()).default({})}),Jc="__failure__",Xc=y.object({tools:y.array(y.string().min(1)).optional(),auth:y.array(y.string().min(1)).optional()}).strict().optional(),Gc=y.object({on_unhandled_failure:y.object({attention_kind:y.string().min(1).default("workflow_failed"),severity:y.enum(["warn","error","critical"]).default("warn"),capture_evidence:y.boolean().default(!0),recommend_recovery:y.string().min(1).optional()}).optional(),on_unhandled_failure_state:y.string().min(1).optional()}).optional(),Jh=y.object({type:y.literal("AssertRepoClean"),fail_message:y.string().min(1).optional(),next:y.string().min(1)}),rj=y.object({name:y.string().min(1),command:y.string().min(1).optional(),args:y.array(y.string()).optional(),env:y.record(y.string(),y.string()).optional(),type:y.enum(["stdio","http","sse"]).optional(),url:y.string().min(1).optional(),headers:y.record(y.string(),y.string()).optional()}).strict(),nj=y.union([y.string().min(1),rj]),sj=y.union([y.string().min(1),y.object({name:y.string().min(1),content:y.string().min(1)}).strict()]),as=y.object({team:y.string().min(1),alias:y.string().min(1),prompt_template:y.string().optional(),mcp:y.array(nj).optional(),skills:y.array(sj).optional()}),oj=y.object({kind:y.literal("shell"),command:y.string().min(1),description:y.string().optional()}),pi=y.object({type:y.literal("Review"),state_name:y.string().min(1),coder:as,pre_checks:y.array(oj).optional(),reviewers:y.array(as.extend({rubric_artifact:y.string().optional()})).optional(),outcomes:y.object({approve:y.string().min(1),request_changes:y.string().optional(),fail_pre_check:y.string().optional(),max_loops_exceeded:y.string().optional()}),writes_to_project_path:y.boolean().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional(),max_loops:y.number().int().positive().default(5),loop_feedback_artifact:y.string().optional(),outcomes_from_stance:y.record(y.string(),y.string().min(1)).optional()}).superRefine((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),hi=y.object({type:y.literal("Consolidate"),state_name:y.string().min(1),researchers:y.array(as.extend({topic:y.string().min(1)})).optional(),consolidator:as,outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),research_artifact_prefix:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),_i=y.object({type:y.literal("Interactive"),state_name:y.string().min(1),agent:as.extend({initial_prompt_template:y.string().min(1)}),termination:y.object({operator_signal:y.boolean().default(!0),agent_signal:y.string().optional(),max_turns:y.number().int().positive().default(20),timeout_seconds:y.number().int().positive().optional()}),outcomes:y.object({done:y.string().min(1),timeout:y.string().optional()}),artifact_name:y.string().optional(),durable_memory_tags:y.array(y.string().min(1)).optional(),write_back_durable_memory:y.union([y.boolean(),y.string().min(1)]).optional()}),gi=y.object({type:y.literal("Loop"),state_name:y.string().min(1),over:y.string().min(1),item_var:y.string().min(1),body:y.string().min(1),outcomes:y.object({ok:y.string().min(1),error:y.string().optional()}),stop_on_error:y.boolean().default(!0),max_items:y.number().int().positive().default(1e3)}),wi=y.object({type:y.literal("ShellStep"),state_name:y.string().min(1),command:y.string().min(1),outcomes_from_exit:y.record(y.string(),y.string().min(1)),timeout_ms:y.number().int().nonnegative().optional(),capture_output_to:y.string().optional(),writes_to_project_path:y.boolean().optional()}),Xh=y.object({type:y.literal("Choice"),state_name:y.string().min(1),branches:y.array(y.object({when:y.string().min(1),next:y.string().min(1)})).default([]),default_next:y.string().min(1).optional()}).superRefine((t,e)=>{for(let[r,n]of t.branches.entries())try{sr(Vc(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),ij=y.discriminatedUnion("type",[Jh,pi,hi,_i,gi,wi,Xh]),aj=y.object({type:y.literal("ForEach"),state_name:y.string().min(1),items_from:y.string().min(1),mode:y.enum(["sequential","parallel"]).default("sequential"),max_concurrency:y.number().int().positive().default(1),on_item_failure:y.enum(["continue","stop"]).default("stop"),body:ij,outcomes:y.object({all_ok:y.string().min(1),any_failed:y.string().optional()})}).superRefine((t,e)=>{try{sr(Vc(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),lj=y.object({type:y.literal("Subflow"),state_name:y.string().min(1),workflow_name:y.string().min(1),inputs:y.record(y.string(),y.string().min(1)).optional(),outcomes:y.record(y.string(),y.string().min(1))}).superRefine((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{sr(Vc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=y.discriminatedUnion("type",[Jh,pi,hi,_i,gi,wi,Xh,aj,lj]),yi=y.object({name:y.string().min(1),version:y.number().int().positive(),definition_schema_version:y.union([y.literal(1),y.literal(2)]),description:y.string().optional(),estimated_duration_ms:y.number().int().nonnegative().optional(),primitive_version:y.union([y.literal(1),y.literal(2)]).default(1),start_at:y.string().min(1),states:y.record(y.string().min(1),cj),terminals:y.record(y.string().min(1),tj),errors:Gc,concurrency_key:y.string().min(1).optional(),concurrent_limit:y.number().int().positive().optional(),default_task_timeout_ms:y.number().int().positive().max(216e5).optional(),inputs:y.array(Bc).optional(),outputs:y.array(qc).optional(),triggers:y.array(Hc).optional(),read_only:y.boolean().optional(),requires:Xc}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var uj,Ei,dj,fj,mj,yt,cn=b(()=>{"use strict";ln();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ei=Q.string().regex(uj),dj=Q.object({step_id:Ei,type:Q.literal("main"),index:Q.number().int().min(0)}),fj=Q.record(Ei,Q.record(Q.string().min(1),Q.array(Q.array(dj)))),mj=Q.object({id:Ei,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),yt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:Gc,inputs:Q.array(Bc).optional(),outputs:Q.array(qc).optional(),steps:Q.array(mj).min(1),connections:fj.default({}),entry_step_id:Ei,triggers:Q.array(Hc).optional(),read_only:Q.boolean().optional(),requires:Xc}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function bi(t){return Yc(t)}function Yc(t){if(Array.isArray(t))return t.map(Yc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Yc(e[n]);if(typeof r.type=="string"){let n=hj[r.type];n!==void 0&&(r.type=n)}return r}var Kc,pj,hj,zc=b(()=>{"use strict";Kc="lmctl.builtin.",pj={Review:`${Kc}Review`,Research:`${Kc}Research`,Consolidate:`${Kc}Consolidate`},hj=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as _j}from"node:fs";function Kh(t){return gj(t)}function gj(t){let e=bi(Ej(t));if(yj(e),Yh(e)===3)return wj(e);let r=yi.safeParse(e);if(!r.success)throw new Ct({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=bj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ct(n);return r.data}function wj(t){let e=yt.safeParse(t);if(!e.success)throw new Ct({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function yj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Yh(t);if(!(e===null||Gh.includes(e)))throw new Ct({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Gh.join(", ")}`}]})}function Yh(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1433
- `)||e.startsWith("{")||e.startsWith("[")?Vh(t,"$"):e.endsWith(".json")?Vh(_j(e,"utf8"),e):t}function Vh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ct({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function bj(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),Sj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Sj(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var Gh,Ct,zh=b(()=>{"use strict";ln();cn();zc();Gh=[1,2,3],Ct=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as Tj}from"node:crypto";function Zh(t,e){let r=kj(e),n=Tj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Qh=b(()=>{"use strict";cn()});function Nj(t,e){let r=Ij[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function n_(t){let e=[],r=(v,I)=>{throw new un([{line:v,message:I}])},n=t.split(`
1434
- `),s=[];for(let v=0;v<n.length;v+=1){let O=jj(n[v]).trim();O.length>0&&s.push({n:v+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(v,I,O,J,W,L)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:J,isTerminal:W,...L?{members:L}:{}}),u.push(v)},T=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;I.push({label:J[1],dst:J[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=or(W[1],I,r);for(let te of Object.keys(L))t_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...t_].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=e_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(e_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:we,members:Tt}=Nj(ie,or(_e,I,r));_(L,ie,we,I,!1,Object.keys(Tt).length>0?Tt:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=r_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(r_).join(", ")})`),p.has(L)&&r(I,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:or(_e,I,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),L=W[1],te=W[2].trim(),_e=J==="mcp"?h:g;_e.has(L)&&r(I,`duplicate ${J} declaration: ${L}`);let ie;if(te.startsWith("{")){let we=or(te,I,r);J==="mcp"?ie={...we,name:L}:((typeof we.content!="string"||we.content.length===0)&&r(I,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:we.content})}else{let we=s_(te);(typeof we!="string"||we.length===0)&&r(I,`\`${J} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=we}_e.set(L,ie);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},I,!0);continue}if(J==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],we=L[te+2],Tt=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Tt,dstDeclId:we,line:I})}continue}if(J==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let we=s[ie].text,Tt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Tt!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Tt[2];te.push({when:Tt[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:L,port:jn,dstDeclId:Tt[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(we);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:L,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(W[1],"lmctl/loop",or(W[2],I,r),I,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=or(W[2],I,r);"mode"in L&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(W[1],"lmctl/foreach",L,I,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=W[1],te=or(W[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...we}=te;_(L,"lmctl/subflow",{workflow_name:_e,...we},I,!1),d.push({declId:L,target:_e,line:I});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=W[1],te=or(W[2],I,r),{branches:_e,nextIdx:ie}=T(v);_e.length===0&&r(I,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let we of _e)c.push({srcDeclId:L,port:we.label,dstDeclId:we.dst,line:I});v=ie;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(I,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let W=I[O];Array.isArray(W)&&(I[O]=W.map(L=>typeof L=="string"&&J.has(L)?structuredClone(J.get(L)):L))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>Zh(i,v),$=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),N={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);N[I]??={},N[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),N[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);xj.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let A=new Map;for(let v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let J=A.get(v);J===void 0?A.set(v,[O]):J.push(O)}}let D=new Set([f]),C=[f];for(;C.length>0;){let v=C.shift();for(let I of A.get(v)??[])D.has(I)||(D.add(I),C.push(I))}for(let v of u)D.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let H=new Map;for(let v of c){let I=H.get(v.srcDeclId);I===void 0&&(I=new Set,H.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=H.get(v)??new Set;if(I.type==="lmctl/review"){let W=[...O].some(L=>!R.has(L));!O.has("approve")&&!W&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 J=$j[I.type];if(J!==void 0)for(let W of J)O.has(W)||r(I.line,`uncovered outcome: required outcome \`${W}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${W}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=vj[I.type];if(O===void 0)continue;let J={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},W=O.schema.safeParse(J);if(!W.success){let L=W.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let U={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:N,entry_step_id:k(f)},z=yt.safeParse(U);if(!z.success)throw new un(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function jj(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function or(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of Aj(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=s_(l)}return s}function Aj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function s_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var vj,Ij,e_,un,xj,$j,t_,r_,o_=b(()=>{"use strict";cn();Qh();ln();vj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:pi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:hi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:_i},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:gi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:wi}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};e_={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"},un=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1420
+ ${Qr}`:Qr;return e.setMemberPromptSnapshot(o.id,l)??o}function ej(t){return`${D$(t.local_path)}-code`}var Ph,Wc=b(()=>{"use strict";Gn();$o();Qn();Ec();bc();Pe();tn();Pc();$e();yc();Ph="spec-driven-task"});import Bh from"jexl";function sr(t){Bh.compile(qh(t))}async function $r(t,e){return Bh.eval(qh(t),e)}function qh(t){return t.replace(/([A-Za-z_$][\w$.[\]]*)\.includes\(([^()]+)\)/g,"($2 in $1)")}var an=b(()=>{"use strict"});import{z as w}from"zod";function Vc(t){let e=t.trim();return e.startsWith("={{")&&e.endsWith("}}")?e.slice(3,-2).trim():t}var tj,Hh,Bc,qc,Hc,Jc,Xc,Gc,Jh,rj,nj,sj,as,oj,pi,hi,_i,gi,yi,Xh,ij,aj,lj,cj,wi,ln=b(()=>{"use strict";an();tj=w.object({kind:w.enum(["success","neutral","failure"])}),Hh=w.enum(["string","number","boolean","object","array"]),Bc=w.object({name:w.string().min(1),type:Hh,required:w.boolean().optional(),default:w.unknown().optional(),description:w.string().optional()}),qc=w.object({name:w.string().min(1),type:Hh,source_step_id:w.string().min(1),source_field:w.string().min(1),description:w.string().optional()}),Hc=w.object({id:w.string().min(1),type:w.string().min(1),parameters:w.record(w.string(),w.unknown()).default({})}),Jc="__failure__",Xc=w.object({tools:w.array(w.string().min(1)).optional(),auth:w.array(w.string().min(1)).optional()}).strict().optional(),Gc=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(),Jh=w.object({type:w.literal("AssertRepoClean"),fail_message:w.string().min(1).optional(),next:w.string().min(1)}),rj=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(),nj=w.union([w.string().min(1),rj]),sj=w.union([w.string().min(1),w.object({name:w.string().min(1),content:w.string().min(1)}).strict()]),as=w.object({team:w.string().min(1),alias:w.string().min(1),prompt_template:w.string().optional(),mcp:w.array(nj).optional(),skills:w.array(sj).optional()}),oj=w.object({kind:w.literal("shell"),command:w.string().min(1),description:w.string().optional()}),pi=w.object({type:w.literal("Review"),state_name:w.string().min(1),coder:as,pre_checks:w.array(oj).optional(),reviewers:w.array(as.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((t,e)=>{(t.reviewers??[]).length>0&&t.outcomes_from_stance!==void 0&&e.addIssue({code:"custom",path:["outcomes_from_stance"],message:"outcomes_from_stance cannot be used when reviewers is non-empty"})}),hi=w.object({type:w.literal("Consolidate"),state_name:w.string().min(1),researchers:w.array(as.extend({topic:w.string().min(1)})).optional(),consolidator:as,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()}),_i=w.object({type:w.literal("Interactive"),state_name:w.string().min(1),agent:as.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()}),gi=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)}),yi=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()}),Xh=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((t,e)=>{for(let[r,n]of t.branches.entries())try{sr(Vc(n.when))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["branches",r,"when"],message:`invalid jexl expression: ${o}`})}}),ij=w.discriminatedUnion("type",[Jh,pi,hi,_i,gi,yi,Xh]),aj=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:ij,outcomes:w.object({all_ok:w.string().min(1),any_failed:w.string().optional()})}).superRefine((t,e)=>{try{sr(Vc(t.items_from))}catch(r){let n=r instanceof Error?r.message:"invalid expression";e.addIssue({code:"custom",path:["items_from"],message:`invalid jexl expression: ${n}`})}}),lj=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((t,e)=>{for(let[r,n]of Object.entries(t.inputs??{}))try{sr(Vc(n))}catch(s){let o=s instanceof Error?s.message:"invalid expression";e.addIssue({code:"custom",path:["inputs",r],message:`invalid jexl expression: ${o}`})}}),cj=w.discriminatedUnion("type",[Jh,pi,hi,_i,gi,yi,Xh,aj,lj]),wi=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),cj),terminals:w.record(w.string().min(1),tj),errors:Gc,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(Bc).optional(),outputs:w.array(qc).optional(),triggers:w.array(Hc).optional(),read_only:w.boolean().optional(),requires:Xc}).superRefine((t,e)=>{t.definition_schema_version===1&&t.errors!==void 0&&e.addIssue({code:"custom",path:["errors"],message:"errors block requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.concurrency_key!==void 0&&e.addIssue({code:"custom",path:["concurrency_key"],message:"concurrency_key requires definition_schema_version: 2"}),t.definition_schema_version===1&&t.default_task_timeout_ms!==void 0&&e.addIssue({code:"custom",path:["default_task_timeout_ms"],message:"default_task_timeout_ms requires definition_schema_version: 2"})})});import{z as Q}from"zod";var uj,Ei,dj,fj,mj,wt,cn=b(()=>{"use strict";ln();uj=/^s-[a-z0-9-]+-[a-f0-9]{4}$/,Ei=Q.string().regex(uj),dj=Q.object({step_id:Ei,type:Q.literal("main"),index:Q.number().int().min(0)}),fj=Q.record(Ei,Q.record(Q.string().min(1),Q.array(Q.array(dj)))),mj=Q.object({id:Ei,name:Q.string().min(1),type:Q.string().min(1),typeVersion:Q.number().int().positive().default(1),parameters:Q.record(Q.string(),Q.unknown()).default({}),members:Q.record(Q.string(),Q.unknown()).optional(),estimated_duration_ms:Q.number().int().nonnegative().optional()}),wt=Q.object({schema_version:Q.literal("lmctl/v3"),definition_schema_version:Q.literal(3),name:Q.string().min(1),version:Q.number().int().positive(),description:Q.string().optional(),estimated_duration_ms:Q.number().int().nonnegative().optional(),default_task_timeout_ms:Q.number().int().positive().max(216e5).optional(),concurrency_key:Q.string().min(1).optional(),concurrent_limit:Q.number().int().positive().optional(),errors:Gc,inputs:Q.array(Bc).optional(),outputs:Q.array(qc).optional(),steps:Q.array(mj).min(1),connections:fj.default({}),entry_step_id:Ei,triggers:Q.array(Hc).optional(),read_only:Q.boolean().optional(),requires:Xc}).superRefine((t,e)=>{let r=new Set;for(let[n,s]of t.steps.entries())r.has(s.id)&&e.addIssue({code:"custom",path:["steps",n,"id"],message:`duplicate step id: ${s.id}`}),r.add(s.id);r.has(t.entry_step_id)||e.addIssue({code:"custom",path:["entry_step_id"],message:`entry_step_id does not reference an existing step: ${t.entry_step_id}`});for(let[n,s]of Object.entries(t.connections)){r.has(n)||e.addIssue({code:"custom",path:["connections",n],message:`connection source does not reference an existing step: ${n}`});for(let[o,i]of Object.entries(s))for(let[a,l]of i.entries())for(let[c,u]of l.entries())r.has(u.step_id)||e.addIssue({code:"custom",path:["connections",n,o,a,c,"step_id"],message:`connection target does not reference an existing step: ${u.step_id}`})}})});function bi(t){return Yc(t)}function Yc(t){if(Array.isArray(t))return t.map(Yc);if(t===null||typeof t!="object")return t;let e=t,r={};for(let n of Object.keys(e))r[n]=Yc(e[n]);if(typeof r.type=="string"){let n=hj[r.type];n!==void 0&&(r.type=n)}return r}var Kc,pj,hj,zc=b(()=>{"use strict";Kc="lmctl.builtin.",pj={Review:`${Kc}Review`,Research:`${Kc}Research`,Consolidate:`${Kc}Consolidate`},hj=Object.fromEntries(Object.entries(pj).map(([t,e])=>[e,t]))});import{readFileSync as _j}from"node:fs";function Kh(t){return gj(t)}function gj(t){let e=bi(Ej(t));if(wj(e),Yh(e)===3)return yj(e);let r=wi.safeParse(e);if(!r.success)throw new Ct({errors:r.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message}))});let n=bj(r.data);if(n.errors.length>0||n.unresolvedRefs.length>0)throw new Ct(n);return r.data}function yj(t){let e=wt.safeParse(t);if(!e.success)throw new Ct({errors:e.error.issues.map(r=>({path:r.path.length===0?"$":r.path.map(String).join("."),message:r.message}))});return e.data}function wj(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return;let e=Yh(t);if(!(e===null||Gh.includes(e)))throw new Ct({errors:[{path:"definition_schema_version",message:`unsupported definition_schema_version ${e}; supported versions: ${Gh.join(", ")}`}]})}function Yh(t){if(typeof t!="object"||t===null||!("definition_schema_version"in t))return null;let e=t.definition_schema_version;return typeof e=="number"?e:null}function Ej(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1421
+ `)||e.startsWith("{")||e.startsWith("[")?Vh(t,"$"):e.endsWith(".json")?Vh(_j(e,"utf8"),e):t}function Vh(t,e){try{return JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:"invalid JSON";throw new Ct({errors:[{path:e,message:`invalid JSON: ${n}`}]})}}function bj(t){let e=[],r=[],n=new Set(Object.keys(t.states));n.has(t.start_at)||r.push({state:"$",ref:t.start_at,kind:"next"}),Sj(t,n,r);for(let[s,o]of Object.entries(t.states))new Set(Object.keys(t.terminals));return{errors:e,unresolvedRefs:r}}function Sj(t,e,r){let n=t.errors?.on_unhandled_failure_state;n!==void 0&&(e.has(n)||r.push({state:"$",ref:n,kind:"next"}))}var Gh,Ct,zh=b(()=>{"use strict";ln();cn();zc();Gh=[1,2,3],Ct=class extends Error{errors;unresolvedRefs;constructor(e){super(e.message??"workflow validation failed"),this.name="WorkflowValidationError",this.errors=e.errors??[],this.unresolvedRefs=e.unresolvedRefs??[]}}});import{createHash as Tj}from"node:crypto";function Zh(t,e){let r=kj(e),n=Tj("sha1").update(`${t}:${e}`).digest("hex").slice(0,4);return`s-${r}-${n}`}function kj(t){let e=t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return e.length>0?e:"step"}var Qh=b(()=>{"use strict";cn()});function xj(t,e){let r=Ij[t]??[],n={},s={};for(let[o,i]of Object.entries(e))r.includes(o)?s[o]=i:n[o]=i;return{params:n,members:s}}function n_(t){let e=[],r=(v,I)=>{throw new un([{line:v,message:I}])},n=t.split(`
1422
+ `),s=[];for(let v=0;v<n.length;v+=1){let O=jj(n[v]).trim();O.length>0&&s.push({n:v+1,text:O})}s.length===0&&r(1,"empty composition: expected a `workflow <name> v<version>` header");let o=/^workflow\s+(\S+)\s+v(\d+)$/.exec(s[0].text)??r(s[0].n,`expected header \`workflow <name> v<version>\`, got: ${s[0].text}`),i=o[1],a=Number.parseInt(o[2],10),l=new Map,c=[],u=[],d=[],f,m={},p=new Map,h=new Map,g=new Map,_=(v,I,O,J,W,L)=>{l.has(v)&&r(J,`duplicate step/terminal id: ${v}`),/^[A-Za-z][\w-]*$/.test(v)||r(J,`invalid id (must start with a letter): ${v}`),l.set(v,{declId:v,type:I,params:O,line:J,isTerminal:W,...L?{members:L}:{}}),u.push(v)},T=v=>{let I=[],O=v+1;for(;O<s.length;O+=1){let J=/^([A-Za-z][\w-]*|default)\s*->\s*([A-Za-z][\w-]*)$/.exec(s[O].text);if(J===null)break;I.push({label:J[1],dst:J[2]})}return{branches:I,nextIdx:O-1}};for(let v=1;v<s.length;v+=1){let{n:I,text:O}=s[v],J=O.split(/\s+/,1)[0];if(/^meta\s*\(/.test(O)){v!==1&&r(I,"`meta(...)` must be the preamble \u2014 the FIRST line after the `workflow` header (at most one, before any construct)");let W=/^meta\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`meta\` (expected \`meta({ "requires"?:\u2026, "default_task_timeout_ms"?:\u2026, "errors"?:\u2026, "concurrency_key"?:\u2026, "concurrent_limit"?:\u2026 })\`): ${O}`),L=or(W[1],I,r);for(let te of Object.keys(L))t_.has(te)||r(I,`unknown \`meta\` key \`${te}\` \u2014 only workflow-level runtime metadata is allowed: ${[...t_].join(", ")} (no grammar inflation; bounded)`);m=L;continue}if(J==="step"){let W=/^step\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`step\` (expected \`step <id> = <archetype>(k=v, ...)\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=e_[te];ie===void 0&&r(I,`unknown step type: ${te} (supported \`step\` archetypes: ${Object.keys(e_).join(", ")}; choice/terminal/loop/foreach/call/decide have their own constructs)`);let{params:ye,members:Tt}=xj(ie,or(_e,I,r));_(L,ie,ye,I,!1,Object.keys(Tt).length>0?Tt:void 0);continue}if(J==="trigger"){let W=/^trigger\s+([A-Za-z][\w-]*)\s*=\s*([a-z][a-z0-9-]*)\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`trigger\` (expected \`trigger <id> = <trigger-type>({ ...json... })\`): ${O}`),L=W[1],te=W[2],_e=W[3],ie=r_[te];ie===void 0&&r(I,`unknown trigger type: ${te} (registered trigger archetypes: ${Object.keys(r_).join(", ")})`),p.has(L)&&r(I,`duplicate trigger id: ${L}`),p.set(L,{id:L,type:ie,parameters:or(_e,I,r)});continue}if(J==="mcp"||J==="skill"){let W=new RegExp(`^${J}\\s+([A-Za-z][\\w-]*)\\s*=\\s*(.+)$`).exec(O)??r(I,`malformed \`${J}\` decl (expected \`${J} <name> = {json} | ${J} <name> = "<file|url>"\`): ${O}`),L=W[1],te=W[2].trim(),_e=J==="mcp"?h:g;_e.has(L)&&r(I,`duplicate ${J} declaration: ${L}`);let ie;if(te.startsWith("{")){let ye=or(te,I,r);J==="mcp"?ie={...ye,name:L}:((typeof ye.content!="string"||ye.content.length===0)&&r(I,`\`skill ${L}\`: inline form requires a non-empty string \`content\` (a SKILL.md body)`),ie={name:L,content:ye.content})}else{let ye=s_(te);(typeof ye!="string"||ye.length===0)&&r(I,`\`${J} ${L}\`: string form must be a non-empty file path or http(s) URL`),ie=ye}_e.set(L,ie);continue}if(J==="terminal"){let W=/^terminal\s+([A-Za-z][\w-]*)\s*=\s*([A-Za-z][\w-]*)(?:\s+(success|failure|neutral))?\s*$/.exec(O)??r(I,`malformed \`terminal\` (expected \`terminal <id> = <name> [success|failure|neutral]\`): ${O}`);_(W[1],"lmctl/terminal",{name:W[2],kind:W[3]??"neutral"},I,!0);continue}if(J==="seq"){let L=O.slice(3).trim().split(/\s*(->|-[a-z0-9_]+->)\s*/).map(te=>te.trim()).filter(te=>te.length>0);(L.length<3||L.length%2===0)&&r(I,`malformed \`seq\` (expected \`<id> -> <id> [ -> <id> ... ]\`, optional \`-<port>->\`): ${O}`);for(let te=0;te+2<L.length+1&&!(te+2>L.length-1);te+=2){let _e=L[te],ie=L[te+1],ye=L[te+2],Tt=ie==="->"?"main":ie.slice(1,-2);c.push({srcDeclId:_e,port:Tt,dstDeclId:ye,line:I})}continue}if(J==="choice"){let L=(/^choice\s+([A-Za-z][\w-]*)\s*:$/.exec(O)??r(I,`malformed \`choice\` (expected \`choice <id>:\` then \`when <predicate> -<port>-> <id>\` lines): ${O}`))[1],te=[],_e,ie=v+1;for(;ie<s.length;ie+=1){let ye=s[ie].text,Tt=/^when\s+(.+)\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Tt!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\`: a \`when\` branch may not follow \`default\` (branches are ordered, default is the fallback)`);let jn=Tt[2];te.push({when:Tt[1].trim(),next:`@terminal:${jn}`}),c.push({srcDeclId:L,port:jn,dstDeclId:Tt[3],line:s[ie].n});continue}let Ja=/^default\s+-([a-z0-9_]+)->\s+([A-Za-z][\w-]*)$/.exec(ye);if(Ja!==null){_e!==void 0&&r(s[ie].n,`\`choice ${L}\` has more than one \`default\``);let jn=Ja[1];_e=`@terminal:${jn}`,c.push({srcDeclId:L,port:jn,dstDeclId:Ja[2],line:s[ie].n});continue}break}te.length===0&&r(I,`\`choice ${L}\` has no \`when\` branches (need \u22651 \`when <jexl-predicate> -<port>-> <id>\`)`),_(L,"lmctl/choice",{branches:te,..._e!==void 0?{default_next:_e}:{}},I,!1),v=ie-1;continue}if(J==="loop"){let W=/^loop\s+([A-Za-z][\w-]*)\s*=\s*loop\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`loop\` (expected \`loop <id> = loop(k=v, ...)\`): ${O}`);_(W[1],"lmctl/loop",or(W[2],I,r),I,!1);continue}if(J==="foreach"){let W=/^foreach\s+([A-Za-z][\w-]*)\s*=\s*foreach\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`foreach\` (expected \`foreach <id> = foreach(items=<expr>, ...)\`): ${O}`),L=or(W[2],I,r);"mode"in L&&r(I,"foreach is SEQUENTIAL-ONLY: `mode` is not permitted (single-thread; durable-memory/composition-language-design.md \xA7Execution model)"),_(W[1],"lmctl/foreach",L,I,!1);continue}if(J==="call"){let W=/^call\s+([A-Za-z][\w-]*)\s*=\s*call\s*\((.*)\)\s*$/.exec(O)??r(I,`malformed \`call\` (expected \`call <id> = call(workflow=<name>, ...)\`): ${O}`),L=W[1],te=or(W[2],I,r),_e=te.workflow;(typeof _e!="string"||_e.length===0)&&r(I,`\`call ${L}\` requires a \`workflow=<name>\` argument`);let{workflow:ie,...ye}=te;_(L,"lmctl/subflow",{workflow_name:_e,...ye},I,!1),d.push({declId:L,target:_e,line:I});continue}if(J==="decide"){let W=/^decide\s+([A-Za-z][\w-]*)\s+by\s+agent\s*\((.*)\)\s*:$/.exec(O)??r(I,`malformed \`decide\` (expected \`decide <id> by agent(k=v, ...):\`): ${O}`),L=W[1],te=or(W[2],I,r),{branches:_e,nextIdx:ie}=T(v);_e.length===0&&r(I,`\`decide ${L}\` has no outcomes (need at least one \`<outcome> -> <id>\`)`),_(L,"lmctl/interactive",{termination:{operator_signal:!0}},I,!1,{agent:te});for(let ye of _e)c.push({srcDeclId:L,port:ye.label,dstDeclId:ye.dst,line:I});v=ie;continue}if(J==="entry"){let W=/^entry\s+([A-Za-z][\w-]*)$/.exec(O)??r(I,`malformed \`entry\` (expected \`entry <id>\`): ${O}`);f!==void 0&&r(I,`duplicate \`entry\` (already set to ${f})`),f=W[1];continue}r(I,`unknown statement \`${J}\` (grammar: workflow / meta / trigger / mcp / skill / step / terminal / seq / choice / loop / foreach / call / decide / entry)`)}u.length===0&&r(s[0].n,"composition declares no steps"),f===void 0&&(f=u[0]),l.has(f)||r(s[0].n,`entry references undeclared step: ${f}`);let E=v=>{if(Array.isArray(v)){for(let O of v)E(O);return}if(typeof v!="object"||v===null)return;let I=v;if(typeof I.alias=="string")for(let[O,J]of[["mcp",h],["skills",g]]){let W=I[O];Array.isArray(W)&&(I[O]=W.map(L=>typeof L=="string"&&J.has(L)?structuredClone(J.get(L)):L))}for(let O of Object.values(I))E(O)};for(let v of u){let I=l.get(v);I.members!==void 0&&E(I.members)}let k=v=>Zh(i,v),$=u.map(v=>{let I=l.get(v);return{id:k(v),name:v,type:I.type,typeVersion:1,parameters:I.params,...I.members?{members:I.members}:{}}}),x={};for(let v of c){l.has(v.srcDeclId)||r(v.line,`edge source references undeclared step: ${v.srcDeclId}`),l.has(v.dstDeclId)||r(v.line,`dangling edge target: ${v.dstDeclId} is not declared`),l.get(v.srcDeclId).isTerminal&&r(v.line,`terminal \`${v.srcDeclId}\` cannot have an outgoing edge`);let I=k(v.srcDeclId);x[I]??={},x[I][v.port]!==void 0&&r(v.line,`duplicate edge port \`${v.port}\` on step \`${v.srcDeclId}\``),x[I][v.port]=[[{step_id:k(v.dstDeclId),type:"main",index:0}]]}for(let v of u){let I=l.get(v);Nj.has(I.type)||r(I.line,`unknown archetype \`${I.type}\` for step \`${v}\` \u2014 not a registered builtin (src/engine/archetypes/index.ts:17-32)`)}for(let v of d)v.target===i&&r(v.line,`subflow cycle: \`call ${v.declId}\` invokes this workflow (\`${i}\`) \u2014 direct recursion is not allowed (cross-workflow A\u2192B\u2192A cycle detection is deferred to the M3 compile.ts seam)`);let A=new Map;for(let v of c){let I=A.get(v.srcDeclId);I===void 0?A.set(v.srcDeclId,[v.dstDeclId]):I.push(v.dstDeclId)}for(let v of u){let I=l.get(v);if(I.type!=="lmctl/loop")continue;let O=I.params.body;if(typeof O=="string"&&l.has(O)){let J=A.get(v);J===void 0?A.set(v,[O]):J.push(O)}}let D=new Set([f]),C=[f];for(;C.length>0;){let v=C.shift();for(let I of A.get(v)??[])D.has(I)||(D.add(I),C.push(I))}for(let v of u)D.has(v)||r(l.get(v).line,`step \`${v}\` is unreachable from entry \`${f}\``);let H=new Map;for(let v of c){let I=H.get(v.srcDeclId);I===void 0&&(I=new Set,H.set(v.srcDeclId,I)),I.add(v.port)}let R=new Set(["approve","request_changes","fail_pre_check","max_loops_exceeded"]);for(let v of u){let I=l.get(v);if(I.isTerminal)continue;let O=H.get(v)??new Set;if(I.type==="lmctl/review"){let W=[...O].some(L=>!R.has(L));!O.has("approve")&&!W&&r(I.line,`uncovered outcome: review step \`${v}\` wires neither \`approve\` nor any stance outcome \u2014 route \`approve\` (\`seq ${v} -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 J=$j[I.type];if(J!==void 0)for(let W of J)O.has(W)||r(I.line,`uncovered outcome: required outcome \`${W}\` of step \`${v}\` (\`${I.type}\`) has no connection \u2014 route it (\`seq ${v} -${W}-> <target|terminal>\`)`);else O.size===0&&r(I.line,`uncovered outcome: non-terminal step \`${v}\` (\`${I.type}\`) has no outgoing connection \u2014 wire it with \`seq\` or route to a \`terminal\``)}for(let v of u){let I=l.get(v),O=vj[I.type];if(O===void 0)continue;let J={...I.params,...I.members??{},type:O.v2type,state_name:v,...Object.keys(O.outcomes).length>0?{outcomes:O.outcomes}:{}},W=O.schema.safeParse(J);if(!W.success){let L=W.error.issues[0],te=L.path.length===0?"$":L.path.map(String).join(".");r(I.line,`step \`${v}\` (\`${I.type}\`) has invalid params for archetype \`${O.v2type}\` at \`${te}\`: ${L.message} \u2014 this would crash the engine (it derefs this field unguarded). Provide it via the structured form: \`step ${v} = ${I.type.replace("lmctl/","")}({ ... })\``)}}let U={schema_version:"lmctl/v3",definition_schema_version:3,name:i,version:a,...m,...p.size>0?{triggers:[...p.values()]}:{},steps:$,connections:x,entry_step_id:k(f)},z=wt.safeParse(U);if(!z.success)throw new un(z.error.issues.map(v=>({line:s[0].n,message:`emitted V3 invalid at ${v.path.length===0?"$":v.path.map(String).join(".")}: ${v.message}`})));return z.data}function jj(t){let e=null;for(let r=0;r<t.length;r+=1){let n=t[r];if(e!==null){if(n==="\\"){r+=1;continue}n===e&&(e=null);continue}if(n==='"'||n==="'"){e=n;continue}if(n==="#")return t.slice(0,r)}return t}function or(t,e,r){let n=t.trim();if(n.length===0)return{};if(n.startsWith("{")){let o;try{o=JSON.parse(n)}catch(i){r(e,`malformed structured args (expected a single-line JSON object): ${i.message}`)}return(o===null||typeof o!="object"||Array.isArray(o))&&r(e,"structured args must be a JSON object"),o}let s={};for(let o of Aj(n)){let i=o.indexOf("=");i===-1&&r(e,`malformed arg (expected k=v): ${o}`);let a=o.slice(0,i).trim(),l=o.slice(i+1).trim();/^[A-Za-z_][\w-]*$/.test(a)||r(e,`invalid arg name: ${a}`),s[a]=s_(l)}return s}function Aj(t){return t.split(",").map(e=>e.trim()).filter(e=>e.length>0)}function s_(t){return t.startsWith('"')&&t.endsWith('"')||t.startsWith("'")&&t.endsWith("'")?t.slice(1,-1):t==="true"?!0:t==="false"?!1:/^-?\d+$/.test(t)?Number.parseInt(t,10):/^-?\d*\.\d+$/.test(t)?Number.parseFloat(t):t}var vj,Ij,e_,un,Nj,$j,t_,r_,o_=b(()=>{"use strict";cn();Qh();ln();vj={"lmctl/review":{v2type:"Review",outcomes:{approve:"_"},schema:pi},"lmctl/consolidate":{v2type:"Consolidate",outcomes:{ok:"_"},schema:hi},"lmctl/interactive":{v2type:"Interactive",outcomes:{done:"_"},schema:_i},"lmctl/loop":{v2type:"Loop",outcomes:{ok:"_"},schema:gi},"lmctl/shell-step":{v2type:"ShellStep",outcomes:{},schema:yi}},Ij={"lmctl/review":["coder","reviewers"],"lmctl/consolidate":["researchers","consolidator"],"lmctl/interactive":["agent"]};e_={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"},un=class extends Error{issues;constructor(e){super(`composition DSL compile failed:
1435
1423
  ${e.map(r=>` line ${r.line}: ${r.message}`).join(`
1436
- `)}`),this.issues=e,this.name="DslCompileError"}},xj=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"]),$j={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},t_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),r_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as Rj}from"node:fs";function Oj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function Lj(t){for(let e of t.split(`
1437
- `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&Oj()&&Lj(t)){let r;try{r=n_(t)}catch(s){throw s instanceof un?new Mt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=yt.safeParse(r);if(!n.success)throw new Mt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=bi(Mj(t));if(Dj(e)&&e.definition_schema_version===3){let r=yt.safeParse(e);if(!r.success)throw new Mt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return Cj(e)}function Cj(t){let e=yi.safeParse(t);if(!e.success)throw new Mt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Mt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Kh(r)}catch(s){throw s instanceof Ct?new Zc(s):s}}function Mj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1438
- `)||e.startsWith("{")||e.startsWith("[")?i_(t):e.endsWith(".json")?i_(Rj(e,"utf8")):t}function i_(t){return JSON.parse(t)}function Dj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Zc,Mt,dn=b(()=>{"use strict";ln();zh();zc();cn();o_();Zc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Mt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Si(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:Pj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Uj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Pj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=Fj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function Fj(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function Uj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Qc=b(()=>{"use strict"});var a_={};ce(a_,{enqueueFromAgentOutput:()=>Bj,enqueueFromGitHubIssue:()=>eu,enqueueManual:()=>Wj,enqueueScheduled:()=>qj});function eu(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Ti(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function Wj(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function Bj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function qj(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function Ti(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ki(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Si({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var tu=b(()=>{"use strict";dn();Qc()});async function c_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return l_(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await Hj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...Jj(o.parameters_override)},l=l_(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function l_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[eu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Hj(t,e){if(t===null||t.trim().length===0)return!0;try{return await $r(t,e)===!0}catch{return!1}}function Jj(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var u_=b(()=>{"use strict";an();tu()});import{spawnSync as Xj}from"node:child_process";async function nu(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=Xj(t.binary??"gh",n,{encoding:"utf8",timeout:t.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 o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!Vj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await c_({dal:t.dal,project:t.project,issue:Kj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function fn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Gj(r.intake_config);try{let s=await nu({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function Gj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ru(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function Vj(t){return Array.isArray(t)&&t.every(e=>{if(!ru(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:ru(n)&&typeof n.name=="string"))})}function Kj(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function ru(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var vi=b(()=>{"use strict";u_()});function f_(t){return async e=>zj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zj(t,e,r={}){let n=Zj(e.path),s={"content-type":"application/json",...e.headers??{},[Ii]:su},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await Qj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function d_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Zj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Yj}${e}`}async function Qj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Ii&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Ii,su,Yj,ou=b(()=>{"use strict";Ii="x-mailbox-channel",su="1",Yj="http://mailbox.local"});import{createHash as m_,createHmac as eA,timingSafeEqual as tA}from"node:crypto";function p_(){return async(t,e)=>{let r=h_();if(r===null||iA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Ii)===su){await e();return}let n=t.req.query("token");if(n!==void 0&&Ni(n,r)){au(t,r),await e();return}if(oA(t,r)){await e();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 h_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function __(t){let e=h_();return e!==null&&Ni(t,e)}function au(t,e,r=new Date){t.header("Set-Cookie",`${iu}=${nA(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function g_(t){t.header("Set-Cookie",`${iu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nA(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rA*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${w_(t,n)}`,"utf8").toString("base64url")}function sA(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:Ni(s[2],w_(e,`${s[0]}|${s[1]}`))}function Ni(t,e){return tA(m_("sha256").update(t).digest(),m_("sha256").update(e).digest())}function oA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&Ni(r,e))return!0;let n=aA(t.req.header("cookie")??"")[iu];return n!==void 0&&sA(n,e)}function iA(t){return t==="/login"||t==="/logout"}function aA(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function w_(t,e){return eA("sha256",t).update(e).digest("hex")}var iu,rA,y_=b(()=>{"use strict";ou();iu="lmctl_next_session",rA=30});import{existsSync as mn,mkdirSync as lA,readdirSync as cA,readFileSync as xi,unlinkSync as uA,writeFileSync as uu}from"node:fs";import{join as jr}from"node:path";function et(t){if(!dA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function b_(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return hA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:E_,updated_at:E_}:null}function fA(t,e,r,n){let s=r!==null?`
1424
+ `)}`),this.issues=e,this.name="DslCompileError"}},Nj=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"]),$j={"lmctl/consolidate":["ok"],"lmctl/interactive":["done"],"lmctl/loop":["ok"],"lmctl/foreach":["all_ok"]},t_=new Set(["requires","default_task_timeout_ms","errors","concurrency_key","concurrent_limit"]),r_={"trigger-schedule":"lmctl/trigger-schedule","trigger-gh-issue":"lmctl/trigger-gh-issue"}});import{readFileSync as Rj}from"node:fs";function Oj(){let t=process.env.LMCTL_DSL;return t===void 0?!0:!["0","false","off"].includes(t.trim().toLowerCase())}function Lj(t){for(let e of t.split(`
1425
+ `)){let r=e.replace(/#.*/,"").trim();if(r.length!==0)return/^workflow\s+\S+\s+v\d+\s*$/.test(r)}return!1}function Ce(t){if(typeof t=="string"&&Oj()&&Lj(t)){let r;try{r=n_(t)}catch(s){throw s instanceof un?new Mt(s.issues.map(o=>({path:`dsl:${o.line}`,message:o.message}))):s}let n=wt.safeParse(r);if(!n.success)throw new Mt(n.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));return n.data}let e=bi(Mj(t));if(Dj(e)&&e.definition_schema_version===3){let r=wt.safeParse(e);if(!r.success)throw new Mt(r.error.issues.map(n=>({path:n.path.length===0?"$":n.path.map(String).join("."),message:n.message})));return r.data}return Cj(e)}function Cj(t){let e=wi.safeParse(t);if(!e.success)throw new Mt(e.error.issues.map(s=>({path:s.path.length===0?"$":s.path.map(String).join("."),message:s.message})));let r=e.data,n=new Set(["Task","Pause","Parallel","LoopUntil","Pass","Fail","Succeed"]);for(let[s,o]of Object.entries(r.states))if(n.has(o.type))throw new Mt([{path:`states.${s}`,message:`v2 workflows (primitive_version: 2) may not use v1 primitive type: ${o.type}`}]);try{return Kh(r)}catch(s){throw s instanceof Ct?new Zc(s):s}}function Mj(t){if(typeof t!="string")return t;let e=t.trim();return t.includes(`
1426
+ `)||e.startsWith("{")||e.startsWith("[")?i_(t):e.endsWith(".json")?i_(Rj(e,"utf8")):t}function i_(t){return JSON.parse(t)}function Dj(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var Zc,Mt,dn=b(()=>{"use strict";ln();zh();zc();cn();o_();Zc=class extends Error{causeError;constructor(e){super("compiler emitted invalid atomic workflow"),this.causeError=e,this.name="CompilerInvariantError"}},Mt=class extends Error{issues;constructor(e){super("compound workflow validation failed"),this.issues=e,this.name="CompilerValidationError"}}});function Si(t){let e=t.workflow?.concurrent_limit??1,r=t.job.concurrency_key_resolved??t.workflow?.concurrency_key??null;return r===null||r.trim().length===0?{concurrency_key:null,concurrent_limit:e}:{concurrency_key:Pj(r,{job:{id:t.job.id,kind:t.job.source,source:t.job.source,source_ref:t.job.source_ref,payload:Uj(t.job.payload)},project:t.project===null?null:{id:t.project.id,name:t.project.name}}),concurrent_limit:e}}function Pj(t,e){return t.replace(/\{\{\s*([^}]+?)\s*\}\}/g,(r,n)=>{let s=Fj(e,n.trim());return s==null?"":typeof s=="string"?s:typeof s=="number"||typeof s=="boolean"?String(s):JSON.stringify(s)})}function Fj(t,e){let r=t;for(let n of e.split(".")){if(typeof r!="object"||r===null||!Object.prototype.hasOwnProperty.call(r,n))return;r=r[n]}return r}function Uj(t){if(t===null||t.trim().length===0)return null;try{return JSON.parse(t)}catch{return t}}var Qc=b(()=>{"use strict"});var a_={};ce(a_,{enqueueFromAgentOutput:()=>Bj,enqueueFromGitHubIssue:()=>eu,enqueueManual:()=>Wj,enqueueScheduled:()=>qj});function eu(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:"gh_issue",source_ref:e.issue_url,dedupe_key:e.dedupe_key??e.issue_url,payload:Ti(e.payload),concurrency_key:e.concurrency_key,priority:e.priority})}function Wj(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"manual",source_ref:e.source_ref??null,dedupe_key:e.source_ref??null,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function Bj(t,e){let r=e.sequence===void 0?`run:${e.parent_run_id}`:`run:${e.parent_run_id}:${e.sequence}`;return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"agent_output",source_ref:r,dedupe_key:r,available_at:e.available_at,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function qj(t,e){return ki(t,{project_id:e.project_id,workflow_id_override:null,source:"schedule",source_ref:e.source_ref,dedupe_key:e.source_ref,available_at:e.available_at,payload:Ti(e.payload),concurrency_key:e.concurrency_key})}function Ti(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function ki(t,e){let r=e.concurrency_key;if(r!==void 0)return t.enqueueJob({...e,concurrency_key:r});let n=t.getProject(e.project_id),s=n===null?null:e.workflow_id_override!==void 0&&e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(n.workflow_name);if(n===null||s===null)return t.enqueueJob(e);try{let o=Ce(s.definition),i={id:-1,project_id:e.project_id,workflow_id_override:e.workflow_id_override??null,source:e.source,source_ref:e.source_ref??null,payload:e.payload??null,status:"queued",priority:e.priority??0,available_at:e.available_at??new Date().toISOString(),locked_by:null,locked_until:null,attempt_count:0,last_error:null,dedupe_key:e.dedupe_key??null,concurrency_key_resolved:null,enqueued_at:new Date().toISOString(),started_at:null,ended_at:null,run_id:null},a=Si({workflow:o,job:i,project:n});return t.enqueueJob({...e,concurrency_key:a.concurrency_key})}catch{return t.enqueueJob(e)}}var tu=b(()=>{"use strict";dn();Qc()});async function c_(t){let e=t.dal.listProjectWorkflows(t.project.id,{enabled_only:!0});if(e.length===0)return l_(t.dal,t.project.id,t.issue,t.issue.url,null,t.issue,void 0);let r={event:{kind:"github_issue",issue:t.issue}},n=[],s=0;for(let o of e){if(!await Hj(o.condition,r))continue;let i=`${t.issue.url}#workflow:${o.workflow_id}`,a={issue:t.issue,...Jj(o.parameters_override)},l=l_(t.dal,t.project.id,t.issue,i,o.workflow_id,a,-o.priority);n.push(...l.jobs),s+=l.new_jobs}return{jobs:n,new_jobs:s}}function l_(t,e,r,n,s,o,i){let a=t.findJobBySourceAndDedupe("gh_issue",n);return{jobs:[eu(t,{project_id:e,issue_url:r.url,payload:o,workflow_id_override:s,dedupe_key:n,priority:i})],new_jobs:a===null?1:0}}async function Hj(t,e){if(t===null||t.trim().length===0)return!0;try{return await $r(t,e)===!0}catch{return!1}}function Jj(t){if(t===null||t.trim().length===0)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}var u_=b(()=>{"use strict";an();tu()});import{spawnSync as Xj}from"node:child_process";async function nu(t){let e=t.labels??["bug"],r=t.state??"open",n=["issue","list","--repo",t.project.name,"--state",r,"--json","number,title,url,body,state,labels","--limit","100"];e.length>0&&n.splice(4,0,"--label",e.join(","));let s=Xj(t.binary??"gh",n,{encoding:"utf8",timeout:t.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 o;try{o=JSON.parse(s.stdout??"[]")}catch{throw new Error("gh issue list returned malformed JSON")}if(!Vj(o))throw new Error("gh issue list returned unexpected JSON shape");let i=0;for(let a of o){let l=await c_({dal:t.dal,project:t.project,issue:Kj(a)});i+=l.new_jobs}return{scanned:o.length,new_jobs:i}}async function fn(t){if(process.env.LMCTL_INTAKE_DISABLED==="1")return[];let e=[];for(let r of t.listProjectsWithIntakeEnabled()){let n=Gj(r.intake_config);try{let s=await nu({dal:t,project:r,labels:n.labels,state:n.state});e.push({project_id:r.id,project_name:r.name,...s})}catch(s){let o=s instanceof Error?s.message:String(s);e.push({project_id:r.id,project_name:r.name,scanned:0,new_jobs:0,error:o});try{t.raiseAttention({kind:"daemon_intake_scan_failed",severity:"warn",project_id:r.id,payload:JSON.stringify({project_id:r.id,project_name:r.name,error:o})})}catch{}}}return e}function Gj(t){if(t===null)return{};try{let e=JSON.parse(t);if(!ru(e))return{};let r=e.state==="open"||e.state==="closed"||e.state==="all"?e.state:void 0,n=Array.isArray(e.labels)?e.labels.filter(s=>typeof s=="string"&&s.length>0):void 0;return{scan_github_issues:e.scan_github_issues===!0,labels:n,state:r}}catch{return{}}}function Vj(t){return Array.isArray(t)&&t.every(e=>{if(!ru(e))return!1;let r=e.labels;return typeof e.number=="number"&&typeof e.title=="string"&&typeof e.url=="string"&&(typeof e.body=="string"||e.body===null||e.body===void 0)&&(e.state===void 0||typeof e.state=="string")&&(r===void 0||Array.isArray(r)&&r.every(n=>typeof n=="string"?!0:ru(n)&&typeof n.name=="string"))})}function Kj(t){let e=t.labels?.map(s=>typeof s=="string"?s:s.name),{labels:r,...n}=t;return e===void 0?n:{...n,labels:e}}function ru(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var vi=b(()=>{"use strict";u_()});function f_(t){return async e=>zj(t.app,e,t.log!==void 0?{log:t.log}:{})}async function zj(t,e,r={}){let n=Zj(e.path),s={"content-type":"application/json",...e.headers??{},[Ii]:su},o={method:e.method,headers:s};e.body!==void 0&&e.method!=="GET"&&e.method!=="DELETE"&&(o.body=typeof e.body=="string"?e.body:JSON.stringify(e.body));let i=new Request(n,o),a=Date.now();try{let l=await t.fetch(i),c=await Qj(l);if(r.log!==void 0){let u=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(e.path)} \u2192 ${c.status} (${u}ms)`)}return c}catch(l){if(r.log!==void 0){let c=Date.now()-a;r.log(`[mailbox-dispatch] ${e.method} ${d_(e.path)} \u2192 ERR (${c}ms)`)}throw l}}function d_(t){let e=t.startsWith("/")?t:`/${t}`,r=e.search(/[?#]/);return r===-1?e:e.slice(0,r)}function Zj(t){let e=t.startsWith("/")?t:`/${t}`;return`${Yj}${e}`}async function Qj(t){let e=await t.text(),r;if(e==="")r=void 0;else try{r=JSON.parse(e)}catch{r=e}let n={};t.headers.forEach((o,i)=>{i.toLowerCase()!==Ii&&(n[i]=o)});let s={status:t.status};return Object.keys(n).length>0&&(s.headers=n),r!==void 0&&(s.body=r),s}var Ii,su,Yj,ou=b(()=>{"use strict";Ii="x-mailbox-channel",su="1",Yj="http://mailbox.local"});import{createHash as m_,createHmac as eA,timingSafeEqual as tA}from"node:crypto";function p_(){return async(t,e)=>{let r=h_();if(r===null||iA(t.req.path)){await e();return}if(t.req.path.startsWith("/mailbox/")&&t.req.header(Ii)===su){await e();return}let n=t.req.query("token");if(n!==void 0&&xi(n,r)){au(t,r),await e();return}if(oA(t,r)){await e();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 h_(){let t=process.env.LMCTL_API_TOKEN;return t&&t.length>0?t:null}function __(t){let e=h_();return e!==null&&xi(t,e)}function au(t,e,r=new Date){t.header("Set-Cookie",`${iu}=${nA(e,r)}; Path=/; HttpOnly; SameSite=Lax`)}function g_(t){t.header("Set-Cookie",`${iu}=; Path=/; HttpOnly; SameSite=Lax; Max-Age=0`)}function nA(t,e=new Date){let n=`auth=ok|${new Date(e.getTime()+rA*24*60*60*1e3).toISOString()}`;return Buffer.from(`${n}|${y_(t,n)}`,"utf8").toString("base64url")}function sA(t,e,r=new Date){let n;try{n=Buffer.from(t,"base64url").toString("utf8")}catch{return!1}let s=n.split("|");if(s.length!==3||s[0]!=="auth=ok")return!1;let o=new Date(s[1]);return Number.isNaN(o.getTime())||o.getTime()<=r.getTime()?!1:xi(s[2],y_(e,`${s[0]}|${s[1]}`))}function xi(t,e){return tA(m_("sha256").update(t).digest(),m_("sha256").update(e).digest())}function oA(t,e){let r=/^Bearer\s+(.+)$/i.exec(t.req.header("authorization")??"")?.[1];if(r!==void 0&&xi(r,e))return!0;let n=aA(t.req.header("cookie")??"")[iu];return n!==void 0&&sA(n,e)}function iA(t){return t==="/login"||t==="/logout"}function aA(t){let e={};for(let r of t.split(";")){let[n,...s]=r.trim().split("=");n===void 0||n.length===0||s.length===0||(e[n]=s.join("="))}return e}function y_(t,e){return eA("sha256",t).update(e).digest("hex")}var iu,rA,w_=b(()=>{"use strict";ou();iu="lmctl_next_session",rA=30});import{existsSync as mn,mkdirSync as lA,readdirSync as cA,readFileSync as Ni,unlinkSync as uA,writeFileSync as uu}from"node:fs";import{join as jr}from"node:path";function et(t){if(!dA.test(t))throw new Error(`invalid memory name "${t}": only alphanumeric characters, underscores, and hyphens are allowed`)}function b_(t,e){let r=e.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(r===null)return null;let n=r[1],s=r[2].trimStart(),o=n.match(/^type:\s*(.+)$/m),i=n.match(/^description:\s*(.+)$/m),a=o?.[1]?.trim()??"";return hA(a)?{name:t,type:a,description:i?.[1]?.trim()??null,body:s,created_at:E_,updated_at:E_}:null}function fA(t,e,r,n){let s=r!==null?`
1439
1427
  description: ${r}`:"";return`---
1440
1428
  name: ${t}${s}
1441
1429
  type: ${e}
1442
1430
  ---
1443
- ${n}`}function mA(t,e,r,n){let s=jr(t,du),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=mn(s)?xi(s,"utf8"):"",a=new RegExp(`^- \\[${S_(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1431
+ ${n}`}function mA(t,e,r,n){let s=jr(t,du),o=`- [${e}.md](${e}.md)${n!==null?` \u2014 ${n}`:""} (${r})`,i=mn(s)?Ni(s,"utf8"):"",a=new RegExp(`^- \\[${S_(e)}\\.md\\].*$`,"m");a.test(i)?i=i.replace(a,o):i=i.length>0&&!i.endsWith(`
1444
1432
  `)?`${i}
1445
1433
  ${o}
1446
1434
  `:`${i}${o}
1447
- `,uu(s,i,"utf8")}function pA(t,e){let r=jr(t,du);if(!mn(r))return;let n=xi(r,"utf8"),s=new RegExp(`^- \\[${S_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&uu(r,n.replace(s,""),"utf8")}function S_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function hA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new cu(e,t.id):new lu(t.local_path)}var dA,du,E_,lu,cu,fu=b(()=>{"use strict";dA=/^[a-zA-Z0-9_-]+$/;du="MEMORY.md",E_="1970-01-01T00:00:00.000Z",lu=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!mn(r))return null;let n=xi(r,"utf8");return b_(e,n)}write(e){et(e.name),lA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!mn(r),s=fA(e.name,e.type,e.description??null,e.body);return uu(r,s,"utf8"),mA(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){et(e);let r=jr(this.dir,`${e}.md`);return mn(r)?(uA(r),pA(this.dir,e),!0):!1}listFiles(){if(!mn(this.dir))return[];let e=cA(this.dir).filter(n=>n.endsWith(".md")&&n!==du),r=[];for(let n of e){let s=n.slice(0,-3),o=xi(jr(this.dir,n),"utf8"),i=b_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};cu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);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(e){et(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function k_(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ut(o,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(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=ut(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!T_.has(a))return n.json({error:`invalid type: must be one of ${[...T_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ut(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ut(o,r),a=n.req.query("type");return n.json(i.list(a))})}var T_,v_=b(()=>{"use strict";fu();T_=new Set(["user","feedback","project","reference"])});function gA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(_A[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function wA(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function I_(t,e=new Date){let{time:r,date:n}=wA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gA(h.data),T=h.data.length,E=new Uint8Array(30+g.length),k=new DataView(E.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,_,!0),k.setUint32(18,T,!0),k.setUint32(22,T,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let $=new Uint8Array(46+g.length),N=new DataView($.buffer);N.setUint32(0,33639248,!0),N.setUint16(4,20,!0),N.setUint16(6,20,!0),N.setUint16(8,0,!0),N.setUint16(10,0,!0),N.setUint16(12,r,!0),N.setUint16(14,n,!0),N.setUint32(16,_,!0),N.setUint32(20,T,!0),N.setUint32(24,T,!0),N.setUint16(28,g.length,!0),N.setUint16(30,0,!0),N.setUint16(32,0,!0),N.setUint16(34,0,!0),N.setUint16(36,0,!0),N.setUint32(38,0,!0),N.setUint32(42,i,!0),$.set(g,46),o.push($),i+=E.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var _A,N_=b(()=>{"use strict";_A=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as Ai,mkdirSync as yA,readdirSync as EA,readFileSync as j_,statSync as bA,unlinkSync as SA,writeFileSync as TA}from"node:fs";import{join as us}from"node:path";function A_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return j(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return j(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return j(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await dt(n);if(typeof i=="string")return j(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return j(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return j(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!$i.includes(l))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return j(n,d.message,400)}let c=ut(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter"),i=await dt(n);if(typeof i=="string")return j(n,i,400);let a=ut(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!$i.includes(d))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(vA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!ji.has(l))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return j(n,f.message,400)}let c=ls(s.local_path),u=us(c,`${i}.md`);if(Ai(u))return j(n,`chapter already exists: ${i}`,409);yA(c,{recursive:!0}),$_(u,i,l,ae(o,"description"),a);let d=cs(c,i);return d===null?j(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);try{et(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=cs(ls(s.local_path),n.req.param("chapter"));return o===null?j(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(m){return j(n,m.message,400)}let i=ls(s.local_path),a=cs(i,o);if(a===null)return j(n,"chapter not found",404);let l=await dt(n);if(typeof l=="string")return j(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ji.has(d))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);$_(us(i,`${o}.md`),o,d,u,c);let f=cs(i,o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(a){return j(n,a.message,400)}let i=us(ls(s.local_path),`${o}.md`);return Ai(i)?(SA(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await dt(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(x_))),t.post("/api/chat/sessions",async n=>{let s=await kA(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(x_,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?j(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return j(n,"chat session not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=Ir(r,s),a=[];for(let c of i){let u=NA(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=j_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=I_(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 j(t,e,r){return t.json({error:e},r)}async function dt(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function kA(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function ls(t){return us(t,"ai-test")}function cs(t,e){let r=us(t,`${e}.md`);if(!Ai(r))return null;let n=j_(r,"utf8"),s=IA(n),o=bA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function vA(t){let e=ls(t);return Ai(e)?EA(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=cs(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function $_(t,e,r,n,s){let o=n!==null&&n.length>0?`
1435
+ `,uu(s,i,"utf8")}function pA(t,e){let r=jr(t,du);if(!mn(r))return;let n=Ni(r,"utf8"),s=new RegExp(`^- \\[${S_(e)}\\.md\\].*$\\r?\\n?`,"m");s.test(n)&&uu(r,n.replace(s,""),"utf8")}function S_(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function hA(t){return t==="user"||t==="feedback"||t==="project"||t==="reference"}function ut(t,e){return t.durable_memory_mode==="db"?new cu(e,t.id):new lu(t.local_path)}var dA,du,E_,lu,cu,fu=b(()=>{"use strict";dA=/^[a-zA-Z0-9_-]+$/;du="MEMORY.md",E_="1970-01-01T00:00:00.000Z",lu=class{dir;constructor(e){this.dir=jr(e,"durable-memory")}read(e){et(e);let r=jr(this.dir,`${e}.md`);if(!mn(r))return null;let n=Ni(r,"utf8");return b_(e,n)}write(e){et(e.name),lA(this.dir,{recursive:!0});let r=jr(this.dir,`${e.name}.md`),n=!mn(r),s=fA(e.name,e.type,e.description??null,e.body);return uu(r,s,"utf8"),mA(this.dir,e.name,e.type,e.description??null),{created:n}}index(e){return this.listFiles().filter(r=>e===void 0||e.length===0||e.includes(r.type)).map(({name:r,type:n,description:s,updated_at:o})=>({name:r,type:n,description:s,updated_at:o}))}list(e){return this.listFiles().filter(r=>e===void 0||r.type===e).map(({name:r,type:n,updated_at:s})=>({name:r,type:n,updated_at:s}))}delete(e){et(e);let r=jr(this.dir,`${e}.md`);return mn(r)?(uA(r),pA(this.dir,e),!0):!1}listFiles(){if(!mn(this.dir))return[];let e=cA(this.dir).filter(n=>n.endsWith(".md")&&n!==du),r=[];for(let n of e){let s=n.slice(0,-3),o=Ni(jr(this.dir,n),"utf8"),i=b_(s,o);i!==null&&r.push(i)}return r.sort((n,s)=>n.name.localeCompare(s.name))}};cu=class{dal;projectId;constructor(e,r){this.dal=e,this.projectId=r}read(e){et(e);let r=this.dal.getDurableMemoryByName(this.projectId,e);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(e){et(e.name);let r=this.dal.getDurableMemoryByName(this.projectId,e.name);return this.dal.upsertDurableMemory({project_id:this.projectId,type:e.type,name:e.name,description:e.description??null,body:e.body}),{created:r===null}}index(e){return this.dal.indexDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,description:n.description,updated_at:n.updated_at}))}list(e){return this.dal.listDurableMemory(this.projectId,e).map(n=>({name:n.name,type:n.type,updated_at:n.updated_at}))}delete(e){return et(e),this.dal.deleteDurableMemory(this.projectId,e)}}});function k_(t,e){let{dal:r}=e;t.get("/api/durable-memory/index/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ut(o,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(i.index(l))}),t.get("/api/durable-memory/read/:project_id/:name",n=>{let s=Number(n.req.param("project_id")),o=n.req.param("name"),i=r.getProject(s);if(i===null)return n.json({error:"project not found"},404);let a=ut(i,r),l;try{l=a.read(o)}catch(c){return n.json({error:c.message},400)}return l===null?n.json({error:`memory entry not found: ${o}`},404):n.json(l)}),t.post("/api/durable-memory/write/:project_id",async n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i;try{i=await n.req.json()}catch{return n.json({error:"invalid JSON body"},400)}let a=typeof i.type=="string"?i.type:null,l=typeof i.name=="string"?i.name:null,c=typeof i.body=="string"?i.body:null,u=typeof i.description=="string"?i.description:null;if(a===null||!T_.has(a))return n.json({error:`invalid type: must be one of ${[...T_].join("|")}`},400);if(l===null)return n.json({error:"missing name"},400);if(c===null)return n.json({error:"missing body"},400);let d=ut(o,r),f;try{({created:f}=d.write({type:a,name:l,description:u,body:c}))}catch(m){return n.json({error:m.message},400)}return n.json({success:!0,created_or_updated:f?"created":"updated"})}),t.get("/api/durable-memory/list/:project_id",n=>{let s=Number(n.req.param("project_id")),o=r.getProject(s);if(o===null)return n.json({error:"project not found"},404);let i=ut(o,r),a=n.req.query("type");return n.json(i.list(a))})}var T_,v_=b(()=>{"use strict";fu();T_=new Set(["user","feedback","project","reference"])});function gA(t){let e=4294967295;for(let r=0;r<t.length;r+=1)e=(_A[(e^t[r])&255]^e>>>8)>>>0;return(e^4294967295)>>>0}function yA(t){let e=Math.max(1980,t.getFullYear()),r=(t.getHours()&31)<<11|(t.getMinutes()&63)<<5|Math.floor(t.getSeconds()/2)&31,n=(e-1980&127)<<9|(t.getMonth()+1&15)<<5|t.getDate()&31;return{time:r,date:n}}function I_(t,e=new Date){let{time:r,date:n}=yA(e),s=[],o=[],i=0,a=new TextEncoder;for(let h of t){let g=a.encode(h.name),_=gA(h.data),T=h.data.length,E=new Uint8Array(30+g.length),k=new DataView(E.buffer);k.setUint32(0,67324752,!0),k.setUint16(4,20,!0),k.setUint16(6,0,!0),k.setUint16(8,0,!0),k.setUint16(10,r,!0),k.setUint16(12,n,!0),k.setUint32(14,_,!0),k.setUint32(18,T,!0),k.setUint32(22,T,!0),k.setUint16(26,g.length,!0),k.setUint16(28,0,!0),E.set(g,30),s.push(E,h.data);let $=new Uint8Array(46+g.length),x=new DataView($.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,T,!0),x.setUint32(24,T,!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,i,!0),$.set(g,46),o.push($),i+=E.length+h.data.length}let l=i,c=0;for(let h of o)c+=h.length;let u=new Uint8Array(22),d=new DataView(u.buffer);d.setUint32(0,101010256,!0),d.setUint16(4,0,!0),d.setUint16(6,0,!0),d.setUint16(8,t.length,!0),d.setUint16(10,t.length,!0),d.setUint32(12,c,!0),d.setUint32(16,l,!0),d.setUint16(20,0,!0);let f=l+c+u.length,m=new Uint8Array(f),p=0;for(let h of s)m.set(h,p),p+=h.length;for(let h of o)m.set(h,p),p+=h.length;return m.set(u,p),m}var _A,x_=b(()=>{"use strict";_A=(()=>{let t=new Uint32Array(256);for(let e=0;e<256;e+=1){let r=e;for(let n=0;n<8;n+=1)r=r&1?3988292384^r>>>1:r>>>1;t[e]=r>>>0}return t})()});import{existsSync as Ai,mkdirSync as wA,readdirSync as EA,readFileSync as j_,statSync as bA,unlinkSync as SA,writeFileSync as TA}from"node:fs";import{join as us}from"node:path";function A_(t,e){let{dal:r}=e;t.post("/api/projects",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name"),i=ae(s,"local_path");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(i===null||i.length===0)return j(n,"missing or empty local_path",400);if(r.findProjectByName(o)!==null)return j(n,`project already exists: ${o}`,409);let a=ae(s,"workflow_name")??"bugfix",l,c=ae(s,"team_name");if(c!==null&&c.length>0){let d=r.findTeamByName(c);if(d===null)return j(n,`team not found: ${c}`,404);l=d.id}else{let d=r.listTeams();if(d.length===0)return j(n,"no teams exist; create a team first",400);l=d[0].id}let u=r.insertProject({name:o,local_path:i,workflow_name:a,team_id:l,default_branch:ae(s,"default_branch")});return n.json(u,201)}),t.patch("/api/projects/:name",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i={};if(Object.prototype.hasOwnProperty.call(o,"local_path")){let l=o.local_path;if(typeof l!="string"||l.length===0)return j(n,"local_path must be a non-empty string",400);i.local_path=l}if(Object.prototype.hasOwnProperty.call(o,"durable_memory_mode")){let l=o.durable_memory_mode;if(l!=="folder"&&l!=="db")return j(n,'durable_memory_mode must be "folder" or "db"',400);i.durable_memory_mode=l}if(Object.prototype.hasOwnProperty.call(o,"default_branch")){let l=o.default_branch;if(l!==null&&typeof l!="string")return j(n,"default_branch must be string or null",400);i.default_branch=l}if(Object.prototype.hasOwnProperty.call(o,"intake_config")){let l=o.intake_config;if(l===null)i.intake_config=null;else if(typeof l=="string")i.intake_config=l;else if(typeof l=="object"&&!Array.isArray(l))i.intake_config=JSON.stringify(l);else return j(n,"intake_config must be a JSON object, string, or null",400)}let a=r.updateProjectSettings(s.id,i);return a===null?j(n,"project not found",404):n.json(a)}),t.post("/api/teams",async n=>{let s=await dt(n);if(typeof s=="string")return j(n,s,400);let o=ae(s,"name");if(o===null||o.length===0)return j(n,"missing or empty name",400);if(r.findTeamByName(o)!==null)return j(n,`team already exists: ${o}`,409);let i=r.insertTeam({name:o});return n.json(i,201)}),t.post("/api/teams/:name/members",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"alias"),a=ae(o,"provider");if(i===null||i.length===0)return j(n,"missing or empty alias",400);if(a===null||a.length===0)return j(n,"missing or empty provider",400);if(r.findTeamMemberByAlias(s.id,i)!==null)return j(n,`member already exists: ${i}`,409);let l=ae(o,"model"),c=r.insertTeamMember({team_id:s.id,alias:i,provider:a,model:l,sessiondir:`.lmctl/sessions/${s.name}/${i}`}),u=ae(o,"role_prompt");u!==null&&r.setMemberRolePrompt(c.id,u);let d=r.findTeamMemberByAlias(s.id,i);return n.json(d??c,201)}),t.put("/api/teams/:name/members/:alias",async n=>{let s=r.findTeamByName(n.req.param("name"));if(s===null)return j(n,"team not found",404);let o=r.findTeamMemberByAlias(s.id,n.req.param("alias"));if(o===null)return j(n,"member not found",404);let i=await dt(n);if(typeof i=="string")return j(n,i,400);let a={};if(Object.prototype.hasOwnProperty.call(i,"role_prompt")){let c=i.role_prompt;if(c!==null&&typeof c!="string")return j(n,"role_prompt must be string or null",400);a.role_prompt=c}if(Object.prototype.hasOwnProperty.call(i,"model")){let c=i.model;if(c!==null&&typeof c!="string")return j(n,"model must be string or null",400);a.model=c}if(Object.prototype.hasOwnProperty.call(i,"provider")){let c=i.provider;if(typeof c!="string"||c.length===0)return j(n,"provider must be a non-empty string",400);a.provider=c}if(Object.keys(a).length===0)return j(n,"no updatable fields provided",400);let l=r.updateTeamMemberMeta(o.id,a);return l===null?j(n,"member not found",404):n.json(l)}),t.get("/api/projects/:name/durable-memory",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r);return n.json(o.index())}),t.post("/api/projects/:name/durable-memory",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!$i.includes(l))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{et(i)}catch(d){return j(n,d.message,400)}let c=ut(s,r);try{if(c.read(i)!==null)return j(n,`chapter already exists: ${i}`,409)}catch(d){return j(n,d.message,400)}try{c.write({type:l,name:i,description:ae(o,"description"),body:a})}catch(d){return j(n,d.message,400)}let u=c.read(i);return u===null?j(n,"chapter created but unreadable",500):n.json(u,201)}),t.get("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r),i;try{i=o.read(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i===null?j(n,"chapter not found",404):n.json(i)}),t.put("/api/projects/:name/durable-memory/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter"),i=await dt(n);if(typeof i=="string")return j(n,i,400);let a=ut(s,r),l;try{l=a.read(o)}catch(m){return j(n,m.message,400)}if(l===null)return j(n,"chapter not found",404);let c=ae(i,"body")??l.body,u=Object.prototype.hasOwnProperty.call(i,"description")?ae(i,"description"):l.description,d=ae(i,"type")??l.type;if(!$i.includes(d))return j(n,`invalid type: must be one of ${$i.join("|")}`,400);try{a.write({type:d,name:o,description:u,body:c})}catch(m){return j(n,m.message,400)}let f=a.read(o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/durable-memory/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=ut(s,r),i;try{i=o.delete(n.req.param("chapter"))}catch(a){return j(n,a.message,400)}return i?n.json({removed:!0}):j(n,"chapter not found",404)}),t.get("/api/projects/:name/ai-test",n=>{let s=r.findProjectByName(n.req.param("name"));return s===null?j(n,"project not found",404):n.json(vA(s.local_path))}),t.post("/api/projects/:name/ai-test",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"name"),a=ae(o,"body"),l=ae(o,"type");if(i===null||i.length===0)return j(n,"missing or empty name",400);if(a===null)return j(n,"missing body",400);if(l===null||!ji.has(l))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);try{et(i)}catch(f){return j(n,f.message,400)}let c=ls(s.local_path),u=us(c,`${i}.md`);if(Ai(u))return j(n,`chapter already exists: ${i}`,409);wA(c,{recursive:!0}),$_(u,i,l,ae(o,"description"),a);let d=cs(c,i);return d===null?j(n,"chapter created but unreadable",500):n.json(d,201)}),t.get("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);try{et(n.req.param("chapter"))}catch(i){return j(n,i.message,400)}let o=cs(ls(s.local_path),n.req.param("chapter"));return o===null?j(n,"chapter not found",404):n.json(o)}),t.put("/api/projects/:name/ai-test/:chapter",async n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(m){return j(n,m.message,400)}let i=ls(s.local_path),a=cs(i,o);if(a===null)return j(n,"chapter not found",404);let l=await dt(n);if(typeof l=="string")return j(n,l,400);let c=ae(l,"body")??a.body,u=Object.prototype.hasOwnProperty.call(l,"description")?ae(l,"description"):a.description,d=ae(l,"type")??a.type;if(!ji.has(d))return j(n,`invalid type: must be one of ${[...ji].join("|")}`,400);$_(us(i,`${o}.md`),o,d,u,c);let f=cs(i,o);return f===null?j(n,"chapter updated but unreadable",500):n.json(f)}),t.delete("/api/projects/:name/ai-test/:chapter",n=>{let s=r.findProjectByName(n.req.param("name"));if(s===null)return j(n,"project not found",404);let o=n.req.param("chapter");try{et(o)}catch(a){return j(n,a.message,400)}let i=us(ls(s.local_path),`${o}.md`);return Ai(i)?(SA(i),n.json({removed:!0})):j(n,"chapter not found",404)}),t.get("/api/tokens",n=>n.json([])),t.post("/api/tokens",n=>j(n,"scoped-tokens table not yet migrated; see briefs/scoped-tokens-design.md",501)),t.get("/api/settings",n=>n.json({})),t.patch("/api/settings",async n=>{let s=await dt(n);return typeof s=="string"?j(n,s,400):n.json({accepted:s,note:"settings persistence not yet implemented"})}),t.get("/api/chat/sessions",n=>n.json(r.listChatbotSessions(N_))),t.post("/api/chat/sessions",async n=>{let s=await kA(n);if(typeof s=="string")return j(n,s,400);let o=s!==null?ae(s,"title"):null,i=r.createChatbotSession(N_,o);return n.json(i,201)}),t.get("/api/chat/sessions/:id/messages",n=>{let s=n.req.param("id");return r.getChatbotSession(s)===null?j(n,"chat session not found",404):n.json(r.listChatbotMessages(s))}),t.post("/api/chat/sessions/:id/messages",async n=>{let s=n.req.param("id");if(r.getChatbotSession(s)===null)return j(n,"chat session not found",404);let o=await dt(n);if(typeof o=="string")return j(n,o,400);let i=ae(o,"role"),a=ae(o,"content");if(i===null||i!=="user"&&i!=="assistant"&&i!=="tool")return j(n,"role must be one of user|assistant|tool",400);if(a===null)return j(n,"missing content",400);let l=r.appendChatbotMessage(s,i,a);return n.json(l,201)}),t.get("/api/runs/:id/artifacts.zip",n=>{let s=Number(n.req.param("id"));if(!Number.isInteger(s))return j(n,"invalid run id",400);if(r.getRun(s)===null)return j(n,"run not found",404);let i=Ir(r,s),a=[];for(let c of i){let u=xA(c),d=null;if(c.content!==null&&c.content!==void 0)d=new TextEncoder().encode(c.content);else if(c.path!==null&&c.path!==void 0)try{let f=j_(c.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);d=new Uint8Array(m)}catch{d=new Uint8Array(0)}d!==null&&a.push({name:u,data:d})}let l=I_(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 j(t,e,r){return t.json({error:e},r)}async function dt(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}async function kA(t){let e=await t.req.text().catch(()=>"");if(e.trim().length===0)return null;try{let r=JSON.parse(e);return r!==null&&typeof r=="object"&&!Array.isArray(r)?r:"invalid JSON body"}catch{return"invalid JSON body"}}function ae(t,e){let r=t[e];return typeof r!="string"?null:r}function ls(t){return us(t,"ai-test")}function cs(t,e){let r=us(t,`${e}.md`);if(!Ai(r))return null;let n=j_(r,"utf8"),s=IA(n),o=bA(r).mtime.toISOString();return{name:e,type:s.type,description:s.description,body:s.body,updated_at:o}}function vA(t){let e=ls(t);return Ai(e)?EA(e).filter(r=>r.endsWith(".md")&&r!=="index.md").map(r=>r.slice(0,-3)).sort().map(r=>{let n=cs(e,r);if(n===null)return null;let{name:s,type:o,description:i,updated_at:a}=n;return{name:s,type:o,description:i,updated_at:a}}).filter(r=>r!==null):[]}function $_(t,e,r,n,s){let o=n!==null&&n.length>0?`
1448
1436
  description: ${n}`:"",i=`---
1449
1437
  name: ${e}${o}
1450
1438
  type: ${r}
1451
1439
  ---
1452
- ${s}`;TA(t,i,"utf8")}function IA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function NA(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?xA(t.path):$A(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function xA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function $A(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var $i,ji,x_,R_=b(()=>{"use strict";Ot();N_();fu();$i=["user","feedback","project","reference"],ji=new Set(["smoke","integration","vision","scenario","regression"]),x_="operator"});function Ae(t,e){return`<!doctype html>
1440
+ ${s}`;TA(t,i,"utf8")}function IA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return{type:"scenario",description:null,body:t};let r=e[1],n=e[2].trimStart(),s=r.match(/^type:\s*(.+)$/m),o=r.match(/^description:\s*(.+)$/m);return{type:s?.[1]?.trim()??"scenario",description:o?.[1]?.trim()??null,body:n}}function xA(t){let e=t.state_name.replace(/[^a-zA-Z0-9_-]+/g,"_"),r=t.kind.replace(/[^a-zA-Z0-9_-]+/g,"_"),n=t.path!==null?NA(t.path):$A(t.kind);return`step-${t.step_id}-${e}/${t.id}-${r}${n}`}function NA(t){let e=t.lastIndexOf(".");if(e<0)return"";let r=t.slice(e);return/^\.[A-Za-z0-9]+$/.test(r)?r:""}function $A(t){return t.endsWith("_md")||t.includes("markdown")?".md":t.endsWith("_json")||t.includes("json")?".json":".txt"}var $i,ji,N_,R_=b(()=>{"use strict";Ot();x_();fu();$i=["user","feedback","project","reference"],ji=new Set(["smoke","integration","vision","scenario","regression"]),N_="operator"});function Ae(t,e){return`<!doctype html>
1453
1441
  <html lang="en">
1454
1442
  <head>
1455
1443
  <meta charset="utf-8">
@@ -1515,41 +1503,41 @@ ${s}`;TA(t,i,"utf8")}function IA(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r
1515
1503
  WHERE s.run_id = ? AND sa.kind = 'run_report' LIMIT 1`,t).length>0)return;let n=e.getRun(t);if(n===null)return;let s=e.query("SELECT id FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t);if(s.length===0)return;let o=s[0].id,i=e.query("SELECT id, state_name, outcome, started_at, ended_at FROM step WHERE run_id = ? ORDER BY id ASC",t),a=e.query(`SELECT sa.id, sa.step_id, sa.kind FROM step_artifact sa
1516
1504
  JOIN step s ON s.id = sa.step_id
1517
1505
  WHERE s.run_id = ? ORDER BY sa.id ASC`,t),l=new Map;for(let R of a){let U=l.get(R.step_id)??[];U.push({kind:R.kind,id:R.id}),l.set(R.step_id,U)}let c=i.map(R=>({id:R.id,state_name:R.state_name,outcome:R.outcome,duration_ms:R.started_at!==null&&R.ended_at!==null?Math.max(0,new Date(R.ended_at).getTime()-new Date(R.started_at).getTime()):null,artifacts:l.get(R.id)??[]})),u=e.query("SELECT kind, COUNT(*) AS count FROM session_event WHERE run_id = ? GROUP BY kind",t),d=e.query("SELECT payload FROM session_event WHERE run_id = ? AND kind = 'tool_result' AND payload_truncated = 0",t),f=0;for(let R of d)try{let U=JSON.parse(R.payload);typeof U.elapsedMs=="number"&&U.elapsedMs>0&&(f+=U.elapsedMs)}catch{}let m=u.map(R=>({kind:R.kind,count:R.count,total_elapsed_ms:R.kind==="tool_result"?f:0})),p=c.filter(R=>R.outcome==="request_changes"),h=[...new Set(p.map(R=>R.state_name))],g=new Date(n.started_at).getTime(),_=n.ended_at!==null?new Date(n.ended_at).getTime():Date.now(),E=e.query("SELECT project_id FROM job WHERE id = ?",n.job_id)[0]?.project_id??null,k=E!==null?e.query(`SELECT id, signal_kind, severity, description, detected_at FROM drift_signal
1518
- WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],N=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1519
- FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=N?.input!==null&&N?.input!==void 0?`input: ${N.input}, output: ${N.output??0}`:"n/a",D=e.getWorkflow(n.workflow_id),C=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,H={run_id:t,workflow_name:D?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:C,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(H)})}var L_=b(()=>{"use strict"});import{spawnSync as M_}from"node:child_process";function pu(t){return jA[t]??`no install hint; ensure '${t}' is on PATH`}function AA(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function C_(t){return M_("which",[t],{encoding:"utf8"}).status===0}function D_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!C_(e)){let r=pu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!C_(e)){let s=pu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=AA(e);if(r===null)continue;let n=M_(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:pu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var jA,P_=b(()=>{"use strict";jA={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 RA,readdirSync as OA,readFileSync as LA}from"node:fs";import{join as F_}from"node:path";function CA(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1506
+ WHERE project_id = ? AND detected_at >= ? AND detected_at <= ? ORDER BY detected_at ASC`,E,g,_):[],x=e.query(`SELECT SUM(input_tokens) AS input, SUM(output_tokens) AS output
1507
+ FROM session_size WHERE observed_at >= ? AND observed_at <= ?`,n.started_at,n.ended_at??new Date().toISOString())[0],A=x?.input!==null&&x?.input!==void 0?`input: ${x.input}, output: ${x.output??0}`:"n/a",D=e.getWorkflow(n.workflow_id),C=n.started_at!==null&&n.ended_at!==null?Math.max(0,new Date(n.ended_at).getTime()-new Date(n.started_at).getTime()):null,H={run_id:t,workflow_name:D?.name??null,started_at:n.started_at,ended_at:n.ended_at,terminal_state:n.terminal_state,duration_ms:C,steps:c,tool_stats:m,reviewer_interventions:{count:p.length,state_names:h},drift_signals:k,token_totals:A};e.insertStepArtifact({step_id:o,kind:"run_report",content:JSON.stringify(H)})}var L_=b(()=>{"use strict"});import{spawnSync as M_}from"node:child_process";function pu(t){return jA[t]??`no install hint; ensure '${t}' is on PATH`}function AA(t){switch(t){case"gh":return{args:["auth","status"]};case"claude":case"codex":case"gemini":case"qwen":return{args:["auth","status"]};case"opencode":return{args:["auth","list"]};default:return null}}function C_(t){return M_("which",[t],{encoding:"utf8"}).status===0}function D_(t){if(t===void 0)return null;for(let e of t.tools??[])if(!C_(e)){let r=pu(e);return{kind:"missing_tool",tool:e,install_hint:r,message:`missing dependency: ${e}; ${r}`}}for(let e of t.auth??[]){if(!C_(e)){let s=pu(e);return{kind:"missing_tool",tool:e,install_hint:s,message:`missing dependency: ${e}; ${s}`}}let r=AA(e);if(r===null)continue;let n=M_(e,r.args,{encoding:"utf8"});if(n.status!==0){let s=typeof n.stderr=="string"?n.stderr.trim():"";return{kind:"auth_failed",tool:e,install_hint:pu(e),message:`${e} not authenticated; run \`${e} login\` or equivalent`,detail:s.length>0?s:void 0}}}return null}var jA,P_=b(()=>{"use strict";jA={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 RA,readdirSync as OA,readFileSync as LA}from"node:fs";import{join as F_}from"node:path";function CA(t){let e=t.match(/^---\n([\s\S]*?)\n---/);if(!e)return[];let r=e[1],n=r.match(/^tags:\s*\[([^\]]*)\]/m);if(n)return n[1].split(",").map(o=>o.trim()).filter(Boolean);let s=r.match(/^tags:\s*\n((?:\s*-\s+.+\n?)*)/m);return s?s[1].split(`
1520
1508
  `).map(o=>o.replace(/^\s*-\s+/,"").trim()).filter(Boolean):[]}function U_(t,e){let r=t.match(/^---\n([\s\S]*?)\n---/);if(!r)return null;let s=r[1].match(new RegExp(`^${e}:\\s*(.+)$`,"m"));return s?s[1].trim():null}function W_(t,e){if(e.length===0)return null;let r=F_(t,"durable-memory");if(!RA(r))return null;let n;try{n=OA(r).filter(o=>o.endsWith(".md")&&o!=="index.md")}catch{return null}let s=[];for(let o of n)try{let i=LA(F_(r,o),"utf8");if(CA(i).some(l=>e.includes(l))){let l=U_(i,"name")??o.replace(".md",""),c=U_(i,"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 B_=b(()=>{"use strict"});function gu(t){let e=t.trim().replace(MA,"").trim();for(let r=0;r<4;r+=1){let n=DA.exec(e);if(n===null)break;e=n[2].trim()}return e}function q_(t){let e=t.trim(),r=PA.exec(e);if(r!==null)return r[2];let n=FA.exec(e);return n!==null?n[0]:null}function ds(t,e){let r=t.split(`
1521
1509
  `),n=null,s=-1;for(let i=0;i<r.length;i+=1){let a=gu(r[i]),l=hu.exec(a);if(l===null)continue;let c=l[1].trim();if(_u.test(c))continue;let u=q_(c);u!==null&&(n=u,s=i)}if(n===null)return{outcome:null,reason:"no_stance"};if(!e.includes(n))return{outcome:null,reason:"unknown_outcome",actual:n};let o={};for(let i=s-1;i>=0;i-=1){let a=gu(r[i]),l=hu.exec(a);if(l===null)break;let c=_u.exec(l[1].trim());if(c===null)break;o[c[1]]=c[2].trim()}return{outcome:n,evidence:o}}function H_(t){let e=t.split(`
1522
- `),r=null;for(let n=0;n<e.length;n+=1){let s=gu(e[n]),o=hu.exec(s);if(o===null)continue;let i=o[1].trim();if(_u.test(i))continue;let a=q_(i);if(a===null||!Ur(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MA,DA,hu,_u,PA,FA,wu=b(()=>{"use strict";Pn();MA=/^#{1,6}\s+/,DA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hu=/^STANCE:\s+(.+)$/,_u=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FA=/^[A-Za-z0-9_-]+/});function J_(t,e,r){return n=>{let s=r(),o=Date.now(),i=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(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var X_=b(()=>{"use strict"});import{readFileSync as UA}from"node:fs";import{dirname as WA,join as BA}from"node:path";import{fileURLToPath as qA}from"node:url";function XA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YA(t){let e=[],r=[];for(let n of t)HA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JA.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function ZA(t,e){if(t.length===0)return{matched:!1};let r=YA(t);for(let n of r){let s=zA(n,e);if(s.matched)return s}return{matched:!1}}function yu(t){return ZA(t,KA)}function QA(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Eu(t){return QA(t).split(" ").filter(e=>e.length>0)}var HA,JA,GA,VA,KA,G_=b(()=>{"use strict";HA=new Set(["&&","||",";","|",">",">>","<","<<"]),JA=/^[A-Za-z_][A-Za-z0-9_]*=/;GA=WA(qA(import.meta.url)),VA=JSON.parse(UA(BA(GA,"side_effect_classifier.json"),"utf-8")),KA=XA(VA)});function Ri(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function V_(t,e){try{return await $r(bu(t)??t,Ri(e))===!0}catch{return!1}}async function Oi(t,e){try{return await $r(bu(t)??t,Ri(e))}catch{return}}async function K_(t,e){if(typeof t!="string")return t;let r=bu(t);if(r===null)return t;try{return await $r(r,Ri(e))}catch{return}}async function Y_(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=eR(await $r(a,Ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function bu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function eR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var fs=b(()=>{"use strict";an()});import{existsSync as z_,readdirSync as Z_,readFileSync as tR,statSync as Q_}from"node:fs";import{join as Ci}from"node:path";function eg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function tt(t,e,r,n,s={}){let o=P(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${ms}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Ur(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Qs,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:rR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function rR(t){return t.length>8e3?`${t.slice(0,8e3)}
1523
- \u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function tg(t,e){let r=e.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 o=ir(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=ir(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=ir(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Y_(n,e)}function nR(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function ir(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function ps(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=J_(e.dal,e.run_id,()=>o),c=Su(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=Eu(T.summary),k=yu(E);k.matched&&!c&&(u.violation={summary:T.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),sR(T,(E,k)=>{m+=E,p+=k})},g=await Vr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ie(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oR(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Tu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function sR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Li(s.input_tokens),a=Li(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Li(o.input_tokens),a=Li(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Li(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Dt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.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 ps({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function pn(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(tm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Xe(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1510
+ `),r=null;for(let n=0;n<e.length;n+=1){let s=gu(e[n]),o=hu.exec(s);if(o===null)continue;let i=o[1].trim();if(_u.test(i))continue;let a=q_(i);if(a===null||!Ur(a))continue;let c=i.slice(i.indexOf(a)+a.length).replace(/^[`*_:\s\-–—]+/,"").trim();r={token:a,reason:c}}return r}var MA,DA,hu,_u,PA,FA,yu=b(()=>{"use strict";Pn();MA=/^#{1,6}\s+/,DA=/^(```|\*\*|__|`|\*|_)([\s\S]+?)\1$/,hu=/^STANCE:\s+(.+)$/,_u=/^([A-Z][A-Z0-9_]*):\s*(.+)$/,PA=/^(```|\*\*|__|`|\*|_)([A-Za-z0-9_-]+)\1/,FA=/^[A-Za-z0-9_-]+/});function J_(t,e,r){return n=>{let s=r(),o=Date.now(),i=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(i,"utf8");if(a<=262144){t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:i});return}let l=i.slice(0,1024),c=JSON.stringify({truncated:!0,size:a,preview:l});if(s!==null){let u=t.insertStepArtifact({step_id:s,kind:"session_event_overflow",content:i});t.insertSessionEvent({run_id:e,step_id:s,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:u.id})}else t.insertSessionEvent({run_id:e,step_id:null,kind:n.kind,timestamp_ms:o,payload:c,payload_truncated:1,overflow_artifact_id:null})}}var X_=b(()=>{"use strict"});import{readFileSync as UA}from"node:fs";import{dirname as WA,join as BA}from"node:path";import{fileURLToPath as qA}from"node:url";function XA(t){return t.rules.map(e=>({command:e.command,subcommands:e.argv_patterns.map(r=>r.trim().split(/\s+/)),kind:e.kind}))}function YA(t){let e=[],r=[];for(let n of t)HA.has(n)?(r.length>0&&e.push(r),r=[]):r.push(n);return r.length>0&&e.push(r),e}function zA(t,e){if(t.length===0)return{matched:!1};let r=0;for(;r<t.length&&JA.test(t[r]);)r+=1;if(r>=t.length)return{matched:!1};let n=t[r],s=t.slice(r+1);for(let o of e)if(n===o.command){for(let i of o.subcommands)if(i.every((l,c)=>s[c]===l))return{matched:!0,kind:o.kind}}return{matched:!1}}function ZA(t,e){if(t.length===0)return{matched:!1};let r=YA(t);for(let n of r){let s=zA(n,e);if(s.matched)return s}return{matched:!1}}function wu(t){return ZA(t,KA)}function QA(t){return t.replace(/&&/g," && ").replace(/\|\|/g," || ").replace(/;/g," ; ").replace(/\|/g," | ").replace(/(?<!\d)>{1,2}/g,e=>` ${e} `).replace(/(?<!\d)<{1,2}/g,e=>` ${e} `).replace(/\s+/g," ").trim()}function Eu(t){return QA(t).split(" ").filter(e=>e.length>0)}var HA,JA,GA,VA,KA,G_=b(()=>{"use strict";HA=new Set(["&&","||",";","|",">",">>","<","<<"]),JA=/^[A-Za-z_][A-Za-z0-9_]*=/;GA=WA(qA(import.meta.url)),VA=JSON.parse(UA(BA(GA,"side_effect_classifier.json"),"utf-8")),KA=XA(VA)});function Ri(t){return{context:{outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index},outcomes:t.outcomes,inputs:t.inputs,item:t.iteration?.item,index:t.iteration?.index}}async function V_(t,e){try{return await $r(bu(t)??t,Ri(e))===!0}catch{return!1}}async function Oi(t,e){try{return await $r(bu(t)??t,Ri(e))}catch{return}}async function K_(t,e){if(typeof t!="string")return t;let r=bu(t);if(r===null)return t;try{return await $r(r,Ri(e))}catch{return}}async function Y_(t,e){let r=Array.from(t.matchAll(/=\{\{([\s\S]*?)\}\}/g));if(r.length===0)return t;let n="",s=0;for(let o of r){let i=o.index??0;n+=t.slice(s,i);let a=o[1]?.trim()??"";try{n+=eR(await $r(a,Ri(e)))}catch{n+=""}s=i+o[0].length}return n+=t.slice(s),n}function bu(t){let e=t.trim();return!e.startsWith("={{")||!e.endsWith("}}")?null:e.slice(3,-2).trim()}function eR(t){return t==null?"":typeof t=="string"?t:JSON.stringify(t)}var fs=b(()=>{"use strict";an()});import{existsSync as z_,readdirSync as Z_,readFileSync as tR,statSync as Q_}from"node:fs";import{join as Ci}from"node:path";function eg(t,e,r,n){return Object.assign(t,{stateId:e,state:r,displayName:n})}function X(t,e){return t.dal.insertStep({...e,parent_step_id:t.parent_step_id})}function K(t,e){return e.startsWith("@terminal:")?{kind:"terminal",terminal:e.slice(10)}:t.states[e]===void 0?{kind:"escalate",token:e,reason:`unknown state ref '${e}'`}:{kind:"state",state:e}}function tt(t,e,r,n,s={}){let o=P(),i=X(t,{run_id:t.run_id,state_name:e.name});t.steps_executed+=1,t.dal.finishStep(i.id,null,`escalation:${n}`.slice(0,480)),t.dal.setRunPausedState(t.run_id,`${ms}${e.id}`,o);let a=t.dal.getRun(t.run_id),l=Ur(r)?"generic":"unhandled";return t.dal.raiseAttention({kind:Qs,severity:"attn",project_id:t.project.id,run_id:t.run_id,requires_user:!0,payload:JSON.stringify({run_id:t.run_id,step_id:i.id,project_id:t.project.id,workflow_name:t.workflow.name,workflow_version_id:a?.workflow_version_id??null,step:{id:e.id,name:e.name,type:e.type},tier:l,token:r,reason:n,declared_outcomes:[...s.declared_outcomes??[]],agent_output:rR(s.agent_output??n),paused_at:o,created_at:o})}),t.dal.pauseJob(t.job.id),{kind:"paused"}}function rR(t){return t.length>8e3?`${t.slice(0,8e3)}
1511
+ \u2026[truncated ${t.length-8e3} chars]`:t}function Y(t,e,r,n){t.outcomes[e]=n,r!==e&&(t.outcomes[r]=n)}function ee(t){return t.terminals.aborted?.kind==="failure"?"aborted":Object.entries(t.terminals).find(([,r])=>r.kind==="failure")?.[0]??Object.keys(t.terminals)[0]??"aborted"}function tg(t,e){let r=e.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 o=ir(t.job.payload)?.[n];if(Array.isArray(o)&&o.every(i=>typeof i=="string"))return o}return null}async function Xe(t,e,r){let n=t.replace(/(?<!=)\{\{\s*([a-zA-Z0-9_.]+)\s*\}\}/g,(s,o)=>{if(o==="run_id")return String(e.run_id);if(o==="state_id")return r;if(o==="item")return e.iteration?.item??"";if(o==="index")return e.iteration===null?"":String(e.iteration.index);if(o.startsWith("project.")){let i=o.slice(8);if(i==="id")return String(e.project.id);if(i==="name")return e.project.name;if(i==="local_path")return e.project.local_path;if(i==="default_branch")return e.project.default_branch??"";if(i==="owner"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(0,a):""}if(i==="repo"){let a=e.project.name.indexOf("/");return a>0?e.project.name.slice(a+1):e.project.name}if(i==="test_command"){let a=e.project.test_command;return a===null||a===""?"npm test":a}return""}if(o==="job_payload"){let i=ir(e.job.payload);return i===null?"":JSON.stringify(i)}if(o.startsWith("job_payload.")){let i=o.slice(12),l=ir(e.job.payload)?.[i];return l==null?"":String(l)}if(o.startsWith("outcomes.")){let i=nR(e.outcomes,o.slice(9));return i==null?"":typeof i=="string"?i:JSON.stringify(i)}return""});return Y_(n,e)}function nR(t,e){let r=t;for(let n of e.split(".")){if(r===null||typeof r!="object"||Array.isArray(r))return;r=r[n]}return r}function ir(t){if(t===null)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:null}catch{return null}}async function ps(t){let{context:e,stateId:r,member:n,prompt:s,stepId:o,timeoutMs:i,writesToProjectPath:a}=t,l=J_(e.dal,e.run_id,()=>o),c=Su(e,r),u={violation:null},d=T=>{if(l(T),u.violation===null&&T.kind==="tool_use"&&T.tool==="Bash"&&T.summary){let E=Eu(T.summary),k=wu(E);k.matched&&!c&&(u.violation={summary:T.summary,kind:k.kind})}},f=new Date(Date.now()-1),m=0,p=0,h=T=>{d(T),sR(T,(E,k)=>{m+=E,p+=k})},g=await Vr({sessionid:n.sessionid,sessiondir:n.sessiondir,prompt:s,timeoutMs:i,dal:e.dal,team_member_id:n.id,onProgress:h});e.dal.insertSessionEvent({run_id:e.run_id,step_id:o,kind:"agent_call",timestamp_ms:Date.now(),payload:JSON.stringify({alias:n.alias,provider:Ie(n),model:n.model??"unknown",tokens_in:m,tokens_out:p,wall_time_ms:g.ms})}),oR(e.project,e.dal,f);let _=u.violation;return _!==null?{kind:"g3_violation",summary:_.summary,violationKind:_.kind}:!a&&e.project.local_path.trim().length>0&&Tu(e.project.local_path,f)?{kind:"g2_violation"}:{kind:"ok",text:g.text,ms:g.ms,argv:g.argv}}function sR(t,e){let r=t.raw;if(r==null)return;let s=r.message?.usage;if(s!==void 0){let i=Li(s.input_tokens),a=Li(s.output_tokens);(i>0||a>0)&&e(i,a);return}let o=r.usage;if(o!==void 0){let i=Li(o.input_tokens),a=Li(o.output_tokens);(i>0||a>0)&&e(i,a)}}function Li(t){return typeof t=="number"&&Number.isFinite(t)&&t>=0?t:0}async function Dt(t,e,r,n){if(r.sessionid===null)return;let s=`${e}:write_back`,o=X(t,{run_id:t.run_id,state_name:s});t.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 ps({context:t,stateId:s,member:r,prompt:a,stepId:o.id,timeoutMs:t.workflow.default_task_timeout_ms,writesToProjectPath:!1});if(l.kind==="ok"){t.dal.insertStepArtifact({step_id:o.id,kind:"write_back_transcript",content:l.text});let c=!l.text.includes("STANCE: no_writeback");t.dal.finishStep(o.id,c?"wrote_back":"no_writeback","write_back_turn")}else t.dal.finishStep(o.id,null,`write_back_${l.kind}`)}catch{t.dal.finishStep(o.id,null,"write_back_error")}}async function pn(t,e,r,n,s,o,i,a=!1,l){let c=t.membersByAlias.get(r.alias);if(c===void 0||c.sessionid===null)return{outcome:null,text:"",status_detail:`missing_agent:${r.alias}`};let u=X(t,{run_id:t.run_id,state_name:e});t.steps_executed+=1;let d=[];c.prompt_snapshot!==null&&c.prompt_snapshot.length>0&&d.push(c.prompt_snapshot),o&&d.push(tm(s)),l!=null&&l.length>0&&d.push(l);let f=r.prompt_template!==void 0?await Xe(r.prompt_template,t,e):"";f.length>0&&d.push(f),n!==null&&n.length>0&&d.push(n);let m=d.join(`
1524
1512
 
1525
- `);try{let p=await ps({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,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 t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=ds(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function hn(t,e){return(e?.length??0)>0?W_(t.project.local_path,e):null}function rg(t){return yu(Eu(t))}function Su(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1513
+ `);try{let p=await ps({context:t,stateId:e,member:c,prompt:m,stepId:u.id,timeoutMs:i,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 t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(p.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id:e,kind:p.violationKind,command_summary:p.summary,message:`State ${e} ran a classified side-effect command (${p.violationKind}) without a preceding approved Pause`}:{violation:"writes_to_project_path",state_id:e,message:`State ${e} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,g),{outcome:null,text:"",status_detail:g}}if(t.dal.insertStepArtifact({step_id:u.id,kind:`${e}_transcript`,content:p.text}),t.transcripts[e]=p.text,!o)return t.dal.finishStep(u.id,"done",`chat_ms=${p.ms}`),t.outcomes[e]="done",{outcome:"done",text:p.text,status_detail:`chat_ms=${p.ms}`};let h=ds(p.text,s);return t.dal.finishStep(u.id,h.outcome,h.outcome!==null?`chat_ms=${p.ms}`:h.reason),h.outcome!==null&&(t.outcomes[e]=h.outcome),{outcome:h.outcome,text:p.text,status_detail:h.outcome!==null?`chat_ms=${p.ms}`:h.reason}}catch(p){let h=p instanceof Ee?`chat_${p.kind}`:"chat_other";return t.dal.finishStep(u.id,null,h),{outcome:null,text:"",status_detail:h}}}function hn(t,e){return(e?.length??0)>0?W_(t.project.local_path,e):null}function rg(t){return wu(Eu(t))}function Su(t,e){let r=t.dal.query(`SELECT state_name, outcome FROM step
1526
1514
  WHERE run_id = ? AND state_name != ? AND ended_at IS NOT NULL
1527
1515
  ORDER BY started_at DESC, id DESC LIMIT 1`,t.run_id,e);if(r.length===0)return!1;let n=r[0];return t.workflow.states[n.state_name]?.type==="Interactive"&&n.outcome==="done"}function Tu(t,e){if(!z_(t))return!1;let r=Ci(t,"durable-memory");function n(s){let o;try{o=Z_(s,{withFileTypes:!0})}catch{return!1}for(let i of o){if(i.name===".git")continue;let a=Ci(s,i.name);if(a!==r)if(i.isDirectory()){if(n(a))return!0}else try{if(Q_(a).mtime>e)return!0}catch{}}return!1}return n(t)}function oR(t,e,r){let n=Ci(t.local_path,"durable-memory");if(!z_(n))return;let s;try{s=Z_(n)}catch{return}for(let o of s){if(!o.endsWith(".md")||o==="MEMORY.md")continue;let i=Ci(n,o),a;try{a=Q_(i).mtime}catch{continue}if(a<=r)continue;let l;try{l=tR(i,"utf8")}catch{continue}let c=aR(l);if(c===null){process.stderr.write(`[durable-memory-sync] warning: ${o} has no valid frontmatter, skipping
1528
- `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function aR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!iR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ms,iR,We=b(()=>{"use strict";Pe();ln();Gn();B_();wu();Pn();X_();G_();fs();ms="__paused__:";iR=new Set(["user","feedback","project","reference"])});import{spawnSync as ng}from"node:child_process";function lR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=ng("git",["diff","--quiet"],{cwd:o}).status!==0,a=ng("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Y(t,r,n,Jc),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),K(t.workflow,e.next)}var sg,og=b(()=>{"use strict";We();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:t=>lR(t,t.state)}});async function cR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await V_(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),Y(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Y(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":ee(t.workflow)}}var ig,ag=b(()=>{"use strict";We();fs();ig={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async t=>cR(t,t.state)}});async function uR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=hn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await pn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1516
+ `);continue}if(t.durable_memory_mode==="db")try{e.upsertDurableMemory({project_id:t.id,type:c.type,name:c.name,description:c.description,body:c.body})}catch{}}}function aR(t){let e=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n([\s\S]*)$/);if(e===null)return null;let r=e[1],n=e[2].trimStart(),s=r.match(/^name:\s*(.+)$/m),o=r.match(/^type:\s*(.+)$/m),i=r.match(/^description:\s*(.+)$/m),a=s?.[1]?.trim(),l=o?.[1]?.trim();return a===void 0||a.length===0||l===void 0||!iR.has(l)?null:{name:a,type:l,description:i?.[1]?.trim()??null,body:n}}var ms,iR,We=b(()=>{"use strict";Pe();ln();Gn();B_();yu();Pn();X_();G_();fs();ms="__paused__:";iR=new Set(["user","feedback","project","reference"])});import{spawnSync as ng}from"node:child_process";function lR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.project.local_path,i=ng("git",["diff","--quiet"],{cwd:o}).status!==0,a=ng("git",["diff","--cached","--quiet"],{cwd:o}).status!==0;if(i||a){let l=e.fail_message??"repository has uncommitted changes";return t.dal.finishStep(s.id,null,l),Y(t,r,n,Jc),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.finishStep(s.id,"clean","repo_clean"),Y(t,r,n,"clean"),K(t.workflow,e.next)}var sg,og=b(()=>{"use strict";We();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:t=>lR(t,t.state)}});async function cR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;for(let o of e.branches)if(await V_(o.when,t))return t.dal.finishStep(s.id,"matched",o.when),Y(t,r,n,"matched"),K(t.workflow,o.next);return t.dal.finishStep(s.id,"no_match","choice_no_match"),Y(t,r,n,"no_match"),e.default_next!==void 0?K(t.workflow,e.default_next):{kind:"terminal",terminal:t.workflow.terminals.no_match?"no_match":ee(t.workflow)}}var ig,ag=b(()=>{"use strict";We();fs();ig={description:{displayName:"Choice",name:"choice",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"branches",displayName:"Branches",type:"json",description:"Jexl predicates evaluated against input-only context: context.outcomes and context.inputs. Globals and functions such as process.exit(1) and Math.random() are not exposed."}],builtin:!0},execute:async t=>cR(t,t.state)}});async function uR(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms,o=e.researchers??[],i=hn(t,e.durable_memory_tags),a=new Array(o.length).fill(null);await Promise.all(o.map(async(m,p)=>{let h=`${n}:researcher_${m.alias}[${p}]`,g=await pn(t,h,m,`TOPIC: ${m.topic}`,[],!1,s,!1,i);g.text.length>0&&(a[p]=g.text)}));let l=a.map((m,p)=>m!==null?`# Research ${p+1}: ${o[p]?.topic??""}
1529
1517
  ${m}`:null).filter(m=>m!==null).join(`
1530
1518
 
1531
1519
  `),c=`${n}:consolidator`,u=await pn(t,c,e.consolidator,l.length>0?l:null,["ok","error"],!0,s,!1,i),d=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,u.outcome===null||u.outcome==="error"){t.dal.finishStep(d.id,u.outcome,u.status_detail),u.outcome==="error"&&Y(t,r,n,"error");let m=e.outcomes.error;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=e.research_artifact_prefix??n;if(t.dal.insertStepArtifact({step_id:d.id,kind:`${f}_consolidated`,content:u.text}),t.dal.finishStep(d.id,"ok","consolidated"),Y(t,r,n,"ok"),e.write_back_durable_memory){let m=t.membersByAlias.get(e.consolidator.alias);m!==void 0&&await Dt(t,n,m,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.ok)}var lg,cg=b(()=>{"use strict";We();lg={description:{displayName:"Consolidate",name:"consolidate",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>uR(t,t.state)}});async function dR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.progress_step_id;t.progress_step_id=s.id;try{let i=await Oi(e.items_from,t),a=hR(i);if(a===null){t.dal.finishStep(s.id,null,`foreach_invalid_items:${e.items_from}`);let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let l={routed:null},c=e.mode==="parallel"?await mR(t,e,s.id,a,l):await fR(t,e,s.id,a,l);if(l.routed!==null)return t.dal.finishStep(s.id,null,`foreach_propagated:${l.routed.kind}`),l.routed;let u=c.some(f=>f.outcome===null||f.outcome==="__failure__"),d=u?"any_failed":"all_ok";if(t.dal.finishStep(s.id,d,JSON.stringify({iterations:c,count:a.length})),Y(t,r,n,d),u){let f=e.outcomes.any_failed;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.all_ok)}finally{t.progress_step_id=o}}async function fR(t,e,r,n,s){let o=[];for(let i=0;i<n.length;i+=1){let a=await dg(t,e,r,n[i],i,s);if(s.routed!==null||(o.push(a),(a.outcome===null||a.outcome==="__failure__")&&e.on_item_failure==="stop"))break}return o}async function mR(t,e,r,n,s){let o=new Array(n.length),i=0,a=Array.from({length:Math.min(e.max_concurrency,n.length)},async()=>{for(;i<n.length&&s.routed===null;){let l=i;i+=1,o[l]=await dg(t,e,r,n[l],l,s)}});return await Promise.all(a),o}async function dg(t,e,r,n,s,o){let i=t.iteration;t.iteration={item:n,index:s};let a=`${t.displayName}[${s}]`;t.emit_progress?.({kind:"item_started",data:{index:s,item:n}});let l;try{l=await t.dispatchState(a,e.body,{parent_step_id:r,iteration:{item:n,index:s}})}finally{t.iteration=i}(l.kind==="paused"||l.kind==="escalate")&&o.routed===null&&(o.routed=l);let u=l.kind==="terminal"&&t.workflow.terminals[l.terminal]?.kind==="failure"?"__failure__":pR(t.outcomes[a]);return t.emit_progress?.({kind:u===null||u==="__failure__"?"item_failed":"item_completed",data:{index:s,item:n,outcome:u}}),{index:s,value:n,outcome:u}}function pR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}function hR(t){if(!Array.isArray(t))return null;let e=[];for(let r of t)if(typeof r=="string")e.push(r);else if(typeof r=="number"||typeof r=="boolean")e.push(String(r));else return null;return e}var ug,fg=b(()=>{"use strict";We();fs();ug={description:{displayName:"For Each",name:"foreach",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>dR(t,t.state)}});async function _R(t,e){let r=t.stateId,n=t.displayName,s=e.termination.timeout_seconds!==void 0?e.termination.timeout_seconds*1e3:void 0,o=t.membersByAlias.get(e.agent.alias);if(o===void 0||o.sessionid===null){let f=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(f.id,null,`missing_agent:${e.agent.alias}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=hn(t,e.durable_memory_tags),a=t.dal.getInteractiveSessionByRunAndState(t.run_id,r);if(a!==null){if(a.status==="done")return t.dal.finishStep(a.step_id,"done","operator_done"),t.outcomes[n]="done",e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done);if(a.status==="waiting_agent"){if(a.turn_count>=e.termination.max_turns){t.dal.finishStep(a.step_id,"timeout",`max_turns=${e.termination.max_turns}`),Y(t,r,n,"timeout");let m=e.outcomes.timeout;return m!==void 0?K(t.workflow,m):{kind:"terminal",terminal:ee(t.workflow)}}let f=a.last_operator_input??"";try{let m=await ps({context:t,stateId:n,member:o,prompt:f,stepId:a.step_id,timeoutMs:s,writesToProjectPath:!1});if(m.kind==="g3_violation"||m.kind==="g2_violation"){let p=m.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${m.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:a.step_id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(m.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id: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`})}),t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(a.id,m.text,"waiting_operator"),e.termination.agent_signal!==void 0&&m.text.includes(e.termination.agent_signal)?(e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:a.step_id,kind:e.artifact_name,content:m.text}),t.dal.finishStep(a.step_id,"done","agent_signal"),Y(t,r,n,"done"),e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:a.step_id,agentText:m.text}),{kind:"paused"})}catch(m){let p=m instanceof Ee?`chat_${m.kind}`:"chat_other";return t.dal.finishStep(a.step_id,null,p),{kind:"terminal",terminal:ee(t.workflow)}}}return{kind:"paused"}}let l=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let c=t.dal.insertInteractiveSession({run_id:t.run_id,step_id:l.id,state_name:r,status:"waiting_agent"}),u=await Xe(e.agent.initial_prompt_template,t,n),d=i?`${i}
1532
1520
 
1533
- ${u}`:u;try{let f=await ps({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id: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`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function mg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${ms}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(gR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function gR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=wR(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:yR(o,3),paused_at:i,created_run_inputs:ir(e.job.payload)}}function wR(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function yR(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var pg,hg=b(()=>{"use strict";Gn();We();pg={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>_R(t,t.state)}});async function ER(t,e){let r=t.stateId,n=t.displayName,s=tg(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=bR(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function bR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var _g,gg=b(()=>{"use strict";We();_g={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>ER(t,t.state)}});import{createHash as SR}from"node:crypto";import{existsSync as TR,mkdirSync as kR,readFileSync as vR,writeFileSync as IR}from"node:fs";import{dirname as NR,isAbsolute as yg,normalize as xR,resolve as hs}from"node:path";import{Document as $R,ExternalHyperlink as jR,HeadingLevel as _n,LevelFormat as AR,Packer as RR,Paragraph as ft,Table as OR,TableCell as LR,TableRow as CR,TextRun as mt,WidthType as MR}from"docx";import{marked as DR}from"marked";async function PR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await FR(t,e,n),i=await UR(t,e),a=await WR(t,e.title),l=await XR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kR(NR(i),{recursive:!0}),IR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:SR("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),Y(t,r,n,{output_path:i,path:i,bytes:l.length}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function FR(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Xe(e.markdown_source,t,r)).trim(),o=(n.length===0?JR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=qR(t.project.local_path,o);if(i!==null){if(!TR(i))throw new Error(`markdown_source file not found: ${i}`);return Mi(vR(i,"utf8"))}return Mi(o)}async function UR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=BR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function WR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function BR(t,e){let r=hs(t);return xR(yg(e)?hs(e):hs(r,e))}function qR(t,e){return HR(e)?yg(e)?hs(e):hs(t,e):null}function HR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function JR(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Mi(s);let o=t.dal.query(`SELECT sa.content
1521
+ ${u}`:u;try{let f=await ps({context:t,stateId:n,member:o,prompt:d,stepId:l.id,timeoutMs:s,writesToProjectPath:!1});if(f.kind==="g3_violation"||f.kind==="g2_violation"){let m=f.kind==="g3_violation"?`policy_violation:side_effect_without_pause:${f.violationKind}`:"policy_violation:writes_to_project_path";return t.dal.insertSessionEvent({run_id:t.run_id,step_id:l.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify(f.kind==="g3_violation"?{violation:"side_effect_without_pause",state_id: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`})}),t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}return t.dal.setInteractiveAgentOutput(c.id,f.text,"waiting_operator"),e.artifact_name!==void 0&&t.dal.insertStepArtifact({step_id:l.id,kind:e.artifact_name,content:f.text}),e.termination.agent_signal!==void 0&&f.text.includes(e.termination.agent_signal)?(t.dal.finishStep(l.id,"done","agent_signal"),t.outcomes[n]="done",e.write_back_durable_memory&&await Dt(t,n,o,e.write_back_durable_memory),K(t.workflow,e.outcomes.done)):(mg({context:t,state:e,stateId:r,displayName:n,stepId:l.id,agentText:f.text}),{kind:"paused"})}catch(f){let m=f instanceof Ee?`chat_${f.kind}`:"chat_other";return t.dal.finishStep(l.id,null,m),{kind:"terminal",terminal:ee(t.workflow)}}}function mg(t){let{context:e,state:r,stateId:n,displayName:s,stepId:o,agentText:i}=t,a=P();e.dal.setRunPausedState(e.run_id,`${ms}${n}`,a),e.dal.raiseAttention({kind:"interactive_waiting_operator",severity:"attn",project_id:e.project.id,run_id:e.run_id,requires_user:!0,payload:JSON.stringify(gR({context:e,stateId:s,state:r,stepId:o,agentText:i,pausedAt:a}))}),e.dal.pauseJob(e.job.id)}function gR(t){let{context:e,stateId:r,state:n,stepId:s,agentText:o,pausedAt:i}=t,a=e.dal.getRun(e.run_id),l=yR(e,r),c={kind:"free_text",choices:null};return{run_id:e.run_id,step_id:s,state_name:r,workflow_name:e.workflow.name,workflow_version_id:a?.workflow_version_id??null,node_path:l,prompt:o,expected_response:c,transcript_tail:wR(o,3),paused_at:i,created_run_inputs:ir(e.job.payload)}}function yR(t,e){let r=[],s=t.dal.getRun(t.run_id)?.parent_run_id??null;for(let o=0;o<32&&s!==null;o+=1){let i=t.dal.getRun(s);if(i===null)break;i.current_state!==null&&r.unshift(i.current_state),s=i.parent_run_id}return r.push(e),r}function wR(t,e){if(typeof t!="string"||t.length===0)return[];let r=t.split(/\r?\n/);return(r.length>0&&r[r.length-1]===""?r.slice(0,-1):r).slice(-e)}var pg,hg=b(()=>{"use strict";Gn();We();pg={description:{displayName:"Interactive",name:"interactive",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>_R(t,t.state)}});async function ER(t,e){let r=t.stateId,n=t.displayName,s=tg(t,e.over);if(s===null){let d=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_invalid_items:${e.over}`);let f=e.outcomes.error;return f!==void 0?K(t.workflow,f):{kind:"terminal",terminal:ee(t.workflow)}}let o=t.workflow.states[e.body];if(o===void 0){let d=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(d.id,null,`loop_body_not_found:${e.body}`),{kind:"terminal",terminal:ee(t.workflow)}}let i=s.slice(0,e.max_items),a=[],l=!1;for(let d=0;d<i.length;d+=1){let f=i[d],m=`${n}[${d}]`,p=t.iteration;t.iteration={item:f,index:d};let h;try{h=await t.dispatchState(m,o,{iteration:{item:f,index:d}})}finally{t.iteration=p}if(h.kind==="paused"||h.kind==="escalate")return h;let g=bR(t.outcomes[m]);if(a.push({index:d,value:f,outcome:g}),g===null&&e.stop_on_error){l=!0;break}}let c=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let u=l?"error":"ok";if(t.dal.finishStep(c.id,u,JSON.stringify({iterations:a,count:i.length})),Y(t,r,n,u),l){let d=e.outcomes.error;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}return K(t.workflow,e.outcomes.ok)}function bR(t){return t==null?null:typeof t=="string"?t:JSON.stringify(t)}var _g,gg=b(()=>{"use strict";We();_g={description:{displayName:"Loop",name:"loop",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],builtin:!0},execute:async t=>ER(t,t.state)}});import{createHash as SR}from"node:crypto";import{existsSync as TR,mkdirSync as kR,readFileSync as vR,writeFileSync as IR}from"node:fs";import{dirname as xR,isAbsolute as wg,normalize as NR,resolve as hs}from"node:path";import{Document as $R,ExternalHyperlink as jR,HeadingLevel as _n,LevelFormat as AR,Packer as RR,Paragraph as ft,Table as OR,TableCell as LR,TableRow as CR,TextRun as mt,WidthType as MR}from"docx";import{marked as DR}from"marked";async function PR(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await FR(t,e,n),i=await UR(t,e),a=await WR(t,e.title),l=await XR(o,a??t.workflow.name);if(l.length===0)throw new Error("rendered DOCX buffer was empty");return kR(xR(i),{recursive:!0}),IR(i,l),t.dal.insertStepArtifact({step_id:s.id,kind:"render_docx",path:i,sha:SR("sha256").update(l).digest("hex"),provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${i}`),Y(t,r,n,{output_path:i,path:i,bytes:l.length}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function FR(t,e,r){if(typeof e.markdown_source!="string"||e.markdown_source.trim().length===0)throw new Error("markdown_source is required");let n=(await Xe(e.markdown_source,t,r)).trim(),o=(n.length===0?JR(t,e.markdown_source):null)??n;if(o.length===0)throw new Error("markdown_source resolved empty");let i=qR(t.project.local_path,o);if(i!==null){if(!TR(i))throw new Error(`markdown_source file not found: ${i}`);return Mi(vR(i,"utf8"))}return Mi(o)}async function UR(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=BR(t.project.local_path,r);if(!n.endsWith(".docx"))throw new Error(`output_path must end with .docx: ${n}`);return n}async function WR(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function BR(t,e){let r=hs(t);return NR(wg(e)?hs(e):hs(r,e))}function qR(t,e){return HR(e)?wg(e)?hs(e):hs(t,e):null}function HR(t){return t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function JR(t,e){let n=/context\.outcomes\.([A-Za-z0-9_-]+)\.output/.exec(e)?.[1];if(n===void 0)return null;let s=Object.entries(t.transcripts).filter(([i])=>i.startsWith(`${n}:coder[`)).sort(([i],[a])=>a.localeCompare(i))[0]?.[1];if(s!==void 0)return Mi(s);let o=t.dal.query(`SELECT sa.content
1534
1522
  FROM step_artifact sa
1535
1523
  JOIN step s ON s.id = sa.step_id
1536
1524
  WHERE s.run_id = ?
1537
1525
  AND s.state_name LIKE ?
1538
1526
  AND sa.content IS NOT NULL
1539
1527
  ORDER BY sa.id DESC
1540
- LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Mi(o[0].content)}function Mi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XR(t,e){let r=bg(DR.lexer(t,{gfm:!0})),n=new $R({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return RR.toBuffer(n)}function bg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ft({heading:QR(r.depth),children:lr(ar(r))}));break;case"paragraph":e.push(new ft({children:lr(ar(r))}));break;case"text":e.push(new ft({children:ar(r).length===0?[new mt(r.text)]:lr(ar(r))}));break;case"blockquote":e.push(...bg(ar(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":YR(r)&&e.push(...GR(r));break;case"table":zR(r)&&e.push(VR(r));break;case"code":ZR(r)&&e.push(...KR(r));break;case"hr":e.push(new ft(""));break;case"html":r.text.trim().length>0&&e.push(new ft({children:[new mt(r.text)]}));break;default:break}return e}function lr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...ku(e)}));break;case"strong":r.push(...lr(ar(n),{...e,bold:!0}));break;case"em":r.push(...lr(ar(n),{...e,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...ku({...e,code:!0})}));break;case"link":r.push(new jR({link:n.href,children:lr(ar(n),{...e})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...ku(e)}));break}return r.length===0?[new mt("")]:r}function ku(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function GR(t){return t.items.map(e=>new ft({children:lr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:wg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:wg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function wg(t){return t.task?`[${t.checked?"x":" "}] `:""}function VR(t){let e=[t.header,...t.rows].map(r=>new CR({children:r.map(n=>new LR({children:[new ft({children:lr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new OR({width:{size:100,type:MR.PERCENTAGE},rows:e})}function KR(t){return t.text.split(`
1541
- `).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YR(t){return t.type==="list"&&Array.isArray(t.items)}function zR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZR(t){return t.type==="code"&&typeof t.text=="string"}function QR(t){switch(t){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var Eg,Sg=b(()=>{"use strict";We();Eg={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async t=>PR(t,t.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as Tg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as kg,normalize as oO,resolve as _s}from"node:path";import{marked as iO}from"marked";import aO from"write-excel-file/node";async function lO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await cO(t,e),i=uO(e.input_format),a=await dO(t,e),l=await fO(t,e.title),c=i==="markdown"?bO(o):_O(o);await SO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eO("sha256").update(Tg(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=pO(t.project.local_path,r);if(n!==null){if(!tO(n))throw new Error(`source file not found: ${n}`);return Tg(n,"utf8")}return r}function uO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function mO(t,e){let r=_s(t);return oO(kg(e)?_s(e):_s(r,e))}function pO(t,e){return hO(e)?kg(e)?_s(e):_s(t,e):null}function hO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function _O(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!Di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gO(r,n))}function gO(t,e){if(!Di(t))throw new Error(`sheets[${e}] must be an object`);let r=wO(t.headers,`sheets[${e}].headers`),n=yO(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:EO(t.styles)}}function wO(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function yO(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function EO(t){if(!Di(t)||!Di(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function bO(t){let e=iO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if($O(s)){n=s.text;continue}jO(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function SO(t){rO(sO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:IO(n.name,e),data:TO(n),columns:vO(n)}));await aO(r).toFile(t.outputPath)}function TO(t){let e=[];if(t.headers.length>0){let r=xO(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(kO));return e.length===0?[[{}]]:e}function kO(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function vO(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function IO(t,e){let r=NO(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function NO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function xO(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function $O(t){return t.type==="heading"&&typeof t.text=="string"}function jO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Di(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vg,Ig=b(()=>{"use strict";We();vg={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async t=>lO(t,t.state)}});import{spawnSync as AO}from"node:child_process";async function OO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(AO("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=hn(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await pn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1528
+ LIMIT 1`,t.run_id,`${n}:coder[%`);return o[0]?.content===void 0?null:Mi(o[0].content)}function Mi(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}async function XR(t,e){let r=bg(DR.lexer(t,{gfm:!0})),n=new $R({title:e,numbering:{config:[{reference:"ordered-list",levels:[{level:0,format:AR.DECIMAL,text:"%1."}]}]},sections:[{children:r.length===0?[new ft("")]:r}]});return RR.toBuffer(n)}function bg(t){let e=[];for(let r of t)switch(r.type){case"space":break;case"heading":e.push(new ft({heading:QR(r.depth),children:lr(ar(r))}));break;case"paragraph":e.push(new ft({children:lr(ar(r))}));break;case"text":e.push(new ft({children:ar(r).length===0?[new mt(r.text)]:lr(ar(r))}));break;case"blockquote":e.push(...bg(ar(r)).map(n=>n instanceof ft?n:new ft({children:[new mt(r.text)]})));break;case"list":YR(r)&&e.push(...GR(r));break;case"table":zR(r)&&e.push(VR(r));break;case"code":ZR(r)&&e.push(...KR(r));break;case"hr":e.push(new ft(""));break;case"html":r.text.trim().length>0&&e.push(new ft({children:[new mt(r.text)]}));break;default:break}return e}function lr(t,e){let r=[];for(let n of t)switch(n.type){case"text":case"escape":r.push(new mt({text:n.text,...ku(e)}));break;case"strong":r.push(...lr(ar(n),{...e,bold:!0}));break;case"em":r.push(...lr(ar(n),{...e,italics:!0}));break;case"codespan":r.push(new mt({text:n.text,...ku({...e,code:!0})}));break;case"link":r.push(new jR({link:n.href,children:lr(ar(n),{...e})}));break;case"br":r.push(new mt({text:"",break:1}));break;case"image":r.push(new mt({text:`[image: ${n.text}]`,italics:!0}));break;case"del":r.push(new mt({text:n.text,strike:!0}));break;default:r.push(new mt({text:n.raw,...ku(e)}));break}return r.length===0?[new mt("")]:r}function ku(t){return{...t?.bold===!0?{bold:!0}:{},...t?.italics===!0?{italics:!0}:{},...t?.code===!0?{font:"Courier New"}:{}}}function GR(t){return t.items.map(e=>new ft({children:lr(e.tokens.length===1&&e.tokens[0]?.type==="text"?[{...e.tokens[0],text:yg(e)+e.tokens[0].text}]:[{type:"text",raw:e.text,text:yg(e)+e.text}]),...t.ordered?{numbering:{reference:"ordered-list",level:0}}:{bullet:{level:0}}}))}function yg(t){return t.task?`[${t.checked?"x":" "}] `:""}function VR(t){let e=[t.header,...t.rows].map(r=>new CR({children:r.map(n=>new LR({children:[new ft({children:lr(n.tokens,n.header?{bold:!0}:void 0)})]}))}));return new OR({width:{size:100,type:MR.PERCENTAGE},rows:e})}function KR(t){return t.text.split(`
1529
+ `).map(r=>new ft({children:[new mt({text:r.length===0?" ":r,font:"Courier New"})]}))}function ar(t){let e=t.tokens;return Array.isArray(e)?e:[]}function YR(t){return t.type==="list"&&Array.isArray(t.items)}function zR(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function ZR(t){return t.type==="code"&&typeof t.text=="string"}function QR(t){switch(t){case 1:return _n.HEADING_1;case 2:return _n.HEADING_2;case 3:return _n.HEADING_3;case 4:return _n.HEADING_4;case 5:return _n.HEADING_5;default:return _n.HEADING_6}}var Eg,Sg=b(()=>{"use strict";We();Eg={description:{displayName:"Render DOCX",name:"render-docx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"markdown_source",displayName:"Markdown Source",type:"string",required:!0,description:"Markdown string or project-relative .md path. Expressions are evaluated before rendering."},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .docx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional document metadata title."}],mutates_external_state:!0,builtin:!0},execute:async t=>PR(t,t.state)}});import{createHash as eO}from"node:crypto";import{existsSync as tO,mkdirSync as rO,readFileSync as Tg,statSync as nO}from"node:fs";import{dirname as sO,isAbsolute as kg,normalize as oO,resolve as _s}from"node:path";import{marked as iO}from"marked";import aO from"write-excel-file/node";async function lO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;try{let o=await cO(t,e),i=uO(e.input_format),a=await dO(t,e),l=await fO(t,e.title),c=i==="markdown"?bO(o):_O(o);await SO({sheets:c.length===0?[{name:"Sheet1",headers:[],rows:[]}]:c,outputPath:a,title:l??t.workflow.name});let u=nO(a).size;if(u===0)throw new Error("rendered XLSX file was empty");let d=eO("sha256").update(Tg(a)).digest("hex");return t.dal.insertStepArtifact({step_id:s.id,kind:"render_xlsx",path:a,sha:d,provider_call_mode:"library"}),t.dal.finishStep(s.id,"done",`wrote:${a}`),Y(t,r,n,{output_path:a,path:a,bytes:u}),K(t.workflow,e.outcomes?.done??"@terminal:done")}catch(o){let i=o instanceof Error?o.message:String(o);return t.dal.finishStep(s.id,"error",i),Y(t,r,n,{error:i}),K(t.workflow,e.outcomes?.error??"@terminal:error")}}async function cO(t,e){if(typeof e.source!="string"||e.source.trim().length===0)return"";let r=(await Xe(e.source,t,t.stateId)).trim(),n=pO(t.project.local_path,r);if(n!==null){if(!tO(n))throw new Error(`source file not found: ${n}`);return Tg(n,"utf8")}return r}function uO(t){if(t==null||t==="")return"json";if(t==="json"||t==="markdown")return t;throw new Error(`unsupported input_format: ${String(t)}`)}async function dO(t,e){if(typeof e.output_path!="string"||e.output_path.trim().length===0)throw new Error("output_path is required");let r=(await Xe(e.output_path,t,t.stateId)).trim();if(r.length===0)throw new Error("output_path resolved empty");let n=mO(t.project.local_path,r);if(!n.endsWith(".xlsx"))throw new Error(`output_path must end with .xlsx: ${n}`);return n}async function fO(t,e){if(typeof e!="string"||e.trim().length===0)return null;let r=(await Xe(e,t,t.stateId)).trim();return r.length===0?null:r}function mO(t,e){let r=_s(t);return oO(kg(e)?_s(e):_s(r,e))}function pO(t,e){return hO(e)?kg(e)?_s(e):_s(t,e):null}function hO(t){return t.endsWith(".json")||t.endsWith(".md")||t.endsWith(".markdown")||t.startsWith("./")||t.startsWith("../")||t.startsWith("/")}function _O(t){if(t.trim().length===0)return[];let e;try{e=JSON.parse(t)}catch(r){let n=r instanceof Error?r.message:String(r);throw new Error(`invalid JSON source: ${n}`)}if(!Di(e)||!Array.isArray(e.sheets))throw new Error("JSON source must be an object with sheets[]");return e.sheets.map((r,n)=>gO(r,n))}function gO(t,e){if(!Di(t))throw new Error(`sheets[${e}] must be an object`);let r=yO(t.headers,`sheets[${e}].headers`),n=wO(t.rows,`sheets[${e}].rows`);return{name:typeof t.name=="string"&&t.name.trim().length>0?t.name:`Sheet${e+1}`,headers:r,rows:n,headerStyle:EO(t.styles)}}function yO(t,e){if(t===void 0)return[];if(!Array.isArray(t)||!t.every(r=>typeof r=="string"))throw new Error(`${e} must be an array of strings`);return t}function wO(t,e){if(t===void 0)return[];if(!Array.isArray(t))throw new Error(`${e} must be an array`);return t.map((r,n)=>{if(!Array.isArray(r))throw new Error(`${e}[${n}] must be an array`);return r.map((s,o)=>{if(s===null||typeof s=="string"||typeof s=="number"||typeof s=="boolean")return s;throw new Error(`${e}[${n}][${o}] must be string, number, boolean, or null`)})})}function EO(t){if(!Di(t)||!Di(t.headers))return;let e={};return t.headers.bold===!0&&(e.bold=!0),typeof t.headers.fill=="string"&&(e.fill=t.headers.fill),Object.keys(e).length===0?void 0:e}function bO(t){let e=iO.lexer(t,{gfm:!0}),r=[],n=null;for(let s of e){if($O(s)){n=s.text;continue}jO(s)&&(r.push({name:n??`Sheet${r.length+1}`,headers:s.header.map(o=>o.text),rows:s.rows.map(o=>o.map(i=>i.text)),headerStyle:{bold:!0}}),n=null)}return r}async function SO(t){rO(sO(t.outputPath),{recursive:!0});let e=new Set,r=t.sheets.map(n=>({sheet:IO(n.name,e),data:TO(n),columns:vO(n)}));await aO(r).toFile(t.outputPath)}function TO(t){let e=[];if(t.headers.length>0){let r=NO(t.headerStyle?.fill);e.push(t.headers.map(n=>({value:n,type:String,fontWeight:t.headerStyle?.bold===!1?void 0:"bold",backgroundColor:r??void 0})))}for(let r of t.rows)e.push(r.map(kO));return e.length===0?[[{}]]:e}function kO(t){return t===null?{}:typeof t=="string"?{value:t,type:String}:typeof t=="number"?{value:t,type:Number}:typeof t=="boolean"?{value:t,type:Boolean}:{}}function vO(t){let e=Math.max(t.headers.length,...t.rows.map(n=>n.length),1),r=[];for(let n=1;n<=e;n+=1){let s=[t.headers[n-1],...t.rows.map(i=>i[n-1])],o=Math.min(60,Math.max(10,...s.map(i=>String(i??"").length+2)));r.push({width:o})}return r}function IO(t,e){let r=xO(t),n=r,s=2;for(;e.has(n.toLowerCase());){let o=` ${s}`;n=`${r.slice(0,31-o.length)}${o}`,s+=1}return e.add(n.toLowerCase()),n}function xO(t){let e=t.replace(/[\[\]:*?/\\]/g," ").trim();return(e.length===0?"Sheet":e).slice(0,31)}function NO(t){if(t===void 0)return null;let e=t.startsWith("#")?t.slice(1):t;return/^[0-9a-fA-F]{6}$/.test(e)?`#${e.toUpperCase()}`:null}function $O(t){return t.type==="heading"&&typeof t.text=="string"}function jO(t){let e=t;return t.type==="table"&&Array.isArray(e.header)&&Array.isArray(e.rows)}function Di(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}var vg,Ig=b(()=>{"use strict";We();vg={description:{displayName:"Render XLSX",name:"render-xlsx",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"done"},{name:"error"}],properties:[{name:"source",displayName:"Source",type:"string",required:!0,description:"JSON string, markdown table text, or path to a .json/.md/.markdown file."},{name:"input_format",displayName:"Input Format",type:"options",default:"json",options:[{name:"JSON",value:"json"},{name:"Markdown",value:"markdown"}]},{name:"output_path",displayName:"Output Path",type:"string",required:!0,description:"Absolute or project-relative .xlsx path to write."},{name:"title",displayName:"Title",type:"string",required:!1,description:"Optional workbook title."}],mutates_external_state:!0,builtin:!0},execute:async t=>lO(t,t.state)}});import{spawnSync as AO}from"node:child_process";async function OO(t,e){let r=t.stateId,n=t.displayName,s=t.workflow.default_task_timeout_ms;for(let f of e.pre_checks??[])if(AO("sh",["-c",f.command],{cwd:t.project.local_path}).status!==0){let p=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(p.id,"fail_pre_check",`pre_check_failed:${f.description??f.command}`),Y(t,r,n,"fail_pre_check");let h=e.outcomes.fail_pre_check;return h!==void 0?K(t.workflow,h):{kind:"terminal",terminal:ee(t.workflow)}}let o=hn(t,e.durable_memory_tags),i=e.reviewers??[],a=null,l=i.length===0&&e.outcomes_from_stance!==void 0,c=l?Object.keys(e.outcomes_from_stance):[];for(let f=0;f<e.max_loops;f+=1){let m=`${n}:coder[${f}]`,p=await pn(t,m,e.coder,a!==null?`PRIOR REVIEW FEEDBACK:
1542
1530
  ${a}`:null,c,l,s,e.writes_to_project_path===!0,o);if(l){let g=H_(p.text);if(g!==null){let _=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.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=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(g.id,null,p.status_detail),{kind:"escalate",token:"",reason:`coder_no_outcome:${p.status_detail}`}}if(i.length===0){if(e.outcomes_from_stance!==void 0){let T=Object.keys(e.outcomes_from_stance),E=ds(p.text,T);if(E.outcome===null){let $=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep($.id,null,`unhandled_stance:${E.reason}`),{kind:"escalate",token:"",reason:`no_stance:${E.reason}`}}let k=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(k.id,E.outcome,"outcomes_from_stance"),Y(t,r,n,E.outcome),K(t.workflow,e.outcomes_from_stance[E.outcome])}let g=ds(p.text,RO);if(g.outcome!==null){let T=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(T.id,g.outcome,"default_failure_stance"),Y(t,r,n,g.outcome),{kind:"escalate",token:g.outcome,reason:`failure_stance:${g.outcome}`}}let _=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(_.id,"approve","no_reviewers"),Y(t,r,n,"approve"),e.write_back_durable_memory){let T=t.membersByAlias.get(e.coder.alias);T!==void 0&&await Dt(t,n,T,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}let h=await Promise.all(i.map(g=>pn(t,`${n}:reviewer_${g.alias}[${f}]`,g,`CODER OUTPUT:
1543
1531
  ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));if(h.every(g=>g.outcome==="approve")){let g=X(t,{run_id:t.run_id,state_name:n});if(t.steps_executed+=1,t.dal.finishStep(g.id,"approve",`loop=${f}`),Y(t,r,n,"approve"),e.write_back_durable_memory){let _=t.membersByAlias.get(e.coder.alias);_!==void 0&&await Dt(t,n,_,e.write_back_durable_memory)}return K(t.workflow,e.outcomes.approve)}if(a=h.filter(g=>g.outcome==="request_changes").map(g=>g.text).join(`
1544
1532
 
1545
- `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var RO,Ng,xg=b(()=>{"use strict";wu();We();RO=["blocked","failed","aborted"],Ng={description:{displayName:"Review",name:"review",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],emits_progress:!0,builtin:!0},execute:async t=>OO(t,t.state)}});import{spawnSync as LO}from"node:child_process";async function CO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=Su(t,n),i=rg(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=LO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Tu(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),K(t.workflow,p))}var $g,jg=b(()=>{"use strict";We();$g={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async t=>CO(t,t.state)}});async function MO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=Ce(o.definition),a=await DO(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};Y(t,r,n,PO(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:ee(t.workflow)}:K(t.workflow,u)}async function DO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await K_(s,t);r[n]=o===s?await Oi(s,t):o}return r}function PO(t,e,r){let n={};for(let s of r)n[s.name]=FO(t,e,s);return n}function FO(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=UO(s,r.source_field);if(o.found)return o.value;let a=t.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 UO(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var Ag,Rg=b(()=>{"use strict";dn();We();fs();Ag={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>MO(t,t.state)}});function WO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var Og,Lg=b(()=>{"use strict";We();Og={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:t=>WO(t,t.state)}});async function BO(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=qO(t.cursor),a=o.filter(HO).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function qO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HO(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var Cg,Mg=b(()=>{"use strict";Cg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async t=>BO(t)}});async function JO(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var Dg,Pg=b(()=>{"use strict";Dg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>JO(t)}});function Fg(t){t.register(sg),t.register(Ng),t.register(lg),t.register(pg),t.register(_g),t.register(Eg),t.register(vg),t.register($g),t.register(ig),t.register(ug),t.register(Ag),t.register(Og),t.register(Dg),t.register(Cg)}var Ug=b(()=>{"use strict";og();ag();cg();fg();hg();gg();Sg();Ig();xg();jg();Rg();Lg();Mg();Pg()});function Fi(){return Pi===null&&(Pi=new vu,Fg(Pi)),Pi}var XO,vu,Pi,Iu=b(()=>{"use strict";Ug();XO={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"},vu=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:XO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Pi=null});async function qg(t){Vg(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=VO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=gs(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=D_(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.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:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(gs(n)){let m=Nu({dal:t.dal,workflow:Wi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:ir(t.job.payload)??{},team_id:t.team.id}),p=await Jg(n,m,i.current_state??n.entry_step_id);return Bg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=Nu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:ir(t.job.payload)??{},team_id:t.team.id}),f=await Hg(d,i.current_state??n.start_at);return Bg(t.dal,r.id,i.id,n.name,f),f}function Bg(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="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===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.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(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.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=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function Nu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await xu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Vg(n);let o=gs(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=Nu({dal:t.dal,workflow:gs(n)?Wi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return gs(n)?Jg(n,a,i.current_state??n.entry_step_id):Hg(a,i.current_state??n.start_at)}};return e}async function Hg(t,e){let r=e;if(r.startsWith(ms))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Pt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=Ui(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}let i,a=Gg(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===Dn)return Pt(t,ul);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await xu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ui(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=Ui(t,ee(t.workflow));return n.kind==="terminal"?Pt(t,n.terminal):Pt(t,ee(t.workflow))}async function Jg(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Gg(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===Dn)return Pt(e,ul);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(e);o=h;continue}let c=await GO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Wi(t,a);try{let p=Ui(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Pt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Ur(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Pt(e,"aborted")}async function GO(t,e,r){let n=Xg(e,r),s=t.workflow;t.workflow=Wi(e,r);try{return await xu(t,r.id,n,r.name)}finally{t.workflow=s}}function Xg(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,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{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function xu(t,e,r,n){let s=Fi().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 o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?zO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(eg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function VO(t,e){try{let r=JSON.parse(t);if(YO(r)&&r.definition_schema_version===3)return yt.parse(r)}catch{return e}return e}function gs(t){return t.definition_schema_version===3}function Wi(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=Xg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:KO(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function KO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zO(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Pt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{O_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Gg(t,e){let n=t.dal.getRun(t.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 o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function Ui(t,e){if(!ZO(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.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&&QO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QO(t,e,r){let n=eL(t),s=r.capture_evidence&&n!==null?tL(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function eL(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function tL(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function Vg(t){if(!Wg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Wg.join(", ")}`)}var Wg,Kg=b(()=>{"use strict";cn();L_();P_();We();Iu();Pn();Wg=[1,2,3]});import{readFileSync as rL,readdirSync as nL}from"node:fs";import{basename as sL,join as oL,resolve as iL}from"node:path";function Zg(t={}){let e=iL(t.workflowsDir??"workflows"),r=nL(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>aL(oL(e,n)))}}function aL(t){let e=sL(t);try{let r=rL(t,"utf8"),n=Ce(r);return tw(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:rw(r)}}}function Qg(t,e){try{let r=Ce(e);return tw(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:rw(r)}}}function ew(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1533
+ `),e.loop_feedback_artifact!==void 0){let g=X(t,{run_id:t.run_id,state_name:`${n}:feedback[${f}]`});t.steps_executed+=1,t.dal.finishStep(g.id,"feedback_captured",`loop=${f}`),t.dal.insertStepArtifact({step_id:g.id,kind:e.loop_feedback_artifact,content:a})}}let u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1,t.dal.finishStep(u.id,"max_loops_exceeded",`loops=${e.max_loops}`),Y(t,r,n,"max_loops_exceeded");let d=e.outcomes.max_loops_exceeded;return d!==void 0?K(t.workflow,d):{kind:"terminal",terminal:ee(t.workflow)}}var RO,xg,Ng=b(()=>{"use strict";yu();We();RO=["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 t=>OO(t,t.state)}});import{spawnSync as LO}from"node:child_process";async function CO(t,e){let r=t.stateId,n=t.displayName,s=await Xe(e.command,t,n),o=Su(t,n),i=rg(s);if(i.matched&&!o){let h=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.insertSessionEvent({run_id:t.run_id,step_id:h.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"side_effect_without_pause",state_id:n,kind:i.kind,command:s,message:`ShellStep ${n} runs a classified side-effect command (${i.kind}) without a preceding approved gate`})}),t.dal.finishStep(h.id,null,`policy_violation:side_effect_without_pause:${i.kind}`),{kind:"terminal",terminal:ee(t.workflow)}}let a=new Date(Date.now()-1),l=typeof e.timeout_ms=="number"&&e.timeout_ms>0,c=LO("sh",["-c",s],{cwd:t.project.local_path,...l?{timeout:e.timeout_ms}:{},encoding:"utf8",env:{...process.env}}),u=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let d=typeof c.stderr=="string"?c.stderr:"",f=c.error;if((d.length>0||f!==void 0)&&t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"shellstep_stderr",timestamp_ms:Date.now(),payload:JSON.stringify({state_id:n,exit_status:c.status,stderr:d,spawn_error:f===void 0?null:f instanceof Error?f.message:String(f),command:s})}),c.status===null)return l?(t.dal.finishStep(u.id,null,`timeout:${e.timeout_ms}ms`),{kind:"terminal",terminal:"shell_step_timeout"}):(t.dal.finishStep(u.id,null,"shell_step_signal_terminated"),{kind:"terminal",terminal:ee(t.workflow)});if(e.writes_to_project_path!==!0&&t.project.local_path.trim().length>0&&Tu(t.project.local_path,a))return t.dal.insertSessionEvent({run_id:t.run_id,step_id:u.id,kind:"policy_violation",timestamp_ms:Date.now(),payload:JSON.stringify({violation:"writes_to_project_path",state_id:n,message:`ShellStep ${n} wrote to project.local_path without writes_to_project_path: true`})}),t.dal.finishStep(u.id,null,"policy_violation:writes_to_project_path"),{kind:"terminal",terminal:ee(t.workflow)};if(e.capture_output_to!==void 0){let h=c.stdout??"";t.dal.insertStepArtifact({step_id:u.id,kind:e.capture_output_to,content:h})}let m=String(c.status),p=e.outcomes_from_exit[m]??e.outcomes_from_exit.default;return p===void 0?(t.dal.insertStepArtifact({step_id:u.id,kind:"unhandled_exit",content:m}),t.dal.finishStep(u.id,null,`shell_step_unhandled_exit:${m}`),{kind:"terminal",terminal:"shell_step_unhandled_exit"}):(t.dal.finishStep(u.id,m,`exit=${c.status}`),Y(t,r,n,m),K(t.workflow,p))}var $g,jg=b(()=>{"use strict";We();$g={description:{displayName:"Shell Step",name:"shell-step",namespace:"lmctl",group:["action"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[],mutates_external_state:!0,builtin:!0},execute:async t=>CO(t,t.state)}});async function MO(t,e){let r=t.stateId,n=t.displayName,s=X(t,{run_id:t.run_id,state_name:n});t.steps_executed+=1;let o=t.dal.getWorkflowByName(e.workflow_name);if(o===null)return t.dal.finishStep(s.id,null,`subflow_missing_workflow:${e.workflow_name}`),{kind:"terminal",terminal:ee(t.workflow)};let i=Ce(o.definition),a=await DO(t,e),l=await t.runChildWorkflow(o,i,a);if(l.paused===!0)return t.dal.finishStep(s.id,null,`subflow_paused:${l.run_id}`),{kind:"paused"};let c=l.terminal_state;if(c===null)return t.dal.finishStep(s.id,null,`subflow_no_terminal:${l.run_id}`),{kind:"terminal",terminal:ee(t.workflow)};Y(t,r,n,PO(t,l.run_id,i.outputs??[])),t.dal.finishStep(s.id,c,`child_run=${l.run_id}`);let u=e.outcomes[c]??e.outcomes.default;return u===void 0?{kind:"terminal",terminal:ee(t.workflow)}:K(t.workflow,u)}async function DO(t,e){let r={};for(let[n,s]of Object.entries(e.inputs??{})){let o=await K_(s,t);r[n]=o===s?await Oi(s,t):o}return r}function PO(t,e,r){let n={};for(let s of r)n[s.name]=FO(t,e,s);return n}function FO(t,e,r){let s=t.dal.query("SELECT * FROM step WHERE run_id = ? AND state_name = ? ORDER BY id DESC LIMIT 1",e,r.source_step_id)[0];if(s===void 0)return null;let o=UO(s,r.source_field);if(o.found)return o.value;let a=t.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 UO(t,e){switch(e){case"id":return{found:!0,value:t.id};case"run_id":return{found:!0,value:t.run_id};case"parent_step_id":return{found:!0,value:t.parent_step_id};case"state_name":return{found:!0,value:t.state_name};case"outcome":return{found:!0,value:t.outcome};case"status_detail":return{found:!0,value:t.status_detail};case"started_at":return{found:!0,value:t.started_at};case"ended_at":return{found:!0,value:t.ended_at};default:return{found:!1}}}var Ag,Rg=b(()=>{"use strict";dn();We();fs();Ag={description:{displayName:"Subflow",name:"subflow",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[{name:"main"}],outputs:[{name:"main"}],properties:[{name:"workflow_name",displayName:"Workflow Name",type:"string",description:"Latest saved workflow name to execute as a child run."}],builtin:!0},execute:async t=>MO(t,t.state)}});function WO(t,e){let r=t.stateId,n=t.displayName,s=e.name??n,o=X(t,{run_id:t.run_id,state_name:n});return t.steps_executed+=1,t.dal.finishStep(o.id,s,e.kind??"neutral"),Y(t,r,n,s),{kind:"terminal",terminal:s}}var Og,Lg=b(()=>{"use strict";We();Og={description:{displayName:"Terminal",name:"terminal",namespace:"lmctl",group:["flow-control"],version:[1],inputs:[],outputs:[],properties:[{name:"kind",displayName:"Kind",type:"options",required:!0,options:[{name:"success",value:"success"},{name:"failure",value:"failure"},{name:"neutral",value:"neutral"}]},{name:"name",displayName:"Name",type:"string",required:!0}],builtin:!0},execute:t=>WO(t,t.state)}});async function BO(t){let e=typeof t.parameters.org=="string"?t.parameters.org:"",r=typeof t.parameters.repo=="string"?t.parameters.repo:"";if(e.length===0||r.length===0)return null;let n=new URL(`https://api.github.com/repos/${e}/${r}/issues`);n.searchParams.set("state","open"),typeof t.parameters.label=="string"&&t.parameters.label.length>0&&n.searchParams.set("labels",t.parameters.label),typeof t.parameters.since=="string"&&t.parameters.since.length>0&&n.searchParams.set("since",t.parameters.since);let s=await fetch(n);if(!s.ok)throw new Error(`github issue trigger failed: HTTP ${s.status}`);let o=await s.json();if(!Array.isArray(o))throw new Error("github issue trigger returned unexpected JSON");let i=qO(t.cursor),a=o.filter(HO).filter(c=>c.id>i);if(a.length===0)return null;let l=Math.max(...a.map(c=>c.id));return{main:a.map(c=>({trigger_id:t.trigger_id,issue_id:c.id,issue_number:c.number,issue_url:c.html_url,title:c.title,cursor:String(l)}))}}function qO(t){if(t===void 0)return 0;let e=Number(t);return Number.isFinite(e)?e:0}function HO(t){if(t===null||typeof t!="object"||Array.isArray(t))return!1;let e=t;return typeof e.id=="number"&&typeof e.number=="number"&&typeof e.html_url=="string"&&typeof e.title=="string"}var Cg,Mg=b(()=>{"use strict";Cg={description:{displayName:"GitHub Issue Trigger",name:"trigger-gh-issue",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"org",displayName:"Org",type:"string",required:!0},{name:"repo",displayName:"Repo",type:"string",required:!0},{name:"label",displayName:"Label",type:"string"}],requires_credentials:["github"],builtin:!0},poll:async t=>BO(t)}});async function JO(t){let e=typeof t.parameters.cron=="string"?t.parameters.cron.trim():"";if(e.length===0)return null;let r=new Date(Date.now()).toISOString().slice(0,16);return t.cursor===r?null:{main:[{trigger_id:t.trigger_id,fired_at:new Date(Date.now()).toISOString(),cursor:r,cron:e}]}}var Dg,Pg=b(()=>{"use strict";Dg={description:{displayName:"Schedule Trigger",name:"trigger-schedule",namespace:"lmctl",group:["trigger"],version:[1],inputs:[],outputs:[{name:"main"}],properties:[{name:"cron",displayName:"Cron",type:"string",required:!0}],builtin:!0},poll:async t=>JO(t)}});function Fg(t){t.register(sg),t.register(xg),t.register(lg),t.register(pg),t.register(_g),t.register(Eg),t.register(vg),t.register($g),t.register(ig),t.register(ug),t.register(Ag),t.register(Og),t.register(Dg),t.register(Cg)}var Ug=b(()=>{"use strict";og();ag();cg();fg();hg();gg();Sg();Ig();Ng();jg();Rg();Lg();Mg();Pg()});function Fi(){return Pi===null&&(Pi=new vu,Fg(Pi)),Pi}var XO,vu,Pi,Iu=b(()=>{"use strict";Ug();XO={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"},vu=class{types=new Map;register(e){let r=`${e.description.namespace}/${e.description.name}`;if(this.types.has(r))throw new Error(`archetype already registered: ${r}`);this.types.set(r,e)}get(e){let r=e.includes("/")?e:XO[e];return r?this.types.get(r):void 0}list(){return Array.from(this.types.values())}},Pi=null});async function qg(t){Vg(t.workflow);let e=t.workflowRow??t.dal.getWorkflowByName(t.workflow.name,t.workflow.version);if(e===null)throw new Error(`workflow ${t.workflow.name}@${t.workflow.version} is not registered`);let r=t.dal.getProjectByJob(t.job.id);if(r===null)throw new Error(`job ${t.job.id} has no project`);let n=VO(e.definition,t.workflow),s=t.job.run_id===null?null:t.dal.getRun(t.job.run_id),o=gs(n)?n.entry_step_id:n.start_at,i=s?.terminal_state===null?s:t.dal.insertRun({job_id:t.job.id,workflow_id:e.id,team_id:t.team.id,current_state:o}),a=n.requires,l=D_(a);if(l!==null)return t.dal.setRunTerminalState(i.id,"aborted"),t.dal.raiseAttention({kind:"missing_workflow_dependency",severity:"error",project_id:r.id,run_id:i.id,payload:JSON.stringify({run_id:i.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:i.id,terminal_state:"aborted",steps_executed:0};let c=new Map(t.members.map(m=>[m.alias,m]));if(gs(n)){let m=xu({dal:t.dal,workflow:Wi(n),job:t.job,project:r,run:i,membersByAlias:c,outcomes:s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},inputs:ir(t.job.payload)??{},team_id:t.team.id}),p=await Jg(n,m,i.current_state??n.entry_step_id);return Bg(t.dal,r.id,i.id,n.name,p),p}let u=s!==null&&i===s?t.dal.listLatestStepOutcomesByState(i.id):{},d=xu({dal:t.dal,workflow:n,job:t.job,project:r,run:i,membersByAlias:c,outcomes:u,inputs:ir(t.job.payload)??{},team_id:t.team.id}),f=await Hg(d,i.current_state??n.start_at);return Bg(t.dal,r.id,i.id,n.name,f),f}function Bg(t,e,r,n,s){if(s.paused===!0)return;let o=s.terminal_state;if(o===null)return;let i="unknown",a=!1;try{let u=t.getRun(r);if(u!==null){let d=t.getWorkflow(u.workflow_id);if(d!==null){let f=JSON.parse(d.definition),p=(f.terminals??{})[o];if(p!==void 0&&typeof p.kind=="string"&&(p.kind==="success"||p.kind==="failure"||p.kind==="neutral")&&(i=p.kind),i==="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===o&&(_.kind==="success"||_.kind==="failure"||_.kind==="neutral")){i=_.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(i==="success"||i==="failure"&&a)return;let l=null;try{l=t.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=i==="failure"?"workflow_failed":"workflow_has_issues";t.raiseAttention({kind:c,severity:i==="failure"?"error":"warn",project_id:e,run_id:r,payload:JSON.stringify({run_id:r,workflow_name:n,terminal_state:o,terminal_kind:i,last_error:l})})}function xu(t){let e={dal:t.dal,workflow:t.workflow,job:t.job,project:t.project,run_id:t.run.id,membersByAlias:t.membersByAlias,inputs:t.inputs,outcomes:t.outcomes,transcripts:{},progress_step_id:null,steps_executed:0,last_state_id:null,errors_block_fired:!1,iteration:null,parent_step_id:null,dispatchState:async(r,n,s)=>{let o=e.parent_step_id,i=e.iteration;e.parent_step_id=s?.parent_step_id??o,e.iteration=s?.iteration??i;try{return await Nu(e,r,n,s?.display_name??r)}finally{e.parent_step_id=o,e.iteration=i}},runChildWorkflow:async(r,n,s)=>{Vg(n);let o=gs(n)?n.entry_step_id:n.start_at,i=t.dal.insertRun({job_id:t.job.id,workflow_id:r.id,team_id:t.team_id,current_state:o,parent_run_id:e.run_id}),a=xu({dal:t.dal,workflow:gs(n)?Wi(n):n,job:t.job,project:t.project,run:i,membersByAlias:t.membersByAlias,outcomes:{},inputs:s,team_id:t.team_id});return gs(n)?Jg(n,a,i.current_state??n.entry_step_id):Hg(a,i.current_state??n.start_at)}};return e}async function Hg(t,e){let r=e;if(r.startsWith(ms))return{run_id:t.run_id,terminal_state:null,steps_executed:0,paused:!0};for(let s=0;s<1e3;s+=1){if(r.startsWith("@terminal:"))return Pt(t,r.slice(10));t.dal.setRunCurrentState(t.run_id,r),t.last_state_id=r;let o=t.workflow.states[r];if(o===void 0){let l=Ui(t,ee(t.workflow));if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:"unknown"},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}let i,a=Gg(t,r);if(a!==null){let l=X(t,{run_id:t.run_id,state_name:r});if(t.steps_executed+=1,t.dal.finishStep(l.id,a,"escalation_resume"),Y(t,r,r,a),a===Dn)return Pt(t,ul);let c=o.outcomes?.[a];i=c!==void 0?K(t.workflow,c):tt(t,{id:r,name:r,type:o.type},a,`no declared edge for resumed outcome '${a}' from state '${r}'`)}else i=await Nu(t,r,o);if(i.kind==="paused")return Me(t);if(i.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},i.token,i.reason),Me(t);if(i.kind==="terminal"){let l=Ui(t,i.terminal);if(l.kind==="paused")return Me(t);if(l.kind==="escalate")return tt(t,{id:r,name:r,type:o.type},l.token,l.reason),Me(t);if(l.kind==="terminal")return Pt(t,l.terminal);r=l.state;continue}r=i.state}t.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id})});let n=Ui(t,ee(t.workflow));return n.kind==="terminal"?Pt(t,n.terminal):Pt(t,ee(t.workflow))}async function Jg(t,e,r){let n=new Map(t.steps.map(i=>[i.id,i])),s=new Map(t.steps.map(i=>[i.name,i])),o=r;for(let i=0;i<1e3;i+=1){e.dal.setRunCurrentState(e.run_id,o);let a=n.get(o);if(a===void 0)return tt(e,{id:o,name:o,type:"unknown"},"",`internal:unknown v3 step '${o}'`),Me(e);let l=Gg(e,a.id);if(l!==null){let m=X(e,{run_id:e.run_id,state_name:a.name});if(e.steps_executed+=1,e.dal.finishStep(m.id,l,"escalation_resume"),Y(e,a.id,a.name,l),l===Dn)return Pt(e,ul);let p=Object.keys(t.connections[a.id]??{}),h=t.connections[a.id]?.[l]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},l,`no declared edge for resumed outcome '${l}' from step '${a.id}'`,{declared_outcomes:p}),Me(e);o=h;continue}let c=await GO(e,t,a);if(c.kind==="paused")return Me(e);let u=Object.keys(t.connections[a.id]??{});if(c.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},c.token,c.reason,{declared_outcomes:u}),Me(e);let d=c.kind==="terminal"?c.terminal:c.state;if(a.type==="lmctl/terminal"){let m=e.workflow;e.workflow=Wi(t,a);try{let p=Ui(e,d);if(p.kind==="paused")return Me(e);if(p.kind==="escalate")return tt(e,{id:a.id,name:a.name,type:a.type},p.token,p.reason),Me(e);if(p.kind==="terminal")return Pt(e,p.terminal);let h=s.get(p.state);if(h===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},"",`internal:unknown v3 error handler step '${p.state}'`),Me(e);o=h.id;continue}finally{e.workflow=m}}if(Ur(d))return tt(e,{id:a.id,name:a.name,type:a.type},d,`generic escalation '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);let f=t.connections[a.id]?.[d]?.[0]?.[0]?.step_id??t.connections[a.id]?.main?.[0]?.[0]?.step_id;if(f===void 0)return tt(e,{id:a.id,name:a.name,type:a.type},d,`no declared edge for outcome '${d}' from step '${a.id}'`,{declared_outcomes:u}),Me(e);o=f}return e.dal.raiseAttention({kind:"engine_step_limit_exceeded",severity:"error",project_id:e.project.id,run_id:e.run_id,payload:JSON.stringify({run_id:e.run_id})}),Pt(e,"aborted")}async function GO(t,e,r){let n=Xg(e,r),s=t.workflow;t.workflow=Wi(e,r);try{return await Nu(t,r.id,n,r.name)}finally{t.workflow=s}}function Xg(t,e){let r=e.parameters,n=e.members??{},s=Object.keys(t.connections[e.id]??{}),o=Object.fromEntries(s.map(a=>[a,`@terminal:${a}`])),i={state_name:e.name};switch(e.type){case"lmctl/review":{let a=s.filter(l=>!["approve","request_changes","fail_pre_check","max_loops_exceeded"].includes(l));return{...i,type:"Review",...r,coder:n.coder,reviewers:n.reviewers,outcomes:{approve:o.approve??"@terminal:approve",...o.request_changes!==void 0?{request_changes:o.request_changes}:{},...o.fail_pre_check!==void 0?{fail_pre_check:o.fail_pre_check}:{},...o.max_loops_exceeded!==void 0?{max_loops_exceeded:o.max_loops_exceeded}:{}},...a.length>0?{outcomes_from_stance:Object.fromEntries(a.map(l=>[l,`@terminal:${l}`]))}:{}}}case"lmctl/consolidate":return{...i,type:"Consolidate",...r,researchers:n.researchers,consolidator:n.consolidator,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/interactive":return{...i,type:"Interactive",...r,agent:n.agent,outcomes:{done:o.done??"@terminal:done",...o.timeout!==void 0?{timeout:o.timeout}:{}}};case"lmctl/loop":return{...i,type:"Loop",...r,outcomes:{ok:o.ok??"@terminal:ok",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-docx":return{...i,type:"lmctl/render-docx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/render-xlsx":return{...i,type:"lmctl/render-xlsx",...r,outcomes:{done:o.done??"@terminal:done",...o.error!==void 0?{error:o.error}:{}}};case"lmctl/shell-step":return{...i,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{...i,type:"AssertRepoClean",...r,next:o.main??"@terminal:main"};case"lmctl/choice":return{...i,type:"Choice",...r};case"lmctl/foreach":return{...i,type:"ForEach",...r,outcomes:{all_ok:o.all_ok??"@terminal:all_ok",...o.any_failed!==void 0?{any_failed:o.any_failed}:{}}};case"lmctl/subflow":return{...i,type:"Subflow",...r,outcomes:o};case"lmctl/terminal":return{...i,type:"Terminal",name:r.name,kind:r.kind};default:return{...i,type:e.type,...r}}}async function Nu(t,e,r,n){let s=Fi().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 o=t.emit_progress,i=t.progress_step_id;t.emit_progress=s.description.emits_progress===!0?zO(t,s):void 0,t.progress_step_id=null;try{return await s.execute(eg(t,e,r,n??e))}finally{t.emit_progress=o,t.progress_step_id=i}}function VO(t,e){try{let r=JSON.parse(t);if(YO(r)&&r.definition_schema_version===3)return wt.parse(r)}catch{return e}return e}function gs(t){return t.definition_schema_version===3}function Wi(t,e){let r=e===void 0?[]:Object.keys(t.connections[e.id]??{}),n=Object.fromEntries(r.map(o=>[o,{kind:o==="aborted"?"failure":"neutral"}])),s={};if(e?.type==="lmctl/loop"&&typeof e.parameters.body=="string"){let o=t.steps.find(i=>i.name===e.parameters.body);o!==void 0&&(s[e.parameters.body]=Xg(t,o))}return e?.type==="lmctl/terminal"&&typeof e.parameters.name=="string"&&(n[e.parameters.name]={kind:KO(e.parameters.kind)}),n.aborted??={kind:"failure"},{name:t.name,version:t.version,definition_schema_version:2,primitive_version:2,start_at:e?.name??t.entry_step_id,states:s,terminals:n,...t.default_task_timeout_ms!==void 0?{default_task_timeout_ms:t.default_task_timeout_ms}:{},...t.concurrency_key!==void 0?{concurrency_key:t.concurrency_key}:{},...t.concurrent_limit!==void 0?{concurrent_limit:t.concurrent_limit}:{},...t.errors!==void 0?{errors:t.errors}:{}}}function KO(t){return t==="success"||t==="failure"||t==="neutral"?t:"neutral"}function YO(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function zO(t,e){let r=`progress.${e.description.namespace}/${e.description.name}`;return n=>{try{if(typeof n.kind!="string"||n.kind.length===0)return;t.dal.insertSessionEvent({run_id:t.run_id,step_id:t.progress_step_id,kind:`${r}.${n.kind}`,timestamp_ms:Date.now(),payload:JSON.stringify({message:n.message,data:n.data})})}catch(s){let o=s instanceof Error?s.message:String(s);console.warn(`[progress] dropped ${r} event: ${o}`)}}}function Pt(t,e){t.dal.setRunTerminalState(t.run_id,e);try{O_(t.run_id,t.dal)}catch{}return{run_id:t.run_id,terminal_state:e,steps_executed:t.steps_executed}}function Me(t){return{run_id:t.run_id,terminal_state:null,steps_executed:t.steps_executed,paused:!0}}function Gg(t,e){let n=t.dal.getRun(t.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 o=s[e];if(typeof o!="string")return null;delete s[e];let i=Object.keys(s).length>0?JSON.stringify(s):null;return t.dal.setRunPendingEscalationDecision(t.run_id,i),o}function Ui(t,e){if(!ZO(t.workflow,e)||t.errors_block_fired)return{kind:"terminal",terminal:e};let r=t.workflow.errors;return r===void 0?{kind:"terminal",terminal:e}:(t.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&&QO(t,e,r.on_unhandled_failure),{kind:"terminal",terminal:e}))}function ZO(t,e){return t.definition_schema_version===2&&t.terminals[e]?.kind==="failure"}function QO(t,e,r){let n=eL(t),s=r.capture_evidence&&n!==null?tL(t,n.id):[];t.dal.raiseAttention({kind:r.attention_kind,severity:r.severity,project_id:t.project.id,run_id:t.run_id,payload:JSON.stringify({run_id:t.run_id,terminal_state:e,current_state:t.last_state_id,last_step_id:n?.id??null,last_error:n?.status_detail??null,evidence_paths:s,recommend_recovery:r.recommend_recovery??null})})}function eL(t){return t.dal.query("SELECT id, state_name, outcome, status_detail FROM step WHERE run_id = ? ORDER BY id DESC LIMIT 1",t.run_id)[0]??null}function tL(t,e){return t.dal.query("SELECT path FROM step_artifact WHERE step_id = ? AND path IS NOT NULL ORDER BY id DESC",e).map(n=>n.path)}function Vg(t){if(!Wg.includes(t.definition_schema_version))throw new Error(`unsupported definition_schema_version ${t.definition_schema_version}; supported versions: ${Wg.join(", ")}`)}var Wg,Kg=b(()=>{"use strict";cn();L_();P_();We();Iu();Pn();Wg=[1,2,3]});import{readFileSync as rL,readdirSync as nL}from"node:fs";import{basename as sL,join as oL,resolve as iL}from"node:path";function Zg(t={}){let e=iL(t.workflowsDir??"workflows"),r=nL(e).filter(n=>n.endsWith(".compound.json")).sort((n,s)=>n.localeCompare(s));return{generated_at:new Date().toISOString(),workflows_dir:e,rows:r.map(n=>aL(oL(e,n)))}}function aL(t){let e=sL(t);try{let r=rL(t,"utf8"),n=Ce(r);return ty(e,n)}catch(r){return{file:e,workflow_name:null,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:ry(r)}}}function Qg(t,e){try{let r=Ce(e);return ty(t,r)}catch(r){return{file:t,workflow_name:t,status:"FAIL",first_step_id:null,first_step_type:null,first_step_disposition:null,note:ry(r)}}}function ey(t){let e=[];e.push(`workflow verification - ${t.generated_at}`),e.push(`dir: ${t.workflows_dir}`),e.push(""),e.push(`${"status".padEnd(17)} ${"workflow".padEnd(36)} ${"first step".padEnd(52)} note`),e.push(`${"-".repeat(17)} ${"-".repeat(36)} ${"-".repeat(52)} ${"-".repeat(30)}`);for(let o of t.rows){let i=(o.workflow_name??o.file).slice(0,36).padEnd(36),a=`${o.first_step_id??"-"}${o.first_step_type===null?"":` (${o.first_step_type})`}`;e.push(`${o.status.padEnd(17)} ${i} ${a.slice(0,52).padEnd(52)} ${o.note}`)}let r=t.rows.filter(o=>o.status==="PASS").length,n=t.rows.filter(o=>o.status==="PASS_NEEDS_INPUTS").length,s=t.rows.filter(o=>o.status==="FAIL").length;return e.push(""),e.push(`summary: ${r} pass, ${n} pass_needs_inputs, ${s} fail`),`${e.join(`
1546
1534
  `)}
1547
- `}function tw(t,e){let r=cL(e),n=uL(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=lL(e.inputs);return s.length>0?{file:t,workflow_name:e.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:t,workflow_name:e.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 lL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cL(t){return $u(t)?t.entry_step_id:t.start_at}function uL(t){return $u(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function $u(t){return t.definition_schema_version===3}function rw(t){return t instanceof Mt?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function nw(t){let e=new Set;if($u(t))for(let r of t.steps){let n=r.members??{};Yg(n,e)}else for(let r of Object.values(t.states))Yg(r,e);return[...e].sort()}function Yg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=zg(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=zg(i);a!==null&&e.add(a)}}}function zg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Bi=b(()=>{"use strict";dn()});function dL({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,qi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=fL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ws}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:qi,source_ref:ws,payload:JSON.stringify({kind:ws,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function fL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1535
+ `}function ty(t,e){let r=cL(e),n=uL(e);if(r===null||n===null)return{file:t,workflow_name:e.name,status:"FAIL",first_step_id:r,first_step_type:n,first_step_disposition:null,note:"entry step missing after validation"};let s=lL(e.inputs);return s.length>0?{file:t,workflow_name:e.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:t,workflow_name:e.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 lL(t){return(t??[]).filter(e=>e.required===!0&&e.default===void 0).map(e=>e.name)}function cL(t){return $u(t)?t.entry_step_id:t.start_at}function uL(t){return $u(t)?t.steps.find(e=>e.id===t.entry_step_id)?.type??null:t.states[t.start_at]?.type??null}function $u(t){return t.definition_schema_version===3}function ry(t){return t instanceof Mt?t.issues.map(e=>`${e.path}: ${e.message}`).join("; "):t instanceof SyntaxError?`JSON parse failed: ${t.message}`:t instanceof Error?t.message:String(t)}function ny(t){let e=new Set;if($u(t))for(let r of t.steps){let n=r.members??{};Yg(n,e)}else for(let r of Object.values(t.states))Yg(r,e);return[...e].sort()}function Yg(t,e){let r=["coder","agent","consolidator"],n=["reviewers","researchers"];for(let s of r){let o=t[s],i=zg(o);i!==null&&e.add(i)}for(let s of n){let o=t[s];if(Array.isArray(o))for(let i of o){let a=zg(i);a!==null&&e.add(a)}}}function zg(t){if(t===null||typeof t!="object")return null;let e=t.alias;return typeof e=="string"&&e.length>0?e:null}var Bi=b(()=>{"use strict";dn()});function dL({dal:t}){let e=t.listProjects();for(let r of e){let s=t.query("SELECT * FROM job WHERE project_id = ? AND source = ? ORDER BY id DESC LIMIT 1",r.id,qi)[0]??null;if(s!==null&&(s.status==="queued"||s.status==="running"))continue;let i=(s?.payload?JSON.parse(s.payload):null)?.max_run_id??null,{count:a,maxRunId:l}=fL(t,r,i);if(a<20)continue;let c=i??"initial",u=`${ys}:${r.id}:${c}`;t.enqueueJob({project_id:r.id,source:qi,source_ref:ys,payload:JSON.stringify({kind:ys,project_id:r.id,completed_sessions:a,max_run_id:l,since_run_id:i}),dedupe_key:u})}}function fL(t,e,r){let n=t.query(`SELECT COUNT(*) AS cnt, MAX(r.id) AS max_id
1548
1536
  FROM run r
1549
1537
  JOIN job j ON j.id = r.job_id
1550
1538
  WHERE j.project_id = ?
1551
1539
  AND r.terminal_state IS NOT NULL
1552
- ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function sw(t){for(let e of mL)try{e(t)}catch{}}var qi,ws,mL,ju=b(()=>{"use strict";qi="memory_policy",ws="memory_consolidation_request";mL=[dL]});var uw={};ce(uw,{getOrInsertConsolidationWorkflow:()=>iw,runJobById:()=>ys,runOnce:()=>Rr,startWorker:()=>wL});import{createHash as pL}from"node:crypto";import{readFileSync as hL}from"node:fs";import{pathToFileURL as _L}from"node:url";function iw(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{ti({swallow:!0});let n=ri(e);if(n===null)return null;let s=hL(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:_L(n).href,source_sha256:pL("sha256").update(s).digest("hex")})}catch{return null}}async function Rr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??ow,evaluator:n=>lw(t.dal,n)}),r===null?null:await aw(t.dal,r,e)}catch(n){if(r!==null)return cr(t.dal,r,"worker_run_failed",Ar(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n))})})}catch{}return null}finally{t.max_concurrent}}async function ys(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??ow,evaluator:s=>lw(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await aw(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...cr(t.dal,r,"worker_run_failed",Ar(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function aw(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return cr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===qi&&e.source_ref===ws,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=iw(t):i=cw(t,e,n),i===null)return cr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return cr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return cr(t,e,"worker_workflow_invalid",Ar(d),r,n)}let u=yL(c,l);if(u.length>0)return cr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await qg({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return cr(t,e,"worker_run_failed",Ar(d),r,n,a)}}function lw(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=cw(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Ce(n.definition)}catch{s=null}return Si({workflow:s,job:e,project:r})}function cw(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function wL(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Rr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Hi(Ar(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??gL))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function cr(t,e,r,n,s,o,i){let a=Hi(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Ar(t){return t instanceof Error?t.message:String(t)}function Hi(t){return t.length>4096?t.slice(0,4096):t}function yL(t,e){let r=nw(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var ow,gL,Es=b(()=>{"use strict";ni();Kg();dn();Bi();Qc();ju();ow=6e5,gL=5e3});import{existsSync as EL,readFileSync as bL}from"node:fs";import{marked as SL}from"marked";function pw(t,e){t.get("/layman",r=>r.html(Ae("Layman Home",TL(e.dal)))),t.get("/api/layman",r=>r.json(ww(e.dal))),t.get("/layman/start/:workflow",r=>{let n=mw(r);return n===null?r.notFound():r.html(Ae(`Start ${gn(n)}`,IL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=mw(r);return n===null?r.notFound():n==="newspaper"?dw(r,e.dal):NL(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,jL(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.json(WL(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>RL(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",FL(e.dal)))),t.post("/layman/newspaper",r=>dw(r,e.dal)),t.delete("/layman/newspaper/:id",r=>fw(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>fw(r,e.dal))}function TL(t){let e=ww(t);return`<section class="layman-home">
1540
+ ${r!==null?"AND r.id > ?":""}`,...r!==null?[e.id,r]:[e.id]);return{count:n[0]?.cnt??0,maxRunId:n[0]?.max_id??0}}function sy(t){for(let e of mL)try{e(t)}catch{}}var qi,ys,mL,ju=b(()=>{"use strict";qi="memory_policy",ys="memory_consolidation_request";mL=[dL]});var uy={};ce(uy,{getOrInsertConsolidationWorkflow:()=>iy,runJobById:()=>ws,runOnce:()=>Rr,startWorker:()=>yL});import{createHash as pL}from"node:crypto";import{readFileSync as hL}from"node:fs";import{pathToFileURL as _L}from"node:url";function iy(t,e="durable-memory-consolidation-v2"){let r=t.getWorkflowByName(e);if(r!==null)return r;try{ti({swallow:!0});let n=ri(e);if(n===null)return null;let s=hL(n,"utf8"),o=Ce(s);return t.insertWorkflow({name:e,version:o.version,definition_schema_version:o.definition_schema_version,definition:s,source_uri:_L(n).href,source_sha256:pL("sha256").update(s).digest("hex")})}catch{return null}}async function Rr(t){let e=Date.now(),r=null;try{return r=t.dal.claimNextJobWithConcurrency({worker_id:t.worker_id,lease_ms:t.lease_ms??oy,evaluator:n=>ly(t.dal,n)}),r===null?null:await ay(t.dal,r,e)}catch(n){if(r!==null)return cr(t.dal,r,"worker_run_failed",Ar(n),e);try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n))})})}catch{}return null}finally{t.max_concurrent}}async function ws(t){let e=Date.now(),r=null;try{let n=t.dal.claimJobByIdWithConcurrency({job_id:t.job_id,worker_id:t.worker_id,lease_ms:t.lease_ms??oy,evaluator:s=>ly(t.dal,s)});return n.claimed?(r=n.job,{claimed:!0,...await ay(t.dal,r,e)}):n}catch(n){if(r!==null)return{claimed:!0,...cr(t.dal,r,"worker_run_failed",Ar(n),e)};try{t.dal.raiseAttention({kind:"worker_run_failed",severity:"error",payload:JSON.stringify({error:Hi(Ar(n)),job_id:t.job_id})})}catch{}return{claimed:!1,reason:"not_claimable",job_id:t.job_id}}finally{t.max_concurrent}}async function ay(t,e,r){let n=t.getProjectByJob(e.id);if(n===null)return cr(t,e,"worker_project_missing","project_not_found",r);let s=e.source===qi&&e.source_ref===ys,o=e.run_id===null?null:t.getRun(e.run_id),i;if(o!==null?i=t.getWorkflow(o.workflow_id):s?i=iy(t):i=cy(t,e,n),i===null)return cr(t,e,"worker_workflow_missing","workflow_not_found",r,n);let a=t.getTeam(o?.team_id??n.team_id),l=a===null?[]:t.listTeamMembers(a.id);if(a===null||l.length===0)return cr(t,e,"worker_team_missing","team_not_found",r,n);let c;try{c=Ce(i.definition)}catch(d){return cr(t,e,"worker_workflow_invalid",Ar(d),r,n)}let u=wL(c,l);if(u.length>0)return cr(t,e,"worker_team_missing_aliases",`missing_aliases:${u.join(",")}`,r,n,a);try{let d=await qg({dal:t,job:e,workflow:c,team:a,members:l,workflowRow:i});return t.setJobRun(e.id,d.run_id),d.paused===!0?{job_id:e.id,run_id:d.run_id,status:"paused",terminal_state:null,ms:Date.now()-r}:(t.releaseJob(e.id,"done",null),{job_id:e.id,run_id:d.run_id,status:"done",terminal_state:d.terminal_state,ms:Date.now()-r})}catch(d){return cr(t,e,"worker_run_failed",Ar(d),r,n,a)}}function ly(t,e){let r=t.getProjectByJob(e.id);if(r===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let n=cy(t,e,r);if(n===null)return{concurrency_key:e.concurrency_key_resolved,concurrent_limit:1};let s=null;try{s=Ce(n.definition)}catch{s=null}return Si({workflow:s,job:e,project:r})}function cy(t,e,r){return e.workflow_id_override!==null?t.getWorkflow(e.workflow_id_override):t.getWorkflowByName(r.workflow_name)}async function yL(t){let e=!1,r=null,n=Promise.resolve(),s=async()=>{if(!e){try{let o;do o=await Rr(t);while(!e&&o!==null)}catch(o){try{t.dal.raiseAttention({kind:"worker_loop_error",severity:"error",payload:JSON.stringify({error:Hi(Ar(o))})})}catch{}}e||(r=setTimeout(()=>{n=s()},t.poll_interval_ms??gL))}};return n=s(),{stop:async()=>{e=!0,r!==null&&clearTimeout(r),await n.catch(()=>{})}}}function cr(t,e,r,n,s,o,i){let a=Hi(n);return t.releaseJob(e.id,"failed",a),t.raiseAttention({kind:r,severity:"error",project_id:o?.id??e.project_id,payload:JSON.stringify({job_id:e.id,team_id:i?.id??null,error:a})}),{job_id:e.id,run_id:null,status:"failed",terminal_state:null,ms:Date.now()-s}}function Ar(t){return t instanceof Error?t.message:String(t)}function Hi(t){return t.length>4096?t.slice(0,4096):t}function wL(t,e){let r=ny(t);if(r.length===0)return[];let n=new Set(e.map(s=>s.alias));return r.filter(s=>!n.has(s))}var oy,gL,Es=b(()=>{"use strict";ni();Kg();dn();Bi();Qc();ju();oy=6e5,gL=5e3});import{existsSync as EL,readFileSync as bL}from"node:fs";import{marked as SL}from"marked";function py(t,e){t.get("/layman",r=>r.html(Ae("Layman Home",TL(e.dal)))),t.get("/api/layman",r=>r.json(yy(e.dal))),t.get("/layman/start/:workflow",r=>{let n=my(r);return n===null?r.notFound():r.html(Ae(`Start ${gn(n)}`,IL(e.dal,n)))}),t.post("/layman/start/:workflow",async r=>{let n=my(r);return n===null?r.notFound():n==="newspaper"?dy(r,e.dal):xL(r,e.dal,n)}),t.get("/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.html(Ae(`Run ${n.id}`,jL(e.dal,n)))}),t.get("/api/layman/run/:id",r=>{let n=vr(e.dal,Ji(r,"id"));return n===null?r.notFound():r.json(WL(e.dal,n))}),t.post("/layman/run/:id/respond",async r=>RL(r,e.dal)),t.get("/layman/newspaper",r=>r.html(Ae("Newspaper Subscriptions",FL(e.dal)))),t.post("/layman/newspaper",r=>dy(r,e.dal)),t.delete("/layman/newspaper/:id",r=>fy(r,e.dal)),t.post("/layman/newspaper/:id/delete",r=>fy(r,e.dal))}function TL(t){let e=yy(t);return`<section class="layman-home">
1553
1541
  <h1>Welcome</h1>
1554
1542
  <p class="muted">Choose a workflow and answer a few plain-language prompts.</p>
1555
1543
  <div class="grid">${Xi.map(kL).join("")}</div>
@@ -1564,7 +1552,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1564
1552
  <h2>${S(t.title)}</h2>
1565
1553
  <p>${S(t.description)}</p>
1566
1554
  <p><a href="/layman/start/${encodeURIComponent(t.name)}">Start</a></p>
1567
- </article>`}function vL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${S(e.id)}</a>`,S(gn(e.workflow_name)),S(e.terminal_state??e.current_state??"queued"),S(e.started_at)]))}function IL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${S(gn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${S(gn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=hw(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1555
+ </article>`}function vL(t){return fe(["run","workflow","state","started"],t.map(e=>[`<a href="/layman/run/${e.id}">${S(e.id)}</a>`,S(gn(e.workflow_name)),S(e.terminal_state??e.current_state??"queued"),S(e.started_at)]))}function IL(t,e){let r=t.getWorkflowByName(e),n=t.listProjects();if(r===null)return`<h1>${S(gn(e))}</h1><p class="error">This workflow has not been loaded yet.</p>`;if(n.length===0)return`<h1>${S(gn(e))}</h1><p class="error">Create a project before starting a workflow.</p>`;let s=hy(n);return e==="info-qa"?`<h1>Ask a Question</h1>
1568
1556
  <form method="post" action="/layman/start/info-qa">
1569
1557
  ${s}
1570
1558
  <label>Ask anything<textarea name="question" rows="8" required></textarea></label>
@@ -1577,12 +1565,12 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1577
1565
  <label>Slug<input name="slug" placeholder="my-document" required></label>
1578
1566
  <label>Output directory<input name="output_dir" value="drafts"></label>
1579
1567
  <button type="submit">Start Document Wizard</button>
1580
- </form>`:gw(n,"/layman/start/newspaper")}function hw(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function NL(t,e,r){let n=await t.req.parseBody(),s=bw(e,n);if(s===null)return t.html(Ae("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Ae("Start workflow",`<p class="error">${S(gn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?xL(n):$L(n);if(typeof i=="string")return t.html(Ae("Start workflow",`<p class="error">${S(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Rr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function xL(t){let e=Ge(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ge(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function $L(t){let e=Ge(t.task_description).trim(),r=VL(Ge(t.slug).trim()),n=Ge(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function jL(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${S(gn(r))}</h1>
1581
- <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${LL(t,e,r)}`;let s=Ew(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${AL(e,s)}`:`${n}<section hx-get="/layman/run/${S(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1568
+ </form>`:gy(n,"/layman/start/newspaper")}function hy(t){return`<label>Project<select name="project_id" required>${t.map(e=>`<option value="${S(e.id)}">${S(e.name)}</option>`).join("")}</select></label>`}async function xL(t,e,r){let n=await t.req.parseBody(),s=by(e,n);if(s===null)return t.html(Ae("Start workflow",'<p class="error">Choose a valid project.</p>'),400);let o=e.getWorkflowByName(r);if(o===null)return t.html(Ae("Start workflow",`<p class="error">${S(gn(r))} is not loaded.</p>`),400);let i=r==="info-qa"?NL(n):$L(n);if(typeof i=="string")return t.html(Ae("Start workflow",`<p class="error">${S(i)}</p>`),400);let a=e.enqueueJob({project_id:s.id,workflow_id_override:o.id,source:"layman",source_ref:r,dedupe_key:`layman:${r}:${Date.now()}:${Math.random()}`,payload:JSON.stringify(i)}),l=await Rr({dal:e,worker_id:`layman-start-${Date.now()}`}),c=e.getJob(a.id),u=l?.job_id===a.id?l.run_id:c?.run_id??null;return u===null?t.redirect("/layman?queued=1",302):t.redirect(`/layman/run/${u}`,302)}function NL(t){let e=Ge(t.question).trim();if(e.length===0)return"Enter a question.";let r=Ge(t.output_path).trim();return{question:e,...r.length>0?{output_path:r}:{}}}function $L(t){let e=Ge(t.task_description).trim(),r=VL(Ge(t.slug).trim()),n=Ge(t.output_dir).trim()||"drafts";return e.length===0?"Describe the document you want.":r.length===0?"Enter a document slug.":{task_description:e,slug:r,output_dir:n}}function jL(t,e){let r=e.workflow?.name??"unknown",n=`<h1>${S(gn(r))}</h1>
1569
+ <p><a href="/layman">Layman home</a></p>`;if(e.terminal_state!==null)return`${n}${LL(t,e,r)}`;let s=Ey(t,e);return s!==null&&s.status==="waiting_operator"?`${n}${AL(e,s)}`:`${n}<section hx-get="/layman/run/${S(e.id)}" hx-trigger="every 2s" hx-swap="outerHTML">
1582
1570
  <h2>Running</h2>
1583
1571
  <p class="muted">Current stage: <strong>${S(e.current_state??"starting")}</strong></p>
1584
- ${_w(e)}
1585
- </section>`}function _w(t){let e=t.steps.map(r=>[S(r.id),S(`\u25B6 ${r.state_name}`),S(r.outcome??"running"),S(r.status_detail??"")]);return fe(["step","stage","outcome","detail"],e)}function AL(t,e){return`<section class="metric paused-interactive">
1572
+ ${_y(e)}
1573
+ </section>`}function _y(t){let e=t.steps.map(r=>[S(r.id),S(`\u25B6 ${r.state_name}`),S(r.outcome??"running"),S(r.status_detail??"")]);return fe(["step","stage","outcome","detail"],e)}function AL(t,e){return`<section class="metric paused-interactive">
1586
1574
  <h2>${S(HL(e.state_name))}</h2>
1587
1575
  <p class="muted">The agent is waiting for your response.</p>
1588
1576
  <h3>Agent output</h3>
@@ -1598,15 +1586,15 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1598
1586
  <p>Status: <strong>${S(e.terminal_state)}</strong></p>
1599
1587
  ${n?CL(t,e,r):DL(e)}
1600
1588
  <h2>Stage Log</h2>
1601
- ${_w(e)}
1589
+ ${_y(e)}
1602
1590
  </section>`}function CL(t,e,r){if(r==="info-qa"){let n=Lu(e,["info_qa_consolidated"]);return`<h3>Answer</h3><div class="metric">${Cu(n??"No answer artifact was recorded yet.")}</div>`}if(r==="document-creation")return ML(t,e);if(r==="newspaper"){let n=Lu(e,["newspaper_consolidated"]);return`<h3>Digest</h3><div class="metric">${Cu(n??"No digest artifact was recorded yet.")}</div>`}return'<p class="muted">No layman output renderer for this workflow.</p>'}function ML(t,e){let r=Ir(t,e.id),n=Au(r,["render_docx"]),s=Au(r,["render_xlsx"]),o=Lu(e,["review:coder[0]_transcript","chat_output_md"])??PL(Au(r,["document_md","markdown"])),i=[n,s].filter(a=>a!==null).map(a=>`<li><a href="file://${S(a)}">${S(a)}</a></li>`).join("");return`<h3>Document Preview</h3>
1603
1591
  <pre>${S(GL(XL(o??"No preview available."),30))}</pre>
1604
1592
  <h3>Downloads</h3>
1605
1593
  ${i.length>0?`<ul>${i}</ul>`:'<p class="muted">No rendered files found yet.</p>'}`}function DL(t){let e=[...t.steps].reverse().find(r=>r.status_detail!==null);return`<p class="error">${S(e?.status_detail??"The workflow did not complete successfully.")}</p>`}function Lu(t,e){for(let r of[...t.steps].reverse())for(let n of e){let s=[...r.artifacts].reverse().find(o=>o.kind===n&&o.content!==null);if(s?.content!==null&&s?.content!==void 0)return s.content}return null}function Au(t,e){for(let r of[...t].reverse())if(e.includes(r.kind)&&r.path!==null)return r.path;return null}function PL(t){if(t===null||!EL(t)||!t.endsWith(".md"))return null;try{return bL(t,"utf8")}catch{return null}}function FL(t){let e=t.listProjects();return`<h1>Newspaper Subscriptions</h1>
1606
- ${UL(yw(t))}
1594
+ ${UL(wy(t))}
1607
1595
  <h2>Add Subscription</h2>
1608
- ${e.length===0?'<p class="error">Create a project before subscribing.</p>':gw(e,"/layman/newspaper")}`}function gw(t,e){return`<form method="post" action="${S(e)}">
1609
- ${hw(t)}
1596
+ ${e.length===0?'<p class="error">Create a project before subscribing.</p>':gy(e,"/layman/newspaper")}`}function gy(t,e){return`<form method="post" action="${S(e)}">
1597
+ ${hy(t)}
1610
1598
  <label>Topics<textarea name="topics" rows="5" placeholder="local news, AI safety, climate" required></textarea></label>
1611
1599
  <label>Schedule<select name="schedule">
1612
1600
  <option value="daily">Daily at 6am</option>
@@ -1616,31 +1604,31 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1616
1604
  <label>Custom cron<input name="cron" placeholder="0 6 * * *"></label>
1617
1605
  <label>Output directory<input name="output_dir" value="digests"></label>
1618
1606
  <button type="submit">Create subscription</button>
1619
- </form>`}async function dw(t,e){let r=await t.req.parseBody(),n=bw(e,r);if(n===null)return t.html(Ae("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ae("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ge(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Ae("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ge(r.output_dir).trim()||"digests",schedule:qL(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function fw(t,e){let r=Ji(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function UL(t){return fe(["id","project","topics","status","action"],t.map(e=>{let r=KL(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function ww(t){let e=yw(t);return{workflows:Xi,recent_runs:BL(t),newspaper_subscriptions:e.length}}function WL(t,e){let r=Ew(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function BL(t){return t.query(`SELECT r.*, w.name AS workflow_name
1607
+ </form>`}async function dy(t,e){let r=await t.req.parseBody(),n=by(e,r);if(n===null)return t.html(Ae("Newspaper",'<p class="error">Choose a valid project.</p>'),400);let s=e.getWorkflowByName("newspaper");if(s===null)return t.html(Ae("Newspaper",'<p class="error">The newspaper workflow is not loaded.</p>'),400);let o=Ge(r.topics).split(/[\n,]/).map(a=>a.trim()).filter(a=>a.length>0);if(o.length===0)return t.html(Ae("Newspaper",'<p class="error">Enter at least one topic.</p>'),400);let i={topics:o,output_dir:Ge(r.output_dir).trim()||"digests",schedule:qL(r)};return e.insertProjectWorkflow({project_id:n.id,workflow_id:s.id,condition:null,parameters_override:JSON.stringify(i),priority:100,enabled:!0}),t.redirect("/layman/newspaper?created=1",302)}function fy(t,e){let r=Ji(t,"id");return e.removeProjectWorkflow(r)?t.redirect("/layman/newspaper?removed=1",302):t.notFound()}function UL(t){return fe(["id","project","topics","status","action"],t.map(e=>{let r=KL(e.parameters_override),n=Array.isArray(r.topics)?r.topics.join(", "):"";return[S(e.id),S(e.project_name),S(n),e.enabled===1?"enabled":"disabled",`<form method="post" action="/layman/newspaper/${e.id}/delete"><button type="submit">Remove</button></form>`]}))}function yy(t){let e=wy(t);return{workflows:Xi,recent_runs:BL(t),newspaper_subscriptions:e.length}}function WL(t,e){let r=Ey(t,e);return{id:e.id,workflow:e.workflow?.name??null,current_state:e.current_state,terminal_state:e.terminal_state,paused_interactive:r?.status==="waiting_operator"?{step_id:r.step_id,state_name:r.state_name,last_agent_output:r.last_agent_output}:null,steps:e.steps.map(n=>({id:n.id,state_name:n.state_name,outcome:n.outcome,status_detail:n.status_detail}))}}function BL(t){return t.query(`SELECT r.*, w.name AS workflow_name
1620
1608
  FROM run r
1621
1609
  JOIN workflow w ON w.id = r.workflow_id
1622
1610
  WHERE w.name IN (${Ou.map(()=>"?").join(",")})
1623
1611
  ORDER BY r.id DESC
1624
- LIMIT 10`,...Ou)}function yw(t){return t.query(`SELECT pw.*, p.name AS project_name
1612
+ LIMIT 10`,...Ou)}function wy(t){return t.query(`SELECT pw.*, p.name AS project_name
1625
1613
  FROM project_workflow pw
1626
1614
  JOIN workflow w ON w.id = pw.workflow_id
1627
1615
  JOIN project p ON p.id = pw.project_id
1628
1616
  WHERE w.name = ?
1629
- ORDER BY pw.id DESC`,"newspaper")}function Ew(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function bw(t,e){let r=Number(Ge(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function qL(t){let e=Ge(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ge(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function mw(t){let e=t.req.param("workflow");return Ou.includes(e)?e:null}function gn(t){return Xi.find(e=>e.name===t)?.title??t}function HL(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Cu(t){return SL.parse(t,{async:!1})}function JL(t){return t==="done"||t==="pr_ready"||t==="merged"}function XL(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function GL(t,e){return t.split(`
1617
+ ORDER BY pw.id DESC`,"newspaper")}function Ey(t,e){for(let r of[...e.steps].reverse()){let n=t.getInteractiveSessionByStepId(r.id);if(n!==null)return n}return null}function by(t,e){let r=Number(Ge(e.project_id));return Number.isInteger(r)?t.getProject(r):null}function qL(t){let e=Ge(t.schedule)||"daily";return e==="weekly"?{preset:e,cron:"0 6 * * 1"}:e==="custom"?{preset:e,cron:Ge(t.cron).trim()||"0 6 * * *"}:{preset:"daily",cron:"0 6 * * *"}}function my(t){let e=t.req.param("workflow");return Ou.includes(e)?e:null}function gn(t){return Xi.find(e=>e.name===t)?.title??t}function HL(t){return t.split(/[_:-]/).filter(Boolean).map(e=>`${e[0]?.toUpperCase()??""}${e.slice(1)}`).join(" ")}function Cu(t){return SL.parse(t,{async:!1})}function JL(t){return t==="done"||t==="pr_ready"||t==="merged"}function XL(t){return t.replace(/\n*STANCE:\s+\S+\s*$/,"").trimEnd()}function GL(t,e){return t.split(`
1630
1618
  `).slice(0,e).join(`
1631
- `)}function VL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function KL(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function Ru(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ji(t,e){return Number(t.req.param(e))}var Xi,Ou,Sw=b(()=>{"use strict";Es();Ot();mu();Xi=[{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."}],Ou=Xi.map(t=>t.name)});function zL(t){return t.replace(/^\/+/,"")}function Tw(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function wn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=zL(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Tw(t.userId)&&Tw(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${YL}/${t.identityId}/`}function QL(t){return String(Math.max(0,Math.floor(t))).padStart(ZL,"0")}function Mu(t,e,r){return`${t}${e}${QL(r)}.json`}function Gi(t,e){return`${t}${e}`}function Vi(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var YL,ZL,Ki=b(()=>{"use strict";YL="mailbox";ZL=12});function Ft(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Yi[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Yi[a&15]+i,a=a>>4;let l=Yi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Yi[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Yi,zi=b(()=>{"use strict";Yi="0123456789abcdef"});function Pu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fu(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function xw(t){return t.conversation_id===Nw&&rC(t.payload)}function rC(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function nC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:xw(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var kw,vw,Iw,eC,Nw,tC,Du,Or,Zi=b(()=>{"use strict";Ki();zi();kw=3e3,vw=1e4,Iw=12e3,eC=1e3,Nw="__lmctl_heartbeat__",tC={kind:"heartbeat"},Du={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Or=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(e){this.opts=e,this.basePrefix=wn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=Pu(e.readIntervalMs??e.pollIntervalMs??kw,kw),this.heartbeatIdleMs=Pu(e.heartbeatIdleMs??vw,vw),this.backoffReadIntervalMs=Pu(e.backoffReadIntervalMs??e.pollIntervalMs??Iw,Iw)}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 e=this.opts.timers??Du;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.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(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}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 e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=Gi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:eC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Vi(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Ft(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=Mu(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Du;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}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 e=(this.cursor??0)+1,r=Mu(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(Fu(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),xw(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=nC(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Du;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(Nw,tC)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as sC}from"@hono/node-server/conninfo";function $w(t,e){let r=e.bucket??oC,n=e.remoteAddressOf??(o=>aC(o)),s=o=>{let i=n(o);return lC(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Fu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Wu(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:Wu(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=Uu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=iC(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:Wu(d)},500)}})}function Uu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function iC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function aC(t){try{return sC(t).remote.address}catch{return}}function lC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wu(t){return t instanceof Error?t.message:String(t)}var oC,jw=b(()=>{"use strict";Zi();oC="local"});function Aw(t,e){t.get("/mailbox/workspace",r=>dC(r,e)),t.get("/mailbox/projects",r=>fC(r,e)),t.get("/mailbox/projects/:id",r=>mC(r,e)),t.post("/mailbox/projects",r=>pC(r,e)),t.patch("/mailbox/projects/:id",r=>hC(r,e)),t.delete("/mailbox/projects/:id",r=>_C(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>gC(r,e)),t.get("/mailbox/prompts/:id",r=>wC(r,e))}function dC(t,e){e.dal.ensureWorkspace({id:En,name:Bu});let r=Rw(e.dal),n={id:En,name:Bu,created_at:uC,projects:r};return t.json({workspace:n})}function fC(t,e){return t.json({projects:Rw(e.dal)})}function mC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let s=qu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ta(s)})}let n=Lw(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Ow(n)})}async function pC(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:En,name:Bu});let s=e.dal.insertWebProject({workspace_id:En,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:ta(s)},201)}async function hC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(yn)){let o=qu(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.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 i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ta(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function _C(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(yn)){let n=qu(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function gC(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Lw(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${cC}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await yC({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ea}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function wC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=EC(e.dal,r);return t.json({result:n})}function Rw(t){let e=t.listProjects().map(Ow),r=t.listWebProjectsActive(En).map(ta);return[...e,...r].sort(jC)}function Ow(t){return{id:`${ea}${t.id}`,workspace_id:En,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ta(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${yn}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function qu(t,e){if(!e.startsWith(yn))return null;let r=e.slice(yn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Lw(t,e){if(e.startsWith(ea)){let n=e.slice(ea.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function yC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(tu(),a_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function EC(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=NC(t,o?.team_id??null),a=IC(s),l=xC(n,a,i.length>0),c=$C(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:bC(t,o.workflow_name),d=u.totalEstimatedMs,f=Cw(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:SC(t,s.id),g=TC(s,a,h,u.perStep,i),_=kC(h,u.perStep),T=vC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Qi(d,f),...T},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&&t.setPromptDispatchCompleted(e),{prompt_id:e,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,...Qi(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,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:i,...Qi(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Qi(d,f),...T},errors_json:null,duration_ms:c}}function bC(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);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 o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=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,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function SC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function TC(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Cw(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function kC(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function vC(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Cw(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Qi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function IC(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function NC(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function xC(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function $C(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function jC(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ea,yn,cC,En,Bu,uC,Mw=b(()=>{"use strict";ea="project:",yn="web_project:",cC="prompt:",En="default",Bu="Default workspace",uC=new Date(0).toISOString()});import{Buffer as Dw}from"node:buffer";function Pw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Fw(t){return OC[t]}function Uw(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var AC,RC,ra,OC,Hu=b(()=>{"use strict";AC=1e4,RC=256*1024,ra=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Pw(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,AC),this.pushByteCap=Pw(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,RC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Dw.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.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=${e.session_id} reason=${r} bytes=${Dw.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1619
+ `)}function VL(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}function Ge(t){return typeof t=="string"?t:""}function KL(t){if(t===null)return{};try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return e}catch{return{}}return{}}function Ru(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function Ji(t,e){return Number(t.req.param(e))}var Xi,Ou,Sy=b(()=>{"use strict";Es();Ot();mu();Xi=[{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."}],Ou=Xi.map(t=>t.name)});function zL(t){return t.replace(/^\/+/,"")}function Ty(t){return typeof t=="string"&&t!==""&&!t.includes("/")&&!t.includes("\\")}function yn(t){if(t.mailboxKey!==void 0&&t.mailboxKey!==null&&t.mailboxKey!==""){let e=zL(t.mailboxKey),r=e.lastIndexOf("/");return(r>=0?e.slice(r+1):e).includes(".")&&(e=r>=0?e.slice(0,r+1):""),e!==""&&!e.endsWith("/")&&(e+="/"),e}return Ty(t.userId)&&Ty(t.deviceId)?`${t.userId}/${t.deviceId}/`:`${YL}/${t.identityId}/`}function QL(t){return String(Math.max(0,Math.floor(t))).padStart(ZL,"0")}function Mu(t,e,r){return`${t}${e}${QL(r)}.json`}function Gi(t,e){return`${t}${e}`}function Vi(t,e,r){let n=`${e}${r}`;if(!t.startsWith(n))return;let s=t.slice(n.length).match(/^(\d+)\.json$/);if(s===null)return;let o=Number(s[1]);return Number.isSafeInteger(o)?o:void 0}var YL,ZL,Ki=b(()=>{"use strict";YL="mailbox";ZL=12});function Ft(t,e){let r=Math.floor(t),n="",s=r;for(let u=0;u<12;u++)n=Yi[s&15]+n,s=Math.floor(s/16);let o=Math.floor(e()*4096)&4095,i="",a=o;for(let u=0;u<3;u++)i=Yi[a&15]+i,a=a>>4;let l=Yi[8|Math.floor(e()*4)&3],c="";for(let u=0;u<15;u++)c+=Yi[Math.floor(e()*16)&15];return n.slice(0,8)+"-"+n.slice(8,12)+"-7"+i+"-"+l+c.slice(0,3)+"-"+c.slice(3,15)}var Yi,zi=b(()=>{"use strict";Yi="0123456789abcdef"});function Pu(t,e){return!Number.isFinite(t)||t<=0?e:t}function Fu(t){if(t===null||typeof t!="object")return!1;let e=t;return e.name==="NoSuchKey"||e.name==="NotFound"||e.Code==="NoSuchKey"||e.code==="NoSuchKey"||e.$metadata!==void 0&&e.$metadata.httpStatusCode===404}function Ny(t){return t.conversation_id===xy&&rC(t.payload)}function rC(t){return typeof t=="object"&&t!==null&&t.kind==="heartbeat"}function nC(t){let e=typeof t.hb=="string"&&t.hb!==""?t.hb:Ny(t)?t.timestamp:void 0;if(e===void 0)return;let r=Date.parse(e);return Number.isFinite(r)?r:void 0}var ky,vy,Iy,eC,xy,tC,Du,Or,Zi=b(()=>{"use strict";Ki();zi();ky=3e3,vy=1e4,Iy=12e3,eC=1e3,xy="__lmctl_heartbeat__",tC={kind:"heartbeat"},Du={setTimeout:(t,e)=>setTimeout(t,e),clearTimeout:t=>clearTimeout(t)},Or=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(e){this.opts=e,this.basePrefix=yn({identityId:e.identityId,userId:e.userId,deviceId:e.deviceId,mailboxKey:e.mailboxKey}),this.ownStream=e.selfRole==="agent"?"local":"web",this.peerStream=e.selfRole==="agent"?"web":"local",this.cursor=e.cursor,this.readIntervalMs=Pu(e.readIntervalMs??e.pollIntervalMs??ky,ky),this.heartbeatIdleMs=Pu(e.heartbeatIdleMs??vy,vy),this.backoffReadIntervalMs=Pu(e.backoffReadIntervalMs??e.pollIntervalMs??Iy,Iy)}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 e=this.opts.timers??Du;if(this.timerHandle!==null&&(e.clearTimeout(this.timerHandle),this.timerHandle=null),this.heartbeatTimerHandle!==null&&(e.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(e){return this.putEnvelope(e.conversation_id,e.payload)}getCursor(){return this.cursor}getMailboxBasePrefix(){return this.basePrefix}setPollIntervalMs(e){if(!Number.isFinite(e)||e<=0)throw new Error(`SequentialMailboxClient.setPollIntervalMs: invalid ms=${e}`);this.readIntervalMs=e}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 e=await this.maxSeq(this.ownStream);this.ownSeq=e,this.cursor===void 0&&(this.cursor=await this.maxSeq(this.peerStream)),this.bootstrapped=!0}catch(e){throw this.bootstrapPromise=null,this.emitError(e,"list"),e}}async maxSeq(e){let r=Gi(this.basePrefix,e),n=0,s;do{let o=await this.opts.s3.send(new this.opts.commands.ListObjectsV2Command({Bucket:this.opts.bucket,Prefix:r,MaxKeys:eC,...s!==void 0&&{ContinuationToken:s}}));this.opts.onS3Op?.("list");for(let i of o.Contents??[]){let a=Vi(i.Key??"",this.basePrefix,e);a!==void 0&&a>n&&(n=a)}s=o.IsTruncated===!0?o.NextContinuationToken:void 0}while(s!==void 0);return n}async putEnvelope(e,r){let n=this.writeChain.then(()=>this.doPut(e,r));return this.writeChain=n.catch(()=>{}),n}async doPut(e,r){await this.ensureBootstrapped();let n=(this.opts.now??Date.now)(),s=new Date(n).toISOString(),o={message_id:Ft(n,this.opts.random??Math.random),from:this.opts.selfRole,timestamp:s,hb:s,conversation_id:e,payload:r},i=(this.ownSeq??0)+1,a=Mu(this.basePrefix,this.ownStream,i);return await this.opts.s3.send(new this.opts.commands.PutObjectCommand({Bucket:this.opts.bucket,Key:a,Body:JSON.stringify(o),ContentType:"application/json"})),this.opts.onS3Op?.("put"),this.ownSeq=i,this.recordWrite(n),a}scheduleNextTick(e){if(this.stopRequested)return;let r=this.opts.timers??Du;this.timerHandle=r.setTimeout(()=>{this.timerHandle=null,this.runTick()},e)}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 e=(this.cursor??0)+1,r=Mu(this.basePrefix,this.peerStream,e),n;try{let o=await this.opts.s3.send(new this.opts.commands.GetObjectCommand({Bucket:this.opts.bucket,Key:r}));if(this.opts.onS3Op?.("get"),o.Body===void 0){this.emitError(new Error(`GetObject ${r}: empty body`),"get"),this.advanceCursor(e);continue}n=await o.Body.transformToString("utf-8")}catch(o){if(Fu(o)){this.opts.onS3Op?.("get");return}this.emitError(o,"get");return}let s;try{s=JSON.parse(n)}catch(o){this.emitError(o,"get"),this.advanceCursor(e);continue}if(this.recordPeerHeartbeat(s),Ny(s)){this.advanceCursor(e);continue}try{await this.opts.onMessage(s)}catch(o){this.emitError(o,"handle");return}this.advanceCursor(e)}}advanceCursor(e){this.cursor=e,this.notifyCursorAdvance(e)}nextReadDelayMs(){return this.peerIsOn((this.opts.now??Date.now)())?this.readIntervalMs:this.backoffReadIntervalMs}peerIsOn(e){return this.lastPeerHeartbeatMs!==void 0&&e-this.lastPeerHeartbeatMs<=this.heartbeatIdleMs}recordPeerHeartbeat(e){let r=nC(e);r!==void 0&&(this.lastPeerHeartbeatMs=r)}recordWrite(e){this.lastWriteMs=e,this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}scheduleHeartbeatCheck(e){if(this.stopRequested)return;let r=this.opts.timers??Du;this.heartbeatTimerHandle!==null&&r.clearTimeout(this.heartbeatTimerHandle),this.heartbeatTimerHandle=r.setTimeout(()=>{this.heartbeatTimerHandle=null,this.maybeWriteHeartbeat()},e)}async maybeWriteHeartbeat(){if(this.stopRequested)return;let e=(this.opts.now??Date.now)();if(this.lastWriteMs!==void 0){let r=e-this.lastWriteMs;if(r<this.heartbeatIdleMs){this.scheduleHeartbeatCheck(this.heartbeatIdleMs-r);return}}await this.writeHeartbeat()}async writeHeartbeat(){try{await this.putEnvelope(xy,tC)}catch(e){this.emitError(e,"put"),this.scheduleHeartbeatCheck(this.heartbeatIdleMs)}}notifyCursorAdvance(e){if(this.opts.onCursorAdvance!==void 0)try{this.opts.onCursorAdvance(e)}catch(r){this.emitError(r,"handle")}}emitError(e,r){if(this.opts.onError!==void 0)try{this.opts.onError(e,r)}catch{}else console.error(`SequentialMailboxClient[${r}]`,e)}}});import{getConnInfo as sC}from"@hono/node-server/conninfo";function $y(t,e){let r=e.bucket??oC,n=e.remoteAddressOf??(o=>aC(o)),s=o=>{let i=n(o);return lC(i)?null:o.json({error:"forbidden",message:"local-mailbox is loopback-only"},403)};t.get("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);try{let l=await e.s3.send(new e.commands.GetObjectCommand({Bucket:r,Key:a}));if(l.Body===void 0)return o.json({error:"empty_body"},404);let c=await l.Body.transformToString("utf-8");return o.body(c,200,{"Content-Type":"application/octet-stream"})}catch(l){return Fu(l)?o.json({error:"not_found"},404):o.json({error:"internal",message:Wu(l)},500)}}),t.put("/local-mailbox/object",async o=>{let i=s(o);if(i!==null)return i;let a=Uu(o.req.query("key"));if(typeof a!="string")return o.json({error:"bad_request",message:a.error},400);let l=new Uint8Array(await o.req.arrayBuffer());try{return await e.s3.send(new e.commands.PutObjectCommand({Bucket:r,Key:a,Body:l})),o.json({ok:!0})}catch(c){return o.json({error:"internal",message:Wu(c)},500)}}),t.get("/local-mailbox/list",async o=>{let i=s(o);if(i!==null)return i;let a=o.req.query("prefix")??"",l=Uu(a,{allowEmpty:!0});if(typeof l!="string")return o.json({error:"bad_request",message:l.error},400);let c=iC(o.req.query("maxKeys")),u=o.req.query("token");try{let d=await e.s3.send(new e.commands.ListObjectsV2Command({Bucket:r,Prefix:l,...c!==void 0?{MaxKeys:c}:{},...u!==void 0&&u!==""?{ContinuationToken:u}:{}}));return o.json({Contents:(d.Contents??[]).map(f=>({Key:f.Key,LastModified:f.LastModified instanceof Date?f.LastModified.toISOString():f.LastModified})),IsTruncated:d.IsTruncated??!1,...d.NextContinuationToken!==void 0?{NextContinuationToken:d.NextContinuationToken}:{}})}catch(d){return o.json({error:"internal",message:Wu(d)},500)}})}function Uu(t,e={}){if(t===void 0||t==="")return e.allowEmpty===!0?"":{error:"key required"};let r=t.replace(/^\/+/,"");return r.split("/").includes("..")?{error:"key must not contain '..'"}:r}function iC(t){if(t===void 0||t==="")return;let e=Number(t);return Number.isInteger(e)&&e>0?e:void 0}function aC(t){try{return sC(t).remote.address}catch{return}}function lC(t){return t===void 0||t===""?!1:!!(t==="127.0.0.1"||t==="::1"||t.startsWith("::ffff:127.")||t.startsWith("127."))}function Wu(t){return t instanceof Error?t.message:String(t)}var oC,jy=b(()=>{"use strict";Zi();oC="local"});function Ay(t,e){t.get("/mailbox/workspace",r=>dC(r,e)),t.get("/mailbox/projects",r=>fC(r,e)),t.get("/mailbox/projects/:id",r=>mC(r,e)),t.post("/mailbox/projects",r=>pC(r,e)),t.patch("/mailbox/projects/:id",r=>hC(r,e)),t.delete("/mailbox/projects/:id",r=>_C(r,e)),t.post("/mailbox/projects/:project_id/prompts",r=>gC(r,e)),t.get("/mailbox/prompts/:id",r=>yC(r,e))}function dC(t,e){e.dal.ensureWorkspace({id:En,name:Bu});let r=Ry(e.dal),n={id:En,name:Bu,created_at:uC,projects:r};return t.json({workspace:n})}function fC(t,e){return t.json({projects:Ry(e.dal)})}function mC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(wn)){let s=qu(e.dal,r);return s===null||s.deleted_at!==null?t.json({project:null},404):t.json({project:ta(s)})}let n=Ly(e.dal,r);return n===null?t.json({project:null},404):t.json({project:Oy(n)})}async function pC(t,e){let r;try{r=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let n=r.input;if(n===void 0||typeof n!="object")return t.json({error:"bad_request",message:"input is required"},400);if(typeof n.name!="string"||n.name==="")return t.json({error:"bad_request",message:"input.name is required"},400);if(typeof n.repo_path!="string"||n.repo_path==="")return t.json({error:"bad_request",message:"input.repo_path is required"},400);e.dal.ensureWorkspace({id:En,name:Bu});let s=e.dal.insertWebProject({workspace_id:En,name:n.name,repo_path:n.repo_path,config_json:n.config_json===void 0?null:JSON.stringify(n.config_json)});return t.json({project:ta(s)},201)}async function hC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input??{};if(r.startsWith(wn)){let o=qu(e.dal,r);if(o===null||o.deleted_at!==null)return t.json({error:"project_not_found",message:`project not found: ${r}`},404);let i=e.dal.updateWebProject({id:o.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 i===null?t.json({error:"project_not_found",message:`project not found: ${r}`},404):t.json({project:ta(i)})}return t.json({error:"project_not_found",message:`project not found: ${r}`},404)}function _C(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project id required"},400);if(r.startsWith(wn)){let n=qu(e.dal,r);if(n===null)return t.json({deleted:!1});let s=e.dal.softDeleteWebProject(n.id);return t.json({deleted:s})}return t.json({deleted:!1})}async function gC(t,e){let r=t.req.param("project_id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"project_id required in path"},400);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.input;if(s===void 0||typeof s!="object")return t.json({error:"bad_request",message:"input is required"},400);let o=s.project_id??r;if(typeof s.text!="string"||s.text==="")return t.json({error:"bad_request",message:"input.text is required"},400);let i=Ly(e.dal,o);if(i===null)return t.json({error:"project_not_found",message:`project not found: ${o}`},404);if(e.dal.getWorkflowByName(i.workflow_name)===null)return t.json({error:"workflow_not_registered",message:`project ${i.name} has no registered workflow "${i.workflow_name}"`},400);let l=`${cC}${crypto.randomUUID()}`,c={text:s.text,context_json:s.context_json??null},u;e.enqueueProjectJob!==void 0?u=e.enqueueProjectJob({dal:e.dal,project_id:i.id,source_ref:l,payload:c}):u=await wC({dal:e.dal,project_id:i.id,source_ref:l,payload:c}),e.dal.insertPromptDispatch({prompt_id:l,project_id:i.id,job_id:u.id,text:s.text,context_json:s.context_json===void 0?null:JSON.stringify(s.context_json)});let d={id:l,project_id:`${ea}${i.id}`,text:s.text,status:"pending",created_at:new Date().toISOString(),completed_at:null};return t.json({prompt:d},201)}function yC(t,e){let r=t.req.param("id");if(r===void 0||r==="")return t.json({error:"bad_request",message:"prompt id required"},400);let n=EC(e.dal,r);return t.json({result:n})}function Ry(t){let e=t.listProjects().map(Oy),r=t.listWebProjectsActive(En).map(ta);return[...e,...r].sort(jC)}function Oy(t){return{id:`${ea}${t.id}`,workspace_id:En,name:t.name,repo_path:t.local_path,config_json:{workflow_name:t.workflow_name,team_id:t.team_id,durable_memory_mode:t.durable_memory_mode},last_active_at:null,created_at:t.created_at}}function ta(t){let e={};if(t.config_json!==null)try{let r=JSON.parse(t.config_json);r!==null&&typeof r=="object"&&(e=r)}catch{}return t.linked_v4_project_id!==null&&(e={...e,linked_v4_project_id:t.linked_v4_project_id}),{id:`${wn}${t.id}`,workspace_id:t.workspace_id,name:t.name,repo_path:t.repo_path,config_json:e,last_active_at:t.last_active_at,created_at:t.created_at}}function qu(t,e){if(!e.startsWith(wn))return null;let r=e.slice(wn.length),n=Number.parseInt(r,10);return!Number.isFinite(n)||String(n)!==r?null:t.getWebProject(n)}function Ly(t,e){if(e.startsWith(ea)){let n=e.slice(ea.length),s=Number.parseInt(n,10);if(Number.isFinite(s)&&String(s)===n)return t.getProject(s)}let r=Number.parseInt(e,10);return Number.isFinite(r)&&String(r)===e?t.getProject(r):null}async function wC(t){let{enqueueManual:e}=await Promise.resolve().then(()=>(tu(),a_));return{id:e(t.dal,{project_id:t.project_id,source_ref:t.source_ref,payload:t.payload}).id}}function EC(t,e){let r=t.getPromptDispatch(e);if(r===null)return{prompt_id:e,data:{status:"unknown"},errors_json:{error:"prompt_not_found"},duration_ms:null};let n=t.getJob(r.job_id);if(n===null)return{prompt_id:e,data:null,errors_json:{error:"job_missing",job_id:r.job_id},duration_ms:null};let s=n.run_id===null?null:t.getRun(n.run_id),o=t.getProject(r.project_id),i=xC(t,o?.team_id??null),a=IC(s),l=NC(n,a,i.length>0),c=$C(r.created_at,s),u=o===null?{totalEstimatedMs:void 0,perStep:new Map}:bC(t,o.workflow_name),d=u.totalEstimatedMs,f=Cy(r.created_at),m=o?.workflow_name,p=u.perStep.size>0?u.perStep.size:void 0,h=s===null?[]:SC(t,s.id),g=TC(s,a,h,u.perStep,i),_=kC(h,u.perStep),T=vC(g,_,d,f,m,p);return l==="error"?{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,...Qi(d,f),...T},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&&t.setPromptDispatchCompleted(e),{prompt_id:e,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,...Qi(d,f),...T},errors_json:null,duration_ms:c}):l==="paused"?{prompt_id:e,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:i,...Qi(d,f),...T},errors_json:null,duration_ms:c}:{prompt_id:e,data:{status:l,job_id:n.id,project_id:r.project_id,run_id:s?.id??null,attempt_count:n.attempt_count,...Qi(d,f),...T},errors_json:null,duration_ms:c}}function bC(t,e){let r={totalEstimatedMs:void 0,perStep:new Map},n=t.getWorkflowByName(e);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 o=s,i=typeof o.estimated_duration_ms=="number"&&Number.isFinite(o.estimated_duration_ms)&&o.estimated_duration_ms>=0?o.estimated_duration_ms:void 0,a=new Map;if(Array.isArray(o.steps))for(let l of o.steps){if(l===null||typeof l!="object")continue;let c=l;if(typeof c.id!="string"||c.id.length===0)continue;let u=typeof c.name=="string"&&c.name.length>0?c.name:c.id,d=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,d===void 0?{name:u}:{name:u,estimated_duration_ms:d})}if(o.steps===void 0&&o.states!==null&&typeof o.states=="object")for(let[l,c]of Object.entries(o.states)){if(c===null||typeof c!="object")continue;let u=c,d=typeof u.estimated_duration_ms=="number"&&Number.isFinite(u.estimated_duration_ms)&&u.estimated_duration_ms>=0?u.estimated_duration_ms:void 0;a.set(l,d===void 0?{name:l}:{name:l,estimated_duration_ms:d})}return{totalEstimatedMs:i,perStep:a}}function SC(t,e){try{return t.listStepsForRun(e)}catch{return[]}}function TC(t,e,r,n,s){if(t===null||t.terminal_state!==null)return;let o=e!==null?e:t.current_state;if(o===null||o.length===0)return;let a=[...r].reverse().find(f=>f.state_name===o&&f.ended_at===null)?.started_at??t.paused_at??t.started_at,l=n.get(o),c=l?.name??o,u=Cy(a),d={id:o,name:c,started_at:a,elapsed_ms:u};return l?.estimated_duration_ms!==void 0&&(d.estimated_duration_ms=l.estimated_duration_ms),s.length>0&&(d.attention_needed=s),d}function kC(t,e){let r=[];for(let n of t){if(n.ended_at===null)continue;let s=Date.parse(n.started_at),o=Date.parse(n.ended_at),i=Number.isFinite(s)&&Number.isFinite(o)?Math.max(0,o-s):0,a=e.get(n.state_name)?.name??n.state_name,l=n.outcome==="failed"?"failed":"done";r.push({id:n.state_name,name:a,duration_ms:i,status:l})}return r}function vC(t,e,r,n,s,o){let i={completed_steps:e,total_elapsed_ms:n};return t!==void 0&&(i.current_step=t),r!==void 0&&(i.total_estimated_ms=r),s!==void 0&&s.length>0&&(i.workflow_name=s),o!==void 0&&(i.total_steps=o),i}function Cy(t){let e=Date.parse(t);return Number.isNaN(e)?0:Math.max(0,Date.now()-e)}function Qi(t,e){return t===void 0?{elapsed_ms:e}:{elapsed_ms:e,estimated_duration_ms:t}}function IC(t){if(t===null)return null;let e=t.current_state;if(e===null)return null;let r="__paused__:";return e.startsWith(r)?e.slice(r.length):null}function xC(t,e){if(e===null)return[];let r;try{r=t.listTeamMembers(e)}catch{return[]}return r.filter(n=>n.state==="attention_needed").map(n=>({alias:n.alias,reason:n.state_reason}))}function NC(t,e,r){return t.status==="queued"?"pending":t.status==="done"?"done":t.status==="failed"?"error":e!==null||r||t.status==="paused"?"paused":t.status==="running"?"running":"error"}function $C(t,e){let r=Date.parse(t);if(Number.isNaN(r))return null;let n=e?.ended_at??null,s=n===null?Date.now():Date.parse(n);return Number.isNaN(s)?null:Math.max(0,s-r)}function jC(t,e){let r=Date.parse(t.last_active_at??""),n=Date.parse(e.last_active_at??""),s=(Number.isNaN(n)?0:n)-(Number.isNaN(r)?0:r);return s===0?t.name.localeCompare(e.name):s}var ea,wn,cC,En,Bu,uC,My=b(()=>{"use strict";ea="project:",wn="web_project:",cC="prompt:",En="default",Bu="Default workspace",uC=new Date(0).toISOString()});import{Buffer as Dy}from"node:buffer";function Py(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Fy(t){return OC[t]}function Uy(t){let e=t.trim();if(e==="")return;let r=e.split(/\s+/),n=r.shift();if(!(n===void 0||n===""))return{cmd:n,args:r}}var AC,RC,ra,OC,Hu=b(()=>{"use strict";AC=1e4,RC=256*1024,ra=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Py(e.pushWindowMs,process.env.LMCTL_TERMINAL_PUSH_WINDOW_MS,AC),this.pushByteCap=Py(e.pushByteCap,process.env.LMCTL_TERMINAL_PUSH_BYTE_CAP,RC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}startSession(e){if(this.sessions.has(e.session_id))throw new Error(`terminal_session_already_exists: ${e.session_id}`);let r=this.opts.pty.spawn(e.command,e.args,{name:"xterm-256color",cols:e.cols??120,rows:e.rows??30,cwd:e.cwd??process.cwd(),env:e.env??process.env}),n={session_id:e.session_id,pty:r,pendingOutput:[],pendingBytes:0,pushTimer:void 0,closed:!1};return this.sessions.set(e.session_id,n),r.onData(s=>{this.onPtyData(n,s)}),r.onExit(s=>{this.onPtyExit(n,s)}),this.opts.log?.(`[dt-2] terminal session ${e.session_id} started pid=${r.pid} cmd=${e.command}`),{pid:r.pid}}endSession(e){let r=this.sessions.get(e);if(r!==void 0)try{r.pty.kill()}catch{}}onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-2] inbound terminal data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-2] inbound terminal data for closed session ${e.session_id}; dropping`);return}try{r.pty.write(e.data)}catch(n){this.opts.log?.(`[dt-2] pty.write failed for session ${e.session_id}: ${n instanceof Error?n.message:String(n)}`)}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,pid:e.pty.pid}))}pendingBytesFor(e){return this.sessions.get(e)?.pendingBytes}async stop(){for(let e of Array.from(this.sessions.values()))try{e.pty.kill()}catch{}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}onPtyData(e,r){if(!e.closed){if(e.pendingOutput.push(r),e.pendingBytes+=Dy.byteLength(r,"utf8"),e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingOutput.length===0)return;let n=e.pendingOutput.join("");e.pendingOutput=[],e.pendingBytes=0;let s={kind:"terminal",session_id:e.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=${e.session_id} reason=${r} bytes=${Dy.byteLength(n,"utf8")}`)}catch(o){this.opts.log?.(`[dt-2] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}async onPtyExit(e,r){if(e.closed)return;await this.flush(e,"pty_exit");let n=`\r
1632
1620
  [process exited with code ${r.exitCode}${r.signal!==void 0?` signal ${r.signal}`:""}]\r
1633
- `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};OC={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 Bw(t,e){t.post("/mailbox/terminal/launch",r=>LC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>CC(r,e)),t.get("/mailbox/terminal/sessions",r=>MC(r,e))}async function LC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Ww.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Uw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Fw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function CC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Ww.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function MC(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var Ww,qw=b(()=>{"use strict";Hu();Ww=/^[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 DC}from"node:buffer";function UC(t){try{return DC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Hw(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Jw(t){return WC[t]}function Xw(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var PC,FC,na,WC,Ju=b(()=>{"use strict";PC=2e3,FC=64*1024,na=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Hw(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,PC),this.pushByteCap=Hw(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,FC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);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(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=UC(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.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=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};WC={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 Vw(t,e){t.post("/mailbox/chat/launch",r=>BC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>qC(r,e)),t.get("/mailbox/chat/sessions",r=>HC(r,e))}async function BC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Gw.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Xw(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Jw(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function qC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Gw.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function HC(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Gw,Kw=b(()=>{"use strict";Ju();Gw=/^[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 JC}from"node:fs";function zw(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Yw(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=JC(e.path,{encoding:"utf8"});return Yw(r)}catch{return[]}}function Yw(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.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 Zw=b(()=>{"use strict"});function Qw(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function sa(t,e){let r=t.query(`SELECT id, kind FROM attention
1621
+ `,s={kind:"terminal",session_id:e.session_id,direction:"agent_to_user",data:n,ts:(this.opts.now??Date.now)()};try{await this.opts.publish(s)}catch(o){this.opts.log?.(`[dt-2] publish (exit) failed session=${e.session_id}: ${o instanceof Error?o.message:String(o)}`)}e.closed=!0,this.sessions.delete(e.session_id)}};OC={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 By(t,e){t.post("/mailbox/terminal/launch",r=>LC(r,e)),t.post("/mailbox/terminal/end/:session_id",r=>CC(r,e)),t.get("/mailbox/terminal/sessions",r=>MC(r,e))}async function LC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Wy.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Uy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Fy(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no TERMINAL_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=r.startSession({session_id:s,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("terminal_session_already_exists")?t.json({error:"session_exists",message:l},409):t.json({error:"spawn_failed",message:l},500)}}function CC(t,e){let r=e.terminalSessionManager;if(r===void 0)return t.json({error:"terminal_unavailable",message:"terminal session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Wy.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(r.endSession(n),t.json({session_id:n,ended:!0}))}function MC(t,e){let r=e.terminalSessionManager;return r===void 0?t.json({sessions:[],note:"terminal session manager not configured"}):t.json({sessions:r.listSessions()})}var Wy,qy=b(()=>{"use strict";Hu();Wy=/^[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 DC}from"node:buffer";function UC(t){try{return DC.byteLength(JSON.stringify(t),"utf8")}catch{return 256}}function Hy(t,e,r){if(typeof t=="number"&&Number.isFinite(t)&&t>0)return t;if(e!==void 0&&e!==""){let n=Number(e);if(Number.isFinite(n)&&n>0)return n}return r}function Jy(t){return WC[t]}function Xy(t){let e=t.trim();if(e==="")return;let r=[],n=0;for(;n<e.length;){let o=e[n];if(o===" "||o===" "){n+=1;continue}if(o==='"'){let a=n+1,l="";for(;a<e.length&&e[a]!=='"';)l+=e[a],a+=1;r.push(l),n=a+1;continue}let i=n;for(;i<e.length&&e[i]!==" "&&e[i]!==" ";)i+=1;r.push(e.slice(n,i)),n=i}if(r.length===0)return;let s=r.shift();if(!(s===void 0||s===""))return{cmd:s,args:r}}var PC,FC,na,WC,Ju=b(()=>{"use strict";PC=2e3,FC=64*1024,na=class{opts;sessions=new Map;pushWindowMs;pushByteCap;timers;constructor(e){this.opts=e,this.pushWindowMs=Hy(e.pushWindowMs,process.env.LMCTL_PROVIDER_PUSH_WINDOW_MS,PC),this.pushByteCap=Hy(e.pushByteCap,process.env.LMCTL_PROVIDER_PUSH_BYTE_CAP,FC),this.timers=e.timers??{setTimeout:(r,n)=>globalThis.setTimeout(r,n),clearTimeout:r=>globalThis.clearTimeout(r)}}async startSession(e){if(this.sessions.has(e.session_id))throw new Error(`persistent_session_already_exists: ${e.session_id}`);let r=this.opts.adapterFactory(e.provider),n={session_id:e.session_id,provider:e.provider,adapter:r,child:void 0,pendingEvents:[],pendingBytes:0,pushTimer:void 0,generation:1,turnMap:new Map,closed:!1};this.sessions.set(e.session_id,n);let s=this.makeAdapterContext(n);try{let o=await r.start(e,s);return n.child=o,this.wireChildExit(n,o),this.opts.log?.(`[dt-3] persistent session ${e.session_id} started provider=${e.provider} pid=${o.pid??"?"}`),{pid:o.pid}}catch(o){throw this.sessions.delete(e.session_id),o}}async endSession(e){let r=this.sessions.get(e);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(e)}}async onInbound(e){if(e.direction!=="user_to_agent")return;let r=this.sessions.get(e.session_id);if(r===void 0){this.opts.log?.(`[dt-3] inbound provider data for unknown session ${e.session_id}; dropping`);return}if(r.closed){this.opts.log?.(`[dt-3] inbound provider data for closed session ${e.session_id}; dropping`);return}let n=e.user_input??"";if(n!=="")try{await r.adapter.sendTurn(n)}catch(s){let o=s instanceof Error?s.message:String(s);this.opts.log?.(`[dt-3] adapter.sendTurn failed session=${e.session_id}: ${o}`),this.appendEvent(r,{event_type:"error",payload:{message:`sendTurn failed: ${o}`}})}}setPublish(e){this.opts={...this.opts,publish:e}}listSessions(){return Array.from(this.sessions.values()).map(e=>({session_id:e.session_id,provider:e.provider,pid:e.child?.pid}))}pendingEventCountFor(e){return this.sessions.get(e)?.pendingEvents.length}generationFor(e){return this.sessions.get(e)?.generation}_testBumpGeneration(e){let r=this.sessions.get(e);r!==void 0&&(r.generation+=1)}async stop(){for(let e of Array.from(this.sessions.values())){e.generation+=1;try{await e.adapter.stop()}catch{}if(e.child!==void 0)try{e.child.kill("SIGTERM")}catch{}}for(let e of Array.from(this.sessions.values()))e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0)}makeAdapterContext(e){let r=e.generation,n=this;return{generation:r,currentGeneration(){return e.generation},emit(s){r===e.generation&&(e.closed||n.appendEvent(e,s))},...n.opts.log!==void 0?{log:n.opts.log}:{},turnMap:e.turnMap}}appendEvent(e,r){e.pendingEvents.push(r);let n=UC(r);if(e.pendingBytes+=n,e.pendingBytes>=this.pushByteCap){this.flush(e,"byte_cap");return}e.pushTimer===void 0&&(e.pushTimer=this.timers.setTimeout(()=>{this.flush(e,"window_idle")},this.pushWindowMs))}async flush(e,r){if(e.pushTimer!==void 0&&(this.timers.clearTimeout(e.pushTimer),e.pushTimer=void 0),e.pendingEvents.length===0)return;let n=e.pendingEvents;e.pendingEvents=[],e.pendingBytes=0;let s={kind:"provider",session_id:e.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=${e.session_id} reason=${r} events=${n.length}`)}catch(o){this.opts.log?.(`[dt-3] publish failed session=${e.session_id} reason=${r}: ${o instanceof Error?o.message:String(o)}`)}}wireChildExit(e,r){let n=e.generation;r.on("exit",(s,o)=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child exited code=${s??"?"} signal=${o??""}; session ended. Click Reset to start a new chat.`}}),this.flush(e,"child_exit"),e.closed=!0))}),r.on("error",s=>{n===e.generation&&(e.closed||(this.appendEvent(e,{event_type:"error",payload:{message:`provider child error: ${s.message}`}}),this.flush(e,"child_exit")))})}};WC={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 Vy(t,e){t.post("/mailbox/chat/launch",r=>BC(r,e)),t.post("/mailbox/chat/end/:session_id",r=>qC(r,e)),t.get("/mailbox/chat/sessions",r=>HC(r,e))}async function BC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured (mailbox runtime missing)"},503);let n;try{n=await t.req.json()}catch{return t.json({error:"bad_request",message:"invalid JSON body"},400)}let s=n.session_id;if(typeof s!="string"||!Gy.test(s))return t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400);let o=n.provider;if(typeof o!="string"||o==="")return t.json({error:"bad_request",message:"provider is required"},400);let i;if(typeof n.command_line=="string"&&n.command_line.trim()!==""){if(i=Xy(n.command_line),i===void 0)return t.json({error:"bad_request",message:"command_line could not be parsed"},400)}else{let a=Jy(o);if(a===void 0)return t.json({error:"no_default_for_provider",message:`no PERSISTENT_LAUNCH_DEFAULTS entry for provider "${o}"`},400);i={cmd:a.cmd,args:[...a.args]}}try{let{pid:a}=await r.startSession({session_id:s,provider:o,command:i.cmd,args:i.args,...typeof n.cwd=="string"&&n.cwd!==""?{cwd:n.cwd}:{}});return t.json({session_id:s,provider:o,pid:a,command:i.cmd,args:i.args},201)}catch(a){let l=a instanceof Error?a.message:String(a);return l.startsWith("persistent_session_already_exists")?t.json({error:"session_exists",message:l},409):l.startsWith("no_persistent_adapter_for_provider")?t.json({error:"no_adapter",message:l},400):t.json({error:"spawn_failed",message:l},500)}}async function qC(t,e){let r=e.persistentSessionManager;if(r===void 0)return t.json({error:"chat_unavailable",message:"persistent session manager not configured"},503);let n=t.req.param("session_id");return n===void 0||!Gy.test(n)?t.json({error:"bad_request",message:"session_id must be a UUIDv7 string"},400):(await r.endSession(n),t.json({session_id:n,ended:!0}))}function HC(t,e){let r=e.persistentSessionManager;return r===void 0?t.json({sessions:[],note:"persistent session manager not configured"}):t.json({sessions:r.listSessions()})}var Gy,Ky=b(()=>{"use strict";Ju();Gy=/^[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 JC}from"node:fs";function zy(t){let e=t.artifacts.find(r=>r.kind===`${t.state_name}_transcript`);if(e?.content!==void 0&&e.content!==null)return Yy(e.content);if(e?.path===void 0||e.path===null)return[];try{let r=JC(e.path,{encoding:"utf8"});return Yy(r)}catch{return[]}}function Yy(t){let e=t.split(/\r?\n/).filter(r=>r.trim().length>0);return e.length===0?[]:e.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 Zy=b(()=>{"use strict"});function Qy(t,e,r){let n=t.getRun(e);if(n===null)return{err:`run ${e}: not found`};if(r!==void 0){let l=t.findTeamMemberByAlias(n.team_id,r);return l===null?{err:`run ${e}: team has no member alias "${r}"`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let s=t.latestAgentCall(e);if(s!==null){let l=t.findTeamMemberByAlias(n.team_id,s.alias);return l===null?{err:`run ${e}: team has no member alias "${s.alias}" (latest agent_call references a member that has been removed)`}:l.sessionid===null||l.sessionid.length===0?{err:`run ${e}: member "${l.alias}" has no sessionid yet (seed first)`}:{ok:{provider:l.provider,sessionid:l.sessionid,sessiondir:l.sessiondir,alias:l.alias,...l.model!==null&&l.model!==void 0?{model:l.model}:{}}}}let i=t.listTeamMembers(n.team_id).filter(l=>l.state!=="retired"&&l.sessionid!==null&&l.sessionid.length>0);if(i.length===0)return{err:`run ${e}: cannot resolve an agent session (no agent_call yet, no seeded member)`};if(i.length>1){let l=i.map(c=>c.alias).join(", ");return{err:`run ${e}: cannot resolve an agent session (no agent_call yet; team has multiple members [${l}] \u2014 pass --alias)`}}let a=i[0];return{ok:{provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,alias:a.alias,...a.model!==null&&a.model!==void 0?{model:a.model}:{}}}}function sa(t,e){let r=t.query(`SELECT id, kind FROM attention
1634
1622
  WHERE run_id = ?
1635
1623
  AND acknowledged_at IS NULL
1636
1624
  AND requires_user = 1
1637
- ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var oa=b(()=>{"use strict"});function cy(t,e){t.all("/runtime/*",r=>XC(r.req.raw,e))}async function XC(t,e){try{return Response.json(await GC(t,e))}catch(r){if(r instanceof oe)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 GC(t,e){let r=new URL(t.url),n=eM(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Xu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ia(t,n.id,s[2]),VC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ia(t,n.id,s[2]);let o=ty(e.dal,s[4]);return ey(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Xu(t),e.dal.listTeams().map(o=>QC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=ry(e.dal,ny(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return oy(t,n.id,i.context),sy(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=ry(e.dal,ny(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");oy(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return sy(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ia(t,n.id,s[2]);let o=ty(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return zC(e.dal,o,a),ey(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return bs(t,n.id),e.dal.listWorkflows().map(o=>tM(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){bs(t,n.id);let o=nM(e.dal,s[2]);return rM(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){bs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return sM(e.dal,o,i).map(l=>ay(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){bs(t,n.id);let o=iy(e.dal,s[2]);return ay(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){bs(t,n.id);let o=iy(e.dal,s[2]),i=iM(e.dal,o);return{runId:zu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function VC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>uy(t,e,r))}}function ey(t,e,r){let n=uy(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:KC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:YC(t,r)}}function uy(t,e,r){let n=dy(t,r.id),s=Vu(n);return{id:r.name,workspaceId:e.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 KC(t,e){let r=dy(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Vu(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 YC(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function zC(t,e,r){let n=ZC(t,e.id);if(n!==null){let s=sa(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=wt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function dy(t,e){return t.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",e)[0]??null}function ZC(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e)[0]??null}function Vu(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function ty(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function ry(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function ny(t){return t.startsWith("team:")?t.slice(5):t}function QC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function sy(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??ly}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function eM(t){let e=t.workspaceName??Rn()??_r.default;return{id:e,name:e}}function Xu(t){if(t.headers.get("x-lmctl-workspace-id")!==ly)throw new oe(400,"runtime request requires global-admin workspace identity")}function ia(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function bs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function oy(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");ia(t,e,r.workspaceId);return}Xu(t)}function Ku(t){return`${bn}${Yu(t.name)}`}function Yu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zu(t){return`${Gu}${t.id}`}function tM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description}}}function rM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function aa(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=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&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function nM(t,e){if(!e.startsWith(bn))throw new oe(404,`template not found: ${e}`);let r=e.slice(bn.length),n=t.listWorkflows().filter(s=>Yu(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function iy(t,e){if(!e.startsWith(Gu))throw new oe(404,`run not found: ${e}`);let r=e.slice(Gu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function sM(t,e,r){if(r!==null){if(!r.startsWith(bn))return[];let s=r.slice(bn.length),o=t.listWorkflows().filter(a=>Yu(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.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 ay(t,e){let r=t.getWorkflow(e.workflow_id),n=Vu(e),s=oM(r,e);return{id:zu(e),templateId:r===null?`${bn}unknown`:Ku(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function oM(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[aa(t.definition).nameToId.get(r)??r]}function iM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:aa(r.definition),s=c=>n.nameToId.get(c)??c,o=zu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=aM(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=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)})(),d=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{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+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 aM(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var ly,bn,Gu,oe,fy=b(()=>{"use strict";Ve();oa();Ot();ly="global-admin";bn="template:",Gu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as lM,writeFileSync as cM}from"node:fs";import{randomUUID as my}from"node:crypto";import{dirname as uM,resolve as la,sep as py}from"node:path";async function _y(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!hM(n))return t.text("missing image file",400);if(n.size>dM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=_M(s);if(o===null||!(o in hy))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=fM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?la(pM()):la(i.local_path),l=la(a,"uploads",my()),c=la(l,`${my()}${hy[o]}`);if(!mM(c,a))return t.text("invalid upload path",400);lM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);cM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function fM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function mM(t,e){let r=e.endsWith(py)?e:`${e}${py}`;return t.startsWith(r)}function pM(){return uM(ue())}function hM(t){return typeof File<"u"&&t instanceof File}function _M(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var dM,hy,gy=b(()=>{"use strict";Ve();dM=10*1024*1024,hy={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ca}from"node:fs";import{basename as gM,dirname as wM,extname as yM,isAbsolute as EM,join as bM,relative as SM}from"node:path";import{fileURLToPath as TM}from"node:url";import{Hono as kM}from"hono";import{serveStatic as Et}from"@hono/node-server/serve-static";function ky(t){let e=new kM,r=[],n=t.localWebui!==void 0?Qu(t.localWebui.webuiDir):vM();if(t.localWebui!==void 0&&$w(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=IM();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Et({root:n})),e.use("/vendor/*",s,Et({root:n})),e.use("/src/*",s,Et({root:n})),e.get("/",s,Et({root:n,path:"index.html"})),e.get("/admin",s,Et({root:n,path:"index.html"})),e.get("/admin/*",s,Et({root:n,path:"index.html"})),e.get("/terminal",s,Et({root:n,path:"index.html"})),e.get("/terminal/*",s,Et({root:n,path:"index.html"})),e.get("/chat",s,Et({root:n,path:"index.html"})),e.get("/chat/*",s,Et({root:n,path:"index.html"}))}else e.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 e.use("*",p_()),e.get("/login",s=>s.html(Ae("Login",`
1625
+ ORDER BY id DESC LIMIT 1`,e);return r.length===0?null:{kind:r[0].kind,attention_id:r[0].id}}var oa=b(()=>{"use strict"});function cw(t,e){t.all("/runtime/*",r=>XC(r.req.raw,e))}async function XC(t,e){try{return Response.json(await GC(t,e))}catch(r){if(r instanceof oe)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 GC(t,e){let r=new URL(t.url),n=eM(e),s=r.pathname.split("/").filter(Boolean).map(decodeURIComponent);if(t.method==="GET"&&r.pathname==="/runtime/workspaces")return Xu(t),[{id:n.id,name:n.name}];if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="workspaces")return ia(t,n.id,s[2]),VC(e.dal,n);if(t.method==="GET"&&s.length===5&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"){ia(t,n.id,s[2]);let o=tw(e.dal,s[4]);return ew(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/lead-teams")return Xu(t),e.dal.listTeams().map(o=>QC(o));if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="chat"){let o=rw(e.dal,nw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead chat body does not match route team");return ow(t,n.id,i.context),sw(o,i.context)}if(t.method==="POST"&&s.length===4&&s[0]==="runtime"&&s[1]==="lead-teams"&&s[3]==="messages"){let o=rw(e.dal,nw(s[2])),i=await t.json();if(i.teamId!==`team:${o.name}`)throw new oe(400,"runtime lead message body does not match route team");ow(t,n.id,i.context);let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime lead message requires draft.body");return sw(o,i.context,a)}if(t.method==="POST"&&s.length===6&&s[0]==="runtime"&&s[1]==="workspaces"&&s[3]==="projects"&&s[5]==="workflow-message"){ia(t,n.id,s[2]);let o=tw(e.dal,s[4]),i=await t.json();if(i.workspaceId!==n.id||i.projectId!==o.name)throw new oe(400,"runtime request body does not match route workspace/project");let a=i.draft?.body;if(typeof a!="string"||a.length===0)throw new oe(400,"runtime workflow message requires draft.body");return zC(e.dal,o,a),ew(e.dal,n,o)}if(t.method==="GET"&&r.pathname==="/runtime/templates")return bs(t,n.id),e.dal.listWorkflows().map(o=>tM(o));if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="templates"){bs(t,n.id);let o=nM(e.dal,s[2]);return rM(o)}if(t.method==="GET"&&r.pathname==="/runtime/runs"){bs(t,n.id);let o=r.searchParams.get("project"),i=r.searchParams.get("template");if(o!==null&&i!==null)throw new oe(400,"conflicting_filters: ?project= and ?template= are mutually exclusive");return sM(e.dal,o,i).map(l=>aw(e.dal,l))}if(t.method==="GET"&&s.length===3&&s[0]==="runtime"&&s[1]==="runs"){bs(t,n.id);let o=iw(e.dal,s[2]);return aw(e.dal,o)}if(t.method==="GET"&&s.length===4&&s[0]==="runtime"&&s[1]==="runs"&&s[3]==="events"){bs(t,n.id);let o=iw(e.dal,s[2]),i=iM(e.dal,o);return{runId:zu(o),events:i,...i.length>0?{cursor:i[i.length-1].id}:{}}}throw new oe(404,`unknown runtime request: ${t.method} ${r.pathname}`)}function VC(t,e){return{id:e.id,name:e.name,projects:t.listProjects().map(r=>uw(t,e,r))}}function ew(t,e,r){let n=uw(t,e,r);return{...n,managedWorkflow:{...n.managedWorkflow,instance:KC(t,r),composerTarget:{kind:"workflow-initial",label:`Project Workflow: ${r.workflow_name}`,templateId:`template:${r.workflow_name}`,runId:n.managedWorkflow.runId}},workflowMessages:YC(t,r)}}function uw(t,e,r){let n=dw(t,r.id),s=Vu(n);return{id:r.name,workspaceId:e.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 KC(t,e){let r=dw(t,e.id),n=r?.current_state??null;return{id:r===null?`project:${e.id}:no-run`:`run:${r.id}`,templateId:`template:${e.workflow_name}`,label:e.workflow_name,status:Vu(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 YC(t,e){return t.query("SELECT * FROM attention WHERE project_id = ? ORDER BY id ASC LIMIT 50",e.id).map(n=>({id:`attention:${n.id}`,role:"event",author:"lmctl",timestamp:n.created_at,body:n.kind}))}function zC(t,e,r){let n=ZC(t,e.id);if(n!==null){let s=sa(t,n.id);if(s?.kind==="workflow_escalation"){let o=t.resumeEscalation(s.attention_id,r);if(!o.resumed)throw new oe(409,`workflow escalation resume failed: ${o.reason}`);return}if(s?.kind==="interactive_waiting_operator"){let o=yt(t,s.attention_id);if(o?.step_id===null||o?.step_id===void 0)throw new oe(409,"interactive resume failed: missing step");let i=t.resumeInteractive(o.step_id,r,!0);if(!i.resumed)throw new oe(409,`interactive resume failed: ${i.reason}`);return}}t.enqueueJob({project_id:e.id,source:"runtime-workflow-message",payload:JSON.stringify({prompt:r}),priority:0})}function dw(t,e){return t.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",e)[0]??null}function ZC(t,e){return t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e)[0]??null}function Vu(t){return t===null?"queued":t.terminal_state===null?"running":t.terminal_state==="done"||t.terminal_state==="success"?"succeeded":t.terminal_state==="cancelled"||t.terminal_state==="aborted"?"cancelled":"failed"}function tw(t,e){let r=t.findProjectByName(e);if(r===null)throw new oe(404,`project not found: ${e}`);return r}function rw(t,e){let r=t.listTeams().find(n=>n.name===e);if(r===void 0)throw new oe(404,`team not found: ${e}`);return r}function nw(t){return t.startsWith("team:")?t.slice(5):t}function QC(t){return{id:`team:${t.name}`,name:t.name,teamfile:"",hasLead:!0,kind:t.name.toLowerCase().includes("manager")?"global-manager":"custom-ai-led"}}function sw(t,e,r){let n=new Date().toISOString(),s=r===void 0?[]:[{id:`lead:${t.id}:user:${Date.now()}`,role:"user",author:"operator",timestamp:n,body:r},{id:`lead:${t.id}:event:${Date.now()}`,role:"event",author:"lmctl",timestamp:n,body:"Lead-team mailbox request accepted by the runtime dispatcher."}];return{id:`lead-chat:${t.name}:${e?.scope??"global-admin"}:${e?.workspaceId??lw}`,teamId:`team:${t.name}`,title:`${t.name} Lead`,messages:s,...e===void 0?{}:{context:e}}}function eM(t){let e=t.workspaceName??Rn()??_r.default;return{id:e,name:e}}function Xu(t){if(t.headers.get("x-lmctl-workspace-id")!==lw)throw new oe(400,"runtime request requires global-admin workspace identity")}function ia(t,e,r){let n=t.headers.get("x-lmctl-workspace-id");if(n===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e||n!==e)throw new oe(400,"runtime workspace identity does not match route")}function bs(t,e){let r=t.headers.get("x-lmctl-workspace-id");if(r===null)throw new oe(400,"runtime request requires workspace identity");if(r!==e)throw new oe(400,"runtime workspace identity does not match server workspace")}function ow(t,e,r){if(r?.scope==="workspace"){if(r.workspaceId===void 0)throw new oe(400,"workspace manager context requires workspace identity");ia(t,e,r.workspaceId);return}Xu(t)}function Ku(t){return`${bn}${Yu(t.name)}`}function Yu(t){return t.trim().toLowerCase().replace(/[^a-z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"item"}function zu(t){return`${Gu}${t.id}`}function tM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description}}}function rM(t){let e=aa(t.definition);return{id:Ku(t),name:t.name,...e.description===null?{}:{description:e.description},graph:e.graph}}function aa(t){let e;try{e=JSON.parse(t)}catch{return{description:null,graph:null,stepIds:[],nameToId:new Map}}if(e===null||typeof e!="object")return{description:null,graph:e,stepIds:[],nameToId:new Map};let r=e,n=typeof r.description=="string"?r.description:null,s=[],o=new Map;if(r.schema_version==="lmctl/v3"&&Array.isArray(r.steps)){let i=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&&o.set(a.name,l))}i!==null&&s.includes(i)&&s.sort((a,l)=>a===i?-1:l===i?1:0)}return{description:n,graph:e,stepIds:s,nameToId:o}}function nM(t,e){if(!e.startsWith(bn))throw new oe(404,`template not found: ${e}`);let r=e.slice(bn.length),n=t.listWorkflows().filter(s=>Yu(s.name)===r);if(n.length===0)throw new oe(404,`template not found: ${e}`);if(n.length>1){let s=n.map(o=>o.name).join(", ");throw new oe(409,`template_id_ambiguous: ${e} matches multiple workflow names [${s}]; rename to ensure unique slugs`)}return n[0]}function iw(t,e){if(!e.startsWith(Gu))throw new oe(404,`run not found: ${e}`);let r=e.slice(Gu.length);if(!/^[1-9]\d*$/.test(r))throw new oe(404,`run not found: ${e}`);let n=Number.parseInt(r,10);if(!Number.isFinite(n)||n<=0||String(n)!==r)throw new oe(404,`run not found: ${e}`);let s=t.getRun(n);if(s===null)throw new oe(404,`run not found: ${e}`);return s}function sM(t,e,r){if(r!==null){if(!r.startsWith(bn))return[];let s=r.slice(bn.length),o=t.listWorkflows().filter(a=>Yu(a.name)===s).map(a=>a.id);if(o.length===0)return[];let i=o.map(()=>"?").join(", ");return t.query(`SELECT * FROM run WHERE workflow_id IN (${i}) ORDER BY id DESC LIMIT 200`,...o)}if(e===null)return t.query("SELECT * FROM run ORDER BY id DESC LIMIT 200");let n=t.findProjectByName(e);return n===null?[]:t.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 aw(t,e){let r=t.getWorkflow(e.workflow_id),n=Vu(e),s=oM(r,e);return{id:zu(e),templateId:r===null?`${bn}unknown`:Ku(r),label:r===null?`run ${e.id}`:`${r.name} #${e.id}`,status:n,createdAt:e.started_at,...e.ended_at===null?{}:{updatedAt:e.ended_at},currentStepIds:s}}function oM(t,e){if(e.current_state===null)return[];let r=e.current_state.startsWith("__paused__:")?e.current_state.slice(11):e.current_state;return t===null?[r]:[aa(t.definition).nameToId.get(r)??r]}function iM(t,e){let r=t.getWorkflow(e.workflow_id),n=r===null?{stepIds:[],nameToId:new Map}:aa(r.definition),s=c=>n.nameToId.get(c)??c,o=zu(e),i=[];i.push({timestamp:e.started_at,type:"run.started",message:"Run started"});let a=t.listStepsForRun(e.id);for(let c of a){let u=s(c.state_name);if(i.push({timestamp:c.started_at,type:"step.started",stepId:u,message:`step ${c.state_name} started`}),c.ended_at!==null){let d=aM(c);i.push({timestamp:c.ended_at,type:d,stepId:u,...c.outcome===null?{}:{message:c.outcome},...c.status_detail===null?{}:{payload:{status_detail:c.status_detail}}})}else e.paused_at!==null&&c.id===a[a.length-1]?.id&&i.push({timestamp:e.paused_at,type:"step.paused",stepId:u})}let l=t.listSessionEvents(e.id);for(let c of l){let u=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)})(),d=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{}i.push({timestamp:d,type:"message",...u===void 0?{}:{stepId:u},payload:f})}if(e.terminal_state!==null){let c=e.terminal_state==="done"||e.terminal_state==="success"?"run.completed":e.terminal_state==="cancelled"||e.terminal_state==="aborted"?"run.cancelled":"run.failed";i.push({timestamp:e.ended_at??e.started_at,type:c,message:e.terminal_state})}return i.sort((c,u)=>c.timestamp.localeCompare(u.timestamp)),i.map((c,u)=>({id:`${o}:evt:${u+1}`,runId:o,sequence:u+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 aM(t){if(t.outcome===null)return"step.failed";let e=t.status_detail;return e==="failed"||e==="error"||e==="aborted"?"step.failed":"step.completed"}var lw,bn,Gu,oe,fw=b(()=>{"use strict";Ve();oa();Ot();lw="global-admin";bn="template:",Gu="run:";oe=class extends Error{status;constructor(e,r){super(r),this.status=e}}});import{mkdirSync as lM,writeFileSync as cM}from"node:fs";import{randomUUID as mw}from"node:crypto";import{dirname as uM,resolve as la,sep as pw}from"node:path";async function _w(t,e){let r;try{r=await t.req.parseBody({all:!1})}catch{return t.text("invalid multipart body",400)}let n=r.image;if(!hM(n))return t.text("missing image file",400);if(n.size>dM)return t.text("upload too large",413);let s=Buffer.from(await n.arrayBuffer()),o=_M(s);if(o===null||!(o in hw))return t.text("unsupported upload MIME type",415);if(n.type.length>0&&n.type!==o)return t.text("upload MIME type does not match file content",415);let i=fM(e,r.project);if(typeof i=="string")return t.text(i,404);let a=i===null?la(pM()):la(i.local_path),l=la(a,"uploads",mw()),c=la(l,`${mw()}${hw[o]}`);if(!mM(c,a))return t.text("invalid upload path",400);lM(l,{recursive:!0});let u=new Uint8Array(s.buffer,s.byteOffset,s.byteLength);cM(c,u);let d={path:c,size:s.byteLength,mime:o,project:i?.name??null};return t.json(d)}function fM(t,e){return e==null||e===""?null:typeof e!="string"?"invalid project":t.findProjectByName(e)??`project not found: ${e}`}function mM(t,e){let r=e.endsWith(pw)?e:`${e}${pw}`;return t.startsWith(r)}function pM(){return uM(ue())}function hM(t){return typeof File<"u"&&t instanceof File}function _M(t){return t.length>=8&&t[0]===137&&t[1]===80&&t[2]===78&&t[3]===71&&t[4]===13&&t[5]===10&&t[6]===26&&t[7]===10?"image/png":t.length>=3&&t[0]===255&&t[1]===216&&t[2]===255?"image/jpeg":t.length>=12&&t.subarray(0,4).toString("ascii")==="RIFF"&&t.subarray(8,12).toString("ascii")==="WEBP"?"image/webp":t.length>=12&&t.subarray(4,8).toString("ascii")==="ftyp"&&["heic","heix","hevc","hevx","mif1","msf1"].includes(t.subarray(8,12).toString("ascii"))?"image/heic":t.length>=5&&t.subarray(0,5).toString("ascii")==="%PDF-"?"application/pdf":null}var dM,hw,gw=b(()=>{"use strict";Ve();dM=10*1024*1024,hw={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/heic":".heic","application/pdf":".pdf"}});import{existsSync as ca}from"node:fs";import{basename as gM,dirname as yM,extname as wM,isAbsolute as EM,join as bM,relative as SM}from"node:path";import{fileURLToPath as TM}from"node:url";import{Hono as kM}from"hono";import{serveStatic as Et}from"@hono/node-server/serve-static";function kw(t){let e=new kM,r=[],n=t.localWebui!==void 0?Qu(t.localWebui.webuiDir):vM();if(t.localWebui!==void 0&&$y(e,{s3:t.localWebui.localMailbox.s3,commands:t.localWebui.localMailbox.commands}),n!==null){let s=IM();t.localWebui!==void 0?e.get("/config.json",s,o=>o.json({workspaceFetchMode:"local-mailbox",localMailbox:{base:"/local-mailbox",userId:"local",deviceId:"local"},mailboxPolling:{readIntervalSeconds:1,heartbeatIdleSeconds:1,backoffReadIntervalSeconds:1}})):t.webuiRuntimeConfig!==void 0&&e.get("/config.json",s,o=>o.json(t.webuiRuntimeConfig)),e.use("/dist/*",s,Et({root:n})),e.use("/vendor/*",s,Et({root:n})),e.use("/src/*",s,Et({root:n})),e.get("/",s,Et({root:n,path:"index.html"})),e.get("/admin",s,Et({root:n,path:"index.html"})),e.get("/admin/*",s,Et({root:n,path:"index.html"})),e.get("/terminal",s,Et({root:n,path:"index.html"})),e.get("/terminal/*",s,Et({root:n,path:"index.html"})),e.get("/chat",s,Et({root:n,path:"index.html"})),e.get("/chat/*",s,Et({root:n,path:"index.html"}))}else e.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 e.use("*",p_()),e.get("/login",s=>s.html(Ae("Login",`
1638
1626
  <h1>Login</h1>
1639
1627
  <form method="post" action="/login">
1640
1628
  <label>Token <input name="token" type="password"></label>
1641
1629
  <button type="submit">Login</button>
1642
1630
  </form>
1643
- `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return __(i)?(au(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(g_(s),s.redirect("/login",302))),pw(e,{dal:t.dal}),cy(e,{dal:t.dal}),Aw(e,{dal:t.dal}),Bw(e,{terminalSessionManager:t.terminalSessionManager}),Vw(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await lc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return B(s,{team:o,seeded:u,failed:d},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>`)}),k_(e,{dal:t.dal}),A_(e,{dal:t.dal}),e.get("/api/status",s=>B(s,Co(t.dal),OM)),e.get("/api/projects",s=>B(s,Mo(t.dal),LM)),e.get("/api/teams",s=>B(s,Op(t.dal),DM)),e.get("/api/workflows",s=>B(s,Do(t.dal),PM)),e.get("/api/workflows/verify",s=>{let o=Zg();return s.req.header("accept")?.includes("text/plain")?s.text(ew(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Lp(t.dal,{status:s.req.query("status")}),FM)),e.post("/api/uploads",s=>_y(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Po(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return B(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Es(),uw)),i=Po(t.dal,re(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),CM)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{sr(u)}catch{return s.text("invalid condition",400)}let d=$M(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return B(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?B(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():B(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=yy(s.req.query("status"),jM);if(typeof i=="string")return s.text(i,400);let a=yy(s.req.query("severity"),Iy);return typeof a=="string"?s.text(a,400):B(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),MM)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=AM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=RM(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return B(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===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=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):B(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):B(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return B(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return B(s,t.dal.reopenIssue(re(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return B(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Ir(t.dal,o,i);return B(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Ir(t.dal,o,i);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):B(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=NM(l.path);if(xM(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=gM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return B(s,l,le)}return B(s,l,le)}),e.get("/api/runs",s=>B(s,Yr(t.dal,{limit:Zu(s,"limit")??100}),UM)),e.get("/api/runs/:id",s=>{let o=vr(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,WM)}),e.get("/api/runs/:id/where",s=>{let o=zr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Wo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.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&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ua(t.daemon),B(s,i,Ey)):B(s,i,Ey,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(ua(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>wy(s,t.dal,o=>B(s,o,qM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Pp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():vy(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>wy(s,t.dal,o=>{let i=zw(o);return B(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>B(s,Fp(t.dal,{type:s.req.query("type")}),HM)),e.get("/api/external-signals",s=>B(s,Up(t.dal,{unhandled:s.req.query("unhandled")==="true"}),JM)),e.get("/api/attentions",s=>B(s,Qt(t.dal,{unacked:s.req.query("unacked")==="true"}),XM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Fo(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=wt(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=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"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=wt(t.dal,o);if(c===null)return s.notFound();let u=Qt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ua(t.daemon);let p=Qt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return ua(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Cp(t.dal,{status:i,pr_url:o});return B(s,a,GM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Mp(t.dal,o);return i===null?s.notFound():B(s,i,VM)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),by)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Kn(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),by)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Kn(s.req.param("team_name"));try{let i=await Ip(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sy("compacted",a.row))}catch(i){if(i instanceof Vn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=await lc(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sy(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,Ty)),e.post("/api/intake/scan",async s=>(r=await fn(t.dal),B(s,r,Ty))),e.get("/api/stats/run-throughput",s=>B(s,qp(t.dal),KM)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,YM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},le);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=hc(t.dal,o),l=_c(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,zM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(hc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(_c(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function wy(t,e,r){let n=pc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ua(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return vy(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function vy(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function vM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ca(`${t}/index.html`)?Qu(t):null;let e="src/serve/webui-dist";if(ca(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ca(`${r}/index.html`))return r;let n=bM(wM(TM(import.meta.url)),"webui-dist");return ca(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!EM(t))return t;let e=SM(process.cwd(),t);return e.length===0?".":e}function IM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function NM(t){switch(yM(t).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function xM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Sn(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function $M(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function yy(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function AM(t){if(t!=null)return typeof t=="string"&&Iy.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function RM(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function OM(t){return`<h1>Status</h1><div class="grid">
1631
+ `))),e.post("/login",async s=>{let o=await s.req.parseBody(),i=typeof o.token=="string"?o.token:"";return __(i)?(au(s,i),s.redirect("/",302)):s.html(Ae("Login","<p>Invalid token</p>"),401)}),e.post("/logout",s=>(g_(s),s.redirect("/login",302))),py(e,{dal:t.dal}),cw(e,{dal:t.dal}),Ay(e,{dal:t.dal}),By(e,{terminalSessionManager:t.terminalSessionManager}),Vy(e,{persistentSessionManager:t.persistentSessionManager}),e.post("/api/teams/:team_name/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=t.dal.findTeamByName(o);if(i===null)return s.notFound();let a=[],c=t.dal.db.transaction(()=>{let f=t.dal.listTeamMembers(i.id),m=f.filter(p=>p.state!=="idle");if(m.length>0)return{ok:!1,nonIdle:m.map(p=>({alias:p.alias,state:p.state}))};for(let p of f)t.dal.setMemberState(p.id,"in_chat","refreshing");return a=f.map(p=>({id:p.id,alias:p.alias})),{ok:!0}})();if(!c.ok){let f=c.nonIdle.map(m=>`${m.alias}:${m.state}`).join(", ");return s.text(`refresh refused: non-idle members: ${f}`,409)}let u=[],d=[];for(let f of a)try{await lc(t.dal,o,f.alias),t.dal.setMemberState(f.id,"idle",null),u.push(f.alias)}catch(m){let p=m instanceof Error?m.message:String(m);t.dal.setMemberState(f.id,"attention_needed",`refresh failed: ${p}`),d.push({alias:f.alias,error:p})}return B(s,{team:o,seeded:u,failed:d},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>`)}),k_(e,{dal:t.dal}),A_(e,{dal:t.dal}),e.get("/api/status",s=>B(s,Co(t.dal),OM)),e.get("/api/projects",s=>B(s,Mo(t.dal),LM)),e.get("/api/teams",s=>B(s,Op(t.dal),DM)),e.get("/api/workflows",s=>B(s,Do(t.dal),PM)),e.get("/api/workflows/verify",s=>{let o=Zg();return s.req.header("accept")?.includes("text/plain")?s.text(ey(o)):s.json(o)}),e.get("/api/jobs",s=>B(s,Lp(t.dal,{status:s.req.query("status")}),FM)),e.post("/api/uploads",s=>_w(s,t.dal)),e.get("/api/jobs/:id",s=>{let o=Po(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/jobs",async s=>{let o;try{o=await s.req.json()}catch{return s.text("invalid JSON body",400)}let i=null;if(typeof o.project_id=="number")i=o.project_id;else if(typeof o.project=="string"){let f=t.dal.findProjectByName(o.project);if(f===null)return s.text(`project not found: ${o.project}`,404);i=f.id}else{let f=t.dal.listProjects();f.length===1&&(i=f[0].id)}if(i===null)return s.text("missing project or project_id",400);let a=typeof o.workflow_id_override=="number"?o.workflow_id_override:null;if(a===null&&typeof o.workflow=="string"){let f=t.dal.getWorkflowByName(o.workflow);if(f===null)return s.text(`workflow not found: ${o.workflow}`,404);a=f.id}let l=typeof o.source=="string"?o.source:"manual",c=o.payload,u=c==null?null:typeof c=="string"?c:JSON.stringify(c),d=t.dal.enqueueJob({project_id:i,workflow_id_override:a,source:l,source_ref:typeof o.source_ref=="string"?o.source_ref:null,payload:u,priority:typeof o.priority=="number"?o.priority:0,dedupe_key:typeof o.dedupe_key=="string"?o.dedupe_key:null});return B(s,d,le)}),e.post("/api/jobs/:id/run",async s=>{let{runJobById:o}=await Promise.resolve().then(()=>(Es(),uy)),i=Po(t.dal,re(s,"id"));if(i===null)return s.notFound();let a=await o({dal:t.dal,worker_id:`api-job-run-${process.pid}-${Date.now()}`,job_id:i.id});return a.claimed?s.json({job_id:a.job_id,run_id:a.run_id,status:a.status,terminal_state:a.terminal_state,ms:a.ms}):s.json(a,409)}),e.get("/api/workflows/:name",s=>{let o=t.dal.getWorkflowByName(s.req.param("name"));return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/workflows",s=>{let o=t.dal.findProjectByName(s.req.param("name"));return o===null?s.notFound():B(s,t.dal.listProjectWorkflows(o.id),CM)}),e.post("/api/projects/:name/workflows",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.workflow=="string"?i.workflow:null,l=typeof i.workflow_id=="number"?i.workflow_id:null,c=l!==null?t.dal.getWorkflow(l):a!==null?t.dal.getWorkflowByName(a):null;if(c===null)return s.text("workflow not found",404);let u=typeof i.condition=="string"&&i.condition.length>0?i.condition:null;if(u!==null)try{sr(u)}catch{return s.text("invalid condition",400)}let d=$M(i.parameters_override??i.params);if(typeof d=="string"&&d.startsWith("error:"))return s.text(d.slice(6),400);let f=typeof i.priority=="number"&&Number.isInteger(i.priority)?i.priority:100,m=t.dal.insertProjectWorkflow({project_id:o.id,workflow_id:c.id,condition:u,parameters_override:d,priority:f});return B(s,m,le)}),e.get("/api/projects/workflows/:id",s=>{let o=t.dal.getProjectWorkflow(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.delete("/api/projects/workflows/:id",s=>t.dal.removeProjectWorkflow(re(s,"id"))?B(s,{removed:!0},le):s.notFound()),e.post("/api/projects/workflows/:id/enable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!0);return o===null?s.notFound():B(s,o,le)}),e.post("/api/projects/workflows/:id/disable",s=>{let o=t.dal.setProjectWorkflowEnabled(re(s,"id"),!1);return o===null?s.notFound():B(s,o,le)}),e.get("/api/projects/:name/issues",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=ww(s.req.query("status"),jM);if(typeof i=="string")return s.text(i,400);let a=ww(s.req.query("severity"),Iw);return typeof a=="string"?s.text(a,400):B(s,t.dal.listIssues(o.id,{...i!==void 0?{status:i}:{},...a!==void 0?{severity:a}:{},...s.req.query("ai_test_path")!==void 0?{ai_test_path:s.req.query("ai_test_path")}:{}}),MM)}),e.post("/api/projects/:name/issues",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.text(i,400);let a=typeof i.title=="string"&&i.title.trim().length>0?i.title:null,l=typeof i.body=="string"?i.body:null;if(a===null||l===null)return s.text("missing title or body",400);let c=AM(i.severity);if(typeof c=="object")return s.text(c.error,400);let u=RM(i.labels);if(typeof u=="string"&&u.startsWith("error:"))return s.text(u.slice(6),400);let d=t.dal.createIssue({project_id:o.id,title:a,body:l,...c!==void 0?{severity:c}:{},labels:u,ai_test_path:typeof i.ai_test_path=="string"?i.ai_test_path:null,source_run_id:typeof i.source_run_id=="number"?i.source_run_id:null});return B(s,d,le)}),e.get("/api/issues/:id",s=>{let o=t.dal.getIssue(re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/issues/:id/claim",async s=>{let o=re(s,"id"),i=t.dal.getIssue(o);if(i===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=t.dal.claimIssue(o,l);return c===null?s.json({error:`issue ${o} is not in a claimable state (status=${i.status})`},400):B(s,c,le)}),e.post("/api/projects/:name/issues/claim-next",async s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.json({error:"project_not_found"},404);let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.assigned_run_id=="number"?i.assigned_run_id:null;if(a===null)return s.json({error:"missing assigned_run_id"},400);let l=t.dal.claimNextIssue(o.id,a);return l===null?s.json({status:"queue_empty"},404):B(s,l,le)}),e.post("/api/issues/:id/close",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.closed_run_id=="number"?i.closed_run_id:o.assigned_run_id;if(a===null)return s.json({error:"missing closed_run_id"},400);try{return B(s,t.dal.closeIssue(re(s,"id"),a,typeof i.commit_hash=="string"?i.commit_hash:null),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.post("/api/issues/:id/reopen",async s=>{let o=t.dal.getIssue(re(s,"id"));if(o===null)return s.notFound();let i=await Sn(s);if(typeof i=="string")return s.json({error:i},400);let a=typeof i.source_run_id=="number"?i.source_run_id:o.closed_run_id??o.source_run_id;if(a===null)return s.json({error:"missing source_run_id"},400);try{return B(s,t.dal.reopenIssue(re(s,"id"),a),le)}catch(l){return s.json({error:l instanceof Error?l.message:String(l)},400)}}),e.get("/api/projects/:name",s=>{let o=t.dal.findProjectByName(s.req.param("name"));if(o===null)return s.notFound();let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name;return B(s,{...o,owner:a,repo:l},le)}),e.get("/api/runs/:run_id/artifacts",s=>{let o=re(s,"run_id"),i=s.req.query("kind"),a=Ir(t.dal,o,i);return B(s,a,le)}),e.get("/api/runs/:run_id/artifacts/:kind",async s=>{let o=re(s,"run_id"),i=s.req.param("kind"),a=Ir(t.dal,o,i);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):B(s,l,le);if(l.path!==null&&l.path!==void 0){if(c)try{let{readFileSync:u}=await import("node:fs"),d=xM(l.path);if(NM(d)){let h=u(l.path,"utf8");return s.body(h,200,{"Content-Type":d})}let f=u(l.path),m=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength),p=gM(l.path);return s.body(m,200,{"Content-Type":d,"Content-Disposition":`attachment; filename="${p}"`})}catch(u){return s.text(`failed to read artifact path: ${u.message}`,500)}return B(s,l,le)}return B(s,l,le)}),e.get("/api/runs",s=>B(s,Yr(t.dal,{limit:Zu(s,"limit")??100}),UM)),e.get("/api/runs/:id",s=>{let o=vr(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,WM)}),e.get("/api/runs/:id/where",s=>{let o=zr(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Uo(o)):s.json(o)}),e.get("/api/runs/:id/timeline",s=>{let o=Wo(t.dal,re(s,"id"));return o===null?s.notFound():s.req.header("accept")?.includes("text/plain")?s.text(Bo(o)):s.json(o)}),e.post("/api/runs/:id/resume",async s=>{let o=s.req.query("outcome");if(o===void 0||o.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&&(o=c)}}if(o===void 0||o.length===0)return s.text("missing outcome",400);let i=t.dal.resumeRun(re(s,"id"),o);return!i.resumed&&i.reason==="run_not_found"?s.notFound():i.resumed?(ua(t.daemon),B(s,i,Ew)):B(s,i,Ew,400)}),e.post("/api/interactive/:step_id/respond",async s=>{let o=re(s,"step_id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let u=await s.req.json();typeof u.input=="string"&&(i=u.input),u.done===!0&&(a=!0)}catch{return s.text("invalid JSON body",400)}else{let u=await s.req.parseBody().catch(()=>({}));typeof u.input=="string"&&(i=u.input),(u.done==="true"||u.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=t.dal.resumeInteractive(o,i,a);return!c.resumed&&c.reason==="not_found"?s.notFound():c.resumed?(ua(t.daemon),s.json({resumed:!0,session_status:c.session.status})):s.json({resumed:!1,reason:c.reason},400)}),e.get("/api/runs/:id/steps/:step_id",s=>yw(s,t.dal,o=>B(s,o,qM))),e.get("/api/runs/:id/steps/:step_id/transcript",s=>{let o=Pp(t.dal,re(s,"id"),re(s,"step_id"));return o===null?s.notFound():vw(s)?s.html(`<pre>${S(o)}</pre>`):s.req.header("accept")?.includes("text/plain")?s.text(o):s.json({transcript:o})}),e.get("/api/runs/:id/steps/:step_id/messages",s=>yw(s,t.dal,o=>{let i=zy(o);return B(s,i,a=>fe(["role","text"],a.map(l=>[S(l.role),S(l.text)])))})),e.get("/api/external-objects",s=>B(s,Fp(t.dal,{type:s.req.query("type")}),HM)),e.get("/api/external-signals",s=>B(s,Up(t.dal,{unhandled:s.req.query("unhandled")==="true"}),JM)),e.get("/api/attentions",s=>B(s,Qt(t.dal,{unacked:s.req.query("unacked")==="true"}),XM)),e.post("/api/attentions/:id/ack",s=>{let o=t.dal.acknowledgeAttention(re(s,"id"));return o===null?s.notFound():B(s,o,i=>`<p>acknowledged attention ${S(i.id)}</p>`)}),e.get("/api/escalations",s=>{let o=s.req.query("project"),i=s.req.query("all")==="true",a=s.req.query("since"),l={all:i};o!==void 0&&(l.project=o),a!==void 0&&(l.since=a);let c=Fo(t.dal,l);return B(s,c,u=>`<h1>Escalations</h1>${fe(["attention_id","project","run","workflow","state","prompt"],u.map(d=>[S(d.attention_id),S(d.project),S(d.run_id),S(d.workflow_name),S(d.state_name),S((d.prompt??"").slice(0,120))]))}`)}),e.get("/api/escalations/:id",s=>{let o=yt(t.dal,re(s,"id"));return o===null?s.notFound():B(s,o,le)}),e.post("/api/escalations/:id/respond",async s=>{let o=re(s,"id"),i,a=!1;if((s.req.header("content-type")??"").includes("application/json"))try{let m=await s.req.json();typeof m.input=="string"&&(i=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"&&(i=m.input),(m.done==="true"||m.done===!0)&&(a=!0)}if(i===void 0)return s.text("missing input",400);let c=yt(t.dal,o);if(c===null)return s.notFound();let u=Qt(t.dal).find(m=>m.id===o);if(u===void 0)return s.notFound();if(u.kind==="workflow_escalation"){let m=t.dal.resumeEscalation(o,i);if(!m.resumed)return s.json({ok:!1,reason:m.reason},400);ua(t.daemon);let p=Qt(t.dal).find(h=>h.id===o);return s.json({ok:!0,attention_id:o,run_id:m.run.id,decision:i,session_status:"escalation_resumed",acknowledged_at:p?.acknowledged_at??null})}if(u.kind!=="interactive_waiting_operator")return s.json({ok:!1,reason:"wrong_kind",kind:u.kind},400);if(u.acknowledged_at!==null)return s.json({ok:!1,reason:"already_acked"},400);if(c.step_id===null)return s.json({ok:!1,reason:"no_step"},400);let d=t.dal.resumeInteractive(c.step_id,i,a);if(!d.resumed)return s.json({ok:!1,reason:d.reason,step_id:c.step_id},400);let f=t.dal.acknowledgeAttention(o);return ua(t.daemon),s.json({ok:!0,attention_id:o,step_id:c.step_id,session_status:d.session.status,acknowledged_at:f?.acknowledged_at??null})}),e.get("/api/submitted-prs",s=>{let o=s.req.query("pr_url"),i=s.req.query("status"),a=Cp(t.dal,{status:i,pr_url:o});return B(s,a,GM)}),e.get("/api/submitted-prs/:id",s=>{let o=re(s,"id"),i=Mp(t.dal,o);return i===null?s.notFound():B(s,i,VM)}),e.get("/api/sessions",s=>B(s,t.dal.latestSessionSizes(),bw)),e.get("/api/sessions/:team_name/:alias/history",s=>{let o=Kn(s.req.param("team_name"));return B(s,t.dal.sessionSizeHistory(o,s.req.param("alias")),bw)}),e.post("/api/sessions/:team_name/:alias/compact",async s=>{let o=Kn(s.req.param("team_name"));try{let i=await Ip(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sw("compacted",a.row))}catch(i){if(i instanceof Vn)return s.text(i.message,409);throw i}}),e.post("/api/sessions/:team_name/:alias/refresh",async s=>{let o=Kn(s.req.param("team_name")),i=await lc(t.dal,o,s.req.param("alias"));return B(s,i,a=>Sw(`refreshed ${a.sessionid}`,a.row))}),e.get("/api/intake/state",s=>B(s,r,Tw)),e.post("/api/intake/scan",async s=>(r=await fn(t.dal),B(s,r,Tw))),e.get("/api/stats/run-throughput",s=>B(s,qp(t.dal),KM)),e.get("/api/daemon/state",s=>B(s,t.daemon?.state??null,YM)),e.post("/api/daemon/cycle",async s=>{if(t.daemon===void 0)return B(s,{disabled:!0},le);let o=await t.daemon.runCycle();return B(s,{state:t.daemon.state,result:o},le)}),e.get("/metrics/:project_id",s=>{let o=re(s,"project_id"),i=t.dal.getProject(o);if(i===null)return s.notFound();let a=hc(t.dal,o),l=_c(t.dal,{project_id:o});return s.html(Ae(`Metrics \u2014 ${i.name}`,zM(i.name,a,l)))}),e.get("/api/metrics/reviewer/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(hc(t.dal,o,i))}),e.get("/api/metrics/tools/:project_id",s=>{let o=re(s,"project_id");if(t.dal.getProject(o)===null)return s.notFound();let i=Zu(s,"since_days");return s.json(_c(t.dal,{project_id:o,since_days:i}))}),e.post("/api/drift/:id/ack",s=>{let o=t.dal.acknowledgeDriftSignal(re(s,"id"));return o===null?s.notFound():s.json({id:o.id,acknowledged_at:o.acknowledged_at})}),e}function yw(t,e,r){let n=pc(e,re(t,"id"),re(t,"step_id"));return n===null?t.notFound():r(n)}function ua(t){t!==void 0&&t.runCycle().catch(()=>{})}function B(t,e,r,n=200){return vw(t)?n===200?t.html(r(e)):t.html(r(e),400):new Response(JSON.stringify(e),{status:n,headers:{"Content-Type":"application/json; charset=UTF-8"}})}function vw(t){let e=t.req.header("accept")??"";return e.includes("text/html")&&!e.includes("application/json")}function vM(){let t=process.env.LMCTL_WEBUI_DIST;if(t!==void 0)return ca(`${t}/index.html`)?Qu(t):null;let e="src/serve/webui-dist";if(ca(`${e}/index.html`))return e;let r="dist/serve/webui-dist";if(ca(`${r}/index.html`))return r;let n=bM(yM(TM(import.meta.url)),"webui-dist");return ca(`${n}/index.html`)?Qu(n):null}function Qu(t){if(!EM(t))return t;let e=SM(process.cwd(),t);return e.length===0?".":e}function IM(){return async(t,e)=>{await e(),t.header("Cache-Control","no-store")}}function re(t,e){return Number(t.req.param(e))}function Zu(t,e){let r=t.req.query(e);if(r===void 0)return;let n=Number(r);return Number.isInteger(n)&&n>0?n:void 0}function xM(t){switch(wM(t).toLowerCase()){case".txt":return"text/plain; charset=utf-8";case".md":return"text/markdown; charset=utf-8";case".html":case".htm":return"text/html; charset=utf-8";case".css":return"text/css; charset=utf-8";case".csv":return"text/csv; charset=utf-8";case".json":return"application/json; charset=utf-8";case".xml":return"application/xml; charset=utf-8";case".yaml":case".yml":return"text/yaml; charset=utf-8";case".js":case".mjs":case".cjs":return"text/javascript; charset=utf-8";case".ts":return"text/x-typescript; charset=utf-8";case".log":return"text/plain; charset=utf-8";case".docx":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case".xlsx":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case".pptx":return"application/vnd.openxmlformats-officedocument.presentationml.presentation";case".pdf":return"application/pdf";case".png":return"image/png";case".jpg":case".jpeg":return"image/jpeg";case".gif":return"image/gif";case".webp":return"image/webp";case".zip":return"application/zip";case".gz":return"application/gzip";default:return"application/octet-stream"}}function NM(t){return!!(t.startsWith("text/")||t.startsWith("application/json")||t.startsWith("application/xml"))}async function Sn(t){try{let e=await t.req.json();return e!==null&&typeof e=="object"&&!Array.isArray(e)?e:"invalid JSON body"}catch{return"invalid JSON body"}}function $M(t){if(t==null)return null;if(typeof t=="string"){try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e))return JSON.stringify(e)}catch{return"error:invalid parameters_override JSON"}return"error:parameters_override must be a JSON object"}return typeof t=="object"&&!Array.isArray(t)?JSON.stringify(t):"error:parameters_override must be a JSON object"}function ww(t,e){if(t===void 0||t.length===0)return;let r=t.split(",").map(n=>n.trim()).filter(n=>n.length>0);if(r.length!==0){for(let n of r)if(!e.includes(n))return`invalid value: ${n}`;return r}}function AM(t){if(t!=null)return typeof t=="string"&&Iw.includes(t)?t:{error:`invalid severity: ${String(t)}`}}function RM(t){if(t==null)return null;if(typeof t=="string")try{let e=JSON.parse(t);return Array.isArray(e)&&e.every(r=>typeof r=="string")?JSON.stringify(e):"error:labels must be a JSON string array"}catch{return"error:invalid labels JSON"}return Array.isArray(t)&&t.every(e=>typeof e=="string")?JSON.stringify(t):"error:labels must be a JSON string array"}function OM(t){return`<h1>Status</h1><div class="grid">
1644
1632
  <div class="metric"><strong>${t.jobs.queued}</strong><br>queued jobs</div>
1645
1633
  <div class="metric"><strong>${t.jobs.done}</strong><br>done jobs</div>
1646
1634
  <div class="metric"><strong>${t.runs.active}</strong><br>active runs</div>
@@ -1660,7 +1648,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1660
1648
  </fieldset>
1661
1649
  </form>
1662
1650
  <div id="pause-result" style="margin-top:0.6em;"></div>
1663
- </section>`}function qM(t){return`<section><h3>${S(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Ey(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function HM(t){return`<h1>External Objects</h1>${fe(["id","type","provider","external_id","status","url"],t.map(e=>[S(e.id),S(e.type),S(e.provider),S(e.external_id),S(e.status),S(e.url)]))}`}function JM(t){return`<h1>External Signals</h1>${fe(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function XM(t){let e=`<style>
1651
+ </section>`}function qM(t){return`<section><h3>${S(t.state_name)}</h3>${le(t)}<p><a hx-get="/api/runs/${t.run_id}/steps/${t.id}/transcript" hx-target="closest section" hx-swap="beforeend">Transcript</a> <a hx-get="/api/runs/${t.run_id}/steps/${t.id}/messages" hx-target="closest section" hx-swap="beforeend">Messages</a></p></section>`}function Ew(t){return t.resumed?`<p>resumed run ${S(t.run.id)}</p>`:`<p>resume failed: ${S(t.reason)}</p>`}function HM(t){return`<h1>External Objects</h1>${fe(["id","type","provider","external_id","status","url"],t.map(e=>[S(e.id),S(e.type),S(e.provider),S(e.external_id),S(e.status),S(e.url)]))}`}function JM(t){return`<h1>External Signals</h1>${fe(["id","object","kind","handled"],t.map(e=>[S(e.id),S(e.object_id),S(e.kind),S(e.handled_at)]))}`}function XM(t){let e=`<style>
1664
1652
  @keyframes attn-flicker { 0%,100%{background:#fff8e6;} 50%{background:#ffd766;} }
1665
1653
  tr.requires-user { animation: attn-flicker 1.4s ease-in-out infinite; font-weight:600; }
1666
1654
  tr.requires-user td:first-child::before { content:"\u2605 "; color:#d28e00; }
@@ -1674,7 +1662,7 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1674
1662
  <dt>submitted_at</dt><dd>${S(t.submitted_at)}</dd>
1675
1663
  <dt>last_scanned_at</dt><dd>${S(t.last_scanned_at??"\u2014")}</dd>
1676
1664
  <dt>last_known_state</dt><dd>${S(t.last_known_state??"\u2014")}</dd>
1677
- </dl>`}function by(t){return`<h1>Sessions</h1>${fe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=jo(e.team_name),n=encodeURIComponent(e.alias);return[S(e.team_name),S(e.alias),S(e.sessionid),S(e.input_tokens),S(e.cache_tokens),S(e.output_tokens),S(e.total_tokens),S(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Sy(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function KM(t){return`<h1>Run Throughput</h1>${fe(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function Ty(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${fe(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function YM(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function zM(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[S(l.state_name),S(l.total),S(l.request_changes),S(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[S(l.state_name),S(l.lt_5min),S(l.btw_5_15min),S(l.btw_15_60min),S(l.gt_60min),S(l.no_end)]),i=e.retry_counts.map(l=>[S(l.state_name),S(l.retried_runs),S(l.avg_retries)]),a=r.map(l=>[S(l.tool_name),S(l.invocations),S(l.successes),S(l.hit_rate_pct),S(l.avg_latency_ms??"n/a"),S(l.p50_latency_ms??"n/a"),S(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${S(t)}</h1>
1665
+ </dl>`}function bw(t){return`<h1>Sessions</h1>${fe(["team","alias","session","input","cache","output","total","observed","actions"],t.map(e=>{let r=jo(e.team_name),n=encodeURIComponent(e.alias);return[S(e.team_name),S(e.alias),S(e.sessionid),S(e.input_tokens),S(e.cache_tokens),S(e.output_tokens),S(e.total_tokens),S(e.observed_at),`<button hx-post="/api/sessions/${r}/${n}/compact" hx-swap="outerHTML">Compact</button> <button hx-post="/api/sessions/${r}/${n}/refresh" hx-swap="outerHTML">Refresh</button>`]}))}`}function Sw(t,e){return e===null?`<span>${S(t)}</span>`:`<span>${S(t)} ${S(e.team_name)}/${S(e.alias)}</span>`}function KM(t){return`<h1>Run Throughput</h1>${fe(["workflow","terminal","count"],t.map(e=>[S(e.workflow_name),S(e.terminal_state),S(e.count)]))}`}function Tw(t){return`<h1>Intake</h1><button hx-post="/api/intake/scan" hx-target="main" hx-swap="innerHTML">Scan now</button>${fe(["project","scanned","new jobs","error"],t.map(e=>[S(e.project_name),S(e.scanned),S(e.new_jobs),S(e.error)]))}`}function YM(t){return`<h1>Daemon</h1>${t===null?"<p>disabled</p>":`${le(t)}<button hx-post="/api/daemon/cycle" hx-target="main" hx-swap="beforeend">Run cycle now</button>`}`}function zM(t,e,r){let n=e.request_changes_rate,s=n.by_state.map(l=>[S(l.state_name),S(l.total),S(l.request_changes),S(l.rate_pct)]),o=e.step_duration_histogram.map(l=>[S(l.state_name),S(l.lt_5min),S(l.btw_5_15min),S(l.btw_15_60min),S(l.gt_60min),S(l.no_end)]),i=e.retry_counts.map(l=>[S(l.state_name),S(l.retried_runs),S(l.avg_retries)]),a=r.map(l=>[S(l.tool_name),S(l.invocations),S(l.successes),S(l.hit_rate_pct),S(l.avg_latency_ms??"n/a"),S(l.p50_latency_ms??"n/a"),S(l.p95_latency_ms??"n/a")]);return`<h1>Metrics \u2014 ${S(t)}</h1>
1678
1666
  <h2>Request-changes rate</h2>
1679
1667
  <p>Total: ${S(n.request_changes)} of ${S(n.total)} steps (${S(n.rate_pct)})</p>
1680
1668
  ${fe(["state","total steps","request_changes","rate"],s)}
@@ -1683,42 +1671,42 @@ ${p.text}`,["approve","request_changes"],!0,s,e.writes_to_project_path===!0)));i
1683
1671
  <h2>Retry counts (runs with &gt;1 attempt per state)</h2>
1684
1672
  ${fe(["state","retried runs","avg attempts"],i)}
1685
1673
  <h2>Tool efficacy</h2>
1686
- ${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var jM,Iy,Ny=b(()=>{"use strict";vi();an();y_();v_();R_();Ot();mu();Sw();jw();Mw();qw();Kw();Zw();fy();Ao();gy();Bi();jM=["open","assigned","closed","reopened"],Iy=["low","medium","high","critical"]});function ZM(t){return Math.floor(t/6e4)*6e4}function QM(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)eD(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function eD(t,e){let r=Date.now(),n=ZM(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function xy(t,e=250){let r=setInterval(()=>{try{QM(t)}catch{}},e);return{stop(){clearInterval(r)}}}var $y=b(()=>{"use strict"});function rD({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1674
+ ${fe(["tool","invocations","successes (status=ok)","hit rate","avg latency ms","p50 ms","p95 ms"],a)}`}var jM,Iw,xw=b(()=>{"use strict";vi();an();w_();v_();R_();Ot();mu();Sy();jy();My();qy();Ky();Zy();fw();Ao();gw();Bi();jM=["open","assigned","closed","reopened"],Iw=["low","medium","high","critical"]});function ZM(t){return Math.floor(t/6e4)*6e4}function QM(t){t.db.transaction(()=>{let e=t.getRollupCursor(),r=t.listSessionEventsSince(e);if(r.length!==0){for(let n of r)eD(t,n);t.setRollupCursor(r[r.length-1].id)}})()}function eD(t,e){let r=Date.now(),n=ZM(e.timestamp_ms),s=n+6e4;if(e.kind==="tool_use"){t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"tool_calls_count",value:1,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="tool_result"){let o={};try{o=JSON.parse(e.payload)}catch{}let i=typeof o.elapsedMs=="number"&&o.elapsedMs>0?o.elapsedMs:0;i>0&&t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"time_in_tool_use_ms",value:i,bucket_start_ms:n,bucket_end_ms:s,updated_at:r});return}if(e.kind==="text"){let o=Buffer.byteLength(e.payload,"utf8");t.addRollupValue({run_id:e.run_id,step_id:e.step_id,metric_kind:"message_delta_bytes",value:o,bucket_start_ms:n,bucket_end_ms:s,updated_at:r})}}function Nw(t,e=250){let r=setInterval(()=>{try{QM(t)}catch{}},e);return{stop(){clearInterval(r)}}}var $w=b(()=>{"use strict"});function rD({dal:t}){let e=t.listProjects();for(let r of e){let n=t.query(`SELECT r.id, r.team_id
1687
1675
  FROM run r
1688
1676
  JOIN job j ON j.id = r.job_id
1689
1677
  WHERE j.project_id = ?
1690
1678
  AND r.terminal_state IS NOT NULL
1691
1679
  ORDER BY r.id DESC
1692
- LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,tD).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,jy)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:jy,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 Ay(t){for(let e of nD)try{e(t)}catch{}}var tD,jy,nD,Ry=b(()=>{"use strict";tD="request_changes",jy="reviewer_rejection_rate_high";nD=[rD]});function Ss(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function Oy(t){let e=t.intervalMs??Ss(),r=t.runOnceFn??Rr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??xy)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Ly(t.dal,t.monitorSessionActivityFn??cc,e,n).finally(()=>{a=null})),a.finally(()=>u(uc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=sD(t.dal,r,t.collectSessionSizesFn??vp,t.scanIntakeFn??fn,t.monitorSessionActivityFn??cc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function sD(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(sw({dal:t}),Ay({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Ly(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Ly(t,e,r,n){let s=uc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var ed=b(()=>{"use strict";vi();Es();ju();Ao();$y();Ry();dc()});function Cy(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var My=b(()=>{"use strict"});import{mkdirSync as oD,readFileSync as iD,readdirSync as aD,statSync as lD,writeFileSync as cD}from"node:fs";import{dirname as uD,join as Py,sep as Dy}from"node:path";function da(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Fy:return dD(t,s.input);case Uy:return fD(t,s.input);case Wy:return mD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:nd,GetObjectCommand:rd,PutObjectCommand:td}}}function dD(t,e){let r=By(t,e.Key);return oD(uD(r),{recursive:!0}),cD(r,e.Body),{}}function fD(t,e){let r=By(t,e.Key),n;try{n=iD(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function mD(t,e){let r=e.Prefix??"";qy(r);let s=pD(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function By(t,e){return qy(e),Py(t,e)}function qy(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pD(t){let e=[],r=(n,s)=>{let o;try{o=aD(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Py(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Dy==="/"?a:a.split(Dy).join("/");e.push({key:c,lastModified:lD(l).mtime})}}};return r(t,""),e}var Fy,Uy,Wy,td,rd,nd,sd=b(()=>{"use strict";Fy="localfs-put",Uy="localfs-get",Wy="localfs-list",td=class{input;_localfsTag=Fy;constructor(e){this.input=e}},rd=class{input;_localfsTag=Uy;constructor(e){this.input=e}},nd=class{input;_localfsTag=Wy;constructor(e){this.input=e}}});function Hy(){return{put:0,get:0,list:0}}function od(t,e=hD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function id(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var hD,fa,ad=b(()=>{"use strict";hD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};fa=class{counts=Hy();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Hy(),e}estimateCostUsd(e){return od(this.counts,e)}}});function Jy(t){let e=t.now??Date.now,r=t.timers??_D,n=null,s=null;async function o(){let l=e(),c=id(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=od(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===id(e())}}}var _D,Xy=b(()=>{"use strict";ad();_D={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var ld=b(()=>{"use strict";Ki();zi();zi()});function gD(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function wD(t){return t.reply_to!==void 0&&t.response!==void 0}function yD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Gy(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var ma,Ts,Vy=b(()=>{"use strict";ld();ma=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ts=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new ma("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Ft(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(Gy(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Gy(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new ma;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=gD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(wD(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??yD(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Ft(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function cd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var Ky=b(()=>{"use strict"});function ud(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Yy=b(()=>{"use strict"});function fd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||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 dd,zy=b(()=>{"use strict";dd="daemon:events"});function Qy(t){return{kind:"prompt",prompt_id:t.prompt_id??Ft(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function md(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var Zy,pd=b(()=>{"use strict";ld();Zy="prompt:root"});function ks(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function ED(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function eE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=ED(t);return r===null?!0:Date.now()/1e3>=r-e}function tE(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var hd=b(()=>{"use strict"});async function pa(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":bD},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var bD,_d=b(()=>{"use strict";bD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as rE,mkdirSync as nE,readFileSync as sE,writeFileSync as oE}from"node:fs";import{homedir as iE}from"node:os";import{dirname as aE,join as lE}from"node:path";function vs(){return process.env.LMCTL_DEVICE_AUTH_PATH??lE(iE(),".lmctl","device-auth.json")}function cE(){return process.env.LMCTL_TOKEN_PATH??lE(iE(),".lmctl","cli-tokens.json")}function gd(t=vs()){try{let e=JSON.parse(sE(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function uE(t,e=vs()){nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(t,null,2));try{rE(e,384)}catch{}}function wd(t,e=cE()){let r={};try{r=JSON.parse(sE(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(s,null,2));try{rE(e,384)}catch{}}async function dE(t){let e=t.deviceAuthPath??vs(),r=gd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await pa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return wd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??cE()),{idToken:n.idToken,userId:r.userId}}var yd=b(()=>{"use strict";_d()});function fE(t){if(t.length===0||!t.startsWith("---"))throw new bt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1693
- `);if(e[0]!=="---")throw new bt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new bt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!SD.has(c))throw new bt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ha.join(", ")}`);r[c]=u}if(n===-1)throw new bt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ha)if(r[i]===void 0)throw new bt(`missing required frontmatter key "${i}" \u2014 required: ${ha.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var ha,SD,bt,mE=b(()=>{"use strict";ha=["title","description","members"],SD=new Set(ha),bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as TD,writeFileSync as YK,renameSync as zK,existsSync as hE}from"node:fs";import{basename as kD,resolve as Tn,dirname as Ed}from"node:path";function ID(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function ND(t){return/^\s*_MEMBER_\s+\S/.test(t)}function xD(t){return/^\s*_SESSION_\s+\S/.test(t)}function $D(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function jD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Sd(t){let e=kD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Re(t){let e=TD(t,"utf-8"),r=Ed(Tn(t)),n=Td(e,Sd(t),{baseDir:r,sourcePath:Tn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Tn(r,s.sessiondir));return n}function Td(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
1680
+ LIMIT ?`,r.id,3);if(n.length<3||!n.every(l=>t.query("SELECT 1 FROM step WHERE run_id = ? AND outcome = ? LIMIT 1",l.id,tD).length>0))continue;let o=n[0].team_id,i=t.listTeamMembers(o),a=i.find(l=>l.alias.toLowerCase().includes("coder"))??i[0];a!==void 0&&(t.hasUnackedDriftSignal(a.id,r.id,jw)||t.insertDriftSignal({team_member_id:a.id,project_id:r.id,signal_kind:jw,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 Aw(t){for(let e of nD)try{e(t)}catch{}}var tD,jw,nD,Rw=b(()=>{"use strict";tD="request_changes",jw="reviewer_rejection_rate_high";nD=[rD]});function Ss(){let t=process.env.LMCTL_DAEMON_INTERVAL_MS;if(t===void 0||t.trim().length===0)return 5e3;let e=Number(t);return Number.isFinite(e)&&e>0?e:5e3}function Ow(t){let e=t.intervalMs??Ss(),r=t.runOnceFn??Rr,n={running:t.autoStart!==!1,in_flight:!1,interval_ms:e,cycles:0,jobs_processed:0,last_jobs_processed:0,last_started_at:null,last_finished_at:null,last_error:null,last_session_sizes_recorded:0,last_session_size_failures:0,last_intake_scanned:0,last_intake_new_jobs:0,last_intake_failures:0,last_session_hung_detected:0,last_session_monitor_checked_at:null,last_session_monitor_error:null},s=null,o=null,i=null,a=null,l=null;t.startRollupUpdaterFn!==!1&&(l=(t.startRollupUpdaterFn??Nw)(t.dal));let c=f=>{n.running&&(s=setTimeout(()=>{d.runCycle().finally(()=>c(e))},f))},u=f=>{n.running&&(o=setTimeout(()=>{a===null&&(a=Lw(t.dal,t.monitorSessionActivityFn??cc,e,n).finally(()=>{a=null})),a.finally(()=>u(uc(t.dal,e)))},f))},d={state:n,runCycle:async()=>(i!==null||(i=sD(t.dal,r,t.collectSessionSizesFn??vp,t.scanIntakeFn??fn,t.monitorSessionActivityFn??cc,t.worker_id??"daemon",e,n).finally(()=>{i=null})),i),stop:async()=>{n.running=!1,s!==null&&clearTimeout(s),o!==null&&clearTimeout(o),l?.stop(),i!==null&&await i.catch(()=>{}),a!==null&&await a.catch(()=>{})}};if(n.running){let f=t.firstDelayMs??5e3;c(f),u(f)}return d}async function sD(t,e,r,n,s,o,i,a){a.in_flight=!0,a.last_started_at=new Date().toISOString(),a.last_error=null;let l=[],c=0,u=0,d=[],f=null;try{for(sy({dal:t}),Aw({dal:t}),d=await n(t);;){let p=await e({dal:t,worker_id:o,lease_ms:6e5});if(p===null)break;l.push(p)}let m=await r(t);c=m.recorded,u=m.failed,f=await Lw(t,s,i,a)}catch(m){a.last_error=m instanceof Error?m.message:String(m);try{t.raiseAttention({kind:"daemon_worker_failed",severity:"error",payload:JSON.stringify({error:a.last_error})})}catch{}}finally{a.in_flight=!1,a.cycles+=1,a.last_jobs_processed=l.length,a.last_session_sizes_recorded=c,a.last_session_size_failures=u,a.last_intake_scanned=d.reduce((m,p)=>m+p.scanned,0),a.last_intake_new_jobs=d.reduce((m,p)=>m+p.new_jobs,0),a.last_intake_failures=d.filter(m=>m.error!==void 0).length,a.last_session_hung_detected=f?.hung_detected??0,a.jobs_processed+=l.length,a.last_finished_at=new Date().toISOString()}return{jobs_processed:l.length,outcomes:l,session_sizes_recorded:c,session_size_failures:u,intake:d,session_monitor:f}}async function Lw(t,e,r,n){let s=uc(t,r),o=Date.now();if(n.last_session_monitor_checked_at!==null){let i=Date.parse(n.last_session_monitor_checked_at);if(Number.isFinite(i)&&o-i<s)return null}n.last_session_monitor_checked_at=new Date(o).toISOString(),n.last_session_monitor_error=null;try{return await e({dal:t,nowMs:o})}catch(i){n.last_session_monitor_error=i instanceof Error?i.message:String(i);try{t.raiseAttention({kind:"daemon_session_monitor_failed",severity:"error",payload:JSON.stringify({error:n.last_session_monitor_error})})}catch{}return null}}var ed=b(()=>{"use strict";vi();Es();ju();Ao();$w();Rw();dc()});function Cw(t){let e=t.listMembersInState("in_chat");for(let r of e)t.setMemberState(r.id,"attention_needed","daemon_restarted_mid_chat");return e.length}var Mw=b(()=>{"use strict"});import{mkdirSync as oD,readFileSync as iD,readdirSync as aD,statSync as lD,writeFileSync as cD}from"node:fs";import{dirname as uD,join as Pw,sep as Dw}from"node:path";function da(t){return{s3:{async send(n){let s=n;switch(s._localfsTag){case Fw:return dD(t,s.input);case Uw:return fD(t,s.input);case Ww:return mD(t,s.input);default:throw new Error("createLocalFsS3Client: unknown command")}}},commands:{ListObjectsV2Command:nd,GetObjectCommand:rd,PutObjectCommand:td}}}function dD(t,e){let r=Bw(t,e.Key);return oD(uD(r),{recursive:!0}),cD(r,e.Body),{}}function fD(t,e){let r=Bw(t,e.Key),n;try{n=iD(r)}catch(o){throw o.code==="ENOENT"?Object.assign(new Error("NoSuchKey"),{name:"NoSuchKey"}):o}let s=n.toString("utf-8");return{Body:{transformToString:async()=>s}}}function mD(t,e){let r=e.Prefix??"";qw(r);let s=pD(t).sort((u,d)=>u.key<d.key?-1:u.key>d.key?1:0).filter(u=>u.key.startsWith(r)),o=e.ContinuationToken;o!==void 0&&o!==""&&(s=s.filter(u=>u.key>o));let i=typeof e.MaxKeys=="number"&&Number.isFinite(e.MaxKeys)&&e.MaxKeys>0?Math.floor(e.MaxKeys):void 0,a=s,l=!1;i!==void 0&&s.length>i&&(a=s.slice(0,i),l=!0);let c={Contents:a.map(u=>({Key:u.key,LastModified:u.lastModified})),IsTruncated:l};return l&&(c.NextContinuationToken=a[a.length-1].key),c}function Bw(t,e){return qw(e),Pw(t,e)}function qw(t){if(t.split("/").includes(".."))throw new Error(`localfs-s3-client: refusing key/prefix with '..': ${t}`)}function pD(t){let e=[],r=(n,s)=>{let o;try{o=aD(n,{withFileTypes:!0})}catch(i){if(i.code==="ENOENT")return;throw i}for(let i of o){let a=s===""?i.name:`${s}/${i.name}`,l=Pw(n,i.name);if(i.isDirectory())r(l,a);else if(i.isFile()){let c=Dw==="/"?a:a.split(Dw).join("/");e.push({key:c,lastModified:lD(l).mtime})}}};return r(t,""),e}var Fw,Uw,Ww,td,rd,nd,sd=b(()=>{"use strict";Fw="localfs-put",Uw="localfs-get",Ww="localfs-list",td=class{input;_localfsTag=Fw;constructor(e){this.input=e}},rd=class{input;_localfsTag=Uw;constructor(e){this.input=e}},nd=class{input;_localfsTag=Ww;constructor(e){this.input=e}}});function Hw(){return{put:0,get:0,list:0}}function od(t,e=hD){return t.put*e.putUsd+t.get*e.getUsd+t.list*e.listUsd}function id(t){let e=new Date(t),r=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0");return`${r}-${n}`}var hD,fa,ad=b(()=>{"use strict";hD={putUsd:5e-6,getUsd:40000000000000003e-23,listUsd:5e-6};fa=class{counts=Hw();record(e,r=1){this.counts[e]+=r}peek(){return{...this.counts}}drain(){let e={...this.counts};return this.counts=Hw(),e}estimateCostUsd(e){return od(this.counts,e)}}});function Jw(t){let e=t.now??Date.now,r=t.timers??_D,n=null,s=null;async function o(){let l=e(),c=id(l),u=t.meter.drain();(u.put>0||u.get>0||u.list>0)&&t.store.addUsage({user_id:t.userId,device_id:t.deviceId,period:c,put:u.put,get:u.get,list:u.list,updated_at:new Date(l).toISOString()});let d=t.store.loadUsage(t.userId,t.deviceId,c),f=d?{put:d.put_count,get:d.get_count,list:d.list_count}:{put:0,get:0,list:0};if(t.publishOwnRollup!==void 0)try{await t.publishOwnRollup(c,f)}catch(h){t.log?.(`[usage] publish rollup failed: ${h instanceof Error?h.message:String(h)}`)}let m=f;if(t.readUserTotal!==void 0)try{m=await t.readUserTotal(c)}catch(h){t.log?.(`[usage] read user total failed: ${h instanceof Error?h.message:String(h)}`),m=f}let p=od(m);if(n!==c&&p>=t.ceilingUsd){n=c,t.log?.(`[usage] quota exceeded period=${c} cost=$${p.toFixed(4)} >= ceiling $${t.ceilingUsd}`);try{t.onQuotaExceeded({period:c,costUsd:p,ceilingUsd:t.ceilingUsd})}catch(h){t.log?.(`[usage] onQuotaExceeded threw: ${h instanceof Error?h.message:String(h)}`)}}}function i(){return s=(s??Promise.resolve()).then(()=>o()).catch(()=>{}),s}let a=r.setInterval(()=>{i()},t.intervalMs);return{stop(){r.clearInterval(a)},flushNow(){return i()},isOverQuota(){return n!==null&&n===id(e())}}}var _D,Xw=b(()=>{"use strict";ad();_D={setInterval:(t,e)=>setInterval(t,e),clearInterval:t=>clearInterval(t)}});var ld=b(()=>{"use strict";Ki();zi();zi()});function gD(t){if(typeof t!="object"||t===null||Array.isArray(t))return null;let e=t;if(typeof e.message_id!="string"||e.message_id==="")return null;if(typeof e.reply_to=="string"&&e.reply_to!==""){let s=e.response;if(typeof s!="object"||s===null)return null;let o=s;return typeof o.status!="number"?null:{message_id:e.message_id,reply_to:e.reply_to,response:o}}let r=e.request;if(typeof r!="object"||r===null)return null;let n=r;return typeof n.method!="string"||n.method===""||typeof n.path!="string"||n.path===""?null:{message_id:e.message_id,request:n}}function yD(t){return t.reply_to!==void 0&&t.response!==void 0}function wD(t){if(typeof t!="object"||t===null)return;let e=t.conversation_id;return typeof e=="string"?e:void 0}function Gw(t){let e=t.reason;if(e!==void 0)return e;try{return new DOMException("Aborted","AbortError")}catch{let r=new Error("Aborted");return r.name="AbortError",r}}var ma,Ts,Vw=b(()=>{"use strict";ld();ma=class extends Error{name="MailboxFetchStoppedError";code="mailbox_fetch_stopped";constructor(e="MailboxFetchClient stopped before a response arrived"){super(e)}},Ts=class{client;log;now;random;pending=new Map;requestHandler=null;stopped=!1;constructor(e){this.client=e.client,this.log=e.log??(()=>{}),this.now=e.now??Date.now,this.random=e.random??Math.random}onRequest(e){if(this.requestHandler!==null)throw new Error("MailboxFetchClient: onRequest handler already registered");this.requestHandler=e}async fetch(e,r){if(this.stopped)throw new ma("MailboxFetchClient.fetch after stop()");if(typeof e.path!="string"||e.path==="")throw new Error("MailboxFetchClient.fetch: request.path is required");let n=e.method;if(typeof n!="string"||n==="")throw new Error("MailboxFetchClient.fetch: request.method is required");let s=Ft(this.now(),this.random);if(this.pending.has(s))throw new Error(`MailboxFetchClient.fetch: duplicate message_id=${s}`);let o=r?.conversationId??s,i={message_id:s,request:e};return new Promise((a,l)=>{let c=r?.abortSignal,u;if(c!==void 0){if(c.aborted){l(Gw(c));return}u=()=>{this.pending.has(s)&&(this.pending.delete(s),l(Gw(c)))},c.addEventListener("abort",u,{once:!0})}this.pending.set(s,{resolve:a,reject:l,...u!==void 0?{abortListener:u}:{},...c!==void 0?{abortSignal:c}:{}}),this.client.putMessage({conversation_id:o,payload:i}).catch(d=>{let f=this.pending.get(s);f!==void 0&&(this.pending.delete(s),f.abortListener!==void 0&&f.abortSignal!==void 0&&f.abortSignal.removeEventListener("abort",f.abortListener),f.reject(d))})})}async stop(){if(this.stopped)return;this.stopped=!0;let e=Array.from(this.pending.values());this.pending.clear();let r=new ma;for(let n of e){n.abortListener!==void 0&&n.abortSignal!==void 0&&n.abortSignal.removeEventListener("abort",n.abortListener);try{n.reject(r)}catch{}}}async handleIncoming(e,r){let n=gD(e);if(n===null){this.log("MailboxFetchClient: dropping non-envelope inbound payload");return}if(yD(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??wD(e)??n.message_id,o;try{o=await this.requestHandler(n.request)}catch(l){let c=l instanceof Error?l.message:String(l),u=typeof l.code=="string"?l.code:"INTERNAL_ERROR";o={status:500,headers:{"content-type":"application/json"},body:{error:u,message:c}}}let a={message_id:Ft(this.now(),this.random),reply_to:n.message_id,response:o};try{await this.client.putMessage({conversation_id:s,payload:a})}catch(l){this.log(`MailboxFetchClient: response PUT failed for reply_to=${n.message_id}: ${l instanceof Error?l.message:String(l)}`)}}}});function cd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;return!(e.kind!=="terminal"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.data!="string"||typeof e.ts!="number")}var Kw=b(()=>{"use strict"});function ud(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="provider"||typeof e.session_id!="string"||e.session_id===""||e.direction!=="agent_to_user"&&e.direction!=="user_to_agent"||typeof e.ts!="number")return!1;if(e.direction==="agent_to_user"){if(!Array.isArray(e.events))return!1;for(let r of e.events)if(typeof r!="object"||r===null||Array.isArray(r)||typeof r.event_type!="string")return!1}else if(typeof e.user_input!="string")return!1;return!0}var Yw=b(()=>{"use strict"});function fd(t){if(typeof t!="object"||t===null||Array.isArray(t))return!1;let e=t;if(e.kind!=="daemon_event"||typeof e.event!="string"||e.event===""||typeof e.ts!="number")return!1;if(e.event==="workflows"){if(!Array.isArray(e.workflows))return!1;for(let r of e.workflows){if(typeof r!="object"||r===null||Array.isArray(r))return!1;let n=r;if(typeof n.teamfile_path!="string"||n.teamfile_path===""||n.name!==null&&typeof n.name!="string"||typeof n.registered_at!="string"||n.registered_at===""||n.last_seeded_at!==null&&typeof n.last_seeded_at!="string")return!1}}else if(e.event==="chat_log"){if(typeof e.entry!="object"||e.entry===null||Array.isArray(e.entry))return!1;let r=e.entry;if(typeof r.id!="number"||typeof r.root_teamfile!="string"||r.root_teamfile===""||typeof r.sender_teamfile!="string"||r.sender_teamfile===""||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 dd,zw=b(()=>{"use strict";dd="daemon:events"});function Qw(t){return{kind:"prompt",prompt_id:t.prompt_id??Ft(t.now?.()??Date.now(),t.random??Math.random),root_teamfile:t.root_teamfile,text:t.text}}function md(t){if(t===null||typeof t!="object")return!1;let e=t;return e.kind==="prompt"&&typeof e.prompt_id=="string"&&e.prompt_id.length>0&&typeof e.root_teamfile=="string"&&e.root_teamfile.length>0&&typeof e.text=="string"}var Zw,pd=b(()=>{"use strict";ld();Zw="prompt:root"});function ks(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.sub=="string"&&r.sub!==""?r.sub:null}catch{return null}}function ED(t){let e=t.split(".");if(e.length<2||e[1]===void 0||e[1]==="")return null;try{let r=JSON.parse(tE(e[1]));return typeof r.exp=="number"&&Number.isFinite(r.exp)?r.exp:null}catch{return null}}function eE(t,e=60){if(typeof t!="string"||t==="")return!0;let r=ED(t);return r===null?!0:Date.now()/1e3>=r-e}function tE(t){let e=t.replace(/-/g,"+").replace(/_/g,"/"),r=e.padEnd(Math.ceil(e.length/4)*4,"="),n=globalThis.Buffer;return n!==void 0?n.from(r,"base64").toString("utf8"):atob(r)}var hd=b(()=>{"use strict"});async function pa(t){let e=t.fetchImpl??fetch,r=`https://cognito-idp.${t.region}.amazonaws.com/`,n=await e(r,{method:"POST",headers:{"content-type":"application/x-amz-json-1.1","x-amz-target":bD},body:JSON.stringify({AuthFlow:"REFRESH_TOKEN_AUTH",ClientId:t.clientId,AuthParameters:{REFRESH_TOKEN:t.refreshToken}})}),s=await n.text();if(!n.ok){let l=s;try{let c=JSON.parse(s);l=c.message??c.__type??s}catch{}throw new Error(`cognito_refresh_failed: ${n.status} ${l}`)}let i=JSON.parse(s).AuthenticationResult,a=i?.IdToken;if(typeof a!="string"||a==="")throw new Error("cognito_refresh_no_id_token: InitiateAuth returned no IdToken");return{idToken:a,...typeof i?.AccessToken=="string"&&i.AccessToken!==""?{accessToken:i.AccessToken}:{},...typeof i?.ExpiresIn=="number"&&Number.isFinite(i.ExpiresIn)?{expiresAt:Date.now()+i.ExpiresIn*1e3}:{}}}var bD,_d=b(()=>{"use strict";bD="AWSCognitoIdentityProviderService.InitiateAuth"});import{chmodSync as rE,mkdirSync as nE,readFileSync as sE,writeFileSync as oE}from"node:fs";import{homedir as iE}from"node:os";import{dirname as aE,join as lE}from"node:path";function vs(){return process.env.LMCTL_DEVICE_AUTH_PATH??lE(iE(),".lmctl","device-auth.json")}function cE(){return process.env.LMCTL_TOKEN_PATH??lE(iE(),".lmctl","cli-tokens.json")}function gd(t=vs()){try{let e=JSON.parse(sE(t,"utf8"));return typeof e.userId!="string"||e.userId===""||typeof e.refreshToken!="string"||e.refreshToken===""?null:{userId:e.userId,refreshToken:e.refreshToken}}catch{return null}}function uE(t,e=vs()){nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(t,null,2));try{rE(e,384)}catch{}}function yd(t,e=cE()){let r={};try{r=JSON.parse(sE(e,"utf8"))}catch{}let n={...r.cognito??{}};n.idToken=t.idToken,t.accessToken!==void 0&&(n.accessToken=t.accessToken),t.refreshToken!==void 0&&(n.refreshToken=t.refreshToken),t.expiresAt!==void 0&&(n.expiresAt=t.expiresAt);let s={...r,cognito:n};nE(aE(e),{recursive:!0,mode:448}),oE(e,JSON.stringify(s,null,2));try{rE(e,384)}catch{}}async function dE(t){let e=t.deviceAuthPath??vs(),r=gd(e);if(r===null)throw new Error("device_auth_not_found: no ~/.lmctl/device-auth.json; run `lmctl device login` first");let n=await pa({region:t.region,clientId:t.clientId,refreshToken:r.refreshToken,...t.fetchImpl!==void 0?{fetchImpl:t.fetchImpl}:{}});return yd({idToken:n.idToken,...n.accessToken!==void 0?{accessToken:n.accessToken}:{},refreshToken:r.refreshToken,...n.expiresAt!==void 0?{expiresAt:n.expiresAt}:{}},t.cliTokensPath??cE()),{idToken:n.idToken,userId:r.userId}}var wd=b(()=>{"use strict";_d()});function fE(t){if(t.length===0||!t.startsWith("---"))throw new bt("frontmatter must start at line 1 with `---` on its own line");let e=t.split(`
1681
+ `);if(e[0]!=="---")throw new bt("frontmatter must start at line 1 with `---` on its own line");let r={},n=-1;for(let i=1;i<e.length;i++){let a=e[i];if(a==="---"){n=i;break}if(a.trim()==="")continue;let l=a.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\s*:\s*(.*)$/);if(!l)throw new bt(`malformed frontmatter line ${i+1}: ${JSON.stringify(a)} (expected "key: value" or "---")`);let c=l[1],u=l[2].trim();if(!SD.has(c))throw new bt(`unknown frontmatter key "${c}" \u2014 allowed keys: ${ha.join(", ")}`);r[c]=u}if(n===-1)throw new bt("frontmatter not closed (missing trailing `---` on its own line)");for(let i of ha)if(r[i]===void 0)throw new bt(`missing required frontmatter key "${i}" \u2014 required: ${ha.join(", ")}`);let s=0;for(let i=0;i<=n;i++)s+=e[i].length+1;s>t.length&&(s=t.length);let o=r.members.split(",").map(i=>i.trim()).filter(Boolean);return{title:r.title,description:r.description,members:o,bodyOffset:s}}var ha,SD,bt,mE=b(()=>{"use strict";ha=["title","description","members"],SD=new Set(ha),bt=class extends Error{constructor(e){super(e),this.name="FrontmatterError"}}});import{readFileSync as TD,writeFileSync as KK,renameSync as YK,existsSync as hE}from"node:fs";import{basename as kD,resolve as Tn,dirname as Ed}from"node:path";function ID(t){let e={},r=/(\w+)=(?:"([^"]*)"|([\S]*))/g,n;for(;(n=r.exec(t))!==null;){let s=n[1],o=n[2]!==void 0?n[2]:n[3];e[s]=o}return e}function xD(t){return/^\s*_MEMBER_\s+\S/.test(t)}function ND(t){return/^\s*_SESSION_\s+\S/.test(t)}function $D(t){return/^\s*_CONNECT_(?:\s|$)/.test(t)}function jD(t){return/^\s*_SKILL_(?:\s|$)/.test(t)}function Sd(t){let e=kD(t);return e.endsWith(".lmctl")?e.slice(0,-6):e}function Re(t){let e=TD(t,"utf-8"),r=Ed(Tn(t)),n=Td(e,Sd(t),{baseDir:r,sourcePath:Tn(t)});for(let s of n.members)s.sessiondir&&!s.sessiondir.startsWith("/")&&(s.sessiondir=Tn(r,s.sessiondir));return n}function Td(t,e,r={}){let n=[],s=[],o=[],i=[];r.sourcePath,r.baseDir;let a=t;if(a.startsWith("#teamfile:")){let u=a.indexOf(`
1694
1682
  `);a=u>=0?a.slice(u+1):""}let l=null;if(a.startsWith("---"))try{l=fE(a)}catch(u){if(u instanceof bt)i.push(`frontmatter: ${u.message}`);else throw u}let c=t.split(`
1695
- `);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(xD(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if($D(d)){s.push(f);continue}if(jD(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let T=_[0];try{if(new URL(T).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(T)&&!/^[A-Za-z]:[\\/]/u.test(T)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}o.push(T);continue}if(!ND(d))continue;let m=ID(d);for(let g of Object.keys(m))if(!pE.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
1696
- allowed keys: ${pE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function kd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===bd.toLowerCase());n.length>1&&r.push({field:bd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Tn(e,o.teamfile):Tn(o.teamfile);if(!hE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=St(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else vD.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function St(t){return t.members.find(e=>e.alias.toLowerCase()===bd.toLowerCase())}function vd(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Tn(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!hE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=St(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vd(l,Ed(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Ed(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _a(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var bd,vD,pE,Ut=b(()=>{"use strict";mE();bd="Lead",vD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as AD,realpathSync as RD}from"node:fs";import{dirname as OD}from"node:path";function Id(t){LD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LD(t){let e=t.payload.root_teamfile;try{e=RD(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await kn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=CD(e);if("error"in r)return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-PD(t.env??process.env)).toISOString()});if(!s.acquired){let o=DD(r.alias,s.current);return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Tr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function CD(t){if(!AD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=St(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??OD(t)}}async function kn(t,e){let r=wE(e.message),n=e.response===null?null:wE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function wE(t){return t.length<=_E?{text:t,truncated:!1}:{text:t.slice(0,_E),truncated:!0}}function MD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function DD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:MD(t,e)}function PD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return gE;let r=Number(e);return!Number.isFinite(r)||r<=0?gE:r}var _E,gE,yE=b(()=>{"use strict";Rt();Ut();_E=256*1024,gE=30*60*1e3});import{chmodSync as vE,existsSync as FD,mkdirSync as IE,readFileSync as Ea,writeFileSync as NE}from"node:fs";import{dirname as Nd,resolve as ga,join as xE}from"node:path";import{fileURLToPath as UD}from"node:url";import{homedir as $E}from"node:os";import{CognitoIdentityClient as WD,GetIdCommand as BD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as EE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as qD,ListObjectsV2Command as HD,PutObjectCommand as JD,S3Client as bE}from"@aws-sdk/client-s3";function Ns(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:YD(t.selfUrl),n={},s;for(let $ of r)if(FD($)){n=KD($),s=$;break}let o=(...$)=>{for(let N of $)if(typeof N=="string"&&N!=="")return N},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VD,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ba,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=ya(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=ya(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=ya(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=ya(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function KD(t){try{let e=Ea(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function YD(t){let e=Nd(UD(t??import.meta.url));return[ga(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","infra","terraform","terraform.tfstate")]}function ya(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function zD(t){let e=ZD(t.intervalMs)??jE,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function ZD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function AE(t){let e=t.tokenPath??xE($E(),".lmctl","cli-tokens.json"),r=TE(t.tokenPath);if(eE(r.cognito?.idToken)&&gd()!==null)try{await dE({region:t.region,clientId:t.cognitoClientId??ba,cliTokensPath:e}),r=TE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let U=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${U}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),c={ListObjectsV2Command:HD,GetObjectCommand:qD,PutObjectCommand:JD},u=ks(n),d=u??o,f=t.deviceId,m=wn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let U=!1,z=0;for(;!U&&z<2;){z+=1;try{let v=Gi(m,"web"),I=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let W of J.Contents??[]){let L=Vi(W.Key??"",m,"web");L!==void 0&&L>I&&(I=L)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),U=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&tP(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),eP(e),i=!1,o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),m=wn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,E=t.promptTriggerStore,k=new fa,$=new Or({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&cd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&ud(R.payload)){await T.onInbound(R.payload);return}if(!fd(R.payload)){if(E!==void 0&&md(R.payload)){Id({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Ts({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>$.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),T!==void 0&&T.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let N=R=>$.putMessage({conversation_id:dd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:zD({store:t.chatLogTailStore,publishDaemonEvent:N,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??jE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let D=t.deviceId??o,C=`${d}/usage/`,H;return H=t.usageStore===void 0?void 0:Jy({meter:k,store:t.usageStore,userId:d,deviceId:D,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:U,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${U.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),H?.stop()},publishOwnRollup:async(R,U)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${C}${D}-${R}.json`,Body:JSON.stringify({...U,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let U={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:C,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));U.put+=W.put??0,U.get+=W.get??0,U.list+=W.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return U},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:N,async stop(){A?.stop(),H!==void 0&&(await H.flushNow().catch(()=>{}),H.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function RE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:da(t.rootDir),r=wn({identityId:Is,userId:Is,deviceId:SE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Or({bucket:"local",identityId:Is,userId:Is,deviceId:SE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&cd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ud(c.payload)){await o.onInbound(c.payload);return}if(!fd(c.payload)){if(i!==void 0&&md(c.payload)){Id({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??wa,readIntervalMs:t.readIntervalMs??wa,heartbeatIdleMs:t.heartbeatIdleMs??wa,backoffReadIntervalMs:t.backoffReadIntervalMs??wa});n=new Ts({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:dd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TE(t){let e=t??xE($E(),".lmctl","cli-tokens.json");try{let r=Ea(e,"utf8");return JSON.parse(r)}catch{return{}}}function QD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ea(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};IE(Nd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(n,null,2));try{vE(t,384)}catch{}}function eP(t){let e={};try{let n=Ea(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,IE(Nd(t),{recursive:!0,mode:448}),NE(t,JSON.stringify(r,null,2));try{vE(t,384)}catch{}}async function kE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new WD({region:t.region}).send(new BD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{QD(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function tP(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var jE,wa,ba,XD,GD,VD,Is,SE,xd=b(()=>{"use strict";Zi();sd();ad();Xy();Vy();Ky();Yy();zy();pd();Ki();hd();yd();yE();jE=3e3,wa=1e3,ba="79u5jhkk46qofog661c9i0bdcs",XD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GD="us-east-1_4iUdFggDn",VD="lmctl-next-preview-mailbox-254332045686";Is="local",SE="local"});import{spawn as Rd}from"node:child_process";import{createInterface as OE}from"node:readline";var $d,jd,Ad,LE,CE=b(()=>{"use strict";fo();je();$d=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=OE({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1683
+ `);for(let u=0;u<c.length;u++){let d=c[u],f=u+1;if(ND(d))throw new Error(`line ${f}: _SESSION_ is the legacy prefix. Rename to _MEMBER_. (line: ${d.trim()})`);if($D(d)){s.push(f);continue}if(jD(d)){let g=d.replace(/^\s*_SKILL_\s*/,"").trim(),_=g.length===0?[]:g.split(/\s+/u);if(_.length!==1){i.push(`line ${f}: _SKILL_ requires exactly one https:// URL or local path: ${d.trim()}`);continue}let T=_[0];try{if(new URL(T).protocol!=="https:"){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}catch{if(/^[A-Za-z][A-Za-z0-9+.-]*:/u.test(T)&&!/^[A-Za-z]:[\\/]/u.test(T)){i.push(`line ${f}: _SKILL_ URL must use https:// or a local path: ${T}`);continue}}o.push(T);continue}if(!xD(d))continue;let m=ID(d);for(let g of Object.keys(m))if(!pE.includes(g))throw new Error(`line ${f}: unknown key "${g}" on _MEMBER_ line: ${d.trim()}
1684
+ allowed keys: ${pE.join(", ")}`);if(!m.provider&&!m.teamfile){i.push(`line ${f}: member line missing provider (or teamfile): ${d.trim()}`);continue}let h={alias:m.alias||`member${n.length+1}`,provider:m.provider||"",extra:{}};m.sessionid&&(h.session=m.sessionid),Object.prototype.hasOwnProperty.call(m,"sessiondir")&&(h.sessiondir=m.sessiondir),m.teamfile&&(h.teamfile=m.teamfile),m.model&&(h.model=m.model),m.effort&&(h.effort=m.effort),n.push(h)}return{name:e,members:n,deprecatedConnectLines:s,skillUrls:o,rawText:t,parseErrors:i,frontmatter:l}}function kd(t,e){let r=[];for(let o of t.parseErrors){let i=o.includes("_CONNECT_")?"connect":o.includes("_SKILL_")?"skill":"session";r.push({field:i,message:o})}let n=t.members.filter(o=>o.alias.toLowerCase()===bd.toLowerCase());n.length>1&&r.push({field:bd,message:`${n.length} alias=Lead found (max 1)`});let s=new Set;for(let o of t.members){let i=o.alias.toLowerCase();if(s.has(i)&&r.push({field:o.alias,message:`Duplicate alias "${o.alias}" (case-insensitive)`}),s.add(i),o.teamfile){let a=e?Tn(e,o.teamfile):Tn(o.teamfile);if(!hE(a))r.push({field:o.alias,message:`Teamfile not found: ${a}`});else{let l=Re(a),c=St(l);c?c.session||r.push({field:o.alias,message:`Team at ${o.teamfile} lead has no session ID. Run: lmctl seed`}):r.push({field:o.alias,message:`Team at ${o.teamfile} has no lead session`})}}else vD.has(o.provider)||r.push({field:o.alias,message:`Invalid provider "${o.provider}"`});o.sessiondir!==void 0&&o.sessiondir===""&&r.push({field:o.alias,message:"sessiondir is empty"})}return r}function St(t){return t.members.find(e=>e.alias.toLowerCase()===bd.toLowerCase())}function vd(t,e,r,n={}){let s=n.requireSession??!0;if(!t.teamfile)throw new Error(`Member "${t.alias}" is not a team reference`);let o=Tn(e,t.teamfile),i=r??new Set;if(i.has(o))throw new Error(`Circular team reference: ${t.alias} \u2192 ${o} (already visited: ${[...i].join(" \u2192 ")})`);if(i.add(o),!hE(o))throw new Error(`Teamfile not found: ${o} (referenced by alias "${t.alias}")`);let a=Re(o),l=St(a);if(!l)throw new Error(`Team at ${o} has no lead session`);if(l.teamfile)return vd(l,Ed(o),i,n);if(s&&!l.session)throw new Error(`Team at ${o} lead has no session ID. Run: lmctl seed`);return{provider:l.provider,session:l.session??"",sessiondir:l.sessiondir||Ed(o),alias:t.alias,resolvedFrom:o,model:l.model,effort:l.effort}}function _a(t,e){return t.members.find(r=>r.alias===e)??t.members.find(r=>r.alias.toLowerCase()===e.toLowerCase())}var bd,vD,pE,Ut=b(()=>{"use strict";mE();bd="Lead",vD=new Set(["claude","codex","opencode","gemini","copilot","qwen","agy","ClaudeMock"]);pE=["alias","provider","sessionid","sessiondir","teamfile","model","effort"]});import{existsSync as AD,realpathSync as RD}from"node:fs";import{dirname as OD}from"node:path";function Id(t){LD(t).catch(e=>{t.log?.(`[mailbox] prompt trigger failed: ${e instanceof Error?e.message:String(e)}`)})}async function LD(t){let e=t.payload.root_teamfile;try{e=RD(t.payload.root_teamfile)}catch(o){let i=`prompt root missing/unreadable: ${t.payload.root_teamfile}: ${o instanceof Error?o.message:String(o)}`;return await kn(t.store,{rootTeamfile:t.payload.root_teamfile,receiverTeamfile:t.payload.root_teamfile,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] ${i}`),{status:"error",response:null,error_detail:i}}if(t.store.getRootTeam(e)===null){let o=`prompt root is not registered: ${e}`;return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] ${o}`),{status:"error",response:null,error_detail:o}}let r=CD(e);if("error"in r)return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:"Lead",message:t.payload.text,response:null,status:"error",error_detail:r.error,log:t.log}),t.log?.(`[mailbox] ${r.error}`),{status:"error",response:null,error_detail:r.error};let n={receiver_teamfile:e,receiver_alias:r.alias,sender_teamfile:`prompt:${t.payload.prompt_id}`,sender_alias:"operator",started_at:new Date().toISOString()},s=t.store.tryAcquireAgentInflight(n,{stale_before:new Date(Date.now()-PD(t.env??process.env)).toISOString()});if(!s.acquired){let o=DD(r.alias,s.current);return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:o,log:t.log}),t.log?.(`[mailbox] prompt rejected: ${o}`),{status:"error",response:null,error_detail:o}}try{let i=await(t.chat??Tr)({provider:r.provider,sessionId:r.sessionid,cwd:r.sessiondir,prompt:t.payload.text,env:t.env??process.env,alias:r.alias,permissionMode:"yolo",...t.timeoutMs!==void 0?{timeoutMs:t.timeoutMs}:{}}),a=i.status==="stalled",l=!a&&i.text.trim()==="",c=a?`provider stalled${i.stalledAfterMs!==void 0?` after ${i.stalledAfterMs}ms`:""}`:l?"provider returned empty response":null,u=a||l?"error":"ok";return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:u==="error"?null:i.text,status:u,error_detail:c,log:t.log}),{status:u,response:u==="error"?null:i.text,error_detail:c}}catch(o){let i=o instanceof Error?o.message:String(o);return await kn(t.store,{rootTeamfile:e,receiverTeamfile:e,receiverAlias:r.alias,message:t.payload.text,response:null,status:"error",error_detail:i,log:t.log}),t.log?.(`[mailbox] prompt provider error: ${i}`),{status:"error",response:null,error_detail:i}}finally{try{t.store.releaseAgentInflight(n)}catch(o){t.log?.(`[mailbox] failed to release prompt in-flight slot: ${o instanceof Error?o.message:String(o)}`)}}}function CD(t){if(!AD(t))return{error:`prompt root missing/unreadable: ${t}`};let e=Re(t);if(e.parseErrors.length>0)return{error:`prompt root parse error: ${e.parseErrors.join("; ")}`};let r=St(e);return r===void 0?{error:`prompt root has no Lead: ${t}`}:r.session===void 0||r.session.trim()===""?{error:`prompt root Lead is unseeded: ${t}`}:{alias:r.alias,provider:r.provider,sessionid:r.session,sessiondir:r.sessiondir??OD(t)}}async function kn(t,e){let r=yE(e.message),n=e.response===null?null:yE(e.response);try{t.insertTeamChatLog({root_teamfile:e.rootTeamfile,sender_teamfile:e.rootTeamfile,sender_alias:"operator",receiver_teamfile:e.receiverTeamfile,receiver_alias:e.receiverAlias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})}catch(s){e.log?.(`[mailbox] warning: failed to record prompt chat log: ${s instanceof Error?s.message:String(s)}`)}}function yE(t){return t.length<=_E?{text:t,truncated:!1}:{text:t.slice(0,_E),truncated:!0}}function MD(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}function DD(t,e){return e.sender_teamfile.startsWith("prompt:")?`${t} is busy servicing another prompt since ${e.started_at}`:MD(t,e)}function PD(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return gE;let r=Number(e);return!Number.isFinite(r)||r<=0?gE:r}var _E,gE,wE=b(()=>{"use strict";Rt();Ut();_E=256*1024,gE=30*60*1e3});import{chmodSync as vE,existsSync as FD,mkdirSync as IE,readFileSync as Ea,writeFileSync as xE}from"node:fs";import{dirname as xd,resolve as ga,join as NE}from"node:path";import{fileURLToPath as UD}from"node:url";import{homedir as $E}from"node:os";import{CognitoIdentityClient as WD,GetIdCommand as BD}from"@aws-sdk/client-cognito-identity";import{fromCognitoIdentity as EE}from"@aws-sdk/credential-provider-cognito-identity";import{GetObjectCommand as qD,ListObjectsV2Command as HD,PutObjectCommand as JD,S3Client as bE}from"@aws-sdk/client-s3";function xs(t={}){let e=t.env??process.env,r=t.tfstatePath!==void 0?[t.tfstatePath]:YD(t.selfUrl),n={},s;for(let $ of r)if(FD($)){n=KD($),s=$;break}let o=(...$)=>{for(let x of $)if(typeof x=="string"&&x!=="")return x},i=o(e.LMCTL_NEXT_IDENTITY_POOL_ID,n.LMCTL_NEXT_IDENTITY_POOL_ID)??XD,a=o(e.LMCTL_NEXT_COGNITO_USER_POOL_ID,n.LMCTL_NEXT_COGNITO_USER_POOL_ID)??GD,l=o(e.LMCTL_NEXT_MAILBOX_BUCKET,e.LMCTL_NEXT_POLICY_BUCKET,n.LMCTL_NEXT_MAILBOX_BUCKET,n.LMCTL_NEXT_POLICY_BUCKET)??VD,c=o(e.AWS_REGION,e.AWS_DEFAULT_REGION)??"us-east-1",u=o(e.LMCTL_NEXT_COGNITO_CLIENT_ID,n.LMCTL_NEXT_COGNITO_CLIENT_ID)??ba,d=[];i===void 0&&d.push("LMCTL_NEXT_IDENTITY_POOL_ID"),a===void 0&&d.push("LMCTL_NEXT_COGNITO_USER_POOL_ID"),l===void 0&&d.push("LMCTL_NEXT_MAILBOX_BUCKET");let f={missing:d,tfstateCandidatesChecked:r,...s!==void 0?{tfstatePathUsed:s}:{}};if(d.length>0)return f;let m=e.LMCTL_MAILBOX_POLL_MS,p=m!==void 0&&m.length>0?Number(m):void 0,h=wa(e.LMCTL_MAILBOX_READ_INTERVAL_SECONDS),g=wa(e.LMCTL_MAILBOX_HEARTBEAT_IDLE_SECONDS),_=wa(e.LMCTL_MAILBOX_BACKOFF_READ_INTERVAL_SECONDS),T=wa(e.LMCTL_MAILBOX_CHATLOG_POLL_SECONDS),E=o(e.LMCTL_MAILBOX_KEY),k=o(e.LMCTL_TOKEN_PATH);return f.config={identityPoolId:i,cognitoUserPoolId:a,cognitoClientId:u,region:c,mailboxBucket:l,...typeof p=="number"&&Number.isFinite(p)&&p>=100?{pollIntervalMs:p}:{},...h!==void 0?{readIntervalMs:h}:{},...g!==void 0?{heartbeatIdleMs:g}:{},..._!==void 0?{backoffReadIntervalMs:_}:{},...T!==void 0?{chatLogPollIntervalMs:T}:{},...E!==void 0?{mailboxKey:E}:{},...k!==void 0?{tokenPath:k}:{}},f}function KD(t){try{let e=Ea(t,"utf8"),n=JSON.parse(e).outputs??{},s={};for(let[o,i]of Object.entries(n))i!==null&&typeof i=="object"&&typeof i.value=="string"&&(s[o]=i.value);return s}catch{return{}}}function YD(t){let e=xd(UD(t??import.meta.url));return[ga(e,"..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","..","infra","terraform","terraform.tfstate"),ga(e,"..","..","infra","terraform","terraform.tfstate")]}function wa(t){if(t===void 0||t==="")return;let e=Number(t);if(!(!Number.isFinite(e)||e<=0))return e*1e3}function zD(t){let e=ZD(t.intervalMs)??jE,r=Math.max(1,Math.trunc(t.limit??500)),n=t.now??Date.now,s=t.cursorKey!==void 0&&t.store.loadTeamChatLogCursor!==void 0&&t.store.saveTeamChatLogCursor!==void 0?{key:t.cursorKey,load:t.store.loadTeamChatLogCursor.bind(t.store),save:t.store.saveTeamChatLogCursor.bind(t.store)}:null,o,i=!1,a=!1,l=()=>{try{if(s!==null){let d=s.load(s.key);if(d!==null)return o=d.last_pushed_id,!0}return o=t.store.getMaxTeamChatLogId(),s!==null&&s.save({cursor_key:s.key,last_pushed_id:o,updated_at:new Date(n()).toISOString()}),!0}catch(d){return t.log?.(`[mailbox] daemon_event chat_log seed failed: ${d instanceof Error?d.message:String(d)}`),!1}};l();let c=async()=>{if(!(a||i)){i=!0;try{if(o===void 0&&!l())return;let d=t.store.listTeamChatLogSinceId(o,r);for(let f of d){let m={kind:"daemon_event",event:"chat_log",ts:n(),entry:{id:f.id,root_teamfile:f.root_teamfile,sender_teamfile:f.sender_teamfile,sender_alias:f.sender_alias,receiver_teamfile:f.receiver_teamfile,receiver_alias:f.receiver_alias,message:f.message,response:f.response,status:f.status,created_at:f.created_at}};await t.publishDaemonEvent(m),s!==null&&s.save({cursor_key:s.key,last_pushed_id:f.id,updated_at:new Date(n()).toISOString()}),o=Math.max(o,f.id)}}catch(d){t.log?.(`[mailbox] daemon_event chat_log tail failed: ${d instanceof Error?d.message:String(d)}`)}finally{i=!1}}},u=setInterval(()=>{c()},e);return typeof u.unref=="function"&&u.unref(),{pollNow:c,stop(){a=!0,clearInterval(u)}}}function ZD(t){return typeof t=="number"&&Number.isFinite(t)&&t>0?t:void 0}async function AE(t){let e=t.tokenPath??NE($E(),".lmctl","cli-tokens.json"),r=TE(t.tokenPath);if(eE(r.cognito?.idToken)&&gd()!==null)try{await dE({region:t.region,clientId:t.cognitoClientId??ba,cliTokensPath:e}),r=TE(t.tokenPath),t.log?.("[mx-mailbox] refreshed IdToken from device-auth refresh token")}catch(R){let U=R instanceof Error?R.message:String(R);t.log?.(`[mx-mailbox] device-auth refresh failed: ${U}`)}if(r.cognito===void 0)throw new Error("agent_mailbox_not_logged_in: ~/.lmctl/cli-tokens.json has no cognito tokens; run `webcli login` or `lmctl device login` first");let n=r.cognito.idToken;if(typeof n!="string"||n==="")throw new Error("agent_mailbox_no_id_token: cli-tokens.json's cognito.idToken is empty; run `webcli login` or `lmctl device login` first");let s=`cognito-idp.${t.region}.amazonaws.com/${t.cognitoUserPoolId}`,o=r.cognito.identityId,i=!1;o===void 0||o===""?o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}):(i=!0,t.log?.(`[mx-mailbox] using cached identityId from cli-tokens (skipping GetId) for ${o}`));let a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),c={ListObjectsV2Command:HD,GetObjectCommand:qD,PutObjectCommand:JD},u=ks(n),d=u??o,f=t.deviceId,m=yn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey}),p=t.cursorStore,h;if(p!==void 0){let R=p.loadMailboxCursor(d,m);if(R!==null)h=R.last_processed_seq??void 0,t.log?.(`[mx-mailbox] resumed seq cursor=${h??"(sentinel)"} for user_id=${d}`);else{let U=!1,z=0;for(;!U&&z<2;){z+=1;try{let v=Gi(m,"web"),I=0,O;do{let J=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:v,MaxKeys:1e3,...O!==void 0?{ContinuationToken:O}:{}}));for(let W of J.Contents??[]){let L=Vi(W.Key??"",m,"web");L!==void 0&&L>I&&(I=L)}O=J.IsTruncated===!0?J.NextContinuationToken:void 0}while(O!==void 0);h=I,t.log?.(`[mx-mailbox] cold start: seeded seq cursor=${I} for user_id=${d}`),U=!0}catch(v){let I=v instanceof Error?v.message:String(v);if(i&&z===1&&tP(v)){t.log?.(`[mx-mailbox] cached identityId rejected by cognito (${I}); clearing + refreshing`),eP(e),i=!1,o=await kE({tokenPath:e,region:t.region,identityPoolId:t.identityPoolId,idpProvider:s,idToken:n,log:t.log}),a=EE({identityId:o,logins:{[s]:n},clientConfig:{region:t.region}}),l=new bE({region:t.region,credentials:a}),m=yn({identityId:o,userId:u,deviceId:f,mailboxKey:t.mailboxKey});continue}t.log?.(`[mx-mailbox] cold start seq probe failed: ${I}`);break}}p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:h??null,last_processed_at:new Date().toISOString()})}}let g=null,_=t.terminalSessionManager,T=t.persistentSessionManager,E=t.promptTriggerStore,k=new fa,$=new Or({bucket:t.mailboxBucket,identityId:o,...u!==null?{userId:u}:{},...f!==void 0?{deviceId:f}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},s3:l,commands:c,selfRole:"agent",onS3Op:R=>k.record(R),onMessage:async R=>{if(_!==void 0&&cd(R.payload)){_.onInbound(R.payload);return}if(T!==void 0&&ud(R.payload)){await T.onInbound(R.payload);return}if(!fd(R.payload)){if(E!==void 0&&md(R.payload)){Id({store:E,payload:R.payload,log:t.log});return}g!==null&&await g.handleIncoming(R.payload,R)}},...p!==void 0?{onCursorAdvance:R=>{p.saveMailboxCursor({user_id:d,mailbox_key:m,last_processed_version_id:null,last_processed_seq:R,last_processed_at:new Date().toISOString()})}}:{},...h!==void 0?{cursor:h}:{},...t.pollIntervalMs!==void 0?{pollIntervalMs:t.pollIntervalMs}:{},...t.readIntervalMs!==void 0?{readIntervalMs:t.readIntervalMs}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleMs:t.heartbeatIdleMs}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalMs:t.backoffReadIntervalMs}:{}});g=new Ts({client:$,...t.log!==void 0?{log:t.log}:{}}),_!==void 0&&_.setPublish(async R=>$.putMessage({conversation_id:`terminal:${R.session_id}`,payload:R})),T!==void 0&&T.setPublish(async R=>$.putMessage({conversation_id:`provider:${R.session_id}`,payload:R}));let x=R=>$.putMessage({conversation_id:dd,payload:R});$.start();let A=t.chatLogTailStore===void 0?void 0:zD({store:t.chatLogTailStore,publishDaemonEvent:x,cursorKey:m,intervalMs:t.chatLogPollIntervalMs??t.readIntervalMs??t.pollIntervalMs??jE,log:t.log});t.log?.(`[mx-mailbox] agent polling ${m} (bucket=${t.mailboxBucket})`);let D=t.deviceId??o,C=`${d}/usage/`,H;return H=t.usageStore===void 0?void 0:Jw({meter:k,store:t.usageStore,userId:d,deviceId:D,ceilingUsd:t.usageQuotaUsd??1/0,onQuotaExceeded:({period:R,costUsd:U,ceilingUsd:z})=>{t.log?.(`[usage] month ${R} cost $${U.toFixed(4)} >= ceiling $${z} \u2014 blocking mailbox`),$.stop().catch(()=>{}),H?.stop()},publishOwnRollup:async(R,U)=>{await l.send(new c.PutObjectCommand({Bucket:t.mailboxBucket,Key:`${C}${D}-${R}.json`,Body:JSON.stringify({...U,updated_at:new Date().toISOString()}),ContentType:"application/json"}))},readUserTotal:async R=>{let U={put:0,get:0,list:0},z;do{let v=await l.send(new c.ListObjectsV2Command({Bucket:t.mailboxBucket,Prefix:C,MaxKeys:1e3,...z!==void 0?{ContinuationToken:z}:{}}));for(let I of v.Contents??[]){let O=I.Key??"";if(O.endsWith(`-${R}.json`))try{let J=await l.send(new c.GetObjectCommand({Bucket:t.mailboxBucket,Key:O}));if(J.Body===void 0)continue;let W=JSON.parse(await J.Body.transformToString("utf-8"));U.put+=W.put??0,U.get+=W.get??0,U.list+=W.list??0}catch{}}z=v.IsTruncated===!0?v.NextContinuationToken:void 0}while(z!==void 0);return U},intervalMs:t.usageFlushIntervalMs??36e5,...t.log!==void 0?{log:t.log}:{}}),{identityId:o,mailbox:$,fetchClient:g,publishDaemonEvent:x,async stop(){A?.stop(),H!==void 0&&(await H.flushNow().catch(()=>{}),H.stop()),await g.stop().catch(()=>{}),await $.stop().catch(()=>{})}}}async function RE(t){let e=t.s3!==void 0&&t.commands!==void 0?{s3:t.s3,commands:t.commands}:da(t.rootDir),r=yn({identityId:Is,userId:Is,deviceId:SE}),n=null,s=t.terminalSessionManager,o=t.persistentSessionManager,i=t.promptTriggerStore,a=new Or({bucket:"local",identityId:Is,userId:Is,deviceId:SE,s3:e.s3,commands:e.commands,selfRole:"agent",onMessage:async c=>{if(s!==void 0&&cd(c.payload)){s.onInbound(c.payload);return}if(o!==void 0&&ud(c.payload)){await o.onInbound(c.payload);return}if(!fd(c.payload)){if(i!==void 0&&md(c.payload)){Id({store:i,payload:c.payload,log:t.log});return}n!==null&&await n.handleIncoming(c.payload,c)}},pollIntervalMs:t.pollIntervalMs??ya,readIntervalMs:t.readIntervalMs??ya,heartbeatIdleMs:t.heartbeatIdleMs??ya,backoffReadIntervalMs:t.backoffReadIntervalMs??ya});n=new Ts({client:a,...t.log!==void 0?{log:t.log}:{}}),s!==void 0&&s.setPublish(async c=>a.putMessage({conversation_id:`terminal:${c.session_id}`,payload:c})),o!==void 0&&o.setPublish(async c=>a.putMessage({conversation_id:`provider:${c.session_id}`,payload:c}));let l=c=>a.putMessage({conversation_id:dd,payload:c});return a.start(),t.log?.(`[local-webui] agent polling ${r} (local-fs ${t.rootDir})`),{identityId:Is,mailbox:a,fetchClient:n,publishDaemonEvent:l,async stop(){await n.stop().catch(()=>{}),await a.stop().catch(()=>{})}}}function TE(t){let e=t??NE($E(),".lmctl","cli-tokens.json");try{let r=Ea(e,"utf8");return JSON.parse(r)}catch{return{}}}function QD(t,e){if(e===void 0||e==="")return;let r={};try{let s=Ea(t,"utf8");r=JSON.parse(s)}catch{}if(r.cognito===void 0)return;let n={...r,cognito:{...r.cognito,identityId:e}};IE(xd(t),{recursive:!0,mode:448}),xE(t,JSON.stringify(n,null,2));try{vE(t,384)}catch{}}function eP(t){let e={};try{let n=Ea(t,"utf8");e=JSON.parse(n)}catch{return}if(e.cognito===void 0)return;let r={...e,cognito:{...e.cognito}};delete r.cognito.identityId,IE(xd(t),{recursive:!0,mode:448}),xE(t,JSON.stringify(r,null,2));try{vE(t,384)}catch{}}async function kE(t){t.log?.("[mx-mailbox] cli-tokens has no identityId; calling GetId");let r=await new WD({region:t.region}).send(new BD({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId==="")throw new Error("cognito_getid_no_identity_id");try{QD(t.tokenPath,r.IdentityId),t.log?.(`[mx-mailbox] persisted identityId=${r.IdentityId} to ${t.tokenPath}`)}catch(n){let s=n instanceof Error?n.message:String(n);t.log?.(`[mx-mailbox] WARNING: identityId persist failed (${s}); will redo GetId on next restart`)}return r.IdentityId}function tP(t){if(t===null||typeof t!="object")return!1;let e=t,r=[typeof e.name=="string"?e.name:void 0,typeof e.Code=="string"?e.Code:void 0,typeof e.__type=="string"?e.__type:void 0];for(let s of r)if(s!==void 0&&(s==="NotAuthorizedException"||s==="ResourceNotFoundException"||s==="InvalidIdentityPoolConfigurationException"||s==="ExpiredTokenException"))return!0;let n=typeof e.message=="string"?e.message:"";return!!(n.includes("NotAuthorizedException")||n.includes("Invalid identity pool configuration")||n.includes("Identity")&&n.includes("not found"))}var jE,ya,ba,XD,GD,VD,Is,SE,Nd=b(()=>{"use strict";Zi();sd();ad();Xw();Vw();Kw();Yw();zw();pd();Ki();hd();wd();wE();jE=3e3,ya=1e3,ba="79u5jhkk46qofog661c9i0bdcs",XD="us-east-1:69636ff0-e008-4cbc-853d-180e5526a198",GD="us-east-1_4iUdFggDn",VD="lmctl-next-preview-mailbox-254332045686";Is="local",SE="local"});import{spawn as Rd}from"node:child_process";import{createInterface as OE}from"node:readline";var $d,jd,Ad,LE,CE=b(()=>{"use strict";fo();je();$d=class{child;ctx;rl;nextRpcId=1;pending=new Map;threadId;nextLocalTurnId=1;closed=!1;setResumeThreadId(e){this.threadId=e}async start(e,r){this.ctx=r;let n=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});if(this.child=n,this.rl=OE({input:n.stdout}),this.rl.on("line",s=>{r.generation===r.currentGeneration()&&this.handleLine(s)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),await this.rpc("initialize",{clientInfo:{name:"lmctl-dt3",title:"lmctl DT-3",version:"0.1.0"},capabilities:{experimentalApi:!1}}),this.notify("initialized",{}),this.threadId!==void 0&&this.threadId!=="")try{await this.rpc("thread/resume",{threadId:this.threadId,approvalPolicy:"never",sandbox:"danger-full-access"}),r.emit({event_type:"thread_started",payload:{thread_id:this.threadId,resumed:!0}})}catch{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}else{let o=(await this.rpc("thread/start",{cwd:e.cwd??process.cwd(),approvalPolicy:"never",sandbox:"danger-full-access"})).result?.thread,i=typeof o?.id=="string"?o.id:void 0;this.threadId=i,r.emit({event_type:"thread_started",payload:{thread_id:i,resumed:!1}})}return n}async sendTurn(e){if(this.closed)throw new Error("codex_session_closed");if(this.threadId===void 0||this.threadId==="")throw new Error("codex_no_thread_id");let r=`local-${this.nextLocalTurnId++}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("turn/start",{threadId:this.threadId,input:[{type:"text",text:e}]})).result?.turn,o=typeof s?.id=="string"?s.id:void 0;if(o!==void 0){let i=this.ctx?.turnMap.get(r);this.ctx?.turnMap.delete(r),i!==void 0&&this.ctx?.turnMap.set(o,i)}}catch(n){throw this.ctx?.turnMap.delete(r),n}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin!==null&&this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("codex_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("codex_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1697
1685
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1698
1686
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let i=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);i.reject(new Error(`codex_rpc_error: ${l}`))}else i.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n===void 0)return;let s=r.params??{},o=this.normalizeNotification(n,s);o!==void 0&&this.ctx?.emit(o)}normalizeNotification(e,r){if(e==="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(e==="turn/started")return{event_type:"turn_started",payload:{turn_id:r.turn?.id,thread_id:this.threadId}};if(e==="item/agentMessage/delta")return{event_type:"assistant_message_delta",payload:{text:typeof r.delta=="string"?r.delta:""}};if(e==="item/started"||e==="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:e==="item/started"?"started":"completed",item:n}}:{event_type:"notification",payload:{method:e,params:r}}}if(e==="turn/completed"){let n=r.turn;return typeof n?.id=="string"&&this.ctx?.turnMap.delete(n.id),{event_type:"turn_complete",payload:r}}if(e==="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:e,params:r}}}},jd=class{child;ctx;buffer="";sessionIdSeen;closed=!1;async start(e,r){this.ctx=r;let n=Rd(e.command,e.args,{cwd:e.cwd??process.cwd(),env:e.env??process.env,stdio:["pipe","pipe","pipe"]});return this.child=n,n.stdout.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);this.buffer+=o;let i=this.buffer.split(`
1699
1687
  `);this.buffer=i.pop()??"";for(let a of i)this.handleLine(a)}),n.stderr?.on("data",s=>{if(r.generation!==r.currentGeneration())return;let o=s instanceof Buffer?s.toString("utf8"):String(s);r.emit({event_type:"notification",payload:{source:"stderr",text:o}})}),n}async sendTurn(e){if(this.closed)throw new Error("claude_session_closed");if(this.child===void 0||this.child.stdin===null)throw new Error("claude_child_unavailable");let r=`claude-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});let n=JSON.stringify({type:"user",message:{role:"user",content:e}});try{this.child.stdin.write(n+`
1700
1688
  `)}catch(s){throw this.ctx?.turnMap.delete(r),s instanceof Error?s:new Error(String(s))}}async stop(){if(this.closed=!0,this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}let n=typeof r.type=="string"?r.type:"";if(n==="system"&&r.subtype==="init"){let s=typeof r.session_id=="string"?r.session_id:void 0;s!==void 0&&s!==this.sessionIdSeen&&(this.sessionIdSeen=s,this.ctx?.emit({event_type:"thread_started",payload:{thread_id:s,raw:r}}));return}if(n==="assistant"){let o=r.message?.content;if(Array.isArray(o))for(let i of o)i.type==="text"&&typeof i.text=="string"&&i.text!==""&&this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:i.text}});return}if(n==="result"){let s=typeof r.session_id=="string"?r.session_id:void 0;for(let o of Array.from(this.ctx?.turnMap.keys()??[]))this.ctx?.turnMap.delete(o);this.ctx?.emit({event_type:"turn_complete",payload:{result:r.result,session_id:s,raw:r}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r}})}},Ad=class{child;ctx;rl;nextRpcId=1;pending=new Map;sessionId;closed=!1;async start(e,r){this.ctx=r;let n=e.cwd??process.cwd();if(e.provider==="opencode")try{uo(n)}catch(a){Z({event:"opencode_config_install_failed",cwd:n,error_message:a instanceof Error?a.message:String(a)})}let s=Rd(e.command,e.args,{cwd:n,env:e.env??process.env,stdio:["pipe","pipe","pipe"]});this.child=s,this.rl=OE({input:s.stdout}),this.rl.on("line",a=>{r.generation===r.currentGeneration()&&this.handleLine(a)}),s.stderr?.on("data",a=>{if(r.generation!==r.currentGeneration())return;let l=a instanceof Buffer?a.toString("utf8"):String(a);r.emit({event_type:"notification",payload:{source:"stderr",text:l}})}),await this.rpc("initialize",{protocolVersion:1,clientInfo:{name:"lmctl-dt3",version:"0.1.0"},clientCapabilities:{}}),this.notify("notifications/initialized",{});let i=(await this.rpc("session/new",{cwd:e.cwd??process.cwd(),mcpServers:[]})).result;return this.sessionId=typeof i?.sessionId=="string"?i.sessionId:void 0,r.emit({event_type:"thread_started",payload:{thread_id:this.sessionId,raw:i}}),s}async sendTurn(e){if(this.closed)throw new Error("acp_session_closed");if(this.sessionId===void 0)throw new Error("acp_no_session_id");let r=`acp-${Date.now()}`;this.ctx?.turnMap.set(r,{startedAt:Date.now()});try{let s=(await this.rpc("session/prompt",{sessionId:this.sessionId,prompt:[{type:"text",text:e}]})).result;this.ctx?.emit({event_type:"turn_complete",payload:{stopReason:s?.stopReason,raw:s}})}finally{this.ctx?.turnMap.delete(r)}}async stop(){if(this.closed=!0,this.rl!==void 0&&(this.rl.close(),this.rl=void 0),this.child?.stdin?.end!==void 0)try{this.child.stdin.end()}catch{}for(let e of this.pending.values())e.reject(new Error("acp_session_stopping"));this.pending.clear()}async rpc(e,r){if(this.child?.stdin===null||this.child===void 0)throw new Error("acp_child_unavailable");return new Promise((n,s)=>{let o=this.nextRpcId++;this.pending.set(o,{resolve:n,reject:s});let i=JSON.stringify({jsonrpc:"2.0",id:o,method:e,params:r});try{this.child.stdin.write(i+`
1701
1689
  `)}catch(a){this.pending.delete(o),s(a instanceof Error?a:new Error(String(a)))}})}notify(e,r){if(this.child?.stdin===null||this.child===void 0)return;let n=JSON.stringify({jsonrpc:"2.0",method:e,params:r});try{this.child.stdin.write(n+`
1702
1690
  `)}catch{}}handleLine(e){if(e.trim()==="")return;let r;try{r=JSON.parse(e)}catch{return}if(typeof r.id=="number"&&this.pending.has(r.id)){let s=this.pending.get(r.id);if(this.pending.delete(r.id),r.error!==void 0){let o=r.error,i=typeof o?.message=="string"&&o.message!==""?o.message:JSON.stringify(r.error);s.reject(new Error(`acp_rpc_error: ${i}`))}else s.resolve(r);return}let n=typeof r.method=="string"?r.method:void 0;if(n!==void 0){if(typeof r.id=="number"){let s=JSON.stringify({jsonrpc:"2.0",id:r.id,error:{code:-32601,message:`Method not found: ${n} (lmctl dt-3 does not implement server-side ACP methods)`}});try{this.child?.stdin?.write(s+`
1703
- `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},LE=t=>{switch(t){case"codex":return new $d;case"claude":case"qwen":return new jd;case"gemini":case"copilot":case"opencode":return new Ad;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as rP}from"node:crypto";import{existsSync as L8,mkdirSync as nP,readFileSync as sP,writeFileSync as oP}from"node:fs";import{homedir as iP}from"node:os";import{dirname as aP,join as lP}from"node:path";function Sa(){return process.env.LMCTL_DEVICE_FILE??lP(iP(),".lmctl","device.json")}function Lr(t=Sa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(sP(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Od(t=Sa()){let e=Lr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:rP(),created_at:new Date().toISOString()};return nP(aP(t),{recursive:!0}),oP(t,`${JSON.stringify(r,null,2)}
1691
+ `)}catch{}this.ctx?.emit({event_type:"notification",payload:{kind:"unhandled_request",method:n,id:r.id,params:r.params}});return}if(n==="session/update"){let s=r.params,o=s?.update;if((typeof o?.sessionUpdate=="string"?o.sessionUpdate:"")==="agent_message_chunk"){let a=o?.content,l=typeof a?.text=="string"?a.text:"";if(l!==""){this.ctx?.emit({event_type:"assistant_message_delta",payload:{text:l}});return}}this.ctx?.emit({event_type:"notification",payload:{method:n,params:s}});return}this.ctx?.emit({event_type:"notification",payload:{method:n,params:r.params}})}}},LE=t=>{switch(t){case"codex":return new $d;case"claude":case"qwen":return new jd;case"gemini":case"copilot":case"opencode":return new Ad;default:throw new Error(`no_persistent_adapter_for_provider: ${t}`)}}});import{randomUUID as rP}from"node:crypto";import{existsSync as O8,mkdirSync as nP,readFileSync as sP,writeFileSync as oP}from"node:fs";import{homedir as iP}from"node:os";import{dirname as aP,join as lP}from"node:path";function Sa(){return process.env.LMCTL_DEVICE_FILE??lP(iP(),".lmctl","device.json")}function Lr(t=Sa()){let e=process.env.LMCTL_DEVICE_ID;if(e!==void 0&&e!=="")return{device_id:e,created_at:"env"};try{let r=JSON.parse(sP(t,"utf8"));return typeof r.device_id!="string"||r.device_id===""?null:{device_id:r.device_id,created_at:typeof r.created_at=="string"?r.created_at:""}}catch{return null}}function Od(t=Sa()){let e=Lr(t);if(e!==null&&e.created_at!=="env")return e;let r={device_id:rP(),created_at:new Date().toISOString()};return nP(aP(t),{recursive:!0}),oP(t,`${JSON.stringify(r,null,2)}
1704
1692
  `,{encoding:"utf8",mode:384}),r}var Ld=b(()=>{"use strict"});import*as ME from"node:child_process";function uP(t,e){try{let r=e(t,["--version"],{encoding:"utf-8",timeout:5e3});return r.status===0?{found:!0,version:(r.stdout??"").toString().trim().split(/\r?\n/,1)[0]?.trim()||void 0}:r.status===null?{found:!1,failureMode:"not installed"}:{found:!1,failureMode:"runs but failed"}}catch{return{found:!1,failureMode:"not installed"}}}function Cd(t,e={}){let r=e.spawnSync===void 0&&process.env[dP]==="1",n=e.spawnSync??ME.spawnSync,s=new Set,o=[];for(let i of t){if(s.has(i))continue;s.add(i);let a=Ta[i];if(!a){o.push({provider:i,binary:"<unknown>",found:!1,failureMode:"not installed"});continue}if(r){o.push({provider:i,binary:a,found:!0,version:"(skipped)"});continue}let l=uP(a,n);l.found?o.push({provider:i,binary:a,found:!0,version:l.version}):o.push({provider:i,binary:a,found:!1,failureMode:l.failureMode})}return o}function DE(t){if(t.binary==="<unknown>")return`unknown provider "${t.provider}" \u2014 no binary mapping (allowed: ${Object.keys(Ta).join(", ")})`;let e=cP[t.provider],r=e?` (install via ${e})`:"";return t.failureMode==="runs but failed"?`provider "${t.provider}" binary '${t.binary}' found but \`${t.binary} --version\` failed to run cleanly \u2014 check install integrity${r}`:`provider "${t.provider}" binary '${t.binary}' not installed${r}`}var Ta,cP,dP,PE=b(()=>{"use strict";Ta={claude:"claude",codex:"codex",copilot:"copilot",gemini:"gemini",opencode:"opencode",qwen:"qwen",agy:"agy"},cP={claude:"https://docs.claude.com/code",codex:"https://github.com/openai/codex",copilot:"https://docs.github.com/copilot/cli",gemini:"https://github.com/google-gemini/gemini-cli",opencode:"https://opencode.ai",qwen:"https://github.com/QwenLM/qwen-code",agy:"https://antigravity.google"};dP="LMCTL_SKIP_BINARY_CHECK"});var VE={};ce(VE,{ProviderBinaryPreflightError:()=>ka,__setProviderBinaryCheckForTest:()=>EP,bootstrapAgentRestMailbox:()=>WE,publishRegisteredWorkflowsOnStart:()=>UE,resolveLocalMailboxDir:()=>XE,resolveLocalWebuiDir:()=>JE,resolveServeConfig:()=>BE,runProviderBinaryPreflight:()=>HE,runServe:()=>_P,validateServeArgs:()=>GE});import{randomBytes as fP}from"node:crypto";import{existsSync as mP}from"node:fs";import{homedir as pP}from"node:os";import{isAbsolute as FE,resolve as Md}from"node:path";async function _P(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(hP),0;let r=GE(t,process.env);if(typeof r=="string")return e.stderr.write(`error: ${r}
1705
1693
  `),2;try{HE(e)}catch(E){return 1}let n=pe({path:ue()}),s={portCli:bP(t)},o;try{o=BE({dal:n,cli:s,env:process.env,parsed:r,io:e})}catch(E){return n.close(),e.stderr.write(`error: ${E instanceof Error?E.message:String(E)}
1706
- `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Cy(n);let i;if(r.localWebui!==void 0){let E=JE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=XE(process.env),{s3:$,commands:N}=da(k);i={webuiDir:E,rootDir:k,s3:$,commands:N},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${k}
1707
- `)}let a=r.noDaemon?void 0:Oy({dal:n,intervalMs:Ss()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:Ns({env:process.env});l.missing.length>0&&e.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)`)+`
1708
- `);let c=await yP({log:E=>e.stderr.write(`${E}
1694
+ `),2}process.env.LMCTL_API_URL=o.apiUrl,process.env.LMCTL_API_TOKEN=o.apiToken,process.env.LMCTL_API_PORT=String(o.port),Cw(n);let i;if(r.localWebui!==void 0){let E=JE(r.localWebui.dir,process.env);if(E===null)return e.stderr.write("error: --webui requires a local SPA build directory: pass `lmctl serve --webui <dir>` or set LMCTL_LOCAL_WEBUI_DIR to a directory containing index.html\n"),n.close(),2;let k=XE(process.env),{s3:$,commands:x}=da(k);i={webuiDir:E,rootDir:k,s3:$,commands:x},e.stdout.write(`local webui: serving SPA from ${E}; mailbox store ${k}
1695
+ `)}let a=r.noDaemon?void 0:Ow({dal:n,intervalMs:Ss()}),l=i!==void 0?{missing:[],tfstateCandidatesChecked:[]}:xs({env:process.env});l.missing.length>0&&e.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)`)+`
1696
+ `);let c=await wP({log:E=>e.stderr.write(`${E}
1709
1697
  `)}),u=new na({adapterFactory:LE,publish:async()=>{throw new Error("persistent_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:E=>e.stderr.write(`${E}
1710
- `)}),d=Lr()?.device_id,f=ky({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:gP(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),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 WE({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await UE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),T=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1698
+ `)}),d=Lr()?.device_id,f=kw({dal:n,daemon:a,...l.config!==void 0?{webuiRuntimeConfig:gP(l.config,d)}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u,...i!==void 0?{localWebui:{webuiDir:i.webuiDir,localMailbox:{s3:i.s3,commands:i.commands}}}:{}}),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 WE({dal:n,app:f,io:e,mailbox:l.config===void 0?void 0:{...l.config,cursorStore:n,chatLogTailStore:n,promptTriggerStore:n,usageStore:n,...h!==void 0?{usageQuotaUsd:h}:{},...d!==void 0?{deviceId:d}:{}},...i!==void 0?{localMailbox:{rootDir:i.rootDir,s3:i.s3,commands:i.commands,promptTriggerStore:n}}:{},...c!==void 0?{terminalSessionManager:c}:{},persistentSessionManager:u});await UE({dal:n,mailbox:g.mailbox,io:e});let{serve:_}=await import("@hono/node-server"),T=_({fetch:f.fetch,port:o.port,hostname:r.bind});return e.stdout.write(`listening on ${r.bind}:${o.port}
1711
1699
  `),await new Promise(E=>{let k=()=>{(async()=>(a!==void 0&&await a.stop(),T.close(),await g.stop(),c!==void 0&&await c.stop(),await u.stop(),n.close(),E()))()};process.once("SIGTERM",k),process.once("SIGINT",k)}),0}function gP(t,e){return{identityPoolId:t.identityPoolId,cognitoUserPoolId:t.cognitoUserPoolId,cognitoRegion:t.region,mailboxBucket:t.mailboxBucket,workspaceFetchMode:"mailbox",...e!==void 0?{deviceId:e}:{},...t.mailboxKey!==void 0?{mailboxKey:t.mailboxKey}:{},mailboxPolling:{...t.readIntervalMs!==void 0?{readIntervalSeconds:t.readIntervalMs/1e3}:{},...t.heartbeatIdleMs!==void 0?{heartbeatIdleSeconds:t.heartbeatIdleMs/1e3}:{},...t.backoffReadIntervalMs!==void 0?{backoffReadIntervalSeconds:t.backoffReadIntervalMs/1e3}:{}}}}async function UE(t){if(t.mailbox===void 0)return;let e={kind:"daemon_event",event:"workflows",ts:Date.now(),workflows:t.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 t.mailbox.publishDaemonEvent(e)}catch(r){t.io?.stderr.write(`[mailbox] daemon_event workflows push failed: ${r instanceof Error?r.message:String(r)}
1712
1700
  `)}}async function WE(t){let e;if(t.mailbox!==void 0||t.localMailbox!==void 0)try{e=t.localMailbox!==void 0?await RE({...t.localMailbox,log:r=>t.io?.stderr.write(`${r}
1713
1701
  `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}):await AE({...t.mailbox,log:r=>t.io?.stderr.write(`${r}
1714
1702
  `),...t.terminalSessionManager!==void 0?{terminalSessionManager:t.terminalSessionManager}:{},...t.persistentSessionManager!==void 0?{persistentSessionManager:t.persistentSessionManager}:{}}),e.fetchClient.onRequest(f_({app:t.app,log:r=>t.io?.stderr.write(`${r}
1715
1703
  `)})),t.io?.stderr.write(`[mailbox] dg-2 agent runtime started (identity=${e.identityId})
1716
1704
  `)}catch(r){let n=r instanceof Error?r.message:String(r);t.io?.stderr.write(`[mailbox] dg-2 agent runtime NOT started: ${n}
1717
- `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function BE(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.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,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=fP(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${wP(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1718
- `);return{port:a,apiUrl:d,apiToken:c}}function wP(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function yP(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new ra({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function EP(t){qE=t??Cd}function HE(t){let e=Object.keys(Ta),r=qE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${DE(o)}
1705
+ `)}return{...e!==void 0?{mailbox:e}:{},async stop(){e!==void 0&&await e.stop()}}}function BE(t){let{dal:e,cli:r,env:n,parsed:s,io:o}=t,i=[],a,l=e.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,i.push("api.port")}else a=s.port;let c,u=e.getConfig("api.token");u!==null?c=u:n.LMCTL_API_TOKEN!==void 0&&n.LMCTL_API_TOKEN.length>0?(c=n.LMCTL_API_TOKEN,i.push("api.token")):(c=fP(32).toString("hex"),e.setConfig("api.token",c),o.stdout.write("Generated initial api.token; view via `lmctl api config get api.token`\n"));let d,f=e.getConfig("api.url");f!==null?d=f:n.LMCTL_API_URL!==void 0&&n.LMCTL_API_URL.length>0?(d=n.LMCTL_API_URL,i.push("api.url")):(d=`http://127.0.0.1:${a}`,e.setConfig("api.url",d));for(let m of i)o.stderr.write(`note: ${yP(m)} env var used as fallback for ${m}; consider \`lmctl api config set ${m} ...\` to make this DB-canonical.
1706
+ `);return{port:a,apiUrl:d,apiToken:c}}function yP(t){switch(t){case"api.port":return"LMCTL_API_PORT";case"api.token":return"LMCTL_API_TOKEN";case"api.url":return"LMCTL_API_URL";default:return`LMCTL_${t.replaceAll(".","_").toUpperCase()}`}}async function wP(t){let e;try{e=await import("node-pty")}catch(r){let n=r instanceof Error?r.message:String(r);t.log(`[dt-2] node-pty not available; terminal routes will return 503 (${n})`);return}return new ra({pty:{spawn:e.spawn.bind(e)},publish:async()=>{throw new Error("terminal_publish_not_wired: mailbox runtime has not bound the publish hook yet")},log:t.log})}function EP(t){qE=t??Cd}function HE(t){let e=Object.keys(Ta),r=qE(e),n=r.filter(o=>!o.found);if(n.length>0){for(let o of n)t.stderr.write(`error: ${DE(o)}
1719
1707
  `);throw t.stderr.write(`error: agent refusing to start; ensure missing provider CLIs are on PATH
1720
1708
  `),new ka(n)}let s=r.map(o=>o.provider).join(", ");t.stdout.write(`providers ready: ${s}
1721
- `)}function JE(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=FE(r)?r:Md(process.cwd(),r);return mP(`${n}/index.html`)?n:null}function XE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?FE(e)?e:Md(process.cwd(),e):Md(pP(),".lmctl","local-mailbox")}function bP(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function GE(t,e=process.env){let r=SP(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function SP(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var hP,ka,qE,KE=b(()=>{"use strict";Pe();Ny();ed();My();ou();xd();sd();Hu();Ju();CE();Ld();PE();Ve();hP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1709
+ `)}function JE(t,e){let r=t!==void 0&&t!==""?t:e.LMCTL_LOCAL_WEBUI_DIR!==void 0&&e.LMCTL_LOCAL_WEBUI_DIR!==""?e.LMCTL_LOCAL_WEBUI_DIR:void 0;if(r===void 0)return null;let n=FE(r)?r:Md(process.cwd(),r);return mP(`${n}/index.html`)?n:null}function XE(t){let e=t.LMCTL_LOCAL_MAILBOX_DIR;return e!==void 0&&e!==""?FE(e)?e:Md(process.cwd(),e):Md(pP(),".lmctl","local-mailbox")}function bP(t){for(let e=0;e<t.length;e+=1)if(t[e]==="--port"){let r=t[e+1];if(r!==void 0&&!r.startsWith("--")){let n=Number(r);if(Number.isInteger(n)&&n>0&&n<=65535)return n}}}function GE(t,e=process.env){let r=SP(t);return typeof r=="string"?r:r.bind==="0.0.0.0"&&!r.insecureNoAuth&&!e.LMCTL_API_TOKEN?"auth required for --bind 0.0.0.0; set LMCTL_API_TOKEN, persist a token via `lmctl api config set api.token ...`, or pass --insecure-no-auth":r}function SP(t){let e={port:8787,bind:"127.0.0.1",noDaemon:!1,insecureNoAuth:!1};for(let r=0;r<t.length;r+=1){let n=t[r];if(n==="--port"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --port";let o=Number(s);if(!Number.isInteger(o)||o<=0||o>65535)return`invalid --port: ${s}`;e.port=o;continue}if(n==="--bind"){let s=t[++r];if(s===void 0||s.startsWith("--"))return"missing value for --bind";e.bind=s;continue}if(n==="--no-daemon"){e.noDaemon=!0;continue}if(n==="--insecure-no-auth"){e.insecureNoAuth=!0;continue}if(n==="--webui"){let s=t[r+1];s!==void 0&&!s.startsWith("--")?(e.localWebui={dir:s},r+=1):e.localWebui={dir:void 0};continue}return`unknown argument: ${n}`}return e}var hP,ka,qE,KE=b(()=>{"use strict";Pe();xw();ed();Mw();ou();Nd();sd();Hu();Ju();CE();Ld();PE();Ve();hP=`usage: lmctl serve [--port N] [--bind HOST] [--no-daemon] [--insecure-no-auth] [--webui [DIR]]
1722
1710
 
1723
1711
  Start the local HTTP API, web UI, queue daemon, terminal manager, and agent
1724
1712
  services. Help exits before any port binding or daemon startup.
@@ -1729,26 +1717,26 @@ services. Help exits before any port binding or daemon startup.
1729
1717
  local identity. Mailbox store defaults to
1730
1718
  ~/.lmctl/local-mailbox/ ($LMCTL_LOCAL_MAILBOX_DIR overrides).
1731
1719
  `;ka=class extends Error{missing;constructor(e){let r=e.map(n=>n.provider).join(", ");super(`provider binary pre-flight failed: ${r}`),this.name="ProviderBinaryPreflightError",this.missing=e}},qE=Cd});var YE={};ce(YE,{runIntake:()=>kP});async function kP(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(TP),0):r==="scan"?vP(n,e):r==="config"?IP(n,e):(e.stderr.write(`usage: lmctl intake <scan|config> ...
1732
- `),1)}async function vP(t,e){let r=F(t,["--project"],["--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=x(r,"--project");return G(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return w(e,`project not found: ${n}`);let i=await nu({dal:s,project:o});return q(e,{project_id:o.id,project_name:o.name,...i}),0}return q(e,await fn(s)),0})}async function IP(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return w(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=F(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return w(e,s.error);let o=x(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return w(e,"missing or invalid --scan-github-issues true|false");let i=x(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return w(e,"invalid --state: expected open, closed, or all");let a=x(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return G(e,c=>{let u=c.findProjectByName(r);if(u===null)return w(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return q(e,d),0})}var TP,zE=b(()=>{"use strict";vi();$e();TP=`usage: lmctl intake <scan|config> ...
1720
+ `),1)}async function vP(t,e){let r=F(t,["--project"],["--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=N(r,"--project");return G(e,async s=>{if(n!==void 0){let o=s.findProjectByName(n);if(o===null)return y(e,`project not found: ${n}`);let i=await nu({dal:s,project:o});return q(e,{project_id:o.id,project_name:o.name,...i}),0}return q(e,await fn(s)),0})}async function IP(t,e){let[r,...n]=t;if(r===void 0||r.startsWith("--"))return y(e,"usage: lmctl intake config <project-name> --scan-github-issues true|false [--labels csv] [--state open|closed|all]");let s=F(n,["--scan-github-issues","--labels","--state"],["--json"]);if(s.error!==void 0)return y(e,s.error);let o=N(s,"--scan-github-issues");if(o!=="true"&&o!=="false")return y(e,"missing or invalid --scan-github-issues true|false");let i=N(s,"--state");if(i!==void 0&&i!=="open"&&i!=="closed"&&i!=="all")return y(e,"invalid --state: expected open, closed, or all");let a=N(s,"--labels"),l={scan_github_issues:o==="true",labels:a===void 0?void 0:a.split(",").map(c=>c.trim()).filter(Boolean),state:i};return G(e,c=>{let u=c.findProjectByName(r);if(u===null)return y(e,`project not found: ${r}`);let d=c.setProjectIntakeConfig(u.id,JSON.stringify(l));return q(e,d),0})}var TP,zE=b(()=>{"use strict";vi();$e();TP=`usage: lmctl intake <scan|config> ...
1733
1721
 
1734
1722
  Scan configured project GitHub issues into lmctl, or update per-project
1735
1723
  intake settings such as enabled state, labels, and issue state filters.
1736
- `});import{createHash as NP}from"node:crypto";import{existsSync as xs,mkdirSync as xP,readFileSync as QE,realpathSync as $P,writeFileSync as jP}from"node:fs";import{dirname as eb,resolve as tb}from"node:path";function Cr(t){let e=tb(t);return xs(e)?$P(e):e}function ZE(t,e){let r=eb(e),n=Td(t,Sd(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=tb(r,s.sessiondir));return n}function $s(t,e){let r=Cr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!xs(r)&&"upsertRootTeam"in e&&(xP(eb(r),{recursive:!0}),jP(r,n.raw_text,"utf8")),ZE(n.raw_text,r);if(xs(r)){let s=QE(r,"utf8"),o=ZE(s,r);return"upsertRootTeam"in e&&RP(o)&&OP(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!xs(r))throw new Error(`teamfile not found: ${t}`);return Re(r)}function rb(t,e,r){let n=Cr(t),s=e.getRootTeam(n);s===null||!xs(n)||QE(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 RP(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=AP)}function OP(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:NP("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var AP,va=b(()=>{"use strict";Ut();AP=5});import{existsSync as LP}from"node:fs";import{dirname as nb}from"node:path";function DP(t){return CP.test(t)||MP.test(t)}function sb(t){return Ia.test(t)}function js(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Ia.test(n)?null:{teamfile:r,alias:n}}function Wt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!sb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Ia.source}).`);let n=Cr(t);if(r===void 0&&!LP(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=$s(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=_a(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1724
+ `});import{createHash as xP}from"node:crypto";import{existsSync as Ns,mkdirSync as NP,readFileSync as QE,realpathSync as $P,writeFileSync as jP}from"node:fs";import{dirname as eb,resolve as tb}from"node:path";function Cr(t){let e=tb(t);return Ns(e)?$P(e):e}function ZE(t,e){let r=eb(e),n=Td(t,Sd(e),{baseDir:r});for(let s of n.members)s.sessiondir!==void 0&&!s.sessiondir.startsWith("/")&&(s.sessiondir=tb(r,s.sessiondir));return n}function $s(t,e){let r=Cr(t);if(e!==void 0){let n=e.getRootTeam(r);if(n!==null)return!Ns(r)&&"upsertRootTeam"in e&&(NP(eb(r),{recursive:!0}),jP(r,n.raw_text,"utf8")),ZE(n.raw_text,r);if(Ns(r)){let s=QE(r,"utf8"),o=ZE(s,r);return"upsertRootTeam"in e&&RP(o)&&OP(e,r,o,s),o}throw new Error(`teamfile not found: ${t}`)}if(!Ns(r))throw new Error(`teamfile not found: ${t}`);return Re(r)}function rb(t,e,r){let n=Cr(t),s=e.getRootTeam(n);s===null||!Ns(n)||QE(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 RP(t){return t.parseErrors.length>0?!1:t.members.every(e=>e.teamfile!==void 0?!0:e.session!==void 0&&e.session.length>=AP)}function OP(t,e,r,n){let s=new Date().toISOString(),o={teamfile_path:e,name:r.name,raw_text:n,raw_sha256:xP("sha256").update(n).digest("hex"),registered_at:s,last_seeded_at:s};t.upsertRootTeam(o)}var AP,va=b(()=>{"use strict";Ut();AP=5});import{existsSync as LP}from"node:fs";import{dirname as nb}from"node:path";function DP(t){return CP.test(t)||MP.test(t)}function sb(t){return Ia.test(t)}function js(t){if(!t.includes(":"))return null;let e=t.lastIndexOf(":"),r=t.slice(0,e),n=t.slice(e+1);return!r.endsWith(".lmctl")||!Ia.test(n)?null:{teamfile:r,alias:n}}function Wt(t,e,r){if(!t.endsWith(".lmctl"))throw new ge(`lmctl: "${t}" doesn't look like a teamfile (expected .lmctl extension).`);if(!sb(e))throw new ge(`lmctl: "${e}" is not a valid alias (must match ${Ia.source}).`);let n=Cr(t);if(r===void 0&&!LP(n))throw new ge(`lmctl: teamfile not found: ${t}`);let s;try{s=$s(n,r)}catch(i){throw new ge(`lmctl: ${t}: ${i instanceof Error?i.message:String(i)}`)}if(s.parseErrors.length>0)throw new ge(`lmctl: ${t}: ${s.parseErrors.join("; ")}`);let o=_a(s,e);if(o===void 0){let i=s.members.map(a=>a.alias).join(", ")||"(none)";throw new ge(`lmctl: alias "${e}" not found in ${t}.
1737
1725
  Known aliases: ${i}`)}if(o.teamfile!==void 0){let i=vd(o,nb(n));return{teamfile:n,alias:o.alias,provider:i.provider,sessionid:i.session,sessiondir:i.sessiondir,isLead:!0,...i.model??o.model?{model:i.model??o.model}:{},...i.effort??o.effort?{effort:i.effort??o.effort}:{}}}if(o.session===void 0)throw new ge(`lmctl: alias "${o.alias}" in ${t} has no session ID yet.
1738
1726
  Run: lmctl seed ${t}`);return{teamfile:n,alias:o.alias,provider:o.provider,sessionid:o.session,sessiondir:o.sessiondir??nb(n),isLead:St(s)?.alias===o.alias,...o.model!==void 0?{model:o.model}:{},...o.effort!==void 0?{effort:o.effort}:{}}}function ur(t,e){let{target:r,alias:n,flags:s}=e;if(s.run!==void 0||s.project!==void 0||s.workflow!==void 0){if(r!==void 0)return{mode:"error",message:`lmctl ${t.name}: --run/--project/--workflow (managed mode) are mutually exclusive with a positional target "${r}" \u2014 pick one form.`};let i={mode:"managed"};return s.run!==void 0&&(i.run=s.run),s.project!==void 0&&(i.project=s.project),s.workflow!==void 0&&(i.workflow=s.workflow),i}if(r!==void 0){let i=js(r);if(i!==null)return n!==void 0&&n!==i.alias?{mode:"error",message:`lmctl ${t.name}: got "${r}" AND second positional "${n}" \u2014 pick one form.`}:{mode:"ai-team",teamfile:i.teamfile,alias:i.alias};if(r.endsWith(".lmctl"))return n!==void 0?sb(n)?{mode:"ai-team",teamfile:r,alias:n}:{mode:"error",message:`lmctl ${t.name}: "${n}" is not a valid alias (must match ${Ia.source}).`}:t.allowsBareTeamfile?{mode:"ai-team",teamfile:r}:{mode:"error",message:`lmctl ${t.name}: alias required.
1739
1727
  Use: lmctl ${t.name} ${r}:<alias> or lmctl ${t.name} ${r} <alias>`};if(DP(r)){if(n!==void 0)return{mode:"error",message:`lmctl ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.`};if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: "${r}" is a bare sessionid, but ${t.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 ${t.name}: got a second positional "${n}" but "${r}" is not a teamfile path.
1740
1728
  Either drop the second arg, or pass <teamfile>.lmctl as the first arg.`}:{mode:"error",message:`lmctl ${t.name}: can't infer target type from "${r}".
1741
1729
  Expected one of: <path>.lmctl, <path>.lmctl:<alias>, <sessionid>.`}}if(s.session!==void 0){if(!t.supportsRaw)return{mode:"error",message:`lmctl ${t.name}: --session (raw mode) is not supported by ${t.name}.`};let i={mode:"ai-team-raw",sessionid:s.session};return s.provider!==void 0&&(i.provider=s.provider),i}return{mode:"error",message:`lmctl ${t.name}: a target is required.
1742
- Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,CP,MP,Ia,vn=b(()=>{"use strict";Ut();va();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},CP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,MP=/^ses_[A-Za-z0-9_-]+$/,Ia=/^[A-Za-z][A-Za-z0-9_-]*$/});function ab(t){let e=ob(t.registry,t.fromTeamfile);if(e===void 0)return In(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!ib(e,t.fromAlias))return In(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=ob(t.registry,t.toTeamfile);return r===void 0?In(`target team is not registered in policy graph: ${t.toTeamfile}`):ib(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?In(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?In(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:In(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function ob(t,e){return t.teams.find(r=>r.teamfile===e)}function ib(t,e){return t.aliases.some(r=>r===e)}function In(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var lb=b(()=>{"use strict"});import{basename as PP}from"node:path";function db(t,e){let r=new Date(e.now.getTime()-Na()).toISOString(),n=pb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=WP(e.sender,n),o=BP(e.sender,n);o!==null&&o.teamfile===e.root&&!ub(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>ub(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<FP;return{stop:l.length>=1&&u,chain:qP(a)}}function fb(t,e){let r=new Date(e.now.getTime()-Na()).toISOString(),n=pb(t,r),s=hb(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function Na(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return cb;let r=Number(e);return!Number.isFinite(r)||r<=0?cb:r}function mb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function UP(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function pb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(UP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function WP(t,e,r={}){let n=new Map;for(let a of e)n.set(Mr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Mr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Mr(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Mr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function hb(t,e){let r=Mr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Mr(l.sender),u=Mr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function BP(t,e){let r=hb(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function ub(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Mr(t){return`${t.teamfile}\0${t.alias}`}function qP(t){return t.map(e=>`${PP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var FP,cb,_b=b(()=>{"use strict";FP=6e4,cb=8*60*60*1e3});var bb={};ce(bb,{parseIdleTimeoutMs:()=>Eb,runChat:()=>JP});async function JP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${wb}
1730
+ Use: <path>.lmctl[:<alias>] | <path>.lmctl <alias> | <sessionid> | --run <id>`}}var ge,CP,MP,Ia,vn=b(()=>{"use strict";Ut();va();ge=class extends Error{constructor(e){super(e),this.name="ChatTargetError"}},CP=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,MP=/^ses_[A-Za-z0-9_-]+$/,Ia=/^[A-Za-z][A-Za-z0-9_-]*$/});function ab(t){let e=ob(t.registry,t.fromTeamfile);if(e===void 0)return In(`sender team is not registered in policy graph: ${t.fromTeamfile}`);if(!ib(e,t.fromAlias))return In(`sender alias "${t.fromAlias}" not found in ${t.fromTeamfile}`);let r=ob(t.registry,t.toTeamfile);return r===void 0?In(`target team is not registered in policy graph: ${t.toTeamfile}`):ib(r,t.toAlias)?t.toTeamfile===t.fromTeamfile?{allowed:!0,outOfPolicy:!1,reason:"same team"}:e.leadAlias===null?In(`sender team has no Lead: ${t.fromTeamfile}`):t.fromAlias!==e.leadAlias?In(`cross-team sends may only originate from Lead; got "${t.fromAlias}" in ${t.fromTeamfile}`):{allowed:!0,outOfPolicy:!1,reason:"cross-team send from Lead"}:In(`target alias "${t.toAlias}" not found in ${t.toTeamfile}`)}function ob(t,e){return t.teams.find(r=>r.teamfile===e)}function ib(t,e){return t.aliases.some(r=>r===e)}function In(t){return{allowed:!1,outOfPolicy:!0,reason:t}}var lb=b(()=>{"use strict"});import{basename as PP}from"node:path";function db(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=pb(t,r).filter(f=>!f.sender.teamfile.startsWith("prompt:")),s=WP(e.sender,n),o=BP(e.sender,n);o!==null&&o.teamfile===e.root&&!ub(s[0],o)&&s.unshift({...o,at:null});let i={teamfile:e.receiverTeamfile,alias:e.receiverAlias,at:e.now.getTime()},a=[...s,i],l=s.filter(f=>ub(f,i)),c=l.map(f=>f.at).filter(f=>f!==null).sort((f,m)=>m-f)[0]??null,u=c!==null&&e.now.getTime()-c<FP;return{stop:l.length>=1&&u,chain:qP(a)}}function fb(t,e){let r=new Date(e.now.getTime()-xa()).toISOString(),n=pb(t,r),s=hb(e.sender,n);if(s.length===0)return null;let o=s[0];return o.sender.teamfile.startsWith("prompt:")?o.receiver.teamfile:o.sender.teamfile}function xa(t=process.env){let e=t.LMCTL_INFLIGHT_TTL_MS;if(e===void 0||e.trim()==="")return cb;let r=Number(e);return!Number.isFinite(r)||r<=0?cb:r}function mb(t){return`cross-team cycle detected (${t}); stopping to prevent a runaway loop.`}function UP(t){return{sender:{teamfile:t.sender_teamfile,alias:t.sender_alias},receiver:{teamfile:t.receiver_teamfile,alias:t.receiver_alias},at:Date.parse(t.started_at)}}function pb(t,e){return t.clearAgentInflightOlderThan(e),t.listAgentInflight().map(UP).filter(r=>Number.isFinite(r.at)&&new Date(r.at).toISOString()>=e).sort((r,n)=>r.at-n.at)}function WP(t,e,r={}){let n=new Map;for(let a of e)n.set(Mr(a.receiver),a);let s=[{...t,at:null}],o=t,i=new Set([Mr(t)]);for(let a=0;a<64;a+=1){let l=n.get(Mr(o));if(l===void 0)break;s[0]={...s[0],at:s[0].at??l.at};let c={...l.sender,at:l.at};if(l.sender.teamfile.startsWith("prompt:")&&r.includePromptSender!==!0)break;let u=Mr(l.sender);if(i.has(u))break;s.unshift(c),i.add(u),o=l.sender}return s}function hb(t,e){let r=Mr(t),n=new Set([r]),s=[r],o=[];for(let i=0;s.length>0&&i<128;i+=1){let a=s.shift();for(let l of e){let c=Mr(l.sender),u=Mr(l.receiver);c!==a&&u!==a||(o.includes(l)||o.push(l),n.has(c)||(n.add(c),s.push(c)),n.has(u)||(n.add(u),s.push(u)))}}return o.sort((i,a)=>i.at-a.at)}function BP(t,e){let r=hb(t,e);if(r.length===0)return null;let n=r[0];return n.sender.teamfile.startsWith("prompt:")?n.receiver:n.sender}function ub(t,e){return t.teamfile===e.teamfile&&t.alias===e.alias}function Mr(t){return`${t.teamfile}\0${t.alias}`}function qP(t){return t.map(e=>`${PP(e.teamfile)}:${e.alias}`).join(" \u2192 ")}var FP,cb,_b=b(()=>{"use strict";FP=6e4,cb=8*60*60*1e3});var bb={};ce(bb,{parseIdleTimeoutMs:()=>Eb,runChat:()=>JP});async function JP(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.length===0||t[0]==="--help"||t[0]==="-h")return e.stdout.write(`${yb}
1743
1731
  `),t.length===0?2:0;let r=GP(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1744
- ${wb}
1732
+ ${yb}
1745
1733
  `),2;if(r.runFlag!==void 0){let f=Number.parseInt(r.runFlag,10);return!Number.isFinite(f)||f<=0||String(f)!==r.runFlag?(e.stderr.write(`error: invalid --run "${r.runFlag}" (expected a positive integer run id)
1746
1734
  `),2):await G(e,async m=>{let p=m.getRun(f);if(p===null)return e.stderr.write(`error: run ${f}: not found
1747
- `),1;if(p.terminal_state!==null&&p.terminal_state.length>0)return w(e,`run ${f}: already terminal (${p.terminal_state}); chat --run cannot resume a terminated run`);let h=sa(m,f);if(h===null)return e.stderr.write(`error: run ${f}: no pending operator-answerable attention (chat --run only resumes paused runs)
1735
+ `),1;if(p.terminal_state!==null&&p.terminal_state.length>0)return y(e,`run ${f}: already terminal (${p.terminal_state}); chat --run cannot resume a terminated run`);let h=sa(m,f);if(h===null)return e.stderr.write(`error: run ${f}: no pending operator-answerable attention (chat --run only resumes paused runs)
1748
1736
  `),1;if(h.kind==="workflow_escalation"){if(r.done)return e.stderr.write(`error: --done is not valid for workflow_escalation (the decision itself is terminal)
1749
1737
  `),2;let g=m.resumeEscalation(h.attention_id,r.prompt);return g.resumed===!0?(e.stdout.write(`run ${f}: escalation resumed (decision: ${r.prompt})
1750
1738
  `),0):(e.stderr.write(`error: run ${f}: resumeEscalation failed (${g.reason})
1751
- `),1)}if(h.kind==="interactive_waiting_operator"){let g=wt(m,h.attention_id);if(g===null||g.step_id===null)return e.stderr.write(`error: run ${f}: pending interactive_waiting_operator attention has no associated interactive step
1739
+ `),1)}if(h.kind==="interactive_waiting_operator"){let g=yt(m,h.attention_id);if(g===null||g.step_id===null)return e.stderr.write(`error: run ${f}: pending interactive_waiting_operator attention has no associated interactive step
1752
1740
  `),1;let _=m.resumeInteractive(g.step_id,r.prompt,r.done===!0);return _.resumed===!0?(e.stdout.write(`run ${f}: interactive resumed (step ${g.step_id}${r.done===!0?", done":""})
1753
1741
  `),0):(e.stderr.write(`error: run ${f}: resumeInteractive failed (${_.reason})
1754
1742
  `),1)}return e.stderr.write(`error: run ${f}: pending attention kind "${h.kind}" is not operator-answerable
@@ -1766,12 +1754,12 @@ ${wb}
1766
1754
  `):e.stdout.write(`${m.text}${m.text.endsWith(`
1767
1755
  `)?"":`
1768
1756
  `}`),m.status==="stalled"?1:0}catch(f){let m=f instanceof Error?f.message:String(f);return o!==null&&await $a(e,{...o,message:r.prompt,response:null,status:o.policy?.outOfPolicy===!0?"out_of_policy":"error",error_detail:o.policy?.outOfPolicy===!0?`${o.policy.reason}; provider error: ${m}`:m}),e.stderr.write(`error: ${m}
1769
- `),1}finally{i!==null&&await r1(e,i)}}function XP(t,e){return t.slice(-e)}function GP(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++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 _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=Eb(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function VP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=js(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Cr(n.teamfile),o=$s(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=_a(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function KP(t,e){return e.explicitRoot!==void 0?Cr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await G(t,r=>fb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function YP(t,e){return await G(t,r=>ab({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:zP(r,e.sender.teamfile,e.receiverTeamfile)}))}function zP(t,e,r){return{teams:[e,r].map(s=>ZP(s,t))}}function ZP(t,e){let r=$s(t,e),n=St(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function QP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-Na()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await G(t,o=>{let i=Se(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:xa(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&e1(l.current)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:xa(l.current)})),{acquired:!0,lease:c.current??s}):(i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:xa(c.current)})),{acquired:!1,current:c.current})}return i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:xa(l.current)})),{acquired:!1,current:l.current}})}function xa(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}function e1(t){return t.holder_pid===null?!0:!t1(t.holder_pid)}function t1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}async function r1(t,e){try{await G(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1770
- `)}}function n1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=yb(e.message),n=e.response===null?null:yb(e.response);try{await G(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1771
- `)}}function yb(t){return t.length<=gb?{text:t,truncated:!1}:{text:t.slice(0,gb),truncated:!0}}function Eb(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function s1(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1757
+ `),1}finally{i!==null&&await r1(e,i)}}function XP(t,e){return t.slice(-e)}function GP(t){let e=[],r="yolo",n,s,o,i,a,l=!1,c,u=!1;for(let h=0;h<t.length;h+=1){let g=t[h];if(g==="--permission-mode"){let _=t[++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 _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --idle-timeout";let T=Eb(_);if(typeof T=="string")return T;n=T;continue}if(g==="--session"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --session";s=_;continue}if(g==="--provider"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --provider";o=_;continue}if(g==="--from"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --from";i=_;continue}if(g==="--root"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --root";a=_;continue}if(g==="--force"){l=!0;continue}if(g==="--run"){let _=t[++h];if(_===void 0||_.startsWith("--"))return"missing value for --run";c=_;continue}if(g==="--done"){u=!0;continue}if(g.startsWith("--"))return`unknown flag: ${g}`;e.push(g)}if(c!==void 0)return s!==void 0?"--run is mutually exclusive with --session":o!==void 0?"--run is mutually exclusive with --provider":i!==void 0?"--run is mutually exclusive with --from":a!==void 0?"--run is mutually exclusive with --root":l?"--run is mutually exclusive with --force":e.length===0?"a prompt (answer) is required with --run":e.length>1?`--run takes exactly one positional (the answer); got ${e.length}`:{prompt:e[0],permissionMode:r,runFlag:c,done:u};let d,f,m;if(e.length===0)return"a prompt is required";if(e.length===1){if(s===void 0)return'expected <teamfile>:<alias> "<prompt>" | <teamfile> <alias> "<prompt>" | <sessionid> "<prompt>" | --session <id> "<prompt>"';m=e[0]}else if(e.length===2)d=e[0],m=e[1];else if(e.length===3)d=e[0],f=e[1],m=e[2];else return`too many positionals (${e.length}); expected at most <teamfile> <alias> <prompt>`;if(u)return"--done requires --run";let p={prompt:m,permissionMode:r};return d!==void 0&&(p.target=d),f!==void 0&&(p.alias=f),n!==void 0&&(p.idleTimeoutMs=n),s!==void 0&&(p.sessionFlag=s),o!==void 0&&(p.providerFlag=o),i!==void 0&&(p.fromFlag=i),a!==void 0&&(p.rootFlag=a),l&&(p.force=!0),p}function VP(t,e,r){if(t===void 0)return{teamfile:e,alias:"operator"};let n=js(t);if(n===null)throw new ge("--from must be <teamfile.lmctl>:<alias>");let s=Cr(n.teamfile),o=$s(s,r);if(o.parseErrors.length>0)throw new ge(`--from ${n.teamfile}: ${o.parseErrors.join("; ")}`);let i=_a(o,n.alias);if(i===void 0)throw new ge(`--from alias "${n.alias}" not found in ${n.teamfile}`);return{teamfile:s,alias:i.alias}}async function KP(t,e){return e.explicitRoot!==void 0?Cr(e.explicitRoot):e.operatorOrigin?e.receiverTeamfile:await G(t,r=>fb(r,{sender:e.sender,now:new Date})??e.receiverTeamfile)}async function YP(t,e){return await G(t,r=>ab({rootTeamfile:e.rootTeamfile,fromTeamfile:e.sender.teamfile,fromAlias:e.sender.alias,toTeamfile:e.receiverTeamfile,toAlias:e.receiverAlias,registry:zP(r,e.sender.teamfile,e.receiverTeamfile)}))}function zP(t,e,r){return{teams:[e,r].map(s=>ZP(s,t))}}function ZP(t,e){let r=$s(t,e),n=St(r);return{teamfile:t,aliases:r.members.map(s=>s.alias),leadAlias:n?.alias??null}}async function QP(t,e){let r=new Date().toISOString(),n=new Date(Date.now()-xa()).toISOString(),s={receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,started_at:r};return await G(t,o=>{let i=Se(),a=i?o.getAgentInflight(e.receiver_teamfile,e.receiver_alias):null,l=o.tryAcquireAgentInflight(s,{stale_before:n,force:e.force});if(l.acquired){if(i){let c=a===null?null:e.force?"force":a.started_at<n?"stale":null;ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:c===null?"acquired":"reclaimed",...c===null?{}:{reclaim_reason:c,holder:Na(a)}}))}return{acquired:!0,lease:l.current??s}}if(!l.acquired&&e1(l.current,n)){let c=o.tryAcquireAgentInflight(s,{stale_before:n,reclaim_observed:{sender_teamfile:l.current.sender_teamfile,sender_alias:l.current.sender_alias,started_at:l.current.started_at,holder_pid:l.current.holder_pid}});return c.acquired?(i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"reclaimed",reclaim_reason:l.current.holder_pid===null?"null-holder":"dead-pid",holder:Na(l.current)})),{acquired:!0,lease:c.current??s}):(i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Na(c.current)})),{acquired:!1,current:c.current})}return i&&ot(JSON.stringify({event:"inflight_acquire",receiver:{teamfile:e.receiver_teamfile,alias:e.receiver_alias},sender:{teamfile:e.sender_teamfile,alias:e.sender_alias},result:"rejected",holder:Na(l.current)})),{acquired:!1,current:l.current}})}function Na(t){return t===null?null:{sender_teamfile:t.sender_teamfile,sender_alias:t.sender_alias,holder_pid:t.holder_pid,started_at:t.started_at}}function e1(t,e){return t.holder_pid===null?t.started_at<e:!t1(t.holder_pid)}function t1(t){if(!Number.isInteger(t)||t<=0)return!1;try{return process.kill(t,0),!0}catch(e){return(e!==null&&typeof e=="object"&&"code"in e?e.code:void 0)!=="ESRCH"}}async function r1(t,e){try{await G(t,r=>{r.releaseAgentInflight(e)})}catch(r){t.stderr.write(`warning: failed to release chat in-flight slot: ${r instanceof Error?r.message:String(r)}
1758
+ `)}}function n1(t,e){return`${t} is servicing ${e.sender_alias} (${e.sender_teamfile}) since ${e.started_at}`}async function $a(t,e){let r=wb(e.message),n=e.response===null?null:wb(e.response);try{await G(t,s=>{s.insertTeamChatLog({root_teamfile:e.root_teamfile,sender_teamfile:e.sender_teamfile,sender_alias:e.sender_alias,receiver_teamfile:e.receiver_teamfile,receiver_alias:e.receiver_alias,message:r.text,response:n?.text??null,status:e.status,error_detail:e.error_detail,truncated:r.truncated||n?.truncated?1:0,created_at:new Date().toISOString()})})}catch(s){t.stderr.write(`warning: failed to record chat log: ${s instanceof Error?s.message:String(s)}
1759
+ `)}}function wb(t){return t.length<=gb?{text:t,truncated:!1}:{text:t.slice(0,gb),truncated:!0}}function Eb(t){if(t==="0")return 0;let e=/^(\d+)([smhd])$/.exec(t);if(e===null)return`invalid --idle-timeout "${t}" (expected <n>(s|m|h|d) or 0)`;let r=Number(e[1]),n=e[2];return r*(n==="s"?1e3:n==="m"?6e4:n==="h"?36e5:864e5)}function s1(t,e,r){r.kind==="tool_use"?t.stderr.write(`[${e}] tool_use ${r.tool??"tool"}${r.summary?`: ${r.summary}`:""}
1772
1760
  `):r.kind==="tool_result"?t.stderr.write(`[${e}] tool_result${r.status?` ${r.status}`:""}${r.summary?`: ${r.summary}`:""}
1773
1761
  `):r.kind==="api_retry"&&t.stderr.write(`[${e}] api_retry${r.summary?`: ${r.summary}`:""}
1774
- `)}var HP,gb,wb,Sb=b(()=>{"use strict";Rt();$e();vn();Ut();ss();lb();va();_b();je();oa();Ot();HP={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},gb=256*1024,wb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1762
+ `)}var HP,gb,yb,Sb=b(()=>{"use strict";Rt();$e();vn();Ut();ss();lb();va();_b();je();oa();Ot();HP={name:"chat",allowsBareTeamfile:!1,supportsRaw:!0},gb=256*1024,yb=`usage: lmctl chat <teamfile>:<alias> "<prompt>"
1775
1763
  lmctl chat <teamfile> <alias> "<prompt>"
1776
1764
  lmctl chat <sessionid> "<prompt>" --provider <name>
1777
1765
  lmctl chat --provider <name> --session <id> "<prompt>"
@@ -1784,8 +1772,8 @@ Send a prompt to a team member or raw provider session, or answer a paused run.`
1784
1772
  `}async function vb(t,e){let r=!1,n="",s=!1,o=async i=>{let a=i.trim();if(a.length===0)return;let l;try{l=JSON.parse(a)}catch(u){t.io.write(Ud({jsonrpc:"2.0",id:null,error:{code:-32700,message:`parse error: ${u instanceof Error?u.message:String(u)}`}}));return}l.method==="shutdown"&&(r=!0);let c=await h1(l,t);c.kind==="response"?t.io.write(Ud(c.message)):c.kind==="exit"&&(s=!0)};return new Promise(i=>{let a=Promise.resolve(),l=!1,c=d=>{l||(l=!0,i(d))},u=()=>{let d=n.indexOf(`
1785
1773
  `);for(;d!==-1;){let f=n.slice(0,d);n=n.slice(d+1),a=a.then(()=>o(f)).then(()=>{s&&c(0)}),d=n.indexOf(`
1786
1774
  `)}};e.setEncoding("utf8"),e.on("data",d=>{n+=d,u()}),e.on("end",()=>{n.trim().length>0&&(a=a.then(()=>o(n))),a.finally(()=>c(0))}),e.on("error",d=>{t.io.log?.(`mcp: stdin error: ${d.message}
1787
- `),a.finally(()=>c(1))})})}var f1,m1,p1,Ib=b(()=>{"use strict";Dd();Fd();f1="2025-06-18",m1="lmctl",p1="0.0.1"});var xb={};ce(xb,{runMcp:()=>g1});async function g1(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(_1),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1788
- `),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??w1(),o=1;try{let i=s===void 0?Pd({getConfig:()=>null},process.env):Pd(s,process.env);return o=await vb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function w1(){let t=ue(),e=3;for(let r=1;r<=e;r+=1)try{return pe({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&Nb(s))y1(50*r);else if(!Nb(s))break}}function Nb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function y1(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var _1,$b=b(()=>{"use strict";Pe();Fd();Ib();je();Ve();_1=`usage: lmctl mcp
1775
+ `),a.finally(()=>c(1))})})}var f1,m1,p1,Ib=b(()=>{"use strict";Dd();Fd();f1="2025-06-18",m1="lmctl",p1="0.0.1"});var Nb={};ce(Nb,{runMcp:()=>g1});async function g1(t,e={stdout:process.stdout,stderr:process.stderr},r=process.stdin){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(_1),0;if(t.length>0)return e.stderr.write(`usage: lmctl mcp
1776
+ `),2;Z({event:"mcp_bridge_start",pid:process.pid});let n=e.dal===void 0,s=e.dal??y1(),o=1;try{let i=s===void 0?Pd({getConfig:()=>null},process.env):Pd(s,process.env);return o=await vb({io:{write:l=>e.stdout.write(l),log:l=>e.stderr.write(l)},dispatch:{config:i,...s!==void 0?{dal:s}:{}}},r),o}finally{Z({event:"mcp_bridge_exit",pid:process.pid,exit_code:o}),n&&s!==void 0&&s.close()}}function y1(){let t=ue(),e=3;for(let r=1;r<=e;r+=1)try{return pe({path:t})}catch(n){let s=n instanceof Error?n.message:String(n);if(Z({event:"mcp_bridge_db_open_failed",pid:process.pid,attempt:r,db_path:t,error_message:s}),r<e&&xb(s))w1(50*r);else if(!xb(s))break}}function xb(t){return/SQLITE_BUSY|database is locked|database is busy/i.test(t)}function w1(t){let e=new Int32Array(new SharedArrayBuffer(4));Atomics.wait(e,0,0,t)}var _1,$b=b(()=>{"use strict";Pe();Fd();Ib();je();Ve();_1=`usage: lmctl mcp
1789
1777
 
1790
1778
  Start the stdio MCP bridge. The bridge resolves api.url and api.token from
1791
1779
  local config, then uses stdin/stdout for JSON-RPC frames.
@@ -1833,15 +1821,15 @@ local config, then uses stdin/stdout for JSON-RPC frames.
1833
1821
  WHERE status IN ('open', 'reopened')
1834
1822
  AND created_at <= ?
1835
1823
  GROUP BY project_id
1836
- `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Rs(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${N1(i.oldest_title,40)})`;o.push(ja(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function ja(t,e){let r=v1(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function v1(t,e,r,n){let s=I1(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1824
+ `).all(n,n),o=[];for(let i of s){let a={kind:"issues_overdue",project_id:i.project_id},l=Rs(a),c={dedupe_key:l,count:i.count,oldest_title:i.oldest_title,oldest_at:i.oldest_at,project_id:i.project_id,threshold_days:e.old_issue_days},u=`${i.count} issue(s) overdue in project ${i.project_id} (oldest: ${x1(i.oldest_title,40)})`;o.push(ja(t,{kind:"issues_overdue",severity:"warning",project_id:i.project_id,run_id:null,payload:c,dedupe_key:l,summary:u,config:e,now:r}))}return o}function ja(t,e){let r=v1(t,e.dedupe_key,e.now,e.config.dedupe_window_hours);if(r!==null)return{kind:e.kind,emitted:!1,dedupe_key:e.dedupe_key,attention_id:r.id,summary:e.summary};let n=t.raiseAttention({kind:e.kind,severity:e.severity,project_id:e.project_id,run_id:e.run_id,payload:JSON.stringify(e.payload)});return{kind:e.kind,emitted:!0,dedupe_key:e.dedupe_key,attention_id:n.id,summary:e.summary}}function v1(t,e,r,n){let s=I1(r,n).toISOString(),o=`%"dedupe_key":"${e}"%`;return t.db.prepare(`
1837
1825
  SELECT * FROM attention
1838
1826
  WHERE acknowledged_at IS NULL
1839
1827
  AND created_at >= ?
1840
1828
  AND payload LIKE ?
1841
1829
  ORDER BY id DESC
1842
1830
  LIMIT 1
1843
- `).get(s,o)??null}function Rb(t,e){return new Date(t.getTime()-e*60*1e3)}function I1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Ob(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function N1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Os,Lb=b(()=>{"use strict";jb();Os={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Mb={};ce(Mb,{renderSummary:()=>Cb,runMonitor:()=>$1});async function $1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(x1),0;let r=F(t,[],["--json","--quiet"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await G(e,o=>{let i=Ab(o);return n?q(e,i):s||e.stdout.write(`${Cb(i.findings)}
1844
- `),0})}catch(o){return me(e,o)}}function Cb(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${j1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function j1(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var x1,Db=b(()=>{"use strict";$e();Lb();x1=`usage: lmctl monitor [--json] [--quiet]
1831
+ `).get(s,o)??null}function Rb(t,e){return new Date(t.getTime()-e*60*1e3)}function I1(t,e){return new Date(t.getTime()-e*60*60*1e3)}function Ob(t,e){return new Date(t.getTime()-e*24*60*60*1e3)}function x1(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}var Os,Lb=b(()=>{"use strict";jb();Os={stale_run_minutes:30,old_attention_days:7,old_issue_days:14,stuck_job_minutes:60,dedupe_window_hours:24}});var Mb={};ce(Mb,{renderSummary:()=>Cb,runMonitor:()=>$1});async function $1(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(N1),0;let r=F(t,[],["--json","--quiet"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--json"),s=M(r,"--quiet");try{return await G(e,o=>{let i=Ab(o);return n?q(e,i):s||e.stdout.write(`${Cb(i.findings)}
1832
+ `),0})}catch(o){return me(e,o)}}function Cb(t){let e=t.filter(o=>o.emitted);if(e.length===0)return"monitor: 0 findings";let r=new Map;for(let o of e)r.set(o.kind,(r.get(o.kind)??0)+1);let n=[],s=["run_stale","stuck_job","attentions_overdue","issues_overdue"];for(let o of s){let i=r.get(o);i===void 0||i===0||n.push(`${i} ${j1(o,i)}`)}return`monitor: ${e.length} findings (${n.join(", ")})`}function j1(t,e){switch(t){case"run_stale":return e===1?"stale run":"stale runs";case"stuck_job":return e===1?"stuck job":"stuck jobs";case"attentions_overdue":return"attentions overdue";case"issues_overdue":return"issues overdue"}}var N1,Db=b(()=>{"use strict";$e();Lb();N1=`usage: lmctl monitor [--json] [--quiet]
1845
1833
 
1846
1834
  Scan the DB for stale runs, stuck jobs, overdue attentions, and overdue
1847
1835
  issues; emit findings as attentions for the operator/master to handle.
@@ -1850,17 +1838,17 @@ issues; emit findings as attentions for the operator/master to handle.
1850
1838
  `),1):(e.stdout.write(`${n.device_id}
1851
1839
  `),0)}return r==="login"?await B1(t.slice(1),e):r==="prompt"?await H1(t.slice(1),e):(e.stderr.write(`usage: lmctl device <id|init|login|prompt>
1852
1840
  `),1)}async function B1(t,e){let r=q1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1853
- ${Wd}`),2;let n=Ns();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1841
+ ${Wd}`),2;let n=xs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1854
1842
  `),1;uE({userId:r.userId,refreshToken:r.accessKey});let s,o,i;try{let c=await pa({region:n.config.region,clientId:n.config.cognitoClientId??ba,refreshToken:r.accessKey});s=c.idToken,o=c.accessToken,i=c.expiresAt}catch(c){let u=c instanceof Error?c.message:String(c);return e.stderr.write(`error: could not authenticate access key: ${u}
1855
1843
  `),1}let a=ks(s);if(a!==null&&a!==r.userId)return e.stderr.write(`error: access key belongs to user-id ${a}, not ${r.userId}
1856
- `),1;wd({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Lr()??Od();return e.stdout.write(`logged in as ${r.userId}
1844
+ `),1;yd({idToken:s,...o!==void 0?{accessToken:o}:{},refreshToken:r.accessKey,...i!==void 0?{expiresAt:i}:{}});let l=Lr()??Od();return e.stdout.write(`logged in as ${r.userId}
1857
1845
  device id: ${l.device_id}
1858
1846
  mailbox prefix: ${r.userId}/${l.device_id}/
1859
1847
  access key stored at ${vs()}
1860
1848
  `),0}function q1(t){let e,r;for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--user-id"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --user-id";e=o;continue}if(s==="--access-key"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --access-key";r=o;continue}return`unknown argument: ${s}`}return e===void 0?"missing --user-id <sub>":r===void 0?"missing --access-key <refreshToken>":{userId:e,accessKey:r}}async function H1(t,e){let r=J1(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
1861
- ${Wd}`),2;let n=Ns();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1862
- `),1;let s=G1();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await X1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=M1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Lr()?.device_id,u=ks(o)??void 0,d=new Or({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new U1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:P1,GetObjectCommand:D1,PutObjectCommand:F1},selfRole:"browser",onMessage:async()=>{}}),f=Qy({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Zy,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1863
- `),0}function J1(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function X1(t){let r=await new L1({region:t.region}).send(new C1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function G1(t=process.env.LMCTL_TOKEN_PATH??O1(R1(),".lmctl","cli-tokens.json")){try{return JSON.parse(A1(t,"utf8"))}catch{return null}}var Wd,Fb=b(()=>{"use strict";Ld();xd();Zi();pd();hd();yd();_d();Wd=`usage: lmctl device <id|init>
1849
+ ${Wd}`),2;let n=xs();if(n.config===void 0)return e.stderr.write(`error: mailbox is not configured; missing ${n.missing.join(", ")}
1850
+ `),1;let s=G1();if(s===null)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let o=s.cognito?.idToken;if(typeof o!="string"||o.length===0)return e.stderr.write("error: no Cognito id token found; run `webcli login` or `lmctl device login` first\n"),1;let i=`cognito-idp.${n.config.region}.amazonaws.com/${n.config.cognitoUserPoolId}`,a=typeof s.cognito?.identityId=="string"&&s.cognito.identityId.length>0?s.cognito.identityId:await X1({region:n.config.region,identityPoolId:n.config.identityPoolId,idpProvider:i,idToken:o}),l=M1({identityId:a,logins:{[i]:o},clientConfig:{region:n.config.region}}),c=n.config.deviceId??Lr()?.device_id,u=ks(o)??void 0,d=new Or({bucket:n.config.mailboxBucket,identityId:a,...u!==void 0?{userId:u}:{},...c!==void 0?{deviceId:c}:{},...n.config.mailboxKey!==void 0?{mailboxKey:n.config.mailboxKey}:{},s3:new U1({region:n.config.region,credentials:l}),commands:{ListObjectsV2Command:P1,GetObjectCommand:D1,PutObjectCommand:F1},selfRole:"browser",onMessage:async()=>{}}),f=Qw({root_teamfile:r.root,text:r.text,...r.promptId!==void 0?{prompt_id:r.promptId}:{}}),m=await d.putMessage({conversation_id:Zw,payload:f});return e.stdout.write(JSON.stringify({prompt_id:f.prompt_id,mailbox_key:d.getMailboxBasePrefix(),object_key:m},null,2)+`
1851
+ `),0}function J1(t){let e,r,n;for(let s=0;s<t.length;s+=1){let o=t[s];if(o==="--root"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --root";e=i;continue}if(o==="--text"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --text";r=i;continue}if(o==="--prompt-id"){let i=t[++s];if(i===void 0||i.startsWith("--"))return"missing value for --prompt-id";n=i;continue}return`unknown argument: ${o}`}return e===void 0?"missing --root <teamfile>":r===void 0?"missing --text <prompt>":{root:e,text:r,...n!==void 0?{promptId:n}:{}}}async function X1(t){let r=await new L1({region:t.region}).send(new C1({IdentityPoolId:t.identityPoolId,Logins:{[t.idpProvider]:t.idToken}}));if(r.IdentityId===void 0||r.IdentityId.length===0)throw new Error("Cognito GetId returned no IdentityId");return r.IdentityId}function G1(t=process.env.LMCTL_TOKEN_PATH??O1(R1(),".lmctl","cli-tokens.json")){try{return JSON.parse(A1(t,"utf8"))}catch{return null}}var Wd,Fb=b(()=>{"use strict";Ld();Nd();Zi();pd();hd();wd();_d();Wd=`usage: lmctl device <id|init>
1864
1852
  lmctl device login --user-id <sub> --access-key <refreshToken>
1865
1853
  lmctl device prompt --root <teamfile> --text <prompt> [--prompt-id <id>]
1866
1854
 
@@ -1870,21 +1858,21 @@ addressing. The id is stored in ~/.lmctl/device.json by default.
1870
1858
  'lmctl device login' authenticates this machine's 'lmctl serve' daemon to the
1871
1859
  cloud mailbox using your user-id (Cognito sub) and an access key (refresh
1872
1860
  token). The access key is stored in ~/.lmctl/device-auth.json (chmod 600).
1873
- `});var Wb={};ce(Wb,{runTeam:()=>Y1});import{join as V1}from"node:path";async function Y1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(K1),0;try{return await G(e,async s=>{switch(r){case"create":return Z1(n,e,s);case"list":return Q1(n,e,s);case"show":return eF(n,e,s);case"add-member":return tF(n,e,s);case"seed":return Ub(n,e,s,!1);case"refresh":return Ub(n,e,s,!0);case"companion":return nF(n,e,s);case"list-roots":return z1(n,e,s);default:return w(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function z1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);if(n.positionals.length>0)return w(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?q(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1861
+ `});var Wb={};ce(Wb,{runTeam:()=>Y1});import{join as V1}from"node:path";async function Y1(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(K1),0;try{return await G(e,async s=>{switch(r){case"create":return Z1(n,e,s);case"list":return Q1(n,e,s);case"show":return eF(n,e,s);case"add-member":return tF(n,e,s);case"seed":return Ub(n,e,s,!1);case"refresh":return Ub(n,e,s,!0);case"companion":return nF(n,e,s);case"list-roots":return z1(n,e,s);default:return y(e,"usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>")}})}catch(s){return me(e,s)}}function z1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);if(n.positionals.length>0)return y(e,"usage: team list-roots [--json]");let s=r.listRootTeams();return M(n,"--json")?q(e,s):e.stdout.write(s.map(o=>`${o.name??"(unnamed)"} ${o.teamfile_path} ${o.last_seeded_at??""}`).join(`
1874
1862
  `)+(s.length>0?`
1875
- `:"")),0}function Z1(t,e,r){let[n]=t;if(n===void 0)return w(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
1876
- `),0}function Q1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listTeams();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
1863
+ `:"")),0}function Z1(t,e,r){let[n]=t;if(n===void 0)return y(e,"usage: team create <name>");let s=r.insertTeam({name:n});return e.stdout.write(`created team ${s.name}
1864
+ `),0}function Q1(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listTeams();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name}`).join(`
1877
1865
  `)}${s.length>0?`
1878
- `:""}`),0}function eF(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))q(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1866
+ `:""}`),0}function eF(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team show <name> [--json]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=r.listTeamMembers(o.id);if(M(n,"--json"))q(e,{team:o,members:i});else{e.stdout.write(`team ${o.name}
1879
1867
  `);for(let a of i)e.stdout.write(`- ${a.alias} ${Ie(a)} ${a.sessionid??"(unseeded)"}
1880
- `)}return 0}function tF(t,e,r){let n=F(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--alias"),a=x(n,"--provider");if(i===void 0||a===void 0)return w(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:x(n,"--model")??null,role:x(n,"--role")??"agent",sessiondir:x(n,"--sessiondir")??V1(pr(),"sessions",o.name,i)});return M(n,"--json")?q(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1881
- `),0}async function Ub(t,e,r,n){let s=F(t,["--alias"]);if(s.error!==void 0)return w(e,s.error);let[o]=s.positionals;if(o===void 0)return w(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return w(e,`team not found: ${o}`);let a=x(s,"--alias");if(n&&a===void 0)return w(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=rF(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return w(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return w(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Qg(f.workflow_name,m.definition);if(p.status==="FAIL")return w(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Go(f,r),Ko(f);let u=[],d=!1;for(let f of l){let m=await Kr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1868
+ `)}return 0}function tF(t,e,r){let n=F(t,["--alias","--provider","--model","--role","--sessiondir"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team add-member <team-name> --alias A --provider P [--model M] [--role R] [--sessiondir D]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=N(n,"--alias"),a=N(n,"--provider");if(i===void 0||a===void 0)return y(e,"team add-member requires --alias and --provider");let l=r.insertTeamMember({team_id:o.id,alias:i,provider:a,model:N(n,"--model")??null,role:N(n,"--role")??"agent",sessiondir:N(n,"--sessiondir")??V1(pr(),"sessions",o.name,i)});return M(n,"--json")?q(e,l):e.stdout.write(`added member ${l.alias} to ${o.name}
1869
+ `),0}async function Ub(t,e,r,n){let s=F(t,["--alias"]);if(s.error!==void 0)return y(e,s.error);let[o]=s.positionals;if(o===void 0)return y(e,n?"usage: team refresh <team-name> --alias A":"usage: team seed <team-name> [--alias A]");let i=r.findTeamByName(o);if(i===null)return y(e,`team not found: ${o}`);let a=N(s,"--alias");if(n&&a===void 0)return y(e,"team refresh requires --alias");if(n&&a!==void 0&&a.trim().toLowerCase()==="lead")return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let l=rF(r.listTeamMembers(i.id),a,n);if(a!==void 0&&l.length===0)return y(e,`member not found or already seeded: ${a}`);if(n&&l.some(f=>f.alias.toLowerCase()==="lead"||f.role==="lead"))return y(e,"cannot refresh Lead \u2014 refresh is only for non-Lead members");let c=new Set;for(let f of r.listProjects().filter(m=>m.team_id===i.id)){if(c.has(f.workflow_name))continue;c.add(f.workflow_name);let m=r.getWorkflowByName(f.workflow_name);if(m===null)continue;let p=Qg(f.workflow_name,m.definition);if(p.status==="FAIL")return y(e,`cannot seed team \`${i.name}\`: workflow \`${f.workflow_name}\` failed verify-at-seed \u2014 ${p.note}. Fix the workflow and retry; NO members were seeded (no side-effects).`)}for(let f of r.listProjects().filter(m=>m.team_id===i.id))Go(f,r),Ko(f);let u=[],d=!1;for(let f of l){let m=await Kr({member:f,dal:r}),p=r.updateTeamMemberSession(f.id,m.sessionid);if(p!==null){let h=p.role_prompt??"",g=h.length>0?`${h}
1882
1870
 
1883
1871
  ${Qr}`:Qr;r.setMemberPromptSnapshot(f.id,g),u.push(p);let _=en(Ie(p),m.sessionid);_!==null&&e.stderr.write(`[seeded ${p.alias}] customize/compact in its native TUI:
1884
1872
  ${_}
1885
1873
  `);try{await ui({dal:r,member:p,stderr:e.stderr})}catch(T){d=!0,e.stderr.write(`error: ${T instanceof Error?T.message:String(T)}
1886
1874
  `)}}}return M(s,"--json")?q(e,u):e.stdout.write(`seeded ${u.length} member(s)
1887
- `),d?1:0}function rF(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function nF(t,e,r){let n=F(t,["--interpreter","--of"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return w(e,`team not found: ${s}`);let i=x(n,"--interpreter"),a=x(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return w(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return w(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return w(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1875
+ `),d?1:0}function rF(t,e,r){return t.filter(n=>e!==void 0&&n.alias!==e?!1:r||n.sessionid===null)}function nF(t,e,r){let n=F(t,["--interpreter","--of"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: team companion <team-name> --interpreter A --of B[,C]");let o=r.findTeamByName(s);if(o===null)return y(e,`team not found: ${s}`);let i=N(n,"--interpreter"),a=N(n,"--of")?.split(",").map(c=>c.trim()).filter(Boolean);if(i===void 0||a===void 0||a.length===0)return y(e,"team companion requires --interpreter and --of");let l=r.findTeamMemberByAlias(o.id,i);if(l===null)return y(e,`member not found: ${i}`);for(let c of a){let u=r.findTeamMemberByAlias(o.id,c);if(u===null)return y(e,`member not found: ${c}`);r.insertTeamMemberCompanion({interpreter_id:l.id,companion_id:u.id})}return e.stdout.write(`recorded ${a.length} companion link(s)
1888
1876
  `),0}var K1,Bb=b(()=>{"use strict";Ve();$o();Qn();Ec();Pe();tn();Pc();Bi();$e();bc();K1=`usage: lmctl team <create|list|show|add-member|seed|refresh|companion|list-roots>
1889
1877
 
1890
1878
  Manage DB-backed teams, members, and provider session lifecycle. Use seed or
@@ -1892,27 +1880,28 @@ refresh to create/update native provider sessions for team members.
1892
1880
 
1893
1881
  Root team registry:
1894
1882
  list-roots [--json] List .lmctl root teams registered by lmctl seed.
1895
- `});var Kb={};ce(Kb,{applyMaxBytes:()=>Aa,renderMessage:()=>Gb,runTail:()=>cF});async function cF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${lF}
1896
- `),0;let r=F(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--lines"),s=n===void 0?oF:Number.parseInt(n,10);if(!Number.isFinite(s)||s<1)return w(e,`invalid --lines "${n}" (expected a positive integer)`);let o=x(r,"--max-bytes"),i=o===void 0?iF:Number.parseInt(o,10);if(!Number.isFinite(i)||i<0||o!==void 0&&String(i)!==o)return w(e,`invalid --max-bytes "${o}" (expected a non-negative integer)`);let a=M(r,"--watch"),l=x(r,"--watch-interval"),c=l===void 0?aF:Number.parseInt(l.replace(/s$/,""),10);if(!Number.isFinite(c)||c<1)return w(e,`invalid --watch-interval "${l}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let u=x(r,"--run");if(u!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--session")!==void 0)return w(e,"--run is mutually exclusive with --session");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let p=Number.parseInt(u,10);if(!Number.isFinite(p)||p<=0||String(p)!==u)return w(e,`invalid --run "${u}" (expected a positive integer run id)`);try{return await G(e,async h=>uF(e,h,p,s,i,a,c))}catch(h){return me(e,h)}}let d=ur(sF,{target:r.positionals[0],alias:r.positionals[1],flags:{session:x(r,"--session"),provider:x(r,"--provider")}});if(d.mode==="error")return w(e,d.message);if(d.mode==="managed")return w(e,"tail managed mode requires --run <id>");let f;if(d.mode==="ai-team")if(d.alias===void 0){let p;try{p=Re(d.teamfile)}catch(g){return w(e,`tail: ${g instanceof Error?g.message:String(g)}`)}let h=St(p);if(h===void 0)return w(e,`tail: ${d.teamfile} has no Lead member; pass <tf>:<alias>`);try{let g=Wt(d.teamfile,h.alias);f={provider:g.provider,sessionId:g.sessionid,cwd:g.sessiondir}}catch(g){return g instanceof ge?w(e,g.message):me(e,g)}}else try{let p=Wt(d.teamfile,d.alias);f={provider:p.provider,sessionId:p.sessionid,cwd:p.sessiondir}}catch(p){return p instanceof ge?w(e,p.message):me(e,p)}else{let p=d.sessionid,h=d.provider;if(h===void 0){let g=await zo(p);if(g.length===0)return w(e,`tail: session "${p}" not found in any provider store`);if(g.length>1)return w(e,`tail: session "${p}" matches multiple providers (${g.join(", ")}); pass --provider`);h=g[0]}f={provider:h,sessionId:p}}let m=await qb(e,f.provider,f.sessionId,s,i,-1);return m<0?1:a?await new Promise(p=>{let h=async()=>{try{let T=await qb(e,f.provider,f.sessionId,s,i,m);T>=0&&(m=T)}catch(T){e.stderr.write(`tail: ${T instanceof Error?T.message:String(T)}
1897
- `)}},g=setInterval(()=>{h()},c*1e3),_=()=>{clearInterval(g),p(0)};process.once("SIGINT",_),process.once("SIGTERM",_)}):0}async function qb(t,e,r,n,s,o){let i;try{i=await xr(r,e)}catch(u){return t.stderr.write(`tail: failed to load session: ${u instanceof Error?u.message:String(u)}
1898
- `),-1}if(i===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1899
- `),-1;let a=i.messages??[],l=o<0?Math.max(0,a.length-n):o+1;if(l>=a.length)return a.length-1;let c="";for(let u=l;u<a.length;u+=1)c+=`${Gb(a[u])}
1900
- `;return t.stdout.write(Aa(c,s)),a.length-1}function Gb(t){let e=Vb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1883
+ `});var Kb={};ce(Kb,{applyMaxBytes:()=>Aa,renderMessage:()=>Gb,runTail:()=>lF});async function lF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${aF}
1884
+ `),0;let r=F(t,["--lines","--max-bytes","--watch-interval","--provider","--session","--run"],["--watch","--help"]);if(r.error!==void 0)return y(e,r.error);let n=N(r,"--lines"),s=N(r,"--max-bytes");if(n!==void 0&&s!==void 0)return y(e,"--lines and --max-bytes are mutually exclusive (choose one)");let o;if(n!==void 0){let m=Number.parseInt(n,10);if(!Number.isFinite(m)||m<1||String(m)!==n)return y(e,`invalid --lines "${n}" (expected a positive integer)`);o={kind:"lines",lines:m}}else{let m=s===void 0?oF:Number.parseInt(s,10);if(!Number.isFinite(m)||m<0||s!==void 0&&String(m)!==s)return y(e,`invalid --max-bytes "${s}" (expected a non-negative integer)`);o={kind:"bytes",maxBytes:m}}let i=M(r,"--watch"),a=N(r,"--watch-interval"),l=a===void 0?iF:Number.parseInt(a.replace(/s$/,""),10);if(!Number.isFinite(l)||l<1)return y(e,`invalid --watch-interval "${a}" (expected <N>s, N\u22651)`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let c=N(r,"--run");if(c!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--session")!==void 0)return y(e,"--run is mutually exclusive with --session");if(N(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let m=Number.parseInt(c,10);if(!Number.isFinite(m)||m<=0||String(m)!==c)return y(e,`invalid --run "${c}" (expected a positive integer run id)`);try{return await G(e,async p=>cF(e,p,m,o,i,l))}catch(p){return me(e,p)}}let u=ur(sF,{target:r.positionals[0],alias:r.positionals[1],flags:{session:N(r,"--session"),provider:N(r,"--provider")}});if(u.mode==="error")return y(e,u.message);if(u.mode==="managed")return y(e,"tail managed mode requires --run <id>");let d;if(u.mode==="ai-team")if(u.alias===void 0){let m;try{m=Re(u.teamfile)}catch(h){return y(e,`tail: ${h instanceof Error?h.message:String(h)}`)}let p=St(m);if(p===void 0)return y(e,`tail: ${u.teamfile} has no Lead member; pass <tf>:<alias>`);try{let h=Wt(u.teamfile,p.alias);d={provider:h.provider,sessionId:h.sessionid,cwd:h.sessiondir}}catch(h){return h instanceof ge?y(e,h.message):me(e,h)}}else try{let m=Wt(u.teamfile,u.alias);d={provider:m.provider,sessionId:m.sessionid,cwd:m.sessiondir}}catch(m){return m instanceof ge?y(e,m.message):me(e,m)}else{let m=u.sessionid,p=u.provider;if(p===void 0){let h=await zo(m);if(h.length===0)return y(e,`tail: session "${m}" not found in any provider store`);if(h.length>1)return y(e,`tail: session "${m}" matches multiple providers (${h.join(", ")}); pass --provider`);p=h[0]}d={provider:p,sessionId:m}}let f=await qb(e,d.provider,d.sessionId,o,-1);return f<0?1:i?await new Promise(m=>{let p=async()=>{try{let _=await qb(e,d.provider,d.sessionId,o,f);_>=0&&(f=_)}catch(_){e.stderr.write(`tail: ${_ instanceof Error?_.message:String(_)}
1885
+ `)}},h=setInterval(()=>{p()},l*1e3),g=()=>{clearInterval(h),m(0)};process.once("SIGINT",g),process.once("SIGTERM",g)}):0}async function qb(t,e,r,n,s){let o;try{o=await Nr(r,e)}catch(c){return t.stderr.write(`tail: failed to load session: ${c instanceof Error?c.message:String(c)}
1886
+ `),-1}if(o===null)return t.stderr.write(`tail: session not found: ${r} (provider=${e})
1887
+ `),-1;let i=o.messages??[],a=s<0&&n.kind==="lines"?Math.max(0,i.length-n.lines):s+1;if(a>=i.length)return i.length-1;let l="";for(let c=a;c<i.length;c+=1)l+=`${Gb(i[c])}
1888
+ `;return t.stdout.write(n.kind==="bytes"?Aa(l,n.maxBytes):l),i.length-1}function Gb(t){let e=Vb(t.timestamp),r=e?`${e} ${t.role}`:t.role,s=(t.content??"").replace(/\r\n/g,`
1901
1889
  `).replace(/\r/g,`
1902
1890
  `).split(`
1903
1891
  `),o=s[0]??"",i=s.slice(1);return i.length===0?`${r}: ${o}`:`${r}: ${o}
1904
1892
  ${i.map(a=>` ${a}`).join(`
1905
- `)}`}async function uF(t,e,r,n,s,o,i){if(e.getRun(r)===null)return w(t,`tail: run ${r}: not found`);let l=e.listSessionEvents(r),c=l.slice(Math.max(0,l.length-n));t.stdout.write(Aa(c.map(d=>`${Xb(d)}
1906
- `).join(""),s));let u=l.length>0?l[l.length-1].id:0;return o?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${Xb(_)}
1907
- `,u=_.id;g.length>0&&t.stdout.write(Aa(g,s))}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
1908
- `)}},i*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Aa(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Hb,"utf8");if(n>=e)return Jb(t,e);let s=e-n,o=Jb(t,s);return`${Hb}${o}`}function Jb(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function Xb(t){let e=Vb(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function Vb(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var sF,oF,iF,aF,lF,Hb,Yb=b(()=>{"use strict";tn();$e();vn();Ut();sF={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},oF=20,iF=4096,aF=2,lF=`usage: lmctl tail [target] [alias]
1893
+ `)}`}async function cF(t,e,r,n,s,o){if(e.getRun(r)===null)return y(t,`tail: run ${r}: not found`);let a=e.listSessionEvents(r),c=(n.kind==="lines"?a.slice(Math.max(0,a.length-n.lines)):a).map(d=>`${Xb(d)}
1894
+ `).join("");t.stdout.write(n.kind==="bytes"?Aa(c,n.maxBytes):c);let u=a.length>0?a[a.length-1].id:0;return s?await new Promise(d=>{let m=setInterval(()=>{try{let h=e.listSessionEvents(r,u),g="";for(let _ of h)g+=`${Xb(_)}
1895
+ `,u=_.id;g.length>0&&t.stdout.write(n.kind==="bytes"?Aa(g,n.maxBytes):g)}catch(h){t.stderr.write(`tail: ${h instanceof Error?h.message:String(h)}
1896
+ `)}},o*1e3),p=()=>{clearInterval(m),d(0)};process.once("SIGINT",p),process.once("SIGTERM",p)}):0}function Aa(t,e){if(e===0||Buffer.byteLength(t,"utf8")<=e)return t;let n=Buffer.byteLength(Hb,"utf8");if(n>=e)return Jb(t,e);let s=e-n,o=Jb(t,s);return`${Hb}${o}`}function Jb(t,e){if(e<=0)return"";let r=Buffer.from(t,"utf8"),n=Math.max(0,r.length-e);for(;n<r.length&&(r[n]&192)===128;)n+=1;return r.subarray(n).toString("utf8")}function Xb(t){let e=Vb(new Date(t.timestamp_ms))??"",r="";try{let o=JSON.parse(t.payload);typeof o.alias=="string"&&(r=`alias=${o.alias}`),typeof o.provider=="string"&&(r+=`${r?" ":""}provider=${o.provider}`),typeof o.tool=="string"&&(r+=`${r?" ":""}tool=${o.tool}`),typeof o.status=="string"&&(r+=`${r?" ":""}status=${o.status}`),(typeof o.tokens_in=="number"||typeof o.tokens_out=="number")&&(r+=`${r?" ":""}tokens=${o.tokens_in??0}/${o.tokens_out??0}`)}catch{}let n=r!==""?r:t.payload.slice(0,200),s=t.step_id===null?"":` step=${t.step_id}`;return`${e} ${t.kind}${s}: ${n}`}function Vb(t){if(t===void 0)return;let e=t instanceof Date?t:new Date(t);if(Number.isNaN(e.getTime()))return;let r=n=>String(n).padStart(2,"0");return`${e.getFullYear()}-${r(e.getMonth()+1)}-${r(e.getDate())} ${r(e.getHours())}:${r(e.getMinutes())}:${r(e.getSeconds())}`}var sF,oF,iF,aF,Hb,Yb=b(()=>{"use strict";tn();$e();vn();Ut();sF={name:"tail",allowsBareTeamfile:!0,supportsRaw:!0},oF=4096,iF=2,aF=`usage: lmctl tail [target] [alias]
1909
1897
  lmctl tail --session <id> [--provider <name>]
1910
- lmctl tail --run <id> [--watch] [--watch-interval Ns]
1911
- [--lines N] [--max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
1898
+ lmctl tail --run <id>
1899
+ [--lines N | --max-bytes N] [--watch] [--watch-interval Ns] [--provider <name>]
1912
1900
 
1913
- Print or watch provider session messages, or follow a managed run timeline.`;Hb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
1914
- `});var zb={};ce(zb,{runInfo:()=>pF});function mF(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function pF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${fF}
1915
- `),0;let r=F(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=x(r,"--run");if(s!==void 0){if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional [target] [alias]");if(x(r,"--provider")!==void 0)return w(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return w(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await G(e,async u=>_F(e,u,c,n))}catch(u){return me(e,u)}}let o=ur(dF,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:x(r,"--provider")}});if(o.mode==="error")return w(e,o.message);if(o.mode==="managed")return w(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return gF(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Wt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?w(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await zo(a);if(c.length===0)return w(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return w(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return hF(e,i,a,l,n)}async function hF(t,e,r,n,s){let o;try{o=await xr(r,e)}catch(a){return w(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return w(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(q(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1901
+ Print or watch provider session messages, or follow a managed run timeline.
1902
+ --lines and --max-bytes are mutually exclusive. Default: --max-bytes 4096.`;Hb=`\u2026 [truncated older output \u2014 raise with --max-bytes]
1903
+ `});var zb={};ce(zb,{runInfo:()=>mF});function fF(t){return t>=1e6?`${(t/1e6).toFixed(1)}M`:t>=1e3?`${Math.round(t/1e3)}K`:String(t)}async function mF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${dF}
1904
+ `),0;let r=F(t,["--provider","--run"],["--json","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected [target] [alias]`);let n=M(r,"--json"),s=N(r,"--run");if(s!==void 0){if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional [target] [alias]");if(N(r,"--provider")!==void 0)return y(e,"--run is mutually exclusive with --provider");let c=Number.parseInt(s,10);if(!Number.isFinite(c)||c<=0||String(c)!==s)return y(e,`invalid --run "${s}" (expected a positive integer run id)`);try{return await G(e,async u=>hF(e,u,c,n))}catch(u){return me(e,u)}}let o=ur(uF,{target:r.positionals[0],alias:r.positionals[1],flags:{provider:N(r,"--provider")}});if(o.mode==="error")return y(e,o.message);if(o.mode==="managed")return y(e,"health managed mode requires --run <id>");if(o.mode==="ai-team"&&o.alias===void 0)return _F(e,o.teamfile,n);let i,a,l;if(o.mode==="ai-team")try{let c=Wt(o.teamfile,o.alias);i=c.provider,a=c.sessionid,l=c.alias}catch(c){return c instanceof ge?y(e,c.message):me(e,c)}else if(a=o.sessionid,o.provider!==void 0)i=o.provider;else{let c=await zo(a);if(c.length===0)return y(e,`health: session "${a}" not found in any provider store`);if(c.length>1)return y(e,`health: session "${a}" matches multiple providers (${c.join(", ")}); pass --provider`);i=c[0]}return pF(e,i,a,l,n)}async function pF(t,e,r,n,s){let o;try{o=await Nr(r,e)}catch(a){return y(t,`health: failed to load session: ${a instanceof Error?a.message:String(a)}`)}if(o===null)return y(t,`health: session not found: ${r} (provider=${e})`);let i={provider:o.provider,sessionId:o.sessionId,cwd:o.cwd,messageCount:o.messageCount??null,...o.model!==void 0?{model:o.model}:{},...n!==void 0?{alias:n}:{},totalInputTokens:o.totalInputTokens??null,totalOutputTokens:o.totalOutputTokens??null,...o.totalCachedInputTokens!==void 0?{totalCachedInputTokens:o.totalCachedInputTokens}:{},createdAt:o.createdAt.toISOString(),modifiedAt:o.modifiedAt.toISOString()};return s?(q(t,i),0):(t.stdout.write(`Session: ${o.sessionId}
1916
1905
  `),t.stdout.write(` Provider: ${o.provider}
1917
1906
  `),n!==void 0&&t.stdout.write(` Alias: ${n}
1918
1907
  `),t.stdout.write(` CWD: ${o.cwd}
@@ -1921,7 +1910,7 @@ Print or watch provider session messages, or follow a managed run timeline.`;Hb=
1921
1910
  `),o.totalInputTokens===void 0||o.totalOutputTokens===void 0?t.stdout.write(" Tokens: unknown"):t.stdout.write(` Tokens: ${o.totalInputTokens} in / ${o.totalOutputTokens} out`),i.totalCachedInputTokens!==void 0&&t.stdout.write(` (cached: ${i.totalCachedInputTokens})`),t.stdout.write(`
1922
1911
  `),t.stdout.write(` Created: ${i.createdAt}
1923
1912
  `),t.stdout.write(` Modified: ${i.modifiedAt}
1924
- `),0)}async function _F(t,e,r,n){let s=vr(e,r);if(s===null)return w(t,`health: run ${r}: not found`);let o=zr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(q(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1913
+ `),0)}async function hF(t,e,r,n){let s=vr(e,r);if(s===null)return y(t,`health: run ${r}: not found`);let o=zr(e,r),i=e.agentCallTokenTotals(r),a=new Map;for(let l of s.steps){let c=l.outcome===null?`${l.state_name}:pending`:`${l.state_name}:${l.outcome}`;a.set(c,(a.get(c)??0)+1)}return n?(q(t,{run_id:s.id,workflow:s.workflow?.name??null,team:s.team?.name??null,current_state:s.current_state,terminal_state:s.terminal_state,paused:o?.paused??!1,started_at:s.started_at,ended_at:s.ended_at,step_count:s.steps.length,totalInputTokens:i.totalInputTokens,totalOutputTokens:i.totalOutputTokens,agent_call_count:i.agentCallCount}),0):(t.stdout.write(`RUN: ${s.id}
1925
1914
  `),t.stdout.write(` Workflow: ${s.workflow?.name??"(unknown)"}
1926
1915
  `),t.stdout.write(` Team: ${s.team?.name??"(unknown)"}
1927
1916
  `),t.stdout.write(` State: ${s.current_state??"(none)"}${s.terminal_state!==null?` (terminal: ${s.terminal_state})`:""}
@@ -1931,59 +1920,59 @@ Print or watch provider session messages, or follow a managed run timeline.`;Hb=
1931
1920
  `),t.stdout.write(` Steps: ${s.steps.length}
1932
1921
  `),t.stdout.write(` AgentCalls: ${i.agentCallCount}
1933
1922
  `),t.stdout.write(` Tokens: ${i.totalInputTokens} in / ${i.totalOutputTokens} out
1934
- `),0)}async function gF(t,e,r){let n;try{n=Re(e)}catch(u){return w(t,`health: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await xr(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
1923
+ `),0)}async function _F(t,e,r){let n;try{n=Re(e)}catch(u){return y(t,`health: ${u instanceof Error?u.message:String(u)}`)}let s=[],o=0;for(let u of n.members){if(u.teamfile!==void 0||u.session===void 0||u.session.length===0)continue;let d=null;try{d=await Nr(u.session,u.provider)}catch(m){t.stderr.write(`warning: failed to load session "${u.session}" for ${u.alias} (${u.provider}): ${m instanceof Error?m.message:String(m)}
1935
1924
  `)}let f=d?.messageCount;s.push({alias:u.alias,provider:u.provider,sessionid:u.session,messageCount:f??null,model:d?.model??"(unknown)",lastContext:d?.lastInputTokens}),f===void 0?o=void 0:o!==void 0&&(o+=f)}if(r)return q(t,{team:n.name,members:s,total:{messageCount:o??null}}),0;let i=Math.max(7,...s.map(u=>u.sessionid.length)),a=Math.max(5,...s.map(u=>u.alias.length))+1,l=Math.max(8,...s.map(u=>u.provider.length))+1,c=Math.max(5,...s.map(u=>u.model.length))+1;t.stdout.write(`TEAM: ${n.name}
1936
1925
  `),t.stdout.write(` ${"SESSION".padEnd(i)} ${"ALIAS".padEnd(a)}${"PROVIDER".padEnd(l)}${"MODEL".padEnd(c)}${"MSGS".padStart(6)} ${"LAST CONTEXT".padStart(12)}
1937
- `);for(let u of s){let d=u.lastContext!==void 0?mF(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${Bd(u.messageCount).padStart(6)} ${d.padStart(12)}
1926
+ `);for(let u of s){let d=u.lastContext!==void 0?fF(u.lastContext):"?";t.stdout.write(` ${u.sessionid.padEnd(i)} ${u.alias.padEnd(a)}${u.provider.padEnd(l)}${u.model.padEnd(c)}${Bd(u.messageCount).padStart(6)} ${d.padStart(12)}
1938
1927
  `)}return t.stdout.write(` ${"TOTAL".padEnd(i)} ${"".padEnd(a)}${"".padEnd(l)}${"".padEnd(c)}${Bd(o).padStart(6)}
1939
- `),0}function Bd(t){return t==null?"unknown":String(t)}var dF,fF,Zb=b(()=>{"use strict";tn();$e();vn();Ut();Ot();dF={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},fF=`usage: lmctl health [target] [alias]
1928
+ `),0}function Bd(t){return t==null?"unknown":String(t)}var uF,dF,Zb=b(()=>{"use strict";tn();$e();vn();Ut();Ot();uF={name:"health",allowsBareTeamfile:!0,supportsRaw:!0},dF=`usage: lmctl health [target] [alias]
1940
1929
  lmctl health <teamfile> # team rollup
1941
1930
  lmctl health <sessionid> [--provider <name>]
1942
1931
  [--json]
1943
1932
 
1944
- Show provider session details, team rollups, or managed run state/token totals.`});var eS={};ce(eS,{runLs:()=>bF});import{resolve as qd}from"node:path";function EF(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function bF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${wF}
1945
- `),0;let r=F(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=x(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(x(r,_)!==void 0)return w(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return w(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return w(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=x(r,"--limit"),h=yF;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return w(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Qb)return w(e,`--limit ${_} exceeds maximum (${Qb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await G(e,async _=>SF(e,_,h,g))}catch(_){return me(e,_)}}let i=TF(n,s);if("error"in i)return w(e,i.error);let a=i.format,l=x(r,"--provider"),c=x(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await ec(l?{provider:l}:{})}catch(p){return w(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?qd(c):qd(process.cwd());f=f.filter(h=>{let g=qd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=EF(f),a==="json")return q(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1933
+ Show provider session details, team rollups, or managed run state/token totals.`});var eS={};ce(eS,{runLs:()=>EF});import{resolve as qd}from"node:path";function wF(t){let e=new Map;for(let r of t){let n=`${r.provider}:${r.sessionId}`,s=e.get(n);(s===void 0||r.modifiedAt.getTime()>s.modifiedAt.getTime())&&e.set(n,r)}return[...e.values()]}async function EF(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${gF}
1934
+ `),0;let r=F(t,["--provider","--sessiondir","--format","--limit"],["--recursive","--all","--json","--runs","--help"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,"ls does not accept positional targets (use --provider/--sessiondir/--all to filter)");let n=N(r,"--format"),s=M(r,"--json");if(M(r,"--runs")){for(let _ of["--provider","--sessiondir"])if(N(r,_)!==void 0)return y(e,`--runs is mutually exclusive with ${_}`);for(let _ of["--recursive","--all"])if(M(r,_))return y(e,`--runs is mutually exclusive with ${_}`);if(n==="teamfile")return y(e,"--runs is mutually exclusive with --format teamfile (runs are not teamfile members)");let p=N(r,"--limit"),h=yF;if(p!==void 0){let _=Number.parseInt(p,10);if(!Number.isFinite(_)||_<1||String(_)!==p)return y(e,`invalid --limit "${p}" (expected a positive integer)`);if(_>Qb)return y(e,`--limit ${_} exceeds maximum (${Qb})`);h=_}let g=n==="json"||s===!0?"json":"table";try{return await G(e,async _=>bF(e,_,h,g))}catch(_){return me(e,_)}}let i=SF(n,s);if("error"in i)return y(e,i.error);let a=i.format,l=N(r,"--provider"),c=N(r,"--sessiondir"),u=M(r,"--recursive"),d=M(r,"--all"),f;try{f=await ec(l?{provider:l}:{})}catch(p){return y(e,`ls: discovery failed: ${p instanceof Error?p.message:String(p)}`)}if(!d){let p=c!==void 0?qd(c):qd(process.cwd());f=f.filter(h=>{let g=qd(h.cwd);return u?g===p||g.startsWith(`${p}/`):g===p})}if(f=wF(f),a==="json")return q(e,f.map(p=>({provider:p.provider,sessionId:p.sessionId,cwd:p.cwd,messageCount:p.messageCount,modifiedAt:p.modifiedAt.toISOString(),...p.model!==void 0?{model:p.model}:{}}))),0;if(f.length===0){if(a==="table"){let p=d?"(all)":c??process.cwd(),h=u?"under":"in";e.stdout.write(`No native sessions found ${h} ${p}.
1946
1935
  `)}return 0}if(a==="teamfile"){for(let p of f)e.stdout.write(`_MEMBER_ alias=- provider=${p.provider} sessionid=${p.sessionId} sessiondir=${p.cwd}
1947
1936
  `);return 0}let m=Math.max(14,...f.map(p=>p.sessionId.length));e.stdout.write(`${"SESSION".padEnd(m)} ${"PROVIDER".padEnd(10)} ${"SESSIONDIR".padEnd(36)} MODIFIED
1948
1937
  `);for(let p of f){let h=p.cwd.length>36?`\u2026${p.cwd.slice(-35)}`:p.cwd;e.stdout.write(`${p.sessionId.padEnd(m)} ${p.provider.padEnd(10)} ${h.padEnd(36)} ${p.modifiedAt.toISOString()}
1949
- `)}return 0}async function SF(t,e,r,n){let s=Yr(e,{limit:r});if(n==="json")return q(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1938
+ `)}return 0}async function bF(t,e,r,n){let s=Yr(e,{limit:r});if(n==="json")return q(t,s.map(o=>({id:o.id,job_id:o.job_id,workflow_id:o.workflow_id,team_id:o.team_id,current_state:o.current_state,terminal_state:o.terminal_state,started_at:o.started_at,ended_at:o.ended_at,paused_at:o.paused_at}))),0;if(s.length===0)return t.stdout.write(`No runs found.
1950
1939
  `),0;t.stdout.write(`${"RUN_ID".padEnd(8)} ${"WORKFLOW".padEnd(8)} ${"TEAM".padEnd(8)} ${"STATE".padEnd(20)} ${"TERMINAL".padEnd(20)} STARTED
1951
1940
  `);for(let o of s){let i=(o.current_state??"").padEnd(20),a=(o.terminal_state??"").padEnd(20);t.stdout.write(`${String(o.id).padEnd(8)} ${String(o.workflow_id).padEnd(8)} ${String(o.team_id).padEnd(8)} ${i} ${a} ${o.started_at}
1952
- `)}return 0}function TF(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var wF,yF,Qb,tS=b(()=>{"use strict";Rt();$e();Ot();wF=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1941
+ `)}return 0}function SF(t,e){return t===void 0?{format:e?"json":"teamfile"}:t==="table"||t==="teamfile"||t==="json"?{format:t}:{error:`invalid --format "${t}" (expected: table | teamfile | json)`}}var gF,yF,Qb,tS=b(()=>{"use strict";Rt();$e();Ot();gF=`usage: lmctl ls [--provider <name>] [--sessiondir <path>]
1953
1942
  [--recursive] [--all] [--format table|teamfile|json] [--json]
1954
1943
  lmctl ls --runs [--limit N] [--format table|json] [--json]
1955
1944
 
1956
- List native provider sessions in scope, or list recent managed runs with --runs.`,yF=50,Qb=500});import{existsSync as nS,readFileSync as sS}from"node:fs";import{homedir as kF}from"node:os";import{dirname as vF,resolve as oS}from"node:path";import{fileURLToPath as IF}from"node:url";function Xd(t,e={}){let r=[],n=$F(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="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=OF(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${rS(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Oa??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${rS(i)}`)}return r}function $F(t){if(!t&&Cs)return Cs;let e=new Map,r,n=t??jF();if(!nS(n))return r=`${n} not found`,t||Hd(e),t||(Cs=e),t||(Oa=r),e;let s;try{s=sS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Hd(e),t||(Cs=e),t||(Oa=r),e}for(let[o,i]of Object.entries(NF)){let a=AF(s,i),l=RF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Hd(e),t||(Cs=e),t||(Oa=r),e}function jF(){let t=vF(IF(import.meta.url));return oS(t,"..","..","..","durable-memory","model_selection.md")}function Hd(t){for(let[e,r]of Object.entries(xF))t.set(e,r)}function AF(t,e){let n=new RegExp(`^## ${CF(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function RF(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function OF(t){let e=t??oS(kF(),".config","opencode","opencode.json"),r=xm();if(!nS(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(sS(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...LF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function LF(t){if(!Jd(t))return[];let e=Ra(t.provider)??Ra(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Jd(s))continue;let o=Ra(s.models)??Ra(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ra(t){return Jd(t)?t:null}function Jd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rS(t){return t.length>0?t.join(", "):"(none)"}function CF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var NF,xF,Cs,Oa,iS=b(()=>{"use strict";Sl();NF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},xF={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Cs=null});var Us={};ce(Us,{DEPRECATED_CONNECT_WARNING:()=>fS,GEMINI_PROVIDER_NOTICE:()=>dS,_setLintSessiondirFsOpsForTests:()=>YF,_setSkillFileOpsForTests:()=>KF,_setTeamfileSeedForTests:()=>VF,buildRootTeamRegistrationRow:()=>_S,registerRootTeam:()=>gS,runHire:()=>rU,runLint:()=>tU,runRefresh:()=>nU,runSeed:()=>pS,sha256Text:()=>hS,skillNameFromSource:()=>tf,skillNameFromUrl:()=>_U});import{createHash as MF,randomUUID as DF}from"node:crypto";import{accessSync as PF,constants as aS,existsSync as FF,mkdirSync as UF,readFileSync as Ma,realpathSync as Kd,renameSync as WF,statSync as BF,unlinkSync as qF,writeFileSync as Ps}from"node:fs";import{basename as HF,dirname as xn,isAbsolute as lS,join as Yd,resolve as dr}from"node:path";function VF(t){mS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Rt(),rc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function KF(t){Ds=t===null?zd:{...zd,...t}}function YF(t){Dr=t===null?Zd:{...Zd,...t}}function zF(t,e){let r=xn(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dr(i);if(n.has(a))continue;let l=ZF(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function ZF(t){try{if(Dr.existsSync(t)){if(!Dr.statSync(t).isDirectory())return"ENOTDIR";Dr.accessSync(t,aS.W_OK);return}let e=QF(t);if(e===void 0)return;if(!Dr.statSync(e).isDirectory())return"ENOTDIR";Dr.accessSync(e,aS.W_OK);return}catch(e){return eU(e)??"permission check failed"}}function QF(t){let e=t;for(;;){try{if(Dr.existsSync(e))return e}catch{return}let r=xn(e);if(r===e)return;e=r}}function eU(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function tU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1957
- `),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=kd(n,xn(dr(r))),o=Xd(n.members);o.push(...Tl(n.members,xn(dr(r)))),o.push(...zF(n.members,dr(r))),n.deprecatedConnectLines.length>0&&o.push(fS.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1945
+ List native provider sessions in scope, or list recent managed runs with --runs.`,yF=50,Qb=500});import{existsSync as nS,readFileSync as sS}from"node:fs";import{homedir as TF}from"node:os";import{dirname as kF,resolve as oS}from"node:path";import{fileURLToPath as vF}from"node:url";function Xd(t,e={}){let r=[],n=NF(e.modelSelectionDocPath);for(let s of t){let o=s.provider.trim().toLowerCase();if(s.effort&&o!=="opencode"&&r.push(`[${s.alias}] effort="${s.effort}" is ignored: effort selection is only supported for opencode.`),o==="copilot"){if(!s.model)continue;r.push(`[${s.alias}] model="${s.model}" is ignored: copilot does not support lmctl model selection.`);continue}if(o==="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=RF(e.opencodeConfigPath);a.missingConfigPath&&r.push(`[${s.alias}] opencode config not found at ${a.missingConfigPath}. lmctl can still validate lmctl-managed model ids, but opencode itself needs provider config/auth for use outside lmctl. Sample config: https://lmctl.com/examples/opencode.json (copy it to that path and adjust for the models your account can access).`),a.available?a.models.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not configured for opencode. Valid configured or lmctl-managed models: ${rS(a.models)}`):r.push(`[${s.alias}] model="${s.model}" cannot be verified for opencode: ${a.reason}.`);continue}if(!s.model)continue;let i=n.get(o);if(!i){r.push(`[${s.alias}] model="${s.model}" cannot be verified for provider "${o}": `+(Oa??"no tested models found in durable-memory/model_selection.md"));continue}i.includes(s.model)||r.push(`[${s.alias}] model="${s.model}" is not in the tested model list for provider "${o}". Valid tested models: ${rS(i)}`)}return r}function NF(t){if(!t&&Cs)return Cs;let e=new Map,r,n=t??$F();if(!nS(n))return r=`${n} not found`,t||Hd(e),t||(Cs=e),t||(Oa=r),e;let s;try{s=sS(n,"utf-8")}catch(o){return r=`${n} could not be read: ${o instanceof Error?o.message:String(o)}`,t||Hd(e),t||(Cs=e),t||(Oa=r),e}for(let[o,i]of Object.entries(IF)){let a=jF(s,i),l=AF(a);l.length>0&&e.set(o,l)}return e.size===0&&(r=`${n} has no tested model rows`),!t&&e.size===0&&Hd(e),t||(Cs=e),t||(Oa=r),e}function $F(){let t=kF(vF(import.meta.url));return oS(t,"..","..","..","durable-memory","model_selection.md")}function Hd(t){for(let[e,r]of Object.entries(xF))t.set(e,r)}function jF(t,e){let n=new RegExp(`^## ${LF(e)}\\s*$`,"m").exec(t);if(!n)return"";let s=n.index+n[0].length,o=t.slice(s),i=/^##\s+/m.exec(o);return i?o.slice(0,i.index):o}function AF(t){let e=new Set;for(let r of t.split(/\r?\n/)){let n=r.trim();if(!n.startsWith("| `"))continue;let s=/^\|\s*`([^`]+)`\s*\|/.exec(n);if(!s)continue;let o=s[1].trim();o&&o!=="Configured `model="&&e.add(o)}return[...e]}function RF(t){let e=t??oS(TF(),".config","opencode","opencode.json"),r=Nm();if(!nS(e))return{available:!0,models:r,missingConfigPath:e};let n;try{n=JSON.parse(sS(e,"utf-8"))}catch(o){return{available:!1,models:[],reason:`${e} could not be parsed: ${o instanceof Error?o.message:String(o)}`}}let s=[...new Set([...OF(n),...r])].sort();return s.length===0?{available:!1,models:s,reason:`${e} has no provider models`}:{available:!0,models:s}}function OF(t){if(!Jd(t))return[];let e=Ra(t.provider)??Ra(t.providers);if(!e)return[];let r=new Set;for(let[n,s]of Object.entries(e)){if(!Jd(s))continue;let o=Ra(s.models)??Ra(s.model);if(o)for(let i of Object.keys(o))r.add(i.startsWith(`${n}/`)?i:`${n}/${i}`)}return[...r].sort()}function Ra(t){return Jd(t)?t:null}function Jd(t){return t!==null&&typeof t=="object"&&!Array.isArray(t)}function rS(t){return t.length>0?t.join(", "):"(none)"}function LF(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}var IF,xF,Cs,Oa,iS=b(()=>{"use strict";Sl();IF={claude:"Claude",codex:"Codex",gemini:"Gemini",qwen:"Qwen",agy:"Antigravity"},xF={claude:["claude-opus-4-6","claude-opus-4-7","claude-opus-4-8","claude-sonnet-4-6","claude-haiku-4-5","claude-fable-5"],codex:["gpt-5.2","gpt-5.4","gpt-5.5","gpt-5.4-mini","gpt-5.3-codex","gpt-5.3-codex-spark"],gemini:["gemini-3.1-pro-preview","gemini-3-flash-preview","gemini-3.1-flash-lite-preview","gemini-2.5-flash","gemini-2.5-flash-lite"],qwen:["qwen3.5-plus","qwen3.6-plus"],agy:["gemini-1.5-flash","gemini-1.5-pro","gemini-3.5-flash","gemini-3.1-pro","gpt-oss-120b","gpt-4-turbo","gpt-4","gpt-3.5-turbo","claude-3-opus","claude-3-sonnet","claude-3-haiku"]},Cs=null});var Us={};ce(Us,{DEPRECATED_CONNECT_WARNING:()=>fS,GEMINI_PROVIDER_NOTICE:()=>dS,_setLintSessiondirFsOpsForTests:()=>KF,_setSkillFileOpsForTests:()=>VF,_setTeamfileSeedForTests:()=>GF,buildRootTeamRegistrationRow:()=>_S,registerRootTeam:()=>gS,runHire:()=>tU,runLint:()=>eU,runRefresh:()=>rU,runSeed:()=>pS,sha256Text:()=>hS,skillNameFromSource:()=>tf,skillNameFromUrl:()=>hU});import{createHash as CF,randomUUID as MF}from"node:crypto";import{accessSync as DF,constants as aS,existsSync as PF,mkdirSync as FF,readFileSync as Ma,realpathSync as Kd,renameSync as UF,statSync as WF,unlinkSync as BF,writeFileSync as Ps}from"node:fs";import{basename as qF,dirname as Nn,isAbsolute as lS,join as Yd,resolve as dr}from"node:path";function GF(t){mS=t??(async e=>{let{seed:r}=await Promise.resolve().then(()=>(Rt(),rc)),n=await r(e);return n.success?{sessionId:n.sessionId}:{error:n.error??"provider seed failed"}})}function VF(t){Ds=t===null?zd:{...zd,...t}}function KF(t){Dr=t===null?Zd:{...Zd,...t}}function YF(t,e){let r=Nn(e),n=new Set,s=[];for(let o of t){if(o.teamfile!==void 0)continue;let i=o.sessiondir??r,a=dr(i);if(n.has(a))continue;let l=zF(a);l!==void 0&&(n.add(a),s.push(`${o.alias}: sessiondir ${a} is not writable (seed would fail: ${l}) \u2014 fix permissions or set a writable sessiondir`))}return s}function zF(t){try{if(Dr.existsSync(t)){if(!Dr.statSync(t).isDirectory())return"ENOTDIR";Dr.accessSync(t,aS.W_OK);return}let e=ZF(t);if(e===void 0)return;if(!Dr.statSync(e).isDirectory())return"ENOTDIR";Dr.accessSync(e,aS.W_OK);return}catch(e){return QF(e)??"permission check failed"}}function ZF(t){let e=t;for(;;){try{if(Dr.existsSync(e))return e}catch{return}let r=Nn(e);if(r===e)return;e=r}}function QF(t){if(typeof t=="object"&&t!==null&&"code"in t){let e=t.code;if(typeof e=="string"&&e.length>0)return e}}async function eU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(JF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl lint <teamfile.lmctl>
1946
+ `),2;let r=t[0],n;try{n=Re(r)}catch(i){return Be(e,`${r}: ${i instanceof Error?i.message:String(i)}`)}let s=kd(n,Nn(dr(r))),o=Xd(n.members);o.push(...Tl(n.members,Nn(dr(r)))),o.push(...YF(n.members,dr(r))),n.deprecatedConnectLines.length>0&&o.push(fS.replace("%s",n.deprecatedConnectLines.join(", ")));for(let i of s)e.stderr.write(`error: ${i.field}: ${i.message}
1958
1947
  `);for(let i of n.members)ef([i],e),i.session!==void 0&&i.session.length>0&&i.sessiondir===void 0&&o.push(`${i.alias}: has a sessionid but no sessiondir \u2014 seed will fail; remove the sessionid to re-seed, or set the correct sessiondir.`),i.session!==void 0&&i.session.length<Ms&&o.push(`${i.alias}: sessionid is shorter than ${Ms} chars; run lmctl seed to refresh it`);for(let i of o)e.stderr.write(`warning: ${i}
1959
1948
  `);return await G(e,i=>{rb(r,i,a=>e.stderr.write(`${a}
1960
1949
  `))}),s.length>0?1:(e.stdout.write(`ok
1961
- `),0)}async function pS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(GF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1962
- `),2;let r=t[0],n=dr(r),s;try{s=Kd(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=xn(n),i;try{i=Re(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let a=kd(i,o);if(a.length>0){ef(i.members,e);for(let E of a)e.stderr.write(`error: ${E.field}: ${E.message}
1950
+ `),0)}async function pS(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(XF),0;if(t.length!==1)return e.stderr.write(`usage: lmctl seed <teamfile.lmctl>
1951
+ `),2;let r=t[0],n=dr(r),s;try{s=Kd(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let o=Nn(n),i;try{i=Re(n)}catch(E){return Be(e,`${r}: ${E instanceof Error?E.message:String(E)}`)}let a=kd(i,o);if(a.length>0){ef(i.members,e);for(let E of a)e.stderr.write(`error: ${E.field}: ${E.message}
1963
1952
  `);return 1}ef(i.members,e);for(let E of Xd(i.members))e.stderr.write(`warning: ${E}
1964
1953
  `);for(let E of Tl(i.members,o))e.stderr.write(`warning: ${E}
1965
1954
  `);let l=i.members.find(E=>E.teamfile===void 0&&E.session!==void 0&&E.session.length>0&&E.sessiondir===void 0);if(l!==void 0)return e.stderr.write(`error: ${l.alias}: has a sessionid but no sessiondir \u2014 the session's location is unknown. Remove the sessionid to re-seed fresh, or set the correct sessiondir.
1966
- `),1;let c=await fU(i.skillUrls,o,e);if(c!==0)return c;let u=Ma(n,"utf8"),d=u.split(`
1967
- `),f=oU(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ms);for(let E of p)if(!yS(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
1955
+ `),1;let c=await dU(i.skillUrls,o,e);if(c!==0)return c;let u=Ma(n,"utf8"),d=u.split(`
1956
+ `),f=sU(d),m=0,p=i.members.filter(E=>E.teamfile!==void 0?!1:E.session===void 0||E.session.length<Ms);for(let E of p)if(!wS(E.provider))return e.stderr.write(`error: ${E.alias}: invalid provider "${E.provider}"
1968
1957
  `),1;let h=i.members.find(E=>E.alias.toLowerCase()==="lead");if(h!==void 0){Hr("lmctl","lmctl_chat",{warn:$=>e.stderr.write(`${$}
1969
1958
  `)});let E=h.sessiondir??o,k=Rc(h.provider,E);k.error!==void 0?e.stderr.write(`warning: MCP bridge install failed: ${k.error}
1970
1959
  `):k.changed&&e.stdout.write(k.scope==="copilot-user"?`copilot MCP bridge installed in ${k.path}
1971
1960
  `:`.mcp.json installed in ${E}
1972
1961
  `)}for(let E of i.members){if(E.teamfile!==void 0)continue;if(E.session!==void 0&&E.session.length>=Ms){e.stderr.write(`warning: ${E.alias}: existing sessionid preserved; skipping
1973
- `);continue}let k=E.sessiondir??o,$=await mS({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:sU(n,u,i.members)}:{}});if($.error!==void 0||$.sessionId===void 0||$.sessionId.length<Ms)return e.stderr.write(`error: ${E.alias}: seed failed${$.error!==void 0?`: ${$.error}`:"; provider did not report a sessionid"}
1974
- `),1;let N=f.get(E.alias.toLowerCase());if(N===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
1975
- `),1;let A=cS(d[N],"sessionid",$.sessionId);E.sessiondir===void 0&&(A=cS(A,"sessiondir",o)),d[N]=A,m+=1,Ps(n,d.join(`
1962
+ `);continue}let k=E.sessiondir??o,$=await mS({provider:E.provider,cwd:k,...E.model!==void 0?{model:E.model}:{},...E.effort!==void 0?{effort:E.effort}:{},...E.alias.toLowerCase()==="lead"?{prompt:nU(n,u,i.members)}:{}});if($.error!==void 0||$.sessionId===void 0||$.sessionId.length<Ms)return e.stderr.write(`error: ${E.alias}: seed failed${$.error!==void 0?`: ${$.error}`:"; provider did not report a sessionid"}
1963
+ `),1;let x=f.get(E.alias.toLowerCase());if(x===void 0)return e.stderr.write(`error: ${E.alias}: could not find matching _MEMBER_ line to update
1964
+ `),1;let A=cS(d[x],"sessionid",$.sessionId);E.sessiondir===void 0&&(A=cS(A,"sessiondir",o)),d[x]=A,m+=1,Ps(n,d.join(`
1976
1965
  `),"utf8"),e.stdout.write(`${E.alias}: seeded ${$.sessionId}
1977
1966
  `)}let g=d.join(`
1978
- `),_=dU(g,Kd(n));_!==g&&Ps(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1979
- `);let T=new Date().toISOString();return await G(e,E=>{gS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function rU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ca),0;let r=F(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Vd(e,r.error,Ca);if(r.positionals.length!==2)return Vd(e,"expected <teamfile.lmctl> and <alias>",Ca);let[n,s]=r.positionals;if(!lU(s))return Be(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Be(e,"hire only applies to non-Lead members");let o=x(r,"--provider");if(o===void 0)return Vd(e,"missing value for --provider",Ca);if(!yS(o))return Be(e,`invalid provider "${o}"`);let i=dr(n),a;try{a=Ma(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(aU(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=x(r,"--sessiondir"),c=[`_MEMBER_ alias=${Qd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Qd(l)}`]].join(" "),u=uU(a,c);return Ps(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1967
+ `),_=uU(g,Kd(n));_!==g&&Ps(n,_,"utf8"),m===0&&e.stdout.write(`no members needed seeding
1968
+ `);let T=new Date().toISOString();return await G(e,E=>{gS(E,{teamfilePath:s,name:i.name,rawText:_,now:T})}),0}async function tU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Ca),0;let r=F(t,["--provider","--sessiondir"],[]);if(r.error!==void 0)return Vd(e,r.error,Ca);if(r.positionals.length!==2)return Vd(e,"expected <teamfile.lmctl> and <alias>",Ca);let[n,s]=r.positionals;if(!aU(s))return Be(e,`invalid alias "${s}"`);if(s.toLowerCase()==="lead")return Be(e,"hire only applies to non-Lead members");let o=N(r,"--provider");if(o===void 0)return Vd(e,"missing value for --provider",Ca);if(!wS(o))return Be(e,`invalid provider "${o}"`);let i=dr(n),a;try{a=Ma(i,"utf8")}catch(d){return Be(e,`${n}: ${d instanceof Error?d.message:String(d)}`)}if(iU(a,s))return Be(e,`${s}: alias already exists in ${i}`);let l=N(r,"--sessiondir"),c=[`_MEMBER_ alias=${Qd(s)} provider=${o}`,...l===void 0?[]:[`sessiondir=${Qd(l)}`]].join(" "),u=cU(a,c);return Ps(i,u,"utf8"),e.stdout.write(`Hired ${s} (${o}) -> ${i}
1980
1969
  `),e.stdout.write(`Run: lmctl seed ${i}
1981
- `),0}async function nU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Gd),0;let r,n;if(t.length===1){let d=js(t[0]);if(d===null)return e.stderr.write(Gd),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Gd),2;let s=dr(r),o;try{o=Ma(s,"utf8")}catch(d){return Be(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
1982
- `),a=iU(i,n);if(a===void 0)return Be(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Fs(l,"teamfile")!==void 0)return Be(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[_l],u=Fs(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Be(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=cU(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),Ps(s,i.join(`
1983
- `),"utf8"),pS([s],e))}function hS(t){return MF("sha256").update(t).digest("hex")}function _S(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:hS(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function gS(t,e){let r=_S(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function sU(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1970
+ `),0}async function rU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(Gd),0;let r,n;if(t.length===1){let d=js(t[0]);if(d===null)return e.stderr.write(Gd),2;r=d.teamfile,n=d.alias}else if(t.length===2)[r,n]=t;else return e.stderr.write(Gd),2;let s=dr(r),o;try{o=Ma(s,"utf8")}catch(d){return Be(e,`${r}: ${d instanceof Error?d.message:String(d)}`)}let i=o.split(`
1971
+ `),a=oU(i,n);if(a===void 0)return Be(e,`${n}: no active _MEMBER_ entry found`);let l=i[a];if(Fs(l,"teamfile")!==void 0)return Be(e,`${n}: refresh only applies to provider-backed members, not teamfile= members`);let c=(e.env??process.env)[_l],u=Fs(l,"sessionid");return c!==void 0&&c.length>0&&u===c?Be(e,`${n}: cannot refresh its own running session \u2014 a meta-Lead or the operator must run this refresh.`):(i[a]=lU(l,"sessionid"),a>0&&/^\s*#CreationTime:/u.test(i[a-1])&&i.splice(a-1,1),Ps(s,i.join(`
1972
+ `),"utf8"),pS([s],e))}function hS(t){return CF("sha256").update(t).digest("hex")}function _S(t,e){return{teamfile_path:e.teamfilePath,name:e.name,raw_text:e.rawText,raw_sha256:hS(e.rawText),registered_at:t?.registered_at??e.now,last_seeded_at:e.now}}function gS(t,e){let r=_S(t.getRootTeam(e.teamfilePath),e);return t.upsertRootTeam(r),r}function nU(t,e,r){let n=r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>{let i=o.teamfile!==void 0?`teamfile=${o.teamfile}`:`provider=${o.provider}`;return`- ${o.alias}: ${i}`}),s=n.length>0?n.join(`
1984
1973
  `):"- (no non-Lead members)";return["lmctl seed initial connection only. Create or pin this provider session, then stop.","Do not inspect files, run commands, infer a task, delegate, edit, or begin work.","",`Teamfile path: ${t}`,"You are alias Lead for this AI-managed .lmctl team.","","Use only the lmctl_chat MCP tool for member pings and delegation.","Delegation is an ACTION, not a plan: to hand a member a task, actually call lmctl_chat.","On some providers the tool appears only after tool search; if so, call it in the SAME turn and do not stop after discovering it or say you're about to call it.","","Team members:",s,"","Example MCP calls:",...r.filter(o=>o.alias.toLowerCase()!=="lead").map(o=>`lmctl_chat(team="${t}", alias="${o.alias}", prompt="your task here")`),"","If a member feels sluggish or starts drifting (degraded or off-track output):",` 1. Check ONE member's session health: lmctl health "${t}" <alias> (size/state \u2014 informational).`," 2. Make sure important state is captured in durable-memory/ \u2014 update it if not.",` 3. Replace its session: lmctl refresh "${t}" <alias> (re-seeds the member: drops chat history, re-reads durable-memory/). You cannot refresh your own Lead session \u2014 a meta-Lead or the operator does that.`,` Optional: lmctl tail "${t}" <alias> to inspect its recent messages while troubleshooting.`,"(These are shell commands. Delegation still uses the lmctl_chat MCP tool.)","","Full teamfile document at seed time:","```lmctl",e.trimEnd(),"```","","Remember this teamfile path. Do not ask the operator for it when asked to ping or delegate to members.","Reply exactly: ACK: teamfile context recorded."].join(`
1985
- `)}function oU(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Fs(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function iU(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Fs(s,"alias")?.toLowerCase()===r)return n}}function aU(t,e){for(let r of t.split(`
1986
- `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===e)return!0;return!1}function lU(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Fs(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function cS(t,e,r){let n=`${e}=${Qd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function cU(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Qd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function uU(t,e){let r=t.split(`
1974
+ `)}function sU(t){let e=new Map;for(let r=0;r<t.length;r+=1){let n=t[r];if(!/^\s*_MEMBER_\s+\S/.test(n))continue;let s=Fs(n,"alias");s!==void 0&&e.set(s.toLowerCase(),r)}return e}function oU(t,e){let r=e.toLowerCase();for(let n=0;n<t.length;n+=1){let s=t[n];if(/^\s*_MEMBER_\s+\S/u.test(s)&&Fs(s,"alias")?.toLowerCase()===r)return n}}function iU(t,e){for(let r of t.split(`
1975
+ `))if(/^\s*#?\s*_MEMBER_\s+\S/u.test(r)&&Fs(r,"alias")===e)return!0;return!1}function aU(t){return/^[A-Za-z][A-Za-z0-9_-]*$/u.test(t)}function Fs(t,e){let n=new RegExp(`(?:^|\\s)${e}=(?:"([^"]*)"|(\\S*))`).exec(t);return n===null?void 0:n[1]??n[2]??""}function cS(t,e,r){let n=`${e}=${Qd(r)}`,s=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return s.test(t)?t.replace(s,(o,i)=>`${i}${n}`):`${t.trimEnd()} ${n}`}function lU(t,e){let r=new RegExp(`(^|\\s)${e}=(?:"[^"]*"|\\S*)`);return t.replace(r,"").replace(/\s+/gu," ").trimEnd()}function Qd(t){return/[\s"]/u.test(t)?`"${t.replace(/"/g,'\\"')}"`:t}function cU(t,e){let r=t.split(`
1987
1976
  `),n=-1;for(let a=r.length-1;a>=0;a-=1)if(/^\s*(?:_MEMBER_|_CONNECT_|_SKILL_)(?:\s|$)/u.test(r[a])){n=a;break}if(n>=0)return r.splice(n+1,0,e),r.join(`
1988
1977
  `);let s=r.length;for(;s>0&&r[s-1]==="";)s-=1;let o=r.slice(0,s).join(`
1989
1978
  `),i=r.slice(s).join(`
@@ -1991,24 +1980,24 @@ List native provider sessions in scope, or list recent managed runs with --runs.
1991
1980
 
1992
1981
  `:""}${e}${i.length>0?`
1993
1982
  ${i}`:`
1994
- `}`}function dU(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
1983
+ `}`}function uU(t,e){let r=`#teamfile: ${e}`,n=t.indexOf(`
1995
1984
  `),s=n>=0?t.slice(0,n):t,o=n>=0?t.slice(n+1):"";return s===r?t:s.startsWith("#teamfile:")?o.length>0?`${r}
1996
1985
  ${o}`:`${r}
1997
1986
  `:t.length>0?`${r}
1998
1987
  ${t}`:`${r}
1999
- `}async function fU(t,e,r){if(t.length===0)return 0;let n=Yd(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await wS(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Be(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
1988
+ `}async function dU(t,e,r){if(t.length===0)return 0;let n=Yd(e,"durable-memory","skills"),s={visitedSkillsets:new Set,leafSources:new Set,warnings:[]},o=[];try{for(let i of t)await yS(i,{kind:"file",baseDir:e},s,o,0)}catch(i){return Be(r,i instanceof Error?i.message:String(i))}for(let i of s.warnings)r.stderr.write(`warning: ${i}
2000
1989
  `);for(let i of o){let a=`<!-- lmctl _SKILL_ source: ${i.source} -->
2001
1990
  ${i.body}${i.body.endsWith(`
2002
1991
  `)?"":`
2003
- `}`;try{Ds.mkdirSync(n,{recursive:!0}),hU(n,i.name,a)}catch(l){return Be(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
2004
- `)}return 0}async function wS(t,e,r,n,s){if(s>La)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${La}`);let o=await mU(t,e),i=pU(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:tf(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=La)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${La}`);for(let a of i)await wS(a,o.base,r,n,s+1)}async function mU(t,e){if(e.kind==="https"){if(Ht(t)||!lS(t)){let o=uS(t,e),i;try{i=await wr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:Nn(o),source:Nn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Ht(t)){let o=uS(t,e),i;try{i=await wr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:Nn(o),source:Nn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=lS(t)?t:dr(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Kd(r),s=Ma(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:xn(n)},text:s}}function uS(t,e){if(Ht(t)){if(!ht(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return Nn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!ht(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return Nn(r)}function pU(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Ht(l)&&!ht(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function Nn(t){return new URL(t).href}function hU(t,e,r){let n=Yd(t,`${e}.md`),s=Yd(t,`${e}.${process.pid}.${DF().slice(0,8)}.tmp`);try{Ds.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Ds.renameSync(s,n)}catch(o){try{Ds.unlinkSync(s)}catch{}throw o}}function _U(t){return tf(t)}function tf(t){let e=ht(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(HF(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,JF).replace(/-+$/gu,"")||"skill"}function yS(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Be(t,e){return t.stderr.write(`error: ${e}
1992
+ `}`;try{Ds.mkdirSync(n,{recursive:!0}),pU(n,i.name,a)}catch(l){return Be(r,`skill ${i.source}: ${l instanceof Error?l.message:String(l)}`)}r.stdout.write(`skill ${i.name}: wrote durable-memory/skills/${i.name}.md
1993
+ `)}return 0}async function yS(t,e,r,n,s){if(s>La)throw new Error(`skill ${t}: _SKILL_ expansion depth exceeded ${La}`);let o=await fU(t,e),i=mU(o.text,o.source);if(i.length===0){if(r.leafSources.has(o.id)){r.warnings.push(`skill ${o.source}: already provisioned; skipping duplicate`);return}r.leafSources.add(o.id),n.push({id:o.id,source:o.source,name:tf(o.source),body:o.text});return}if(r.visitedSkillsets.has(o.id)){r.warnings.push(`skillset ${o.source}: already visited; skipping`);return}if(r.visitedSkillsets.add(o.id),s>=La)throw new Error(`skill ${o.source}: _SKILL_ expansion depth exceeded ${La}`);for(let a of i)await yS(a,o.base,r,n,s+1)}async function fU(t,e){if(e.kind==="https"){if(Ht(t)||!lS(t)){let o=uS(t,e),i;try{i=await yr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:xn(o),source:xn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}throw new Error(`skill ${t}: remote _SKILL_ members must be https:// URLs or relative URL paths`)}if(Ht(t)){let o=uS(t,e),i;try{i=await yr(o,{description:"_SKILL_ URL"})}catch(a){throw new Error(`skill ${o}: ${a instanceof Error?a.message:String(a)}`)}return{kind:"https",id:xn(o),source:xn(o),base:{kind:"https",baseUrl:new URL(".",o).href},text:i.toString("utf8")}}let r=lS(t)?t:dr(e.kind==="file"?e.baseDir:".",t),n,s;try{n=Kd(r),s=Ma(n,"utf8")}catch(o){throw new Error(`skill ${t}: ${o instanceof Error?o.message:String(o)}`)}return{kind:"file",id:n,source:n,base:{kind:"file",baseDir:Nn(n)},text:s}}function uS(t,e){if(Ht(t)){if(!ht(t))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return xn(t)}if(e.kind!=="https")throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);let r=new URL(t,e.baseUrl).href;if(!ht(r))throw new Error(`skill ${t}: _SKILL_ URL must use https:// or a local path: ${t}`);return xn(r)}function mU(t,e){let r=[],n=t.split(/\r?\n/u);for(let s=0;s<n.length;s+=1){let o=n[s];if(!/^\s*_SKILL_(?:\s|$)/u.test(o))continue;let i=o.replace(/^\s*_SKILL_\s*/u,"").trim(),a=i.length===0?[]:i.split(/\s+/u);if(a.length!==1)throw new Error(`skill ${e}: line ${s+1}: _SKILL_ requires exactly one https:// URL or local path`);let l=a[0];if(Ht(l)&&!ht(l))throw new Error(`skill ${e}: line ${s+1}: _SKILL_ URL must use https:// or a local path: ${l}`);r.push(l)}return r}function xn(t){return new URL(t).href}function pU(t,e,r){let n=Yd(t,`${e}.md`),s=Yd(t,`${e}.${process.pid}.${MF().slice(0,8)}.tmp`);try{Ds.writeFileSync(s,r,{encoding:"utf8",flag:"wx"}),Ds.renameSync(s,n)}catch(o){try{Ds.unlinkSync(s)}catch{}throw o}}function hU(t){return tf(t)}function tf(t){let e=ht(t)?new URL(t).pathname:t;e.endsWith("/")&&(e=e.slice(0,-1));let n=(qF(e)||"skill").replace(/\.[^.]*$/u,""),s=n;try{s=decodeURIComponent(n)}catch{s=n}return s.trim().replace(/[^A-Za-z0-9_-]+/gu,"-").replace(/^-+|-+$/gu,"").toLowerCase().slice(0,HF).replace(/-+$/gu,"")||"skill"}function wS(t){return t==="claude"||t==="codex"||t==="gemini"||t==="copilot"||t==="opencode"||t==="qwen"||t==="agy"||t==="ClaudeMock"}function Be(t,e){return t.stderr.write(`error: ${e}
2005
1994
  `),1}function Vd(t,e,r){return t.stderr.write(`error: ${e}
2006
1995
  ${r}`),2}function ef(t,e){for(let r of t)r.teamfile!==void 0&&e.stderr.write(`warning: member "${r.alias}" uses deprecated member-level teamfile=; cross-team calls now work at runtime without _CONNECT_
2007
1996
  `),r.provider==="gemini"&&e.stderr.write(`${dS.replace("%s",r.alias)}
2008
- `)}var Ms,JF,La,XF,GF,Ca,Gd,dS,fS,zd,Zd,mS,Ds,Dr,Ws=b(()=>{"use strict";Ut();iS();fo();Xt();ao();$e();va();Ys();ss();vn();Ms=5,JF=80,La=16,XF=`usage: lmctl lint <teamfile.lmctl>
1997
+ `)}var Ms,HF,La,JF,XF,Ca,Gd,dS,fS,zd,Zd,mS,Ds,Dr,Ws=b(()=>{"use strict";Ut();iS();fo();Xt();ao();$e();va();Ys();ss();vn();Ms=5,HF=80,La=16,JF=`usage: lmctl lint <teamfile.lmctl>
2009
1998
 
2010
1999
  Validate an lmctl teamfile and warn about stale or placeholder session ids.
2011
- `,GF=`usage: lmctl seed <teamfile.lmctl>
2000
+ `,XF=`usage: lmctl seed <teamfile.lmctl>
2012
2001
 
2013
2002
  Seed missing or placeholder session ids in an lmctl teamfile by calling each
2014
2003
  member's configured native provider.
@@ -2025,32 +2014,32 @@ Refreshing the Lead drops its chat history; it re-reads durable-memory/ on
2025
2014
  re-seed.
2026
2015
  A member cannot refresh its own running session; run the refresh from a
2027
2016
  meta-Lead or operator shell outside that sessiondir.
2028
- `,dS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',fS="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",zd={mkdirSync:UF,writeFileSync:Ps,renameSync:WF,unlinkSync:qF},Zd={existsSync:FF,statSync:BF,accessSync:PF},mS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Rt(),rc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Ds=zd,Dr=Zd});var kS={};ce(kS,{runClone:()=>kU});import{existsSync as rf,mkdirSync as gU,readFileSync as wU,readdirSync as yU,statSync as SS,writeFileSync as EU}from"node:fs";import{basename as ES,dirname as bU,extname as SU,join as TS,resolve as bS}from"node:path";async function kU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(TU),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2029
- `),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=bS(r);if(!rf(c))throw new Error(`source not found: ${r}`);let d=SS(c).isDirectory()?vU(c):c;s=wU(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2030
- `),1}let i=bS(n),a=IU(i,o,n);if(rf(a))return e.stderr.write(`error: ${a} already exists.
2031
- `),1;let l=xU(NU(s));return gU(bU(a),{recursive:!0}),EU(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
2017
+ `,dS='notice: member "%s" uses provider=gemini \u2014 the Gemini CLI requires an API/enterprise Google account; personal Google subscriptions should use provider=agy (Antigravity).',fS="_CONNECT_ is deprecated and ignored (lines %s) \u2014 cross-team calls now work at runtime with automatic cycle protection; you can delete these lines.",zd={mkdirSync:FF,writeFileSync:Ps,renameSync:UF,unlinkSync:BF},Zd={existsSync:PF,statSync:WF,accessSync:DF},mS=async t=>{let{seed:e}=await Promise.resolve().then(()=>(Rt(),rc)),r=await e(t);return r.success?{sessionId:r.sessionId}:{error:r.error??"provider seed failed"}},Ds=zd,Dr=Zd});var kS={};ce(kS,{runClone:()=>TU});import{existsSync as rf,mkdirSync as _U,readFileSync as gU,readdirSync as yU,statSync as SS,writeFileSync as wU}from"node:fs";import{basename as ES,dirname as EU,extname as bU,join as TS,resolve as bS}from"node:path";async function TU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(SU),0;if(t.length!==2)return e.stderr.write(`usage: lmctl clone <source> <dest>
2018
+ `),2;let[r,n]=t,s,o=r;try{if(/^https?:\/\//i.test(r)){let c=await fetch(r);if(!c.ok)throw new Error(`HTTP ${c.status}`);s=await c.text()}else{let c=bS(r);if(!rf(c))throw new Error(`source not found: ${r}`);let d=SS(c).isDirectory()?kU(c):c;s=gU(d,"utf8"),o=d}}catch(c){return e.stderr.write(`error: ${c instanceof Error?c.message:String(c)}
2019
+ `),1}let i=bS(n),a=vU(i,o,n);if(rf(a))return e.stderr.write(`error: ${a} already exists.
2020
+ `),1;let l=xU(IU(s));return _U(EU(a),{recursive:!0}),wU(a,l,"utf8"),e.stdout.write(`Cloned ${r} -> ${a}
2032
2021
  `),e.stdout.write(`Edit ${a}; only _MEMBER_ lines are parsed, everything else is free-form.
2033
2022
  `),e.stdout.write(`After editing, run: lmctl lint ${a}
2034
2023
  `),e.stdout.write(`Then run: lmctl seed ${a}
2035
- `),0}function vU(t){let e=yU(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return TS(t,e[0])}function IU(t,e,r){if(r.endsWith("/")||rf(t)&&SS(t).isDirectory()){let n=ES(e).endsWith(".lmctl")?ES(e):"team.lmctl";return TS(t,n)}return SU(t)?t:`${t}.lmctl`}function NU(t){return t.split(`
2024
+ `),0}function kU(t){let e=yU(t).filter(r=>r.endsWith(".lmctl"));if(e.length===0)throw new Error(`no .lmctl files in source directory: ${t}`);if(e.length>1)throw new Error(`multiple .lmctl files in source directory: ${t}; specify the source file explicitly`);return TS(t,e[0])}function vU(t,e,r){if(r.endsWith("/")||rf(t)&&SS(t).isDirectory()){let n=ES(e).endsWith(".lmctl")?ES(e):"team.lmctl";return TS(t,n)}return bU(t)?t:`${t}.lmctl`}function IU(t){return t.split(`
2036
2025
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessionid=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessionid=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
2037
2026
  `)}function xU(t){return t.split(`
2038
2027
  `).map(e=>/^\s*_MEMBER_\s+\S/.test(e)?e.replace(/\s+sessiondir=(?:"[^"]*"|\S+)/g,"").replace(/^(\s*_MEMBER_)\s+sessiondir=(?:"[^"]*"|\S+)\s+/g,"$1 "):e).join(`
2039
- `)}var TU,vS=b(()=>{"use strict";TU=`usage: lmctl clone <source> <dest>
2028
+ `)}var SU,vS=b(()=>{"use strict";SU=`usage: lmctl clone <source> <dest>
2040
2029
 
2041
2030
  Copy a teamfile and strip its session ids, producing a static editable template.
2042
2031
 
2043
2032
  Examples:
2044
2033
  lmctl clone ./backend/backend.lmctl ./backend-v2/backend-v2.lmctl
2045
- `});var xS={};ce(xS,{runPlan:()=>CU});import{existsSync as $U,mkdirSync as jU,writeFileSync as AU}from"node:fs";import{basename as IS,extname as NS,join as RU,resolve as OU}from"node:path";async function CU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(LU),0;let r=F(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2034
+ `});var NS={};ce(NS,{runPlan:()=>LU});import{existsSync as NU,mkdirSync as $U,writeFileSync as jU}from"node:fs";import{basename as IS,extname as xS,join as AU,resolve as RU}from"node:path";async function LU(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(OU),0;let r=F(t,["--team","--provider"],[]);if(r.error!==void 0)return e.stderr.write(`error: ${r.error}
2046
2035
  `),e.stderr.write(`usage: lmctl plan [options] <directory>
2047
2036
  `),2;if(r.positionals.length!==1)return e.stderr.write(`usage: lmctl plan [options] <directory>
2048
- `),2;let n=OU(r.positionals[0]);jU(n,{recursive:!0});let s=x(r,"--team")??IS(n),o=x(r,"--provider")??"claude",i=RU(n,MU(s));return $U(i)?(e.stderr.write(`error: ${i} already exists.
2049
- `),1):(AU(i,PU({teamName:DU(s),workdir:n,teamfilePath:i,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
2037
+ `),2;let n=RU(r.positionals[0]);$U(n,{recursive:!0});let s=N(r,"--team")??IS(n),o=N(r,"--provider")??"claude",i=AU(n,CU(s));return NU(i)?(e.stderr.write(`error: ${i} already exists.
2038
+ `),1):(jU(i,DU({teamName:MU(s),workdir:n,teamfilePath:i,leadProvider:o}),"utf8"),e.stdout.write(`Created ${i}
2050
2039
  `),e.stdout.write(`Edit ${i}; only _MEMBER_ lines are parsed, everything else is free-form.
2051
2040
  `),e.stdout.write(`After editing, run: lmctl lint ${i}
2052
2041
  `),e.stdout.write(`Then run: lmctl seed ${i}
2053
- `),0)}function MU(t){return NS(t)?t:`${t}.lmctl`}function DU(t){let e=NS(t);return e?IS(t,e):t}function PU(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
2042
+ `),0)}function CU(t){return xS(t)?t:`${t}.lmctl`}function MU(t){let e=xS(t);return e?IS(t,e):t}function DU(t){let{teamName:e,teamfilePath:r,leadProvider:n}=t;return`# ${e}
2054
2043
 
2055
2044
  # Lead, you take tasks from the operator. Clarify only when needed,
2056
2045
  # then first use lmctl_chat to ping each of your members with a one-line
@@ -2090,7 +2079,7 @@ context, so knowledge is shared across agents and survives fresh sessions: a
2090
2079
  refreshed or swapped-in agent loses its chat history but NOT what's written
2091
2080
  here. When a task is done, record durable project knowledge in durable-memory/
2092
2081
  and keep durable-memory/index.md current so any agent can get up to speed fast.
2093
- `}var LU,$S=b(()=>{"use strict";$e();LU=`usage: lmctl plan [options] <directory>
2082
+ `}var OU,$S=b(()=>{"use strict";$e();OU=`usage: lmctl plan [options] <directory>
2094
2083
 
2095
2084
  Generate a starter lmctl team document template for a directory.
2096
2085
 
@@ -2105,7 +2094,7 @@ Examples:
2105
2094
 
2106
2095
  # Same shape, codex for the Lead and Reviewer2
2107
2096
  lmctl plan ./backend --provider codex
2108
- `});var RS={};ce(RS,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>AS,runTerminal:()=>BU});import{spawn as FU}from"node:child_process";import{statSync as UU}from"node:fs";async function BU(t,e){if(t.includes("--help")||t.includes("-h"))return GU(e);let r=F(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return w(e,r.error);let n=x(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return w(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return w(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):x(r,i)!==void 0)return w(e,`--run is mutually exclusive with ${i}`);try{return await G(e,async i=>{let a=x(r,"--alias"),l=Qw(i,s,a);return"err"in l?w(e,l.err):nf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return me(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):x(r,l)!==void 0)return w(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return w(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=ur(WU,{target:o,alias:i,flags:{}});return a.mode==="error"?w(e,a.message):a.mode!=="ai-team"?w(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?w(e,"terminal: alias required for the teamfile target"):await G(e,l=>qU(e,a.teamfile,a.alias,l))}try{return await G(e,async s=>{let o=HU(e,s,r);if(typeof o=="number")return o;let i=x(r,"--alias");return M(r,"--size")?XU(e,s,o,i,M(r,"--json")):JU(e,s,o,i)})}catch(s){return me(e,s)}}async function qU(t,e,r,n){let s;try{s=Wt(e,r,n)}catch(o){return o instanceof ge?w(t,o.message):me(t,o)}oi(t,s.isLead,s.alias,s.provider,s.sessiondir);try{ii(t,Re(e),e)}catch{}return nf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function nf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Yo(r))return w(t,`no resume incantation for provider "${r}"`);if(!fh.test(n))return w(t,"refusing to resume: malformed sessionid");let o=kc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return w(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=FU(i,a,{stdio:"inherit",cwd:s,env:Ke(process.env,n)});c.on("error",u=>{l(w(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function HU(t,e,r){let n=x(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?w(t,`team not found: ${n}`):i}let s=di(t,e,x(r,"--project"));return typeof s=="number"?s:fi(t,e,s,void 0)}async function JU(t,e,r,n){let s=mi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?w(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):nf(t,{provider:Ie(s),sessionid:o,sessiondir:s.sessiondir})}function AS(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=UU(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function XU(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return w(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ie(a),u=null;Yo(c)&&(u=await xr(l,c));let d=AS(u),f=d.est>Bs;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?en(c,l):null})}if(s)return q(t,{estimate:!0,legend:jS,guide_tokens:Bs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2097
+ `});var RS={};ce(RS,{SIZE_WARN_EST_TOKENS:()=>Bs,estimateTokens:()=>AS,runTerminal:()=>WU});import{spawn as PU}from"node:child_process";import{statSync as FU}from"node:fs";async function WU(t,e){if(t.includes("--help")||t.includes("-h"))return XU(e);let r=F(t,["--project","--team","--alias","--run"],["--size","--json","--help"]);if(r.error!==void 0)return y(e,r.error);let n=N(r,"--run");if(n!==void 0){let s=Number.parseInt(n,10);if(!Number.isFinite(s)||s<=0||String(s)!==n)return y(e,`invalid --run "${n}" (expected a positive integer run id)`);if(r.positionals.length>0)return y(e,"--run is mutually exclusive with positional <teamfile>[:alias]");let o=["--team","--project","--size","--json"];for(let i of o)if(i==="--size"||i==="--json"?M(r,i):N(r,i)!==void 0)return y(e,`--run is mutually exclusive with ${i}`);try{return await G(e,async i=>{let a=N(r,"--alias"),l=Qy(i,s,a);return"err"in l?y(e,l.err):nf(e,{provider:l.ok.provider,sessionid:l.ok.sessionid,sessiondir:l.ok.sessiondir})})}catch(i){return me(e,i)}}if(r.positionals.length>0){let s=["--team","--project","--size","--alias","--json"];for(let l of s)if(l==="--size"||l==="--json"?M(r,l):N(r,l)!==void 0)return y(e,`positional <teamfile>[:alias] is mutually exclusive with ${l} (alias is the SECOND POSITIONAL: \`terminal <teamfile> <alias>\`).`);if(r.positionals.length>2)return y(e,`too many positionals (${r.positionals.length}); expected <teamfile>[:alias] [alias]`);let o=r.positionals[0],i=r.positionals[1],a=ur(UU,{target:o,alias:i,flags:{}});return a.mode==="error"?y(e,a.message):a.mode!=="ai-team"?y(e,`internal: terminal positional yielded unexpected mode "${a.mode}"`):a.alias===void 0?y(e,"terminal: alias required for the teamfile target"):await G(e,l=>BU(e,a.teamfile,a.alias,l))}try{return await G(e,async s=>{let o=qU(e,s,r);if(typeof o=="number")return o;let i=N(r,"--alias");return M(r,"--size")?JU(e,s,o,i,M(r,"--json")):HU(e,s,o,i)})}catch(s){return me(e,s)}}async function BU(t,e,r,n){let s;try{s=Wt(e,r,n)}catch(o){return o instanceof ge?y(t,o.message):me(t,o)}oi(t,s.isLead,s.alias,s.provider,s.sessiondir);try{ii(t,Re(e),e)}catch{}return nf(t,{provider:s.provider,sessionid:s.sessionid,sessiondir:s.sessiondir,isLead:s.isLead})}async function nf(t,e){let{provider:r,sessionid:n,sessiondir:s}=e;if(!Yo(r))return y(t,`no resume incantation for provider "${r}"`);if(!fh.test(n))return y(t,"refusing to resume: malformed sessionid");let o=kc(r,n,{isLead:e.isLead});if(o===null||o.length===0)return y(t,`no resume incantation for provider "${r}"`);let[i,...a]=o;return await new Promise(l=>{let c=PU(i,a,{stdio:"inherit",cwd:s,env:Ke(process.env,n)});c.on("error",u=>{l(y(t,`failed to launch ${i}: ${u.message}`))}),c.on("exit",u=>l(u??0))})}function qU(t,e,r){let n=N(r,"--team");if(n!==void 0){let i=e.findTeamByName(n);return i===null?y(t,`team not found: ${n}`):i}let s=di(t,e,N(r,"--project"));return typeof s=="number"?s:fi(t,e,s,void 0)}async function HU(t,e,r,n){let s=mi(t,e,r,n);if(typeof s=="number")return s;let o=s.sessionid;return o===null||o.trim().length===0?y(t,`member ${s.alias} has no session yet \u2014 run \`lmctl team seed ${r.name}\` first`):nf(t,{provider:Ie(s),sessionid:o,sessiondir:s.sessiondir})}function AS(t){if(t&&Array.isArray(t.messages)&&t.messages.length>0){let r=t.messages.reduce((n,s)=>n+(s.content?.length??0),0);return{chars:r,est:Math.ceil(r/4),messages:t.messages.length,bytes:null}}let e=t?.filePath;if(e!==void 0)try{let r=FU(e).size;return{chars:r,est:Math.ceil(r/4),messages:t?.messages?.length??null,bytes:r}}catch{}return{chars:0,est:0,messages:null,bytes:null}}async function JU(t,e,r,n,s){let o;if(n!==void 0){let a=e.findTeamMemberByAlias(r.id,n);if(a===null||a.state==="retired")return y(t,`member not found: ${n}`);o=[a]}else o=e.listTeamMembers(r.id).filter(a=>a.state!=="retired"&&a.sessionid!==null);let i=[];for(let a of o){let l=a.sessionid;if(l===null)continue;let c=Ie(a),u=null;Yo(c)&&(u=await Nr(l,c));let d=AS(u),f=d.est>Bs;i.push({alias:a.alias,provider:c,sessionid:l,messages:d.messages,bytes:d.bytes,est_tokens:d.est,estimate:!0,over_guide:f,resume_incantation:f?en(c,l):null})}if(s)return q(t,{estimate:!0,legend:jS,guide_tokens:Bs,members:i}),0;t.stdout.write(`session size \u2014 ESTIMATE only (nothing is changed automatically)
2109
2098
  `),t.stdout.write(`${jS}
2110
2099
  `);for(let a of i){let l=a.messages===null?"?":String(a.messages),c=a.bytes===null?"?":String(a.bytes);t.stdout.write(`${a.alias} ${a.provider} msgs=${l} bytes=${c} ~${a.est_tokens} tok (rough estimate)
2111
2100
  `),a.over_guide&&t.stdout.write(` \u26A0 ${a.alias}: estimated ~${a.est_tokens} tokens \u2014 ESTIMATE only, exceeds the 200K guide.
@@ -2113,7 +2102,7 @@ Examples:
2113
2102
  session yourself:
2114
2103
  ${a.resume_incantation??"(no resume incantation for provider "+a.provider+")"}
2115
2104
  (or: lmctl terminal --team ${r.name} --alias ${a.alias})
2116
- `)}return 0}function GU(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2105
+ `)}return 0}function XU(t){return t.stdout.write(`usage: lmctl terminal <teamfile>:<alias>
2117
2106
  lmctl terminal <teamfile> <alias>
2118
2107
  lmctl terminal --run <id> [--alias A]
2119
2108
  lmctl terminal [--project P] [--team T] [--alias A] [--size] [--json]
@@ -2143,85 +2132,85 @@ Examples:
2143
2132
  tokens it surfaces the resume incantation so YOU can
2144
2133
  open & self-compact. Nothing is ever changed
2145
2134
  automatically; ${Bs} is a guide, not a gate.
2146
- `),0}var WU,Bs,jS,OS=b(()=>{"use strict";Pe();tn();$e();Wc();vn();Ut();Xt();ss();oa();WU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,jS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as sf,dirname as DS}from"node:path";function of(t,e){let r=sf(t);for(;;){let n=VU(e,r);if(n!==null)return n;let s=DS(r);if(s===r)return null;r=s}}function VU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Da(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Pa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function af(t){if(t.io.dal!==void 0){let o=LS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new rt(CS(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(Da()||Pa()){let o=ue(),i=pe({path:o}),a=LS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new rt(CS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?FS(t.cwd):KU(t.projectName),r=US(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new rt(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function PS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Da()||Pa()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e;try{e=FS(t.cwd)}catch{throw new rt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=US(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function LS(t,e,r){return r!==void 0?t.findProjectByName(r):of(e,t)}function CS(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function KU(t){let e=[];for(let r of Xa())for(let n of WS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new rt(`project not found in any workspace DB: ${t}`);return e}function FS(t){let e=YU(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Xa())for(let o of WS(s)){let i=sf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new rt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function US(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new rt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2135
+ `),0}var UU,Bs,jS,OS=b(()=>{"use strict";Pe();tn();$e();Wc();vn();Ut();Xt();ss();oa();UU={name:"terminal",allowsBareTeamfile:!1,supportsRaw:!1},Bs=2e5,jS="est = rough local heuristic (~4 chars/token), NOT an exact provider token count \u2014 open the session to verify before acting."});import{resolve as sf,dirname as DS}from"node:path";function of(t,e){let r=sf(t);for(;;){let n=GU(e,r);if(n!==null)return n;let s=DS(r);if(s===r)return null;r=s}}function GU(t,e){return t.db.prepare("SELECT * FROM project WHERE local_path = ? LIMIT 1").get(e)??null}function Da(){return process.env.LMCTL_DB!==void 0&&process.env.LMCTL_DB.length>0}function Pa(){return process.env.LMCTL_WORKSPACE!==void 0&&process.env.LMCTL_WORKSPACE.length>0}function af(t){if(t.io.dal!==void 0){let o=LS(t.io.dal,t.cwd,t.projectName);if(o===null)throw new rt(CS(t.projectName));return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,project:o,matchedLocalPath:t.projectName===void 0?o.local_path:null,resolverMode:"injected"}}if(Da()||Pa()){let o=ue(),i=pe({path:o}),a=LS(i,t.cwd,t.projectName);if(a===null)throw i.close(),new rt(CS(t.projectName));return{dal:i,ownsDal:!0,dbPath:o,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,project:a,matchedLocalPath:t.projectName===void 0?a.local_path:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e=t.projectName===void 0?FS(t.cwd):VU(t.projectName),r=US(e,t.projectName===void 0?"cwd":"project"),n=pe({path:r.candidate.db_path}),s=n.getProject(r.project.id);if(s===null)throw n.close(),new rt(`resolved project disappeared from workspace DB: ${r.project.name}`);return{dal:n,ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,project:s,matchedLocalPath:r.matched_local_path,resolverMode:t.projectName===void 0?"cwd-scan":"project-scan"}}function PS(t){if(t.io.dal!==void 0)return{dal:t.io.dal,ownsDal:!1,dbPath:":injected:",workspaceName:null,resolverMode:"injected"};if(Da()||Pa()){let n=ue();return{dal:pe({path:n}),ownsDal:!0,dbPath:n,workspaceName:Pa()?process.env.LMCTL_WORKSPACE??null:null,resolverMode:Da()?"explicit-db":"explicit-workspace"}}let e;try{e=FS(t.cwd)}catch{throw new rt("job ids are workspace-local and cwd does not resolve to a workspace DB; use --workspace <name> or --db <path>")}let r=US(e,"job-cwd");return{dal:pe({path:r.candidate.db_path}),ownsDal:!0,dbPath:r.candidate.db_path,workspaceName:r.candidate.workspace_name,resolverMode:"cwd-scan"}}function LS(t,e,r){return r!==void 0?t.findProjectByName(r):of(e,t)}function CS(t){return t!==void 0?`project not found: ${t}`:"no lmctl project found for cwd; pass --project or run from inside a registered project"}function VU(t){let e=[];for(let r of Xa())for(let n of WS(r))n.name===t&&e.push({candidate:r,project:n,matched_local_path:null,match_depth:0});if(e.length===0)throw new rt(`project not found in any workspace DB: ${t}`);return e}function FS(t){let e=KU(t),r=new Map;e.forEach((s,o)=>{r.set(s,e.length-o)});let n=[];for(let s of Xa())for(let o of WS(s)){let i=sf(o.local_path),a=r.get(i);a!==void 0&&n.push({candidate:s,project:o,matched_local_path:i,match_depth:a})}if(n.length===0)throw new rt("no lmctl project found for cwd in workspace DBs; pass --workspace and --project");return n}function US(t,e){let r=Math.max(...t.map(s=>s.match_depth)),n=t.filter(s=>s.match_depth===r);if(n.length===1)return n[0];throw e==="job-cwd"?new rt(`job ids are workspace-local and cwd resolves ambiguously; use --workspace <name> or --db <path>
2147
2136
  ${MS(n)}`):new rt(`ambiguous lmctl ${e} match; use --workspace <name> --project <name>
2148
2137
  ${MS(n)}`)}function MS(t){return t.map(e=>` workspace ${e.candidate.workspace_name??"(legacy)"} project ${e.project.name} ${e.project.local_path}`).join(`
2149
- `)}function YU(t){let e=[],r=sf(t);for(;;){e.push(r);let n=DS(r);if(n===r)return e;r=n}}function WS(t){let e=null;try{e=new zs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>al)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var rt,lf=b(()=>{"use strict";il();cl();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var pf={};ce(pf,{assertNoCrossWorkflowSubflowCycle:()=>VS,firstUnregisteredArchetype:()=>mf,runWorkflow:()=>uW});import{createHash as df,randomUUID as zU}from"node:crypto";import{existsSync as ZU,readFileSync as Wa,readdirSync as QU,writeFileSync as eW}from"node:fs";import{basename as tW,join as rW,resolve as nW}from"node:path";import{pathToFileURL as sW}from"node:url";function ff(t,e){return{source_uri:sW(nW(t)).href,source_sha256:df("sha256").update(e).digest("hex")}}function HS(t){return df("sha256").update(t).digest("hex")}async function lW(t){let e=await wr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:HS(e),remote:!0}}async function Ua(t){if(tr(t)){let n=await ts(t),s=Wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:HS(s),remote:!1}}let e=Mn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return lW(t);let r=Wa(t,"utf8");return{definition:r,...ff(t,r),remote:!1}}function JS(t){return Ce(t.definition)}function XS(t){if(t.definition_schema_version!==3)return null;let e=mf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function cW(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function uW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(aW),0;try{return r==="run"?await dW(n,e):await G(e,s=>{switch(r){case"load":return hW(n,e,s);case"author":return _W(n,e,s);case"list":return gW(n,e,s);case"sync":return wW(n,e,s);case"export":return yW(n,e,s);default:return w(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof rt?w(e,s.message):me(e,s)}}async function dW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Fa}
2150
- `),0;let r=F(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return fr(e,r.error);if(r.positionals.length>1)return fr(e,Fa);let n=M(r,"--json"),s=x(r,"--workflow"),o=x(r,"--project"),i=x(r,"--job"),a=x(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return fr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ht(c))return fr(e,Fa);if(tr(c))return BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Mn(c,"remote workflow URLs");return m!==null?w(e,m):BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return fr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return fr(e,Fa);if(i!==void 0&&(o!==void 0||a!==void 0))return fr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=fW(i);if(m===null)return fr(e,`invalid --job: ${i}`);let p=PS({cwd:process.cwd(),io:e});try{let h=await ys({dal:p.dal,job_id:m,worker_id:cf()});return uf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=GS(a,e);if(d===Ba)return 2;let f=af({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return w(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await ys({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function BS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=GS(o,r);if(l===Ba)return 2;let c,u;try{c=await Ua(t),u=JS(c)}catch(m){return w(r,m instanceof Error?m.message:String(m))}let d=XS(u);if(d!==null)return w(r,d);if(c.remote&&!await mW(r,c,u,a))return 1;let f=af({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await ys({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function fr(t,e){return t.stderr.write(`error: ${e}
2138
+ `)}function KU(t){let e=[],r=sf(t);for(;;){e.push(r);let n=DS(r);if(n===r)return e;r=n}}function WS(t){let e=null;try{e=new zs(t.db_path,{readonly:!0,fileMustExist:!0});let r=Number(e.pragma("user_version",{simple:!0})??0);if(!Number.isInteger(r)||r<=0||r>al)return[];let n=e.prepare("PRAGMA table_info(project)").all(),s=new Set(n.map(o=>o.name));return!s.has("id")||!s.has("name")||!s.has("local_path")?[]:e.prepare("SELECT id, name, local_path FROM project").all()}catch{return[]}finally{e?.close()}}var rt,lf=b(()=>{"use strict";il();cl();Pe();Ve();rt=class extends Error{constructor(e){super(e),this.name="CliContextError"}}});var pf={};ce(pf,{assertNoCrossWorkflowSubflowCycle:()=>VS,firstUnregisteredArchetype:()=>mf,runWorkflow:()=>cW});import{createHash as df,randomUUID as YU}from"node:crypto";import{existsSync as zU,readFileSync as Wa,readdirSync as ZU,writeFileSync as QU}from"node:fs";import{basename as eW,join as tW,resolve as rW}from"node:path";import{pathToFileURL as nW}from"node:url";function ff(t,e){return{source_uri:nW(rW(t)).href,source_sha256:df("sha256").update(e).digest("hex")}}function HS(t){return df("sha256").update(t).digest("hex")}async function aW(t){let e=await yr(t,{description:"remote workflow URL"});return{definition:e.toString("utf8"),source_uri:t,source_sha256:HS(e),remote:!0}}async function Ua(t){if(tr(t)){let n=await ts(t),s=Wa(n,"utf8");return{definition:s,source_uri:t,source_sha256:HS(s),remote:!1}}let e=Mn(t,"remote workflow URLs");if(e!==null)throw new Error(e);if(ht(t))return aW(t);let r=Wa(t,"utf8");return{definition:r,...ff(t,r),remote:!1}}function JS(t){return Ce(t.definition)}function XS(t){if(t.definition_schema_version!==3)return null;let e=mf(t);return e!==null?`unknown archetype \`${e.type}\` (step \`${e.id}\`) \u2014 not in the live archetype registry`:null}function lW(t){let e=new Set;if(t.definition_schema_version===3)for(let r of t.steps)e.add(r.type);else for(let r of Object.values(t.states))e.add(r.type);return Array.from(e).sort()}async function cW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(iW),0;try{return r==="run"?await uW(n,e):await G(e,s=>{switch(r){case"load":return pW(n,e,s);case"author":return hW(n,e,s);case"list":return _W(n,e,s);case"sync":return gW(n,e,s);case"export":return yW(n,e,s);default:return y(e,"usage: lmctl workflow <load|author|list|sync|export|run>")}})}catch(s){return s instanceof rt?y(e,s.message):me(e,s)}}async function uW(t,e){if(t[0]==="--help"||t[0]==="-h"||t[0]==="help")return e.stdout.write(`${Fa}
2139
+ `),0;let r=F(t,["--workflow","--project","--inputs","--job"],["--json","--verbose","--yes","--no-prompt"]);if(r.error!==void 0)return fr(e,r.error);if(r.positionals.length>1)return fr(e,Fa);let n=M(r,"--json"),s=N(r,"--workflow"),o=N(r,"--project"),i=N(r,"--job"),a=N(r,"--inputs"),l=M(r,"--verbose"),c=r.positionals[0],u=M(r,"--yes")||M(r,"--no-prompt");if(c!==void 0){if(s!==void 0||i!==void 0)return fr(e,"remote workflow URL cannot be combined with --workflow or --job");if(!Ht(c))return fr(e,Fa);if(tr(c))return BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u});let m=Mn(c,"remote workflow URLs");return m!==null?y(e,m):BS(c,{io:e,json:n,projectName:o,inputsValue:a,verbose:l,yes:u})}if(s!==void 0&&i!==void 0)return fr(e,"--workflow and --job are mutually exclusive");if(s===void 0&&i===void 0)return fr(e,Fa);if(i!==void 0&&(o!==void 0||a!==void 0))return fr(e,"--job cannot be combined with --project or --inputs");if(i!==void 0){let m=dW(i);if(m===null)return fr(e,`invalid --job: ${i}`);let p=PS({cwd:process.cwd(),io:e});try{let h=await ws({dal:p.dal,job_id:m,worker_id:cf()});return uf(e,h,{json:n,workflowName:null,projectName:null,workspaceName:p.workspaceName,dbPath:p.dbPath,verbose:l})}finally{p.ownsDal&&p.dal.close()}}let d=GS(a,e);if(d===Ba)return 2;let f=af({cwd:process.cwd(),io:e,projectName:o});try{let m=f.dal.getWorkflowByName(s);if(m===null)return y(e,`workflow not found: ${s}`);let p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(d),priority:0}),h=await ws({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(e,h,{json:n,workflowName:s,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:l})}finally{f.ownsDal&&f.dal.close()}}async function BS(t,e){let{io:r,json:n,projectName:s,inputsValue:o,verbose:i,yes:a}=e,l=GS(o,r);if(l===Ba)return 2;let c,u;try{c=await Ua(t),u=JS(c)}catch(m){return y(r,m instanceof Error?m.message:String(m))}let d=XS(u);if(d!==null)return y(r,d);if(c.remote&&!await fW(r,c,u,a))return 1;let f=af({cwd:process.cwd(),io:r,projectName:s});try{let m=f.dal.upsertWorkflow({name:u.name,definition_schema_version:u.definition_schema_version,definition:c.definition,source_uri:c.source_uri,source_sha256:c.source_sha256}),p=f.dal.enqueueJob({project_id:f.project.id,workflow_id_override:m.id,source:"cli-workflow-run",payload:JSON.stringify(l),priority:0}),h=await ws({dal:f.dal,job_id:p.id,worker_id:cf()});return uf(r,h,{json:n,workflowName:m.name,projectName:f.project.name,workspaceName:f.workspaceName,dbPath:f.dbPath,verbose:i})}finally{f.ownsDal&&f.dal.close()}}function fr(t,e){return t.stderr.write(`error: ${e}
2151
2140
  `),2}function GS(t,e){if(t===void 0)return{};let r;try{r=JSON.parse(t)}catch(n){return e.stderr.write(`error: invalid --inputs JSON: ${n instanceof Error?n.message:String(n)}
2152
2141
  `),Ba}return r===null||typeof r!="object"||Array.isArray(r)?(e.stderr.write(`error: --inputs must be a JSON object
2153
- `),Ba):r}function fW(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function cf(){return`cli-${process.pid}-${zU().slice(0,8)}`}function uf(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?q(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2142
+ `),Ba):r}function dW(t){if(!/^[1-9][0-9]*$/.test(t))return null;let e=Number(t);return Number.isSafeInteger(e)?e:null}function cf(){return`cli-${process.pid}-${YU().slice(0,8)}`}function uf(t,e,r){if(!e.claimed){let s={ok:!1,job_id:e.job_id,status:"not_claimed",reason:e.reason,job_status:e.status,locked_by:e.locked_by,locked_until:e.locked_until,...r.verbose?{db_path:r.dbPath,workspace:r.workspaceName}:{}};return r.json?q(t,s):t.stderr.write(`error: job ${e.job_id} not claimable: ${e.reason}${e.locked_by?` (locked_by=${e.locked_by})`:""}
2154
2143
  `),1}let n={ok:e.status!=="failed",job_id:e.job_id,run_id:e.run_id,status:e.status,terminal_state:e.terminal_state,workflow:r.workflowName,project:r.projectName,workspace:r.workspaceName,ms:e.ms,...r.verbose?{db_path:r.dbPath}:{}};return r.json?q(t,n):e.status==="paused"?t.stdout.write(`workflow paused job=${e.job_id} run=${e.run_id}
2155
2144
  `):e.status==="failed"?t.stderr.write(`workflow failed job=${e.job_id}
2156
2145
  `):(t.stdout.write(`workflow completed job=${e.job_id} run=${e.run_id} terminal_state=${e.terminal_state??"null"}
2157
2146
  `),e.terminal_state!==null&&e.terminal_state!=="done"&&e.terminal_state!=="success"&&t.stderr.write(`warning: workflow terminal_state=${e.terminal_state}
2158
- `)),e.status==="failed"?1:0}async function mW(t,e,r,n){let s=cW(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2147
+ `)),e.status==="failed"?1:0}async function fW(t,e,r,n){let s=lW(r);if(t.stderr.write(["remote workflow trust check:",` source: ${e.source_uri}`,` sha256: ${e.source_sha256}`,` workflow: ${r.name}@${r.version}`,` step archetypes: ${s.length>0?s.join(", "):"(none)"}`].join(`
2159
2148
  `)+`
2160
- `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await pW(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2161
- `),a}function pW(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function hW(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return w(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(tr(s))try{o=await Ua(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else if(ht(s))try{o=await Ua(s)}catch(c){return w(e,c instanceof Error?c.message:String(c))}else{let c=Mn(s,"remote workflow URLs");if(c!==null)return w(e,c);o=await Ua(s)}let i;try{i=JS(o)}catch(c){if(o.remote)return w(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?XS(i):null;if(a!==null)return w(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2149
+ `),n)return!0;let o=t.stdin??process.stdin;if(o.isTTY!==!0)return!0;t.stderr.write("Run remote workflow? [y/N] ");let i=await mW(o),a=/^(y|yes)$/i.test(i.trim());return a||t.stderr.write(`aborted remote workflow run
2150
+ `),a}function mW(t){return new Promise(e=>{t.setEncoding?.("utf8"),t.resume?.(),t.once("data",r=>{t.pause?.(),e(typeof r=="string"?r:r.toString("utf8"))})})}async function pW(t,e,r){let[n,s]=t;if(n===void 0||s===void 0)return y(e,"usage: workflow load <name> <path-to-json | lmctl://workflow/<name> | https://...>");let o;if(tr(s))try{o=await Ua(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else if(ht(s))try{o=await Ua(s)}catch(c){return y(e,c instanceof Error?c.message:String(c))}else{let c=Mn(s,"remote workflow URLs");if(c!==null)return y(e,c);o=await Ua(s)}let i;try{i=JS(o)}catch(c){if(o.remote)return y(e,c instanceof Error?c.message:String(c));throw c}let a=o.remote?XS(i):null;if(a!==null)return y(e,a);let l=r.upsertWorkflow({name:n,definition_schema_version:i.definition_schema_version,definition:o.definition,source_uri:o.source_uri,source_sha256:o.source_sha256});return e.stdout.write(`loaded workflow ${l.name}@${l.version}
2162
2151
  `),o.remote&&e.stdout.write(`source: ${o.source_uri}
2163
2152
  sha256: ${o.source_sha256}
2164
- `),0}function mf(t){let e=Fi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qS(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function VS(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function _W(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return w(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return w(e,"usage: lmctl workflow author <file.dsl> [name]");let i=Wa(s,"utf8"),a;try{a=Ce(i)}catch(m){return w(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return me(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=mf(l);if(c!==null)return w(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{VS(u,qS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return qS(JSON.parse(p.definition))}catch{return null}})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...ff(s,i)})}catch(m){return w(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:df("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2165
- `),0}function gW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listWorkflows();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2153
+ `),0}function mf(t){let e=Fi();for(let r of t.steps)if(e.get(r.type)===void 0)return{id:r.id,type:r.type};return null}function qS(t){if(t===null||typeof t!="object")return[];let e=t,r=[],n=e.steps;if(Array.isArray(n))for(let o of n){if(o===null||typeof o!="object")continue;let i=o;if(i.type!=="lmctl/subflow"&&i.type!=="Subflow")continue;let a=i.parameters&&typeof i.parameters=="object"?i.parameters:{};typeof a.workflow_name=="string"&&a.workflow_name.length>0&&r.push(a.workflow_name)}let s=e.states;if(s!==null&&typeof s=="object")for(let o of Object.values(s)){if(o===null||typeof o!="object")continue;let i=o;i.type==="Subflow"&&typeof i.workflow_name=="string"&&i.workflow_name.length>0&&r.push(i.workflow_name)}return r}function VS(t,e,r){let n=[],s=new Set,o=(i,a)=>{let l=n.indexOf(i);if(l>=0)throw new Error(`cross-workflow subflow cycle: ${[...n.slice(l),i].join(" -> ")}`);if(!s.has(i)){n.push(i);try{for(let c of a){let u=c===t?e:r(c);u!==null&&o(c,u)}}finally{n.pop()}s.add(i)}};o(t,e)}function hW(t,e,r){let n=process.env.LMCTL_DSL;if(n!==void 0&&["0","false","off"].includes(n.trim().toLowerCase()))return y(e,"workflow author is disabled by the LMCTL_DSL kill-switch (unset it to use the GA DSL path; durable-memory/composition-language-design.md \xA710)");let[s,o]=t;if(s===void 0)return y(e,"usage: lmctl workflow author <file.dsl> [name]");let i=Wa(s,"utf8"),a;try{a=Ce(i)}catch(m){return y(e,`compile failed: ${m instanceof Error?m.message:String(m)}`)}if(a.definition_schema_version!==3)return me(e,new Error("composition DSL must compile to a v3 graph workflow"));let l=a,c=mf(l);if(c!==null)return y(e,`unknown archetype \`${c.type}\` (step \`${c.id}\`) \u2014 not in the live archetype registry`);let u=o??l.name,d=JSON.stringify(l);try{VS(u,qS(l),m=>{let p=r.getWorkflowByName(m);if(p===null)return null;try{return qS(JSON.parse(p.definition))}catch{return null}})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}let f;try{f=r.upsertWorkflow({name:u,definition_schema_version:3,definition:d,...ff(s,i)})}catch(m){return y(e,`${m instanceof Error?m.message:String(m)}`)}return r.insertCompositionUnit({name:u,version:f.version,lang:"lmctl/dsl@1",source:i,source_sha:df("sha256").update(i).digest("hex"),compiled_workflow_version_id:f.active_version_id}),e.stdout.write(`authored workflow ${f.name}@${f.version} (composition_unit lang=lmctl/dsl@1)
2154
+ `),0}function _W(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listWorkflows();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.name}@${o.version}`).join(`
2166
2155
  `)}${s.length>0?`
2167
- `:""}`),0}function wW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);ti({swallow:!0});let s=gh(),o=[];try{o=ZU(s)?QU(s).filter(c=>oW.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=rW(s,c),d=Wa(u,"utf8"),f;try{f=Ce(d)}catch($){return w(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:tW(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=ff(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===T.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),k?i+=1:a+=1}return M(n,"--json")?q(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2168
- `),0}function yW(t,e,r){let n=F(t,["--out"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return w(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:iW,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2169
- `,c=x(n,"--out");return c!==void 0?(eW(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2170
- `)):e.stdout.write(l),0}var oW,iW,aW,Fa,Ba,hf=b(()=>{"use strict";Iu();dn();ni();$c();$e();lf();Ys();Es();oW=[".compound.json",".lmctl"],iW="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",aW=`usage: lmctl workflow <load|author|list|sync|export|run>
2156
+ `:""}`),0}function gW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);ti({swallow:!0});let s=gh(),o=[];try{o=zU(s)?ZU(s).filter(c=>sW.some(u=>c.endsWith(u))):[]}catch{o=[]}let i=0,a=0,l=0;for(let c of[...o].sort()){let u=tW(s,c),d=Wa(u,"utf8"),f;try{f=Ce(d)}catch($){return y(e,`compile failed for ${c}: ${$ instanceof Error?$.message:String($)}`)}let m=f.name,p=typeof m=="string"&&m.length>0?m:eW(c).replace(/\.(compound\.json|lmctl)$/i,""),h=c.endsWith(".lmctl"),g=h?JSON.stringify(f):d,_=h?3:f.definition_schema_version,T=ff(u,d),E=r.getWorkflowByName(p);if(E!==null&&E.source_sha256===T.source_sha256){l+=1;continue}let k=E===null;r.upsertWorkflow({name:p,definition_schema_version:_,definition:g,...T}),k?i+=1:a+=1}return M(n,"--json")?q(e,{total:o.length,created:i,updated:a,unchanged:l}):e.stdout.write(`synced ${o.length} template(s): ${i} created, ${a} updated, ${l} unchanged
2157
+ `),0}function yW(t,e,r){let n=F(t,["--out"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: lmctl workflow export <name> [--out <file>] [--json]");let o=r.getWorkflowByName(s);if(o===null)return y(e,`workflow not found: ${s}`);let i;try{i=JSON.parse(o.definition)}catch{i=o.definition}let a={_lmctl_export:oW,inspection:{name:o.name,version:o.version,definition_schema_version:o.definition_schema_version,source_uri:o.source_uri,source_sha256:o.source_sha256,definition:i}},l=`${JSON.stringify(a,null,2)}
2158
+ `,c=N(n,"--out");return c!==void 0?(QU(c,l),e.stdout.write(`exported ${o.name}@${o.version} \u2192 ${c} (inspection-only; NOT re-importable)
2159
+ `)):e.stdout.write(l),0}var sW,oW,iW,Fa,Ba,hf=b(()=>{"use strict";Iu();dn();ni();$c();$e();lf();Ys();Es();sW=[".compound.json",".lmctl"],oW="INSPECTION ONLY \u2014 NOT a re-importable workflow source. Edit the basedir template then `lmctl workflow sync`; do NOT `workflow load` this file.",iW=`usage: lmctl workflow <load|author|list|sync|export|run>
2171
2160
 
2172
2161
  Load, author, list, synchronize, inspect, or run workflow definitions. The
2173
2162
  load subcommand accepts local JSON, lmctl:// workflow URIs, and https:// JSON
2174
2163
  URLs. The run subcommand executes a loaded workflow/job, or one-shot runs a
2175
2164
  remote https:// workflow after a trust prompt.
2176
- `,Fa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ba=Symbol("inputs-error")});function _f(t,e){let r=EW[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var EW,KS=b(()=>{"use strict";EW={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"},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 rT={};ce(rT,{initWorkspace:()=>eT,runWorkspace:()=>NW,setWorkspaceProvider:()=>tT});import{copyFileSync as bW,cpSync as SW,existsSync as De,mkdirSync as mr,readdirSync as wf,renameSync as TW,rmSync as qa,statSync as Ha,writeFileSync as kW}from"node:fs";import{spawnSync as vW}from"node:child_process";import{homedir as YS}from"node:os";import{dirname as yf,join as qs}from"node:path";async function NW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(IW),0;switch(r){case"list":return xW(n,e);case"create":return $W(n,e);case"use":return jW(n,e);case"show":return AW(n,e);case"delete":return RW(n,e);case"migrate":return OW(n,e);case"init":return eT(n,e);case"set-provider":return tT(n,e);default:return w(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function ZS(){let t=Js(),e=[],r=new Set,n=_r.default,s=De(An()),o=De(vt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Bt(n):An(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(hr())){let i;try{i=wf(hr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=Ha(vt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Bt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function xW(t,e){let r=F(t,[]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length!==0)return w(e,"usage: lmctl workspace list");let n=ZS();if(M(r,"--json"))return q(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2177
- `)}return 0}function $W(t,e){let r=F(t,["--docroot"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!qe(n))return w(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=vt(n);if(De(s))return w(e,`workspace already exists: ${n} (${s})`);let o=x(r,"--docroot")??Ga(n);mr(s,{recursive:!0}),mr(o,{recursive:!0});let i=Bt(n);mr(yf(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?q(e,l):e.stdout.write(`created workspace ${n} at ${s}
2178
- `),0}function jW(t,e){let r=F(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace use <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(n!==_r.default&&!De(vt(n)))return w(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Hs();return mr(yf(s),{recursive:!0}),kW(s,`${n}
2165
+ `,Fa="usage: workflow run (<https-url | lmctl://workflow/<name>> [--project <name>] [--inputs <json-object>] [--yes] | --workflow <name> [--project <name>] [--inputs <json-object>] | --job <id>) [--json]";Ba=Symbol("inputs-error")});function _f(t,e){let r=wW[t],n=e("which",[t]);return n.status===0&&(n.stdout??"").toString().trim()!==""?e(t,["--version"]).status===0?{provider:t,status:"ok",detail:"installed, --version OK"}:{provider:t,status:"unverified",detail:"installed, session unverified (auth may be required)"}:r.optional?{provider:t,status:"skipped",detail:"not installed"}:{provider:t,status:"missing",detail:`not installed (install: ${r.install_hint})`,remediation:r.install_remediation}}var wW,KS=b(()=>{"use strict";wW={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"},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 rT={};ce(rT,{initWorkspace:()=>eT,runWorkspace:()=>IW,setWorkspaceProvider:()=>tT});import{copyFileSync as EW,cpSync as bW,existsSync as De,mkdirSync as mr,readdirSync as yf,renameSync as SW,rmSync as qa,statSync as Ha,writeFileSync as TW}from"node:fs";import{spawnSync as kW}from"node:child_process";import{homedir as YS}from"node:os";import{dirname as wf,join as qs}from"node:path";async function IW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(vW),0;switch(r){case"list":return xW(n,e);case"create":return NW(n,e);case"use":return $W(n,e);case"show":return jW(n,e);case"delete":return AW(n,e);case"migrate":return RW(n,e);case"init":return eT(n,e);case"set-provider":return tT(n,e);default:return y(e,"usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>")}}function ZS(){let t=Js(),e=[],r=new Set,n=_r.default,s=De(An()),o=De(vt(n));if((s||o||t===null||t===n)&&(e.push({name:n,db_path:o?Bt(n):An(),active:t===null||t===n,legacy:!o&&s}),r.add(n)),De(hr())){let i;try{i=yf(hr())}catch{i=[]}for(let a of i.sort()){if(r.has(a)||!qe(a))continue;let l=!1;try{l=Ha(vt(a)).isDirectory()}catch{l=!1}l&&(e.push({name:a,db_path:Bt(a),active:t===a,legacy:!1}),r.add(a))}}return e}function xW(t,e){let r=F(t,[]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length!==0)return y(e,"usage: lmctl workspace list");let n=ZS();if(M(r,"--json"))return q(e,n),0;for(let s of n){let o=s.active?"*":" ",i=s.legacy?" (legacy)":"";e.stdout.write(`${o} ${s.name} ${s.db_path}${i}
2166
+ `)}return 0}function NW(t,e){let r=F(t,["--docroot"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace create <name> [--docroot PATH]");if(!qe(n))return y(e,`invalid workspace name: ${n} (allowed: letters, digits, '.', '-', '_'; must start with alnum; \u226464 chars)`);let s=vt(n);if(De(s))return y(e,`workspace already exists: ${n} (${s})`);let o=N(r,"--docroot")??Ga(n);mr(s,{recursive:!0}),mr(o,{recursive:!0});let i=Bt(n);mr(wf(i),{recursive:!0});let a=pe({path:i});try{a.setConfig("project.docroot",o)}finally{a.close()}let l={name:n,dir:s,db_path:i,docroot:o};return M(r,"--json")?q(e,l):e.stdout.write(`created workspace ${n} at ${s}
2167
+ `),0}function $W(t,e){let r=F(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace use <name>");if(!qe(n))return y(e,`invalid workspace name: ${n}`);if(n!==_r.default&&!De(vt(n)))return y(e,`workspace not found: ${n} (run \`lmctl workspace create ${n}\` first)`);let s=Hs();return mr(wf(s),{recursive:!0}),TW(s,`${n}
2179
2168
  `),M(r,"--json")?q(e,{active:n,path:s}):e.stdout.write(`active workspace set to ${n}
2180
- `),0}function AW(t,e){let r=F(t,[]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace show <name>");if(!qe(n))return w(e,`invalid workspace name: ${n}`);let s=ZS().find(u=>u.name===n);if(s===void 0)return w(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?Ha(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(De(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2181
- `),0}function RW(t,e){let r=F(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return w(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return w(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!qe(n))return w(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return w(e,`refusing to delete workspace ${n} without --confirm`);if(n===_r.default&&!M(r,"--force"))return w(e,"refusing to delete the default workspace without --force");if(Js()===n&&!M(r,"--force"))return w(e,`refusing to delete the active workspace (${n}) without --force`);let o=vt(n);return De(o)?(qa(o,{recursive:!0,force:!0}),M(r,"--json")?q(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2182
- `),0):w(e,`workspace not found: ${n}`)}function gf(t,e,r){try{TW(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2183
- `),Ha(t).isDirectory()?SW(t,e,{recursive:!0}):bW(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);qa(t,{recursive:!0,force:!0})}function OW(t,e){let r=F(t,[],["--json"]);if(r.error!==void 0)return w(e,r.error);let n=M(r,"--json"),s=Va(),o=hr(),i=[],a=(f,m)=>{if(n)q(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2169
+ `),0}function jW(t,e){let r=F(t,[]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace show <name>");if(!qe(n))return y(e,`invalid workspace name: ${n}`);let s=ZS().find(u=>u.name===n);if(s===void 0)return y(e,`workspace not found: ${n}`);let o=0;try{o=De(s.db_path)?Ha(s.db_path).size:0}catch{o=0}let i=0,a=null,l={};if(De(s.db_path)){let u=pe({path:s.db_path});try{i=u.listProjects().length,l=u.getConfigAll(),a=l["project.docroot"]??null}finally{u.close()}}let c={name:s.name,active:s.active,legacy:s.legacy,db_path:s.db_path,db_size_bytes:o,docroot:a,project_count:i,config_keys:Object.keys(l).sort()};return M(r,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2170
+ `),0}function AW(t,e){let r=F(t,[],["--json","--confirm","--force"]);if(r.error!==void 0)return y(e,r.error);let[n]=r.positionals;if(n===void 0||r.positionals.length!==1)return y(e,"usage: lmctl workspace delete <name> --confirm [--force]");if(!qe(n))return y(e,`invalid workspace name: ${n}`);if(!M(r,"--confirm"))return y(e,`refusing to delete workspace ${n} without --confirm`);if(n===_r.default&&!M(r,"--force"))return y(e,"refusing to delete the default workspace without --force");if(Js()===n&&!M(r,"--force"))return y(e,`refusing to delete the active workspace (${n}) without --force`);let o=vt(n);return De(o)?(qa(o,{recursive:!0,force:!0}),M(r,"--json")?q(e,{deleted:n,dir:o}):e.stdout.write(`deleted workspace ${n}
2171
+ `),0):y(e,`workspace not found: ${n}`)}function gf(t,e,r){try{SW(t,e);return}catch(s){if(s.code!=="EXDEV")throw s}if(r.stderr.write(`note: cross-device move; copying ${t} -> ${e} then removing source
2172
+ `),Ha(t).isDirectory()?bW(t,e,{recursive:!0}):EW(t,e),!De(e))throw new Error(`migration copy verification failed: ${e} not present after copy`);qa(t,{recursive:!0,force:!0})}function RW(t,e){let r=F(t,[],["--json"]);if(r.error!==void 0)return y(e,r.error);let n=M(r,"--json"),s=Va(),o=hr(),i=[],a=(f,m)=>{if(n)q(e,{migrated:f,reason:m??null,actions:i});else{for(let p of i)e.stdout.write(`${p}
2184
2173
  `);e.stdout.write(f?`migration complete
2185
2174
  `:`${m??"nothing to migrate"}
2186
- `)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=wf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ha(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))gf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(qs(o,m)));if(f.length>0)return w(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);mr(o,{recursive:!0});for(let m of c)gf(qs(s,m),qs(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{wf(s).length===0&&(qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Of(),d=Hs();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(gf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function QS(t,e){return vW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function MW(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function zS(t){return t==="~"?YS():t.startsWith("~/")?qs(YS(),t.slice(2)):t}async function eT(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${$n.join(", ")}.`].join(`
2175
+ `)}return 0};if(!De(s))return a(!1,"no legacy ~/.lmctl/profiles/ found; nothing to migrate");let l;try{l=yf(s).sort()}catch{l=[]}let c=l.filter(f=>{try{return Ha(qs(s,f)).isDirectory()}catch{return!1}});if(c.length===0)qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`);else if(!De(o))gf(s,o,e),i.push(`renamed ${s} -> ${o}`);else{let f=c.filter(m=>De(qs(o,m)));if(f.length>0)return y(e,`refusing to migrate: ~/.lmctl/workspaces/ already has: ${f.join(", ")} (no files were moved; resolve the name collision, then re-run \`lmctl workspace migrate\`)`);mr(o,{recursive:!0});for(let m of c)gf(qs(s,m),qs(o,m),e),i.push(`moved ${m} -> workspaces/${m}`);try{yf(s).length===0&&(qa(s,{recursive:!0,force:!0}),i.push(`removed empty ${s}`))}catch{}}let u=Of(),d=Hs();return De(u)&&(De(d)?i.push("left active-profile in place (active-workspace already exists; not clobbering)"):(gf(u,d,e),i.push("renamed active-profile -> active-workspace"))),a(!0)}function QS(t,e){return kW(t,e,{encoding:"utf8",timeout:5e3,maxBuffer:1024*1024})}function CW(t){return process.stderr.write(t),new Promise(e=>{let r=n=>{let s=(typeof n=="string"?n:n.toString("utf8")).trim();process.stdin.removeListener("data",r);try{process.stdin.pause()}catch{}e(s)};try{process.stdin.resume()}catch{}process.stdin.once("data",r)})}function zS(t){return t==="~"?YS():t.startsWith("~/")?qs(YS(),t.slice(2)):t}async function eT(t,e,r={}){let n="usage: lmctl workspace init [--name N] [--basedir DIR] [--provider1 P] [--provider2 P] [--provider3 P]";if(t.includes("--help")||t.includes("-h"))return e.stdout.write([n,"","Creates ~/.lmctl/workspaces/<name>/ with its own state.db and the","provider1/2/3 -> concrete mapping (lmctl_config workspace.provider{1,2,3}).",`Missing options are asked one at a time. Scanned providers: ${$n.join(", ")}.`].join(`
2187
2176
  `)+`
2188
- `),0;let s=F(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return w(e,s.error);if(s.positionals.length!==0)return w(e,n);let o=r.spawn??QS,a=$n.map(N=>_f(N,o)).filter(N=>N.status==="ok"||N.status==="unverified").map(N=>N.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
2189
- `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??MW,u=r.promptLine!==void 0||l,d=N=>(e.stderr.write(`error: ${N} is required in non-interactive mode (no TTY); pass it explicitly
2190
- `),2),f,m=x(s,"--name");if(m!==void 0){if(!qe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2191
- `),2;f=m}else{if(!u)return d("--name");for(;;){let N=(await c("Workspace name [default]: ")).trim(),A=N.length===0?"default":N;if(qe(A)){f=A;break}e.stderr.write(`invalid workspace name: ${A} (letters/digits/.-_, start alnum, \u226464)
2177
+ `),0;let s=F(t,["--name","--basedir","--provider1","--provider2","--provider3"]);if(s.error!==void 0)return y(e,s.error);if(s.positionals.length!==0)return y(e,n);let o=r.spawn??QS,a=$n.map(x=>_f(x,o)).filter(x=>x.status==="ok"||x.status==="unverified").map(x=>x.provider);if(a.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
2178
+ `),2;let l=r.isTty??!!process.stdin.isTTY,c=r.promptLine??CW,u=r.promptLine!==void 0||l,d=x=>(e.stderr.write(`error: ${x} is required in non-interactive mode (no TTY); pass it explicitly
2179
+ `),2),f,m=N(s,"--name");if(m!==void 0){if(!qe(m))return e.stderr.write(`error: invalid workspace name: ${m}
2180
+ `),2;f=m}else{if(!u)return d("--name");for(;;){let x=(await c("Workspace name [default]: ")).trim(),A=x.length===0?"default":x;if(qe(A)){f=A;break}e.stderr.write(`invalid workspace name: ${A} (letters/digits/.-_, start alnum, \u226464)
2192
2181
  `)}}let p=vt(f);if(De(p))return e.stderr.write(`error: workspace already exists: ${f} (${p}) \u2014 refusing to overwrite
2193
- `),2;let h,g=x(s,"--basedir"),_=Ga(f);if(g!==void 0)h=zS(g);else{if(!u)return d("--basedir");let N=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=N.length===0?_:zS(N)}let T={};for(let N of["provider1","provider2","provider3"]){let A=x(s,`--${N}`),D=LW[N],C=a.includes(D)?D:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${N} ${A} is not an available provider (available: ${a.join(", ")})
2194
- `),2;T[N]=A;continue}if(!u)return d(`--${N}`);for(;;){let H=(await c(`${N} (${CW[N]}) [${C}]: `)).trim(),R=H.length===0?C:H;if(a.includes(R)){T[N]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
2195
- `)}}mr(p,{recursive:!0}),mr(h,{recursive:!0});let E=Bt(f);mr(yf(E),{recursive:!0});let k=pe({path:E});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",T.provider1),k.setConfig("workspace.provider2",T.provider2),k.setConfig("workspace.provider3",T.provider3)}finally{k.close()}let $={name:f,dir:p,db_path:E,basedir:h,providers:{...T}};return M(s,"--json")?q(e,$):(e.stdout.write(`created workspace ${f} at ${p}
2182
+ `),2;let h,g=N(s,"--basedir"),_=Ga(f);if(g!==void 0)h=zS(g);else{if(!u)return d("--basedir");let x=(await c(`Base directory for this workspace's projects [${_}]: `)).trim();h=x.length===0?_:zS(x)}let T={};for(let x of["provider1","provider2","provider3"]){let A=N(s,`--${x}`),D=OW[x],C=a.includes(D)?D:a[0];if(A!==void 0){if(!a.includes(A))return e.stderr.write(`error: --${x} ${A} is not an available provider (available: ${a.join(", ")})
2183
+ `),2;T[x]=A;continue}if(!u)return d(`--${x}`);for(;;){let H=(await c(`${x} (${LW[x]}) [${C}]: `)).trim(),R=H.length===0?C:H;if(a.includes(R)){T[x]=R;break}e.stderr.write(`not an available provider: ${R} (available: ${a.join(", ")})
2184
+ `)}}mr(p,{recursive:!0}),mr(h,{recursive:!0});let E=Bt(f);mr(wf(E),{recursive:!0});let k=pe({path:E});try{k.setConfig("project.docroot",h),k.setConfig("workspace.provider1",T.provider1),k.setConfig("workspace.provider2",T.provider2),k.setConfig("workspace.provider3",T.provider3)}finally{k.close()}let $={name:f,dir:p,db_path:E,basedir:h,providers:{...T}};return M(s,"--json")?q(e,$):(e.stdout.write(`created workspace ${f} at ${p}
2196
2185
  `),e.stdout.write(` basedir: ${h}
2197
2186
  `),e.stdout.write(` provider1=${T.provider1} provider2=${T.provider2} provider3=${T.provider3}
2198
2187
  `),e.stdout.write(`activate it with: lmctl workspace use ${f}
2199
2188
  `)),0}async function tT(t,e,r={}){let n="usage: lmctl [--workspace W] workspace set-provider <provider1|provider2|provider3> <concrete>";if(t.includes("--help")||t.includes("-h"))return e.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: ${$n.join(", ")}.`].join(`
2200
2189
  `)+`
2201
- `),0;let s=F(t,[]);if(s.error!==void 0)return w(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return w(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
2190
+ `),0;let s=F(t,[]);if(s.error!==void 0)return y(e,s.error);let[o,i,...a]=s.positionals;if(o===void 0||i===void 0||a.length!==0)return y(e,n);let l=/^provider[123]$/.test(o)?o:/^[123]$/.test(o)?`provider${o}`:null;if(l===null)return e.stderr.write(`error: invalid slot: ${o} (expected provider1, provider2, or provider3)
2202
2191
  `),2;let c=r.spawn??QS,u=$n.map(p=>_f(p,c)).filter(p=>p.status==="ok"||p.status==="unverified").map(p=>p.provider);if(u.length===0)return e.stderr.write(`error: no provider CLI found on PATH; install/auth ${$n.join("|")} first
2203
2192
  `),2;if(!u.includes(i))return e.stderr.write(`error: ${i} is not an available provider (available: ${u.join(", ")})
2204
2193
  `),2;let d=e.dal===void 0,f=e.dal??pe({path:ue()});try{f.setConfig(`workspace.${l}`,i)}finally{d&&f.close()}let m=Rn()??_r.default;return e.stdout.write(`workspace.${l} = ${i} (workspace: ${m})
2205
- `),0}var IW,$n,LW,CW,nT=b(()=>{"use strict";Pe();KS();$e();Ve();IW=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2194
+ `),0}var vW,$n,OW,LW,nT=b(()=>{"use strict";Pe();KS();$e();Ve();vW=`usage: lmctl workspace <list|create|use|show|delete|migrate|init|set-provider>
2206
2195
 
2207
2196
  Manage isolated workspace state directories, active workspace selection,
2208
2197
  legacy profile migration, and configured provider slots.
2209
- `;$n=["claude","codex","gemini","qwen"],LW={provider1:"claude",provider2:"codex",provider3:"gemini"},CW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var iT={};ce(iT,{runProject:()=>UW});import{existsSync as DW,statSync as PW}from"node:fs";import{join as oT}from"node:path";async function UW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(FW),0;try{return await G(e,s=>{switch(r){case"create":return KW(n,e,s);case"list":return YW(n,e,s);case"show":return GW(n,e,s);case"status":return VW(n,e,s);case"workflow":return WW(n,e,s);default:return w(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function WW(t,e,r){let[n,...s]=t;switch(n){case"add":return BW(s,e,r);case"list":return qW(s,e,r);case"show":return HW(s,e,r);case"remove":return JW(s,e,r);case"enable":return sT(s,e,r,!0);case"disable":return sT(s,e,r,!1);default:return w(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function BW(t,e,r){let n=F(t,["--condition","--params","--priority"]);if(n.error!==void 0)return w(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return w(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return w(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return w(e,`workflow not found: ${o}`);let l=x(n,"--condition")??null;if(l!==null)try{sr(l)}catch{return w(e,"invalid --condition JEXL")}let c=XW(x(n,"--params"));if(typeof c=="string")return w(e,c);let u=x(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return w(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?q(e,f):e.stdout.write(`added project workflow ${f.id}
2210
- `),0}function qW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return w(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?q(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2198
+ `;$n=["claude","codex","gemini","qwen"],OW={provider1:"claude",provider2:"codex",provider3:"gemini"},LW={provider1:"primary implementer",provider2:"independent reviewer",provider3:"auxiliary / tie-break"}});var iT={};ce(iT,{runProject:()=>FW});import{existsSync as MW,statSync as DW}from"node:fs";import{join as oT}from"node:path";async function FW(t,e){let[r,...n]=t;if(r==="--help"||r==="-h"||r==="help")return e.stdout.write(PW),0;try{return await G(e,s=>{switch(r){case"create":return VW(n,e,s);case"list":return KW(n,e,s);case"show":return XW(n,e,s);case"status":return GW(n,e,s);case"workflow":return UW(n,e,s);default:return y(e,"usage: lmctl project <create|list|show|status|workflow>")}})}catch(s){return me(e,s)}}function UW(t,e,r){let[n,...s]=t;switch(n){case"add":return WW(s,e,r);case"list":return BW(s,e,r);case"show":return qW(s,e,r);case"remove":return HW(s,e,r);case"enable":return sT(s,e,r,!0);case"disable":return sT(s,e,r,!1);default:return y(e,"usage: lmctl project workflow <add|list|show|remove|enable|disable>")}}function WW(t,e,r){let n=F(t,["--condition","--params","--priority"]);if(n.error!==void 0)return y(e,n.error);let[s,o]=n.positionals;if(s===void 0||o===void 0||n.positionals.length!==2)return y(e,"usage: project workflow add <project> <workflow> [--condition JEXL] [--params JSON] [--priority N]");let i=r.findProjectByName(s);if(i===null)return y(e,`project not found: ${s}`);let a=r.getWorkflowByName(o);if(a===null)return y(e,`workflow not found: ${o}`);let l=N(n,"--condition")??null;if(l!==null)try{sr(l)}catch{return y(e,"invalid --condition JEXL")}let c=JW(N(n,"--params"));if(typeof c=="string")return y(e,c);let u=N(n,"--priority"),d=u===void 0?100:Number(u);if(!Number.isInteger(d))return y(e,`invalid --priority: ${u??""}`);let f=r.insertProjectWorkflow({project_id:i.id,workflow_id:a.id,condition:l,parameters_override:c?.json??null,priority:d});return M(n,"--json")?q(e,f):e.stdout.write(`added project workflow ${f.id}
2199
+ `),0}function BW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0||n.positionals.length!==1)return y(e,"usage: project workflow list <project>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=r.listProjectWorkflows(o.id);return M(n,"--json")?q(e,i):e.stdout.write(`${i.map(a=>`${a.id} ${a.workflow_id} ${a.priority} ${a.enabled} ${a.condition??""}`).join(`
2211
2200
  `)}${i.length>0?`
2212
- `:""}`),0}function HW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Ef(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return w(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?w(e,`project workflow not found: ${s}`):(M(n,"--json")?q(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2213
- `),0)}function JW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=Ef(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?w(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2214
- `),0):w(e,`project workflow not found: ${s}`)}function sT(t,e,r,n){let s=F(t,[]);if(s.error!==void 0)return w(e,s.error);let o=Ef(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return w(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?w(e,`project workflow not found: ${o}`):(M(s,"--json")?q(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2215
- `),0)}function XW(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function Ef(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function GW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2216
- `),0}function VW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals;if(s===void 0)return w(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return w(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?q(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2217
- `),0}function KW(t,e,r){let n=F(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return w(e,n.error);let[s]=n.positionals,o=x(n,"--owner"),i=x(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return w(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=x(n,"--local-path")??(l!==null?oT(l,u):void 0),f=x(n,"--workflow"),m=x(n,"--team");if(d===void 0||f===void 0||m===void 0)return w(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return w(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return w(e,`team not found: ${m}`);let h=x(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every($=>typeof $=="string")||k.length===0)return w(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return w(e,"--test-argv must be valid JSON")}let _=x(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return w(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:zW(d)||Zn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:x(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?q(e,E):e.stdout.write(`created project ${E.name}
2218
- `),0}function YW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return w(e,n.error);let s=r.listProjects();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2201
+ `:""}`),0}function qW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=Ef(n.positionals[0]);if(typeof s=="string"||n.positionals.length!==1)return y(e,"usage: project workflow show <id>");let o=r.getProjectWorkflow(s);return o===null?y(e,`project workflow not found: ${s}`):(M(n,"--json")?q(e,o):e.stdout.write(`${JSON.stringify(o,null,2)}
2202
+ `),0)}function HW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=Ef(n.positionals[0]);return typeof s=="string"||n.positionals.length!==1?y(e,"usage: project workflow remove <id>"):r.removeProjectWorkflow(s)?(e.stdout.write(`removed project workflow ${s}
2203
+ `),0):y(e,`project workflow not found: ${s}`)}function sT(t,e,r,n){let s=F(t,[]);if(s.error!==void 0)return y(e,s.error);let o=Ef(s.positionals[0]),i=n?"enable":"disable";if(typeof o=="string"||s.positionals.length!==1)return y(e,`usage: project workflow ${i} <id>`);let a=r.setProjectWorkflowEnabled(o,n);return a===null?y(e,`project workflow not found: ${o}`):(M(s,"--json")?q(e,a):e.stdout.write(`${n?"enabled":"disabled"} project workflow ${o}
2204
+ `),0)}function JW(t){if(t===void 0)return null;try{let e=JSON.parse(t);return e!==null&&typeof e=="object"&&!Array.isArray(e)?{json:JSON.stringify(e)}:"--params must be a JSON object"}catch{return"--params must be valid JSON"}}function Ef(t){return t===void 0||!/^\d+$/.test(t)||Number(t)<=0?"invalid id":Number(t)}function XW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project show <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i=o.name.indexOf("/"),a=i>0?o.name.slice(0,i):null,l=i>0?o.name.slice(i+1):o.name,c={...o,owner:a,repo:l};return M(n,"--json")?q(e,c):e.stdout.write(`${JSON.stringify(c,null,2)}
2205
+ `),0}function GW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals;if(s===void 0)return y(e,"usage: project status <name>");let o=r.findProjectByName(s);if(o===null)return y(e,`project not found: ${s}`);let i={project:o.name,workflow_name:o.workflow_name};return M(n,"--json")?q(e,i):e.stdout.write(`${JSON.stringify(i,null,2)}
2206
+ `),0}function VW(t,e,r){let n=F(t,["--local-path","--workflow","--team","--default-branch","--owner","--repo","--test-argv","--durable-memory-mode"]);if(n.error!==void 0)return y(e,n.error);let[s]=n.positionals,o=N(n,"--owner"),i=N(n,"--repo"),a=o!==void 0&&i!==void 0?`${o}/${i}`:s;if(a===void 0)return y(e,`usage: project create <name> --local-path P --workflow W --team T [--default-branch B] [--test-argv '["go","test","./..."]'] OR project create --owner OWNER --repo REPO ...`);let l=r.getConfig("project.docroot"),c=a.indexOf("/"),u=c>0?a.slice(c+1):a,d=N(n,"--local-path")??(l!==null?oT(l,u):void 0),f=N(n,"--workflow"),m=N(n,"--team");if(d===void 0||f===void 0||m===void 0)return y(e,"project create requires --local-path (or `api config set project.docroot`), --workflow, and --team");if(r.getWorkflowByName(f)===null)return y(e,`workflow not found: ${f}`);let p=r.findTeamByName(m);if(p===null)return y(e,`team not found: ${m}`);let h=N(n,"--test-argv"),g=null;if(h!==void 0)try{let k=JSON.parse(h);if(!Array.isArray(k)||!k.every($=>typeof $=="string")||k.length===0)return y(e,`--test-argv must be a non-empty JSON array of strings (e.g. '["go","test","./..."]')`);g=JSON.stringify(k)}catch{return y(e,"--test-argv must be valid JSON")}let _=N(n,"--durable-memory-mode");if(_!==void 0&&_!=="folder"&&_!=="db")return y(e,'--durable-memory-mode must be "folder" or "db"');let T=_!==void 0?_:YW(d)||Zn(d)?"folder":"db",E=r.insertProject({name:a,local_path:d,workflow_name:f,team_id:p.id,default_branch:N(n,"--default-branch")??null,test_argv:g,durable_memory_mode:T});return M(n,"--json")?q(e,E):e.stdout.write(`created project ${E.name}
2207
+ `),0}function KW(t,e,r){let n=F(t,[]);if(n.error!==void 0)return y(e,n.error);let s=r.listProjects();return M(n,"--json")?q(e,s):e.stdout.write(`${s.map(o=>`${o.id} ${o.name} ${o.workflow_name}`).join(`
2219
2208
  `)}${s.length>0?`
2220
- `:""}`),0}function zW(t){try{let e=oT(t,"durable-memory");return DW(e)&&PW(e).isDirectory()}catch{return!1}}var FW,aT=b(()=>{"use strict";$e();an();Qn();FW=`usage: lmctl project <create|list|show|status|workflow>
2209
+ `:""}`),0}function YW(t){try{let e=oT(t,"durable-memory");return MW(e)&&DW(e).isDirectory()}catch{return!1}}var PW,aT=b(()=>{"use strict";$e();an();Qn();PW=`usage: lmctl project <create|list|show|status|workflow>
2221
2210
 
2222
2211
  Create, list, inspect, and check projects. The workflow subcommand manages
2223
2212
  per-project workflow bindings and routing conditions.
2224
- `});import{createHash as ZW,randomBytes as QW}from"node:crypto";import{readFile as eB}from"node:fs/promises";function lT(t=new Date,e=QW(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function tB(t){return ZW("sha256").update(t).digest("hex")}async function cT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await eB(n);return{path:r,sha256:tB(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function uT(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var bf=b(()=>{"use strict"});import{spawnSync as dT}from"node:child_process";import{mkdir as Sf,writeFile as fT,readFile as rB,rm as mT}from"node:fs/promises";import{tmpdir as nB}from"node:os";import{dirname as pT,join as Tf}from"node:path";async function hT(t){let e=t.stagingDir??Tf(nB(),`lmctl-diag-${t.ticketId}`),r=Tf(e,`diagnostic-${t.ticketId}`);await Sf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Tf(r,d);if(await Sf(pT(m),{recursive:!0}),typeof f=="string")await fT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await fT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2213
+ `});import{createHash as zW,randomBytes as ZW}from"node:crypto";import{readFile as QW}from"node:fs/promises";function lT(t=new Date,e=ZW(4)){let r=t.getUTCFullYear().toString().padStart(4,"0"),n=(t.getUTCMonth()+1).toString().padStart(2,"0"),s=t.getUTCDate().toString().padStart(2,"0"),o=t.getUTCHours().toString().padStart(2,"0"),i=t.getUTCMinutes().toString().padStart(2,"0"),a=t.getUTCSeconds().toString().padStart(2,"0"),l=e.toString("hex").slice(0,8).padEnd(8,"0");return`dxx-${r}${n}${s}-${o}${i}${a}-${l}`}function eB(t){return zW("sha256").update(t).digest("hex")}async function cT(t){return(await Promise.all(t.map(async({bundlePath:r,absPath:n})=>{let s=await QW(n);return{path:r,sha256:eB(s),size:s.byteLength}}))).sort((r,n)=>r.path<n.path?-1:r.path>n.path?1:0)}function uT(t){return{ticket_id:t.ticketId,lmctl_next_version:t.lmctlNextVersion,node_version:t.nodeVersion,platform:t.platform,generated_at:t.generatedAt.toISOString(),sanitized:t.sanitized,files:t.files}}var bf=b(()=>{"use strict"});import{spawnSync as dT}from"node:child_process";import{mkdir as Sf,writeFile as fT,readFile as tB,rm as mT}from"node:fs/promises";import{tmpdir as rB}from"node:os";import{dirname as pT,join as Tf}from"node:path";async function hT(t){let e=t.stagingDir??Tf(rB(),`lmctl-diag-${t.ticketId}`),r=Tf(e,`diagnostic-${t.ticketId}`);await Sf(r,{recursive:!0});let n=[],s=async(d,f)=>{let m=Tf(r,d);if(await Sf(pT(m),{recursive:!0}),typeof f=="string")await fT(m,f);else{let p=f.buffer.slice(f.byteOffset,f.byteOffset+f.byteLength);await fT(m,new Uint8Array(p))}n.push({bundlePath:d,absPath:m})},o=d=>`${JSON.stringify(d,null,2)}
2225
2214
  `;if(t.data.serve!==void 0){let d=t.data.serve,f=d.pid===null?`no daemon (source=${d.pid_source})
2226
2215
  `:`${d.pid}
2227
2216
  # source=${d.pid_source} alive=${String(d.pid_alive)}
@@ -2239,29 +2228,29 @@ per-project workflow bindings and routing conditions.
2239
2228
  `:`# source=${f}
2240
2229
  # tail_lines=${d.tail_lines}
2241
2230
  `;await s("intents/recent.log",`${m}${d.tail}${d.tail.length>0?`
2242
- `:""}`)}if(await s("README.md",sB(t)),t.sanitized)for(let d of n){let f=await rB(d.absPath);try{Pf(d.bundlePath,f.toString("utf8"))}catch(m){throw await mT(e,{recursive:!0,force:!0}),m instanceof gr,m}}let i=await cT(n),a=uT({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await Sf(pT(t.outputPath),{recursive:!0});let l=dT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=dT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await mT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function sB(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2243
- `)}var _T=b(()=>{"use strict";bf();Xs()});import{spawnSync as oB}from"node:child_process";import{stat as iB}from"node:fs/promises";async function gT(t){try{if(!(await iB(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return aB(t);case"hq":return lB(t)}}function aB(t){let r=oB("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function lB(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var wT=b(()=>{"use strict"});var ET={};ce(ET,{parseDiagnoseArgs:()=>yT,runDiagnose:()=>dB});import{tmpdir as cB}from"node:os";import{join as uB}from"node:path";async function dB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${pB()}
2244
- `),0;let r=yT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2231
+ `:""}`)}if(await s("README.md",nB(t)),t.sanitized)for(let d of n){let f=await tB(d.absPath);try{Pf(d.bundlePath,f.toString("utf8"))}catch(m){throw await mT(e,{recursive:!0,force:!0}),m instanceof gr,m}}let i=await cT(n),a=uT({ticketId:t.ticketId,lmctlNextVersion:t.lmctlNextVersion,nodeVersion:process.version,platform:process.platform,generatedAt:t.generatedAt??new Date,sanitized:t.sanitized,files:i});await s("manifest.json",o(a)),await Sf(pT(t.outputPath),{recursive:!0});let l=dT("tar",["-czf",t.outputPath,"-C",e,`diagnostic-${t.ticketId}`],{encoding:"utf8"});if(l.status!==0)throw new Error(`tar failed (status=${l.status}): ${l.stderr??""}`);let c=dT("stat",["-c","%s",t.outputPath],{encoding:"utf8"}),u=Number.parseInt((c.stdout??"0").trim(),10)||0;return await mT(e,{recursive:!0,force:!0}),{outputPath:t.outputPath,manifest:a,bundleSizeBytes:u}}function nB(t){let e=Object.keys(t.data).sort().join(", ")||"(none)";return[`# Diagnostic Bundle ${t.ticketId}`,"",`Generated by lmctl ${t.lmctlNextVersion}.`,"",`Sections included: ${e}`,`Sanitized: ${t.sanitized?"yes":"NO (--no-sanitize)"}`,"","## Layout","","- `manifest.json` \u2014 file index + sha256 + lmctl version.","- `serve/` \u2014 daemon PID + sanitized log tail.","- `db/` \u2014 sqlite integrity-check, schema version, table row counts.","- `runs/` \u2014 last 50 run metadata, stale runs, paused runs.","- `jobs/` \u2014 queue snapshot (pending/running/done/failed counts + ids).","- `attentions/` \u2014 unacked operator attentions.","- `env/` \u2014 lmctl version, node, uname -a, du -sh, tracked env vars.","- `intents/` \u2014 last N entries of the rolling intent log (sanitized).","","## What this bundle does NOT contain","","- Prompt bodies or message contents.","- step_artifact contents (code/text artifacts produced by runs).","- durable_memory bodies.","- session_event payloads.","- API tokens or bearer tokens (redacted in sanitization).",""].join(`
2232
+ `)}var _T=b(()=>{"use strict";bf();Xs()});import{spawnSync as sB}from"node:child_process";import{stat as oB}from"node:fs/promises";async function gT(t){try{if(!(await oB(t.bundlePath)).isFile())return{mode:t.mode,ok:!1,message:`bundle not a regular file: ${t.bundlePath}`}}catch(e){return{mode:t.mode,ok:!1,message:`bundle missing: ${e instanceof Error?e.message:String(e)}`}}switch(t.mode){case"local":return{mode:"local",ok:!0,message:`bundle written: ${t.bundlePath}`,destination:t.bundlePath};case"internal-s3":return iB(t);case"hq":return aB(t)}}function iB(t){let r=sB("which",["aws"],{encoding:"utf8"}).status===0,s=`${t.s3Prefix??"s3://lmctl/diagnostics/"}${t.ticketId}.tar.gz`;return r?{mode:"internal-s3",ok:!0,message:`STUB (no actual upload performed): would run \`aws s3 cp ${t.bundlePath} ${s}\``,destination:s}:{mode:"internal-s3",ok:!1,message:`aws CLI not available; would upload ${t.bundlePath} -> ${s}`,destination:s}}function aB(t){let e=t.hqUrl??"https://lmctl.anthropic.com";return{mode:"hq",ok:!1,message:`headquarter upload not implemented in MVP; would POST to ${e}/diagnostics/init with ticket ${t.ticketId}`,destination:e}}var yT=b(()=>{"use strict"});var ET={};ce(ET,{parseDiagnoseArgs:()=>wT,runDiagnose:()=>uB});import{tmpdir as lB}from"node:os";import{join as cB}from"node:path";async function uB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${mB()}
2233
+ `),0;let r=wT(t);if(typeof r=="string")return e.stderr.write(`error: ${r}
2245
2234
  `),2;if(r.noSanitize&&(r.upload||r.internalS3||r.hqUrl!==void 0))return e.stderr.write(`error: --no-sanitize is incompatible with upload modes (--upload/--internal-s3/--hq)
2246
2235
  `),2;if(r.upload&&r.internalS3)return e.stderr.write(`error: pick one of --upload (HQ) or --internal-s3, not both
2247
- `),2;let n=lT(),s=r.outputPath??mB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await G(e,async i=>{let a=await Uf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await hT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:st(),sanitized:!r.noSanitize})}catch(d){if(d instanceof gr)return e.stderr.write(`sanitization failed: ${d.message}
2236
+ `),2;let n=lT(),s=r.outputPath??fB(n),o=r.internalS3?"internal-s3":r.upload?"hq":"local";try{return await G(e,async i=>{let a=await Uf({dal:i,include:r.include,dbPath:ue(),intentLog:process.env.LMCTL_INTENT_LOG}),l;try{l=await hT({ticketId:n,data:a,outputPath:s,lmctlNextVersion:st(),sanitized:!r.noSanitize})}catch(d){if(d instanceof gr)return e.stderr.write(`sanitization failed: ${d.message}
2248
2237
  `),2;throw d}let c=await gT({mode:o,bundlePath:l.outputPath,ticketId:n,hqUrl:r.hqUrl}),u={ticket_id:n,bundle:l.outputPath,bundle_size_bytes:l.bundleSizeBytes,sections:Object.keys(a).sort(),sanitized:!r.noSanitize,upload:c,manifest_files:l.manifest.files.length};return r.json?e.stdout.write(`${JSON.stringify(u,null,2)}
2249
2238
  `):(e.stdout.write(`ticket: ${n}
2250
2239
  `),e.stdout.write(`bundle: ${l.outputPath} (${l.bundleSizeBytes} bytes, ${l.manifest.files.length} files)
2251
2240
  `),e.stdout.write(`upload[${c.mode}]: ${c.ok?"ok":"noop"} \u2014 ${c.message}
2252
2241
  `)),c.ok||o==="local"?0:1})}catch(i){return e.stderr.write(`diagnose failed: ${i instanceof Error?i.message:String(i)}
2253
- `),1}}function yT(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!fB(o))return`unknown section: ${o} (expected one of ${Gs.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function fB(t){return Gs.includes(t)}function mB(t){return uB(cB(),`lmctl-diag-${t}.tar.gz`)}function pB(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2254
- `)}var bT=b(()=>{"use strict";Cn();_T();bf();Xs();wT();Ve();$e()});var xT={};ce(xT,{ATTENTION_STATES:()=>vf,DAEMON_INTERVAL_FAST_MS:()=>kf,REQUIRED_TEAM_ALIASES:()=>TT,chooseDiagnoses:()=>IT,collectEvidence:()=>vT,diagnose:()=>kT,renderReport:()=>NT,runDiagnosePrompt:()=>gB});function kT(t,e){let r=vT(t,e),n=IT(r);return NT(r,n)}function vT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:Ss(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=_B(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=TT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function IT(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>kf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${kf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>vf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function NT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${hB(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>vf.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2242
+ `),1}}function wT(t){let e={upload:!1,internalS3:!1,noSanitize:!1,json:!1},r=[];for(let n=0;n<t.length;n+=1){let s=t[n];if(s==="--output"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --output";e.outputPath=o;continue}if(s==="--upload"){e.upload=!0;continue}if(s==="--internal-s3"){e.internalS3=!0;continue}if(s==="--hq"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --hq";e.hqUrl=o,e.upload=!0;continue}if(s==="--include"){let o=t[++n];if(o===void 0||o.startsWith("--"))return"missing value for --include";if(!dB(o))return`unknown section: ${o} (expected one of ${Gs.join(", ")})`;r.push(o);continue}if(s==="--no-sanitize"){e.noSanitize=!0;continue}if(s==="--json"){e.json=!0;continue}if(!(s==="--help"||s==="-h"))return`unknown argument: ${s}`}return r.length>0&&(e.include=r),e}function dB(t){return Gs.includes(t)}function fB(t){return cB(lB(),`lmctl-diag-${t}.tar.gz`)}function mB(){return["usage: lmctl diagnose [options]","","Collect platform diagnostics into a sanitized troubleshooting bundle,","with optional upload modes for support workflows.","","options:"," --output <path> write bundle to <path> (default /tmp/lmctl-diag-<ticket>.tar.gz)"," --upload upload to headquarter (HTTP, currently stub)"," --hq <url> override headquarter base URL (implies --upload)"," --internal-s3 upload to s3://lmctl/diagnostics/ (stub; checks aws CLI)"," --include <section> restrict to one of: serve|db|runs|jobs|attentions|env|intents (repeatable)"," --no-sanitize DANGER: skip secret redaction; incompatible with upload"," --json emit JSON summary to stdout"].join(`
2243
+ `)}var bT=b(()=>{"use strict";Cn();_T();bf();Xs();yT();Ve();$e()});var NT={};ce(NT,{ATTENTION_STATES:()=>vf,DAEMON_INTERVAL_FAST_MS:()=>kf,REQUIRED_TEAM_ALIASES:()=>TT,chooseDiagnoses:()=>IT,collectEvidence:()=>vT,diagnose:()=>kT,renderReport:()=>xT,runDiagnosePrompt:()=>_B});function kT(t,e){let r=vT(t,e),n=IT(r);return xT(r,n)}function vT(t,e){let r=e.trim(),n={promptId:r,prompt:{exists:!1},dispatch:{sectionAvailable:!0,rowExists:!1},job:{sectionAvailable:!0,exists:!1},run:{sectionAvailable:!0,exists:!1},project:{sectionAvailable:!0,exists:!1},workflows:{sectionAvailable:!0,count:0,rows:[]},team:{sectionAvailable:!0,members:[],missingAliases:[]},daemon:{workerPid:null,intervalMs:Ss(),lastTickAt:null}},s=null;try{s=t.getPromptDispatch(r)}catch{n.dispatch.sectionAvailable=!1}if(s!=null&&(n.dispatch.rowExists=!0,n.prompt.exists=!0,n.prompt.project_id=s.project_id,n.prompt.text_preview=hB(s.text),n.prompt.created_at=s.created_at,n.prompt.completed_at=s.completed_at,n.prompt.job_id=s.job_id),n.prompt.job_id!==void 0)try{let o=t.getJob(n.prompt.job_id);if(o!==null&&(n.job.exists=!0,n.job.status=o.status,n.job.attempt_count=o.attempt_count,n.job.last_error=o.last_error,n.job.available_at=o.available_at,n.job.locked_by=o.locked_by,n.job.run_id=o.run_id,o.run_id!==null))try{let i=t.getRun(o.run_id);if(i!==null){n.run.exists=!0,n.run.id=i.id,n.run.current_state=i.current_state,n.run.terminal_state=i.terminal_state,n.run.started_at=i.started_at,n.run.ended_at=i.ended_at;let a="__paused__:";n.run.paused_step=i.current_state!==null&&i.current_state.startsWith(a)?i.current_state.slice(a.length):null,n.run.paused_at=i.paused_at}}catch{n.run.sectionAvailable=!1}}catch{n.job.sectionAvailable=!1}if(n.prompt.project_id!==void 0)try{let o=t.getProject(n.prompt.project_id);if(o!==null){n.project.exists=!0,n.project.id=o.id,n.project.name=o.name,n.project.local_path=o.local_path,n.project.test_command=o.test_command,n.project.workflow_name=o.workflow_name,n.project.team_id=o.team_id;try{n.project.workflow_name_resolves=t.getWorkflowByName(o.workflow_name)!==null}catch{n.project.workflow_name_resolves=!1}}}catch{n.project.sectionAvailable=!1}if(n.project.id!==void 0)try{let o=t.listProjectWorkflows(n.project.id);n.workflows.count=o.length;for(let i of o){let a=`workflow_id=${i.workflow_id}`,l=0,c=null;try{let d=t.listWorkflows().find(f=>f.id===i.workflow_id);d!==void 0&&(a=d.name,l=d.version,c=d.source_uri)}catch{}n.workflows.rows.push({workflow_name:a,version:l,enabled:i.enabled,source_uri:c})}}catch{n.workflows.sectionAvailable=!1}if(n.project.team_id!==void 0)try{n.team.teamId=n.project.team_id;let o=t.listTeamMembers(n.project.team_id);for(let a of o)n.team.members.push({alias:a.alias,provider:a.provider,sessionid:a.sessionid,sessiondir:a.sessiondir,state:a.state,state_reason:a.state_reason,state_updated_at:a.state_updated_at});let i=new Set(o.map(a=>a.alias));n.team.missingAliases=TT.filter(a=>!i.has(a))}catch{n.team.sectionAvailable=!1}return n.daemon.workerPid=null,n.daemon.lastTickAt=null,n}function IT(t){let e=[];if(t.dispatch.sectionAvailable&&!t.dispatch.rowExists)return e.push({cause:"Prompt wasn't enqueued (no prompt_dispatch row); SPA\u2192agent submitPrompt path broken",action:"Inspect mailbox-rest-router submitPrompt logs on the agent; confirm the SPA reached /mailbox/projects/:id/prompts"}),e;t.dispatch.rowExists&&t.job.exists&&(t.job.run_id===null||t.job.run_id===void 0)&&!t.run.exists&&e.push({cause:"Daemon poll didn't pick up the job (no run row); check daemon interval + worker pid",action:"Restart the agent serve process or lower LMCTL_DAEMON_INTERVAL_MS (current default 600000ms = 10min)"}),t.daemon.intervalMs>kf&&e.push({cause:`Daemon poll interval is ${t.daemon.intervalMs}ms (${Math.round(t.daemon.intervalMs/1e3)}s); WT/dev expected <=${kf}ms`,action:"Set LMCTL_DAEMON_INTERVAL_MS=5000 (or lower) in the agent's env before relaunching `lmctl-next-agent`"}),t.project.exists&&t.workflows.sectionAvailable&&t.workflows.count===0&&t.project.workflow_name_resolves!==!0&&e.push({cause:`Project ${t.project.name??`id=${t.project.id??"?"}`} has 0 workflows registered AND project.workflow_name does not resolve; engine can't dispatch`,action:"Run `lmctl workflow load <name>` then `lmctl project bind <project> <workflow>` (or check the v4-project bootstrap path)"}),t.team.sectionAvailable&&t.team.missingAliases.length>0&&e.push({cause:`Default team (team_id=${t.team.teamId??"?"}) missing required aliases: ${t.team.missingAliases.join(", ")} (TC2 DEFECT-E class \u2014 engine will stall with missing_agent:<alias>)`,action:"Run `lmctl team seed` against this project's team, or add the missing members via `lmctl team add-member`"});let r=t.team.sectionAvailable?t.team.members.filter(s=>vf.has(s.state)):[];if(t.run.exists&&(t.run.paused_step??null)!==null||r.length>0){let s=t.run.paused_step??null,o=r.map(a=>a.alias).join(", "),i=s!==null&&o.length>0?`Run paused at ${s} awaiting operator escalation decision (member ${o} attention_needed)`:s!==null?`Run paused at ${s} awaiting operator escalation decision`:`Team member(s) ${o} awaiting operator attention`;e.push({cause:i,action:"Open the run in the SPA escalations panel (paused badge) or resolve via the operator-resume verb"})}return t.dispatch.rowExists&&t.job.exists&&!t.run.exists&&t.daemon.workerPid===null&&e.push({cause:"Worker pid not observable (agent serve process may not be actively daemoning)",action:"Verify `lmctl-next-agent` is running and check stderr for `[lmctl-next-agent]` lines"}),e.slice(0,3)}function xT(t,e){let r=[];if(r.push(`DIAGNOSE ${t.promptId}`),r.push(""),r.push("[PROMPT]"),t.prompt.exists?(r.push(` id: ${t.promptId}`),r.push(` project_id: ${t.prompt.project_id??"?"}`),r.push(` text: ${t.prompt.text_preview??"?"}`),r.push(` created_at: ${t.prompt.created_at??"?"}`),r.push(` completed_at: ${t.prompt.completed_at??"null"}`)):r.push(" not present in prompt_dispatch table"),r.push(""),r.push("[PROMPT_DISPATCH]"),t.dispatch.sectionAvailable?(r.push(` row exists in prompt_dispatch table: ${t.dispatch.rowExists?"YES":"NO"}`),t.dispatch.rowExists&&(r.push(` job_id: ${t.prompt.job_id??"?"}`),r.push(` dispatched_at: ${t.prompt.created_at??"?"}`),r.push(` last_seen_status: ${pB(t)}`))):r.push(" table not present (schema variation)"),r.push(""),r.push("[PROMPT_RUN]"),t.job.sectionAvailable?t.job.exists?t.run.exists?(r.push(" row exists in prompt_runs table: YES"),r.push(` run_id: ${t.run.id??"?"}`),r.push(` current_step: ${t.run.current_state??"null"}`),r.push(` status: ${t.run.terminal_state??"in_progress"}`),r.push(` started_at: ${t.run.started_at??"?"}`),r.push(` attempts: ${t.job.attempt_count??0}`)):(r.push(" row exists in prompt_runs table: NO"),r.push(` job_id: ${t.prompt.job_id??"?"} status=${t.job.status??"?"} attempts=${t.job.attempt_count??0}`),r.push(" -> job enqueued but no run; daemon poll did not consume it")):(r.push(" row exists in prompt_runs table: NO"),r.push(" -> worker never picked up the prompt (job row missing)")):r.push(" job table not accessible"),r.push(""),r.push("[PROJECT]"),t.project.sectionAvailable?t.project.exists?(r.push(` id: ${t.project.id??"?"}`),r.push(` name: ${t.project.name??"?"}`),r.push(` local_path: ${t.project.local_path??"?"}`),r.push(` test_command: ${t.project.test_command??"null"}`),r.push(` default_workflow: ${t.project.workflow_name??"null"}`)):t.prompt.project_id===void 0?r.push(" not resolvable (no project_id on prompt)"):r.push(` not present (id=${t.prompt.project_id})`):r.push(" project table not accessible"),r.push(""),r.push("[WORKFLOWS REGISTERED FOR PROJECT]"),!t.workflows.sectionAvailable)r.push(" project_workflow table not accessible");else if(t.workflows.count===0&&t.project.exists&&t.project.workflow_name_resolves===!0)r.push(` default_workflow_name: ${t.project.workflow_name??"?"} (resolved via project.workflow_name)`),r.push(" project_workflow rows: 0 (uses fallback resolution; expected)");else{r.push(` count: ${t.workflows.count}`);for(let o of t.workflows.rows)r.push(` - ${o.workflow_name} v${o.version} enabled=${o.enabled===1?"true":"false"} source=${o.source_uri??"null"}`)}if(r.push(""),r.push("[TEAM MEMBERS FOR PROJECT'S DEFAULT TEAM]"),!t.team.sectionAvailable)r.push(" team_member table not accessible");else if(t.team.teamId===void 0)r.push(" not resolvable (no team_id on project)");else{t.team.members.length===0&&r.push(" (no members)");for(let o of t.team.members)r.push(` - alias=${o.alias} provider=${o.provider} state=${o.state} sessionid=${o.sessionid??"null"} sessiondir=${o.sessiondir}`);t.team.missingAliases.length>0&&r.push(` ! missing aliases: ${t.team.missingAliases.join(", ")}`)}r.push("");let n=t.team.sectionAvailable?t.team.members.filter(o=>vf.has(o.state)):[],s=t.run.exists?t.run.paused_step??null:null;if(s!==null||n.length>0){if(r.push("[ATTENTION/ESCALATION]"),s!==null){let o=t.run.paused_at??t.run.started_at??"?";r.push(` paused_step: ${s} (started: ${o})`)}if(n.length>0){let o=n.map(i=>`${i.alias} (state=${i.state}${i.state_updated_at?` since ${i.state_updated_at}`:""}${i.state_reason?`, reason="${i.state_reason}"`:""})`).join(", ");r.push(` members awaiting operator: ${o}`)}else r.push(" members awaiting operator: (none flagged on team)");r.push(" next action expected: operator response via /admin or webcli escalations verb"),r.push("")}if(r.push("[DAEMON STATE]"),r.push(` worker pid: ${t.daemon.workerPid===null?"not observable from CLI":String(t.daemon.workerPid)}`),r.push(` daemon poll interval (LMCTL_DAEMON_INTERVAL_MS env): ${t.daemon.intervalMs}`),r.push(` last daemon tick: ${t.daemon.lastTickAt??"not exposed"}`),r.push(""),r.push("[DIAGNOSIS]"),e.length===0)r.push(" no obvious root cause flagged by the v1 rules (see brief Part 4)");else for(let o of e)r.push(` - ${o.cause}`),r.push(` -> ${o.action}`);return r.join(`
2255
2244
  `)+`
2256
- `}function hB(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function _B(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function gB(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ST()}
2245
+ `}function pB(t){return t.dispatch.rowExists?t.prompt.completed_at!==null&&t.prompt.completed_at!==void 0?"done":t.job.exists?t.run.exists?t.run.terminal_state!==null&&t.run.terminal_state!==void 0?`terminal:${t.run.terminal_state}`:`running:${t.run.current_state??"?"}`:"pending (no run)":"pending (no job)":"unknown"}function hB(t){let e=t.replace(/\s+/g," ").trim();return e.length<=80?e:`${e.slice(0,80)}...`}async function _B(t,e={stdout:process.stdout,stderr:process.stderr}){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(`${ST()}
2257
2246
  `),0;let r=t.filter(s=>!s.startsWith("--"));if(r.length!==1)return e.stderr.write(`error: expected exactly one positional arg: <prompt_id>
2258
2247
  `),e.stderr.write(`${ST()}
2259
2248
  `),2;let n=r[0];try{return await G(e,s=>(e.stdout.write(kT(s,n)),0))}catch(s){return e.stderr.write(`diagnose-prompt failed: ${s instanceof Error?s.message:String(s)}
2260
2249
  `),1}}function ST(){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(`
2261
- `)}var TT,kf,vf,$T=b(()=>{"use strict";ed();$e();TT=["Coder","Reviewer1","Polisher"],kf=3e4,vf=new Set(["attention_needed","paused","escalation"])});var OT={};ce(OT,{appendIntent:()=>RT,resolveIntentLogPath:()=>AT,runStatus:()=>IB});import{appendFileSync as wB,mkdirSync as yB}from"node:fs";import{homedir as EB}from"node:os";import{dirname as bB,join as SB}from"node:path";function AT(){return process.env.LMCTL_INTENT_LOG??SB(EB(),".lmctl","recent-intents.log")}function RT(t){try{let e=AT();yB(bB(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});wB(e,`${r}
2262
- `)}catch{}}async function IB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(vB),0;let r=F(t,["--project"],["--web","--json"]);if(r.error!==void 0)return w(e,r.error);if(r.positionals.length>0)return w(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=x(r,"--project"),o=M(r,"--json");return n&&s!==void 0?w(e,"--web and --project are mutually exclusive"):G(e,i=>{let a=NB(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2250
+ `)}var TT,kf,vf,$T=b(()=>{"use strict";ed();$e();TT=["Coder","Reviewer1","Polisher"],kf=3e4,vf=new Set(["attention_needed","paused","escalation"])});var OT={};ce(OT,{appendIntent:()=>RT,resolveIntentLogPath:()=>AT,runStatus:()=>vB});import{appendFileSync as gB,mkdirSync as yB}from"node:fs";import{homedir as wB}from"node:os";import{dirname as EB,join as bB}from"node:path";function AT(){return process.env.LMCTL_INTENT_LOG??bB(wB(),".lmctl","recent-intents.log")}function RT(t){try{let e=AT();yB(EB(e),{recursive:!0});let r=JSON.stringify({ts:t.ts??new Date().toISOString(),cwd:t.cwd??process.cwd(),verb:t.verb,args:[...t.args]});gB(e,`${r}
2251
+ `)}catch{}}async function vB(t,e){if(t.includes("--help")||t.includes("-h"))return e.stdout.write(kB),0;let r=F(t,["--project"],["--web","--json"]);if(r.error!==void 0)return y(e,r.error);if(r.positionals.length>0)return y(e,`unknown argument: ${r.positionals[0]}`);let n=M(r,"--web"),s=N(r,"--project"),o=M(r,"--json");return n&&s!==void 0?y(e,"--web and --project are mutually exclusive"):G(e,i=>{let a=IB(i,{web:n,projectFlag:s,cwd:process.cwd()});if(a.kind==="no-cwd-match")return e.stderr.write(`no project at this path; use --project to specify or cd into a project root.
2263
2252
  `),1;if(a.kind==="no-web-focus")return e.stderr.write(`no active webui focus; run lmctl status --web after navigating webui to a project, or omit --web.
2264
- `),1;if(a.kind==="project-not-found")return w(e,`project not found: ${a.name}`);let l=a.project,c=xB(i,l,a.source);return o?q(e,c):e.stdout.write(OB(c)),RT({verb:"status",args:t}),0})}function NB(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=of(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function xB(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=$B(t,e.id,kB),a=jB(t,e.id),l=AB(t,e.id,TB);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:RB(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function $B(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function jB(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function AB(t,e,r){return t.db.prepare(`
2253
+ `),1;if(a.kind==="project-not-found")return y(e,`project not found: ${a.name}`);let l=a.project,c=xB(i,l,a.source);return o?q(e,c):e.stdout.write(RB(c)),RT({verb:"status",args:t}),0})}function IB(t,e){if(e.projectFlag!==void 0){let n=t.findProjectByName(e.projectFlag);return n===null?{kind:"project-not-found",name:e.projectFlag}:{kind:"ok",project:n,source:"project-flag"}}if(e.web){let n=t.getConfig("current.project_name");if(n===null||n.length===0)return{kind:"no-web-focus"};let s=t.findProjectByName(n);return s===null?{kind:"project-not-found",name:n}:{kind:"ok",project:s,source:"web"}}let r=of(e.cwd,t);return r===null?{kind:"no-cwd-match"}:{kind:"ok",project:r,source:"cwd"}}function xB(t,e,r){let n=t.getTeam(e.team_id),o=t.query("SELECT r.* FROM run r JOIN job j ON j.id = r.job_id WHERE j.project_id = ? AND r.terminal_state IS NULL ORDER BY r.id DESC LIMIT 1",e.id)[0]??null,i=NB(t,e.id,TB),a=$B(t,e.id),l=jB(t,e.id,SB);return{project:{name:e.name,local_path:e.local_path,workflow_name:e.workflow_name,team_name:n?.name??null},active_run:o===null?null:{id:o.id,current_state:o.current_state,paused_at:o.paused_at,started_at:o.started_at},attentions:{unacked_count:a,recent:i.map(c=>({id:c.id,kind:c.kind,severity:c.severity,payload_summary:AB(c.payload),created_at:c.created_at}))},recent_runs:l.map(c=>({id:c.id,workflow_name:c.workflow_name,current_state:c.current_state,terminal_state:c.terminal_state,started_at:c.started_at,ended_at:c.ended_at})),context_source:r}}function NB(t,e,r){return t.db.prepare("SELECT * FROM attention WHERE project_id = ? AND acknowledged_at IS NULL ORDER BY id DESC LIMIT ?").all(e,r)}function $B(t,e){return t.db.prepare("SELECT COUNT(*) AS n FROM attention WHERE project_id = ? AND acknowledged_at IS NULL").get(e)?.n??0}function jB(t,e,r){return t.db.prepare(`
2265
2254
  SELECT r.*, w.name AS workflow_name
2266
2255
  FROM run r
2267
2256
  JOIN job j ON j.id = r.job_id
@@ -2269,16 +2258,16 @@ per-project workflow bindings and routing conditions.
2269
2258
  WHERE j.project_id = ?
2270
2259
  ORDER BY r.id DESC
2271
2260
  LIMIT ?
2272
- `).all(e,r)}function RB(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return jT(o,100)}}}catch{}return jT(t,100)}function jT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function OB(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),e.join(`
2273
- `)}var TB,kB,vB,LT=b(()=>{"use strict";$e();lf();TB=5,kB=10,vB=`usage: lmctl status [--project NAME|--web] [--json]
2261
+ `).all(e,r)}function AB(t){if(t===null||t.length===0)return null;try{let e=JSON.parse(t);if(e!==null&&typeof e=="object"&&!Array.isArray(e)){let r=e,n=["message","detail","reason","action","state"];for(let s of n){let o=r[s];if(typeof o=="string"&&o.length>0)return jT(o,100)}}}catch{}return jT(t,100)}function jT(t,e){return t.length<=e?t:`${t.slice(0,e-1)}\u2026`}function RB(t){let e=[];if(e.push(`project: ${t.project.name}`),e.push(` local_path: ${t.project.local_path}`),e.push(` workflow: ${t.project.workflow_name}`),t.project.team_name!==null&&e.push(` team: ${t.project.team_name}`),e.push(""),t.active_run===null)e.push("active run: none");else{let r=t.active_run.paused_at!==null?`paused at ${t.active_run.current_state??"?"}`:t.active_run.current_state??"unknown";e.push(`active run: #${t.active_run.id} (${r}, started ${t.active_run.started_at})`)}if(e.push(""),t.attentions.unacked_count===0)e.push("attentions: none");else{e.push(`attentions: ${t.attentions.unacked_count} unread`);for(let r of t.attentions.recent){let n=r.payload_summary===null?"":` \u2014 ${r.payload_summary}`;e.push(` - ${r.kind}: #${r.id}${n} (${r.created_at})`)}}if(e.push(""),t.recent_runs.length===0)e.push("recent runs: none");else{e.push("recent runs:");for(let r of t.recent_runs){let n=r.terminal_state??r.current_state??"pending";e.push(` #${r.id} ${r.workflow_name} ${n} (${r.started_at})`)}}return e.push(""),e.join(`
2262
+ `)}var SB,TB,kB,LT=b(()=>{"use strict";$e();lf();SB=5,TB=10,kB=`usage: lmctl status [--project NAME|--web] [--json]
2274
2263
 
2275
2264
  Show the current project context, active run, unacked attentions, and recent
2276
2265
  runs. Defaults to resolving the project from the current working directory;
2277
2266
  --project selects a project by name, and --web uses the web UI focus.
2278
- `});Ve();Cn();je();import{pathToFileURL as LB}from"node:url";Ys();Cn();import{mkdirSync as Nk,readFileSync as xk,renameSync as $k,writeFileSync as jk}from"node:fs";import{homedir as Ak}from"node:os";import{dirname as Rk,join as Ok}from"node:path";var Lk="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",Ck=60*60*1e3,Mk=1500;function Dk(){let t=process.env.HOME??Ak();return Ok(t,".lmctl",".update-check.json")}function Pk(t){return t.isTTY===!0}function Fk(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function el(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!Pk(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Uk(t,e){try{let r=JSON.parse(xk(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<Ck)return r.latest}catch{}return null}function Wk(t,e){Nk(Rk(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;jk(r,`${JSON.stringify(e)}
2279
- `,"utf8"),$k(r,t)}async function Bk(){let t=await wr(Lk,{description:"lmctl npm metadata",timeoutMs:Mk}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function Vf(t,e=[],r={}){try{if(el(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??Dk();if(Uk(s,n)!==null)return;let i=await(r.fetchLatest??Bk)();try{Wk(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??st();Fk(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2280
- `)}catch{}}var xf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2281
- `,If=`${xf}
2267
+ `});Ve();Cn();je();import{pathToFileURL as OB}from"node:url";Ys();Cn();import{mkdirSync as xk,readFileSync as Nk,renameSync as $k,writeFileSync as jk}from"node:fs";import{homedir as Ak}from"node:os";import{dirname as Rk,join as Ok}from"node:path";var Lk="https://registry.npmjs.org/@lmctl-ai/lmctl/latest",Ck=60*60*1e3,Mk=1500;function Dk(){let t=process.env.HOME??Ak();return Ok(t,".lmctl",".update-check.json")}function Pk(t){return t.isTTY===!0}function Fk(t,e){let r=o=>{let i=/^(\d+)\.(\d+)\.(\d+)(?:$|[-+])/.exec(o.trim());if(i===null)return null;let a=i.slice(1).map(l=>Number(l));return a.some(l=>!Number.isSafeInteger(l)||l<0)?null:a},n=r(t),s=r(e);if(n===null||s===null)return 0;for(let o=0;o<3;o+=1){if(n[o]>s[o])return 1;if(n[o]<s[o])return-1}return 0}function el(t,e){return!!(process.env.LMCTL_NO_UPDATE_NOTIFIER==="1"||!Pk(e.stderr)||t.includes("--json")||t.includes("--from")||t.includes("--help")||t.includes("-h")||t[0]==="help"||t[0]==="mcp")}function Uk(t,e){try{let r=JSON.parse(Nk(t,"utf8"));if(typeof r.checkedAt=="number"&&Number.isFinite(r.checkedAt)&&typeof r.latest=="string"&&e-r.checkedAt<Ck)return r.latest}catch{}return null}function Wk(t,e){xk(Rk(t),{recursive:!0});let r=`${t}.tmp-${process.pid}-${Math.random().toString(16).slice(2)}`;jk(r,`${JSON.stringify(e)}
2268
+ `,"utf8"),$k(r,t)}async function Bk(){let t=await yr(Lk,{description:"lmctl npm metadata",timeoutMs:Mk}),e=JSON.parse(t.toString("utf8"));if(typeof e.version!="string"||e.version.trim()==="")throw new Error("registry response missing version");return e.version}async function Vf(t,e=[],r={}){try{if(el(e,t))return;let n=r.now?.()??Date.now(),s=r.cachePath??Dk();if(Uk(s,n)!==null)return;let i=await(r.fetchLatest??Bk)();try{Wk(s,{checkedAt:n,latest:i})}catch{return}let a=r.currentVersion?.()??st();Fk(i,a)>0&&t.stderr.write(`update available: ${a} \u2192 ${i} run: npm i -g @lmctl-ai/lmctl@latest
2269
+ `)}catch{}}var Nf=`usage: lmctl [--db PATH] [--workspace NAME] [--debug] <command> [args]
2270
+ `,If=`${Nf}
2282
2271
  Setup & status:
2283
2272
  status Show current project context, active run, attentions, and recent runs.
2284
2273
  diagnose Collect a sanitized troubleshooting bundle, with optional upload.
@@ -2323,14 +2312,14 @@ Global flags:
2323
2312
  chain and context.
2324
2313
 
2325
2314
  Run 'lmctl help <command>' for command-specific help.
2326
- `,CT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","health","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function Nf(t,e){return t.stderr.write(`error: ${e}
2327
- ${xf}Run 'lmctl help' for usage.
2315
+ `,CT=new Set(["api","chat","code","serve","intake","mcp","monitor","device","team","terminal","tail","health","ls","lint","seed","hire","refresh","clone","plan","workflow","run","project","workspace","diagnose","diagnose-prompt","status","db"]);function xf(t,e){return t.stderr.write(`error: ${e}
2316
+ ${Nf}Run 'lmctl help' for usage.
2328
2317
  `),2}function DT(t,e){return t.stderr.write(`error: unknown command: ${e}
2329
- ${xf}Run 'lmctl help' for usage.
2330
- `),1}async function CB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Jf();try{return await MB(t,e)}finally{Xf(r)}}async function MB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Nf(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return Nf(e,"missing value for --workspace");if(!qe(l))return Nf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Hf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${st()}
2318
+ ${Nf}Run 'lmctl help' for usage.
2319
+ `),1}async function LB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=Jf();try{return await CB(t,e)}finally{Xf(r)}}async function CB(t,e={stdout:process.stdout,stderr:process.stderr}){let r=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a==="--db"){let l=t[++i];if(l===void 0||l.startsWith("--"))return xf(e,"missing value for --db");process.env.LMCTL_DB=l;continue}if(a==="--workspace"){let l=t[++i];if(l===void 0||l.startsWith("--"))return xf(e,"missing value for --workspace");if(!qe(l))return xf(e,`invalid workspace name: ${l}`);process.env.LMCTL_WORKSPACE=l;continue}if(a==="--debug"){Hf();continue}r.push(a)}let n=r[0];if(n==="--version"||n==="-v"||n==="-V")return e.stdout.write(`lmctl ${st()}
2331
2320
  `),0;if(n==="--help"||n==="-h"||n===void 0)return e.stdout.write(If),0;if(n==="help"){let[i,...a]=r.slice(1);return i===void 0||i==="--help"||i==="-h"?(e.stdout.write(If),0):CT.has(i)?MT(i,[...a,"--help"],e):DT(e,i)}Rf(ue(),e.stderr),Lf(e.stderr);let[s,...o]=r;if(s===void 0)return e.stdout.write(If),0;Qa()&&e.stderr.write(`[debug] lmctl ${st()} | node ${process.version} | cmd ${s} ${o.join(" ")}
2332
2321
  [debug] cwd ${process.cwd()} | db ${ue()}${process.env.LMCTL_WORKSPACE?` | workspace ${process.env.LMCTL_WORKSPACE}`:""}
2333
- `);try{let i=await MT(s,o,e);return CT.has(s)&&!el(r,e)&&await Vf(e,r),i}catch(i){return DB(i,s,o,e)}}function DB(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Qa())return n.stderr.write(`error: ${s.message}
2322
+ `);try{let i=await MT(s,o,e);return CT.has(s)&&!el(r,e)&&await Vf(e,r),i}catch(i){return MB(i,s,o,e)}}function MB(t,e,r,n){let s=t instanceof Error?t:new Error(String(t));if(!Qa())return n.stderr.write(`error: ${s.message}
2334
2323
  `),n.stderr.write(`(re-run with --debug for the full stack trace and context)
2335
2324
  `),1;n.stderr.write(`error: ${s.message}
2336
2325
  `),n.stderr.write(` command: lmctl ${e} ${r.join(" ")}
@@ -2338,10 +2327,10 @@ ${xf}Run 'lmctl help' for usage.
2338
2327
  `),s.stack&&n.stderr.write(`${s.stack}
2339
2328
  `);let o=s.cause,i=0;for(;o!=null&&i<8;){let a=o instanceof Error?o:new Error(String(o));n.stderr.write(`caused by: ${a.message}
2340
2329
  `),a.stack&&n.stderr.write(`${a.stack}
2341
- `),o=a.cause,i+=1}return 1}async function MT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(wc(),ih));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Wc(),Wh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(KE(),VE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(zE(),YE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Sb(),bb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>($b(),xb));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(Db(),Mb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Fb(),Pb));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Yb(),Kb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Zb(),zb));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(tS(),eS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(vS(),kS));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>($S(),xS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(OS(),RS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(nT(),rT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(aT(),iT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(bT(),ET));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>($T(),xT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(LT(),OT));return n(e,r)}case"db":return PB(e,r);default:return DT(r,t)}}function PB(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2330
+ `),o=a.cause,i+=1}return 1}async function MT(t,e,r){switch(t){case"api":{let{runApi:n}=await Promise.resolve().then(()=>(yc(),ih));return n(e,r)}case"code":{let{runCode:n}=await Promise.resolve().then(()=>(Wc(),Wh));return n(e,r)}case"serve":{let{runServe:n}=await Promise.resolve().then(()=>(KE(),VE));return n(e,r)}case"intake":{let{runIntake:n}=await Promise.resolve().then(()=>(zE(),YE));return n(e,r)}case"chat":{let{runChat:n}=await Promise.resolve().then(()=>(Sb(),bb));return n(e,r)}case"mcp":{let{runMcp:n}=await Promise.resolve().then(()=>($b(),Nb));return n(e,r)}case"monitor":{let{runMonitor:n}=await Promise.resolve().then(()=>(Db(),Mb));return n(e,r)}case"device":{let{runDevice:n}=await Promise.resolve().then(()=>(Fb(),Pb));return n(e,r)}case"team":{let{runTeam:n}=await Promise.resolve().then(()=>(Bb(),Wb));return n(e,r)}case"tail":{let{runTail:n}=await Promise.resolve().then(()=>(Yb(),Kb));return n(e,r)}case"health":{let{runInfo:n}=await Promise.resolve().then(()=>(Zb(),zb));return n(e,r)}case"ls":{let{runLs:n}=await Promise.resolve().then(()=>(tS(),eS));return n(e,r)}case"lint":{let{runLint:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"seed":{let{runSeed:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"hire":{let{runHire:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"refresh":{let{runRefresh:n}=await Promise.resolve().then(()=>(Ws(),Us));return n(e,r)}case"clone":{let{runClone:n}=await Promise.resolve().then(()=>(vS(),kS));return n(e,r)}case"plan":{let{runPlan:n}=await Promise.resolve().then(()=>($S(),NS));return n(e,r)}case"terminal":{let{runTerminal:n}=await Promise.resolve().then(()=>(OS(),RS));return n(e,r)}case"workflow":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(e,r)}case"run":{let{runWorkflow:n}=await Promise.resolve().then(()=>(hf(),pf));return n(["run",...e],r)}case"workspace":{let{runWorkspace:n}=await Promise.resolve().then(()=>(nT(),rT));return n(e,r)}case"project":{let{runProject:n}=await Promise.resolve().then(()=>(aT(),iT));return n(e,r)}case"diagnose":{let{runDiagnose:n}=await Promise.resolve().then(()=>(bT(),ET));return n(e,r)}case"diagnose-prompt":{let{runDiagnosePrompt:n}=await Promise.resolve().then(()=>($T(),NT));return n(e,r)}case"status":{let{runStatus:n}=await Promise.resolve().then(()=>(LT(),OT));return n(e,r)}case"db":return DB(e,r);default:return DT(r,t)}}function DB(t,e){let[r,...n]=t;return r==="--help"||r==="-h"||r==="help"?(e.stdout.write(`usage: lmctl db downgrade --to <version> --confirm
2342
2331
 
2343
2332
  Database utilities. The downgrade command is currently a documented stub;
2344
2333
  restore from backup for rollback and use normal migrations for forward changes.
2345
2334
  `),0):r==="downgrade"?(e.stderr.write(`not yet implemented; restore from backup, or run lmctl migrate (forward-migrates ok)
2346
2335
  `),1):(e.stderr.write(`usage: lmctl db downgrade --to <version> --confirm
2347
- `),1)}if(process.argv[1]!==void 0&&import.meta.url===LB(process.argv[1]).href){let t=await CB(process.argv.slice(2));process.exitCode=t}export{CB as runCli};
2336
+ `),1)}if(process.argv[1]!==void 0&&import.meta.url===OB(process.argv[1]).href){let t=await LB(process.argv.slice(2));process.exitCode=t}export{LB as runCli};